i got a prog to do that must be in unicode. I'm using Mysql for the database and the wrapper made by Flype (thanks to him) and his sample (here is the complete wrapper) :
Code: Select all
;- 
;- File:     libmysql.pbi
;- Version:  2.0
;- Author:   flype - flype44(at)gmail.com
;- Modified: flaith (24.07.2009)
;-
;- About:    MySQL Interface for Purebasic 4.3.
;- 
;- updated:  p-utf8 format (for unicode or ascii)
EnableExplicit
;-
;- Private - MySQL API
;-
#MYSQL_NOERROR = 0
Enumeration 0 ; client
  #CLIENT_COMPRESS
  #CLIENT_FOUND_ROWS
  #CLIENT_IGNORE_SPACE
  #CLIENT_INTERACTIVE
  #CLIENT_LOCAL_FILES
  #CLIENT_MULTI_STATEMENTS
  #CLIENT_MULTI_RESULTS
  #CLIENT_NO_SCHEMA
  #CLIENT_ODBC
  #CLIENT_SSL
EndEnumeration
Enumeration 0 ; type
  #MYSQL_TYPE_DECIMAL
  #MYSQL_TYPE_TINY
  #MYSQL_TYPE_SHORT
  #MYSQL_TYPE_LONG
  #MYSQL_TYPE_FLOAT
  #MYSQL_TYPE_DOUBLE
  #MYSQL_TYPE_NULL
  #MYSQL_TYPE_TIMESTAMP
  #MYSQL_TYPE_LONGLONG
  #MYSQL_TYPE_INT24
  #MYSQL_TYPE_DATE
  #MYSQL_TYPE_TIME
  #MYSQL_TYPE_DATETIME
  #MYSQL_TYPE_YEAR
  #MYSQL_TYPE_NEWDATE
  #MYSQL_TYPE_VARCHAR
  #MYSQL_TYPE_BIT
  #MYSQL_TYPE_NEWDECIMAL = 246
  #MYSQL_TYPE_ENUM
  #MYSQL_TYPE_SET
  #MYSQL_TYPE_TINY_BLOB
  #MYSQL_TYPE_MEDIUM_BLOB
  #MYSQL_TYPE_LONG_BLOB
  #MYSQL_TYPE_BLOB
  #MYSQL_TYPE_VAR_STRING
  #MYSQL_TYPE_STRING
  #MYSQL_TYPE_GEOMETRY
EndEnumeration
Structure MYSQL_FIELD
  name.s
  org_name.s
  table.s
  org_table.s
  db.s
  catalog.s
  def.s
  length.l
  max_length.l
  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
  decimals.l
  charset_nr.l
  Type.l
EndStructure
Structure MYSQL_FIELD_ARRAY
  field.MYSQL_FIELD[0]
EndStructure
Structure MYSQL_LENGTH
  *l.l[0]
EndStructure
Structure MYSQL_ROW
  *field.s[0]
EndStructure
Import "libmysql.lib" 
  mysql_affected_rows(*mysql) 
  mysql_autocommit(*mysql, *mode.Byte)
  mysql_change_user(*mysql, user.p-utf8, passwd.p-utf8, db.p-utf8) 
  mysql_character_set_name(*mysql)
  mysql_close(*mysql)
  mysql_commit(*mysql)
  mysql_data_seek(*result, offset.d)
  mysql_eof(*result)
  mysql_errno(*mysql)
  mysql_error(*mysql)
  mysql_escape_string(*strTo, strFrom.p-utf8, length.l)
  mysql_fetch_field(*result)
  mysql_fetch_field_direct(*result, fieldnr.l)
  mysql_fetch_fields(*result)
  mysql_fetch_lengths(*result)
  mysql_fetch_row(*result)
  mysql_field_count(*mysql)
  mysql_field_seek(*result, offset.l)
  mysql_field_tell(*result)
  mysql_free_result(*result)
  mysql_get_character_set_info(*mysql, *charsetinfo)
  mysql_get_client_info()
  mysql_get_client_version()
  mysql_get_host_info(*mysql)
  mysql_get_parameters()
  mysql_get_proto_info(*mysql)
  mysql_get_server_info(*mysql)
  mysql_get_server_version(*mysql)
  mysql_hex_string(strTo.p-utf8, strFrom.p-utf8, length.l)
  mysql_info(*mysql)
  mysql_init(*mysql)
  mysql_insert_id(*mysql)
  mysql_kill(*mysql, pid.l)
  mysql_list_dbs(*mysql, wild.p-utf8)
  mysql_list_fields(*mysql, table.p-utf8, wild.p-utf8)
  mysql_list_processes(*mysql)
  mysql_list_tables(*mysql, wild.p-utf8)
  mysql_master_query(*mysql, query.p-utf8, length.l)
  mysql_more_results(*mysql)
  mysql_next_result(*mysql)
  mysql_num_fields(*result)
  mysql_num_rows(*result)
  mysql_options(*mysql, option.l, arg.p-utf8)
  mysql_ping(*mysql)
  mysql_query(*mysql, query.p-utf8)
  mysql_read_query_result(*mysql)
  mysql_real_connect(*mysql, host.p-utf8, user.p-utf8, passwd.p-utf8, db.p-utf8, port.l, unix_socket.p-utf8, flags.l)
  mysql_real_escape_string(*mysql, *strTo, strFrom.p-utf8, length.l)
  mysql_real_query(*mysql, query.p-utf8, length.l)
  mysql_refresh(*mysql, Options.l)
  mysql_reload(*mysql)
  mysql_rollback(*mysql)
  mysql_row_seek(*mysql, offset.l)
  mysql_row_tell(*result)
  mysql_select_db(*mysql, db.p-utf8)
  mysql_store_result(*mysql)
EndImport
;-
;- Private - MySQL Interface
;-
Structure IMYSQL_VTABLE
  
  *host
  *proto
  *client_long
  *client_string
  *server_long
  *server_string
  
  *affected_rows
  *error
  *escape_string
  
  *field
  *field_length
  *field_length_max
  *field_name
  *field_reset
  *field_type
  *field_type_string
  
  *free
  
  *GetDate 
  *GetDateTime 
  *GetDouble 
  *GetFloat 
  *GetLong 
  *GetQuad 
  *GetString 
  *GetTime 
  
  *get_date
  *get_date_string
  *get_datetime
  *get_datetime_string
  *get_double
  *get_float
  *get_long
  *get_quad
  *get_string
  *get_time
  *get_time_string
  
  *info
  *insert_id
  
  *num_fields
  *num_rows
  
  *ping
  
  *query
  *query_from_file
  *query_xml
  *query_xml_from_file
  
  *row
  *selectdb
  
  *update
  *update_from_file
  ;added 24/07/09
  *autocommit
  *commit
EndStructure
Structure SMYSQL
  *vt.IMYSQL_VTABLE
  *link
  *result
  *row.MYSQL_ROW
  *field.MYSQL_FIELD
EndStructure
Interface IMYSQL
  
  host.s()
  proto.l()
  client_long.l()
  client_string.s()
  server_long.l()
  server_string.s()
  
  affected_rows.l()
  error.s()
  escape_string.s(string.s)
  field.l()
  field_length.l()
  field_length_max.l()
  field_name.s()
  field_reset.l()
  field_type.l()
  field_type_string.s()
  free.l()
  GetDate.l(name.s)
  GetDateTime.l(name.s)
  GetDouble.d(name.s)
  GetFloat.f(name.s)
  GetLong.l(name.s)
  GetQuad.q(name.s)
  GetString.s(name.s)
  GetTime.l(name.s)
  get_date.l(column.l = 0)
  get_date_string.s(column.l = 0)
  get_datetime.l(column.l = 0)
  get_datetime_string.s(column.l = 0)
  get_double.d(column.l = 0)
  get_float.f(column.l = 0)
  get_long.l(column.l = 0)
  get_quad.q(column.l = 0)
  get_string.s(column.l = 0)
  get_time.l(column.l = 0)
  get_time_string.s(column.l = 0)
  info.s()
  insert_id.l()
  num_fields.l()
  num_rows.l()
  ping.l()
  query.l(query.s)
  query_from_file.l(fileIn.s)
  query_xml(query.s, fileOut.s, table.l = #False, db.l = #False)
  query_xml_from_file(fileIn.s, fileOut.s, table.l = #False, db.l = #False)
  row.l()
  selectdb.l(database.s)
  update.l(query.s)
  update_from_file.l(fileIn.s)
  ;added 24/07/09
  autocommit(mode.l = #True)
  commit.l()
EndInterface
Procedure.s PeekS_Utf8(*buffer)       ;also checks if buffer is valid, returns an empty string if *buffer is 0
  If *buffer
    ProcedureReturn PeekS(*buffer, -1, #PB_UTF8)
  Else
    ProcedureReturn ""
  EndIf
EndProcedure 
Procedure.s mysql_name_string(*field.MYSQL_FIELD, db.l, table.l)
  
  Protected result.s
  
  If db
    result + *field\db + "."
  EndIf
  
  If table
    result + *field\table + "."
  EndIf
  
  ProcedureReturn result + *field\name
  
EndProcedure
Procedure.s mysql_type_string(Type.l)
  
  Select Type
    Case #MYSQL_TYPE_DECIMAL:     ProcedureReturn "decimal"
    Case #MYSQL_TYPE_TINY:        ProcedureReturn "tiny"
    Case #MYSQL_TYPE_SHORT:       ProcedureReturn "short"
    Case #MYSQL_TYPE_LONG:        ProcedureReturn "long"
    Case #MYSQL_TYPE_FLOAT:       ProcedureReturn "float"
    Case #MYSQL_TYPE_DOUBLE:      ProcedureReturn "double"
    Case #MYSQL_TYPE_NULL:        ProcedureReturn "null"
    Case #MYSQL_TYPE_TIMESTAMP:   ProcedureReturn "timestamp"
    Case #MYSQL_TYPE_LONGLONG:    ProcedureReturn "longlong"
    Case #MYSQL_TYPE_INT24:       ProcedureReturn "int24"
    Case #MYSQL_TYPE_DATE:        ProcedureReturn "date"
    Case #MYSQL_TYPE_TIME:        ProcedureReturn "time"
    Case #MYSQL_TYPE_DATETIME:    ProcedureReturn "datetime"
    Case #MYSQL_TYPE_YEAR:        ProcedureReturn "year"
    Case #MYSQL_TYPE_NEWDATE:     ProcedureReturn "newdate"
    Case #MYSQL_TYPE_VARCHAR:     ProcedureReturn "varchar"
    Case #MYSQL_TYPE_BIT:         ProcedureReturn "bit"
    Case #MYSQL_TYPE_NEWDECIMAL:  ProcedureReturn "newdecimal"
    Case #MYSQL_TYPE_ENUM:        ProcedureReturn "enum"
    Case #MYSQL_TYPE_SET:         ProcedureReturn "set"
    Case #MYSQL_TYPE_TINY_BLOB:   ProcedureReturn "tinyblob"
    Case #MYSQL_TYPE_MEDIUM_BLOB: ProcedureReturn "mediumblob"
    Case #MYSQL_TYPE_LONG_BLOB:   ProcedureReturn "longblob"
    Case #MYSQL_TYPE_BLOB:        ProcedureReturn "blob"
    Case #MYSQL_TYPE_VAR_STRING:  ProcedureReturn "varstring"
    Case #MYSQL_TYPE_STRING:      ProcedureReturn "string"
    Case #MYSQL_TYPE_GEOMETRY:    ProcedureReturn "geometry"
  EndSelect
  
  ProcedureReturn "unknown"
  
EndProcedure
Procedure.l db_affected_rows(*this.SMYSQL)
  
  If *this And *this\link 
    mysql_affected_rows(*this\link) 
  EndIf
  
EndProcedure
Procedure.s db_error(*this.SMYSQL)
  
  If *this And *this\link
    
    If mysql_error(*this\link)
      ;ProcedureReturn PeekS(mysql_error(*this\link))
      ProcedureReturn PeekS_Utf8(mysql_error(*this\link))
    EndIf
    
  EndIf
  
EndProcedure
Procedure.s db_escape_string(*this.SMYSQL, string.s)
  
  Protected result.s
  
  If *this And *this\link 
    
    result = Space((Len(string) + 2) * 2)
    result = ReplaceString(Left(result, mysql_real_escape_string(*this\link, @result, string, Len(string))), #TAB$, "\t")
    
    ProcedureReturn result
    
  EndIf
  
EndProcedure
Procedure.l db_field(*this.SMYSQL)
  
  If *this And *this\result
    
    *this\field = mysql_fetch_field(*this\result)
    
    ProcedureReturn *this\field
    
  EndIf
  
EndProcedure
Procedure.l db_field_length(*this.SMYSQL)
  
  If *this And *this\field
    ProcedureReturn *this\field\length
  EndIf
  
EndProcedure
Procedure.l db_field_length_max(*this.SMYSQL)
  
  If *this And *this\field
    ProcedureReturn *this\field\max_length
  EndIf
  
EndProcedure
Procedure.s db_field_name(*this.SMYSQL)
  
  If *this And *this\field
    ProcedureReturn *this\field\name
  EndIf
  
EndProcedure
Procedure.l db_field_reset(*this.SMYSQL)
  
  If *this And *this\result
    ProcedureReturn mysql_field_seek(*this\result, 0)
  EndIf
  
EndProcedure
Procedure.l db_field_type(*this.SMYSQL)
  
  If *this And *this\field
    ProcedureReturn *this\field\type
  EndIf
  
EndProcedure
Procedure.s db_field_type_string(*this.SMYSQL)
  
  If *this And *this\field
    ProcedureReturn mysql_type_string(*this\field\type)
  EndIf
  
EndProcedure
Procedure.l db_free(*mysql.SMYSQL)
  
  If *mysql
    
    If *mysql\result
      mysql_free_result(*mysql\result)
    EndIf
    
    If *mysql\link
      mysql_close(*mysql\link) 
    EndIf
    
  EndIf
  
EndProcedure
Procedure.l db_GetDate(*this.SMYSQL, name.s)
  
  Protected *field.MYSQL_FIELD, nFields.l, i.l
  
  If *this\result And *this\row
    
    nFields = mysql_num_fields(*this\result)
    
    If nFields
      
      mysql_field_seek(*this\result, 0) 
      
      For i = 0 To nFields - 1
        
        *field = mysql_fetch_field(*this\result)
        
        If *field\name = name
          ProcedureReturn ParseDate("%yyyy-%mm-%dd", *this\row\field[i])
        EndIf
        
      Next
      
    EndIf
    
  EndIf
  
EndProcedure
Procedure.l db_GetDateTime(*this.SMYSQL, name.s)
  
  Protected *field.MYSQL_FIELD, nFields.l, i.l
  
  If *this\result And *this\row
    
    nFields = mysql_num_fields(*this\result)
    
    If nFields
      
      mysql_field_seek(*this\result, 0) 
      
      For i = 0 To nFields - 1
        
        *field = mysql_fetch_field(*this\result)
        
        If *field\name = name
          ProcedureReturn ParseDate("%yyyy-%mm-%dd %hh:%ii:%ss", *this\row\field[i])
        EndIf
        
      Next
      
    EndIf
    
  EndIf
  
EndProcedure
Procedure.d db_GetDouble(*this.SMYSQL, name.s)
  
  Protected *field.MYSQL_FIELD, nFields.l, i.l
  
  If *this\result And *this\row
    
    nFields = mysql_num_fields(*this\result)
    
    If nFields
      
      mysql_field_seek(*this\result, 0) 
      
      For i = 0 To nFields - 1
        
        *field = mysql_fetch_field(*this\result)
        
        If *field\name = name
          ProcedureReturn ValD(*this\row\field[i])
        EndIf
        
      Next
      
    EndIf
    
  EndIf
  
EndProcedure
Procedure.f db_GetFloat(*this.SMYSQL, name.s)
  
  Protected *field.MYSQL_FIELD, nFields.l, i.l
  
  If *this\result And *this\row
    
    nFields = mysql_num_fields(*this\result)
    
    If nFields
      
      mysql_field_seek(*this\result, 0) 
      
      For i = 0 To nFields - 1
        
        *field = mysql_fetch_field(*this\result)
        
        If *field\name = name
          ProcedureReturn ValF(*this\row\field[i])
        EndIf
        
      Next
      
    EndIf
    
  EndIf
  
EndProcedure
Procedure.l db_GetLong(*this.SMYSQL, name.s)
  
  Protected *field.MYSQL_FIELD, nFields.l, i.l
  
  If *this\result And *this\row
    
    nFields = mysql_num_fields(*this\result)
    
    If nFields
      
      mysql_field_seek(*this\result, 0) 
      
      For i = 0 To nFields - 1
        
        *field = mysql_fetch_field(*this\result)
        
        If *field\name = name
          ProcedureReturn Val(*this\row\field[i])
        EndIf
        
      Next
      
    EndIf
    
  EndIf
  
EndProcedure
Procedure.q db_GetQuad(*this.SMYSQL, name.s)
  
  Protected *field.MYSQL_FIELD, nFields.l, i.l
  
  If *this\result And *this\row
    
    nFields = mysql_num_fields(*this\result)
    
    If nFields
      
      mysql_field_seek(*this\result, 0) 
      
      For i = 0 To nFields - 1
        
        *field = mysql_fetch_field(*this\result)
        
        If *field\name = name
          ;ProcedureReturn ValQ(*this\row\field[i])
          ProcedureReturn Val(*this\row\field[i])
        EndIf
        
      Next
      
    EndIf
    
  EndIf
  
EndProcedure
Procedure.s db_GetString(*this.SMYSQL, name.s)
  
  Protected *field.MYSQL_FIELD, nFields.l, i.l
  
  If *this\result And *this\row
    
    nFields = mysql_num_fields(*this\result)
    
    If nFields
      
      mysql_field_seek(*this\result, 0)
      
      For i = 0 To nFields - 1
        
        *field = mysql_fetch_field(*this\result)
        
        If *field\name = name
          ProcedureReturn *this\row\field[i]
        EndIf
        
      Next
      
    EndIf
    
  EndIf
  
EndProcedure
Procedure.l db_GetTime(*this.SMYSQL, name.s)
  
  Protected *field.MYSQL_FIELD, nFields.l, i.l
  
  If *this\result And *this\row
    
    nFields = mysql_num_fields(*this\result)
    
    If nFields
      
      mysql_field_seek(*this\result, 0) 
      
      For i = 0 To nFields - 1
        
        *field = mysql_fetch_field(*this\result)
        
        If *field\name = name
          ProcedureReturn ParseDate("%hh:%ii:%ss", *this\row\field[i])
        EndIf
        
      Next
      
    EndIf
    
  EndIf
  
EndProcedure
Procedure.l db_get_date(*this.SMYSQL, column.l = 0)
  
  If *this And *this\row 
    ProcedureReturn ParseDate("%yyyy-%mm-%dd", *this\row\field[column])
  EndIf
  
EndProcedure
Procedure.s db_get_date_string(*this.SMYSQL, column.l = 0)
  
  If *this And *this\row 
    Protected date.l = ParseDate("%yyyy-%mm-%dd", *this\row\field[column])
    If date <> -1
      ProcedureReturn FormatDate("%dd-%mm-%yyyy", date)
    EndIf
  EndIf
  
EndProcedure
Procedure.l db_get_datetime(*this.SMYSQL, column.l = 0)
  
  If *this And *this\row 
    ProcedureReturn ParseDate("%yyyy-%mm-%dd %hh:%ii:%ss", *this\row\field[column])
  EndIf
  
EndProcedure
Procedure.s db_get_datetime_string(*this.SMYSQL, column.l = 0)
  
  If *this And *this\row 
    Protected datetime.l = ParseDate("%yyyy-%mm-%dd %hh:%ii:%ss", *this\row\field[column])
    If datetime <> -1
      ProcedureReturn FormatDate("%dd-%mm-%yyyy %hh:%ii:%ss", datetime)
    EndIf
  EndIf
  
EndProcedure
Procedure.d db_get_double(*this.SMYSQL, column.l = 0)
  
  If *this And *this\row 
    ProcedureReturn ValD(*this\row\field[column])
  EndIf
  
EndProcedure
Procedure.f db_get_float(*this.SMYSQL, column.l = 0)
  
  If *this And *this\row 
    ProcedureReturn ValF(*this\row\field[column])
  EndIf
  
EndProcedure
Procedure.l db_get_long(*this.SMYSQL, column.l = 0)
  
  If *this And *this\row 
    ProcedureReturn Val(*this\row\field[column])
  EndIf
  
EndProcedure
Procedure.q db_get_quad(*this.SMYSQL, column.l = 0)
  
  If *this And *this\row 
    ;ProcedureReturn ValQ(*this\row\field[column])
    ProcedureReturn Val(*this\row\field[column])
  EndIf
  
EndProcedure
Procedure.s db_get_string(*this.SMYSQL, column.l = 0)
  
  If *this And *this\row 
    ProcedureReturn *this\row\field[column]
  EndIf
  
EndProcedure
Procedure.l db_get_time(*this.SMYSQL, column.l = 0)
  
  If *this And *this\row 
    ProcedureReturn ParseDate("%hh:%ii:%ss", *this\row\field[column])
  EndIf
  
EndProcedure
Procedure.s db_get_time_string(*this.SMYSQL, column.l = 0)
  
  If *this And *this\row 
    ProcedureReturn *this\row\field[column]
  EndIf
  
EndProcedure
Procedure.s db_info(*this.SMYSQL)
  
  If *this And *this\link 
    
    If mysql_info(*this\link) 
      ;ProcedureReturn PeekS(mysql_info(*this\link))
      ProcedureReturn PeekS_Utf8(mysql_info(*this\link))
    EndIf
    
  EndIf
  
EndProcedure
Procedure.l db_insert_id(*this.SMYSQL)
  
  If *this And *this\link 
    mysql_insert_id(*this\link) 
  EndIf
  
EndProcedure
Procedure.l db_num_fields(*this.SMYSQL)
  
  If *this And *this\result
    ProcedureReturn mysql_num_fields(*this\result)
  EndIf
  
EndProcedure
Procedure.l db_num_rows(*this.SMYSQL)
  
  If *this And *this\result
    ProcedureReturn mysql_num_rows(*this\result)
  EndIf
  
EndProcedure
Procedure.l db_ping(*this.SMYSQL)
  
  If *this And *this\link
    
    If mysql_ping(*this\link) = #MYSQL_NOERROR
      ProcedureReturn #True
    EndIf
    
  EndIf
  
EndProcedure
Procedure.l db_query(*this.SMYSQL, query.s)
  
  If *this And *this\link
    
    If *this\result
      mysql_free_result(*this\result)
    EndIf
    
    If mysql_real_query(*this\link, query, Len(query)) = #MYSQL_NOERROR
    ;If mysql_query(*this\link, query) = #MYSQL_NOERROR
      
      *this\result = mysql_store_result(*this\link)
      If *this\result
        ProcedureReturn #True
      EndIf
      
    EndIf
    
  EndIf
  
EndProcedure
Procedure.l db_query_from_file(*this.SMYSQL, fileIn.s)
  
  Protected result.l, file.l, query.s
  
  If *this And *this\link
    
    If *this\result
      mysql_free_result(*this\result)
    EndIf
    
    file = ReadFile(#PB_Any, fileIn)
    
    If file
      
      query = Space(Lof(file))
      
      If ReadData(file, @query, Lof(file)) = Lof(file)
        
        If mysql_real_query(*this\link, query, Len(query)) = #MYSQL_NOERROR
          
          *this\result = mysql_store_result(*this\link)
          
          If *this\result
            result = #True
          EndIf
          
        EndIf
        
      EndIf
      
      CloseFile(file)
      
    EndIf
    
  EndIf
  
  ProcedureReturn result
  
EndProcedure
Procedure.l db_query_xml(*this.SMYSQL, query.s, fileOut.s, table.l = #False, db.l = #False)
  
  Protected file.l, result.l, *result
  Protected i.l, num_rows.l, *row.MYSQL_ROW
  Protected j.l, num_fields.l, *field.MYSQL_FIELD
  
  If *this And *this\link
    
    If mysql_real_query(*this\link, query, Len(query)) = #MYSQL_NOERROR
      
      *result = mysql_store_result(*this\link)
      
      If *result
        
        file = CreateFile(#PB_Any, fileOut)
        
        If file
          
          num_rows   = mysql_num_rows(*result)
          num_fields = mysql_num_fields(*result)
          
          WriteStringN(file, "<?xml version='1.0' ?>")
          WriteStringN(file, "<mysql>")
          WriteStringN(file, "  <date>" + FormatDate("%yyyy-%mm-%dd %hh:%ii:%ss", Date()) + "</date>")
          WriteStringN(file, "  <query>" + db_escape_string(*this, query) + "</query>")
          WriteStringN(file, "  <fields count='" + Str(num_fields) + "'>")
          
          For j = 0 To num_fields - 1
            *field = mysql_fetch_field(*result)
            WriteStringN(file, "    <field id='" + Str(j+1) + "' type='"   + mysql_type_string(*field\Type) + "' length='" + Str(*field\length) + "' name='" + mysql_name_string(*field, db, table) + " />")
          Next j
          
          WriteStringN(file, "  </fields>")
          WriteStringN(file, "  <rows count='" + Str(num_rows) + "'>")
          
          For i = 0 To num_rows - 1
            
            mysql_field_seek(*result, 0)
            *row = mysql_fetch_row(*result)
            WriteStringN(file, "    <row id='" + Str(i+1) + "'>")
            
            For j = 0 To num_fields - 1
              *field = mysql_fetch_field(*result)
              WriteString (file, "      <" + mysql_name_string(*field, db, table) + ">")
              WriteString (file, db_escape_string(*this, *row\field[j]))
              WriteStringN(file, "</" + mysql_name_string(*field, db, table) + ">")
            Next j
            
            WriteStringN(file, "    </row>")
            
          Next i
          
          WriteStringN(file, "  </rows>")
          WriteStringN(file, "</mysql>")
          CloseFile(file)
          result = #True
          
        EndIf
        
        mysql_free_result(*result)
        
      EndIf
      
    EndIf
    
  EndIf
  
  ProcedureReturn result
  
EndProcedure
Procedure.l db_query_xml_from_file(*this.SMYSQL, fileIn.s, fileOut.s, table.l = #False, db.l = #False)
  
  ;**** to do
  
EndProcedure
Procedure.l db_row(*this.SMYSQL)
  
  If *this And *this\result
    
    *this\row = mysql_fetch_row(*this\result)
    
    ProcedureReturn *this\row
    
  EndIf
  
EndProcedure
Procedure.l db_selectdb(*this.SMYSQL, database.s)
  
  If *this And *this\link And (mysql_select_db(*this\link, database) = #MYSQL_NOERROR)
    ProcedureReturn #True
  EndIf
  
EndProcedure
Procedure.l db_update(*this.SMYSQL, query.s)
  
  If *this And *this\link
    
    If mysql_real_query(*this\link, query, Len(query)) = #MYSQL_NOERROR
      ProcedureReturn #True
    EndIf
    
  EndIf
  
EndProcedure
Procedure.l db_update_from_file(*this.SMYSQL, fileIn.s)
  
  Protected result.l, file.l, query.s
  
  If *this And *this\link
    
    file = ReadFile(#PB_Any, fileIn)
    
    If file
      
      query = Space(Lof(file))
      
      If ReadData(file, @query, Lof(file)) = Lof(file)
        If mysql_real_query(*this\link, query, Len(query)) = #MYSQL_NOERROR
          result = #True
        EndIf
      EndIf
      
      CloseFile(file)
      
    EndIf
    
  EndIf
  
  ProcedureReturn result
  
EndProcedure
Procedure.s db_host(*this.SMYSQL)
  
  If *this And *this\link
    If mysql_get_host_info(*this\link)
      ;ProcedureReturn PeekS(mysql_get_host_info(*this\link))
      ProcedureReturn PeekS_Utf8(mysql_get_host_info(*this\link))
    EndIf
  EndIf
  
EndProcedure
Procedure.l db_proto(*this.SMYSQL)
  
  If *this And *this\link
    ProcedureReturn mysql_get_proto_info(*this\link)
  EndIf
  
EndProcedure
Procedure.l db_client_long(*this.SMYSQL)
  
  If *this
    ProcedureReturn mysql_get_client_version()
  EndIf
  
EndProcedure
Procedure.s db_client_string(*this.SMYSQL)
  
  If *this And mysql_get_client_info()
    ;ProcedureReturn PeekS(mysql_get_client_info())
    ProcedureReturn PeekS_Utf8(mysql_get_client_info())
  EndIf
  
EndProcedure
Procedure.l db_server_long(*this.SMYSQL)
  
  If *this And *this\link
    ProcedureReturn mysql_get_server_version(*this\link)
  EndIf
  
EndProcedure
Procedure.s db_server_string(*this.SMYSQL)
  
  If *this And *this\link
    If mysql_get_server_info(*this\link)
      ;ProcedureReturn PeekS(mysql_get_server_info(*this\link))
      ProcedureReturn PeekS_Utf8(mysql_get_server_info(*this\link))
    EndIf
  EndIf
  
EndProcedure
; added 24/07/09
Procedure.l db_autocommit(*this.SMYSQL, mode.l)
  If *this And *this\link
    
    If mysql_autocommit(*this\link, mode) = #MYSQL_NOERROR
      ProcedureReturn #True
    EndIf
    
  EndIf
EndProcedure
Procedure.l db_commit(*this.SMYSQL)
  If *this And *this\link
    
    If mysql_commit(*this\link) = #MYSQL_NOERROR
      ProcedureReturn #True
    EndIf
    
  EndIf
EndProcedure
;-
;- Public - MySQL Interface
;-
ProcedureDLL.l mysql(host.s = "localhost", user.s = "root", pwd.s = "", db.s = "", port.l = 3306, flags.l = #Null)
  
  Protected *this.SMYSQL = AllocateMemory(SizeOf(SMYSQL))
  
  If *this
    
    *this\vt = AllocateMemory(SizeOf(IMYSQL_VTABLE))
    
    If *this\vt
      
      *this\link = mysql_init(#Null)
      
      If *this\link
        
        If mysql_real_connect(*this\link, host, user, pwd, db, port, "NULL", flags) = *this\link
          
          *this\vt\host                = @db_host() 
          *this\vt\proto               = @db_proto() 
          *this\vt\client_long         = @db_client_long() 
          *this\vt\client_string       = @db_client_string() 
          *this\vt\server_long         = @db_server_long() 
          *this\vt\server_string       = @db_server_string() 
          
          *this\vt\affected_rows       = @db_affected_rows() 
          *this\vt\error               = @db_error() 
          *this\vt\escape_string       = @db_escape_string() 
          *this\vt\field               = @db_field() 
          *this\vt\field_length        = @db_field_length() 
          *this\vt\field_length_max    = @db_field_length_max() 
          *this\vt\field_name          = @db_field_name() 
          *this\vt\field_reset         = @db_field_reset() 
          *this\vt\field_type          = @db_field_type() 
          *this\vt\field_type_string   = @db_field_type_string() 
          *this\vt\free                = @db_free() 
          *this\vt\GetDate             = @db_GetDate()
          *this\vt\GetDateTime         = @db_GetDateTime()
          *this\vt\GetDouble           = @db_GetDouble()
          *this\vt\GetFloat            = @db_GetFloat()
          *this\vt\GetLong             = @db_GetLong()
          *this\vt\GetQuad             = @db_GetQuad()
          *this\vt\GetString           = @db_GetString()
          *this\vt\GetTime             = @db_GetTime()
          *this\vt\get_date            = @db_get_date() 
          *this\vt\get_date_string     = @db_get_date_string() 
          *this\vt\get_datetime        = @db_get_datetime() 
          *this\vt\get_datetime_string = @db_get_datetime_string() 
          *this\vt\get_double          = @db_get_double() 
          *this\vt\get_float           = @db_get_float() 
          *this\vt\get_long            = @db_get_long() 
          *this\vt\get_quad            = @db_get_quad() 
          *this\vt\get_string          = @db_get_string() 
          *this\vt\get_time            = @db_get_time()
          *this\vt\get_time_string     = @db_get_time_string()
          *this\vt\info                = @db_info() 
          *this\vt\insert_id           = @db_insert_id() 
          *this\vt\num_fields          = @db_num_fields() 
          *this\vt\num_rows            = @db_num_rows() 
          *this\vt\ping                = @db_ping() 
          *this\vt\query               = @db_query() 
          *this\vt\query_from_file     = @db_query_from_file() 
          *this\vt\query_xml           = @db_query_xml() 
          *this\vt\query_xml_from_file = @db_query_xml_from_file() 
          *this\vt\row                 = @db_row() 
          *this\vt\selectdb            = @db_selectdb() 
          *this\vt\update              = @db_update() 
          *this\vt\update_from_file    = @db_update_from_file() 
          *this\vt\autocommit          = @db_autocommit()
          *this\vt\commit              = @db_commit()
          ProcedureReturn *this
          
        EndIf
        
        mysql_close(*this\link) : *this\link = #Null
        
      EndIf
      
      FreeMemory(*this\vt) : *this\vt = #Null
      
    EndIf
    
    FreeMemory(*this) : *this = #Null
    
  EndIf
  
EndProcedure
ProcedureDLL.l mysql_from_ini()
  
  OpenPreferences("libmysql.ini")
  
  PreferenceGroup("CONNECTION")
  
  Protected db_host.s = ReadPreferenceString("host", "localhost")
  Protected db_user.s = ReadPreferenceString("user", "root")
  Protected db_pass.s = ReadPreferenceString("pass", #NULL$)
  Protected db_base.s = ReadPreferenceString("base", #NULL$)
  Protected db_port.l = ReadPreferenceLong  ("port", 3306)
  Protected db_opts.l = ReadPreferenceLong  ("opts", #Null)
  
  ClosePreferences()
  
  ProcedureReturn mysql(db_host, db_user, db_pass, db_base, db_port, db_opts)
  
EndProcedure
DisableExplicit
;- 
;- End Of File
;- 
Code: Select all
IncludePath #PB_Compiler_Home + "Includes\"
XIncludeFile "libmysql_utf8.pbi"      ;Unicode ou ascii
db.IMYSQL = mysql("localhost","hotline", "", "mysql")
If db
 
  If db\query("SELECT 'Hello' AS 'f1', 'World !' AS 'f2', NOW() as 'f3', 12345.6789")
   
    While db\row()
     
      Debug db\GetString("f1")
      Debug db\GetString("f2")
     
      Debug FormatDate("%dd.%mm.%yyyy", db\GetDate("f3"))
     
      Debug db\get_double(3)
     
    Wend
   
  Else
   
    Debug db\error()
   
  EndIf
 
  db\free()
 
EndIf

