From 4a92b89fc3edf0b33eb2aace296eccad8ec05738 Mon Sep 17 00:00:00 2001 From: miker Date: Thu, 12 Feb 2009 06:31:32 +0000 Subject: [PATCH] adding IN subquery support git-svn-id: svn://svn.open-ils.org/ILS/trunk@12156 dcc99617-32d9-48b4-a31d-7c20da2025e4 --- Open-ILS/src/c-apps/oils_cstore.c | 74 +++++++++++++++++++++++++-------------- 1 file changed, 47 insertions(+), 27 deletions(-) diff --git a/Open-ILS/src/c-apps/oils_cstore.c b/Open-ILS/src/c-apps/oils_cstore.c index ab4f80325b..146bf12a17 100644 --- a/Open-ILS/src/c-apps/oils_cstore.c +++ b/Open-ILS/src/c-apps/oils_cstore.c @@ -1629,35 +1629,55 @@ static char* searchINPredicate (const char* class, osrfHash* field, buffer_add(sql_buf, "IN ("); } - int in_item_index = 0; - int in_item_first = 1; - jsonObject* in_item; - while ( (in_item = jsonObjectGetIndex(node, in_item_index++)) ) { - - if (in_item_first) - in_item_first = 0; - else - buffer_add(sql_buf, ", "); + if (node->type == JSON_HASH) { + // subquery predicate + char* subpred = SELECT( + ctx, + jsonObjectGetKey( node, "select" ), + jsonObjectGetKey( node, "from" ), + jsonObjectGetKey( node, "where" ), + jsonObjectGetKey( node, "having" ), + jsonObjectGetKey( node, "order_by" ), + jsonObjectGetKey( node, "limit" ), + jsonObjectGetKey( node, "offset" ), + SUBSELECT + ); - if ( !strcmp(osrfHashGet(field, "primitive"), "number") ) { - char* val = jsonNumberToDBString( field, in_item ); - OSRF_BUFFER_ADD( sql_buf, val ); - free(val); - - } else { - char* key_string = jsonObjectToSimpleString(in_item); - if ( dbi_conn_quote_string(dbhandle, &key_string) ) { - OSRF_BUFFER_ADD( sql_buf, key_string ); - free(key_string); - } else { - osrfLogError(OSRF_LOG_MARK, "%s: Error quoting key string [%s]", MODULENAME, key_string); - free(key_string); - buffer_free(sql_buf); - return NULL; - } - } - } + buffer_add(sql_buf, subpred); + free(subpred); + } else if (node->type == JSON_ARRAY) { + // litteral value list + int in_item_index = 0; + int in_item_first = 1; + jsonObject* in_item; + while ( (in_item = jsonObjectGetIndex(node, in_item_index++)) ) { + + if (in_item_first) + in_item_first = 0; + else + buffer_add(sql_buf, ", "); + + if ( !strcmp(osrfHashGet(field, "primitive"), "number") ) { + char* val = jsonNumberToDBString( field, in_item ); + OSRF_BUFFER_ADD( sql_buf, val ); + free(val); + + } else { + char* key_string = jsonObjectToSimpleString(in_item); + if ( dbi_conn_quote_string(dbhandle, &key_string) ) { + OSRF_BUFFER_ADD( sql_buf, key_string ); + free(key_string); + } else { + osrfLogError(OSRF_LOG_MARK, "%s: Error quoting key string [%s]", MODULENAME, key_string); + free(key_string); + buffer_free(sql_buf); + return NULL; + } + } + } + } + OSRF_BUFFER_ADD_CHAR( sql_buf, ')' ); return buffer_release(sql_buf); -- 2.11.0