#include "SQLDatabase.h"
#include "Logging.h"
using namespace WebCore;
SQLDatabase::SQLDatabase()
: m_db(0)
{
}
bool SQLDatabase::open(const String& filename)
{
close();
m_path = filename;
m_path.append(UChar(0));
m_lastError = sqlite3_open16(m_path.characters(), &m_db);
if (m_lastError != SQLITE_OK) {
LOG_ERROR("SQLite database failed to load from %s\nCause - %s", filename.ascii().data(),
sqlite3_errmsg(m_db));
sqlite3_close(m_db);
m_db = 0;
}
if (!SQLStatement(*this, "PRAGMA temp_store = MEMORY;").executeCommand())
LOG_ERROR("SQLite database could not set temp_store to memory");
return isOpen();
}
void SQLDatabase::close()
{
if (m_db) {
sqlite3_close(m_db);
m_path.truncate(0);
m_db = 0;
}
}
void SQLDatabase::setFullsync(bool fsync)
{
if (fsync)
executeCommand("PRAGMA fullfsync = 1;");
else
executeCommand("PRAGMA fullfsync = 0;");
}
void SQLDatabase::setSynchronous(SynchronousPragma sync)
{
executeCommand(String::sprintf("PRAGMA synchronous = %i", sync));
}
void SQLDatabase::setBusyTimeout(int ms)
{
if (m_db)
sqlite3_busy_timeout(m_db, ms);
else
LOG(IconDatabase, "BusyTimeout set on non-open database");
}
void SQLDatabase::setBusyHandler(int(*handler)(void*, int))
{
if (m_db)
sqlite3_busy_handler(m_db, handler, NULL);
else
LOG(IconDatabase, "Busy handler set on non-open database");
}
bool SQLDatabase::executeCommand(const String& sql)
{
return SQLStatement(*this, sql).executeCommand();
}
bool SQLDatabase::returnsAtLeastOneResult(const String& sql)
{
return SQLStatement(*this, sql).returnsAtLeastOneResult();
}
bool SQLDatabase::tableExists(const String& tablename)
{
if (!isOpen())
return false;
String statement = "SELECT name FROM sqlite_master WHERE type = 'table' AND name = '" + tablename + "';";
SQLStatement sql(*this, statement);
sql.prepare();
return sql.step() == SQLITE_ROW;
}
int64_t SQLDatabase::lastInsertRowID()
{
if (!m_db)
return 0;
return sqlite3_last_insert_rowid(m_db);
}