| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (C) 2011 Google Inc. All rights reserved. | 2 * Copyright (C) 2011 Google Inc. All rights reserved. |
| 3 * Copyright (C) 2013 Apple Inc. All rights reserved. | 3 * Copyright (C) 2013 Apple Inc. All rights reserved. |
| 4 * | 4 * |
| 5 * Redistribution and use in source and binary forms, with or without | 5 * Redistribution and use in source and binary forms, with or without |
| 6 * modification, are permitted provided that the following conditions | 6 * modification, are permitted provided that the following conditions |
| 7 * are met: | 7 * are met: |
| 8 * | 8 * |
| 9 * 1. Redistributions of source code must retain the above copyright | 9 * 1. Redistributions of source code must retain the above copyright |
| 10 * notice, this list of conditions and the following disclaimer. | 10 * notice, this list of conditions and the following disclaimer. |
| (...skipping 292 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 303 bool DatabaseBackendBase::performOpenAndVerify(bool shouldSetVersionInNewDatabas
e, DatabaseError& error, String& errorMessage) | 303 bool DatabaseBackendBase::performOpenAndVerify(bool shouldSetVersionInNewDatabas
e, DatabaseError& error, String& errorMessage) |
| 304 { | 304 { |
| 305 DoneCreatingDatabaseOnExitCaller onExitCaller(this); | 305 DoneCreatingDatabaseOnExitCaller onExitCaller(this); |
| 306 ASSERT(errorMessage.isEmpty()); | 306 ASSERT(errorMessage.isEmpty()); |
| 307 ASSERT(error == DatabaseError::None); // Better not have any errors already. | 307 ASSERT(error == DatabaseError::None); // Better not have any errors already. |
| 308 error = DatabaseError::InvalidDatabaseState; // Presumed failure. We'll clea
r it if we succeed below. | 308 error = DatabaseError::InvalidDatabaseState; // Presumed failure. We'll clea
r it if we succeed below. |
| 309 | 309 |
| 310 const int maxSqliteBusyWaitTime = 30000; | 310 const int maxSqliteBusyWaitTime = 30000; |
| 311 | 311 |
| 312 if (!m_sqliteDatabase.open(m_filename, true)) { | 312 if (!m_sqliteDatabase.open(m_filename, true)) { |
| 313 reportOpenDatabaseResult(1, INVALID_STATE_ERR, m_sqliteDatabase.lastErro
r()); | 313 reportOpenDatabaseResult(1, InvalidStateError, m_sqliteDatabase.lastErro
r()); |
| 314 errorMessage = formatErrorMessage("unable to open database", m_sqliteDat
abase.lastError(), m_sqliteDatabase.lastErrorMsg()); | 314 errorMessage = formatErrorMessage("unable to open database", m_sqliteDat
abase.lastError(), m_sqliteDatabase.lastErrorMsg()); |
| 315 return false; | 315 return false; |
| 316 } | 316 } |
| 317 if (!m_sqliteDatabase.turnOnIncrementalAutoVacuum()) | 317 if (!m_sqliteDatabase.turnOnIncrementalAutoVacuum()) |
| 318 LOG_ERROR("Unable to turn on incremental auto-vacuum (%d %s)", m_sqliteD
atabase.lastError(), m_sqliteDatabase.lastErrorMsg()); | 318 LOG_ERROR("Unable to turn on incremental auto-vacuum (%d %s)", m_sqliteD
atabase.lastError(), m_sqliteDatabase.lastErrorMsg()); |
| 319 | 319 |
| 320 m_sqliteDatabase.setBusyTimeout(maxSqliteBusyWaitTime); | 320 m_sqliteDatabase.setBusyTimeout(maxSqliteBusyWaitTime); |
| 321 | 321 |
| 322 String currentVersion; | 322 String currentVersion; |
| 323 { | 323 { |
| (...skipping 18 matching lines...) Expand all Loading... |
| 342 currentVersion = versionFromDatabase; | 342 currentVersion = versionFromDatabase; |
| 343 updateGuidVersionMap(m_guid, currentVersion); | 343 updateGuidVersionMap(m_guid, currentVersion); |
| 344 } | 344 } |
| 345 m_sqliteDatabase.setBusyTimeout(maxSqliteBusyWaitTime); | 345 m_sqliteDatabase.setBusyTimeout(maxSqliteBusyWaitTime); |
| 346 } else { | 346 } else { |
| 347 LOG(StorageAPI, "No cached version for guid %i", m_guid); | 347 LOG(StorageAPI, "No cached version for guid %i", m_guid); |
| 348 | 348 |
| 349 SQLiteTransaction transaction(m_sqliteDatabase); | 349 SQLiteTransaction transaction(m_sqliteDatabase); |
| 350 transaction.begin(); | 350 transaction.begin(); |
| 351 if (!transaction.inProgress()) { | 351 if (!transaction.inProgress()) { |
| 352 reportOpenDatabaseResult(2, INVALID_STATE_ERR, m_sqliteDatabase.
lastError()); | 352 reportOpenDatabaseResult(2, InvalidStateError, m_sqliteDatabase.
lastError()); |
| 353 errorMessage = formatErrorMessage("unable to open database, fail
ed to start transaction", m_sqliteDatabase.lastError(), m_sqliteDatabase.lastErr
orMsg()); | 353 errorMessage = formatErrorMessage("unable to open database, fail
ed to start transaction", m_sqliteDatabase.lastError(), m_sqliteDatabase.lastErr
orMsg()); |
| 354 m_sqliteDatabase.close(); | 354 m_sqliteDatabase.close(); |
| 355 return false; | 355 return false; |
| 356 } | 356 } |
| 357 | 357 |
| 358 String tableName(infoTableName); | 358 String tableName(infoTableName); |
| 359 if (!m_sqliteDatabase.tableExists(tableName)) { | 359 if (!m_sqliteDatabase.tableExists(tableName)) { |
| 360 m_new = true; | 360 m_new = true; |
| 361 | 361 |
| 362 if (!m_sqliteDatabase.executeCommand("CREATE TABLE " + tableName
+ " (key TEXT NOT NULL ON CONFLICT FAIL UNIQUE ON CONFLICT REPLACE,value TEXT N
OT NULL ON CONFLICT FAIL);")) { | 362 if (!m_sqliteDatabase.executeCommand("CREATE TABLE " + tableName
+ " (key TEXT NOT NULL ON CONFLICT FAIL UNIQUE ON CONFLICT REPLACE,value TEXT N
OT NULL ON CONFLICT FAIL);")) { |
| 363 reportOpenDatabaseResult(3, INVALID_STATE_ERR, m_sqliteDatab
ase.lastError()); | 363 reportOpenDatabaseResult(3, InvalidStateError, m_sqliteDatab
ase.lastError()); |
| 364 errorMessage = formatErrorMessage("unable to open database,
failed to create 'info' table", m_sqliteDatabase.lastError(), m_sqliteDatabase.l
astErrorMsg()); | 364 errorMessage = formatErrorMessage("unable to open database,
failed to create 'info' table", m_sqliteDatabase.lastError(), m_sqliteDatabase.l
astErrorMsg()); |
| 365 transaction.rollback(); | 365 transaction.rollback(); |
| 366 m_sqliteDatabase.close(); | 366 m_sqliteDatabase.close(); |
| 367 return false; | 367 return false; |
| 368 } | 368 } |
| 369 } else if (!getVersionFromDatabase(currentVersion, false)) { | 369 } else if (!getVersionFromDatabase(currentVersion, false)) { |
| 370 reportOpenDatabaseResult(4, INVALID_STATE_ERR, m_sqliteDatabase.
lastError()); | 370 reportOpenDatabaseResult(4, InvalidStateError, m_sqliteDatabase.
lastError()); |
| 371 errorMessage = formatErrorMessage("unable to open database, fail
ed to read current version", m_sqliteDatabase.lastError(), m_sqliteDatabase.last
ErrorMsg()); | 371 errorMessage = formatErrorMessage("unable to open database, fail
ed to read current version", m_sqliteDatabase.lastError(), m_sqliteDatabase.last
ErrorMsg()); |
| 372 transaction.rollback(); | 372 transaction.rollback(); |
| 373 m_sqliteDatabase.close(); | 373 m_sqliteDatabase.close(); |
| 374 return false; | 374 return false; |
| 375 } | 375 } |
| 376 | 376 |
| 377 if (currentVersion.length()) { | 377 if (currentVersion.length()) { |
| 378 LOG(StorageAPI, "Retrieved current version %s from database %s",
currentVersion.ascii().data(), databaseDebugName().ascii().data()); | 378 LOG(StorageAPI, "Retrieved current version %s from database %s",
currentVersion.ascii().data(), databaseDebugName().ascii().data()); |
| 379 } else if (!m_new || shouldSetVersionInNewDatabase) { | 379 } else if (!m_new || shouldSetVersionInNewDatabase) { |
| 380 LOG(StorageAPI, "Setting version %s in database %s that was just
created", m_expectedVersion.ascii().data(), databaseDebugName().ascii().data())
; | 380 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)) { | 381 if (!setVersionInDatabase(m_expectedVersion, false)) { |
| 382 reportOpenDatabaseResult(5, INVALID_STATE_ERR, m_sqliteDatab
ase.lastError()); | 382 reportOpenDatabaseResult(5, InvalidStateError, m_sqliteDatab
ase.lastError()); |
| 383 errorMessage = formatErrorMessage("unable to open database,
failed to write current version", m_sqliteDatabase.lastError(), m_sqliteDatabase
.lastErrorMsg()); | 383 errorMessage = formatErrorMessage("unable to open database,
failed to write current version", m_sqliteDatabase.lastError(), m_sqliteDatabase
.lastErrorMsg()); |
| 384 transaction.rollback(); | 384 transaction.rollback(); |
| 385 m_sqliteDatabase.close(); | 385 m_sqliteDatabase.close(); |
| 386 return false; | 386 return false; |
| 387 } | 387 } |
| 388 currentVersion = m_expectedVersion; | 388 currentVersion = m_expectedVersion; |
| 389 } | 389 } |
| 390 updateGuidVersionMap(m_guid, currentVersion); | 390 updateGuidVersionMap(m_guid, currentVersion); |
| 391 transaction.commit(); | 391 transaction.commit(); |
| 392 } | 392 } |
| 393 } | 393 } |
| 394 | 394 |
| 395 if (currentVersion.isNull()) { | 395 if (currentVersion.isNull()) { |
| 396 LOG(StorageAPI, "Database %s does not have its version set", databaseDeb
ugName().ascii().data()); | 396 LOG(StorageAPI, "Database %s does not have its version set", databaseDeb
ugName().ascii().data()); |
| 397 currentVersion = ""; | 397 currentVersion = ""; |
| 398 } | 398 } |
| 399 | 399 |
| 400 // If the expected version isn't the empty string, ensure that the current d
atabase version we have matches that version. Otherwise, set an exception. | 400 // If the expected version isn't the empty string, ensure that the current d
atabase version we have matches that version. Otherwise, set an exception. |
| 401 // If the expected version is the empty string, then we always return with w
hatever version of the database we have. | 401 // If the expected version is the empty string, then we always return with w
hatever version of the database we have. |
| 402 if ((!m_new || shouldSetVersionInNewDatabase) && m_expectedVersion.length()
&& m_expectedVersion != currentVersion) { | 402 if ((!m_new || shouldSetVersionInNewDatabase) && m_expectedVersion.length()
&& m_expectedVersion != currentVersion) { |
| 403 reportOpenDatabaseResult(6, INVALID_STATE_ERR, 0); | 403 reportOpenDatabaseResult(6, InvalidStateError, 0); |
| 404 errorMessage = "unable to open database, version mismatch, '" + m_expect
edVersion + "' does not match the currentVersion of '" + currentVersion + "'"; | 404 errorMessage = "unable to open database, version mismatch, '" + m_expect
edVersion + "' does not match the currentVersion of '" + currentVersion + "'"; |
| 405 m_sqliteDatabase.close(); | 405 m_sqliteDatabase.close(); |
| 406 return false; | 406 return false; |
| 407 } | 407 } |
| 408 | 408 |
| 409 ASSERT(m_databaseAuthorizer); | 409 ASSERT(m_databaseAuthorizer); |
| 410 m_sqliteDatabase.setAuthorizer(m_databaseAuthorizer); | 410 m_sqliteDatabase.setAuthorizer(m_databaseAuthorizer); |
| 411 | 411 |
| 412 // See comment at the top this file regarding calling addOpenDatabase(). | 412 // See comment at the top this file regarding calling addOpenDatabase(). |
| 413 DatabaseTracker::tracker().addOpenDatabase(this); | 413 DatabaseTracker::tracker().addOpenDatabase(this); |
| (...skipping 216 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 630 DatabaseObserver::reportExecuteStatementResult(this, errorSite, webSqlErrorC
ode, sqliteErrorCode); | 630 DatabaseObserver::reportExecuteStatementResult(this, errorSite, webSqlErrorC
ode, sqliteErrorCode); |
| 631 } | 631 } |
| 632 | 632 |
| 633 void DatabaseBackendBase::reportVacuumDatabaseResult(int sqliteErrorCode) | 633 void DatabaseBackendBase::reportVacuumDatabaseResult(int sqliteErrorCode) |
| 634 { | 634 { |
| 635 DatabaseObserver::reportVacuumDatabaseResult(this, sqliteErrorCode); | 635 DatabaseObserver::reportVacuumDatabaseResult(this, sqliteErrorCode); |
| 636 } | 636 } |
| 637 | 637 |
| 638 | 638 |
| 639 } // namespace WebCore | 639 } // namespace WebCore |
| OLD | NEW |