/* {{{ MADB_GetDiagRec */ SQLRETURN MADB_GetDiagRec(MADB_Error *Err, SQLSMALLINT RecNumber, void *SQLState, SQLINTEGER *NativeErrorPtr, void *MessageText, SQLSMALLINT BufferLength, SQLSMALLINT *TextLengthPtr, my_bool isWChar, SQLINTEGER OdbcVersion) { MADB_Error InternalError; char *SqlStateVersion= Err->SqlState; SQLSMALLINT Length= 0; InternalError.PrefixLen= 0; MADB_CLEAR_ERROR(&InternalError); if (RecNumber > 1) return SQL_NO_DATA; /* check if we have to map the SQLState to ODBC version 2 state */ if (OdbcVersion == SQL_OV_ODBC2) { int i=0; while (MADB_ErrorList[i].SqlState) { if (strcmp(Err->SqlState, MADB_ErrorList[i].SqlState) == 0) { if (MADB_ErrorList[i].SqlStateV2[0]) SqlStateVersion= MADB_ErrorList[i].SqlStateV2; break; } i++; } } if (NativeErrorPtr) *NativeErrorPtr= Err->NativeError; if (SQLState) MADB_SetString(isWChar ? &utf8 : 0, (void *)SQLState, SQL_SQLSTATE_SIZE + 1, SqlStateVersion, SQL_SQLSTATE_SIZE, &InternalError); if (MessageText) Length= (SQLSMALLINT)MADB_SetString(isWChar ? &utf8 : 0, (void*)MessageText, BufferLength, Err->SqlErrorMsg, strlen(Err->SqlErrorMsg), &InternalError); if (TextLengthPtr) *TextLengthPtr= (SQLSMALLINT)strlen(Err->SqlErrorMsg); if (!MessageText || !BufferLength) return SQL_SUCCESS; return InternalError.ReturnValue; }
SQLRETURN MADB_DescGetRec(MADB_Desc *Desc, SQLSMALLINT RecNumber, SQLCHAR *Name, SQLSMALLINT BufferLength, SQLSMALLINT *StringLengthPtr, SQLSMALLINT *TypePtr, SQLSMALLINT *SubTypePtr, SQLLEN *LengthPtr, SQLSMALLINT *PrecisionPtr, SQLSMALLINT *ScalePtr, SQLSMALLINT *NullablePtr, BOOL isWChar) { MADB_DescRecord *Record; SQLLEN Length; MADB_CLEAR_ERROR(&Desc->Error); if (!(Record= MADB_DescGetInternalRecord(Desc, RecNumber, MADB_DESC_READ))) { MADB_SetError(&Desc->Error, MADB_ERR_07009, NULL, 0); return Desc->Error.ReturnValue; } /* SQL_DESC_NAME */ Length= MADB_SetString(isWChar ? CP_UTF8 : 0, Name, BufferLength, Record->BaseColumnName, SQL_NTS, &Desc->Error); if (StringLengthPtr) *StringLengthPtr= (SQLSMALLINT)Length; Record->Unnamed= SQL_NAMED; /* SQL_DESC_TYPE */ *(SQLSMALLINT *)TypePtr= (SQLSMALLINT)Record->Type; /* SQL_DESC_DATETIME_INTERVAL_CODE */ *(SQLSMALLINT *)SubTypePtr= Record->DateTimeIntervalCode; /* SQL_DESC_OCTET_LENGTH */ *(SQLLEN *)LengthPtr= (SQLLEN)Record->OctetLength; /* SQL_DESC_PRECISION */ *(SQLSMALLINT *)PrecisionPtr= (SQLSMALLINT)Record->Precision; /* SQL_DESC_SCALE */ *(SQLSMALLINT *)ScalePtr= (SQLSMALLINT)Record->Scale; /* SQL_DESC_NULLABLE */ *(SQLSMALLINT *)NullablePtr= (SQLSMALLINT)Record->Nullable; return SQL_SUCCESS; }
/* {{{ MADB_GetDiagField */ SQLRETURN MADB_GetDiagField(SQLSMALLINT HandleType, SQLHANDLE Handle, SQLSMALLINT RecNumber, SQLSMALLINT DiagIdentifier, SQLPOINTER DiagInfoPtr, SQLSMALLINT BufferLength, SQLSMALLINT *StringLengthPtr, my_bool isWChar) { MADB_Error *Err= NULL; MADB_Stmt *Stmt= NULL; MADB_Desc *Desc= NULL; MADB_Dbc *Dbc= NULL; MADB_Env *Env= NULL; MADB_Error Error; SQLLEN Length; if (StringLengthPtr) *StringLengthPtr= 0; Error.PrefixLen= 0; MADB_CLEAR_ERROR(&Error); if (RecNumber > 1) return SQL_NO_DATA; switch(HandleType) { case SQL_HANDLE_DBC: Dbc= (MADB_Dbc *)Handle; Err= &Dbc->Error; break; case SQL_HANDLE_STMT: Stmt= (MADB_Stmt *)Handle; Err= &Stmt->Error; break; case SQL_HANDLE_ENV: Env= (MADB_Env *)Handle; Err= &Env->Error; break; case SQL_HANDLE_DESC: Desc= (MADB_Desc *)Handle; Err= &Desc->Error; break; default: return SQL_INVALID_HANDLE; } switch(DiagIdentifier) { case SQL_DIAG_CURSOR_ROW_COUNT: if (!Stmt) return SQL_ERROR; *(SQLLEN *)DiagInfoPtr= (Stmt->result) ?(SQLLEN)mysql_stmt_num_rows(Stmt->stmt) : 0; break; case SQL_DIAG_DYNAMIC_FUNCTION: if (!Stmt) return SQL_ERROR; /* Todo */ break; case SQL_DIAG_DYNAMIC_FUNCTION_CODE: if (!Stmt) return SQL_ERROR; *(SQLINTEGER *)DiagInfoPtr= 0; break; case SQL_DIAG_NUMBER: *(SQLINTEGER *)DiagInfoPtr= 1; break; case SQL_DIAG_RETURNCODE: *(SQLRETURN *)DiagInfoPtr= Err->ReturnValue; break; case SQL_DIAG_ROW_COUNT: if (HandleType != SQL_HANDLE_STMT || !Stmt) return SQL_ERROR; *(SQLLEN *)DiagInfoPtr= (Stmt->stmt) ? (SQLLEN)mysql_stmt_affected_rows(Stmt->stmt) : 0; break; case SQL_DIAG_CLASS_ORIGIN: Length= MADB_SetString(isWChar ? &utf8 : 0, DiagInfoPtr, isWChar ? BufferLength / sizeof(SQLWCHAR) : BufferLength, strncmp(Err->SqlState, "IM", 2)== 0 ? "ODBC 3.0" : "ISO 9075", SQL_NTS, &Error); if (StringLengthPtr) *StringLengthPtr= (SQLSMALLINT)Length; break; case SQL_DIAG_COLUMN_NUMBER: *(SQLINTEGER *)DiagInfoPtr= SQL_COLUMN_NUMBER_UNKNOWN; break; case SQL_DIAG_CONNECTION_NAME: /* MariaDB ODBC Driver always returns an empty string */ if (StringLengthPtr) *StringLengthPtr= 0; DiagInfoPtr= (isWChar) ? (SQLPOINTER)L"" : (SQLPOINTER)""; break; case SQL_DIAG_MESSAGE_TEXT: Length= MADB_SetString(isWChar ? &utf8 : 0, DiagInfoPtr, isWChar ? BufferLength / sizeof(SQLWCHAR) : BufferLength, Err->SqlErrorMsg, strlen(Err->SqlErrorMsg), &Error); if (StringLengthPtr) *StringLengthPtr= (SQLSMALLINT)Length; break; case SQL_DIAG_NATIVE: *(SQLINTEGER *)DiagInfoPtr= Err->NativeError; break; case SQL_DIAG_ROW_NUMBER: if (HandleType != SQL_HANDLE_STMT || RecNumber < 1) return SQL_ERROR; *(SQLLEN*)DiagInfoPtr= SQL_ROW_NUMBER_UNKNOWN; break; case SQL_DIAG_SERVER_NAME: { char *ServerName= ""; if (Stmt && Stmt->stmt) ServerName= Stmt->stmt->mysql->host; else if (Dbc && Dbc->mariadb) ServerName= Dbc->mariadb->host; Length= MADB_SetString(isWChar ? &utf8 : 0, DiagInfoPtr, isWChar ? BufferLength / sizeof(SQLWCHAR) : BufferLength, ServerName ? ServerName : "", ServerName ? strlen(ServerName) : 0, &Error); if (StringLengthPtr) *StringLengthPtr= (SQLSMALLINT)Length; } break; case SQL_DIAG_SQLSTATE: Length= MADB_SetString(isWChar ? &utf8 : 0, DiagInfoPtr, isWChar ? BufferLength / sizeof(SQLWCHAR) : BufferLength, Err->SqlState, strlen(Err->SqlState), &Error); if (StringLengthPtr) *StringLengthPtr= (SQLSMALLINT)Length; break; case SQL_DIAG_SUBCLASS_ORIGIN: Length= MADB_SetString(isWChar ? &utf8 : 0, DiagInfoPtr, isWChar ? BufferLength / sizeof(SQLWCHAR) : BufferLength, "ODBC 3.0", 8, &Error); if (StringLengthPtr) *StringLengthPtr= (SQLSMALLINT)Length; break; default: return SQL_ERROR; } if (isWChar && StringLengthPtr) *StringLengthPtr*= sizeof(SQLWCHAR); return Error.ReturnValue; }
/* {{{ MADB_DescGetField */ SQLRETURN MADB_DescGetField(SQLHDESC DescriptorHandle, SQLSMALLINT RecNumber, SQLSMALLINT FieldIdentifier, SQLPOINTER ValuePtr, SQLINTEGER BufferLength, SQLINTEGER *StringLengthPtr, my_bool isWChar) { MADB_Desc *Desc= (MADB_Desc *)DescriptorHandle; MADB_DescRecord *DescRecord= NULL; SQLRETURN ret; size_t Length; /* Bookmark */ if (RecNumber < 1) { /* todo */ } ret= MADB_DeskCheckFldId(Desc, FieldIdentifier, MADB_DESC_READ); if (!SQL_SUCCEEDED(ret)) return ret; MADB_CLEAR_ERROR(&Desc->Error); if (RecNumber) if (!(DescRecord= MADB_DescGetInternalRecord(Desc, RecNumber - 1, MADB_DESC_READ))) return SQL_ERROR; switch (FieldIdentifier) { case SQL_DESC_ALLOC_TYPE: *((SQLINTEGER *)ValuePtr)= Desc->Header.AllocType; break; case SQL_DESC_ARRAY_SIZE: *((SQLULEN *)ValuePtr)= Desc->Header.ArraySize; break; case SQL_DESC_ARRAY_STATUS_PTR: *((SQLPOINTER *)ValuePtr)= (SQLPOINTER)Desc->Header.ArrayStatusPtr; break; case SQL_DESC_BIND_OFFSET_PTR: *((SQLPOINTER *)ValuePtr)= (SQLPOINTER)Desc->Header.BindOffsetPtr; break; case SQL_DESC_BIND_TYPE: *((SQLINTEGER *)ValuePtr)= Desc->Header.BindType; break; case SQL_DESC_COUNT: *(SQLINTEGER *)ValuePtr= Desc->Header.Count; break; case SQL_DESC_ROWS_PROCESSED_PTR: *((SQLPOINTER *)ValuePtr)= (SQLPOINTER)Desc->Header.RowsProcessedPtr; break; case SQL_DESC_AUTO_UNIQUE_VALUE: *((SQLINTEGER *)ValuePtr)= DescRecord->AutoUniqueValue; break; case SQL_DESC_BASE_COLUMN_NAME: Length= MADB_SetString(isWChar ? CP_UTF8 : 0, ValuePtr, BufferLength, DescRecord->BaseColumnName, SQL_NTS, &Desc->Error); if (StringLengthPtr) *StringLengthPtr= Length; break; case SQL_DESC_BASE_TABLE_NAME: Length= MADB_SetString(isWChar ? CP_UTF8 : 0, ValuePtr, BufferLength, DescRecord->BaseTableName, SQL_NTS, &Desc->Error); if (StringLengthPtr) *StringLengthPtr= Length; break; case SQL_DESC_CASE_SENSITIVE: *((SQLINTEGER *)ValuePtr)= DescRecord->CaseSensitive; break; case SQL_DESC_CATALOG_NAME: Length= MADB_SetString(isWChar ? CP_UTF8 : 0, ValuePtr, BufferLength, DescRecord->BaseCatalogName, SQL_NTS, &Desc->Error); if (StringLengthPtr) *StringLengthPtr= Length; break; case SQL_DESC_CONCISE_TYPE: *((SQLSMALLINT *)ValuePtr)= DescRecord->ConciseType; break; case SQL_DESC_DATA_PTR: *((SQLPOINTER *)ValuePtr)= (SQLPOINTER)DescRecord->DataPtr; break; case SQL_DESC_DATETIME_INTERVAL_CODE: *((SQLSMALLINT *)ValuePtr)= DescRecord->DateTimeIntervalCode; break; case SQL_DESC_DATETIME_INTERVAL_PRECISION: *((SQLINTEGER *)ValuePtr)= DescRecord->DateTimeIntervalPrecision; break; case SQL_DESC_FIXED_PREC_SCALE: *((SQLINTEGER *)ValuePtr)= DescRecord->FixedPrecScale; break; case SQL_DESC_INDICATOR_PTR: *((SQLPOINTER *)ValuePtr)= (SQLPOINTER)DescRecord->IndicatorPtr; break; case SQL_DESC_LENGTH: *((SQLINTEGER *)ValuePtr)= DescRecord->DescLength; break; case SQL_DESC_LITERAL_PREFIX: *((SQLPOINTER *)ValuePtr)= (SQLPOINTER)DescRecord->LiteralPrefix; break; case SQL_DESC_LITERAL_SUFFIX: *((SQLPOINTER *)ValuePtr)= (SQLPOINTER)DescRecord->LiteralSuffix; break; case SQL_DESC_LOCAL_TYPE_NAME: Length= MADB_SetString(isWChar ? CP_UTF8 : 0, ValuePtr, BufferLength, DescRecord->LocalTypeName, SQL_NTS, &Desc->Error); if (StringLengthPtr) *StringLengthPtr= Length; break; case SQL_DESC_NAME: Length= MADB_SetString(isWChar ? CP_UTF8 : 0, ValuePtr, BufferLength, DescRecord->BaseColumnName, SQL_NTS, &Desc->Error); if (StringLengthPtr) *StringLengthPtr= Length; DescRecord->Unnamed= SQL_NAMED; break; case SQL_DESC_NULLABLE: *((SQLINTEGER *)ValuePtr)= DescRecord->Nullable; break; case SQL_DESC_NUM_PREC_RADIX: *((SQLINTEGER *)ValuePtr)= DescRecord->NumPrecRadix; break; case SQL_DESC_OCTET_LENGTH: *((SQLINTEGER *)ValuePtr)= DescRecord->OctetLength; break; case SQL_DESC_OCTET_LENGTH_PTR: *((SQLPOINTER *)ValuePtr)= (SQLPOINTER)DescRecord->OctetLengthPtr; break; case SQL_DESC_PARAMETER_TYPE: *((SQLINTEGER *)ValuePtr)= DescRecord->ParameterType; break; case SQL_DESC_PRECISION: *((SQLINTEGER *)ValuePtr)= DescRecord->Precision; break; #if (ODBCVER >= 0x0350) case SQL_DESC_ROWVER: *((SQLPOINTER *)ValuePtr)= (SQLPOINTER)DescRecord->RowVer; break; #endif case SQL_DESC_SCALE: *((SQLINTEGER *)ValuePtr)= DescRecord->Scale; break; case SQL_DESC_SCHEMA_NAME: Length= MADB_SetString(isWChar ? CP_UTF8 : 0, ValuePtr, BufferLength, DescRecord->SchemaName, SQL_NTS, &Desc->Error); if (StringLengthPtr) *StringLengthPtr= Length; break; case SQL_DESC_SEARCHABLE: *((SQLINTEGER *)ValuePtr)= DescRecord->Searchable; break; case SQL_DESC_TABLE_NAME: Length= MADB_SetString(isWChar ? CP_UTF8 : 0, ValuePtr, BufferLength, DescRecord->TableName, SQL_NTS, &Desc->Error); if (StringLengthPtr) *StringLengthPtr= Length; break; case SQL_DESC_TYPE: *((SQLINTEGER *)ValuePtr)= DescRecord->Type; break; case SQL_DESC_TYPE_NAME: *StringLengthPtr= MADB_SetString(isWChar ? CP_UTF8 : 0, ValuePtr, BufferLength, DescRecord->TypeName, SQL_NTS, &Desc->Error); break; case SQL_DESC_UNSIGNED: *((SQLINTEGER *)ValuePtr)= DescRecord->Unsigned; break; case SQL_DESC_UPDATABLE: *((SQLINTEGER *)ValuePtr)= DescRecord->Updateable; break; } return ret; }