Skip to content

Commit 46d5c48

Browse files
committed
Remove and rename gpkg-stored projects
1 parent 60942cd commit 46d5c48

File tree

2 files changed

+95
-74
lines changed

2 files changed

+95
-74
lines changed

src/providers/ogr/qgsgeopackageprojectstorage.cpp

+92-74
Original file line numberDiff line numberDiff line change
@@ -196,89 +196,56 @@ bool QgsGeoPackageProjectStorage::readProject( const QString &uri, QIODevice *de
196196
bool QgsGeoPackageProjectStorage::writeProject( const QString &uri, QIODevice *device, QgsReadWriteContext &context )
197197
{
198198
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-
}
204199

205-
sqlite3_database_unique_ptr database;
206-
sqlite3_statement_unique_ptr statement;
200+
QString errCause;
207201

208-
int status = database.open_v2( projectUri.database, SQLITE_OPEN_READWRITE, nullptr );
209-
if ( status != SQLITE_OK )
202+
if ( !_projectsTableExists( projectUri.database ) )
210203
{
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)" ) );
243205

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() )
270207
{
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 );
274211

275212
context.pushMessage( errCause, Qgis::Critical );
276-
sqlite3_free( errmsg );
277213
return false;
278214
}
279-
return true;
215+
}
216+
217+
// read from device and write to the table
218+
QByteArray content = device->readAll();
280219

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)" );
281232
}
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;
282249
}
283250

284251
QString QgsGeoPackageProjectStorage::encodeUri( const QgsGeoPackageProjectUri &gpkgUri )
@@ -306,14 +273,65 @@ QgsGeoPackageProjectUri QgsGeoPackageProjectStorage::decodeUri( const QString &u
306273
return gpkgUri;
307274
}
308275

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+
309310
bool QgsGeoPackageProjectStorage::removeProject( const QString &uri )
310311
{
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();
312320
}
313321

314322
bool QgsGeoPackageProjectStorage::renameProject( const QString &uri, const QString &uriNew )
315323
{
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();
317335
}
318336

319337
bool QgsGeoPackageProjectStorage::readProjectStorageMetadata( const QString &uri, QgsProjectStorage::Metadata &metadata )

src/providers/ogr/qgsgeopackageprojectstorage.h

+3
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,9 @@ class QgsGeoPackageProjectStorage : public QgsProjectStorage
5050
#endif
5151
static QString encodeUri( const QgsGeoPackageProjectUri &postUri );
5252
static QgsGeoPackageProjectUri decodeUri( const QString &uri );
53+
54+
private:
55+
QString _executeSql( const QString &uri, const QString &sql );
5356
};
5457

5558
#endif // QGSGEOPACKAGEPROJECTSTORAGE_H

0 commit comments

Comments
 (0)