#ifndef TDSLIB_H #define TDSLIB_H #include #include #include #include enum TDS_REQTYPE{ TDS_REQ_NONE, TDS_REQ_LOGIN, TDS_REQ_LOGOUT, TDS_REQ_SQL, TDS_REQ_OPTIONS, TDS_REQ_CANCEL, TDS_REQ_BULK, }; struct TDS_LOGIN{ std::string user,password,host,program,server,process; std::string cur_db; // Current selected database TDS_LOGIN(){ cur_db = "master"; } }; struct TDS_SQL{ std::string sql; }; struct TDSSERV_INFO{ ARRAY_OBJ *data; unsigned ipaddr; TDSSERV_INFO(){ data = NULL; } }; struct FIELD_DEF{ std::string name; std::string org_name; std::string table; enum_field_types type; // MySQL column type int decimals; unsigned long val1; int val2,val3; bool not_null; bool binary; bool identity; FIELD_DEF(){ type = (enum_field_types)-1; val1 = val2 = val3 = 0; decimals = 0; not_null = false; identity = false; binary = false; } }; struct BULK_FIELD { unsigned char type; unsigned char decimals; bool is_char; // Is this a char field unsigned size; unsigned size2; unsigned size_min; BULK_FIELD(){ type = 0; size = 0; size2 = 0; size_min = 0; decimals = 0; is_char = false; } }; struct BULK_RECORDS { std::vector fields; std::vector > recs; }; class TDS_WRITER; #define _TLMP_tdsserv struct _F_tdsserv{ class _F_tdsserv_private *priv; void link (int fd, ARRAY_OBJ *data); ARRAY_OBJ* iter_init(unsigned &id, TDS_LOGIN &login); ARRAY_OBJ* iter_next(unsigned &id, TDS_LOGIN &login); #define _F_tdsserv_control(x) int x control(class _F_TCPSERVER_V1 *s, const std::vector &words, const char *line) virtual _F_tdsserv_control( )=0; #define _F_tdsserv_connect(x) void x connect(class _F_TCPSERVER_V1 *s, int client_fd, bool &endclient, TDSSERV_INFO &info) virtual _F_tdsserv_connect( )=0; #define _F_tdsserv_closesource(x) void x closesource(class _F_TCPSERVER_V1 *s, int fd, unsigned id, TDS_LOGIN &login, TDSSERV_INFO &info) virtual _F_tdsserv_closesource( )=0; #define _F_tdsserv_closeserver(x) void x closeserver(class _F_TCPSERVER_V1 *s, int fd, TDSSERV_INFO &info) virtual _F_tdsserv_closeserver( )=0; #define _F_tdsserv_copy(x) void x copy(class _F_TCPSERVER_V1 *s, int from_fd, int to_fd, unsigned id, TDS_LOGIN &login, const void *buf, int len, TDSSERV_INFO &info) virtual _F_tdsserv_copy( ); #define _F_tdsserv_login(x) void x login(class _F_TCPSERVER_V1 *s, int fd, unsigned id, TDS_LOGIN &login, TDSSERV_INFO &info, bool &endclient) virtual _F_tdsserv_login( ); #define _F_tdsserv_reqsql(x) void x reqsql(class _F_TCPSERVER_V1 *s, int client_fd, unsigned id, TDS_LOGIN &login, const char *sql, BULK_RECORDS &brecs, TDSSERV_INFO &info, bool &endclient) virtual _F_tdsserv_reqsql( ); #define _F_tdsserv_bulk(x) void x bulk(class _F_TCPSERVER_V1 *s, int client_fd, unsigned id, TDS_LOGIN &login, BULK_RECORDS &brecs, TDSSERV_INFO &info, bool &endclient) virtual _F_tdsserv_bulk( ); #define _F_tdsserv_options(x) void x options(class _F_TCPSERVER_V1 *s, int client_fd, unsigned id, TDS_LOGIN &login, const char *sql, TDSSERV_INFO &info, bool &endclient) virtual _F_tdsserv_options( ); #define _F_tdsserv_cancel(x) void x cancel(class _F_TCPSERVER_V1 *s, int client_fd, unsigned id, TDS_LOGIN &login, TDSSERV_INFO &info, bool &endclient) virtual _F_tdsserv_cancel( ); #define _F_tdsserv_serverres(x) void x serverres(class _F_TCPSERVER_V1 *s, int server_fd, int client_fd, unsigned id, TDS_LOGIN &login, BULK_RECORDS &brecs, TDSSERV_INFO &info, bool &endclient) virtual _F_tdsserv_serverres( ); #define _F_tdsserv_quit(x) void x quit(class _F_TCPSERVER_V1 *s) virtual _F_tdsserv_quit( ); }; struct FILE_LOG{ FILE *fsession; FILE *ferror; FILE *fsql; FILE *fdata; FILE *fspc; FILE_LOG(); ~FILE_LOG(); void closeall(); FILE *open (const char *title, const char *fname); void fflush(); }; void tdslib_debug(class DEBUG_KEY &, unsigned id, const TDS_LOGIN &login, const char *ctl, ...); int tdslib_process( const char *buf, unsigned bufLen, bool &reterror ); TDS_REQTYPE tdslib_parsereq (const char *buf, int len, unsigned id, TDS_LOGIN &login, TDS_SQL &sql, BULK_RECORDS &brecs); int tdslib_parseres(const char *buf,unsigned len,int &numrows, unsigned id, const TDS_LOGIN &login, BULK_RECORDS &brecs, FILE *datalog); void tdslib_dumphex (class DEBUG_KEY &dkey, unsigned id, const TDS_LOGIN &, int used, const char *ptb); int tdsserv(_F_tdsserv &c, const char *progname, const char *bind, const char *port, const char *unixsock, const char *user, bool daemon, const char *pidfile); void tdslib_rep_login(int fd, const TDS_LOGIN &login, bool ok); void tdslib_rep_use(TDS_WRITER *w, const TDS_LOGIN &login); void tdslib_rep_action(TDS_WRITER *w, const TDS_LOGIN &login, int nbrows); void tdslib_rep_action(int fd, const TDS_LOGIN &login, int nbrows); void tdslib_rep_other(TDS_WRITER *w, const TDS_LOGIN &login); void tdslib_rep_cancel(TDS_WRITER *w, const TDS_LOGIN &login); void tdslib_err_query(TDS_WRITER *w, const TDS_LOGIN &login, const char *msg, int errcode); void tdslib_send_msg(TDS_WRITER *w, const TDS_LOGIN &login, const char *msg); TDS_WRITER *tdslib_getwriter(int fd); void tdslib_freewriter(TDS_WRITER *w); class SQL_OPTS; void tdslib_rep_query_format(TDS_WRITER *w, const TDS_LOGIN &login,std::vector &defs, const SQL_OPTS &opts); void tdslib_rep_query_row (class TDS_WRITER *w, const TDS_LOGIN &login,std::vector &defs, const char *vals[],const SQL_OPTS &opts); void tdslib_rep_query_end (TDS_WRITER *w, unsigned long numrows, const class SQL_OPTS &opts); void tdslib_rep_bulk_format(TDS_WRITER *w, const TDS_LOGIN &login,std::vector &defs, const SQL_OPTS &opts, std::vector &bfields); void tdslib_rep_bulk_end (TDS_WRITER *w, unsigned long numrows, const class SQL_OPTS &opts); long long tdslib_getnow (); void tdslib_logerr ( FILE *flogerr, unsigned id, TDS_LOGIN &login, const char *msg, const char *sql, const char *sybsql); void tdslib_logsql ( FILE *flogsql, unsigned id, TDS_LOGIN &login, long long start, long numrows, const char *sql); void tdslib_setusertypes (const std::vector &usertypes); void tdslib_loadusertypes(const char *fusertypes); #endif