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