46 #define NCBI_USE_ERRCODE_X Dbapi_DrvrTypes
55 #ifdef WORDS_BIGENDIAN
57 *it = (*it << 8) | (*it >> 8);
81 m_AvailableValueType(0),
92 m_AvailableValueType(
str.m_AvailableValueType),
93 m_StringEncoding(
str.m_StringEncoding),
98 m_String(
str.m_String),
100 m_WString(
str.m_WString),
102 m_UTF8String(
str.m_UTF8String)
115 string::size_type
size,
117 m_AvailableValueType(eChar),
118 m_StringEncoding(enc),
124 if (
size == string::npos) {
138 wstring::size_type
size) :
139 m_AvailableValueType(eWChar),
144 if (
size == wstring::npos) {
159 m_StringEncoding(enc),
173 m_AvailableValueType(eWString),
210 CWString::operator
char*(void)
const
212 return const_cast<char*
>(AsCString());
215 CWString::operator
const char*(void)
const
220 CWString::operator
wchar_t*(void)
const
222 return const_cast<wchar_t*
>(AsCWString());
225 CWString::operator
const wchar_t*(void)
const
433 string::size_type
size,
443 if (
size == string::npos) {
461 wstring::size_type
size)
468 if (
size == wstring::npos) {
519 if (cur_len > max_len) {
521 " was truncated to " << max_len <<
" character(s)");
529 if (cur_len > max_len) {
531 " was truncated to " << max_len <<
" byte(s)");
589 case eDB_Int :
return "DB_Int";
604 case eDB_Bit :
return "DB_Bit";
613 if (throw_on_unknown) {
630 unsigned int max_length = TDbapi_MaxLoggedParamLength::GetDefault();
640 }
catch (exception& e) {
647 if (
result.length() > max_length) {
648 result.resize(max_length);
649 if (max_length > 3) {
651 result[max_length - 3] =
'.';
788 string(
"wrong type of CDB_Object: ")
844 template <
typename TChar>
848 while (
len < maxlen && *
str != 0) {
863 if (
size != string::npos) {
877 if (
size != TStringUCS2::npos) {
886 template <
typename TChar>
889 typename basic_string<TChar>::size_type
size,
892 typedef basic_string<TChar> TStr;
898 if (
size == TStr::npos)
902 str.assign(s, str_size);
918 :
CDB_Object(other), m_WString(other.m_WString),
919 m_BulkInsertionEnc(other.m_BulkInsertionEnc)
935 string::size_type
size,
944 string::size_type
size,
975 if (
this != &other) {
1004 CDB_String::operator
const char*(void)
const
1006 return m_WString.Empty() ?
kEmptyCStr : m_WString->AsCString();
1028 string::size_type
size,
1049 string::size_type
size,
1076 TStringUCS2::size_type
size)
1116 template <
typename TChar>
1118 typename basic_string<TChar>::size_type
1120 typename basic_string<TChar>::size_type
len)
1122 typedef basic_string<TChar> TStr;
1124 if (
len == TStr::npos) {
1192 Assign(s, string::npos, enc);
1201 Assign(s, string::npos, enc);
1218 Assign(s, TStringUCS2::npos);
1255 string(
"wrong type of CDB_Object: ")
1269 : m_Size((s < 1) ? 1 : s)
1330 size_t len = strlen(s);
1384 string(
"wrong type of CDB_Object: ")
1401 if (
len == string::npos) {
1422 : m_Size((s < 1) ? 1 : s)
1484 size_t len = strlen(s);
1542 string(
"wrong type of CDB_Object: ")
1568 if (v.
m_Value.NotEmpty() && !share_data) {
1588 m_Value->GetData().assign(
static_cast<const char*
>(v), l);
1629 string(
"wrong type of CDB_Object: ")
1643 m_Size = (s < 1) ? 1 : s;
1649 m_Size = (s == 0) ? 1 : s;
1655 :
CDB_Object(v), m_Size(v.m_Size), m_Value(v.m_Value)
1657 if (v.
m_Value.NotEmpty() && !share_data) {
1671 m_Value->GetData().assign(
static_cast<const char*
>(v),
1715 string(
"wrong type of CDB_Object: ")
1734 : m_Size((s < 1) ? 1 : s)
1750 , m_DataSize(v.m_DataSize)
1751 , m_Value(v.m_Value)
1753 if (v.
m_Value.NotEmpty() && !share_data) {
1950 :
CDB_Object(s), m_Encoding(s.m_Encoding), m_Store(s.m_Store)
1969 size_t pos = s->
Tell();
1971 for (
size_t n = s->
Read((
void*) buff,
sizeof(buff));
1973 n = s->
Read((
void*) buff,
sizeof(buff))) {
2011 == (long) byte_number;
2049 ERR_POST_X(8,
string(
"Creating a mixed-encoding C")
2063 (buff, nof_bytes ? nof_bytes : strlen((
const char*) buff));
2087 #ifdef WORDS_BIGENDIAN
2088 if (l == TStringUCS2::npos) {
2548 : m_Time(
mode), m_SQLType(sql_type), m_Offset(
offset)
2556 : m_Time(
t), m_SQLType(sql_type), m_Offset(
offset)
2579 case eDate:
return "DATE";
2580 case eTime:
return "TIME";
2586 case eDate:
return "BIGDATE";
2587 case eTime:
return "BIGTIME";
2613 pair<ESyntax, ESQLType>
id =
Identify(s);
2630 case eDate: s =
"Y-M-D" ;
break;
2631 case eTime: s =
"h:m:G" ;
break;
2632 case eDateTime: s =
"Y-M-DTh:m:G" ;
break;
2638 case eDate: s =
"Y-M-D" ;
break;
2639 case eTime: s =
"h:m:G" ;
break;
2640 case eDateTime: s =
"Y-M-D h:m:G" ;
break;
2646 case eDate: s =
"b D Y" ;
break;
2647 case eTime: s =
"H:m:s.rP" ;
break;
2648 case eDateTime: s =
"b D Y H:m:s.rP" ;
break;
2655 auto o =
offset.GetValue();
2657 offset_str[0] =
'-';
2660 offset_str[0] =
'+';
2662 offset_str[1] =
'0' + o / 600;
2663 offset_str[2] =
'0' + ((o / 60) % 10);
2664 offset_str[3] =
':';
2665 offset_str[4] =
'0' + ((o / 10) % 10);
2666 offset_str[5] =
'0' + (o % 10);
2669 s2.replace(s2.size() - 1, 1, offset_str, 6);
2675 pair<CDB_BigDateTime::ESyntax, CDB_BigDateTime::ESQLType>
2681 if (s.
size() >= 8) {
2682 if (s[s.
size() - 1] ==
'M' ||
isalpha((
unsigned char) s[0])) {
2684 if (s.find(
" ") ==
NPOS) {
2692 if (s[pos] ==
' ') {
2695 char c = s[s.size() - 6];
2696 if (c ==
'+' || c ==
'-') {
2703 return make_pair(syntax, sql_type);
2796 const unsigned char*
arr) :
2808 const unsigned char*
arr) :
2813 m_Body[0]= is_negative? 1 : 0;
2841 const unsigned char*
arr)
2854 const unsigned char*
arr)
2859 m_Body[0] = is_negative? 1 : 0;
2894 2, 2, 3, 3, 4, 4, 4, 5, 5, 6, 6, 6, 7, 7, 8, 8, 9, 9, 9,
2895 10, 10, 11, 11, 11, 12, 12, 13, 13, 14, 14, 14, 15, 15,
2896 16, 16, 16, 17, 17, 18, 18, 19, 19, 19, 20, 20, 21, 21, 21,
2897 22, 22, 23, 23, 24, 24, 24, 25, 25, 26, 26, 26
2907 if (product[j] > 9) {
2908 product[j + 1] += product[j] / 10;
2916 const unsigned char* multiplier)
2920 number[1] = (num / 10) % 10;
2921 number[2] = (num / 100) % 10;
2924 for (top =
kMaxPrecision - 1; top >= 0 && !multiplier[top]; top--)
2928 for (
int i = 0;
i <= top;
i++) {
2929 for (
int j =0; j < 3; j++) {
2930 product[j + start] += multiplier[
i] *
number[j];
2953 for (
int i = top;
i >= 0;
i--) {
2954 if (top + 1 - j == scale)
2984 for (
int pos = num_bytes - 1; pos > 0; pos--) {
3001 char*
const initial = product;
3003 while (*
value < base) {
3004 res = res % 256 * base + (
int)*
value;
3006 while (product == initial && *
value < base && res < 256) {
3010 *product = (char) (res / 256);
3026 scale = (dot_pos ==
NPOS) ? 0 :
precision - (
unsigned int) dot_pos;
3039 +
") cannot be more than precision ("
3043 bool is_negative=
false;
3057 if (*
val >=
'0' && *
val <=
'9') {
3058 buff1[
n++] = *
val -
'0';
3059 }
else if (*
val ==
'.') {
3070 "string cannot be converted because of overflow: " +
string(s),
3073 unsigned int dec = 0;
3076 while (
val != s.
end() && dec < scale) {
3077 if (*
val >=
'0' && *
val <=
'9') {
3078 buff1[
n++] = *
val -
'0';
3081 (
"string cannot be converted: " +
string(s), 102);
3088 while (dec++ < scale) {
3107 for (
int i = 0; *p[
i] || p[
i][1] != 10;
i = 1 -
i) {
Convenience extension of basic_string, supporting implicit conversion to const TChar* in most situati...
size_t Read(void *buff, size_t nof_bytes)
size_t GetDataSize() const
size_t Peek(void *buff, size_t nof_bytes) const
size_t Truncate(size_t nof_bytes=kMax_BlobSize)
long Seek(long offset, EWhence whence)
size_t PeekAt(void *buff, size_t start, size_t n) const
size_t Append(const void *buff, size_t nof_bytes)
CTempString implements a light-weight string on top of a storage buffer whose lifetime management is ...
const value_slice::CValueConvert< value_slice::SRunTimeSqlCP, FROM > ConvertSQL(const FROM &value)
static vector< string > arr
static DLIST_TYPE *DLIST_NAME() first(DLIST_LIST_TYPE *list)
#define NON_CONST_ITERATE(Type, Var, Cont)
Non constant version of ITERATE macro.
element_type * get(void) const
Get pointer.
#define DATABASE_DRIVER_ERROR(message, err_code)
#define CHECK_DRIVER_ERROR(failed, message, err_code)
virtual CDB_Object * ShallowClone() const
virtual void AssignValue(const CDB_Object &v)
CDB_BigDateTime(CTime::EInitMode mode=CTime::eEmpty, ESQLType sql_type=eDateTime, TOffset offset=null)
virtual void AssignValue(const CDB_Object &v)
static bool IsBlobType(EDB_Type db_type)
CObjectFor< string > TValue
virtual void AssignValue(const CDB_Object &v)
virtual EDB_Type GetType(void) const
virtual EDB_Type GetType() const
Uint2 GetMinutes(void) const
virtual CDB_Object * ShallowClone() const
size_t x_Append(const void *buff, size_t nof_bytes)
virtual CDB_Object * Clone(void) const
virtual void AssignValue(const CDB_Object &v)
virtual CDB_Object * Clone() const
virtual void AssignNULL()
virtual EDB_Type GetType() const
virtual void AssignValue(const CDB_Object &v)
void x_MakeUCS2LEString(EEncoding str_enc=eEncoding_Unknown) const
const char * GetSQLTypeName(ESyntax syntax)
virtual EDB_Type GetType() const
virtual EDB_Type GetType() const
virtual CDB_Object * Clone() const
CDB_Char & operator=(const CDB_Char &v)
virtual CDB_Object * Clone() const
CDB_VarCharMax & operator=(const string &s)
void x_MakeFromString(unsigned int precision, unsigned int scale, const CTempString &s)
CDB_DateTime & Assign(Int4 d, Int4 s300)
CDB_VarBinary & operator=(const CDB_VarBinary &v)
CDB_LongChar(size_t s=8191)
virtual void AssignValue(const CDB_Object &v)
CDB_Numeric & operator=(const char *val)
void SetValue(const char *str, size_t len, EEncoding enc=eEncoding_Unknown)
size_t GetSymbolNum(void) const
void SetValue(const void *v, size_t v_size)
TStringUCS2 m_UCS2LEString
virtual ~CDB_LongBinary()
virtual EDB_Type GetType() const
virtual EDB_Type GetType() const
void x_MakeUTF8String(EEncoding str_enc=eEncoding_Unknown) const
virtual CDB_Object * ShallowClone() const
virtual void AssignValue(const CDB_Object &v)
virtual size_t Append(const void *buff, size_t nof_bytes)
virtual EDB_Type GetType() const
void x_MakeWString(EEncoding str_enc=eEncoding_Unknown) const
virtual CDB_Object * ShallowClone() const
virtual EDB_Type GetType() const
virtual EDB_Type GetType() const
string GetLogString(void) const
CDB_LongBinary & operator=(const CDB_LongBinary &v)
virtual ~CDB_Double(void)
virtual CDB_Object * Clone() const
const char * AsCString(void) const
virtual void AssignValue(const CDB_Object &v)
virtual CDB_Object * ShallowClone() const
virtual CDB_Object * ShallowClone() const
virtual ~CDB_TinyInt(void)
CDB_Numeric & Assign(unsigned int precision, unsigned int scale, const unsigned char *arr)
virtual void AssignValue(const CDB_Object &v)
void SetValue(const char *str, size_t len, EEncoding enc=eEncoding_Unknown)
virtual EDB_Type GetType() const
static CDB_Object * Create(EDB_Type type, size_t size=1)
virtual CDB_Object * ShallowClone() const
unsigned max_logged_param_length
virtual void AssignValue(const CDB_Object &v)
virtual EDB_Type GetType() const =0
void x_MakeString(EEncoding str_enc=eEncoding_Unknown) const
CDB_Object(bool is_null=true)
virtual size_t Append(const void *buff, size_t nof_bytes)
const TStringUCS2 & AsUCS2_LE(EEncoding str_enc=eEncoding_Unknown) const
virtual CDB_Object * Clone() const
virtual CDB_Object * Clone() const
virtual EDB_Type GetType() const
CDB_SmallDateTime & operator=(const CTime &t)
virtual CDB_Object * Clone(void) const
void x_SetEncoding(EBulkEnc e)
CDB_Stream & Assign(const CDB_Stream &v)
CWString & operator=(const CWString &str)
const CTime & Value(void) const
virtual CDB_Object * Clone() const
virtual ~CDB_VarBinary(void)
virtual size_t Peek(void *buff, size_t nof_bytes) const
virtual CDB_Object * Clone() const
void SetValue(const void *v, size_t v_size)
void x_CalculateEncoding(EEncoding str_enc) const
const wchar_t * AsUnicode(EEncoding enc) const
virtual void AssignValue(const CDB_Object &v)
virtual CDB_Object * ShallowClone() const
const wstring & AsUnicode(EEncoding str_enc=eEncoding_Unknown) const
CObjectFor< string > TValue
virtual EDB_Type GetType() const
virtual ~CDB_BigInt(void)
virtual void Truncate(size_t nof_bytes=kMax_Int)
virtual bool MoveTo(size_t byte_number)
Uint2 GetDays(void) const
virtual EDB_Type GetType(void) const
CDB_LongBinary(size_t s=8191)
void x_StringToUTF8(EEncoding str_enc=eEncoding_Unknown) const
virtual EDB_Type GetType() const
CDB_LongChar & operator=(const CDB_LongChar &v)
virtual EDB_Type GetType() const
virtual size_t Append(const void *buff, size_t nof_bytes)
CObjectFor< string > TValue
CDB_Bit & operator=(const int &i)
CDB_SmallDateTime(CTime::EInitMode mode=CTime::eEmpty)
virtual EDB_Type GetType() const
virtual CDB_Object * Clone() const
void SetNULL(bool flag=true)
EBulkEnc m_BulkInsertionEnc
virtual EDB_Type GetType() const
CDB_DateTime & operator=(const CTime &t)
static CTimeFormat GetTimeFormat(ESyntax syntax, ESQLType sql_type=eDateTime, TOffset offset=null)
CDB_Text & operator=(const CDB_Text &text)
virtual ~CDB_VarCharMax(void)
CDB_BigDateTime & Assign(const CTime &t, ESQLType sql_type=eDateTime, TOffset offset=null)
virtual EDB_Type GetType(void) const
CDB_Image & operator=(const CDB_Image &image)
virtual size_t Read(void *buff, size_t nof_bytes)
void SetEncoding(EBulkEnc e)
EEncoding m_StringEncoding
virtual ~CDB_VarBinaryMax(void)
virtual CDB_Object * Clone() const
virtual CDB_Object * Clone() const
CDB_Float & operator=(const float &i)
virtual void AssignValue(const CDB_Object &v)
virtual CDB_Object * ShallowClone() const
virtual ~CDB_DateTime(void)
static const char * GetTypeName(EDB_Type db_type, bool throw_on_unknown=true)
void SetValue(const void *v, size_t l)
virtual EDB_Type GetType() const
virtual CDB_Object * Clone() const
Int4 Get300Secs(void) const
static pair< ESyntax, ESQLType > Identify(const CTempString &s)
virtual void AssignValue(const CDB_Object &v)
CDB_VarBinaryMax & operator=(const CDB_VarBinaryMax &v)
virtual void AssignNULL()
virtual CDB_Object * Clone() const
virtual void AssignValue(const CDB_Object &v)
const char * Data(void) const
CDB_VarCharMax & SetValue(const string &s, EEncoding enc=eEncoding_Unknown)
const CTime & Value(void) const
CDB_Binary & operator=(const CDB_Binary &v)
void Assign(const CDB_String &other)
CDB_String & operator=(const CDB_String &other)
virtual ~CDB_Numeric(void)
virtual size_t PeekAt(void *buff, size_t start, size_t nof_bytes) const
virtual ~CDB_SmallInt(void)
virtual void AssignValue(const CDB_Object &v)
void GetBulkInsertionData(CTempString *ts, bool convert_raw_bytes=false) const
virtual void AssignValue(const CDB_Object &v)
CDB_SmallDateTime & Assign(Uint2 days, Uint2 minutes)
void Assign(const char *str, string::size_type size=string::npos, EEncoding enc=eEncoding_Unknown)
virtual CDB_Object * Clone() const
virtual void AssignValue(const CDB_Object &v)
virtual CDB_Object * Clone() const
const string & x_GetWString() const
virtual CDB_Object * Clone() const
virtual ~CDB_String(void)
CDB_VarChar & SetValue(const string &s, EEncoding enc=eEncoding_Unknown)
virtual size_t Size() const
virtual void AssignValue(const CDB_Object &v)
virtual ~CDB_SmallDateTime(void)
CRef< CWString > m_WString
virtual CDB_Object * ShallowClone() const
void x_UTF8ToString(EEncoding str_enc=eEncoding_Unknown) const
CDB_DateTime(CTime::EInitMode mode=CTime::eEmpty)
virtual CDB_Object * Clone(void) const
CDB_Double & operator=(const double &i)
virtual ~CDB_VarChar(void)
virtual CDB_Object * Clone() const
void SetEncoding(EBulkEnc e)
virtual EDB_Type GetType() const
virtual CDB_Object * Clone() const
@ eDateTimeOffset
DATETIMEOFFSET (MS); no Sybase equivalent.
@ eDateTime
DATETIME2 (MS), BIGDATETIME (Sybase)
@ eTime
TIME (MS), (BIG)TIME (Sybase)
#define NCBI_CURRENT_FUNCTION
Get current function name.
#define ERR_POST_X(err_subcode, message)
Error posting with default error code and given error subcode.
#define ERR_POST(message)
Error posting with file, line number information but without error codes.
#define NCBI_CATCH_ALL_X(err_subcode, message)
void Warning(CExceptionArgs_Base &args)
void AddReference(void) const
Add reference to object.
void Reset(void)
Reset reference object.
bool NotEmpty(void) const THROWS_NONE
Check if CRef is not empty – pointing to an object and has a non-null value.
void RemoveReference(void) const
Remove reference to object.
bool Empty(void) const THROWS_NONE
Check if CRef is empty – not pointing to any object, which means having a null value.
uint8_t Uint1
1-byte (8-bit) unsigned integer
int16_t Int2
2-byte (16-bit) signed integer
int32_t Int4
4-byte (32-bit) signed integer
uint16_t Uint2
2-byte (16-bit) unsigned integer
int64_t Int8
8-byte (64-bit) signed integer
#define END_NCBI_SCOPE
End previously defined NCBI scope.
#define BEGIN_NCBI_SCOPE
Define ncbi namespace.
NCBI_NS_STD::string::size_type SIZE_TYPE
const_iterator end() const
Return an iterator to the string's ending position (one past the end of the represented sequence)
static string PrintableString(const CTempString str, TPrintableMode mode=fNewLine_Quote|fNonAscii_Passthru)
Get a printable version of the specified string.
static string AsSingleByteString(const CTempString &src, EEncoding encoding, const char *substitute_on_error=0, EValidate validate=eNoValidate)
Convert UTF8 string into a single-byte character representation.
static bool EndsWith(const CTempString str, const CTempString end, ECase use_case=eCase)
Check if a string ends with a specified suffix value.
static SIZE_TYPE GetSymbolCount(const CTempString &src)
Get the number of symbols (code points) in UTF8 string.
CTempString & assign(const char *src_str, size_type len)
Assign new values to the content of the a string.
static string IntToString(int value, TNumToStringFlags flags=0, int base=10)
Convert int to string.
const char * const_iterator
const char * data(void) const
Return a pointer to the array represented.
bool empty(void) const
Return true if the represented string is empty (i.e., the length is zero)
Uint2 TCharUCS2
Type for character in UCS-2 encoding.
static CStringUTF8 AsUTF8(const CTempString &src, EEncoding encoding, EValidate validate=eNoValidate)
Convert into UTF8 from a C/C++ string.
basic_string< TCharUCS2 > TStringUCS2
Type for string in UCS-2 encoding.
void clear(void)
Clears the string.
static enable_if< is_arithmetic< TNumeric >::value||is_convertible< TNumeric, Int8 >::value, string >::type NumericToString(TNumeric value, TNumToStringFlags flags=0, int base=10)
Convert numeric value to string.
size_type find(const CTempString match, size_type pos=0) const
Find the first instance of the entire matching string within the current string, beginning at an opti...
const char *const kEmptyCStr
Empty "C" string (points to a '\0').
size_type size(void) const
Return the length of the represented array.
const_iterator begin() const
Return an iterator to the string's starting position.
@ eEncoding_ISO8859_1
Note: From the point of view of the C++.
@ fNonAscii_Quote
Octal for all non-ASCII characters.
@ fNewLine_Quote
Display "\n" instead of actual linebreak.
EInitMode
Which initial value to use for time.
Int4 days
days from 1/1/1900
CTime & SetTimeDBI(const TDBTimeI &t)
Set time using database format time, TDBTimeI.
CTime & SetTimeDBU(const TDBTimeU &t)
Set time using database format time, TDBTimeU.
TDBTimeI GetTimeDBI(void) const
Get time in database format time, TDBTimeI.
TDBTimeU GetTimeDBU(void) const
Get time in database format time, TDBTimeU.
Uint2 days
Days from 1/1/1900.
Uint2 time
Minutes from the beginning of current day.
Int4 time
x/300 seconds from the beginning of current day
@ eEmpty
Use "empty" time.
unsigned int
A callback function used to compare two keys in a database.
Definition of all error codes used in dbapi libraries (dbapi_driver.lib and others).
static void text(MDB_val *v)
const struct ncbi::grid::netcache::search::fields::SIZE size
Defines: CTimeFormat - storage class for time format.
static const char * str(char *buf, int n)
size_t my_strnlen(const TChar *str, size_t maxlen)
NCBI_PARAM_DEF(unsigned int, dbapi, max_logged_param_length, 255)
CRef< CWString > MakeString(const string &s, string::size_type size, EEncoding enc=eEncoding_Unknown)
static int s_Div256(const char *value, char *product, int base)
static void CheckStringTruncation(size_t cur_len, size_t max_len)
static const unsigned int kMaxPrecision
static basic_string< TChar >::size_type get_string_size_varchar(const TChar *str, typename basic_string< TChar >::size_type len)
static int s_NumericBytesPerPrec[]
static void CheckBinaryTruncation(size_t cur_len, size_t max_len)
static char * s_ArrayToString(const unsigned char *array, int scale, char *s)
void s_MakeLittleEndian(TStringUCS2 &s)
static string::size_type get_string_size_longchar(const char *str, string::size_type len)
static void s_MultiplyByte(unsigned char *product, int num, const unsigned char *multiplier)
static void s_DoCarry(unsigned char *product)