mysql
Posted: Fri Jan 11, 2013 4:27 pm
				
				Has anyone a 'working' example how to use mysql in PB?
Richard
			Richard
Code: Select all
;
; MySQL.pbi V1.00
;
; a wrapper for MySQL 6.0.2
;
; by BKK
Enumeration
  #MYSQL_OPT_CONNECT_TIMEOUT
  #MYSQL_OPT_COMPRESS
  #MYSQL_OPT_NAMED_PIPE
  #MYSQL_INIT_COMMAND
  #MYSQL_READ_DEFAULT_FILE
  #MYSQL_READ_DEFAULT_GROUP
  #MYSQL_SET_CHARSET_DIR
  #MYSQL_SET_CHARSET_NAME
  #MYSQL_OPT_LOCAL_INFILE
  #MYSQL_OPT_PROTOCOL
  #MYSQL_SHARED_MEMORY_BASE_NAME
  #MYSQL_OPT_READ_TIMEOUT
  #MYSQL_OPT_WRITE_TIMEOUT
  #MYSQL_OPT_USE_RESULT
  #MYSQL_OPT_USE_REMOTE_CONNECTION
  #MYSQL_OPT_USE_EMBEDDED_CONNECTION
  #MYSQL_OPT_GUESS_CONNECTION
  #MYSQL_SET_CLIENT_IP
  #MYSQL_SECURE_AUTH
  #MYSQL_REPORT_DATA_TRUNCATION
  #MYSQL_OPT_RECONNECT
  #MYSQL_OPT_SSL_VERIFY_SERVER_CERT
EndEnumeration
Enumeration
  #MYSQL_STATUS_READY
  #MYSQL_STATUS_GET_RESULT
  #MYSQL_STATUS_USE_RESULT 
EndEnumeration
Enumeration
  #MYSQL_PROTOCOL_DEFAULT
  #MYSQL_PROTOCOL_TCP
  #MYSQL_PROTOCOL_SOCKET
  #MYSQL_PROTOCOL_PIPE
  #MYSQL_PROTOCOL_MEMORY
EndEnumeration
Enumeration
  #MYSQL_STMT_INIT_DONE = 1
  #MYSQL_STMT_PREPARE_DONE
  #MYSQL_STMT_EXECUTE_DONE
  #MYSQL_STMT_FETCH_DONE
EndEnumeration
Enumeration
  #STMT_ATTR_UPDATE_MAX_LENGTH
  #STMT_ATTR_CURSOR_TYPE
  #STMT_ATTR_PREFETCH_ROWS
EndEnumeration
#SCRAMBLE_LENGTH = 20
#SCRAMBLE_LENGTH_323 = 8
#SCRAMBLED_PASSWORD_CHAR_LENGTH = (#SCRAMBLE_LENGTH*2+1)
#SCRAMBLED_PASSWORD_CHAR_LENGTH_323 = (#SCRAMBLE_LENGTH_323*2)
#NOT_NULL_FLAG = 1		  ; Field can't be NULL
#PRI_KEY_FLAG	= 2       ; Field is part of a primary key
#UNIQUE_KEY_FLAG = 4    ; Field is part of a unique key
#MULTIPLE_KEY_FLAG = 8  ; Field is part of a key
#BLOB_FLAG = 16         ; Field is a blob
#UNSIGNED_FLAG = 32     ; Field is unsigned
#ZEROFILL_FLAG = 64     ; Field is zerofill
#BINARY_FLAG = 128      ; Field is binary
#ENUM_FLAG = 256        ; field is an enum
#AUTO_INCREMENT_FLAG = 512  ; field is a autoincrement field
#TIMESTAMP_FLAG = 1024      ; Field is a timestamp
#SET_FLAG = 2048            ; field is a set
#NO_DEFAULT_VALUE_FLAG = 4096 ; Field doesn't have default value
#N_UPDATE_NOW_FLAG = 8192     ; Field is set To NOW on UPDATE
#NUM_FLAG = 32768             ; Field is num (For clients)
#PART_KEY_FLAG = 16384        ; Intern; Part of some key
#GROUP_FLAG = 32768           ; Intern: Group field
#UNIQUE_FLAG = 65536          ; Intern: Used by sql_yacc
#BINCMP_FLAG = 131072         ; Intern: Used by sql_yacc
#GET_FIXED_FIELDS_FLAG = (1 << 18)  ; Used To get fields in item tree
#FIELD_IN_PART_FUNC_FLAG = (1 << 19)  ; Field part of partition func
#FIELD_IN_ADD_INDEX = (1<< 20)        ; Intern: Field used in ADD INDEX
#FIELD_IS_RENAMED = (1<< 21)          ; Intern: Field is being renamed
#FIELD_STORAGE_FLAGS = 22             ; Storage type: bit 22, 23 And 24
#COLUMN_FORMAT_FLAGS = 25             ; Column format: bit 25, 26 And 27
#REFRESH_GRANT = 1    ; Refresh grant tables
#REFRESH_LOG = 2      ; Start on new log file
#REFRESH_TABLES = 4   ; close all tables
#REFRESH_HOSTS = 8    ; Flush host cache
#REFRESH_STATUS = 16  ; Flush status variables
#REFRESH_THREADS = 32 ; Flush thread cache
#REFRESH_SLAVE = 64   ; Reset master info And restart slave thread
#REFRESH_MASTER = 128 ; Remove all bin logs in the index And truncate the index
#REFRESH_READ_LOCK = 16384  ; Lock tables For Read
#REFRESH_FAST = 32768       ; Intern flag
#REFRESH_QUERY_CACHE = 65536
#REFRESH_QUERY_CACHE_FREE = $20000  ; pack query cache
#REFRESH_DES_KEY_FILE = $40000
#REFRESH_USER_RESOURCES = $80000
#REFRESH_BACKUP_LOG = $200000
#CLIENT_LONG_PASSWORD	= 1	            ; new more secure passwords
#CLIENT_FOUND_ROWS = 2	              ; Found instead of affected rows
#CLIENT_LONG_FLAG	= 4	                ; Get all column flags
#CLIENT_CONNECT_WITH_DB = 8	          ; One can specify db on connect
#CLIENT_NO_SCHEMA	= 16	              ; Don't allow database.table.column
#CLIENT_COMPRESS = 32	                ; Can use compression protocol
#CLIENT_ODBC = 64	                    ; Odbc client
#CLIENT_LOCAL_FILES =	128	            ; Can use LOAD Data LOCAL
#CLIENT_IGNORE_SPACE = 256	          ; Ignore spaces before '('
#CLIENT_PROTOCOL_41	= 512	            ; New 4.1 protocol
#CLIENT_INTERACTIVE	= 1024	          ; This is an interactive client
#CLIENT_SSL = 2048	                  ; Switch To SSL after handshake
#CLIENT_IGNORE_SIGPIPE = 4096         ; IGNORE sigpipes
#CLIENT_TRANSACTIONS = 8192	          ; Client knows about transactions
#CLIENT_RESERVED = 16384              ; Old flag For 4.1 protocol
#CLIENT_SECURE_CONNECTION = 32768     ; New 4.1 authentication
#CLIENT_MULTI_STATEMENTS = (1 << 16)  ; Enable/disable multi-stmt support
#CLIENT_MULTI_RESULTS = (1 << 17)     ; Enable/disable multi-results
#CLIENT_PS_MULTI_RESULTS = (1 << 18)  ; Multi-results in PS-protocol
#CLIENT_SSL_VERIFY_SERVER_CERT = (1 << 30)
#CLIENT_REMEMBER_OPTIONS = (1 << 31) 
#SERVER_STATUS_IN_TRANS = 1               ; Transaction has started
#SERVER_STATUS_AUTOCOMMIT = 2             ; Server in auto_commit mode
#SERVER_MORE_RESULTS_EXISTS = 8           ; Multi query - Next query exists
#SERVER_QUERY_NO_GOOD_INDEX_USED = 16
#SERVER_QUERY_NO_INDEX_USED = 32
#SERVER_STATUS_CURSOR_EXISTS = 64
#SERVER_STATUS_LAST_ROW_SENT = 128
#SERVER_STATUS_DB_DROPPED = 256           ; A database was dropped
#SERVER_STATUS_NO_BACKSLASH_ESCAPES = 512
#SERVER_STATUS_METADATA_CHANGED = 1024
#SERVER_QUERY_WAS_SLOW = 2048
#SERVER_PS_OUT_PARAMS = 4096 
Enumeration
  #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 = 247
  #MYSQL_TYPE_SET = 248
  #MYSQL_TYPE_TINY_BLOB = 249
  #MYSQL_TYPE_MEDIUM_BLOB = 250
  #MYSQL_TYPE_LONG_BLOB = 251
  #MYSQL_TYPE_BLOB = 252
  #MYSQL_TYPE_VAR_STRING = 253
  #MYSQL_TYPE_STRING = 254
  #MYSQL_TYPE_GEOMETRY = 255
  #MAX_NO_FIELD_TYPES        ; Should always be last
EndEnumeration
#MYSQL_SHUTDOWN_KILLABLE_CONNECT = (1 << 0)
#MYSQL_SHUTDOWN_KILLABLE_TRANS = (1 << 1)
#MYSQL_SHUTDOWN_KILLABLE_LOCK_TABLE = (1 << 2)
#MYSQL_SHUTDOWN_KILLABLE_UPDATE = (1 << 3)
Enumeration
  #SHUTDOWN_DEFAULT = 0
  #SHUTDOWN_WAIT_CONNECTIONS = #MYSQL_SHUTDOWN_KILLABLE_CONNECT
  #SHUTDOWN_WAIT_TRANSACTIONS = #MYSQL_SHUTDOWN_KILLABLE_TRANS
  #SHUTDOWN_WAIT_UPDATES = #MYSQL_SHUTDOWN_KILLABLE_UPDATE
  #SHUTDOWN_WAIT_ALL_BUFFERS = (#MYSQL_SHUTDOWN_KILLABLE_UPDATE << 1)
  #SHUTDOWN_WAIT_CRITICAL_BUFFERS = (#MYSQL_SHUTDOWN_KILLABLE_UPDATE << 1) + 1
  #KILL_QUERY = 254
  #KILL_CONNECTION = 255
EndEnumeration
Enumeration
  #CURSOR_TYPE_NO_CURSOR = 0
  #CURSOR_TYPE_READ_ONLY = 1
  #CURSOR_TYPE_FOR_UPDATE = 2
  #CURSOR_TYPE_SCROLLABLE = 4
EndEnumeration
Enumeration
  #MYSQL_OPTION_MULTI_STATEMENTS_ON
  #MYSQL_OPTION_MULTI_STATEMENTS_OFF
EndEnumeration
#MYSYS_ERRMSG_SIZE = 512
#HOSTNAME_LENGTH = 60
#SYSTEM_CHARSET_MBMAXLEN = 4
#NAME_CHAR_LEN = 64
#USERNAME_CHAR_LENGTH = 16
#NAME_LEN = (#NAME_CHAR_LEN * #SYSTEM_CHARSET_MBMAXLEN)
#USERNAME_LENGTH = (#USERNAME_CHAR_LENGTH * #SYSTEM_CHARSET_MBMAXLEN)
#SERVER_VERSION_LENGTH = 60
#SQLSTATE_LENGTH = 5
#MYSQL_ERRMSG_SIZE = 512
Structure mysql_field
  name.s                      ; Name of column
  org_name.s                  ; Original column name, if an alias
  table.s                     ; Table of column if column was a field
  org_table.s                 ; Org table name, if table was an alias
  db.s                        ; Database for table
  catalog.s                   ; Catalog for table
  def.s                       ; 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
Structure mysql_rows
  *NextRow                    ; list of rows
  *Data                       ;
  length.l                    ;
EndStructure
Structure mysql_data
  *Data                       ;
  *embedded_info              ;
  *alloc                      ;
  rows.q                      ;
  fields.i                    ;
  *extension                  ;
EndStructure
Structure mysql_options
  connect_timeout.i
  read_timeout.i
  write_timeout.i
  port.i
  protocol.i
  client_flag.l
  host.s
  user.s
  password.s
  unix_socket.s
  db.s
  *init_commands
  my_cnf_file.s
  my_cnf_group.s
  charset_dir.s
  charset_name.s
  ssl_key.s
  ssl_cert.s
  ssl_ca.s
  ssl_capath.s
  ssl_cipher.s
  shared_memory_base_name.s
  max_allowed_packet.l
  use_ssl.b
  compress.b
  named_pipe.b
  unused1.b
  unused2.b
  unused3.b
  unused4.b
  methods_to_use.i
  client_ip.s
  secure_auth.b
  report_data_truncation.b
  *local_infile_init
  *local_infile_read
  *local_infile_end
  *local_infile_error
  *local_infile_userdata
  *extension
EndStructure
Structure mysql
  *net                              ; Communication parameters
  *connector_fd.a                   ; ConnectorFd for SSL
  host.s
  user.s
  passwd.s
  unix_socket.s
  server_version.s
  host_info.s
  info.s
  db.s
  *charset
  *fields                           ;
  *field_alloc                      ;
  affected_rows.q                   ;
  insert_id.q                       ; id if insert on table with NEXTNR
  extra_info.q                      ; Not used
  thread_id.l                       ; Id for connection in server
  packet_length.l                   ;
  port.i                            ;
  client_flag.l
  server_capabilities.l             ;
  protocol_version.i                ;
  field_count.i                     ;
  server_status.i                   ;
  server_language.i                 ;
  warning_count.i                   ;
  options.mysql_options
  status.i
  free_me.b                         ; If free in mysql_close
  reconnect.b                       ; set to 1 if automatic reconnect
  scramble.a[#SCRAMBLE_LENGTH + 1]  ;
  unused1.b
  *unused2
  *unused3
  *unused4
  *unused5
  *stmts                            ; list of all statements
  *methods.st_mysql_methods
  *thd;
  *unbuffered_fetch_owner;
  *info_buffer;
  *extension; 
EndStructure
Structure character_set
  number.i      ; character set number
  state.i       ; character set state
  csname.s      ; collation name
  name.s        ; character set name
  comment.s     ; comment
  dir.s         ; character set directory
  mbminlen.i    ; min. length for multibyte strings
  mbmaxlen.i    ; max. length for multibyte strings
EndStructure
Structure mysql_res
  row_count.q
  *fields.mysql_field
  *Datas.mysql_data
  *data_cursor.mysql_rows
  *lengths.l                    ; column lengths of current row
  *handle.mysql                 ; for unbuffered reads
  *methods.mysql_methods        ;
  *row                          ; If unbuffered read
  *current_row                  ; buffer to current row
  *field_alloc                  ;
  field_count.i
  current_field.i               ;
  eof.b                         ; Used by mysql_fetch_row
  unbuffered_fetch_cancelled.b  ;
  *extension
EndStructure
Structure mysql_parameter
  *p_max_allowed_packet.l
  *p_net_buffer_length.l
  *extension
EndStructure
Structure mysql_bind
  *length.l         ; output length pointer
  *is_null.b        ; Pointer to null indicator
  *buffer           ; buffer to get/put data
  *error.b          ;
  *row_ptr.a        ; for the current data position
  *store_param_func
  *fetch_result
  *skip_result
  buffer_length.l   ;
  offset.l          ; offset position for char/binary fetch
  length_value.l    ; Used if length is 0
  param_number.i    ; For null count and error messages
  pack_length.i     ; Internal length for packed data
  buffer_type.i     ; buffer type
  error_value.b     ; used if error is 0
  is_unsigned.b     ; set if integer type is unsigned
  long_data_used.b  ; If used with mysql_send_long_data
  is_null_value.b   ; Used if is_null is 0
  *extension        ;
EndStructure
Structure mysql_stmt
  *mem_root                         ; root allocations
  *List                             ; list to keep track of all stmts
  *mysql.mysql                      ; connection handle
  *params.mysql_bind                ; input parameters
  *bind.mysql_bind                  ; output parameters
  *fields.mysql_field               ; result set metadata
  result.mysql_data                 ; cached result set
  *data_cursor.mysql_rows           ; current row in cached result
  *read_row_func
  affected_rows.q                   ;
  insert_id.q                       ; copy of mysql->insert_id
  stmt_id.l                         ; Id for prepared statement
  flags.l                           ; i.e. type of cursor To open
  prefetch_rows.l                   ; number of rows per one COM_FETCH
  server_status.i                   ;
  last_errno.i                      ; error code
  param_count.i                     ; input parameter count
  field_count.i                     ; number of columns in result set
  state.i                           ; statement state
  last_error.s[#MYSQL_ERRMSG_SIZE]  ; error message
  sqlstate.s[#SQLSTATE_LENGTH + 1]  ;
  send_types_to_server.b            ;
  bind_param_done.b                 ; input buffers were supplied
  bind_result_done.a                ; output buffers were supplied
  unbuffered_fetch_cancelled.b      ;
  update_max_length.b               ;
  *extension                        ;
EndStructure
Structure mysql_methods
  *read_query_result
  *advanced_command
  *read_rows
  *use_result
  *fetch_lengths
  *flush_use_result
  *list_fields
  *read_prepare_result
  *stmt_execute
  *read_binary_rows
  *unbuffered_fetch
  *free_embedded_thd
  *read_statistics
  *next_result
  *read_change_user_result
  *read_rows_from_cursor
EndStructure
Global mysql_lib
CompilerSelect #PB_Compiler_OS
  CompilerCase #PB_OS_Windows
    Global mysql_filename$ = "libmysql.dll"
    Macro OSPrototype
     Prototype
    EndMacro
  CompilerCase #PB_OS_Linux
    Global mysql_filename$ = "libmysql.so.1"
    Macro OSPrototype
     PrototypeC
    EndMacro
  CompilerCase #PB_OS_MacOS
    Global mysql_filename$ = "libmysql.so.1"
    Macro OSPrototype
     PrototypeC
    EndMacro
CompilerEndSelect
OSPrototype.q Proto_mysql_affected_rows(*mysql)
OSPrototype.b Proto_mysql_autocommit(*mysql, auto_mode.b)
OSPrototype.b Proto_mysql_change_user(*mysql, user.s, passwd.s, db.s)
OSPrototype.i Proto_mysql_character_set_name(*mysql)
OSPrototype.i Proto_mysql_close(*mysql)
OSPrototype.b Proto_mysql_commit(*mysql)
OSPrototype Proto_mysql_data_seek(*result, offset.q)
OSPrototype Proto_mysql_debug(debugstr.s)
OSPrototype.i Proto_mysql_dump_debug_info(*mysql)
OSPrototype.b Proto_mysql_embedded()
OSPrototype.b Proto_mysql_eof(*result)
OSPrototype.i Proto_mysql_errno(*mysql)
OSPrototype.s Proto_mysql_error(*mysql)
OSPrototype.l Proto_mysql_escape_string(tostr.s, fromstr.s, from_length.l)
OSPrototype.i Proto_mysql_fetch_field(*result)
OSPrototype.i Proto_mysql_fetch_field_direct(*result, fieldnr.i)
OSPrototype.i Proto_mysql_fetch_fields(*result)
OSPrototype.i Proto_mysql_fetch_lengths(*result)
OSPrototype.i Proto_mysql_fetch_row(*result)
OSPrototype.i Proto_mysql_field_count(*mysql)
OSPrototype.i Proto_mysql_field_seek(*result, offset.i)
OSPrototype.i Proto_mysql_field_tell(*result)
OSPrototype Proto_mysql_free_result(*result)
OSPrototype Proto_mysql_get_character_set_info(*mysql, *charset)
OSPrototype.s Proto_mysql_get_client_info()
OSPrototype.l Proto_mysql_get_client_version()
OSPrototype.s Proto_mysql_get_host_info(*mysql)
OSPrototype.i Proto_mysql_get_parameters()
OSPrototype.i Proto_mysql_get_proto_info(*mysql)
OSPrototype.s Proto_mysql_get_server_info(*mysql)
OSPrototype.l Proto_mysql_get_server_version(*mysql)
OSPrototype.s Proto_mysql_get_ssl_cipher(*mysql)
OSPrototype.l Proto_mysql_hex_string(tostr.s, fromstr.s, fromlen.l)
OSPrototype.s Proto_mysql_info(*mysql)
OSPrototype.i Proto_mysql_init(*mysql)
OSPrototype.q Proto_mysql_insert_id(*mysql)
OSPrototype.i Proto_mysql_kill(*mysql, pid.l)
OSPrototype.i Proto_mysql_list_dbs(*mysql, wild.s)
OSPrototype.i Proto_mysql_list_fields(*mysql, table.s, wild.s)
OSPrototype.i Proto_mysql_list_processes(*mysql)
OSPrototype.i Proto_mysql_list_tables(*mysql, wild.s)
OSPrototype.b Proto_mysql_more_results(*mysql)
OSPrototype.i Proto_mysql_next_result(*mysql)
OSPrototype.i Proto_mysql_num_fields(*result)
OSPrototype.q Proto_mysql_num_rows(*result)
OSPrototype.i Proto_mysql_options(*mysql, option.i, arg.s)
OSPrototype.i Proto_mysql_ping(*mysql)
OSPrototype.i Proto_mysql_query(*mysql, q.s)
OSPrototype.b Proto_mysql_read_query_result(*mysql)
OSPrototype.i Proto_mysql_real_connect(*mysql, host.s, user.s, passwd.s, db.s, port.i, unix_socket.s, clientflag.l)
OSPrototype.l Proto_mysql_real_escape_string(*mysql, tostr.s, fromstr.s, length.l)
OSPrototype.i Proto_mysql_real_query(*mysql, q.s, length.l)
OSPrototype.i Proto_mysql_refresh(*mysql, refresh_options.i)
OSPrototype.b Proto_mysql_rollback(*mysql)
OSPrototype.i Proto_mysql_row_seek(*result, *offset)
OSPrototype.i Proto_mysql_row_tell(*result)
OSPrototype.i Proto_mysql_select_db(*mysql, db.s)
OSPrototype.i Proto_mysql_send_query(*mysql, q.s, length.l)
OSPrototype Proto_mysql_server_end()
OSPrototype.i Proto_mysql_server_init(argc.i, *argv, *groups)
OSPrototype.i Proto_mysql_set_character_set(*mysql, csname.s)
OSPrototype Proto_mysql_set_local_infile_default(*mysql)
OSPrototype.i Proto_mysql_set_local_infile_handler(*mysql, *local_infile_init, *local_infile_read, *local_infile_end, *local_infile_error)
OSPrototype.i Proto_mysql_set_server_option(*mysql, option.i)
OSPrototype.i Proto_mysql_shutdown(*mysql, shutdown_level.i)
OSPrototype.s Proto_mysql_sqlstate(*mysql)
OSPrototype.b Proto_mysql_ssl_set(*mysql, key.s, cert.s, ca.s, capath.s, cipher.s)
OSPrototype.s Proto_mysql_stat(*mysql)
OSPrototype.q Proto_mysql_stmt_affected_rows(*stmt)
OSPrototype.b Proto_mysql_stmt_attr_get(*stmt, attr_type.i, *attr)
OSPrototype.b Proto_mysql_stmt_attr_set(*stmt, attr_type.i, *attr)
OSPrototype.b Proto_mysql_stmt_bind_param(*stmt, *bnd)
OSPrototype.b Proto_mysql_stmt_bind_result(*stmt, *bnd)
OSPrototype.b Proto_mysql_stmt_close(*stmt)
OSPrototype Proto_mysql_stmt_data_seek(*stmt, offset.q)
OSPrototype.i Proto_mysql_stmt_errno(*stmt)
OSPrototype.s Proto_mysql_stmt_error(*stmt)
OSPrototype.i Proto_mysql_stmt_execute(*stmt)
OSPrototype.i Proto_mysql_stmt_fetch(*stmt)
OSPrototype.i Proto_mysql_stmt_fetch_column(*stmt, *bind_arg, column.i, offset.l)
OSPrototype.i Proto_mysql_stmt_field_count(*stmt)
OSPrototype.b Proto_mysql_stmt_free_result(*stmt)
OSPrototype.i Proto_mysql_stmt_init(*stmt)
OSPrototype.q Proto_mysql_stmt_insert_id(*stmt)
OSPrototype.i Proto_mysql_stmt_next_result(*stmt)
OSPrototype.q Proto_mysql_stmt_num_rows(*stmt)
OSPrototype.l Proto_mysql_stmt_param_count(*stmt)
OSPrototype.i Proto_mysql_stmt_param_metadata(*stmt)
OSPrototype.i Proto_mysql_stmt_prepare(*stmt, query.s, length.l)
OSPrototype.b Proto_mysql_stmt_reset(*stmt)
OSPrototype.i Proto_mysql_stmt_result_metadata(*stmt)
OSPrototype.i Proto_mysql_stmt_row_seek(*stmt, *offset)
OSPrototype.i Proto_mysql_stmt_row_tell(*stmt)
OSPrototype.b Proto_mysql_stmt_send_long_data(*stmt, param_number.i, DataStr.s, length.l)
OSPrototype.i Proto_mysql_stmt_sqlstate(*stmt)
OSPrototype.i Proto_mysql_stmt_store_result(*stmt)
OSPrototype.i Proto_mysql_store_result(*mysql)
OSPrototype Proto_mysql_thread_end()
OSPrototype.l Proto_mysql_thread_id(*mysql)
OSPrototype.b Proto_mysql_thread_init()
OSPrototype.i Proto_mysql_thread_safe()
OSPrototype.i Proto_mysql_use_result(*mysql)
OSPrototype.i Proto_mysql_warning_count(*mysql)
Global mysql_affected_rows.Proto_mysql_affected_rows
Global mysql_autocommit.Proto_mysql_autocommit
Global mysql_change_user.Proto_mysql_change_user
Global mysql_character_set_name.Proto_mysql_character_set_name
Global mysql_close.Proto_mysql_close
Global mysql_commit.Proto_mysql_commit
Global mysql_data_seek.Proto_mysql_data_seek
Global mysql_debug.Proto_mysql_debug
Global mysql_dump_debug_info.Proto_mysql_dump_debug_info
Global mysql_embedded.Proto_mysql_embedded
Global mysql_eof.Proto_mysql_eof
Global mysql_errno.Proto_mysql_errno
Global mysql_error.Proto_mysql_error
Global mysql_escape_string.Proto_mysql_escape_string
Global mysql_fetch_field.Proto_mysql_fetch_field
Global mysql_fetch_field_direct.Proto_mysql_fetch_field_direct
Global mysql_fetch_fields.Proto_mysql_fetch_fields
Global mysql_fetch_lengths.Proto_mysql_fetch_lengths
Global mysql_fetch_row.Proto_mysql_fetch_row
Global mysql_field_count.Proto_mysql_field_count
Global mysql_field_seek.Proto_mysql_field_seek
Global mysql_field_tell.Proto_mysql_field_tell
Global mysql_free_result.Proto_mysql_free_result
Global mysql_get_character_set_info.Proto_mysql_get_character_set_info
Global mysql_get_client_info.Proto_mysql_get_client_info
Global mysql_get_client_version.Proto_mysql_get_client_version
Global mysql_get_host_info.Proto_mysql_get_host_info
Global mysql_get_parameters.Proto_mysql_get_parameters
Global mysql_get_proto_info.Proto_mysql_get_proto_info
Global mysql_get_server_info.Proto_mysql_get_server_info
Global mysql_get_server_version.Proto_mysql_get_server_version
Global mysql_get_ssl_cipher.Proto_mysql_get_ssl_cipher
Global mysql_hex_string.Proto_mysql_hex_string
Global mysql_info.Proto_mysql_info
Global mysql_init.Proto_mysql_init
Global mysql_insert_id.Proto_mysql_insert_id
Global mysql_kill.Proto_mysql_kill
Global mysql_list_dbs.Proto_mysql_list_dbs
Global mysql_list_fields.Proto_mysql_list_fields
Global mysql_list_processes.Proto_mysql_list_processes
Global mysql_list_tables.Proto_mysql_list_tables
Global mysql_more_results.Proto_mysql_more_results
Global mysql_next_result.Proto_mysql_next_result
Global mysql_num_fields.Proto_mysql_num_fields
Global mysql_num_rows.Proto_mysql_num_rows
Global mysql_options.Proto_mysql_options
Global mysql_ping.Proto_mysql_ping
Global mysql_query.Proto_mysql_query
Global mysql_read_query_result.Proto_mysql_read_query_result
Global mysql_real_connect.Proto_mysql_real_connect
Global mysql_real_escape_string.Proto_mysql_real_escape_string
Global mysql_real_query.Proto_mysql_real_query
Global mysql_refresh.Proto_mysql_refresh
Global mysql_rollback.Proto_mysql_rollback
Global mysql_row_seek.Proto_mysql_row_seek
Global mysql_row_tell.Proto_mysql_row_tell
Global mysql_select_db.Proto_mysql_select_db
Global mysql_send_query.Proto_mysql_send_query
Global mysql_server_end.Proto_mysql_server_end
Global mysql_server_init.Proto_mysql_server_init
Global mysql_set_character_set.Proto_mysql_set_character_set
Global mysql_set_local_infile_default.Proto_mysql_set_local_infile_default
Global mysql_set_local_infile_handler.Proto_mysql_set_local_infile_handler
Global mysql_set_server_option.Proto_mysql_set_server_option
Global mysql_shutdown.Proto_mysql_shutdown
Global mysql_sqlstate.Proto_mysql_sqlstate
Global mysql_ssl_set.Proto_mysql_ssl_set
Global mysql_stat.Proto_mysql_stat
Global mysql_stmt_affected_rows.Proto_mysql_stmt_affected_rows
Global mysql_stmt_attr_get.Proto_mysql_stmt_attr_get
Global mysql_stmt_attr_set.Proto_mysql_stmt_attr_set
Global mysql_stmt_bind_param.Proto_mysql_stmt_bind_param
Global mysql_stmt_bind_result.Proto_mysql_stmt_bind_result
Global mysql_stmt_close.Proto_mysql_stmt_close
Global mysql_stmt_data_seek.Proto_mysql_stmt_data_seek
Global mysql_stmt_errno.Proto_mysql_stmt_errno
Global mysql_stmt_error.Proto_mysql_stmt_error
Global mysql_stmt_execute.Proto_mysql_stmt_execute
Global mysql_stmt_fetch.Proto_mysql_stmt_fetch
Global mysql_stmt_fetch_column.Proto_mysql_stmt_fetch_column
Global mysql_stmt_field_count.Proto_mysql_stmt_field_count
Global mysql_stmt_free_result.Proto_mysql_stmt_free_result
Global mysql_stmt_init.Proto_mysql_stmt_init
Global mysql_stmt_insert_id.Proto_mysql_stmt_insert_id
Global mysql_stmt_next_result.Proto_mysql_stmt_next_result
Global mysql_stmt_num_rows.Proto_mysql_stmt_num_rows
Global mysql_stmt_param_count.Proto_mysql_stmt_param_count
Global mysql_stmt_param_metadata.Proto_mysql_stmt_param_metadata
Global mysql_stmt_prepare.Proto_mysql_stmt_prepare
Global mysql_stmt_reset.Proto_mysql_stmt_reset
Global mysql_stmt_result_metadata.Proto_mysql_stmt_result_metadata
Global mysql_stmt_row_seek.Proto_mysql_stmt_row_seek
Global mysql_stmt_row_tell.Proto_mysql_stmt_row_tell
Global mysql_stmt_send_long_data.Proto_mysql_stmt_send_long_data
Global mysql_stmt_sqlstate.Proto_mysql_stmt_sqlstate
Global mysql_stmt_store_result.Proto_mysql_stmt_store_result
Global mysql_store_result.Proto_mysql_store_result
Global mysql_thread_end.Proto_mysql_thread_end
Global mysql_thread_id.Proto_mysql_thread_id
Global mysql_thread_init.Proto_mysql_thread_init
Global mysql_thread_safe.Proto_mysql_thread_safe
Global mysql_use_result.Proto_mysql_use_result
Global mysql_warning_count.Proto_mysql_warning_count
Procedure.i mysql_lib_init()
  
  Protected Result
  
  Result = #False
 
  mysql_lib = OpenLibrary(#PB_Any, mysql_filename$)
  If mysql_lib
    mysql_affected_rows = GetFunction(mysql_lib, "mysql_affected_rows")
    mysql_autocommit = GetFunction(mysql_lib, "mysql_autocommit")
    mysql_change_user = GetFunction(mysql_lib, "mysql_change_user")
    mysql_character_set_name = GetFunction(mysql_lib, "mysql_character_set_name")
    mysql_close = GetFunction(mysql_lib, "mysql_close")
    mysql_commit = GetFunction(mysql_lib, "mysql_commit")
    mysql_data_seek = GetFunction(mysql_lib, "mysql_data_seek")
    mysql_debug = GetFunction(mysql_lib, "mysql_debug")
    mysql_dump_debug_info = GetFunction(mysql_lib, "mysql_dump_debug_info")
    mysql_embedded = GetFunction(mysql_lib, "mysql_embedded")
    mysql_eof = GetFunction(mysql_lib, "mysql_eof")
    mysql_errno = GetFunction(mysql_lib, "mysql_errno")
    mysql_error = GetFunction(mysql_lib, "mysql_error")
    mysql_escape_string = GetFunction(mysql_lib, "mysql_escape_string")
    mysql_fetch_field = GetFunction(mysql_lib, "mysql_fetch_field")
    mysql_fetch_field_direct = GetFunction(mysql_lib, "mysql_fetch_field_direct")
    mysql_fetch_fields = GetFunction(mysql_lib, "mysql_fetch_fields")
    mysql_fetch_lengths = GetFunction(mysql_lib, "mysql_fetch_lengths")
    mysql_fetch_row = GetFunction(mysql_lib, "mysql_fetch_row")
    mysql_field_count = GetFunction(mysql_lib, "mysql_field_count")
    mysql_field_seek = GetFunction(mysql_lib, "mysql_field_seek")
    mysql_field_tell = GetFunction(mysql_lib, "mysql_field_tell")
    mysql_free_result = GetFunction(mysql_lib, "mysql_free_result")
    mysql_get_character_set_info = GetFunction(mysql_lib, "mysql_get_character_set_info")
    mysql_get_client_info = GetFunction(mysql_lib, "mysql_get_client_info")
    mysql_get_client_version = GetFunction(mysql_lib, "mysql_get_client_version")
    mysql_get_host_info = GetFunction(mysql_lib, "mysql_get_host_info")
    mysql_get_parameters = GetFunction(mysql_lib, "mysql_get_parameters")
    mysql_get_proto_info = GetFunction(mysql_lib, "mysql_get_proto_info")
    mysql_get_server_info = GetFunction(mysql_lib, "mysql_get_server_info")
    mysql_get_server_version = GetFunction(mysql_lib, "mysql_get_server_version")
    mysql_get_ssl_cipher = GetFunction(mysql_lib, "mysql_get_ssl_cipher")
    mysql_hex_string = GetFunction(mysql_lib, "mysql_hex_string")
    mysql_info = GetFunction(mysql_lib, "mysql_info")
    mysql_init = GetFunction(mysql_lib, "mysql_init")
    mysql_insert_id = GetFunction(mysql_lib, "mysql_insert_id")
    mysql_kill = GetFunction(mysql_lib, "mysql_kill")
    mysql_list_dbs = GetFunction(mysql_lib, "mysql_list_dbs")
    mysql_list_fields = GetFunction(mysql_lib, "mysql_list_fields")
    mysql_list_processes = GetFunction(mysql_lib, "mysql_list_processes")
    mysql_list_tables = GetFunction(mysql_lib, "mysql_list_tables")
    mysql_more_results = GetFunction(mysql_lib, "mysql_more_results")
    mysql_next_result = GetFunction(mysql_lib, "mysql_next_result")
    mysql_num_fields = GetFunction(mysql_lib, "mysql_num_fields")
    mysql_num_rows = GetFunction(mysql_lib, "mysql_num_rows")
    mysql_options = GetFunction(mysql_lib, "mysql_options")
    mysql_ping = GetFunction(mysql_lib, "mysql_ping")
    mysql_query = GetFunction(mysql_lib, "mysql_query")
    mysql_read_query_result = GetFunction(mysql_lib, "mysql_read_query_result")
    mysql_real_connect = GetFunction(mysql_lib, "mysql_real_connect")
    mysql_real_escape_string = GetFunction(mysql_lib, "mysql_real_escape_string")
    mysql_real_query = GetFunction(mysql_lib, "mysql_real_query")
    mysql_refresh = GetFunction(mysql_lib, "mysql_refresh")
    mysql_rollback = GetFunction(mysql_lib, "mysql_rollback")
    mysql_row_seek = GetFunction(mysql_lib, "mysql_row_seek")
    mysql_row_tell = GetFunction(mysql_lib, "mysql_row_tell")
    mysql_select_db = GetFunction(mysql_lib, "mysql_select_db")
    mysql_send_query = GetFunction(mysql_lib, "mysql_send_query")
    mysql_server_end = GetFunction(mysql_lib, "mysql_server_end")
    mysql_server_init = GetFunction(mysql_lib, "mysql_server_init")
    mysql_set_character_set = GetFunction(mysql_lib, "mysql_set_character_set")
    mysql_set_local_infile_default = GetFunction(mysql_lib, "mysql_set_local_infile_default")
    mysql_set_local_infile_handler = GetFunction(mysql_lib, "mysql_set_local_infile_handler")
    mysql_set_server_option = GetFunction(mysql_lib, "mysql_set_server_option")
    mysql_shutdown = GetFunction(mysql_lib, "mysql_shutdown")
    mysql_sqlstate = GetFunction(mysql_lib, "mysql_sqlstate")
    mysql_ssl_set = GetFunction(mysql_lib, "mysql_ssl_set")
    mysql_stat = GetFunction(mysql_lib, "mysql_stat")
    mysql_stmt_affected_rows = GetFunction(mysql_lib, "mysql_stmt_affected_rows")
    mysql_stmt_attr_get = GetFunction(mysql_lib, "mysql_stmt_attr_get")
    mysql_stmt_attr_set = GetFunction(mysql_lib, "mysql_stmt_attr_set")
    mysql_stmt_bind_param = GetFunction(mysql_lib, "mysql_stmt_bind_param")
    mysql_stmt_bind_result = GetFunction(mysql_lib, "mysql_stmt_bind_result")
    mysql_stmt_close = GetFunction(mysql_lib, "mysql_stmt_close")
    mysql_stmt_data_seek = GetFunction(mysql_lib, "mysql_stmt_data_seek")
    mysql_stmt_errno = GetFunction(mysql_lib, "mysql_stmt_errno")
    mysql_stmt_error = GetFunction(mysql_lib, "mysql_stmt_error")
    mysql_stmt_execute = GetFunction(mysql_lib, "mysql_stmt_execute")
    mysql_stmt_fetch = GetFunction(mysql_lib, "mysql_stmt_fetch")
    mysql_stmt_fetch_column = GetFunction(mysql_lib, "mysql_stmt_fetch_column")
    mysql_stmt_field_count = GetFunction(mysql_lib, "mysql_stmt_field_count")
    mysql_stmt_free_result = GetFunction(mysql_lib, "mysql_stmt_free_result")
    mysql_stmt_init = GetFunction(mysql_lib, "mysql_stmt_init")
    mysql_stmt_insert_id = GetFunction(mysql_lib, "mysql_stmt_insert_id")
    mysql_stmt_next_result = GetFunction(mysql_lib, "mysql_stmt_next_result")
    mysql_stmt_num_rows = GetFunction(mysql_lib, "mysql_stmt_num_rows")
    mysql_stmt_param_count = GetFunction(mysql_lib, "mysql_stmt_param_count")
    mysql_stmt_param_metadata = GetFunction(mysql_lib, "mysql_stmt_param_metadata")
    mysql_stmt_prepare = GetFunction(mysql_lib, "mysql_stmt_prepare")
    mysql_stmt_reset = GetFunction(mysql_lib, "mysql_stmt_reset")
    mysql_stmt_result_metadata = GetFunction(mysql_lib, "mysql_stmt_result_metadata")
    mysql_stmt_row_seek = GetFunction(mysql_lib, "mysql_stmt_row_seek")
    mysql_stmt_row_tell = GetFunction(mysql_lib, "mysql_stmt_row_tell")
    mysql_stmt_send_long_data = GetFunction(mysql_lib, "mysql_stmt_send_long_data")
    mysql_stmt_sqlstate = GetFunction(mysql_lib, "mysql_stmt_sqlstate")
    mysql_stmt_store_result = GetFunction(mysql_lib, "mysql_stmt_store_result")
    mysql_store_result = GetFunction(mysql_lib, "mysql_store_result")
    mysql_thread_end = GetFunction(mysql_lib, "mysql_thread_end")
    mysql_thread_id = GetFunction(mysql_lib, "mysql_thread_id")
    mysql_thread_init = GetFunction(mysql_lib, "mysql_thread_init")
    mysql_thread_safe = GetFunction(mysql_lib, "mysql_thread_safe")
    mysql_use_result = GetFunction(mysql_lib, "mysql_use_result")
    mysql_warning_count = GetFunction(mysql_lib, "mysql_warning_count")
    
    Result = #True
  EndIf
 
  ProcedureReturn Result
 
EndProcedure
Procedure mysql_lib_free()
  If IsLibrary(mysql_lib) : CloseLibrary(mysql_lib) : EndIf
  mysql_lib = 0
EndProcedure
Code: Select all
#Host$ = "192.168.18.247"
#User$ = "bkk"
#Passwd$ = "bkk"
#DB$ = "Test"
#Table$ = "TestTable"
IncludeFile "mysql.pbi"
If mysql_lib_init()
  *mysql = mysql_init(#Null)
  If *mysql
    If mysql_real_connect(*mysql, #Host$, #User$, #Passwd$, #DB$, 0, #NULL$, #CLIENT_COMPRESS) <> #Null
      For i = 1 To 100
        Insert$ = "INSERT INTO "+ #DB$ + "." + #Table$ + " VALUES('" + Str(i) + "','" + FormatDate("%yyyy-%mm-%dd %hh:%ii:%ss", Date()) + "')"
        mysql_real_query(*mysql, Insert$, Len(Insert$))
      Next i
    EndIf
    
    mysql_close(*mysql)
  EndIf
  mysql_lib_free()
EndIfCode: Select all
Procedure.i GetDeviceInfo(*MySQL_Handle, MAC$, *Ceza.CezaStructure)
  
  Protected Result.i, SQL$, *MySQLResult, *MySQL_Row, *MySQL_Len, Offset.i, length.i, fieldptr.i
  
  Result = #False
  
  SQL$ = "SELECT `id`, `delay`, `parameter` FROM `device` WHERE `mac` LIKE '" + MAC$ + "'"
  Logging(SQL$)
  If MySQL_Real_Query(*MySQL_Handle, SQL$) = 0
    *MySQL_Result = MySQL_Use_Result(*MySQL_Handle)
    If *MySQL_Result
      *MySQL_Row = MySQL_Fetch_Row(*MySQL_Result)
      If *MySQL_Row <> 0
        *MySQL_Len = MySQL_Fetch_Lengths(*MySQL_Result)
        
        length = PeekL(*MySQL_Len)           
        fieldptr = PeekL(*MySQL_Row)
        If fieldptr > 0
          *Ceza\ID = Val(PeekS(fieldptr, length))
        EndIf
        
        ; + 8 wegen 64bit int. Bei 32bit + 4
        CompilerIf #PB_Compiler_Processor = #PB_Processor_x64
          Offset = 8
        CompilerElse
          Offset = 4
        CompilerEndIf
        
        length = PeekL(*MySQL_Len + Offset)
        fieldptr = PeekL(*MySQL_Row + Offset)
        If fieldptr > 0
          *Ceza\Delay = Val(PeekS(fieldptr, length))
        EndIf
        
        length = PeekL(*MySQL_Len + Offset * 2)
        If length > 0
          fieldptr = PeekL(*MySQL_Row + Offset * 2)
          If fieldptr > 0
            *Ceza\Parameter = PeekS(fieldptr, length)
          EndIf
        Else
          *Ceza\Parameter = ""
        EndIf
        
      EndIf
      MySQL_Free_Result(*MySQL_Result)
    EndIf
  EndIf
  
  ProcedureReturn Result
  
EndProcedure
Code: Select all
#Host$ = "127.0.0.1"
#User$ = "root"
#Passwd$ = "root"
#DB$ = "test"
Define SQL$, *MySQL_Handle, *MySQL_Result, *MySQL_Row, *MySQL_Len, Offset.i, length.i, fieldptr.i, Rows.i
Define Code.i, Name$, email$
IncludeFile "mysql.pbi"
If mysql_lib_init()
  *MySQL_Handle = mysql_init(#Null)
  If *MySQL_Handle
    If mysql_real_connect(*MySQL_Handle, #Host$, #User$, #Passwd$, #DB$, 0, #NULL$, #CLIENT_COMPRESS) <> #Null
    
    
      SQL$ = "SELECT `code`, `name`, `email` FROM `testtable`"
      
      If MySQL_Real_Query(*MySQL_Handle, SQL$, Len(SQL$)) = 0
        *MySQL_Result = MySQL_store_Result(*MySQL_Handle)
        If *MySQL_Result
          
          Rows = mysql_num_rows(*MySQL_Result)
          
          Offset = SizeOf(Integer)          
          
          While Rows
          
            *MySQL_Row = MySQL_Fetch_Row(*MySQL_Result)
            If *MySQL_Row <> 0
              *MySQL_Len = MySQL_Fetch_Lengths(*MySQL_Result)
              
              length = PeekL(*MySQL_Len + Offset * 0)
              fieldptr = PeekL(*MySQL_Row + Offset * 0)
              If fieldptr > 0
                Code = Val(PeekS(fieldptr, length))
              EndIf
              
              length = PeekL(*MySQL_Len + Offset * 1)
              fieldptr = PeekL(*MySQL_Row + Offset)
              If fieldptr > 0
                Name$ = PeekS(fieldptr, length)
              EndIf
              
              length = PeekL(*MySQL_Len + Offset * 2)
              fieldptr = PeekL(*MySQL_Row + Offset * 2)
              If fieldptr > 0
                email$ = PeekS(fieldptr, length)
              EndIf
            
            EndIf
            
            Debug Str(Code) + " - " + Name$ + " - " + email$
            
            Rows - 1  
          Wend
          
          MySQL_Free_Result(*MySQL_Result)
        EndIf
      EndIf
    EndIf
  EndIf
EndIfGood.t57042 wrote:After adaptation of DBname and tablename works fine with MariaDB.
t57042 wrote:Can you describe the procedure (files needed...) and give an example wirh the same table and ODBC?
Code: Select all
UseODBCDatabase()
Define DB.i, SQL$
Define Code.i, Name$, email$
DB = OpenDatabase(#PB_Any, "Test", "", "", #PB_Database_ODBC)
If DB
  
  SQL$ + "SELECT `code`, `name`, `email` FROM `testtable`"
  If DatabaseQuery(DB, SQL$) 
    
    While NextDatabaseRow(DB)
      
      Code = GetDatabaseLong(DB, 0)
      Name$ = GetDatabaseString(DB, 1)
      email$ = GetDatabaseString(DB, 2)
      
      Debug Str(Code) + " - " + Name$ + " - " + email$
    Wend
    FinishDatabaseQuery(DB)
  EndIf
  
  CloseDatabase(DB)
Else
  MessageRequester("Error", "Was not able to open the ODBC 'Test'")
EndIfI adapted the code as follows:You need an ODBC connection named Test which is working on the database test including user and password.
(use the connection test in the ODBC dialog)
Code: Select all
UseODBCDatabase()
    Define DB.i, SQL$
    Define Code.i, Name$, email$
    DB = OpenDatabase(#PB_Any, "namebook", "root", "root", #PB_Database_ODBC)
    If DB
     
      SQL$ + "SELECT `code`, `name`, `email` FROM `names`"
      If DatabaseQuery(DB, SQL$)
       
        While NextDatabaseRow(DB)
         
          Code = GetDatabaseLong(DB, 0)
          Name$ = GetDatabaseString(DB, 1)
          email$ = GetDatabaseString(DB, 2)
         
          Debug Str(Code) + " - " + Name$ + " - " + email$
        Wend
        FinishDatabaseQuery(DB)
      EndIf
     
      CloseDatabase(DB)
    Else
      MessageRequester("Error", "Was not able to open the ODBC 'Test'")
    EndIfDo you know if someone has already done this?Or you can write higher level functions arround.