Reviewed by Levi
[WebKit-https.git] / WebCore / icon / SQLDatabase.h
1 /*
2  * Copyright (C) 2006 Apple Computer, 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  * 1. Redistributions of source code must retain the above copyright
8  *    notice, this list of conditions and the following disclaimer.
9  * 2. Redistributions in binary form must reproduce the above copyright
10  *    notice, this list of conditions and the following disclaimer in the
11  *    documentation and/or other materials provided with the distribution.
12  *
13  * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
14  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
17  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
18  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
19  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
20  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
21  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
23  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
24  */
25
26 #ifndef SQLDatabase_H
27 #define SQLDatabase_H
28
29 #include "config.h"
30
31 #include "PlatformString.h"
32 #include <sqlite3.h>
33 #include <wtf/Noncopyable.h>
34 #include <wtf/Vector.h>
35
36 namespace WebCore {
37
38 class SQLStatement;
39
40 class SQLDatabase : public Noncopyable
41 {
42     friend class SQLStatement;
43 public:
44     SQLDatabase();
45
46     bool open(const String& filename);
47     bool isOpen() { return m_db; }
48     String getPath(){ return m_path; }
49     void close();
50
51     bool executeCommand(const String&);
52     bool returnsAtLeastOneResult(const String&);
53     
54     bool tableExists(const String&);
55     
56     int64_t lastInsertRowID();
57
58     void setBusyTimeout(int ms);
59     void setBusyHandler(int(*)(void*, int));
60     
61     // TODO - add pragma and sqlite_master accessors here
62     void setFullsync(bool);
63     
64     int lastError() { return m_db ? sqlite3_errcode(m_db) : SQLITE_ERROR; }
65     const char* lastErrorMsg() { return sqlite3_errmsg(m_db); }
66     
67 private:
68     String   m_path;
69     sqlite3* m_db;
70     int m_lastError;
71     
72 }; // class SQLDatabase
73
74 class SQLTransaction : public Noncopyable
75 {
76 public:
77     SQLTransaction(SQLDatabase& db, bool start = false);
78     ~SQLTransaction();
79     
80     void begin();
81     void commit();
82     void rollback();
83     
84 private:
85     SQLDatabase& m_db;
86     bool m_began;
87
88 };
89
90 class SQLStatement : public Noncopyable
91 {
92 public:
93     SQLStatement(SQLDatabase& db, const String&);
94     ~SQLStatement();
95     
96     int prepare();
97     bool isPrepared() { return m_statement; }
98     int bindBlob(int index, const void* blob, int size, bool copy = true);
99     int bindText(int index, const char* text, bool copy = true);
100     int bindInt64(int index, int64_t integer);
101
102     int step();
103     int finalize();
104     int reset();
105     
106     int prepareAndStep() { prepare();  return step(); }
107     
108     // prepares, steps, and finalizes the query.
109     // returns true if all 3 steps succeed with step() returning SQLITE_DONE
110     // returns false otherwise  
111     bool executeCommand();
112     
113     // prepares, steps, and finalizes.  
114     // returns true is step() returns SQLITE_ROW
115     // returns false otherwise
116     bool returnsAtLeastOneResult();
117     
118     // Returns -1 on last-step failing.  Otherwise, returns number of rows
119     // returned in the last step()
120     int columnCount();
121     
122     String getColumnName(int col);
123     String getColumnName16(int col);
124     String getColumnText(int col);
125     String getColumnText16(int col);
126     double getColumnDouble(int col);
127     int getColumnInt(int col);
128     int64_t getColumnInt64(int col);
129     const void* getColumnBlob(int col, int& size);
130     Vector<char> getColumnBlobAsVector(int col);
131
132     bool returnTextResults(int col, Vector<String>& v);
133     bool returnTextResults16(int col, Vector<String>& v);
134     bool returnIntResults(int col, Vector<int>& v);
135     bool returnInt64Results(int col, Vector<int64_t>& v);
136     bool returnDoubleResults(int col, Vector<double>& v);
137
138     int lastError() { return m_database.lastError(); }
139     const char* lastErrorMsg() { return m_database.lastErrorMsg(); }
140     
141 private:
142     SQLDatabase& m_database;
143     String      m_query;
144
145     sqlite3_stmt* m_statement;
146 };
147
148 } // namespace WebCore
149
150
151
152 #endif