You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

110 lines
2.7 KiB
C

1 month ago
#pragma once
#include <string>
#include <vector>
#include "sqldatetime.h"
class CSqlVariant
{
public:
enum Type
{
Invalid = 0,
Bool,
Char,
UChar,
Short,
UShort,
Int,
UInt,
LongLong,
ULongLong,
Float,
Double,
Date,
Time,
DateTime,
String,
ByteArray
};
public:
CSqlVariant();
CSqlVariant(Type type);
CSqlVariant(char v);
CSqlVariant(bool v);
CSqlVariant(int v);
CSqlVariant(unsigned int v);
CSqlVariant(long long v);
CSqlVariant(unsigned long long v);
CSqlVariant(float v);
CSqlVariant(double v);
CSqlVariant(short v);
CSqlVariant(unsigned short v);
CSqlVariant(unsigned char v);
CSqlVariant(const CSqlDate &v);
CSqlVariant(const CSqlTime &v);
CSqlVariant(const CSqlDateTime &v);
CSqlVariant(const char *v);
CSqlVariant(const char* v,unsigned int len,bool bIsByteArray);
CSqlVariant(const std::string &v ,bool bIsByteArray= false);
CSqlVariant(const CSqlVariant &O);
CSqlVariant &operator=(const CSqlVariant &o);
~CSqlVariant();
bool operator==(const CSqlVariant &o) const;
bool operator!=(const CSqlVariant &o) const;
template<typename T> T ToValue() const { T v; ToValue(v); return v; }
int ToValue(int &v)const;
unsigned int ToValue(unsigned int &v) const;
long long ToValue(long long &v) const;
unsigned long long ToValue(unsigned long long &v) const;
bool ToValue(bool &v)const;
float ToValue(float &v) const;
double ToValue(double &v)const;
std::string & ToValue(std::string &v) const;
char ToValue(char &v) const;
unsigned char ToValue(unsigned char &v) const;
short ToValue(short &v)const;
unsigned short ToValue(unsigned short &v) const;
CSqlDate & ToValue(CSqlDate &v)const;
CSqlTime & ToValue(CSqlTime &v)const;
CSqlDateTime & ToValue(CSqlDateTime &v)const;
const void *GetData()const;
unsigned int GetDataLen()const;
void* GetBuffer();
int GetBufferLen()const;
void SetDataLen(int nlen);
void SetBufferLen(int nlen);
void ReleaseBuffer();
void SetType(Type type);
Type GetType()const;
const char*GetTypeName()const;
bool CanConvertTo(Type t)const;
bool IsNull()const;
void SetNull(bool bNull);
private:
void CopyFrom(const CSqlVariant &o);
void InitBuffer(unsigned int len);
void InitData(const char*v,unsigned int len);
void FreeBuffer();
union
{
bool b;
char c;
unsigned char uc;
short s;
unsigned short us;
int i;
unsigned int ui; //also store the time,date
long long ll;
unsigned long long ull; //also store the datetime
float f;
double d;
int *p; //format :[ref_count][buf_len][data_len][data][....] ,<2C><><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD>ݿ<EFBFBD><DDBF>Թ<EFBFBD><D4B9><EFBFBD>ʹ<EFBFBD>á<EFBFBD><C3A1>̲߳<DFB3><CCB2><EFBFBD>ȫ
// p[0] p[1] p[2] [p3]
} m_data;
Type m_type;
unsigned int m_is_null;
};
#define VARINTARR std::vector<CSqlVariant>