Branch data Line data Source code
1 : : /*************************************************************************** 2 : : qgssqliteutils.h 3 : : ------------------- 4 : : begin : Nov, 2017 5 : : copyright : (C) 2017 by Nyall Dawson 6 : : email : nyall dot dawson at gmail dot com 7 : : ***************************************************************************/ 8 : : 9 : : /*************************************************************************** 10 : : * * 11 : : * This program is free software; you can redistribute it and/or modify * 12 : : * it under the terms of the GNU General Public License as published by * 13 : : * the Free Software Foundation; either version 2 of the License, or * 14 : : * (at your option) any later version. * 15 : : * * 16 : : ***************************************************************************/ 17 : : 18 : : #ifndef QGSSQLITEUTILS_H 19 : : #define QGSSQLITEUTILS_H 20 : : 21 : : #include "qgis_core.h" 22 : : #include "qgis_sip.h" 23 : : 24 : : #include <memory> 25 : : #include <QString> 26 : : 27 : : struct sqlite3; 28 : : struct sqlite3_stmt; 29 : : class QVariant; 30 : : 31 : : #ifndef SIP_RUN 32 : : 33 : : /** 34 : : * \ingroup core 35 : : * 36 : : * \brief Closes a sqlite3 database. 37 : : * 38 : : * \since QGIS 3.0 39 : : */ 40 : : struct CORE_EXPORT QgsSqlite3Closer 41 : : { 42 : : 43 : : /** 44 : : * Closes an sqlite \a database. 45 : : */ 46 : : void operator()( sqlite3 *database ); 47 : : }; 48 : : 49 : : /** 50 : : * Finalizes an sqlite3 statement. 51 : : */ 52 : : struct CORE_EXPORT QgsSqlite3StatementFinalizer 53 : : { 54 : : 55 : : /** 56 : : * Finalizes an sqlite3 \a statement. 57 : : */ 58 : : void operator()( sqlite3_stmt *statement ); 59 : : }; 60 : : 61 : : /** 62 : : * \ingroup core 63 : : * 64 : : * \brief Unique pointer for sqlite3 prepared statements, which automatically finalizes 65 : : * the statement when the pointer goes out of scope or is reset. 66 : : * 67 : : * \since QGIS 3.0 68 : : */ 69 : 520 : class CORE_EXPORT sqlite3_statement_unique_ptr : public std::unique_ptr< sqlite3_stmt, QgsSqlite3StatementFinalizer> 70 : : { 71 : : public: 72 : : 73 : : /** 74 : : * Steps to the next record in the statement, returning the sqlite3 result code. 75 : : */ 76 : : int step(); 77 : : 78 : : /** 79 : : * Returns the name of \a column. 80 : : */ 81 : : QString columnName( int column ) const; 82 : : 83 : : /** 84 : : * Returns the column value from the current statement row as a string. 85 : : */ 86 : : QString columnAsText( int column ) const; 87 : : 88 : : /** 89 : : * Returns the column value from the current statement row as raw byte array. 90 : : */ 91 : : QByteArray columnAsBlob( int column ) const; 92 : : 93 : : /** 94 : : * Gets column value from the current statement row as a long long integer (64 bits). 95 : : */ 96 : : qlonglong columnAsInt64( int column ) const; 97 : : 98 : : /** 99 : : * Gets column value from the current statement row as a double. 100 : : */ 101 : : double columnAsDouble( int column ) const; 102 : : 103 : : /** 104 : : * Gets the number of columns that this statement returns. 105 : : */ 106 : : int columnCount() const; 107 : : }; 108 : : 109 : : 110 : : /** 111 : : * \ingroup core 112 : : * 113 : : * \brief Unique pointer for sqlite3 databases, which automatically closes 114 : : * the database when the pointer goes out of scope or is reset. 115 : : * 116 : : * \since QGIS 3.0 117 : : */ 118 : 322 : class CORE_EXPORT sqlite3_database_unique_ptr : public std::unique_ptr< sqlite3, QgsSqlite3Closer> 119 : : { 120 : : public: 121 : : 122 : : /** 123 : : * Opens the database at the specified file \a path. 124 : : * 125 : : * Returns the sqlite error code, or SQLITE_OK if open was successful. 126 : : */ 127 : : int open( const QString &path ); 128 : : 129 : : /** 130 : : * Opens the database at the specified file \a path. 131 : : * 132 : : * Returns the sqlite error code, or SQLITE_OK if open was successful. 133 : : */ 134 : : int open_v2( const QString &path, int flags, const char *zVfs ); 135 : : 136 : : /** 137 : : * Returns the most recent error message encountered by the database. 138 : : */ 139 : : QString errorMessage() const; 140 : : 141 : : /** 142 : : * Prepares a \a sql statement, returning the result. The \a resultCode 143 : : * argument will be filled with the sqlite3 result code. 144 : : */ 145 : : sqlite3_statement_unique_ptr prepare( const QString &sql, int &resultCode SIP_OUT ) const; 146 : : 147 : : /** 148 : : * Executes the \a sql command in the database. Multiple sql queries can be run within 149 : : * one single command. 150 : : * Errors are reported to \a errorMessage. 151 : : * Returns SQLITE_OK in case of success or an sqlite error code. 152 : : * 153 : : * \since QGIS 3.6 154 : : */ 155 : : int exec( const QString &sql, QString &errorMessage SIP_OUT ) const; 156 : : 157 : : }; 158 : : 159 : : /** 160 : : * Wraps sqlite3_mprintf() by automatically freeing the memory. 161 : : * \note not available in Python bindings. 162 : : * \since QGIS 3.2 163 : : */ 164 : : QString CORE_EXPORT qgs_sqlite3_mprintf( const char *format, ... ); 165 : : 166 : : #endif 167 : : 168 : : /** 169 : : * Contains utilities for working with Sqlite data sources. 170 : : * \ingroup core 171 : : * \since QGIS 3.4 172 : : */ 173 : : class CORE_EXPORT QgsSqliteUtils 174 : : { 175 : : public: 176 : : 177 : : /** 178 : : * Returns a quoted string \a value, surround by ' characters and with special 179 : : * characters correctly escaped. 180 : : */ 181 : : static QString quotedString( const QString &value ); 182 : : 183 : : /** 184 : : * Returns a properly quoted version of \a identifier. 185 : : * 186 : : * \since QGIS 3.6 187 : : */ 188 : : static QString quotedIdentifier( const QString &identifier ); 189 : : 190 : : /** 191 : : * Returns a properly quoted and escaped version of \a value 192 : : * for use in SQL strings. 193 : : * 194 : : * \since QGIS 3.6 195 : : */ 196 : : static QString quotedValue( const QVariant &value ); 197 : : 198 : : /** 199 : : * Returns a string list of SQLite (and spatialite) system tables 200 : : * 201 : : * \since QGIS 3.8 202 : : */ 203 : : static QStringList systemTables(); 204 : : 205 : : /** 206 : : * Returns a list of field names for \a connection and \a tableName having a UNIQUE constraint, 207 : : * fields that are part of a UNIQUE constraint that spans over multiple fields 208 : : * are not returned. 209 : : * \note the implementation is the same of GDAL but the test coverage is much 210 : : * better in GDAL. 211 : : * \note not available in Python bindings 212 : : * \since QGIS 3.14 213 : : */ 214 : : static QSet<QString> uniqueFields( sqlite3 *connection, const QString &tableName, QString &errorMessage ) SIP_SKIP; 215 : : 216 : : /** 217 : : * Increments and returns an SQLITE sequence of the table "sqlite_sequence" 218 : : * for \a tableName and returns it value, \a errorMessage is filled with the 219 : : * error message in case of errors. 220 : : * 221 : : * \returns the next sequence value or -1 case of errors 222 : : * \note not available in Python bindings 223 : : * \since QGIS 3.14 224 : : */ 225 : : static long long nextSequenceValue( sqlite3 *connection, const QString &tableName, QString errorMessage ) SIP_SKIP; 226 : : 227 : : }; 228 : : 229 : : #endif // QGSSQLITEUTILS_H