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++

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

#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>