|
Packit Service |
17f749 |
/************************************************************************************
|
|
Packit Service |
17f749 |
Copyright (C) 2017 MariaDB Corporation AB
|
|
Packit Service |
17f749 |
|
|
Packit Service |
17f749 |
This library is free software; you can redistribute it and/or
|
|
Packit Service |
17f749 |
modify it under the terms of the GNU Library General Public
|
|
Packit Service |
17f749 |
License as published by the Free Software Foundation; either
|
|
Packit Service |
17f749 |
version 2.1 of the License, or (at your option) any later version.
|
|
Packit Service |
17f749 |
|
|
Packit Service |
17f749 |
This library is distributed in the hope that it will be useful,
|
|
Packit Service |
17f749 |
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
Packit Service |
17f749 |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
Packit Service |
17f749 |
Library General Public License for more details.
|
|
Packit Service |
17f749 |
|
|
Packit Service |
17f749 |
You should have received a copy of the GNU Library General Public
|
|
Packit Service |
17f749 |
License along with this library; if not see <http://www.gnu.org/licenses>
|
|
Packit Service |
17f749 |
or write to the Free Software Foundation, Inc.,
|
|
Packit Service |
17f749 |
51 Franklin St., Fifth Floor, Boston, MA 02110, USA
|
|
Packit Service |
17f749 |
*************************************************************************************/
|
|
Packit Service |
17f749 |
|
|
Packit Service |
17f749 |
/* ODBC C->SQL and SQL->C type conversion functions */
|
|
Packit Service |
17f749 |
|
|
Packit Service |
17f749 |
#include <ma_odbc.h>
|
|
Packit Service |
17f749 |
|
|
Packit Service |
17f749 |
/* Borrowed from C/C and adapted */
|
|
Packit Service |
17f749 |
SQLRETURN MADB_Str2Ts(const char *Str, size_t Length, MYSQL_TIME *Tm, BOOL Interval, MADB_Error *Error, BOOL *isTime)
|
|
Packit Service |
17f749 |
{
|
|
Packit Service |
17f749 |
char *localCopy= MADB_ALLOC(Length + 1), *Start= localCopy, *Frac, *End= Start + Length;
|
|
Packit Service |
17f749 |
my_bool isDate= 0;
|
|
Packit Service |
17f749 |
|
|
Packit Service |
17f749 |
if (Start == NULL)
|
|
Packit Service |
17f749 |
{
|
|
Packit Service |
17f749 |
return MADB_SetError(Error, MADB_ERR_HY001, NULL, 0);
|
|
Packit Service |
17f749 |
}
|
|
Packit Service |
17f749 |
|
|
Packit Service |
17f749 |
memset(Tm, 0, sizeof(MYSQL_TIME));
|
|
Packit Service |
17f749 |
memcpy(Start, Str, Length);
|
|
Packit Service |
17f749 |
Start[Length]= '\0';
|
|
Packit Service |
17f749 |
|
|
Packit Service |
17f749 |
while (Length && isspace(*Start)) ++Start, --Length;
|
|
Packit Service |
17f749 |
|
|
Packit Service |
17f749 |
if (Length == 0)
|
|
Packit Service |
17f749 |
{
|
|
Packit Service |
17f749 |
goto end;//MADB_SetError(Error, MADB_ERR_22008, NULL, 0);
|
|
Packit Service |
17f749 |
}
|
|
Packit Service |
17f749 |
|
|
Packit Service |
17f749 |
/* Determine time type:
|
|
Packit Service |
17f749 |
MYSQL_TIMESTAMP_DATE: [-]YY[YY].MM.DD
|
|
Packit Service |
17f749 |
MYSQL_TIMESTAMP_DATETIME: [-]YY[YY].MM.DD hh:mm:ss.mmmmmm
|
|
Packit Service |
17f749 |
MYSQL_TIMESTAMP_TIME: [-]hh:mm:ss.mmmmmm
|
|
Packit Service |
17f749 |
*/
|
|
Packit Service |
17f749 |
if (strchr(Start, '-'))
|
|
Packit Service |
17f749 |
{
|
|
Packit Service |
17f749 |
if (sscanf(Start, "%d-%u-%u", &Tm->year, &Tm->month, &Tm->day) < 3)
|
|
Packit Service |
17f749 |
{
|
|
Packit Service |
17f749 |
return MADB_SetError(Error, MADB_ERR_22008, NULL, 0);
|
|
Packit Service |
17f749 |
}
|
|
Packit Service |
17f749 |
isDate= 1;
|
|
Packit Service |
17f749 |
if (!(Start= strchr(Start, ' ')))
|
|
Packit Service |
17f749 |
{
|
|
Packit Service |
17f749 |
goto check;
|
|
Packit Service |
17f749 |
}
|
|
Packit Service |
17f749 |
}
|
|
Packit Service |
17f749 |
if (!strchr(Start, ':'))
|
|
Packit Service |
17f749 |
{
|
|
Packit Service |
17f749 |
goto check;
|
|
Packit Service |
17f749 |
}
|
|
Packit Service |
17f749 |
|
|
Packit Service |
17f749 |
if (isDate == 0)
|
|
Packit Service |
17f749 |
{
|
|
Packit Service |
17f749 |
*isTime= 1;
|
|
Packit Service |
17f749 |
}
|
|
Packit Service |
17f749 |
|
|
Packit Service |
17f749 |
if ((Frac= strchr(Start, '.')) != NULL) /* fractional seconds */
|
|
Packit Service |
17f749 |
{
|
|
Packit Service |
17f749 |
size_t FracMulIdx= End - (Frac + 1) - 1/*to get index array index */;
|
|
Packit Service |
17f749 |
/* ODBC - nano-seconds */
|
|
Packit Service |
17f749 |
if (sscanf(Start, "%d:%u:%u.%6lu", &Tm->hour, &Tm->minute,
|
|
Packit Service |
17f749 |
&Tm->second, &Tm->second_part) < 4)
|
|
Packit Service |
17f749 |
{
|
|
Packit Service |
17f749 |
return MADB_SetError(Error, MADB_ERR_22008, NULL, 0);
|
|
Packit Service |
17f749 |
}
|
|
Packit Service |
17f749 |
/* 9 digits up to nano-seconds, and -1 since comparing with arr idx */
|
|
Packit Service |
17f749 |
if (FracMulIdx < 6 - 1)
|
|
Packit Service |
17f749 |
{
|
|
Packit Service |
17f749 |
static unsigned long Mul[]= {100000, 10000, 1000, 100, 10};
|
|
Packit Service |
17f749 |
Tm->second_part*= Mul[FracMulIdx];
|
|
Packit Service |
17f749 |
}
|
|
Packit Service |
17f749 |
}
|
|
Packit Service |
17f749 |
else
|
|
Packit Service |
17f749 |
{
|
|
Packit Service |
17f749 |
if (sscanf(Start, "%d:%u:%u", &Tm->hour, &Tm->minute,
|
|
Packit Service |
17f749 |
&Tm->second) < 3)
|
|
Packit Service |
17f749 |
{
|
|
Packit Service |
17f749 |
return MADB_SetError(Error, MADB_ERR_22008, NULL, 0);
|
|
Packit Service |
17f749 |
}
|
|
Packit Service |
17f749 |
}
|
|
Packit Service |
17f749 |
|
|
Packit Service |
17f749 |
check:
|
|
Packit Service |
17f749 |
if (Interval == FALSE)
|
|
Packit Service |
17f749 |
{
|
|
Packit Service |
17f749 |
if (isDate)
|
|
Packit Service |
17f749 |
{
|
|
Packit Service |
17f749 |
if (Tm->year > 0)
|
|
Packit Service |
17f749 |
{
|
|
Packit Service |
17f749 |
if (Tm->year < 70)
|
|
Packit Service |
17f749 |
{
|
|
Packit Service |
17f749 |
Tm->year+= 2000;
|
|
Packit Service |
17f749 |
}
|
|
Packit Service |
17f749 |
else if (Tm->year < 100)
|
|
Packit Service |
17f749 |
{
|
|
Packit Service |
17f749 |
Tm->year+= 1900;
|
|
Packit Service |
17f749 |
}
|
|
Packit Service |
17f749 |
}
|
|
Packit Service |
17f749 |
}
|
|
Packit Service |
17f749 |
}
|
|
Packit Service |
17f749 |
|
|
Packit Service |
17f749 |
end:
|
|
Packit Service |
17f749 |
MADB_FREE(localCopy);
|
|
Packit Service |
17f749 |
return SQL_SUCCESS;
|
|
Packit Service |
17f749 |
}
|
|
Packit Service |
17f749 |
|
|
Packit Service |
17f749 |
/* {{{ MADB_ConversionSupported */
|
|
Packit Service |
17f749 |
BOOL MADB_ConversionSupported(MADB_DescRecord *From, MADB_DescRecord *To)
|
|
Packit Service |
17f749 |
{
|
|
Packit Service |
17f749 |
switch (From->ConciseType)
|
|
Packit Service |
17f749 |
{
|
|
Packit Service |
17f749 |
case SQL_C_TIMESTAMP:
|
|
Packit Service |
17f749 |
case SQL_C_TYPE_TIMESTAMP:
|
|
Packit Service |
17f749 |
case SQL_C_TIME:
|
|
Packit Service |
17f749 |
case SQL_C_TYPE_TIME:
|
|
Packit Service |
17f749 |
case SQL_C_DATE:
|
|
Packit Service |
17f749 |
case SQL_C_TYPE_DATE:
|
|
Packit Service |
17f749 |
|
|
Packit Service |
17f749 |
if (To->Type == SQL_INTERVAL)
|
|
Packit Service |
17f749 |
{
|
|
Packit Service |
17f749 |
return FALSE;
|
|
Packit Service |
17f749 |
}
|
|
Packit Service |
17f749 |
|
|
Packit Service |
17f749 |
}
|
|
Packit Service |
17f749 |
return TRUE;
|
|
Packit Service |
17f749 |
}
|
|
Packit Service |
17f749 |
/* }}} */
|
|
Packit Service |
17f749 |
|
|
Packit Service |
17f749 |
/* {{{ MADB_ConvertCharToBit */
|
|
Packit Service |
17f749 |
char MADB_ConvertCharToBit(MADB_Stmt *Stmt, char *src)
|
|
Packit Service |
17f749 |
{
|
|
Packit Service |
17f749 |
char *EndPtr= NULL;
|
|
Packit Service |
17f749 |
float asNumber= strtof(src, &EndPtr);
|
|
Packit Service |
17f749 |
|
|
Packit Service |
17f749 |
if (asNumber < 0 || asNumber > 1)
|
|
Packit Service |
17f749 |
{
|
|
Packit Service |
17f749 |
/* 22003 */
|
|
Packit Service |
17f749 |
}
|
|
Packit Service |
17f749 |
else if (asNumber != 0 && asNumber != 1)
|
|
Packit Service |
17f749 |
{
|
|
Packit Service |
17f749 |
/* 22001 */
|
|
Packit Service |
17f749 |
}
|
|
Packit Service |
17f749 |
else if (EndPtr != NULL && *EndPtr != '\0')
|
|
Packit Service |
17f749 |
{
|
|
Packit Service |
17f749 |
/* 22018. TODO: check if condition is correct */
|
|
Packit Service |
17f749 |
}
|
|
Packit Service |
17f749 |
|
|
Packit Service |
17f749 |
return asNumber != 0 ? '\1' : '\0';
|
|
Packit Service |
17f749 |
}
|
|
Packit Service |
17f749 |
/* }}} */
|
|
Packit Service |
17f749 |
|
|
Packit Service |
17f749 |
/* {{{ MADB_ConvertNumericToChar */
|
|
Packit Service |
17f749 |
size_t MADB_ConvertNumericToChar(SQL_NUMERIC_STRUCT *Numeric, char *Buffer, int *ErrorCode)
|
|
Packit Service |
17f749 |
{
|
|
Packit Bot |
ff6dbd |
const double DenominatorTable[]= {1.0, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, 10000000.0, 100000000.0, 1000000000.0/*9*/,
|
|
Packit Bot |
ff6dbd |
10000000000.0, 100000000000.0, 1000000000000.0, 10000000000000.0, 100000000000000.0, 1000000000000000.0/*15*/,
|
|
Packit Bot |
ff6dbd |
10000000000000000.0, 100000000000000000.0, 1000000000000000000.0, 10000000000000000000.0, 1e+20 /*20*/, 1e+21,
|
|
Packit Bot |
ff6dbd |
1e+22, 1e+23, 1e+24, 1e+25, 1e+26, 1e+27, 1e+28, 1e+29, 1e+30, 1e+31, 1e+32, 1e+33, 1e+34, 1e+35, 1e+36, 1e+37, 1e+38 };
|
|
Packit Bot |
ff6dbd |
unsigned long long Numerator= 0;
|
|
Packit Bot |
ff6dbd |
double Denominator;
|
|
Packit Service |
17f749 |
int Scale= 0;
|
|
Packit Bot |
ff6dbd |
unsigned long long ByteDenominator= 1;
|
|
Packit Service |
17f749 |
int i;
|
|
Packit Bot |
ff6dbd |
char* p;
|
|
Packit Bot |
ff6dbd |
size_t Length;
|
|
Packit Service |
17f749 |
|
|
Packit Service |
17f749 |
Buffer[0]= 0;
|
|
Packit Service |
17f749 |
*ErrorCode= 0;
|
|
Packit Service |
17f749 |
|
|
Packit Service |
17f749 |
Scale+= (Numeric->scale < 0) ? -Numeric->scale : Numeric->scale;
|
|
Packit Service |
17f749 |
|
|
Packit Bot |
ff6dbd |
for (i= 0; i < SQL_MAX_NUMERIC_LEN; ++i)
|
|
Packit Service |
17f749 |
{
|
|
Packit Bot |
ff6dbd |
if (i > 7 && Numeric->val[i] != '\0')
|
|
Packit Bot |
ff6dbd |
{
|
|
Packit Bot |
ff6dbd |
*ErrorCode = MADB_ERR_22003;
|
|
Packit Bot |
ff6dbd |
return 0;
|
|
Packit Bot |
ff6dbd |
}
|
|
Packit Bot |
ff6dbd |
Numerator += Numeric->val[i] * ByteDenominator;
|
|
Packit Bot |
ff6dbd |
ByteDenominator <<= 8;
|
|
Packit Service |
17f749 |
}
|
|
Packit Bot |
ff6dbd |
|
|
Packit Service |
17f749 |
if (Numeric->scale > 0)
|
|
Packit Service |
17f749 |
{
|
|
Packit Bot |
ff6dbd |
Denominator = DenominatorTable[Scale];// pow(10, Scale);
|
|
Packit Bot |
ff6dbd |
char tmp[10 /*1 sign + 1 % + 1 dot + 3 scale + 1f + 1\0 */];
|
|
Packit Bot |
ff6dbd |
_snprintf(tmp, sizeof(tmp), "%s%%.%df", Numeric->sign ? "" : "-", Numeric->scale);
|
|
Packit Bot |
ff6dbd |
_snprintf(Buffer, MADB_CHARSIZE_FOR_NUMERIC, tmp, Numerator / Denominator);
|
|
Packit Service |
17f749 |
}
|
|
Packit Service |
17f749 |
else
|
|
Packit Service |
17f749 |
{
|
|
Packit Bot |
ff6dbd |
_snprintf(Buffer, MADB_CHARSIZE_FOR_NUMERIC, "%s%llu", Numeric->sign ? "" : "-", Numerator);
|
|
Packit Bot |
ff6dbd |
/* Checking Truncation for negative/zero scale before adding 0 */
|
|
Packit Bot |
ff6dbd |
Length= strlen(Buffer) - (Numeric->sign ? 0 : 1);
|
|
Packit Bot |
ff6dbd |
if (Length > Numeric->precision)
|
|
Packit Bot |
ff6dbd |
{
|
|
Packit Bot |
ff6dbd |
*ErrorCode = MADB_ERR_22003;
|
|
Packit Bot |
ff6dbd |
goto end;
|
|
Packit Bot |
ff6dbd |
}
|
|
Packit Bot |
ff6dbd |
for (i= 0; i < Scale; ++i)
|
|
Packit Bot |
ff6dbd |
{
|
|
Packit Service |
17f749 |
strcat(Buffer, "0");
|
|
Packit Bot |
ff6dbd |
}
|
|
Packit Service |
17f749 |
}
|
|
Packit Service |
17f749 |
|
|
Packit Service |
17f749 |
if (Buffer[0] == '-')
|
|
Packit Bot |
ff6dbd |
{
|
|
Packit Bot |
ff6dbd |
++Buffer;
|
|
Packit Bot |
ff6dbd |
}
|
|
Packit Service |
17f749 |
|
|
Packit Bot |
ff6dbd |
Length= strlen(Buffer);
|
|
Packit Service |
17f749 |
/* Truncation checks:
|
|
Packit Service |
17f749 |
1st ensure, that the digits before decimal point will fit */
|
|
Packit Service |
17f749 |
if ((p= strchr(Buffer, '.')))
|
|
Packit Service |
17f749 |
{
|
|
Packit Bot |
ff6dbd |
if (Numeric->precision != 0 && (p - Buffer) > Numeric->precision)
|
|
Packit Service |
17f749 |
{
|
|
Packit Service |
17f749 |
*ErrorCode= MADB_ERR_22003;
|
|
Packit Bot |
ff6dbd |
Length= Numeric->precision;
|
|
Packit Service |
17f749 |
Buffer[Numeric->precision]= 0;
|
|
Packit Service |
17f749 |
goto end;
|
|
Packit Service |
17f749 |
}
|
|
Packit Bot |
ff6dbd |
|
|
Packit Bot |
ff6dbd |
/* If scale >= precision, we still can have no truncation */
|
|
Packit Bot |
ff6dbd |
if (Length > Numeric->precision + 1/*dot*/ && Scale < Numeric->precision)
|
|
Packit Service |
17f749 |
{
|
|
Packit Service |
17f749 |
*ErrorCode= MADB_ERR_01S07;
|
|
Packit Bot |
ff6dbd |
Length = Numeric->precision + 1/*dot*/;
|
|
Packit Bot |
ff6dbd |
Buffer[Length]= 0;
|
|
Packit Service |
17f749 |
goto end;
|
|
Packit Service |
17f749 |
}
|
|
Packit Service |
17f749 |
}
|
|
Packit Service |
17f749 |
|
|
Packit Service |
17f749 |
end:
|
|
Packit Service |
17f749 |
/* check if last char is decimal point */
|
|
Packit Bot |
ff6dbd |
if (Length > 0 && Buffer[Length - 1] == '.')
|
|
Packit Bot |
ff6dbd |
{
|
|
Packit Bot |
ff6dbd |
Buffer[Length - 1]= 0;
|
|
Packit Bot |
ff6dbd |
}
|
|
Packit Bot |
ff6dbd |
if (Numeric->sign == 0)
|
|
Packit Bot |
ff6dbd |
{
|
|
Packit Bot |
ff6dbd |
++Length;
|
|
Packit Bot |
ff6dbd |
}
|
|
Packit Bot |
ff6dbd |
return Length;
|
|
Packit Service |
17f749 |
}
|
|
Packit Service |
17f749 |
/* }}} */
|
|
Packit Service |
17f749 |
|
|
Packit Service |
17f749 |
/* {{{ MADB_ConvertNullValue */
|
|
Packit Service |
17f749 |
SQLRETURN MADB_ConvertNullValue(MADB_Stmt *Stmt, MYSQL_BIND *MaBind)
|
|
Packit Service |
17f749 |
{
|
|
Packit Service |
17f749 |
MaBind->buffer_type= MYSQL_TYPE_NULL;
|
|
Packit Service |
17f749 |
MaBind->buffer_length= 0;
|
|
Packit Service |
17f749 |
|
|
Packit Service |
17f749 |
return SQL_SUCCESS;
|
|
Packit Service |
17f749 |
}
|
|
Packit Service |
17f749 |
/* }}} */
|
|
Packit Service |
17f749 |
|
|
Packit Service |
17f749 |
/* {{{ MADB_ProcessIndicator */
|
|
Packit Service |
17f749 |
/* Returns TRUE if indicator contains some special value, and thus no further type conversion is needed */
|
|
Packit Service |
17f749 |
BOOL MADB_ProcessIndicator(MADB_Stmt *Stmt, SQLLEN Indicator, char * DefaultValue, MYSQL_BIND *MaBind)
|
|
Packit Service |
17f749 |
{
|
|
Packit Service |
17f749 |
switch (Indicator)
|
|
Packit Service |
17f749 |
{
|
|
Packit Service |
17f749 |
case SQL_COLUMN_IGNORE:
|
|
Packit Service |
17f749 |
if (DefaultValue == NULL)
|
|
Packit Service |
17f749 |
{
|
|
Packit Service |
17f749 |
MADB_ConvertNullValue(Stmt, MaBind);
|
|
Packit Service |
17f749 |
}
|
|
Packit Service |
17f749 |
else
|
|
Packit Service |
17f749 |
{
|
|
Packit Service |
17f749 |
MaBind->buffer= DefaultValue;
|
|
Packit Service |
17f749 |
MaBind->buffer_length= (unsigned long)strlen(DefaultValue);
|
|
Packit Service |
17f749 |
MaBind->buffer_type= MYSQL_TYPE_STRING;
|
|
Packit Service |
17f749 |
}
|
|
Packit Service |
17f749 |
return TRUE;
|
|
Packit Service |
17f749 |
case SQL_NULL_DATA:
|
|
Packit Service |
17f749 |
MADB_ConvertNullValue(Stmt, MaBind);
|
|
Packit Service |
17f749 |
return TRUE;
|
|
Packit Service |
17f749 |
}
|
|
Packit Service |
17f749 |
|
|
Packit Service |
17f749 |
return FALSE;
|
|
Packit Service |
17f749 |
}
|
|
Packit Service |
17f749 |
/* }}} */
|
|
Packit Service |
17f749 |
|
|
Packit Service |
17f749 |
/* {{{ MADB_CalculateLength */
|
|
Packit Service |
17f749 |
SQLLEN MADB_CalculateLength(MADB_Stmt *Stmt, SQLLEN *OctetLengthPtr, MADB_DescRecord *CRec, void* DataPtr)
|
|
Packit Service |
17f749 |
{
|
|
Packit Service |
17f749 |
/* If no OctetLengthPtr was specified, or OctetLengthPtr is SQL_NTS character
|
|
Packit Service |
17f749 |
are considered to be NULL binary data are null terminated */
|
|
Packit Service |
17f749 |
if (!OctetLengthPtr || *OctetLengthPtr == SQL_NTS)
|
|
Packit Service |
17f749 |
{
|
|
Packit Service |
17f749 |
/* Meaning of Buffer Length is not quite clear in specs. Thus we treat in the way, that does not break
|
|
Packit Service |
17f749 |
(old) testcases. i.e. we neglect its value if Length Ptr is specified */
|
|
Packit Service |
17f749 |
SQLLEN BufferLen= OctetLengthPtr ? -1 : CRec->OctetLength;
|
|
Packit Service |
17f749 |
|
|
Packit Service |
17f749 |
switch (CRec->ConciseType)
|
|
Packit Service |
17f749 |
{
|
|
Packit Service |
17f749 |
case SQL_C_WCHAR:
|
|
Packit Service |
17f749 |
/* CRec->OctetLength eq 0 means not 0-length buffer, but that this value is not specified. Thus -1, for SqlwcsLen
|
|
Packit Service |
17f749 |
and SafeStrlen that means buffer len is not specified */
|
|
Packit Service |
17f749 |
return SqlwcsLen((SQLWCHAR *)DataPtr, BufferLen/sizeof(SQLWCHAR) - test(BufferLen == 0)) * sizeof(SQLWCHAR);
|
|
Packit Service |
17f749 |
break;
|
|
Packit Service |
17f749 |
case SQL_C_BINARY:
|
|
Packit Service |
17f749 |
case SQL_VARBINARY:
|
|
Packit Service |
17f749 |
case SQL_LONGVARBINARY:
|
|
Packit Service |
17f749 |
case SQL_C_CHAR:
|
|
Packit Service |
17f749 |
return SafeStrlen((SQLCHAR *)DataPtr, BufferLen != 0 ? BufferLen : -1);
|
|
Packit Service |
17f749 |
}
|
|
Packit Service |
17f749 |
}
|
|
Packit Service |
17f749 |
else
|
|
Packit Service |
17f749 |
{
|
|
Packit Service |
17f749 |
return *OctetLengthPtr;
|
|
Packit Service |
17f749 |
}
|
|
Packit Service |
17f749 |
|
|
Packit Service |
17f749 |
return CRec->OctetLength;
|
|
Packit Service |
17f749 |
}
|
|
Packit Service |
17f749 |
/* }}} */
|
|
Packit Service |
17f749 |
|
|
Packit Service |
17f749 |
/* {{{ MADB_GetBufferForSqlValue */
|
|
Packit Service |
17f749 |
void* MADB_GetBufferForSqlValue(MADB_Stmt *Stmt, MADB_DescRecord *CRec, size_t Size)
|
|
Packit Service |
17f749 |
{
|
|
Packit Service |
17f749 |
if (Stmt->RebindParams || CRec->InternalBuffer == NULL)
|
|
Packit Service |
17f749 |
{
|
|
Packit Service |
17f749 |
MADB_FREE(CRec->InternalBuffer);
|
|
Packit Service |
17f749 |
CRec->InternalBuffer= MADB_CALLOC(Size);
|
|
Packit Service |
17f749 |
if (CRec->InternalBuffer == NULL)
|
|
Packit Service |
17f749 |
{
|
|
Packit Service |
17f749 |
MADB_SetError(&Stmt->Error, MADB_ERR_HY001, NULL, 0);
|
|
Packit Service |
17f749 |
return NULL;
|
|
Packit Service |
17f749 |
}
|
|
Packit Service |
17f749 |
}
|
|
Packit Service |
17f749 |
|
|
Packit Service |
17f749 |
return (void *)CRec->InternalBuffer;
|
|
Packit Service |
17f749 |
}
|
|
Packit Service |
17f749 |
/* }}} */
|
|
Packit Service |
17f749 |
|
|
Packit Service |
17f749 |
/* {{{ MADB_Wchar2Sql */
|
|
Packit Service |
17f749 |
SQLRETURN MADB_Wchar2Sql(MADB_Stmt *Stmt, MADB_DescRecord *CRec, void* DataPtr, SQLLEN Length,
|
|
Packit Service |
17f749 |
MADB_DescRecord *SqlRec, MYSQL_BIND *MaBind, void **Buffer, unsigned long *LengthPtr)
|
|
Packit Service |
17f749 |
{
|
|
Packit Service |
17f749 |
SQLULEN mbLength=0;
|
|
Packit Service |
17f749 |
|
|
Packit Service |
17f749 |
MADB_FREE(CRec->InternalBuffer);
|
|
Packit Service |
17f749 |
|
|
Packit Service |
17f749 |
/* conn cs ? */
|
|
Packit Service |
17f749 |
CRec->InternalBuffer= MADB_ConvertFromWChar((SQLWCHAR *)DataPtr, (SQLINTEGER)(Length / sizeof(SQLWCHAR)),
|
|
Packit Service |
17f749 |
&mbLength, &Stmt->Connection->Charset, NULL);
|
|
Packit Service |
17f749 |
|
|
Packit Service |
17f749 |
if (CRec->InternalBuffer == NULL)
|
|
Packit Service |
17f749 |
{
|
|
Packit Service |
17f749 |
return MADB_SetError(&Stmt->Error, MADB_ERR_HY001, NULL, 0);
|
|
Packit Service |
17f749 |
}
|
|
Packit Service |
17f749 |
|
|
Packit Service |
17f749 |
*LengthPtr= (unsigned long)mbLength;
|
|
Packit Service |
17f749 |
*Buffer= CRec->InternalBuffer;
|
|
Packit Service |
17f749 |
|
|
Packit Service |
17f749 |
MaBind->buffer_type= MYSQL_TYPE_STRING;
|
|
Packit Service |
17f749 |
|
|
Packit Service |
17f749 |
return SQL_SUCCESS;
|
|
Packit Service |
17f749 |
}
|
|
Packit Service |
17f749 |
/* }}} */
|
|
Packit Service |
17f749 |
|
|
Packit Service |
17f749 |
/* {{{ MADB_Char2Sql */
|
|
Packit Service |
17f749 |
SQLRETURN MADB_Char2Sql(MADB_Stmt *Stmt, MADB_DescRecord *CRec, void* DataPtr, SQLLEN Length,
|
|
Packit Service |
17f749 |
MADB_DescRecord *SqlRec, MYSQL_BIND *MaBind, void **Buffer, unsigned long *LengthPtr)
|
|
Packit Service |
17f749 |
{
|
|
Packit Service |
17f749 |
switch (SqlRec->Type)
|
|
Packit Service |
17f749 |
{
|
|
Packit Service |
17f749 |
case SQL_BIT:
|
|
Packit Service |
17f749 |
if (*Buffer == NULL)
|
|
Packit Service |
17f749 |
{
|
|
Packit Service |
17f749 |
CRec->InternalBuffer= (char *)MADB_GetBufferForSqlValue(Stmt, CRec, MaBind->buffer_length);
|
|
Packit Service |
17f749 |
|
|
Packit Service |
17f749 |
if (CRec->InternalBuffer == NULL)
|
|
Packit Service |
17f749 |
{
|
|
Packit Service |
17f749 |
return Stmt->Error.ReturnValue;
|
|
Packit Service |
17f749 |
}
|
|
Packit Service |
17f749 |
*Buffer= CRec->InternalBuffer;
|
|
Packit Service |
17f749 |
}
|
|
Packit Service |
17f749 |
|
|
Packit Service |
17f749 |
*LengthPtr= 1;
|
|
Packit Service |
17f749 |
**(char**)Buffer= MADB_ConvertCharToBit(Stmt, DataPtr);
|
|
Packit Service |
17f749 |
MaBind->buffer_type= MYSQL_TYPE_TINY;
|
|
Packit Service |
17f749 |
break;
|
|
Packit Service |
17f749 |
case SQL_DATETIME:
|
|
Packit Service |
17f749 |
{
|
|
Packit Service |
17f749 |
MYSQL_TIME Tm;
|
|
Packit Service |
17f749 |
SQL_TIMESTAMP_STRUCT Ts;
|
|
Packit Service |
17f749 |
BOOL isTime;
|
|
Packit Service |
17f749 |
|
|
Packit Service |
17f749 |
/* Enforcing constraints on date/time values */
|
|
Packit Service |
17f749 |
RETURN_ERROR_OR_CONTINUE(MADB_Str2Ts(DataPtr, Length, &Tm, FALSE, &Stmt->Error, &isTime));
|
|
Packit Service |
17f749 |
MADB_CopyMadbTimeToOdbcTs(&Tm, &Ts);
|
|
Packit Service |
17f749 |
RETURN_ERROR_OR_CONTINUE(MADB_TsConversionIsPossible(&Ts, SqlRec->ConciseType, &Stmt->Error, MADB_ERR_22018, isTime));
|
|
Packit Service |
17f749 |
/* To stay on the safe side - still sending as string in the default branch */
|
|
Packit Service |
17f749 |
}
|
|
Packit Service |
17f749 |
default:
|
|
Packit Service |
17f749 |
/* Bulk shouldn't get here, thus logic for single paramset execution */
|
|
Packit Service |
17f749 |
*LengthPtr= (unsigned long)Length;
|
|
Packit Service |
17f749 |
*Buffer= DataPtr;
|
|
Packit Service |
17f749 |
MaBind->buffer_type= MYSQL_TYPE_STRING;
|
|
Packit Service |
17f749 |
}
|
|
Packit Service |
17f749 |
|
|
Packit Service |
17f749 |
return SQL_SUCCESS;
|
|
Packit Service |
17f749 |
}
|
|
Packit Service |
17f749 |
/* }}} */
|
|
Packit Service |
17f749 |
|
|
Packit Service |
17f749 |
/* {{{ MADB_Numeric2Sql */
|
|
Packit Service |
17f749 |
SQLRETURN MADB_Numeric2Sql(MADB_Stmt *Stmt, MADB_DescRecord *CRec, void* DataPtr, SQLLEN Length,
|
|
Packit Service |
17f749 |
MADB_DescRecord *SqlRec, MYSQL_BIND *MaBind, void **Buffer, unsigned long *LengthPtr)
|
|
Packit Service |
17f749 |
{
|
|
Packit Service |
17f749 |
SQL_NUMERIC_STRUCT *p;
|
|
Packit Service |
17f749 |
int ErrorCode= 0;
|
|
Packit Service |
17f749 |
|
|
Packit Service |
17f749 |
/* We might need to preserve this pointer to be able to later release the memory */
|
|
Packit Service |
17f749 |
CRec->InternalBuffer= (char *)MADB_GetBufferForSqlValue(Stmt, CRec, MADB_CHARSIZE_FOR_NUMERIC);
|
|
Packit Service |
17f749 |
|
|
Packit Service |
17f749 |
if (CRec->InternalBuffer == NULL)
|
|
Packit Service |
17f749 |
{
|
|
Packit Service |
17f749 |
return Stmt->Error.ReturnValue;
|
|
Packit Service |
17f749 |
}
|
|
Packit Service |
17f749 |
|
|
Packit Service |
17f749 |
p= (SQL_NUMERIC_STRUCT *)DataPtr;
|
|
Packit Service |
17f749 |
p->scale= (SQLSCHAR)SqlRec->Scale;
|
|
Packit Service |
17f749 |
p->precision= (SQLSCHAR)SqlRec->Precision;
|
|
Packit Service |
17f749 |
|
|
Packit Service |
17f749 |
*LengthPtr= (unsigned long)MADB_ConvertNumericToChar((SQL_NUMERIC_STRUCT *)p, CRec->InternalBuffer, &ErrorCode);;
|
|
Packit Service |
17f749 |
*Buffer= CRec->InternalBuffer;
|
|
Packit Service |
17f749 |
|
|
Packit Service |
17f749 |
MaBind->buffer_type= MYSQL_TYPE_STRING;
|
|
Packit Service |
17f749 |
|
|
Packit Service |
17f749 |
if (ErrorCode)
|
|
Packit Service |
17f749 |
{
|
|
Packit Service |
17f749 |
/*TODO: I guess this parameters row should be skipped */
|
|
Packit Service |
17f749 |
return MADB_SetError(&Stmt->Error, ErrorCode, NULL, 0);
|
|
Packit Service |
17f749 |
}
|
|
Packit Service |
17f749 |
|
|
Packit Service |
17f749 |
return SQL_SUCCESS;
|
|
Packit Service |
17f749 |
}
|
|
Packit Service |
17f749 |
/* }}} */
|
|
Packit Service |
17f749 |
|
|
Packit Service |
17f749 |
/* {{{ MADB_TsConversionIsPossible */
|
|
Packit Service |
17f749 |
SQLRETURN MADB_TsConversionIsPossible(SQL_TIMESTAMP_STRUCT *ts, SQLSMALLINT SqlType, MADB_Error *Error, enum enum_madb_error SqlState, int isTime)
|
|
Packit Service |
17f749 |
{
|
|
Packit Service |
17f749 |
/* I think instead of MADB_ERR_22008 there should be also SqlState */
|
|
Packit Service |
17f749 |
switch (SqlType)
|
|
Packit Service |
17f749 |
{
|
|
Packit Service |
17f749 |
case SQL_TIME:
|
|
Packit Service |
17f749 |
case SQL_TYPE_TIME:
|
|
Packit Service |
17f749 |
if (ts->fraction)
|
|
Packit Service |
17f749 |
{
|
|
Packit Service |
17f749 |
return MADB_SetError(Error, MADB_ERR_22008, NULL, 0);
|
|
Packit Service |
17f749 |
}
|
|
Packit Service |
17f749 |
break;
|
|
Packit Service |
17f749 |
case SQL_DATE:
|
|
Packit Service |
17f749 |
case SQL_TYPE_DATE:
|
|
Packit Service |
17f749 |
if (ts->hour + ts->minute + ts->second + ts->fraction)
|
|
Packit Service |
17f749 |
{
|
|
Packit Service |
17f749 |
return MADB_SetError(Error, MADB_ERR_22008, NULL, 0);
|
|
Packit Service |
17f749 |
}
|
|
Packit Service |
17f749 |
default:
|
|
Packit Service |
17f749 |
/* This only would be good for SQL_TYPE_TIME. If C type is time(isTime!=0), and SQL type is timestamp, date fields may be NULL - driver should set them to current date */
|
|
Packit Service |
17f749 |
if ((isTime == 0 && ts->year == 0) || ts->month == 0 || ts->day == 0)
|
|
Packit Service |
17f749 |
{
|
|
Packit Service |
17f749 |
return MADB_SetError(Error, SqlState, NULL, 0);
|
|
Packit Service |
17f749 |
}
|
|
Packit Service |
17f749 |
}
|
|
Packit Service |
17f749 |
return SQL_SUCCESS;
|
|
Packit Service |
17f749 |
}
|
|
Packit Service |
17f749 |
/* }}} */
|
|
Packit Service |
17f749 |
|
|
Packit Service |
17f749 |
/* {{{ MADB_Timestamp2Sql */
|
|
Packit Service |
17f749 |
SQLRETURN MADB_Timestamp2Sql(MADB_Stmt *Stmt, MADB_DescRecord *CRec, void* DataPtr, SQLLEN Length,
|
|
Packit Service |
17f749 |
MADB_DescRecord *SqlRec, MYSQL_BIND *MaBind, void **Buffer, unsigned long *LengthPtr)
|
|
Packit Service |
17f749 |
{
|
|
Packit Service |
17f749 |
MYSQL_TIME *tm= NULL;
|
|
Packit Service |
17f749 |
SQL_TIMESTAMP_STRUCT *ts= (SQL_TIMESTAMP_STRUCT *)DataPtr;
|
|
Packit Service |
17f749 |
|
|
Packit Service |
17f749 |
RETURN_ERROR_OR_CONTINUE(MADB_TsConversionIsPossible(ts, SqlRec->ConciseType, &Stmt->Error, MADB_ERR_22007, 0));
|
|
Packit Service |
17f749 |
|
|
Packit Service |
17f749 |
if (*Buffer == NULL)
|
|
Packit Service |
17f749 |
{
|
|
Packit Service |
17f749 |
tm= (MYSQL_TIME*)MADB_GetBufferForSqlValue(Stmt, CRec, sizeof(MYSQL_TIME));
|
|
Packit Service |
17f749 |
if (tm == NULL)
|
|
Packit Service |
17f749 |
{
|
|
Packit Service |
17f749 |
/* Error is set in function responsible for allocation */
|
|
Packit Service |
17f749 |
return Stmt->Error.ReturnValue;
|
|
Packit Service |
17f749 |
}
|
|
Packit Service |
17f749 |
*Buffer= tm;
|
|
Packit Service |
17f749 |
}
|
|
Packit Service |
17f749 |
else
|
|
Packit Service |
17f749 |
{
|
|
Packit Service |
17f749 |
tm= *Buffer;
|
|
Packit Service |
17f749 |
}
|
|
Packit Service |
17f749 |
|
|
Packit Service |
17f749 |
|
|
Packit Service |
17f749 |
/* Default types. Not quite clear if time_type has any effect */
|
|
Packit Service |
17f749 |
tm->time_type= MYSQL_TIMESTAMP_DATETIME;
|
|
Packit Service |
17f749 |
MaBind->buffer_type= MYSQL_TYPE_TIMESTAMP;
|
|
Packit Service |
17f749 |
|
|
Packit Service |
17f749 |
switch (SqlRec->ConciseType) {
|
|
Packit Service |
17f749 |
case SQL_TYPE_DATE:
|
|
Packit Service |
17f749 |
if (ts->hour + ts->minute + ts->second + ts->fraction != 0)
|
|
Packit Service |
17f749 |
{
|
|
Packit Service |
17f749 |
return MADB_SetError(&Stmt->Error, MADB_ERR_22008, "Time fields are nonzero", 0);
|
|
Packit Service |
17f749 |
}
|
|
Packit Service |
17f749 |
|
|
Packit Service |
17f749 |
MaBind->buffer_type= MYSQL_TYPE_DATE;
|
|
Packit Service |
17f749 |
tm->time_type= MYSQL_TIMESTAMP_DATE;
|
|
Packit Service |
17f749 |
tm->year= ts->year;
|
|
Packit Service |
17f749 |
tm->month= ts->month;
|
|
Packit Service |
17f749 |
tm->day= ts->day;
|
|
Packit Service |
17f749 |
break;
|
|
Packit Service |
17f749 |
case SQL_TYPE_TIME:
|
|
Packit Service |
17f749 |
if (ts->fraction != 0)
|
|
Packit Service |
17f749 |
{
|
|
Packit Service |
17f749 |
return MADB_SetError(&Stmt->Error, MADB_ERR_22008, "Fractional seconds fields are nonzero", 0);
|
|
Packit Service |
17f749 |
}
|
|
Packit Service |
17f749 |
|
|
Packit Service |
17f749 |
if (!VALID_TIME(ts))
|
|
Packit Service |
17f749 |
{
|
|
Packit Service |
17f749 |
return MADB_SetError(&Stmt->Error, MADB_ERR_22007, "Invalid time", 0);
|
|
Packit Service |
17f749 |
}
|
|
Packit Service |
17f749 |
MaBind->buffer_type= MYSQL_TYPE_TIME;
|
|
Packit Service |
17f749 |
tm->time_type= MYSQL_TIMESTAMP_TIME;
|
|
Packit Service |
17f749 |
tm->hour= ts->hour;
|
|
Packit Service |
17f749 |
tm->minute= ts->minute;
|
|
Packit Service |
17f749 |
tm->second= ts->second;
|
|
Packit Service |
17f749 |
break;
|
|
Packit Service |
17f749 |
default:
|
|
Packit Service |
17f749 |
MADB_CopyOdbcTsToMadbTime(ts, tm);
|
|
Packit Service |
17f749 |
}
|
|
Packit Service |
17f749 |
|
|
Packit Service |
17f749 |
*LengthPtr= sizeof(MYSQL_TIME);
|
|
Packit Service |
17f749 |
|
|
Packit Service |
17f749 |
return SQL_SUCCESS;
|
|
Packit Service |
17f749 |
}
|
|
Packit Service |
17f749 |
/* }}} */
|
|
Packit Service |
17f749 |
|
|
Packit Service |
17f749 |
/* {{{ MADB_Time2Sql */
|
|
Packit Service |
17f749 |
SQLRETURN MADB_Time2Sql(MADB_Stmt *Stmt, MADB_DescRecord *CRec, void* DataPtr, SQLLEN Length,
|
|
Packit Service |
17f749 |
MADB_DescRecord *SqlRec, MYSQL_BIND *MaBind, void **Buffer, unsigned long *LengthPtr)
|
|
Packit Service |
17f749 |
{
|
|
Packit Service |
17f749 |
MYSQL_TIME *tm= NULL;
|
|
Packit Service |
17f749 |
SQL_TIME_STRUCT *ts= (SQL_TIME_STRUCT *)DataPtr;
|
|
Packit Service |
17f749 |
|
|
Packit Service |
17f749 |
if ((SqlRec->ConciseType == SQL_TYPE_TIME || SqlRec->ConciseType == SQL_TYPE_TIMESTAMP ||
|
|
Packit Service |
17f749 |
SqlRec->ConciseType == SQL_TIME || SqlRec->ConciseType == SQL_TIMESTAMP || SqlRec->ConciseType == SQL_DATETIME) &&
|
|
Packit Service |
17f749 |
!VALID_TIME(ts))
|
|
Packit Service |
17f749 |
{
|
|
Packit Service |
17f749 |
return MADB_SetError(&Stmt->Error, MADB_ERR_22007, NULL, 0);
|
|
Packit Service |
17f749 |
}
|
|
Packit Service |
17f749 |
|
|
Packit Service |
17f749 |
if (*Buffer == NULL)
|
|
Packit Service |
17f749 |
{
|
|
Packit Service |
17f749 |
tm= (MYSQL_TIME*)MADB_GetBufferForSqlValue(Stmt, CRec, sizeof(MYSQL_TIME));
|
|
Packit Service |
17f749 |
if (tm == NULL)
|
|
Packit Service |
17f749 |
{
|
|
Packit Service |
17f749 |
/* Error is set in function responsible for allocation */
|
|
Packit Service |
17f749 |
return Stmt->Error.ReturnValue;
|
|
Packit Service |
17f749 |
}
|
|
Packit Service |
17f749 |
*Buffer= tm;
|
|
Packit Service |
17f749 |
}
|
|
Packit Service |
17f749 |
else
|
|
Packit Service |
17f749 |
{
|
|
Packit Service |
17f749 |
tm= *Buffer;
|
|
Packit Service |
17f749 |
}
|
|
Packit Service |
17f749 |
|
|
Packit Service |
17f749 |
if(SqlRec->ConciseType == SQL_TYPE_TIMESTAMP ||
|
|
Packit Service |
17f749 |
SqlRec->ConciseType == SQL_TIMESTAMP || SqlRec->ConciseType == SQL_DATETIME)
|
|
Packit Service |
17f749 |
{
|
|
Packit Service |
17f749 |
time_t sec_time;
|
|
Packit Service |
17f749 |
struct tm * cur_tm;
|
|
Packit Service |
17f749 |
|
|
Packit Service |
17f749 |
sec_time= time(NULL);
|
|
Packit Service |
17f749 |
cur_tm= localtime(&sec_time);
|
|
Packit Service |
17f749 |
|
|
Packit Service |
17f749 |
tm->year= 1900 + cur_tm->tm_year;
|
|
Packit Service |
17f749 |
tm->month= cur_tm->tm_mon + 1;
|
|
Packit Service |
17f749 |
tm->day= cur_tm->tm_mday;
|
|
Packit Service |
17f749 |
tm->second_part= 0;
|
|
Packit Service |
17f749 |
|
|
Packit Service |
17f749 |
tm->time_type= MYSQL_TIMESTAMP_DATETIME;
|
|
Packit Service |
17f749 |
MaBind->buffer_type= MYSQL_TYPE_TIMESTAMP;
|
|
Packit Service |
17f749 |
}
|
|
Packit Service |
17f749 |
else
|
|
Packit Service |
17f749 |
{
|
|
Packit Service |
17f749 |
tm->year= 0;
|
|
Packit Service |
17f749 |
tm->month= 0;
|
|
Packit Service |
17f749 |
tm->day= 0;
|
|
Packit Service |
17f749 |
|
|
Packit Service |
17f749 |
tm->time_type = MYSQL_TIMESTAMP_TIME;
|
|
Packit Service |
17f749 |
MaBind->buffer_type= MYSQL_TYPE_TIME;
|
|
Packit Service |
17f749 |
}
|
|
Packit Service |
17f749 |
|
|
Packit Service |
17f749 |
tm->hour= ts->hour;
|
|
Packit Service |
17f749 |
tm->minute= ts->minute;
|
|
Packit Service |
17f749 |
tm->second= ts->second;
|
|
Packit Service |
17f749 |
|
|
Packit Service |
17f749 |
tm->second_part= 0;
|
|
Packit Service |
17f749 |
|
|
Packit Service |
17f749 |
*LengthPtr= sizeof(MYSQL_TIME);
|
|
Packit Service |
17f749 |
|
|
Packit Service |
17f749 |
return SQL_SUCCESS;
|
|
Packit Service |
17f749 |
}
|
|
Packit Service |
17f749 |
/* }}} */
|
|
Packit Service |
17f749 |
|
|
Packit Service |
17f749 |
/* {{{ MADB_IntervalHtoMS2Sql */
|
|
Packit Service |
17f749 |
SQLRETURN MADB_IntervalHtoMS2Sql(MADB_Stmt *Stmt, MADB_DescRecord *CRec, void* DataPtr, SQLLEN Length,
|
|
Packit Service |
17f749 |
MADB_DescRecord *SqlRec, MYSQL_BIND *MaBind, void **Buffer, unsigned long *LengthPtr)
|
|
Packit Service |
17f749 |
{
|
|
Packit Service |
17f749 |
MYSQL_TIME *tm= NULL;
|
|
Packit Service |
17f749 |
SQL_INTERVAL_STRUCT *is= (SQL_INTERVAL_STRUCT *)DataPtr;
|
|
Packit Service |
17f749 |
|
|
Packit Service |
17f749 |
if (*Buffer == NULL)
|
|
Packit Service |
17f749 |
{
|
|
Packit Service |
17f749 |
tm= (MYSQL_TIME*)MADB_GetBufferForSqlValue(Stmt, CRec, sizeof(MYSQL_TIME));
|
|
Packit Service |
17f749 |
if (tm == NULL)
|
|
Packit Service |
17f749 |
{
|
|
Packit Service |
17f749 |
/* Error is set in function responsible for allocation */
|
|
Packit Service |
17f749 |
return Stmt->Error.ReturnValue;
|
|
Packit Service |
17f749 |
}
|
|
Packit Service |
17f749 |
*Buffer= tm;
|
|
Packit Service |
17f749 |
}
|
|
Packit Service |
17f749 |
else
|
|
Packit Service |
17f749 |
{
|
|
Packit Service |
17f749 |
tm= *Buffer;
|
|
Packit Service |
17f749 |
}
|
|
Packit Service |
17f749 |
|
|
Packit Service |
17f749 |
tm->hour= is->intval.day_second.hour;
|
|
Packit Service |
17f749 |
tm->minute= is->intval.day_second.minute;
|
|
Packit Service |
17f749 |
tm->second= CRec->ConciseType == SQL_C_INTERVAL_HOUR_TO_SECOND ? is->intval.day_second.second : 0;
|
|
Packit Service |
17f749 |
|
|
Packit Service |
17f749 |
tm->second_part= 0;
|
|
Packit Service |
17f749 |
|
|
Packit Service |
17f749 |
tm->time_type= MYSQL_TIMESTAMP_TIME;
|
|
Packit Service |
17f749 |
MaBind->buffer_type= MYSQL_TYPE_TIME;
|
|
Packit Service |
17f749 |
*LengthPtr= sizeof(MYSQL_TIME);
|
|
Packit Service |
17f749 |
|
|
Packit Service |
17f749 |
return SQL_SUCCESS;
|
|
Packit Service |
17f749 |
}
|
|
Packit Service |
17f749 |
/* }}} */
|
|
Packit Service |
17f749 |
|
|
Packit Service |
17f749 |
/* {{{ MADB_Date2Sql */
|
|
Packit Service |
17f749 |
SQLRETURN MADB_Date2Sql(MADB_Stmt *Stmt, MADB_DescRecord *CRec, void* DataPtr, SQLLEN Length,
|
|
Packit Service |
17f749 |
MADB_DescRecord *SqlRec, MYSQL_BIND *MaBind, void **Buffer, unsigned long *LengthPtr)
|
|
Packit Service |
17f749 |
{
|
|
Packit Service |
17f749 |
MYSQL_TIME *tm= NULL, **BuffPtr= (MYSQL_TIME**)Buffer;
|
|
Packit Service |
17f749 |
SQL_DATE_STRUCT *ts= (SQL_DATE_STRUCT *)DataPtr;
|
|
Packit Service |
17f749 |
|
|
Packit Service |
17f749 |
if (*BuffPtr == NULL)
|
|
Packit Service |
17f749 |
{
|
|
Packit Service |
17f749 |
tm= (MYSQL_TIME*)MADB_GetBufferForSqlValue(Stmt, CRec, sizeof(MYSQL_TIME));
|
|
Packit Service |
17f749 |
if (tm == NULL)
|
|
Packit Service |
17f749 |
{
|
|
Packit Service |
17f749 |
/* Error is set in function responsible for allocation */
|
|
Packit Service |
17f749 |
return Stmt->Error.ReturnValue;
|
|
Packit Service |
17f749 |
}
|
|
Packit Service |
17f749 |
*BuffPtr= tm;
|
|
Packit Service |
17f749 |
}
|
|
Packit Service |
17f749 |
else
|
|
Packit Service |
17f749 |
{
|
|
Packit Service |
17f749 |
tm= *BuffPtr;
|
|
Packit Service |
17f749 |
}
|
|
Packit Service |
17f749 |
|
|
Packit Service |
17f749 |
tm->year= ts->year;
|
|
Packit Service |
17f749 |
tm->month= ts->month;
|
|
Packit Service |
17f749 |
tm->day= ts->day;
|
|
Packit Service |
17f749 |
|
|
Packit Service |
17f749 |
tm->hour= tm->minute= tm->second= tm->second_part= 0;
|
|
Packit Service |
17f749 |
tm->time_type= MYSQL_TIMESTAMP_DATE;
|
|
Packit Service |
17f749 |
|
|
Packit Service |
17f749 |
MaBind->buffer_type= MYSQL_TYPE_DATE;
|
|
Packit Service |
17f749 |
*LengthPtr= sizeof(MYSQL_TIME);
|
|
Packit Service |
17f749 |
|
|
Packit Service |
17f749 |
return SQL_SUCCESS;
|
|
Packit Service |
17f749 |
}
|
|
Packit Service |
17f749 |
/* }}} */
|
|
Packit Service |
17f749 |
|
|
Packit Service |
17f749 |
/* {{{ MADB_ConvertC2Sql */
|
|
Packit Service |
17f749 |
SQLRETURN MADB_ConvertC2Sql(MADB_Stmt *Stmt, MADB_DescRecord *CRec, void* DataPtr, SQLLEN Length,
|
|
Packit Service |
17f749 |
MADB_DescRecord *SqlRec, MYSQL_BIND *MaBind, void **Buffer, unsigned long *LengthPtr)
|
|
Packit Service |
17f749 |
{
|
|
Packit Service |
17f749 |
if (Buffer == NULL)
|
|
Packit Service |
17f749 |
{
|
|
Packit Service |
17f749 |
MaBind->buffer= NULL;
|
|
Packit Service |
17f749 |
Buffer= &MaBind->buffer;
|
|
Packit Service |
17f749 |
}
|
|
Packit Service |
17f749 |
if (LengthPtr == NULL)
|
|
Packit Service |
17f749 |
{
|
|
Packit Service |
17f749 |
LengthPtr= &MaBind->buffer_length;
|
|
Packit Service |
17f749 |
}
|
|
Packit Service |
17f749 |
/* Switch to fill BIND structures based on C and SQL type */
|
|
Packit Service |
17f749 |
switch (CRec->ConciseType)
|
|
Packit Service |
17f749 |
{
|
|
Packit Service |
17f749 |
case WCHAR_TYPES:
|
|
Packit Service |
17f749 |
RETURN_ERROR_OR_CONTINUE(MADB_Wchar2Sql(Stmt, CRec, DataPtr, Length, SqlRec, MaBind, Buffer, LengthPtr));
|
|
Packit Service |
17f749 |
break;
|
|
Packit Service |
17f749 |
case CHAR_BINARY_TYPES:
|
|
Packit Service |
17f749 |
RETURN_ERROR_OR_CONTINUE(MADB_Char2Sql(Stmt, CRec, DataPtr, Length, SqlRec, MaBind, Buffer, LengthPtr));
|
|
Packit Service |
17f749 |
break;
|
|
Packit Service |
17f749 |
case SQL_C_NUMERIC:
|
|
Packit Service |
17f749 |
RETURN_ERROR_OR_CONTINUE(MADB_Numeric2Sql(Stmt, CRec, DataPtr, Length, SqlRec, MaBind, Buffer, LengthPtr));
|
|
Packit Service |
17f749 |
break;
|
|
Packit Service |
17f749 |
case SQL_C_TIMESTAMP:
|
|
Packit Service |
17f749 |
case SQL_TYPE_TIMESTAMP:
|
|
Packit Service |
17f749 |
RETURN_ERROR_OR_CONTINUE(MADB_Timestamp2Sql(Stmt, CRec, DataPtr, Length, SqlRec, MaBind, Buffer, LengthPtr));
|
|
Packit Service |
17f749 |
break;
|
|
Packit Service |
17f749 |
case SQL_C_TIME:
|
|
Packit Service |
17f749 |
case SQL_C_TYPE_TIME:
|
|
Packit Service |
17f749 |
RETURN_ERROR_OR_CONTINUE(MADB_Time2Sql(Stmt, CRec, DataPtr, Length, SqlRec, MaBind, Buffer, LengthPtr));
|
|
Packit Service |
17f749 |
break;
|
|
Packit Service |
17f749 |
case SQL_C_INTERVAL_HOUR_TO_MINUTE:
|
|
Packit Service |
17f749 |
case SQL_C_INTERVAL_HOUR_TO_SECOND:
|
|
Packit Service |
17f749 |
RETURN_ERROR_OR_CONTINUE(MADB_IntervalHtoMS2Sql(Stmt, CRec, DataPtr, Length, SqlRec, MaBind, Buffer, LengthPtr));
|
|
Packit Service |
17f749 |
break;
|
|
Packit Service |
17f749 |
case SQL_C_DATE:
|
|
Packit Service |
17f749 |
case SQL_TYPE_DATE:
|
|
Packit Service |
17f749 |
RETURN_ERROR_OR_CONTINUE(MADB_Date2Sql(Stmt, CRec, DataPtr, Length, SqlRec, MaBind, Buffer, LengthPtr));
|
|
Packit Service |
17f749 |
break;
|
|
Packit Service |
17f749 |
default:
|
|
Packit Service |
17f749 |
/* memset(MaBind, 0, sizeof(MYSQL_BIND));
|
|
Packit Service |
17f749 |
MaBind->buffer_length= 0; */
|
|
Packit Service |
17f749 |
MaBind->buffer_type= 0;
|
|
Packit Service |
17f749 |
MaBind->is_unsigned= 0;
|
|
Packit Service |
17f749 |
|
|
Packit Service |
17f749 |
*LengthPtr= (unsigned long)Length;
|
|
Packit Service |
17f749 |
MaBind->buffer_type= MADB_GetMaDBTypeAndLength(CRec->ConciseType,
|
|
Packit Service |
17f749 |
&MaBind->is_unsigned, &MaBind->buffer_length);
|
|
Packit Service |
17f749 |
|
|
Packit Service |
17f749 |
if (!CRec->OctetLength)
|
|
Packit Service |
17f749 |
{
|
|
Packit Service |
17f749 |
CRec->OctetLength= MaBind->buffer_length;
|
|
Packit Service |
17f749 |
}
|
|
Packit Service |
17f749 |
*Buffer= DataPtr;
|
|
Packit Service |
17f749 |
} /* End of switch (CRec->ConsiseType) */
|
|
Packit Bot |
ff6dbd |
/* We need it in case SQL_SUCCESS_WITH_INFO was set, we can't just return SQL_SUCCESS */
|
|
Packit Bot |
ff6dbd |
return Stmt->Error.ReturnValue;
|
|
Packit Service |
17f749 |
}
|
|
Packit Service |
17f749 |
/* }}} */
|
|
Packit Service |
17f749 |
|
|
Packit Service |
17f749 |
/* {{{ MADB_C2SQL */
|
|
Packit Service |
17f749 |
/* Main entrance function for C type to SQL type conversion*/
|
|
Packit Service |
17f749 |
SQLRETURN MADB_C2SQL(MADB_Stmt* Stmt, MADB_DescRecord *CRec, MADB_DescRecord *SqlRec, SQLULEN ParamSetIdx, MYSQL_BIND *MaBind)
|
|
Packit Service |
17f749 |
{
|
|
Packit Service |
17f749 |
SQLLEN *IndicatorPtr= NULL;
|
|
Packit Service |
17f749 |
SQLLEN *OctetLengthPtr= NULL;
|
|
Packit Service |
17f749 |
void *DataPtr= NULL;
|
|
Packit Service |
17f749 |
SQLLEN Length= 0;
|
|
Packit Service |
17f749 |
|
|
Packit Service |
17f749 |
IndicatorPtr= (SQLLEN *)GetBindOffset(Stmt->Apd, CRec, CRec->IndicatorPtr, ParamSetIdx, sizeof(SQLLEN));
|
|
Packit Service |
17f749 |
OctetLengthPtr= (SQLLEN *)GetBindOffset(Stmt->Apd, CRec, CRec->OctetLengthPtr, ParamSetIdx, sizeof(SQLLEN));
|
|
Packit Service |
17f749 |
|
|
Packit Service |
17f749 |
if (PARAM_IS_DAE(OctetLengthPtr))
|
|
Packit Service |
17f749 |
{
|
|
Packit Service |
17f749 |
if (!DAE_DONE(Stmt))
|
|
Packit Service |
17f749 |
{
|
|
Packit Service |
17f749 |
return SQL_NEED_DATA;
|
|
Packit Service |
17f749 |
}
|
|
Packit Service |
17f749 |
else
|
|
Packit Service |
17f749 |
{
|
|
Packit Service |
17f749 |
MaBind->buffer_type= MADB_GetMaDBTypeAndLength(CRec->ConciseType, &MaBind->is_unsigned, &MaBind->buffer_length);
|
|
Packit Service |
17f749 |
/* I guess we can leave w/out this. Keeping it so far for safety */
|
|
Packit Service |
17f749 |
MaBind->long_data_used= '\1';
|
|
Packit Service |
17f749 |
return SQL_SUCCESS;
|
|
Packit Service |
17f749 |
}
|
|
Packit Service |
17f749 |
} /* -- End of DAE parameter processing -- */
|
|
Packit Service |
17f749 |
|
|
Packit Service |
17f749 |
if (IndicatorPtr && MADB_ProcessIndicator(Stmt, *IndicatorPtr, CRec->DefaultValue, MaBind))
|
|
Packit Service |
17f749 |
{
|
|
Packit Service |
17f749 |
return SQL_SUCCESS;
|
|
Packit Service |
17f749 |
}
|
|
Packit Service |
17f749 |
|
|
Packit Service |
17f749 |
/* -- Special cases are done, i.e. not a DAE etc, general case -- */
|
|
Packit Service |
17f749 |
|
|
Packit Service |
17f749 |
DataPtr= GetBindOffset(Stmt->Apd, CRec, CRec->DataPtr, ParamSetIdx, CRec->OctetLength);
|
|
Packit Service |
17f749 |
|
|
Packit Service |
17f749 |
/* If indicator wasn't NULL_DATA, but data pointer is still NULL, we convert NULL value */
|
|
Packit Service |
17f749 |
if (!DataPtr)
|
|
Packit Service |
17f749 |
{
|
|
Packit Service |
17f749 |
return MADB_ConvertNullValue(Stmt, MaBind);
|
|
Packit Service |
17f749 |
}
|
|
Packit Service |
17f749 |
|
|
Packit Service |
17f749 |
Length= MADB_CalculateLength(Stmt, OctetLengthPtr, CRec, DataPtr);
|
|
Packit Service |
17f749 |
|
|
Packit Service |
17f749 |
RETURN_ERROR_OR_CONTINUE(MADB_ConvertC2Sql(Stmt, CRec, DataPtr, Length, SqlRec, MaBind, NULL, NULL));
|
|
Packit Bot |
ff6dbd |
/* We need it in case SUCCESS_WITH_INFO was set */
|
|
Packit Bot |
ff6dbd |
return Stmt->Error.ReturnValue;
|
|
Packit Service |
17f749 |
}
|
|
Packit Service |
17f749 |
/* }}} */
|