Changeset 187998 in webkit
- Timestamp:
- Aug 5, 2015 4:17:18 PM (9 years ago)
- Location:
- trunk/Source/WebCore
- Files:
-
- 5 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/ChangeLog
r187997 r187998 1 2015-08-05 Anders Carlsson <andersca@apple.com> 2 3 Move more functions from DatabaseBackendBase to Database 4 https://bugs.webkit.org/show_bug.cgi?id=147703 5 6 Reviewed by Tim Horton. 7 8 * Modules/webdatabase/Database.cpp: 9 (WebCore::fullyQualifiedInfoTableName): 10 (WebCore::setTextValueInDatabase): 11 (WebCore::retrieveTextResultFromDatabase): 12 (WebCore::Database::getVersionFromDatabase): 13 (WebCore::Database::setVersionInDatabase): 14 (WebCore::Database::performGetTableNames): 15 * Modules/webdatabase/Database.h: 16 * Modules/webdatabase/DatabaseBackendBase.cpp: 17 (WebCore::DatabaseBackendBase::performOpenAndVerify): 18 (WebCore::DatabaseBackendBase::getActualVersionForTransaction): 19 (WebCore::DatabaseBackendBase::databaseInfoTableName): Deleted. 20 (WebCore::fullyQualifiedInfoTableName): Deleted. 21 (WebCore::retrieveTextResultFromDatabase): Deleted. 22 (WebCore::setTextValueInDatabase): Deleted. 23 (WebCore::DatabaseBackendBase::getVersionFromDatabase): Deleted. 24 (WebCore::DatabaseBackendBase::setVersionInDatabase): Deleted. 25 * Modules/webdatabase/DatabaseBackendBase.h: 26 1 27 2015-08-05 Alex Christensen <achristensen@webkit.org> 2 28 -
trunk/Source/WebCore/Modules/webdatabase/Database.cpp
r187996 r187998 59 59 namespace WebCore { 60 60 61 static const char versionKey[] = "WebKitDatabaseVersionKey"; 62 static const char unqualifiedInfoTableName[] = "__WebKitDatabaseInfoTable__"; 63 64 static const char* fullyQualifiedInfoTableName() 65 { 66 static const char qualifier[] = "main."; 67 static char qualifiedName[sizeof(qualifier) + sizeof(unqualifiedInfoTableName) - 1]; 68 69 static std::once_flag onceFlag; 70 std::call_once(onceFlag, [] { 71 strcpy(qualifiedName, qualifier); 72 strcpy(qualifiedName + sizeof(qualifier) - 1, unqualifiedInfoTableName); 73 }); 74 75 return qualifiedName; 76 } 77 61 78 static String formatErrorMessage(const char* message, int sqliteErrorCode, const char* sqliteErrorMessage) 62 79 { 63 80 return String::format("%s (%d %s)", message, sqliteErrorCode, sqliteErrorMessage); 81 } 82 83 static bool setTextValueInDatabase(SQLiteDatabase& db, const String& query, const String& value) 84 { 85 SQLiteStatement statement(db, query); 86 int result = statement.prepare(); 87 88 if (result != SQLITE_OK) { 89 LOG_ERROR("Failed to prepare statement to set value in database (%s)", query.ascii().data()); 90 return false; 91 } 92 93 statement.bindText(1, value); 94 95 result = statement.step(); 96 if (result != SQLITE_DONE) { 97 LOG_ERROR("Failed to step statement to set value in database (%s)", query.ascii().data()); 98 return false; 99 } 100 101 return true; 102 } 103 104 static bool retrieveTextResultFromDatabase(SQLiteDatabase& db, const String& query, String& resultString) 105 { 106 SQLiteStatement statement(db, query); 107 int result = statement.prepare(); 108 109 if (result != SQLITE_OK) { 110 LOG_ERROR("Error (%i) preparing statement to read text result from database (%s)", result, query.ascii().data()); 111 return false; 112 } 113 114 result = statement.step(); 115 if (result == SQLITE_ROW) { 116 resultString = statement.getColumnText(0); 117 return true; 118 } 119 if (result == SQLITE_DONE) { 120 resultString = String(); 121 return true; 122 } 123 124 LOG_ERROR("Error (%i) reading text result from database (%s)", result, query.ascii().data()); 125 return false; 64 126 } 65 127 … … 152 214 } 153 215 216 bool Database::getVersionFromDatabase(String& version, bool shouldCacheVersion) 217 { 218 String query(String("SELECT value FROM ") + fullyQualifiedInfoTableName() + " WHERE key = '" + versionKey + "';"); 219 220 m_databaseAuthorizer->disable(); 221 222 bool result = retrieveTextResultFromDatabase(m_sqliteDatabase, query, version); 223 if (result) { 224 if (shouldCacheVersion) 225 setCachedVersion(version); 226 } else 227 LOG_ERROR("Failed to retrieve version from database %s", databaseDebugName().ascii().data()); 228 229 m_databaseAuthorizer->enable(); 230 231 return result; 232 } 233 234 bool Database::setVersionInDatabase(const String& version, bool shouldCacheVersion) 235 { 236 // The INSERT will replace an existing entry for the database with the new version number, due to the UNIQUE ON CONFLICT REPLACE 237 // clause in the CREATE statement (see Database::performOpenAndVerify()). 238 String query(String("INSERT INTO ") + fullyQualifiedInfoTableName() + " (key, value) VALUES ('" + versionKey + "', ?);"); 239 240 m_databaseAuthorizer->disable(); 241 242 bool result = setTextValueInDatabase(m_sqliteDatabase, query, version); 243 if (result) { 244 if (shouldCacheVersion) 245 setCachedVersion(version); 246 } else 247 LOG_ERROR("Failed to set version %s in database (%s)", version.ascii().data(), query.ascii().data()); 248 249 m_databaseAuthorizer->enable(); 250 251 return result; 252 } 253 154 254 void Database::scheduleTransaction() 155 255 { … … 348 448 while ((result = statement.step()) == SQLITE_ROW) { 349 449 String name = statement.getColumnText(0); 350 if (name != databaseInfoTableName())450 if (name != unqualifiedInfoTableName) 351 451 tableNames.append(name); 352 452 } -
trunk/Source/WebCore/Modules/webdatabase/Database.h
r187996 r187998 109 109 Database(PassRefPtr<DatabaseContext>, const String& name, const String& expectedVersion, const String& displayName, unsigned long estimatedSize); 110 110 111 bool getVersionFromDatabase(String& version, bool shouldCacheVersion = true); 112 bool setVersionInDatabase(const String& version, bool shouldCacheVersion = true); 113 111 114 void scheduleTransaction(); 112 115 … … 125 128 bool m_hasPendingCreationEvent { false }; 126 129 130 friend class ChangeVersionWrapper; 131 friend class DatabaseBackendBase; 127 132 friend class DatabaseManager; 128 133 friend class DatabaseServer; // FIXME: remove this when the backend has been split out. -
trunk/Source/WebCore/Modules/webdatabase/DatabaseBackendBase.cpp
r187996 r187998 82 82 namespace WebCore { 83 83 84 static const char versionKey[] = "WebKitDatabaseVersionKey";85 84 static const char unqualifiedInfoTableName[] = "__WebKitDatabaseInfoTable__"; 86 85 87 const char* DatabaseBackendBase::databaseInfoTableName()88 {89 return unqualifiedInfoTableName;90 }91 92 static const char* fullyQualifiedInfoTableName()93 {94 static const char qualifier[] = "main.";95 static char qualifiedName[sizeof(qualifier) + sizeof(unqualifiedInfoTableName) - 1];96 97 static std::once_flag onceFlag;98 std::call_once(onceFlag, []{99 strcpy(qualifiedName, qualifier);100 strcpy(qualifiedName + sizeof(qualifier) - 1, unqualifiedInfoTableName);101 });102 103 return qualifiedName;104 }105 106 86 static String formatErrorMessage(const char* message, int sqliteErrorCode, const char* sqliteErrorMessage) 107 87 { 108 88 return String::format("%s (%d %s)", message, sqliteErrorCode, sqliteErrorMessage); 109 }110 111 static bool retrieveTextResultFromDatabase(SQLiteDatabase& db, const String& query, String& resultString)112 {113 SQLiteStatement statement(db, query);114 int result = statement.prepare();115 116 if (result != SQLITE_OK) {117 LOG_ERROR("Error (%i) preparing statement to read text result from database (%s)", result, query.ascii().data());118 return false;119 }120 121 result = statement.step();122 if (result == SQLITE_ROW) {123 resultString = statement.getColumnText(0);124 return true;125 }126 if (result == SQLITE_DONE) {127 resultString = String();128 return true;129 }130 131 LOG_ERROR("Error (%i) reading text result from database (%s)", result, query.ascii().data());132 return false;133 }134 135 static bool setTextValueInDatabase(SQLiteDatabase& db, const String& query, const String& value)136 {137 SQLiteStatement statement(db, query);138 int result = statement.prepare();139 140 if (result != SQLITE_OK) {141 LOG_ERROR("Failed to prepare statement to set value in database (%s)", query.ascii().data());142 return false;143 }144 145 statement.bindText(1, value);146 147 result = statement.step();148 if (result != SQLITE_DONE) {149 LOG_ERROR("Failed to step statement to set value in database (%s)", query.ascii().data());150 return false;151 }152 153 return true;154 89 } 155 90 … … 368 303 return false; 369 304 } 370 } else if (! getVersionFromDatabase(currentVersion, false)) {305 } else if (!m_frontend->getVersionFromDatabase(currentVersion, false)) { 371 306 errorMessage = formatErrorMessage("unable to open database, failed to read current version", m_sqliteDatabase.lastError(), m_sqliteDatabase.lastErrorMsg()); 372 307 transaction.rollback(); … … 379 314 } else if (!m_new || shouldSetVersionInNewDatabase) { 380 315 LOG(StorageAPI, "Setting version %s in database %s that was just created", m_expectedVersion.ascii().data(), databaseDebugName().ascii().data()); 381 if (! setVersionInDatabase(m_expectedVersion, false)) {316 if (!m_frontend->setVersionInDatabase(m_expectedVersion, false)) { 382 317 errorMessage = formatErrorMessage("unable to open database, failed to write current version", m_sqliteDatabase.lastError(), m_sqliteDatabase.lastErrorMsg()); 383 318 transaction.rollback(); … … 455 390 } 456 391 457 bool DatabaseBackendBase::getVersionFromDatabase(String& version, bool shouldCacheVersion)458 {459 String query(String("SELECT value FROM ") + fullyQualifiedInfoTableName() + " WHERE key = '" + versionKey + "';");460 461 m_databaseAuthorizer->disable();462 463 bool result = retrieveTextResultFromDatabase(m_sqliteDatabase, query, version);464 if (result) {465 if (shouldCacheVersion)466 setCachedVersion(version);467 } else468 LOG_ERROR("Failed to retrieve version from database %s", databaseDebugName().ascii().data());469 470 m_databaseAuthorizer->enable();471 472 return result;473 }474 475 bool DatabaseBackendBase::setVersionInDatabase(const String& version, bool shouldCacheVersion)476 {477 // The INSERT will replace an existing entry for the database with the new version number, due to the UNIQUE ON CONFLICT REPLACE478 // clause in the CREATE statement (see Database::performOpenAndVerify()).479 String query(String("INSERT INTO ") + fullyQualifiedInfoTableName() + " (key, value) VALUES ('" + versionKey + "', ?);");480 481 m_databaseAuthorizer->disable();482 483 bool result = setTextValueInDatabase(m_sqliteDatabase, query, version);484 if (result) {485 if (shouldCacheVersion)486 setCachedVersion(version);487 } else488 LOG_ERROR("Failed to set version %s in database (%s)", version.ascii().data(), query.ascii().data());489 490 m_databaseAuthorizer->enable();491 492 return result;493 }494 495 392 void DatabaseBackendBase::setExpectedVersion(const String& version) 496 393 { … … 518 415 // Note: In multi-process browsers the cached value may be inaccurate. 519 416 // So we retrieve the value from the database and update the cached value here. 520 return getVersionFromDatabase(actualVersion, true);417 return m_frontend->getVersionFromDatabase(actualVersion, true); 521 418 } 522 419 -
trunk/Source/WebCore/Modules/webdatabase/DatabaseBackendBase.h
r187996 r187998 82 82 virtual bool performOpenAndVerify(bool shouldSetVersionInNewDatabase, DatabaseError&, String& errorMessage); 83 83 84 bool getVersionFromDatabase(String& version, bool shouldCacheVersion = true);85 bool setVersionInDatabase(const String& version, bool shouldCacheVersion = true);86 84 void setExpectedVersion(const String&); 87 85 const String& expectedVersion() const { return m_expectedVersion; } … … 89 87 void setCachedVersion(const String&); 90 88 bool getActualVersionForTransaction(String& version); 91 92 static const char* databaseInfoTableName();93 89 94 90 #if !LOG_DISABLED || !ERROR_DISABLED
Note: See TracChangeset
for help on using the changeset viewer.