mirror of
https://github.com/mdbtools/mdbtools.git
synced 2026-02-25 21:26:41 +08:00
Merge branch 'sql_dynamic_bound_length' of github.com:mdbtools/mdbtools into merge-166
This commit is contained in:
@@ -68,6 +68,7 @@ MdbSQL *sql;
|
||||
sql = (MdbSQL *) g_malloc0(sizeof(MdbSQL));
|
||||
sql->columns = g_ptr_array_new();
|
||||
sql->tables = g_ptr_array_new();
|
||||
sql->bound_values = g_ptr_array_new();
|
||||
sql->sarg_tree = NULL;
|
||||
sql->sarg_stack = NULL;
|
||||
sql->max_rows = -1;
|
||||
@@ -143,6 +144,34 @@ static void mdb_sql_free_tables(GPtrArray *tables)
|
||||
g_ptr_array_free(tables, TRUE);
|
||||
}
|
||||
|
||||
/* This gives us a nice, uniform place to keep up with memory that needs to be freed */
|
||||
static void mdb_sql_free(MdbSQL *sql)
|
||||
{
|
||||
/* Free MdbTableDef structures */
|
||||
if (sql->cur_table) {
|
||||
mdb_index_scan_free(sql->cur_table);
|
||||
mdb_free_tabledef(sql->cur_table);
|
||||
sql->cur_table = NULL;
|
||||
}
|
||||
|
||||
/* Free MdbSQLColumns and MdbSQLTables */
|
||||
mdb_sql_free_columns(sql->columns);
|
||||
mdb_sql_free_tables(sql->tables);
|
||||
|
||||
/* Free sargs */
|
||||
if (sql->sarg_tree) {
|
||||
mdb_sql_free_tree(sql->sarg_tree);
|
||||
sql->sarg_tree = NULL;
|
||||
}
|
||||
|
||||
g_list_free(sql->sarg_stack);
|
||||
sql->sarg_stack = NULL;
|
||||
|
||||
/* Free bindings */
|
||||
mdb_sql_unbind_all(sql);
|
||||
g_ptr_array_free(sql->bound_values, TRUE);
|
||||
}
|
||||
|
||||
void
|
||||
mdb_sql_close(MdbSQL *sql)
|
||||
{
|
||||
@@ -512,13 +541,7 @@ void mdb_sql_dump(MdbSQL *sql)
|
||||
}
|
||||
void mdb_sql_exit(MdbSQL *sql)
|
||||
{
|
||||
/* Free the memory associated with the SQL engine */
|
||||
mdb_sql_reset(sql);
|
||||
|
||||
g_ptr_array_free(sql->columns, TRUE);
|
||||
g_ptr_array_free(sql->tables, TRUE);
|
||||
|
||||
/* If libmdb has been initialized, terminate it */
|
||||
mdb_sql_free(sql);
|
||||
if (sql->mdb)
|
||||
mdb_close(sql->mdb);
|
||||
|
||||
@@ -527,17 +550,7 @@ void mdb_sql_exit(MdbSQL *sql)
|
||||
}
|
||||
void mdb_sql_reset(MdbSQL *sql)
|
||||
{
|
||||
unsigned int i;
|
||||
|
||||
if (sql->cur_table) {
|
||||
mdb_index_scan_free(sql->cur_table);
|
||||
if (sql->cur_table->sarg_tree) {
|
||||
mdb_sql_free_tree(sql->cur_table->sarg_tree);
|
||||
sql->cur_table->sarg_tree = NULL;
|
||||
}
|
||||
mdb_free_tabledef(sql->cur_table);
|
||||
sql->cur_table = NULL;
|
||||
}
|
||||
mdb_sql_free(sql);
|
||||
|
||||
/* Reset bound values */
|
||||
for (i=0;i<sql->num_columns;i++) {
|
||||
@@ -546,22 +559,15 @@ void mdb_sql_reset(MdbSQL *sql)
|
||||
}
|
||||
|
||||
/* Reset columns */
|
||||
mdb_sql_free_columns(sql->columns);
|
||||
sql->num_columns = 0;
|
||||
sql->columns = g_ptr_array_new();
|
||||
|
||||
/* Reset tables */
|
||||
mdb_sql_free_tables(sql->tables);
|
||||
/* Reset MdbSQL tables */
|
||||
sql->num_tables = 0;
|
||||
sql->tables = g_ptr_array_new();
|
||||
|
||||
/* Reset sargs */
|
||||
if (sql->sarg_tree) {
|
||||
mdb_sql_free_tree(sql->sarg_tree);
|
||||
sql->sarg_tree = NULL;
|
||||
}
|
||||
g_list_free(sql->sarg_stack);
|
||||
sql->sarg_stack = NULL;
|
||||
/* Reset bindings */
|
||||
sql->bound_values = g_ptr_array_new();
|
||||
|
||||
sql->all_columns = 0;
|
||||
sql->sel_count = 0;
|
||||
@@ -848,12 +854,24 @@ void
|
||||
mdb_sql_bind_all(MdbSQL *sql)
|
||||
{
|
||||
unsigned int i;
|
||||
void *bound_value;
|
||||
|
||||
for (i=0;i<sql->num_columns;i++) {
|
||||
sql->bound_values[i] = g_malloc0(MDB_BIND_SIZE);
|
||||
mdb_sql_bind_column(sql, i+1, sql->bound_values[i], NULL);
|
||||
bound_value = g_malloc0(sql->mdb->bind_size);
|
||||
g_ptr_array_add(sql->bound_values, bound_value);
|
||||
mdb_sql_bind_column(sql, i+1, bound_value, NULL);
|
||||
}
|
||||
}
|
||||
|
||||
void mdb_sql_unbind_all(MdbSQL *sql)
|
||||
{
|
||||
unsigned int i;
|
||||
|
||||
for (i=0;i<sql->bound_values->len;i++) {
|
||||
g_free(g_ptr_array_index(sql->bound_values, i));
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* mdb_sql_fetch_row is now just a wrapper around mdb_fetch_row.
|
||||
* It is left here only for backward compatibility.
|
||||
@@ -898,7 +916,7 @@ mdb_sql_dump_results(MdbSQL *sql)
|
||||
while(mdb_fetch_row(sql->cur_table)) {
|
||||
for (j=0;j<sql->num_columns;j++) {
|
||||
sqlcol = g_ptr_array_index(sql->columns,j);
|
||||
print_value(sql->bound_values[j],sqlcol->disp_size,!j);
|
||||
print_value(g_ptr_array_index(sql->bound_values, j),sqlcol->disp_size,!j);
|
||||
}
|
||||
fprintf(stdout,"\n");
|
||||
}
|
||||
@@ -910,10 +928,6 @@ mdb_sql_dump_results(MdbSQL *sql)
|
||||
}
|
||||
|
||||
fprintf(stdout,"\n");
|
||||
/* clean up */
|
||||
for (j=0;j<sql->num_columns;j++) {
|
||||
g_free(sql->bound_values[j]);
|
||||
}
|
||||
|
||||
/* the column and table names are no good now */
|
||||
mdb_sql_reset(sql);
|
||||
|
||||
@@ -264,11 +264,11 @@ dump_results(FILE *out, MdbSQL *sql, char *delimiter)
|
||||
while(mdb_sql_fetch_row(sql, sql->cur_table)) {
|
||||
for (j=0;j<sql->num_columns-1;j++) {
|
||||
sqlcol = g_ptr_array_index(sql->columns,j);
|
||||
fprintf(out, "%s%s", (char*)(sql->bound_values[j]),
|
||||
fprintf(out, "%s%s", (char*)(g_ptr_array_index(sql->bound_values, j)),
|
||||
delimiter ? delimiter : "\t");
|
||||
}
|
||||
sqlcol = g_ptr_array_index(sql->columns,sql->num_columns-1);
|
||||
fprintf(out, "%s", (char*)(sql->bound_values[sql->num_columns-1]));
|
||||
fprintf(out, "%s", (char*)(g_ptr_array_index(sql->bound_values, sql->num_columns-1)));
|
||||
fprintf(out,"\n");
|
||||
fflush(out);
|
||||
}
|
||||
@@ -312,7 +312,7 @@ dump_results_pp(FILE *out, MdbSQL *sql)
|
||||
while(mdb_sql_fetch_row(sql, sql->cur_table)) {
|
||||
for (j=0;j<sql->num_columns;j++) {
|
||||
sqlcol = g_ptr_array_index(sql->columns,j);
|
||||
print_value(out, sql->bound_values[j],sqlcol->disp_size,!j);
|
||||
print_value(out, (char *) g_ptr_array_index(sql->bound_values, j), sqlcol->disp_size,!j);
|
||||
}
|
||||
fprintf(out,"\n");
|
||||
fflush(out);
|
||||
|
||||
Reference in New Issue
Block a user