39  if ( useMemoryDatabase )
 
   41    createDatabase( QStringLiteral( 
":memory:" ), error );
 
   45    if ( !QFile::exists( historyFilename ) )
 
   47      createDatabase( historyFilename, error );
 
   51      openDatabase( historyFilename, error );
 
 
   58  qDeleteAll( mProviders );
 
 
   69  if ( mProviders.contains( provider->
id() ) )
 
   72  mProviders.insert( provider->
id(), provider );
 
 
   78  return mProviders.value( 
id );
 
 
   83  if ( !mProviders.contains( 
id ) )
 
   86  delete mProviders.take( 
id );
 
 
   92  return mProviders.keys();
 
 
  109    const QString entryXml = xmlDoc.toString();
 
  110    const QString dateTime = 
entry.
timestamp.toString( QStringLiteral( 
"yyyy-MM-dd HH:mm:ss" ) );
 
  112    QString query = 
qgs_sqlite3_mprintf( 
"INSERT INTO history VALUES (NULL, '%q', '%q', '%q');",
 
  113                                         entry.
providerId.toUtf8().constData(), entryXml.toUtf8().constData(), dateTime.toUtf8().constData() );
 
  114    if ( !runEmptyQuery( query ) )
 
  116      QgsDebugError( QStringLiteral( 
"Couldn't story history entry in database!" ) );
 
  120    id = 
static_cast< int >( sqlite3_last_insert_rowid( mLocalDB.get() ) );
 
 
  136    runEmptyQuery( QStringLiteral( 
"BEGIN TRANSACTION;" ) );
 
  139    runEmptyQuery( QStringLiteral( 
"COMMIT TRANSACTION;" ) );
 
 
  154        QgsDebugError( QStringLiteral( 
"Cannot open database to query history entries" ) );
 
  158      QString sql = QStringLiteral( 
"SELECT provider_id, xml, timestamp FROM history WHERE id=%1" ).arg( 
id );
 
  163      if ( nErr == SQLITE_OK && sqlite3_step( statement.get() ) == SQLITE_ROW )
 
  168          QgsDebugError( QStringLiteral( 
"Cannot read history entry" ) );
 
  175                                QDateTime::fromString( statement.
columnAsText( 2 ), QStringLiteral( 
"yyyy-MM-dd HH:mm:ss" ) ),
 
  182      QgsDebugError( QStringLiteral( 
"Cannot find history item with matching ID" ) );
 
 
  198      const QString entryXml = xmlDoc.toString();
 
  201                                           entryXml.toUtf8().constData(), 
id );
 
  202      if ( !runEmptyQuery( query ) )
 
  204        QgsDebugError( QStringLiteral( 
"Couldn't update history entry in database!" ) );
 
 
  217  QList<QgsHistoryEntry> entries;
 
  222      QgsDebugError( QStringLiteral( 
"Cannot open database to query history entries" ) );
 
  226    QString sql = QStringLiteral( 
"SELECT id, provider_id, xml, timestamp FROM history" );
 
  227    QStringList whereClauses;
 
  228    if ( !providerId.isEmpty() )
 
  230      whereClauses.append( QStringLiteral( 
"provider_id='%1'" ).arg( providerId ) );
 
  232    if ( start.isValid() )
 
  234      whereClauses.append( QStringLiteral( 
"timestamp>='%1'" ).arg( start.toString( QStringLiteral( 
"yyyy-MM-dd HH:mm:ss" ) ) ) );
 
  238      whereClauses.append( QStringLiteral( 
"timestamp<='%1'" ).arg( end.toString( QStringLiteral( 
"yyyy-MM-dd HH:mm:ss" ) ) ) );
 
  241    if ( !whereClauses.empty() )
 
  242      sql += QStringLiteral( 
" WHERE (" ) + whereClauses.join( QLatin1String( 
") AND (" ) ) + 
')';
 
  247    while ( nErr == SQLITE_OK && sqlite3_step( statement.get() ) == SQLITE_ROW )
 
  252        QgsDebugError( QStringLiteral( 
"Cannot read history entry" ) );
 
  258        QDateTime::fromString( statement.
columnAsText( 3 ), QStringLiteral( 
"yyyy-MM-dd HH:mm:ss" ) ),
 
  263      entries.append( 
entry );
 
 
  281      if ( providerId.isEmpty() )
 
  282        runEmptyQuery( QStringLiteral( 
"DELETE from history;" ) );
 
  284        runEmptyQuery( QStringLiteral( 
"DELETE from history WHERE provider_id='%1'" )
 
  285                       .arg( providerId ) );
 
 
  293bool QgsHistoryProviderRegistry::createDatabase( 
const QString &filename, QString &error )
 
  296  if ( !openDatabase( filename, error ) )
 
  307bool QgsHistoryProviderRegistry::openDatabase( 
const QString &filename, QString &error )
 
  309  int rc = mLocalDB.
open( filename );
 
  312    error = tr( 
"Couldn't open the history database: %1" ).arg( mLocalDB.
errorMessage() );
 
  319void QgsHistoryProviderRegistry::createTables()
 
  322                                       "id INTEGER PRIMARY KEY,"\
 
  325                                       "timestamp DATETIME);" \
 
  326                                       "CREATE INDEX provider_index ON history(provider_id);"\
 
  327                                       "CREATE INDEX timestamp_index ON history(timestamp);" 
  330  runEmptyQuery( query );
 
  333bool QgsHistoryProviderRegistry::runEmptyQuery( 
const QString &query )
 
  338  char *zErr = 
nullptr;
 
  339  int nErr = sqlite3_exec( mLocalDB.get(), query.toUtf8().constData(), 
nullptr, 
nullptr, &zErr );
 
  341  if ( nErr != SQLITE_OK )
 
  344    sqlite3_free( zErr );
 
  347  return nErr == SQLITE_OK;
 
HistoryProviderBackend
History provider backends.
 
@ LocalProfile
Local profile.
 
Abstract base class for objects which track user history (i.e.
 
virtual QString id() const =0
Returns the provider's unique id, which is used to associate existing history entries with the provid...
 
static QString qgisSettingsDirPath()
Returns the path to the settings directory in user's home dir.
 
History provider for operations database queries.
 
Encapsulates a history entry.
 
QDateTime timestamp
Entry timestamp.
 
QString providerId
Associated history provider ID.
 
QVariantMap entry
Entry details.
 
Contains options for storing history entries.
 
Qgis::HistoryProviderBackends storageBackends
Target storage backends.
 
~QgsHistoryProviderRegistry() override
 
QgsAbstractHistoryProvider * providerById(const QString &id)
Returns the provider with matching id, or nullptr if no matching provider is registered.
 
bool updateEntry(long long id, const QVariantMap &entry, Qgis::HistoryProviderBackend backend=Qgis::HistoryProviderBackend::LocalProfile)
Updates the existing entry with matching id.
 
static QString userHistoryDbPath()
Returns the path to user's local history database.
 
bool clearHistory(Qgis::HistoryProviderBackend backend, const QString &providerId=QString())
Clears the history for the specified backend.
 
void entryAdded(long long id, const QgsHistoryEntry &entry, Qgis::HistoryProviderBackend backend)
Emitted when an entry is added.
 
bool addProvider(QgsAbstractHistoryProvider *provider)
Adds a provider to the registry.
 
bool addEntries(const QList< QgsHistoryEntry > &entries, QgsHistoryProviderRegistry::HistoryEntryOptions options=QgsHistoryProviderRegistry::HistoryEntryOptions())
Adds a list of entries to the history logs.
 
QgsHistoryProviderRegistry(QObject *parent=nullptr, bool useMemoryDatabase=false)
Creates a new empty history provider registry.
 
bool removeProvider(const QString &id)
Removes the provider with matching id.
 
long long addEntry(const QString &providerId, const QVariantMap &entry, bool &ok, QgsHistoryProviderRegistry::HistoryEntryOptions options=QgsHistoryProviderRegistry::HistoryEntryOptions())
Adds an entry to the history logs.
 
QgsHistoryEntry entry(long long id, bool &ok, Qgis::HistoryProviderBackend backend=Qgis::HistoryProviderBackend::LocalProfile) const
Returns the entry with matching ID, from the specified backend.
 
QList< QgsHistoryEntry > queryEntries(const QDateTime &start=QDateTime(), const QDateTime &end=QDateTime(), const QString &providerId=QString(), Qgis::HistoryProviderBackends backends=Qgis::HistoryProviderBackend::LocalProfile) const
Queries history entries which occurred between the specified start and end times.
 
void entryUpdated(long long id, const QVariantMap &entry, Qgis::HistoryProviderBackend backend)
Emitted when an entry is updated.
 
void addDefaultProviders()
Adds the default history providers to the registry.
 
QStringList providerIds() const
Returns a list of the registered provider IDs.
 
void historyCleared(Qgis::HistoryProviderBackend backend, const QString &providerId)
Emitted when the history is cleared for a backend.
 
History provider for operations performed through the Processing framework.
 
static QVariantMap removePointerValuesFromMap(const QVariantMap &map)
Removes any raw pointer values from an input map, replacing them with appropriate string values where...
 
Scoped object for logging of the runtime for a single operation or group of operations.
 
static QDomElement writeVariant(const QVariant &value, QDomDocument &doc)
Write a QVariant to a QDomElement.
 
static QVariant readVariant(const QDomElement &element)
Read a QVariant from a QDomElement.
 
sqlite3_statement_unique_ptr prepare(const QString &sql, int &resultCode) const
Prepares a sql statement, returning the result.
 
int open(const QString &path)
Opens the database at the specified file path.
 
QString errorMessage() const
Returns the most recent error message encountered by the database.
 
Unique pointer for sqlite3 prepared statements, which automatically finalizes the statement when the ...
 
QString columnAsText(int column) const
Returns the column value from the current statement row as a string.
 
qlonglong columnAsInt64(int column) const
Gets column value from the current statement row as a long long integer (64 bits).
 
#define BUILTIN_UNREACHABLE
 
#define QgsDebugError(str)
 
QString qgs_sqlite3_mprintf(const char *format,...)
Wraps sqlite3_mprintf() by automatically freeing the memory.