15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/* 25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2006, 2007, 2008 Apple Inc. All rights reserved. 35c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2007 Justin Haygood (jhaygood@reaktix.com) 45c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 55c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Redistribution and use in source and binary forms, with or without 65c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * modification, are permitted provided that the following conditions 75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * are met: 85c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 1. Redistributions of source code must retain the above copyright 95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * notice, this list of conditions and the following disclaimer. 105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 2. Redistributions in binary form must reproduce the above copyright 115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * notice, this list of conditions and the following disclaimer in the 125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * documentation and/or other materials provided with the distribution. 135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY 155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR 185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY 225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 2402772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */ 265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "config.h" 281e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "modules/webdatabase/sqlite/SQLiteDatabase.h" 295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include <sqlite3.h> 311e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "platform/Logging.h" 321e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "modules/webdatabase/sqlite/SQLiteFileSystem.h" 331e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "modules/webdatabase/sqlite/SQLiteStatement.h" 3453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "modules/webdatabase/DatabaseAuthorizer.h" 355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 36c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)namespace blink { 375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)const int SQLResultDone = SQLITE_DONE; 395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)const int SQLResultOk = SQLITE_OK; 405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)const int SQLResultRow = SQLITE_ROW; 415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)const int SQLResultFull = SQLITE_FULL; 425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)const int SQLResultInterrupt = SQLITE_INTERRUPT; 435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)const int SQLResultConstraint = SQLITE_CONSTRAINT; 445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static const char notOpenErrorMessage[] = "database is not open"; 465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)SQLiteDatabase::SQLiteDatabase() 485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) : m_db(0) 495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) , m_pageSize(-1) 505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) , m_transactionInProgress(false) 515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) , m_sharable(false) 525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) , m_openingThread(0) 535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) , m_openError(SQLITE_ERROR) 545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) , m_openErrorMessage() 555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) , m_lastChangesCount(0) 565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)SQLiteDatabase::~SQLiteDatabase() 605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) close(); 625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool SQLiteDatabase::open(const String& filename, bool forWebSQLDatabase) 655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) close(); 675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_openError = SQLiteFileSystem::openDatabase(filename, &m_db, forWebSQLDatabase); 695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (m_openError != SQLITE_OK) { 705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_openErrorMessage = m_db ? sqlite3_errmsg(m_db) : "sqlite_open returned null"; 71a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) WTF_LOG_ERROR("SQLite database failed to load from %s\nCause - %s", filename.ascii().data(), 725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_openErrorMessage.data()); 735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) sqlite3_close(m_db); 745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_db = 0; 755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return false; 765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_openError = sqlite3_extended_result_codes(m_db, 1); 795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (m_openError != SQLITE_OK) { 805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_openErrorMessage = sqlite3_errmsg(m_db); 81a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) WTF_LOG_ERROR("SQLite database error when enabling extended errors - %s", m_openErrorMessage.data()); 825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) sqlite3_close(m_db); 835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_db = 0; 845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return false; 855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (isOpen()) 885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_openingThread = currentThread(); 895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) else 905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_openErrorMessage = "sqlite_open returned null"; 915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 923c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch if (!SQLiteStatement(*this, "PRAGMA temp_store = MEMORY;").executeCommand()) 93a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) WTF_LOG_ERROR("SQLite database could not set temp_store to memory"); 945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return isOpen(); 965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void SQLiteDatabase::close() 995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (m_db) { 1015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // FIXME: This is being called on the main thread during JS GC. <rdar://problem/5739818> 1025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // ASSERT(currentThread() == m_openingThread); 1035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) sqlite3* db = m_db; 1045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 1055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) MutexLocker locker(m_databaseClosingMutex); 1065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_db = 0; 1075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 1085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) sqlite3_close(db); 1095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 1105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_openingThread = 0; 1125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_openError = SQLITE_ERROR; 1135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_openErrorMessage = CString(); 1145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void SQLiteDatabase::setMaximumSize(int64_t size) 1175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (size < 0) 1195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) size = 0; 12002772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch 1215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) int currentPageSize = pageSize(); 1225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT(currentPageSize || !m_db); 1245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) int64_t newMaxPageCount = currentPageSize ? size / currentPageSize : 0; 12502772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch 1265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) MutexLocker locker(m_authorizerLock); 1275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) enableAuthorizer(false); 1285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) SQLiteStatement statement(*this, "PRAGMA max_page_count = " + String::number(newMaxPageCount)); 1305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) statement.prepare(); 1315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (statement.step() != SQLResultRow) 1328abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)#if OS(WIN) 133a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) WTF_LOG_ERROR("Failed to set maximum size of database to %I64i bytes", static_cast<long long>(size)); 1345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#else 135a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) WTF_LOG_ERROR("Failed to set maximum size of database to %lli bytes", static_cast<long long>(size)); 1365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif 1375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) enableAuthorizer(true); 1395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)int SQLiteDatabase::pageSize() 1435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 14402772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch // Since the page size of a database is locked in at creation and therefore cannot be dynamic, 1455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // we can cache the value for future use 1465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (m_pageSize == -1) { 1475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) MutexLocker locker(m_authorizerLock); 1485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) enableAuthorizer(false); 14902772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch 1503c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch SQLiteStatement statement(*this, "PRAGMA page_size"); 1515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_pageSize = statement.getColumnInt(0); 15202772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch 1535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) enableAuthorizer(true); 1545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 1555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return m_pageSize; 1575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)int64_t SQLiteDatabase::freeSpaceSize() 1605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) int64_t freelistCount = 0; 1625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 1645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) MutexLocker locker(m_authorizerLock); 1655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) enableAuthorizer(false); 1665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Note: freelist_count was added in SQLite 3.4.1. 1673c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch SQLiteStatement statement(*this, "PRAGMA freelist_count"); 1685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) freelistCount = statement.getColumnInt64(0); 1695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) enableAuthorizer(true); 1705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 1715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return freelistCount * pageSize(); 1735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)int64_t SQLiteDatabase::totalSize() 1765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) int64_t pageCount = 0; 1785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 1805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) MutexLocker locker(m_authorizerLock); 1815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) enableAuthorizer(false); 1823c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch SQLiteStatement statement(*this, "PRAGMA page_count"); 1835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) pageCount = statement.getColumnInt64(0); 1845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) enableAuthorizer(true); 1855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 1865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return pageCount * pageSize(); 1885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void SQLiteDatabase::setBusyTimeout(int ms) 1915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (m_db) 1935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) sqlite3_busy_timeout(m_db, ms); 1945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) else 195a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) WTF_LOG(SQLDatabase, "BusyTimeout set on non-open database"); 1965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool SQLiteDatabase::executeCommand(const String& sql) 1995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 2005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return SQLiteStatement(*this, sql).executeCommand(); 2015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 2025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool SQLiteDatabase::tableExists(const String& tablename) 2045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 2055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!isOpen()) 2065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return false; 2075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) String statement = "SELECT name FROM sqlite_master WHERE type = 'table' AND name = '" + tablename + "';"; 2095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) SQLiteStatement sql(*this, statement); 2115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) sql.prepare(); 2125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return sql.step() == SQLITE_ROW; 2135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 2145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)int SQLiteDatabase::runVacuumCommand() 2165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 2173c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch if (!executeCommand("VACUUM;")) 218a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) WTF_LOG(SQLDatabase, "Unable to vacuum database - %s", lastErrorMsg()); 2195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return lastError(); 2205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 2215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)int SQLiteDatabase::runIncrementalVacuumCommand() 2235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 2245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) MutexLocker locker(m_authorizerLock); 2255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) enableAuthorizer(false); 2265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2273c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch if (!executeCommand("PRAGMA incremental_vacuum")) 228a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) WTF_LOG(SQLDatabase, "Unable to run incremental vacuum - %s", lastErrorMsg()); 2295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) enableAuthorizer(true); 2315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return lastError(); 2325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 2335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)int64_t SQLiteDatabase::lastInsertRowID() 2355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 2365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!m_db) 2375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return 0; 2385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return sqlite3_last_insert_rowid(m_db); 2395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 2405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void SQLiteDatabase::updateLastChangesCount() 2425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 2435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!m_db) 2445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 2455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_lastChangesCount = sqlite3_total_changes(m_db); 2475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 2485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)int SQLiteDatabase::lastChanges() 2505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 2515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!m_db) 2525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return 0; 2535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return sqlite3_total_changes(m_db) - m_lastChangesCount; 2555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 2565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)int SQLiteDatabase::lastError() 2585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 2595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return m_db ? sqlite3_errcode(m_db) : m_openError; 2605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 2615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)const char* SQLiteDatabase::lastErrorMsg() 2635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 2645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (m_db) 2655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return sqlite3_errmsg(m_db); 2665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return m_openErrorMessage.isNull() ? notOpenErrorMessage : m_openErrorMessage.data(); 2675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 2685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)int SQLiteDatabase::authorizerFunction(void* userData, int actionCode, const char* parameter1, const char* parameter2, const char* /*databaseName*/, const char* /*trigger_or_view*/) 2705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 2715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) DatabaseAuthorizer* auth = static_cast<DatabaseAuthorizer*>(userData); 2725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT(auth); 2735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) switch (actionCode) { 2755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case SQLITE_CREATE_INDEX: 2765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return auth->createIndex(parameter1, parameter2); 2775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case SQLITE_CREATE_TABLE: 2785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return auth->createTable(parameter1); 2795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case SQLITE_CREATE_TEMP_INDEX: 2805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return auth->createTempIndex(parameter1, parameter2); 2815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case SQLITE_CREATE_TEMP_TABLE: 2825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return auth->createTempTable(parameter1); 2835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case SQLITE_CREATE_TEMP_TRIGGER: 2845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return auth->createTempTrigger(parameter1, parameter2); 2855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case SQLITE_CREATE_TEMP_VIEW: 2865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return auth->createTempView(parameter1); 2875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case SQLITE_CREATE_TRIGGER: 2885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return auth->createTrigger(parameter1, parameter2); 2895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case SQLITE_CREATE_VIEW: 2905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return auth->createView(parameter1); 2915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case SQLITE_DELETE: 2925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return auth->allowDelete(parameter1); 2935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case SQLITE_DROP_INDEX: 2945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return auth->dropIndex(parameter1, parameter2); 2955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case SQLITE_DROP_TABLE: 2965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return auth->dropTable(parameter1); 2975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case SQLITE_DROP_TEMP_INDEX: 2985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return auth->dropTempIndex(parameter1, parameter2); 2995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case SQLITE_DROP_TEMP_TABLE: 3005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return auth->dropTempTable(parameter1); 3015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case SQLITE_DROP_TEMP_TRIGGER: 3025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return auth->dropTempTrigger(parameter1, parameter2); 3035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case SQLITE_DROP_TEMP_VIEW: 3045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return auth->dropTempView(parameter1); 3055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case SQLITE_DROP_TRIGGER: 3065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return auth->dropTrigger(parameter1, parameter2); 3075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case SQLITE_DROP_VIEW: 3085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return auth->dropView(parameter1); 3095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case SQLITE_INSERT: 3105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return auth->allowInsert(parameter1); 3115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case SQLITE_PRAGMA: 3125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return auth->allowPragma(parameter1, parameter2); 3135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case SQLITE_READ: 3145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return auth->allowRead(parameter1, parameter2); 3155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case SQLITE_SELECT: 3165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return auth->allowSelect(); 3175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case SQLITE_TRANSACTION: 3185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return auth->allowTransaction(); 3195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case SQLITE_UPDATE: 3205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return auth->allowUpdate(parameter1, parameter2); 3215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case SQLITE_ATTACH: 3225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return auth->allowAttach(parameter1); 3235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case SQLITE_DETACH: 3245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return auth->allowDetach(parameter1); 3255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case SQLITE_ALTER_TABLE: 3265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return auth->allowAlterTable(parameter1, parameter2); 3275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case SQLITE_REINDEX: 3285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return auth->allowReindex(parameter1); 32902772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch#if SQLITE_VERSION_NUMBER >= 3003013 3305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case SQLITE_ANALYZE: 3315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return auth->allowAnalyze(parameter1); 3325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case SQLITE_CREATE_VTABLE: 3335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return auth->createVTable(parameter1, parameter2); 3345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case SQLITE_DROP_VTABLE: 3355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return auth->dropVTable(parameter1, parameter2); 3365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case SQLITE_FUNCTION: 3375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return auth->allowFunction(parameter2); 3385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif 3395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) default: 3405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT_NOT_REACHED(); 3415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return SQLAuthDeny; 3425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 3435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 3445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 34507a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdochvoid SQLiteDatabase::setAuthorizer(DatabaseAuthorizer* auth) 3465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 3475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!m_db) { 348a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) WTF_LOG_ERROR("Attempt to set an authorizer on a non-open SQL database"); 3495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT_NOT_REACHED(); 3505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 3515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 3525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) MutexLocker locker(m_authorizerLock); 3545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_authorizer = auth; 35602772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch 3575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) enableAuthorizer(true); 3585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 3595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void SQLiteDatabase::enableAuthorizer(bool enable) 3615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 3625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (m_authorizer && enable) 3635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) sqlite3_set_authorizer(m_db, SQLiteDatabase::authorizerFunction, m_authorizer.get()); 3645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) else 3655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) sqlite3_set_authorizer(m_db, NULL, 0); 3665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 3675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool SQLiteDatabase::isAutoCommitOn() const 3695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 3705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return sqlite3_get_autocommit(m_db); 3715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 3725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool SQLiteDatabase::turnOnIncrementalAutoVacuum() 3745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 3753c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch SQLiteStatement statement(*this, "PRAGMA auto_vacuum"); 3765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) int autoVacuumMode = statement.getColumnInt(0); 3775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) int error = lastError(); 3785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Check if we got an error while trying to get the value of the auto_vacuum flag. 3805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // If we got a SQLITE_BUSY error, then there's probably another transaction in 3815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // progress on this database. In this case, keep the current value of the 3825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // auto_vacuum flag and try to set it to INCREMENTAL the next time we open this 3835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // database. If the error is not SQLITE_BUSY, then we probably ran into a more 3845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // serious problem and should return false (to log an error message). 3855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (error != SQLITE_ROW) 3865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return false; 3875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) switch (autoVacuumMode) { 3895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case AutoVacuumIncremental: 3905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return true; 3915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case AutoVacuumFull: 3923c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch return executeCommand("PRAGMA auto_vacuum = 2"); 3935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case AutoVacuumNone: 3945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) default: 3953c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch if (!executeCommand("PRAGMA auto_vacuum = 2")) 3965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return false; 3975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) runVacuumCommand(); 3985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) error = lastError(); 3995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return (error == SQLITE_OK); 4005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 4015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 4025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 40307a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdochvoid SQLiteDatabase::trace(Visitor* visitor) 40407a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch{ 40507a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch visitor->trace(m_authorizer); 40607a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch} 40707a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch 408c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)} // namespace blink 409