Diff
Modified: trunk/Source/WebCore/ChangeLog (202821 => 202822)
--- trunk/Source/WebCore/ChangeLog 2016-07-05 18:04:28 UTC (rev 202821)
+++ trunk/Source/WebCore/ChangeLog 2016-07-05 18:05:31 UTC (rev 202822)
@@ -1,5 +1,17 @@
2016-07-05 Brady Eidson <[email protected]>
+ Database process crashes deleting a corrupt SQLite database file (null deref).
+ https://bugs.webkit.org/show_bug.cgi?id=155506.
+
+ Reviewed by Alex Christensen.
+
+ Covered by new API test.
+
+ * Modules/indexeddb/server/SQLiteIDBBackingStore.cpp:
+ (WebCore::IDBServer::SQLiteIDBBackingStore::deleteBackingStore): Null check.
+
+2016-07-05 Brady Eidson <[email protected]>
+
TransactionOperations can get destroyed on the wrong thread.
https://bugs.webkit.org/show_bug.cgi?id=159103
Modified: trunk/Source/WebCore/Modules/indexeddb/server/SQLiteIDBBackingStore.cpp (202821 => 202822)
--- trunk/Source/WebCore/Modules/indexeddb/server/SQLiteIDBBackingStore.cpp 2016-07-05 18:04:28 UTC (rev 202821)
+++ trunk/Source/WebCore/Modules/indexeddb/server/SQLiteIDBBackingStore.cpp 2016-07-05 18:05:31 UTC (rev 202822)
@@ -2056,16 +2056,18 @@
{
bool errored = true;
- SQLiteStatement sql(*m_sqliteDB, ASCIILiteral("SELECT fileName FROM BlobFiles;"));
- if (sql.prepare() == SQLITE_OK) {
- int result = sql.step();
- while (result == SQLITE_ROW) {
- blobFiles.append(sql.getColumnText(0));
- result = sql.step();
+ if (m_sqliteDB) {
+ SQLiteStatement sql(*m_sqliteDB, ASCIILiteral("SELECT fileName FROM BlobFiles;"));
+ if (sql.prepare() == SQLITE_OK) {
+ int result = sql.step();
+ while (result == SQLITE_ROW) {
+ blobFiles.append(sql.getColumnText(0));
+ result = sql.step();
+ }
+
+ if (result == SQLITE_DONE)
+ errored = false;
}
-
- if (result == SQLITE_DONE)
- errored = false;
}
if (errored)
Modified: trunk/Tools/ChangeLog (202821 => 202822)
--- trunk/Tools/ChangeLog 2016-07-05 18:04:28 UTC (rev 202821)
+++ trunk/Tools/ChangeLog 2016-07-05 18:05:31 UTC (rev 202822)
@@ -1,3 +1,17 @@
+2016-07-05 Brady Eidson <[email protected]>
+
+ Database process crashes deleting a corrupt SQLite database file (null deref).
+ https://bugs.webkit.org/show_bug.cgi?id=155506.
+
+ Reviewed by Alex Christensen.
+
+ * TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj:
+ * TestWebKitAPI/Tests/WebKit2Cocoa/IDBDeleteRecovery.html: Added.
+ * TestWebKitAPI/Tests/WebKit2Cocoa/IDBDeleteRecovery.mm: Added.
+ * TestWebKitAPI/Tests/WebKit2Cocoa/IDBDeleteRecovery.sqlite3: Added.
+ * TestWebKitAPI/Tests/WebKit2Cocoa/IDBDeleteRecovery.sqlite3-shm: Added.
+ * TestWebKitAPI/Tests/WebKit2Cocoa/IDBDeleteRecovery.sqlite3-wal: Added.
+
2016-07-05 Alexey Proskuryakov <[email protected]>
run-webkit-tests should print more complete baseline search paths
Modified: trunk/Tools/TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj (202821 => 202822)
--- trunk/Tools/TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj 2016-07-05 18:04:28 UTC (rev 202821)
+++ trunk/Tools/TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj 2016-07-05 18:05:31 UTC (rev 202822)
@@ -64,6 +64,11 @@
37DC6791140D7D7600ABCCDB /* DOMRangeOfString.html in Copy Resources */ = {isa = PBXBuildFile; fileRef = 37DC678F140D7D3A00ABCCDB /* DOMRangeOfString.html */; };
37E1064C1697681800B78BD0 /* DOMHTMLTableCellElementCellAbove.html in Copy Resources */ = {isa = PBXBuildFile; fileRef = 37E1064B169767F700B78BD0 /* DOMHTMLTableCellElementCellAbove.html */; };
4BFDFFA71314776C0061F24B /* HitTestResultNodeHandle_Bundle.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4BFDFFA61314776C0061F24B /* HitTestResultNodeHandle_Bundle.cpp */; };
+ 510477721D298DDD009747EB /* IDBDeleteRecovery.sqlite3 in Copy Resources */ = {isa = PBXBuildFile; fileRef = 5104776F1D298D85009747EB /* IDBDeleteRecovery.sqlite3 */; };
+ 510477731D298DDD009747EB /* IDBDeleteRecovery.sqlite3-shm in Copy Resources */ = {isa = PBXBuildFile; fileRef = 510477701D298D85009747EB /* IDBDeleteRecovery.sqlite3-shm */; };
+ 510477741D298DDD009747EB /* IDBDeleteRecovery.sqlite3-wal in Copy Resources */ = {isa = PBXBuildFile; fileRef = 510477711D298D85009747EB /* IDBDeleteRecovery.sqlite3-wal */; };
+ 510477771D298E72009747EB /* IDBDeleteRecovery.html in Copy Resources */ = {isa = PBXBuildFile; fileRef = 510477761D298E57009747EB /* IDBDeleteRecovery.html */; };
+ 510477781D29923B009747EB /* IDBDeleteRecovery.mm in Sources */ = {isa = PBXBuildFile; fileRef = 510477751D298E03009747EB /* IDBDeleteRecovery.mm */; };
51393E221523952D005F39C5 /* DOMWindowExtensionBasic_Bundle.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 51393E1D1523944A005F39C5 /* DOMWindowExtensionBasic_Bundle.cpp */; };
5142B2731517C8C800C32B19 /* ContextMenuCanCopyURL.html in Copy Resources */ = {isa = PBXBuildFile; fileRef = 5142B2721517C89100C32B19 /* ContextMenuCanCopyURL.html */; };
51714EB41CF8C78C004723C4 /* WebProcessKillIDBCleanup-1.html in Copy Resources */ = {isa = PBXBuildFile; fileRef = 51714EB21CF8C761004723C4 /* WebProcessKillIDBCleanup-1.html */; };
@@ -473,6 +478,10 @@
dstSubfolderSpec = 7;
files = (
51A587851D2739E3004BA9AF /* IndexedDBDatabaseProcessKill-1.html in Copy Resources */,
+ 510477771D298E72009747EB /* IDBDeleteRecovery.html in Copy Resources */,
+ 510477721D298DDD009747EB /* IDBDeleteRecovery.sqlite3 in Copy Resources */,
+ 510477731D298DDD009747EB /* IDBDeleteRecovery.sqlite3-shm in Copy Resources */,
+ 510477741D298DDD009747EB /* IDBDeleteRecovery.sqlite3-wal in Copy Resources */,
51A5877D1D1B49CD004BA9AF /* IndexedDBMultiProcess-3.html in Copy Resources */,
9984FACE1CFFB090008D198C /* editable-body.html in Copy Resources */,
51714EB41CF8C78C004723C4 /* WebProcessKillIDBCleanup-1.html in Copy Resources */,
@@ -692,6 +701,11 @@
4BB4160316815F9100824238 /* ElementAtPointInWebFrame.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = ElementAtPointInWebFrame.mm; sourceTree = "<group>"; };
4BFDFFA61314776C0061F24B /* HitTestResultNodeHandle_Bundle.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = HitTestResultNodeHandle_Bundle.cpp; sourceTree = "<group>"; };
4BFDFFA8131477770061F24B /* HitTestResultNodeHandle.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = HitTestResultNodeHandle.cpp; sourceTree = "<group>"; };
+ 5104776F1D298D85009747EB /* IDBDeleteRecovery.sqlite3 */ = {isa = PBXFileReference; lastKnownFileType = file; path = IDBDeleteRecovery.sqlite3; sourceTree = "<group>"; };
+ 510477701D298D85009747EB /* IDBDeleteRecovery.sqlite3-shm */ = {isa = PBXFileReference; lastKnownFileType = file; path = "IDBDeleteRecovery.sqlite3-shm"; sourceTree = "<group>"; };
+ 510477711D298D85009747EB /* IDBDeleteRecovery.sqlite3-wal */ = {isa = PBXFileReference; lastKnownFileType = file; path = "IDBDeleteRecovery.sqlite3-wal"; sourceTree = "<group>"; };
+ 510477751D298E03009747EB /* IDBDeleteRecovery.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = IDBDeleteRecovery.mm; sourceTree = "<group>"; };
+ 510477761D298E57009747EB /* IDBDeleteRecovery.html */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.html; path = IDBDeleteRecovery.html; sourceTree = "<group>"; };
51393E1D1523944A005F39C5 /* DOMWindowExtensionBasic_Bundle.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = DOMWindowExtensionBasic_Bundle.cpp; sourceTree = "<group>"; };
51393E1E1523944A005F39C5 /* DOMWindowExtensionBasic.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = DOMWindowExtensionBasic.cpp; sourceTree = "<group>"; };
5142B2701517C88B00C32B19 /* ContextMenuCanCopyURL.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = ContextMenuCanCopyURL.mm; sourceTree = "<group>"; };
@@ -1157,6 +1171,7 @@
2D1FE0AF1AD465C1006CD9E6 /* FixedLayoutSize.mm */,
CDE195B31CFE0ADE0053D256 /* FullscreenTopContentInset.mm */,
51A587841D272EF3004BA9AF /* IndexedDBDatabaseProcessKill.mm */,
+ 510477751D298E03009747EB /* IDBDeleteRecovery.mm */,
51BCEE491C84F4AF0042C82E /* IndexedDBMultiProcess.mm */,
51B1EE8D1C80F5880064FB98 /* IndexedDBPersistence.mm */,
37D36ED61AF42ECD00BAF5D9 /* LoadAlternateHTMLString.mm */,
@@ -1264,6 +1279,10 @@
5714ECBC1CA8C21800051AC8 /* DownloadRequestOriginalURL2.html */,
5714ECBA1CA8BFD100051AC8 /* DownloadRequestOriginalURLFrame.html */,
51A587821D272EB5004BA9AF /* IndexedDBDatabaseProcessKill-1.html */,
+ 510477761D298E57009747EB /* IDBDeleteRecovery.html */,
+ 5104776F1D298D85009747EB /* IDBDeleteRecovery.sqlite3 */,
+ 510477701D298D85009747EB /* IDBDeleteRecovery.sqlite3-shm */,
+ 510477711D298D85009747EB /* IDBDeleteRecovery.sqlite3-wal */,
51BCEE4C1C84F52C0042C82E /* IndexedDBMultiProcess-1.html */,
51BCEE4D1C84F52C0042C82E /* IndexedDBMultiProcess-2.html */,
51A5877C1D1B3D8D004BA9AF /* IndexedDBMultiProcess-3.html */,
@@ -2004,6 +2023,7 @@
7CCE7EE41A411AE600447C4C /* AboutBlankLoad.cpp in Sources */,
7CCE7EB31A411A7E00447C4C /* AcceptsFirstMouse.mm in Sources */,
7CCE7EB41A411A7E00447C4C /* AttributedString.mm in Sources */,
+ 510477781D29923B009747EB /* IDBDeleteRecovery.mm in Sources */,
7CCE7EB51A411A7E00447C4C /* BackForwardList.mm in Sources */,
7CCE7EDC1A411A9200447C4C /* CalculationValue.cpp in Sources */,
7C83E0BA1D0A64FB00FEBCF3 /* Coding.mm in Sources */,
Added: trunk/Tools/TestWebKitAPI/Tests/WebKit2Cocoa/IDBDeleteRecovery.html (0 => 202822)
--- trunk/Tools/TestWebKitAPI/Tests/WebKit2Cocoa/IDBDeleteRecovery.html (rev 0)
+++ trunk/Tools/TestWebKitAPI/Tests/WebKit2Cocoa/IDBDeleteRecovery.html 2016-07-05 18:05:31 UTC (rev 202822)
@@ -0,0 +1,14 @@
+<script>
+
+var request = window.indexedDB.deleteDatabase("IDBDeleteRecovery");
+
+request._onsuccess_ = function(e)
+{
+ window.webkit.messageHandlers.testHandler.postMessage('Deleted database');
+}
+request._onerror_ = function(e)
+{
+ // Unexpected error
+ window.webkit.messageHandlers.testHandler.postMessage('Error deleting database');
+}
+</script>
Added: trunk/Tools/TestWebKitAPI/Tests/WebKit2Cocoa/IDBDeleteRecovery.mm (0 => 202822)
--- trunk/Tools/TestWebKitAPI/Tests/WebKit2Cocoa/IDBDeleteRecovery.mm (rev 0)
+++ trunk/Tools/TestWebKitAPI/Tests/WebKit2Cocoa/IDBDeleteRecovery.mm 2016-07-05 18:05:31 UTC (rev 202822)
@@ -0,0 +1,89 @@
+/*
+ * Copyright (C) 2016 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#import "config.h"
+
+#import "PlatformUtilities.h"
+#import "Test.h"
+#import <WebKit/WKProcessPoolPrivate.h>
+#import <WebKit/WKUserContentControllerPrivate.h>
+#import <WebKit/WKWebViewConfigurationPrivate.h>
+#import <WebKit/WebKit.h>
+#import <WebKit/_WKProcessPoolConfiguration.h>
+#import <WebKit/_WKUserStyleSheet.h>
+#import <wtf/RetainPtr.h>
+
+#if WK_API_ENABLED
+
+static bool receivedScriptMessage;
+static RetainPtr<WKScriptMessage> lastScriptMessage;
+
+@interface IDBDeleteRecoveryMessageHandler : NSObject <WKScriptMessageHandler>
+@end
+
+@implementation IDBDeleteRecoveryMessageHandler
+
+- (void)userContentController:(WKUserContentController *)userContentController didReceiveScriptMessage:(WKScriptMessage *)message
+{
+ receivedScriptMessage = true;
+ lastScriptMessage = message;
+}
+
+@end
+
+TEST(IndexedDB, DeleteRecovery)
+{
+ RetainPtr<IDBDeleteRecoveryMessageHandler> handler = adoptNS([[IDBDeleteRecoveryMessageHandler alloc] init]);
+ RetainPtr<WKWebViewConfiguration> configuration = adoptNS([[WKWebViewConfiguration alloc] init]);
+ [[configuration userContentController] addScriptMessageHandler:handler.get() name:@"testHandler"];
+
+ // Allow file URLs to load non-file resources
+ [configuration _setAllowUniversalAccessFromFileURLs:YES];
+
+ [configuration.get().processPool _terminateDatabaseProcess];
+
+ // Copy the inconsistent database files to the database directory
+ NSURL *url1 = [[NSBundle mainBundle] URLForResource:@"IDBDeleteRecovery" withExtension:@"sqlite3" subdirectory:@"TestWebKitAPI.resources"];
+ NSURL *url2 = [[NSBundle mainBundle] URLForResource:@"IDBDeleteRecovery" withExtension:@"sqlite3-shm" subdirectory:@"TestWebKitAPI.resources"];
+ NSURL *url3 = [[NSBundle mainBundle] URLForResource:@"IDBDeleteRecovery" withExtension:@"sqlite3-wal" subdirectory:@"TestWebKitAPI.resources"];
+
+ NSURL *targetURL = [NSURL fileURLWithPath:[@"~/Library/WebKit/TestWebKitAPI/WebsiteData/IndexedDB/file__0/IDBDeleteRecovery" stringByExpandingTildeInPath]];
+ [[NSFileManager defaultManager] createDirectoryAtURL:targetURL withIntermediateDirectories:YES attributes:nil error:nil];
+
+ [[NSFileManager defaultManager] copyItemAtURL:url1 toURL:[targetURL URLByAppendingPathComponent:@"IndexedDB.sqlite3"] error:nil];
+ [[NSFileManager defaultManager] copyItemAtURL:url2 toURL:[targetURL URLByAppendingPathComponent:@"IndexedDB.sqlite3-shm"] error:nil];
+ [[NSFileManager defaultManager] copyItemAtURL:url3 toURL:[targetURL URLByAppendingPathComponent:@"IndexedDB.sqlite3-wal"] error:nil];
+
+ RetainPtr<WKWebView> webView = adoptNS([[WKWebView alloc] initWithFrame:NSMakeRect(0, 0, 800, 600) configuration:configuration.get()]);
+
+ NSURLRequest *request = [NSURLRequest requestWithURL:[[NSBundle mainBundle] URLForResource:@"IDBDeleteRecovery" withExtension:@"html" subdirectory:@"TestWebKitAPI.resources"]];
+ [webView loadRequest:request];
+
+ TestWebKitAPI::Util::run(&receivedScriptMessage);
+
+ EXPECT_WK_STREQ(@"Deleted database", [lastScriptMessage body]);
+}
+
+#endif
Added: trunk/Tools/TestWebKitAPI/Tests/WebKit2Cocoa/IDBDeleteRecovery.sqlite3 (0 => 202822)
--- trunk/Tools/TestWebKitAPI/Tests/WebKit2Cocoa/IDBDeleteRecovery.sqlite3 (rev 0)
+++ trunk/Tools/TestWebKitAPI/Tests/WebKit2Cocoa/IDBDeleteRecovery.sqlite3 2016-07-05 18:05:31 UTC (rev 202822)
@@ -0,0 +1,2 @@
+SQLite format 3@ -\xE6+
\ No newline at end of file
Added: trunk/Tools/TestWebKitAPI/Tests/WebKit2Cocoa/IDBDeleteRecovery.sqlite3-shm (0 => 202822)
--- trunk/Tools/TestWebKitAPI/Tests/WebKit2Cocoa/IDBDeleteRecovery.sqlite3-shm (rev 0)
+++ trunk/Tools/TestWebKitAPI/Tests/WebKit2Cocoa/IDBDeleteRecovery.sqlite3-shm 2016-07-05 18:05:31 UTC (rev 202822)
@@ -0,0 +1,10 @@
+\xE2-(A\x9A\x83=\xF3NhG\xAB\xBCK=4\xEC\xDBu\xB3\x8DAI\xA8\xE2-(A\x9A\x83=\xF3NhG\xAB\xBCK=4\xEC\xDBu\xB3\x8DAI\xA8(\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF
++
+
+
+
+ +
+!
"
+
#
$
%
&
'
(
\ No newline at end of file
Added: trunk/Tools/TestWebKitAPI/Tests/WebKit2Cocoa/IDBDeleteRecovery.sqlite3-wal (0 => 202822)
--- trunk/Tools/TestWebKitAPI/Tests/WebKit2Cocoa/IDBDeleteRecovery.sqlite3-wal (rev 0)
+++ trunk/Tools/TestWebKitAPI/Tests/WebKit2Cocoa/IDBDeleteRecovery.sqlite3-wal 2016-07-05 18:05:31 UTC (rev 202822)
@@ -0,0 +1,100 @@
+7\x82-\xE2G\xAB\xBCK=4\x90\xEE\xAEZ}\xD1G\xAB\xBCK=4\xF2\x8E\xF1!`Y\xF2ySQLite format 3@ -\xE6+**
\x81S\x82}tableRecordsRecordsCREATE TABLE Records (objectStoreID INTEGER NOT NULL ON CONFLICT FAIL, key TEXT COLLATE IDBKEY NOT NULL ON CONFLICT FAIL, value NOT NULL ON CONFLICT FAIL, recordID INTEGER PRIMARY KEY)G\xAB\xBCK=4\x9C\xCFM\xB0`\xA4+
G\xAB\xBCK=4B\xCD;Oe|\x8A-SQLite format 3@ -\xE6+\xC8*\xC8
`%\x81+indexRecordsIndexRecordsCREATE UNIQUE INDEX RecordsIndex ON Records (objectStoreID, key)\x81S\x82}tableRecordsRecordsCREATE TABLE Records (objectStoreID INTEGER NOT NULL ON CONFLICT FAIL, key TEXT COLLATE IDBKEY NOT NULL ON CONFLICT FAIL, value NOT NULL ON CONFLICT FAIL, recordID INTEGER PRIMARY KEY)G\xAB\xBCK=4\xA2\x9A?G/1
+
G\xAB\xBCK=4\x85 jw\x89\x9FѳSQLite format 3@ -\xE6++\xC2*\xC8+\xC2
\x82%%\x83ItableIndexRecordsIndexRecordsCREATE TABLE IndexRecords (indexID INTEGER NOT NULL ON CONFLICT FAIL, objectStoreID INTEGER NOT NULL ON CONFLICT FAIL, key TEXT COLLATE IDBKEY NOT NULL ON CONFLICT FAIL, value TEXT COLLATE IDBKEY
NOT NULL ON CONFLICT FAIL)`%\x81+indexRecordsIndexRecordsCREATE UNIQUE INDEX RecordsIndex ON Records (objectStoreID, key)\x81S\x82}tableRecordsRecordsCREATE TABLE Records (objectStoreID INTEGER NOT NULL ON CONFLICT FAIL, key TEXT COLLATE IDBKEY NOT NULL ON CONFLICT FAIL, value NOT NULL ON CONFLICT FAIL, recordID INTEGER PRIMARY KEY)G\xAB\xBCK=4迆}\xC8 \xB6+
G\xAB\xBCK=4N+\x86$\xC1\xA2sLSQLite format 3@ -\xE6++)*\xC8+\xC2+)
\x81#
#\x81stableBlobRecordsBlobRecordsCREATE TABLE BlobRecords (objectStoreRow INTEGER NOT NULL ON CONFLICT FAIL, blobURL TEXT NOT NULL ON CONFLICT FAIL)\x82%%\x83ItableIndexRecordsIndexRecordsCREATE TABLE IndexRecords (indexID INTEGER NOT NULL ON CONFLICT FAIL, objectStoreID INTEGER NOT NULL ON CONFLICT FAIL, key TEXT COLLATE IDBKEY NOT NULL ON CONFLICT FAIL, value TEXT COLLATE IDBKEY NOT NULL ON CONFLICT FAIL)`%\x81+indexRecordsIndexRecordsCREATE UNIQUE INDEX RecordsIndex ON Records (objectStoreID, key)\x81S\x82}tableRecordsRecordsCREATE TABLE Records (objectStoreID INTEGER NOT NULL ON CONFLICT FAIL, key TEXT COLLATE IDBKEY NOT NULL ON CONFLICT FAIL, value NOT NULL ON CONFLICT FAIL, recordID INTEGER PRIMARY KEY)G\xAB\xBCK=4\x807E\xAE\xF2;+
G\xAB\xBCK=4\x9E\xD96Ը~\x87SQLite format 3@
-\xE6++%*\xC8+\xC2+)\xF2\xBF
\x817\x82=tableBlobFilesBlobFilesCREATE TABLE BlobFiles (blobURL TEXT NOT NULL ON CONFLICT FAIL UNIQUE ON CONFLICT FAIL, fileName TEXT NOT NULL ON CONFLICT FAIL UNIQUE ON CONFLICT FAIL)1Eindexsqlite_autoindex_BlobFiles_2BlobFiles1Eindexsqlite_autoindex_BlobFiles_1BlobFiles\x81##\x81stableBlobRecordsBlobRecordsCREATE TABLE BlobRecords (objectStoreRow INTEGER NOT NULL ON CONFLICT FAIL, blobURL TEXT NOT NULL ON CONFLICT FAIL)\x82%%\x83ItableIndexRecordsIndexRecordsCREATE TABLE IndexRecords (indexID INTEGER NOT NULL ON CONFLICT FAIL, objectStoreID INTEGER NOT NULL ON CONFLICT FAIL, key TEXT COLLATE IDBKEY NOT NULL ON CONFLICT FAIL, value TEXT COLLATE IDBKEY NOT NULL ON CONFLICT FAIL)`%\x81+indexRecordsIndexRecordsCREATE UNIQUE INDEX RecordsIndex ON Records (objectStoreID, key)\x81S\x82}tableRecordsRecordsCREATE TABLE Records (objec
tStoreID INTEGER NOT NULL ON CONFLICT FAIL, key TEXT COLLATE IDBKEY NOT NULL ON CONFLICT FAIL, value NOT NULL ON CONFLICT FAIL, recordID INTEGER PRIMARY KEY)G\xAB\xBCK=4\xAD\xC6hsm\xB5%j+
G\xAB\xBCK=41\x80'K\xA7\xAA`H
+
G\xAB\xBCK=4f\xD0D\x9B\xF0q\xFE
+
G\xAB\xBCK=4\xBF"&\xA4\xA3\xC5$uSQLite format 3@
+-\xE6++% *\xC8+\xC2+)\xF2\xBF\xC6
\x81-++\x82tableIDBDatabaseInfoIDBDatabaseInfo CREATE TABLE IDBDatabaseInfo (key TEXT NOT NULL ON CONFLICT FAIL UNIQUE ON CONFLICT REP
LACE, value TEXT NOT NULL ON CONFLICT FAIL)= Q+indexsqlite_autoindex_IDBDatabaseInfo_1IDBDatabaseInfo
+\x817\x82=tableBlobFilesBlobFilesCREATE TABLE BlobFiles (blobURL TEXT NOT NULL ON CONFLICT FAIL UNIQUE ON CONFLICT FAIL, fileName TEXT NOT NULL ON CONFLICT FAIL UNIQUE ON CONFLICT FAIL)1Eindexsqlite_autoindex_BlobFiles_2BlobFiles1Eindexsqlite_autoindex_BlobFiles_1BlobFiles\x81##\x81stableBlobRecordsBlobRecordsCREATE TABLE BlobRecords (objectStoreRow INTEGER NOT NULL ON CONFLICT FAIL, blobURL TEXT NOT NULL ON CONFLICT FAIL)\x82%%\x83ItableIndexRecordsIndexRecordsCREATE TABLE IndexRecords (indexID INTEGER NOT NULL ON CONFLICT FAIL, objectStoreID INTEGER NOT NULL ON CONFLICT FAIL, key TEXT COLLATE IDBKEY NOT NULL ON CONFLICT FAIL, value TEXT COLLATE IDBKEY NOT NULL ON CONFLICT FAIL)`%\x81+indexRecordsIndexRecordsCREATE UNIQUE INDEX RecordsIndex ON Records (objectStoreID, key)\x81S\x82}tableRecordsRecordsCREATE TABLE Records (objectStoreID INTEGER NOT NULL ON CONFLICT FAIL, key TEXT COLLATE IDBKEY NOT NULL ON CONFLICT FAIL, valu
e NOT NULL ON CONFLICT FAIL, recordID INTEGER PRIMARY KEY) G\xAB\xBCK=4\x9Dr\xADF\xE1\xAB~\xD8+
+
+G\xAB\xBCK=4M\xE8^21
+
G\xAB\xBCK=4z \/[\xB0\xDDlSQLite format 3@ +-\xE6++% E*\xC8+\xC2+)\xF2\xBF\xC6 E
+\xD7
+\x98
\x82P
+++\x84WtableObjectStoreInfoObjectStoreInfoCREATE 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)=Q+indexsqlite_autoindex_ObjectStoreInfo_2ObjectStoreInfo+=Q+indexsqlite_autoindex_ObjectStoreInfo_1ObjectStoreInfo\x81-++\x82tableIDBDatabaseInfoIDBDatabaseInfo CREATE TABLE IDBDatabaseInfo (key TEXT NOT NULL ON CONFLICT FAIL UNIQUE ON CONFLICT REPLACE, value TEXT NOT NULL ON CONFLICT FAIL)= Q+indexsqlite_autoindex_IDBDatabaseInfo_1IDBDatabaseInfo
+\x817\x82=tableBlobFilesBlobFilesCREATE TABLE BlobFiles (blobURL TEXT NOT NULL ON CONFLICT FAIL UNIQUE ON CONFLICT FAIL, fileName TEXT NOT NULL ON CONFLICT FAIL UNIQUE ON CONFLICT FAIL)1Eindexsqlite_autoindex_BlobFiles_2BlobFiles1Eindexsqlite_autoindex_BlobFiles_1BlobFiles\x81##\x81stableBlobRecordsBlobRecordsCREATE TABLE BlobRecords (objectStoreRow INTEGER NOT NULL ON CONFLICT FAIL, blobURL TEXT NOT NULL ON CONFLICT FAIL)\x82%%\x83ItableIndexRecordsIndexRecordsCREATE TABLE IndexRecords (indexID INTEGER NOT NULL ON CONFLICT FAIL, objectStoreID INTEGER NOT NULL ON CONFLICT FAIL, key TEXT COLLATE IDBKEY NOT NULL ON CONFLICT FAIL, value TEXT COLLATE IDBKEY NOT NULL ON CONFLICT FAIL)`%\x81+indexRecordsIndexRecordsCREATE UNIQUE INDEX RecordsIndex ON Records (objectStoreID, key)\x81S\x82}tableRecordsRecordsCREATE TABLE Records (objectStoreID INTEGER NOT NULL ON CONFLICT FAIL, key TEXT COLLATE IDBKEY NOT NULL ON CONFLICT FAIL, valu
e NOT NULL ON CONFLICT FAIL, recordID INTEGER PRIMARY KEY)G\xAB\xBCK=4\x87\xF5\xAA\xEDB\xFD\\x83+
G\xAB\xBCK=4V\xBF\xBC\xB5QB\xA5
+
++G\xAB\xBCK=4\xA5:+\xCC3\xDC\xEF
+
G\xAB\xBCK=4\x9D\xC6\xEBu\xBB HSQLite format 3@ -\xE6++%+*\xC8+\xC2+)\xF2\xBF\xC6 E
+\xD7
+\x98
\x824+\x847tableIndexInfoIndexInfoCRE
ATE 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)\x82P
+++\x84WtableObjectStoreInfoObjectStoreInfoCREATE 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)=Q+indexsqlite_autoindex_ObjectStoreInfo_2ObjectStoreInfo+=Q+indexsqlite_autoindex_ObjectStoreInfo_1ObjectStoreInfo\x81-++\x82tableIDBDatabaseInfoIDBDatabaseInfo CREATE TABLE IDBDatabaseInfo (key TEXT NOT NULL ON CONFLICT FAIL UNIQUE ON CONFLICT REPLACE, value TEXT NOT NULL ON CONFLICT FAIL)= Q+indexsqlite_autoindex_IDBDatabaseInfo_1IDBDatabaseInfo
+\x817\x82=tableBlobFilesBlobFilesCREATE TABLE BlobFiles (blobURL TEXT NOT NULL ON CONFLICT FAIL UNIQUE ON CONFLICT FAIL, fileName TEXT NOT NULL ON CONFLICT FAIL UNIQUE ON CONFLICT FAIL)1Eindexsqlite_autoindex_BlobFiles_2BlobFiles1Eindexsqlite_autoindex_BlobFiles_1BlobFiles\x81##\x81stableBlobRecordsBlobRecordsCREATE TABLE BlobRecords (objectStoreRow INTEGER NOT NULL ON CONFLICT FAIL, blobURL TEXT NOT NULL ON CONFLICT FAIL)\x82%%\x83ItableIndexRecordsIndexRecordsCREATE TABLE IndexRecords (indexID INTEGER NOT NULL ON CONFLICT FAIL, objectStoreID INTEGER NOT NULL ON CONFLICT FAIL, key TEXT COLLATE IDBKEY NOT NULL ON CONFLICT FAIL, value TEXT COLLATE IDBKEY NOT NULL ON CONFLICT FAIL)`%\x81+indexRecordsIndexRecordsCREATE UNIQUE INDEX RecordsIndex ON Records (objectStoreID, key)\x81S\x82}tableRecordsRecordsCREATE TABLE Records (objectStoreID INTEGER NOT NULL ON CONFLICT FAIL, key TEXT COLLATE IDBKEY NOT NULL ON CONFLICT FAIL, valu
e NOT NULL ON CONFLICT FAIL, recordID INTEGER PRIMARY KEY)G\xAB\xBCK=4\xB5\xF3{͈+
G\xAB\xBCK=4[4\xCB}(-\xB1zSQLite format 3@ -\xE6++%*\xC8+\xC2+)\xF2\xBF\xC6 E
+\xD7
+\x98\xD3
\x81<''\x827tableKeyGeneratorsKeyGeneratorsCREATE TABLE KeyGenerators (objectStoreID INTEGER NOT NULL ON CONFLICT FAIL UNIQUE ON CONFLICT REPLACE, currentKey INTEGER NOT NULL ON CONFLICT FAIL)9M'indexsqlite_autoindex_KeyGenerators_1KeyGenerators\x824+\x847tableIndexInfoI
ndexInfoCREATE 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)\x82P
+++\x84WtableObjectStoreInfoObjectStoreInfoCREATE 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)=Q+indexsqlite_autoindex_ObjectStoreInfo_2ObjectStoreInfo+=Q+indexsqlite_autoindex_ObjectStoreInfo_1ObjectStoreInfo\x81-++\x82tableIDBDatabaseInfoIDBDatabaseInfo CREATE TABLE IDBDatabaseInfo (key TEXT NOT NULL ON CONFLICT FAIL UNIQUE ON CONFLICT REPLACE, value TEXT NOT NULL ON CONFLICT FAIL)= Q+indexsqlite_autoindex_IDBDatabaseInfo_1IDBDatabaseInfo
+\x817\x82=tableBlobFilesBlobFilesCREATE TABLE BlobFiles (blobURL TEXT NOT NULL ON CONFLICT FAIL UNIQUE ON CONFLICT FAIL, fileName TEXT NOT NULL ON CONFLICT FAIL UNIQUE ON CONFLICT FAIL)1Eindexsqlite_autoindex_BlobFiles_2BlobFiles1Eindexsqlite_autoindex_BlobFiles_1BlobFiles\x81##\x81stableBlobRecordsBlobRecordsCREATE TABLE BlobRecords (objectStoreRow INTEGER NOT NULL ON CONFLICT FAIL, blobURL TEXT NOT NULL ON CONFLICT FAIL)\x82%%\x83ItableIndexRecordsIndexRecordsCREATE TABLE IndexRecords (indexID INTEGER NOT NULL ON CONFLICT FAIL, objectStoreID INTEGER NOT NULL ON CONFLICT FAIL, key TEXT COLLATE IDBKEY NOT NULL ON CONFLICT FAIL, value TEXT COLLATE IDBKEY NOT NULL ON CONFLICT FAIL)`%\x81+indexRecordsIndexRecordsCREATE UNIQUE INDEX RecordsIndex ON Records (objectStoreID, key)\x81S\x82}tableRecordsRecordsCREATE TABLE Records (objectStoreID INTEGER NOT NULL ON CONFLICT FAIL, key TEXT COLLATE IDBKEY NOT NULL ON CONFLICT FAIL, valu
e NOT NULL ON CONFLICT FAIL, recordID INTEGER PRIMARY KEY)G\xAB\xBCK=4\xE2s\x93\xE4\xF1˹+
G\xAB\xBCK=4\xEA݊\x89@\xF9c
+
G\xAB\xBCK=4\xBC\xE7(`\+\x8BR+\xEB\xEB
+MetadataVersion1
+G\xAB\xBCK=4sEQL\xECA\x92
+\xED\xED
+ MetadataVersion G\xAB\xBCK=4Q\xA6/\xAB'\xA7\xF4\xA2+\xC5\xEB\xC5
$%7DatabaseNameIndexedDBMultiProcess+MetadataVersion1
+G\xAB\xBCK=4\xB7]O\xD0:j\xF4
+\xDC\xDC\xED
%DatabaseName+ MetadataVersion G\xAB\xBCK=4\xECȭp\xC0'\x91+\xB0\xEB\xC5\xB0
+DatabaseVersion0$%7DatabaseNameIndexedDBMultiProcess+MetadataVersion1
+G\xAB\xBCK=4\xED\xF5\xCD\xC4\xEC\xB7e<
+\xC8\xDC\xC8\xED
+DatabaseVersion%DatabaseName+ MetadataVersion G\xAB\xBCK=4\xE3/.x\xCC\xCA\xC0+\x9A\xEB\xC5\xB0\x9A
-MaxObjectStoreID1+DatabaseVersion0$%7DatabaseNameIndexedDBMultiProcess+MetadataVersion1
+G\xAB\xBCK=4\xFF$-\x82\xBA\xED#\xD0
+\xB3\xDC\xC8\xB3\xED
-MaxObjectStoreID+DatabaseVersion%DatabaseName+ MetadataVersionG\xAB\xBCK=4\xB2\xDF\xDB\xC2'\x9C\xB3p+\x9E\x9E
` \x81)$bplist00\xD3TtypeVstringTnullSfoo "&'\x80barG\xAB\xBCK=4`_PӇ/\xF6
+\xAC\xAC
S \x81) bplist00\xD3TtypeVstringTnullSfoo "&' G\xAB\xBCK=4D\xB0\x886+3+\x9A\xEB\xC5\xB0\x9A
-MaxObjectStoreID1+DatabaseVersion2$%7DatabaseNameIndexedDBMultiProcess+MetadataVersion1G\xAB\xBCK=4\x94\xBF\xACh\xFA_ +\xB4\xB4
J+vTestObjectStorebplist00\xD1TtypeG\xAB\xBCK=4\xE5\x9E^\xAFsG
+\xFC\xFC
+G\xAB\xBCK=4\xB4j3ˤ\xE9\xC0\x96
+\xED\xED
+ TestObjectStoreG\xAB\xBCK=4Hji\xC4eo+\xFB\xFB
G\xAB\xBCK=4\x83\x9AAhN\xF3=
+\xFC\xFC
\ No newline at end of file