diff --git a/src/backend/dbi/gnc-backend-dbi.c b/src/backend/dbi/gnc-backend-dbi.c index 5ed8911e32..66b3aafadd 100644 --- a/src/backend/dbi/gnc-backend-dbi.c +++ b/src/backend/dbi/gnc-backend-dbi.c @@ -622,7 +622,10 @@ gnc_dbi_session_end( QofBackend *be_start ) ENTER (" "); - dbi_conn_close( be->conn ); + if( be->conn != NULL ) { + dbi_conn_close( be->conn ); + be->conn = NULL; + } gnc_sql_finalize_version_info( &be->sql_be ); LEAVE (" "); @@ -679,7 +682,11 @@ gnc_dbi_save_may_clobber_data( QofBackend* qbe ) dbname = dbi_conn_get_option( be->conn, "dbname" ); table_name_list = ((GncDbiSqlConnection*)(be->sql_be.conn))->provider->get_table_list( be->conn, dbname ); if( table_name_list != NULL ) { + GSList* node; numTables = g_slist_length( table_name_list ); + for( node = table_name_list; node != NULL; node = node->next ) { + g_free( node->data ); + } g_slist_free( table_name_list ); } @@ -717,6 +724,7 @@ gnc_dbi_sync_all( QofBackend* qbe, /*@ dependent @*/ QofBook *book ) qof_backend_set_error( qbe, ERR_BACKEND_SERVER_ERR ); } } + g_free( node->data ); } g_slist_free( table_name_list ); } @@ -1478,6 +1486,8 @@ conn_create_table_ddl_sqlite3( GncSqlConnection* conn, if( !info->null_allowed ) { (void)g_string_append( ddl, " NOT NULL" ); } + g_free( info->name ); + g_free( info ); } (void)g_string_append( ddl, ")" ); @@ -1540,6 +1550,8 @@ conn_create_table_ddl_mysql( GncSqlConnection* conn, const gchar* table_name, if( !info->null_allowed ) { (void)g_string_append( ddl, " NOT NULL" ); } + g_free( info->name ); + g_free( info ); } (void)g_string_append( ddl, ")" ); @@ -1602,6 +1614,8 @@ conn_create_table_ddl_pgsql( GncSqlConnection* conn, const gchar* table_name, (void)g_string_append( ddl, " NOT NULL" ); } is_unicode = is_unicode || info->is_unicode; + g_free( info->name ); + g_free( info ); } (void)g_string_append( ddl, ")" ); if( is_unicode ) { @@ -1612,7 +1626,7 @@ conn_create_table_ddl_pgsql( GncSqlConnection* conn, const gchar* table_name, static gboolean conn_create_table( GncSqlConnection* conn, const gchar* table_name, - const GList* col_info_list ) + GList* col_info_list ) { GncDbiSqlConnection* dbi_conn = (GncDbiSqlConnection*)conn; gchar* ddl; @@ -1625,11 +1639,13 @@ conn_create_table( GncSqlConnection* conn, const gchar* table_name, ddl = dbi_conn->provider->create_table_ddl( conn, table_name, col_info_list ); + g_list_free( col_info_list ); if( ddl != NULL ) { gint status; DEBUG( "SQL: %s\n", ddl ); result = dbi_conn_query( dbi_conn->conn, ddl ); + g_free( ddl ); status = dbi_result_free( result ); if( status < 0 ) { PERR( "Error in dbi_result_free() result\n" ); @@ -1662,6 +1678,7 @@ conn_create_index( /*@ unused @*/ GncSqlConnection* conn, /*@ unused @*/ const g DEBUG( "SQL: %s\n", ddl ); result = dbi_conn_query( dbi_conn->conn, ddl ); + g_free( ddl ); status = dbi_result_free( result ); if( status < 0 ) { PERR( "Error in dbi_result_free() result\n" ); diff --git a/src/backend/dbi/test/test-dbi-stuff.c b/src/backend/dbi/test/test-dbi-stuff.c index 10dfdd3180..1894e3c38b 100644 --- a/src/backend/dbi/test/test-dbi-stuff.c +++ b/src/backend/dbi/test/test-dbi-stuff.c @@ -398,4 +398,10 @@ test_dbi_store_and_reload( const gchar* driver, QofSession* session_1, const gch // Compare with the original data compare_books( qof_session_get_book( session_2 ), qof_session_get_book( session_3 ) ); + qof_session_end( session_1 ); + qof_session_destroy( session_1 ); + qof_session_end( session_2 ); + qof_session_destroy( session_2 ); + qof_session_end( session_3 ); + qof_session_destroy( session_3 ); } diff --git a/src/backend/dbi/test/test-dbi.c b/src/backend/dbi/test/test-dbi.c index e84f8298e0..7f5f412a42 100644 --- a/src/backend/dbi/test/test-dbi.c +++ b/src/backend/dbi/test/test-dbi.c @@ -55,12 +55,20 @@ int main (int argc, char ** argv) filename = tempnam( "/tmp", "test-sqlite3-" ); printf( "Using filename: %s\n", filename ); test_dbi_store_and_reload( "sqlite3", session_1, filename ); + printf( "TEST_MYSQL_URL='%s'\n", TEST_MYSQL_URL ); if( strlen( TEST_MYSQL_URL ) > 0 ) { + session_1 = qof_session_new(); + qof_session_begin( session_1, DBI_TEST_XML_FILENAME, FALSE, FALSE ); + qof_session_load( session_1, NULL ); test_dbi_store_and_reload( "mysql", session_1, TEST_MYSQL_URL ); } + printf( "TEST_PGSQL_URL='%s'\n", TEST_PGSQL_URL ); if( strlen( TEST_PGSQL_URL ) > 0 ) { + session_1 = qof_session_new(); + qof_session_begin( session_1, DBI_TEST_XML_FILENAME, FALSE, FALSE ); + qof_session_load( session_1, NULL ); test_dbi_store_and_reload( "pgsql", session_1, TEST_PGSQL_URL ); } print_test_results(); diff --git a/src/backend/sql/gnc-backend-sql.c b/src/backend/sql/gnc-backend-sql.c index 68a0859471..b8da18efe7 100644 --- a/src/backend/sql/gnc-backend-sql.c +++ b/src/backend/sql/gnc-backend-sql.c @@ -2393,6 +2393,7 @@ build_insert_statement( GncSqlBackend* be, g_string_append( sql, "," ); } g_string_append( sql, (gchar*)colname->data ); + g_free( colname->data ); } g_list_free( colnames ); @@ -2469,6 +2470,7 @@ build_update_statement( GncSqlBackend* be, (void)g_string_append( sql, "," ); } (void)g_string_append( sql, (gchar*)colname->data ); + g_free( colname->data ); (void)g_string_append( sql, "=" ); value_str = gnc_sql_get_sql_value( be->conn, (GValue*)(value->data) ); (void)g_string_append( sql, value_str ); @@ -2482,6 +2484,9 @@ build_update_statement( GncSqlBackend* be, stmt = gnc_sql_connection_create_statement_from_sql( be->conn, sql->str ); gnc_sql_statement_add_where_cond( stmt, obj_name, pObject, &table[0], (GValue*)(values->data) ); + for( value = values; value != NULL; value = value->next ) { + g_free( value->data ); + } g_slist_free( values ); (void)g_string_free( sql, TRUE ); diff --git a/src/backend/sql/gnc-backend-sql.h b/src/backend/sql/gnc-backend-sql.h index 464c8cb9e7..81ade33e2b 100644 --- a/src/backend/sql/gnc-backend-sql.h +++ b/src/backend/sql/gnc-backend-sql.h @@ -167,7 +167,7 @@ struct GncSqlConnection gboolean (*beginTransaction)( GncSqlConnection* ); /**< Returns TRUE if successful, FALSE if error */ gboolean (*rollbackTransaction)( GncSqlConnection* ); /**< Returns TRUE if successful, FALSE if error */ gboolean (*commitTransaction)( GncSqlConnection* ); /**< Returns TRUE if successful, FALSE if error */ - gboolean (*createTable)( GncSqlConnection*, const gchar*, const GList* ); /**< Returns TRUE if successful, FALSE if error */ + gboolean (*createTable)( GncSqlConnection*, const gchar*, GList* ); /**< Returns TRUE if successful, FALSE if error */ gboolean (*createIndex)( GncSqlConnection*, const gchar*, const gchar*, const GncSqlColumnTableEntry* ); /**< Returns TRUE if successful, FALSE if error */ gchar* (*quoteString)( const GncSqlConnection*, gchar* ); }; @@ -290,7 +290,7 @@ typedef enum { * a column in a table. */ typedef struct { - /*@ only @*/ const gchar* name; /**< Column name */ + /*@ only @*/ gchar* name; /**< Column name */ GncSqlBasicColumnType type; /**< Column basic type */ gint size; /**< Column size (string types) */ gboolean is_unicode; /**< Column is unicode (string types) */ diff --git a/src/backend/sql/gnc-transaction-sql.c b/src/backend/sql/gnc-transaction-sql.c index 45b46fe1b4..67f8f794a0 100644 --- a/src/backend/sql/gnc-transaction-sql.c +++ b/src/backend/sql/gnc-transaction-sql.c @@ -399,6 +399,7 @@ query_transactions( GncSqlBackend* be, GncSqlStatement* stmt ) Transaction* pTx = GNC_TRANSACTION(node->data); xaccTransCommitEdit( pTx ); } + g_list_free( tx_list ); #if LOAD_TRANSACTIONS_AS_NEEDED // Update the account balances based on the loaded splits. If the end