FreeTDS API
Loading...
Searching...
No Matches
Macros | Functions | Variables
Conversion

Conversions between datatypes. More...

Collaboration diagram for Conversion:

Macros

#define CASE_ALL_BINARY
 
#define CASE_ALL_CHAR    SYBCHAR: case SYBVARCHAR: case SYBTEXT: case XSYBCHAR: case XSYBVARCHAR
 
#define is_monthname(s)   (store_monthname(s, NULL) >= 0)
 

Functions

static TDS_INT binary_to_result (int desttype, const void *data, size_t len, CONV_RESULT *cr)
 Copy binary data to to result and return len or TDS_CONVERT_NOMEM.
 
static bool is_alphabetic (const char *)
 
static bool is_ampm (const char *)
 
static bool is_dd_mon_yyyy (char *t)
 
static bool is_numeric (const char *)
 
static bool is_numeric_dateformat (const char *)
 
static bool is_timeformat (const char *)
 
static TDS_INT parse_int8 (const char *buf, const char *pend, TDS_UINT8 *res, bool *p_negative)
 convert a number in string to TDS_INT8
 
static const char * parse_numeric (const char *buf, const char *pend, bool *p_negative, size_t *p_digits, size_t *p_decimals)
 Parse a string for numbers.
 
static int store_dd_mon_yyy_date (char *datestr, struct tds_time *t)
 
static int store_hour (const char *, const char *, struct tds_time *)
 
static int store_mday (const char *, struct tds_time *)
 
static int store_monthname (const char *datestr, struct tds_time *t)
 Test if a string is a month name and store correct month number.
 
static int store_numeric_date (const char *, struct tds_time *)
 
static int store_time (const char *, struct tds_time *)
 
static int store_year (int, struct tds_time *)
 
static int store_yymmdd_date (const char *, struct tds_time *)
 
static int string_to_datetime (const char *datestr, TDS_UINT len, int desttype, CONV_RESULT *cr)
 
static TDS_INT string_to_float (const TDS_CHAR *src, TDS_UINT srclen, int desttype, CONV_RESULT *cr)
 
static TDS_INT string_to_int (const char *buf, const char *pend, TDS_INT *res)
 convert a number in string to TDS_INT
 
static TDS_INT string_to_int8 (const char *buf, const char *pend, TDS_INT8 *res)
 convert a number in string to TDS_INT8
 
static int string_to_numeric (const char *instr, const char *pend, CONV_RESULT *cr)
 convert a number in string to a TDSNUMERIC
 
static TDS_INT string_to_result (int desttype, const char *s, CONV_RESULT *cr)
 Copy a terminated string to result and return len or TDS_CONVERT_NOMEM.
 
static TDS_INT string_to_uint8 (const char *buf, const char *pend, TDS_UINT8 *res)
 convert a number in string to TDS_UINT8
 
static int stringz_to_numeric (const char *instr, CONV_RESULT *cr)
 convert a zero terminated string to NUMERIC
 
TDS_INT tds_char2hex (TDS_CHAR *dest, TDS_UINT destlen, const TDS_CHAR *src, TDS_UINT srclen)
 
TDS_INT tds_convert (const TDSCONTEXT *tds_ctx, int srctype, const void *src, TDS_UINT srclen, int desttype, CONV_RESULT *cr)
 tds_convert convert a type to another.
 
static TDS_INT tds_convert_bigdatetime (const TDSCONTEXT *tds_ctx, const TDS_BIGDATETIME *bigdatetime, int desttype, CONV_RESULT *cr)
 
static TDS_INT tds_convert_bigtime (const TDSCONTEXT *tds_ctx, const TDS_BIGTIME *bigtime, int desttype, CONV_RESULT *cr)
 
static TDS_INT tds_convert_binary (const TDS_UCHAR *src, TDS_INT srclen, int desttype, CONV_RESULT *cr)
 
static TDS_INT tds_convert_bit (const TDS_CHAR *src, int desttype, CONV_RESULT *cr)
 
static TDS_INT tds_convert_char (const TDS_CHAR *src, TDS_UINT srclen, int desttype, CONV_RESULT *cr)
 
static TDS_INT tds_convert_date (const TDSCONTEXT *tds_ctx, const TDS_DATE *date, int desttype, CONV_RESULT *cr)
 
static TDS_INT tds_convert_datetime (const TDSCONTEXT *tds_ctx, const TDS_DATETIME *dt, int desttype, unsigned precision, CONV_RESULT *cr)
 
static TDS_INT tds_convert_datetime4 (const TDSCONTEXT *tds_ctx, const TDS_DATETIME4 *dt4, int desttype, CONV_RESULT *cr)
 
static TDS_INT tds_convert_datetimeall (const TDSCONTEXT *tds_ctx, int srctype, const TDS_DATETIMEALL *dta, int desttype, CONV_RESULT *cr)
 
static TDS_INT tds_convert_flt8 (const TDS_FLOAT *src, int desttype, CONV_RESULT *cr)
 
static TDS_INT tds_convert_int (TDS_INT num, int desttype, CONV_RESULT *cr)
 
static TDS_INT tds_convert_int1 (const TDS_TINYINT *src, int desttype, CONV_RESULT *cr)
 
static TDS_INT tds_convert_int2 (const TDS_SMALLINT *src, int desttype, CONV_RESULT *cr)
 
static TDS_INT tds_convert_int4 (const TDS_INT *src, int desttype, CONV_RESULT *cr)
 
static TDS_INT tds_convert_int8 (const TDS_INT8 *src, int desttype, CONV_RESULT *cr)
 
static TDS_INT tds_convert_int8_numeric (unsigned char scale, unsigned char sign, TDS_UINT8 num, CONV_RESULT *cr)
 
static TDS_INT tds_convert_int_numeric (unsigned char scale, unsigned char sign, TDS_UINT num, CONV_RESULT *cr)
 
static TDS_INT tds_convert_money (const TDSCONTEXT *tds_ctx, const TDS_MONEY *src, int desttype, CONV_RESULT *cr)
 
static TDS_INT tds_convert_money4 (const TDSCONTEXT *tds_ctx, const TDS_MONEY4 *src, int desttype, CONV_RESULT *cr)
 
static TDS_INT tds_convert_numeric (const TDS_NUMERIC *src, int desttype, CONV_RESULT *cr)
 
static TDS_INT tds_convert_real (const TDS_REAL *src, int desttype, CONV_RESULT *cr)
 
static TDS_INT tds_convert_time (const TDSCONTEXT *tds_ctx, const TDS_TIME *time, int desttype, CONV_RESULT *cr)
 
static TDS_INT tds_convert_to_binary (int srctype, const TDS_CHAR *src, TDS_UINT srclen, int desttype, CONV_RESULT *cr)
 
static TDS_INT tds_convert_uint2 (const TDS_USMALLINT *src, int desttype, CONV_RESULT *cr)
 
static TDS_INT tds_convert_uint4 (const TDS_UINT *src, int desttype, CONV_RESULT *cr)
 
static TDS_INT tds_convert_uint8 (const TDS_UINT8 *src, int desttype, CONV_RESULT *cr)
 
static TDS_INT tds_convert_unique (const TDS_CHAR *src, int desttype, CONV_RESULT *cr)
 
TDSRET tds_datecrack (TDS_INT datetype, const void *di, TDSDATEREC *dr)
 Convert from db date format to a structured date format.
 
TDS_SERVER_TYPE tds_get_null_type (TDS_SERVER_TYPE srctype)
 Get same type but nullable.
 
size_t tds_strftime (char *buf, size_t maxsize, const char *format, const TDSDATEREC *dr, int prec)
 format a date string according to an "extended" strftime(3) formatting definition.
 
unsigned char tds_willconvert (int srctype, int desttype)
 Test if a conversion is possible.
 
static void two_digit (char *out, int num)
 

Variables

const char tds_hex_digits [] = "0123456789abcdef"
 

Detailed Description

Conversions between datatypes.

Supports, for example, dbconvert().

Macro Definition Documentation

◆ CASE_ALL_BINARY

#define CASE_ALL_BINARY
Value:
SYBBINARY: case SYBVARBINARY: case SYBIMAGE: case XSYBBINARY: case XSYBVARBINARY: \
case SYBLONGBINARY: case TDS_CONVERT_BINARY

Function Documentation

◆ parse_int8()

static TDS_INT parse_int8 ( const char *  buf,
const char *  pend,
TDS_UINT8 *  res,
bool *  p_negative 
)
static

convert a number in string to TDS_INT8

Returns
TDS_CONVERT_* or failure code on error
Here is the call graph for this function:
Here is the caller graph for this function:

◆ parse_numeric()

static const char * parse_numeric ( const char *  buf,
const char *  pend,
bool *  p_negative,
size_t *  p_digits,
size_t *  p_decimals 
)
static

Parse a string for numbers.

Syntax can be something like " *[+-] *[0-9]*\.[0-9]* *".

The function ignore all spaces. It strips leading zeroes which could possibly lead to overflow. The function returns a pointer to the integer part followed by *p_digits digits followed by a dot followed by *p_decimals digits (dot and fractional digits are optional, in this case *p_decimals is 0).

Parameters
bufstart of string
pendpointer to string end
p_negativestore if number is negative
p_digitsstore number of integer digits
p_decimalsstore number of fractional digits
Returns
pointer to first not zero digit. If NULL this indicate a syntax error.
Here is the caller graph for this function:

◆ store_monthname()

static int store_monthname ( const char *  datestr,
struct tds_time t 
)
static

Test if a string is a month name and store correct month number.

Returns
month number (0-11) or -1 if not match
Parameters
datestrstring to check
twhere to store month (if NULL no store is done)

◆ string_to_int()

static TDS_INT string_to_int ( const char *  buf,
const char *  pend,
TDS_INT *  res 
)
static

convert a number in string to TDS_INT

Returns
TDS_CONVERT_* or failure code on error
Remarks
Sybase's char->int conversion tolerates embedded blanks, such that "convert( int, ' - 13 ' )" works.
If we find blanks, we copy the string to a temporary buffer, skipping the blanks.
We return the results of atoi() with a clean string.

n.b. it is possible to embed all sorts of non-printable characters, but we only check for spaces. at this time, no one on the project has tested anything else.

Here is the call graph for this function:

◆ string_to_int8()

static TDS_INT string_to_int8 ( const char *  buf,
const char *  pend,
TDS_INT8 *  res 
)
static

convert a number in string to TDS_INT8

Returns
TDS_CONVERT_* or failure code on error
Here is the call graph for this function:

◆ string_to_numeric()

static int string_to_numeric ( const char *  instr,
const char *  pend,
CONV_RESULT cr 
)
static

convert a number in string to a TDSNUMERIC

Returns
sizeof(TDS_NUMERIC) on success, TDS_CONVERT_* failure code on failure
Here is the call graph for this function:
Here is the caller graph for this function:

◆ string_to_uint8()

static TDS_INT string_to_uint8 ( const char *  buf,
const char *  pend,
TDS_UINT8 *  res 
)
static

convert a number in string to TDS_UINT8

Returns
TDS_CONVERT_* or failure code on error
Here is the call graph for this function:

◆ stringz_to_numeric()

static int stringz_to_numeric ( const char *  instr,
CONV_RESULT cr 
)
static

convert a zero terminated string to NUMERIC

Returns
sizeof(TDS_NUMERIC) on success, TDS_CONVERT_* failure code on failure
Here is the call graph for this function:

◆ tds_convert()

TDS_INT tds_convert ( const TDSCONTEXT tds_ctx,
int  srctype,
const void *  src,
TDS_UINT  srclen,
int  desttype,
CONV_RESULT cr 
)

tds_convert convert a type to another.

If you convert to SYBDECIMAL/SYBNUMERIC you MUST initialize precision and scale of cr. Do not expect strings to be zero terminated. Databases support zero inside string. Using strlen may result on data loss or even a segmentation fault. Instead, use memcpy to copy destination using length returned. This function does not handle NULL, srclen should be >0. Client libraries handle NULLs each in their own way.

Parameters
tds_ctxcontext (used in conversion to data and to return messages)
srctypetype of source
srcpointer to source data to convert
srclenlength in bytes of source (not counting terminator or strings)
desttypetype of destination
crstructure to hold result
Returns
length of result or TDS_CONVERT_* failure code on failure. All TDS_CONVERT_* constants are <0.
Here is the caller graph for this function:

◆ tds_datecrack()

TDSRET tds_datecrack ( TDS_INT  datetype,
const void *  di,
TDSDATEREC dr 
)

Convert from db date format to a structured date format.

Parameters
datetypesource date type. SYBDATETIME or SYBDATETIME4
disource date
drdestination date
Returns
TDS_FAIL or TDS_SUCCESS
Here is the caller graph for this function:

◆ tds_get_null_type()

TDS_SERVER_TYPE tds_get_null_type ( TDS_SERVER_TYPE  srctype)

Get same type but nullable.

Parameters
srctypetype requires
Returns
nullable type

◆ tds_strftime()

size_t tds_strftime ( char *  buf,
size_t  maxsize,
const char *  format,
const TDSDATEREC dr,
int  prec 
)

format a date string according to an "extended" strftime(3) formatting definition.

Parameters
bufoutput buffer
maxsizesize of buffer in bytes (space include terminator)
formatformat string passed to strftime(3), except that z represents fraction of seconds.
drdate to convert
precsecond fraction precision (0-7).
Returns
length of string returned, 0 for error
Here is the caller graph for this function:

◆ tds_willconvert()

unsigned char tds_willconvert ( int  srctype,
int  desttype 
)

Test if a conversion is possible.

Parameters
srctypesource type
desttypedestination type
Returns
0 if not convertible
Here is the caller graph for this function: