mirror of
https://github.com/VCMP-SqMod/SqMod.git
synced 2024-11-14 11:47:15 +01:00
2672 lines
96 KiB
C++
2672 lines
96 KiB
C++
#pragma once
|
|
|
|
// ------------------------------------------------------------------------------------------------
|
|
#include "Base/Shared.hpp"
|
|
|
|
// ------------------------------------------------------------------------------------------------
|
|
#include "Library/Numeric/LongInt.hpp"
|
|
#include "Library/Utils/Buffer.hpp"
|
|
#include "Library/Chrono.hpp"
|
|
#include "Library/Chrono/Date.hpp"
|
|
#include "Library/Chrono/Datetime.hpp"
|
|
#include "Library/Chrono/Time.hpp"
|
|
#include "Library/Chrono/Timestamp.hpp"
|
|
|
|
// ------------------------------------------------------------------------------------------------
|
|
#include <unordered_map>
|
|
|
|
// ------------------------------------------------------------------------------------------------
|
|
#include <mysql.h>
|
|
|
|
// ------------------------------------------------------------------------------------------------
|
|
namespace SqMod {
|
|
|
|
/* ------------------------------------------------------------------------------------------------
|
|
* Handle validation.
|
|
*/
|
|
#if defined(_DEBUG) || defined(SQMOD_EXCEPTLOC)
|
|
#define SQMOD_THROW_CURRENT(x, a) (x).ThrowCurrent(a, __FILE__, __LINE__)
|
|
#define SQMOD_VALIDATE(x) (x).Validate(__FILE__, __LINE__)
|
|
#define SQMOD_VALIDATE_CREATED(x) (x).ValidateCreated(__FILE__, __LINE__)
|
|
#define SQMOD_VALIDATE_PARAM(x, i) (x).ValidateParam((i), __FILE__, __LINE__)
|
|
#define SQMOD_VALIDATE_FIELD(x, i) (x).ValidateField((i), __FILE__, __LINE__)
|
|
#define SQMOD_VALIDATE_STEPPED(x) (x).ValidateStepped(__FILE__, __LINE__)
|
|
#define SQMOD_GET_VALID(x) (x).GetValid(__FILE__, __LINE__)
|
|
#define SQMOD_GET_CREATED(x) (x).GetCreated(__FILE__, __LINE__)
|
|
#define SQMOD_GET_STEPPED(x) (x).GetStepped(__FILE__, __LINE__)
|
|
#else
|
|
#define SQMOD_THROW_CURRENT(x, a) (x).ThrowCurrent(a)
|
|
#define SQMOD_VALIDATE(x) (x).Validate()
|
|
#define SQMOD_VALIDATE_CREATED(x) (x).ValidateCreated()
|
|
#define SQMOD_VALIDATE_PARAM(x, i) (x).ValidateParam((i))
|
|
#define SQMOD_VALIDATE_FIELD(x, i) (x).ValidateField((i))
|
|
#define SQMOD_VALIDATE_STEPPED(x) (x).ValidateStepped()
|
|
#define SQMOD_GET_VALID(x) (x).GetValid()
|
|
#define SQMOD_GET_CREATED(x) (x).GetCreated()
|
|
#define SQMOD_GET_STEPPED(x) (x).GetStepped()
|
|
#endif // _DEBUG
|
|
|
|
/* ------------------------------------------------------------------------------------------------
|
|
* Forward declarations.
|
|
*/
|
|
struct ConnHnd;
|
|
struct StmtHnd;
|
|
struct ResHnd;
|
|
|
|
// ------------------------------------------------------------------------------------------------
|
|
class Account;
|
|
class Column;
|
|
class Connection;
|
|
class ResultSet;
|
|
class Statement;
|
|
class Transaction;
|
|
|
|
/* ------------------------------------------------------------------------------------------------
|
|
* Common typedefs.
|
|
*/
|
|
typedef SharedPtr< ConnHnd > ConnRef;
|
|
typedef SharedPtr< StmtHnd > StmtRef;
|
|
typedef SharedPtr< ResHnd > ResRef;
|
|
|
|
/* ------------------------------------------------------------------------------------------------
|
|
* Replicate the values of a script Date type to a database time type.
|
|
*/
|
|
void SqDateToMySQLTime(const Date & value, MYSQL_TIME & t);
|
|
|
|
/* ------------------------------------------------------------------------------------------------
|
|
* Replicate the values of a script Date type to a database time type.
|
|
*/
|
|
void SqTimeToMySQLTime(const Time & value, MYSQL_TIME & t);
|
|
|
|
/* ------------------------------------------------------------------------------------------------
|
|
* Replicate the values of a script Date type to a database time type.
|
|
*/
|
|
void SqDatetimeToMySQLTime(const Datetime & value, MYSQL_TIME & t);
|
|
|
|
/* ------------------------------------------------------------------------------------------------
|
|
* Retrieve the lowercase name of a MySQL data-type.
|
|
*/
|
|
CSStr SqMySQLTypename(enum_field_types type);
|
|
|
|
/* ------------------------------------------------------------------------------------------------
|
|
* Retrieve the capitalized name of a MySQL data-type.
|
|
*/
|
|
CSStr SqMySQLTypenameC(enum_field_types type);
|
|
|
|
/* ------------------------------------------------------------------------------------------------
|
|
* Utility used to convert from database types to known types.
|
|
*/
|
|
template < typename T > struct DbConvTo;
|
|
|
|
/* ------------------------------------------------------------------------------------------------
|
|
* Specialization for signed 8 bit integer.
|
|
*/
|
|
template<> struct DbConvTo< Int8 >
|
|
{
|
|
static Int8 From(CSStr value, Ulong length, enum_field_types type, CSStr tn = _SC("Int8"));
|
|
};
|
|
|
|
/* ------------------------------------------------------------------------------------------------
|
|
* Specialization for unsigned 8 bit integer.
|
|
*/
|
|
template<> struct DbConvTo< Uint8 >
|
|
{
|
|
static Uint8 From(CSStr value, Ulong length, enum_field_types type, CSStr tn = _SC("Uint8"));
|
|
};
|
|
|
|
/* ------------------------------------------------------------------------------------------------
|
|
* Specialization for signed 16 bit integer.
|
|
*/
|
|
template<> struct DbConvTo< Int16 >
|
|
{
|
|
static Int16 From(CSStr value, Ulong length, enum_field_types type, CSStr tn = _SC("Int16"));
|
|
};
|
|
|
|
/* ------------------------------------------------------------------------------------------------
|
|
* Specialization for unsigned 16 bit integer.
|
|
*/
|
|
template<> struct DbConvTo< Uint16 >
|
|
{
|
|
static Uint16 From(CSStr value, Ulong length, enum_field_types type, CSStr tn = _SC("Uint16"));
|
|
};
|
|
|
|
/* ------------------------------------------------------------------------------------------------
|
|
* Specialization for signed 32 bit integer.
|
|
*/
|
|
template<> struct DbConvTo< Int32 >
|
|
{
|
|
static Int32 From(CSStr value, Ulong length, enum_field_types type, CSStr tn = _SC("Int32"));
|
|
};
|
|
|
|
/* ------------------------------------------------------------------------------------------------
|
|
* Specialization for unsigned 32 bit integer.
|
|
*/
|
|
template<> struct DbConvTo< Uint32 >
|
|
{
|
|
static Uint32 From(CSStr value, Ulong length, enum_field_types type, CSStr tn = _SC("Uint32"));
|
|
};
|
|
|
|
/* ------------------------------------------------------------------------------------------------
|
|
* Specialization for signed 64 bit integer.
|
|
*/
|
|
template<> struct DbConvTo< Int64 >
|
|
{
|
|
static Int64 From(CSStr value, Ulong length, enum_field_types type, CSStr tn = _SC("Int64"));
|
|
};
|
|
|
|
/* ------------------------------------------------------------------------------------------------
|
|
* Specialization for unsigned 64 bit integer.
|
|
*/
|
|
template<> struct DbConvTo< Uint64 >
|
|
{
|
|
static Uint64 From(CSStr value, Ulong length, enum_field_types type, CSStr tn = _SC("Uint64"));
|
|
};
|
|
|
|
/* ------------------------------------------------------------------------------------------------
|
|
* Specialization for 32 floating point.
|
|
*/
|
|
template<> struct DbConvTo< Float32 >
|
|
{
|
|
static Float32 From(CSStr value, Ulong length, enum_field_types type, CSStr tn = _SC("Float32"));
|
|
};
|
|
|
|
/* ------------------------------------------------------------------------------------------------
|
|
* Specialization for 64 floating point.
|
|
*/
|
|
template<> struct DbConvTo< Float64 >
|
|
{
|
|
static Float64 From(CSStr value, Ulong length, enum_field_types type, CSStr tn = _SC("Float64"));
|
|
};
|
|
|
|
/* ------------------------------------------------------------------------------------------------
|
|
* Specialization for boolean value.
|
|
*/
|
|
template<> struct DbConvTo< bool >
|
|
{
|
|
static bool From(CSStr value, Ulong length, enum_field_types type, CSStr tn = _SC("Boolean"));
|
|
};
|
|
|
|
/* ------------------------------------------------------------------------------------------------
|
|
* The structure that holds the data associated with a certain connection.
|
|
*/
|
|
struct ConnHnd
|
|
{
|
|
public:
|
|
|
|
// --------------------------------------------------------------------------------------------
|
|
typedef MYSQL Type; // The managed type.
|
|
|
|
// --------------------------------------------------------------------------------------------
|
|
typedef Type* Pointer; // Pointer to the managed type.
|
|
typedef const Type* ConstPtr; // Constant pointer to the managed type.
|
|
|
|
// --------------------------------------------------------------------------------------------
|
|
typedef Type& Reference; // Reference to the managed type.
|
|
typedef const Type& ConstRef; // Constant reference to the managed type.
|
|
|
|
// --------------------------------------------------------------------------------------------
|
|
typedef MYSQL_RES ResType; // Database result type.
|
|
|
|
public:
|
|
|
|
// --------------------------------------------------------------------------------------------
|
|
Pointer mPtr; // The connection handle resource.
|
|
|
|
// --------------------------------------------------------------------------------------------
|
|
Uint32 mErrNo; // Last received error string.
|
|
String mErrStr; // Last received error message.
|
|
|
|
// --------------------------------------------------------------------------------------------
|
|
Uint16 mPort; // Server port.
|
|
String mHost; // Host address.
|
|
String mUser; // User name user.
|
|
String mPass; // User password.
|
|
String mName; // Database name.
|
|
String mSocket; // Unix socket.
|
|
Ulong mFlags; // Client flags.
|
|
|
|
// --------------------------------------------------------------------------------------------
|
|
String mSSL_Key; // SSL key.
|
|
String mSSL_Cert; // SSL certificate.
|
|
String mSSL_CA; // SSL certificate authority.
|
|
String mSSL_CA_Path; // SSL certificate authority path.
|
|
String mSSL_Cipher; // SSL Cipher.
|
|
|
|
// --------------------------------------------------------------------------------------------
|
|
String mCharset; // Default connection character set.
|
|
|
|
// --------------------------------------------------------------------------------------------
|
|
bool mAutoCommit; // Whether autocommit is enabled on this connection.
|
|
bool mInTransaction; // Whether the connection is in the middle of a transaction.
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Default constructor.
|
|
*/
|
|
ConnHnd();
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Destructor.
|
|
*/
|
|
~ConnHnd();
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Grab the current error in the connection handle.
|
|
*/
|
|
void GrabCurrent();
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Grab the current error in the connection handle and throw it.
|
|
*/
|
|
#if defined(_DEBUG) || defined(SQMOD_EXCEPTLOC)
|
|
void ThrowCurrent(CCStr act, CCStr file, Int32 line);
|
|
#else
|
|
void ThrowCurrent(CCStr act);
|
|
#endif // _DEBUG
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Create the connection handle.
|
|
*/
|
|
void Create(const Account & acc);
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Disconnect the managed connection handle.
|
|
*/
|
|
void Disconnect();
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Execute a query on the server.
|
|
*/
|
|
Uint64 Execute(CSStr query, Ulong size = 0UL);
|
|
};
|
|
|
|
/* ------------------------------------------------------------------------------------------------
|
|
* The structure that holds the data associated with a certain bind point.
|
|
*/
|
|
struct StmtBind
|
|
{
|
|
public:
|
|
|
|
// --------------------------------------------------------------------------------------------
|
|
typedef MYSQL_STMT Type; // The managed type.
|
|
|
|
// --------------------------------------------------------------------------------------------
|
|
typedef Type* Pointer; // Pointer to the managed type.
|
|
typedef const Type* ConstPtr; // Constant pointer to the managed type.
|
|
|
|
// --------------------------------------------------------------------------------------------
|
|
typedef Type& Reference; // Reference to the managed type.
|
|
typedef const Type& ConstRef; // Constant reference to the managed type.
|
|
|
|
// --------------------------------------------------------------------------------------------
|
|
typedef MYSQL_BIND BindType; // Database bind type.
|
|
typedef MYSQL_TIME TimeType; // Database time type.
|
|
typedef my_bool BoolType; // Database boolean type.
|
|
|
|
public:
|
|
|
|
// --------------------------------------------------------------------------------------------
|
|
BoolType mIsNull; // Allows the database to specify if the parameter is null.
|
|
BoolType mError; // Allows the database if errors occured on this parameter.
|
|
Buffer mData; // Buffer to store non fundamental data for the parameter.
|
|
BindType * mBind; // The associated database bind point handle.
|
|
TimeType mTime; // Structure used to store time data from database.
|
|
|
|
// --------------------------------------------------------------------------------------------
|
|
union
|
|
{
|
|
Uint64 mUint64; // Store unsigned integer values for the parameter.
|
|
Int64 mInt64; // Store signed integer values for the parameter.
|
|
Int32 mInt32[2]; // Store 32 bit signed integer values for the parameter.
|
|
Float64 mFloat64; // Store 32 bit floating point values for the parameter.
|
|
Float32 mFloat32[2]; // Store 64 bit floating point values for the parameter.
|
|
};
|
|
|
|
public:
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Default constructor.
|
|
*/
|
|
StmtBind()
|
|
: mIsNull(0), mError(0), mData(), mBind(nullptr), mTime(), mUint64(0)
|
|
{
|
|
/* ... */
|
|
}
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Copy constructor. (disabled)
|
|
*/
|
|
StmtBind(const StmtBind & o) = delete;
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Move constructor. (disabled)
|
|
*/
|
|
StmtBind(StmtBind && o) = delete;
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Copy assignment operator. (disabled)
|
|
*/
|
|
StmtBind & operator = (const StmtBind & o) = delete;
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Move assignment operator. (disabled)
|
|
*/
|
|
StmtBind & operator = (StmtBind && o) = delete;
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Retrieve the used buffer.
|
|
*/
|
|
CStr GetBuffer()
|
|
{
|
|
return mData ? mData.Data() : reinterpret_cast< CStr >(&mUint64);
|
|
}
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Retrieve the buffer length.
|
|
*/
|
|
Ulong GetLength() const
|
|
{
|
|
return (mBind == nullptr) ? 0 : mBind->buffer_length;
|
|
}
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Configure the input of a certain statement parameter.
|
|
*/
|
|
void SetInput(enum_field_types type, BindType * bind, CCStr buffer = nullptr, Ulong length = 0);
|
|
};
|
|
|
|
/* ------------------------------------------------------------------------------------------------
|
|
* The structure that holds the data associated with a certain statement handle.
|
|
*/
|
|
struct StmtHnd
|
|
{
|
|
public:
|
|
|
|
// --------------------------------------------------------------------------------------------
|
|
typedef MYSQL_STMT Type; // The managed type.
|
|
|
|
// --------------------------------------------------------------------------------------------
|
|
typedef Type* Pointer; // Pointer to the managed type.
|
|
typedef const Type* ConstPtr; // Constant pointer to the managed type.
|
|
|
|
// --------------------------------------------------------------------------------------------
|
|
typedef Type& Reference; // Reference to the managed type.
|
|
typedef const Type& ConstRef; // Constant reference to the managed type.
|
|
|
|
// --------------------------------------------------------------------------------------------
|
|
typedef MYSQL_BIND BindType; // Database bind type.
|
|
typedef MYSQL_TIME TimeType; // Database time type.
|
|
typedef my_bool BoolType; // Database boolean type.
|
|
|
|
public:
|
|
|
|
// --------------------------------------------------------------------------------------------
|
|
Pointer mPtr; // The managed statement handle.
|
|
|
|
// --------------------------------------------------------------------------------------------
|
|
Uint32 mErrNo; // Last received error string.
|
|
String mErrStr; // Last received error message.
|
|
|
|
// --------------------------------------------------------------------------------------------
|
|
Ulong mParams; // Number of parameters in the statement.
|
|
StmtBind * mBinds; // List of parameter binds.
|
|
BindType * mMyBinds; // List of parameter binds.
|
|
|
|
// --------------------------------------------------------------------------------------------
|
|
ConnRef mConnection; // Reference to the associated connection.
|
|
String mQuery; // The query string.
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Default constructor.
|
|
*/
|
|
StmtHnd();
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Destructor.
|
|
*/
|
|
~StmtHnd();
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Grab the current error in the associated statement handle.
|
|
*/
|
|
void GrabCurrent();
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Grab the current error in the associated statement handle and throw it.
|
|
*/
|
|
#if defined(_DEBUG) || defined(SQMOD_EXCEPTLOC)
|
|
void ThrowCurrent(CCStr act, CCStr file, Int32 line);
|
|
#else
|
|
void ThrowCurrent(CCStr act);
|
|
#endif // _DEBUG
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Validate the associated statement handle and parameter index and throw an error if invalid.
|
|
*/
|
|
#if defined(_DEBUG) || defined(SQMOD_EXCEPTLOC)
|
|
void ValidateParam(Uint32 idx, CCStr file, Int32 line) const;
|
|
#else
|
|
void ValidateParam(Uint32 idx) const;
|
|
#endif // _DEBUG
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Check whether a specific param index is within range.
|
|
*/
|
|
bool CheckParamIndex(Uint32 idx) const
|
|
{
|
|
return (idx < mParams);
|
|
}
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Create the actual statement.
|
|
*/
|
|
void Create(const ConnRef & conn, CSStr query);
|
|
};
|
|
|
|
/* ------------------------------------------------------------------------------------------------
|
|
* The structure that holds the data associated with a certain field.
|
|
*/
|
|
struct ResBind
|
|
{
|
|
public:
|
|
|
|
// --------------------------------------------------------------------------------------------
|
|
typedef MYSQL_RES Type; // The managed type.
|
|
|
|
// --------------------------------------------------------------------------------------------
|
|
typedef Type* Pointer; // Pointer to the managed type.
|
|
typedef const Type* ConstPtr; // Constant pointer to the managed type.
|
|
|
|
// --------------------------------------------------------------------------------------------
|
|
typedef Type& Reference; // Reference to the managed type.
|
|
typedef const Type& ConstRef; // Constant reference to the managed type.
|
|
|
|
// --------------------------------------------------------------------------------------------
|
|
typedef MYSQL_FIELD FieldType; // Database field type.
|
|
typedef MYSQL_BIND BindType; // Database bind type.
|
|
typedef MYSQL_TIME TimeType; // Database time type.
|
|
typedef MYSQL_ROW RowType; // Database row type.
|
|
typedef my_bool BoolType; // Database boolean type.
|
|
|
|
// --------------------------------------------------------------------------------------------
|
|
typedef std::unordered_map< String, Uint32 > IndexMap;
|
|
|
|
public:
|
|
|
|
// --------------------------------------------------------------------------------------------
|
|
BoolType mIsNull; // Allows the database to specify if the field is null.
|
|
BoolType mError; // Allows the database if errors occured on this field.
|
|
Buffer mData; // Buffer to store non fundamental data for the field.
|
|
BindType * mBind; // The associated database bind point handle.
|
|
TimeType mTime; // Structure used to retrieve time data from database.
|
|
|
|
// --------------------------------------------------------------------------------------------
|
|
union
|
|
{
|
|
Uint64 mUint64; // Retrieve unsigned integer values from a field.
|
|
Int64 mInt64; // Retrieve signed integer values from a field.
|
|
Int32 mInt32[2]; // Retrieve 32 bit signed integer values from a field.
|
|
Float64 mFloat64; // Retrieve 32 bit floating point values from a field.
|
|
Float32 mFloat32[2]; // Retrieve 64 bit floating point values from the field.
|
|
};
|
|
|
|
public:
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Default constructor.
|
|
*/
|
|
ResBind()
|
|
: mIsNull(0), mError(0), mData(), mBind(nullptr), mTime(), mUint64(0)
|
|
{
|
|
/* ... */
|
|
}
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Copy constructor. (disabled)
|
|
*/
|
|
ResBind(const ResBind & o) = delete;
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Move constructor. (disabled)
|
|
*/
|
|
ResBind(ResBind && o) = delete;
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Copy assignment operator. (disabled)
|
|
*/
|
|
ResBind & operator = (const ResBind & o) = delete;
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Move assignment operator. (disabled)
|
|
*/
|
|
ResBind & operator = (ResBind && o) = delete;
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Retrieve the used buffer.
|
|
*/
|
|
CStr GetBuffer()
|
|
{
|
|
return mData ? mData.Data() : reinterpret_cast< CStr >(&mUint64);
|
|
}
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Retrieve the buffer length.
|
|
*/
|
|
Ulong GetLength() const
|
|
{
|
|
return mBind == nullptr ? 0 : mBind->buffer_length;
|
|
}
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Configure the output to match the requirements of a certain field.
|
|
*/
|
|
void SetOutput(const FieldType & field, BindType * bind);
|
|
};
|
|
|
|
/* ------------------------------------------------------------------------------------------------
|
|
* The structure that holds the data associated with a certain result-set handle.
|
|
*/
|
|
struct ResHnd
|
|
{
|
|
public:
|
|
|
|
// --------------------------------------------------------------------------------------------
|
|
typedef MYSQL_RES Type; // The managed type.
|
|
|
|
// --------------------------------------------------------------------------------------------
|
|
typedef Type* Pointer; // Pointer to the managed type.
|
|
typedef const Type* ConstPtr; // Constant pointer to the managed type.
|
|
|
|
// --------------------------------------------------------------------------------------------
|
|
typedef Type& Reference; // Reference to the managed type.
|
|
typedef const Type& ConstRef; // Constant reference to the managed type.
|
|
|
|
// --------------------------------------------------------------------------------------------
|
|
typedef MYSQL_FIELD FieldType; // Database field type.
|
|
typedef MYSQL_BIND BindType; // Database bind type.
|
|
typedef MYSQL_TIME TimeType; // Database time type.
|
|
typedef MYSQL_ROW RowType; // Database row type.
|
|
typedef my_bool BoolType; // Database boolean type.
|
|
|
|
// --------------------------------------------------------------------------------------------
|
|
typedef std::unordered_map< String, Uint32 > IndexMap; // Name to index association of fields.
|
|
|
|
public:
|
|
|
|
// --------------------------------------------------------------------------------------------
|
|
Pointer mPtr; // The managed result-set handle.
|
|
|
|
// --------------------------------------------------------------------------------------------
|
|
Uint32 mFieldCount; // Number of fields in the result-set.
|
|
Ulong * mLengths; // Data length when the result-set came from a connection.
|
|
FieldType * mFields; // Fields in the results set.
|
|
ResBind * mBinds; // Bind wrappers.
|
|
BindType * mMyBinds; // Bind points.
|
|
RowType mRow; // Row data.
|
|
|
|
// --------------------------------------------------------------------------------------------
|
|
ConnRef mConnection; // Associated connection.
|
|
StmtRef mStatement; // Associated statement.
|
|
IndexMap mIndexes; // Field names and their associated index.
|
|
|
|
public:
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Default constructor.
|
|
*/
|
|
ResHnd();
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Destructor.
|
|
*/
|
|
~ResHnd();
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Grab the current error in the associated statement or connection handle.
|
|
*/
|
|
void GrabCurrent();
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Grab the current error in the associated statement or connection handle and throw it.
|
|
*/
|
|
#if defined(_DEBUG) || defined(SQMOD_EXCEPTLOC)
|
|
void ThrowCurrent(CCStr act, CCStr file, Int32 line);
|
|
#else
|
|
void ThrowCurrent(CCStr act);
|
|
#endif // _DEBUG
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Validate the statement handle and field index and throw an error if invalid.
|
|
*/
|
|
#if defined(_DEBUG) || defined(SQMOD_EXCEPTLOC)
|
|
void ValidateField(Uint32 idx, CCStr file, Int32 line) const;
|
|
#else
|
|
void ValidateField(Uint32 idx) const;
|
|
#endif // _DEBUG
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Check whether a specific field index is within range.
|
|
*/
|
|
bool CheckFieldIndex(Uint32 idx) const
|
|
{
|
|
return (idx < mFieldCount);
|
|
}
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Retrieve the field index associated with the specified name.
|
|
*/
|
|
Uint32 GetFieldIndex(CSStr name);
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Create the result-set from a Connection.
|
|
*/
|
|
void Create(const ConnRef & conn);
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Create the result-set from a Statement.
|
|
*/
|
|
void Create(const StmtRef & stmt);
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Returns the current position of the row cursor for the last Next().
|
|
*/
|
|
Uint64 RowIndex() const;
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Returns the number of rows in the result set.
|
|
*/
|
|
Uint64 RowCount() const;
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Retrieve the next row from the query.
|
|
*/
|
|
bool Next();
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Seeks to an arbitrary row in a query result set.
|
|
*/
|
|
bool SetRowIndex(Uint64 index);
|
|
|
|
};
|
|
|
|
/* ------------------------------------------------------------------------------------------------
|
|
* Helper class containing shared connection information to avoid repetition.
|
|
*/
|
|
class Account
|
|
{
|
|
public:
|
|
|
|
// --------------------------------------------------------------------------------------------
|
|
typedef std::unordered_map< String, String > Options;
|
|
|
|
private:
|
|
|
|
// --------------------------------------------------------------------------------------------
|
|
Uint16 m_Port; // Server port.
|
|
String m_Host; // Host address.
|
|
String m_User; // User name.
|
|
String m_Pass; // User password.
|
|
String m_Name; // Database name.
|
|
String m_Socket; // Unix socket.
|
|
Ulong m_Flags; // Client connection flags.
|
|
|
|
// --------------------------------------------------------------------------------------------
|
|
String m_SSL_Key; // SSL key.
|
|
String m_SSL_Cert; // SSL certificate.
|
|
String m_SSL_CA; // SSL certificate authority.
|
|
String m_SSL_CA_Path; // SSL certificate authority path.
|
|
String m_SSL_Cipher; // SSL Cipher.
|
|
|
|
// --------------------------------------------------------------------------------------------
|
|
Options m_Options; // Option container.
|
|
|
|
// --------------------------------------------------------------------------------------------
|
|
bool m_AutoCommit; // Toggle autocommit.
|
|
|
|
// --------------------------------------------------------------------------------------------
|
|
static const String s_String; // Dummy used to return a reference to a null string.
|
|
|
|
public:
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Base Constructor.
|
|
*/
|
|
Account(CSStr host, CSStr user)
|
|
: Account(host, user, _SC(""), _SC(""), 3306, _SC(""))
|
|
{
|
|
/* ... */
|
|
}
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Base Constructor.
|
|
*/
|
|
Account(CSStr host, CSStr user, CSStr pass)
|
|
: Account(host, user, pass, _SC(""), 3306, _SC(""))
|
|
{
|
|
/* ... */
|
|
}
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Base Constructor.
|
|
*/
|
|
Account(CSStr host, CSStr user, CSStr pass, CSStr name)
|
|
: Account(host, user, pass, name, 3306, _SC(""))
|
|
{
|
|
/* ... */
|
|
}
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Base Constructor.
|
|
*/
|
|
Account(CSStr host, CSStr user, CSStr pass, CSStr name, SQInteger port)
|
|
: Account(host, user, pass, name, port, _SC(""))
|
|
{
|
|
/* ... */
|
|
}
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Base Constructor.
|
|
*/
|
|
Account(CSStr host, CSStr user, CSStr pass, CSStr name, SQInteger port, CSStr socket);
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Copy constructor.
|
|
*/
|
|
Account(const Account & o) = default;
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Move constructor.
|
|
*/
|
|
Account(Account && o) = default;
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Destructor.
|
|
*/
|
|
~Account() = default;
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Copy assignment operator.
|
|
*/
|
|
Account & operator = (const Account & o) = default;
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Move assignment operator.
|
|
*/
|
|
Account & operator = (Account && o) = default;
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Used by the script engine to compare two instances of this type.
|
|
*/
|
|
Int32 Cmp(const Account & o) const;
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Used by the script engine to convert an instance of this type to a string.
|
|
*/
|
|
CSStr ToString() const;
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Used by the script engine to retrieve the name from instances of this type.
|
|
*/
|
|
static SQInteger Typename(HSQUIRRELVM vm);
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Retrieve the host address specified during creation.
|
|
*/
|
|
const String & GetHost() const
|
|
{
|
|
return m_Host;
|
|
}
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Modify the host address specified during creation.
|
|
*/
|
|
void SetHost(CSStr addr);
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Retrieve the user name specified during creation.
|
|
*/
|
|
const String & GetUser() const
|
|
{
|
|
return m_User;
|
|
}
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Modify the user name specified during creation.
|
|
*/
|
|
void SetUser(CSStr user)
|
|
{
|
|
m_User.assign(user != nullptr ? user : _SC(""));
|
|
}
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Retrieve the password specified during creation.
|
|
*/
|
|
const String & GetPass() const
|
|
{
|
|
return m_Pass;
|
|
}
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Modify the password specified during creation.
|
|
*/
|
|
void SetPass(CSStr pass)
|
|
{
|
|
m_Pass.assign(pass != nullptr ? pass : _SC(""));
|
|
}
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Retrieve the database name specified during creation.
|
|
*/
|
|
const String & GetName() const
|
|
{
|
|
return m_Name;
|
|
}
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Modify the database name specified during creation.
|
|
*/
|
|
void SetName(CSStr name)
|
|
{
|
|
m_Name.assign(name != nullptr ? name : _SC(""));
|
|
}
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Retrieve the server port specified during creation.
|
|
*/
|
|
Uint16 GetPortNum() const
|
|
{
|
|
return m_Port;
|
|
}
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Modify the server port specified during creation.
|
|
*/
|
|
void SetPortNum(SQInteger port);
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Retrieve the server socket.
|
|
*/
|
|
const String & GetSocket() const
|
|
{
|
|
return m_Socket;
|
|
}
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Modify the server socket.
|
|
*/
|
|
void SetSocket(CSStr socket)
|
|
{
|
|
m_Socket.assign(socket != nullptr ? socket : _SC(""));
|
|
}
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Retrieve the current client connection flags.
|
|
*/
|
|
SQInteger GetFlags() const
|
|
{
|
|
return m_Flags;
|
|
}
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Modify the current client connection flags.
|
|
*/
|
|
void SetFlags(SQInteger flags)
|
|
{
|
|
m_Flags = flags;
|
|
}
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Modify the current client connection flags.
|
|
*/
|
|
void EnableFlags(SQInteger flags)
|
|
{
|
|
m_Flags |= flags;
|
|
}
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Modify the current client connection flags.
|
|
*/
|
|
void DisableFlags(SQInteger flags)
|
|
{
|
|
m_Flags |= flags;
|
|
m_Flags ^= flags;
|
|
}
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Retrieve the SSL key.
|
|
*/
|
|
const String & GetSSL_Key() const
|
|
{
|
|
return m_SSL_Key;
|
|
}
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Modify the SSL key.
|
|
*/
|
|
void SetSSL_Key(CSStr key)
|
|
{
|
|
m_SSL_Key.assign(key != nullptr ? key : _SC(""));
|
|
}
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Retrieve the SSL certificate.
|
|
*/
|
|
const String & GetSSL_Cert() const
|
|
{
|
|
return m_SSL_Cert;
|
|
}
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Modify the SSL certificate.
|
|
*/
|
|
void SetSSL_Cert(CSStr cert)
|
|
{
|
|
m_SSL_Cert.assign(cert != nullptr ? cert : _SC(""));
|
|
}
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Retrieve the SSL certificate authority.
|
|
*/
|
|
const String & GetSSL_CA() const
|
|
{
|
|
return m_SSL_CA;
|
|
}
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Modify the SSL certificate authority.
|
|
*/
|
|
void SetSSL_CA(CSStr ca)
|
|
{
|
|
m_SSL_CA.assign(ca != nullptr ? ca : _SC(""));
|
|
}
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Retrieve the SSL certificate authority path.
|
|
*/
|
|
const String & GetSSL_CA_Path() const
|
|
{
|
|
return m_SSL_CA_Path;
|
|
}
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Modify the SSL certificate authority path.
|
|
*/
|
|
void SetSSL_CA_Path(CSStr capath)
|
|
{
|
|
m_SSL_CA_Path.assign(capath != nullptr ? capath : _SC(""));
|
|
}
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Retrieve the SSL cipher.
|
|
*/
|
|
const String & GetSSL_Cipher() const
|
|
{
|
|
return m_SSL_Cipher;
|
|
}
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Modify the SSL cipher.
|
|
*/
|
|
void SetSSL_Cipher(CSStr cipher)
|
|
{
|
|
m_SSL_Cipher.assign(cipher != nullptr ? cipher : _SC(""));
|
|
}
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Set the SSL information.
|
|
*/
|
|
void SetSSL(CSStr key, CSStr cert, CSStr ca, CSStr ca_path, CSStr cipher);
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* See whether autocommit is enabled or not.
|
|
*/
|
|
bool GetAutoCommit() const
|
|
{
|
|
return m_AutoCommit;
|
|
}
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Set whether autocommit should be enabled or not.
|
|
*/
|
|
void SetAutoCommit(bool toggle)
|
|
{
|
|
m_AutoCommit = toggle;
|
|
}
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Retrieve the entire options container as a table.
|
|
*/
|
|
const Options & GetOptions() const
|
|
{
|
|
return m_Options;
|
|
}
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Retrieve the entire options container as a table.
|
|
*/
|
|
Table GetOptionsTable() const;
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Retrieve a value from the options container.
|
|
*/
|
|
const String & GetOption(CSStr name) const;
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Set a value in the options container.
|
|
*/
|
|
void SetOption(CSStr name, CSStr value);
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Remove a value from the options container.
|
|
*/
|
|
void RemoveOption(CSStr name);
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Retrieve the number of values in the options container.
|
|
*/
|
|
Uint32 OptionsCount() const
|
|
{
|
|
return static_cast< Uint32 >(m_Options.size());
|
|
}
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* See whether the options container is empty or not.
|
|
*/
|
|
bool OptionsEmpty() const
|
|
{
|
|
return m_Options.empty();
|
|
}
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Remove all the options from the options container.
|
|
*/
|
|
void OptionsClear()
|
|
{
|
|
m_Options.clear();
|
|
}
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Create a connection with the current account information.
|
|
*/
|
|
Connection Connect() const;
|
|
};
|
|
|
|
/* ------------------------------------------------------------------------------------------------
|
|
* Allows management and interaction with a connection handle.
|
|
*/
|
|
class Connection
|
|
{
|
|
private:
|
|
|
|
// --------------------------------------------------------------------------------------------
|
|
ConnRef m_Handle; // Reference to the actual database connection.
|
|
|
|
protected:
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Validate the managed connection handle and throw an error if invalid.
|
|
*/
|
|
#if defined(_DEBUG) || defined(SQMOD_EXCEPTLOC)
|
|
void Validate(CCStr file, Int32 line) const;
|
|
#else
|
|
void Validate() const;
|
|
#endif // _DEBUG
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Validate the managed connection handle and throw an error if invalid.
|
|
*/
|
|
#if defined(_DEBUG) || defined(SQMOD_EXCEPTLOC)
|
|
void ValidateCreated(CCStr file, Int32 line) const;
|
|
#else
|
|
void ValidateCreated() const;
|
|
#endif // _DEBUG
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Validate the managed connection handle and throw an error if invalid.
|
|
*/
|
|
#if defined(_DEBUG) || defined(SQMOD_EXCEPTLOC)
|
|
const ConnRef & GetValid(CCStr file, Int32 line) const;
|
|
#else
|
|
const ConnRef & GetValid() const;
|
|
#endif // _DEBUG
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Validate the managed connection handle and throw an error if invalid.
|
|
*/
|
|
#if defined(_DEBUG) || defined(SQMOD_EXCEPTLOC)
|
|
const ConnRef & GetCreated(CCStr file, Int32 line) const;
|
|
#else
|
|
const ConnRef & GetCreated() const;
|
|
#endif // _DEBUG
|
|
|
|
public:
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Default constructor.
|
|
*/
|
|
Connection()
|
|
: m_Handle()
|
|
{
|
|
/* ... */
|
|
}
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Base constructor.
|
|
*/
|
|
Connection(const Account & acc)
|
|
: m_Handle(new ConnHnd())
|
|
{
|
|
m_Handle->Create(acc);
|
|
}
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Base constructor.
|
|
*/
|
|
Connection(const ConnRef & conn)
|
|
: m_Handle(conn)
|
|
{
|
|
/* ... */
|
|
}
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Copy constructor.
|
|
*/
|
|
Connection(const Connection & o) = default;
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Move constructor.
|
|
*/
|
|
Connection(Connection && o) = default;
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Copy assignment operator.
|
|
*/
|
|
Connection & operator = (const Connection & o) = default;
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Move assignment operator.
|
|
*/
|
|
Connection & operator = (Connection && o) = default;
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Used by the script engine to compare two instances of this type.
|
|
*/
|
|
Int32 Cmp(const Connection & o) const
|
|
{
|
|
if (m_Handle.Get() == o.m_Handle.Get())
|
|
{
|
|
return 0;
|
|
}
|
|
else if (m_Handle.Get() > o.m_Handle.Get())
|
|
{
|
|
return 1;
|
|
}
|
|
else
|
|
{
|
|
return -1;
|
|
}
|
|
}
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Used by the script engine to convert an instance of this type to a string.
|
|
*/
|
|
CSStr ToString() const
|
|
{
|
|
return m_Handle ? mysql_get_host_info(m_Handle->mPtr) : _SC("");
|
|
}
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Used by the script engine to retrieve the name from instances of this type.
|
|
*/
|
|
static SQInteger Typename(HSQUIRRELVM vm);
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Retrieve the associated connection handle.
|
|
*/
|
|
const ConnRef & GetHandle() const
|
|
{
|
|
return m_Handle;
|
|
}
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* See whether the managed handle is valid.
|
|
*/
|
|
bool IsValid() const
|
|
{
|
|
return m_Handle;
|
|
}
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* See whether the managed connection handle was connected.
|
|
*/
|
|
bool IsConnected() const
|
|
{
|
|
return m_Handle && (m_Handle->mPtr != nullptr);
|
|
}
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Return the number of active references to this connection handle.
|
|
*/
|
|
Uint32 GetRefCount() const
|
|
{
|
|
return m_Handle.Count();
|
|
}
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Retrieve the current error number.
|
|
*/
|
|
SQInteger GetErrNo() const
|
|
{
|
|
return static_cast< SQInteger >(mysql_errno(SQMOD_GET_CREATED(*this)->mPtr));
|
|
}
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Retrieve the current error message.
|
|
*/
|
|
CSStr GetErrStr() const
|
|
{
|
|
return mysql_error(SQMOD_GET_CREATED(*this)->mPtr);
|
|
}
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Retrieve the last received error number.
|
|
*/
|
|
SQInteger GetLastErrNo() const
|
|
{
|
|
return static_cast< SQInteger >(SQMOD_GET_VALID(*this)->mErrNo);
|
|
}
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Retrieve the last received error message.
|
|
*/
|
|
const String & GetLastErrStr() const
|
|
{
|
|
return SQMOD_GET_VALID(*this)->mErrStr;
|
|
}
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Retrieve the connection port number.
|
|
*/
|
|
SQInteger GetPortNum() const
|
|
{
|
|
return static_cast< SQInteger >(SQMOD_GET_VALID(*this)->mPort);
|
|
}
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Retrieve the connection host address.
|
|
*/
|
|
const String & GetHost() const
|
|
{
|
|
return SQMOD_GET_VALID(*this)->mHost;
|
|
}
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Retrieve the connection user name.
|
|
*/
|
|
const String & GetUser() const
|
|
{
|
|
return SQMOD_GET_VALID(*this)->mUser;
|
|
}
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Retrieve the connection password.
|
|
*/
|
|
const String & GetPass() const
|
|
{
|
|
return SQMOD_GET_VALID(*this)->mPass;
|
|
}
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Retrieve the selected database name.
|
|
*/
|
|
const String & GetName() const
|
|
{
|
|
return SQMOD_GET_VALID(*this)->mName;
|
|
}
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Modify the selected database name.
|
|
*/
|
|
void SetName(CSStr name)
|
|
{
|
|
// Validate the specified name
|
|
if (!name)
|
|
{
|
|
STHROWF("Invalid MySQL database name");
|
|
}
|
|
// Attempt to select the database with the given name
|
|
else if (mysql_select_db(SQMOD_GET_CREATED(*this)->mPtr, name) != 0)
|
|
{
|
|
SQMOD_THROW_CURRENT(*m_Handle, "Cannot select MySQL database");
|
|
}
|
|
// Remember the database name
|
|
m_Handle->mName.assign(name);
|
|
}
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Retrieve the connection socket.
|
|
*/
|
|
const String & GetSocket() const
|
|
{
|
|
return SQMOD_GET_VALID(*this)->mSocket;
|
|
}
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Retrieve the connection flags.
|
|
*/
|
|
SQInteger GetFlags() const
|
|
{
|
|
return static_cast< SQInteger >(SQMOD_GET_VALID(*this)->mFlags);
|
|
}
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Retrieve the connection SSL key.
|
|
*/
|
|
const String & GetSSL_Key() const
|
|
{
|
|
return SQMOD_GET_VALID(*this)->mSSL_Key;
|
|
}
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Retrieve the connection SSL certificate.
|
|
*/
|
|
const String & GetSSL_Cert() const
|
|
{
|
|
return SQMOD_GET_VALID(*this)->mSSL_Cert;
|
|
}
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Retrieve the connection SSL certificate authority.
|
|
*/
|
|
const String & GetSSL_CA() const
|
|
{
|
|
return SQMOD_GET_VALID(*this)->mSSL_CA;
|
|
}
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Retrieve the connection SSL certificate authority path.
|
|
*/
|
|
const String & GetSSL_CA_Path() const
|
|
{
|
|
return SQMOD_GET_VALID(*this)->mSSL_CA_Path;
|
|
}
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Retrieve the connection SSL cipher.
|
|
*/
|
|
const String & GetSSL_Cipher() const
|
|
{
|
|
return SQMOD_GET_VALID(*this)->mSSL_Cipher;
|
|
}
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Retrieve the default character set for the managed connection.
|
|
*/
|
|
const String & GetCharset() const
|
|
{
|
|
return SQMOD_GET_VALID(*this)->mCharset;
|
|
}
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Modify the default character set for the managed connection.
|
|
*/
|
|
void SetCharset(CSStr charset)
|
|
{
|
|
// Validate the specified string
|
|
if (!charset)
|
|
{
|
|
STHROWF("Invalid charset string");
|
|
}
|
|
// Attempt to Set the default character set for the managed connection
|
|
else if (mysql_set_character_set(SQMOD_GET_CREATED(*this)->mPtr, charset) != 0)
|
|
{
|
|
SQMOD_THROW_CURRENT(*m_Handle, "Cannot apply character set");
|
|
}
|
|
// Remember the character set
|
|
m_Handle->mCharset.assign(charset);
|
|
}
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* See whether auto-commit is enabled or not.
|
|
*/
|
|
bool GetAutoCommit() const
|
|
{
|
|
return SQMOD_GET_VALID((*this))->mAutoCommit;
|
|
}
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Set whether auto-commit should be enabled or not.
|
|
*/
|
|
void SetAutoCommit(bool toggle)
|
|
{
|
|
// Attempt to toggle auto-commit if necessary
|
|
if (SQMOD_GET_CREATED(*this)->mAutoCommit != toggle &&
|
|
mysql_autocommit(m_Handle->mPtr, toggle) != 0)
|
|
{
|
|
SQMOD_THROW_CURRENT(*m_Handle, "Cannot toggle auto-commit");
|
|
}
|
|
else
|
|
{
|
|
m_Handle->mAutoCommit = toggle;
|
|
}
|
|
}
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* See whether the connection is in the middle of a transaction.
|
|
*/
|
|
bool GetInTransaction() const
|
|
{
|
|
return SQMOD_GET_VALID(*this)->mInTransaction;
|
|
}
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Disconnect from the currently connected database.
|
|
*/
|
|
void Disconnect()
|
|
{
|
|
SQMOD_GET_CREATED(*this)->Disconnect();
|
|
}
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Execute a query on the server.
|
|
*/
|
|
Object Execute(CSStr query)
|
|
{
|
|
return Object(SqTypeIdentity< ULongInt >{}, SqVM(), SQMOD_GET_CREATED(*this)->Execute(query));
|
|
}
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Execute a query on the server.
|
|
*/
|
|
Object Insert(CSStr query);
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Execute a query on the server.
|
|
*/
|
|
ResultSet Query(CSStr query);
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Create a new statement on the managed connection.
|
|
*/
|
|
Statement GetStatement(CSStr query);
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Create a new transaction on the managed connection.
|
|
*/
|
|
Transaction GetTransaction();
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Escape unwanted characters from a given string.
|
|
*/
|
|
LightObj EscapeString(StackStrF & str);
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Attempt to execute the specified query.
|
|
*/
|
|
static SQInteger ExecuteF(HSQUIRRELVM vm);
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Attempt to execute the specified query.
|
|
*/
|
|
static SQInteger InsertF(HSQUIRRELVM vm);
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Attempt to execute the specified query.
|
|
*/
|
|
static SQInteger QueryF(HSQUIRRELVM vm);
|
|
};
|
|
|
|
/* ------------------------------------------------------------------------------------------------
|
|
* Used to manage and interact with fields from result-sets.
|
|
*/
|
|
class Field
|
|
{
|
|
// --------------------------------------------------------------------------------------------
|
|
friend class ResultSet;
|
|
|
|
private:
|
|
|
|
// --------------------------------------------------------------------------------------------
|
|
Uint32 m_Index; // The actual index of the referenced field.
|
|
ResRef m_Handle; // Reference to the actual database result-set.
|
|
|
|
protected:
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Validate the associated result-set handle and field index, and throw an error if invalid.
|
|
*/
|
|
#if defined(_DEBUG) || defined(SQMOD_EXCEPTLOC)
|
|
void Validate(CCStr file, Int32 line) const;
|
|
#else
|
|
void Validate() const;
|
|
#endif // _DEBUG
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Validate the associated result-set handle and field index, and throw an error if invalid.
|
|
*/
|
|
#if defined(_DEBUG) || defined(SQMOD_EXCEPTLOC)
|
|
void ValidateCreated(CCStr file, Int32 line) const;
|
|
#else
|
|
void ValidateCreated() const;
|
|
#endif // _DEBUG
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Validate the associated result-set handle, field index and row, and throw an error if invalid.
|
|
*/
|
|
#if defined(_DEBUG) || defined(SQMOD_EXCEPTLOC)
|
|
void ValidateStepped(CCStr file, Int32 line) const;
|
|
#else
|
|
void ValidateStepped() const;
|
|
#endif // _DEBUG
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Validate the associated result-set handle and field index, and throw an error if invalid.
|
|
*/
|
|
#if defined(_DEBUG) || defined(SQMOD_EXCEPTLOC)
|
|
const ResRef & GetValid(CCStr file, Int32 line) const;
|
|
#else
|
|
const ResRef & GetValid() const;
|
|
#endif // _DEBUG
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Validate the associated result-set handle and field index, and throw an error if invalid.
|
|
*/
|
|
#if defined(_DEBUG) || defined(SQMOD_EXCEPTLOC)
|
|
const ResRef & GetCreated(CCStr file, Int32 line) const;
|
|
#else
|
|
const ResRef & GetCreated() const;
|
|
#endif // _DEBUG
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Validate the associated result-set handle field index and row, and throw an error if invalid.
|
|
*/
|
|
#if defined(_DEBUG) || defined(SQMOD_EXCEPTLOC)
|
|
const ResRef & GetStepped(CCStr file, Int32 line) const;
|
|
#else
|
|
const ResRef & GetStepped() const;
|
|
#endif // _DEBUG
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Validate the associated result-set handle and field index, and throw an error if invalid.
|
|
*/
|
|
#if defined(_DEBUG) || defined(SQMOD_EXCEPTLOC)
|
|
void ValidateField(Uint32 idx, CCStr file, Int32 line) const;
|
|
#else
|
|
void ValidateField(Uint32 idx) const;
|
|
#endif // _DEBUG
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Modify the index to the specified value.
|
|
*/
|
|
void SetIndex(Int32 idx)
|
|
{
|
|
SQMOD_VALIDATE_FIELD(*this, idx);
|
|
// Assign the new index
|
|
m_Index = idx;
|
|
}
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Modify the index to the specified value.
|
|
*/
|
|
void SetIndex(CSStr name)
|
|
{
|
|
SetIndex(SQMOD_GET_CREATED(*this)->GetFieldIndex(name));
|
|
}
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Modify the index to the specified value.
|
|
*/
|
|
void SetIndex(const Object & field);
|
|
|
|
public:
|
|
|
|
// --------------------------------------------------------------------------------------------
|
|
static const Uint32 INVALID_INDEX; // Value that represents an invalid index.
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Default constructor (null).
|
|
*/
|
|
Field()
|
|
: m_Index(INVALID_INDEX), m_Handle()
|
|
{
|
|
/* ... */
|
|
}
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* No field constructor.
|
|
*/
|
|
Field(const ResRef & rset)
|
|
: m_Index(INVALID_INDEX), m_Handle(rset)
|
|
{
|
|
/* ... */
|
|
}
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Index constructor.
|
|
*/
|
|
Field(const ResRef & rset, Uint32 idx)
|
|
: m_Index(idx), m_Handle(rset)
|
|
{
|
|
SQMOD_VALIDATE_FIELD(*this, m_Index);
|
|
}
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Name constructor.
|
|
*/
|
|
Field(const ResRef & rset, CSStr name)
|
|
: m_Index(rset ? rset->GetFieldIndex(name) : -1), m_Handle(rset)
|
|
{
|
|
SQMOD_VALIDATE_FIELD(*this, m_Index);
|
|
}
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Dynamic constructor.
|
|
*/
|
|
Field(const ResRef & rset, const Object & field)
|
|
: m_Index(INVALID_INDEX), m_Handle(rset)
|
|
{
|
|
if (!m_Handle)
|
|
{
|
|
STHROWF("Invalid MySQL result-set reference");
|
|
}
|
|
// Extract the index
|
|
SetIndex(field);
|
|
}
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Copy constructor.
|
|
*/
|
|
Field(const Field & o) = default;
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Move constructor.
|
|
*/
|
|
Field(Field && o) = default;
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Copy assignment operator.
|
|
*/
|
|
Field & operator = (const Field & o) = default;
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Move assignment operator.
|
|
*/
|
|
Field & operator = (Field && o) = default;
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Perform an equality comparison between two result-set field indexes.
|
|
*/
|
|
bool operator == (const Field & o) const
|
|
{
|
|
return (m_Index == o.m_Index);
|
|
}
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Perform an inequality comparison between two result-set field indexes.
|
|
*/
|
|
bool operator != (const Field & o) const
|
|
{
|
|
return (m_Index != o.m_Index);
|
|
}
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Implicit conversion to boolean for use in boolean operations.
|
|
*/
|
|
operator bool () const
|
|
{
|
|
return (m_Handle && m_Handle->CheckFieldIndex(m_Index));
|
|
}
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Used by the script engine to compare two instances of this type.
|
|
*/
|
|
Int32 Cmp(const Field & o) const
|
|
{
|
|
if (m_Index == o.m_Index)
|
|
{
|
|
return 0;
|
|
}
|
|
else if (m_Index > o.m_Index)
|
|
{
|
|
return 1;
|
|
}
|
|
else
|
|
{
|
|
return -1;
|
|
}
|
|
}
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Used by the script engine to convert an instance of this type to a string.
|
|
*/
|
|
CSStr ToString() const
|
|
{
|
|
CSStr val = nullptr;
|
|
// Can we attempt to return the parameter name?
|
|
if (m_Handle && m_Handle->CheckFieldIndex(m_Index))
|
|
{
|
|
val = m_Handle->mFields[m_Index].name;
|
|
}
|
|
else
|
|
{
|
|
val = ToStrF(_SC("%d"), m_Index);
|
|
}
|
|
// Return the value if valid
|
|
return val ? val : _SC("");
|
|
}
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Used by the script engine to retrieve the name from instances of this type.
|
|
*/
|
|
static SQInteger Typename(HSQUIRRELVM vm);
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* See whether the field is valid.
|
|
*/
|
|
bool IsValid() const
|
|
{
|
|
return m_Handle; // An invalid result-set means an invalid field
|
|
}
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Return the number of active references to the associated result-set handle.
|
|
*/
|
|
Uint32 GetRefCount() const
|
|
{
|
|
return m_Handle.Count();
|
|
}
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Retrieve the referenced field index.
|
|
*/
|
|
SQInteger GetIndex() const
|
|
{
|
|
return ConvTo< SQInteger >::From(m_Index);
|
|
}
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Retrieve the referenced database result-set.
|
|
*/
|
|
Object GetResultSet() const;
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Retrieve the referenced database connection.
|
|
*/
|
|
Object GetConnection() const;
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Release the reference to the referenced database result-set and field index.
|
|
*/
|
|
void Release()
|
|
{
|
|
m_Handle.Reset();
|
|
m_Index = INVALID_INDEX;
|
|
}
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Retrieve the value inside the referenced field as a boolean value.
|
|
*/
|
|
bool GetBoolean() const;
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Retrieve the value inside the referenced field as a character.
|
|
*/
|
|
SQChar GetChar() const;
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Retrieve the value inside the referenced field as a native script integer.
|
|
*/
|
|
SQInteger GetInteger() const;
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Retrieve the value inside the referenced field as a native script floating point.
|
|
*/
|
|
SQFloat GetFloat() const;
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Retrieve the value inside the referenced field as a signed 8 bit integer value.
|
|
*/
|
|
SQInteger GetInt8() const;
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Retrieve the value inside the referenced field as an unsigned 8 bit integer value.
|
|
*/
|
|
SQInteger GetUint8() const;
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Retrieve the value inside the referenced field as a signed 16 bit integer value.
|
|
*/
|
|
SQInteger GetInt16() const;
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Retrieve the value inside the referenced field as an unsigned 16 bit integer value.
|
|
*/
|
|
SQInteger GetUint16() const;
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Retrieve the value inside the referenced field as a signed 32 bit integer value.
|
|
*/
|
|
SQInteger GetInt32() const;
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Retrieve the value inside the referenced field as an unsigned 32 bit integer value.
|
|
*/
|
|
SQInteger GetUint32() const;
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Retrieve the value inside the referenced field as a signed 64 bit integer value.
|
|
*/
|
|
Object GetInt64() const;
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Retrieve the value inside the referenced field as an unsigned 64 bit integer value.
|
|
*/
|
|
Object GetUint64() const;
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Retrieve the value inside the referenced field as a 32 bit floating point value.
|
|
*/
|
|
SQFloat GetFloat32() const;
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Retrieve the value inside the referenced field as a 64 bit floating point value.
|
|
*/
|
|
SQFloat GetFloat64() const;
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Retrieve the value inside the referenced field as a string value.
|
|
*/
|
|
Object GetString() const;
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Retrieve the value inside the referenced field as a memory buffer.
|
|
*/
|
|
Object GetBuffer() const;
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Retrieve the value inside the referenced field as a memory blob.
|
|
*/
|
|
Object GetBlob() const;
|
|
};
|
|
|
|
/* ------------------------------------------------------------------------------------------------
|
|
* Allows management and interaction with a result set handle.
|
|
*/
|
|
class ResultSet
|
|
{
|
|
private:
|
|
|
|
// --------------------------------------------------------------------------------------------
|
|
ResRef m_Handle; // Reference to the actual database result-set.
|
|
|
|
protected:
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Validate the managed statement handle and throw an error if invalid.
|
|
*/
|
|
#if defined(_DEBUG) || defined(SQMOD_EXCEPTLOC)
|
|
void Validate(CCStr file, Int32 line) const;
|
|
#else
|
|
void Validate() const;
|
|
#endif // _DEBUG
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Validate the managed statement handle and throw an error if invalid.
|
|
*/
|
|
#if defined(_DEBUG) || defined(SQMOD_EXCEPTLOC)
|
|
void ValidateCreated(CCStr file, Int32 line) const;
|
|
#else
|
|
void ValidateCreated() const;
|
|
#endif // _DEBUG
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Validate the managed statement handle and row, and throw an error if invalid.
|
|
*/
|
|
#if defined(_DEBUG) || defined(SQMOD_EXCEPTLOC)
|
|
void ValidateStepped(CCStr file, Int32 line) const;
|
|
#else
|
|
void ValidateStepped() const;
|
|
#endif // _DEBUG
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Validate the managed statement handle and throw an error if invalid.
|
|
*/
|
|
#if defined(_DEBUG) || defined(SQMOD_EXCEPTLOC)
|
|
const ResRef & GetValid(CCStr file, Int32 line) const;
|
|
#else
|
|
const ResRef & GetValid() const;
|
|
#endif // _DEBUG
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Validate the managed statement handle and throw an error if invalid.
|
|
*/
|
|
#if defined(_DEBUG) || defined(SQMOD_EXCEPTLOC)
|
|
const ResRef & GetCreated(CCStr file, Int32 line) const;
|
|
#else
|
|
const ResRef & GetCreated() const;
|
|
#endif // _DEBUG
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Validate the managed statement handle and row, and throw an error if invalid.
|
|
*/
|
|
#if defined(_DEBUG) || defined(SQMOD_EXCEPTLOC)
|
|
const ResRef & GetStepped(CCStr file, Int32 line) const;
|
|
#else
|
|
const ResRef & GetStepped() const;
|
|
#endif // _DEBUG
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Validate the statement reference and field index, and throw an error if they're invalid.
|
|
*/
|
|
#if defined(_DEBUG) || defined(SQMOD_EXCEPTLOC)
|
|
void ValidateField(Int32 idx, CCStr file, Int32 line) const;
|
|
#else
|
|
void ValidateField(Int32 idx) const;
|
|
#endif // _DEBUG
|
|
|
|
public:
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Default constructor.
|
|
*/
|
|
ResultSet()
|
|
: m_Handle()
|
|
{
|
|
/* ... */
|
|
}
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Connection constructor.
|
|
*/
|
|
explicit ResultSet(const ConnRef & conn)
|
|
: m_Handle(new ResHnd())
|
|
{
|
|
m_Handle->Create(conn);
|
|
}
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Statement constructor.
|
|
*/
|
|
explicit ResultSet(const StmtRef & stmt)
|
|
: m_Handle(new ResHnd())
|
|
{
|
|
m_Handle->Create(stmt);
|
|
}
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Handle constructor.
|
|
*/
|
|
explicit ResultSet(ResRef hnd)
|
|
: m_Handle(std::move(hnd))
|
|
{
|
|
/* ... */
|
|
}
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Copy constructor.
|
|
*/
|
|
ResultSet(const ResultSet & o) = default;
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Move constructor.
|
|
*/
|
|
ResultSet(ResultSet && o) = default;
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Destructor.
|
|
*/
|
|
~ResultSet() = default;
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Copy assignment operator.
|
|
*/
|
|
ResultSet & operator = (const ResultSet & o) = default;
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Move assignment operator.
|
|
*/
|
|
ResultSet & operator = (ResultSet && o) = default;
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Used by the script engine to compare two instances of this type.
|
|
*/
|
|
Int32 Cmp(const ResultSet & o) const
|
|
{
|
|
if (m_Handle.Get() == o.m_Handle.Get())
|
|
{
|
|
return 0;
|
|
}
|
|
else if (m_Handle.Get() > o.m_Handle.Get())
|
|
{
|
|
return 1;
|
|
}
|
|
else
|
|
{
|
|
return -1;
|
|
}
|
|
}
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Used by the script engine to convert an instance of this type to a string.
|
|
*/
|
|
CSStr ToString() const
|
|
{
|
|
// Do we have a valid handle?
|
|
if (m_Handle)
|
|
{
|
|
ToStrF("%u", m_Handle->mFieldCount);
|
|
}
|
|
// Default to a negative value
|
|
return _SC("-1");
|
|
}
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Used by the script engine to retrieve the name from instances of this type.
|
|
*/
|
|
static SQInteger Typename(HSQUIRRELVM vm);
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* See whether the managed handle is valid.
|
|
*/
|
|
bool IsValid() const
|
|
{
|
|
return m_Handle;
|
|
}
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Returns an array with all the field names available in the managed result set.
|
|
*/
|
|
Array GetFieldNames() const;
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Returns an array with wrapper instances for all the field available in the managed result set.
|
|
*/
|
|
Array GetFieldsArray() const;
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Returns an array with wrapper instances for the specified fields in the managed result set.
|
|
*/
|
|
Array FetchFieldsArray(Array & fields) const;
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Returns a table with wrapper instances for all the field available in the managed result set.
|
|
*/
|
|
Table GetFieldsTable() const;
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Returns a table with wrapper instances for all the specified fields in the managed result set.
|
|
*/
|
|
Table FetchFieldsTable(Array & fields) const;
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Returns the current position of the row cursor for the last Next().
|
|
*/
|
|
Object RowIndex() const
|
|
{
|
|
return Object(SqTypeIdentity< ULongInt >{}, SqVM(), SQMOD_GET_CREATED(*this)->RowIndex());
|
|
}
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Returns the number of rows in the result set.
|
|
*/
|
|
Object RowCount() const
|
|
{
|
|
return Object(SqTypeIdentity< ULongInt >{}, SqVM(), SQMOD_GET_CREATED(*this)->RowCount());
|
|
}
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Retrieve the next row from the query.
|
|
*/
|
|
bool Next() const
|
|
{
|
|
return SQMOD_GET_CREATED(*this)->Next();
|
|
}
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Seeks to an arbitrary row in a query result set.
|
|
*/
|
|
bool SetRowIndex(SQInteger index) const
|
|
{
|
|
return SQMOD_GET_CREATED(*this)->SetRowIndex(ConvTo< Uint64 >::From(index));
|
|
}
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Seeks to an arbitrary row in a query result set.
|
|
*/
|
|
bool SetLongRowIndex(const ULongInt & index) const
|
|
{
|
|
return SQMOD_GET_CREATED(*this)->SetRowIndex(index.GetNum());
|
|
}
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Retrieve the field with the specified name or index.
|
|
*/
|
|
Field GetField(const Object & field) const
|
|
{
|
|
return Field(SQMOD_GET_STEPPED(*this), field);
|
|
}
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Retrieve the value inside the specified field as a boolean value.
|
|
*/
|
|
bool GetBoolean(const Object & field) const
|
|
{
|
|
return Field(SQMOD_GET_STEPPED(*this), field).GetBoolean();
|
|
}
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Retrieve the value inside the specified field as a character.
|
|
*/
|
|
SQChar GetChar(const Object & field) const
|
|
{
|
|
return Field(SQMOD_GET_STEPPED(*this), field).GetChar();
|
|
}
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Retrieve the value inside the specified field as a native script integer.
|
|
*/
|
|
SQInteger GetInteger(const Object & field) const
|
|
{
|
|
return Field(SQMOD_GET_STEPPED(*this), field).GetInteger();
|
|
}
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Retrieve the value inside the specified field as a native script floating point.
|
|
*/
|
|
SQFloat GetFloat(const Object & field) const
|
|
{
|
|
return Field(SQMOD_GET_STEPPED(*this), field).GetFloat();
|
|
}
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Retrieve the value inside the specified field as a signed 8 bit integer value.
|
|
*/
|
|
SQInteger GetInt8(const Object & field) const
|
|
{
|
|
return Field(SQMOD_GET_STEPPED(*this), field).GetInt8();
|
|
}
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Retrieve the value inside the specified field as an unsigned 8 bit integer value.
|
|
*/
|
|
SQInteger GetUint8(const Object & field) const
|
|
{
|
|
return Field(SQMOD_GET_STEPPED(*this), field).GetUint8();
|
|
}
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Retrieve the value inside the specified field as a signed 16 bit integer value.
|
|
*/
|
|
SQInteger GetInt16(const Object & field) const
|
|
{
|
|
return Field(SQMOD_GET_STEPPED(*this), field).GetInt16();
|
|
}
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Retrieve the value inside the specified field as an unsigned 16 bit integer value.
|
|
*/
|
|
SQInteger GetUint16(const Object & field) const
|
|
{
|
|
return Field(SQMOD_GET_STEPPED(*this), field).GetUint16();
|
|
}
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Retrieve the value inside the specified field as a signed 32 bit integer value.
|
|
*/
|
|
SQInteger GetInt32(const Object & field) const
|
|
{
|
|
return Field(SQMOD_GET_STEPPED(*this), field).GetInt32();
|
|
}
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Retrieve the value inside the specified field as an unsigned 32 bit integer value.
|
|
*/
|
|
SQInteger GetUint32(const Object & field) const
|
|
{
|
|
return Field(SQMOD_GET_STEPPED(*this), field).GetUint32();
|
|
}
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Retrieve the value inside the specified field as a signed 64 bit integer value.
|
|
*/
|
|
Object GetInt64(const Object & field) const
|
|
{
|
|
return Field(SQMOD_GET_STEPPED(*this), field).GetInt64();
|
|
}
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Retrieve the value inside the specified field as an unsigned 64 bit integer value.
|
|
*/
|
|
Object GetUint64(const Object & field) const
|
|
{
|
|
return Field(SQMOD_GET_STEPPED(*this), field).GetUint64();
|
|
}
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Retrieve the value inside the specified field as a 32 bit floating point value.
|
|
*/
|
|
SQFloat GetFloat32(const Object & field) const
|
|
{
|
|
return Field(SQMOD_GET_STEPPED(*this), field).GetFloat32();
|
|
}
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Retrieve the value inside the specified field as a 64 bit floating point value.
|
|
*/
|
|
SQFloat GetFloat64(const Object & field) const
|
|
{
|
|
return Field(SQMOD_GET_STEPPED(*this), field).GetFloat64();
|
|
}
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Retrieve the value inside the specified field as a string value.
|
|
*/
|
|
Object GetString(const Object & field) const
|
|
{
|
|
return Field(SQMOD_GET_STEPPED(*this), field).GetString();
|
|
}
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Retrieve the value inside the specified field as a memory buffer.
|
|
*/
|
|
Object GetBuffer(const Object & field) const
|
|
{
|
|
return Field(SQMOD_GET_STEPPED(*this), field).GetBuffer();
|
|
}
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Retrieve the value inside the specified field as a memory blob.
|
|
*/
|
|
Object GetBlob(const Object & field) const
|
|
{
|
|
return Field(SQMOD_GET_STEPPED(*this), field).GetBlob();
|
|
}
|
|
};
|
|
|
|
/* ------------------------------------------------------------------------------------------------
|
|
* Allows management and interaction with a statement handle.
|
|
*/
|
|
class Statement
|
|
{
|
|
private:
|
|
|
|
// --------------------------------------------------------------------------------------------
|
|
StmtRef m_Handle; // Reference to the actual database statement.
|
|
|
|
protected:
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Validate the managed statement handle and throw an error if invalid.
|
|
*/
|
|
#if defined(_DEBUG) || defined(SQMOD_EXCEPTLOC)
|
|
void Validate(CCStr file, Int32 line) const;
|
|
#else
|
|
void Validate() const;
|
|
#endif // _DEBUG
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Validate the managed statement handle and throw an error if invalid.
|
|
*/
|
|
#if defined(_DEBUG) || defined(SQMOD_EXCEPTLOC)
|
|
void ValidateCreated(CCStr file, Int32 line) const;
|
|
#else
|
|
void ValidateCreated() const;
|
|
#endif // _DEBUG
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Validate the managed statement handle and throw an error if invalid.
|
|
*/
|
|
#if defined(_DEBUG) || defined(SQMOD_EXCEPTLOC)
|
|
const StmtRef & GetValid(CCStr file, Int32 line) const;
|
|
#else
|
|
const StmtRef & GetValid() const;
|
|
#endif // _DEBUG
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Validate the managed statement handle and throw an error if invalid.
|
|
*/
|
|
#if defined(_DEBUG) || defined(SQMOD_EXCEPTLOC)
|
|
const StmtRef & GetCreated(CCStr file, Int32 line) const;
|
|
#else
|
|
const StmtRef & GetCreated() const;
|
|
#endif // _DEBUG
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Validate the statement reference and parameter index, and throw an error if they're invalid.
|
|
*/
|
|
#if defined(_DEBUG) || defined(SQMOD_EXCEPTLOC)
|
|
void ValidateParam(Int32 idx, CCStr file, Int32 line) const;
|
|
#else
|
|
void ValidateParam(Int32 idx) const;
|
|
#endif // _DEBUG
|
|
|
|
public:
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Default constructor.
|
|
*/
|
|
Statement()
|
|
: m_Handle()
|
|
{
|
|
/* ... */
|
|
}
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Construct a statement under the specified connection using the specified string.
|
|
*/
|
|
Statement(const ConnRef & connection, CSStr query)
|
|
: m_Handle(new StmtHnd())
|
|
{
|
|
m_Handle->Create(connection, query);
|
|
}
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Construct a statement under the specified connection using the specified string.
|
|
*/
|
|
Statement(const Connection & connection, CSStr query);
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Copy constructor.
|
|
*/
|
|
Statement(const Statement & o) = default;
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Move constructor.
|
|
*/
|
|
Statement(Statement && o) = default;
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Copy assignment operator.
|
|
*/
|
|
Statement & operator = (const Statement & o) = default;
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Move assignment operator.
|
|
*/
|
|
Statement & operator = (Statement && o) = default;
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Used by the script engine to compare two instances of this type.
|
|
*/
|
|
Int32 Cmp(const Statement & o) const
|
|
{
|
|
if (m_Handle.Get() == o.m_Handle.Get())
|
|
{
|
|
return 0;
|
|
}
|
|
else if (m_Handle.Get() > o.m_Handle.Get())
|
|
{
|
|
return 1;
|
|
}
|
|
else
|
|
{
|
|
return -1;
|
|
}
|
|
}
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Used by the script engine to convert an instance of this type to a string.
|
|
*/
|
|
const String & ToString() const
|
|
{
|
|
// Do we have a valid handle?
|
|
if (m_Handle)
|
|
{
|
|
m_Handle->mQuery;
|
|
}
|
|
// Default to an empty string
|
|
return NullString();
|
|
}
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Used by the script engine to retrieve the name from instances of this type.
|
|
*/
|
|
static SQInteger Typename(HSQUIRRELVM vm);
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Retrieve the associated connection handle.
|
|
*/
|
|
const StmtRef & GetHandle() const
|
|
{
|
|
return m_Handle;
|
|
}
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* See whether the managed handle is valid.
|
|
*/
|
|
bool IsValid() const
|
|
{
|
|
return m_Handle;
|
|
}
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Retrieve the currently associated statement connection.
|
|
*/
|
|
Connection GetConnection() const;
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Modify the currently associated statement connection.
|
|
*/
|
|
void SetConnection(const Connection & conn);
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Execute the statement.
|
|
*/
|
|
Int32 Execute();
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Execute the statement.
|
|
*/
|
|
Uint32 Insert();
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Execute the statement.
|
|
*/
|
|
ResultSet Query();
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Assign a signed 8bit integer to a parameter.
|
|
*/
|
|
void SetInt8(Uint32 idx, SQInteger val) const;
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Assign an unsigned 8bit integer to a parameter.
|
|
*/
|
|
void SetUint8(Uint32 idx, SQInteger val) const;
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Assign a signed 16bit integer to a parameter.
|
|
*/
|
|
void SetInt16(Uint32 idx, SQInteger val) const;
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Assign an unsigned 16bit integer to a parameter.
|
|
*/
|
|
void SetUint16(Uint32 idx, SQInteger val) const;
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Assign a signed 32bit integer to a parameter.
|
|
*/
|
|
void SetInt32(Uint32 idx, SQInteger val) const;
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Assign an unsigned 32bit integer to a parameter.
|
|
*/
|
|
void SetUint32(Uint32 idx, SQInteger val) const;
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Assign a signed 64bit integer to a parameter.
|
|
*/
|
|
void SetInt64(Uint32 idx, SQInteger val) const;
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Assign an unsigned 64bit integer to a parameter.
|
|
*/
|
|
void SetUint64(Uint32 idx, SQInteger val) const;
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Assign a signed long integer to a parameter.
|
|
*/
|
|
void SetSLongInt(Uint32 idx, const SLongInt & val) const;
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Assign an unsigned long integer to a parameter.
|
|
*/
|
|
void SetULongInt(Uint32 idx, const ULongInt & val) const;
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Assign a native integer to a parameter.
|
|
*/
|
|
void SetInteger(Uint32 idx, SQInteger val) const;
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Assign a 32bit floating point to a parameter.
|
|
*/
|
|
void SetFloat32(Uint32 idx, SQFloat val) const;
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Assign a 64bit floating point to a parameter.
|
|
*/
|
|
void SetFloat64(Uint32 idx, SQFloat val) const;
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Assign a native float to a parameter.
|
|
*/
|
|
void SetFloat(Uint32 idx, SQFloat val) const;
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Assign a boolean to a parameter.
|
|
*/
|
|
void SetBoolean(Uint32 idx, bool val) const;
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Assign a date to a parameter.
|
|
*/
|
|
void SetDate(Uint32 idx, const Date & val) const;
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Assign a time to a parameter.
|
|
*/
|
|
void SetTime(Uint32 idx, const Time & val) const;
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Assign a date and time to a parameter.
|
|
*/
|
|
void SetDatetime(Uint32 idx, const Datetime & val) const;
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Assign a string to a parameter.
|
|
*/
|
|
void SetString(Uint32 idx, CSStr val) const;
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Assign an enumeration to a parameter.
|
|
*/
|
|
void SetEnum(Uint32 idx, CSStr val) const;
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Assign an enumeration to a parameter.
|
|
*/
|
|
void SetSet(Uint32 idx, CSStr val) const;
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Assign a blob to a parameter.
|
|
*/
|
|
void SetBlob(Uint32 idx, Object & val) const;
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Assign a buffer to a paramete.
|
|
*/
|
|
void SetData(Uint32 idx, Object & val) const;
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Assign a null to a parameter.
|
|
*/
|
|
void SetNull(Uint32 idx) const;
|
|
};
|
|
|
|
/* ------------------------------------------------------------------------------------------------
|
|
* ...
|
|
*/
|
|
class Parameter
|
|
{
|
|
public:
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Default constructor.
|
|
*/
|
|
Parameter();
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Copy constructor.
|
|
*/
|
|
Parameter(const Parameter & o);
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Move constructor.
|
|
*/
|
|
Parameter(Parameter && o);
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Destructor.
|
|
*/
|
|
~Parameter();
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Copy assignment operator.
|
|
*/
|
|
Parameter & operator = (const Parameter & o);
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Move assignment operator.
|
|
*/
|
|
Parameter & operator = (Parameter && o);
|
|
|
|
};
|
|
|
|
/* ------------------------------------------------------------------------------------------------
|
|
* ...
|
|
*/
|
|
class Transaction
|
|
{
|
|
public:
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Default constructor.
|
|
*/
|
|
Transaction()
|
|
{
|
|
|
|
}
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Copy constructor. (disabled)
|
|
*/
|
|
Transaction(const Transaction & o) = delete;
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Move constructor. (disabled)
|
|
*/
|
|
Transaction(Transaction && o) = default;
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Destructor.
|
|
*/
|
|
~Transaction()
|
|
{
|
|
|
|
}
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Copy assignment operator. (disabled)
|
|
*/
|
|
Transaction & operator = (const Transaction & o) = delete;
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Move assignment operator. (disabled)
|
|
*/
|
|
Transaction & operator = (Transaction && o) = default;
|
|
|
|
};
|
|
|
|
} // Namespace:: SqMod
|