diff --git a/addressbook/libedata-book/e-book-sqlite.c b/addressbook/libedata-book/e-book-sqlite.c index e3770fe..64449db 100644 --- a/addressbook/libedata-book/e-book-sqlite.c +++ b/addressbook/libedata-book/e-book-sqlite.c @@ -246,7 +246,7 @@ ebsql_init_debug (void) } \ } G_STMT_END -#define FOLDER_VERSION 8 +#define FOLDER_VERSION 9 #define INSERT_MULTI_STMT_BYTES 128 #define COLUMN_DEFINITION_BYTES 32 #define GENERATED_QUERY_BYTES 1024 @@ -2075,7 +2075,7 @@ format_multivalues (EBookSqlite *ebsql) } } - return g_string_free (string, FALSE); + return g_string_free (string, string->len == 0); } /* Called with the lock held and inside a transaction */ @@ -2109,6 +2109,23 @@ ebsql_add_folder (EBookSqlite *ebsql, return success; } +static gboolean +ebsql_email_list_exists (EBookSqlite *ebsql) +{ + gint n_tables = 0; + gboolean success; + + success = ebsql_exec_printf ( + ebsql, "SELECT count(*) FROM sqlite_master WHERE type='table' AND name='%q_email_list';", + get_count_cb, &n_tables, NULL, NULL, + ebsql->priv->folderid); + + if (!success) + return FALSE; + + return n_tables == 1; +} + /* Called with the lock held and inside a transaction */ static gboolean ebsql_introspect_summary (EBookSqlite *ebsql, @@ -2225,6 +2242,19 @@ ebsql_introspect_summary (EBookSqlite *ebsql, if (!success) goto introspect_summary_finish; + if (!multivalues || !*multivalues) { + g_free (multivalues); + multivalues = NULL; + + /* The migration from a previous version didn't store this default multivalue + reference, thus the next backend open (not the immediate one after migration), + didn't know about this table, which has a FOREIGN KEY constraint, thus an item + delete caused a 'FOREIGN KEY constraint failed' error. + */ + if (ebsql_email_list_exists (ebsql)) + multivalues = g_strdup ("email;prefix"); + } + if (multivalues) { gchar **fields = g_strsplit (multivalues, ":", 0); @@ -2524,6 +2554,20 @@ ebsql_init_aux_tables (EBookSqlite *ebsql, field->aux_table)); } + if (success) { + gchar *multivalues; + + multivalues = format_multivalues (ebsql); + + success = ebsql_exec_printf ( + ebsql, + "UPDATE folders SET multivalues=%Q WHERE folder_id=%Q", + NULL, NULL, NULL, error, + multivalues, ebsql->priv->folderid); + + g_free (multivalues); + } + EBSQL_NOTE ( SCHEMA, g_printerr ( @@ -2770,7 +2814,7 @@ ebsql_init_locale (EBookSqlite *ebsql, /* Check if we need to relocalize */ if (success) { /* Need to relocalize the whole thing if the schema has been upgraded to version 7 */ - if (previous_schema >= 1 && previous_schema < 7) + if (previous_schema >= 1 && previous_schema < 9) relocalize_needed = TRUE; /* We may need to relocalize for a country code change */