Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1038)

Unified Diff: Source/core/platform/sql/SQLiteStatement.cpp

Issue 25223002: Move core/platform/sql into modules/webdatabase (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Attempt to fix the mac build Created 7 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « Source/core/platform/sql/SQLiteStatement.h ('k') | Source/core/platform/sql/SQLiteTransaction.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: Source/core/platform/sql/SQLiteStatement.cpp
diff --git a/Source/core/platform/sql/SQLiteStatement.cpp b/Source/core/platform/sql/SQLiteStatement.cpp
deleted file mode 100644
index 32283ee2f918a3e6ecafb556580a54b4fa963efb..0000000000000000000000000000000000000000
--- a/Source/core/platform/sql/SQLiteStatement.cpp
+++ /dev/null
@@ -1,534 +0,0 @@
-/*
- * Copyright (C) 2006, 2007, 2008 Apple Inc. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
- * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include "config.h"
-#include "core/platform/sql/SQLiteStatement.h"
-
-#include <sqlite3.h>
-#include "platform/Logging.h"
-#include "core/platform/sql/SQLValue.h"
-#include "wtf/Assertions.h"
-#include "wtf/text/CString.h"
-
-// SQLite 3.6.16 makes sqlite3_prepare_v2 automatically retry preparing the statement
-// once if the database scheme has changed. We rely on this behavior.
-#if SQLITE_VERSION_NUMBER < 3006016
-#error SQLite version 3.6.16 or newer is required
-#endif
-
-namespace WebCore {
-
-SQLiteStatement::SQLiteStatement(SQLiteDatabase& db, const String& sql)
- : m_database(db)
- , m_query(sql)
- , m_statement(0)
-#ifndef NDEBUG
- , m_isPrepared(false)
-#endif
-{
-}
-
-SQLiteStatement::~SQLiteStatement()
-{
- finalize();
-}
-
-int SQLiteStatement::prepare()
-{
- ASSERT(!m_isPrepared);
-
- MutexLocker databaseLock(m_database.databaseMutex());
- if (m_database.isInterrupted())
- return SQLITE_INTERRUPT;
-
- CString query = m_query.stripWhiteSpace().utf8();
-
- LOG(SQLDatabase, "SQL - prepare - %s", query.data());
-
- // Pass the length of the string including the null character to sqlite3_prepare_v2;
- // this lets SQLite avoid an extra string copy.
- size_t lengthIncludingNullCharacter = query.length() + 1;
-
- const char* tail;
- int error = sqlite3_prepare_v2(m_database.sqlite3Handle(), query.data(), lengthIncludingNullCharacter, &m_statement, &tail);
-
- if (error != SQLITE_OK)
- LOG(SQLDatabase, "sqlite3_prepare16 failed (%i)\n%s\n%s", error, query.data(), sqlite3_errmsg(m_database.sqlite3Handle()));
-
- if (tail && *tail)
- error = SQLITE_ERROR;
-
-#ifndef NDEBUG
- m_isPrepared = error == SQLITE_OK;
-#endif
- return error;
-}
-
-int SQLiteStatement::step()
-{
- MutexLocker databaseLock(m_database.databaseMutex());
- if (m_database.isInterrupted())
- return SQLITE_INTERRUPT;
- //ASSERT(m_isPrepared);
-
- if (!m_statement)
- return SQLITE_OK;
-
- // The database needs to update its last changes count before each statement
- // in order to compute properly the lastChanges() return value.
- m_database.updateLastChangesCount();
-
- LOG(SQLDatabase, "SQL - step - %s", m_query.ascii().data());
- int error = sqlite3_step(m_statement);
- if (error != SQLITE_DONE && error != SQLITE_ROW) {
- LOG(SQLDatabase, "sqlite3_step failed (%i)\nQuery - %s\nError - %s",
- error, m_query.ascii().data(), sqlite3_errmsg(m_database.sqlite3Handle()));
- }
-
- return error;
-}
-
-int SQLiteStatement::finalize()
-{
-#ifndef NDEBUG
- m_isPrepared = false;
-#endif
- if (!m_statement)
- return SQLITE_OK;
- LOG(SQLDatabase, "SQL - finalize - %s", m_query.ascii().data());
- int result = sqlite3_finalize(m_statement);
- m_statement = 0;
- return result;
-}
-
-int SQLiteStatement::reset()
-{
- ASSERT(m_isPrepared);
- if (!m_statement)
- return SQLITE_OK;
- LOG(SQLDatabase, "SQL - reset - %s", m_query.ascii().data());
- return sqlite3_reset(m_statement);
-}
-
-bool SQLiteStatement::executeCommand()
-{
- if (!m_statement && prepare() != SQLITE_OK)
- return false;
- ASSERT(m_isPrepared);
- if (step() != SQLITE_DONE) {
- finalize();
- return false;
- }
- finalize();
- return true;
-}
-
-bool SQLiteStatement::returnsAtLeastOneResult()
-{
- if (!m_statement && prepare() != SQLITE_OK)
- return false;
- ASSERT(m_isPrepared);
- if (step() != SQLITE_ROW) {
- finalize();
- return false;
- }
- finalize();
- return true;
-
-}
-
-int SQLiteStatement::bindBlob(int index, const void* blob, int size)
-{
- ASSERT(m_isPrepared);
- ASSERT(index > 0);
- ASSERT(static_cast<unsigned>(index) <= bindParameterCount());
- ASSERT(blob);
- ASSERT(size >= 0);
-
- if (!m_statement)
- return SQLITE_ERROR;
-
- return sqlite3_bind_blob(m_statement, index, blob, size, SQLITE_TRANSIENT);
-}
-
-int SQLiteStatement::bindBlob(int index, const String& text)
-{
- // SQLite treats uses zero pointers to represent null strings, which means we need to make sure to map null WTFStrings to zero pointers.
- ASSERT(!String().charactersWithNullTermination().data());
- return bindBlob(index, text.charactersWithNullTermination().data(), text.length() * sizeof(UChar));
-}
-
-int SQLiteStatement::bindText(int index, const String& text)
-{
- ASSERT(m_isPrepared);
- ASSERT(index > 0);
- ASSERT(static_cast<unsigned>(index) <= bindParameterCount());
-
- // SQLite treats uses zero pointers to represent null strings, which means we need to make sure to map null WTFStrings to zero pointers.
- ASSERT(!String().charactersWithNullTermination().data());
- return sqlite3_bind_text16(m_statement, index, text.charactersWithNullTermination().data(), sizeof(UChar) * text.length(), SQLITE_TRANSIENT);
-}
-
-int SQLiteStatement::bindInt(int index, int integer)
-{
- ASSERT(m_isPrepared);
- ASSERT(index > 0);
- ASSERT(static_cast<unsigned>(index) <= bindParameterCount());
-
- return sqlite3_bind_int(m_statement, index, integer);
-}
-
-int SQLiteStatement::bindInt64(int index, int64_t integer)
-{
- ASSERT(m_isPrepared);
- ASSERT(index > 0);
- ASSERT(static_cast<unsigned>(index) <= bindParameterCount());
-
- return sqlite3_bind_int64(m_statement, index, integer);
-}
-
-int SQLiteStatement::bindDouble(int index, double number)
-{
- ASSERT(m_isPrepared);
- ASSERT(index > 0);
- ASSERT(static_cast<unsigned>(index) <= bindParameterCount());
-
- return sqlite3_bind_double(m_statement, index, number);
-}
-
-int SQLiteStatement::bindNull(int index)
-{
- ASSERT(m_isPrepared);
- ASSERT(index > 0);
- ASSERT(static_cast<unsigned>(index) <= bindParameterCount());
-
- return sqlite3_bind_null(m_statement, index);
-}
-
-int SQLiteStatement::bindValue(int index, const SQLValue& value)
-{
- switch (value.type()) {
- case SQLValue::StringValue:
- return bindText(index, value.string());
- case SQLValue::NumberValue:
- return bindDouble(index, value.number());
- case SQLValue::NullValue:
- return bindNull(index);
- }
-
- ASSERT_NOT_REACHED();
- return SQLITE_ERROR;
-}
-
-unsigned SQLiteStatement::bindParameterCount() const
-{
- ASSERT(m_isPrepared);
- if (!m_statement)
- return 0;
- return sqlite3_bind_parameter_count(m_statement);
-}
-
-int SQLiteStatement::columnCount()
-{
- ASSERT(m_isPrepared);
- if (!m_statement)
- return 0;
- return sqlite3_data_count(m_statement);
-}
-
-bool SQLiteStatement::isColumnNull(int col)
-{
- ASSERT(col >= 0);
- if (!m_statement)
- if (prepareAndStep() != SQLITE_ROW)
- return false;
- if (columnCount() <= col)
- return false;
-
- return sqlite3_column_type(m_statement, col) == SQLITE_NULL;
-}
-
-bool SQLiteStatement::isColumnDeclaredAsBlob(int col)
-{
- ASSERT(col >= 0);
- if (!m_statement) {
- if (prepare() != SQLITE_OK)
- return false;
- }
-
- return equalIgnoringCase(String("BLOB"), String(reinterpret_cast<const UChar*>(sqlite3_column_decltype16(m_statement, col))));
-}
-
-String SQLiteStatement::getColumnName(int col)
-{
- ASSERT(col >= 0);
- if (!m_statement)
- if (prepareAndStep() != SQLITE_ROW)
- return String();
- if (columnCount() <= col)
- return String();
- return String(reinterpret_cast<const UChar*>(sqlite3_column_name16(m_statement, col)));
-}
-
-SQLValue SQLiteStatement::getColumnValue(int col)
-{
- ASSERT(col >= 0);
- if (!m_statement)
- if (prepareAndStep() != SQLITE_ROW)
- return SQLValue();
- if (columnCount() <= col)
- return SQLValue();
-
- // SQLite is typed per value. optional column types are
- // "(mostly) ignored"
- sqlite3_value* value = sqlite3_column_value(m_statement, col);
- switch (sqlite3_value_type(value)) {
- case SQLITE_INTEGER: // SQLValue and JS don't represent integers, so use FLOAT -case
- case SQLITE_FLOAT:
- return SQLValue(sqlite3_value_double(value));
- case SQLITE_BLOB: // SQLValue and JS don't represent blobs, so use TEXT -case
- case SQLITE_TEXT: {
- const UChar* string = reinterpret_cast<const UChar*>(sqlite3_value_text16(value));
- unsigned length = WTF::lengthOfNullTerminatedString(string);
- return SQLValue(StringImpl::create8BitIfPossible(string, length));
- }
- case SQLITE_NULL:
- return SQLValue();
- default:
- break;
- }
- ASSERT_NOT_REACHED();
- return SQLValue();
-}
-
-String SQLiteStatement::getColumnText(int col)
-{
- ASSERT(col >= 0);
- if (!m_statement)
- if (prepareAndStep() != SQLITE_ROW)
- return String();
- if (columnCount() <= col)
- return String();
- const UChar* string = reinterpret_cast<const UChar*>(sqlite3_column_text16(m_statement, col));
- return StringImpl::create8BitIfPossible(string, sqlite3_column_bytes16(m_statement, col) / sizeof(UChar));
-}
-
-double SQLiteStatement::getColumnDouble(int col)
-{
- ASSERT(col >= 0);
- if (!m_statement)
- if (prepareAndStep() != SQLITE_ROW)
- return 0.0;
- if (columnCount() <= col)
- return 0.0;
- return sqlite3_column_double(m_statement, col);
-}
-
-int SQLiteStatement::getColumnInt(int col)
-{
- ASSERT(col >= 0);
- if (!m_statement)
- if (prepareAndStep() != SQLITE_ROW)
- return 0;
- if (columnCount() <= col)
- return 0;
- return sqlite3_column_int(m_statement, col);
-}
-
-int64_t SQLiteStatement::getColumnInt64(int col)
-{
- ASSERT(col >= 0);
- if (!m_statement)
- if (prepareAndStep() != SQLITE_ROW)
- return 0;
- if (columnCount() <= col)
- return 0;
- return sqlite3_column_int64(m_statement, col);
-}
-
-String SQLiteStatement::getColumnBlobAsString(int col)
-{
- ASSERT(col >= 0);
-
- if (!m_statement && prepareAndStep() != SQLITE_ROW)
- return String();
-
- if (columnCount() <= col)
- return String();
-
- const void* blob = sqlite3_column_blob(m_statement, col);
- if (!blob)
- return String();
-
- int size = sqlite3_column_bytes(m_statement, col);
- if (size < 0)
- return String();
-
- ASSERT(!(size % sizeof(UChar)));
- return String(static_cast<const UChar*>(blob), size / sizeof(UChar));
-}
-
-void SQLiteStatement::getColumnBlobAsVector(int col, Vector<char>& result)
-{
- ASSERT(col >= 0);
-
- if (!m_statement && prepareAndStep() != SQLITE_ROW) {
- result.clear();
- return;
- }
-
- if (columnCount() <= col) {
- result.clear();
- return;
- }
-
- const void* blob = sqlite3_column_blob(m_statement, col);
- if (!blob) {
- result.clear();
- return;
- }
-
- int size = sqlite3_column_bytes(m_statement, col);
- result.resize((size_t)size);
- for (int i = 0; i < size; ++i)
- result[i] = (static_cast<const unsigned char*>(blob))[i];
-}
-
-const void* SQLiteStatement::getColumnBlob(int col, int& size)
-{
- ASSERT(col >= 0);
-
- size = 0;
-
- if (finalize() != SQLITE_OK)
- LOG(SQLDatabase, "Finalize failed");
- if (prepare() != SQLITE_OK) {
- LOG(SQLDatabase, "Prepare failed");
- return 0;
- }
- if (step() != SQLITE_ROW) {
- LOG(SQLDatabase, "Step wasn't a row");
- return 0;
- }
-
- if (columnCount() <= col)
- return 0;
-
- const void* blob = sqlite3_column_blob(m_statement, col);
- if (!blob)
- return 0;
-
- size = sqlite3_column_bytes(m_statement, col);
- return blob;
-}
-
-bool SQLiteStatement::returnTextResults(int col, Vector<String>& v)
-{
- ASSERT(col >= 0);
-
- v.clear();
-
- if (m_statement)
- finalize();
- if (prepare() != SQLITE_OK)
- return false;
-
- while (step() == SQLITE_ROW)
- v.append(getColumnText(col));
- bool result = true;
- if (m_database.lastError() != SQLITE_DONE) {
- result = false;
- LOG(SQLDatabase, "Error reading results from database query %s", m_query.ascii().data());
- }
- finalize();
- return result;
-}
-
-bool SQLiteStatement::returnIntResults(int col, Vector<int>& v)
-{
- v.clear();
-
- if (m_statement)
- finalize();
- if (prepare() != SQLITE_OK)
- return false;
-
- while (step() == SQLITE_ROW)
- v.append(getColumnInt(col));
- bool result = true;
- if (m_database.lastError() != SQLITE_DONE) {
- result = false;
- LOG(SQLDatabase, "Error reading results from database query %s", m_query.ascii().data());
- }
- finalize();
- return result;
-}
-
-bool SQLiteStatement::returnInt64Results(int col, Vector<int64_t>& v)
-{
- v.clear();
-
- if (m_statement)
- finalize();
- if (prepare() != SQLITE_OK)
- return false;
-
- while (step() == SQLITE_ROW)
- v.append(getColumnInt64(col));
- bool result = true;
- if (m_database.lastError() != SQLITE_DONE) {
- result = false;
- LOG(SQLDatabase, "Error reading results from database query %s", m_query.ascii().data());
- }
- finalize();
- return result;
-}
-
-bool SQLiteStatement::returnDoubleResults(int col, Vector<double>& v)
-{
- v.clear();
-
- if (m_statement)
- finalize();
- if (prepare() != SQLITE_OK)
- return false;
-
- while (step() == SQLITE_ROW)
- v.append(getColumnDouble(col));
- bool result = true;
- if (m_database.lastError() != SQLITE_DONE) {
- result = false;
- LOG(SQLDatabase, "Error reading results from database query %s", m_query.ascii().data());
- }
- finalize();
- return result;
-}
-
-bool SQLiteStatement::isExpired()
-{
- return !m_statement || sqlite3_expired(m_statement);
-}
-
-} // namespace WebCore
« no previous file with comments | « Source/core/platform/sql/SQLiteStatement.h ('k') | Source/core/platform/sql/SQLiteTransaction.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698