#ifndef __INCLUDE_MY_POSTGRES_H__ #define __INCLUDE_MY_POSTGRES_H__ 1 #include #include #include //#include "ppport.h" #include #define __PACKAGE__ "PAB3::DB::Driver::Postgres" #define CLIENT_RECONNECT 16384 #define MYCF_TRANSACTION 1 #define MYCF_AUTOCOMMIT 2 #undef DWORD #define DWORD unsigned long #undef UPTR #define UPTR void * #undef HAS_UV64 #if UVSIZE == 8 # define HAS_UV64 1 #endif #undef XLONG #undef UXLONG #if defined __unix__ # define XLONG long long # define UXLONG unsigned long long #elif defined __WIN__ # define XLONG __int64 # define UXLONG unsigned __int64 #else # define XLONG long # define UXLONG unsigned long #endif #define MY_TYPE_CON 1 #define MY_TYPE_RES 2 #define MY_TYPE_STMT 3 typedef struct st_my_res { struct st_my_res *prev, *next; struct st_my_con *con; PGresult *res; DWORD numrows; DWORD numfields; DWORD rowpos; DWORD fieldpos; struct st_my_stmt *stmt; char bound; } MY_RES; typedef struct st_my_stmt { struct st_my_stmt *prev, *next; struct st_my_con *con; char *id; DWORD param_count; char **param_values; int *param_lengths; int *param_formats; char *param_types; struct st_my_res *res; // DWORD affected_rows; } MY_STMT; typedef struct st_my_con { struct st_my_con *prev, *next; PGconn *con; DWORD tid; char *db; struct st_my_res *firstres; struct st_my_res *lastres; struct st_my_stmt *first_stmt; struct st_my_stmt *last_stmt; char *charset; DWORD charset_length; DWORD my_flags; DWORD client_flag; DWORD affected_rows; char my_error[256]; DWORD stmt_counter; } MY_CON; typedef struct st_my_cxt { MY_CON *firstcon, *lastcon; char lasterror[256]; } my_cxt_t; #define MY_CXT_KEY __PACKAGE__ "::_guts" XS_VERSION START_MY_CXT #define STR_CREATEANDCOPYN( src, dst, len ) \ if( (src) && (len) ) { \ New( 1, (dst), (len) + 1, char ); \ Copy( (src), (dst), (len) + 1, char ); \ } \ else { \ (dst) = NULL; \ } #define STR_CREATEANDCOPY( src, dst ) \ STR_CREATEANDCOPYN( (src), (dst), (src) ? strlen( (src) ) : 0 ) char *my_strcpy( char *dst, const char *src ); char *my_strcpyl( char *dst, const char *src ); char *my_strncpy( char *dst, const char *src, DWORD len ); int my_stricmp( const char *cs, const char *ct ); char *my_stristr( const char *str1, const char *str2 ); char *my_itoa( char *str, int value, int radix ); char *my_strtolower( char *a ); DWORD get_current_thread_id(); void my_cleanup( my_cxt_t *cxt ); void my_cleanup_session( my_cxt_t *cxt ); int my_get_type( my_cxt_t *cxt, UPTR *ptr ); MY_CON *my_con_add( my_cxt_t *cxt, PGconn *conn ); void my_con_cleanup( MY_CON *con ); void my_con_free( MY_CON *con ); void my_con_rem( my_cxt_t *cxt, MY_CON *con ); int my_con_exists( my_cxt_t *cxt, UPTR ptr ); MY_CON *my_con_find_by_tid( my_cxt_t *cxt, DWORD tid ); MY_CON *_my_con_verify( my_cxt_t *cxt, UPTR linkid, int error ); #define my_con_verify(cxt,linkid) _my_con_verify( (cxt), (linkid), 1 ) #define my_con_verify_noerror(cxt,linkid) _my_con_verify( (cxt), (linkid), 0 ) MY_RES *my_result_add( MY_CON *con, PGresult *pres ); void my_result_free( MY_RES *res ); void my_result_rem( MY_RES *res ); int my_result_exists( my_cxt_t *cxt, UPTR ptr ); char *my_stmt_convert( const char *sql, DWORD sqllen, DWORD *plen, DWORD *slen ); MY_STMT *my_stmt_add( MY_CON *con, char *stmtname, DWORD plen ); void my_stmt_free( MY_STMT *stmt ); void my_stmt_rem( MY_STMT *stmt ); int my_stmt_exists( my_cxt_t *cxt, UPTR ptr ); int my_stmt_or_result( my_cxt_t *cxt, UPTR ptr ); int my_stmt_or_con( my_cxt_t *cxt, UPTR *ptr ); int my_stmt_bind_param( MY_STMT *stmt, DWORD p_num, SV *val, char type ); #endif