From 1d1780741a75e28f9e45dafd5baa3d513d5795aa Mon Sep 17 00:00:00 2001 From: alexhudson Date: Sun, 14 Jun 2009 14:49:50 +0000 Subject: [PATCH] Merge fixes from trunk/ into 0.5 branch. --- include/msgapi.h | 2 +- src/agents/store/object-model.c | 4 ++++ src/agents/store/query-builder.c | 33 ++++++++++++++++++++++++++++++-- src/agents/store/query-parser.c | 8 +++++++- src/agents/store/query-parser.h | 1 + 5 files changed, 44 insertions(+), 4 deletions(-) diff --git a/include/msgapi.h b/include/msgapi.h index 0e13ecf..a194e0c 100644 --- a/include/msgapi.h +++ b/include/msgapi.h @@ -73,7 +73,7 @@ typedef struct _MsgSQLHandle { } stmts; BongoMemStack *memstack; - XplSemaphore *transactionLock; + XplSemaphore transactionLock; int transactionDepth; int lockTimeoutMs; BOOL isNew; // have we just created this? diff --git a/src/agents/store/object-model.c b/src/agents/store/object-model.c index f46b247..3f5fca1 100644 --- a/src/agents/store/object-model.c +++ b/src/agents/store/object-model.c @@ -757,10 +757,14 @@ StoreObjectIterQueryBuilder(StoreClient *client, QueryBuilder *builder, BOOL sho } + MemFree(sql); QueryBuilderFinish(builder); return 1000; abort: + if (sql) { + MemFree(sql); + } MsgSQLAbortTransaction(client->storedb); QueryBuilderFinish(builder); diff --git a/src/agents/store/query-builder.c b/src/agents/store/query-builder.c index e6ef7d1..d485883 100644 --- a/src/agents/store/query-builder.c +++ b/src/agents/store/query-builder.c @@ -43,11 +43,33 @@ QueryBuilderStart(QueryBuilder *builder) void QueryBuilderFinish(QueryBuilder *builder) { + unsigned int x; + StorePropInfo *newprop; + ExtraLink *link; + QueryBuilder_Param *param; + QueryParserFinish(&builder->internal_parser); QueryParserFinish(&builder->external_parser); + /* free all the properties */ + for(x=0;xproperties);x++) { + newprop = BongoArrayIndex(builder->properties, StorePropInfo *, x); + MemFree(newprop); + } BongoArrayFree(builder->properties, TRUE); + + /* free all the links */ + for(x=0;xlinks);x++) { + link = BongoArrayIndex(builder->links, ExtraLink *, x); + MemFree(link); + } BongoArrayFree(builder->links, TRUE); + + /* free all the parameters */ + for(x=0;xparameters);x++) { + param = BongoArrayIndex(builder->parameters, QueryBuilder_Param *, x); + MemFree(param); + } BongoArrayFree(builder->parameters, TRUE); } @@ -307,6 +329,7 @@ QueryBuilderCreateSQL(QueryBuilder *builder, char **output) { BongoStringBuilder b; unsigned int i; + int ccode; if (BongoStringBuilderInit(&b)) { // unable to start... ick @@ -359,7 +382,8 @@ QueryBuilderCreateSQL(QueryBuilder *builder, char **output) // add in any constraints specified on the various columns if (builder->int_query) { if (QueryExpressionToSQL(builder, builder->internal_parser.start, &b)) { - return -2; + ccode = -2; + goto abort; } } if (builder->int_query && builder->ext_query) { @@ -367,7 +391,8 @@ QueryBuilderCreateSQL(QueryBuilder *builder, char **output) } if (builder->ext_query) { if (QueryExpressionToSQL(builder, builder->external_parser.start, &b)) { - return -3; + ccode = -3; + goto abort; } } @@ -399,6 +424,10 @@ QueryBuilderCreateSQL(QueryBuilder *builder, char **output) BongoStringBuilderDestroy(&b); return 0; + +abort: + BongoStringBuilderDestroy(&b); + return ccode; } static int diff --git a/src/agents/store/query-parser.c b/src/agents/store/query-parser.c index 2d90595..71910c5 100644 --- a/src/agents/store/query-parser.c +++ b/src/agents/store/query-parser.c @@ -15,6 +15,7 @@ * Parser of Store Protocol queries into structures, for later use in SQL queries */ +#include "stored.h" #include #include #include @@ -151,7 +152,7 @@ QueryParserRun(struct parser_state *state) char *token; struct expression *current_expression = state->start; - while (pull_token(&(state->query), &token) != -1) { + while (pull_token(&(state->query_ptr), &token) != -1) { if (current_expression < state->start) { // ran off the top of our stack, but there were still tokens DEBUG_MESSAGE("ERR: tokens remaining in data\n"); @@ -261,6 +262,8 @@ QueryParserStart(struct parser_state *state, const char *query, int max_expr) { return -2; } + state->query_ptr = state->query; + return 0; } @@ -274,6 +277,9 @@ QueryParserFinish(struct parser_state *state) { if (state->start != NULL) { MemFree(state->start); } + if (state->query != NULL) { + MemFree(state->query); + } state->start = state->last = NULL; state->entries = 0; } diff --git a/src/agents/store/query-parser.h b/src/agents/store/query-parser.h index 7a0286b..d61966b 100644 --- a/src/agents/store/query-parser.h +++ b/src/agents/store/query-parser.h @@ -21,6 +21,7 @@ struct parser_state { struct expression *last; int entries; char *query; + char *query_ptr; }; int QueryParserStart(struct parser_state *state, const char *query, int max_expr);