mirror of
https://github.com/VCMP-SqMod/SqMod.git
synced 2024-11-08 08:47:17 +01:00
297 lines
10 KiB
C++
297 lines
10 KiB
C++
// ------------------------------------------------------------------------------------------------
|
|
#include "ResultSet.hpp"
|
|
|
|
// ------------------------------------------------------------------------------------------------
|
|
#include <cstdlib>
|
|
|
|
// ------------------------------------------------------------------------------------------------
|
|
namespace SqMod {
|
|
|
|
// ------------------------------------------------------------------------------------------------
|
|
SQInteger ResultSet::Typename(HSQUIRRELVM vm)
|
|
{
|
|
static const SQChar name[] = _SC("SqMySQLResultSet");
|
|
sq_pushstring(vm, name, sizeof(name));
|
|
return 1;
|
|
}
|
|
|
|
// ------------------------------------------------------------------------------------------------
|
|
#if defined(_DEBUG) || defined(SQMOD_EXCEPTLOC)
|
|
void ResultSet::Validate(CCStr file, Int32 line) const
|
|
{
|
|
if (!m_Handle)
|
|
{
|
|
SqThrowF("Invalid MySQL result-set reference =>[%s:%d]", file, line);
|
|
}
|
|
}
|
|
#else
|
|
void ResultSet::Validate() const
|
|
{
|
|
if (!m_Handle)
|
|
{
|
|
SqThrowF("Invalid MySQL result-set reference");
|
|
}
|
|
}
|
|
#endif // _DEBUG
|
|
|
|
// ------------------------------------------------------------------------------------------------
|
|
#if defined(_DEBUG) || defined(SQMOD_EXCEPTLOC)
|
|
void ResultSet::ValidateCreated(CCStr file, Int32 line) const
|
|
{
|
|
if (!m_Handle)
|
|
{
|
|
SqThrowF("Invalid MySQL result-set reference =>[%s:%d]", file, line);
|
|
}
|
|
else if (m_Handle->mPtr == nullptr)
|
|
{
|
|
SqThrowF("Invalid MySQL result-set =>[%s:%d]", file, line);
|
|
}
|
|
}
|
|
#else
|
|
void ResultSet::ValidateCreated() const
|
|
{
|
|
if (!m_Handle)
|
|
{
|
|
SqThrowF("Invalid MySQL result-set reference");
|
|
}
|
|
else if (m_Handle->mPtr == nullptr)
|
|
{
|
|
SqThrowF("Invalid MySQL result-set");
|
|
}
|
|
}
|
|
#endif // _DEBUG
|
|
|
|
// ------------------------------------------------------------------------------------------------
|
|
#if defined(_DEBUG) || defined(SQMOD_EXCEPTLOC)
|
|
const ResRef & ResultSet::GetValid(CCStr file, Int32 line) const
|
|
{
|
|
Validate(file, line);
|
|
return m_Handle;
|
|
}
|
|
#else
|
|
const ResRef & ResultSet::GetValid() const
|
|
{
|
|
Validate();
|
|
return m_Handle;
|
|
}
|
|
#endif // _DEBUG
|
|
|
|
// ------------------------------------------------------------------------------------------------
|
|
#if defined(_DEBUG) || defined(SQMOD_EXCEPTLOC)
|
|
const ResRef & ResultSet::GetCreated(CCStr file, Int32 line) const
|
|
{
|
|
ValidateCreated(file, line);
|
|
return m_Handle;
|
|
}
|
|
#else
|
|
const ResRef & ResultSet::GetCreated() const
|
|
{
|
|
ValidateCreated();
|
|
return m_Handle;
|
|
}
|
|
#endif // _DEBUG
|
|
|
|
// ------------------------------------------------------------------------------------------------
|
|
#if defined(_DEBUG) || defined(SQMOD_EXCEPTLOC)
|
|
void ResultSet::ValidateField(Int32 idx, CCStr file, Int32 line) const
|
|
{
|
|
ValidateCreated(file, line);
|
|
m_Handle->ValidateField(idx, file, line);
|
|
}
|
|
#else
|
|
void ResultSet::ValidateField(Int32 idx) const
|
|
{
|
|
ValidateCreated();
|
|
m_Handle->ValidateField(idx);
|
|
}
|
|
#endif // _DEBUG
|
|
|
|
// ------------------------------------------------------------------------------------------------
|
|
SQInteger ResultSet::GetInt8(Uint32 idx) const
|
|
{
|
|
SQMOD_VALIDATE_FIELD(*this, idx);
|
|
// Should we retrieve the value from the bind wrapper?
|
|
if (m_Handle->mStatement)
|
|
{
|
|
return ConvTo< Int8 >::From(m_Handle->mBinds[idx].mInt64);
|
|
}
|
|
// Retrieve the value directly from the row
|
|
return DbConvTo< Int8 >::From(m_Handle->mRow[idx], m_Handle->mLengths[idx], m_Handle->mFields[idx].type);
|
|
}
|
|
|
|
// ------------------------------------------------------------------------------------------------
|
|
SQInteger ResultSet::GetUint8(Uint32 idx) const
|
|
{
|
|
SQMOD_VALIDATE_FIELD(*this, idx);
|
|
// Should we retrieve the value from the bind wrapper?
|
|
if (m_Handle->mStatement)
|
|
{
|
|
return ConvTo< Uint8 >::From(m_Handle->mBinds[idx].mInt64);
|
|
}
|
|
// Retrieve the value directly from the row
|
|
return DbConvTo< Uint8 >::From(m_Handle->mRow[idx], m_Handle->mLengths[idx], m_Handle->mFields[idx].type);
|
|
}
|
|
|
|
// ------------------------------------------------------------------------------------------------
|
|
SQInteger ResultSet::GetInt16(Uint32 idx) const
|
|
{
|
|
SQMOD_VALIDATE_FIELD(*this, idx);
|
|
// Should we retrieve the value from the bind wrapper?
|
|
if (m_Handle->mStatement)
|
|
{
|
|
return ConvTo< Int16 >::From(m_Handle->mBinds[idx].mInt64);
|
|
}
|
|
// Retrieve the value directly from the row
|
|
return DbConvTo< Int16 >::From(m_Handle->mRow[idx], m_Handle->mLengths[idx], m_Handle->mFields[idx].type);
|
|
}
|
|
|
|
// ------------------------------------------------------------------------------------------------
|
|
SQInteger ResultSet::GetUint16(Uint32 idx) const
|
|
{
|
|
SQMOD_VALIDATE_FIELD(*this, idx);
|
|
// Should we retrieve the value from the bind wrapper?
|
|
if (m_Handle->mStatement)
|
|
{
|
|
return ConvTo< Uint16 >::From(m_Handle->mBinds[idx].mInt64);
|
|
}
|
|
// Retrieve the value directly from the row
|
|
return DbConvTo< Uint16 >::From(m_Handle->mRow[idx], m_Handle->mLengths[idx], m_Handle->mFields[idx].type);
|
|
}
|
|
|
|
// ------------------------------------------------------------------------------------------------
|
|
SQInteger ResultSet::GetInt32(Uint32 idx) const
|
|
{
|
|
SQMOD_VALIDATE_FIELD(*this, idx);
|
|
// Should we retrieve the value from the bind wrapper?
|
|
if (m_Handle->mStatement)
|
|
{
|
|
return ConvTo< Int32 >::From(m_Handle->mBinds[idx].mInt64);
|
|
}
|
|
// Retrieve the value directly from the row
|
|
return DbConvTo< Int32 >::From(m_Handle->mRow[idx], m_Handle->mLengths[idx], m_Handle->mFields[idx].type);
|
|
}
|
|
|
|
// ------------------------------------------------------------------------------------------------
|
|
SQInteger ResultSet::GetUint32(Uint32 idx) const
|
|
{
|
|
SQMOD_VALIDATE_FIELD(*this, idx);
|
|
// Should we retrieve the value from the bind wrapper?
|
|
if (m_Handle->mStatement)
|
|
{
|
|
return ConvTo< Uint32 >::From(m_Handle->mBinds[idx].mInt64);
|
|
}
|
|
// Retrieve the value directly from the row
|
|
return DbConvTo< Uint32 >::From(m_Handle->mRow[idx], m_Handle->mLengths[idx], m_Handle->mFields[idx].type);
|
|
}
|
|
|
|
// ------------------------------------------------------------------------------------------------
|
|
Int64 ResultSet::GetInt64(Uint32 idx) const
|
|
{
|
|
SQMOD_VALIDATE_FIELD(*this, idx);
|
|
// Should we retrieve the value from the bind wrapper?
|
|
if (m_Handle->mStatement)
|
|
{
|
|
return ConvTo< Int64 >::From(m_Handle->mBinds[idx].mInt64);
|
|
}
|
|
// Retrieve the value directly from the row
|
|
return DbConvTo< Int64 >::From(m_Handle->mRow[idx], m_Handle->mLengths[idx], m_Handle->mFields[idx].type);
|
|
}
|
|
|
|
// ------------------------------------------------------------------------------------------------
|
|
Uint64 ResultSet::GetUint64(Uint32 idx) const
|
|
{
|
|
SQMOD_VALIDATE_FIELD(*this, idx);
|
|
// Should we retrieve the value from the bind wrapper?
|
|
if (m_Handle->mStatement)
|
|
{
|
|
return ConvTo< Uint64 >::From(m_Handle->mBinds[idx].mInt64);
|
|
}
|
|
// Retrieve the value directly from the row
|
|
return DbConvTo< Uint64 >::From(m_Handle->mRow[idx], m_Handle->mLengths[idx], m_Handle->mFields[idx].type);
|
|
}
|
|
|
|
// ------------------------------------------------------------------------------------------------
|
|
SQFloat ResultSet::GetFloat32(Uint32 idx) const
|
|
{
|
|
SQMOD_VALIDATE_FIELD(*this, idx);
|
|
// Should we retrieve the value from the bind wrapper?
|
|
if (m_Handle->mStatement)
|
|
{
|
|
return ConvTo< Float32 >::From(m_Handle->mBinds[idx].mInt64);
|
|
}
|
|
// Retrieve the value directly from the row
|
|
return std::strtof(m_Handle->mRow[idx], nullptr);
|
|
}
|
|
|
|
// ------------------------------------------------------------------------------------------------
|
|
SQFloat ResultSet::GetFloat64(Uint32 idx) const
|
|
{
|
|
SQMOD_VALIDATE_FIELD(*this, idx);
|
|
// Should we retrieve the value from the bind wrapper?
|
|
if (m_Handle->mStatement)
|
|
{
|
|
return ConvTo< Float64 >::From(m_Handle->mBinds[idx].mInt64);
|
|
}
|
|
// Retrieve the value directly from the row
|
|
return std::strtod(m_Handle->mRow[idx], nullptr);
|
|
}
|
|
|
|
// ------------------------------------------------------------------------------------------------
|
|
bool ResultSet::GetBoolean(Uint32 idx) const
|
|
{
|
|
SQMOD_VALIDATE_FIELD(*this, idx);
|
|
// Should we retrieve the value from the bind wrapper?
|
|
if (m_Handle->mStatement)
|
|
{
|
|
return ConvTo< bool >::From(m_Handle->mBinds[idx].mUint64);
|
|
}
|
|
// Retrieve the value directly from the row
|
|
return ConvTo< bool >::From(std::strtol(m_Handle->mRow[idx], nullptr, 10));
|
|
}
|
|
|
|
// ------------------------------------------------------------------------------------------------
|
|
CSStr ResultSet::GetString(Uint32 idx) const
|
|
{
|
|
SQMOD_VALIDATE_FIELD(*this, idx);
|
|
// Retrieve the value directly from the row
|
|
return m_Handle->mRow[idx];
|
|
}
|
|
|
|
// ================================================================================================
|
|
void Register_ResultSet(Table & sqlns)
|
|
{
|
|
sqlns.Bind(_SC("ResultSet")
|
|
, Class< ResultSet >(sqlns.GetVM(), _SC("SqMySQLResultSet"))
|
|
// Constructors
|
|
.Ctor()
|
|
.Ctor< const ResultSet & >()
|
|
// Core Meta-methods
|
|
.Func(_SC("_cmp"), &ResultSet::Cmp)
|
|
.SquirrelFunc(_SC("_typename"), &ResultSet::Typename)
|
|
.Func(_SC("_tostring"), &ResultSet::ToString)
|
|
// Properties
|
|
.Prop(_SC("IsValid"), &ResultSet::IsValid)
|
|
.Prop(_SC("RowIndex"), &ResultSet::RowIndex)
|
|
.Prop(_SC("RowCount"), &ResultSet::RowCount)
|
|
// Member Methods
|
|
.Func(_SC("Next"), &ResultSet::Next)
|
|
.Func(_SC("SetRowIndex"), &ResultSet::SetRowIndex)
|
|
.Func(_SC("SetLongRowIndex"), &ResultSet::SetLongRowIndex)
|
|
.Func(_SC("GetInt8"), &ResultSet::GetInt8)
|
|
.Func(_SC("GetUint8"), &ResultSet::GetUint8)
|
|
.Func(_SC("GetInt16"), &ResultSet::GetInt16)
|
|
.Func(_SC("GetUint16"), &ResultSet::GetUint16)
|
|
.Func(_SC("GetInt32"), &ResultSet::GetInt32)
|
|
.Func(_SC("GetUint32"), &ResultSet::GetUint32)
|
|
.Func(_SC("GetInt64"), &ResultSet::GetInt64)
|
|
.Func(_SC("GetUint64"), &ResultSet::GetUint64)
|
|
.Func(_SC("GetFloat32"), &ResultSet::GetFloat32)
|
|
.Func(_SC("GetFloat64"), &ResultSet::GetFloat64)
|
|
.Func(_SC("GetBool"), &ResultSet::GetBoolean)
|
|
.Func(_SC("GetBoolean"), &ResultSet::GetBoolean)
|
|
.Func(_SC("GetString"), &ResultSet::GetString)
|
|
);
|
|
}
|
|
|
|
} // Namespace:: SqMod
|