X-Git-Url: https://gitweb.stoutner.com/?p=PrivacyBrowserPC.git;a=blobdiff_plain;f=src%2Fhelpers%2FDomainsDatabaseHelper.cpp;fp=src%2Fhelpers%2FDomainsDatabaseHelper.cpp;h=5de297d229fe688da8a4aa00d9eb00ca4ca48f3e;hp=b801a0bf4047882f9895637076012608e2fc4201;hb=30f550d27093a50e541e57b6e04b77983c7acbb3;hpb=16118809a11aa423f453a03c47f5263e9dd8b662 diff --git a/src/helpers/DomainsDatabaseHelper.cpp b/src/helpers/DomainsDatabaseHelper.cpp index b801a0b..5de297d 100644 --- a/src/helpers/DomainsDatabaseHelper.cpp +++ b/src/helpers/DomainsDatabaseHelper.cpp @@ -114,20 +114,60 @@ QSqlQuery DomainsDatabaseHelper::getDomainQuery(const QString &hostname) // Get a handle for the domains database. QSqlDatabase domainsDatabase = QSqlDatabase::database(CONNECTION_NAME); - // Instantiate a domain lookup query. - QSqlQuery domainLookupQuery(domainsDatabase); + // 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; - // Create a hostname field. - QSqlField hostnameField(DOMAIN_NAME, QVariant::String); + // 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); + } - // Set the hostname field value. - hostnameField.setValue(hostname); + // Strip out the first subdomain. + subdomain = subdomain.section('.', 1); + } - // SQL escape the hostname field. - QString sqlEscapedHostname = domainsDatabase.driver()->formatValue(hostnameField); + // Instantiate the domain lookup query. + QSqlQuery domainLookupQuery(domainsDatabase); // Prepare the domain lookup query. - domainLookupQuery.prepare("SELECT * FROM " + DOMAINS_TABLE + " WHERE " + DOMAIN_NAME + " = " + sqlEscapedHostname); + domainLookupQuery.prepare("SELECT * FROM " + DOMAINS_TABLE + " WHERE " + _ID + " = " + QString::number(databaseId)); // Execute the query. domainLookupQuery.exec(); @@ -138,4 +178,3 @@ QSqlQuery DomainsDatabaseHelper::getDomainQuery(const QString &hostname) // Return the query. return domainLookupQuery; } -