extensions/sqlite/driver/SqQuery.cpp
author David Anderson <dvander@alliedmods.net>
Wed Aug 01 01:54:53 2007 +0000 (2007-08-01)
changeset 1226 478550a4d5ec
parent 1210 18e60c8737a2
child 1330 ab94316bb52b
permissions -rw-r--r--
updated license headers for most extensions
updated sdk bases for most extensions
dvander@1203
     1
/**
dvander@1203
     2
 * vim: set ts=4 :
dvander@1226
     3
 * ================================================================
dvander@1226
     4
 * SourceMod SQLite Extension
dvander@1226
     5
 * Copyright (C) 2004-2007 AlliedModders LLC.  All rights reserved.
dvander@1226
     6
 * ================================================================
dvander@1203
     7
 *
dvander@1226
     8
 * This program is free software; you can redistribute it and/or 
dvander@1226
     9
 * modify it under the terms of the GNU General Public License, 
dvander@1226
    10
 * version 3.0, as published by the Free Software Foundation.
dvander@1226
    11
 * 
dvander@1203
    12
 * This program is distributed in the hope that it will be useful,
dvander@1203
    13
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
dvander@1203
    14
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
dvander@1203
    15
 * GNU General Public License for more details.
dvander@1226
    16
 *
dvander@1203
    17
 * You should have received a copy of the GNU General Public License
dvander@1226
    18
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
dvander@1226
    19
 *
dvander@1226
    20
 * As a special exception, AlliedModders LLC gives you permission to 
dvander@1226
    21
 * link the code of this program (as well as its derivative works) to 
dvander@1226
    22
 * "Half-Life 2," the "Source Engine," the "SourcePawn JIT," and any 
dvander@1226
    23
 * Game MODs that run on software by the Valve Corporation.  You must 
dvander@1226
    24
 * obey the GNU General Public License in all respects for all other 
dvander@1226
    25
 * code used. Additionally, AlliedModders LLC grants this exception 
dvander@1226
    26
 * to all derivative works. AlliedModders LLC defines further 
dvander@1226
    27
 * exceptions, found in LICENSE.txt (as of this writing, version 
dvander@1226
    28
 * JULY-31-2007), or <http://www.sourcemod.net/license.php>.
dvander@1203
    29
 *
dvander@1203
    30
 * Version: $Id$
dvander@1203
    31
 */
dvander@1203
    32
dvander@1203
    33
#include "SqQuery.h"
dvander@1203
    34
dvander@1203
    35
SqQuery::SqQuery(SqDatabase *parent, sqlite3_stmt *stmt) : 
dvander@1203
    36
 m_pParent(parent), m_pStmt(stmt), m_pResults(NULL), m_AffectedRows(0), m_InsertID(0)
dvander@1203
    37
{
dvander@1203
    38
	m_ParamCount = sqlite3_bind_parameter_count(m_pStmt);
dvander@1210
    39
	m_ColCount = sqlite3_column_count(m_pStmt);
dvander@1203
    40
	m_pParent->IncReferenceCount();
dvander@1203
    41
}
dvander@1203
    42
dvander@1203
    43
SqQuery::~SqQuery()
dvander@1203
    44
{
dvander@1203
    45
	delete m_pResults;
dvander@1203
    46
	sqlite3_finalize(m_pStmt);
dvander@1203
    47
	m_pParent->Close();
dvander@1203
    48
}
dvander@1203
    49
dvander@1203
    50
IResultSet *SqQuery::GetResultSet()
dvander@1203
    51
{
dvander@1203
    52
	return m_pResults;
dvander@1203
    53
}
dvander@1203
    54
dvander@1203
    55
bool SqQuery::FetchMoreResults()
dvander@1203
    56
{
dvander@1203
    57
	/* We never have multiple result sets */
dvander@1203
    58
	return false;
dvander@1203
    59
}
dvander@1203
    60
dvander@1203
    61
void SqQuery::Destroy()
dvander@1203
    62
{
dvander@1203
    63
	delete this;
dvander@1203
    64
}
dvander@1203
    65
dvander@1203
    66
bool SqQuery::BindParamFloat(unsigned int param, float f)
dvander@1203
    67
{
dvander@1203
    68
	/* SQLite is 1 indexed */
dvander@1203
    69
	param++;
dvander@1203
    70
dvander@1203
    71
	if (param > m_ParamCount)
dvander@1203
    72
	{
dvander@1203
    73
		return false;
dvander@1203
    74
	}
dvander@1203
    75
dvander@1203
    76
	return (sqlite3_bind_double(m_pStmt, param, (double)f) == SQLITE_OK);
dvander@1203
    77
}
dvander@1203
    78
dvander@1203
    79
bool SqQuery::BindParamNull(unsigned int param)
dvander@1203
    80
{
dvander@1203
    81
	/* SQLite is 1 indexed */
dvander@1203
    82
	param++;
dvander@1203
    83
dvander@1203
    84
	if (param > m_ParamCount)
dvander@1203
    85
	{
dvander@1203
    86
		return false;
dvander@1203
    87
	}
dvander@1203
    88
dvander@1203
    89
	return (sqlite3_bind_null(m_pStmt, param) == SQLITE_OK);
dvander@1203
    90
}
dvander@1203
    91
dvander@1203
    92
bool SqQuery::BindParamString(unsigned int param, const char *text, bool copy)
dvander@1203
    93
{
dvander@1203
    94
	/* SQLite is 1 indexed */
dvander@1203
    95
	param++;
dvander@1203
    96
dvander@1203
    97
	if (param > m_ParamCount)
dvander@1203
    98
	{
dvander@1203
    99
		return false;
dvander@1203
   100
	}
dvander@1203
   101
dvander@1203
   102
	return (sqlite3_bind_text(m_pStmt, param, text, -1, copy ? SQLITE_TRANSIENT : SQLITE_STATIC) == SQLITE_OK);
dvander@1203
   103
}
dvander@1203
   104
dvander@1203
   105
bool SqQuery::BindParamInt(unsigned int param, int num, bool signd/* =true */)
dvander@1203
   106
{
dvander@1203
   107
	/* SQLite is 1 indexed */
dvander@1203
   108
	param++;
dvander@1203
   109
dvander@1203
   110
	if (param > m_ParamCount)
dvander@1203
   111
	{
dvander@1203
   112
		return false;
dvander@1203
   113
	}
dvander@1203
   114
dvander@1203
   115
	return (sqlite3_bind_int(m_pStmt, param, num) == SQLITE_OK);
dvander@1203
   116
}
dvander@1203
   117
dvander@1203
   118
bool SqQuery::BindParamBlob(unsigned int param, const void *data, size_t length, bool copy)
dvander@1203
   119
{
dvander@1203
   120
	/* SQLite is 1 indexed */
dvander@1203
   121
	param++;
dvander@1203
   122
dvander@1203
   123
	if (param > m_ParamCount)
dvander@1203
   124
	{
dvander@1203
   125
		return false;
dvander@1203
   126
	}
dvander@1203
   127
dvander@1203
   128
	return (sqlite3_bind_blob(m_pStmt, param, data, length, copy ? SQLITE_TRANSIENT : SQLITE_STATIC) == SQLITE_OK);
dvander@1203
   129
}
dvander@1203
   130
dvander@1203
   131
sqlite3_stmt *SqQuery::GetStmt()
dvander@1203
   132
{
dvander@1203
   133
	return m_pStmt;
dvander@1203
   134
}
dvander@1203
   135
dvander@1203
   136
bool SqQuery::Execute()
dvander@1203
   137
{
dvander@1203
   138
	int rc;
dvander@1203
   139
dvander@1210
   140
	/* If we don't have a result set and we have a column count, 
dvander@1210
   141
	 * create a result set pre-emptively.  This is in case there
dvander@1210
   142
	 * are no rows in the upcoming result set.
dvander@1210
   143
	 */
dvander@1210
   144
	if (!m_pResults && m_ColCount)
dvander@1210
   145
	{
dvander@1210
   146
		m_pResults = new SqResults(this);
dvander@1210
   147
	}
dvander@1210
   148
dvander@1203
   149
	/* If we've got results, throw them away */
dvander@1203
   150
	if (m_pResults)
dvander@1203
   151
	{
dvander@1203
   152
		m_pResults->ResetResultCount();
dvander@1203
   153
	}
dvander@1203
   154
dvander@1210
   155
	/* Fetch each row, if any */
dvander@1203
   156
	while ((rc = sqlite3_step(m_pStmt)) == SQLITE_ROW)
dvander@1203
   157
	{
dvander@1210
   158
		/* This should NEVER happen but we're being safe. */
dvander@1203
   159
		if (!m_pResults)
dvander@1203
   160
		{
dvander@1203
   161
			m_pResults = new SqResults(this);
dvander@1203
   162
		}
dvander@1203
   163
		m_pResults->PushResult();
dvander@1203
   164
	}
dvander@1203
   165
dvander@1203
   166
	sqlite3 *db = m_pParent->GetDb();
dvander@1203
   167
	if (rc != SQLITE_OK && rc != SQLITE_DONE && rc == sqlite3_errcode(db))
dvander@1203
   168
	{
dvander@1203
   169
		/* Something happened... */
dvander@1203
   170
		m_LastErrorCode = rc;
dvander@1203
   171
		m_LastError.assign(sqlite3_errmsg(db));
dvander@1203
   172
		m_AffectedRows = 0;
dvander@1203
   173
		m_InsertID = 0;
dvander@1203
   174
	} else {
dvander@1203
   175
		m_LastErrorCode = SQLITE_OK;
dvander@1203
   176
		m_AffectedRows = (unsigned int)sqlite3_changes(db);
dvander@1203
   177
		m_InsertID = (unsigned int)sqlite3_last_insert_rowid(db);
dvander@1203
   178
	}
dvander@1203
   179
dvander@1203
   180
	/* Reset everything for the next execute */
dvander@1203
   181
	sqlite3_reset(m_pStmt);
dvander@1203
   182
	sqlite3_clear_bindings(m_pStmt);
dvander@1203
   183
dvander@1203
   184
	return (m_LastErrorCode == SQLITE_OK);
dvander@1203
   185
}
dvander@1203
   186
dvander@1203
   187
const char *SqQuery::GetError(int *errCode/* =NULL */)
dvander@1203
   188
{
dvander@1203
   189
	if (errCode)
dvander@1203
   190
	{
dvander@1203
   191
		*errCode = m_LastErrorCode;
dvander@1203
   192
	}
dvander@1203
   193
	return m_LastError.c_str();
dvander@1203
   194
}
dvander@1203
   195
dvander@1203
   196
unsigned int SqQuery::GetAffectedRows()
dvander@1203
   197
{
dvander@1203
   198
	return m_AffectedRows;
dvander@1203
   199
}
dvander@1203
   200
dvander@1203
   201
unsigned int SqQuery::GetInsertID()
dvander@1203
   202
{
dvander@1203
   203
	return m_InsertID;
dvander@1203
   204
}
dvander@1203
   205
dvander@1203
   206