| Ticket Hash: | 604fae8d2831864e1edd49467bac0ab2290bdc7b | |||
| Title: | Add logic to add missing new spatialite internal TABLES to older Databases | |||
| Status: | Closed | Type: | Feature_Request | |
| Severity: | Cosmetic | Priority: | Immediate | |
| Subsystem: | Resolution: | Overcome_By_Events | ||
| Last Modified: | 2020-08-26 07:18:17 | |||
| Version Found In: | 4.5.0dev | |||
| User Comments: | ||||
|
mj10777 added on 2017-05-04 05:58:57:
When using older Databases that do not contain new internal TABLES, the 'INSERT OR IGNORE' statements brings errors:
mj10777 added on 2017-05-04 10:23:23:
Sorry, was doing to many things at once. mj10777 added on 2017-06-06 05:33:31:
After adding the following statement into 'createAdvancedMetaData':
I receive the following output while starting QGIS: -I-> createAdvancedMetaData read_only[0] -I-> createAdvancedMetaData read_only[0] -I-> createAdvancedMetaData read_only[1] SQL error: INSERT OR IGNORE INTO data_licenses (id, name, url) VALUES (0, 'Undefined', NULL): attempt to write a readonly database -I-> createAdvancedMetaData read_only[1] SQL error: INSERT OR IGNORE INTO data_licenses (id, name, url) VALUES (0, 'Undefined', NULL): attempt to write a readonly database -I-> createAdvancedMetaData read_only[1] SQL error: INSERT OR IGNORE INTO data_licenses (id, name, url) VALUES (0, 'Undefined', NULL): attempt to write a readonly databaseSo I think that a check is needed to avoid these messages. I assume that 'something' called from QGIS is 'sniffing' the Database and that the connection has been opened with readonly. mj10777 added on 2017-06-06 06:58:46: This might offer a swifter solution, that would also avoid making INSERTS, UPDATES on tables that don't need them.
SPATIALITE_PRIVATE int
createAdvancedMetaData (void *p_sqlite)
{
/* creating the advanced MetaData tables */
sqlite3 *sqlite = (sqlite3 *) p_sqlite;
if (sqlite3_db_readonly( sqlite, "main" ))
return 1;
sqlite3_stmt *stmt;
int ret=0;
int has_geometry_columns_statistics=0;
int has_geometry_columns_field_infos=0;
int has_geometry_columns_auth=0;
int has_geometry_columns_times=0;
int has_geometry_columns_views=0;
int has_views_geometry_columns=0;
int has_views_geometry_columns_statistics=0;
int has_views_geometry_columns_field_infos=0;
int has_views_geometry_columns_auth=0;
int has_virts_geometry_columns=0;
int has_virts_geometry_columns_statistics=0;
int has_virts_geometry_columns_field_infos=0;
int has_virts_geometry_columns_auth=0;
int has_data_licenses=0;
int has_sql_statements_log=0;
// 15 checks
char *sql;
sql =
sqlite3_mprintf ("SELECT "
"(SELECT Exists(SELECT rootpage FROM sqlite_master "
"WHERE (type = 'table' AND Lower(tbl_name) = Lower(%Q)), "
"(SELECT Exists(SELECT rootpage FROM sqlite_master "
"WHERE (type = 'table' AND Lower(tbl_name) = Lower(%Q)), "
"(SELECT Exists(SELECT rootpage FROM sqlite_master "
"WHERE (type = 'table' AND Lower(tbl_name) = Lower(%Q)), "
"(SELECT Exists(SELECT rootpage FROM sqlite_master "
"WHERE (type = 'table' AND Lower(tbl_name) = Lower(%Q)), "
"(SELECT Exists(SELECT rootpage FROM sqlite_master "
"WHERE (type = 'table' AND Lower(tbl_name) = Lower(%Q)), "
"(SELECT Exists(SELECT rootpage FROM sqlite_master "
"WHERE (type = 'table' AND Lower(tbl_name) = Lower(%Q)), "
"(SELECT Exists(SELECT rootpage FROM sqlite_master "
"WHERE (type = 'table' AND Lower(tbl_name) = Lower(%Q)), "
"(SELECT Exists(SELECT rootpage FROM sqlite_master "
"WHERE (type = 'table' AND Lower(tbl_name) = Lower(%Q)), "
"(SELECT Exists(SELECT rootpage FROM sqlite_master "
"WHERE (type = 'table' AND Lower(tbl_name) = Lower(%Q)), "
"(SELECT Exists(SELECT rootpage FROM sqlite_master "
"WHERE (type = 'table' AND Lower(tbl_name) = Lower(%Q)), "
"(SELECT Exists(SELECT rootpage FROM sqlite_master "
"WHERE (type = 'table' AND Lower(tbl_name) = Lower(%Q)), "
"(SELECT Exists(SELECT rootpage FROM sqlite_master "
"WHERE (type = 'table' AND Lower(tbl_name) = Lower(%Q)), "
"(SELECT Exists(SELECT rootpage FROM sqlite_master "
"WHERE (type = 'table' AND Lower(tbl_name) = Lower(%Q)), "
"(SELECT Exists(SELECT rootpage FROM sqlite_master "
"WHERE (type = 'table' AND Lower(tbl_name) = Lower(%Q)), "
"(SELECT Exists(SELECT rootpage FROM sqlite_master "
"WHERE (type = 'table' AND Lower(tbl_name) = Lower(%Q)), ",
"geometry_columns_statistics","geometry_columns_field_infos",
"geometry_columns_auth","geometry_columns_times","geometry_columns_views",
"views_geometry_columns","views_geometry_columns_statistics",
"views_geometry_columns_field_infos","views_geometry_columns_auth",
"virts_geometry_columns","virts_geometry_columns_statistics",
"virts_geometry_columns_field_infos","'virts_geometry_columns_auth",
"data_licenses","sql_statements_log");
ret = sqlite3_prepare_v2 (sqlite, sql, strlen (sql), &stmt, NULL);
sqlite3_free (sql);
if (ret == SQLITE_OK)
{
while (sqlite3_step (stmt) == SQLITE_ROW)
{
if ( (sqlite3_column_type (stmt, 0) != SQLITE_NULL) &&
(sqlite3_column_type (stmt, 1) != SQLITE_NULL) &&
(sqlite3_column_type (stmt, 2) != SQLITE_NULL) &&
(sqlite3_column_type (stmt, 3) != SQLITE_NULL) &&
(sqlite3_column_type (stmt, 4) != SQLITE_NULL) &&
(sqlite3_column_type (stmt, 5) != SQLITE_NULL) &&
(sqlite3_column_type (stmt, 6) != SQLITE_NULL) &&
(sqlite3_column_type (stmt, 7) != SQLITE_NULL) &&
(sqlite3_column_type (stmt, 8) != SQLITE_NULL) &&
(sqlite3_column_type (stmt, 9) != SQLITE_NULL) &&
(sqlite3_column_type (stmt, 10) != SQLITE_NULL) &&
(sqlite3_column_type (stmt, 11) != SQLITE_NULL) &&
(sqlite3_column_type (stmt, 12) != SQLITE_NULL) &&
(sqlite3_column_type (stmt, 13) != SQLITE_NULL) &&
(sqlite3_column_type (stmt, 14) != SQLITE_NULL) )
{
has_geometry_columns_statistics=sqlite3_column_type (stmt, 0);
has_geometry_columns_field_infos=sqlite3_column_type (stmt, 1);
has_geometry_columns_auth=sqlite3_column_type (stmt, 2);
has_geometry_columns_times=sqlite3_column_type (stmt, 3);
has_geometry_columns_views=sqlite3_column_type (stmt, 4);
has_views_geometry_columns=sqlite3_column_type (stmt, 5);
has_views_geometry_columns_statistics=sqlite3_column_type (stmt, 6);
has_views_geometry_columns_field_infos=sqlite3_column_type (stmt, 7);
has_views_geometry_columns_auth=sqlite3_column_type (stmt, 8);
has_virts_geometry_columns=sqlite3_column_type (stmt, 9);
has_virts_geometry_columns_statistics=sqlite3_column_type (stmt, 10);
has_virts_geometry_columns_field_infos=sqlite3_column_type (stmt, 11);
has_virts_geometry_columns_auth=sqlite3_column_type (stmt, 12);
has_data_licenses=sqlite3_column_type (stmt, 13);
has_sql_statements_log=sqlite3_column_type (stmt, 14);
}
}
sqlite3_finalize (stmt);
if ( (has_geometry_columns_statistics) && (has_geometry_columns_field_infos) &&
(has_geometry_columns_auth) && (has_geometry_columns_times) &&
(has_geometry_columns_views) &&
(has_views_geometry_columns) && (has_views_geometry_columns_statistics) &&
(has_views_geometry_columns_field_infos) && (has_views_geometry_columns_auth) &&
(has_virts_geometry_columns) && (has_virts_geometry_columns_statistics) &&
(has_virts_geometry_columns_field_infos) && (has_virts_geometry_columns_auth) &&
(has_data_licenses) && (has_sql_statements_log) )
{
return 1;
}
}
if ((!has_geometry_columns_statistics) && (!create_geometry_columns_statistics (sqlite)))
return 0;
if ((!has_geometry_columns_field_infos) && (!create_geometry_columns_field_infos (sqlite)))
return 0;
if ((!has_geometry_columns_auth) && (!create_geometry_columns_auth (sqlite)))
return 0;
if ((!has_geometry_columns_times) && (!create_geometry_columns_times (sqlite)))
return 0;
if ((!has_geometry_columns_views) && (!create_geometry_columns_views (sqlite)))
return 0;
if ((!has_views_geometry_columns) && (!create_views_geometry_columns (sqlite)))
return 0;
if ((!has_views_geometry_columns_statistics) && (!create_views_geometry_columns_statistics (sqlite)))
return 0;
if ((!has_views_geometry_columns_field_infos) && (!create_views_geometry_columns_field_infos (sqlite)))
return 0;
if ((!has_views_geometry_columns_auth) && (!create_views_geometry_columns_auth (sqlite)))
return 0;
if ((!has_virts_geometry_columns) && (!create_virts_geometry_columns (sqlite)))
return 0;
if ((!has_virts_geometry_columns_statistics) && (!create_virts_geometry_columns_statistics (sqlite)))
return 0;
if ((!has_virts_geometry_columns_field_infos) && (!create_virts_geometry_columns_field_infos (sqlite)))
return 0;
if ((!has_virts_geometry_columns_auth) && (!create_virts_geometry_columns_auth (sqlite)))
return 0;
if ((!has_data_licenses) && (!create_data_licenses (sqlite)))
return 0;
if ((!has_sql_statements_log) && (!create_sql_statements_log (sqlite)))
return 0;
return 1;
}
sandro added on 2020-08-26 07:18:17: too old to be still considered | ||||