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 |