Pārlūkot izejas kodu

+ Dynamic library implementation by Joost van der Sluis

michael 20 gadi atpakaļ
vecāks
revīzija
bedf31abe9

+ 544 - 32
packages/base/ibase/ibase60dyn.pp

@@ -34,29 +34,306 @@ uses
 
 {$i ibase60types.inc}
 
-var isc_attach_database : function (_para1:PISC_STATUS; _para2:smallint; _para3:Pchar; _para4:Pisc_db_handle; _para5:smallint;
-             _para6:Pchar):ISC_STATUS; gdsdecl;
-    isc_interprete : function (_para1:Pchar; _para2:PPISC_STATUS):ISC_STATUS; gdsdecl;
-    isc_commit_transaction : function (_para1:PISC_STATUS; _para2:Pisc_tr_handle):ISC_STATUS; gdsdecl;
-    isc_rollback_transaction : function (_para1:PISC_STATUS; _para2:Pisc_tr_handle):ISC_STATUS; gdsdecl;
-    isc_start_transaction : function (_para1:PISC_STATUS; _para2:Pisc_tr_handle; _para3:smallint; args:array of const):ISC_STATUS; cdecl;
-    isc_commit_retaining : function (_para1:PISC_STATUS; _para2:Pisc_tr_handle):ISC_STATUS; gdsdecl;
-    isc_rollback_retaining : function (_para1:PISC_STATUS; _para2:Pisc_tr_handle):ISC_STATUS; gdsdecl;
-    isc_detach_database : function (_para1:PISC_STATUS; _para2:Pisc_db_handle):ISC_STATUS; gdsdecl;
-    isc_vax_integer : function (_para1:Pchar; _para2:smallint):ISC_LONG; gdsdecl;
-    isc_dsql_free_statement : function (_para1:PISC_STATUS; _para2:Pisc_stmt_handle; _para3:word):ISC_STATUS; gdsdecl;
-    isc_dsql_allocate_statement : function (_para1:PISC_STATUS; _para2:Pisc_db_handle; _para3:Pisc_stmt_handle):ISC_STATUS; gdsdecl;
-    isc_dsql_prepare : function (_para1:PISC_STATUS; _para2:Pisc_tr_handle; _para3:Pisc_stmt_handle; _para4:word; _para5:Pchar;
-             _para6:word; _para7:PXSQLDA):ISC_STATUS; gdsdecl;
-    isc_dsql_describe : function (_para1:PISC_STATUS; _para2:Pisc_stmt_handle; _para3:word; _para4:PXSQLDA):ISC_STATUS; gdsdecl;
-    isc_dsql_execute : function (_para1:PISC_STATUS; _para2:Pisc_tr_handle; _para3:Pisc_stmt_handle; _para4:word; _para5:PXSQLDA):ISC_STATUS; gdsdecl;
-    isc_dsql_fetch : function (_para1:PISC_STATUS; _para2:Pisc_stmt_handle; _para3:word; _para4:PXSQLDA):ISC_STATUS; gdsdecl;
-    isc_decode_date : procedure (_para1:PISC_QUAD; _para2:pointer); gdsdecl;
-    isc_decode_sql_date : procedure (_para1:PISC_DATE; _para2:pointer); gdsdecl;
-    isc_decode_sql_time : procedure (_para1:PISC_TIME; _para2:pointer); gdsdecl;
-    isc_decode_timestamp : procedure (_para1:PISC_TIMESTAMP; _para2:pointer); gdsdecl;
-    isc_database_info : function (_para1:PISC_STATUS; _para2:Pisc_db_handle; _para3:smallint; _para4:Pchar; _para5:smallint;
-             _para6:Pchar):ISC_STATUS; gdsdecl;
+var
+
+{                          }
+{ OSRI database functions  }
+{                          }
+  isc_attach_database : function (_para1:PISC_STATUS; _para2:smallint; _para3:Pchar; _para4:Pisc_db_handle; _para5:smallint;_para6:Pchar):ISC_STATUS; gdsdecl;
+  isc_array_gen_sdl : function (_para1:PISC_STATUS; _para2:PISC_ARRAY_DESC; _para3:Psmallint; _para4:Pchar; _para5:Psmallint):ISC_STATUS; gdsdecl;
+  isc_array_get_slice : function (_para1:PISC_STATUS; _para2:Pisc_db_handle; _para3:Pisc_tr_handle; _para4:PISC_QUAD; _para5:PISC_ARRAY_DESC;_para6:pointer; _para7:PISC_LONG):ISC_STATUS; gdsdecl;
+  isc_array_lookup_bounds : function (_para1:PISC_STATUS; _para2:Pisc_db_handle; _para3:Pisc_tr_handle; _para4:Pchar; _para5:Pchar;_para6:PISC_ARRAY_DESC):ISC_STATUS; gdsdecl;
+  isc_array_lookup_desc : function (_para1:PISC_STATUS; _para2:Pisc_db_handle; _para3:Pisc_tr_handle; _para4:Pchar; _para5:Pchar;_para6:PISC_ARRAY_DESC):ISC_STATUS; gdsdecl;
+  isc_array_set_desc : function (_para1:PISC_STATUS; _para2:Pchar; _para3:Pchar; _para4:Psmallint; _para5:Psmallint;_para6:Psmallint; _para7:PISC_ARRAY_DESC):ISC_STATUS; gdsdecl;
+  isc_array_put_slice : function (_para1:PISC_STATUS; _para2:Pisc_db_handle; _para3:Pisc_tr_handle; _para4:PISC_QUAD; _para5:PISC_ARRAY_DESC;_para6:pointer; _para7:PISC_LONG):ISC_STATUS; gdsdecl;
+  isc_blob_default_desc : procedure (_para1:PISC_BLOB_DESC; _para2:Pbyte; _para3:Pbyte); gdsdecl;
+  isc_blob_gen_bpb : function (_para1:PISC_STATUS; _para2:PISC_BLOB_DESC; _para3:PISC_BLOB_DESC; _para4:word; _para5:Pbyte;_para6:Pword):ISC_STATUS; gdsdecl;
+  isc_blob_info : function (_para1:PISC_STATUS; _para2:Pisc_blob_handle; _para3:smallint; _para4:Pchar; _para5:smallint;_para6:Pchar):ISC_STATUS; gdsdecl;
+  isc_blob_lookup_desc : function (_para1:PISC_STATUS; _para2:Pisc_db_handle; _para3:Pisc_tr_handle; _para4:Pbyte; _para5:Pbyte;_para6:PISC_BLOB_DESC; _para7:Pbyte):ISC_STATUS; gdsdecl;
+  isc_blob_set_desc : function (_para1:PISC_STATUS; _para2:Pbyte; _para3:Pbyte; _para4:smallint; _para5:smallint;_para6:smallint; _para7:PISC_BLOB_DESC):ISC_STATUS; gdsdecl;
+  isc_cancel_blob : function (_para1:PISC_STATUS; _para2:Pisc_blob_handle):ISC_STATUS; gdsdecl;
+  isc_cancel_events : function (_para1:PISC_STATUS; _para2:Pisc_db_handle; _para3:PISC_LONG):ISC_STATUS; gdsdecl;
+  isc_close_blob : function (_para1:PISC_STATUS; _para2:Pisc_blob_handle):ISC_STATUS; gdsdecl;
+  isc_commit_retaining : function (_para1:PISC_STATUS; _para2:Pisc_tr_handle):ISC_STATUS; gdsdecl;
+  isc_commit_transaction : function (_para1:PISC_STATUS; _para2:Pisc_tr_handle):ISC_STATUS; gdsdecl;
+  isc_create_blob : function (_para1:PISC_STATUS; _para2:Pisc_db_handle; _para3:Pisc_tr_handle; _para4:Pisc_blob_handle; _para5:PISC_QUAD):ISC_STATUS; gdsdecl;
+  isc_create_blob2 : function (_para1:PISC_STATUS; _para2:Pisc_db_handle; _para3:Pisc_tr_handle; _para4:Pisc_blob_handle; _para5:PISC_QUAD;_para6:smallint; _para7:Pchar):ISC_STATUS; gdsdecl;
+  isc_create_database : function (_para1:PISC_STATUS; _para2:smallint; _para3:Pchar; _para4:Pisc_db_handle; _para5:smallint;_para6:Pchar; _para7:smallint):ISC_STATUS; gdsdecl;
+  isc_database_info : function (_para1:PISC_STATUS; _para2:Pisc_db_handle; _para3:smallint; _para4:Pchar; _para5:smallint;_para6:Pchar):ISC_STATUS; gdsdecl;
+  isc_decode_date : procedure (_para1:PISC_QUAD; _para2:pointer); gdsdecl;
+  isc_decode_sql_date : procedure (_para1:PISC_DATE; _para2:pointer); gdsdecl;
+  isc_decode_sql_time : procedure (_para1:PISC_TIME; _para2:pointer); gdsdecl;
+  isc_decode_timestamp : procedure (_para1:PISC_TIMESTAMP; _para2:pointer); gdsdecl;
+  isc_detach_database : function (_para1:PISC_STATUS; _para2:Pisc_db_handle):ISC_STATUS; gdsdecl;
+  isc_drop_database : function (_para1:PISC_STATUS; _para2:Pisc_db_handle):ISC_STATUS; gdsdecl;
+  isc_dsql_allocate_statement : function (_para1:PISC_STATUS; _para2:Pisc_db_handle; _para3:Pisc_stmt_handle):ISC_STATUS; gdsdecl;
+  isc_dsql_alloc_statement2 : function (_para1:PISC_STATUS; _para2:Pisc_db_handle; _para3:Pisc_stmt_handle):ISC_STATUS; gdsdecl;
+  isc_dsql_describe : function (_para1:PISC_STATUS; _para2:Pisc_stmt_handle; _para3:word; _para4:PXSQLDA):ISC_STATUS; gdsdecl;
+  isc_dsql_describe_bind : function (_para1:PISC_STATUS; _para2:Pisc_stmt_handle; _para3:word; _para4:PXSQLDA):ISC_STATUS; gdsdecl;
+  isc_dsql_exec_immed2 : function (_para1:PISC_STATUS; _para2:Pisc_db_handle; _para3:Pisc_tr_handle; _para4:word; _para5:Pchar;_para6:word; _para7:PXSQLDA; _para8:PXSQLDA):ISC_STATUS; gdsdecl;
+  isc_dsql_execute : function (_para1:PISC_STATUS; _para2:Pisc_tr_handle; _para3:Pisc_stmt_handle; _para4:word; _para5:PXSQLDA):ISC_STATUS; gdsdecl;
+  isc_dsql_execute2 : function (_para1:PISC_STATUS; _para2:Pisc_tr_handle; _para3:Pisc_stmt_handle; _para4:word; _para5:PXSQLDA;_para6:PXSQLDA):ISC_STATUS; gdsdecl;
+  isc_dsql_execute_immediate : function (_para1:PISC_STATUS; _para2:Pisc_db_handle; _para3:Pisc_tr_handle; _para4:word; _para5:Pchar;_para6:word; _para7:PXSQLDA):ISC_STATUS; gdsdecl;
+  isc_dsql_fetch : function (_para1:PISC_STATUS; _para2:Pisc_stmt_handle; _para3:word; _para4:PXSQLDA):ISC_STATUS; gdsdecl;
+  isc_dsql_finish : function (_para1:Pisc_db_handle):ISC_STATUS; gdsdecl;
+  isc_dsql_free_statement : function (_para1:PISC_STATUS; _para2:Pisc_stmt_handle; _para3:word):ISC_STATUS; gdsdecl;
+  isc_dsql_insert : function (_para1:PISC_STATUS; _para2:Pisc_stmt_handle; _para3:word; _para4:PXSQLDA):ISC_STATUS; gdsdecl;
+  isc_dsql_prepare : function (_para1:PISC_STATUS; _para2:Pisc_tr_handle; _para3:Pisc_stmt_handle; _para4:word; _para5:Pchar;_para6:word; _para7:PXSQLDA):ISC_STATUS; gdsdecl;
+  isc_dsql_set_cursor_name : function (_para1:PISC_STATUS; _para2:Pisc_stmt_handle; _para3:Pchar; _para4:word):ISC_STATUS; gdsdecl;
+  isc_dsql_sql_info : function (_para1:PISC_STATUS; _para2:Pisc_stmt_handle; _para3:smallint; _para4:Pchar; _para5:smallint;_para6:Pchar):ISC_STATUS; gdsdecl;
+  isc_encode_date : procedure (_para1:pointer; _para2:PISC_QUAD); gdsdecl;
+  isc_encode_sql_date : procedure (_para1:pointer; _para2:PISC_DATE); gdsdecl;
+  isc_encode_sql_time : procedure (_para1:pointer; _para2:PISC_TIME); gdsdecl;
+  isc_encode_timestamp : procedure (_para1:pointer; _para2:PISC_TIMESTAMP); gdsdecl;
+  isc_event_block : function (_para1:PPchar; _para2:PPchar; _para3:word; args:array of const):ISC_LONG; cdecl;
+{!!MVC
+  void         isc_event_counts (unsigned ISC_LONG   ,
+  short,
+  char   ,
+  char   ); gdsdecl; external gdslib;
+!!MVC }
+  isc_expand_dpb : procedure (_para1:PPchar; _para2:Psmallint; args:array of const); cdecl;
+  isc_modify_dpb : function (_para1:PPchar; _para2:Psmallint; _para3:word; _para4:Pchar; _para5:smallint):longint; gdsdecl;
+  isc_free : function (_para1:Pchar):ISC_LONG; gdsdecl;
+  isc_get_segment : function (_para1:PISC_STATUS; _para2:Pisc_blob_handle; _para3:Pword; _para4:word; _para5:Pchar):ISC_STATUS; gdsdecl;
+  isc_get_slice : function (_para1:PISC_STATUS; _para2:Pisc_db_handle; _para3:Pisc_tr_handle; _para4:PISC_QUAD; _para5:smallint;_para6:Pchar; _para7:smallint; _para8:PISC_LONG; _para9:ISC_LONG; _para10:pointer;_para11:PISC_LONG):ISC_STATUS; gdsdecl;
+  isc_interprete : function (_para1:Pchar; _para2:PPISC_STATUS):ISC_STATUS; gdsdecl;
+  isc_open_blob : function (_para1:PISC_STATUS; _para2:Pisc_db_handle; _para3:Pisc_tr_handle; _para4:Pisc_blob_handle; _para5:PISC_QUAD):ISC_STATUS; gdsdecl;
+  isc_open_blob2 : function (_para1:PISC_STATUS; _para2:Pisc_db_handle; _para3:Pisc_tr_handle; _para4:Pisc_blob_handle; _para5:PISC_QUAD;_para6:smallint; _para7:Pchar):ISC_STATUS; gdsdecl;
+  isc_prepare_transaction2 : function (_para1:PISC_STATUS; _para2:Pisc_tr_handle; _para3:smallint; _para4:Pchar):ISC_STATUS; gdsdecl;
+  isc_print_sqlerror : procedure (_para1:smallint; _para2:PISC_STATUS); gdsdecl;
+  isc_print_status : function (_para1:PISC_STATUS):ISC_STATUS; gdsdecl;
+  isc_put_segment : function (_para1:PISC_STATUS; _para2:Pisc_blob_handle; _para3:word; _para4:Pchar):ISC_STATUS; gdsdecl;
+  isc_put_slice : function (_para1:PISC_STATUS; _para2:Pisc_db_handle; _para3:Pisc_tr_handle; _para4:PISC_QUAD; _para5:smallint;_para6:Pchar; _para7:smallint; _para8:PISC_LONG; _para9:ISC_LONG; _para10:pointer):ISC_STATUS; gdsdecl;
+  isc_que_events : function (_para1:PISC_STATUS; _para2:Pisc_db_handle; _para3:PISC_LONG; _para4:smallint; _para5:Pchar;_para6:isc_callback; _para7:pointer):ISC_STATUS; gdsdecl;
+  isc_rollback_retaining : function (_para1:PISC_STATUS; _para2:Pisc_tr_handle):ISC_STATUS; gdsdecl;
+  isc_rollback_transaction : function (_para1:PISC_STATUS; _para2:Pisc_tr_handle):ISC_STATUS; gdsdecl;
+  isc_start_multiple : function (_para1:PISC_STATUS; _para2:Pisc_tr_handle; _para3:smallint; _para4:pointer):ISC_STATUS; gdsdecl;
+  isc_start_transaction : function (_para1:PISC_STATUS; _para2:Pisc_tr_handle; _para3:smallint; args:array of const):ISC_STATUS; cdecl;
+  isc_sqlcode : function (_para1:PISC_STATUS):ISC_LONG; gdsdecl;
+  isc_sql_interprete : procedure (_para1:smallint; _para2:Pchar; _para3:smallint); gdsdecl;
+  isc_transaction_info : function (_para1:PISC_STATUS; _para2:Pisc_tr_handle; _para3:smallint; _para4:Pchar; _para5:smallint;_para6:Pchar):ISC_STATUS; gdsdecl;
+  isc_transact_request : function (_para1:PISC_STATUS; _para2:Pisc_db_handle; _para3:Pisc_tr_handle; _para4:word; _para5:Pchar;_para6:word; _para7:Pchar; _para8:word; _para9:Pchar):ISC_STATUS; gdsdecl;
+  isc_vax_integer : function (_para1:Pchar; _para2:smallint):ISC_LONG; gdsdecl;
+  isc_portable_integer : function (_para1:Pbyte; _para2:smallint):ISC_INT64; gdsdecl;
+{                                    }
+{ Security Functions                 }
+{                                    }
+  isc_add_user : function (_para1:PISC_STATUS; _para2:PUSER_SEC_DATA):longint; gdsdecl;
+  isc_delete_user : function (_para1:PISC_STATUS; _para2:PUSER_SEC_DATA):longint; gdsdecl;
+  isc_modify_user : function (_para1:PISC_STATUS; _para2:PUSER_SEC_DATA):longint; gdsdecl;
+{                                 }
+{  Other OSRI functions           }
+{                                 }
+  isc_compile_request : function (_para1:PISC_STATUS; _para2:Pisc_db_handle; _para3:Pisc_req_handle; _para4:smallint; _para5:Pchar):ISC_STATUS; gdsdecl;
+  isc_compile_request2 : function (_para1:PISC_STATUS; _para2:Pisc_db_handle; _para3:Pisc_req_handle; _para4:smallint; _para5:Pchar):ISC_STATUS; gdsdecl;
+  isc_ddl : function (_para1:PISC_STATUS; _para2:Pisc_db_handle; _para3:Pisc_tr_handle; _para4:smallint; _para5:Pchar):ISC_STATUS; gdsdecl;
+  isc_prepare_transaction : function (_para1:PISC_STATUS; _para2:Pisc_tr_handle):ISC_STATUS; gdsdecl;
+  isc_receive : function (_para1:PISC_STATUS; _para2:Pisc_req_handle; _para3:smallint; _para4:smallint; _para5:pointer;_para6:smallint):ISC_STATUS; gdsdecl;
+  isc_reconnect_transaction : function (_para1:PISC_STATUS; _para2:Pisc_db_handle; _para3:Pisc_tr_handle; _para4:smallint; _para5:Pchar):ISC_STATUS; gdsdecl;
+  isc_release_request : function (_para1:PISC_STATUS; _para2:Pisc_req_handle):ISC_STATUS; gdsdecl;
+  isc_request_info : function (_para1:PISC_STATUS; _para2:Pisc_req_handle; _para3:smallint; _para4:smallint; _para5:Pchar;_para6:smallint; _para7:Pchar):ISC_STATUS; gdsdecl;
+  isc_seek_blob : function (_para1:PISC_STATUS; _para2:Pisc_blob_handle; _para3:smallint; _para4:ISC_LONG; _para5:PISC_LONG):ISC_STATUS; gdsdecl;
+  isc_send : function (_para1:PISC_STATUS; _para2:Pisc_req_handle; _para3:smallint; _para4:smallint; _para5:pointer;_para6:smallint):ISC_STATUS; gdsdecl;
+  isc_start_and_send : function (_para1:PISC_STATUS; _para2:Pisc_req_handle; _para3:Pisc_tr_handle; _para4:smallint; _para5:smallint;_para6:pointer; _para7:smallint):ISC_STATUS; gdsdecl;
+  isc_start_request : function (_para1:PISC_STATUS; _para2:Pisc_req_handle; _para3:Pisc_tr_handle; _para4:smallint):ISC_STATUS; gdsdecl;
+  isc_unwind_request : function (_para1:PISC_STATUS; _para2:Pisc_tr_handle; _para3:smallint):ISC_STATUS; gdsdecl;
+  isc_wait_for_event : function (_para1:PISC_STATUS; _para2:Pisc_db_handle; _para3:smallint; _para4:Pchar; _para5:Pchar):ISC_STATUS; gdsdecl;
+{                            }
+{ Other Sql functions        }
+{                            }
+  isc_close : function (_para1:PISC_STATUS; _para2:Pchar):ISC_STATUS; gdsdecl;
+  isc_declare : function (_para1:PISC_STATUS; _para2:Pchar; _para3:Pchar):ISC_STATUS; gdsdecl;
+  isc_describe : function (_para1:PISC_STATUS; _para2:Pchar; _para3:PXSQLDA):ISC_STATUS; gdsdecl;
+  isc_describe_bind : function (_para1:PISC_STATUS; _para2:Pchar; _para3:PXSQLDA):ISC_STATUS; gdsdecl;
+  isc_execute : function (_para1:PISC_STATUS; _para2:Pisc_tr_handle; _para3:Pchar; _para4:PXSQLDA):ISC_STATUS; gdsdecl;
+  isc_execute_immediate : function (_para1:PISC_STATUS; _para2:Pisc_db_handle; _para3:Pisc_tr_handle; _para4:Psmallint; _para5:Pchar):ISC_STATUS; gdsdecl;
+  isc_fetch : function (_para1:PISC_STATUS; _para2:Pchar; _para3:PXSQLDA):ISC_STATUS; gdsdecl;
+  isc_open : function (_para1:PISC_STATUS; _para2:Pisc_tr_handle; _para3:Pchar; _para4:PXSQLDA):ISC_STATUS; gdsdecl;
+  isc_prepare : function (_para1:PISC_STATUS; _para2:Pisc_db_handle; _para3:Pisc_tr_handle; _para4:Pchar; _para5:Psmallint;_para6:Pchar; _para7:PXSQLDA):ISC_STATUS; gdsdecl;
+{                                    }
+{ Other Dynamic sql functions        }
+{                                    }
+  isc_dsql_execute_m : function (_para1:PISC_STATUS; _para2:Pisc_tr_handle; _para3:Pisc_stmt_handle; _para4:word; _para5:Pchar;_para6:word; _para7:word; _para8:Pchar):ISC_STATUS; gdsdecl;
+  isc_dsql_execute2_m : function (_para1:PISC_STATUS; _para2:Pisc_tr_handle; _para3:Pisc_stmt_handle; _para4:word; _para5:Pchar;_para6:word; _para7:word; _para8:Pchar; _para9:word; _para10:Pchar;_para11:word; _para12:word; _para13:Pchar):ISC_STATUS; gdsdecl;
+  isc_dsql_execute_immediate_m : function (_para1:PISC_STATUS; _para2:Pisc_db_handle; _para3:Pisc_tr_handle; _para4:word; _para5:Pchar;_para6:word; _para7:word; _para8:Pchar; _para9:word; _para10:word;_para11:Pchar):ISC_STATUS; gdsdecl;
+  isc_dsql_exec_immed3_m : function (_para1:PISC_STATUS; _para2:Pisc_db_handle; _para3:Pisc_tr_handle; _para4:word; _para5:Pchar;_para6:word; _para7:word; _para8:Pchar; _para9:word; _para10:word;_para11:Pchar; _para12:word; _para13:Pchar; _para14:word; _para15:word;_para16:Pchar):ISC_STATUS; gdsdecl;
+  isc_dsql_fetch_m : function (_para1:PISC_STATUS; _para2:Pisc_stmt_handle; _para3:word; _para4:Pchar; _para5:word;_para6:word; _para7:Pchar):ISC_STATUS; gdsdecl;
+  isc_dsql_insert_m : function (_para1:PISC_STATUS; _para2:Pisc_stmt_handle; _para3:word; _para4:Pchar; _para5:word;_para6:word; _para7:Pchar):ISC_STATUS; gdsdecl;
+  isc_dsql_prepare_m : function (_para1:PISC_STATUS; _para2:Pisc_tr_handle; _para3:Pisc_stmt_handle; _para4:word; _para5:Pchar;_para6:word; _para7:word; _para8:Pchar; _para9:word; _para10:Pchar):ISC_STATUS; gdsdecl;
+  isc_dsql_release : function (_para1:PISC_STATUS; _para2:Pchar):ISC_STATUS; gdsdecl;
+  isc_embed_dsql_close : function (_para1:PISC_STATUS; _para2:Pchar):ISC_STATUS; gdsdecl;
+  isc_embed_dsql_declare : function (_para1:PISC_STATUS; _para2:Pchar; _para3:Pchar):ISC_STATUS; gdsdecl;
+  isc_embed_dsql_describe : function (_para1:PISC_STATUS; _para2:Pchar; _para3:word; _para4:PXSQLDA):ISC_STATUS; gdsdecl;
+  isc_embed_dsql_describe_bind : function (_para1:PISC_STATUS; _para2:Pchar; _para3:word; _para4:PXSQLDA):ISC_STATUS; gdsdecl;
+  isc_embed_dsql_execute : function (_para1:PISC_STATUS; _para2:Pisc_tr_handle; _para3:Pchar; _para4:word; _para5:PXSQLDA):ISC_STATUS; gdsdecl;
+  isc_embed_dsql_execute2 : function (_para1:PISC_STATUS; _para2:Pisc_tr_handle; _para3:Pchar; _para4:word; _para5:PXSQLDA;_para6:PXSQLDA):ISC_STATUS; gdsdecl;
+  isc_embed_dsql_execute_immed : function (_para1:PISC_STATUS; _para2:Pisc_db_handle; _para3:Pisc_tr_handle; _para4:word; _para5:Pchar;_para6:word; _para7:PXSQLDA):ISC_STATUS; gdsdecl;
+  isc_embed_dsql_fetch : function (_para1:PISC_STATUS; _para2:Pchar; _para3:word; _para4:PXSQLDA):ISC_STATUS; gdsdecl;
+  isc_embed_dsql_open : function (_para1:PISC_STATUS; _para2:Pisc_tr_handle; _para3:Pchar; _para4:word; _para5:PXSQLDA):ISC_STATUS; gdsdecl;
+  isc_embed_dsql_open2 : function (_para1:PISC_STATUS; _para2:Pisc_tr_handle; _para3:Pchar; _para4:word; _para5:PXSQLDA;_para6:PXSQLDA):ISC_STATUS; gdsdecl;
+  isc_embed_dsql_insert : function (_para1:PISC_STATUS; _para2:Pchar; _para3:word; _para4:PXSQLDA):ISC_STATUS; gdsdecl;
+  isc_embed_dsql_prepare : function (_para1:PISC_STATUS; _para2:Pisc_db_handle; _para3:Pisc_tr_handle; _para4:Pchar; _para5:word;_para6:Pchar; _para7:word; _para8:PXSQLDA):ISC_STATUS; gdsdecl;
+  isc_embed_dsql_release : function (_para1:PISC_STATUS; _para2:Pchar):ISC_STATUS; gdsdecl;
+{                             }
+{ Other Blob functions        }
+{                             }
+  BLOB_open : function (_para1:isc_blob_handle; _para2:Pchar; _para3:longint):PBSTREAM; gdsdecl;
+  BLOB_put : function (_para1:char; _para2:PBSTREAM):longint; gdsdecl;
+  BLOB_close : function (_para1:PBSTREAM):longint; gdsdecl;
+  BLOB_get : function (_para1:PBSTREAM):longint; gdsdecl;
+  BLOB_display : function (_para1:PISC_QUAD; _para2:isc_db_handle; _para3:isc_tr_handle; _para4:Pchar):longint; gdsdecl;
+  BLOB_dump : function (_para1:PISC_QUAD; _para2:isc_db_handle; _para3:isc_tr_handle; _para4:Pchar):longint; gdsdecl;
+  BLOB_edit : function (_para1:PISC_QUAD; _para2:isc_db_handle; _para3:isc_tr_handle; _para4:Pchar):longint; gdsdecl;
+  BLOB_load : function (_para1:PISC_QUAD; _para2:isc_db_handle; _para3:isc_tr_handle; _para4:Pchar):longint; gdsdecl;
+  BLOB_text_dump : function (_para1:PISC_QUAD; _para2:isc_db_handle; _para3:isc_tr_handle; _para4:Pchar):longint; gdsdecl;
+  BLOB_text_load : function (_para1:PISC_QUAD; _para2:isc_db_handle; _para3:isc_tr_handle; _para4:Pchar):longint; gdsdecl;
+  Bopen : function (_para1:PISC_QUAD; _para2:isc_db_handle; _para3:isc_tr_handle; _para4:Pchar):PBSTREAM; gdsdecl;
+{$IFDEF Unix}
+  Bopen2 : function (_para1:PISC_QUAD; _para2:isc_db_handle; _para3:isc_tr_handle; _para4:Pchar; _para5:word):PBSTREAM; gdsdecl;
+{$ENDIF}
+{                             }
+{ Other Misc functions        }
+{                             }
+  isc_ftof : function (_para1:Pchar; _para2:word; _para3:Pchar; _para4:word):ISC_LONG; gdsdecl;
+  isc_print_blr : function (_para1:Pchar; _para2:isc_callback; _para3:pointer; _para4:smallint):ISC_STATUS; gdsdecl;
+  isc_set_debug : procedure (_para1:longint); gdsdecl;
+  isc_qtoq : procedure (_para1:PISC_QUAD; _para2:PISC_QUAD); gdsdecl;
+  isc_vtof : procedure (_para1:Pchar; _para2:Pchar; _para3:word); gdsdecl;
+  isc_vtov : procedure (_para1:Pchar; _para2:Pchar; _para3:smallint); gdsdecl;
+  isc_version : function (_para1:Pisc_db_handle; _para2:isc_callback; _para3:pointer):longint; gdsdecl;
+{$IFDEF Unix}
+  isc_reset_fpe : function (_para1:word):ISC_LONG; gdsdecl;
+{$ENDIF}
+{                                        }
+{ Service manager functions              }
+{                                        }
+(*!!MVC
+  #define ADD_SPB_LENGTH(p, length)     { (p)++ = (length); \
+  (p)++ = (length) >> 8;}
+
+#define ADD_SPB_NUMERIC(p, data)      { (p)++ = (data); \
+  (p)++ = (data) >> 8; \
+  (p)++ = (data) >> 16; \
+  (p)++ = (data) >> 24;}
+!!MVC *)
+  isc_service_attach : function (_para1:PISC_STATUS; _para2:word; _para3:Pchar; _para4:Pisc_svc_handle; _para5:word;_para6:Pchar):ISC_STATUS; gdsdecl;
+  isc_service_detach : function (_para1:PISC_STATUS; _para2:Pisc_svc_handle):ISC_STATUS; gdsdecl;
+  isc_service_query : function (_para1:PISC_STATUS; _para2:Pisc_svc_handle; _para3:Pisc_resv_handle; _para4:word; _para5:Pchar;_para6:word; _para7:Pchar; _para8:word; _para9:Pchar):ISC_STATUS; gdsdecl;
+  isc_service_start : function (_para1:PISC_STATUS; _para2:Pisc_svc_handle; _para3:Pisc_resv_handle; _para4:word; _para5:Pchar):ISC_STATUS; gdsdecl;
+{                              }
+{ Forms functions              }
+{                              }
+{$IFDEF Unix}
+  isc_compile_map : function (_para1:PISC_STATUS; _para2:Pisc_form_handle; _para3:Pisc_req_handle; _para4:Psmallint; _para5:Pchar):ISC_STATUS; gdsdecl;
+  isc_compile_menu : function (_para1:PISC_STATUS; _para2:Pisc_form_handle; _para3:Pisc_req_handle; _para4:Psmallint; _para5:Pchar):ISC_STATUS; gdsdecl;
+  isc_compile_sub_map : function (_para1:PISC_STATUS; _para2:Pisc_win_handle; _para3:Pisc_req_handle; _para4:Psmallint; _para5:Pchar):ISC_STATUS; gdsdecl;
+  isc_create_window : function (_para1:PISC_STATUS; _para2:Pisc_win_handle; _para3:Psmallint; _para4:Pchar; _para5:Psmallint;_para6:Psmallint):ISC_STATUS; gdsdecl;
+  isc_delete_window : function (_para1:PISC_STATUS; _para2:Pisc_win_handle):ISC_STATUS; gdsdecl;
+  isc_drive_form : function (_para1:PISC_STATUS; _para2:Pisc_db_handle; _para3:Pisc_tr_handle; _para4:Pisc_win_handle; _para5:Pisc_req_handle;_para6:Pbyte; _para7:Pbyte):ISC_STATUS; gdsdecl;
+  isc_drive_menu : function (_para1:PISC_STATUS; _para2:Pisc_win_handle; _para3:Pisc_req_handle; _para4:Psmallint; _para5:Pchar;_para6:Psmallint; _para7:Pchar; _para8:Psmallint; _para9:Psmallint; _para10:Pchar;_para11:PISC_LONG):ISC_STATUS; gdsdecl;
+  isc_form_delete : function (_para1:PISC_STATUS; _para2:Pisc_form_handle):ISC_STATUS; gdsdecl;
+  isc_form_fetch : function (_para1:PISC_STATUS; _para2:Pisc_db_handle; _para3:Pisc_tr_handle; _para4:Pisc_req_handle; _para5:Pbyte):ISC_STATUS; gdsdecl;
+  isc_form_insert : function (_para1:PISC_STATUS; _para2:Pisc_db_handle; _para3:Pisc_tr_handle; _para4:Pisc_req_handle; _para5:Pbyte):ISC_STATUS; gdsdecl;
+  isc_get_entree : function (_para1:PISC_STATUS; _para2:Pisc_req_handle; _para3:Psmallint; _para4:Pchar; _para5:PISC_LONG;_para6:Psmallint):ISC_STATUS; gdsdecl;
+  isc_initialize_menu : function (_para1:PISC_STATUS; _para2:Pisc_req_handle):ISC_STATUS; gdsdecl;
+  isc_menu : function (_para1:PISC_STATUS; _para2:Pisc_win_handle; _para3:Pisc_req_handle; _para4:Psmallint; _para5:Pchar):ISC_STATUS; gdsdecl;
+  isc_load_form : function (_para1:PISC_STATUS; _para2:Pisc_db_handle; _para3:Pisc_tr_handle; _para4:Pisc_form_handle; _para5:Psmallint;_para6:Pchar):ISC_STATUS; gdsdecl;
+  isc_pop_window : function (_para1:PISC_STATUS; _para2:Pisc_win_handle):ISC_STATUS; gdsdecl;
+  isc_put_entree : function (_para1:PISC_STATUS; _para2:Pisc_req_handle; _para3:Psmallint; _para4:Pchar; _para5:PISC_LONG):ISC_STATUS; gdsdecl;
+  isc_reset_form : function (_para1:PISC_STATUS; _para2:Pisc_req_handle):ISC_STATUS; gdsdecl;
+  isc_suspend_window : function (_para1:PISC_STATUS; _para2:Pisc_win_handle):ISC_STATUS; gdsdecl;
+{$ENDIF}
+{  isc_attach_database : function : ISC_STATUS; gdsdecl;
+  isc_array_gen_sdl : function : ISC_STATUS; gdsdecl;
+  isc_array_get_slice : function : ISC_STATUS; gdsdecl;
+  isc_array_lookup_bounds : function : ISC_STATUS; gdsdecl;
+  isc_array_lookup_desc : function : ISC_STATUS; gdsdecl;
+  isc_array_set_desc : function : ISC_STATUS; gdsdecl;
+  isc_array_put_slice : function : ISC_STATUS; gdsdecl;
+  isc_blob_gen_bpb : function : ISC_STATUS; gdsdecl;
+  isc_blob_info : function : ISC_STATUS; gdsdecl;
+  isc_blob_lookup_desc : function : ISC_STATUS; gdsdecl;
+  isc_blob_set_desc : function : ISC_STATUS; gdsdecl;
+  isc_cancel_blob : function : ISC_STATUS; gdsdecl;
+  isc_cancel_events : function : ISC_STATUS; gdsdecl;
+  isc_close_blob : function : ISC_STATUS; gdsdecl;
+  isc_commit_retaining : function : ISC_STATUS; gdsdecl;
+  isc_commit_transaction : function : ISC_STATUS; gdsdecl;
+  isc_compile_request : function : ISC_STATUS; gdsdecl;
+  isc_compile_request2 : function : ISC_STATUS; gdsdecl;
+  isc_create_blob : function : ISC_STATUS; gdsdecl;
+  isc_create_blob2 : function : ISC_STATUS; gdsdecl;
+  isc_create_database : function : ISC_STATUS; gdsdecl;
+  isc_database_info : function : ISC_STATUS; gdsdecl;
+  isc_ddl : function : ISC_STATUS; gdsdecl;
+  isc_decode_date : procedure; gdsdecl;
+  isc_decode_sql_date : procedure; gdsdecl;
+  isc_decode_sql_time : procedure; gdsdecl;
+  isc_decode_timestamp : procedure; gdsdecl;
+  isc_detach_database : function : ISC_STATUS; gdsdecl;
+  isc_drop_database : function : ISC_STATUS; gdsdecl;
+  isc_encode_date : procedure; gdsdecl;
+  isc_encode_sql_date : procedure; gdsdecl;
+  isc_encode_sql_time : procedure; gdsdecl;
+  isc_encode_timestamp : procedure; gdsdecl;
+  isc_event_block : function : ISC_LONG; cdecl;
+  isc_event_counts : procedure; gdsdecl;
+  isc_expand_dpb : procedure; cdecl;
+  isc_modify_dpb : function : longint; gdsdecl;
+  isc_free : function : ISC_LONG; gdsdecl;
+  isc_get_segment : function : ISC_STATUS; gdsdecl;
+  isc_get_slice : function : ISC_STATUS; gdsdecl;
+  isc_interprete : function : ISC_STATUS; gdsdecl;
+  isc_open_blob : function : ISC_STATUS; gdsdecl;
+  isc_open_blob2 : function : ISC_STATUS; gdsdecl;
+  isc_prepare_transaction : function : ISC_STATUS; gdsdecl;
+  isc_prepare_transaction2 : function : ISC_STATUS; gdsdecl;
+  isc_print_sqlerror : procedure; gdsdecl;
+  isc_print_status : function : ISC_STATUS; gdsdecl;
+  isc_put_segment : function : ISC_STATUS; gdsdecl;
+  isc_put_slice : function : ISC_STATUS; gdsdecl;
+  isc_que_events : function : ISC_STATUS; gdsdecl;
+  isc_receive : function :ISC_STATUS; gdsdecl;
+  isc_reconnect_transaction : function :ISC_STATUS; gdsdecl;
+  isc_release_request : function :ISC_STATUS; gdsdecl;
+  isc_request_info : function :ISC_STATUS; gdsdecl;}
+{$IFDEF Unix}
+//  isc_reset_fpe : function :ISC_LONG; gdsdecl;
+{$ENDIF}
+{  isc_rollback_transaction : function :ISC_STATUS; gdsdecl;
+  isc_rollback_retaining : function :ISC_STATUS; gdsdecl;
+  isc_seek_blob : function :ISC_STATUS; gdsdecl;
+  isc_send : function :ISC_STATUS; gdsdecl;
+  isc_service_attach : function :ISC_STATUS; gdsdecl;
+  isc_service_detach : function :ISC_STATUS; gdsdecl;
+  isc_service_query : function :ISC_STATUS; gdsdecl;
+  isc_service_start : function :ISC_STATUS; gdsdecl;
+  isc_start_and_send : function :ISC_STATUS; gdsdecl;
+  isc_start_multiple : function :ISC_STATUS; gdsdecl;
+  isc_start_request : function :ISC_STATUS; gdsdecl;
+  isc_start_transaction : function :ISC_STATUS; cdecl;
+  isc_sqlcode : function :ISC_LONG; gdsdecl;
+  isc_transaction_info : function :ISC_STATUS; gdsdecl;
+  isc_transact_request : function :ISC_STATUS; gdsdecl;
+  isc_unwind_request : function :ISC_STATUS; gdsdecl;
+  isc_wait_for_event : function :ISC_STATUS; gdsdecl;
+  isc_ftof : function :ISC_LONG; gdsdecl;
+  isc_print_blr : function :ISC_STATUS; gdsdecl;
+  isc_set_debug : procedure; gdsdecl;
+  isc_qtoq : procedure; gdsdecl;
+  isc_vax_integer : function :ISC_LONG; gdsdecl;
+  isc_vtof : procedure; gdsdecl;
+  isc_vtov : procedure; gdsdecl;
+  isc_version : function :longint; gdsdecl;}
+  {                 }
+  { Blob functions  }
+  {                 }
+//  Bopen : function :PBSTREAM; gdsdecl;
+//  BLOB_open : function :PBSTREAM; gdsdecl;
+{$IFDEF Unix}
+//  Bopen2 : function :PBSTREAM; gdsdecl;
+{$ENDIF}
 
 
 Procedure InitialiseIBase60;
@@ -84,26 +361,261 @@ begin
         Raise EInOutError.Create('Can not load Firebird or Interbase client. Is it installed? ('+gdslib+' or '+fbclib+')');
         end;
       end;
+
     pointer(isc_attach_database) := GetProcedureAddress(IBaseLibraryHandle,'isc_attach_database');
-    pointer(isc_interprete) := GetProcedureAddress(IBaseLibraryHandle,'isc_interprete');
-    pointer(isc_commit_transaction) := GetProcedureAddress(IBaseLibraryHandle,'isc_commit_transaction');
-    pointer(isc_rollback_transaction) := GetProcedureAddress(IBaseLibraryHandle,'isc_rollback_transaction');
-    pointer(isc_start_transaction) := GetProcedureAddress(IBaseLibraryHandle,'isc_start_transaction');
+    pointer(isc_array_gen_sdl) := GetProcedureAddress(IBaseLibraryHandle,'isc_array_gen_sdl');
+    pointer(isc_array_get_slice) := GetProcedureAddress(IBaseLibraryHandle,'isc_array_get_slice');
+    pointer(isc_array_lookup_bounds) := GetProcedureAddress(IBaseLibraryHandle,'isc_array_lookup_bounds');
+    pointer(isc_array_lookup_desc) := GetProcedureAddress(IBaseLibraryHandle,'isc_array_lookup_desc');
+    pointer(isc_array_set_desc) := GetProcedureAddress(IBaseLibraryHandle,'isc_array_set_desc');
+    pointer(isc_array_put_slice) := GetProcedureAddress(IBaseLibraryHandle,'isc_array_put_slice');
+    pointer(isc_blob_default_desc) := GetProcedureAddress(IBaseLibraryHandle,'isc_blob_default_desc');
+    pointer(isc_blob_gen_bpb) := GetProcedureAddress(IBaseLibraryHandle,'isc_blob_gen_bpb');
+    pointer(isc_blob_info) := GetProcedureAddress(IBaseLibraryHandle,'isc_blob_info');
+    pointer(isc_blob_lookup_desc) := GetProcedureAddress(IBaseLibraryHandle,'isc_blob_lookup_desc');
+    pointer(isc_blob_set_desc) := GetProcedureAddress(IBaseLibraryHandle,'isc_blob_set_desc');
+    pointer(isc_cancel_blob) := GetProcedureAddress(IBaseLibraryHandle,'isc_cancel_blob');
+    pointer(isc_cancel_events) := GetProcedureAddress(IBaseLibraryHandle,'isc_cancel_events');
+    pointer(isc_close_blob) := GetProcedureAddress(IBaseLibraryHandle,'isc_close_blob');
     pointer(isc_commit_retaining) := GetProcedureAddress(IBaseLibraryHandle,'isc_commit_retaining');
-    pointer(isc_rollback_retaining) := GetProcedureAddress(IBaseLibraryHandle,'isc_rollback_retaining');
+    pointer(isc_commit_transaction) := GetProcedureAddress(IBaseLibraryHandle,'isc_commit_transaction');
+    pointer(isc_create_blob) := GetProcedureAddress(IBaseLibraryHandle,'isc_create_blob');
+    pointer(isc_create_blob2) := GetProcedureAddress(IBaseLibraryHandle,'isc_create_blob2');
+    pointer(isc_create_database) := GetProcedureAddress(IBaseLibraryHandle,'isc_create_database');
+    pointer(isc_database_info) := GetProcedureAddress(IBaseLibraryHandle,'isc_database_info');
+    pointer(isc_decode_date) := GetProcedureAddress(IBaseLibraryHandle,'isc_decode_date');
+    pointer(isc_decode_sql_date) := GetProcedureAddress(IBaseLibraryHandle,'isc_decode_sql_date');
+    pointer(isc_decode_sql_time) := GetProcedureAddress(IBaseLibraryHandle,'isc_decode_sql_time');
+    pointer(isc_decode_timestamp) := GetProcedureAddress(IBaseLibraryHandle,'isc_decode_timestamp');
     pointer(isc_detach_database) := GetProcedureAddress(IBaseLibraryHandle,'isc_detach_database');
-    pointer(isc_vax_integer) := GetProcedureAddress(IBaseLibraryHandle,'isc_vax_integer');
-    pointer(isc_dsql_free_statement) := GetProcedureAddress(IBaseLibraryHandle,'isc_dsql_free_statement');
+    pointer(isc_drop_database) := GetProcedureAddress(IBaseLibraryHandle,'isc_drop_database');
     pointer(isc_dsql_allocate_statement) := GetProcedureAddress(IBaseLibraryHandle,'isc_dsql_allocate_statement');
-    pointer(isc_dsql_prepare) := GetProcedureAddress(IBaseLibraryHandle,'isc_dsql_prepare');
+    pointer(isc_dsql_alloc_statement2) := GetProcedureAddress(IBaseLibraryHandle,'isc_dsql_alloc_statement2');
     pointer(isc_dsql_describe) := GetProcedureAddress(IBaseLibraryHandle,'isc_dsql_describe');
+    pointer(isc_dsql_describe_bind) := GetProcedureAddress(IBaseLibraryHandle,'isc_dsql_describe_bind');
+    pointer(isc_dsql_exec_immed2) := GetProcedureAddress(IBaseLibraryHandle,'isc_dsql_exec_immed2');
     pointer(isc_dsql_execute) := GetProcedureAddress(IBaseLibraryHandle,'isc_dsql_execute');
+    pointer(isc_dsql_execute2) := GetProcedureAddress(IBaseLibraryHandle,'isc_dsql_execute2');
+    pointer(isc_dsql_execute_immediate) := GetProcedureAddress(IBaseLibraryHandle,'isc_dsql_execute_immediate');
     pointer(isc_dsql_fetch) := GetProcedureAddress(IBaseLibraryHandle,'isc_dsql_fetch');
+    pointer(isc_dsql_finish) := GetProcedureAddress(IBaseLibraryHandle,'isc_dsql_finish');
+    pointer(isc_dsql_free_statement) := GetProcedureAddress(IBaseLibraryHandle,'isc_dsql_free_statement');
+    pointer(isc_dsql_insert) := GetProcedureAddress(IBaseLibraryHandle,'isc_dsql_insert');
+    pointer(isc_dsql_prepare) := GetProcedureAddress(IBaseLibraryHandle,'isc_dsql_prepare');
+    pointer(isc_dsql_set_cursor_name) := GetProcedureAddress(IBaseLibraryHandle,'isc_dsql_set_cursor_name');
+    pointer(isc_dsql_sql_info) := GetProcedureAddress(IBaseLibraryHandle,'isc_dsql_sql_info');
+    pointer(isc_encode_date) := GetProcedureAddress(IBaseLibraryHandle,'isc_encode_date');
+    pointer(isc_encode_sql_date) := GetProcedureAddress(IBaseLibraryHandle,'isc_encode_sql_date');
+    pointer(isc_encode_sql_time) := GetProcedureAddress(IBaseLibraryHandle,'isc_encode_sql_time');
+    pointer(isc_encode_timestamp) := GetProcedureAddress(IBaseLibraryHandle,'isc_encode_timestamp');
+    pointer(isc_event_block) := GetProcedureAddress(IBaseLibraryHandle,'isc_event_block');
+    pointer(isc_expand_dpb) := GetProcedureAddress(IBaseLibraryHandle,'isc_expand_dpb');
+    pointer(isc_modify_dpb) := GetProcedureAddress(IBaseLibraryHandle,'isc_modify_dpb');
+    pointer(isc_free) := GetProcedureAddress(IBaseLibraryHandle,'isc_free');
+    pointer(isc_get_segment) := GetProcedureAddress(IBaseLibraryHandle,'isc_get_segment');
+    pointer(isc_get_slice) := GetProcedureAddress(IBaseLibraryHandle,'isc_get_slice');
+    pointer(isc_interprete) := GetProcedureAddress(IBaseLibraryHandle,'isc_interprete');
+    pointer(isc_open_blob) := GetProcedureAddress(IBaseLibraryHandle,'isc_open_blob');
+    pointer(isc_open_blob2) := GetProcedureAddress(IBaseLibraryHandle,'isc_open_blob2');
+    pointer(isc_prepare_transaction2) := GetProcedureAddress(IBaseLibraryHandle,'isc_prepare_transaction2');
+    pointer(isc_print_sqlerror) := GetProcedureAddress(IBaseLibraryHandle,'isc_print_sqlerror');
+    pointer(isc_print_status) := GetProcedureAddress(IBaseLibraryHandle,'isc_print_status');
+    pointer(isc_put_segment) := GetProcedureAddress(IBaseLibraryHandle,'isc_put_segment');
+    pointer(isc_put_slice) := GetProcedureAddress(IBaseLibraryHandle,'isc_put_slice');
+    pointer(isc_que_events) := GetProcedureAddress(IBaseLibraryHandle,'isc_que_events');
+    pointer(isc_rollback_retaining) := GetProcedureAddress(IBaseLibraryHandle,'isc_rollback_retaining');
+    pointer(isc_rollback_transaction) := GetProcedureAddress(IBaseLibraryHandle,'isc_rollback_transaction');
+    pointer(isc_start_multiple) := GetProcedureAddress(IBaseLibraryHandle,'isc_start_multiple');
+    pointer(isc_start_transaction) := GetProcedureAddress(IBaseLibraryHandle,'isc_start_transaction');
+    pointer(isc_sqlcode) := GetProcedureAddress(IBaseLibraryHandle,'isc_sqlcode');
+    pointer(isc_sql_interprete) := GetProcedureAddress(IBaseLibraryHandle,'isc_sql_interprete');
+    pointer(isc_transaction_info) := GetProcedureAddress(IBaseLibraryHandle,'isc_transaction_info');
+    pointer(isc_transact_request) := GetProcedureAddress(IBaseLibraryHandle,'isc_transact_request');
+    pointer(isc_vax_integer) := GetProcedureAddress(IBaseLibraryHandle,'isc_vax_integer');
+    pointer(isc_portable_integer) := GetProcedureAddress(IBaseLibraryHandle,'isc_portable_integer');
+    pointer(isc_add_user) := GetProcedureAddress(IBaseLibraryHandle,'isc_add_user');
+    pointer(isc_delete_user) := GetProcedureAddress(IBaseLibraryHandle,'isc_delete_user');
+    pointer(isc_modify_user) := GetProcedureAddress(IBaseLibraryHandle,'isc_modify_user');
+    pointer(isc_compile_request) := GetProcedureAddress(IBaseLibraryHandle,'isc_compile_request');
+    pointer(isc_compile_request2) := GetProcedureAddress(IBaseLibraryHandle,'isc_compile_request2');
+    pointer(isc_ddl) := GetProcedureAddress(IBaseLibraryHandle,'isc_ddl');
+    pointer(isc_prepare_transaction) := GetProcedureAddress(IBaseLibraryHandle,'isc_prepare_transaction');
+    pointer(isc_receive) := GetProcedureAddress(IBaseLibraryHandle,'isc_receive');
+    pointer(isc_reconnect_transaction) := GetProcedureAddress(IBaseLibraryHandle,'isc_reconnect_transaction');
+    pointer(isc_release_request) := GetProcedureAddress(IBaseLibraryHandle,'isc_release_request');
+    pointer(isc_request_info) := GetProcedureAddress(IBaseLibraryHandle,'isc_request_info');
+    pointer(isc_seek_blob) := GetProcedureAddress(IBaseLibraryHandle,'isc_seek_blob');
+    pointer(isc_send) := GetProcedureAddress(IBaseLibraryHandle,'isc_send');
+    pointer(isc_start_and_send) := GetProcedureAddress(IBaseLibraryHandle,'isc_start_and_send');
+    pointer(isc_start_request) := GetProcedureAddress(IBaseLibraryHandle,'isc_start_request');
+    pointer(isc_unwind_request) := GetProcedureAddress(IBaseLibraryHandle,'isc_unwind_request');
+    pointer(isc_wait_for_event) := GetProcedureAddress(IBaseLibraryHandle,'isc_wait_for_event');
+    pointer(isc_close) := GetProcedureAddress(IBaseLibraryHandle,'isc_close');
+    pointer(isc_declare) := GetProcedureAddress(IBaseLibraryHandle,'isc_declare');
+    pointer(isc_describe) := GetProcedureAddress(IBaseLibraryHandle,'isc_describe');
+    pointer(isc_describe_bind) := GetProcedureAddress(IBaseLibraryHandle,'isc_describe_bind');
+    pointer(isc_execute) := GetProcedureAddress(IBaseLibraryHandle,'isc_execute');
+    pointer(isc_execute_immediate) := GetProcedureAddress(IBaseLibraryHandle,'isc_execute_immediate');
+    pointer(isc_fetch) := GetProcedureAddress(IBaseLibraryHandle,'isc_fetch');
+    pointer(isc_open) := GetProcedureAddress(IBaseLibraryHandle,'isc_open');
+    pointer(isc_prepare) := GetProcedureAddress(IBaseLibraryHandle,'isc_prepare');
+    pointer(isc_dsql_execute_m) := GetProcedureAddress(IBaseLibraryHandle,'isc_dsql_execute_m');
+    pointer(isc_dsql_execute2_m) := GetProcedureAddress(IBaseLibraryHandle,'isc_dsql_execute2_m');
+    pointer(isc_dsql_execute_immediate_m) := GetProcedureAddress(IBaseLibraryHandle,'isc_dsql_execute_immediate_m');
+    pointer(isc_dsql_exec_immed3_m) := GetProcedureAddress(IBaseLibraryHandle,'isc_dsql_exec_immed3_m');
+    pointer(isc_dsql_fetch_m) := GetProcedureAddress(IBaseLibraryHandle,'isc_dsql_fetch_m');
+    pointer(isc_dsql_insert_m) := GetProcedureAddress(IBaseLibraryHandle,'isc_dsql_insert_m');
+    pointer(isc_dsql_prepare_m) := GetProcedureAddress(IBaseLibraryHandle,'isc_dsql_prepare_m');
+    pointer(isc_dsql_release) := GetProcedureAddress(IBaseLibraryHandle,'isc_dsql_release');
+    pointer(isc_embed_dsql_close) := GetProcedureAddress(IBaseLibraryHandle,'isc_embed_dsql_close');
+    pointer(isc_embed_dsql_declare) := GetProcedureAddress(IBaseLibraryHandle,'isc_embed_dsql_declare');
+    pointer(isc_embed_dsql_describe) := GetProcedureAddress(IBaseLibraryHandle,'isc_embed_dsql_describe');
+    pointer(isc_embed_dsql_describe_bind) := GetProcedureAddress(IBaseLibraryHandle,'isc_embed_dsql_describe_bind');
+    pointer(isc_embed_dsql_execute) := GetProcedureAddress(IBaseLibraryHandle,'isc_embed_dsql_execute');
+    pointer(isc_embed_dsql_execute2) := GetProcedureAddress(IBaseLibraryHandle,'isc_embed_dsql_execute2');
+    pointer(isc_embed_dsql_execute_immed) := GetProcedureAddress(IBaseLibraryHandle,'isc_embed_dsql_execute_immed');
+    pointer(isc_embed_dsql_fetch) := GetProcedureAddress(IBaseLibraryHandle,'isc_embed_dsql_fetch');
+    pointer(isc_embed_dsql_open) := GetProcedureAddress(IBaseLibraryHandle,'isc_embed_dsql_open');
+    pointer(isc_embed_dsql_open2) := GetProcedureAddress(IBaseLibraryHandle,'isc_embed_dsql_open2');
+    pointer(isc_embed_dsql_insert) := GetProcedureAddress(IBaseLibraryHandle,'isc_embed_dsql_insert');
+    pointer(isc_embed_dsql_prepare) := GetProcedureAddress(IBaseLibraryHandle,'isc_embed_dsql_prepare');
+    pointer(isc_embed_dsql_release) := GetProcedureAddress(IBaseLibraryHandle,'isc_embed_dsql_release');
+    pointer(BLOB_open) := GetProcedureAddress(IBaseLibraryHandle,'BLOB_open');
+    pointer(BLOB_put) := GetProcedureAddress(IBaseLibraryHandle,'BLOB_put');
+    pointer(BLOB_close) := GetProcedureAddress(IBaseLibraryHandle,'BLOB_close');
+    pointer(BLOB_get) := GetProcedureAddress(IBaseLibraryHandle,'BLOB_get');
+    pointer(BLOB_display) := GetProcedureAddress(IBaseLibraryHandle,'BLOB_display');
+    pointer(BLOB_dump) := GetProcedureAddress(IBaseLibraryHandle,'BLOB_dump');
+    pointer(BLOB_edit) := GetProcedureAddress(IBaseLibraryHandle,'BLOB_edit');
+    pointer(BLOB_load) := GetProcedureAddress(IBaseLibraryHandle,'BLOB_load');
+    pointer(BLOB_text_dump) := GetProcedureAddress(IBaseLibraryHandle,'BLOB_text_dump');
+    pointer(BLOB_text_load) := GetProcedureAddress(IBaseLibraryHandle,'BLOB_text_load');
+    pointer(Bopen) := GetProcedureAddress(IBaseLibraryHandle,'Bopen');
+{$IFDEF Unix}
+    pointer(Bopen2) := GetProcedureAddress(IBaseLibraryHandle,'Bopen2');
+{$ENDIF}
+    pointer(isc_ftof) := GetProcedureAddress(IBaseLibraryHandle,'isc_ftof');
+    pointer(isc_print_blr) := GetProcedureAddress(IBaseLibraryHandle,'isc_print_blr');
+    pointer(isc_set_debug) := GetProcedureAddress(IBaseLibraryHandle,'isc_set_debug');
+    pointer(isc_qtoq) := GetProcedureAddress(IBaseLibraryHandle,'isc_qtoq');
+    pointer(isc_vtof) := GetProcedureAddress(IBaseLibraryHandle,'isc_vtof');
+    pointer(isc_vtov) := GetProcedureAddress(IBaseLibraryHandle,'isc_vtov');
+    pointer(isc_version) := GetProcedureAddress(IBaseLibraryHandle,'isc_version');
+{$IFDEF Unix}
+    pointer(isc_reset_fpe) := GetProcedureAddress(IBaseLibraryHandle,'isc_reset_fpe');
+{$ENDIF}
+    pointer(isc_service_attach) := GetProcedureAddress(IBaseLibraryHandle,'isc_service_attach');
+    pointer(isc_service_detach) := GetProcedureAddress(IBaseLibraryHandle,'isc_service_detach');
+    pointer(isc_service_query) := GetProcedureAddress(IBaseLibraryHandle,'isc_service_query');
+    pointer(isc_service_start) := GetProcedureAddress(IBaseLibraryHandle,'isc_service_start');
+{$IFDEF Unix}
+    pointer(isc_compile_map) := GetProcedureAddress(IBaseLibraryHandle,'isc_compile_map');
+    pointer(isc_compile_menu) := GetProcedureAddress(IBaseLibraryHandle,'isc_compile_menu');
+    pointer(isc_compile_sub_map) := GetProcedureAddress(IBaseLibraryHandle,'isc_compile_sub_map');
+    pointer(isc_create_window) := GetProcedureAddress(IBaseLibraryHandle,'isc_create_window');
+    pointer(isc_delete_window) := GetProcedureAddress(IBaseLibraryHandle,'isc_delete_window');
+    pointer(isc_drive_form) := GetProcedureAddress(IBaseLibraryHandle,'isc_drive_form');
+    pointer(isc_drive_menu) := GetProcedureAddress(IBaseLibraryHandle,'isc_drive_menu');
+    pointer(isc_form_delete) := GetProcedureAddress(IBaseLibraryHandle,'isc_form_delete');
+    pointer(isc_form_fetch) := GetProcedureAddress(IBaseLibraryHandle,'isc_form_fetch');
+    pointer(isc_form_insert) := GetProcedureAddress(IBaseLibraryHandle,'isc_form_insert');
+    pointer(isc_get_entree) := GetProcedureAddress(IBaseLibraryHandle,'isc_get_entree');
+    pointer(isc_initialize_menu) := GetProcedureAddress(IBaseLibraryHandle,'isc_initialize_menu');
+    pointer(isc_menu) := GetProcedureAddress(IBaseLibraryHandle,'isc_menu');
+    pointer(isc_load_form) := GetProcedureAddress(IBaseLibraryHandle,'isc_load_form');
+    pointer(isc_pop_window) := GetProcedureAddress(IBaseLibraryHandle,'isc_pop_window');
+    pointer(isc_put_entree) := GetProcedureAddress(IBaseLibraryHandle,'isc_put_entree');
+    pointer(isc_reset_form) := GetProcedureAddress(IBaseLibraryHandle,'isc_reset_form');
+    pointer(isc_suspend_window) := GetProcedureAddress(IBaseLibraryHandle,'isc_suspend_window');
+{$ENDIF}
+    pointer(isc_attach_database) := GetProcedureAddress(IBaseLibraryHandle,'isc_attach_database');
+    pointer(isc_array_gen_sdl) := GetProcedureAddress(IBaseLibraryHandle,'isc_array_gen_sdl');
+    pointer(isc_array_get_slice) := GetProcedureAddress(IBaseLibraryHandle,'isc_array_get_slice');
+    pointer(isc_array_lookup_bounds) := GetProcedureAddress(IBaseLibraryHandle,'isc_array_lookup_bounds');
+    pointer(isc_array_lookup_desc) := GetProcedureAddress(IBaseLibraryHandle,'isc_array_lookup_desc');
+    pointer(isc_array_set_desc) := GetProcedureAddress(IBaseLibraryHandle,'isc_array_set_desc');
+    pointer(isc_array_put_slice) := GetProcedureAddress(IBaseLibraryHandle,'isc_array_put_slice');
+    pointer(isc_blob_gen_bpb) := GetProcedureAddress(IBaseLibraryHandle,'isc_blob_gen_bpb');
+    pointer(isc_blob_info) := GetProcedureAddress(IBaseLibraryHandle,'isc_blob_info');
+    pointer(isc_blob_lookup_desc) := GetProcedureAddress(IBaseLibraryHandle,'isc_blob_lookup_desc');
+    pointer(isc_blob_set_desc) := GetProcedureAddress(IBaseLibraryHandle,'isc_blob_set_desc');
+    pointer(isc_cancel_blob) := GetProcedureAddress(IBaseLibraryHandle,'isc_cancel_blob');
+    pointer(isc_cancel_events) := GetProcedureAddress(IBaseLibraryHandle,'isc_cancel_events');
+    pointer(isc_close_blob) := GetProcedureAddress(IBaseLibraryHandle,'isc_close_blob');
+    pointer(isc_commit_retaining) := GetProcedureAddress(IBaseLibraryHandle,'isc_commit_retaining');
+    pointer(isc_commit_retaining) := GetProcedureAddress(IBaseLibraryHandle,'isc_commit_retaining');
+    pointer(isc_commit_transaction) := GetProcedureAddress(IBaseLibraryHandle,'isc_commit_transaction');
+    pointer(isc_compile_request) := GetProcedureAddress(IBaseLibraryHandle,'isc_compile_request');
+    pointer(isc_compile_request2) := GetProcedureAddress(IBaseLibraryHandle,'isc_compile_request2');
+    pointer(isc_create_blob) := GetProcedureAddress(IBaseLibraryHandle,'isc_create_blob');
+    pointer(isc_create_blob2) := GetProcedureAddress(IBaseLibraryHandle,'isc_create_blob2');
+    pointer(isc_create_database) := GetProcedureAddress(IBaseLibraryHandle,'isc_create_database');
+    pointer(isc_database_info) := GetProcedureAddress(IBaseLibraryHandle,'isc_database_info');
+    pointer(isc_ddl) := GetProcedureAddress(IBaseLibraryHandle,'isc_ddl');
     pointer(isc_decode_date) := GetProcedureAddress(IBaseLibraryHandle,'isc_decode_date');
     pointer(isc_decode_sql_date) := GetProcedureAddress(IBaseLibraryHandle,'isc_decode_sql_date');
     pointer(isc_decode_sql_time) := GetProcedureAddress(IBaseLibraryHandle,'isc_decode_sql_time');
     pointer(isc_decode_timestamp) := GetProcedureAddress(IBaseLibraryHandle,'isc_decode_timestamp');
-    pointer(isc_database_info) := GetProcedureAddress(IBaseLibraryHandle,'isc_database_info');
+    pointer(isc_detach_database) := GetProcedureAddress(IBaseLibraryHandle,'isc_detach_database');
+    pointer(isc_drop_database) := GetProcedureAddress(IBaseLibraryHandle,'isc_drop_database');
+    pointer(isc_encode_date) := GetProcedureAddress(IBaseLibraryHandle,'isc_encode_date');
+    pointer(isc_encode_sql_date) := GetProcedureAddress(IBaseLibraryHandle,'isc_encode_sql_date');
+    pointer(isc_encode_sql_time) := GetProcedureAddress(IBaseLibraryHandle,'isc_encode_sql_time');
+    pointer(isc_encode_timestamp) := GetProcedureAddress(IBaseLibraryHandle,'isc_encode_timestamp');
+    pointer(isc_event_block) := GetProcedureAddress(IBaseLibraryHandle,'isc_event_block');
+//    pointer(isc_event_counts) := GetProcedureAddress(IBaseLibraryHandle,'isc_event_counts');
+    pointer(isc_expand_dpb) := GetProcedureAddress(IBaseLibraryHandle,'isc_expand_dpb');
+    pointer(isc_modify_dpb) := GetProcedureAddress(IBaseLibraryHandle,'isc_modify_dpb');
+    pointer(isc_free) := GetProcedureAddress(IBaseLibraryHandle,'isc_free');
+    pointer(isc_get_segment) := GetProcedureAddress(IBaseLibraryHandle,'isc_get_segment');
+    pointer(isc_get_slice) := GetProcedureAddress(IBaseLibraryHandle,'isc_get_slice');
+    pointer(isc_interprete) := GetProcedureAddress(IBaseLibraryHandle,'isc_interprete');
+    pointer(isc_open_blob) := GetProcedureAddress(IBaseLibraryHandle,'isc_open_blob');
+    pointer(isc_open_blob2) := GetProcedureAddress(IBaseLibraryHandle,'isc_open_blob2');
+    pointer(isc_prepare_transaction) := GetProcedureAddress(IBaseLibraryHandle,'isc_prepare_transaction');
+    pointer(isc_prepare_transaction2) := GetProcedureAddress(IBaseLibraryHandle,'isc_prepare_transaction2');
+    pointer(isc_print_sqlerror) := GetProcedureAddress(IBaseLibraryHandle,'isc_print_sqlerror');
+    pointer(isc_print_status) := GetProcedureAddress(IBaseLibraryHandle,'isc_print_status');
+    pointer(isc_put_segment) := GetProcedureAddress(IBaseLibraryHandle,'isc_put_segment');
+    pointer(isc_put_slice) := GetProcedureAddress(IBaseLibraryHandle,'isc_put_slice');
+    pointer(isc_que_events) := GetProcedureAddress(IBaseLibraryHandle,'isc_que_events');
+    pointer(isc_receive) := GetProcedureAddress(IBaseLibraryHandle,'isc_receive');
+    pointer(isc_reconnect_transaction) := GetProcedureAddress(IBaseLibraryHandle,'isc_reconnect_transaction');
+    pointer(isc_release_request) := GetProcedureAddress(IBaseLibraryHandle,'isc_release_request');
+    pointer(isc_request_info) := GetProcedureAddress(IBaseLibraryHandle,'isc_request_info');
+{$IFDEF Unix}
+    pointer(isc_reset_fpe) := GetProcedureAddress(IBaseLibraryHandle,'isc_reset_fpe');
+{$ENDIF}
+    pointer(isc_rollback_transaction) := GetProcedureAddress(IBaseLibraryHandle,'isc_rollback_transaction');
+    pointer(isc_rollback_retaining) := GetProcedureAddress(IBaseLibraryHandle,'isc_rollback_retaining');
+    pointer(isc_seek_blob) := GetProcedureAddress(IBaseLibraryHandle,'isc_seek_blob');
+    pointer(isc_send) := GetProcedureAddress(IBaseLibraryHandle,'isc_send');
+    pointer(isc_service_attach) := GetProcedureAddress(IBaseLibraryHandle,'isc_service_attach');
+    pointer(isc_service_detach) := GetProcedureAddress(IBaseLibraryHandle,'isc_service_detach');
+    pointer(isc_service_query) := GetProcedureAddress(IBaseLibraryHandle,'isc_service_query');
+    pointer(isc_service_start) := GetProcedureAddress(IBaseLibraryHandle,'isc_service_start');
+    pointer(isc_start_and_send) := GetProcedureAddress(IBaseLibraryHandle,'isc_start_and_send');
+    pointer(isc_start_multiple) := GetProcedureAddress(IBaseLibraryHandle,'isc_start_multiple');
+    pointer(isc_start_request) := GetProcedureAddress(IBaseLibraryHandle,'isc_start_request');
+    pointer(isc_start_transaction) := GetProcedureAddress(IBaseLibraryHandle,'isc_start_transaction');
+    pointer(isc_sqlcode) := GetProcedureAddress(IBaseLibraryHandle,'isc_sqlcode');
+    pointer(isc_transaction_info) := GetProcedureAddress(IBaseLibraryHandle,'isc_transaction_info');
+    pointer(isc_transact_request) := GetProcedureAddress(IBaseLibraryHandle,'isc_transact_request');
+    pointer(isc_unwind_request) := GetProcedureAddress(IBaseLibraryHandle,'isc_unwind_request');
+    pointer(isc_wait_for_event) := GetProcedureAddress(IBaseLibraryHandle,'isc_wait_for_event');
+    pointer(isc_ftof) := GetProcedureAddress(IBaseLibraryHandle,'isc_ftof');
+    pointer(isc_print_blr) := GetProcedureAddress(IBaseLibraryHandle,'isc_print_blr');
+    pointer(isc_set_debug) := GetProcedureAddress(IBaseLibraryHandle,'isc_set_debug');
+    pointer(isc_qtoq) := GetProcedureAddress(IBaseLibraryHandle,'isc_qtoq');
+    pointer(isc_vax_integer) := GetProcedureAddress(IBaseLibraryHandle,'isc_vax_integer');
+    pointer(isc_vtof) := GetProcedureAddress(IBaseLibraryHandle,'isc_vtof');
+    pointer(isc_vtov) := GetProcedureAddress(IBaseLibraryHandle,'isc_vtov');
+    pointer(isc_version) := GetProcedureAddress(IBaseLibraryHandle,'isc_version');
+    pointer(Bopen) := GetProcedureAddress(IBaseLibraryHandle,'Bopen');
+    pointer(BLOB_open) := GetProcedureAddress(IBaseLibraryHandle,'BLOB_open');
+{$IFDEF Unix}
+    pointer(Bopen2) := GetProcedureAddress(IBaseLibraryHandle,'Bopen2');
+{$ENDIF}
     end;
 end;
 

+ 14 - 0
packages/base/libc/stdlibh.inc

@@ -136,7 +136,21 @@ function mktemp(__template:Pchar):Pchar;cdecl;external clib name 'mktemp';
 function mkstemp(__template:Pchar):longint;cdecl;external clib name 'mkstemp';
 function mkstemp64(__template:Pchar):longint;cdecl;external clib name 'mkstemp64';
 function mkdtemp(__template:Pchar):Pchar;cdecl;external clib name 'mkdtemp';
+// **************** detect whether system symbol is hidden. Should be as of 1.9.4 
+{$ifdef VER1_0}
+{$define __SYSTEMONLY}
+{$endif}
+{$ifdef VER1_1}
+{$define __SYSTEMONLY}
+{$endif}
+{$ifdef VER1_9_2}
+{$define __SYSTEMONLY}
+{$endif}
+// **************** End of detect
 function __system(__command:Pchar):longint;cdecl;external clib name 'system';
+{$ifndef __SYSTEMONLY}
+function system(__command:Pchar):longint;cdecl;external clib name 'system';
+{$endif}
 function canonicalize_file_name(__name:Pchar):Pchar;cdecl;external clib name 'canonicalize_file_name';
 function realpath(__name:Pchar; __resolved:Pchar):Pchar;cdecl;external clib name 'realpath';
 

+ 1 - 1
packages/base/mysql/Makefile.fpc

@@ -7,7 +7,7 @@ name=mysql
 version=1.9.7
 
 [target]
-units=mysql4_com mysql4_version mysql4 mysql3_com mysql3_version mysql3
+units=mysql4_com mysql4_version mysql4 mysql4dyn mysql4_comdyn mysql3_com mysql3_version mysql3
 examples=testdb4 testdb3
 
 [require]

+ 29 - 288
packages/base/mysql/mysql4.pp

@@ -13,19 +13,6 @@ uses mysql4_com;
     mysql.ph
 }
 
-  const
-    External_library='mysqlclient'; {Setup as you need}
-
-  { Pointers to basic pascal types, inserted by h2pas conversion program.}
-  Type
-    PLongint  = ^Longint;
-    PSmallInt = ^SmallInt;
-    PByte     = ^Byte;
-    PWord     = ^Word;
-    PDWord    = ^DWord;
-    PDouble   = ^Double;
-
-{$PACKRECORDS C}
 
   { Copyright (C) 2000 MySQL AB
 
@@ -43,238 +30,21 @@ uses mysql4_com;
      along with this program; if not, write to the Free Software
      Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA  }
 
-type
-
-  Pmy_bool = ^my_bool;
-  my_bool = char;
-
-  Pgptr = ^gptr;
-  gptr = char;
-
-  Pmy_socket = ^my_socket;
-  my_socket = longint;
-
-var
-  mysql_port : dword;cvar;external;
-  mysql_unix_port : Pchar;cvar;external;
-
-type
-  Pst_mysql_field = ^st_mysql_field;
-  st_mysql_field = record
-       name : Pchar;
-       table : Pchar;
-       org_table : Pchar;
-       db : Pchar;
-       def : Pchar;
-       length : dword;
-       max_length : dword;
-       flags : dword;
-       decimals : dword;
-       ftype : enum_field_types;
-    end;
-  MYSQL_FIELD = st_mysql_field;
-  TMYSQL_FIELD = MYSQL_FIELD;
-  PMYSQL_FIELD = ^MYSQL_FIELD;
-
-  function IS_PRI_KEY(n : longint) : Boolean;
-  function IS_NOT_NULL(n : longint) :  Boolean;
-  function IS_BLOB(n : longint) : boolean;
-
-type
-  MYSQL_ROW = ppchar;
-  PMYSQL_ROW = ^MYSQL_ROW;
-  TMYSQL_ROW = MYSQL_ROW;
-
-  PMYSQL_FIELD_OFFSET = ^MYSQL_FIELD_OFFSET;
-  MYSQL_FIELD_OFFSET = dword;
-
-  Pmy_ulonglong = ^my_ulonglong;
-  my_ulonglong = qword;
-
-  function MYSQL_COUNT_ERROR : longint;
-
-type
-  Pst_mysql_rows = ^st_mysql_rows;
-  st_mysql_rows = record
-     next : Pst_mysql_rows;
-     data : MYSQL_ROW;
-  end;
-  MYSQL_ROWS = st_mysql_rows;
-  TMYSQL_ROWS = MYSQL_ROWS;
-  PMYSQL_ROWS = ^MYSQL_ROWS;
-
-  MYSQL_ROW_OFFSET = MYSQL_ROWS;
-  PMYSQL_ROW_OFFSET = ^MYSQL_ROW_OFFSET;
-
-  Pst_used_mem = ^st_used_mem;
-  st_used_mem = record
-    next : Pst_used_mem;
-    left : dword;
-    size : dword;
-  end;
-
-  USED_MEM  = st_used_mem;
-  TUSED_MEM = USED_MEM;
-  PUSED_MEM = ^USED_MEM;
-
-  Pst_mem_root = ^st_mem_root;
-  st_mem_root = record
-       free : PUSED_MEM;
-       used : PUSED_MEM;
-       pre_alloc : PUSED_MEM;
-       min_malloc : dword;
-       block_size : dword;
-       block_num : dword;
-       first_block_usage : dword;
-       error_handler : procedure ;cdecl;
-    end;
-  MEM_ROOT = st_mem_root;
-  TMEM_ROOT = MEM_ROOT;
-  PMEM_ROOT = ^MEM_ROOT;
-
-  Pst_mysql_data = ^st_mysql_data;
-  st_mysql_data = record
-       rows : my_ulonglong;
-       fields : dword;
-       data : PMYSQL_ROWS;
-       alloc : MEM_ROOT;
-    end;
-  MYSQL_DATA = st_mysql_data;
-  TMYSQL_DATA = MYSQL_DATA;
-  PMYSQL_DATA = ^MYSQL_DATA;
-
-  Pst_mysql_options = ^st_mysql_options;
-  st_mysql_options = record
-       connect_timeout : dword;
-       client_flag : dword;
-       port : dword;
-       host : Pchar;
-       init_command : Pchar;
-       user : Pchar;
-       password : Pchar;
-       unix_socket : Pchar;
-       db : Pchar;
-       my_cnf_file : Pchar;
-       my_cnf_group : Pchar;
-       charset_dir : Pchar;
-       charset_name : Pchar;
-       ssl_key : Pchar;
-       ssl_cert : Pchar;
-       ssl_ca : Pchar;
-       ssl_capath : Pchar;
-       ssl_cipher : Pchar;
-       max_allowed_packet : Cardinal;
-       use_ssl : my_bool;
-       compress : my_bool;
-       named_pipe : my_bool;
-       rpl_probe : my_bool;
-       rpl_parse : my_bool;
-       no_master_reads : my_bool;
-    end;
-  TMYSQL_OPTIONS = st_mysql_options;
-  PTMYSQL_OPTIONS = ^TMYSQL_OPTIONS;
-  
-  mysql_option = (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_status = (MYSQL_STATUS_READY,MYSQL_STATUS_GET_RESULT,
-    MYSQL_STATUS_USE_RESULT);
-
-  mysql_rpl_type = (MYSQL_RPL_MASTER,MYSQL_RPL_SLAVE,MYSQL_RPL_ADMIN );
-
-  Pst_mysql = ^st_mysql;
-  st_mysql = record
-       net : NET;
-       connector_fd : gptr;
-       host : Pchar;
-       user : Pchar;
-       passwd : Pchar;
-       unix_socket : Pchar;
-       server_version : Pchar;
-       host_info : Pchar;
-       info : Pchar;
-       db : Pchar;
-       charset : Pointer;  //!! Was Pcharset_info_st;
-       fields : PMYSQL_FIELD;
-       field_alloc : MEM_ROOT;
-       affected_rows : my_ulonglong;
-       insert_id : my_ulonglong;
-       extra_info : my_ulonglong;
-       thread_id : dword;
-       packet_length : dword;
-       port : dword;
-       client_flag : dword;
-       server_capabilities : dword;
-       protocol_version : dword;
-       field_count : dword;
-       server_status : dword;
-       server_language : dword;
-       options : st_mysql_options;
-       status : mysql_status;
-       free_me : my_bool;
-       reconnect : my_bool;
-       scramble_buff : array[0..8] of char;
-       rpl_pivot : my_bool;
-       master : Pst_mysql;
-       next_slave : Pst_mysql;
-       last_used_slave : Pst_mysql;
-       last_used_con : Pst_mysql;
-    end;
-  TMYSQL = st_mysql;
-  PMYSQL = ^TMYSQL;
-
-  Pst_mysql_res = ^st_mysql_res;
-  st_mysql_res = record
-       row_count : my_ulonglong;
-       fields : PMYSQL_FIELD;
-       data : PMYSQL_DATA;
-       data_cursor : PMYSQL_ROWS;
-       lengths : Pdword;
-       handle : PMYSQL;
-       field_alloc : MEM_ROOT;
-       field_count : dword;
-       current_field : dword;
-       row : MYSQL_ROW;
-       current_row : MYSQL_ROW;
-       eof : my_bool;
-    end;
-  MYSQL_RES = st_mysql_res;
-  TMYSQL_RES = MYSQL_RES;
-  PMYSQL_RES = ^MYSQL_RES;
+{$PACKRECORDS C}
 
-const
-  MAX_MYSQL_MANAGER_ERR = 256;
-  MAX_MYSQL_MANAGER_MSG = 256;
-  MANAGER_OK = 200;
-  MANAGER_INFO = 250;
-  MANAGER_ACCESS = 401;
-  MANAGER_CLIENT_ERR = 450;
-  MANAGER_INTERNAL_ERR = 500;
+  const
+    External_library='mysqlclient'; {Setup as you need}
 
-type
+  { Pointers to basic pascal types, inserted by h2pas conversion program.}
+{  Type
+    PLongint  = ^Longint;
+    PSmallInt = ^SmallInt;
+    PByte     = ^Byte;
+    PWord     = ^Word;
+    PDWord    = ^DWord;
+    PDouble   = ^Double;}
 
-  Pst_mysql_manager = ^st_mysql_manager;
-  st_mysql_manager = record
-       net : NET;
-       host : Pchar;
-       user : Pchar;
-       passwd : Pchar;
-       port : dword;
-       free_me : my_bool;
-       eof : my_bool;
-       cmd_status : longint;
-       last_errno : longint;
-       net_buf : Pchar;
-       net_buf_pos : Pchar;
-       net_data_end : Pchar;
-       net_buf_size : longint;
-       last_error : array[0..(MAX_MYSQL_MANAGER_ERR)-1] of char;
-    end;
-  MYSQL_MANAGER = st_mysql_manager;
-  PMYSQL_MANAGER = ^MYSQL_MANAGER;
+{$i mysql4types.inc}
 
 function mysql_server_init(argc:longint; argv:PPchar; groups:PPchar):longint;cdecl;external External_library name 'mysql_server_init';
 procedure mysql_server_end;cdecl;external External_library name 'mysql_server_end';
@@ -354,56 +124,27 @@ function mysql_escape_string(_to:Pchar; from:Pchar; from_length:dword):dword;cde
 function mysql_real_escape_string(mysql:PMYSQL; _to:Pchar; from:Pchar; length:dword):dword;cdecl;external External_library name 'mysql_real_escape_string';
 procedure mysql_debug(debug:Pchar);cdecl;external External_library name 'mysql_debug';
 
-Type
-  TExdendBuffer = function (_para1:pointer; _to:Pchar; length:Pdword):Pchar;
-    function mysql_odbc_escape_string(mysql:PMYSQL; _to:Pchar; to_length:dword; from:Pchar; from_length:dword;
-               param:pointer; extend_buffer: TExdendBuffer):Pchar;cdecl;external External_library name 'mysql_odbc_escape_string';
-    procedure myodbc_remove_escape(mysql:PMYSQL; name:Pchar);cdecl;external External_library name 'myodbc_remove_escape';
-    function mysql_thread_safe:dword;cdecl;external External_library name 'mysql_thread_safe';
-    function mysql_manager_init(con:PMYSQL_MANAGER):PMYSQL_MANAGER;cdecl;external External_library name 'mysql_manager_init';
-    function mysql_manager_connect(con:PMYSQL_MANAGER; host:Pchar; user:Pchar; passwd:Pchar; port:dword):PMYSQL_MANAGER;cdecl;external External_library name 'mysql_manager_connect';
-    procedure mysql_manager_close(con:PMYSQL_MANAGER);cdecl;external External_library name 'mysql_manager_close';
-    function mysql_manager_command(con:PMYSQL_MANAGER; cmd:Pchar; cmd_len:longint):longint;cdecl;external External_library name 'mysql_manager_command';
-    function mysql_manager_fetch_line(con:PMYSQL_MANAGER; res_buf:Pchar; res_buf_size:longint):longint;cdecl;external External_library name 'mysql_manager_fetch_line';
-    function mysql_reload(mysql : pmysql) : longint;
-    function simple_command(mysql:PMYSQL; command:enum_server_command; arg:Pchar; length:dword; skipp_check:my_bool):longint;cdecl;external External_library name 'simple_command';
-    function net_safe_read(mysql:PMYSQL):dword;cdecl;external External_library name 'net_safe_read';
-
-implementation
+function mysql_odbc_escape_string(mysql:PMYSQL; _to:Pchar; to_length:dword; from:Pchar; from_length:dword;
+         param:pointer; extend_buffer: TExdendBuffer):Pchar;cdecl;external External_library name 'mysql_odbc_escape_string';
+procedure myodbc_remove_escape(mysql:PMYSQL; name:Pchar);cdecl;external External_library name 'myodbc_remove_escape';
+function mysql_thread_safe:dword;cdecl;external External_library name 'mysql_thread_safe';
+function mysql_manager_init(con:PMYSQL_MANAGER):PMYSQL_MANAGER;cdecl;external External_library name 'mysql_manager_init';
+function mysql_manager_connect(con:PMYSQL_MANAGER; host:Pchar; user:Pchar; passwd:Pchar; port:dword):PMYSQL_MANAGER;cdecl;external External_library name 'mysql_manager_connect';
+procedure mysql_manager_close(con:PMYSQL_MANAGER);cdecl;external External_library name 'mysql_manager_close';
+function mysql_manager_command(con:PMYSQL_MANAGER; cmd:Pchar; cmd_len:longint):longint;cdecl;external External_library name 'mysql_manager_command';
+function mysql_manager_fetch_line(con:PMYSQL_MANAGER; res_buf:Pchar; res_buf_size:longint):longint;cdecl;external External_library name 'mysql_manager_fetch_line';
+function simple_command(mysql:PMYSQL; command:enum_server_command; arg:Pchar; length:dword; skipp_check:my_bool):longint;cdecl;external External_library name 'simple_command';
+function net_safe_read(mysql:PMYSQL):dword;cdecl;external External_library name 'net_safe_read';
 
 function IS_PRI_KEY(n : longint) : Boolean;
-begin
-   IS_PRI_KEY:=(n and PRI_KEY_FLAG)<>0;
-end;
-
-
-function IS_NOT_NULL(n : longint) : Boolean;
-begin
-   IS_NOT_NULL:=(n and NOT_NULL_FLAG)<>0;
-end;
-
-
-function IS_BLOB(n : longint) : Boolean;
-begin
-   IS_BLOB:=(n and BLOB_FLAG)<>0;
-end;
-
-
-function IS_NUM_FIELD(f : Pst_mysql_field) : Boolean;
-begin
-   IS_NUM_FIELD:=((f^.flags) and NUM_FLAG)<>0;
-end;
-
-
+function IS_NOT_NULL(n : longint) :  Boolean;
+function IS_BLOB(n : longint) : boolean;
 function MYSQL_COUNT_ERROR : longint;
-begin
-  MYSQL_COUNT_ERROR:= not (my_ulonglong(0));
-end;
+function mysql_reload(mysql : pmysql) : longint;
 
 
-function mysql_reload(mysql : pmysql) : longint;
-begin
-  mysql_reload:=mysql_refresh(mysql,REFRESH_GRANT);
-end;
+implementation
+
+{$i mysql4impl.inc}
 
 end.

+ 8 - 208
packages/base/mysql/mysql4_com.pp

@@ -10,10 +10,12 @@ interface
     mysqlclient
     mysql_com.ph
 }
+{$PACKRECORDS C}
 
 const
   External_library='mysqlclient'; {Setup as you need}
 
+
 { Pointers to basic pascal types, inserted by h2pas conversion program.}
 Type
   PLongint  = ^Longint;
@@ -23,15 +25,7 @@ Type
   PDWord    = ^DWord;
   PDouble   = ^Double;
 
-{ Extra manually added types }
-    PVIO = Pointer;
-    My_socket = longint;
-    my_bool = byte;
-    pppchar = ^PPChar;
-    gptr = Pointer;
-
-
-{$PACKRECORDS C}
+{$i mysql4_comtypes.inc}
 
   { Copyright (C) 2000 MySQL AB
 
@@ -48,151 +42,7 @@ Type
      You should have received a copy of the GNU General Public License
      along with this program; if not, write to the Free Software
      Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA  }
-  {
-     Common definition between mysql server & client
-   }
-  { Field/table name length  }
 
-const
-  NAME_LEN = 64;
-  HOSTNAME_LENGTH = 60;
-  USERNAME_LENGTH = 16;
-  SERVER_VERSION_LENGTH = 60;
-  LOCAL_HOST = 'localhost';
-  LOCAL_HOST_NAMEDPIPE = '.';
-
-type
-  enum_server_command = (COM_SLEEP,COM_QUIT,COM_INIT_DB,COM_QUERY,
-     COM_FIELD_LIST,COM_CREATE_DB,COM_DROP_DB,
-     COM_REFRESH,COM_SHUTDOWN,COM_STATISTICS,
-     COM_PROCESS_INFO,COM_CONNECT,COM_PROCESS_KILL,
-     COM_DEBUG,COM_PING,COM_TIME,COM_DELAYED_INSERT,
-     COM_CHANGE_USER,COM_BINLOG_DUMP,COM_TABLE_DUMP,
-     COM_CONNECT_OUT,COM_REGISTER_SLAVE);
-
-{ Field can't be NULL  }
-
-const
-   NOT_NULL_FLAG = 1;
-   PRI_KEY_FLAG = 2;
-   UNIQUE_KEY_FLAG = 4;
-   MULTIPLE_KEY_FLAG = 8;
-   BLOB_FLAG = 16;
-   UNSIGNED_FLAG = 32;
-   ZEROFILL_FLAG = 64;
-   BINARY_FLAG = 128;
-   ENUM_FLAG = 256;
-   AUTO_INCREMENT_FLAG = 512;
-   TIMESTAMP_FLAG = 1024;
-   SET_FLAG = 2048;
-   NUM_FLAG = 32768;
-   PART_KEY_FLAG = 16384;
-   GROUP_FLAG = 32768;
-   UNIQUE_FLAG = 65536;
-   REFRESH_GRANT = 1;
-   REFRESH_LOG = 2;
-   REFRESH_TABLES = 4;
-   REFRESH_HOSTS = 8;
-   REFRESH_STATUS = 16;
-   REFRESH_THREADS = 32;
-   REFRESH_SLAVE = 64;
-   REFRESH_MASTER = 128;
-   REFRESH_READ_LOCK = 16384;
-   REFRESH_FAST = 32768;
-   REFRESH_QUERY_CACHE = 65536;
-   REFRESH_QUERY_CACHE_FREE = $20000;
-   REFRESH_DES_KEY_FILE = $40000;
-   CLIENT_LONG_PASSWORD = 1;
-   CLIENT_FOUND_ROWS = 2;
-   CLIENT_LONG_FLAG = 4;
-   CLIENT_CONNECT_WITH_DB = 8;
-   CLIENT_NO_SCHEMA = 16;
-   CLIENT_COMPRESS = 32;
-   CLIENT_ODBC = 64;
-   CLIENT_LOCAL_FILES = 128;
-   CLIENT_IGNORE_SPACE = 256;
-   CLIENT_CHANGE_USER = 512;
-   CLIENT_INTERACTIVE = 1024;
-   CLIENT_SSL = 2048;
-   CLIENT_IGNORE_SIGPIPE = 4096;
-   CLIENT_TRANSACTIONS = 8192;
-   SERVER_STATUS_IN_TRANS = 1;
-   SERVER_STATUS_AUTOCOMMIT = 2;
-   MYSQL_ERRMSG_SIZE = 200;
-   NET_READ_TIMEOUT = 30;
-   NET_WRITE_TIMEOUT = 60;
-   MAX_BLOB_WIDTH = 8192;
-{
-#define NET_WAIT_TIMEOUT      (8 60 60)
- }
-{
-struct st_vio;                                        // Only C
-typedef struct st_vio Vio;
- }
-
-type
-  Pst_net = ^st_net;
-  st_net = record
-    vio : PVio;
-    buff : Pbyte;
-    buff_end : Pbyte;
-    write_pos : Pbyte;
-    read_pos : Pbyte;
-    fd : my_socket;
-    max_packet : dword;
-    max_packet_size : dword;
-    last_errno : dword;
-    pkt_nr : dword;
-    compress_pkt_nr : dword;
-    write_timeout : dword;
-    read_timeout : dword;
-    retry_count : dword;
-    fcntl : longint;
-    last_error : array[0..(MYSQL_ERRMSG_SIZE)-1] of char;
-    error : byte;
-    return_errno : my_bool;
-    compress : my_bool;
-    remain_in_buf : dword;
-    length : dword;
-    buf_length : dword;
-    where_b : dword;
-    return_status : Pdword;
-    reading_or_writing : byte;
-    save_char : char;
-    no_send_ok : my_bool;
-    query_cache_query : gptr;
-  end;
-  NET = st_net;
-  TNET = NET;
-  PNET = ^NET;
-
-function packet_error : longint;
-
-type
-  enum_field_types = (FIELD_TYPE_DECIMAL,FIELD_TYPE_TINY,FIELD_TYPE_SHORT,
-       FIELD_TYPE_LONG,FIELD_TYPE_FLOAT,FIELD_TYPE_DOUBLE,
-       FIELD_TYPE_NULL,FIELD_TYPE_TIMESTAMP,
-       FIELD_TYPE_LONGLONG,FIELD_TYPE_INT24,
-       FIELD_TYPE_DATE,FIELD_TYPE_TIME,FIELD_TYPE_DATETIME,
-       FIELD_TYPE_YEAR,FIELD_TYPE_NEWDATE,FIELD_TYPE_ENUM := 247,
-       FIELD_TYPE_SET := 248,FIELD_TYPE_TINY_BLOB := 249,
-       FIELD_TYPE_MEDIUM_BLOB := 250,FIELD_TYPE_LONG_BLOB := 251,
-       FIELD_TYPE_BLOB := 252,FIELD_TYPE_VAR_STRING := 253,
-       FIELD_TYPE_STRING := 254);
-
-  { For compability  }
-
-  const
-     FIELD_TYPE_CHAR = FIELD_TYPE_TINY;
-  { For compability  }
-     FIELD_TYPE_INTERVAL = FIELD_TYPE_ENUM;
-  {
-  #define net_new_transaction(net) ((net)->pkt_nr=0)
-   }
-
-    var
-       max_allowed_packet : dword;cvar;external;
-       net_buffer_length : dword;cvar;external;
 
   function my_net_init(net:PNET; vio:PVio):longint;cdecl;external External_library name 'my_net_init';
 
@@ -220,61 +70,6 @@ type
                unsigned int timeout);
    }
 
-  type
-     Prand_struct = ^rand_struct;
-     rand_struct = record
-          seed1 : dword;
-          seed2 : dword;
-          max_value : dword;
-          max_value_dbl : double;
-       end;
-
-  { The following is for user defined functions  }
-     Item_result = (STRING_RESULT,REAL_RESULT,INT_RESULT
-       );
-  pitem_result = ^item_result;
-
-  { Number of arguments  }
-  { Pointer to item_results  }
-  { Pointer to argument  }
-  { Length of string arguments  }
-  { Set to 1 for all maybe_null args  }
-
-     Pst_udf_args = ^st_udf_args;
-     st_udf_args = record
-          arg_count : dword;
-          arg_type : PItem_result;
-          args : ^Pchar;
-          lengths : Pdword;
-          maybe_null : Pchar;
-       end;
-     UDF_ARGS = st_udf_args;
-     PUDF_ARGS = ^UDF_ARGS;
-  { This holds information about the result  }
-  { 1 if function can return NULL  }
-  { for real functions  }
-  { For string functions  }
-  { free pointer for function data  }
-  { 0 if result is independent of arguments  }
-
-     Pst_udf_init = ^st_udf_init;
-     st_udf_init = record
-          maybe_null : my_bool;
-          decimals : dword;
-          max_length : dword;
-          ptr : Pchar;
-          const_item : my_bool;
-       end;
-     UDF_INIT = st_udf_init;
-     PUDF_INIT = ^UDF_INIT;
-  { Constants when using compression  }
-  { standard header size  }
-
-  const
-     NET_HEADER_SIZE = 4;
-  { compression header extra size  }
-     COMP_HEADER_SIZE = 3;
-  { Prototypes to password functions  }
 
   procedure randominit(_para1:Prand_struct; seed1:dword; seed2:dword);cdecl;external External_library name 'randominit';
 
@@ -312,6 +107,9 @@ type
 
   procedure my_thread_end;cdecl;external External_library name 'my_thread_end';
 
+
+function packet_error : longint;
+
   { For net_store_length  }
   { was #define dname def_expr }
   function NULL_LENGTH : dword;
@@ -319,6 +117,7 @@ type
 
 implementation
 
+// Next function also defined in mysql4_comdyn
   { was #define dname def_expr }
   function packet_error : longint;
       { return type might be wrong }
@@ -326,6 +125,7 @@ implementation
          packet_error:= not (dword(0));
       end;
 
+// Next function also defined in mysql4_comdyn
   { was #define dname def_expr }
   function NULL_LENGTH : dword;
       begin

+ 159 - 0
packages/base/mysql/mysql4_comdyn.pp

@@ -0,0 +1,159 @@
+{
+  Contains the MySQL_com functions calls
+
+  Call InitialiseMysql4_com before using any of the calls, and call ReleaseMysql4_com
+  when finished.
+}
+unit mysql4_comdyn;
+
+{$mode objfpc}{$H+}
+
+interface
+
+uses dynlibs, sysutils;
+
+{$PACKRECORDS C}
+
+const
+  Mysqllib = 'libmysqlclient.so';
+
+{$i mysql4_comtypes.inc}
+
+  { Copyright (C) 2000 MySQL AB
+
+     This program is free software; you can redistribute it and/or modify
+     it under the terms of the GNU General Public License as published by
+     the Free Software Foundation; either version 2 of the License, or
+     (at your option) any later version.
+
+     This program is distributed in the hope that it will be useful,
+     but WITHOUT ANY WARRANTY; without even the implied warranty of
+     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+     GNU General Public License for more details.
+
+     You should have received a copy of the GNU General Public License
+     along with this program; if not, write to the Free Software
+     Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA  }
+
+
+var
+  my_net_init : function (net:PNET; vio:PVio):longint;cdecl;
+  net_end : procedure (net:PNET);cdecl;
+  net_clear : procedure (net:PNET);cdecl;
+  net_flush : function (net:PNET):longint;cdecl;
+(* Const before type ignored *)
+  my_net_write : function (net:PNET; packet:Pchar; len:dword):longint;cdecl;
+(* Const before type ignored *)
+  net_write_command : function (net:PNET; command:byte; packet:Pchar; len:dword):longint;cdecl;
+(* Const before type ignored *)
+  net_real_write : function (net:PNET; packet:Pchar; len:dword):longint;cdecl;
+  my_net_read : function (net:PNET):dword;cdecl;
+{ The following function is not meant for normal usage  }
+{
+struct sockaddr;
+int my_connect(my_socket s, const struct sockaddr  name, unsigned int namelen,
+unsigned int timeout);
+}
+  randominit : procedure (_para1:Prand_struct; seed1:dword; seed2:dword);cdecl;
+  rnd : function (_para1:Prand_struct):double;cdecl;
+(* Const before type ignored *)
+  make_scrambled_password : procedure (_to:Pchar; password:Pchar);cdecl;
+(* Const before type ignored *)
+  get_salt_from_password : procedure (res:Pdword; password:Pchar);cdecl;
+  make_password_from_salt : procedure (_to:Pchar; hash_res:Pdword);cdecl;
+(* Const before type ignored *)
+(* Const before type ignored *)
+  scramble : function (_to:Pchar; message:Pchar; password:Pchar; old_ver:my_bool):Pchar;cdecl;
+(* Const before type ignored *)
+(* Const before type ignored *)
+  check_scramble : function (_para1:Pchar; message:Pchar; salt:Pdword; old_ver:my_bool):my_bool;cdecl;
+  get_tty_password : function (opt_message:Pchar):Pchar;cdecl;
+(* Const before type ignored *)
+  hash_password : procedure (result:Pdword; password:Pchar);cdecl;
+{ Some other useful functions  }
+  my_init : procedure;cdecl;
+(* Const before type ignored *)
+(* Const before type ignored *)
+  load_defaults : procedure (conf_file:Pchar; groups:PPchar; argc:Plongint; argv:PPPchar);cdecl;
+  my_thread_init : function : my_bool;cdecl;
+  my_thread_end : procedure ;cdecl;
+
+function packet_error : longint;
+  { For net_store_length  }
+  { was #define dname def_expr }
+function NULL_LENGTH : dword;
+
+
+Procedure InitialiseMysql4_com;
+Procedure ReleaseMysql4_com;
+
+var Mysql4_comLibraryHandle : TLibHandle;
+
+implementation
+
+var RefCount : integer;
+
+Procedure InitialiseMysql4_com;
+
+begin
+  inc(RefCount);
+  if RefCount = 1 then
+    begin
+    Mysql4_comLibraryHandle := loadlibrary(Mysqllib);
+    if Mysql4_comLibraryHandle = nilhandle then
+      begin
+      RefCount := 0;
+      Raise EInOutError.Create('Can not load MySQL client. Is it installed? ('+Mysqllib+')');
+      end;
+
+    pointer(my_net_init) := GetProcedureAddress(Mysql4_comLibraryHandle,'my_net_init');
+    pointer(net_end) := GetProcedureAddress(Mysql4_comLibraryHandle,'net_end');
+    pointer(net_clear) := GetProcedureAddress(Mysql4_comLibraryHandle,'net_clear');
+    pointer(net_flush) := GetProcedureAddress(Mysql4_comLibraryHandle,'net_flush');
+    pointer(my_net_write) := GetProcedureAddress(Mysql4_comLibraryHandle,'my_net_write');
+    pointer(net_write_command) := GetProcedureAddress(Mysql4_comLibraryHandle,'net_write_command');
+    pointer(net_real_write) := GetProcedureAddress(Mysql4_comLibraryHandle,'net_real_write');
+    pointer(my_net_read) := GetProcedureAddress(Mysql4_comLibraryHandle,'my_net_read');
+    pointer(randominit) := GetProcedureAddress(Mysql4_comLibraryHandle,'randominit');
+    pointer(rnd) := GetProcedureAddress(Mysql4_comLibraryHandle,'rnd');
+    pointer(make_scrambled_password) := GetProcedureAddress(Mysql4_comLibraryHandle,'make_scrambled_password');
+    pointer(get_salt_from_password) := GetProcedureAddress(Mysql4_comLibraryHandle,'get_salt_from_password');
+    pointer(make_password_from_salt) := GetProcedureAddress(Mysql4_comLibraryHandle,'make_password_from_salt');
+    pointer(scramble) := GetProcedureAddress(Mysql4_comLibraryHandle,'scramble');
+    pointer(check_scramble) := GetProcedureAddress(Mysql4_comLibraryHandle,'check_scramble');
+    pointer(get_tty_password) := GetProcedureAddress(Mysql4_comLibraryHandle,'get_tty_password');
+    pointer(hash_password) := GetProcedureAddress(Mysql4_comLibraryHandle,'hash_password');
+    pointer(my_init) := GetProcedureAddress(Mysql4_comLibraryHandle,'my_init');
+    pointer(load_defaults) := GetProcedureAddress(Mysql4_comLibraryHandle,'load_defaults');
+    pointer(my_thread_init) := GetProcedureAddress(Mysql4_comLibraryHandle,'my_thread_init');
+    pointer(my_thread_end) := GetProcedureAddress(Mysql4_comLibraryHandle,'my_thread_end');
+    end;
+end;
+
+Procedure ReleaseMysql4_com;
+
+begin
+  if RefCount > 0 then dec(RefCount);
+  if RefCount = 0 then
+    begin
+    if not UnloadLibrary(Mysql4_comLibraryHandle) then inc(RefCount);
+    end;
+end;
+
+// Next function also defined in mysql4_com
+  { was #define dname def_expr }
+  function packet_error : longint;
+      { return type might be wrong }
+      begin
+         packet_error:= not (dword(0));
+      end;
+
+// Next function also defined in mysql4_com
+  { was #define dname def_expr }
+  function NULL_LENGTH : dword;
+      begin
+         NULL_LENGTH:=dword( not (0));
+      end;
+
+
+end.

+ 212 - 0
packages/base/mysql/mysql4_comtypes.inc

@@ -0,0 +1,212 @@
+{
+  Contains the types needed for mysql4_com
+}
+
+{ Extra manually added types }
+type
+    PVIO = Pointer;
+    My_socket = longint;
+    my_bool = byte;
+    pppchar = ^PPChar;
+    gptr = Pointer;
+
+  {
+     Common definition between mysql server & client
+   }
+  { Field/table name length  }
+
+const
+  NAME_LEN = 64;
+  HOSTNAME_LENGTH = 60;
+  USERNAME_LENGTH = 16;
+  SERVER_VERSION_LENGTH = 60;
+  LOCAL_HOST = 'localhost';
+  LOCAL_HOST_NAMEDPIPE = '.';
+
+type
+  enum_server_command = (COM_SLEEP,COM_QUIT,COM_INIT_DB,COM_QUERY,
+     COM_FIELD_LIST,COM_CREATE_DB,COM_DROP_DB,
+     COM_REFRESH,COM_SHUTDOWN,COM_STATISTICS,
+     COM_PROCESS_INFO,COM_CONNECT,COM_PROCESS_KILL,
+     COM_DEBUG,COM_PING,COM_TIME,COM_DELAYED_INSERT,
+     COM_CHANGE_USER,COM_BINLOG_DUMP,COM_TABLE_DUMP,
+     COM_CONNECT_OUT,COM_REGISTER_SLAVE);
+
+{ Field can't be NULL  }
+
+const
+   NOT_NULL_FLAG = 1;
+   PRI_KEY_FLAG = 2;
+   UNIQUE_KEY_FLAG = 4;
+   MULTIPLE_KEY_FLAG = 8;
+   BLOB_FLAG = 16;
+   UNSIGNED_FLAG = 32;
+   ZEROFILL_FLAG = 64;
+   BINARY_FLAG = 128;
+   ENUM_FLAG = 256;
+   AUTO_INCREMENT_FLAG = 512;
+   TIMESTAMP_FLAG = 1024;
+   SET_FLAG = 2048;
+   NUM_FLAG = 32768;
+   PART_KEY_FLAG = 16384;
+   GROUP_FLAG = 32768;
+   UNIQUE_FLAG = 65536;
+   REFRESH_GRANT = 1;
+   REFRESH_LOG = 2;
+   REFRESH_TABLES = 4;
+   REFRESH_HOSTS = 8;
+   REFRESH_STATUS = 16;
+   REFRESH_THREADS = 32;
+   REFRESH_SLAVE = 64;
+   REFRESH_MASTER = 128;
+   REFRESH_READ_LOCK = 16384;
+   REFRESH_FAST = 32768;
+   REFRESH_QUERY_CACHE = 65536;
+   REFRESH_QUERY_CACHE_FREE = $20000;
+   REFRESH_DES_KEY_FILE = $40000;
+   CLIENT_LONG_PASSWORD = 1;
+   CLIENT_FOUND_ROWS = 2;
+   CLIENT_LONG_FLAG = 4;
+   CLIENT_CONNECT_WITH_DB = 8;
+   CLIENT_NO_SCHEMA = 16;
+   CLIENT_COMPRESS = 32;
+   CLIENT_ODBC = 64;
+   CLIENT_LOCAL_FILES = 128;
+   CLIENT_IGNORE_SPACE = 256;
+   CLIENT_CHANGE_USER = 512;
+   CLIENT_INTERACTIVE = 1024;
+   CLIENT_SSL = 2048;
+   CLIENT_IGNORE_SIGPIPE = 4096;
+   CLIENT_TRANSACTIONS = 8192;
+   SERVER_STATUS_IN_TRANS = 1;
+   SERVER_STATUS_AUTOCOMMIT = 2;
+   MYSQL_ERRMSG_SIZE = 200;
+   NET_READ_TIMEOUT = 30;
+   NET_WRITE_TIMEOUT = 60;
+   MAX_BLOB_WIDTH = 8192;
+{
+#define NET_WAIT_TIMEOUT      (8 60 60)
+ }
+{
+struct st_vio;                                        // Only C
+typedef struct st_vio Vio;
+ }
+
+type
+  Pst_net = ^st_net;
+  st_net = record
+    vio : PVio;
+    buff : Pbyte;
+    buff_end : Pbyte;
+    write_pos : Pbyte;
+    read_pos : Pbyte;
+    fd : my_socket;
+    max_packet : dword;
+    max_packet_size : dword;
+    last_errno : dword;
+    pkt_nr : dword;
+    compress_pkt_nr : dword;
+    write_timeout : dword;
+    read_timeout : dword;
+    retry_count : dword;
+    fcntl : longint;
+    last_error : array[0..(MYSQL_ERRMSG_SIZE)-1] of char;
+    error : byte;
+    return_errno : my_bool;
+    compress : my_bool;
+    remain_in_buf : dword;
+    length : dword;
+    buf_length : dword;
+    where_b : dword;
+    return_status : Pdword;
+    reading_or_writing : byte;
+    save_char : char;
+    no_send_ok : my_bool;
+    query_cache_query : gptr;
+  end;
+  NET = st_net;
+  TNET = NET;
+  PNET = ^NET;
+
+  type
+  enum_field_types = (FIELD_TYPE_DECIMAL,FIELD_TYPE_TINY,FIELD_TYPE_SHORT,
+       FIELD_TYPE_LONG,FIELD_TYPE_FLOAT,FIELD_TYPE_DOUBLE,
+       FIELD_TYPE_NULL,FIELD_TYPE_TIMESTAMP,
+       FIELD_TYPE_LONGLONG,FIELD_TYPE_INT24,
+       FIELD_TYPE_DATE,FIELD_TYPE_TIME,FIELD_TYPE_DATETIME,
+       FIELD_TYPE_YEAR,FIELD_TYPE_NEWDATE,FIELD_TYPE_ENUM := 247,
+       FIELD_TYPE_SET := 248,FIELD_TYPE_TINY_BLOB := 249,
+       FIELD_TYPE_MEDIUM_BLOB := 250,FIELD_TYPE_LONG_BLOB := 251,
+       FIELD_TYPE_BLOB := 252,FIELD_TYPE_VAR_STRING := 253,
+       FIELD_TYPE_STRING := 254);
+
+  { For compability  }
+
+  const
+     FIELD_TYPE_CHAR = FIELD_TYPE_TINY;
+  { For compability  }
+     FIELD_TYPE_INTERVAL = FIELD_TYPE_ENUM;
+  {
+  #define net_new_transaction(net) ((net)->pkt_nr=0)
+   }
+
+    var
+       max_allowed_packet : dword;cvar;external;
+       net_buffer_length : dword;cvar;external;
+
+  type
+     Prand_struct = ^rand_struct;
+     rand_struct = record
+          seed1 : dword;
+          seed2 : dword;
+          max_value : dword;
+          max_value_dbl : double;
+       end;
+
+  { The following is for user defined functions  }
+     Item_result = (STRING_RESULT,REAL_RESULT,INT_RESULT
+       );
+  pitem_result = ^item_result;
+
+  { Number of arguments  }
+  { Pointer to item_results  }
+  { Pointer to argument  }
+  { Length of string arguments  }
+  { Set to 1 for all maybe_null args  }
+
+     Pst_udf_args = ^st_udf_args;
+     st_udf_args = record
+          arg_count : dword;
+          arg_type : PItem_result;
+          args : ^Pchar;
+          lengths : Pdword;
+          maybe_null : Pchar;
+       end;
+     UDF_ARGS = st_udf_args;
+     PUDF_ARGS = ^UDF_ARGS;
+  { This holds information about the result  }
+  { 1 if function can return NULL  }
+  { for real functions  }
+  { For string functions  }
+  { free pointer for function data  }
+  { 0 if result is independent of arguments  }
+
+     Pst_udf_init = ^st_udf_init;
+     st_udf_init = record
+          maybe_null : my_bool;
+          decimals : dword;
+          max_length : dword;
+          ptr : Pchar;
+          const_item : my_bool;
+       end;
+     UDF_INIT = st_udf_init;
+     PUDF_INIT = ^UDF_INIT;
+  { Constants when using compression  }
+  { standard header size  }
+
+  const
+     NET_HEADER_SIZE = 4;
+  { compression header extra size  }
+     COMP_HEADER_SIZE = 3;
+  { Prototypes to password functions  }
+

+ 262 - 0
packages/base/mysql/mysql4dyn.pp

@@ -0,0 +1,262 @@
+{
+  Contains the MySQL 4 functions calls
+
+  Call InitialiseMysql4 before using any of the calls, and call ReleaseMysql4
+  when finished.
+}
+unit mysql4dyn;
+
+{$mode objfpc}{$H+}
+
+interface
+
+uses dynlibs, classes, sysutils, mysql4_comdyn;
+
+
+{
+  Automatically converted by H2Pas 0.99.15 from mysql.ph
+  The following command line parameters were used:
+    -p
+    -D
+    -l
+    mysqlclient
+    mysql.ph
+}
+
+
+  { Copyright (C) 2000 MySQL AB
+
+     This program is free software; you can redistribute it and/or modify
+     it under the terms of the GNU General Public License as published by
+     the Free Software Foundation; either version 2 of the License, or
+     (at your option) any later version.
+
+     This program is distributed in the hope that it will be useful,
+     but WITHOUT ANY WARRANTY; without even the implied warranty of
+     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+     GNU General Public License for more details.
+
+     You should have received a copy of the GNU General Public License
+     along with this program; if not, write to the Free Software
+     Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA  }
+
+{$PACKRECORDS C}
+
+const
+  Mysqllib = 'libmysqlclient.so';
+
+{$i mysql4types.inc}
+
+var
+  mysql_server_init : function (argc:longint; argv:PPchar; groups:PPchar):longint;cdecl;
+  mysql_server_end : procedure;cdecl;
+  mysql_thread_init : function :my_bool;cdecl;
+  mysql_thread_end : procedure;cdecl;
+  mysql_num_rows : function (res:PMYSQL_RES):my_ulonglong;cdecl;
+  mysql_num_fields : function (res:PMYSQL_RES):dword;cdecl;
+  mysql_eof : function (res:PMYSQL_RES):my_bool;cdecl;
+  mysql_fetch_field_direct : function (res:PMYSQL_RES; fieldnr:dword):PMYSQL_FIELD;cdecl;
+  mysql_fetch_fields : function (res:PMYSQL_RES):PMYSQL_FIELD;cdecl;
+  mysql_row_tell : function (res:PMYSQL_RES):PMYSQL_ROWS;cdecl;
+  mysql_field_tell : function (res:PMYSQL_RES):dword;cdecl;
+  mysql_field_count : function (mysql:PMYSQL):dword;cdecl;
+  mysql_affected_rows : function (mysql:PMYSQL):my_ulonglong;cdecl;
+  mysql_insert_id : function (mysql:PMYSQL):my_ulonglong;cdecl;
+  mysql_errno : function (mysql:PMYSQL):dword;cdecl;
+  mysql_error : function (mysql:PMYSQL):Pchar;cdecl;
+  mysql_info : function (mysql:PMYSQL):Pchar;cdecl;
+  mysql_thread_id : function (mysql:PMYSQL):dword;cdecl;
+  mysql_character_set_name : function (mysql:PMYSQL):Pchar;cdecl;
+  mysql_init : function (mysql:PMYSQL):PMYSQL;cdecl;
+  mysql_ssl_set : function (mysql:PMYSQL; key:Pchar; cert:Pchar; ca:Pchar; capath:Pchar;cipher:Pchar):longint;cdecl;
+  mysql_ssl_clear : function (mysql:PMYSQL):longint;cdecl;
+  mysql_change_user : function (mysql:PMYSQL; user:Pchar; passwd:Pchar; db:Pchar):my_bool;cdecl;
+  mysql_real_connect : function (mysql:PMYSQL; host:Pchar; user:Pchar; passwd:Pchar; db:Pchar;port:dword; unix_socket:Pchar; clientflag:dword):PMYSQL;cdecl;
+  mysql_close : procedure (sock:PMYSQL);cdecl;
+  mysql_select_db : function (mysql:PMYSQL; db:Pchar):longint;cdecl;
+  mysql_query : function (mysql:PMYSQL; q:Pchar):longint;cdecl;
+  mysql_send_query : function (mysql:PMYSQL; q:Pchar; length:dword):longint;cdecl;
+  mysql_read_query_result : function (mysql:PMYSQL):longint;cdecl;
+  mysql_real_query : function (mysql:PMYSQL; q:Pchar; length:dword):longint;cdecl;
+  mysql_master_query : function (mysql:PMYSQL; q:Pchar; length:dword):longint;cdecl;
+  mysql_master_send_query : function (mysql:PMYSQL; q:Pchar; length:dword):longint;cdecl;
+  mysql_slave_query : function (mysql:PMYSQL; q:Pchar; length:dword):longint;cdecl;
+  mysql_slave_send_query : function (mysql:PMYSQL; q:Pchar; length:dword):longint;cdecl;
+  mysql_enable_rpl_parse : procedure (mysql:PMYSQL);cdecl;
+  mysql_disable_rpl_parse : procedure (mysql:PMYSQL);cdecl;
+  mysql_rpl_parse_enabled : function (mysql:PMYSQL):longint;cdecl;
+  mysql_enable_reads_from_master : procedure (mysql:PMYSQL);cdecl;
+  mysql_disable_reads_from_master : procedure (mysql:PMYSQL);cdecl;
+  mysql_reads_from_master_enabled : function (mysql:PMYSQL):longint;cdecl;
+(* error
+enum mysql_rpl_type      mysql_rpl_query_type(const char* q, int len);
+in declaration at line 291 *)
+  mysql_rpl_probe : function (mysql:PMYSQL):longint;cdecl;
+  mysql_set_master : function (mysql:PMYSQL; host:Pchar; port:dword; user:Pchar; passwd:Pchar):longint;cdecl;
+  mysql_add_slave : function (mysql:PMYSQL; host:Pchar; port:dword; user:Pchar; passwd:Pchar):longint;cdecl;
+  mysql_shutdown : function (mysql:PMYSQL):longint;cdecl;
+  mysql_dump_debug_info : function (mysql:PMYSQL):longint;cdecl;
+  mysql_refresh : function (mysql:PMYSQL; refresh_options:dword):longint;cdecl;
+  mysql_kill : function (mysql:PMYSQL; pid:dword):longint;cdecl;
+  mysql_ping : function (mysql:PMYSQL):longint;cdecl;
+  mysql_stat : function (mysql:PMYSQL):Pchar;cdecl;
+  mysql_get_server_info : function (mysql:PMYSQL):Pchar;cdecl;
+  mysql_get_client_info : function:Pchar; cdecl;
+  mysql_get_host_info : function (mysql:PMYSQL):Pchar;cdecl;
+  mysql_get_proto_info : function (mysql:PMYSQL):dword;cdecl;
+  mysql_list_dbs : function (mysql:PMYSQL; wild:Pchar):PMYSQL_RES;cdecl;
+  mysql_list_tables : function (mysql:PMYSQL; wild:Pchar):PMYSQL_RES;cdecl;
+  mysql_list_fields : function (mysql:PMYSQL; table:Pchar; wild:Pchar):PMYSQL_RES;cdecl;
+  mysql_list_processes : function (mysql:PMYSQL):PMYSQL_RES;cdecl;
+  mysql_store_result : function (mysql:PMYSQL):PMYSQL_RES;cdecl;
+  mysql_use_result : function (mysql:PMYSQL):PMYSQL_RES;cdecl;
+  mysql_options : function (mysql:PMYSQL; option:mysql_option; arg:Pchar):longint;cdecl;
+  mysql_free_result : procedure (result:PMYSQL_RES);cdecl;
+  mysql_data_seek : procedure (result:PMYSQL_RES; offset:my_ulonglong);cdecl;
+  mysql_row_seek : function (result:PMYSQL_RES; _para2:MYSQL_ROW_OFFSET):MYSQL_ROW_OFFSET;cdecl;
+  mysql_field_seek : function (result:PMYSQL_RES; offset:MYSQL_FIELD_OFFSET):MYSQL_FIELD_OFFSET;cdecl;
+  mysql_fetch_row : function (result:PMYSQL_RES):MYSQL_ROW;cdecl;
+  mysql_fetch_lengths : function (result:PMYSQL_RES):Pdword;cdecl;
+  mysql_fetch_field : function (result:PMYSQL_RES):PMYSQL_FIELD;cdecl;
+  mysql_escape_string : function (_to:Pchar; from:Pchar; from_length:dword):dword;cdecl;
+  mysql_real_escape_string : function (mysql:PMYSQL; _to:Pchar; from:Pchar; length:dword):dword;cdecl;
+  mysql_debug : procedure (debug:Pchar);cdecl;
+  mysql_odbc_escape_string : function (mysql:PMYSQL; _to:Pchar; to_length:dword; from:Pchar; from_length:dword;param:pointer; extend_buffer: TExdendBuffer):Pchar;cdecl;
+  myodbc_remove_escape : procedure (mysql:PMYSQL; name:Pchar);cdecl;
+  mysql_thread_safe : function :dword;cdecl;
+  mysql_manager_init : function (con:PMYSQL_MANAGER):PMYSQL_MANAGER;cdecl;
+  mysql_manager_connect : function (con:PMYSQL_MANAGER; host:Pchar; user:Pchar; passwd:Pchar; port:dword):PMYSQL_MANAGER;cdecl;
+  mysql_manager_close : procedure (con:PMYSQL_MANAGER);cdecl;
+  mysql_manager_command : function (con:PMYSQL_MANAGER; cmd:Pchar; cmd_len:longint):longint;cdecl;
+  mysql_manager_fetch_line : function (con:PMYSQL_MANAGER; res_buf:Pchar; res_buf_size:longint):longint;cdecl;
+  simple_command : function (mysql:PMYSQL; command:enum_server_command; arg:Pchar; length:dword; skipp_check:my_bool):longint;cdecl;
+  net_safe_read : function (mysql:PMYSQL):dword;cdecl;
+
+
+function IS_PRI_KEY(n : longint) : Boolean;
+function IS_NOT_NULL(n : longint) :  Boolean;
+function IS_BLOB(n : longint) : boolean;
+function MYSQL_COUNT_ERROR : longint;
+function mysql_reload(mysql : pmysql) : longint;
+
+
+Procedure InitialiseMysql4;
+Procedure ReleaseMysql4;
+
+var Mysql4LibraryHandle : TLibHandle;
+
+implementation
+
+var RefCount : integer;
+
+Procedure InitialiseMysql4;
+
+begin
+  inc(RefCount);
+  if RefCount = 1 then
+    begin
+    Mysql4LibraryHandle := loadlibrary(Mysqllib);
+    if Mysql4LibraryHandle = nilhandle then
+      begin
+      RefCount := 0;
+      Raise EInOutError.Create('Can not load MySQL client. Is it installed? ('+Mysqllib+')');
+      end;
+    pointer(mysql_server_init) := GetProcedureAddress(Mysql4LibraryHandle,'mysql_server_init');
+    pointer(mysql_server_end) := GetProcedureAddress(Mysql4LibraryHandle,'mysql_server_end');
+    pointer(mysql_thread_init) := GetProcedureAddress(Mysql4LibraryHandle,'mysql_thread_init');
+    pointer(mysql_thread_end) := GetProcedureAddress(Mysql4LibraryHandle,'mysql_thread_end');
+    pointer(mysql_num_rows) := GetProcedureAddress(Mysql4LibraryHandle,'mysql_num_rows');
+    pointer(mysql_num_fields) := GetProcedureAddress(Mysql4LibraryHandle,'mysql_num_fields');
+    pointer(mysql_eof) := GetProcedureAddress(Mysql4LibraryHandle,'mysql_eof');
+    pointer(mysql_fetch_field_direct) := GetProcedureAddress(Mysql4LibraryHandle,'mysql_fetch_field_direct');
+    pointer(mysql_fetch_fields) := GetProcedureAddress(Mysql4LibraryHandle,'mysql_fetch_fields');
+    pointer(mysql_row_tell) := GetProcedureAddress(Mysql4LibraryHandle,'mysql_row_tell');
+    pointer(mysql_field_tell) := GetProcedureAddress(Mysql4LibraryHandle,'mysql_field_tell');
+    pointer(mysql_field_count) := GetProcedureAddress(Mysql4LibraryHandle,'mysql_field_count');
+    pointer(mysql_affected_rows) := GetProcedureAddress(Mysql4LibraryHandle,'mysql_affected_rows');
+    pointer(mysql_insert_id) := GetProcedureAddress(Mysql4LibraryHandle,'mysql_insert_id');
+    pointer(mysql_errno) := GetProcedureAddress(Mysql4LibraryHandle,'mysql_errno');
+    pointer(mysql_error) := GetProcedureAddress(Mysql4LibraryHandle,'mysql_error');
+    pointer(mysql_info) := GetProcedureAddress(Mysql4LibraryHandle,'mysql_info');
+    pointer(mysql_thread_id) := GetProcedureAddress(Mysql4LibraryHandle,'mysql_thread_id');
+    pointer(mysql_character_set_name) := GetProcedureAddress(Mysql4LibraryHandle,'mysql_character_set_name');
+    pointer(mysql_init) := GetProcedureAddress(Mysql4LibraryHandle,'mysql_init');
+    pointer(mysql_ssl_set) := GetProcedureAddress(Mysql4LibraryHandle,'mysql_ssl_set');
+    pointer(mysql_ssl_clear) := GetProcedureAddress(Mysql4LibraryHandle,'mysql_ssl_clear');
+    pointer(mysql_change_user) := GetProcedureAddress(Mysql4LibraryHandle,'mysql_change_user');
+    pointer(mysql_real_connect) := GetProcedureAddress(Mysql4LibraryHandle,'mysql_real_connect');
+    pointer(mysql_close) := GetProcedureAddress(Mysql4LibraryHandle,'mysql_close');
+    pointer(mysql_select_db) := GetProcedureAddress(Mysql4LibraryHandle,'mysql_select_db');
+    pointer(mysql_query) := GetProcedureAddress(Mysql4LibraryHandle,'mysql_query');
+    pointer(mysql_send_query) := GetProcedureAddress(Mysql4LibraryHandle,'mysql_send_query');
+    pointer(mysql_read_query_result) := GetProcedureAddress(Mysql4LibraryHandle,'mysql_read_query_result');
+    pointer(mysql_real_query) := GetProcedureAddress(Mysql4LibraryHandle,'mysql_real_query');
+    pointer(mysql_master_query) := GetProcedureAddress(Mysql4LibraryHandle,'mysql_master_query');
+    pointer(mysql_master_send_query) := GetProcedureAddress(Mysql4LibraryHandle,'mysql_master_send_query');
+    pointer(mysql_slave_query) := GetProcedureAddress(Mysql4LibraryHandle,'mysql_slave_query');
+    pointer(mysql_slave_send_query) := GetProcedureAddress(Mysql4LibraryHandle,'mysql_slave_send_query');
+    pointer(mysql_enable_rpl_parse) := GetProcedureAddress(Mysql4LibraryHandle,'mysql_enable_rpl_parse');
+    pointer(mysql_disable_rpl_parse) := GetProcedureAddress(Mysql4LibraryHandle,'mysql_disable_rpl_parse');
+    pointer(mysql_rpl_parse_enabled) := GetProcedureAddress(Mysql4LibraryHandle,'mysql_rpl_parse_enabled');
+    pointer(mysql_enable_reads_from_master) := GetProcedureAddress(Mysql4LibraryHandle,'mysql_enable_reads_from_master');
+    pointer(mysql_disable_reads_from_master) := GetProcedureAddress(Mysql4LibraryHandle,'mysql_disable_reads_from_master');
+    pointer(mysql_reads_from_master_enabled) := GetProcedureAddress(Mysql4LibraryHandle,'mysql_reads_from_master_enabled');
+    pointer(mysql_rpl_probe) := GetProcedureAddress(Mysql4LibraryHandle,'mysql_rpl_probe');
+    pointer(mysql_set_master) := GetProcedureAddress(Mysql4LibraryHandle,'mysql_set_master');
+    pointer(mysql_add_slave) := GetProcedureAddress(Mysql4LibraryHandle,'mysql_add_slave');
+    pointer(mysql_shutdown) := GetProcedureAddress(Mysql4LibraryHandle,'mysql_shutdown');
+    pointer(mysql_dump_debug_info) := GetProcedureAddress(Mysql4LibraryHandle,'mysql_dump_debug_info');
+    pointer(mysql_refresh) := GetProcedureAddress(Mysql4LibraryHandle,'mysql_refresh');
+    pointer(mysql_kill) := GetProcedureAddress(Mysql4LibraryHandle,'mysql_kill');
+    pointer(mysql_ping) := GetProcedureAddress(Mysql4LibraryHandle,'mysql_ping');
+    pointer(mysql_stat) := GetProcedureAddress(Mysql4LibraryHandle,'mysql_stat');
+    pointer(mysql_get_server_info) := GetProcedureAddress(Mysql4LibraryHandle,'mysql_get_server_info');
+    pointer(mysql_get_client_info) := GetProcedureAddress(Mysql4LibraryHandle,'mysql_get_client_info');
+    pointer(mysql_get_host_info) := GetProcedureAddress(Mysql4LibraryHandle,'mysql_get_host_info');
+    pointer(mysql_get_proto_info) := GetProcedureAddress(Mysql4LibraryHandle,'mysql_get_proto_info');
+    pointer(mysql_list_dbs) := GetProcedureAddress(Mysql4LibraryHandle,'mysql_list_dbs');
+    pointer(mysql_list_tables) := GetProcedureAddress(Mysql4LibraryHandle,'mysql_list_tables');
+    pointer(mysql_list_fields) := GetProcedureAddress(Mysql4LibraryHandle,'mysql_list_fields');
+    pointer(mysql_list_processes) := GetProcedureAddress(Mysql4LibraryHandle,'mysql_list_processes');
+    pointer(mysql_store_result) := GetProcedureAddress(Mysql4LibraryHandle,'mysql_store_result');
+    pointer(mysql_use_result) := GetProcedureAddress(Mysql4LibraryHandle,'mysql_use_result');
+    pointer(mysql_options) := GetProcedureAddress(Mysql4LibraryHandle,'mysql_options');
+    pointer(mysql_free_result) := GetProcedureAddress(Mysql4LibraryHandle,'mysql_free_result');
+    pointer(mysql_data_seek) := GetProcedureAddress(Mysql4LibraryHandle,'mysql_data_seek');
+    pointer(mysql_row_seek) := GetProcedureAddress(Mysql4LibraryHandle,'mysql_row_seek');
+    pointer(mysql_field_seek) := GetProcedureAddress(Mysql4LibraryHandle,'mysql_field_seek');
+    pointer(mysql_fetch_row) := GetProcedureAddress(Mysql4LibraryHandle,'mysql_fetch_row');
+    pointer(mysql_fetch_lengths) := GetProcedureAddress(Mysql4LibraryHandle,'mysql_fetch_lengths');
+    pointer(mysql_fetch_field) := GetProcedureAddress(Mysql4LibraryHandle,'mysql_fetch_field');
+    pointer(mysql_escape_string) := GetProcedureAddress(Mysql4LibraryHandle,'mysql_escape_string');
+    pointer(mysql_real_escape_string) := GetProcedureAddress(Mysql4LibraryHandle,'mysql_real_escape_string');
+    pointer(mysql_debug) := GetProcedureAddress(Mysql4LibraryHandle,'mysql_debug');
+    pointer(mysql_odbc_escape_string) := GetProcedureAddress(Mysql4LibraryHandle,'mysql_odbc_escape_string');
+    pointer(myodbc_remove_escape) := GetProcedureAddress(Mysql4LibraryHandle,'myodbc_remove_escape');
+    pointer(mysql_thread_safe) := GetProcedureAddress(Mysql4LibraryHandle,'mysql_thread_safe');
+    pointer(mysql_manager_init) := GetProcedureAddress(Mysql4LibraryHandle,'mysql_manager_init');
+    pointer(mysql_manager_connect) := GetProcedureAddress(Mysql4LibraryHandle,'mysql_manager_connect');
+    pointer(mysql_manager_close) := GetProcedureAddress(Mysql4LibraryHandle,'mysql_manager_close');
+    pointer(mysql_manager_command) := GetProcedureAddress(Mysql4LibraryHandle,'mysql_manager_command');
+    pointer(mysql_manager_fetch_line) := GetProcedureAddress(Mysql4LibraryHandle,'mysql_manager_fetch_line');
+    pointer(simple_command) := GetProcedureAddress(Mysql4LibraryHandle,'simple_command');
+    pointer(net_safe_read) := GetProcedureAddress(Mysql4LibraryHandle,'net_safe_read');
+
+    InitialiseMysql4_com;
+    end;
+end;
+
+Procedure ReleaseMysql4;
+
+begin
+  if RefCount > 0 then dec(RefCount);
+  if RefCount = 0 then
+    begin
+    if not UnloadLibrary(Mysql4LibraryHandle) then inc(RefCount);
+    ReleaseMysql4_com;
+    end;
+end;
+
+{$i mysql4impl.inc}
+
+end.

+ 235 - 0
packages/base/mysql/mysql4types.inc

@@ -0,0 +1,235 @@
+{
+  Contains the types needed for use with MySQL v4.0
+}
+
+type
+
+  Pmy_bool = ^my_bool;
+  my_bool = char;
+
+  Pgptr = ^gptr;
+  gptr = char;
+
+  Pmy_socket = ^my_socket;
+  my_socket = longint;
+
+var
+  mysql_port : dword;cvar;external;
+  mysql_unix_port : Pchar;cvar;external;
+
+type
+  Pst_mysql_field = ^st_mysql_field;
+  st_mysql_field = record
+       name : Pchar;
+       table : Pchar;
+       org_table : Pchar;
+       db : Pchar;
+       def : Pchar;
+       length : dword;
+       max_length : dword;
+       flags : dword;
+       decimals : dword;
+       ftype : enum_field_types;
+    end;
+  MYSQL_FIELD = st_mysql_field;
+  TMYSQL_FIELD = MYSQL_FIELD;
+  PMYSQL_FIELD = ^MYSQL_FIELD;
+
+type
+  MYSQL_ROW = ppchar;
+  PMYSQL_ROW = ^MYSQL_ROW;
+  TMYSQL_ROW = MYSQL_ROW;
+
+  PMYSQL_FIELD_OFFSET = ^MYSQL_FIELD_OFFSET;
+  MYSQL_FIELD_OFFSET = dword;
+
+  Pmy_ulonglong = ^my_ulonglong;
+  my_ulonglong = qword;
+
+type
+  Pst_mysql_rows = ^st_mysql_rows;
+  st_mysql_rows = record
+     next : Pst_mysql_rows;
+     data : MYSQL_ROW;
+  end;
+  MYSQL_ROWS = st_mysql_rows;
+  TMYSQL_ROWS = MYSQL_ROWS;
+  PMYSQL_ROWS = ^MYSQL_ROWS;
+
+  MYSQL_ROW_OFFSET = MYSQL_ROWS;
+  PMYSQL_ROW_OFFSET = ^MYSQL_ROW_OFFSET;
+
+  Pst_used_mem = ^st_used_mem;
+  st_used_mem = record
+    next : Pst_used_mem;
+    left : dword;
+    size : dword;
+  end;
+
+  USED_MEM  = st_used_mem;
+  TUSED_MEM = USED_MEM;
+  PUSED_MEM = ^USED_MEM;
+
+  Pst_mem_root = ^st_mem_root;
+  st_mem_root = record
+       free : PUSED_MEM;
+       used : PUSED_MEM;
+       pre_alloc : PUSED_MEM;
+       min_malloc : dword;
+       block_size : dword;
+       block_num : dword;
+       first_block_usage : dword;
+       error_handler : procedure ;cdecl;
+    end;
+  MEM_ROOT = st_mem_root;
+  TMEM_ROOT = MEM_ROOT;
+  PMEM_ROOT = ^MEM_ROOT;
+
+  Pst_mysql_data = ^st_mysql_data;
+  st_mysql_data = record
+       rows : my_ulonglong;
+       fields : dword;
+       data : PMYSQL_ROWS;
+       alloc : MEM_ROOT;
+    end;
+  MYSQL_DATA = st_mysql_data;
+  TMYSQL_DATA = MYSQL_DATA;
+  PMYSQL_DATA = ^MYSQL_DATA;
+
+  Pst_mysql_options = ^st_mysql_options;
+  st_mysql_options = record
+       connect_timeout : dword;
+       client_flag : dword;
+       port : dword;
+       host : Pchar;
+       init_command : Pchar;
+       user : Pchar;
+       password : Pchar;
+       unix_socket : Pchar;
+       db : Pchar;
+       my_cnf_file : Pchar;
+       my_cnf_group : Pchar;
+       charset_dir : Pchar;
+       charset_name : Pchar;
+       ssl_key : Pchar;
+       ssl_cert : Pchar;
+       ssl_ca : Pchar;
+       ssl_capath : Pchar;
+       ssl_cipher : Pchar;
+       max_allowed_packet : Cardinal;
+       use_ssl : my_bool;
+       compress : my_bool;
+       named_pipe : my_bool;
+       rpl_probe : my_bool;
+       rpl_parse : my_bool;
+       no_master_reads : my_bool;
+    end;
+  TMYSQL_OPTIONS = st_mysql_options;
+  PTMYSQL_OPTIONS = ^TMYSQL_OPTIONS;
+
+  mysql_option = (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_status = (MYSQL_STATUS_READY,MYSQL_STATUS_GET_RESULT,
+    MYSQL_STATUS_USE_RESULT);
+
+  mysql_rpl_type = (MYSQL_RPL_MASTER,MYSQL_RPL_SLAVE,MYSQL_RPL_ADMIN );
+
+  Pst_mysql = ^st_mysql;
+  st_mysql = record
+       net : NET;
+       connector_fd : gptr;
+       host : Pchar;
+       user : Pchar;
+       passwd : Pchar;
+       unix_socket : Pchar;
+       server_version : Pchar;
+       host_info : Pchar;
+       info : Pchar;
+       db : Pchar;
+       charset : Pointer;  //!! Was Pcharset_info_st;
+       fields : PMYSQL_FIELD;
+       field_alloc : MEM_ROOT;
+       affected_rows : my_ulonglong;
+       insert_id : my_ulonglong;
+       extra_info : my_ulonglong;
+       thread_id : dword;
+       packet_length : dword;
+       port : dword;
+       client_flag : dword;
+       server_capabilities : dword;
+       protocol_version : dword;
+       field_count : dword;
+       server_status : dword;
+       server_language : dword;
+       options : st_mysql_options;
+       status : mysql_status;
+       free_me : my_bool;
+       reconnect : my_bool;
+       scramble_buff : array[0..8] of char;
+       rpl_pivot : my_bool;
+       master : Pst_mysql;
+       next_slave : Pst_mysql;
+       last_used_slave : Pst_mysql;
+       last_used_con : Pst_mysql;
+    end;
+  TMYSQL = st_mysql;
+  PMYSQL = ^TMYSQL;
+
+  Pst_mysql_res = ^st_mysql_res;
+  st_mysql_res = record
+       row_count : my_ulonglong;
+       fields : PMYSQL_FIELD;
+       data : PMYSQL_DATA;
+       data_cursor : PMYSQL_ROWS;
+       lengths : Pdword;
+       handle : PMYSQL;
+       field_alloc : MEM_ROOT;
+       field_count : dword;
+       current_field : dword;
+       row : MYSQL_ROW;
+       current_row : MYSQL_ROW;
+       eof : my_bool;
+    end;
+  MYSQL_RES = st_mysql_res;
+  TMYSQL_RES = MYSQL_RES;
+  PMYSQL_RES = ^MYSQL_RES;
+
+const
+  MAX_MYSQL_MANAGER_ERR = 256;
+  MAX_MYSQL_MANAGER_MSG = 256;
+  MANAGER_OK = 200;
+  MANAGER_INFO = 250;
+  MANAGER_ACCESS = 401;
+  MANAGER_CLIENT_ERR = 450;
+  MANAGER_INTERNAL_ERR = 500;
+
+type
+
+  Pst_mysql_manager = ^st_mysql_manager;
+  st_mysql_manager = record
+       net : NET;
+       host : Pchar;
+       user : Pchar;
+       passwd : Pchar;
+       port : dword;
+       free_me : my_bool;
+       eof : my_bool;
+       cmd_status : longint;
+       last_errno : longint;
+       net_buf : Pchar;
+       net_buf_pos : Pchar;
+       net_data_end : Pchar;
+       net_buf_size : longint;
+       last_error : array[0..(MAX_MYSQL_MANAGER_ERR)-1] of char;
+    end;
+  MYSQL_MANAGER = st_mysql_manager;
+  PMYSQL_MANAGER = ^MYSQL_MANAGER;
+
+Type
+  TExdendBuffer = function (_para1:pointer; _to:Pchar; length:Pdword):Pchar;
+
+

+ 1 - 1
packages/base/postgres/Makefile

@@ -1,5 +1,5 @@
 #
-# Don't edit, this file is generated by FPCMake Version 1.9.8 [2005/01/11]
+# Don't edit, this file is generated by FPCMake Version 1.9.8 [2005/01/10]
 #
 default: all
 MAKEFILETARGETS=i386-linux i386-go32v2 i386-win32 i386-os2 i386-freebsd i386-beos i386-netbsd i386-sunos i386-qnx i386-netware i386-openbsd i386-wdosx i386-emx i386-watcom i386-netwlibc m68k-linux m68k-freebsd m68k-netbsd m68k-amiga m68k-atari m68k-openbsd m68k-palmos powerpc-linux powerpc-netbsd powerpc-macos powerpc-darwin powerpc-morphos sparc-linux sparc-netbsd sparc-sunos x86_64-linux x86_64-freebsd arm-linux

+ 1 - 1
packages/base/postgres/Makefile.fpc

@@ -7,7 +7,7 @@ name=postgres
 version=1.9.7
 
 [target]
-units=dllist postgres postgres3
+units=dllist dllistdyn postgres postgres3 postgres3dyn
 examples=testpg1 testpg2
 
 [require]

+ 6 - 34
packages/base/postgres/dllist.pp

@@ -4,37 +4,7 @@ interface
 
 {$linklib pq}
 
-{ Pointers to basic pascal types, inserted by h2pas conversion program.}
-Type
-  PLongint  = ^Longint;
-  PByte     = ^Byte;
-  PWord     = ^Word;
-  PINteger  = ^Integer;
-  PCardinal = ^Cardinal;
-  PReal     = ^Real;
-  PDouble   = ^Double;
-
-{ next element }
-{ previous element }
-{ value of the element }
-{ what list this element is in }
-
-type
-   { Pointer types }
-   PDllist= ^TDllist;
-   PDlelem= ^TDlelem;
-
-   TDlelem = record
-        dle_next : PDlelem;
-        dle_prev : PDlElem;
-        dle_val : pointer;
-        dle_list : PDllist;
-     end;
-
-   TDllist = record
-        dll_head : PDlelem;
-        dll_tail : PDlelem;
-     end;
+{$i dllisttypes.inc}
 
 function  DLNewList:PDllist;cdecl; external;
 procedure DLFreeList(_para1:PDllist);cdecl; external;
@@ -55,8 +25,7 @@ Function  DLE_VAL(elem : PDlelem) : pointer;
 
 implementation
 
-
-
+// This function is also defined in DllistDyn!
 Function DLE_VAL(elem : PDlelem) : pointer;
 begin
   DLE_VAL:=elem^.dle_val
@@ -64,7 +33,10 @@ end;
 
 end.
   $Log$
-  Revision 1.3  2004-11-21 16:33:55  peter
+  Revision 1.4  2005-01-24 10:58:26  michael
+  + Dynamic library implementation by Joost van der Sluis
+
+  Revision 1.3  2004/11/21 16:33:55  peter
     * external fixes
 
   Revision 1.2  2002/09/07 15:42:53  peter

+ 95 - 0
packages/base/postgres/dllistdyn.pp

@@ -0,0 +1,95 @@
+{
+  Call InitialiseDllist before using any of the calls, and call ReleaseDllist
+  when finished.
+}
+
+unit DllistDyn;
+
+{$mode objfpc}{$H+}
+
+interface
+
+uses
+  dynlibs, SysUtils;
+
+{$PACKRECORDS C}
+
+const
+  pqlib = 'libpq.so';
+
+{$i dllisttypes.inc}
+
+var
+  DLNewList : function : PDllist;cdecl;
+  DLFreeList : procedure (_para1:PDllist);cdecl;
+  DLNewElem : function (val : pointer) :PDlelem;cdecl;
+  DLFreeElem : procedure (_para1:PDlelem);cdecl;
+  DLGetHead : function (_para1:PDllist):PDlelem;cdecl;
+  DLGetTail : function (_para1:PDllist):PDlelem;cdecl;
+  DLRemTail : function (l:PDllist):PDlelem;cdecl;
+  DLGetPred : function (_para1:PDlelem):PDlelem;cdecl;
+  DLGetSucc : function (_para1:PDlelem):PDlelem;cdecl;
+  DLRemove : procedure (_para1:PDlelem);cdecl;
+  DLAddHead : procedure (list:PDllist; node:PDlelem);cdecl;
+  DLAddTail : procedure (list:PDllist; node:PDlelem);cdecl;
+  DLRemHead : function (list:PDllist):PDlelem;cdecl;
+
+{ Macro translated }
+Function  DLE_VAL(elem : PDlelem) : pointer;
+
+Procedure InitialiseDllist;
+Procedure ReleaseDllist;
+
+var DllistLibraryHandle : TLibHandle;
+
+implementation
+
+var RefCount : integer;
+
+Procedure InitialiseDllist;
+
+begin
+  inc(RefCount);
+  if RefCount = 1 then
+    begin
+    DllistLibraryHandle := loadlibrary(pqlib);
+    if DllistLibraryHandle = nilhandle then
+      begin
+      RefCount := 0;
+      Raise EInOutError.Create('Can not load PosgreSQL client. Is it installed? ('+pqlib+')');
+      end;
+      
+    pointer(DLNewList) := GetProcedureAddress(DllistLibraryHandle,'DLNewList');
+    pointer(DLFreeList) := GetProcedureAddress(DllistLibraryHandle,'DLFreeList');
+    pointer( DLNewElem) := GetProcedureAddress(DllistLibraryHandle,' DLNewElem');
+    pointer(DLFreeElem) := GetProcedureAddress(DllistLibraryHandle,'DLFreeElem');
+    pointer( DLGetHead) := GetProcedureAddress(DllistLibraryHandle,' DLGetHead');
+    pointer( DLGetTail) := GetProcedureAddress(DllistLibraryHandle,' DLGetTail');
+    pointer( DLRemTail) := GetProcedureAddress(DllistLibraryHandle,' DLRemTail');
+    pointer( DLGetPred) := GetProcedureAddress(DllistLibraryHandle,' DLGetPred');
+    pointer( DLGetSucc) := GetProcedureAddress(DllistLibraryHandle,' DLGetSucc');
+    pointer(DLRemove) := GetProcedureAddress(DllistLibraryHandle,'DLRemove');
+    pointer(DLAddHead) := GetProcedureAddress(DllistLibraryHandle,'DLAddHead');
+    pointer(DLAddTail) := GetProcedureAddress(DllistLibraryHandle,'DLAddTail');
+    pointer( DLRemHead) := GetProcedureAddress(DllistLibraryHandle,' DLRemHead');
+    end;
+end;
+
+Procedure ReleaseDllist;
+
+begin
+  if RefCount > 0 then dec(RefCount);
+  if RefCount = 0 then
+    begin
+    if not UnloadLibrary(DllistLibraryHandle) then inc(RefCount);
+    end;
+end;
+
+// This function is also defined in Dllist!
+Function DLE_VAL(elem : PDlelem) : pointer;
+begin
+  DLE_VAL:=elem^.dle_val
+end;
+
+
+end.

+ 32 - 0
packages/base/postgres/dllisttypes.inc

@@ -0,0 +1,32 @@
+{
+  Contains the types needed for dllist
+}
+
+{ Pointers to basic pascal types, inserted by h2pas conversion program.}
+Type
+  PCardinal = ^Cardinal;
+  PReal     = ^Real;
+  PDouble   = ^Double;
+
+{ next element }
+{ previous element }
+{ value of the element }
+{ what list this element is in }
+
+type
+   { Pointer types }
+   PDllist= ^TDllist;
+   PDlelem= ^TDlelem;
+
+   TDlelem = record
+        dle_next : PDlelem;
+        dle_prev : PDlElem;
+        dle_val : pointer;
+        dle_list : PDllist;
+     end;
+
+   TDllist = record
+        dll_head : PDlelem;
+        dll_tail : PDlelem;
+     end;
+

+ 4 - 177
packages/base/postgres/postgres3.pp

@@ -16,185 +16,9 @@ uses dllist;
 const
    External_library='pq';
 
-Type
-  PLongint  = ^Longint;
-  PSmallInt = ^SmallInt;
-  PByte     = ^Byte;
-  PWord     = ^Word;
-  PDWord    = ^DWord;
-  PDouble   = ^Double;
-  size_t    = sizeint;
-  psize_t   = ^size_t;
-  TFILE     = Longint;
-  PFIle     = ^TFILE;
-  POid      = ^Oid;
-  Oid       = dword;
+{$i postgres3types.inc}
 
-const
-   ERROR_MSG_LENGTH = 4096;
-   CMDSTATUS_LEN = 40;
-
-Type
-  TSockAddr = Array [1..112] of byte;
-  TPGresAttDesc = record
-       name : Pchar;
-       adtid : Oid;
-       adtsize : integer;
-    end;
-  PPGresAttDesc= ^TPGresAttDesc;
-  PPPGresAttDesc= ^PPGresAttDesc;
-  TPGresAttValue = record
-       len : longint;
-       value : Pchar;
-    end;
-  PPGresAttValue= ^TPGresAttValue;
-  PPPGresAttValue= ^PPGresAttValue;
-
-  PExecStatusType = ^TExecStatusType;
-  TExecStatusType = (PGRES_EMPTY_QUERY := 0,PGRES_COMMAND_OK,
-       PGRES_TUPLES_OK,PGRES_COPY_OUT,PGRES_COPY_IN,
-       PGRES_BAD_RESPONSE,PGRES_NONFATAL_ERROR,
-       PGRES_FATAL_ERROR);
-
-  
-  TPGlobjfuncs = record
-        fn_lo_open   : Oid;
-        fn_lo_close  : Oid;
-        fn_lo_creat  : Oid;
-        fn_lo_unlink : Oid;
-        fn_lo_lseek  : Oid;
-        fn_lo_tell   : Oid;
-        fn_lo_read   : Oid;
-        fn_lo_write  : Oid;
-    end;
-  PPGlobjfuncs= ^TPGlobjfuncs;
-
-  PConnStatusType = ^TConnStatusType;
-  TConnStatusType = (CONNECTION_OK,CONNECTION_BAD,CONNECTION_STARTED,
-       CONNECTION_MADE,CONNECTION_AWAITING_RESPONSE,
-       CONNECTION_AUTH_OK,CONNECTION_SETENV,
-       CONNECTION_SSL_STARTUP,CONNECTION_NEEDED);
-
-   TPGconn = record
-        pghost : Pchar;
-        pgtty : Pchar;
-        pgport : Pchar;
-        pgoptions : Pchar;
-        dbName : Pchar;
-        status : TConnStatusType;
-        errorMessage : array[0..(ERROR_MSG_LENGTH)-1] of char;
-        Pfin : PFILE;
-        Pfout : PFILE;
-        Pfdebug : PFILE;
-        sock : longint;
-        laddr : TSockAddr;
-        raddr : TSockAddr;
-        salt : array[0..(2)-1] of char;
-        asyncNotifyWaiting : longint;
-        notifyList : PDllist;
-        pguser : Pchar;
-        pgpass : Pchar;
-        lobjfuncs : PPGlobjfuncs;
-    end;
-  PPGconn= ^TPGconn;
-   
-  TPGresult = record
-        ntups : longint;
-        numAttributes : longint;
-        attDescs : PPGresAttDesc;
-        tuples : PPPGresAttValue;
-        tupArrSize : longint;
-        resultStatus : TExecStatusType;
-        cmdStatus : array[0..(CMDSTATUS_LEN)-1] of char;
-        binary : longint;
-        conn : PPGconn;
-    end;
-  PPGresult= ^TPGresult;
-
-
-
-
-
-  PPostgresPollingStatusType = ^PostgresPollingStatusType;
-  PostgresPollingStatusType = (PGRES_POLLING_FAILED := 0,PGRES_POLLING_READING,
-       PGRES_POLLING_WRITING,PGRES_POLLING_OK,
-       PGRES_POLLING_ACTIVE);
-
-
-  PPGTransactionStatusType = ^PGTransactionStatusType;
-  PGTransactionStatusType = (PQTRANS_IDLE,PQTRANS_ACTIVE,PQTRANS_INTRANS,
-       PQTRANS_INERROR,PQTRANS_UNKNOWN);
-
-  PPGVerbosity = ^PGVerbosity;
-  PGVerbosity = (PQERRORS_TERSE,PQERRORS_DEFAULT,PQERRORS_VERBOSE);
-
-  PpgNotify = ^pgNotify;
-  pgNotify = record
-          relname : Pchar;
-          be_pid : longint;
-          extra : Pchar;
-    end;
-
-{ Function types for notice-handling callbacks  }
-  PQnoticeReceiver = procedure (arg:pointer; res:PPGresult);cdecl;
-  PQnoticeProcessor = procedure (arg:pointer; message:Pchar);cdecl;
-{ Print options for PQprint()  }
-  Ppqbool = ^pqbool;
-  pqbool = char;
-
-  P_PQprintOpt = ^_PQprintOpt;
-  _PQprintOpt = record
-          header : pqbool;
-          align : pqbool;
-          standard : pqbool;
-          html3 : pqbool;
-          expanded : pqbool;
-          pager : pqbool;
-          fieldSep : Pchar;
-          tableOpt : Pchar;
-          caption : Pchar;
-          fieldName : ^Pchar;
-    end;
-  PQprintOpt = _PQprintOpt;
-  PPQprintOpt = ^PQprintOpt;
 
-  { ----------------
-   * Structure for the conninfo parameter definitions returned by PQconndefaults
-   *
-   * All fields except "val" point at static strings which must not be altered.
-   * "val" is either NULL or a malloc'd current-value string.  PQconninfoFree()
-   * will release both the val strings and the PQconninfoOption array itself.
-   * ----------------
-    }
-
-     P_PQconninfoOption = ^_PQconninfoOption;
-     _PQconninfoOption = record
-          keyword : Pchar;
-          envvar : Pchar;
-          compiled : Pchar;
-          val : Pchar;
-          _label : Pchar;
-          dispchar : Pchar;
-          dispsize : longint;
-       end;
-     PQconninfoOption = _PQconninfoOption;
-     PPQconninfoOption = ^PQconninfoOption;
-  { ----------------
-   * PQArgBlock -- structure for PQfn() arguments
-   * ----------------
-    }
-  { can't use void (dec compiler barfs)	  }
-
-     PPQArgBlock = ^PQArgBlock;
-     PQArgBlock = record
-          len : longint;
-          isint : longint;
-          u : record
-              case longint of
-                 0 : ( ptr : Plongint );
-                 1 : ( integer : longint );
-              end;
-       end;
   { ----------------
    * Exported functions of libpq
    * ----------------
@@ -478,6 +302,9 @@ implementation
   { was #define dname(params) para_def_expr }
   { argument types are unknown }
   { return type might be wrong }   
+
+// This function is also defined in postgres3dyn!
+
   function PQsetdb(M_PGHOST,M_PGPORT,M_PGOPT,M_PGTTY,M_DBNAME : pchar) : ppgconn;
     begin
        PQsetdb:=PQsetdbLogin(M_PGHOST,M_PGPORT,M_PGOPT,M_PGTTY,M_DBNAME,'','');

+ 387 - 0
packages/base/postgres/postgres3dyn.pp

@@ -0,0 +1,387 @@
+{
+  Contains the Postgres protocol 3 functions calls
+
+  Call InitialisePostgres3 before using any of the calls, and call ReleasePostgres3
+  when finished.
+}
+
+unit postgres3dyn;
+
+{$mode objfpc}{$H+}
+
+interface
+
+uses
+  dynlibs, SysUtils, dllistdyn;
+  
+{$PACKRECORDS C}
+
+const
+  pqlib = 'libpq.so';
+
+{$i postgres3types.inc}
+
+var
+{ ----------------
+* Exported functions of libpq
+* ----------------
+}
+{ ===	in fe-connect.c ===  }
+{ make a new client connection to the backend  }
+{ Asynchronous (non-blocking)  }
+(* Const before type ignored *)
+  PQconnectStart : function (conninfo:Pchar):PPGconn;cdecl;
+  PQconnectPoll : function (conn:PPGconn):PostgresPollingStatusType;cdecl;
+{ Synchronous (blocking)  }
+(* Const before type ignored *)
+  PQconnectdb : function (conninfo:Pchar):PPGconn;cdecl;
+  PQsetdbLogin : function (pghost:Pchar; pgport:Pchar; pgoptions:Pchar; pgtty:Pchar; dbName:Pchar;login:Pchar; pwd:Pchar):PPGconn;cdecl;
+{ was #define dname(params) para_def_expr }
+{ argument types are unknown }
+{ return type might be wrong }
+{ close the current connection and free the PGconn data structure  }
+  PQfinish : procedure (conn:PPGconn);cdecl;
+{ get info about connection options known to PQconnectdb  }
+  PQconndefaults : function : PPQconninfoOption;cdecl;
+{ free the data structure returned by PQconndefaults()  }
+  PQconninfoFree : procedure (connOptions:PPQconninfoOption);cdecl;
+{
+* close the current connection and restablish a new one with the same
+* parameters
+}
+{ Asynchronous (non-blocking)  }
+  PQresetStart : function (conn:PPGconn):longint;cdecl;
+  PQresetPoll : function (conn:PPGconn):PostgresPollingStatusType;cdecl;
+{ Synchronous (blocking)  }
+  PQreset : procedure (conn:PPGconn);cdecl;
+{ issue a cancel request  }
+  PQrequestCancel : function (conn:PPGconn):longint;cdecl;
+{ Accessor functions for PGconn objects  }
+  PQdb : function (conn:PPGconn):Pchar;cdecl;
+  PQuser : function (conn:PPGconn):Pchar;cdecl;
+  PQpass : function (conn:PPGconn):Pchar;cdecl;
+  PQhost : function (conn:PPGconn):Pchar;cdecl;
+  PQport : function (conn:PPGconn):Pchar;cdecl;
+  PQtty : function (conn:PPGconn):Pchar;cdecl;
+  PQoptions : function (conn:PPGconn):Pchar;cdecl;
+  PQstatus : function (conn:PPGconn):TConnStatusType;cdecl;
+  PQtransactionStatus : function (conn:PPGconn):PGTransactionStatusType;cdecl;
+  PQparameterStatus : function (conn:PPGconn; paramName:Pchar):Pchar;cdecl;
+  PQprotocolVersion : function (conn:PPGconn):longint;cdecl;
+  PQerrorMessage : function (conn:PPGconn):Pchar;cdecl;
+  PQsocket : function (conn:PPGconn):longint;cdecl;
+  PQbackendPID : function (conn:PPGconn):longint;cdecl;
+  PQclientEncoding : function (conn:PPGconn):longint;cdecl;
+  PQsetClientEncoding : function (conn:PPGconn; encoding:Pchar):longint;cdecl;
+{$ifdef USE_SSL}
+{ Get the SSL structure associated with a connection  }
+  PQgetssl : function (conn:PPGconn):PSSL;cdecl;
+{$endif}
+{ Set verbosity for PQerrorMessage and PQresultErrorMessage  }
+  PQsetErrorVerbosity : function (conn:PPGconn; verbosity:PGVerbosity):PGVerbosity;cdecl;
+{ Enable/disable tracing  }
+  PQtrace : procedure (conn:PPGconn; debug_port:PFILE);cdecl;
+  PQuntrace : procedure (conn:PPGconn);cdecl;
+{ Override default notice handling routines  }
+  PQsetNoticeReceiver : function (conn:PPGconn; proc:PQnoticeReceiver; arg:pointer):PQnoticeReceiver;cdecl;
+  PQsetNoticeProcessor : function (conn:PPGconn; proc:PQnoticeProcessor; arg:pointer):PQnoticeProcessor;cdecl;
+{ === in fe-exec.c ===  }
+{ Simple synchronous query  }
+  PQexec : function (conn:PPGconn; query:Pchar):PPGresult;cdecl;
+  PQexecParams : function (conn:PPGconn; command:Pchar; nParams:longint; paramTypes:POid; paramValues:PPchar;paramLengths:Plongint; paramFormats:Plongint; resultFormat:longint):PPGresult;cdecl;
+  PQexecPrepared : function (conn:PPGconn; stmtName:Pchar; nParams:longint; paramValues:PPchar; paramLengths:Plongint;paramFormats:Plongint; resultFormat:longint):PPGresult;cdecl;
+{ Interface for multiple-result or asynchronous queries  }
+  PQsendQuery : function (conn:PPGconn; query:Pchar):longint;cdecl;
+  PQsendQueryParams : function (conn:PPGconn; command:Pchar; nParams:longint; paramTypes:POid; paramValues:PPchar;paramLengths:Plongint; paramFormats:Plongint; resultFormat:longint):longint;cdecl;
+  PQsendQueryPrepared : function (conn:PPGconn; stmtName:Pchar; nParams:longint; paramValues:PPchar; paramLengths:Plongint;paramFormats:Plongint; resultFormat:longint):longint;cdecl;
+  PQgetResult : function (conn:PPGconn):PPGresult;cdecl;
+{ Routines for managing an asynchronous query  }
+  PQisBusy : function (conn:PPGconn):longint;cdecl;
+  PQconsumeInput : function (conn:PPGconn):longint;cdecl;
+{ LISTEN/NOTIFY support  }
+  PQnotifies : function (conn:PPGconn):PPGnotify;cdecl;
+{ Routines for copy in/out  }
+  PQputCopyData : function (conn:PPGconn; buffer:Pchar; nbytes:longint):longint;cdecl;
+  PQputCopyEnd : function (conn:PPGconn; errormsg:Pchar):longint;cdecl;
+  PQgetCopyData : function (conn:PPGconn; buffer:PPchar; async:longint):longint;cdecl;
+{ Deprecated routines for copy in/out  }
+  PQgetline : function (conn:PPGconn; _string:Pchar; length:longint):longint;cdecl;
+  PQputline : function (conn:PPGconn; _string:Pchar):longint;cdecl;
+  PQgetlineAsync : function (conn:PPGconn; buffer:Pchar; bufsize:longint):longint;cdecl;
+  PQputnbytes : function (conn:PPGconn; buffer:Pchar; nbytes:longint):longint;cdecl;
+  PQendcopy : function (conn:PPGconn):longint;cdecl;
+{ Set blocking/nonblocking connection to the backend  }
+  PQsetnonblocking : function (conn:PPGconn; arg:longint):longint;cdecl;
+  PQisnonblocking : function (conn:PPGconn):longint;cdecl;
+{ Force the write buffer to be written (or at least try)  }
+  PQflush : function (conn:PPGconn):longint;cdecl;
+{
+* "Fast path" interface --- not really recommended for application
+* use
+}
+  PQfn : function (conn:PPGconn; fnid:longint; result_buf:Plongint; result_len:Plongint; result_is_int:longint;args:PPQArgBlock; nargs:longint):PPGresult;cdecl;
+{ Accessor functions for PGresult objects  }
+  PQresultStatus : function (res:PPGresult):TExecStatusType;cdecl;
+  PQresStatus : function (status:TExecStatusType):Pchar;cdecl;
+  PQresultErrorMessage : function (res:PPGresult):Pchar;cdecl;
+  PQresultErrorField : function (res:PPGresult; fieldcode:longint):Pchar;cdecl;
+  PQntuples : function (res:PPGresult):longint;cdecl;
+  PQnfields : function (res:PPGresult):longint;cdecl;
+  PQbinaryTuples : function (res:PPGresult):longint;cdecl;
+  PQfname : function (res:PPGresult; field_num:longint):Pchar;cdecl;
+  PQfnumber : function (res:PPGresult; field_name:Pchar):longint;cdecl;
+  PQftable : function (res:PPGresult; field_num:longint):Oid;cdecl;
+  PQftablecol : function (res:PPGresult; field_num:longint):longint;cdecl;
+  PQfformat : function (res:PPGresult; field_num:longint):longint;cdecl;
+  PQftype : function (res:PPGresult; field_num:longint):Oid;cdecl;
+  PQfsize : function (res:PPGresult; field_num:longint):longint;cdecl;
+  PQfmod : function (res:PPGresult; field_num:longint):longint;cdecl;
+  PQcmdStatus : function (res:PPGresult):Pchar;cdecl;
+  PQoidStatus : function (res:PPGresult):Pchar;cdecl;
+{ old and ugly  }
+  PQoidValue : function (res:PPGresult):Oid;cdecl;
+{ new and improved  }
+  PQcmdTuples : function (res:PPGresult):Pchar;cdecl;
+  PQgetvalue : function (res:PPGresult; tup_num:longint; field_num:longint):Pchar;cdecl;
+  PQgetlength : function (res:PPGresult; tup_num:longint; field_num:longint):longint;cdecl;
+  PQgetisnull : function (res:PPGresult; tup_num:longint; field_num:longint):longint;cdecl;
+{ Delete a PGresult  }
+  PQclear : procedure (res:PPGresult);cdecl;
+{ For freeing other alloc'd results, such as PGnotify structs  }
+  PQfreemem : procedure (ptr:pointer);cdecl;
+{ Exists for backward compatibility.  bjm 2003-03-24  }
+{ was #define dname(params) para_def_expr }
+{ argument types are unknown }
+{ return type might be wrong }
+//  function PQfreeNotify(ptr : longint) : longint;
+{
+* Make an empty PGresult with given status (some apps find this
+* useful). If conn is not NULL and status indicates an error, the
+* conn's errorMessage is copied.
+}
+  PQmakeEmptyPGresult : function (conn:PPGconn; status:TExecStatusType):PPGresult;cdecl;
+{ Quoting strings before inclusion in queries.  }
+  PQescapeString : function (till:Pchar; from:Pchar; length:size_t):size_t;cdecl;
+  PQescapeBytea : function (bintext:Pbyte; binlen:size_t; bytealen:Psize_t):Pbyte;cdecl;
+  PQunescapeBytea : function (strtext:Pbyte; retbuflen:Psize_t):Pbyte;cdecl;
+{ === in fe-print.c ===  }
+{ output stream  }
+  PQprint : procedure (fout:PFILE; res:PPGresult; ps:PPQprintOpt);cdecl;
+{ option structure  }
+{
+* really old printing routines
+}
+{ where to send the output  }
+{ pad the fields with spaces  }
+{ field separator  }
+{ display headers?  }
+  PQdisplayTuples : procedure (res:PPGresult; fp:PFILE; fillAlign:longint; fieldSep:Pchar; printHeader:longint;quiet:longint);cdecl;
+(* Const before type ignored *)
+{ output stream  }
+{ print attribute names  }
+{ delimiter bars  }
+  PQprintTuples : procedure (res:PPGresult; fout:PFILE; printAttName:longint; terseOutput:longint; width:longint);cdecl;
+{ width of column, if 0, use variable
+* width  }
+{ === in fe-lobj.c ===  }
+{ Large-object access routines  }
+  lo_open : function (conn:PPGconn; lobjId:Oid; mode:longint):longint;cdecl;
+  lo_close : function (conn:PPGconn; fd:longint):longint;cdecl;
+  lo_read : function (conn:PPGconn; fd:longint; buf:Pchar; len:size_t):longint;cdecl;
+  lo_write : function (conn:PPGconn; fd:longint; buf:Pchar; len:size_t):longint;cdecl;
+  lo_lseek : function (conn:PPGconn; fd:longint; offset:longint; whence:longint):longint;cdecl;
+  lo_creat : function (conn:PPGconn; mode:longint):Oid;cdecl;
+  lo_tell : function (conn:PPGconn; fd:longint):longint;cdecl;
+  lo_unlink : function (conn:PPGconn; lobjId:Oid):longint;cdecl;
+  lo_import : function (conn:PPGconn; filename:Pchar):Oid;cdecl;
+  lo_export : function (conn:PPGconn; lobjId:Oid; filename:Pchar):longint;cdecl;
+{ === in fe-misc.c ===  }
+{ Determine length of multibyte encoded char at *s  }
+  PQmblen : function (s:Pbyte; encoding:longint):longint;cdecl;
+{ Get encoding id from environment variable PGCLIENTENCODING  }
+  PQenv2encoding: function :longint;cdecl;
+
+{  PQexec : function (conn:PPGconn; query:Pchar):PPGresult;cdecl;
+  PQsetdbLogin : function (pghost:Pchar; pgport:Pchar; pgoptions:Pchar; pgtty:Pchar; dbName:Pchar;
+             login:Pchar; pwd:Pchar):PPGconn;cdecl;
+  PQerrorMessage : function (conn:PPGconn):Pchar;cdecl;
+  PQclear : procedure (res:PPGresult);cdecl;
+  PQresultStatus : function (res:PPGresult):TExecStatusType;cdecl;
+  PQconnectdb : function (conninfo:Pchar):PPGconn;cdecl;
+  PQfinish : procedure (conn:PPGconn);cdecl;
+  PQstatus : function (conn:PPGconn):TConnStatusType;cdecl;
+  PQgetvalue : function (res:PPGresult; tup_num:longint; field_num:longint):Pchar;cdecl;
+  PQfmod : function (res:PPGresult; field_num:longint):longint;cdecl;
+  PQgetlength : function (res:PPGresult; tup_num:longint; field_num:longint):longint;cdecl;
+  PQntuples : function(res:PPGresult):longint;cdecl;
+  PQnfields : function(res:PPGresult):longint;cdecl;
+  PQgetisnull : function(res:PPGresult; tup_num:longint; field_num:longint):longint;cdecl;
+  PQfsize : function (res:PPGresult; field_num:longint):longint;cdecl;
+  PQftype : function (res:PPGresult; field_num:longint):Oid;cdecl;
+  PQfname : function (res:PPGresult; field_num:longint):Pchar;cdecl;
+}
+Procedure InitialisePostgres3;
+Procedure ReleasePostgres3;
+
+var Postgres3LibraryHandle : TLibHandle;
+
+implementation
+
+var RefCount : integer;
+
+Procedure InitialisePostgres3;
+
+begin
+  inc(RefCount);
+  if RefCount = 1 then
+    begin
+    Postgres3LibraryHandle := loadlibrary(pqlib);
+    if Postgres3LibraryHandle = nilhandle then
+      begin
+      RefCount := 0;
+      Raise EInOutError.Create('Can not load PosgreSQL client. Is it installed? ('+pqlib+')');
+      end;
+      
+      pointer(PQconnectStart) := GetProcedureAddress(Postgres3LibraryHandle,'PQconnectStart');
+      pointer(PQconnectPoll) := GetProcedureAddress(Postgres3LibraryHandle,'PQconnectPoll');
+      pointer(PQconnectdb) := GetProcedureAddress(Postgres3LibraryHandle,'PQconnectdb');
+      pointer(PQsetdbLogin) := GetProcedureAddress(Postgres3LibraryHandle,'PQsetdbLogin');
+      pointer(PQfinish) := GetProcedureAddress(Postgres3LibraryHandle,'PQfinish');
+      pointer(PQconndefaults) := GetProcedureAddress(Postgres3LibraryHandle,'PQconndefaults');
+      pointer(PQconninfoFree) := GetProcedureAddress(Postgres3LibraryHandle,'PQconninfoFree');
+      pointer(PQresetStart) := GetProcedureAddress(Postgres3LibraryHandle,'PQresetStart');
+      pointer(PQresetPoll) := GetProcedureAddress(Postgres3LibraryHandle,'PQresetPoll');
+      pointer(PQreset) := GetProcedureAddress(Postgres3LibraryHandle,'PQreset');
+      pointer(PQrequestCancel) := GetProcedureAddress(Postgres3LibraryHandle,'PQrequestCancel');
+      pointer(PQdb) := GetProcedureAddress(Postgres3LibraryHandle,'PQdb');
+      pointer(PQuser) := GetProcedureAddress(Postgres3LibraryHandle,'PQuser');
+      pointer(PQpass) := GetProcedureAddress(Postgres3LibraryHandle,'PQpass');
+      pointer(PQhost) := GetProcedureAddress(Postgres3LibraryHandle,'PQhost');
+      pointer(PQport) := GetProcedureAddress(Postgres3LibraryHandle,'PQport');
+      pointer(PQtty) := GetProcedureAddress(Postgres3LibraryHandle,'PQtty');
+      pointer(PQoptions) := GetProcedureAddress(Postgres3LibraryHandle,'PQoptions');
+      pointer(PQstatus) := GetProcedureAddress(Postgres3LibraryHandle,'PQstatus');
+      pointer(PQtransactionStatus) := GetProcedureAddress(Postgres3LibraryHandle,'PQtransactionStatus');
+      pointer(PQparameterStatus) := GetProcedureAddress(Postgres3LibraryHandle,'PQparameterStatus');
+      pointer(PQprotocolVersion) := GetProcedureAddress(Postgres3LibraryHandle,'PQprotocolVersion');
+      pointer(PQerrorMessage) := GetProcedureAddress(Postgres3LibraryHandle,'PQerrorMessage');
+      pointer(PQsocket) := GetProcedureAddress(Postgres3LibraryHandle,'PQsocket');
+      pointer(PQbackendPID) := GetProcedureAddress(Postgres3LibraryHandle,'PQbackendPID');
+      pointer(PQclientEncoding) := GetProcedureAddress(Postgres3LibraryHandle,'PQclientEncoding');
+      pointer(PQsetClientEncoding) := GetProcedureAddress(Postgres3LibraryHandle,'PQsetClientEncoding');
+{$ifdef USE_SSL}
+      pointer(PQgetssl) := GetProcedureAddress(Postgres3LibraryHandle,'PQgetssl');
+{$endif}
+      pointer(PQsetErrorVerbosity) := GetProcedureAddress(Postgres3LibraryHandle,'PQsetErrorVerbosity');
+      pointer(PQtrace) := GetProcedureAddress(Postgres3LibraryHandle,'PQtrace');
+      pointer(PQuntrace) := GetProcedureAddress(Postgres3LibraryHandle,'PQuntrace');
+      pointer(PQsetNoticeReceiver) := GetProcedureAddress(Postgres3LibraryHandle,'PQsetNoticeReceiver');
+      pointer(PQsetNoticeProcessor) := GetProcedureAddress(Postgres3LibraryHandle,'PQsetNoticeProcessor');
+      pointer(PQexec) := GetProcedureAddress(Postgres3LibraryHandle,'PQexec');
+      pointer(PQexecParams) := GetProcedureAddress(Postgres3LibraryHandle,'PQexecParams');
+      pointer(PQexecPrepared) := GetProcedureAddress(Postgres3LibraryHandle,'PQexecPrepared');
+      pointer(PQsendQuery) := GetProcedureAddress(Postgres3LibraryHandle,'PQsendQuery');
+      pointer(PQsendQueryParams) := GetProcedureAddress(Postgres3LibraryHandle,'PQsendQueryParams');
+      pointer(PQsendQueryPrepared) := GetProcedureAddress(Postgres3LibraryHandle,'PQsendQueryPrepared');
+      pointer(PQgetResult) := GetProcedureAddress(Postgres3LibraryHandle,'PQgetResult');
+      pointer(PQisBusy) := GetProcedureAddress(Postgres3LibraryHandle,'PQisBusy');
+      pointer(PQconsumeInput) := GetProcedureAddress(Postgres3LibraryHandle,'PQconsumeInput');
+      pointer(PQnotifies) := GetProcedureAddress(Postgres3LibraryHandle,'PQnotifies');
+      pointer(PQputCopyData) := GetProcedureAddress(Postgres3LibraryHandle,'PQputCopyData');
+      pointer(PQputCopyEnd) := GetProcedureAddress(Postgres3LibraryHandle,'PQputCopyEnd');
+      pointer(PQgetCopyData) := GetProcedureAddress(Postgres3LibraryHandle,'PQgetCopyData');
+      pointer(PQgetline) := GetProcedureAddress(Postgres3LibraryHandle,'PQgetline');
+      pointer(PQputline) := GetProcedureAddress(Postgres3LibraryHandle,'PQputline');
+      pointer(PQgetlineAsync) := GetProcedureAddress(Postgres3LibraryHandle,'PQgetlineAsync');
+      pointer(PQputnbytes) := GetProcedureAddress(Postgres3LibraryHandle,'PQputnbytes');
+      pointer(PQendcopy) := GetProcedureAddress(Postgres3LibraryHandle,'PQendcopy');
+      pointer(PQsetnonblocking) := GetProcedureAddress(Postgres3LibraryHandle,'PQsetnonblocking');
+      pointer(PQisnonblocking) := GetProcedureAddress(Postgres3LibraryHandle,'PQisnonblocking');
+      pointer(PQflush) := GetProcedureAddress(Postgres3LibraryHandle,'PQflush');
+      pointer(PQfn) := GetProcedureAddress(Postgres3LibraryHandle,'PQfn');
+      pointer(PQresultStatus) := GetProcedureAddress(Postgres3LibraryHandle,'PQresultStatus');
+      pointer(PQresStatus) := GetProcedureAddress(Postgres3LibraryHandle,'PQresStatus');
+      pointer(PQresultErrorMessage) := GetProcedureAddress(Postgres3LibraryHandle,'PQresultErrorMessage');
+      pointer(PQresultErrorField) := GetProcedureAddress(Postgres3LibraryHandle,'PQresultErrorField');
+      pointer(PQntuples) := GetProcedureAddress(Postgres3LibraryHandle,'PQntuples');
+      pointer(PQnfields) := GetProcedureAddress(Postgres3LibraryHandle,'PQnfields');
+      pointer(PQbinaryTuples) := GetProcedureAddress(Postgres3LibraryHandle,'PQbinaryTuples');
+      pointer(PQfname) := GetProcedureAddress(Postgres3LibraryHandle,'PQfname');
+      pointer(PQfnumber) := GetProcedureAddress(Postgres3LibraryHandle,'PQfnumber');
+      pointer(PQftable) := GetProcedureAddress(Postgres3LibraryHandle,'PQftable');
+      pointer(PQftablecol) := GetProcedureAddress(Postgres3LibraryHandle,'PQftablecol');
+      pointer(PQfformat) := GetProcedureAddress(Postgres3LibraryHandle,'PQfformat');
+      pointer(PQftype) := GetProcedureAddress(Postgres3LibraryHandle,'PQftype');
+      pointer(PQfsize) := GetProcedureAddress(Postgres3LibraryHandle,'PQfsize');
+      pointer(PQfmod) := GetProcedureAddress(Postgres3LibraryHandle,'PQfmod');
+      pointer(PQcmdStatus) := GetProcedureAddress(Postgres3LibraryHandle,'PQcmdStatus');
+      pointer(PQoidStatus) := GetProcedureAddress(Postgres3LibraryHandle,'PQoidStatus');
+      pointer(PQoidValue) := GetProcedureAddress(Postgres3LibraryHandle,'PQoidValue');
+      pointer(PQcmdTuples) := GetProcedureAddress(Postgres3LibraryHandle,'PQcmdTuples');
+      pointer(PQgetvalue) := GetProcedureAddress(Postgres3LibraryHandle,'PQgetvalue');
+      pointer(PQgetlength) := GetProcedureAddress(Postgres3LibraryHandle,'PQgetlength');
+      pointer(PQgetisnull) := GetProcedureAddress(Postgres3LibraryHandle,'PQgetisnull');
+      pointer(PQclear) := GetProcedureAddress(Postgres3LibraryHandle,'PQclear');
+      pointer(PQfreemem) := GetProcedureAddress(Postgres3LibraryHandle,'PQfreemem');
+      pointer(PQmakeEmptyPGresult) := GetProcedureAddress(Postgres3LibraryHandle,'PQmakeEmptyPGresult');
+      pointer(PQescapeString) := GetProcedureAddress(Postgres3LibraryHandle,'PQescapeString');
+      pointer(PQescapeBytea) := GetProcedureAddress(Postgres3LibraryHandle,'PQescapeBytea');
+      pointer(PQunescapeBytea) := GetProcedureAddress(Postgres3LibraryHandle,'PQunescapeBytea');
+      pointer(PQprint) := GetProcedureAddress(Postgres3LibraryHandle,'PQprint');
+      pointer(PQdisplayTuples) := GetProcedureAddress(Postgres3LibraryHandle,'PQdisplayTuples');
+      pointer(PQprintTuples) := GetProcedureAddress(Postgres3LibraryHandle,'PQprintTuples');
+      pointer(lo_open) := GetProcedureAddress(Postgres3LibraryHandle,'lo_open');
+      pointer(lo_close) := GetProcedureAddress(Postgres3LibraryHandle,'lo_close');
+      pointer(lo_read) := GetProcedureAddress(Postgres3LibraryHandle,'lo_read');
+      pointer(lo_write) := GetProcedureAddress(Postgres3LibraryHandle,'lo_write');
+      pointer(lo_lseek) := GetProcedureAddress(Postgres3LibraryHandle,'lo_lseek');
+      pointer(lo_creat) := GetProcedureAddress(Postgres3LibraryHandle,'lo_creat');
+      pointer(lo_tell) := GetProcedureAddress(Postgres3LibraryHandle,'lo_tell');
+      pointer(lo_unlink) := GetProcedureAddress(Postgres3LibraryHandle,'lo_unlink');
+      pointer(lo_import) := GetProcedureAddress(Postgres3LibraryHandle,'lo_import');
+      pointer(lo_export) := GetProcedureAddress(Postgres3LibraryHandle,'lo_export');
+      pointer(PQmblen) := GetProcedureAddress(Postgres3LibraryHandle,'PQmblen');
+      pointer(PQenv2encoding) := GetProcedureAddress(Postgres3LibraryHandle,'PQenv2encoding');
+      
+{    pointer(PQexec) :=	GetProcedureAddress(Postgres3LibraryHandle,'PQexec');
+    pointer(PQsetdbLogin) := GetProcedureAddress(Postgres3LibraryHandle,'PQsetdbLogin');
+    pointer(PQerrorMessage) := GetProcedureAddress(Postgres3LibraryHandle,'PQerrorMessage');
+    pointer(PQclear) := GetProcedureAddress(Postgres3LibraryHandle,'PQclear');
+    pointer(PQresultStatus) := GetProcedureAddress(Postgres3LibraryHandle,'PQresultStatus');
+    pointer(PQconnectdb) := GetProcedureAddress(Postgres3LibraryHandle,'PQconnectdb');
+    pointer(PQfinish) := GetProcedureAddress(Postgres3LibraryHandle,'PQfinish');
+    pointer(PQstatus) := GetProcedureAddress(Postgres3LibraryHandle,'PQstatus');
+    pointer(PQgetvalue) := GetProcedureAddress(Postgres3LibraryHandle,'PQgetvalue');
+    pointer(PQfmod) := GetProcedureAddress(Postgres3LibraryHandle,'PQfmod');
+    pointer(PQgetlength) := GetProcedureAddress(Postgres3LibraryHandle,'PQgetlength');
+    pointer(PQntuples) := GetProcedureAddress(Postgres3LibraryHandle,'PQnfields');
+    pointer(PQnfields) := GetProcedureAddress(Postgres3LibraryHandle,'PQnfields');
+    pointer(PQgetisnull) := GetProcedureAddress(Postgres3LibraryHandle,'PQgetisnull');
+    pointer(PQfsize) := GetProcedureAddress(Postgres3LibraryHandle,'PQfsize');
+    pointer(PQftype) := GetProcedureAddress(Postgres3LibraryHandle,'PQftype');
+    pointer(PQfname) := GetProcedureAddress(Postgres3LibraryHandle,'PQfname');}
+
+    InitialiseDllist;
+    end;
+end;
+
+Procedure ReleasePostgres3;
+
+begin
+  if RefCount > 0 then dec(RefCount);
+  if RefCount = 0 then
+    begin
+    if not UnloadLibrary(Postgres3LibraryHandle) then inc(RefCount);
+    ReleaseDllist;
+    end;
+end;
+
+// This function is also defined in postgres3!
+function PQsetdb(M_PGHOST,M_PGPORT,M_PGOPT,M_PGTTY,M_DBNAME : pchar) : ppgconn;
+begin
+   PQsetdb:=PQsetdbLogin(M_PGHOST,M_PGPORT,M_PGOPT,M_PGTTY,M_DBNAME,'','');
+end;
+
+
+end.
+

+ 178 - 0
packages/base/postgres/postgres3types.inc

@@ -0,0 +1,178 @@
+{
+  Contains the types needed for use with Postgres protocol v3
+}
+
+Type
+  size_t    = sizeint;
+  psize_t   = ^size_t;
+  TFILE     = Longint;
+  PFIle     = ^TFILE;
+  POid      = ^Oid;
+  Oid       = dword;
+
+const
+   ERROR_MSG_LENGTH = 4096;
+   CMDSTATUS_LEN = 40;
+
+Type
+  TSockAddr = Array [1..112] of byte;
+  TPGresAttDesc = record
+       name : Pchar;
+       adtid : Oid;
+       adtsize : integer;
+    end;
+  PPGresAttDesc= ^TPGresAttDesc;
+  PPPGresAttDesc= ^PPGresAttDesc;
+  TPGresAttValue = record
+       len : longint;
+       value : Pchar;
+    end;
+  PPGresAttValue= ^TPGresAttValue;
+  PPPGresAttValue= ^PPGresAttValue;
+
+  PExecStatusType = ^TExecStatusType;
+  TExecStatusType = (PGRES_EMPTY_QUERY := 0,PGRES_COMMAND_OK,
+       PGRES_TUPLES_OK,PGRES_COPY_OUT,PGRES_COPY_IN,
+       PGRES_BAD_RESPONSE,PGRES_NONFATAL_ERROR,
+       PGRES_FATAL_ERROR);
+
+
+  TPGlobjfuncs = record
+        fn_lo_open   : Oid;
+        fn_lo_close  : Oid;
+        fn_lo_creat  : Oid;
+        fn_lo_unlink : Oid;
+        fn_lo_lseek  : Oid;
+        fn_lo_tell   : Oid;
+        fn_lo_read   : Oid;
+        fn_lo_write  : Oid;
+    end;
+  PPGlobjfuncs= ^TPGlobjfuncs;
+
+  PConnStatusType = ^TConnStatusType;
+  TConnStatusType = (CONNECTION_OK,CONNECTION_BAD,CONNECTION_STARTED,
+       CONNECTION_MADE,CONNECTION_AWAITING_RESPONSE,
+       CONNECTION_AUTH_OK,CONNECTION_SETENV,
+       CONNECTION_SSL_STARTUP,CONNECTION_NEEDED);
+
+   TPGconn = record
+        pghost : Pchar;
+        pgtty : Pchar;
+        pgport : Pchar;
+        pgoptions : Pchar;
+        dbName : Pchar;
+        status : TConnStatusType;
+        errorMessage : array[0..(ERROR_MSG_LENGTH)-1] of char;
+        Pfin : PFILE;
+        Pfout : PFILE;
+        Pfdebug : PFILE;
+        sock : longint;
+        laddr : TSockAddr;
+        raddr : TSockAddr;
+        salt : array[0..(2)-1] of char;
+        asyncNotifyWaiting : longint;
+        notifyList : PDllist;
+        pguser : Pchar;
+        pgpass : Pchar;
+        lobjfuncs : PPGlobjfuncs;
+    end;
+  PPGconn= ^TPGconn;
+
+  TPGresult = record
+        ntups : longint;
+        numAttributes : longint;
+        attDescs : PPGresAttDesc;
+        tuples : PPPGresAttValue;
+        tupArrSize : longint;
+        resultStatus : TExecStatusType;
+        cmdStatus : array[0..(CMDSTATUS_LEN)-1] of char;
+        binary : longint;
+        conn : PPGconn;
+    end;
+  PPGresult= ^TPGresult;
+
+
+
+
+
+  PPostgresPollingStatusType = ^PostgresPollingStatusType;
+  PostgresPollingStatusType = (PGRES_POLLING_FAILED := 0,PGRES_POLLING_READING,
+       PGRES_POLLING_WRITING,PGRES_POLLING_OK,
+       PGRES_POLLING_ACTIVE);
+
+
+  PPGTransactionStatusType = ^PGTransactionStatusType;
+  PGTransactionStatusType = (PQTRANS_IDLE,PQTRANS_ACTIVE,PQTRANS_INTRANS,
+       PQTRANS_INERROR,PQTRANS_UNKNOWN);
+
+  PPGVerbosity = ^PGVerbosity;
+  PGVerbosity = (PQERRORS_TERSE,PQERRORS_DEFAULT,PQERRORS_VERBOSE);
+
+  PpgNotify = ^pgNotify;
+  pgNotify = record
+          relname : Pchar;
+          be_pid : longint;
+          extra : Pchar;
+    end;
+
+{ Function types for notice-handling callbacks  }
+  PQnoticeReceiver = procedure (arg:pointer; res:PPGresult);cdecl;
+  PQnoticeProcessor = procedure (arg:pointer; message:Pchar);cdecl;
+{ Print options for PQprint()  }
+  Ppqbool = ^pqbool;
+  pqbool = char;
+
+  P_PQprintOpt = ^_PQprintOpt;
+  _PQprintOpt = record
+          header : pqbool;
+          align : pqbool;
+          standard : pqbool;
+          html3 : pqbool;
+          expanded : pqbool;
+          pager : pqbool;
+          fieldSep : Pchar;
+          tableOpt : Pchar;
+          caption : Pchar;
+          fieldName : ^Pchar;
+    end;
+  PQprintOpt = _PQprintOpt;
+  PPQprintOpt = ^PQprintOpt;
+
+  { ----------------
+   * Structure for the conninfo parameter definitions returned by PQconndefaults
+   *
+   * All fields except "val" point at static strings which must not be altered.
+   * "val" is either NULL or a malloc'd current-value string.  PQconninfoFree()
+   * will release both the val strings and the PQconninfoOption array itself.
+   * ----------------
+    }
+
+     P_PQconninfoOption = ^_PQconninfoOption;
+     _PQconninfoOption = record
+          keyword : Pchar;
+          envvar : Pchar;
+          compiled : Pchar;
+          val : Pchar;
+          _label : Pchar;
+          dispchar : Pchar;
+          dispsize : longint;
+       end;
+     PQconninfoOption = _PQconninfoOption;
+     PPQconninfoOption = ^PQconninfoOption;
+  { ----------------
+   * PQArgBlock -- structure for PQfn() arguments
+   * ----------------
+    }
+  { can't use void (dec compiler barfs)	  }
+
+     PPQArgBlock = ^PQArgBlock;
+     PQArgBlock = record
+          len : longint;
+          isint : longint;
+          u : record
+              case longint of
+                 0 : ( ptr : Plongint );
+                 1 : ( integer : longint );
+              end;
+       end;
+