Fix build.
3 * =============================================================================
4 * SourceMod SQLite Extension
5 * Copyright (C) 2004-2008 AlliedModders LLC. All rights reserved.
6 * =============================================================================
8 * This program is free software; you can redistribute it and/or modify it under
9 * the terms of the GNU General Public License, version 3.0, as published by the
10 * Free Software Foundation.
12 * This program is distributed in the hope that it will be useful, but WITHOUT
13 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
14 * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
17 * You should have received a copy of the GNU General Public License along with
18 * this program. If not, see <http://www.gnu.org/licenses/>.
20 * As a special exception, AlliedModders LLC gives you permission to link the
21 * code of this program (as well as its derivative works) to "Half-Life 2," the
22 * "Source Engine," the "SourcePawn JIT," and any Game MODs that run on software
23 * by the Valve Corporation. You must obey the GNU General Public License in
24 * all respects for all other code used. Additionally, AlliedModders LLC grants
25 * this exception to all derivative works. AlliedModders LLC defines further
26 * exceptions, found in LICENSE.txt (as of this writing, version JULY-31-2007),
27 * or <http://www.sourcemod.net/license.php>.
33 #include "extension.h"
34 #include "SqResults.h"
37 SqResults::SqResults(SqQuery *query) :
38 m_pStmt(query->GetStmt()), m_Strings(1024),
39 m_RowCount(0), m_MaxRows(0), m_Rows(NULL),
40 m_CurRow(0), m_NextRow(0)
42 m_ColCount = sqlite3_column_count(m_pStmt);
45 m_ColNames = new String[m_ColCount];
46 for (unsigned int i=0; i<m_ColCount; i++)
48 m_ColNames[i].assign(sqlite3_column_name(m_pStmt, i));
54 m_pMemory = m_Strings.GetMemTable();
57 SqResults::~SqResults()
63 unsigned int SqResults::GetRowCount()
68 unsigned int SqResults::GetFieldCount()
73 const char *SqResults::FieldNumToName(unsigned int columnId)
75 if (columnId >= m_ColCount)
80 return m_ColNames[columnId].c_str();
83 bool SqResults::FieldNameToNum(const char *name, unsigned int *columnId)
85 for (unsigned int i=0; i<m_ColCount; i++)
87 if (m_ColNames[i].compare(name) == 0)
99 void SqResults::ResetResultCount()
107 void SqResults::PushResult()
109 /* First make sure we can fit one more row */
110 if (m_RowCount + 1 > m_MaxRows)
112 /* Create a new array */
116 m_Rows = (SqField *)malloc(sizeof(SqField) * m_ColCount * m_MaxRows);
119 m_Rows = (SqField *)realloc(m_Rows, sizeof(SqField) * m_ColCount * m_MaxRows);
123 SqField *row = &m_Rows[m_RowCount * m_ColCount];
124 for (unsigned int i=0; i<m_ColCount; i++)
126 row[i].type = sqlite3_column_type(m_pStmt, i);
127 if (row[i].type == SQLITE_INTEGER)
129 row[i].u.idx = sqlite3_column_int(m_pStmt, i);
130 row[i].size = sizeof(int);
131 } else if (row[i].type == SQLITE_FLOAT) {
132 row[i].u.f = (float)sqlite3_column_double(m_pStmt, i);
133 row[i].size = sizeof(float);
134 } else if (row[i].type == SQLITE_BLOB) {
135 int bytes = sqlite3_column_bytes(m_pStmt, i);
137 if ((pOrig = sqlite3_column_blob(m_pStmt, i)) != NULL)
140 row[i].u.idx = m_pMemory->CreateMem(bytes, &pAddr);
141 memcpy(pAddr, pOrig, bytes);
145 row[i].size = sqlite3_column_bytes(m_pStmt, i);
146 } else if (row[i].type == SQLITE_TEXT) {
147 const char *str = (const char *)sqlite3_column_text(m_pStmt, i);
150 row[i].u.idx = m_Strings.AddString(str);
154 row[i].size = sqlite3_column_bytes(m_pStmt, i);
160 /* Finally, increase the row count */
164 bool SqResults::MoreRows()
166 return (m_CurRow < m_RowCount);
169 IResultRow *SqResults::FetchRow()
171 m_CurRow = m_NextRow;
172 if (m_CurRow >= m_RowCount)
180 IResultRow *SqResults::CurrentRow()
182 if (!m_RowCount || m_CurRow >= m_RowCount)
189 bool SqResults::Rewind()
196 SqField *SqResults::GetField(unsigned int col)
198 if (m_CurRow >= m_RowCount || col >= m_ColCount)
203 return &m_Rows[(m_CurRow * m_ColCount) + col];
206 DBType SqResults::GetFieldType(unsigned int field)
208 /* Leaving unimplemented... */
209 return DBType_Unknown;
212 DBType SqResults::GetFieldDataType(unsigned int field)
214 /* Leaving unimplemented... */
215 return DBType_Unknown;
218 DBResult SqResults::GetString(unsigned int columnId, const char **pString, size_t *_length)
220 SqField *field = GetField(columnId);
226 DBResult res = DBVal_Data;
227 const char *ptr = NULL;
229 if (field->type == SQLITE_TEXT || field->type == SQLITE_BLOB)
231 ptr = m_Strings.GetString(field->u.idx);
232 length = field->size;
233 } else if (field->type == SQLITE_INTEGER) {
235 field->size = UTIL_Format(number, sizeof(number), "%d", field->u.idx);
236 field->type = SQLITE_TEXT;
237 field->u.idx = m_Strings.AddString(number);
238 ptr = m_Strings.GetString(field->u.idx);
239 length = field->size;
240 } else if (field->type == SQLITE_FLOAT) {
242 field->size = UTIL_Format(number, sizeof(number), "%f", field->u.f);
243 field->type = SQLITE_TEXT;
244 field->u.idx = m_Strings.AddString(number);
245 ptr = m_Strings.GetString(field->u.idx);
246 length = field->size;
247 } else if (field->type == SQLITE_NULL) {
268 DBResult SqResults::CopyString(unsigned int columnId, char *buffer, size_t maxlength, size_t *written)
270 SqField *field = GetField(columnId);
276 DBResult res = DBVal_Data;
277 if (field->type == SQLITE_TEXT || field->type == SQLITE_BLOB)
279 const char *ptr = m_Strings.GetString(field->u.idx);
283 field->type = SQLITE_TEXT;
287 if (field->type == SQLITE_TEXT)
289 wr = strncopy(buffer, ptr, maxlength);
290 } else if (field->type == SQLITE_BLOB) {
291 wr = (maxlength < field->size) ? maxlength : field->size;
292 memcpy(buffer, ptr, wr);
299 } else if (field->type == SQLITE_INTEGER) {
303 wr = UTIL_Format(buffer, maxlength, "%d", field->u.idx);
310 } else if (field->type == SQLITE_FLOAT) {
314 wr = UTIL_Format(buffer, maxlength, "%f", field->u.f);
325 strncopy(buffer, "", maxlength);
335 bool SqResults::IsNull(unsigned int columnId)
337 SqField *field = GetField(columnId);
343 return (field->type == SQLITE_NULL);
346 size_t SqResults::GetDataSize(unsigned int columnId)
348 SqField *field = GetField(columnId);
357 DBResult SqResults::GetFloat(unsigned int columnId, float *pFloat)
359 SqField *field = GetField(columnId);
363 } else if (field->type == SQLITE_BLOB) {
368 if (field->type == SQLITE_FLOAT)
371 } else if (field->type == SQLITE_TEXT) {
372 const char *ptr = m_Strings.GetString(field->u.idx);
375 fVal = (float)atof(ptr);
377 } else if (field->type == SQLITE_INTEGER) {
378 fVal = (float)field->u.idx;
386 return (field->type == SQLITE_NULL) ? DBVal_Null : DBVal_Data;
389 DBResult SqResults::GetInt(unsigned int columnId, int *pInt)
391 SqField *field = GetField(columnId);
395 } else if (field->type == SQLITE_BLOB) {
400 if (field->type == SQLITE_INTEGER)
403 } else if (field->type == SQLITE_TEXT) {
404 const char *ptr = m_Strings.GetString(field->u.idx);
409 } else if (field->type == SQLITE_FLOAT) {
410 val = (int)field->u.f;
418 return (field->type == SQLITE_NULL) ? DBVal_Null : DBVal_Data;
421 DBResult SqResults::GetBlob(unsigned int columnId, const void **pData, size_t *length)
423 SqField *field = GetField(columnId);
431 if (field->type == SQLITE_TEXT || field->type == SQLITE_BLOB)
433 addr = m_pMemory->GetAddress(field->u.idx);
434 } else if (field->type == SQLITE_FLOAT || field->type == SQLITE_INTEGER) {
445 *length = field->size;
448 return (field->type == SQLITE_NULL) ? DBVal_Null : DBVal_Data;
451 DBResult SqResults::CopyBlob(unsigned int columnId, void *buffer, size_t maxlength, size_t *written)
453 SqField *field = GetField(columnId);
461 if (field->type == SQLITE_TEXT || field->type == SQLITE_BLOB)
463 addr = m_pMemory->GetAddress(field->u.idx);
464 } else if (field->type == SQLITE_FLOAT || field->type == SQLITE_INTEGER) {
468 size_t toCopy = field->size > maxlength ? maxlength : field->size;
469 if (buffer && addr && toCopy)
471 memcpy(buffer, addr, toCopy);
481 return (field->type == SQLITE_NULL) ? DBVal_Null : DBVal_Data;