Home | History | Annotate | Download | only in storage
      1 /*
      2  * Copyright (C) 2010 Google Inc. All rights reserved.
      3  *
      4  * Redistribution and use in source and binary forms, with or without
      5  * modification, are permitted provided that the following conditions
      6  * are met:
      7  *
      8  * 1.  Redistributions of source code must retain the above copyright
      9  *     notice, this list of conditions and the following disclaimer.
     10  * 2.  Redistributions in binary form must reproduce the above copyright
     11  *     notice, this list of conditions and the following disclaimer in the
     12  *     documentation and/or other materials provided with the distribution.
     13  * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
     14  *     its contributors may be used to endorse or promote products derived
     15  *     from this software without specific prior written permission.
     16  *
     17  * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
     18  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
     19  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
     20  * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
     21  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
     22  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
     23  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
     24  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
     25  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
     26  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     27  */
     28 
     29 #ifndef AbstractDatabase_h
     30 #define AbstractDatabase_h
     31 
     32 #if ENABLE(DATABASE)
     33 
     34 #include "ExceptionCode.h"
     35 #include "PlatformString.h"
     36 #include "SQLiteDatabase.h"
     37 #include <wtf/Forward.h>
     38 #include <wtf/ThreadSafeRefCounted.h>
     39 #ifndef NDEBUG
     40 #include "SecurityOrigin.h"
     41 #endif
     42 
     43 namespace WebCore {
     44 
     45 class DatabaseAuthorizer;
     46 class ScriptExecutionContext;
     47 class SecurityOrigin;
     48 
     49 class AbstractDatabase : public ThreadSafeRefCounted<AbstractDatabase> {
     50 public:
     51     static bool isAvailable();
     52     static void setIsAvailable(bool available);
     53 
     54     virtual ~AbstractDatabase();
     55 
     56     virtual String version() const;
     57 
     58     bool opened() const { return m_opened; }
     59     bool isNew() const { return m_new; }
     60 
     61     virtual ScriptExecutionContext* scriptExecutionContext() const;
     62     virtual SecurityOrigin* securityOrigin() const;
     63     virtual String stringIdentifier() const;
     64     virtual String displayName() const;
     65     virtual unsigned long estimatedSize() const;
     66     virtual String fileName() const;
     67     SQLiteDatabase& sqliteDatabase() { return m_sqliteDatabase; }
     68 
     69     unsigned long long maximumSize() const;
     70     void incrementalVacuumIfNeeded();
     71     void interrupt();
     72     bool isInterrupted();
     73 
     74     // FIXME: move all version-related methods to a DatabaseVersionTracker class
     75     bool versionMatchesExpected() const;
     76     void setExpectedVersion(const String& version);
     77     bool getVersionFromDatabase(String& version);
     78     bool setVersionInDatabase(const String& version);
     79 
     80     void disableAuthorizer();
     81     void enableAuthorizer();
     82     void setAuthorizerReadOnly();
     83     void setAuthorizerPermissions(int permissions);
     84     bool lastActionChangedDatabase();
     85     bool lastActionWasInsert();
     86     void resetDeletes();
     87     bool hadDeletes();
     88     void resetAuthorizer();
     89 
     90     virtual void markAsDeletedAndClose() = 0;
     91     virtual void closeImmediately() = 0;
     92 
     93 protected:
     94     AbstractDatabase(ScriptExecutionContext*, const String& name, const String& expectedVersion,
     95                      const String& displayName, unsigned long estimatedSize);
     96 
     97     void closeDatabase();
     98 
     99     virtual bool performOpenAndVerify(bool shouldSetVersionInNewDatabase, ExceptionCode& ec);
    100 
    101     static const String& databaseInfoTableName();
    102 
    103     RefPtr<ScriptExecutionContext> m_scriptExecutionContext;
    104     RefPtr<SecurityOrigin> m_contextThreadSecurityOrigin;
    105 
    106     String m_name;
    107     String m_expectedVersion;
    108     String m_displayName;
    109     unsigned long m_estimatedSize;
    110     String m_filename;
    111 
    112 #ifndef NDEBUG
    113     String databaseDebugName() const { return m_contextThreadSecurityOrigin->toString() + "::" + m_name; }
    114 #endif
    115 
    116 private:
    117     static const String& databaseVersionKey();
    118 
    119     int m_guid;
    120     bool m_opened;
    121     bool m_new;
    122 
    123     SQLiteDatabase m_sqliteDatabase;
    124 
    125     RefPtr<DatabaseAuthorizer> m_databaseAuthorizer;
    126 };
    127 
    128 } // namespace WebCore
    129 
    130 #endif // ENABLE(DATABASE)
    131 
    132 #endif // AbstractDatabase_h
    133