r18241 - gnucash/trunk/src/backend - Handle creation of autoinc columns correctly
Phil Longstaff
plongstaff at code.gnucash.org
Sun Aug 9 18:25:22 EDT 2009
Author: plongstaff
Date: 2009-08-09 18:25:22 -0400 (Sun, 09 Aug 2009)
New Revision: 18241
Trac: http://svn.gnucash.org/trac/changeset/18241
Modified:
gnucash/trunk/src/backend/dbi/gnc-backend-dbi.c
gnucash/trunk/src/backend/sql/gnc-backend-sql.h
Log:
Handle creation of autoinc columns correctly
Modified: gnucash/trunk/src/backend/dbi/gnc-backend-dbi.c
===================================================================
--- gnucash/trunk/src/backend/dbi/gnc-backend-dbi.c 2009-08-09 17:26:16 UTC (rev 18240)
+++ gnucash/trunk/src/backend/dbi/gnc-backend-dbi.c 2009-08-09 22:25:22 UTC (rev 18241)
@@ -67,46 +67,38 @@
typedef gchar* (*CREATE_TABLE_DDL_FN)( GncSqlConnection* conn,
const gchar* table_name,
const GList* col_info_list );
-typedef const gchar* (*GET_COLUMN_TYPE_NAME_FN)( GType type, gint size );
typedef GSList* (*GET_TABLE_LIST_FN)( dbi_conn conn, const gchar* dbname );
typedef struct {
CREATE_TABLE_DDL_FN create_table_ddl;
- GET_COLUMN_TYPE_NAME_FN get_column_type_name;
GET_TABLE_LIST_FN get_table_list;
} provider_functions_t;
static /*@ null @*/ gchar* conn_create_table_ddl_sqlite3( GncSqlConnection* conn,
const gchar* table_name,
const GList* col_info_list );
-static /*@ observer @*/ const gchar* get_column_type_name_sqlite3( GType type, gint size );
static GSList* conn_get_table_list( dbi_conn conn, const gchar* dbname );
static provider_functions_t provider_sqlite3 =
{
conn_create_table_ddl_sqlite3,
- get_column_type_name_sqlite3,
conn_get_table_list
};
static /*@ null @*/ gchar* conn_create_table_ddl_mysql( GncSqlConnection* conn,
const gchar* table_name,
const GList* col_info_list );
-static /*@ observer @*/ const gchar* get_column_type_name_mysql( GType type, gint size );
static provider_functions_t provider_mysql =
{
conn_create_table_ddl_mysql,
- get_column_type_name_mysql,
conn_get_table_list
};
static /*@ null @*/ gchar* conn_create_table_ddl_pgsql( GncSqlConnection* conn,
const gchar* table_name,
const GList* col_info_list );
-static /*@ observer @*/ const gchar* get_column_type_name_pgsql( GType type, gint size );
static GSList* conn_get_table_list_pgsql( dbi_conn conn, const gchar* dbname );
static provider_functions_t provider_pgsql =
{
conn_create_table_ddl_pgsql,
- get_column_type_name_pgsql,
conn_get_table_list_pgsql
};
@@ -1345,85 +1337,33 @@
return TRUE;
}
-static /*@ observer @*/ const gchar*
-get_column_type_name_sqlite3( GType type, /*@ unused @*/ gint size )
+static /*@ null @*/ gchar*
+create_index_ddl( GncSqlConnection* conn,
+ const gchar* index_name,
+ const gchar* table_name,
+ const GncSqlColumnTableEntry* col_table )
{
- switch( type ) {
- case G_TYPE_INT:
- return "integer";
+ GString* ddl;
+ const GncSqlColumnTableEntry* table_row;
- case G_TYPE_INT64:
- return "bigint";
-
- case G_TYPE_DOUBLE:
- return "real";
-
- case G_TYPE_STRING:
- return "text";
-
- default:
- PERR( "Unknown GType: %s\n", g_type_name( type ) );
- return "";
- }
+ g_return_val_if_fail( conn != NULL, NULL );
+ g_return_val_if_fail( index_name != NULL, NULL );
+ g_return_val_if_fail( table_name != NULL, NULL );
+ g_return_val_if_fail( col_table != NULL, NULL );
+
+ ddl = g_string_new( "" );
+ g_string_printf( ddl, "CREATE INDEX %s ON %s (", index_name, table_name );
+ for( table_row = col_table; table_row->col_name != NULL; ++table_row ) {
+ if( table_row != col_table ) {
+ (void)g_string_append( ddl, ", " );
+ }
+ g_string_append_printf( ddl, "%s", table_row->col_name );
+ }
+ (void)g_string_append( ddl, ")" );
+
+ return g_string_free( ddl, FALSE );
}
-static /*@ observer @*/ const gchar*
-get_column_type_name_mysql( GType type, /*@ unused @*/ gint size )
-{
- switch( type ) {
- case G_TYPE_INT:
- return "integer";
-
- case G_TYPE_INT64:
- return "bigint";
-
- case G_TYPE_DOUBLE:
- return "double";
-
- case G_TYPE_STRING:
- return "varchar";
-
- default:
- PERR( "Unknown GType: %s\n", g_type_name( type ) );
- return "";
- }
-}
-
-static /*@ observer @*/ const gchar*
-get_column_type_name_pgsql( GType type, /*@ unused @*/ gint size )
-{
- switch( type ) {
- case G_TYPE_INT:
- return "integer";
-
- case G_TYPE_INT64:
- return "int8";
-
- case G_TYPE_DOUBLE:
- return "double precision";
-
- case G_TYPE_STRING:
- return "varchar";
-
- default:
- PERR( "Unknown GType: %s\n", g_type_name( type ) );
- return "";
- }
-}
-
-static /*@ observer @*/ const gchar*
-conn_get_column_type_name( GncSqlConnection* conn, GType type, /*@ unused @*/ gint size )
-{
- GncDbiSqlConnection* dbi_conn = (GncDbiSqlConnection*)conn;
-
- if( dbi_conn->provider != NULL && dbi_conn->provider->get_column_type_name != NULL ) {
- return dbi_conn->provider->get_column_type_name( type, size );
- } else {
- PERR( "Unknown provider type\n" );
- return "";
- }
-}
-
static /*@ null @*/ gchar*
conn_create_table_ddl_sqlite3( GncSqlConnection* conn,
const gchar* table_name,
@@ -1432,6 +1372,7 @@
GString* ddl;
const GList* list_node;
guint col_num;
+ gchar* type_name;
g_return_val_if_fail( conn != NULL, NULL );
g_return_val_if_fail( table_name != NULL, NULL );
@@ -1446,14 +1387,37 @@
if( col_num != 0 ) {
(void)g_string_append( ddl, ", " );
}
- g_string_append_printf( ddl, "%s %s", info->name,
- gnc_sql_connection_get_column_type_name( conn, info->type, info->size ) );
+ switch( info->type ) {
+ case G_TYPE_INT:
+ type_name = "integer";
+ break;
+
+ case G_TYPE_INT64:
+ type_name = "bigint";
+ break;
+
+ case G_TYPE_DOUBLE:
+ type_name = "real";
+ break;
+
+ case G_TYPE_STRING:
+ type_name = "text";
+ break;
+
+ default:
+ PERR( "Unknown GType: %s\n", g_type_name( info->type ) );
+ type_name = "";
+ }
+ g_string_append_printf( ddl, "%s %s", info->name, type_name );
if( info->size != 0 ) {
(void)g_string_append_printf( ddl, "(%d)", info->size );
}
if( info->is_primary_key ) {
(void)g_string_append( ddl, " PRIMARY KEY" );
}
+ if( info->is_autoinc ) {
+ (void)g_string_append( ddl, " AUTOINCREMENT" );
+ }
if( !info->null_allowed ) {
(void)g_string_append( ddl, " NOT NULL" );
}
@@ -1464,39 +1428,13 @@
}
static /*@ null @*/ gchar*
-create_index_ddl( GncSqlConnection* conn,
- const gchar* index_name,
- const gchar* table_name,
- const GncSqlColumnTableEntry* col_table )
-{
- GString* ddl;
- const GncSqlColumnTableEntry* table_row;
-
- g_return_val_if_fail( conn != NULL, NULL );
- g_return_val_if_fail( index_name != NULL, NULL );
- g_return_val_if_fail( table_name != NULL, NULL );
- g_return_val_if_fail( col_table != NULL, NULL );
-
- ddl = g_string_new( "" );
- g_string_printf( ddl, "CREATE INDEX %s ON %s (", index_name, table_name );
- for( table_row = col_table; table_row->col_name != NULL; ++table_row ) {
- if( table_row != col_table ) {
- (void)g_string_append( ddl, ", " );
- }
- g_string_append_printf( ddl, "%s", table_row->col_name );
- }
- (void)g_string_append( ddl, ")" );
-
- return g_string_free( ddl, FALSE );
-}
-
-static /*@ null @*/ gchar*
conn_create_table_ddl_mysql( GncSqlConnection* conn, const gchar* table_name,
const GList* col_info_list )
{
GString* ddl;
const GList* list_node;
guint col_num;
+ gchar* type_name;
g_return_val_if_fail( conn != NULL, NULL );
g_return_val_if_fail( table_name != NULL, NULL );
@@ -1511,8 +1449,28 @@
if( col_num != 0 ) {
(void)g_string_append( ddl, ", " );
}
- g_string_append_printf( ddl, "%s %s", info->name,
- gnc_sql_connection_get_column_type_name( conn, info->type, info->size ) );
+ switch( info->type ) {
+ case G_TYPE_INT:
+ type_name = "integer";
+ break;
+
+ case G_TYPE_INT64:
+ type_name = "bigint";
+ break;
+
+ case G_TYPE_DOUBLE:
+ type_name = "double";
+ break;
+
+ case G_TYPE_STRING:
+ type_name = "varchar";
+ break;
+
+ default:
+ PERR( "Unknown GType: %s\n", g_type_name( info->type ) );
+ type_name = "";
+ }
+ g_string_append_printf( ddl, "%s %s", info->name, type_name );
if( info->size != 0 ) {
g_string_append_printf( ddl, "(%d)", info->size );
}
@@ -1522,6 +1480,9 @@
if( info->is_primary_key ) {
(void)g_string_append( ddl, " PRIMARY KEY" );
}
+ if( info->is_autoinc ) {
+ (void)g_string_append( ddl, " AUTO_INCREMENT" );
+ }
if( !info->null_allowed ) {
(void)g_string_append( ddl, " NOT NULL" );
}
@@ -1538,6 +1499,7 @@
GString* ddl;
const GList* list_node;
guint col_num;
+ gchar* type_name;
gboolean is_unicode = FALSE;
g_return_val_if_fail( conn != NULL, NULL );
@@ -1553,8 +1515,32 @@
if( col_num != 0 ) {
(void)g_string_append( ddl, ", " );
}
- g_string_append_printf( ddl, "%s %s", info->name,
- gnc_sql_connection_get_column_type_name( conn, info->type, info->size ) );
+ switch( info->type ) {
+ case G_TYPE_INT:
+ if( info->is_autoinc ) {
+ type_name = "sequence";
+ } else {
+ type_name = "integer";
+ }
+ break;
+
+ case G_TYPE_INT64:
+ type_name = "int8";
+ break;
+
+ case G_TYPE_DOUBLE:
+ type_name = "double precision";
+ break;
+
+ case G_TYPE_STRING:
+ type_name = "varchar";
+ break;
+
+ default:
+ PERR( "Unknown GType: %s\n", g_type_name( info->type ) );
+ type_name = "";
+ }
+ g_string_append_printf( ddl, "%s %s", info->name, type_name );
if( info->size != 0 ) {
g_string_append_printf( ddl, "(%d)", info->size );
}
@@ -1721,7 +1707,6 @@
dbi_conn->base.beginTransaction = conn_begin_transaction;
dbi_conn->base.rollbackTransaction = conn_rollback_transaction;
dbi_conn->base.commitTransaction = conn_commit_transaction;
- dbi_conn->base.getColumnTypeName = conn_get_column_type_name;
dbi_conn->base.createTable = conn_create_table;
dbi_conn->base.createIndex = conn_create_index;
dbi_conn->base.quoteString = conn_quote_string;
Modified: gnucash/trunk/src/backend/sql/gnc-backend-sql.h
===================================================================
--- gnucash/trunk/src/backend/sql/gnc-backend-sql.h 2009-08-09 17:26:16 UTC (rev 18240)
+++ gnucash/trunk/src/backend/sql/gnc-backend-sql.h 2009-08-09 22:25:22 UTC (rev 18241)
@@ -166,7 +166,6 @@
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 */
- const gchar* (*getColumnTypeName)( GncSqlConnection*, GType, gint size );
gboolean (*createTable)( GncSqlConnection*, const gchar*, const 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* );
@@ -186,8 +185,6 @@
(CONN)->rollbackTransaction(CONN)
#define gnc_sql_connection_commit_transaction(CONN) \
(CONN)->commitTransaction(CONN)
-#define gnc_sql_connection_get_column_type_name(CONN,TYPE,SIZE) \
- (CONN)->getColumnTypeName(CONN,TYPE,SIZE)
#define gnc_sql_connection_create_table(CONN,NAME,COLLIST) \
(CONN)->createTable(CONN,NAME,COLLIST)
#define gnc_sql_connection_create_index(CONN,INDEXNAME,TABLENAME,COLTABLE) \
@@ -284,6 +281,7 @@
GType type; /**< Column basic type */
gint size; /**< Column size (string types) */
gboolean is_unicode; /**< Column is unicode (string types) */
+ gboolean is_autoinc; /**< Column is autoinc (int type) */
gboolean is_primary_key; /**< Column is the primary key */
gboolean null_allowed; /**< Column allows NULL values */
} GncSqlColumnInfo;
More information about the gnucash-changes
mailing list