bzr branch
http://bzr.ed.am/sqlite3cc
| 1
by edam - initial commit | 1 | /* | 
| 2
by edam - further initial development | 2 | * query.cc | 
| 1
by edam - initial commit | 3 | * | 
| 22
by edam updated email and web addresses | 4 | * Copyright (C) 2009 Tim Marston <tim@ed.am> | 
| 1
by edam - initial commit | 5 | * | 
| 2
by edam - further initial development | 6 | * This file is part of sqlite3cc (hereafter referred to as "this program"). | 
| 22
by edam updated email and web addresses | 7 | * See http://ed.am/dev/sqlite3cc for more information. | 
| 8 | * | |
| 9 | * This program is free software: you can redistribute it and/or modify it under | |
| 10 | * the terms of the GNU Lesser General Public License as published by the Free | |
| 11 | * Software Foundation, either version 3 of the License, or (at your option) any | |
| 12 | * later version. | |
| 13 | * | |
| 14 | * This program is distributed in the hope that it will be useful, but WITHOUT | |
| 15 | * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS | |
| 16 | * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more | |
| 17 | * details. | |
| 1
by edam - initial commit | 18 | * | 
| 19 | * You should have received a copy of the GNU Lesser General Public License | |
| 20 | * along with this program. If not, see <http://www.gnu.org/licenses/>. | |
| 21 | */ | |
| 22 | ||
| 2
by edam - further initial development | 23 | #include <sqlite3cc/query.h> | 
| 24 | #include <sqlite3cc/row.h> | |
| 16
by edam - renamed database to connection to better identify what it is (would database_connection be better though?) | 25 | #include <sqlite3cc/connection.h> | 
| 2
by edam - further initial development | 26 | #include <assert.h> | 
| 27 | ||
| 28 | ||
| 29 | sqlite::query::query( | |
| 16
by edam - renamed database to connection to better identify what it is (would database_connection be better though?) | 30 | connection &connection, | 
| 2
by edam - further initial development | 31 | const std::string &sql ) | 
| 32 | : | |
| 16
by edam - renamed database to connection to better identify what it is (would database_connection be better though?) | 33 | basic_statement( connection, sql ), | 
| 34 | _next_row_number( 0 ) | |
| 2
by edam - further initial development | 35 | {
 | 
| 36 | assert( sqlite3_column_count( _handle ) > 0 ); | |
| 37 | } | |
| 38 | ||
| 39 | ||
| 40 | sqlite::query::query( | |
| 16
by edam - renamed database to connection to better identify what it is (would database_connection be better though?) | 41 | connection &connection ) | 
| 2
by edam - further initial development | 42 | : | 
| 16
by edam - renamed database to connection to better identify what it is (would database_connection be better though?) | 43 | basic_statement( connection ), | 
| 44 | _next_row_number( 0 ) | |
| 2
by edam - further initial development | 45 | {
 | 
| 46 | } | |
| 47 | ||
| 48 | ||
| 49 | int sqlite::query::prepare( | |
| 50 | const std::string &sql ) | |
| 51 | {
 | |
| 16
by edam - renamed database to connection to better identify what it is (would database_connection be better though?) | 52 | _next_row_number = 0; | 
| 13
by edam - made basic_statement::step() protected, for use by query and command only | 53 | int code = basic_statement::prepare( sql ); | 
| 54 | assert( code != SQLITE_OK || sqlite3_column_count( _handle ) > 0 ); | |
| 55 | return code; | |
| 2
by edam - further initial development | 56 | } | 
| 57 | ||
| 58 | ||
| 16
by edam - renamed database to connection to better identify what it is (would database_connection be better though?) | 59 | int sqlite::query::reset() | 
| 60 | {
 | |
| 61 | _next_row_number = 0; | |
| 62 | return basic_statement::reset(); | |
| 63 | } | |
| 64 | ||
| 65 | ||
| 2
by edam - further initial development | 66 | sqlite::row sqlite::query::step() | 
| 67 | {
 | |
| 16
by edam - renamed database to connection to better identify what it is (would database_connection be better though?) | 68 | connection::mutex_guard lock( _connection ); | 
| 13
by edam - made basic_statement::step() protected, for use by query and command only | 69 | |
| 70 | int code = basic_statement::step(); | |
| 71 | if( code == SQLITE_DONE ) return row(); | |
| 16
by edam - renamed database to connection to better identify what it is (would database_connection be better though?) | 72 | if( code == SQLITE_ROW ) return row( _handle, _next_row_number++ ); | 
| 13
by edam - made basic_statement::step() protected, for use by query and command only | 73 | |
| 16
by edam - renamed database to connection to better identify what it is (would database_connection be better though?) | 74 | throw sqlite_error( _connection, code ); | 
| 2
by edam - further initial development | 75 | } | 
| 76 | ||
| 77 | ||
| 78 | unsigned int sqlite::query::column_count() | |
| 79 | {
 | |
| 80 | return sqlite3_column_count( _handle ); | |
| 81 | } | |
| 9
by edam - added NEWS | 82 | |
| 83 | ||
| 84 | const std::string sqlite::query::column_name( | |
| 85 | unsigned int index ) | |
| 86 | {
 | |
| 87 | assert( index < | |
| 88 | static_cast< unsigned int >( sqlite3_column_count( _handle ) ) ); | |
| 89 | return sqlite3_column_name( _handle, index ); | |
| 90 | } | |
| 91 | ||
| 92 | ||
| 16
by edam - renamed database to connection to better identify what it is (would database_connection be better though?) | 93 | unsigned long long sqlite::query::num_results() | 
| 94 | {
 | |
| 95 | reset(); | |
| 96 | unsigned long long count = 0; | |
| 97 | while( step() ) count++; | |
| 98 | reset(); | |
| 99 | return count; | |
| 100 | } | |
| 101 | ||
| 102 | ||
| 9
by edam - added NEWS | 103 | sqlite::query::iterator::iterator( | 
| 104 | sqlite::query &query, | |
| 16
by edam - renamed database to connection to better identify what it is (would database_connection be better though?) | 105 | bool step ) | 
| 9
by edam - added NEWS | 106 | : | 
| 107 | _query( query ) | |
| 108 | {
 | |
| 16
by edam - renamed database to connection to better identify what it is (would database_connection be better though?) | 109 | if( step ) increment(); | 
| 9
by edam - added NEWS | 110 | } | 
| 111 | ||
| 112 | ||
| 113 | sqlite::row sqlite::query::iterator::dereference() const | |
| 114 | {
 | |
| 16
by edam - renamed database to connection to better identify what it is (would database_connection be better though?) | 115 | return _row; | 
| 9
by edam - added NEWS | 116 | } | 
| 117 | ||
| 118 | ||
| 119 | void sqlite::query::iterator::increment() | |
| 120 | {
 | |
| 16
by edam - renamed database to connection to better identify what it is (would database_connection be better though?) | 121 | _row = _query.step(); | 
| 9
by edam - added NEWS | 122 | } | 
| 123 | ||
| 124 | ||
| 125 | bool sqlite::query::iterator::equal( | |
| 126 | sqlite::query::iterator const &other ) | |
| 127 | const | |
| 128 | {
 | |
| 16
by edam - renamed database to connection to better identify what it is (would database_connection be better though?) | 129 | return _row == other._row; | 
| 9
by edam - added NEWS | 130 | } | 
| 131 | ||
| 132 | ||
| 133 | sqlite::query::iterator sqlite::query::begin() | |
| 134 | {
 | |
| 16
by edam - renamed database to connection to better identify what it is (would database_connection be better though?) | 135 | reset(); | 
| 9
by edam - added NEWS | 136 | return sqlite::query::iterator( *this, true ); | 
| 137 | } | |
| 138 | ||
| 139 | ||
| 140 | sqlite::query::iterator sqlite::query::end() | |
| 141 | {
 | |
| 142 | return sqlite::query::iterator( *this, false ); | |
| 143 | } | |
| 13
by edam - made basic_statement::step() protected, for use by query and command only | 144 |