There are quite some mysql-snippets on the forum, but as usual i need something as easy as possible.
So i decided to do some kind of subclassing of the normal PB Database-commands.
That's why i didn't go for modules.
With this include you can use the normal PB-Database commands.
Just use a
Code: Select all
UseMySQLDataBase()And start your action with something like this:
Code: Select all
OpenDatabase(0, "host=localhost dbname=mydbname", "myusername", "mypassword", #PB_Database_MySQL)Fell free to add it on your own.
No example this time, because i already said:
It uses the normal PB-commands.
Here we go:
Code: Select all
;=============================================================================
; Include:         mysql.pbi
;
; Author:          HeX0R / infratec / mk-soft
; Date:            Aug 23, 2021
; Version:         1.0.6
; Target Compiler: PureBasic 5.11+
; Target OS:       Windows / Linux / MacOS
; link:            https://www.purebasic.fr/english/viewtopic.php?f=12&t=56390
;
;
; default PB-Database procedures you can use:
;
; AffectedDatabaseRows
; CheckDatabaseNull
; CloseDatabase
; DatabaseColumnIndex
; DatabaseColumnName
; DatabaseColumns
; DatabaseColumnSize
; DatabaseColumnType
; DatabaseID
; DatabaseQuery
; DatabaseUpdate
; FinishDatabaseQuery
; GetDatabaseDouble
; GetDatabaseFloat
; GetDatabaseLong
; GetDatabaseQuad
; GetDatabaseString
; GetDatabaseBlob
; IsDatabase
; NextDatabaseRow
; OpenDatabase         <- See help of postgresql, this uses the same structure
;
; When you are interested in an error message,
; use MySQL_GetError(#DataBase) instead of DatabaseError()
;
;
; Remarks
;
; Regarding threadsafety:
; I am using only one unsecured linked list which stores the Databases.
; This means you have to take care on your own, when sending querys from
; different threads.
; Adding the compilers threadsafe-option won't help you much here.
;
; Blobs:
; partly implemented.
;
; Unicode:
; I would recommend to compile your apps in unicode mode.
; There are quite some characters in UTF-8, which Ascii can not handle.
;
; ----------------------------------------------------------------------------
; "THE BEER-WARE LICENSE":
; <hex0r@coderbu.de> wrote this file. as long as you retain this notice you
; can do whatever you want with this stuff. If we meet some day, and you think
; this stuff is worth it, you can buy me a beer in return
; (see address on http://hex0rs.coderbu.de).
; Or just go out and drink a few on your own/with your friends ;)
;=============================================================================
CompilerIf Defined(PB_Database_MySQL, #PB_Constant) = 0
	#PB_Database_MySQL           = $10   ;<- used for OpenDatabase as plugin.
CompilerEndIf
#MySQL_CLIENT_COMPRESS         = 32    ;<- client_flag for compress
#MySQL_CLIENT_MULTI_STATEMENTS = 65536
;-Init some Structures
Structure _MYSQL_HELPER_ ;used to iterate through the fields
	StructureUnion
		row.i[0]
		CompilerIf #PB_Compiler_OS = #PB_OS_Windows
			len.l[0]
		CompilerElse
			len.i[0]
		CompilerEndIf
	EndStructureUnion
EndStructure
Structure _MYSQL_DBs_
	DataBaseNum.i            ;<- the PB-Identifier (#DataBase)
	DataBaseID.i             ;<- the API-Handle
	*mysqlResult             ;<- stores the result of a query
	*mysqlRow._MYSQL_HELPER_ ;<- stores the fields of one row
	*mysqlLen._MYSQL_HELPER_ ;<- stores the length of each field
	FieldCount.i             ;<- stores the fields which have been returned after a query
EndStructure
Structure _MYSQL_FIELD_
	*name                       ; Name of column
	*org_name                   ; Original column name, if an alias
	*table                      ; Table of column if column was a field
	*org_table                  ; Org table name, if table was an alias
	*db                         ; Database for table
	*catalog                    ; Catalog for table
	*def                        ; Default value (set by mysql_list_fields)
	length.l                    ; Width of column (create length)
	max_length.l                ; Max width for selected set
	name_length.i               ;
	org_name_length.i           ;
	table_length.i              ;
	org_table_length.i          ;
	db_length.i                 ;
	catalog_length.i            ;
	def_length.i                ;
	flags.i                     ; Div flags
	decimals.i                  ; Number of decimals in field
	charsetnr.i                 ; Character set
	type.i                      ; Type of field. See mysql_com.h for types
	*extension                  ;
EndStructure
;-Init some Prototypes
; There are more defined as needed.
; This is just for future reference
CompilerIf #PB_Compiler_OS = #PB_OS_Windows
	Macro MyPrototype
		Prototype
	EndMacro
CompilerElse
	Macro MyPrototype
		PrototypeC
	EndMacro
CompilerEndIf
MyPrototype.i MySQL_Init(dbHwnd)
MyPrototype.i MySQL_ERRNO(dbHwnd)
MyPrototype.i MySQL_ERROR(dbHwnd)
MyPrototype.i MySQL_Real_Connect(dbHwnd, host.p-utf8, user.p-utf8, password.p-utf8, DataBase.p-utf8, Port, *unix_socket, client_flag)
MyPrototype.i MySQL_Real_Query(dbHwnd, Query.p-utf8, Length)
MyPrototype.i MySQL_Real_Escape_String(dbHwnd, *to, from.p-utf8, Length)
MyPrototype.i MySQL_Set_Character_Set(dbHwnd, csname.p-utf8)
MyPrototype.i MySQL_Store_Result(dbHwnd)
MyPrototype.i MySQL_Field_Count(dbHwnd)
MyPrototype.i MySQL_Use_Result(dbHwnd)
MyPrototype.i MySQL_Affected_Rows(dbHwnd)
MyPrototype.i MySQL_Fetch_Row(*result)
MyPrototype.i MySQL_Fetch_Lengths(*result)
MyPrototype.i MySQL_Free_Result(*result)
MyPrototype.i MySQL_Fetch_Fields(*result)
MyPrototype.i MySQL_Num_Fields(*result)
MyPrototype.i MySQL_Close(dbHwnd)
MyPrototype.i MySQL_Fetch_Field_Direct(*result, fieldnr.i)
MyPrototype.i MySQL_Data_Seek(*result, offset.q)
;-Init some Globals
Global MySQL_Init              .MySQL_Init
Global MySQL_ERRNO             .MySQL_ERRNO
Global MySQL_ERROR             .MySQL_ERROR
Global MySQL_Real_Connect      .MySQL_Real_Connect
Global MySQL_Real_Query        .MySQL_Real_Query
Global MySQL_Real_Escape_String.MySQL_Real_Escape_String
Global MySQL_Store_Result      .MySQL_Store_Result
Global MySQL_Field_Count       .MySQL_Field_Count
Global MySQL_Use_Result        .MySQL_Use_Result
Global MySQL_Fetch_Row         .MySQL_Fetch_Row
Global MySQL_Fetch_Lengths     .MySQL_Fetch_Lengths
Global MySQL_Free_Result       .MySQL_Free_Result
Global MySQL_Affected_Rows     .MySQL_Affected_Rows
Global MySQL_Close             .MySQL_Close
Global MySQL_Num_Fields        .MySQL_Num_Fields
Global MySQL_Set_Character_Set .MySQL_Set_Character_Set
Global MySQL_Fetch_Fields      .MySQL_Fetch_Fields
Global MySQL_Fetch_Field_Direct.MySQL_Fetch_Field_Direct
Global MySQL_Data_Seek         .MySQL_Data_Seek
Global MySQL_Lib
Global NewList MySQL_DBs._MYSQL_DBs_() ;<- will store the Database IDs and result values.
;                                            a map would be more efficient i guess, but who really opens more then 2 or 3 databases?
Global MySQL_LastErrorFlag.i
; You need to call UseMySQLDataBase() first!
; Instead of UseSQLiteDatabase() and UsePostgreSQLDatabase()
; you should check the return value!
Procedure MySQL_UseMySQLDatabase(Path_To_MySQL_Lib.s = "")
	CompilerSelect #PB_Compiler_OS
		CompilerCase #PB_OS_Windows
			If Path_To_MySQL_Lib = ""
				Path_To_MySQL_Lib = "libmysql.dll"
			EndIf
			MySQL_Lib = OpenLibrary(#PB_Any, Path_To_MySQL_Lib)
		CompilerCase #PB_OS_Linux
			If Path_To_MySQL_Lib = ""
				Path_To_MySQL_Lib = "libmysqlclient.so.18"
			EndIf
			MySQL_Lib = OpenLibrary(#PB_Any, Path_To_MySQL_Lib)
			If MySQL_Lib = 0
				MySQL_Lib = OpenLibrary(#PB_Any, "libmysqlclient.so.16")
			EndIf
			If MySQL_Lib = 0
				MySQL_Lib = OpenLibrary(#PB_Any, "libmariadbclient.so")
			EndIf
		CompilerCase #PB_OS_MacOS
			If Path_To_MySQL_Lib = ""
				CompilerIf #PB_Compiler_Processor = #PB_Processor_x64
					Path_To_MySQL_Lib = "/usr/local/mysql-connector-c-6.1.6-osx10.8-x86_64/lib/libmysqlclient.18.dylib"
				CompilerElse
					Path_To_MySQL_Lib = "/usr/local/mysql-connector-c-6.1.6-osx10.8-x86/lib/libmysqlclient.18.dylib"
				CompilerEndIf 
			EndIf
			MySQL_Lib = OpenLibrary(#PB_Any, Path_To_MySQL_Lib)
			If MySQL_Lib = 0
				MySQL_Lib = OpenLibrary(#PB_Any, "libmysqlclient.dylib")
			EndIf
	CompilerEndSelect
	If MySQL_Lib
		MySQL_Init               = GetFunction(MySQL_Lib, "mysql_init")
		MySQL_ERRNO              = GetFunction(MySQL_Lib, "mysql_errno")
		MySQL_ERROR              = GetFunction(MySQL_Lib, "mysql_error")
		MySQL_Real_Connect       = GetFunction(MySQL_Lib, "mysql_real_connect")
		MySQL_Real_Query         = GetFunction(MySQL_Lib, "mysql_real_query")
		MySQL_Real_Escape_String = GetFunction(MySQL_Lib, "mysql_real_escape_string")
		MySQL_Store_Result       = GetFunction(MySQL_Lib, "mysql_store_result")
		MySQL_Field_Count        = GetFunction(MySQL_Lib, "mysql_field_count")
		MySQL_Use_Result         = GetFunction(MySQL_Lib, "mysql_use_result")
		MySQL_Fetch_Row          = GetFunction(MySQL_Lib, "mysql_fetch_row")
		MySQL_Fetch_Lengths      = GetFunction(MySQL_Lib, "mysql_fetch_lengths")
		MySQL_Free_Result        = GetFunction(MySQL_Lib, "mysql_free_result")
		MySQL_Num_Fields         = GetFunction(MySQL_Lib, "mysql_num_fields")
		MySQL_Affected_Rows      = GetFunction(MySQL_Lib, "mysql_affected_rows")
		MySQL_Close              = GetFunction(MySQL_Lib, "mysql_close")
		MySQL_Set_Character_Set  = GetFunction(MySQL_Lib, "mysql_set_character_set")
		MySQL_Fetch_Field_Direct = GetFunction(MySQL_Lib, "mysql_fetch_field_direct")
		MySQL_Data_Seek          = GetFunction(MySQL_Lib, "mysql_data_seek")
	EndIf
	ProcedureReturn MySQL_Lib
EndProcedure
; Internal function to check, if this database is a mysql database
Procedure MySQL_FindDataBase(DataBase)
	Protected Found = #False
	ForEach MySQL_DBs()
		If MySQL_DBs()\DataBaseNum = DataBase
			Found = #True
			Break
		EndIf
	Next
	ProcedureReturn Found
EndProcedure
; Open database
; uses same structure as the #PB_Database_PostgreSQL-Plugin (but no hostaddr is used).
Procedure MySQL_OpenDatabase(DataBase, Name$, User$, Password$, Plugin)
	Protected i, a$, ParameterName.s, ParameterValue.s, host.s, hostaddr.i, port.i, dbname.s, handle, flags.i
	If Plugin <> #PB_Database_MySQL
		;o.k. nothing for us, so let PB handle it.
		ProcedureReturn OpenDatabase(DataBase, Name$, User$, Password$, Plugin)
	EndIf
	If MySQL_Init = 0
		;user forgot to call UseMySQLDataBase() (or the library isn't available)
		ProcedureReturn 0
	EndIf
	If DataBase <> #PB_Any
		;we check, if there is already a database with this ID open
		If MySQL_FindDataBase(DataBase)
			;yes, so we will close it.
			;first check, if there is a query open.
			If MySQL_DBs()\mysqlResult
				MySQL_Free_Result(MySQL_DBs()\mysqlResult)
				MySQL_DBs()\FieldCount  = 0
				MySQL_DBs()\mysqlLen    = 0
				MySQL_DBs()\mysqlRow    = 0
				MySQL_DBs()\mysqlResult = 0
			EndIf
			MySQL_Close(MySQL_DBs()\DataBaseID)
			;now delete it
			DeleteElement(MySQL_DBs())
		EndIf
	EndIf
	;Check the parameters
	For i = 0 To CountString(Name$, " ")
		a$ = Trim(StringField(Name$, i + 1, " "))
		If a$
			ParameterName  = LCase(Trim(StringField(a$, 1, "=")))
			ParameterValue = Trim(StringField(a$, 2, "="))
			Select ParameterName
				Case "host"
					Host = ParameterValue
				Case "hostaddr"
					hostaddr = Val(ParameterValue)
				Case "port"
					port = Val(ParameterValue)
				Case "dbname"
					dbname = ParameterValue
				Case "flags"
					flags = Val(ParameterValue)
			EndSelect
		EndIf
	Next i
	If dbname = ""
		dbname = User$
	EndIf
	If host = ""
		host = "localhost"
	EndIf
	handle = MySQL_Init(#Null)
	If handle
		If MySQL_Real_Connect(handle, host, User$, Password$, dbname, port, #Null, flags) = 0
			;something went wrong...
			handle = #Null
		Else
			;yessss... now add this client, to be sure we will mark it as a mysql client
			AddElement(MySQL_DBs())
			MySQL_DBs()\DataBaseID = handle
			If DataBase = #PB_Any
				MySQL_DBs()\DataBaseNum = @MySQL_DBs()
				handle                  = @MySQL_DBs()
			Else
				MySQL_DBs()\DataBaseNum = DataBase
			EndIf
			;now set the client charset to utf8
			MySQL_Set_Character_Set(MySQL_DBs()\DataBaseID, "utf8")
		EndIf
	EndIf
	ProcedureReturn handle
EndProcedure
Procedure MySQL_CloseDatabase(DataBase)
	If MySQL_FindDataBase(DataBase) = 0
		ProcedureReturn CloseDatabase(DataBase)
	EndIf
	;check if there is a query open.
	If MySQL_DBs()\mysqlResult
		MySQL_Free_Result(MySQL_DBs()\mysqlResult)
	EndIf
	MySQL_Close(MySQL_DBs()\DataBaseID)
	DeleteElement(MySQL_DBs())
EndProcedure
Procedure MySQL_DatabaseQuery(DataBase, Query.s, Flags = 0)
	If MySQL_FindDataBase(DataBase) = 0
		MySQL_LastErrorFlag = #False
		ProcedureReturn DatabaseQuery(DataBase, Query, Flags)
	EndIf
	MySQL_LastErrorFlag = #True
	With MySQL_DBs()
		If \mysqlResult
			;hmm user forgot to finish his databasequery. o.k. we will do it for him.
			MySQL_Free_Result(\mysqlResult)
			\FieldCount  = 0
			\mysqlLen    = 0
			\mysqlRow    = 0
			\mysqlResult = 0
		EndIf
		If MySQL_Real_Query(\DataBaseID, Query, StringByteLength(Query, #PB_UTF8)) = 0
			;yes, strange but true... in this case a result of 0 means success.
			\mysqlResult = MySQL_Use_Result(\DataBaseID)
			; for FirstDatabaseRow() we need store not use
			;\mysqlResult = MySQL_Store_Result(\DataBaseID)
		EndIf
	EndWith
	ProcedureReturn MySQL_DBs()\mysqlResult
EndProcedure
Procedure MySQL_NextDatabaseRow(DataBase)
	If MySQL_FindDataBase(DataBase) = 0
		MySQL_LastErrorFlag = #False
		ProcedureReturn NextDatabaseRow(DataBase)
	EndIf
	MySQL_LastErrorFlag = #True
	With MySQL_DBs()
		If \mysqlResult
			\mysqlRow = MySQL_Fetch_Row(\mysqlResult)
			If \mysqlRow
				\mysqlLen   = MySQL_Fetch_Lengths(\mysqlResult)
				\FieldCount = MySQL_Num_Fields(\mysqlResult)
			EndIf
		EndIf
	EndWith
	ProcedureReturn MySQL_DBs()\mysqlRow
EndProcedure
Procedure MySQL_DatabaseUpdate(DataBase, Query.s)
	Protected Result
	If MySQL_FindDataBase(DataBase) = 0
		MySQL_LastErrorFlag = #False
		ProcedureReturn DatabaseUpdate(DataBase, Query)
	EndIf
	MySQL_LastErrorFlag = #True
	If MySQL_Real_Query(MySQL_DBs()\DataBaseID, Query, StringByteLength(Query, #PB_UTF8)) = 0
		;yes, strange but true... in this case a result of 0 means success.
		Result = #True
	EndIf
	ProcedureReturn Result
EndProcedure
Procedure MySQL_FinishDatabaseQuery(DataBase)
	If MySQL_FindDataBase(DataBase) = 0
		MySQL_LastErrorFlag = #False
		ProcedureReturn FinishDatabaseQuery(DataBase)
	EndIf
	MySQL_LastErrorFlag = #True
	With MySQL_DBs()
		If \mysqlResult
			MySQL_Free_Result(\mysqlResult)
			\FieldCount  = 0
			\mysqlLen    = 0
			\mysqlRow    = 0
			\mysqlResult = 0
		EndIf
	EndWith
EndProcedure
Procedure.i MySQL_GetDatabaseBlob(DataBase, Column, *Buffer, BufferLength)
	Protected Result.i
	If MySQL_FindDataBase(DataBase) = 0
		ProcedureReturn GetDatabaseBlob(DataBase, Column, *Buffer, BufferLength)
	EndIf
	If MySQL_DBs()\mysqlResult
		If Column < MySQL_DBs()\FieldCount And MySQL_DBs()\mysqlLen\len[Column] > 0
			If MySQL_DBs()\mysqlLen\len[Column] <= BufferLength
				CopyMemory(MySQL_DBs()\mysqlRow\row[Column], *Buffer, MySQL_DBs()\mysqlLen\len[Column])
				Result = MySQL_DBs()\mysqlLen\len[Column]
			EndIf
		EndIf
	EndIf
	ProcedureReturn Result
EndProcedure
Procedure.s MySQL_GetDatabaseString(DataBase, Column)
	Protected Result.s
	If MySQL_FindDataBase(DataBase) = 0
		ProcedureReturn GetDatabaseString(DataBase, Column)
	EndIf
	If MySQL_DBs()\mysqlResult
		If Column < MySQL_DBs()\FieldCount And MySQL_DBs()\mysqlLen\len[Column] > 0
			Result = PeekS(MySQL_DBs()\mysqlRow\row[Column], MySQL_DBs()\mysqlLen\len[Column], #PB_UTF8)
		EndIf
	EndIf
	ProcedureReturn Result
EndProcedure
Procedure.d MySQL_GetDatabaseDouble(DataBase, Column)
	Protected Result.d
	If MySQL_FindDataBase(DataBase) = 0
		ProcedureReturn GetDatabaseDouble(DataBase, Column)
	EndIf
	If MySQL_DBs()\mysqlResult
		If Column < MySQL_DBs()\FieldCount And MySQL_DBs()\mysqlLen\len[Column] > 0
			Result = ValD(PeekS(MySQL_DBs()\mysqlRow\row[Column], MySQL_DBs()\mysqlLen\len[Column], #PB_UTF8))
		EndIf
	EndIf
	ProcedureReturn Result
EndProcedure
Procedure.f MySQL_GetDatabaseFloat(DataBase, Column)
	Protected Result.f
	If MySQL_FindDataBase(DataBase) = 0
		ProcedureReturn GetDatabaseFloat(DataBase, Column)
	EndIf
	If MySQL_DBs()\mysqlResult
		If Column < MySQL_DBs()\FieldCount And MySQL_DBs()\mysqlLen\len[Column] > 0
			Result = ValF(PeekS(MySQL_DBs()\mysqlRow\row[Column], MySQL_DBs()\mysqlLen\len[Column], #PB_UTF8))
		EndIf
	EndIf
	ProcedureReturn Result
EndProcedure
Procedure MySQL_GetDatabaseLong(DataBase, Column)
	Protected Result
	If MySQL_FindDataBase(DataBase) = 0
		ProcedureReturn GetDatabaseLong(DataBase, Column)
	EndIf
	If MySQL_DBs()\mysqlResult
		If Column < MySQL_DBs()\FieldCount And MySQL_DBs()\mysqlLen\len[Column] > 0
			Result = Val(PeekS(MySQL_DBs()\mysqlRow\row[Column], MySQL_DBs()\mysqlLen\len[Column], #PB_UTF8))
		EndIf
	EndIf
	ProcedureReturn Result
EndProcedure
Procedure.q MySQL_GetDatabaseQuad(DataBase, Column)
	Protected Result.q
	If MySQL_FindDataBase(DataBase) = 0
		ProcedureReturn GetDatabaseQuad(DataBase, Column)
	EndIf
	If MySQL_DBs()\mysqlResult
		If Column < MySQL_DBs()\FieldCount And MySQL_DBs()\mysqlLen\len[Column] > 0
			Result = Val(PeekS(MySQL_DBs()\mysqlRow\row[Column], MySQL_DBs()\mysqlLen\len[Column], #PB_UTF8))
		EndIf
	EndIf
	ProcedureReturn Result
EndProcedure
Procedure MySQL_AffectedDatabaseRows(DataBase)
	If MySQL_FindDataBase(DataBase) = 0
		MySQL_LastErrorFlag = #False
		ProcedureReturn AffectedDatabaseRows(DataBase)
	EndIf
	MySQL_LastErrorFlag = #True
	ProcedureReturn MySQL_Affected_Rows(MySQL_DBs()\DataBaseID)
EndProcedure
Procedure MySQL_CheckDatabaseNull(DataBase, Column)
	Protected Result
	If MySQL_FindDataBase(DataBase) = 0
		ProcedureReturn CheckDatabaseNull(DataBase, Column)
	EndIf
	If MySQL_DBs()\mysqlResult
		If MySQL_DBs()\mysqlLen = 0 Or MySQL_DBs()\mysqlLen\len[Column] = 0
			Result = #True
		EndIf
	EndIf
	ProcedureReturn Result
EndProcedure
Procedure MySQL_DatabaseID(DataBase)
	If MySQL_FindDataBase(DataBase) = 0
		ProcedureReturn DatabaseID(DataBase)
	EndIf
	ProcedureReturn MySQL_DBs()\DataBaseID
EndProcedure
Procedure MySQL_IsDatabase(DataBase)
	If MySQL_FindDataBase(DataBase) = 0
		ProcedureReturn IsDatabase(DataBase)
	EndIf
	ProcedureReturn #True
EndProcedure
; use this procedure to add escape characters, when putting strings in querys
Procedure.s MySQL_EscapeString(DataBase, String.s)
	Protected Text$, *Buffer, Length
	If MySQL_FindDataBase(DataBase)
		*Buffer = AllocateMemory(StringByteLength(String, #PB_UTF8) * 2 + 1)
		If *Buffer
			Length = MySQL_Real_Escape_String(MySQL_DBs()\DataBaseID, *Buffer, String, StringByteLength(String, #PB_UTF8))
			Text$  = PeekS(*Buffer, Length, #PB_UTF8)
			FreeMemory(*Buffer)
		EndIf
	EndIf
	ProcedureReturn Text$
EndProcedure
Procedure.s MySQL_GetError()
	Protected Errormsg.s, i, *Error
	If MySQL_LastErrorFlag = #False; Or MySQL_FindDataBase(DataBase) = 0
		ProcedureReturn DatabaseError()
	EndIf
	If MySQL_ERRNO(MySQL_DBs()\DataBaseID) > 0
		*Error   = MySQL_ERROR(MySQL_DBs()\DataBaseID)
		Errormsg = PeekS(*Error, -1, #PB_UTF8)
	EndIf
	ProcedureReturn Errormsg
EndProcedure
Procedure MySQL_DatabaseColumns(DataBase)
	Protected Result
	If MySQL_FindDataBase(DataBase) = 0
		ProcedureReturn DatabaseColumns(DataBase)
	EndIf
	Result = MySQL_Field_Count(MySQL_DBs()\DataBaseID)
	ProcedureReturn Result
EndProcedure
Procedure.s MySQL_DatabaseColumnName(DataBase, Column)
	Protected *Result._MYSQL_FIELD_
	If MySQL_FindDataBase(DataBase) = 0
		ProcedureReturn DatabaseColumnName(DataBase, Column)
	EndIf
	*Result = MySQL_Fetch_Field_Direct(MySQL_DBs()\mysqlResult, Column)
	If *Result
		ProcedureReturn PeekS(*Result\name, -1, #PB_UTF8)
	EndIf
	ProcedureReturn ""
EndProcedure
Procedure MySQL_DatabaseColumnType(DataBase, Column)
	Protected *Result._MYSQL_FIELD_, Result
	If MySQL_FindDataBase(DataBase) = 0
		ProcedureReturn DatabaseColumnType(DataBase, Column)
	EndIf
	*Result = MySQL_Fetch_Field_Direct(MySQL_DBs()\mysqlResult, Column)
	If *Result
		Select *Result\type
			Case 1, 2, 3
				Result = #PB_Database_Long
			Case 4
				Result = #PB_Database_Float
			Case 12
				Result = #PB_Database_Quad
			Case 252
				Result = #PB_Database_Blob
			Case 253
				Result = #PB_Database_String
		EndSelect
	EndIf
	ProcedureReturn Result
EndProcedure
Procedure MySQL_DatabaseColumnSize(DataBase, Column)
	Protected *Result._MYSQL_FIELD_
	If MySQL_FindDataBase(DataBase) = 0
		ProcedureReturn DatabaseColumnSize(DataBase, Column)
	EndIf
	If Column < MySQL_DBs()\FieldCount
		Select MySQL_DatabaseColumnType(DataBase, Column)
			Case #PB_Database_String, #PB_Database_Blob
				ProcedureReturn MySQL_DBs()\mysqlLen\len[Column]
			Default
				*Result = MySQL_Fetch_Field_Direct(MySQL_DBs()\mysqlResult, Column)
				If *Result
					ProcedureReturn *Result\db_length
				EndIf
		EndSelect
	EndIf
	ProcedureReturn 0
EndProcedure
Procedure MySQL_DatabaseColumnIndex(DataBase, Columnname.s)
	Protected *Result._MYSQL_FIELD_, Result, Count
	If MySQL_FindDataBase(DataBase) = 0
		ProcedureReturn DatabaseColumnIndex(DataBase, Columnname)
	EndIf
	Count = MySQL_DatabaseColumns(DataBase) - 1
	For Result = 0 To Count
		*Result = MySQL_Fetch_Field_Direct(MySQL_DBs()\mysqlResult, Result)
		If *Result
			If LCase(PeekS(*Result\name, -1, #PB_UTF8)) = LCase(Columnname)
				Break
			EndIf
		Else
			Result = -1
			Break
		EndIf
	Next Result
	If Result > Count
		Result = -1
	EndIf
	ProcedureReturn Result
EndProcedure
Procedure MySQL_FirstDatabaseRow(DataBase)
	If MySQL_FindDataBase(DataBase) = 0
		MySQL_LastErrorFlag = #False
		ProcedureReturn FirstDatabaseRow(DataBase)
	EndIf
	MySQL_LastErrorFlag = #True
	With MySQL_DBs()
		If \mysqlResult
			MySQL_Data_Seek(\mysqlResult, 0)
			\mysqlRow = MySQL_Fetch_Row(\mysqlResult)
			If \mysqlRow
				\mysqlLen   = MySQL_Fetch_Lengths(\mysqlResult)
				\FieldCount = MySQL_Num_Fields(\mysqlResult)
			EndIf
		EndIf
	EndWith
	ProcedureReturn MySQL_DBs()\mysqlRow
EndProcedure
; some macros to overright the PB procedures
Macro AffectedDatabaseRows(a)
	MySQL_AffectedDataBaseRows(a)
EndMacro
Macro CheckDatabaseNull(a, b)
	MySQL_CheckDatabaseNull(a, b)
EndMacro
Macro CloseDatabase(a)
	MySQL_CloseDatabase(a)
EndMacro
Macro DatabaseError()
	MySQL_GetError()
EndMacro
Macro DatabaseID(a)
	MySQL_DatabaseID(a)
EndMacro
Macro DatabaseQuery(a, b, c = 0)
	MySQL_DatabaseQuery(a, b, c)
EndMacro
Macro DatabaseUpdate(a, b)
	MySQL_DatabaseUpdate(a, b)
EndMacro
Macro FinishDatabaseQuery(a)
	MySQL_FinishDatabaseQuery(a)
EndMacro
Macro GetDatabaseDouble(a, b)
	MySQL_GetDatabaseDouble(a, b)
EndMacro
Macro GetDatabaseFloat(a, b)
	MySQL_GetDatabaseFloat(a, b)
EndMacro
Macro GetDatabaseLong(a, b)
	MySQL_GetDatabaseLong(a, b)
EndMacro
Macro GetDatabaseQuad(a, b)
	MySQL_GetDatabaseQuad(a, b)
EndMacro
Macro GetDatabaseString(a, b)
	MySQL_GetDatabaseString(a, b)
EndMacro
Macro IsDatabase(a)
	MySQL_IsDatabase(a)
EndMacro
Macro NextDatabaseRow(a)
	MySQL_NextDatabaseRow(a)
EndMacro
Macro OpenDatabase(a, b, c, d, e = 0)
	MySQL_OpenDatabase(a, b, c, d, e)
EndMacro
; more Macros, which i wasn't in need of
; if you need them, feel free to implement them on your own..
Macro DatabaseColumnIndex(a, b)
	MySQL_DatabaseColumnIndex(a, b)
EndMacro
;
Macro DatabaseColumnName(a, b)
	MySQL_DatabaseColumnName(a, b)
EndMacro
Macro DatabaseColumnSize(a, b)
	MySQL_DatabaseColumnSize(a, b)
EndMacro
Macro DatabaseColumnType(a, b)
	MySQL_DatabaseColumnType(a, b)
EndMacro
;
Macro DatabaseColumns(a)
	MySQL_DatabaseColumns(a)
EndMacro
Macro UseMySQLDatabase(a = "")
	MySQL_UseMySQLDatabase(a)
EndMacro
; implemented, but slows a bit down and PreviousDatabaseRow() is not easy possible.
;Macro FirstDatabaseRow(a)
;   MySQL_FirstDatabaseRow(a)
;EndMacro
;
Macro GetDatabaseBlob(a, b, c, d)
	MySQL_GetDatabaseBlob(a, b, c, d)
EndMacro
;
;Macro PreviousDatabaseRow(a)
;   MySQL_PreviousDatabaseRow(a)
;EndMacro
;
; Macro SetDatabaseBlob(a, b, c, d)
;    MySQL_SetDatabaseBlob(a, b, c, d)
; EndMacro





