X-Git-Url: https://gitweb.stoutner.com/?p=PrivacyBrowserPC.git;a=blobdiff_plain;f=src%2Fhelpers%2FDomainsDatabaseHelper.cpp;h=2d63bd9c785c956abcc688e18b6ddbc27878fa2f;hp=8d127cf5f01720ae03f15ee88406ac1f0729cafb;hb=2facce32fb6d97b52a7dc148044cae4b36a65d4c;hpb=0a7bcc3ab2d2a1015f29293fc9c527c1448a86cf diff --git a/src/helpers/DomainsDatabaseHelper.cpp b/src/helpers/DomainsDatabaseHelper.cpp index 8d127cf..2d63bd9 100644 --- a/src/helpers/DomainsDatabaseHelper.cpp +++ b/src/helpers/DomainsDatabaseHelper.cpp @@ -19,15 +19,25 @@ // Application headers. #include "DomainsDatabaseHelper.h" +#include "UserAgentHelper.h" -// Qt framework headers. -#include - -// Define the static constants. +// Define the public static domain constants. const QString DomainsDatabaseHelper::CONNECTION_NAME = "domains_database"; const QString DomainsDatabaseHelper::DOMAINS_TABLE = "domains"; -// The default constructor. +// Define the private static schema constants. +const int DomainsDatabaseHelper::SCHEMA_VERSION = 4; + +// Define the public static database field names. +const QString DomainsDatabaseHelper::_ID = "_id"; +const QString DomainsDatabaseHelper::DOMAIN_NAME = "domain_name"; +const QString DomainsDatabaseHelper::JAVASCRIPT = "javascript"; +const QString DomainsDatabaseHelper::DOM_STORAGE = "dom_storage"; +const QString DomainsDatabaseHelper::USER_AGENT = "user_agent"; +const QString DomainsDatabaseHelper::ZOOM_FACTOR = "zoom_factor"; +const QString DomainsDatabaseHelper::CUSTOM_ZOOM_FACTOR = "custom_zoom_factor"; + +// Construct the class. DomainsDatabaseHelper::DomainsDatabaseHelper() {} void DomainsDatabaseHelper::addDatabase() @@ -44,7 +54,61 @@ void DomainsDatabaseHelper::addDatabase() // Check to see if the domains table already exists. if (domainsDatabase.tables().contains(DOMAINS_TABLE)) { - // Run schema update code. + // Query the database schema version. + QSqlQuery getSchemaVersionQuery = domainsDatabase.exec("PRAGMA user_version"); + + // Move to the first record. + getSchemaVersionQuery.first(); + + // Get the current schema version. + int currentSchemaVersion = getSchemaVersionQuery.value(0).toInt(); + + // Check to see if the schama has been updated. + if (SCHEMA_VERSION > currentSchemaVersion) + { + // Run schema update code. + switch (currentSchemaVersion) + { + // Upgrade from schema version 0 to schema version 1. + case 0: + { + // Add the JavaScript column. + domainsDatabase.exec("ALTER TABLE " + DOMAINS_TABLE + " ADD COLUMN " + JAVASCRIPT + " INTEGER DEFAULT 0"); + + // Fallthrough to the next case. + [[fallthrough]]; + } + + // Upgrade from schema version 1 to schema version 2. + case 1: + { + // Add the User Agent column. + domainsDatabase.exec("ALTER TABLE " + DOMAINS_TABLE + " ADD COLUMN " + USER_AGENT + " TEXT DEFAULT '" + UserAgentHelper::SYSTEM_DEFAULT_DATABASE + "'"); + + // Fallthrough to the next case. + [[fallthrough]]; + } + + // Upgrade from schema version 2 to schema version 3. + case 2: + { + // Add the Zoom Factor columns. + domainsDatabase.exec("ALTER TABLE " + DOMAINS_TABLE + " ADD COLUMN " + ZOOM_FACTOR + " INTEGER DEFAULT 0"); + domainsDatabase.exec("ALTER TABLE " + DOMAINS_TABLE + " ADD COLUMN " + CUSTOM_ZOOM_FACTOR + " REAL DEFAULT 1.0"); + + // Fallthrough to the next case. + [[fallthrough]]; + } + + // Upgrade from schema version 3 to schema version 4. + case 3: + // Add the DOM Storage column. + domainsDatabase.exec("ALTER TABLE " + DOMAINS_TABLE + " ADD COLUMN " + DOM_STORAGE + " INTEGER DEFAULT 0"); + } + + // Update the schema version. + domainsDatabase.exec("PRAGMA user_version = " + QString::number(SCHEMA_VERSION)); + } } else { @@ -52,9 +116,14 @@ void DomainsDatabaseHelper::addDatabase() QSqlQuery createTableQuery(domainsDatabase); // Prepare the create table query. - createTableQuery.prepare("CREATE TABLE " + DOMAINS_TABLE + "(" - "_id INTEGER PRIMARY KEY, " - "domain_name TEXT)" + createTableQuery.prepare("CREATE TABLE " + DOMAINS_TABLE + "(" + + _ID + " INTEGER PRIMARY KEY, " + + DOMAIN_NAME + " TEXT, " + + JAVASCRIPT + " INTEGER DEFAULT 0, " + + DOM_STORAGE + " INTEGER DEFAULT 0, " + + USER_AGENT + " TEXT DEFAULT '" + UserAgentHelper::SYSTEM_DEFAULT_DATABASE + "', " + + ZOOM_FACTOR + " INTEGER DEFAULT 0, " + + CUSTOM_ZOOM_FACTOR + " REAL DEFAULT 1.0)" ); // Execute the query. @@ -63,6 +132,9 @@ void DomainsDatabaseHelper::addDatabase() // Log any errors. qDebug().noquote().nospace() << "Error creating table: " << domainsDatabase.lastError(); } + + // Set the schema version. + domainsDatabase.exec("PRAGMA user_version = " + QString::number(SCHEMA_VERSION)); } } else // Opening the database failed. @@ -71,3 +143,73 @@ void DomainsDatabaseHelper::addDatabase() qDebug().noquote().nospace() << "Error opening database: " << domainsDatabase.lastError(); } }; + +QSqlQuery DomainsDatabaseHelper::getDomainQuery(const QString &hostname) +{ + // Get a handle for the domains database. + QSqlDatabase domainsDatabase = QSqlDatabase::database(CONNECTION_NAME); + + // Instantiate the all domain names query. + QSqlQuery allDomainNamesQuery(domainsDatabase); + + // Set the query to be forward only (increases performance while iterating over the query). + allDomainNamesQuery.setForwardOnly(true); + + // Prepare the query. + allDomainNamesQuery.prepare("SELECT " + _ID + "," + DOMAIN_NAME + " FROM " + DOMAINS_TABLE); + + // Execute the query. + allDomainNamesQuery.exec(); + + // Create a domains settings map. + QMap domainSettingsMap; + + // Populate the domain settings map. + while (allDomainNamesQuery.next()) + { + // Add the domain name and database ID to the map. + domainSettingsMap.insert(allDomainNamesQuery.record().field(DomainsDatabaseHelper::DOMAIN_NAME).value().toString(), + allDomainNamesQuery.record().field(DomainsDatabaseHelper::_ID).value().toInt()); + } + + // Initialize the database ID tracker. + int databaseId = -1; + + // Get the database ID if the hostname is found in the domain settings set. + if (domainSettingsMap.contains(hostname)) + { + databaseId = domainSettingsMap.value(hostname); + } + + // Create a subdomain string. + QString subdomain = hostname; + + // Check all the subdomains of the hostname. + while ((databaseId == -1) && subdomain.contains(".")) // Stop checking when a match is found or there are no more `.` in the hostname. + { + // Check to see if the domain settings map contains the subdomain with a `*.` prepended. + if (domainSettingsMap.contains("*." + subdomain)) + { + // Get the database ID. + databaseId = domainSettingsMap.value("*." + subdomain); + } + + // Strip out the first subdomain. + subdomain = subdomain.section('.', 1); + } + + // Instantiate the domain lookup query. + QSqlQuery domainLookupQuery(domainsDatabase); + + // Prepare the domain lookup query. + domainLookupQuery.prepare("SELECT * FROM " + DOMAINS_TABLE + " WHERE " + _ID + " = " + QString::number(databaseId)); + + // Execute the query. + domainLookupQuery.exec(); + + // Move to the first entry. + domainLookupQuery.first(); + + // Return the query. + return domainLookupQuery; +}