| /* | |
| * Copyright (C) 2006, 2007, 2008 Apple Inc. All rights reserved. | |
| * Copyright (C) 2007 Justin Haygood (jhaygood@reaktix.com) | |
| * | |
| * Redistribution and use in source and binary forms, with or without | |
| * modification, are permitted provided that the following conditions | |
| * are met: | |
| * 1. Redistributions of source code must retain the above copyright | |
| * notice, this list of conditions and the following disclaimer. | |
| * 2. Redistributions in binary form must reproduce the above copyright | |
| * notice, this list of conditions and the following disclaimer in the | |
| * documentation and/or other materials provided with the distribution. | |
| * | |
| * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY | |
| * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | |
| * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR | |
| * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR | |
| * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, | |
| * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, | |
| * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR | |
| * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY | |
| * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | |
| * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | |
| * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | |
| */ | |
| #ifndef SQLiteDatabase_h | |
| #define SQLiteDatabase_h | |
| #include "platform/heap/Handle.h" | |
| #include "wtf/Threading.h" | |
| #include "wtf/ThreadingPrimitives.h" | |
| #include "wtf/text/CString.h" | |
| #include "wtf/text/WTFString.h" | |
| #if COMPILER(MSVC) | |
| #pragma warning(disable : 4800) | |
| #endif | |
| struct sqlite3; | |
| namespace blink { | |
| class DatabaseAuthorizer; | |
| class SQLiteTransaction; | |
| extern const int SQLResultDone; | |
| extern const int SQLResultOk; | |
| extern const int SQLResultRow; | |
| extern const int SQLResultFull; | |
| extern const int SQLResultInterrupt; | |
| extern const int SQLResultConstraint; | |
| class SQLiteDatabase { | |
| DISALLOW_NEW(); | |
| WTF_MAKE_NONCOPYABLE(SQLiteDatabase); | |
| friend class SQLiteTransaction; | |
| public: | |
| SQLiteDatabase(); | |
| ~SQLiteDatabase(); | |
| bool open(const String& filename); | |
| bool isOpen() const { return m_db; } | |
| void close(); | |
| void updateLastChangesCount(); | |
| bool executeCommand(const String&); | |
| bool tableExists(const String&); | |
| int runVacuumCommand(); | |
| int runIncrementalVacuumCommand(); | |
| bool transactionInProgress() const { return m_transactionInProgress; } | |
| int64_t lastInsertRowID(); | |
| int lastChanges(); | |
| void setBusyTimeout(int ms); | |
| // Sets the maximum size in bytes. | |
| // 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. These chunks will never be anything other than 512, 1024, 2048, | |
| // 4096, 8192, 16384, or 32768 bytes in size. setMaximumSize() will round the | |
| // size down to the next smallest chunk if the passed size doesn't align. | |
| void setMaximumSize(int64_t); | |
| // Gets the number of unused bytes in the database file. | |
| int64_t freeSpaceSize(); | |
| int64_t totalSize(); | |
| int lastError(); | |
| const char* lastErrorMsg(); | |
| sqlite3* sqlite3Handle() const { | |
| ASSERT(m_sharable || currentThread() == m_openingThread || !m_db); | |
| return m_db; | |
| } | |
| void setAuthorizer(DatabaseAuthorizer*); | |
| bool isAutoCommitOn() const; | |
| // The SQLite AUTO_VACUUM pragma can be either NONE, FULL, or INCREMENTAL. | |
| // NONE - SQLite does not do any vacuuming | |
| // FULL - SQLite moves all empty pages to the end of the DB file and truncates | |
| // the file to remove those pages after every transaction. This option | |
| // requires SQLite to store additional information about each page in | |
| // the database file. | |
| // INCREMENTAL - SQLite stores extra information for each page in the database | |
| // file, but removes the empty pages only when PRAGMA | |
| // INCREMANTAL_VACUUM is called. | |
| enum AutoVacuumPragma { | |
| AutoVacuumNone = 0, | |
| AutoVacuumFull = 1, | |
| AutoVacuumIncremental = 2 | |
| }; | |
| bool turnOnIncrementalAutoVacuum(); | |
| DEFINE_INLINE_TRACE() {} | |
| private: | |
| static int authorizerFunction(void*, | |
| int, | |
| const char*, | |
| const char*, | |
| const char*, | |
| const char*); | |
| void enableAuthorizer(bool enable); | |
| int pageSize(); | |
| sqlite3* m_db; | |
| int m_pageSize; | |
| bool m_transactionInProgress; | |
| bool m_sharable; | |
| Mutex m_authorizerLock; | |
| CrossThreadPersistent<DatabaseAuthorizer> m_authorizer; | |
| ThreadIdentifier m_openingThread; | |
| Mutex m_databaseClosingMutex; | |
| int m_openError; | |
| CString m_openErrorMessage; | |
| int m_lastChangesCount; | |
| }; | |
| } // namespace blink | |
| #endif |