@@ -196,89 +196,56 @@ bool QgsGeoPackageProjectStorage::readProject( const QString &uri, QIODevice *de
196
196
bool QgsGeoPackageProjectStorage::writeProject ( const QString &uri, QIODevice *device, QgsReadWriteContext &context )
197
197
{
198
198
QgsGeoPackageProjectUri projectUri = decodeUri ( uri );
199
- if ( !projectUri.valid )
200
- {
201
- context.pushMessage ( QObject::tr ( " Invalid URI for GeoPackage OGR provider: " ) + uri, Qgis::Critical );
202
- return false ;
203
- }
204
199
205
- sqlite3_database_unique_ptr database;
206
- sqlite3_statement_unique_ptr statement;
200
+ QString errCause;
207
201
208
- int status = database.open_v2 ( projectUri.database , SQLITE_OPEN_READWRITE, nullptr );
209
- if ( status != SQLITE_OK )
202
+ if ( !_projectsTableExists ( projectUri.database ) )
210
203
{
211
- context.pushMessage ( QObject::tr ( " Could not connect to the database: " ) + projectUri.database , Qgis::Critical );
212
- return false ;
213
- }
214
- else
215
- {
216
- if ( !_projectsTableExists ( projectUri.database ) )
217
- {
218
- char *errmsg = nullptr ;
219
- // try to create projects table
220
- ( void )sqlite3_exec (
221
- database.get (), /* An open database */
222
- " CREATE TABLE qgis_projects(name TEXT PRIMARY KEY, metadata BLOB, content BLOB)" , /* SQL to be evaluated */
223
- nullptr , /* Callback function */
224
- nullptr , /* 1st argument to callback */
225
- &errmsg /* Error msg written here */
226
- );
227
- if ( status != SQLITE_OK || errmsg )
228
- {
229
- const QString errCause = QObject::tr ( " Unable to save project. It's not possible to create the destination table on the database. <b>%1</b>: %2" )
230
- .arg ( projectUri.database ,
231
- QString::fromUtf8 ( errmsg ) );
232
-
233
- context.pushMessage ( errCause, Qgis::Critical );
234
- sqlite3_free ( errmsg );
235
- return false ;
236
- }
237
-
238
- }
239
-
240
-
241
- // read from device and write to the table
242
- QByteArray content = device->readAll ();
204
+ errCause = _executeSql ( uri, QStringLiteral ( " CREATE TABLE qgis_projects(name TEXT PRIMARY KEY, metadata BLOB, content BLOB)" ) );
243
205
244
- QString metadataExpr = QStringLiteral ( " {\" last_modified_time\" : \" %1\" , \" last_modified_user\" : \" %2\" }" ).arg (
245
- " 2019-01-01" ,
246
- " username"
247
- );
248
- QString sql;
249
- if ( listProjects ( uri ).contains ( projectUri.projectName ) )
250
- {
251
- sql = QStringLiteral ( " UPDATE qgis_projects SET metadata = %2, content = %3 WHERE name = %1" );
252
- }
253
- else
254
- {
255
- sql = QStringLiteral ( " INSERT INTO qgis_projects VALUES (%1, %2, %3)" );
256
- }
257
- sql = sql.arg ( QgsSqliteUtils::quotedIdentifier ( projectUri.projectName ),
258
- QgsSqliteUtils::quotedValue ( metadataExpr ),
259
- QgsSqliteUtils::quotedValue ( QString::fromAscii ( content.toHex () ) )
260
- );
261
- char *errmsg = nullptr ;
262
- ( void )sqlite3_exec (
263
- database.get (), /* An open database */
264
- sql.toLocal8Bit (), /* SQL to be evaluated */
265
- nullptr , /* Callback function */
266
- nullptr , /* 1st argument to callback */
267
- &errmsg /* Error msg written here */
268
- );
269
- if ( status != SQLITE_OK || errmsg )
206
+ if ( ! errCause.isEmpty () )
270
207
{
271
- const QString errCause = QObject::tr ( " Unable to insert or update project (project=%1) in the destination table on the database: %2" )
272
- .arg ( projectUri.database ,
273
- QString::fromUtf8 ( errmsg ) );
208
+ errCause = QObject::tr ( " Unable to save project. It's not possible to create the destination table on the database. <b>%1</b> : %2" )
209
+ .arg ( projectUri.database ,
210
+ errCause );
274
211
275
212
context.pushMessage ( errCause, Qgis::Critical );
276
- sqlite3_free ( errmsg );
277
213
return false ;
278
214
}
279
- return true ;
215
+ }
216
+
217
+ // read from device and write to the table
218
+ QByteArray content = device->readAll ();
280
219
220
+ QString metadataExpr = QStringLiteral ( " {\" last_modified_time\" : \" %1\" , \" last_modified_user\" : \" %2\" }" ).arg (
221
+ " 2019-01-01" ,
222
+ " username"
223
+ );
224
+ QString sql;
225
+ if ( listProjects ( uri ).contains ( projectUri.projectName ) )
226
+ {
227
+ sql = QStringLiteral ( " UPDATE qgis_projects SET metadata = %2, content = %3 WHERE name = %1" );
228
+ }
229
+ else
230
+ {
231
+ sql = QStringLiteral ( " INSERT INTO qgis_projects VALUES (%1, %2, %3)" );
281
232
}
233
+ sql = sql.arg ( QgsSqliteUtils::quotedIdentifier ( projectUri.projectName ),
234
+ QgsSqliteUtils::quotedValue ( metadataExpr ),
235
+ QgsSqliteUtils::quotedValue ( QString::fromAscii ( content.toHex () ) )
236
+ );
237
+
238
+ errCause = _executeSql ( projectUri.database , sql );
239
+ if ( !errCause.isEmpty () )
240
+ {
241
+ const QString errCause = QObject::tr ( " Unable to insert or update project (project=%1) in the destination table on the database: %2" )
242
+ .arg ( uri,
243
+ errCause );
244
+
245
+ context.pushMessage ( errCause, Qgis::Critical );
246
+ return false ;
247
+ }
248
+ return true ;
282
249
}
283
250
284
251
QString QgsGeoPackageProjectStorage::encodeUri ( const QgsGeoPackageProjectUri &gpkgUri )
@@ -306,14 +273,65 @@ QgsGeoPackageProjectUri QgsGeoPackageProjectStorage::decodeUri( const QString &u
306
273
return gpkgUri;
307
274
}
308
275
276
+ QString QgsGeoPackageProjectStorage::_executeSql ( const QString &uri, const QString &sql )
277
+ {
278
+
279
+ QgsGeoPackageProjectUri projectUri = decodeUri ( uri );
280
+ if ( !projectUri.valid )
281
+ {
282
+ return QObject::tr ( " Invalid URI for GeoPackage OGR provider: %1" ).arg ( uri );
283
+ }
284
+
285
+ sqlite3_database_unique_ptr db;
286
+ sqlite3_statement_unique_ptr statement;
287
+
288
+ int status = db.open_v2 ( projectUri.database , SQLITE_OPEN_READWRITE, nullptr );
289
+ if ( status != SQLITE_OK )
290
+ {
291
+ return QObject::tr ( " Could not connect to the database: %1" ).arg ( projectUri.database );
292
+ }
293
+
294
+ QString errCause;
295
+ char *errmsg = nullptr ;
296
+ ( void )sqlite3_exec (
297
+ db.get (), /* An open database */
298
+ sql.toLocal8Bit (), /* SQL to be evaluated */
299
+ nullptr , /* Callback function */
300
+ nullptr , /* 1st argument to callback */
301
+ &errmsg /* Error msg written here */
302
+ );
303
+ if ( status != SQLITE_OK || errmsg )
304
+ {
305
+ errCause = QString::fromUtf8 ( errmsg );
306
+ }
307
+ return errCause;
308
+ }
309
+
309
310
bool QgsGeoPackageProjectStorage::removeProject ( const QString &uri )
310
311
{
311
- return true ;
312
+ QgsGeoPackageProjectUri projectUri = decodeUri ( uri );
313
+ QString errCause = _executeSql ( uri, QStringLiteral ( " DELETE FROM qgis_projects WHERE name = %1" ).arg ( QgsSqliteUtils::quotedValue ( projectUri.projectName ) ) );
314
+ if ( ! errCause.isEmpty () )
315
+ {
316
+ errCause = QObject::tr ( " Could not remove project %1: %2" ).arg ( uri, errCause );
317
+ QgsMessageLog::logMessage ( errCause, QStringLiteral ( " OGR" ), Qgis::MessageLevel::Warning );
318
+ }
319
+ return errCause.isEmpty ();
312
320
}
313
321
314
322
bool QgsGeoPackageProjectStorage::renameProject ( const QString &uri, const QString &uriNew )
315
323
{
316
- return true ;
324
+ QgsGeoPackageProjectUri projectNewUri = decodeUri ( uriNew );
325
+ QgsGeoPackageProjectUri projectUri = decodeUri ( uri );
326
+ QString errCause = _executeSql ( uri, QStringLiteral ( " UPDATE qgis_projects SET name = %1 WHERE name = %1" )
327
+ .arg ( QgsSqliteUtils::quotedValue ( projectUri.projectName ) )
328
+ .arg ( QgsSqliteUtils::quotedValue ( projectNewUri.projectName ) ) );
329
+ if ( ! errCause.isEmpty () )
330
+ {
331
+ errCause = QObject::tr ( " Could not rename project %1: %2" ).arg ( uri, errCause );
332
+ QgsMessageLog::logMessage ( errCause, QStringLiteral ( " OGR" ), Qgis::MessageLevel::Warning );
333
+ }
334
+ return errCause.isEmpty ();
317
335
}
318
336
319
337
bool QgsGeoPackageProjectStorage::readProjectStorageMetadata ( const QString &uri, QgsProjectStorage::Metadata &metadata )
0 commit comments