LibMySQL Wrapper für MySQL Databases

Windowsspezifisches Forum , API ,..
Beiträge, die plattformübergreifend sind, gehören ins 'Allgemein'-Forum.
VoSs2o0o
Beiträge: 25
Registriert: 29.08.2004 16:58
Kontaktdaten:

LibMySQL Wrapper für MySQL Databases

Beitrag von VoSs2o0o »

Hier die aktuelle Version meines Wrappers für libmySQL.dll:

Die DLL ist im Package mysql-connector-c-noinstall-6.0.2-win32.zip (für Windows x86) enthalten
und lässt sich unter http://dev.mysql.com/downloads/connector/c downloaden

Die Bibliothek unterstützt Purebasic-ähnliche Datenbankbefehle, man kann aber auch die MySql - Befehle verwenden.
Siehe Beispiel am Ende des Codes

05.02.13 aktualisiert, neue Version 1.14

History:
1.0, 21.12.11
erste version :-)

1.1, 03.01.12
-alle fehlenden Befehle hinzugefügt
-ein paar Bugfixes um die Lib ein wenig mehr "Kugelsicher" zu machen

1.11, 25.01.12
-Bug bei MYSQL_DatabaseColumnType / MYSQL_DatabaseColumnName beseitigt, Danke an Andreas21

1.12, 07.02.12
-Bug bei MYSQL_CloseDatabase gefixt

1.13 04.12.12
-Bug bei MYSQL_OpenDatabase gefixt
-standardmäßig wird nun das 'compressflag' gesetzt
-Die Flags lassen sich nun optional mit MYSQL_OpenDatabase übergeben....

1.14 05.02.13
-Lib PB 5.1 kompatibel
-kleine Codeänderungen f. 64Bit (kann es n. testen da 32bit only)

Code: Alles auswählen

; German forum, English Forum 
; Author: VoSs2o0o
; Version: 1.14
; Date: 05. Februar 2013
; OS: Windows
;
; Library for using MySQL with the libmysql.dll 
; You can download mysql-connector-c-noinstall-6.0.2-win32.zip (für Windows x86)  package from
; http://dev.mysql.com/downloads/connector/c to get the dll.
;
; The Library supports the Purebasic Standard to connect to databases, but also supports the Mysql-Syntax
; See an example at the bottom of the code.

EnableExplicit

#MySQL_CLIENT_COMPRESS = 32 ;client_flag for compress

Global __Lib_mysql_hdl.i, __mysqllibinit, __mysql_pb_any

Structure st_MYSQL_ROW
  fields.s[255]
EndStructure

Structure st_mysql_field
  *name.STRING               ;/* Name of column */
  *org_name.STRING           ;/* Original column name, if an alias */
  *table.STRING              ;/* Table of column if column was a field */
  *org_table.STRING          ;/* Org table name, if table was an alias */
  *DB.STRING                 ;/* Database for table */
  *catalog.STRING            ;/* Catalog for table */
  *def.STRING                ;/* Default value (set by mysql_list_fields) */
  length.l                   ;/* Width of column (create length) */
  max_length.l               ;/* Max width for selected set */
  name_length.l
  org_name_length.l
  table_length.l
  org_table_length.l
  db_length.l
  catalog_length.l
  def_length.l
  flags.l                    ;/* Div flags */
  decimals.l                 ;/* Number of decimals in field */
  charsetnr.l                ;/* Character set */
  type.l                     ;/* Type of field. See enum_field_types */
  *extension
EndStructure ;MYSQL_FIELD;

Structure st_arr_of_fields
  field.st_mysql_field[0]
EndStructure

Structure st_Long_array
  long.l[0]
EndStructure

Structure st_MYSQL_Lib_Data
  dbhnd.l
  sqlresult.l
  sqlresult_row.l
  sqlresult_fields.l
  rownumber.l
  List blogparams.s()
EndStructure

Enumeration ;enum_field_types
  #MYSQL_TYPE_DECIMAL         ;DECIMAL- oder NUMERIC-Feld
  #MYSQL_TYPE_TINY            ;TINYINT-Feld
  #MYSQL_TYPE_SHORT           ;SMALLINT-Feld
  #MYSQL_TYPE_LONG            ;INTEGER-Feld
  #MYSQL_TYPE_FLOAT           ;FLOAT-Feld
  #MYSQL_TYPE_DOUBLE          ;DOUBLE- oder REAL-Feld
  #MYSQL_TYPE_NULL            ;Feld mit NULL-Typ
  #MYSQL_TYPE_TIMESTAMP       ;TIMESTAMP-Feld
  #MYSQL_TYPE_LONGLONG        ;BIGINT-Feld
  #MYSQL_TYPE_INT24           ;MEDIUMINT-Feld
  #MYSQL_TYPE_DATE            ;DATE-Feld
  #MYSQL_TYPE_TIME            ;TIME-Feld
  #MYSQL_TYPE_DATETIME        ;DATETIME-Feld
  #MYSQL_TYPE_YEAR            ;YEAR-Feld
  #MYSQL_TYPE_NEWDATE         ;DATETIME-Feld
  #MYSQL_TYPE_VARCHAR         ;VARCHAR
  #MYSQL_TYPE_BIT             ;BIT-Feld
  #MYSQL_TYPE_NEWDECIMAL=246  ;DECIMAL- oder NUMERIC-Typ für Präzisionsberechnungen
  #MYSQL_TYPE_ENUM=247        ;ENUM-Feld
  #MYSQL_TYPE_SET=248         ;SET-Feld
  #MYSQL_TYPE_TINY_BLOB=249   ;TINYTEXT
  #MYSQL_TYPE_MEDIUM_BLOB=250 ;MEDIUMTEXT
  #MYSQL_TYPE_LONG_BLOB=251   ;LONGTEXT
  #MYSQL_TYPE_BLOB=252        ;BLOB- oder TEXT-Feld (die Maximallänge wird mit max_length ermittelt)
  #MYSQL_TYPE_VAR_STRING=253  ;VARCHAR- oder VARBINARY-Feld
  #MYSQL_TYPE_STRING=254      ;CHAR- oder BINARY-Feld
  #MYSQL_TYPE_GEOMETRY=255    ;Feld eines raumbezogenen Typs
  #MAX_NO_FIELD_TYPES ;/* Should always be last */
EndEnumeration

#CLIENT_MULTI_STATEMENTS = 65536

Global NewMap __MySQLLib_Data.st_MYSQL_Lib_Data()

;{ Prototypes
Prototype.i proto_mysql_init(dbHnd)
Prototype.i proto_mysql_connect(dbHnd, host.p-ascii, user.p-ascii, passwd.p-ascii, DB.p-ascii, port.l, unix_socket.p-ascii, client_flag.l)
Prototype.i proto_mysql_error(dbHnd)
Prototype.i proto_mysql_errno(dbHnd)
Prototype.i proto_mysql_close(dbHnd)
Prototype.i proto_mysql_query(dbHnd, sql.p-ascii,Len_sql.l)
Prototype.i proto_mysql_use_result(dbHnd)
Prototype.i proto_mysql_store_result(dbHnd)
Prototype.i proto_mysql_free_result(QueryResult)
Prototype.i proto_mysql_field_count(dbHnd)
Prototype.i proto_mysql_fetch_row(SQLResult)
Prototype.i proto_mysql_fetch_fields(SQLResult)
Prototype.i proto_mysql_fetch_lengths(SQLResult)
Prototype.i proto_mysql_num_rows(SQLResult)
Prototype.i proto_mysql_num_fields(SQLResult)
Prototype.i proto_mysql_data_seek(SQLResult, Row_offset.q)
Prototype.i proto_mysql_insert_id(dbHnd)
Prototype.i proto_mysql_affected_rows(dbHnd)
Prototype.i proto_mysql_real_escape_string(dbHnd, strTo.p-ascii, *strfrom.p-ascii, length)
;}

Procedure isLastElement(List myList.l())
  If ListIndex(myList()) <= ListSize(myList()) - 1
    ProcedureReturn  #True
  EndIf
EndProcedure

Procedure mysql_lib_init(dllfile.s)
  If __Lib_mysql_hdl.i = 0
    __Lib_mysql_hdl.i = OpenLibrary(#PB_Any, dllfile)
    If __mysqllibinit = #False
      Global mysql_init.proto_mysql_init=GetFunction(__Lib_mysql_hdl.i,"mysql_init")
      Global mysql_real_connect.proto_mysql_connect=GetFunction(__Lib_mysql_hdl.i, "mysql_real_connect")
      Global __mysql_error.proto_mysql_error=GetFunction(__Lib_mysql_hdl.i,"mysql_error")
      Global mysql_errno.proto_mysql_errno=GetFunction(__Lib_mysql_hdl.i,"mysql_errno")
      Global mysql_real_query.proto_mysql_query=GetFunction(__Lib_mysql_hdl.i, "mysql_real_query")
      Global mysql_use_result.proto_mysql_use_result=GetFunction(__Lib_mysql_hdl.i,"mysql_use_result")
      Global mysql_store_result.proto_mysql_store_result=GetFunction(__Lib_mysql_hdl.i,"mysql_store_result")
      Global mysql_free_result.proto_mysql_free_result=GetFunction(__Lib_mysql_hdl.i,"mysql_free_result")
      Global mysql_field_count.proto_mysql_field_count=GetFunction(__Lib_mysql_hdl.i,"mysql_field_count")
      Global mysql_fetch_row.proto_mysql_fetch_row=GetFunction(__Lib_mysql_hdl.i,"mysql_fetch_row")
      Global mysql_fetch_fields.proto_mysql_fetch_fields=GetFunction(__Lib_mysql_hdl.i,"mysql_fetch_fields")
      Global mysql_fetch_lengths.proto_mysql_fetch_lengths=GetFunction(__Lib_mysql_hdl.i,"mysql_fetch_lengths")
      Global mysql_num_rows.proto_mysql_num_rows=GetFunction(__Lib_mysql_hdl.i,"mysql_num_rows")
      Global mysql_num_fields.proto_mysql_num_fields=GetFunction(__Lib_mysql_hdl.i,"mysql_num_fields")
      Global mysql_insert_id.proto_mysql_insert_id=GetFunction(__Lib_mysql_hdl.i,"mysql_insert_id")
      Global mysql_close.proto_mysql_close=GetFunction(__Lib_mysql_hdl.i,"mysql_close")
      Global mysql_affected_rows.proto_mysql_affected_rows=GetFunction(__Lib_mysql_hdl.i,"mysql_affected_rows")
      Global mysql_data_seek.proto_mysql_data_seek=GetFunction(__Lib_mysql_hdl.i, "mysql_data_seek")
      Global mysql_real_escape_string.proto_mysql_real_escape_string=GetFunction(__Lib_mysql_hdl.i, "mysql_real_escape_string")
      
      __mysqllibinit = #True
    EndIf
  EndIf
EndProcedure

Procedure.s mysql_error(dbHnd, requester.l = 0) 
Define *Error, Res
  
  Protected Errormsg.s, i.l, Error.l
  If mysql_errno(dbHnd) > 0
     *Error= __mysql_error(dbHnd)      
     Errormsg = PeekS(*Error) 
    If requester 
       Res= MessageRequester("MySQL error",Errormsg,#PB_MessageRequester_Ok)
    EndIf 
  EndIf 
  ProcedureReturn Errormsg 
EndProcedure 

Procedure mysql_lib_close()
  CloseLibrary(__Lib_mysql_hdl.i)
  __Lib_mysql_hdl.i = 0
EndProcedure

;PB compatible fnctions.....

Procedure.s MYSQL_DatabaseError(Databaseno)
Define dbhnd = __MySQLLib_Data(Str(Databaseno))\dbhnd
  ProcedureReturn mysql_error(dbHnd) 
EndProcedure

Procedure MYSQL_UseMySQLDatabase()
  CompilerIf #PB_Compiler_Processor = #PB_Processor_x64
    mysql_lib_init("libmysql_64.dll")
  CompilerElse
    mysql_lib_init("libmysql.dll")
  CompilerEndIf
  __mysql_pb_any = 1
EndProcedure

Procedure MYSQL_CloseDatabase(Databaseno, Libclose=0)
Define dbhnd = __MySQLLib_Data(Str(Databaseno))\dbhnd
  
  If dbhnd
    mysql_close(dbHnd)
    __MySQLLib_Data(Str(Databaseno))\dbhnd = 0
  EndIf

  If Libclose = #True
    mysql_lib_close()    
  EndIf
EndProcedure

Procedure MYSQL_OpenDatabase(Databaseno, Host.s, Benutzer.s, Passwort.s, Database.s, Port.l = 3306, Flags.l = #CLIENT_MULTI_STATEMENTS | #MySQL_CLIENT_COMPRESS) ; DefaultPort (no need to change)
Define res.l
  
  If Databaseno = #PB_Any
    While FindMapElement(__MySQLLib_Data(), Str(__mysql_pb_any))
      __mysql_pb_any + 1
    Wend
    Databaseno = __mysql_pb_any
    res.l = Databaseno
  Else
    If FindMapElement(__MySQLLib_Data(), Str(Databaseno))
      If __MySQLLib_Data()\dbhnd
        ProcedureReturn 0
      EndIf
    EndIf
    res.l = 1
  EndIf
  __MySQLLib_Data(Str(Databaseno))\dbhnd = mysql_init(0)
  If mysql_real_connect(__MySQLLib_Data(Str(Databaseno))\dbhnd, Host.s, Benutzer.s, Passwort.s, Database.s, Port.l,#NULL$, Flags.l) ;#Null$>Verbindungsart TCP, #Null>kein Client_Flag
    ProcedureReturn res.l
  Else
    MYSQL_CloseDatabase(Databaseno)
    ProcedureReturn 0
  EndIf
EndProcedure

Procedure MYSQL_DatabaseQuery(Databaseno, Abfrage.s)
Define res.l, sqlresult, dbhnd = __MySQLLib_Data(Str(Databaseno))\dbhnd
Define *dat.st_MYSQL_Lib_Data = __MySQLLib_Data(Str(Databaseno)), i
  
  If ListSize(*dat\blogparams()) > 0
    For i = 0 To ListSize(*dat\blogparams()) - 1
      SelectElement(*dat\blogparams(), i)
      ReplaceString(Abfrage.s, "$" + Str(i), *dat\blogparams())
    Next
    ClearList(*dat\blogparams()) 
  EndIf
  
  res.l = mysql_real_query(dbHnd, Abfrage.s, Len(Abfrage.s))
  If res.l = 0
    
    __MySQLLib_Data(Str(Databaseno))\sqlresult = mysql_store_result.l(dbHnd)
    sqlresult = __MySQLLib_Data(Str(Databaseno))\sqlresult
    If sqlresult
      __MySQLLib_Data(Str(Databaseno))\sqlresult_fields = mysql_fetch_fields(sqlresult)
      __MySQLLib_Data(Str(Databaseno))\rownumber = -1
      ProcedureReturn 1
    Else
      ProcedureReturn 0
    EndIf
  Else
    ProcedureReturn 0
  EndIf
EndProcedure

Procedure MYSQL_DatabaseUpdate(Databaseno, Abfrage.s)
Define res.l, dbhnd = __MySQLLib_Data(Str(Databaseno))\dbhnd
Define *dat.st_MYSQL_Lib_Data = __MySQLLib_Data(Str(Databaseno)), i

  If ListSize(*dat\blogparams()) > 0
    For i = 0 To ListSize(*dat\blogparams()) - 1
      SelectElement(*dat\blogparams(), i)
      ReplaceString(Abfrage.s, "$" + Str(i), *dat\blogparams())
    Next
    ClearList(*dat\blogparams()) 
  EndIf  
  
  res.l = mysql_real_query(dbHnd, Abfrage.s, Len(Abfrage.s))
  If res.l = 0
    ProcedureReturn mysql_affected_rows(dbHnd)
  Else
    ProcedureReturn 0
  EndIf
EndProcedure

Procedure MYSQL_NextDatabaseRow(Databaseno)
Define sqlresult = __MySQLLib_Data(Str(Databaseno))\sqlresult

  __MySQLLib_Data(Str(Databaseno))\rownumber + 1
  __MySQLLib_Data(Str(Databaseno))\sqlresult_row = mysql_fetch_row(sqlresult) 

  ProcedureReturn __MySQLLib_Data(Str(Databaseno))\sqlresult_row
EndProcedure

Procedure MYSQL_PreviousDatabaseRow(Databaseno)
Define sqlresult = __MySQLLib_Data(Str(Databaseno))\sqlresult

  __MySQLLib_Data(Str(Databaseno))\rownumber - 1
  mysql_data_seek(sqlresult, __MySQLLib_Data(Str(Databaseno))\rownumber)
  __MySQLLib_Data(Str(Databaseno))\sqlresult_row = mysql_fetch_row(sqlresult)
  
  ProcedureReturn __MySQLLib_Data(Str(Databaseno))\sqlresult_row 
EndProcedure 

Procedure MYSQL_FirstDatabaseRow(Databaseno)
Define sqlresult = __MySQLLib_Data(Str(Databaseno))\sqlresult
Define res.l

  mysql_data_seek(sqlresult, 0)
  __MySQLLib_Data(Str(Databaseno))\rownumber = 0
  __MySQLLib_Data(Str(Databaseno))\sqlresult_row = mysql_fetch_row(sqlresult) 

  ProcedureReturn __MySQLLib_Data(Str(Databaseno))\sqlresult_row
EndProcedure

Procedure MYSQL_DatabaseColumnType(Databaseno, Spalte.l)
Define *fields.st_arr_of_fields = __MySQLLib_Data(Str(Databaseno))\sqlresult_fields, numfields.l
Define sqlresult = __MySQLLib_Data(Str(Databaseno))\sqlresult

  numfields = mysql_num_fields(sqlresult)
  If Spalte.l < numfields
    Select *fields\field[Spalte.l]\type
    Case #MYSQL_TYPE_TINY, #MYSQL_TYPE_SHORT, #MYSQL_TYPE_LONG, #MYSQL_TYPE_NULL, #MYSQL_TYPE_TIMESTAMP, #MYSQL_TYPE_YEAR, #MYSQL_TYPE_BIT, #MYSQL_TYPE_ENUM
      ProcedureReturn #PB_Database_Long 
    Case #MYSQL_TYPE_DATE, #MYSQL_TYPE_TIME, #MYSQL_TYPE_DATETIME, #MYSQL_TYPE_NEWDATE, #MYSQL_TYPE_VARCHAR, #MYSQL_TYPE_SET, #MYSQL_TYPE_GEOMETRY
      ProcedureReturn #PB_Database_String
    Case #MYSQL_TYPE_FLOAT
      ProcedureReturn #PB_Database_Float
    Case #MYSQL_TYPE_DECIMAL, #MYSQL_TYPE_DOUBLE, #MYSQL_TYPE_NEWDECIMAL
      ProcedureReturn #PB_Database_Double 
    Case #MYSQL_TYPE_LONGLONG, #MYSQL_TYPE_INT24
      ProcedureReturn #PB_Database_Quad 
    Case #MYSQL_TYPE_TINY_BLOB, #MYSQL_TYPE_MEDIUM_BLOB, #MYSQL_TYPE_LONG_BLOB, #MYSQL_TYPE_BLOB, #MYSQL_TYPE_VAR_STRING, #MYSQL_TYPE_STRING
      ProcedureReturn #PB_Database_Blob
    Default
      ProcedureReturn #PB_Database_Long
    EndSelect
  EndIf
EndProcedure

Procedure.s MYSQL_DatabaseColumnName(Databaseno, Spalte.l)
Define *fields.st_arr_of_fields = __MySQLLib_Data(Str(Databaseno))\sqlresult_fields, numfields.l
Define sqlresult = __MySQLLib_Data(Str(Databaseno))\sqlresult

  numfields = mysql_num_fields(sqlresult)
  If Spalte.l < numfields
    ProcedureReturn *fields\field[Spalte.l]\name\s
  EndIf
EndProcedure

Procedure MYSQL_DatabaseColumns(Databaseno)
Define sqlresult = __MySQLLib_Data(Str(Databaseno))\sqlresult
   ;   Debug mysql_field_count(dbHnd)
  ProcedureReturn mysql_num_fields(sqlresult)
EndProcedure

Procedure MYSQL_DatabaseRows(Databaseno)
Define sqlresult = __MySQLLib_Data(Str(Databaseno))\sqlresult
  ProcedureReturn mysql_num_rows(sqlresult)
EndProcedure

Procedure.l MYSQL_GetDatabaseBlob(Databaseno, Spalte.l)
Define *row.st_MYSQL_ROW, sqlresultrow = __MySQLLib_Data(Str(Databaseno))\sqlresult_row
  *row = sqlresultrow
  If *row
    ProcedureReturn @*row\fields[Spalte.l]
  EndIf
EndProcedure

Procedure.d MYSQL_GetDatabaseDouble(Databaseno, Spalte.l)
Define *row.st_MYSQL_ROW, sqlresultrow = __MySQLLib_Data(Str(Databaseno))\sqlresult_row
  *row = sqlresultrow
  If *row
    ProcedureReturn ValD(*row\fields[Spalte.l])
  EndIf
EndProcedure

Procedure.f MYSQL_GetDatabaseFloat(Databaseno, Spalte.l)
Define *row.st_MYSQL_ROW, sqlresultrow = __MySQLLib_Data(Str(Databaseno))\sqlresult_row
  *row = sqlresultrow
  If *row
    ProcedureReturn ValF(*row\fields[Spalte.l])
  EndIf
EndProcedure

Procedure.l MYSQL_GetDatabaseLong(Databaseno, Spalte.l)
Define *row.st_MYSQL_ROW, sqlresultrow = __MySQLLib_Data(Str(Databaseno))\sqlresult_row
  *row = sqlresultrow
  If *row
    ProcedureReturn Val(*row\fields[Spalte.l])
  EndIf
EndProcedure

Procedure.q MYSQL_GetDatabaseQuad(Databaseno, Spalte.l)
Define *row.st_MYSQL_ROW, sqlresultrow = __MySQLLib_Data(Str(Databaseno))\sqlresult_row
  *row = sqlresultrow
  If *row
    ProcedureReturn Val(*row\fields[Spalte.l])
  EndIf
EndProcedure

Procedure.s MYSQL_GetDatabaseString(Databaseno, Spalte.l)
Define *row.st_MYSQL_ROW, sqlresultrow = __MySQLLib_Data(Str(Databaseno))\sqlresult_row
  *row = sqlresultrow
  If *row
    ProcedureReturn *row\fields[Spalte.l]
  EndIf
EndProcedure

Procedure.l MYSQL_DatabaseColumnSize(Databaseno, Spalte.l)
Define *sizes.st_Long_array, sqlresult = __MySQLLib_Data(Str(Databaseno))\sqlresult
Define numfields

  numfields = mysql_num_fields(sqlresult)
  If Spalte.l < numfields
    *sizes = mysql_fetch_lengths(sqlresult)
    If *sizes
      ProcedureReturn *sizes\long[Spalte]
    EndIf
  EndIf
  
EndProcedure 

Procedure.l MYSQL_FinishDatabaseQuery(Databaseno)
Define sqlresult = __MySQLLib_Data(Str(Databaseno))\sqlresult  
  mysql_free_result(sqlresult)
  __MySQLLib_Data(Str(Databaseno))\sqlresult = 0
EndProcedure

Procedure MYSQL_IsDatabase(Databaseno)
Define dbhnd = __MySQLLib_Data(Str(Databaseno))\dbhnd
  If dbHnd And __Lib_mysql_hdl.i
    ProcedureReturn 1
  EndIf
EndProcedure

Procedure MYSQL_DatabaseID(Databaseno)
  ProcedureReturn __MySQLLib_Data(Str(Databaseno))\dbhnd
EndProcedure

;Use $1, $2, $3.... in your query 
Procedure MYSQL_SetDatabaseBlob(Databaseno, Statementindex.l, *Puffer, Pufferlaenge.l)
Define dbhnd = __MySQLLib_Data(Str(Databaseno))\dbhnd

  While ListSize(__MySQLLib_Data(Str(Databaseno))\blogparams()) - 1 < Statementindex.l
    AddElement(__MySQLLib_Data(Str(Databaseno))\blogparams())
  Wend
  SelectElement(__MySQLLib_Data(Str(Databaseno))\blogparams(), Statementindex.l)
  __MySQLLib_Data(Str(Databaseno))\blogparams() = Space(Pufferlaenge.l*2 + 1)

  If mysql_real_escape_string(dbhnd, __MySQLLib_Data(Str(Databaseno))\blogparams(), *Puffer, Pufferlaenge.l)
    __MySQLLib_Data(Str(Databaseno))\blogparams() = "'" + __MySQLLib_Data(Str(Databaseno))\blogparams() + "'"
    Debug __MySQLLib_Data(Str(Databaseno))\blogparams()
    ProcedureReturn 1
  EndIf
EndProcedure

; Define  user.s, passwd.s, port.l, host.s, DB.s, SQL.s, Res.l, SQLResult, *row.st_MYSQL_ROW, *mem
; 
; user.s    = "user"
; passwd.s  = "password"
; host.s    = "localhost"
; DB.s      = "phpmyadmin" ;Schema / DB
; 
; 
; SQL.s="SELECT * FROM pma_history"
; 
; MySQL_UseMySQLDatabase()
; res = MYSQL_OpenDatabase(0, Host.s, user.s, passwd.s, DB.s)
; If res
;   res = MYSQL_DatabaseQuery(0,SQL.s)
;   If res
;     Debug "Query ok"
;         
;     Debug MYSQL_DatabaseColumnType(0, 1)
;     Debug MYSQL_DatabaseColumnName(0, 1)
;     
;     While MYSQL_NextDatabaseRow(0)
;       Debug MYSQL_GetDatabaseString(0, 0)
;       Debug MYSQL_DatabaseColumnSize(0, 0)
;     Wend
;         
;     MYSQL_FinishDatabaseQuery(0)
;   Else
;     Debug "Query fehlgeschlagen"
;     Debug MYSQL_DatabaseError(0)  
;   EndIf 
; Else
;   Debug MYSQL_DatabaseError(0)
; EndIf
;
Zuletzt geändert von VoSs2o0o am 05.02.2013 19:08, insgesamt 1-mal geändert.
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: LibMySQL Wrapper für MySQL Databases

Beitrag von ts-soft »

Ich nutze zwar kein MySQL, habe aber noch 2 Verbesserungsvorschläge :wink:

Die Structure "st_mysql_field" enthält Pointer, denen Du einen einfachen Typ zugeordnet hast. Der PBCompiler
ignoriert dies zwar, aber ab der nächsten Version von PB wird er meckern :mrgreen:
Pointer können zwar strukturiert werden, für einfacheren Zugriff, sind aber niemals von einem einfachem Typ.
Hier die gefixte Version:

Code: Alles auswählen

Structure st_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.l
  org_name_length.l
  table_length.l
  org_table_length.l
  db_length.l
  catalog_length.l
  def_length.l
  flags.l                    ;/* Div flags */
  decimals.l                 ;/* Number of decimals in field */
  charsetnr.l                ;/* Character set */
  type.l                     ;/* Type of field. See enum_field_types */
  *extension
EndStructure ;MYSQL_FIELD;
Das Handle für die DLL hast Du als Long deklariert, Handle sind grundsätzlich vom Typ Integer (zumindest, seit es den gibt).
Nach der Änderung zu:

Code: Alles auswählen

Global __Lib_mysql_hdl.i, __mysqllibinit, __mysql_pb_any
sollte es auch mit der 64-Bit Version der DLL klappen :wink:

Gruß
Thomas
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
walker
Beiträge: 278
Registriert: 29.08.2004 18:39
Wohnort: Bayern

Re: LibMySQL Wrapper für MySQL Databases

Beitrag von walker »

Hi,

leider läuft das nicht unter 64bit (W7 SP1) Unter 32bit gibts keine Probleme

Hier gibt es einen Ima bei ProcedureReturn:

Code: Alles auswählen

If Spalte < numfields
    ProcedureReturn *fields\field[Spalte]\name
  EndIf
Spalte hat den Wert 1 und numfields = 4
Mit dem Wert Spalte=0 läuft es noch durch ......

Die Änderungen von TS habe ich eingebaut und die lib hier geändert

Code: Alles auswählen

Procedure MYSQL_UseMySQLDatabase()
  mysql_lib_init("libmysql_64.dll"); <<<<------- geändert 
  __mysql_pb_any = 1
EndProcedure
Jemand ne Idee?
VoSs2o0o
Beiträge: 25
Registriert: 29.08.2004 16:58
Kontaktdaten:

Re: LibMySQL Wrapper für MySQL Databases

Beitrag von VoSs2o0o »

@walker:
Versuchs nochmal mit der neuen Version, hab leider kein 64 bit um es zu debuggen....
Benutzeravatar
Bisonte
Beiträge: 2465
Registriert: 01.04.2007 20:18

Re: LibMySQL Wrapper für MySQL Databases

Beitrag von Bisonte »

Beim Versuch, ein Programm mit dieser Include zu starten stürzt das ganze mit IMA ab, wenn sich die .dll nicht
dort befindet wo sie laut Include sein soll...

Minimale Änderung an der Prozedure mysql_lib_init()

Code: Alles auswählen

Procedure mysql_lib_init(dllfile.s)
  
  ; neu
  If FileSize(dllfile) <= 1
    ; MessageRequester("Fatal Error","Could not find the libMySQL.dll") ; <- kleine Meldung wenn erwünscht
    __mysqllibinit = #False
    ProcedureReturn #False
  EndIf
  ; neu ende
  
  If __Lib_mysql_hdl = 0
    __Lib_mysql_hdl = OpenLibrary(#PB_Any, dllfile)
    If __mysqllibinit = #False
dann noch

Code: Alles auswählen

Procedure MYSQL_UseMySQLDatabase()
  CompilerIf #PB_Compiler_Processor = #PB_Processor_x64
    mysql_lib_init("libmysql_64.dll")
  CompilerElse
    mysql_lib_init("libmysql.dll")
  CompilerEndIf
  __mysql_pb_any = 1
  ProcedureReturn __mysqllibinit
EndProcedure
und schon kann man If MySQL_UseMySQLDatabase() nutzen und checken ob das laden der dll überhaupt
funktioniert hat ...

Edit :

Die Funktion MYSQL_DatabaseColumnName(Databaseno, Spalte) hat bei x64 einen IMA dem ich nicht auf die Spur komme....
unter x86 war auch ein IMA, den ich allerdings mit ProcedureReturn PeekS(*fields\field[Spalte]\name) beheben konnte.
Dies funktioniert leider nicht bei x64... aber ich schau weiter ;)

DoppelEdit:
Gesagt getan und hoffentlich behoben (zumindest funzt es nun unter x86 und x64 bisher ohne IMA...)
Nicht meckern wegen einiger Umstellungen ;)

Code: Alles auswählen

; German forum, English Forum
; Author: VoSs2o0o
; Version: 1.14b
; Date: 05. February 2013
; OS: Windows
;
; modified by bisonte
;
; Library for using MySQL with the libmysql.dll
; You can download mysql-connector-c-noinstall-6.0.2-win32.zip (für Windows x86)  package from
; http://dev.mysql.com/downloads/connector/c to get the dll.
;
; The Library supports the Purebasic Standard to connect to databases, but also supports the Mysql-Syntax
; See an example at the bottom of the code in the "demo" folding.
;
EnableExplicit
;
;{ Constants
#MySQL_CLIENT_COMPRESS = 32 ;client_flag for compress
#CLIENT_MULTI_STATEMENTS = 65536
;
Enumeration ;enum_field_types
  #MYSQL_TYPE_DECIMAL         ;DECIMAL- oder NUMERIC-Feld
  #MYSQL_TYPE_TINY            ;TINYINT-Feld
  #MYSQL_TYPE_SHORT           ;SMALLINT-Feld
  #MYSQL_TYPE_LONG            ;INTEGER-Feld
  #MYSQL_TYPE_FLOAT           ;FLOAT-Feld
  #MYSQL_TYPE_DOUBLE          ;DOUBLE- oder REAL-Feld
  #MYSQL_TYPE_NULL            ;Feld mit NULL-Typ
  #MYSQL_TYPE_TIMESTAMP       ;TIMESTAMP-Feld
  #MYSQL_TYPE_LONGLONG        ;BIGINT-Feld
  #MYSQL_TYPE_INT24           ;MEDIUMINT-Feld
  #MYSQL_TYPE_DATE            ;DATE-Feld
  #MYSQL_TYPE_TIME            ;TIME-Feld
  #MYSQL_TYPE_DATETIME        ;DATETIME-Feld
  #MYSQL_TYPE_YEAR            ;YEAR-Feld
  #MYSQL_TYPE_NEWDATE         ;DATETIME-Feld
  #MYSQL_TYPE_VARCHAR         ;VARCHAR
  #MYSQL_TYPE_BIT             ;BIT-Feld
  #MYSQL_TYPE_NEWDECIMAL=246  ;DECIMAL- oder NUMERIC-Typ für Präzisionsberechnungen
  #MYSQL_TYPE_ENUM=247        ;ENUM-Feld
  #MYSQL_TYPE_SET=248         ;SET-Feld
  #MYSQL_TYPE_TINY_BLOB=249   ;TINYTEXT
  #MYSQL_TYPE_MEDIUM_BLOB=250 ;MEDIUMTEXT
  #MYSQL_TYPE_LONG_BLOB=251   ;LONGTEXT
  #MYSQL_TYPE_BLOB=252        ;BLOB- oder TEXT-Feld (die Maximallänge wird mit max_length ermittelt)
  #MYSQL_TYPE_VAR_STRING=253  ;VARCHAR- oder VARBINARY-Feld
  #MYSQL_TYPE_STRING=254      ;CHAR- oder BINARY-Feld
  #MYSQL_TYPE_GEOMETRY=255    ;Feld eines raumbezogenen Typs
  #MAX_NO_FIELD_TYPES ;/* Should always be last */
EndEnumeration
;}
;{ Prototypes
Prototype proto_mysql_init(dbHnd)
Prototype proto_mysql_connect(dbHnd, host.p-ascii, user.p-ascii, passwd.p-ascii, DB.p-ascii, port.l, unix_socket.p-ascii, client_flag.l)
Prototype proto_mysql_error(dbHnd)
Prototype proto_mysql_errno(dbHnd)
Prototype proto_mysql_close(dbHnd)
Prototype proto_mysql_query(dbHnd, sql.p-ascii,Len_sql.l)
Prototype proto_mysql_use_result(dbHnd)
Prototype proto_mysql_store_result(dbHnd)
Prototype proto_mysql_free_result(QueryResult)
Prototype proto_mysql_field_count(dbHnd)
Prototype proto_mysql_fetch_row(SQLResult)
Prototype proto_mysql_fetch_fields(SQLResult)
Prototype proto_mysql_fetch_lengths(SQLResult)
Prototype proto_mysql_num_rows(SQLResult)
Prototype proto_mysql_num_fields(SQLResult)
Prototype proto_mysql_data_seek(SQLResult, Row_offset.q)
Prototype proto_mysql_insert_id(dbHnd)
Prototype proto_mysql_affected_rows(dbHnd)
Prototype proto_mysql_real_escape_string(dbHnd, strTo.p-ascii, *strfrom.p-ascii, length)
;}
;{ Structures
Structure st_MYSQL_ROW
  fields.s[255]
EndStructure
Structure st_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.l
  org_name_length.l
  table_length.l
  org_table_length.l
  db_length.l
  catalog_length.l
  def_length.l
  flags.l                    ;/* Div flags */
  decimals.l                 ;/* Number of decimals in field */
  charsetnr.l                ;/* Character set */
  type.l                     ;/* Type of field. See enum_field_types */
  *extension
EndStructure ;MYSQL_FIELD;
Structure st_arr_of_fields
  field.st_mysql_field[0]
EndStructure
Structure st_Long_array
  long.l[0]
EndStructure
Structure st_MYSQL_Lib_Data
  dbhnd.l
  sqlresult.l
  sqlresult_row.l
  sqlresult_fields.l
  rownumber.l
  List blogparams.s()
EndStructure
;}
;{ Declaration
Global NewMap __MySQLLib_Data.st_MYSQL_Lib_Data()
Global __Lib_mysql_hdl, __mysqllibinit, __mysql_pb_any
;}
;{ private functions
Procedure isLastElement(List myList())
  If ListIndex(myList()) <= ListSize(myList()) - 1
    ProcedureReturn  #True
  EndIf
EndProcedure
Procedure mysql_lib_init(dllfile.s)
  
  ; neu
  If FileSize(dllfile) <= 1
    ; MessageRequester("Fatal Error","Could not find the libMySQL.dll") ; <- kleine Meldung wenn erwünscht
    __mysqllibinit = #False
    ProcedureReturn #False
  EndIf
  ; neu ende
  
  If __Lib_mysql_hdl = 0
    __Lib_mysql_hdl = OpenLibrary(#PB_Any, dllfile)
    If __mysqllibinit = #False
      
      Global mysql_init.proto_mysql_init=GetFunction(__Lib_mysql_hdl,"mysql_init")
      Global mysql_real_connect.proto_mysql_connect=GetFunction(__Lib_mysql_hdl, "mysql_real_connect")
      Global __mysql_error.proto_mysql_error=GetFunction(__Lib_mysql_hdl,"mysql_error")
      Global mysql_errno.proto_mysql_errno=GetFunction(__Lib_mysql_hdl,"mysql_errno")
      Global mysql_real_query.proto_mysql_query=GetFunction(__Lib_mysql_hdl, "mysql_real_query")
      Global mysql_use_result.proto_mysql_use_result=GetFunction(__Lib_mysql_hdl,"mysql_use_result")
      Global mysql_store_result.proto_mysql_store_result=GetFunction(__Lib_mysql_hdl,"mysql_store_result")
      Global mysql_free_result.proto_mysql_free_result=GetFunction(__Lib_mysql_hdl,"mysql_free_result")
      Global mysql_field_count.proto_mysql_field_count=GetFunction(__Lib_mysql_hdl,"mysql_field_count")
      Global mysql_fetch_row.proto_mysql_fetch_row=GetFunction(__Lib_mysql_hdl,"mysql_fetch_row")
      Global mysql_fetch_fields.proto_mysql_fetch_fields=GetFunction(__Lib_mysql_hdl,"mysql_fetch_fields")
      Global mysql_fetch_lengths.proto_mysql_fetch_lengths=GetFunction(__Lib_mysql_hdl,"mysql_fetch_lengths")
      Global mysql_num_rows.proto_mysql_num_rows=GetFunction(__Lib_mysql_hdl,"mysql_num_rows")
      Global mysql_num_fields.proto_mysql_num_fields=GetFunction(__Lib_mysql_hdl,"mysql_num_fields")
      Global mysql_insert_id.proto_mysql_insert_id=GetFunction(__Lib_mysql_hdl,"mysql_insert_id")
      Global mysql_close.proto_mysql_close=GetFunction(__Lib_mysql_hdl,"mysql_close")
      Global mysql_affected_rows.proto_mysql_affected_rows=GetFunction(__Lib_mysql_hdl,"mysql_affected_rows")
      Global mysql_data_seek.proto_mysql_data_seek=GetFunction(__Lib_mysql_hdl, "mysql_data_seek")
      Global mysql_real_escape_string.proto_mysql_real_escape_string=GetFunction(__Lib_mysql_hdl, "mysql_real_escape_string")
      
      __mysqllibinit = #True
    EndIf
  EndIf
EndProcedure
Procedure.s mysql_error(dbHnd, requester = 0)
  
  Protected Errormsg.s, Error, *Error, Res
  
  If mysql_errno(dbHnd) > 0
    *Error= __mysql_error(dbHnd)     
    Errormsg = PeekS(*Error)
    If requester
      Res= MessageRequester("MySQL error",Errormsg,#PB_MessageRequester_Ok)
    EndIf
  EndIf
  
  ProcedureReturn Errormsg
EndProcedure
Procedure mysql_lib_close()
  CloseLibrary(__Lib_mysql_hdl)
  __Lib_mysql_hdl = 0
EndProcedure
;}
;{ public functions
Procedure.s MYSQL_DatabaseError(Databaseno)
  Protected dbhnd = __MySQLLib_Data(Str(Databaseno))\dbhnd
  ProcedureReturn mysql_error(dbHnd)
EndProcedure
Procedure MYSQL_UseMySQLDatabase()
  CompilerIf #PB_Compiler_Processor = #PB_Processor_x64
    mysql_lib_init("libmysql_64.dll")
  CompilerElse
    mysql_lib_init("libmysql.dll")
  CompilerEndIf
  __mysql_pb_any = 1
  ProcedureReturn __mysqllibinit
EndProcedure
Procedure MYSQL_CloseDatabase(Databaseno, Libclose=0)
  Protected dbhnd = __MySQLLib_Data(Str(Databaseno))\dbhnd
  
  If dbhnd
    mysql_close(dbHnd)
    __MySQLLib_Data(Str(Databaseno))\dbhnd = 0
  EndIf
  
  If Libclose = #True
    mysql_lib_close()   
  EndIf
EndProcedure
Procedure MYSQL_OpenDatabase(Databaseno, Host.s, Benutzer.s, Passwort.s, Database.s, Port = 3306, Flags = #CLIENT_MULTI_STATEMENTS | #MySQL_CLIENT_COMPRESS) ; DefaultPort (no need to change)
  
  Protected res
  
  If Databaseno = #PB_Any
    While FindMapElement(__MySQLLib_Data(), Str(__mysql_pb_any))
      __mysql_pb_any + 1
    Wend
    Databaseno = __mysql_pb_any
    res = Databaseno
  Else
    If FindMapElement(__MySQLLib_Data(), Str(Databaseno))
      If __MySQLLib_Data()\dbhnd
        ProcedureReturn 0
      EndIf
    EndIf
    res = 1
  EndIf
  __MySQLLib_Data(Str(Databaseno))\dbhnd = mysql_init(0)
  If mysql_real_connect(__MySQLLib_Data(Str(Databaseno))\dbhnd, Host.s, Benutzer.s, Passwort.s, Database.s, Port,#NULL$, Flags) ;#Null$>Verbindungsart TCP, #Null>kein Client_Flag
    ProcedureReturn res
  Else
    MYSQL_CloseDatabase(Databaseno)
    ProcedureReturn 0
  EndIf
EndProcedure
Procedure MYSQL_DatabaseQuery(Databaseno, Abfrage.s)
  Protected res, sqlresult, dbhnd = __MySQLLib_Data(Str(Databaseno))\dbhnd
  Protected *dat.st_MYSQL_Lib_Data = __MySQLLib_Data(Str(Databaseno)), i
  
  If ListSize(*dat\blogparams()) > 0
    For i = 0 To ListSize(*dat\blogparams()) - 1
      SelectElement(*dat\blogparams(), i)
      ReplaceString(Abfrage.s, "$" + Str(i), *dat\blogparams())
    Next
    ClearList(*dat\blogparams())
  EndIf
  
  res = mysql_real_query(dbHnd, Abfrage.s, Len(Abfrage.s))
  If res = 0
    
    __MySQLLib_Data(Str(Databaseno))\sqlresult = mysql_store_result.l(dbHnd)
    sqlresult = __MySQLLib_Data(Str(Databaseno))\sqlresult
    If sqlresult
      __MySQLLib_Data(Str(Databaseno))\sqlresult_fields = mysql_fetch_fields(sqlresult)
      __MySQLLib_Data(Str(Databaseno))\rownumber = -1
      ProcedureReturn 1
    Else
      ProcedureReturn 0
    EndIf
  Else
    ProcedureReturn 0
  EndIf
EndProcedure
Procedure MYSQL_DatabaseUpdate(Databaseno, Abfrage.s)
  Protected res, dbhnd = __MySQLLib_Data(Str(Databaseno))\dbhnd
  Protected *dat.st_MYSQL_Lib_Data = __MySQLLib_Data(Str(Databaseno)), i
  
  If ListSize(*dat\blogparams()) > 0
    For i = 0 To ListSize(*dat\blogparams()) - 1
      SelectElement(*dat\blogparams(), i)
      ReplaceString(Abfrage.s, "$" + Str(i), *dat\blogparams())
    Next
    ClearList(*dat\blogparams())
  EndIf 
  
  res = mysql_real_query(dbHnd, Abfrage.s, Len(Abfrage.s))
  If res = 0
    ProcedureReturn mysql_affected_rows(dbHnd)
  Else
    ProcedureReturn 0
  EndIf
EndProcedure
Procedure MYSQL_NextDatabaseRow(Databaseno)
  Protected sqlresult = __MySQLLib_Data(Str(Databaseno))\sqlresult
  
  __MySQLLib_Data(Str(Databaseno))\rownumber + 1
  __MySQLLib_Data(Str(Databaseno))\sqlresult_row = mysql_fetch_row(sqlresult)
  
  ProcedureReturn __MySQLLib_Data(Str(Databaseno))\sqlresult_row
EndProcedure
Procedure MYSQL_PreviousDatabaseRow(Databaseno)
  Protected sqlresult = __MySQLLib_Data(Str(Databaseno))\sqlresult
  
  __MySQLLib_Data(Str(Databaseno))\rownumber - 1
  mysql_data_seek(sqlresult, __MySQLLib_Data(Str(Databaseno))\rownumber)
  __MySQLLib_Data(Str(Databaseno))\sqlresult_row = mysql_fetch_row(sqlresult)
  
  ProcedureReturn __MySQLLib_Data(Str(Databaseno))\sqlresult_row
EndProcedure
Procedure MYSQL_FirstDatabaseRow(Databaseno)
  Protected sqlresult = __MySQLLib_Data(Str(Databaseno))\sqlresult
  Protected res
  
  mysql_data_seek(sqlresult, 0)
  __MySQLLib_Data(Str(Databaseno))\rownumber = 0
  __MySQLLib_Data(Str(Databaseno))\sqlresult_row = mysql_fetch_row(sqlresult)
  
  ProcedureReturn __MySQLLib_Data(Str(Databaseno))\sqlresult_row
EndProcedure
Procedure MYSQL_DatabaseColumnType(Databaseno, Spalte)
  Protected *fields.st_arr_of_fields = __MySQLLib_Data(Str(Databaseno))\sqlresult_fields, numfields
  Protected sqlresult = __MySQLLib_Data(Str(Databaseno))\sqlresult
  
  numfields = mysql_num_fields(sqlresult)
  If Spalte < numfields
    Select *fields\field[Spalte]\type
      Case #MYSQL_TYPE_TINY, #MYSQL_TYPE_SHORT, #MYSQL_TYPE_LONG, #MYSQL_TYPE_NULL, #MYSQL_TYPE_TIMESTAMP, #MYSQL_TYPE_YEAR, #MYSQL_TYPE_BIT, #MYSQL_TYPE_ENUM
        ProcedureReturn #PB_Database_Long
      Case #MYSQL_TYPE_DATE, #MYSQL_TYPE_TIME, #MYSQL_TYPE_DATETIME, #MYSQL_TYPE_NEWDATE, #MYSQL_TYPE_VARCHAR, #MYSQL_TYPE_SET, #MYSQL_TYPE_GEOMETRY
        ProcedureReturn #PB_Database_String
      Case #MYSQL_TYPE_FLOAT
        ProcedureReturn #PB_Database_Float
      Case #MYSQL_TYPE_DECIMAL, #MYSQL_TYPE_DOUBLE, #MYSQL_TYPE_NEWDECIMAL
        ProcedureReturn #PB_Database_Double
      Case #MYSQL_TYPE_LONGLONG, #MYSQL_TYPE_INT24
        ProcedureReturn #PB_Database_Quad
      Case #MYSQL_TYPE_TINY_BLOB, #MYSQL_TYPE_MEDIUM_BLOB, #MYSQL_TYPE_LONG_BLOB, #MYSQL_TYPE_BLOB, #MYSQL_TYPE_VAR_STRING, #MYSQL_TYPE_STRING
        ProcedureReturn #PB_Database_Blob
      Default
        ProcedureReturn #PB_Database_Long
    EndSelect
  EndIf
EndProcedure
Procedure.s MYSQL_DatabaseColumnName(Databaseno, Spalte)
  Protected *fields.st_arr_of_fields = __MySQLLib_Data(Str(Databaseno))\sqlresult_fields, numfields
  Protected sqlresult = __MySQLLib_Data(Str(Databaseno))\sqlresult
  
  numfields = mysql_num_fields(sqlresult)
  If Spalte < numfields
    ProcedureReturn PeekS(*fields\field[Spalte]\name);\s
  EndIf
EndProcedure
Procedure MYSQL_DatabaseColumns(Databaseno)
  Protected sqlresult = __MySQLLib_Data(Str(Databaseno))\sqlresult
  ;   Debug mysql_field_count(dbHnd)
  ProcedureReturn mysql_num_fields(sqlresult)
EndProcedure
Procedure MYSQL_DatabaseRows(Databaseno)
  Protected sqlresult = __MySQLLib_Data(Str(Databaseno))\sqlresult
  ProcedureReturn mysql_num_rows(sqlresult)
EndProcedure
Procedure MYSQL_GetDatabaseBlob(Databaseno, Spalte)
  Protected *row.st_MYSQL_ROW, sqlresultrow = __MySQLLib_Data(Str(Databaseno))\sqlresult_row
  *row = sqlresultrow
  If *row
    ProcedureReturn @*row\fields[Spalte]
  EndIf
EndProcedure
Procedure.d MYSQL_GetDatabaseDouble(Databaseno, Spalte)
  Protected *row.st_MYSQL_ROW, sqlresultrow = __MySQLLib_Data(Str(Databaseno))\sqlresult_row
  *row = sqlresultrow
  If *row
    ProcedureReturn ValD(*row\fields[Spalte])
  EndIf
EndProcedure
Procedure.f MYSQL_GetDatabaseFloat(Databaseno, Spalte)
  Protected *row.st_MYSQL_ROW, sqlresultrow = __MySQLLib_Data(Str(Databaseno))\sqlresult_row
  *row = sqlresultrow
  If *row
    ProcedureReturn ValF(*row\fields[Spalte])
  EndIf
EndProcedure
Procedure MYSQL_GetDatabaseLong(Databaseno, Spalte)
  Protected *row.st_MYSQL_ROW, sqlresultrow = __MySQLLib_Data(Str(Databaseno))\sqlresult_row
  *row = sqlresultrow
  If *row
    ProcedureReturn Val(*row\fields[Spalte])
  EndIf
EndProcedure
Procedure.q MYSQL_GetDatabaseQuad(Databaseno, Spalte)
  Protected *row.st_MYSQL_ROW, sqlresultrow = __MySQLLib_Data(Str(Databaseno))\sqlresult_row
  *row = sqlresultrow
  If *row
    ProcedureReturn Val(*row\fields[Spalte])
  EndIf
EndProcedure
Procedure.s MYSQL_GetDatabaseString(Databaseno, Spalte)
  Protected *row.st_MYSQL_ROW, sqlresultrow = __MySQLLib_Data(Str(Databaseno))\sqlresult_row
  *row = sqlresultrow
  If *row
    ProcedureReturn *row\fields[Spalte]
  EndIf
EndProcedure
Procedure MYSQL_DatabaseColumnSize(Databaseno, Spalte)
  Protected *sizes.st_Long_array, sqlresult = __MySQLLib_Data(Str(Databaseno))\sqlresult
  Protected numfields
  
  numfields = mysql_num_fields(sqlresult)
  If Spalte < numfields
    *sizes = mysql_fetch_lengths(sqlresult)
    If *sizes
      ProcedureReturn *sizes\long[Spalte]
    EndIf
  EndIf
  
EndProcedure
Procedure MYSQL_FinishDatabaseQuery(Databaseno)
  Protected sqlresult = __MySQLLib_Data(Str(Databaseno))\sqlresult 
  mysql_free_result(sqlresult)
  __MySQLLib_Data(Str(Databaseno))\sqlresult = 0
EndProcedure
Procedure MYSQL_IsDatabase(Databaseno)
  Protected dbhnd = __MySQLLib_Data(Str(Databaseno))\dbhnd
  If dbHnd And __Lib_mysql_hdl
    ProcedureReturn 1
  EndIf
EndProcedure
Procedure MYSQL_DatabaseID(Databaseno)
  ProcedureReturn __MySQLLib_Data(Str(Databaseno))\dbhnd
EndProcedure
;Use $1, $2, $3.... in your query
Procedure MYSQL_SetDatabaseBlob(Databaseno, Statementindex, *Puffer, Pufferlaenge)
  Protected dbhnd = __MySQLLib_Data(Str(Databaseno))\dbhnd
  
  While ListSize(__MySQLLib_Data(Str(Databaseno))\blogparams()) - 1 < Statementindex
    AddElement(__MySQLLib_Data(Str(Databaseno))\blogparams())
  Wend
  SelectElement(__MySQLLib_Data(Str(Databaseno))\blogparams(), Statementindex)
  __MySQLLib_Data(Str(Databaseno))\blogparams() = Space(Pufferlaenge*2 + 1)
  
  If mysql_real_escape_string(dbhnd, __MySQLLib_Data(Str(Databaseno))\blogparams(), *Puffer, Pufferlaenge)
    __MySQLLib_Data(Str(Databaseno))\blogparams() = "'" + __MySQLLib_Data(Str(Databaseno))\blogparams() + "'"
    Debug __MySQLLib_Data(Str(Databaseno))\blogparams()
    ProcedureReturn 1
  EndIf
EndProcedure
;}
;{ demo
CompilerIf #PB_Compiler_IsMainFile
  
  Define  user.s, passwd.s, port.l, host.s, DB.s, SQL.s, Res.l, SQLResult, *row.st_MYSQL_ROW, *mem
  
  user.s    = "user"
  passwd.s  = "pass"
  host.s    = "127.0.0.1"
  DB.s      = "phpmyadmin" ;Schema / DB
  
  
  SQL.s="SELECT * FROM pma_history"
  
  If MySQL_UseMySQLDatabase() = #False : End : EndIf
  res = MYSQL_OpenDatabase(0, Host.s, user.s, passwd.s, DB.s)
  If res
    res = MYSQL_DatabaseQuery(0,SQL.s)
    If res
      Debug "Query ok"
      
      Debug MYSQL_DatabaseColumnType(0, 0)
      Debug MYSQL_DatabaseColumnName(0, 1)
      
      While MYSQL_NextDatabaseRow(0)
        Debug MYSQL_GetDatabaseString(0, 0)
        Debug MYSQL_DatabaseColumnSize(0, 0)
      Wend
      
      MYSQL_FinishDatabaseQuery(0)
    Else
      Debug "Query fehlgeschlagen"
      Debug MYSQL_DatabaseError(0) 
    EndIf
  Else
    Debug MYSQL_DatabaseError(0)
  EndIf
CompilerEndIf
;}
PureBasic 6.21 (Windows x86/x64) | Windows11 Pro x64 | AsRock B850 Steel Legend Wifi | R7 9800x3D | 64GB RAM | GeForce RTX 5080 | ThermaltakeView 270 TG ARGB | build by vannicom​​
Antworten