diff --git a/src/db_where-builder.c b/src/db_where-builder.c index 864bd04..597f805 100644 --- a/src/db_where-builder.c +++ b/src/db_where-builder.c @@ -24,7 +24,7 @@ where_builder *createWhereBuilder(where_builder *initial_clause) return wb; } -int compileWhereBuilder(where_builder *wb, char **str, size_t *str_len, int free_wb) +int compileWhereBuilder(char **str, size_t *str_len, where_builder *wb, int free_wb) { struct str_builder_t *sb; @@ -32,14 +32,21 @@ int compileWhereBuilder(where_builder *wb, char **str, size_t *str_len, int free return -1; } - compileWhereBuilder_sb(wb, sb, free_wb); + compileWhereBuilder_sb(sb, wb, free_wb); return strbld_finalize_or_destroy(&sb, str, str_len); } -void compileWhereBuilder_sb(where_builder *wb, str_builder *sb, int free_wb) +void compileWhereBuilder_sb(str_builder *sb, where_builder *wb, int free_wb) { + wb = finalizeWhere(wb); strbld_str(sb, " WHERE ", 7); - do_compileWhereBuilder_sb(wb, sb, free_wb); + do_compileWhereBuilder_sb(sb, wb); + if (strbld_len(sb) == 7) { + strbld_seek(sb, 0, 1); + } + if (free_wb) { + freeWhereBuilder(&wb); + } } void freeWhereBuilder(where_builder **wb_ptr) { diff --git a/src/db_where-builder.h b/src/db_where-builder.h index ee85a0c..4b17a4a 100644 --- a/src/db_where-builder.h +++ b/src/db_where-builder.h @@ -40,8 +40,8 @@ typedef struct where_builder_t where_builder; where_builder *createWhereBuilder(where_builder *initial_clause); -int compileWhereBuilder(where_builder *wb, char **str, size_t *str_len, int free_wb); -void compileWhereBuilder_sb(where_builder *wb, str_builder *sb, int free_wb); +int compileWhereBuilder(char **str, size_t *str_len, where_builder *wb, int free_wb); +void compileWhereBuilder_sb(str_builder *sb, where_builder *wb, int free_wb); void freeWhereBuilder(where_builder **wb_ptr); diff --git a/src/db_where-builder_p.c b/src/db_where-builder_p.c index 592d4ff..5f163d5 100644 --- a/src/db_where-builder_p.c +++ b/src/db_where-builder_p.c @@ -4,18 +4,18 @@ #include "db_where-builder_p.h" -void do_compileWhereBuilder_sb(where_builder *wb, str_builder *sb, int free_wb) +void do_compileWhereBuilder_sb(str_builder *sb, where_builder *wb) { switch(wb->logic_type) { case CLAUSE: { - compileWhere_sb((where_clause *)wb, sb); + compileWhere_sb(sb, (where_clause *)wb); break; } case OR: case AND: { - compileLogic_sb((where_logic *)wb, sb); + compileLogic_sb(sb, (where_logic *)wb); break; } default: @@ -23,9 +23,6 @@ void do_compileWhereBuilder_sb(where_builder *wb, str_builder *sb, int free_wb) break; } } - if (free_wb) { - freeWhereBuilder(&wb); - } } where_logic *createLogic(e_where_logic type, size_t initial_size) @@ -55,7 +52,7 @@ where_logic *createLogic(e_where_logic type, size_t initial_size) return logic; } -void compileLogic_sb(where_logic *logic, str_builder *sb) +void compileLogic_sb(str_builder *sb, where_logic *logic) { if (logic->n_clauses == 0) { return; @@ -63,7 +60,7 @@ void compileLogic_sb(where_logic *logic, str_builder *sb) strbld_char(sb, '('); for (size_t i = 0; i < logic->n_clauses; i++) { - do_compileWhereBuilder_sb(logic->clauses[i], sb, 0); + do_compileWhereBuilder_sb(sb, logic->clauses[i]); if (i < (logic->n_clauses - 1)) { if (logic->logic_type == OR) { strbld_str(sb, " OR ", 4); @@ -165,7 +162,7 @@ where_clause *createWhere(const char *tbl, const char *col, e_where_op op) return clause; } -void compileWhere_sb(where_clause *clause, str_builder *sb) +void compileWhere_sb(str_builder *sb, where_clause *clause) { size_t idx; diff --git a/src/db_where-builder_p.h b/src/db_where-builder_p.h index d548ed0..d7d87e4 100644 --- a/src/db_where-builder_p.h +++ b/src/db_where-builder_p.h @@ -50,12 +50,12 @@ struct where_clause_t { typedef struct where_clause_t where_clause; DLL_LOCAL -void do_compileWhereBuilder_sb(where_builder *wb, str_builder *sb, int free_wb); +void do_compileWhereBuilder_sb(str_builder *sb, where_builder *wb); DLL_LOCAL where_logic *createLogic(e_where_logic type, size_t initial_size); DLL_LOCAL -void compileLogic_sb(where_logic *logic, str_builder *sb); +void compileLogic_sb(str_builder *sb, where_logic *logic); DLL_LOCAL void freeLogic(where_logic **logic_ptr); @@ -65,7 +65,7 @@ where_builder *appendLogicClause(where_builder *wb, where_builder *wb_clause); DLL_LOCAL where_clause *createWhere(const char *tbl, const char *col, e_where_op op); DLL_LOCAL -void compileWhere_sb(where_clause *clause, str_builder *sb); +void compileWhere_sb(str_builder *sb, where_clause *clause); DLL_LOCAL void freeWhere(where_clause **where_ptr); diff --git a/src/strext.c b/src/strext.c index 31cce4f..b8079c9 100644 --- a/src/strext.c +++ b/src/strext.c @@ -184,6 +184,25 @@ int strbld_ensure_len(str_builder *sb, size_t len, int absolute) return 1; } +int strbld_seek(str_builder *sb, size_t to, int zero) +{ + if (to > sb->alloc) { + return 0; + } + + if (zero && to < sb->len) { + memset(sb->str + to, 0, sb->len - to); + } + + sb->len = to; + + return 1; +} +size_t strbld_len(str_builder *sb) +{ + return sb->len; +} + int strbld_str(str_builder *sb, const char *str, size_t len) { if (sb->fails > 0) { diff --git a/src/strext.h b/src/strext.h index c8e9b02..0782c26 100644 --- a/src/strext.h +++ b/src/strext.h @@ -26,6 +26,9 @@ int strbld_finalize_or_destroy(str_builder **sb, char **str, size_t *len); int strbld_ensure_len(str_builder *sb, size_t len, int absolute); +int strbld_seek(str_builder *sb, size_t to, int zero); +size_t strbld_len(str_builder *sb); + int strbld_str(str_builder *sb, const char *str, size_t len); int strbld_char(str_builder *sb, const char c);