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; } }
/* {{{ 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; }
/* {{{ 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; }
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); }
/* {{{ 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; }
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; }
/* {{{ 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; }
/* {{{ 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); }