Hier erst mal eine Lösung die ASCII Treiber zu verwenden.
Dazu wird eine Library erstellt der den ASCII ODBC-Treiber aufruft.
Es sind zwei Dateien
Die myodbca.pb um die Library zu erstellen und die myodbca_include um die Funktionen aufzurufen.
Die Datenbank Funktionen werden dann mit den Anhängsel "A" für ASCII aufgerufen.
Ich hoffe das bald auch Unicode auf MacOS funktioniert.
Achtung! Purebasic v5.46 erforderlich um die Library in Ascii zu erstellen
Library
Code: Alles auswählen
;-TOP
; Comment : Use AscII Database Helper (dll, so, dylib)
; Author : mk-soft
; Create : 17.01.2019
; Version : v0.3
; *****************************************************************************
CompilerIf #PB_Compiler_Unicode
CompilerError "Disable compiler option unicode!"
CompilerEndIf
CompilerIf Not #PB_Compiler_Thread
CompilerError "Enable compiler option threadsafe!"
CompilerEndIf
; *****************************************************************************
EnableExplicit
Threaded Result$
Threaded dblVal.d
Threaded fltVal.f
Threaded llVal.q
; *****************************************************************************
ProcedureDLL UseODBCDatabaseA()
ProcedureReturn UseODBCDatabase()
EndProcedure
; ---------------------------------------------------------
ProcedureDLL AffectedDatabaseRowsA(Database)
ProcedureReturn AffectedDatabaseRows(Database)
EndProcedure
; ---------------------------------------------------------
ProcedureDLL CheckDatabaseNullA(Database, Column)
ProcedureReturn CheckDatabaseNull(Database, Column)
EndProcedure
; ---------------------------------------------------------
ProcedureDLL CloseDatabaseA(Database)
ProcedureReturn CloseDatabase(Database)
EndProcedure
; ---------------------------------------------------------
ProcedureDLL DatabaseColumnIndexA(Database, ColumnName$)
ProcedureReturn DatabaseColumnIndex(Database, ColumnName$)
EndProcedure
; ---------------------------------------------------------
ProcedureDLL DatabaseColumnNameStrA(Database, Column)
Result$ = DatabaseColumnName(Database, Column)
ProcedureReturn @Result$
EndProcedure
; ---------------------------------------------------------
ProcedureDLL DatabaseColumnSizeA(Database, Column)
ProcedureReturn DatabaseColumnSize(Database, Column)
EndProcedure
; ---------------------------------------------------------
ProcedureDLL DatabaseColumnTypeA(Database, Column)
ProcedureReturn DatabaseColumnType(Database, Column)
EndProcedure
; ---------------------------------------------------------
ProcedureDLL DatabaseColumnsA(Database)
ProcedureReturn DatabaseColumns(Database)
EndProcedure
; ---------------------------------------------------------
ProcedureDLL DatabaseDriverDescriptionStrA()
Result$ = DatabaseDriverDescription()
ProcedureReturn @Result$
EndProcedure
; ---------------------------------------------------------
ProcedureDLL DatabaseDriverNameStrA()
Result$ = DatabaseDriverName()
ProcedureReturn @Result$
EndProcedure
; ---------------------------------------------------------
ProcedureDLL DatabaseErrorStrA()
Result$ = DatabaseError()
ProcedureReturn @Result$
EndProcedure
; ---------------------------------------------------------
ProcedureDLL DatabaseIDA(Database)
ProcedureReturn DatabaseID(Database)
EndProcedure
; ---------------------------------------------------------
ProcedureDLL DatabaseQueryA(Database, Request$, Flags = 0)
ProcedureReturn DatabaseQuery(Database, Request$, Flags)
EndProcedure
; ---------------------------------------------------------
ProcedureDLL DatabaseUpdateA(Database, Request$)
ProcedureReturn DatabaseUpdate(Database, Request$)
EndProcedure
; ---------------------------------------------------------
ProcedureDLL ExamineDatabaseDriversA()
ProcedureReturn ExamineDatabaseDrivers()
EndProcedure
; ---------------------------------------------------------
ProcedureDLL FinishDatabaseQueryA(Database)
ProcedureReturn FinishDatabaseQuery(Database)
EndProcedure
; ---------------------------------------------------------
ProcedureDLL FirstDatabaseRowA(Database)
ProcedureReturn FirstDatabaseRow(Database)
EndProcedure
; ---------------------------------------------------------
ProcedureDLL GetDatabaseBlobA(Database, Column, *Buffer, Bufferlength)
ProcedureReturn GetDatabaseBlob(Database, Column, *Buffer, Bufferlength)
EndProcedure
; ---------------------------------------------------------
ProcedureDLL GetDatabaseDoublePtrA(Database, Column)
dblVal = GetDatabaseDouble(Database, Column)
ProcedureReturn @dblVal
EndProcedure
; ---------------------------------------------------------
ProcedureDLL GetDatabaseFloatPtrA(Database, Column)
fltVal = GetDatabaseFloat(Database, Column)
ProcedureReturn @fltVal
EndProcedure
; ---------------------------------------------------------
ProcedureDLL GetDatabaseLongA(Database, Column)
ProcedureReturn GetDatabaseLong(Database, Column)
EndProcedure
; ---------------------------------------------------------
ProcedureDLL GetDatabaseQuadA(Database, Column)
ProcedureReturn GetDatabaseQuad(Database, Column)
EndProcedure
; ---------------------------------------------------------
ProcedureDLL GetDatabaseQuadPtrA(Database, Column)
llVal = GetDatabaseQuad(Database, Column)
ProcedureReturn @llVal
EndProcedure
; ---------------------------------------------------------
ProcedureDLL GetDatabaseStringStrA(Database, Column)
Result$ = GetDatabaseString(Database, Column)
ProcedureReturn @Result$
EndProcedure
; ---------------------------------------------------------
ProcedureDLL IsDatabaseA(Database)
ProcedureReturn IsDatabase(Database)
EndProcedure
; ---------------------------------------------------------
ProcedureDLL NextDatabaseDriverA()
ProcedureReturn NextDatabaseDriver()
EndProcedure
; ---------------------------------------------------------
ProcedureDLL NextDatabaseRowA(Database)
ProcedureReturn NextDatabaseRow(Database)
EndProcedure
; ---------------------------------------------------------
ProcedureDLL OpenDatabaseA(Database, DatabaseName$, User$, Password$ , Plugin = 1)
ProcedureReturn OpenDatabase(Database, DatabaseName$, User$, Password$ , Plugin)
EndProcedure
; ---------------------------------------------------------
ProcedureDLL OpenDatabaseRequesterA(Database, Plugin = 0)
ProcedureReturn OpenDatabaseRequester(Database, Plugin)
EndProcedure
; ---------------------------------------------------------
ProcedureDLL PreviousDatabaseRowA(Database)
ProcedureReturn PreviousDatabaseRow(Database)
EndProcedure
; ---------------------------------------------------------
ProcedureDLL SetDatabaseBlobA(Database, StatementIndex, *Buffer, BufferLength)
ProcedureReturn SetDatabaseBlob(Database, StatementIndex, *Buffer, BufferLength)
EndProcedure
; ---------------------------------------------------------
ProcedureDLL SetDatabaseDoubleA(Database, StatementIndex, Value.d)
ProcedureReturn SetDatabaseDouble(Database, StatementIndex, Value.d)
EndProcedure
; ---------------------------------------------------------
ProcedureDLL SetDatabaseFloatA(Database, StatementIndex, Value.f)
ProcedureReturn SetDatabaseFloat(Database, StatementIndex, Value.f)
EndProcedure
; ---------------------------------------------------------
ProcedureDLL SetDatabaseLongA(Database, StatementIndex, Value.l)
ProcedureReturn SetDatabaseLong(Database, StatementIndex, Value.l)
EndProcedure
; ---------------------------------------------------------
ProcedureDLL SetDatabaseNullA(Database, StatementIndex)
ProcedureReturn SetDatabaseNull(Database, StatementIndex)
EndProcedure
; ---------------------------------------------------------
ProcedureDLL SetDatabaseQuadA(Database, StatementIndex, Value.q)
ProcedureReturn SetDatabaseQuad(Database, StatementIndex, Value.q)
EndProcedure
; ---------------------------------------------------------
ProcedureDLL SetDatabaseStringA(Database, StatementIndex, Value$)
ProcedureReturn SetDatabaseString(Database, StatementIndex, Value$)
EndProcedure
; ---------------------------------------------------------
; *****************************************************************************
[/size]
Include
Code: Alles auswählen
;-TOP
;-TOP
; Comment : Use AscII Database Helper (include)
; Author : mk-soft
; Create : 17.01.2019
; Version : v0.3
; *****************************************************************************
; *****************************************************************************
Prototype protoUseODBCDatabaseA()
Prototype protoAffectedDatabaseRowsA(Database)
Prototype protoCheckDatabaseNullA(Database, Column)
Prototype protoCloseDatabaseA(Database)
Prototype protoDatabaseColumnIndexA(Database, ColumnName.p-ascii)
Prototype protoDatabaseColumnNameStrA(Database, Column)
Prototype protoDatabaseColumnSizeA(Database, Column)
Prototype protoDatabaseColumnTypeA(Database, Column)
Prototype protoDatabaseColumnsA(Database)
Prototype protoDatabaseDriverDescriptionStrA()
Prototype protoDatabaseDriverNameStrA()
Prototype protoDatabaseErrorStrA()
Prototype protoDatabaseIDA(Database)
Prototype protoDatabaseQueryA(Database, Request.p-utf8, Flags = 0)
Prototype protoDatabaseUpdateA(Database, Request.p-utf8)
Prototype protoExamineDatabaseDriversA()
Prototype protoFinishDatabaseQueryA(Database)
Prototype protoFirstDatabaseRowA(Database)
Prototype protoGetDatabaseBlobA(Database, Column, *Buffer, Bufferlength)
Prototype protoGetDatabaseDoublePtrA(Database, Column)
Prototype protoGetDatabaseFloatPtrA(Database, Column)
Prototype protoGetDatabaseLongA(Database, Column)
Prototype protoGetDatabaseQuadA(Database, Column)
Prototype protoGetDatabaseQuadPtrA(Database, Column)
Prototype protoGetDatabaseStringStrA(Database, Column)
Prototype protoIsDatabaseA(Database)
Prototype protoNextDatabaseDriverA()
Prototype protoNextDatabaseRowA(Database)
Prototype protoOpenDatabaseA(Database, DatabaseName.p-ascii, User.p-ascii, Password.p-ascii , Plugin = 1)
Prototype protoOpenDatabaseRequesterA(Database, Plugin = 0)
Prototype protoPreviousDatabaseRowA(Database)
Prototype protoSetDatabaseBlobA(Database, StatementIndex, *Buffer, BufferLength)
Prototype protoSetDatabaseDoubleA(Database, StatementIndex, Value.d)
Prototype protoSetDatabaseFloatA(Database, StatementIndex, Value.f)
Prototype protoSetDatabaseLongA(Database, StatementIndex, Value.l)
Prototype protoSetDatabaseNullA(Database, StatementIndex)
Prototype protoSetDatabaseQuadA(Database, StatementIndex, Value.q)
Prototype protoSetDatabaseStringA(Database, StatementIndex, Value.p-utf8)
; *****************************************************************************
Procedure OpenMyODBCA(Path.s = "")
Protected myodbclib.s, lib
If Bool(Path)
CompilerIf #PB_Compiler_OS = #PB_OS_Windows
If Right(Path, 1) <> "\" : Path + "\" : EndIf
CompilerElse
If Right(Path, 1) <> "/" : Path + "/" : EndIf
CompilerEndIf
EndIf
CompilerSelect #PB_Compiler_OS
CompilerCase #PB_OS_Windows
myodbclib = Path + "myodbca.dylib"
CompilerCase #PB_OS_Linux
myodbclib = Path + "myodbca.so"
CompilerCase #PB_OS_MacOS
myodbclib = Path + "myodbca.dylib"
CompilerEndSelect
lib = OpenLibrary(#PB_Any, myodbclib)
If Not lib
ProcedureReturn 0
EndIf
;
Global UseODBCDatabaseA.protoUseODBCDatabaseA = GetFunction(lib, "UseODBCDatabaseA")
Global AffectedDatabaseRowsA.protoAffectedDatabaseRowsA = GetFunction(lib, "AffectedDatabaseRowsA")
Global CheckDatabaseNullA.protoCheckDatabaseNullA = GetFunction(lib, "CheckDatabaseNullA")
Global CloseDatabaseA.protoCloseDatabaseA = GetFunction(lib, "CloseDatabaseA")
Global DatabaseColumnIndexA.protoDatabaseColumnIndexA = GetFunction(lib, "DatabaseColumnIndexA")
Global DatabaseColumnNameStrA.protoDatabaseColumnNameStrA = GetFunction(lib, "DatabaseColumnNameStrA")
Global DatabaseColumnSizeA.protoDatabaseColumnSizeA = GetFunction(lib, "DatabaseColumnSizeA")
Global DatabaseColumnTypeA.protoDatabaseColumnTypeA = GetFunction(lib, "DatabaseColumnTypeA")
Global DatabaseColumnsA.protoDatabaseColumnsA = GetFunction(lib, "DatabaseColumnsA")
Global DatabaseDriverDescriptionStrA.protoDatabaseDriverDescriptionStrA = GetFunction(lib, "DatabaseDriverDescriptionStrA")
Global DatabaseDriverNameStrA.protoDatabaseDriverNameStrA = GetFunction(lib, "DatabaseDriverNameStrA")
Global DatabaseErrorStrA.protoDatabaseErrorStrA = GetFunction(lib, "DatabaseErrorStrA")
Global DatabaseIDA.protoDatabaseIDA = GetFunction(lib, "DatabaseIDA")
Global DatabaseQueryA.protoDatabaseQueryA = GetFunction(lib, "DatabaseQueryA")
Global DatabaseUpdateA.protoDatabaseUpdateA = GetFunction(lib, "DatabaseUpdateA")
Global ExamineDatabaseDriversA.protoExamineDatabaseDriversA = GetFunction(lib, "ExamineDatabaseDriversA")
Global FinishDatabaseQueryA.protoFinishDatabaseQueryA = GetFunction(lib, "FinishDatabaseQueryA")
Global FirstDatabaseRowA.protoFirstDatabaseRowA = GetFunction(lib, "FirstDatabaseRowA")
Global GetDatabaseBlobA.protoGetDatabaseBlobA = GetFunction(lib, "GetDatabaseBlobA")
Global GetDatabaseDoublePtrA.protoGetDatabaseDoublePtrA = GetFunction(lib, "GetDatabaseDoublePtrA")
Global GetDatabaseFloatPtrA.protoGetDatabaseFloatPtrA = GetFunction(lib, "GetDatabaseFloatPtrA")
Global GetDatabaseLongA.protoGetDatabaseLongA = GetFunction(lib, "GetDatabaseLongA")
Global GetDatabaseQuadA.protoGetDatabaseQuadA = GetFunction(lib, "GetDatabaseQuadA")
Global GetDatabaseQuadPtrA.protoGetDatabaseQuadPtrA = GetFunction(lib, "GetDatabaseQuadPtrA")
Global GetDatabaseStringStrA.protoGetDatabaseStringStrA = GetFunction(lib, "GetDatabaseStringStrA")
Global IsDatabaseA.protoIsDatabaseA = GetFunction(lib, "IsDatabaseA")
Global NextDatabaseDriverA.protoNextDatabaseDriverA = GetFunction(lib, "NextDatabaseDriverA")
Global NextDatabaseRowA.protoNextDatabaseRowA = GetFunction(lib, "NextDatabaseRowA")
Global OpenDatabaseA.protoOpenDatabaseA = GetFunction(lib, "OpenDatabaseA")
Global OpenDatabaseRequesterA.protoOpenDatabaseRequesterA = GetFunction(lib, "OpenDatabaseRequesterA")
Global PreviousDatabaseRowA.protoPreviousDatabaseRowA = GetFunction(lib, "PreviousDatabaseRowA")
Global SetDatabaseBlobA.protoSetDatabaseBlobA = GetFunction(lib, "SetDatabaseBlobA")
Global SetDatabaseDoubleA.protoSetDatabaseDoubleA = GetFunction(lib, "SetDatabaseDoubleA")
Global SetDatabaseFloatA.protoSetDatabaseFloatA = GetFunction(lib, "SetDatabaseFloatA")
Global SetDatabaseLongA.protoSetDatabaseLongA = GetFunction(lib, "SetDatabaseLongA")
Global SetDatabaseNullA.protoSetDatabaseNullA = GetFunction(lib, "SetDatabaseNullA")
Global SetDatabaseQuadA.protoSetDatabaseQuadA = GetFunction(lib, "SetDatabaseQuadA")
Global SetDatabaseStringA.protoSetDatabaseStringA = GetFunction(lib, "SetDatabaseStringA")
;
ProcedureReturn 1
EndProcedure
; *****************************************************************************
Macro DatabaseColumnNameA(Database, Column)
PeekS(DatabaseColumnNameStrA(Database, Column), -1, #PB_UTF8)
EndMacro
Macro DatabaseDriverDescriptionA()
PeekS(DatabaseDriverDescriptionStrA(), -1, #PB_UTF8)
EndMacro
Macro DatabaseErrorA()
PeekS(DatabaseErrorStrA(), -1, #PB_UTF8)
EndMacro
Macro DatabaseDriverNameA()
PeekS(DatabaseDriverNameStrA(), -1, #PB_UTF8)
EndMacro
Macro GetDatabaseDoubleA(Database, Column)
PeekD(GetDatabaseDoublePtrA(Database, Column))
EndMacro
Macro GetDatabaseFloatA(Database, Column)
PeekF(GetDatabaseFloatPtrA(Database, Column))
EndMacro
Macro GetDatabaseQuad32A(Database, Column)
PeekQ(GetDatabaseQuadPtrA(Database, Column))
EndMacro
Macro GetDatabaseStringA(Database, Column)
PeekS(GetDatabaseStringStrA(Database, Column), -1, #PB_UTF8)
EndMacro
; *****************************************************************************
[/size]