f25f339324678d8e96b81ff5bfd067051d25ed86
[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 tableExists(const String&);
53
54     void setBusyTimeout(int ms);
55     void setBusyHandler(int(*)(void*, int));
56     
57     //TODO - add pragma and sqlite_master accessors here
58     void setFullsync(bool);
59     
60     int lastError() { return m_db ? sqlite3_errcode(m_db) : SQLITE_ERROR; }
61     const char* lastErrorMsg() { return sqlite3_errmsg(m_db); }
62     
63 private:
64     String   m_path;
65     sqlite3* m_db;
66     int m_lastError;
67     
68 }; //class SQLDatabase
69
70 class SQLTransaction : public Noncopyable
71 {
72 public:
73     SQLTransaction(SQLDatabase& db, bool start = false);
74     ~SQLTransaction();
75     
76     void begin();
77     void commit();
78     void rollback();
79     
80 private:
81     SQLDatabase& m_db;
82     bool m_began;
83
84 };
85
86 class SQLStatement : public Noncopyable
87 {
88 public:
89     SQLStatement(SQLDatabase& db, const String&);
90     ~SQLStatement();
91     
92     int prepare();
93     bool isPrepared() { return m_statement; }
94     int bindBlob(int index, const void* blob, int size, bool copy = true);
95     int bindText(int index, const char* text, bool copy = true);
96
97     int step();
98     int finalize();
99     int reset();
100     
101     //prepares, steps, and finalizes the query.
102     //returns true if all 3 steps succeed with step() returning SQLITE_DONE
103     //returns false otherwise  
104     bool executeCommand();
105     
106     //prepares, steps, and finalizes.  
107     //returns true is step() returns SQLITE_ROW
108     //returns false otherwise
109     bool returnsAtLeastOneResult();
110     
111     //Returns -1 on last-step failing.  Otherwise, returns number of rows
112     //returned in the last step()
113     int columnCount();
114     
115     String getColumnName(int col);
116     String getColumnName16(int col);
117     String getColumnText(int col);
118     String getColumnText16(int col);
119     double  getColumnDouble(int col);
120     int     getColumnInt(int col);
121     int64_t getColumnInt64(int col);
122     const void* getColumnBlob(int col, int& size);
123
124     bool returnTextResults(int col, Vector<String>& v);
125     bool returnTextResults16(int col, Vector<String>& v);
126     bool returnIntResults(int col, Vector<int>& v);
127     bool returnInt64Results(int col, Vector<int64_t>& v);
128     bool returnDoubleResults(int col, Vector<double>& v);
129
130     int lastError() { return m_database.lastError(); }
131     const char* lastErrorMsg() { return m_database.lastErrorMsg(); }
132     
133 private:
134     SQLDatabase& m_database;
135     String      m_query;
136
137     sqlite3_stmt* m_statement;
138 };
139
140 } //namespace WebCore
141
142
143
144 #endif