Пример #1
0
void MADB_CleanBulkOperData(MADB_Stmt *Stmt, unsigned int ParamOffset)
{
  if (MADB_DOING_BULK_OPER(Stmt))
  {
    MADB_DescRecord *CRec;
    void            *DataPtr= NULL;
    MYSQL_BIND      *MaBind= NULL;
    int             i;

    for (i= ParamOffset; i < MADB_STMT_PARAM_COUNT(Stmt); ++i)
    {
      if (CRec= MADB_DescGetInternalRecord(Stmt->Apd, i, MADB_DESC_READ))
      {
        MaBind= &Stmt->params[i - ParamOffset];
        DataPtr= GetBindOffset(Stmt->Apd, CRec, CRec->DataPtr, 0, CRec->OctetLength);

        if (MaBind->buffer != DataPtr)
        {
          switch (CRec->ConciseType)
          {
          case DATETIME_TYPES:
            if (CanUseStructArrForDatetime(Stmt) == FALSE)
            {
              MADB_FREE(MaBind->buffer);
              break;
            }
            /* Otherwise falling through and do the same as for others */
          case SQL_C_WCHAR:
          case SQL_C_NUMERIC:
          {
            unsigned int i;
            for (i= 0; i < Stmt->Bulk.ArraySize; ++i)
            {
              MADB_FREE(((char**)MaBind->buffer)[i]);
            }
          }
          /* falling through */
          default:
            MADB_FREE(MaBind->buffer);
          }
        }

        MADB_FREE(MaBind->length);

        MADB_FREE(MaBind->u.indicator);
      }
    }
    Stmt->Bulk.ArraySize= 0;
    Stmt->Bulk.HasRowsToSkip= 0;
  }
}
Пример #2
0
/* {{{ MADB_DescFree */
SQLRETURN MADB_DescFree(MADB_Desc *Desc, my_bool RecordsOnly)
{
  MADB_DescRecord *Record;
  unsigned int i;

  if (!Desc)
    return SQL_ERROR;

  /* We need to free internal pointers first */
  for (i=0; i < Desc->Records.elements; i++)
  {
    Record= ((MADB_DescRecord *)Desc->Records.buffer) + i;
    MADB_FREE(Record->InternalBuffer);
    MADB_FREE(Record->DefaultValue);
 
   if (Desc->DescType == MADB_DESC_IRD)
    {
      MADB_FREE(Record->CatalogName);
      MADB_FREE(Record->BaseCatalogName);
      MADB_FREE(Record->BaseColumnName);
      MADB_FREE(Record->BaseTableName);
      MADB_FREE(Record->ColumnName);
      MADB_FREE(Record->TableName);
      MADB_FREE(Record->TypeName);

    }
  }
  delete_dynamic(&Desc->Records);
  for (i=0; i < Desc->Stmts.elements; i++)
  {
    MADB_Stmt **XStmt= ((MADB_Stmt **)Desc->Stmts.buffer) + i;
    MADB_Stmt *Stmt= *XStmt;
    switch(Desc->DescType) {
    case MADB_DESC_ARD:
      Stmt->Ard=Stmt->IArd;
      break;
    case MADB_DESC_APD:
      Stmt->Apd= Stmt->IApd;
      break;
    }
  }
  delete_dynamic(&Desc->Stmts);
  if (Desc->AppType)
  {
    Desc->Dbc->Descrs= list_delete(Desc->Dbc->Stmts, &Desc->ListItem);
  }
  if (!RecordsOnly)
    MADB_FREE(Desc);
  return SQL_SUCCESS;
}
Пример #3
0
/* {{{ MADB_DsnStoreValue */
my_bool MADB_DsnStoreValue(MADB_Dsn *Dsn, size_t Offset, char *Value, int Type, my_bool OverWrite)
{
  if (!Dsn)
    return FALSE;

  switch(Type) {
  case DSN_TYPE_STRING:
  case DSN_TYPE_COMBO:
    {
      char **p= (char **)((char *)Dsn +Offset);
      char *current= *p;

      if (current && OverWrite == FALSE)
        break;
      /* For the case of making copy of currently stored values */
       *p= _strdup(Value);
       MADB_FREE(current);
    }
    break;
  case DSN_TYPE_BOOL:
    if (*(my_bool *)((char *)Dsn +Offset) && OverWrite == FALSE)
      break;
    /* *(my_bool *)((char *)Dsn +Offset)= atoi(Value); */
    Dsn->Options+= atoi(Value);
    break;
  case DSN_TYPE_INT:
    if (*(int *)((char *)Dsn +Offset) && OverWrite == FALSE)
      break;
     *(int *)((char *)Dsn + Offset)= atoi(Value);
     break; 
  }
  return TRUE;
}
Пример #4
0
void CloseMultiStatements(MADB_Stmt *Stmt)
{
  unsigned int i;

  for (i=0; i < Stmt->MultiStmtCount; ++i)
    mysql_stmt_close(Stmt->MultiStmts[i]);
  MADB_FREE(Stmt->MultiStmts);
}
Пример #5
0
/* {{{ MADB_ParseString */
my_bool MADB_ParseDSNString(MADB_Dsn *Dsn, char *String, size_t Length, char Delimiter)
{
  char *Buffer, *Key, *Value;
  my_bool ret;
  if (!String)
    return FALSE;

  if (Length == SQL_NTS)
    Length= strlen(String);

  Buffer= _strdup(String);
  Key= Buffer;

  while (Key && Key < ((char *)Buffer + Length))
  {
    int i= 0;
    if (!(Value= strchr(Key, '=')))
    {
      ret= FALSE;
      break;
    }
    *Value= 0;
    Value++;
    Key= trim(Key);
    while (DsnKeys[i].DsnKey)
    {
      if (_stricmp(DsnKeys[i].DsnKey, Key) == 0)
      {
        char *p;
        my_bool special= FALSE;
        Value= trim(Value);
        if (Value[0] == '{')
        {
          ++Value;
          if ((p = strchr(Value, '}')))
          {
            *p= 0;
            special= TRUE;
          }
        }
        else if ((p= strchr(Value, ';')))
          *p= 0;
        Value= trim(Value);

        if (!MADB_DsnStoreValue(Dsn, DsnKeys[i].DsnOffset, Value, DsnKeys[i].Type, FALSE))
          return FALSE;
        if (p)
          *p= (special) ? ' ' : ';';
        break;
      }
      ++i;
    }
    if ((Key= strchr(Value, ';')))
      ++Key;
  }
  MADB_FREE(Buffer);
  return TRUE;
}
Пример #6
0
void CloseMultiStatements(MADB_Stmt *Stmt)
{
  unsigned int i;

  for (i=0; i < STMT_COUNT(Stmt->Query); ++i)
  {
    MDBUG_C_PRINT(Stmt->Connection, "-->closing %0x", Stmt->MultiStmts[i]);
    if (Stmt->MultiStmts[i] != NULL)
    {
      mysql_stmt_close(Stmt->MultiStmts[i]);
    }
  }
  MADB_FREE(Stmt->MultiStmts);
  Stmt->stmt= NULL;
}
Пример #7
0
/* {{{ MADB_DescInit */
MADB_Desc *MADB_DescInit(MADB_Dbc *Dbc,enum enum_madb_desc_type DescType, my_bool isExternal)
{
  MADB_Desc *Desc;
  
  if (!(Desc= (MADB_Desc *)MADB_CALLOC(sizeof(MADB_Desc))))
    return NULL;

  Desc->DescType= DescType;

  if (my_init_dynamic_array(&Desc->Records, sizeof(MADB_DescRecord), 0, 0))
  {
    MADB_FREE(Desc);
    Desc= NULL;
  }
  if (isExternal)
  {
    if (my_init_dynamic_array(&Desc->Stmts, sizeof(MADB_Stmt**), 0, 0))
    {
      MADB_DescFree(Desc, FALSE);
      Desc= NULL;
    }
    else
    {
      Desc->Dbc= Dbc;
      EnterCriticalSection(&Dbc->cs);
      Desc->ListItem.data= (void *)Desc;
      Dbc->Descrs= list_add(Dbc->Descrs, &Desc->ListItem);
      LeaveCriticalSection(&Dbc->cs);
    }
  }
  if (Desc)
    Desc->AppType= isExternal;

  Desc->Header.ArraySize= 1;
 
  return Desc;
}
Пример #8
0
/* {{{ MADB_Dsn_Free */
void MADB_DSN_Free(MADB_Dsn *Dsn)
{
  if (!Dsn)
    return;

  MADB_FREE(Dsn->DSNName);
  MADB_FREE(Dsn->Driver);
  MADB_FREE(Dsn->Description);
  MADB_FREE(Dsn->ServerName);
  MADB_FREE(Dsn->UserName);
  MADB_FREE(Dsn->Password);
  MADB_FREE(Dsn->Catalog);
  MADB_FREE(Dsn->CharacterSet);
  MADB_FREE(Dsn->InitCommand);
  MADB_FREE(Dsn->TraceFile);

  if (Dsn->FreeMe)
    MADB_FREE(Dsn); 
}