void StorageAreaSync::performImport() { ASSERT(!isMainThread()); ASSERT(!m_database.isOpen()); String databaseFilename = m_syncManager->fullDatabaseFilename(m_storageArea->securityOrigin()); if (databaseFilename.isEmpty()) { LOG_ERROR("Filename for local storage database is empty - cannot open for persistent storage"); markImported(); return; } if (!m_database.open(databaseFilename)) { LOG_ERROR("Failed to open database file %s for local storage", databaseFilename.utf8().data()); markImported(); return; } if (!m_database.executeCommand("CREATE TABLE IF NOT EXISTS ItemTable (key TEXT UNIQUE ON CONFLICT REPLACE, value TEXT NOT NULL ON CONFLICT FAIL)")) { LOG_ERROR("Failed to create table ItemTable for local storage"); markImported(); return; } SQLiteStatement query(m_database, "SELECT key, value FROM ItemTable"); if (query.prepare() != SQLResultOk) { LOG_ERROR("Unable to select items from ItemTable for local storage"); markImported(); return; } HashMap<String, String> itemMap; int result = query.step(); while (result == SQLResultRow) { itemMap.set(query.getColumnText(0), query.getColumnText(1)); result = query.step(); } if (result != SQLResultDone) { LOG_ERROR("Error reading items from ItemTable for local storage"); markImported(); return; } MutexLocker locker(m_importLock); HashMap<String, String>::iterator it = itemMap.begin(); HashMap<String, String>::iterator end = itemMap.end(); for (; it != end; ++it) m_storageArea->importItem(it->first, it->second); // Break the (ref count) cycle. m_storageArea = 0; m_importComplete = true; m_importCondition.signal(); }
void StorageAreaSync::openDatabase(OpenDatabaseParamType openingStrategy) { ASSERT(!isMainThread()); ASSERT(!m_database.isOpen()); ASSERT(!m_databaseOpenFailed); SQLiteTransactionInProgressAutoCounter transactionCounter; String databaseFilename = m_syncManager->fullDatabaseFilename(m_databaseIdentifier); if (!fileExists(databaseFilename) && openingStrategy == SkipIfNonExistent) return; if (databaseFilename.isEmpty()) { LOG_ERROR("Filename for local storage database is empty - cannot open for persistent storage"); markImported(); m_databaseOpenFailed = true; return; } // A StorageTracker thread may have been scheduled to delete the db we're // reopening, so cancel possible deletion. StorageTracker::tracker().cancelDeletingOrigin(m_databaseIdentifier); if (!m_database.open(databaseFilename)) { LOG_ERROR("Failed to open database file %s for local storage", databaseFilename.utf8().data()); markImported(); m_databaseOpenFailed = true; return; } migrateItemTableIfNeeded(); if (!m_database.executeCommand("CREATE TABLE IF NOT EXISTS ItemTable (key TEXT UNIQUE ON CONFLICT REPLACE, value BLOB NOT NULL ON CONFLICT FAIL)")) { LOG_ERROR("Failed to create table ItemTable for local storage"); markImported(); m_databaseOpenFailed = true; return; } StorageTracker::tracker().setOriginDetails(m_databaseIdentifier, databaseFilename); }
void StorageAreaSync::performImport() { ASSERT(!isMainThread()); ASSERT(!m_database.isOpen()); openDatabase(SkipIfNonExistent); if (!m_database.isOpen()) { markImported(); return; } SQLiteStatement query(m_database, "SELECT key, value FROM ItemTable"); if (query.prepare() != SQLResultOk) { LOG_ERROR("Unable to select items from ItemTable for local storage"); markImported(); return; } HashMap<String, String> itemMap; int result = query.step(); while (result == SQLResultRow) { itemMap.set(query.getColumnText(0), query.getColumnBlobAsString(1)); result = query.step(); } if (result != SQLResultDone) { LOG_ERROR("Error reading items from ItemTable for local storage"); markImported(); return; } HashMap<String, String>::iterator it = itemMap.begin(); HashMap<String, String>::iterator end = itemMap.end(); for (; it != end; ++it) m_storageArea->importItem(it->first, it->second); markImported(); }
void StorageAreaSync::performImport() { ASSERT(!isMainThread()); ASSERT(!m_database.isOpen()); openDatabase(SkipIfNonExistent); if (!m_database.isOpen()) { markImported(); return; } SQLiteStatement query(m_database, "SELECT key, value FROM ItemTable"); if (query.prepare() != SQLITE_OK) { LOG_ERROR("Unable to select items from ItemTable for local storage"); markImported(); return; } HashMap<String, String> itemMap; int result = query.step(); while (result == SQLITE_ROW) { itemMap.set(query.getColumnText(0), query.getColumnBlobAsString(1)); result = query.step(); } if (result != SQLITE_DONE) { LOG_ERROR("Error reading items from ItemTable for local storage"); markImported(); return; } m_storageArea->importItems(itemMap); markImported(); }