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)#ifndef SQLiteDatabase_h 285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#define SQLiteDatabase_h 295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 307757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch#include "wtf/Threading.h" 317757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch#include "wtf/text/CString.h" 327757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch#include "wtf/text/WTFString.h" 335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#if COMPILER(MSVC) 355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#pragma warning(disable: 4800) 365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif 375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)struct sqlite3; 395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)namespace WebCore { 415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class DatabaseAuthorizer; 435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class SQLiteStatement; 445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class SQLiteTransaction; 455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)extern const int SQLResultDone; 475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)extern const int SQLResultError; 485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)extern const int SQLResultOk; 495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)extern const int SQLResultRow; 505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)extern const int SQLResultSchema; 515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)extern const int SQLResultFull; 525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)extern const int SQLResultInterrupt; 535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)extern const int SQLResultConstraint; 545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class SQLiteDatabase { 565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) WTF_MAKE_NONCOPYABLE(SQLiteDatabase); 575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) friend class SQLiteTransaction; 585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)public: 595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) SQLiteDatabase(); 605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ~SQLiteDatabase(); 615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) bool open(const String& filename, bool forWebSQLDatabase = false); 635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) bool isOpen() const { return m_db; } 645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) void close(); 655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) void interrupt(); 665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) bool isInterrupted(); 675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) void updateLastChangesCount(); 695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) bool executeCommand(const String&); 715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) bool returnsAtLeastOneResult(const String&); 7202772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch 735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) bool tableExists(const String&); 745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) void clearAllTables(); 755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) int runVacuumCommand(); 765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) int runIncrementalVacuumCommand(); 7702772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch 785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) bool transactionInProgress() const { return m_transactionInProgress; } 7902772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch 805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) int64_t lastInsertRowID(); 815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) int lastChanges(); 825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) void setBusyTimeout(int ms); 845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) void setBusyHandler(int(*)(void*, int)); 8502772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch 865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) void setFullsync(bool); 8702772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch 885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Gets/sets the maximum size in bytes 895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Depending on per-database attributes, the size will only be settable in units that are the page size of the database, which is established at creation 905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // These chunks will never be anything other than 512, 1024, 2048, 4096, 8192, 16384, or 32768 bytes in size. 915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // setMaximumSize() will round the size down to the next smallest chunk if the passed size doesn't align. 925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) int64_t maximumSize(); 935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) void setMaximumSize(int64_t); 9402772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch 955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Gets the number of unused bytes in the database file. 965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) int64_t freeSpaceSize(); 975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) int64_t totalSize(); 985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // The SQLite SYNCHRONOUS pragma can be either FULL, NORMAL, or OFF 1005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // FULL - Any writing calls to the DB block until the data is actually on the disk surface 1015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // NORMAL - SQLite pauses at some critical moments when writing, but much less than FULL 1025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // OFF - Calls return immediately after the data has been passed to disk 1035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) enum SynchronousPragma { SyncOff = 0, SyncNormal = 1, SyncFull = 2 }; 1045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) void setSynchronous(SynchronousPragma); 10502772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch 1065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) int lastError(); 1075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) const char* lastErrorMsg(); 10802772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch 1095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) sqlite3* sqlite3Handle() const { 1105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT(m_sharable || currentThread() == m_openingThread || !m_db); 1115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return m_db; 1125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 11302772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch 1145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) void setAuthorizer(PassRefPtr<DatabaseAuthorizer>); 1155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) Mutex& databaseMutex() { return m_lockingMutex; } 1175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) bool isAutoCommitOn() const; 1185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // The SQLite AUTO_VACUUM pragma can be either NONE, FULL, or INCREMENTAL. 1205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // NONE - SQLite does not do any vacuuming 1215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // FULL - SQLite moves all empty pages to the end of the DB file and truncates 1225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // the file to remove those pages after every transaction. This option 1235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // requires SQLite to store additional information about each page in 1245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // the database file. 1255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // INCREMENTAL - SQLite stores extra information for each page in the database 1265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // file, but removes the empty pages only when PRAGMA INCREMANTAL_VACUUM 1275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // is called. 1285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) enum AutoVacuumPragma { AutoVacuumNone = 0, AutoVacuumFull = 1, AutoVacuumIncremental = 2 }; 1295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) bool turnOnIncrementalAutoVacuum(); 1305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Set this flag to allow access from multiple threads. Not all multi-threaded accesses are safe! 1325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // See http://www.sqlite.org/cvstrac/wiki?p=MultiThreading for more info. 1335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#ifndef NDEBUG 1345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) void disableThreadingChecks(); 1355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#else 1365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) void disableThreadingChecks() {} 1375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif 1385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)private: 1405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) static int authorizerFunction(void*, int, const char*, const char*, const char*, const char*); 1415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) void enableAuthorizer(bool enable); 14302772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch 1445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) int pageSize(); 14502772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch 1465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) sqlite3* m_db; 1475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) int m_pageSize; 14802772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch 1495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) bool m_transactionInProgress; 1505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) bool m_sharable; 15102772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch 1525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) Mutex m_authorizerLock; 1535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) RefPtr<DatabaseAuthorizer> m_authorizer; 1545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) Mutex m_lockingMutex; 1565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ThreadIdentifier m_openingThread; 1575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) Mutex m_databaseClosingMutex; 1595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) bool m_interrupted; 1605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) int m_openError; 1625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) CString m_openErrorMessage; 1635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) int m_lastChangesCount; 1655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}; 1665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} // namespace WebCore 1685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif 170