#ifndef SQLDatabase_H
#define SQLDatabase_H
#include "config.h"
#include "PlatformString.h"
#include <sqlite3.h>
#include <wtf/Noncopyable.h>
#include <wtf/Vector.h>
namespace WebCore {
class SQLStatement;
class SQLDatabase : public Noncopyable
{
friend class SQLStatement;
public:
SQLDatabase();
bool open(const String& filename);
bool isOpen() { return m_db; }
String getPath(){ return m_path; }
void close();
bool executeCommand(const String&);
bool returnsAtLeastOneResult(const String&);
bool tableExists(const String&);
int64_t lastInsertRowID();
void setBusyTimeout(int ms);
void setBusyHandler(int(*)(void*, int));
void setFullsync(bool);
enum SynchronousPragma {
SyncOff = 0, SyncNormal = 1, SyncFull = 2
};
void setSynchronous(SynchronousPragma);
int lastError() { return m_db ? sqlite3_errcode(m_db) : SQLITE_ERROR; }
const char* lastErrorMsg() { return sqlite3_errmsg(m_db); }
private:
String m_path;
sqlite3* m_db;
int m_lastError;
};
class SQLTransaction : public Noncopyable
{
public:
SQLTransaction(SQLDatabase& db, bool start = false);
~SQLTransaction();
void begin();
void commit();
void rollback();
private:
SQLDatabase& m_db;
bool m_began;
};
class SQLStatement : public Noncopyable
{
public:
SQLStatement(SQLDatabase& db, const String&);
~SQLStatement();
int prepare();
bool isPrepared() { return m_statement; }
int bindBlob(int index, const void* blob, int size, bool copy = true);
int bindText(int index, const char* text, bool copy = true);
int bindInt64(int index, int64_t integer);
int step();
int finalize();
int reset();
int prepareAndStep() { prepare(); return step(); }
bool executeCommand();
bool returnsAtLeastOneResult();
int columnCount();
String getColumnName(int col);
String getColumnName16(int col);
String getColumnText(int col);
String getColumnText16(int col);
double getColumnDouble(int col);
int getColumnInt(int col);
int64_t getColumnInt64(int col);
const void* getColumnBlob(int col, int& size);
Vector<unsigned char> getColumnBlobAsVector(int col);
bool returnTextResults(int col, Vector<String>& v);
bool returnTextResults16(int col, Vector<String>& v);
bool returnIntResults(int col, Vector<int>& v);
bool returnInt64Results(int col, Vector<int64_t>& v);
bool returnDoubleResults(int col, Vector<double>& v);
int lastError() { return m_database.lastError(); }
const char* lastErrorMsg() { return m_database.lastErrorMsg(); }
private:
SQLDatabase& m_database;
String m_query;
sqlite3_stmt* m_statement;
};
}
#endif