10998b1cdac5733f299c12d88bc31ef9c8035b8faKristian Monsen// Copyright (c) 2010 The Chromium Authors. All rights reserved.
20998b1cdac5733f299c12d88bc31ef9c8035b8faKristian Monsen// Use of this source code is governed by a BSD-style license that can be
30998b1cdac5733f299c12d88bc31ef9c8035b8faKristian Monsen// found in the LICENSE file.
40998b1cdac5733f299c12d88bc31ef9c8035b8faKristian Monsen
50998b1cdac5733f299c12d88bc31ef9c8035b8faKristian Monsen#include "app/sql/statement.h"
60998b1cdac5733f299c12d88bc31ef9c8035b8faKristian Monsen
70998b1cdac5733f299c12d88bc31ef9c8035b8faKristian Monsen#include "base/logging.h"
80998b1cdac5733f299c12d88bc31ef9c8035b8faKristian Monsen#include "base/utf_string_conversions.h"
900d26a728db2814620f390b418a7d6325ce5aca6Ben Murdoch#ifdef ANDROID
1000d26a728db2814620f390b418a7d6325ce5aca6Ben Murdoch#include "sqlite3.h"
1100d26a728db2814620f390b418a7d6325ce5aca6Ben Murdoch#else
123345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "third_party/sqlite/sqlite3.h"
13bc7e0823f37810f402bf7f115ee7ccd673f5ac34Iain Merrick#endif
140998b1cdac5733f299c12d88bc31ef9c8035b8faKristian Monsen
150998b1cdac5733f299c12d88bc31ef9c8035b8faKristian Monsennamespace sql {
160998b1cdac5733f299c12d88bc31ef9c8035b8faKristian Monsen
170998b1cdac5733f299c12d88bc31ef9c8035b8faKristian Monsen// This empty constructor initializes our reference with an empty one so that
180998b1cdac5733f299c12d88bc31ef9c8035b8faKristian Monsen// we don't have to NULL-check the ref_ to see if the statement is valid: we
190998b1cdac5733f299c12d88bc31ef9c8035b8faKristian Monsen// only have to check the ref's validity bit.
200998b1cdac5733f299c12d88bc31ef9c8035b8faKristian MonsenStatement::Statement()
210998b1cdac5733f299c12d88bc31ef9c8035b8faKristian Monsen    : ref_(new Connection::StatementRef),
220998b1cdac5733f299c12d88bc31ef9c8035b8faKristian Monsen      succeeded_(false) {
230998b1cdac5733f299c12d88bc31ef9c8035b8faKristian Monsen}
240998b1cdac5733f299c12d88bc31ef9c8035b8faKristian Monsen
250998b1cdac5733f299c12d88bc31ef9c8035b8faKristian MonsenStatement::Statement(scoped_refptr<Connection::StatementRef> ref)
260998b1cdac5733f299c12d88bc31ef9c8035b8faKristian Monsen    : ref_(ref),
270998b1cdac5733f299c12d88bc31ef9c8035b8faKristian Monsen      succeeded_(false) {
280998b1cdac5733f299c12d88bc31ef9c8035b8faKristian Monsen}
290998b1cdac5733f299c12d88bc31ef9c8035b8faKristian Monsen
300998b1cdac5733f299c12d88bc31ef9c8035b8faKristian MonsenStatement::~Statement() {
310998b1cdac5733f299c12d88bc31ef9c8035b8faKristian Monsen  // Free the resources associated with this statement. We assume there's only
320998b1cdac5733f299c12d88bc31ef9c8035b8faKristian Monsen  // one statement active for a given sqlite3_stmt at any time, so this won't
330998b1cdac5733f299c12d88bc31ef9c8035b8faKristian Monsen  // mess with anything.
340998b1cdac5733f299c12d88bc31ef9c8035b8faKristian Monsen  Reset();
350998b1cdac5733f299c12d88bc31ef9c8035b8faKristian Monsen}
360998b1cdac5733f299c12d88bc31ef9c8035b8faKristian Monsen
370998b1cdac5733f299c12d88bc31ef9c8035b8faKristian Monsenvoid Statement::Assign(scoped_refptr<Connection::StatementRef> ref) {
380998b1cdac5733f299c12d88bc31ef9c8035b8faKristian Monsen  Reset();
390998b1cdac5733f299c12d88bc31ef9c8035b8faKristian Monsen  ref_ = ref;
400998b1cdac5733f299c12d88bc31ef9c8035b8faKristian Monsen}
410998b1cdac5733f299c12d88bc31ef9c8035b8faKristian Monsen
420998b1cdac5733f299c12d88bc31ef9c8035b8faKristian Monsenbool Statement::Run() {
430998b1cdac5733f299c12d88bc31ef9c8035b8faKristian Monsen  if (!is_valid())
440998b1cdac5733f299c12d88bc31ef9c8035b8faKristian Monsen    return false;
450998b1cdac5733f299c12d88bc31ef9c8035b8faKristian Monsen  return CheckError(sqlite3_step(ref_->stmt())) == SQLITE_DONE;
460998b1cdac5733f299c12d88bc31ef9c8035b8faKristian Monsen}
470998b1cdac5733f299c12d88bc31ef9c8035b8faKristian Monsen
480998b1cdac5733f299c12d88bc31ef9c8035b8faKristian Monsenbool Statement::Step() {
490998b1cdac5733f299c12d88bc31ef9c8035b8faKristian Monsen  if (!is_valid())
500998b1cdac5733f299c12d88bc31ef9c8035b8faKristian Monsen    return false;
510998b1cdac5733f299c12d88bc31ef9c8035b8faKristian Monsen  return CheckError(sqlite3_step(ref_->stmt())) == SQLITE_ROW;
520998b1cdac5733f299c12d88bc31ef9c8035b8faKristian Monsen}
530998b1cdac5733f299c12d88bc31ef9c8035b8faKristian Monsen
540998b1cdac5733f299c12d88bc31ef9c8035b8faKristian Monsenvoid Statement::Reset() {
550998b1cdac5733f299c12d88bc31ef9c8035b8faKristian Monsen  if (is_valid()) {
560998b1cdac5733f299c12d88bc31ef9c8035b8faKristian Monsen    // We don't call CheckError() here because sqlite3_reset() returns
570998b1cdac5733f299c12d88bc31ef9c8035b8faKristian Monsen    // the last error that Step() caused thereby generating a second
580998b1cdac5733f299c12d88bc31ef9c8035b8faKristian Monsen    // spurious error callback.
590998b1cdac5733f299c12d88bc31ef9c8035b8faKristian Monsen    sqlite3_clear_bindings(ref_->stmt());
600998b1cdac5733f299c12d88bc31ef9c8035b8faKristian Monsen    sqlite3_reset(ref_->stmt());
610998b1cdac5733f299c12d88bc31ef9c8035b8faKristian Monsen  }
620998b1cdac5733f299c12d88bc31ef9c8035b8faKristian Monsen  succeeded_ = false;
630998b1cdac5733f299c12d88bc31ef9c8035b8faKristian Monsen}
640998b1cdac5733f299c12d88bc31ef9c8035b8faKristian Monsen
650998b1cdac5733f299c12d88bc31ef9c8035b8faKristian Monsenbool Statement::Succeeded() const {
660998b1cdac5733f299c12d88bc31ef9c8035b8faKristian Monsen  if (!is_valid())
670998b1cdac5733f299c12d88bc31ef9c8035b8faKristian Monsen    return false;
680998b1cdac5733f299c12d88bc31ef9c8035b8faKristian Monsen  return succeeded_;
690998b1cdac5733f299c12d88bc31ef9c8035b8faKristian Monsen}
700998b1cdac5733f299c12d88bc31ef9c8035b8faKristian Monsen
710998b1cdac5733f299c12d88bc31ef9c8035b8faKristian Monsenbool Statement::BindNull(int col) {
720998b1cdac5733f299c12d88bc31ef9c8035b8faKristian Monsen  if (is_valid()) {
730998b1cdac5733f299c12d88bc31ef9c8035b8faKristian Monsen    int err = CheckError(sqlite3_bind_null(ref_->stmt(), col + 1));
740998b1cdac5733f299c12d88bc31ef9c8035b8faKristian Monsen    return err == SQLITE_OK;
750998b1cdac5733f299c12d88bc31ef9c8035b8faKristian Monsen  }
760998b1cdac5733f299c12d88bc31ef9c8035b8faKristian Monsen  return false;
770998b1cdac5733f299c12d88bc31ef9c8035b8faKristian Monsen}
780998b1cdac5733f299c12d88bc31ef9c8035b8faKristian Monsen
790998b1cdac5733f299c12d88bc31ef9c8035b8faKristian Monsenbool Statement::BindBool(int col, bool val) {
800998b1cdac5733f299c12d88bc31ef9c8035b8faKristian Monsen  return BindInt(col, val ? 1 : 0);
810998b1cdac5733f299c12d88bc31ef9c8035b8faKristian Monsen}
820998b1cdac5733f299c12d88bc31ef9c8035b8faKristian Monsen
830998b1cdac5733f299c12d88bc31ef9c8035b8faKristian Monsenbool Statement::BindInt(int col, int val) {
840998b1cdac5733f299c12d88bc31ef9c8035b8faKristian Monsen  if (is_valid()) {
850998b1cdac5733f299c12d88bc31ef9c8035b8faKristian Monsen    int err = CheckError(sqlite3_bind_int(ref_->stmt(), col + 1, val));
860998b1cdac5733f299c12d88bc31ef9c8035b8faKristian Monsen    return err == SQLITE_OK;
870998b1cdac5733f299c12d88bc31ef9c8035b8faKristian Monsen  }
880998b1cdac5733f299c12d88bc31ef9c8035b8faKristian Monsen  return false;
890998b1cdac5733f299c12d88bc31ef9c8035b8faKristian Monsen}
900998b1cdac5733f299c12d88bc31ef9c8035b8faKristian Monsen
910998b1cdac5733f299c12d88bc31ef9c8035b8faKristian Monsenbool Statement::BindInt64(int col, int64 val) {
920998b1cdac5733f299c12d88bc31ef9c8035b8faKristian Monsen  if (is_valid()) {
930998b1cdac5733f299c12d88bc31ef9c8035b8faKristian Monsen    int err = CheckError(sqlite3_bind_int64(ref_->stmt(), col + 1, val));
940998b1cdac5733f299c12d88bc31ef9c8035b8faKristian Monsen    return err == SQLITE_OK;
950998b1cdac5733f299c12d88bc31ef9c8035b8faKristian Monsen  }
960998b1cdac5733f299c12d88bc31ef9c8035b8faKristian Monsen  return false;
970998b1cdac5733f299c12d88bc31ef9c8035b8faKristian Monsen}
980998b1cdac5733f299c12d88bc31ef9c8035b8faKristian Monsen
990998b1cdac5733f299c12d88bc31ef9c8035b8faKristian Monsenbool Statement::BindDouble(int col, double val) {
1000998b1cdac5733f299c12d88bc31ef9c8035b8faKristian Monsen  if (is_valid()) {
1010998b1cdac5733f299c12d88bc31ef9c8035b8faKristian Monsen    int err = CheckError(sqlite3_bind_double(ref_->stmt(), col + 1, val));
1020998b1cdac5733f299c12d88bc31ef9c8035b8faKristian Monsen    return err == SQLITE_OK;
1030998b1cdac5733f299c12d88bc31ef9c8035b8faKristian Monsen  }
1040998b1cdac5733f299c12d88bc31ef9c8035b8faKristian Monsen  return false;
1050998b1cdac5733f299c12d88bc31ef9c8035b8faKristian Monsen}
1060998b1cdac5733f299c12d88bc31ef9c8035b8faKristian Monsen
1070998b1cdac5733f299c12d88bc31ef9c8035b8faKristian Monsenbool Statement::BindCString(int col, const char* val) {
1080998b1cdac5733f299c12d88bc31ef9c8035b8faKristian Monsen  if (is_valid()) {
1090998b1cdac5733f299c12d88bc31ef9c8035b8faKristian Monsen    int err = CheckError(sqlite3_bind_text(ref_->stmt(), col + 1, val, -1,
1100998b1cdac5733f299c12d88bc31ef9c8035b8faKristian Monsen                         SQLITE_TRANSIENT));
1110998b1cdac5733f299c12d88bc31ef9c8035b8faKristian Monsen    return err == SQLITE_OK;
1120998b1cdac5733f299c12d88bc31ef9c8035b8faKristian Monsen  }
1130998b1cdac5733f299c12d88bc31ef9c8035b8faKristian Monsen  return false;
1140998b1cdac5733f299c12d88bc31ef9c8035b8faKristian Monsen}
1150998b1cdac5733f299c12d88bc31ef9c8035b8faKristian Monsen
1160998b1cdac5733f299c12d88bc31ef9c8035b8faKristian Monsenbool Statement::BindString(int col, const std::string& val) {
1170998b1cdac5733f299c12d88bc31ef9c8035b8faKristian Monsen  if (is_valid()) {
1180998b1cdac5733f299c12d88bc31ef9c8035b8faKristian Monsen    int err = CheckError(sqlite3_bind_text(ref_->stmt(), col + 1, val.data(),
1190998b1cdac5733f299c12d88bc31ef9c8035b8faKristian Monsen                                           val.size(), SQLITE_TRANSIENT));
1200998b1cdac5733f299c12d88bc31ef9c8035b8faKristian Monsen    return err == SQLITE_OK;
1210998b1cdac5733f299c12d88bc31ef9c8035b8faKristian Monsen  }
1220998b1cdac5733f299c12d88bc31ef9c8035b8faKristian Monsen  return false;
1230998b1cdac5733f299c12d88bc31ef9c8035b8faKristian Monsen}
1240998b1cdac5733f299c12d88bc31ef9c8035b8faKristian Monsen
1250998b1cdac5733f299c12d88bc31ef9c8035b8faKristian Monsenbool Statement::BindString16(int col, const string16& value) {
1260998b1cdac5733f299c12d88bc31ef9c8035b8faKristian Monsen  return BindString(col, UTF16ToUTF8(value));
1270998b1cdac5733f299c12d88bc31ef9c8035b8faKristian Monsen}
1280998b1cdac5733f299c12d88bc31ef9c8035b8faKristian Monsen
1290998b1cdac5733f299c12d88bc31ef9c8035b8faKristian Monsenbool Statement::BindBlob(int col, const void* val, int val_len) {
1300998b1cdac5733f299c12d88bc31ef9c8035b8faKristian Monsen  if (is_valid()) {
1310998b1cdac5733f299c12d88bc31ef9c8035b8faKristian Monsen    int err = CheckError(sqlite3_bind_blob(ref_->stmt(), col + 1,
1320998b1cdac5733f299c12d88bc31ef9c8035b8faKristian Monsen                         val, val_len, SQLITE_TRANSIENT));
1330998b1cdac5733f299c12d88bc31ef9c8035b8faKristian Monsen    return err == SQLITE_OK;
1340998b1cdac5733f299c12d88bc31ef9c8035b8faKristian Monsen  }
1350998b1cdac5733f299c12d88bc31ef9c8035b8faKristian Monsen  return false;
1360998b1cdac5733f299c12d88bc31ef9c8035b8faKristian Monsen}
1370998b1cdac5733f299c12d88bc31ef9c8035b8faKristian Monsen
1380998b1cdac5733f299c12d88bc31ef9c8035b8faKristian Monsenint Statement::ColumnCount() const {
1390998b1cdac5733f299c12d88bc31ef9c8035b8faKristian Monsen  if (!is_valid()) {
1400998b1cdac5733f299c12d88bc31ef9c8035b8faKristian Monsen    NOTREACHED();
1410998b1cdac5733f299c12d88bc31ef9c8035b8faKristian Monsen    return 0;
1420998b1cdac5733f299c12d88bc31ef9c8035b8faKristian Monsen  }
1430998b1cdac5733f299c12d88bc31ef9c8035b8faKristian Monsen  return sqlite3_column_count(ref_->stmt());
1440998b1cdac5733f299c12d88bc31ef9c8035b8faKristian Monsen}
1450998b1cdac5733f299c12d88bc31ef9c8035b8faKristian Monsen
1460998b1cdac5733f299c12d88bc31ef9c8035b8faKristian MonsenColType Statement::ColumnType(int col) const {
1470998b1cdac5733f299c12d88bc31ef9c8035b8faKristian Monsen  // Verify that our enum matches sqlite's values.
1480998b1cdac5733f299c12d88bc31ef9c8035b8faKristian Monsen  COMPILE_ASSERT(COLUMN_TYPE_INTEGER == SQLITE_INTEGER, integer_no_match);
1490998b1cdac5733f299c12d88bc31ef9c8035b8faKristian Monsen  COMPILE_ASSERT(COLUMN_TYPE_FLOAT == SQLITE_FLOAT, float_no_match);
1500998b1cdac5733f299c12d88bc31ef9c8035b8faKristian Monsen  COMPILE_ASSERT(COLUMN_TYPE_TEXT == SQLITE_TEXT, integer_no_match);
1510998b1cdac5733f299c12d88bc31ef9c8035b8faKristian Monsen  COMPILE_ASSERT(COLUMN_TYPE_BLOB == SQLITE_BLOB, blob_no_match);
1520998b1cdac5733f299c12d88bc31ef9c8035b8faKristian Monsen  COMPILE_ASSERT(COLUMN_TYPE_NULL == SQLITE_NULL, null_no_match);
1530998b1cdac5733f299c12d88bc31ef9c8035b8faKristian Monsen
1540998b1cdac5733f299c12d88bc31ef9c8035b8faKristian Monsen  return static_cast<ColType>(sqlite3_column_type(ref_->stmt(), col));
1550998b1cdac5733f299c12d88bc31ef9c8035b8faKristian Monsen}
1560998b1cdac5733f299c12d88bc31ef9c8035b8faKristian Monsen
1570998b1cdac5733f299c12d88bc31ef9c8035b8faKristian Monsenbool Statement::ColumnBool(int col) const {
1580998b1cdac5733f299c12d88bc31ef9c8035b8faKristian Monsen  return !!ColumnInt(col);
1590998b1cdac5733f299c12d88bc31ef9c8035b8faKristian Monsen}
1600998b1cdac5733f299c12d88bc31ef9c8035b8faKristian Monsen
1610998b1cdac5733f299c12d88bc31ef9c8035b8faKristian Monsenint Statement::ColumnInt(int col) const {
1620998b1cdac5733f299c12d88bc31ef9c8035b8faKristian Monsen  if (!is_valid()) {
1630998b1cdac5733f299c12d88bc31ef9c8035b8faKristian Monsen    NOTREACHED();
1640998b1cdac5733f299c12d88bc31ef9c8035b8faKristian Monsen    return 0;
1650998b1cdac5733f299c12d88bc31ef9c8035b8faKristian Monsen  }
1660998b1cdac5733f299c12d88bc31ef9c8035b8faKristian Monsen  return sqlite3_column_int(ref_->stmt(), col);
1670998b1cdac5733f299c12d88bc31ef9c8035b8faKristian Monsen}
1680998b1cdac5733f299c12d88bc31ef9c8035b8faKristian Monsen
1690998b1cdac5733f299c12d88bc31ef9c8035b8faKristian Monsenint64 Statement::ColumnInt64(int col) const {
1700998b1cdac5733f299c12d88bc31ef9c8035b8faKristian Monsen  if (!is_valid()) {
1710998b1cdac5733f299c12d88bc31ef9c8035b8faKristian Monsen    NOTREACHED();
1720998b1cdac5733f299c12d88bc31ef9c8035b8faKristian Monsen    return 0;
1730998b1cdac5733f299c12d88bc31ef9c8035b8faKristian Monsen  }
1740998b1cdac5733f299c12d88bc31ef9c8035b8faKristian Monsen  return sqlite3_column_int64(ref_->stmt(), col);
1750998b1cdac5733f299c12d88bc31ef9c8035b8faKristian Monsen}
1760998b1cdac5733f299c12d88bc31ef9c8035b8faKristian Monsen
1770998b1cdac5733f299c12d88bc31ef9c8035b8faKristian Monsendouble Statement::ColumnDouble(int col) const {
1780998b1cdac5733f299c12d88bc31ef9c8035b8faKristian Monsen  if (!is_valid()) {
1790998b1cdac5733f299c12d88bc31ef9c8035b8faKristian Monsen    NOTREACHED();
1800998b1cdac5733f299c12d88bc31ef9c8035b8faKristian Monsen    return 0;
1810998b1cdac5733f299c12d88bc31ef9c8035b8faKristian Monsen  }
1820998b1cdac5733f299c12d88bc31ef9c8035b8faKristian Monsen  return sqlite3_column_double(ref_->stmt(), col);
1830998b1cdac5733f299c12d88bc31ef9c8035b8faKristian Monsen}
1840998b1cdac5733f299c12d88bc31ef9c8035b8faKristian Monsen
1850998b1cdac5733f299c12d88bc31ef9c8035b8faKristian Monsenstd::string Statement::ColumnString(int col) const {
1860998b1cdac5733f299c12d88bc31ef9c8035b8faKristian Monsen  if (!is_valid()) {
1870998b1cdac5733f299c12d88bc31ef9c8035b8faKristian Monsen    NOTREACHED();
1880998b1cdac5733f299c12d88bc31ef9c8035b8faKristian Monsen    return "";
1890998b1cdac5733f299c12d88bc31ef9c8035b8faKristian Monsen  }
1900998b1cdac5733f299c12d88bc31ef9c8035b8faKristian Monsen  const char* str = reinterpret_cast<const char*>(
1910998b1cdac5733f299c12d88bc31ef9c8035b8faKristian Monsen      sqlite3_column_text(ref_->stmt(), col));
1920998b1cdac5733f299c12d88bc31ef9c8035b8faKristian Monsen  int len = sqlite3_column_bytes(ref_->stmt(), col);
1930998b1cdac5733f299c12d88bc31ef9c8035b8faKristian Monsen
1940998b1cdac5733f299c12d88bc31ef9c8035b8faKristian Monsen  std::string result;
1950998b1cdac5733f299c12d88bc31ef9c8035b8faKristian Monsen  if (str && len > 0)
1960998b1cdac5733f299c12d88bc31ef9c8035b8faKristian Monsen    result.assign(str, len);
1970998b1cdac5733f299c12d88bc31ef9c8035b8faKristian Monsen  return result;
1980998b1cdac5733f299c12d88bc31ef9c8035b8faKristian Monsen}
1990998b1cdac5733f299c12d88bc31ef9c8035b8faKristian Monsen
2000998b1cdac5733f299c12d88bc31ef9c8035b8faKristian Monsenstring16 Statement::ColumnString16(int col) const {
2010998b1cdac5733f299c12d88bc31ef9c8035b8faKristian Monsen  if (!is_valid()) {
2020998b1cdac5733f299c12d88bc31ef9c8035b8faKristian Monsen    NOTREACHED();
2030998b1cdac5733f299c12d88bc31ef9c8035b8faKristian Monsen    return string16();
2040998b1cdac5733f299c12d88bc31ef9c8035b8faKristian Monsen  }
2050998b1cdac5733f299c12d88bc31ef9c8035b8faKristian Monsen  std::string s = ColumnString(col);
2060998b1cdac5733f299c12d88bc31ef9c8035b8faKristian Monsen  return !s.empty() ? UTF8ToUTF16(s) : string16();
2070998b1cdac5733f299c12d88bc31ef9c8035b8faKristian Monsen}
2080998b1cdac5733f299c12d88bc31ef9c8035b8faKristian Monsen
2090998b1cdac5733f299c12d88bc31ef9c8035b8faKristian Monsenint Statement::ColumnByteLength(int col) const {
2100998b1cdac5733f299c12d88bc31ef9c8035b8faKristian Monsen  if (!is_valid()) {
2110998b1cdac5733f299c12d88bc31ef9c8035b8faKristian Monsen    NOTREACHED();
2120998b1cdac5733f299c12d88bc31ef9c8035b8faKristian Monsen    return 0;
2130998b1cdac5733f299c12d88bc31ef9c8035b8faKristian Monsen  }
2140998b1cdac5733f299c12d88bc31ef9c8035b8faKristian Monsen  return sqlite3_column_bytes(ref_->stmt(), col);
2150998b1cdac5733f299c12d88bc31ef9c8035b8faKristian Monsen}
2160998b1cdac5733f299c12d88bc31ef9c8035b8faKristian Monsen
2170998b1cdac5733f299c12d88bc31ef9c8035b8faKristian Monsenconst void* Statement::ColumnBlob(int col) const {
2180998b1cdac5733f299c12d88bc31ef9c8035b8faKristian Monsen  if (!is_valid()) {
2190998b1cdac5733f299c12d88bc31ef9c8035b8faKristian Monsen    NOTREACHED();
2200998b1cdac5733f299c12d88bc31ef9c8035b8faKristian Monsen    return NULL;
2210998b1cdac5733f299c12d88bc31ef9c8035b8faKristian Monsen  }
2220998b1cdac5733f299c12d88bc31ef9c8035b8faKristian Monsen
2230998b1cdac5733f299c12d88bc31ef9c8035b8faKristian Monsen  return sqlite3_column_blob(ref_->stmt(), col);
2240998b1cdac5733f299c12d88bc31ef9c8035b8faKristian Monsen}
2250998b1cdac5733f299c12d88bc31ef9c8035b8faKristian Monsen
2260998b1cdac5733f299c12d88bc31ef9c8035b8faKristian Monsenbool Statement::ColumnBlobAsString(int col, std::string* blob) {
2270998b1cdac5733f299c12d88bc31ef9c8035b8faKristian Monsen  if (!is_valid()) {
2280998b1cdac5733f299c12d88bc31ef9c8035b8faKristian Monsen    NOTREACHED();
2290998b1cdac5733f299c12d88bc31ef9c8035b8faKristian Monsen    return false;
2300998b1cdac5733f299c12d88bc31ef9c8035b8faKristian Monsen  }
2310998b1cdac5733f299c12d88bc31ef9c8035b8faKristian Monsen  const void* p = ColumnBlob(col);
2320998b1cdac5733f299c12d88bc31ef9c8035b8faKristian Monsen  size_t len = ColumnByteLength(col);
2330998b1cdac5733f299c12d88bc31ef9c8035b8faKristian Monsen  blob->resize(len);
2340998b1cdac5733f299c12d88bc31ef9c8035b8faKristian Monsen  if (blob->size() != len) {
2350998b1cdac5733f299c12d88bc31ef9c8035b8faKristian Monsen    return false;
2360998b1cdac5733f299c12d88bc31ef9c8035b8faKristian Monsen  }
2370998b1cdac5733f299c12d88bc31ef9c8035b8faKristian Monsen  blob->assign(reinterpret_cast<const char*>(p), len);
2380998b1cdac5733f299c12d88bc31ef9c8035b8faKristian Monsen  return true;
2390998b1cdac5733f299c12d88bc31ef9c8035b8faKristian Monsen}
2400998b1cdac5733f299c12d88bc31ef9c8035b8faKristian Monsen
2410998b1cdac5733f299c12d88bc31ef9c8035b8faKristian Monsenvoid Statement::ColumnBlobAsVector(int col, std::vector<char>* val) const {
2420998b1cdac5733f299c12d88bc31ef9c8035b8faKristian Monsen  val->clear();
2430998b1cdac5733f299c12d88bc31ef9c8035b8faKristian Monsen  if (!is_valid()) {
2440998b1cdac5733f299c12d88bc31ef9c8035b8faKristian Monsen    NOTREACHED();
2450998b1cdac5733f299c12d88bc31ef9c8035b8faKristian Monsen    return;
2460998b1cdac5733f299c12d88bc31ef9c8035b8faKristian Monsen  }
2470998b1cdac5733f299c12d88bc31ef9c8035b8faKristian Monsen
2480998b1cdac5733f299c12d88bc31ef9c8035b8faKristian Monsen  const void* data = sqlite3_column_blob(ref_->stmt(), col);
2490998b1cdac5733f299c12d88bc31ef9c8035b8faKristian Monsen  int len = sqlite3_column_bytes(ref_->stmt(), col);
2500998b1cdac5733f299c12d88bc31ef9c8035b8faKristian Monsen  if (data && len > 0) {
2510998b1cdac5733f299c12d88bc31ef9c8035b8faKristian Monsen    val->resize(len);
2520998b1cdac5733f299c12d88bc31ef9c8035b8faKristian Monsen    memcpy(&(*val)[0], data, len);
2530998b1cdac5733f299c12d88bc31ef9c8035b8faKristian Monsen  }
2540998b1cdac5733f299c12d88bc31ef9c8035b8faKristian Monsen}
2550998b1cdac5733f299c12d88bc31ef9c8035b8faKristian Monsen
2560998b1cdac5733f299c12d88bc31ef9c8035b8faKristian Monsenvoid Statement::ColumnBlobAsVector(
2570998b1cdac5733f299c12d88bc31ef9c8035b8faKristian Monsen    int col,
2580998b1cdac5733f299c12d88bc31ef9c8035b8faKristian Monsen    std::vector<unsigned char>* val) const {
2590998b1cdac5733f299c12d88bc31ef9c8035b8faKristian Monsen  ColumnBlobAsVector(col, reinterpret_cast< std::vector<char>* >(val));
2600998b1cdac5733f299c12d88bc31ef9c8035b8faKristian Monsen}
2610998b1cdac5733f299c12d88bc31ef9c8035b8faKristian Monsen
2620998b1cdac5733f299c12d88bc31ef9c8035b8faKristian Monsenconst char* Statement::GetSQLStatement() {
2630998b1cdac5733f299c12d88bc31ef9c8035b8faKristian Monsen  return sqlite3_sql(ref_->stmt());
2640998b1cdac5733f299c12d88bc31ef9c8035b8faKristian Monsen}
2650998b1cdac5733f299c12d88bc31ef9c8035b8faKristian Monsen
2660998b1cdac5733f299c12d88bc31ef9c8035b8faKristian Monsenint Statement::CheckError(int err) {
2670998b1cdac5733f299c12d88bc31ef9c8035b8faKristian Monsen  // Please don't add DCHECKs here, OnSqliteError() already has them.
2680998b1cdac5733f299c12d88bc31ef9c8035b8faKristian Monsen  succeeded_ = (err == SQLITE_OK || err == SQLITE_ROW || err == SQLITE_DONE);
2690998b1cdac5733f299c12d88bc31ef9c8035b8faKristian Monsen  if (!succeeded_ && is_valid())
2700998b1cdac5733f299c12d88bc31ef9c8035b8faKristian Monsen    return ref_->connection()->OnSqliteError(err, this);
2710998b1cdac5733f299c12d88bc31ef9c8035b8faKristian Monsen  return err;
2720998b1cdac5733f299c12d88bc31ef9c8035b8faKristian Monsen}
2730998b1cdac5733f299c12d88bc31ef9c8035b8faKristian Monsen
2740998b1cdac5733f299c12d88bc31ef9c8035b8faKristian Monsen}  // namespace sql
275