Changeset 209117 in webkit
- Timestamp:
- Nov 29, 2016 8:37:03 PM (7 years ago)
- Location:
- trunk
- Files:
-
- 6 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/LayoutTests/ChangeLog
r209116 r209117 1 2016-11-29 Chris Dumez <cdumez@apple.com> 2 3 Unreviewed, rolling out r209096, r209104, and r209114. 4 5 Caused over 200 layout test failures on the bots 6 7 Reverted changesets: 8 9 "IndexedDB 2.0: Cache and reuse SQLiteStatements in the SQLite 10 backend." 11 https://bugs.webkit.org/show_bug.cgi?id=164974 12 http://trac.webkit.org/changeset/209096 13 14 "Followup to:" 15 https://bugs.webkit.org/show_bug.cgi?id=164974 16 http://trac.webkit.org/changeset/209104 17 18 "REGRESSION (r209104): storage/indexeddb/modern/gc-closes- 19 database(-private).html timeout." 20 https://bugs.webkit.org/show_bug.cgi?id=165186 21 http://trac.webkit.org/changeset/209114 22 1 23 2016-11-29 Antoine Quint <graouts@apple.com> 2 24 -
trunk/LayoutTests/TestExpectations
r209114 r209117 996 996 webkit.org/b/164797 js/dom/domjit-function-get-element-by-id-licm.html [ Pass Timeout ] 997 997 webkit.org/b/164797 js/dom/domjit-function-get-element-by-id-changed.html [ Pass Timeout ] 998 999 1000 webkit.org/b/165186 storage/indexeddb/modern/gc-closes-database.html [ Skip ]1001 webkit.org/b/165186 storage/indexeddb/modern/gc-closes-database-private.html [ Skip ] -
trunk/Source/WebCore/ChangeLog
r209116 r209117 1 2016-11-29 Chris Dumez <cdumez@apple.com> 2 3 Unreviewed, rolling out r209096, r209104, and r209114. 4 5 Caused over 200 layout test failures on the bots 6 7 Reverted changesets: 8 9 "IndexedDB 2.0: Cache and reuse SQLiteStatements in the SQLite 10 backend." 11 https://bugs.webkit.org/show_bug.cgi?id=164974 12 http://trac.webkit.org/changeset/209096 13 14 "Followup to:" 15 https://bugs.webkit.org/show_bug.cgi?id=164974 16 http://trac.webkit.org/changeset/209104 17 18 "REGRESSION (r209104): storage/indexeddb/modern/gc-closes- 19 database(-private).html timeout." 20 https://bugs.webkit.org/show_bug.cgi?id=165186 21 http://trac.webkit.org/changeset/209114 22 1 23 2016-11-29 Antoine Quint <graouts@apple.com> 2 24 -
trunk/Source/WebCore/Modules/indexeddb/IDBTransaction.h
r209104 r209117 245 245 246 246 Deque<RefPtr<IDBClient::TransactionOperation>> m_pendingTransactionOperationQueue; 247 Deque< RefPtr<IDBClient::TransactionOperation>> m_transactionOperationsInProgressQueue;247 Deque<IDBClient::TransactionOperation*> m_transactionOperationsInProgressQueue; 248 248 Deque<std::pair<RefPtr<IDBClient::TransactionOperation>, IDBResultData>> m_completedOnServerQueue; 249 249 Deque<RefPtr<IDBClient::TransactionOperation>> m_abortQueue; -
trunk/Source/WebCore/Modules/indexeddb/server/SQLiteIDBBackingStore.cpp
r209096 r209117 491 491 if (!m_sqliteDB->executeCommand("CREATE TABLE IDBDatabaseInfo (key TEXT NOT NULL ON CONFLICT FAIL UNIQUE ON CONFLICT REPLACE, value TEXT NOT NULL ON CONFLICT FAIL);")) { 492 492 LOG_ERROR("Could not create IDBDatabaseInfo table in database (%i) - %s", m_sqliteDB->lastError(), m_sqliteDB->lastErrorMsg()); 493 closeSQLiteDB();493 m_sqliteDB = nullptr; 494 494 return nullptr; 495 495 } … … 497 497 if (!m_sqliteDB->executeCommand("CREATE TABLE ObjectStoreInfo (id INTEGER PRIMARY KEY NOT NULL ON CONFLICT FAIL UNIQUE ON CONFLICT FAIL, name TEXT NOT NULL ON CONFLICT FAIL UNIQUE ON CONFLICT FAIL, keyPath BLOB NOT NULL ON CONFLICT FAIL, autoInc INTEGER NOT NULL ON CONFLICT FAIL, maxIndexID INTEGER NOT NULL ON CONFLICT FAIL);")) { 498 498 LOG_ERROR("Could not create ObjectStoreInfo table in database (%i) - %s", m_sqliteDB->lastError(), m_sqliteDB->lastErrorMsg()); 499 closeSQLiteDB();499 m_sqliteDB = nullptr; 500 500 return nullptr; 501 501 } … … 503 503 if (!m_sqliteDB->executeCommand("CREATE TABLE IndexInfo (id INTEGER NOT NULL ON CONFLICT FAIL, name TEXT NOT NULL ON CONFLICT FAIL, objectStoreID INTEGER NOT NULL ON CONFLICT FAIL, keyPath BLOB NOT NULL ON CONFLICT FAIL, isUnique INTEGER NOT NULL ON CONFLICT FAIL, multiEntry INTEGER NOT NULL ON CONFLICT FAIL);")) { 504 504 LOG_ERROR("Could not create IndexInfo table in database (%i) - %s", m_sqliteDB->lastError(), m_sqliteDB->lastErrorMsg()); 505 closeSQLiteDB();505 m_sqliteDB = nullptr; 506 506 return nullptr; 507 507 } … … 509 509 if (!m_sqliteDB->executeCommand("CREATE TABLE KeyGenerators (objectStoreID INTEGER NOT NULL ON CONFLICT FAIL UNIQUE ON CONFLICT REPLACE, currentKey INTEGER NOT NULL ON CONFLICT FAIL);")) { 510 510 LOG_ERROR("Could not create KeyGenerators table in database (%i) - %s", m_sqliteDB->lastError(), m_sqliteDB->lastErrorMsg()); 511 closeSQLiteDB();511 m_sqliteDB = nullptr; 512 512 return nullptr; 513 513 } … … 519 519 || sql.step() != SQLITE_DONE) { 520 520 LOG_ERROR("Could not insert database metadata version into IDBDatabaseInfo table (%i) - %s", m_sqliteDB->lastError(), m_sqliteDB->lastErrorMsg()); 521 closeSQLiteDB();521 m_sqliteDB = nullptr; 522 522 return nullptr; 523 523 } … … 529 529 || sql.step() != SQLITE_DONE) { 530 530 LOG_ERROR("Could not insert database name into IDBDatabaseInfo table (%i) - %s", m_sqliteDB->lastError(), m_sqliteDB->lastErrorMsg()); 531 closeSQLiteDB();531 m_sqliteDB = nullptr; 532 532 return nullptr; 533 533 } … … 541 541 || sql.step() != SQLITE_DONE) { 542 542 LOG_ERROR("Could not insert default version into IDBDatabaseInfo table (%i) - %s", m_sqliteDB->lastError(), m_sqliteDB->lastErrorMsg()); 543 closeSQLiteDB();543 m_sqliteDB = nullptr; 544 544 return nullptr; 545 545 } … … 548 548 if (!m_sqliteDB->executeCommand(ASCIILiteral("INSERT INTO IDBDatabaseInfo VALUES ('MaxObjectStoreID', 1);"))) { 549 549 LOG_ERROR("Could not insert default version into IDBDatabaseInfo table (%i) - %s", m_sqliteDB->lastError(), m_sqliteDB->lastErrorMsg()); 550 closeSQLiteDB();550 m_sqliteDB = nullptr; 551 551 return nullptr; 552 552 } … … 722 722 if (!m_sqliteDB->open(dbFilename)) { 723 723 LOG_ERROR("Failed to open SQLite database at path '%s'", dbFilename.utf8().data()); 724 closeSQLiteDB();724 m_sqliteDB = nullptr; 725 725 } 726 726 … … 734 734 if (!ensureValidRecordsTable()) { 735 735 LOG_ERROR("Error creating or migrating Records table in database"); 736 closeSQLiteDB();736 m_sqliteDB = nullptr; 737 737 return { IDBDatabaseException::UnknownError, ASCIILiteral("Error creating or migrating Records table in database") }; 738 738 } … … 740 740 if (!ensureValidIndexRecordsTable()) { 741 741 LOG_ERROR("Error creating or migrating Index Records table in database"); 742 closeSQLiteDB();742 m_sqliteDB = nullptr; 743 743 return { IDBDatabaseException::UnknownError, ASCIILiteral("Error creating or migrating Index Records table in database") }; 744 744 } … … 746 746 if (!ensureValidBlobTables()) { 747 747 LOG_ERROR("Error creating or confirming Blob Records tables in database"); 748 closeSQLiteDB();748 m_sqliteDB = nullptr; 749 749 return { IDBDatabaseException::UnknownError, ASCIILiteral("Error creating or confirming Blob Records tables in database") }; 750 750 } … … 756 756 if (!databaseInfo) { 757 757 LOG_ERROR("Unable to establish IDB database at path '%s'", dbFilename.utf8().data()); 758 closeSQLiteDB();758 m_sqliteDB = nullptr; 759 759 return { IDBDatabaseException::UnknownError, ASCIILiteral("Unable to establish IDB database file") }; 760 760 } … … 863 863 864 864 { 865 auto* sql = cachedStatement(SQL::CreateObjectStoreInfo, ASCIILiteral("INSERT INTO ObjectStoreInfo VALUES (?, ?, ?, ?, ?);"));866 if ( !sql867 || sql ->bindInt64(1, info.identifier()) != SQLITE_OK868 || sql ->bindText(2, info.name()) != SQLITE_OK869 || sql ->bindBlob(3, keyPathBlob->data(), keyPathBlob->size()) != SQLITE_OK870 || sql ->bindInt(4, info.autoIncrement()) != SQLITE_OK871 || sql ->bindInt64(5, info.maxIndexID()) != SQLITE_OK872 || sql ->step() != SQLITE_DONE) {865 SQLiteStatement sql(*m_sqliteDB, ASCIILiteral("INSERT INTO ObjectStoreInfo VALUES (?, ?, ?, ?, ?);")); 866 if (sql.prepare() != SQLITE_OK 867 || sql.bindInt64(1, info.identifier()) != SQLITE_OK 868 || sql.bindText(2, info.name()) != SQLITE_OK 869 || sql.bindBlob(3, keyPathBlob->data(), keyPathBlob->size()) != SQLITE_OK 870 || sql.bindInt(4, info.autoIncrement()) != SQLITE_OK 871 || sql.bindInt64(5, info.maxIndexID()) != SQLITE_OK 872 || sql.step() != SQLITE_DONE) { 873 873 LOG_ERROR("Could not add object store '%s' to ObjectStoreInfo table (%i) - %s", info.name().utf8().data(), m_sqliteDB->lastError(), m_sqliteDB->lastErrorMsg()); 874 874 return { IDBDatabaseException::UnknownError, ASCIILiteral("Could not create object store") }; … … 877 877 878 878 { 879 auto* sql = cachedStatement(SQL::CreateObjectStoreKeyGenerator, ASCIILiteral("INSERT INTO KeyGenerators VALUES (?, 0);"));880 if ( !sql881 || sql ->bindInt64(1, info.identifier()) != SQLITE_OK882 || sql ->step() != SQLITE_DONE) {879 SQLiteStatement sql(*m_sqliteDB, ASCIILiteral("INSERT INTO KeyGenerators VALUES (?, 0);")); 880 if (sql.prepare() != SQLITE_OK 881 || sql.bindInt64(1, info.identifier()) != SQLITE_OK 882 || sql.step() != SQLITE_DONE) { 883 883 LOG_ERROR("Could not seed initial key generator value for ObjectStoreInfo table (%i) - %s", m_sqliteDB->lastError(), m_sqliteDB->lastErrorMsg()); 884 884 return { IDBDatabaseException::UnknownError, ASCIILiteral("Could not seed initial key generator value for object store") }; … … 910 910 // Delete the ObjectStore record 911 911 { 912 auto* sql = cachedStatement(SQL::DeleteObjectStoreInfo, ASCIILiteral("DELETE FROM ObjectStoreInfo WHERE id = ?;"));913 if ( !sql914 || sql ->bindInt64(1, objectStoreIdentifier) != SQLITE_OK915 || sql ->step() != SQLITE_DONE) {912 SQLiteStatement sql(*m_sqliteDB, ASCIILiteral("DELETE FROM ObjectStoreInfo WHERE id = ?;")); 913 if (sql.prepare() != SQLITE_OK 914 || sql.bindInt64(1, objectStoreIdentifier) != SQLITE_OK 915 || sql.step() != SQLITE_DONE) { 916 916 LOG_ERROR("Could not delete object store id %" PRIi64 " from ObjectStoreInfo table (%i) - %s", objectStoreIdentifier, m_sqliteDB->lastError(), m_sqliteDB->lastErrorMsg()); 917 917 return { IDBDatabaseException::UnknownError, ASCIILiteral("Could not delete object store") }; … … 921 921 // Delete the ObjectStore's key generator record if there is one. 922 922 { 923 auto* sql = cachedStatement(SQL::DeleteObjectStoreKeyGenerator, ASCIILiteral("DELETE FROM KeyGenerators WHERE objectStoreID = ?;"));924 if ( !sql925 || sql ->bindInt64(1, objectStoreIdentifier) != SQLITE_OK926 || sql ->step() != SQLITE_DONE) {923 SQLiteStatement sql(*m_sqliteDB, ASCIILiteral("DELETE FROM KeyGenerators WHERE objectStoreID = ?;")); 924 if (sql.prepare() != SQLITE_OK 925 || sql.bindInt64(1, objectStoreIdentifier) != SQLITE_OK 926 || sql.step() != SQLITE_DONE) { 927 927 LOG_ERROR("Could not delete object store from KeyGenerators table (%i) - %s", m_sqliteDB->lastError(), m_sqliteDB->lastErrorMsg()); 928 928 return { IDBDatabaseException::UnknownError, ASCIILiteral("Could not delete key generator for deleted object store") }; … … 932 932 // Delete all associated records 933 933 { 934 auto* sql = cachedStatement(SQL::DeleteObjectStoreRecords, ASCIILiteral("DELETE FROM Records WHERE objectStoreID = ?;"));935 if ( !sql936 || sql ->bindInt64(1, objectStoreIdentifier) != SQLITE_OK937 || sql ->step() != SQLITE_DONE) {934 SQLiteStatement sql(*m_sqliteDB, ASCIILiteral("DELETE FROM Records WHERE objectStoreID = ?;")); 935 if (sql.prepare() != SQLITE_OK 936 || sql.bindInt64(1, objectStoreIdentifier) != SQLITE_OK 937 || sql.step() != SQLITE_DONE) { 938 938 LOG_ERROR("Could not delete records for object store %" PRIi64 " (%i) - %s", objectStoreIdentifier, m_sqliteDB->lastError(), m_sqliteDB->lastErrorMsg()); 939 939 return { IDBDatabaseException::UnknownError, ASCIILiteral("Could not delete records for deleted object store") }; … … 943 943 // Delete all associated Indexes 944 944 { 945 auto* sql = cachedStatement(SQL::DeleteObjectStoreIndexInfo, ASCIILiteral("DELETE FROM IndexInfo WHERE objectStoreID = ?;"));946 if ( !sql947 || sql ->bindInt64(1, objectStoreIdentifier) != SQLITE_OK948 || sql ->step() != SQLITE_DONE) {945 SQLiteStatement sql(*m_sqliteDB, ASCIILiteral("DELETE FROM IndexInfo WHERE objectStoreID = ?;")); 946 if (sql.prepare() != SQLITE_OK 947 || sql.bindInt64(1, objectStoreIdentifier) != SQLITE_OK 948 || sql.step() != SQLITE_DONE) { 949 949 LOG_ERROR("Could not delete index from IndexInfo table (%i) - %s", m_sqliteDB->lastError(), m_sqliteDB->lastErrorMsg()); 950 950 return { IDBDatabaseException::UnknownError, ASCIILiteral("Could not delete IDBIndex for deleted object store") }; … … 954 954 // Delete all associated Index records 955 955 { 956 auto* sql = cachedStatement(SQL::DeleteObjectStoreIndexRecords, ASCIILiteral("DELETE FROM IndexRecords WHERE objectStoreID = ?;"));957 if ( !sql958 || sql ->bindInt64(1, objectStoreIdentifier) != SQLITE_OK959 || sql ->step() != SQLITE_DONE) {956 SQLiteStatement sql(*m_sqliteDB, ASCIILiteral("DELETE FROM IndexRecords WHERE objectStoreID = ?;")); 957 if (sql.prepare() != SQLITE_OK 958 || sql.bindInt64(1, objectStoreIdentifier) != SQLITE_OK 959 || sql.step() != SQLITE_DONE) { 960 960 LOG_ERROR("Could not delete index records(%i) - %s", m_sqliteDB->lastError(), m_sqliteDB->lastErrorMsg()); 961 961 return { IDBDatabaseException::UnknownError, ASCIILiteral("Could not delete IDBIndex records for deleted object store") }; … … 965 965 // Delete all unused Blob URL records. 966 966 { 967 auto* sql = cachedStatement(SQL::DeleteObjectStoreBlobRecords, ASCIILiteral("DELETE FROM BlobRecords WHERE objectStoreRow NOT IN (SELECT recordID FROM Records)"));968 if ( !sql969 || sql ->step() != SQLITE_DONE) {967 SQLiteStatement sql(*m_sqliteDB, ASCIILiteral("DELETE FROM BlobRecords WHERE objectStoreRow NOT IN (SELECT recordID FROM Records)")); 968 if (sql.prepare() != SQLITE_OK 969 || sql.step() != SQLITE_DONE) { 970 970 LOG_ERROR("Could not delete Blob URL records(%i) - %s", m_sqliteDB->lastError(), m_sqliteDB->lastErrorMsg()); 971 971 return { IDBDatabaseException::UnknownError, ASCIILiteral("Could not delete stored blob records for deleted object store") }; … … 1001 1001 1002 1002 { 1003 auto* sql = cachedStatement(SQL::RenameObjectStore, ASCIILiteral("UPDATE ObjectStoreInfo SET name = ? WHERE id = ?;"));1004 if ( !sql1005 || sql ->bindText(1, newName) != SQLITE_OK1006 || sql ->bindInt64(2, objectStoreIdentifier) != SQLITE_OK1007 || sql ->step() != SQLITE_DONE) {1003 SQLiteStatement sql(*m_sqliteDB, ASCIILiteral("UPDATE ObjectStoreInfo SET name = ? WHERE id = ?;")); 1004 if (sql.prepare() != SQLITE_OK 1005 || sql.bindText(1, newName) != SQLITE_OK 1006 || sql.bindInt64(2, objectStoreIdentifier) != SQLITE_OK 1007 || sql.step() != SQLITE_DONE) { 1008 1008 LOG_ERROR("Could not update name for object store id %" PRIi64 " in ObjectStoreInfo table (%i) - %s", objectStoreIdentifier, m_sqliteDB->lastError(), m_sqliteDB->lastErrorMsg()); 1009 1009 return { IDBDatabaseException::UnknownError, ASCIILiteral("Could not rename object store") }; … … 1034 1034 1035 1035 { 1036 auto* sql = cachedStatement(SQL::ClearObjectStoreRecords, ASCIILiteral("DELETE FROM Records WHERE objectStoreID = ?;"));1037 if ( !sql1038 || sql ->bindInt64(1, objectStoreID) != SQLITE_OK1039 || sql ->step() != SQLITE_DONE) {1036 SQLiteStatement sql(*m_sqliteDB, ASCIILiteral("DELETE FROM Records WHERE objectStoreID = ?;")); 1037 if (sql.prepare() != SQLITE_OK 1038 || sql.bindInt64(1, objectStoreID) != SQLITE_OK 1039 || sql.step() != SQLITE_DONE) { 1040 1040 LOG_ERROR("Could not clear records from object store id %" PRIi64 " (%i) - %s", objectStoreID, m_sqliteDB->lastError(), m_sqliteDB->lastErrorMsg()); 1041 1041 return { IDBDatabaseException::UnknownError, ASCIILiteral("Unable to clear object store") }; … … 1044 1044 1045 1045 { 1046 auto* sql = cachedStatement(SQL::ClearObjectStoreIndexRecords, ASCIILiteral("DELETE FROM IndexRecords WHERE objectStoreID = ?;"));1047 if ( !sql1048 || sql ->bindInt64(1, objectStoreID) != SQLITE_OK1049 || sql ->step() != SQLITE_DONE) {1046 SQLiteStatement sql(*m_sqliteDB, ASCIILiteral("DELETE FROM IndexRecords WHERE objectStoreID = ?;")); 1047 if (sql.prepare() != SQLITE_OK 1048 || sql.bindInt64(1, objectStoreID) != SQLITE_OK 1049 || sql.step() != SQLITE_DONE) { 1050 1050 LOG_ERROR("Could not delete records from index record store id %" PRIi64 " (%i) - %s", objectStoreID, m_sqliteDB->lastError(), m_sqliteDB->lastErrorMsg()); 1051 1051 return { IDBDatabaseException::UnknownError, ASCIILiteral("Unable to delete index records while clearing object store") }; … … 1080 1080 } 1081 1081 1082 auto* sql = cachedStatement(SQL::CreateIndexInfo, ASCIILiteral("INSERT INTO IndexInfo VALUES (?, ?, ?, ?, ?, ?);"));1083 if ( !sql1084 || sql ->bindInt64(1, info.identifier()) != SQLITE_OK1085 || sql ->bindText(2, info.name()) != SQLITE_OK1086 || sql ->bindInt64(3, info.objectStoreIdentifier()) != SQLITE_OK1087 || sql ->bindBlob(4, keyPathBlob->data(), keyPathBlob->size()) != SQLITE_OK1088 || sql ->bindInt(5, info.unique()) != SQLITE_OK1089 || sql ->bindInt(6, info.multiEntry()) != SQLITE_OK1090 || sql ->step() != SQLITE_DONE) {1082 SQLiteStatement sql(*m_sqliteDB, ASCIILiteral("INSERT INTO IndexInfo VALUES (?, ?, ?, ?, ?, ?);")); 1083 if (sql.prepare() != SQLITE_OK 1084 || sql.bindInt64(1, info.identifier()) != SQLITE_OK 1085 || sql.bindText(2, info.name()) != SQLITE_OK 1086 || sql.bindInt64(3, info.objectStoreIdentifier()) != SQLITE_OK 1087 || sql.bindBlob(4, keyPathBlob->data(), keyPathBlob->size()) != SQLITE_OK 1088 || sql.bindInt(5, info.unique()) != SQLITE_OK 1089 || sql.bindInt(6, info.multiEntry()) != SQLITE_OK 1090 || sql.step() != SQLITE_DONE) { 1091 1091 LOG_ERROR("Could not add index '%s' to IndexInfo table (%i) - %s", info.name().utf8().data(), m_sqliteDB->lastError(), m_sqliteDB->lastErrorMsg()); 1092 1092 return { IDBDatabaseException::UnknownError, ASCIILiteral("Unable to create index in database") }; … … 1109 1109 IDBError error = updateOneIndexForAddRecord(info, key, valueBuffer); 1110 1110 if (!error.isNull()) { 1111 auto* sql = cachedStatement(SQL::DeleteIndexInfo, ASCIILiteral("DELETE FROM IndexInfo WHERE id = ? AND objectStoreID = ?;"));1112 if ( !sql1113 || sql ->bindInt64(1, info.identifier()) != SQLITE_OK1114 || sql ->bindInt64(2, info.objectStoreIdentifier()) != SQLITE_OK1115 || sql ->step() != SQLITE_DONE) {1111 SQLiteStatement sql(*m_sqliteDB, ASCIILiteral("DELETE FROM IndexInfo WHERE id = ? AND objectStoreID = ?;")); 1112 if (sql.prepare() != SQLITE_OK 1113 || sql.bindInt64(1, info.identifier()) != SQLITE_OK 1114 || sql.bindInt64(2, info.objectStoreIdentifier()) != SQLITE_OK 1115 || sql.step() != SQLITE_DONE) { 1116 1116 LOG_ERROR("Index creation failed due to uniqueness constraint failure, but there was an error deleting the Index record from the database"); 1117 1117 return { IDBDatabaseException::UnknownError, ASCIILiteral("Index creation failed due to uniqueness constraint failure, but there was an error deleting the Index record from the database") }; … … 1144 1144 } 1145 1145 1146 auto* sql = cachedStatement(SQL::HasIndexRecord, ASCIILiteral("SELECT rowid FROM IndexRecords WHERE indexID = ? AND objectStoreID = ? AND key = CAST(? AS TEXT);"));1147 if ( !sql1148 || sql ->bindInt64(1, info.identifier()) != SQLITE_OK1149 || sql ->bindInt64(2, info.objectStoreIdentifier()) != SQLITE_OK1150 || sql ->bindBlob(3, indexKeyBuffer->data(), indexKeyBuffer->size()) != SQLITE_OK) {1146 SQLiteStatement sql(*m_sqliteDB, ASCIILiteral("SELECT rowid FROM IndexRecords WHERE indexID = ? AND objectStoreID = ? AND key = CAST(? AS TEXT);")); 1147 if (sql.prepare() != SQLITE_OK 1148 || sql.bindInt64(1, info.identifier()) != SQLITE_OK 1149 || sql.bindInt64(2, info.objectStoreIdentifier()) != SQLITE_OK 1150 || sql.bindBlob(3, indexKeyBuffer->data(), indexKeyBuffer->size()) != SQLITE_OK) { 1151 1151 LOG_ERROR("Error checking for index record in database"); 1152 1152 return { IDBDatabaseException::UnknownError, ASCIILiteral("Error checking for index record in database") }; 1153 1153 } 1154 1154 1155 int sqlResult = sql ->step();1155 int sqlResult = sql.step(); 1156 1156 if (sqlResult == SQLITE_OK || sqlResult == SQLITE_DONE) 1157 1157 return { }; … … 1221 1221 1222 1222 { 1223 auto* sql = cachedStatement(SQL::PutIndexRecord, ASCIILiteral("INSERT INTO IndexRecords VALUES (?, ?, CAST(? AS TEXT), CAST(? AS TEXT));"));1224 if ( !sql1225 || sql ->bindInt64(1, indexID) != SQLITE_OK1226 || sql ->bindInt64(2, objectStoreID) != SQLITE_OK1227 || sql ->bindBlob(3, indexKeyBuffer->data(), indexKeyBuffer->size()) != SQLITE_OK1228 || sql ->bindBlob(4, valueBuffer->data(), valueBuffer->size()) != SQLITE_OK1229 || sql ->step() != SQLITE_DONE) {1223 SQLiteStatement sql(*m_sqliteDB, ASCIILiteral("INSERT INTO IndexRecords VALUES (?, ?, CAST(? AS TEXT), CAST(? AS TEXT));")); 1224 if (sql.prepare() != SQLITE_OK 1225 || sql.bindInt64(1, indexID) != SQLITE_OK 1226 || sql.bindInt64(2, objectStoreID) != SQLITE_OK 1227 || sql.bindBlob(3, indexKeyBuffer->data(), indexKeyBuffer->size()) != SQLITE_OK 1228 || sql.bindBlob(4, valueBuffer->data(), valueBuffer->size()) != SQLITE_OK 1229 || sql.step() != SQLITE_DONE) { 1230 1230 LOG_ERROR("Could not put index record for index %" PRIi64 " in object store %" PRIi64 " in Records table (%i) - %s", indexID, objectStoreID, m_sqliteDB->lastError(), m_sqliteDB->lastErrorMsg()); 1231 1231 return { IDBDatabaseException::UnknownError, ASCIILiteral("Error putting index record into database") }; … … 1256 1256 1257 1257 { 1258 auto* sql = cachedStatement(SQL::DeleteIndexInfo, ASCIILiteral("DELETE FROM IndexInfo WHERE id = ? AND objectStoreID = ?;"));1259 if ( !sql1260 || sql ->bindInt64(1, indexIdentifier) != SQLITE_OK1261 || sql ->bindInt64(2, objectStoreIdentifier) != SQLITE_OK1262 || sql ->step() != SQLITE_DONE) {1258 SQLiteStatement sql(*m_sqliteDB, ASCIILiteral("DELETE FROM IndexInfo WHERE id = ? AND objectStoreID = ?;")); 1259 if (sql.prepare() != SQLITE_OK 1260 || sql.bindInt64(1, indexIdentifier) != SQLITE_OK 1261 || sql.bindInt64(2, objectStoreIdentifier) != SQLITE_OK 1262 || sql.step() != SQLITE_DONE) { 1263 1263 LOG_ERROR("Could not delete index id %" PRIi64 " from IndexInfo table (%i) - %s", objectStoreIdentifier, m_sqliteDB->lastError(), m_sqliteDB->lastErrorMsg()); 1264 1264 return { IDBDatabaseException::UnknownError, ASCIILiteral("Error deleting index from database") }; … … 1267 1267 1268 1268 { 1269 auto* sql = cachedStatement(SQL::DeleteIndexRecords, ASCIILiteral("DELETE FROM IndexRecords WHERE indexID = ? AND objectStoreID = ?;"));1270 if ( !sql1271 || sql ->bindInt64(1, indexIdentifier) != SQLITE_OK1272 || sql ->bindInt64(2, objectStoreIdentifier) != SQLITE_OK1273 || sql ->step() != SQLITE_DONE) {1269 SQLiteStatement sql(*m_sqliteDB, ASCIILiteral("DELETE FROM IndexRecords WHERE indexID = ? AND objectStoreID = ?;")); 1270 if (sql.prepare() != SQLITE_OK 1271 || sql.bindInt64(1, indexIdentifier) != SQLITE_OK 1272 || sql.bindInt64(2, objectStoreIdentifier) != SQLITE_OK 1273 || sql.step() != SQLITE_DONE) { 1274 1274 LOG_ERROR("Could not delete index records for index id %" PRIi64 " from IndexRecords table (%i) - %s", indexIdentifier, m_sqliteDB->lastError(), m_sqliteDB->lastErrorMsg()); 1275 1275 return { IDBDatabaseException::UnknownError, ASCIILiteral("Error deleting index records from database") }; … … 1311 1311 1312 1312 { 1313 auto* sql = cachedStatement(SQL::RenameIndex, ASCIILiteral("UPDATE IndexInfo SET name = ? WHERE objectStoreID = ? AND id = ?;"));1314 if ( !sql1315 || sql ->bindText(1, newName) != SQLITE_OK1316 || sql ->bindInt64(2, objectStoreIdentifier) != SQLITE_OK1317 || sql ->bindInt64(3, indexIdentifier) != SQLITE_OK1318 || sql ->step() != SQLITE_DONE) {1313 SQLiteStatement sql(*m_sqliteDB, ASCIILiteral("UPDATE IndexInfo SET name = ? WHERE objectStoreID = ? AND id = ?;")); 1314 if (sql.prepare() != SQLITE_OK 1315 || sql.bindText(1, newName) != SQLITE_OK 1316 || sql.bindInt64(2, objectStoreIdentifier) != SQLITE_OK 1317 || sql.bindInt64(3, indexIdentifier) != SQLITE_OK 1318 || sql.step() != SQLITE_DONE) { 1319 1319 LOG_ERROR("Could not update name for index id (%" PRIi64 ", %" PRIi64 ") in IndexInfo table (%i) - %s", objectStoreIdentifier, indexIdentifier, m_sqliteDB->lastError(), m_sqliteDB->lastErrorMsg()); 1320 1320 return { IDBDatabaseException::UnknownError, ASCIILiteral("Could not rename index") }; … … 1347 1347 return { IDBDatabaseException::UnknownError, ASCIILiteral("Unable to serialize IDBKey to check for existence in object store") }; 1348 1348 } 1349 auto* sql = cachedStatement(SQL::KeyExistsInObjectStore, ASCIILiteral("SELECT key FROM Records WHERE objectStoreID = ? AND key = CAST(? AS TEXT) LIMIT 1;"));1350 if ( !sql1351 || sql ->bindInt64(1, objectStoreID) != SQLITE_OK1352 || sql ->bindBlob(2, keyBuffer->data(), keyBuffer->size()) != SQLITE_OK) {1349 SQLiteStatement sql(*m_sqliteDB, ASCIILiteral("SELECT key FROM Records WHERE objectStoreID = ? AND key = CAST(? AS TEXT) LIMIT 1;")); 1350 if (sql.prepare() != SQLITE_OK 1351 || sql.bindInt64(1, objectStoreID) != SQLITE_OK 1352 || sql.bindBlob(2, keyBuffer->data(), keyBuffer->size()) != SQLITE_OK) { 1353 1353 LOG_ERROR("Could not get record from object store %" PRIi64 " from Records table (%i) - %s", objectStoreID, m_sqliteDB->lastError(), m_sqliteDB->lastErrorMsg()); 1354 1354 return { IDBDatabaseException::UnknownError, ASCIILiteral("Unable to check for existence of IDBKey in object store") }; 1355 1355 } 1356 1356 1357 int sqlResult = sql ->step();1357 int sqlResult = sql.step(); 1358 1358 if (sqlResult == SQLITE_OK || sqlResult == SQLITE_DONE) 1359 1359 return { }; … … 1376 1376 HashSet<String> removedBlobFilenames; 1377 1377 { 1378 auto* sql = cachedStatement(SQL::GetUnusedBlobFilenames, ASCIILiteral("SELECT fileName FROM BlobFiles WHERE blobURL NOT IN (SELECT blobURL FROM BlobRecords)"));1379 1380 if ( !sql) {1378 SQLiteStatement sql(*m_sqliteDB, ASCIILiteral("SELECT fileName FROM BlobFiles WHERE blobURL NOT IN (SELECT blobURL FROM BlobRecords)")); 1379 1380 if (sql.prepare() != SQLITE_OK) { 1381 1381 LOG_ERROR("Error deleting stored blobs (%i) (Could not gather unused blobURLs) - %s", m_sqliteDB->lastError(), m_sqliteDB->lastErrorMsg()); 1382 1382 return { IDBDatabaseException::UnknownError, ASCIILiteral("Error deleting stored blobs") }; 1383 1383 } 1384 1384 1385 int result = sql ->step();1385 int result = sql.step(); 1386 1386 while (result == SQLITE_ROW) { 1387 removedBlobFilenames.add(sql ->getColumnText(0));1388 result = sql ->step();1387 removedBlobFilenames.add(sql.getColumnText(0)); 1388 result = sql.step(); 1389 1389 } 1390 1390 … … 1397 1397 // Remove the blob records that are no longer in use. 1398 1398 if (!removedBlobFilenames.isEmpty()) { 1399 auto* sql = cachedStatement(SQL::DeleteUnusedBlobs, ASCIILiteral("DELETE FROM BlobFiles WHERE blobURL NOT IN (SELECT blobURL FROM BlobRecords)"));1400 1401 if ( !sql1402 || sql ->step() != SQLITE_DONE) {1399 SQLiteStatement sql(*m_sqliteDB, ASCIILiteral("DELETE FROM BlobFiles WHERE blobURL NOT IN (SELECT blobURL FROM BlobRecords)")); 1400 1401 if (sql.prepare() != SQLITE_OK 1402 || sql.step() != SQLITE_DONE) { 1403 1403 LOG_ERROR("Error deleting stored blobs (%i) (Could not delete blobFile records) - %s", m_sqliteDB->lastError(), m_sqliteDB->lastErrorMsg()); 1404 1404 return { IDBDatabaseException::UnknownError, ASCIILiteral("Error deleting stored blobs") }; … … 1431 1431 int64_t recordID; 1432 1432 { 1433 auto* sql = cachedStatement(SQL::GetObjectStoreRecordID, ASCIILiteral("SELECT recordID FROM Records WHERE objectStoreID = ? AND key = CAST(? AS TEXT);"));1434 1435 if ( !sql1436 || sql ->bindInt64(1, objectStoreID) != SQLITE_OK1437 || sql ->bindBlob(2, keyBuffer->data(), keyBuffer->size()) != SQLITE_OK) {1433 SQLiteStatement sql(*m_sqliteDB, ASCIILiteral("SELECT recordID FROM Records WHERE objectStoreID = ? AND key = CAST(? AS TEXT);")); 1434 1435 if (sql.prepare() != SQLITE_OK 1436 || sql.bindInt64(1, objectStoreID) != SQLITE_OK 1437 || sql.bindBlob(2, keyBuffer->data(), keyBuffer->size()) != SQLITE_OK) { 1438 1438 LOG_ERROR("Could not delete record from object store %" PRIi64 " (%i) - %s", objectStoreID, m_sqliteDB->lastError(), m_sqliteDB->lastErrorMsg()); 1439 1439 return { IDBDatabaseException::UnknownError, ASCIILiteral("Failed to delete record from object store") }; 1440 1440 } 1441 1441 1442 int result = sql ->step();1442 int result = sql.step(); 1443 1443 1444 1444 // If there's no record ID, there's no record to delete. … … 1451 1451 } 1452 1452 1453 recordID = sql ->getColumnInt64(0);1453 recordID = sql.getColumnInt64(0); 1454 1454 } 1455 1455 … … 1461 1461 // Delete the blob records for this object store record. 1462 1462 { 1463 auto* sql = cachedStatement(SQL::DeleteBlobRecord, ASCIILiteral("DELETE FROM BlobRecords WHERE objectStoreRow = ?;"));1464 1465 if ( !sql1466 || sql ->bindInt64(1, recordID) != SQLITE_OK1467 || sql ->step() != SQLITE_DONE) {1463 SQLiteStatement sql(*m_sqliteDB, ASCIILiteral("DELETE FROM BlobRecords WHERE objectStoreRow = ?;")); 1464 1465 if (sql.prepare() != SQLITE_OK 1466 || sql.bindInt64(1, recordID) != SQLITE_OK 1467 || sql.step() != SQLITE_DONE) { 1468 1468 LOG_ERROR("Could not delete record from object store %" PRIi64 " (%i) (Could not delete BlobRecords records) - %s", objectStoreID, m_sqliteDB->lastError(), m_sqliteDB->lastErrorMsg()); 1469 1469 return { IDBDatabaseException::UnknownError, ASCIILiteral("Failed to delete record from object store") }; … … 1477 1477 // Delete record from object store 1478 1478 { 1479 auto* sql = cachedStatement(SQL::DeleteObjectStoreRecord, ASCIILiteral("DELETE FROM Records WHERE objectStoreID = ? AND key = CAST(? AS TEXT);"));1480 1481 if ( !sql1482 || sql ->bindInt64(1, objectStoreID) != SQLITE_OK1483 || sql ->bindBlob(2, keyBuffer->data(), keyBuffer->size()) != SQLITE_OK1484 || sql ->step() != SQLITE_DONE) {1479 SQLiteStatement sql(*m_sqliteDB, ASCIILiteral("DELETE FROM Records WHERE objectStoreID = ? AND key = CAST(? AS TEXT);")); 1480 1481 if (sql.prepare() != SQLITE_OK 1482 || sql.bindInt64(1, objectStoreID) != SQLITE_OK 1483 || sql.bindBlob(2, keyBuffer->data(), keyBuffer->size()) != SQLITE_OK 1484 || sql.step() != SQLITE_DONE) { 1485 1485 LOG_ERROR("Could not delete record from object store %" PRIi64 " (%i) - %s", objectStoreID, m_sqliteDB->lastError(), m_sqliteDB->lastErrorMsg()); 1486 1486 return { IDBDatabaseException::UnknownError, ASCIILiteral("Failed to delete record from object store") }; … … 1490 1490 // Delete record from indexes store 1491 1491 { 1492 auto* sql = cachedStatement(SQL::DeleteObjectStoreIndexRecord, ASCIILiteral("DELETE FROM IndexRecords WHERE objectStoreID = ? AND value = CAST(? AS TEXT);"));1493 1494 if ( !sql1495 || sql ->bindInt64(1, objectStoreID) != SQLITE_OK1496 || sql ->bindBlob(2, keyBuffer->data(), keyBuffer->size()) != SQLITE_OK1497 || sql ->step() != SQLITE_DONE) {1492 SQLiteStatement sql(*m_sqliteDB, ASCIILiteral("DELETE FROM IndexRecords WHERE objectStoreID = ? AND value = CAST(? AS TEXT);")); 1493 1494 if (sql.prepare() != SQLITE_OK 1495 || sql.bindInt64(1, objectStoreID) != SQLITE_OK 1496 || sql.bindBlob(2, keyBuffer->data(), keyBuffer->size()) != SQLITE_OK 1497 || sql.step() != SQLITE_DONE) { 1498 1498 LOG_ERROR("Could not delete record from indexes for object store %" PRIi64 " (%i) - %s", objectStoreID, m_sqliteDB->lastError(), m_sqliteDB->lastErrorMsg()); 1499 1499 return { IDBDatabaseException::UnknownError, ASCIILiteral("Failed to delete index entries for object store record") }; … … 1607 1607 RefPtr<SharedBuffer> keyBuffer = serializeIDBKeyData(key); 1608 1608 1609 auto* sql = cachedStatement(SQL::DeleteObjectStoreIndexRecord, ASCIILiteral("DELETE FROM IndexRecords WHERE objectStoreID = ? AND value = CAST(? AS TEXT);"));1610 1611 if ( !sql1612 || sql ->bindInt64(1, info.identifier()) != SQLITE_OK1613 || sql ->bindBlob(2, keyBuffer->data(), keyBuffer->size()) != SQLITE_OK1614 || sql ->step() != SQLITE_DONE) {1609 SQLiteStatement sql(*m_sqliteDB, ASCIILiteral("DELETE FROM IndexRecords WHERE objectStoreID = ? AND value = CAST(? AS TEXT);")); 1610 1611 if (sql.prepare() != SQLITE_OK 1612 || sql.bindInt64(1, info.identifier()) != SQLITE_OK 1613 || sql.bindBlob(2, keyBuffer->data(), keyBuffer->size()) != SQLITE_OK 1614 || sql.step() != SQLITE_DONE) { 1615 1615 LOG_ERROR("Adding one Index record failed, but failed to remove all others that previously succeeded"); 1616 1616 return { IDBDatabaseException::UnknownError, ASCIILiteral("Adding one Index record failed, but failed to remove all others that previously succeeded") }; … … 1648 1648 int64_t recordID = 0; 1649 1649 { 1650 auto* sql = cachedStatement(SQL::AddObjectStoreRecord, ASCIILiteral("INSERT INTO Records VALUES (?, CAST(? AS TEXT), ?, NULL);"));1651 if ( !sql1652 || sql ->bindInt64(1, objectStoreInfo.identifier()) != SQLITE_OK1653 || sql ->bindBlob(2, keyBuffer->data(), keyBuffer->size()) != SQLITE_OK1654 || sql ->bindBlob(3, value.data().data()->data(), value.data().data()->size()) != SQLITE_OK1655 || sql ->step() != SQLITE_DONE) {1650 SQLiteStatement sql(*m_sqliteDB, ASCIILiteral("INSERT INTO Records VALUES (?, CAST(? AS TEXT), ?, NULL);")); 1651 if (sql.prepare() != SQLITE_OK 1652 || sql.bindInt64(1, objectStoreInfo.identifier()) != SQLITE_OK 1653 || sql.bindBlob(2, keyBuffer->data(), keyBuffer->size()) != SQLITE_OK 1654 || sql.bindBlob(3, value.data().data()->data(), value.data().data()->size()) != SQLITE_OK 1655 || sql.step() != SQLITE_DONE) { 1656 1656 LOG_ERROR("Could not put record for object store %" PRIi64 " in Records table (%i) - %s", objectStoreInfo.identifier(), m_sqliteDB->lastError(), m_sqliteDB->lastErrorMsg()); 1657 1657 return { IDBDatabaseException::UnknownError, ASCIILiteral("Unable to store record in object store") }; … … 1664 1664 1665 1665 if (!error.isNull()) { 1666 auto* sql = cachedStatement(SQL::DeleteObjectStoreRecord, ASCIILiteral("DELETE FROM Records WHERE objectStoreID = ? AND key = CAST(? AS TEXT);"));1667 if ( !sql1668 || sql ->bindInt64(1, objectStoreInfo.identifier()) != SQLITE_OK1669 || sql ->bindBlob(2, keyBuffer->data(), keyBuffer->size()) != SQLITE_OK1670 || sql ->step() != SQLITE_DONE) {1666 SQLiteStatement sql(*m_sqliteDB, ASCIILiteral("DELETE FROM Records WHERE objectStoreID = ? AND key = CAST(? AS TEXT);")); 1667 if (sql.prepare() != SQLITE_OK 1668 || sql.bindInt64(1, objectStoreInfo.identifier()) != SQLITE_OK 1669 || sql.bindBlob(2, keyBuffer->data(), keyBuffer->size()) != SQLITE_OK 1670 || sql.step() != SQLITE_DONE) { 1671 1671 LOG_ERROR("Indexing new object store record failed, but unable to remove the object store record itself"); 1672 1672 return { IDBDatabaseException::UnknownError, ASCIILiteral("Indexing new object store record failed, but unable to remove the object store record itself") }; … … 1681 1681 auto& url = blobURLs[i]; 1682 1682 { 1683 auto* sql = cachedStatement(SQL::AddBlobRecord, ASCIILiteral("INSERT INTO BlobRecords VALUES (?, ?);"));1684 if ( !sql1685 || sql ->bindInt64(1, recordID) != SQLITE_OK1686 || sql ->bindText(2, url) != SQLITE_OK1687 || sql ->step() != SQLITE_DONE) {1683 SQLiteStatement sql(*m_sqliteDB, ASCIILiteral("INSERT INTO BlobRecords VALUES (?, ?);")); 1684 if (sql.prepare() != SQLITE_OK 1685 || sql.bindInt64(1, recordID) != SQLITE_OK 1686 || sql.bindText(2, url) != SQLITE_OK 1687 || sql.step() != SQLITE_DONE) { 1688 1688 LOG_ERROR("Unable to record Blob record in database"); 1689 1689 return { IDBDatabaseException::UnknownError, ASCIILiteral("Unable to record Blob record in database") }; … … 1694 1694 // If we already have a file for this blobURL, nothing left to do. 1695 1695 { 1696 auto* sql = cachedStatement(SQL::BlobFilenameForBlobURL, ASCIILiteral("SELECT fileName FROM BlobFiles WHERE blobURL = ?;"));1697 if ( !sql1698 || sql ->bindText(1, url) != SQLITE_OK) {1696 SQLiteStatement sql(*m_sqliteDB, ASCIILiteral("SELECT fileName FROM BlobFiles WHERE blobURL = ?;")); 1697 if (sql.prepare() != SQLITE_OK 1698 || sql.bindText(1, url) != SQLITE_OK) { 1699 1699 LOG_ERROR("Unable to examine Blob filenames in database"); 1700 1700 return { IDBDatabaseException::UnknownError, ASCIILiteral("Unable to examine Blob filenames in database") }; 1701 1701 } 1702 1702 1703 int result = sql ->step();1703 int result = sql.step(); 1704 1704 if (result != SQLITE_ROW && result != SQLITE_DONE) { 1705 1705 LOG_ERROR("Unable to examine Blob filenames in database"); … … 1714 1714 String storedFilename = String::format("%" PRId64 ".blob", potentialFileNameInteger); 1715 1715 { 1716 auto* sql = cachedStatement(SQL::AddBlobFilename, ASCIILiteral("INSERT INTO BlobFiles VALUES (?, ?);"));1717 if ( !sql1718 || sql ->bindText(1, url) != SQLITE_OK1719 || sql ->bindText(2, storedFilename) != SQLITE_OK1720 || sql ->step() != SQLITE_DONE) {1716 SQLiteStatement sql(*m_sqliteDB, ASCIILiteral("INSERT INTO BlobFiles VALUES (?, ?);")); 1717 if (sql.prepare() != SQLITE_OK 1718 || sql.bindText(1, url) != SQLITE_OK 1719 || sql.bindText(2, storedFilename) != SQLITE_OK 1720 || sql.step() != SQLITE_DONE) { 1721 1721 LOG_ERROR("Unable to record Blob file record in database"); 1722 1722 return { IDBDatabaseException::UnknownError, ASCIILiteral("Unable to record Blob file record in database") }; … … 1738 1738 HashSet<String> blobURLSet; 1739 1739 { 1740 auto* sql = cachedStatement(SQL::GetBlobURL, ASCIILiteral("SELECT blobURL FROM BlobRecords WHERE objectStoreRow = ?"));1741 if ( !sql1742 || sql ->bindInt64(1, objectStoreRecord) != SQLITE_OK) {1740 SQLiteStatement sql(*m_sqliteDB, ASCIILiteral("SELECT blobURL FROM BlobRecords WHERE objectStoreRow = ?")); 1741 if (sql.prepare() != SQLITE_OK 1742 || sql.bindInt64(1, objectStoreRecord) != SQLITE_OK) { 1743 1743 LOG_ERROR("Could not prepare statement to fetch blob URLs for object store record (%i) - %s", m_sqliteDB->lastError(), m_sqliteDB->lastErrorMsg()); 1744 1744 return { IDBDatabaseException::UnknownError, ASCIILiteral("Failed to look up blobURL records in object store by key range") }; 1745 1745 } 1746 1746 1747 int sqlResult = sql ->step();1747 int sqlResult = sql.step(); 1748 1748 if (sqlResult == SQLITE_OK || sqlResult == SQLITE_DONE) { 1749 1749 // There are no blobURLs in the database for this object store record. … … 1752 1752 1753 1753 while (sqlResult == SQLITE_ROW) { 1754 blobURLSet.add(sql ->getColumnText(0));1755 sqlResult = sql ->step();1754 blobURLSet.add(sql.getColumnText(0)); 1755 sqlResult = sql.step(); 1756 1756 } 1757 1757 … … 1765 1765 String databaseDirectory = fullDatabaseDirectory(); 1766 1766 for (auto& blobURL : blobURLSet) { 1767 auto* sql = cachedStatement(SQL::BlobFilenameForBlobURL, ASCIILiteral("SELECT fileName FROM BlobFiles WHERE blobURL = ?;"));1768 if ( !sql1769 || sql ->bindText(1, blobURL) != SQLITE_OK) {1767 SQLiteStatement sql(*m_sqliteDB, ASCIILiteral("SELECT fileName FROM BlobFiles WHERE blobURL = ?")); 1768 if (sql.prepare() != SQLITE_OK 1769 || sql.bindText(1, blobURL) != SQLITE_OK) { 1770 1770 LOG_ERROR("Could not prepare statement to fetch blob filename for object store record (%i) - %s", m_sqliteDB->lastError(), m_sqliteDB->lastErrorMsg()); 1771 1771 return { IDBDatabaseException::UnknownError, ASCIILiteral("Failed to look up blobURL records in object store by key range") }; 1772 1772 } 1773 1773 1774 if (sql ->step() != SQLITE_ROW) {1774 if (sql.step() != SQLITE_ROW) { 1775 1775 LOG_ERROR("Entry for blob filename for blob url %s does not exist (%i) - %s", blobURL.utf8().data(), m_sqliteDB->lastError(), m_sqliteDB->lastErrorMsg()); 1776 1776 return { IDBDatabaseException::UnknownError, ASCIILiteral("Failed to look up blobURL records in object store by key range") }; … … 1779 1779 blobURLs.append(blobURL); 1780 1780 1781 String fileName = sql ->getColumnText(0);1781 String fileName = sql.getColumnText(0); 1782 1782 blobFilePaths.append(pathByAppendingComponent(databaseDirectory, fileName)); 1783 1783 } … … 1820 1820 ThreadSafeDataBuffer resultBuffer; 1821 1821 { 1822 static NeverDestroyed<ASCIILiteral> lowerOpenUpperOpen("SELECT value, ROWID FROM Records WHERE objectStoreID = ? AND key > CAST(? AS TEXT) AND key < CAST(? AS TEXT) ORDER BY key;"); 1823 static NeverDestroyed<ASCIILiteral> lowerOpenUpperClosed("SELECT value, ROWID FROM Records WHERE objectStoreID = ? AND key > CAST(? AS TEXT) AND key <= CAST(? AS TEXT) ORDER BY key;"); 1824 static NeverDestroyed<ASCIILiteral> lowerClosedUpperOpen("SELECT value, ROWID FROM Records WHERE objectStoreID = ? AND key >= CAST(? AS TEXT) AND key < CAST(? AS TEXT) ORDER BY key;"); 1825 static NeverDestroyed<ASCIILiteral> lowerClosedUpperClosed("SELECT value, ROWID FROM Records WHERE objectStoreID = ? AND key >= CAST(? AS TEXT) AND key <= CAST(? AS TEXT) ORDER BY key;"); 1826 1827 SQLiteStatement* sql = nullptr; 1822 static NeverDestroyed<const ASCIILiteral> lowerOpenUpperOpen("SELECT value, ROWID FROM Records WHERE objectStoreID = ? AND key > CAST(? AS TEXT) AND key < CAST(? AS TEXT) ORDER BY key;"); 1823 static NeverDestroyed<const ASCIILiteral> lowerOpenUpperClosed("SELECT value, ROWID FROM Records WHERE objectStoreID = ? AND key > CAST(? AS TEXT) AND key <= CAST(? AS TEXT) ORDER BY key;"); 1824 static NeverDestroyed<const ASCIILiteral> lowerClosedUpperOpen("SELECT value, ROWID FROM Records WHERE objectStoreID = ? AND key >= CAST(? AS TEXT) AND key < CAST(? AS TEXT) ORDER BY key;"); 1825 static NeverDestroyed<const ASCIILiteral> lowerClosedUpperClosed("SELECT value, ROWID FROM Records WHERE objectStoreID = ? AND key >= CAST(? AS TEXT) AND key <= CAST(? AS TEXT) ORDER BY key;"); 1826 1827 const ASCIILiteral* query = nullptr; 1828 1828 1829 if (keyRange.lowerOpen) { 1829 1830 if (keyRange.upperOpen) 1830 sql = cachedStatement(SQL::GetValueRecordsLowerOpenUpperOpen, lowerOpenUpperOpen.get());1831 query = &lowerOpenUpperOpen.get(); 1831 1832 else 1832 sql = cachedStatement(SQL::GetValueRecordsLowerOpenUpperClosed, lowerOpenUpperClosed.get());1833 query = &lowerOpenUpperClosed.get(); 1833 1834 } else { 1834 1835 if (keyRange.upperOpen) 1835 sql = cachedStatement(SQL::GetValueRecordsLowerClosedUpperOpen, lowerClosedUpperOpen.get());1836 query = &lowerClosedUpperOpen.get(); 1836 1837 else 1837 sql = cachedStatement(SQL::GetValueRecordsLowerClosedUpperClosed, lowerClosedUpperClosed.get()); 1838 } 1839 1840 if (!sql 1841 || sql->bindInt64(1, objectStoreID) != SQLITE_OK 1842 || sql->bindBlob(2, lowerBuffer->data(), lowerBuffer->size()) != SQLITE_OK 1843 || sql->bindBlob(3, upperBuffer->data(), upperBuffer->size()) != SQLITE_OK) { 1838 query = &lowerClosedUpperClosed.get(); 1839 } 1840 1841 ASSERT(query); 1842 1843 SQLiteStatement sql(*m_sqliteDB, *query); 1844 if (sql.prepare() != SQLITE_OK 1845 || sql.bindInt64(1, objectStoreID) != SQLITE_OK 1846 || sql.bindBlob(2, lowerBuffer->data(), lowerBuffer->size()) != SQLITE_OK 1847 || sql.bindBlob(3, upperBuffer->data(), upperBuffer->size()) != SQLITE_OK) { 1844 1848 LOG_ERROR("Could not get key range record from object store %" PRIi64 " from Records table (%i) - %s", objectStoreID, m_sqliteDB->lastError(), m_sqliteDB->lastErrorMsg()); 1845 1849 return { IDBDatabaseException::UnknownError, ASCIILiteral("Failed to look up record in object store by key range") }; 1846 1850 } 1847 1851 1848 int sqlResult = sql ->step();1852 int sqlResult = sql.step(); 1849 1853 1850 1854 if (sqlResult == SQLITE_OK || sqlResult == SQLITE_DONE) { … … 1859 1863 1860 1864 Vector<uint8_t> buffer; 1861 sql ->getColumnBlobAsVector(0, buffer);1865 sql.getColumnBlobAsVector(0, buffer); 1862 1866 resultBuffer = ThreadSafeDataBuffer::adoptVector(buffer); 1863 1867 1864 recordID = sql ->getColumnInt64(1);1868 recordID = sql.getColumnInt64(1); 1865 1869 } 1866 1870 … … 1882 1886 } 1883 1887 1884 SQLiteStatement* SQLiteIDBBackingStore::cachedStatementForGetAllObjectStoreRecords(const IDBGetAllRecordsData& getAllRecordsData)1885 { 1886 static NeverDestroyed< ASCIILiteral> lowerOpenUpperOpenKey("SELECT key FROM Records WHERE objectStoreID = ? AND key > CAST(? AS TEXT) AND key < CAST(? AS TEXT) ORDER BY key;");1887 static NeverDestroyed< ASCIILiteral> lowerOpenUpperClosedKey("SELECT key FROM Records WHERE objectStoreID = ? AND key > CAST(? AS TEXT) AND key <= CAST(? AS TEXT) ORDER BY key;");1888 static NeverDestroyed< ASCIILiteral> lowerClosedUpperOpenKey("SELECT key FROM Records WHERE objectStoreID = ? AND key >= CAST(? AS TEXT) AND key < CAST(? AS TEXT) ORDER BY key;");1889 static NeverDestroyed< ASCIILiteral> lowerClosedUpperClosedKey("SELECT key FROM Records WHERE objectStoreID = ? AND key >= CAST(? AS TEXT) AND key <= CAST(? AS TEXT) ORDER BY key;");1890 static NeverDestroyed< ASCIILiteral> lowerOpenUpperOpenValue("SELECT value, ROWID FROM Records WHERE objectStoreID = ? AND key > CAST(? AS TEXT) AND key < CAST(? AS TEXT) ORDER BY key;");1891 static NeverDestroyed< ASCIILiteral> lowerOpenUpperClosedValue("SELECT value, ROWID FROM Records WHERE objectStoreID = ? AND key > CAST(? AS TEXT) AND key <= CAST(? AS TEXT) ORDER BY key;");1892 static NeverDestroyed< ASCIILiteral> lowerClosedUpperOpenValue("SELECT value, ROWID FROM Records WHERE objectStoreID = ? AND key >= CAST(? AS TEXT) AND key < CAST(? AS TEXT) ORDER BY key;");1893 static NeverDestroyed< ASCIILiteral> lowerClosedUpperClosedValue("SELECT value, ROWID FROM Records WHERE objectStoreID = ? AND key >= CAST(? AS TEXT) AND key <= CAST(? AS TEXT) ORDER BY key;");1888 static const ASCIILiteral& queryForGetAllObjectStoreRecords(const IDBGetAllRecordsData& getAllRecordsData) 1889 { 1890 static NeverDestroyed<const ASCIILiteral> lowerOpenUpperOpenKey("SELECT key FROM Records WHERE objectStoreID = ? AND key > CAST(? AS TEXT) AND key < CAST(? AS TEXT) ORDER BY key;"); 1891 static NeverDestroyed<const ASCIILiteral> lowerOpenUpperClosedKey("SELECT key FROM Records WHERE objectStoreID = ? AND key > CAST(? AS TEXT) AND key <= CAST(? AS TEXT) ORDER BY key;"); 1892 static NeverDestroyed<const ASCIILiteral> lowerClosedUpperOpenKey("SELECT key FROM Records WHERE objectStoreID = ? AND key >= CAST(? AS TEXT) AND key < CAST(? AS TEXT) ORDER BY key;"); 1893 static NeverDestroyed<const ASCIILiteral> lowerClosedUpperClosedKey("SELECT key FROM Records WHERE objectStoreID = ? AND key >= CAST(? AS TEXT) AND key <= CAST(? AS TEXT) ORDER BY key;"); 1894 static NeverDestroyed<const ASCIILiteral> lowerOpenUpperOpenValue("SELECT value, ROWID FROM Records WHERE objectStoreID = ? AND key > CAST(? AS TEXT) AND key < CAST(? AS TEXT) ORDER BY key;"); 1895 static NeverDestroyed<const ASCIILiteral> lowerOpenUpperClosedValue("SELECT value, ROWID FROM Records WHERE objectStoreID = ? AND key > CAST(? AS TEXT) AND key <= CAST(? AS TEXT) ORDER BY key;"); 1896 static NeverDestroyed<const ASCIILiteral> lowerClosedUpperOpenValue("SELECT value, ROWID FROM Records WHERE objectStoreID = ? AND key >= CAST(? AS TEXT) AND key < CAST(? AS TEXT) ORDER BY key;"); 1897 static NeverDestroyed<const ASCIILiteral> lowerClosedUpperClosedValue("SELECT value, ROWID FROM Records WHERE objectStoreID = ? AND key >= CAST(? AS TEXT) AND key <= CAST(? AS TEXT) ORDER BY key;"); 1894 1898 1895 1899 if (getAllRecordsData.getAllType == IndexedDB::GetAllType::Keys) { 1896 1900 if (getAllRecordsData.keyRangeData.lowerOpen) { 1897 1901 if (getAllRecordsData.keyRangeData.upperOpen) 1898 return cachedStatement(SQL::GetAllKeyRecordsLowerOpenUpperOpen, lowerOpenUpperOpenKey.get());1899 return cachedStatement(SQL::GetAllKeyRecordsLowerOpenUpperClosed, lowerOpenUpperClosedKey.get());1902 return lowerOpenUpperOpenKey.get(); 1903 return lowerOpenUpperClosedKey.get(); 1900 1904 } 1901 1905 1902 1906 if (getAllRecordsData.keyRangeData.upperOpen) 1903 return cachedStatement(SQL::GetAllKeyRecordsLowerClosedUpperOpen, lowerClosedUpperOpenKey.get());1904 return cachedStatement(SQL::GetAllKeyRecordsLowerClosedUpperClosed, lowerClosedUpperClosedKey.get());1907 return lowerClosedUpperOpenKey.get(); 1908 return lowerClosedUpperClosedKey.get(); 1905 1909 } 1906 1910 1907 1911 if (getAllRecordsData.keyRangeData.lowerOpen) { 1908 1912 if (getAllRecordsData.keyRangeData.upperOpen) 1909 return cachedStatement(SQL::GetValueRecordsLowerOpenUpperOpen, lowerOpenUpperOpenValue.get());1910 return cachedStatement(SQL::GetValueRecordsLowerOpenUpperClosed, lowerOpenUpperClosedValue.get());1913 return lowerOpenUpperOpenValue.get(); 1914 return lowerOpenUpperClosedValue.get(); 1911 1915 } 1912 1916 1913 1917 if (getAllRecordsData.keyRangeData.upperOpen) 1914 return cachedStatement(SQL::GetValueRecordsLowerClosedUpperOpen, lowerClosedUpperOpenValue.get());1915 return cachedStatement(SQL::GetValueRecordsLowerClosedUpperClosed, lowerClosedUpperClosedValue.get());1918 return lowerClosedUpperOpenValue.get(); 1919 return lowerClosedUpperClosedValue.get(); 1916 1920 } 1917 1921 … … 1947 1951 } 1948 1952 1949 auto* sql = cachedStatementForGetAllObjectStoreRecords(getAllRecordsData);1950 if ( !sql1951 || sql ->bindInt64(1, getAllRecordsData.objectStoreIdentifier) != SQLITE_OK1952 || sql ->bindBlob(2, lowerBuffer->data(), lowerBuffer->size()) != SQLITE_OK1953 || sql ->bindBlob(3, upperBuffer->data(), upperBuffer->size()) != SQLITE_OK) {1953 SQLiteStatement sql(*m_sqliteDB, queryForGetAllObjectStoreRecords(getAllRecordsData)); 1954 if (sql.prepare() != SQLITE_OK 1955 || sql.bindInt64(1, getAllRecordsData.objectStoreIdentifier) != SQLITE_OK 1956 || sql.bindBlob(2, lowerBuffer->data(), lowerBuffer->size()) != SQLITE_OK 1957 || sql.bindBlob(3, upperBuffer->data(), upperBuffer->size()) != SQLITE_OK) { 1954 1958 LOG_ERROR("Could not get key range record from object store %" PRIi64 " from Records table (%i) - %s", getAllRecordsData.objectStoreIdentifier, m_sqliteDB->lastError(), m_sqliteDB->lastErrorMsg()); 1955 1959 return { IDBDatabaseException::UnknownError, ASCIILiteral("Failed to look up record in object store by key range") }; … … 1964 1968 targetResults = std::numeric_limits<uint32_t>::max(); 1965 1969 1966 int sqlResult = sql ->step();1970 int sqlResult = sql.step(); 1967 1971 uint32_t returnedResults = 0; 1968 1972 … … 1970 1974 if (getAllRecordsData.getAllType == IndexedDB::GetAllType::Values) { 1971 1975 Vector<uint8_t> buffer; 1972 sql ->getColumnBlobAsVector(0, buffer);1976 sql.getColumnBlobAsVector(0, buffer); 1973 1977 ThreadSafeDataBuffer resultBuffer = ThreadSafeDataBuffer::adoptVector(buffer); 1974 1978 1975 auto recordID = sql ->getColumnInt64(1);1979 auto recordID = sql.getColumnInt64(1); 1976 1980 1977 1981 ASSERT(recordID); … … 1987 1991 Vector<uint8_t> keyData; 1988 1992 IDBKeyData key; 1989 sql ->getColumnBlobAsVector(0, keyData);1993 sql.getColumnBlobAsVector(0, keyData); 1990 1994 1991 1995 if (!deserializeIDBKeyData(keyData.data(), keyData.size(), key)) { … … 1998 2002 1999 2003 ++returnedResults; 2000 sqlResult = sql ->step();2004 sqlResult = sql.step(); 2001 2005 } 2002 2006 … … 2123 2127 IDBError SQLiteIDBBackingStore::uncheckedGetKeyGeneratorValue(int64_t objectStoreID, uint64_t& outValue) 2124 2128 { 2125 auto* sql = cachedStatement(SQL::GetKeyGeneratorValue, ASCIILiteral("SELECT currentKey FROM KeyGenerators WHERE objectStoreID = ?;"));2126 if ( !sql2127 || sql ->bindInt64(1, objectStoreID) != SQLITE_OK) {2129 SQLiteStatement sql(*m_sqliteDB, ASCIILiteral("SELECT currentKey FROM KeyGenerators WHERE objectStoreID = ?;")); 2130 if (sql.prepare() != SQLITE_OK 2131 || sql.bindInt64(1, objectStoreID) != SQLITE_OK) { 2128 2132 LOG_ERROR("Could not retrieve currentKey from KeyGenerators table (%i) - %s", m_sqliteDB->lastError(), m_sqliteDB->lastErrorMsg()); 2129 2133 return { IDBDatabaseException::UnknownError, ASCIILiteral("Error getting current key generator value from database") }; 2130 2134 } 2131 int result = sql ->step();2135 int result = sql.step(); 2132 2136 if (result != SQLITE_ROW) { 2133 2137 LOG_ERROR("Could not retreive key generator value for object store, but it should be there."); … … 2135 2139 } 2136 2140 2137 int64_t value = sql ->getColumnInt64(0);2141 int64_t value = sql.getColumnInt64(0); 2138 2142 if (value < 0) 2139 2143 return { IDBDatabaseException::ConstraintError, "Current key generator value from database is invalid" }; … … 2145 2149 IDBError SQLiteIDBBackingStore::uncheckedSetKeyGeneratorValue(int64_t objectStoreID, uint64_t value) 2146 2150 { 2147 auto* sql = cachedStatement(SQL::SetKeyGeneratorValue, ASCIILiteral("INSERT INTO KeyGenerators VALUES (?, ?);"));2148 if ( !sql2149 || sql ->bindInt64(1, objectStoreID) != SQLITE_OK2150 || sql ->bindInt64(2, value) != SQLITE_OK2151 || sql ->step() != SQLITE_DONE) {2151 SQLiteStatement sql(*m_sqliteDB, ASCIILiteral("INSERT INTO KeyGenerators VALUES (?, ?);")); 2152 if (sql.prepare() != SQLITE_OK 2153 || sql.bindInt64(1, objectStoreID) != SQLITE_OK 2154 || sql.bindInt64(2, value) != SQLITE_OK 2155 || sql.step() != SQLITE_DONE) { 2152 2156 LOG_ERROR("Could not update key generator value (%i) - %s", m_sqliteDB->lastError(), m_sqliteDB->lastErrorMsg()); 2153 2157 return { IDBDatabaseException::ConstraintError, "Error storing new key generator value in database" }; … … 2353 2357 if (m_sqliteDB) { 2354 2358 m_sqliteDB->close(); 2355 closeSQLiteDB();2359 m_sqliteDB = nullptr; 2356 2360 } 2357 2361 … … 2367 2371 } 2368 2372 2369 SQLiteStatement* SQLiteIDBBackingStore::cachedStatement(SQLiteIDBBackingStore::SQL sql, const char* statement)2370 {2371 if (sql >= SQL::Count) {2372 LOG_ERROR("Invalid SQL statement ID passed to cachedStatement()");2373 return nullptr;2374 }2375 2376 if (m_cachedStatements[static_cast<size_t>(sql)]) {2377 if (m_cachedStatements[static_cast<size_t>(sql)]->reset() == SQLITE_OK)2378 return m_cachedStatements[static_cast<size_t>(sql)].get();2379 m_cachedStatements[static_cast<size_t>(sql)] = nullptr;2380 }2381 2382 if (m_sqliteDB) {2383 m_cachedStatements[static_cast<size_t>(sql)] = std::make_unique<SQLiteStatement>(*m_sqliteDB, statement);2384 if (m_cachedStatements[static_cast<size_t>(sql)]->prepare() != SQLITE_OK)2385 m_cachedStatements[static_cast<size_t>(sql)] = nullptr;2386 }2387 2388 return m_cachedStatements[static_cast<size_t>(sql)].get();2389 }2390 2391 void SQLiteIDBBackingStore::closeSQLiteDB()2392 {2393 for (size_t i = 0; i < static_cast<int>(SQL::Count); ++i)2394 m_cachedStatements[i] = nullptr;2395 2396 m_sqliteDB = nullptr;2397 }2398 2399 2373 } // namespace IDBServer 2400 2374 } // namespace WebCore -
trunk/Source/WebCore/Modules/indexeddb/server/SQLiteIDBBackingStore.h
r209096 r209117 40 40 class IndexKey; 41 41 class SQLiteDatabase; 42 class SQLiteStatement;43 42 44 43 namespace IDBServer { … … 118 117 IDBError getAllIndexRecords(const IDBResourceIdentifier& transactionIdentifier, const IDBGetAllRecordsData&, IDBGetAllResult& outValue); 119 118 120 void closeSQLiteDB();121 122 enum class SQL : size_t {123 CreateObjectStoreInfo,124 CreateObjectStoreKeyGenerator,125 DeleteObjectStoreInfo,126 DeleteObjectStoreKeyGenerator,127 DeleteObjectStoreRecords,128 DeleteObjectStoreIndexInfo,129 DeleteObjectStoreIndexRecords,130 DeleteObjectStoreBlobRecords,131 RenameObjectStore,132 ClearObjectStoreRecords,133 ClearObjectStoreIndexRecords,134 CreateIndexInfo,135 DeleteIndexInfo,136 HasIndexRecord,137 PutIndexRecord,138 DeleteIndexRecords,139 RenameIndex,140 KeyExistsInObjectStore,141 GetUnusedBlobFilenames,142 DeleteUnusedBlobs,143 GetObjectStoreRecordID,144 DeleteBlobRecord,145 DeleteObjectStoreRecord,146 DeleteObjectStoreIndexRecord,147 AddObjectStoreRecord,148 AddBlobRecord,149 BlobFilenameForBlobURL,150 AddBlobFilename,151 GetBlobURL,152 GetKeyGeneratorValue,153 SetKeyGeneratorValue,154 GetAllKeyRecordsLowerOpenUpperOpen,155 GetAllKeyRecordsLowerOpenUpperClosed,156 GetAllKeyRecordsLowerClosedUpperOpen,157 GetAllKeyRecordsLowerClosedUpperClosed,158 GetValueRecordsLowerOpenUpperOpen,159 GetValueRecordsLowerOpenUpperClosed,160 GetValueRecordsLowerClosedUpperOpen,161 GetValueRecordsLowerClosedUpperClosed,162 Count163 };164 165 SQLiteStatement* cachedStatement(SQL, const char*);166 SQLiteStatement* cachedStatementForGetAllObjectStoreRecords(const IDBGetAllRecordsData&);167 168 std::unique_ptr<SQLiteStatement> m_cachedStatements[static_cast<int>(SQL::Count)];169 170 119 JSC::VM& vm(); 171 120 JSC::JSGlobalObject& globalObject();
Note: See TracChangeset
for help on using the changeset viewer.