Blame ma_typeconv.c

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
/* }}} */