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