enum { /* commands */ CMDsleep = 0x00, /* u/s internal thread state only */ CMDquit = 0x01, /* disconnect */ CMDinit_db = 0x02, /* sent for the "use" command */ CMDquery = 0x03, /* SQL query */ CMDfield_list = 0x04, /* show field info only */ CMDcreate_db = 0x05, /* create database (deprecated) */ CMDdrop_db = 0x06, /* drop database (deprecated) */ CMDrefresh = 0x07, /* close & reopen all logs, commit any open transactions */ CMDshutdown = 0x08, /* shutdown the database */ CMDstatistics = 0x09, /* server stats, returned as a single text packet */ CMDprocess_info = 0x0a, /* request process info, returned as a table */ CMDconnect = 0x0b, /* u/s internal thread state only */ CMDprocess_kill = 0x0c, /* kill process */ CMDdebug = 0x0d, CMDping = 0x0e, CMDtime = 0x0f, /* u/s internal thread state only */ CMDdelayed_insert = 0x10, /* u/s internal thread state only */ CMDchange_user = 0x11, CMDbinlog_dump = 0x12, /* master/slave database only */ CMDtable_dump = 0x13, /* master/slave database only */ CMDconnect_out = 0x14, /* master/slave database only */ CMDregister_slave = 0x15, /* master/slave database only */ CMDstmt_prepare = 0x16, CMDstmt_execute = 0x17, CMDstmt_send_long_data = 0x18, CMDstmt_close = 0x19, CMDstmt_reset = 0x1a, CMDset_option = 0x1b, CMDstmt_fetch = 0x1c }; #define MYSQL_SHUTDOWN_KILLABLE_CONNECT (unsigned char)(1 << 0) #define MYSQL_SHUTDOWN_KILLABLE_TRANS (unsigned char)(1 << 1) #define MYSQL_SHUTDOWN_KILLABLE_LOCK_TABLE (unsigned char)(1 << 2) #define MYSQL_SHUTDOWN_KILLABLE_UPDATE (unsigned char)(1 << 3) enum{ /* shutdown level */ SHUTdefault = 0, SHUTconn = 1, /* default wait for existing connections to finish */ SHUTtrans = 2, /* wait for existing trans to finish */ SHUTupdates = 8, /* wait for existing updates to finish*/ SHUTbuffers = 16, /* flush InnoDB buffers and other storage engines' buffers*/ SHUTcritbuf = 17, /* don't flush InnoDB buffers, flush other storage engines' buffers*/ KILLquery = 254, /* kill the current query */ KILLconn = 255 /* kill the connection */ }; enum{ /* capabilities negioated at session startup */ CAPlong_passwords = 1, /* long passwords */ CAPfound_rows = 2, /* Found rows */ CAPlong_flag = 4, /* long column flags */ CAPconnect_with_db = 8, /* connect with database */ CAPno_schema = 0x10, /* Don't allow database.table.column */ CAPcompression = 0x20, /* Can use compression protocol */ CAPodbc = 0x40, /* Odbc client */ CAPlocal_files = 0x80, /* Can use LOAD DATA LOCAL */ CAPignore_space = 0x100, /* Ignore spaces before '(' */ CAPprotocol_41 = 0x200, /* speaks 4.1 protocol (new flag) */ CAPinteractive = 0x400, /* interactive client */ CAPssl = 0x800, /* Switch to SSL after handshake */ CAPignore_sigpipe = 0x1000, /* ignore SIGPIPE */ CAPtransactions = 0x2000, /* knows about transactions */ CAPreserved = 0x4000, /* for v4.1.0 only (depricated) */ CAPauthentication_41 = 0x8000, /* can do 4.1 authentication */ CAPmulti_statements = 0x10000, /* supports multiple statments */ CAPmulti_results = 0x20000 /* supports multiple results */ }; enum { /* field types */ FLDdecimal = 0x00, /* double as a text string */ FLDtiny = 0x01, /* 8bit integer */ FLDshort = 0x02, /* 16 bit integer */ FLDlong = 0x03, /* 24 bit integer */ FLDfloat = 0x04, /* 32 bit integer */ FLDdouble = 0x05, /* 64 bit integer */ FLDnull = 0x06, FLDtimestamp = 0x07, /* yymmddhhmmss */ FLDlonglong = 0x08, FLDint24 = 0x09, /* 24 bit integer */ FLDdate = 0x0a, /* yy-mm-dd */ FLDtime = 0x0b, /* hh:mm:ss (hh may be hhh) */ FLDdatetime = 0x0c, /* yyyy-mm-dd hh:mm:ss */ FLDyear = 0x0d, /* yy or yyyy */ FLDnewdate = 0x0e, FLDvarchar = 0x0f, /* up to 255 char string, case insensitive, trailing whitespace stripped */ FLDbit = 0x10, FLDnewdecimal = 0xf6, /* double as a text string */ FLDenum = 0xf7, /* one of up to 2^16 values */ FLDset = 0xf8, /* any number of values from a set of up to 64 members */ FLDtiny_blob = 0xf9, /* up to 2^8 byte blob */ FLDmedium_blob = 0xfa, /* up to 2^24 byte blob */ FLDlong_blob = 0xfb, /* up to 2^32 byte blob */ FLDblob = 0xfc, FLDvar_string = 0xfd, /* text string */ FLDstring = 0xfe, /* text string */ FLDgeometry = 0xff, FLDcom_register_slave = 0x15, FLDcom_stmt_prepare = 0x16, FLDcom_stmt_execute = 0x17, FLDcom_stmt_send_long_data = 0x18, FLDcom_stmt_close = 0x19, FLDcom_stmt_reset = 0x1a, FLDcom_set_option = 0x1b, FLDcom_stmt_fetch = 0x1c }; enum { /* field flags */ FLGnot_null = 1, /* field can't be nil */ FLGpri_key = 2, /* part of a primary key */ FLGunique_key = 4, /* part of a unique key */ FLGmultiple_key = 8, /* part of a key */ FLGblob = 0x10, /* binary large object */ FLGunsigned = 0x20, /* numeric data is unsigned */ FLGzerofill = 0x40, FLGbinary = 0x80, /* data is binary (e.g. string is case significant) */ FLGenum = 0x100, FLGauto_increment = 0x200, FLGtimestamp = 0x400, FLGset = 0x800, FLGno_default = 0x1000, /* no default value */ FLGnum = 0x2000, /* numeric (for clients) */ }; enum { /* server status */ STin_trans = 1, /* in transaction */ STautocommit = 2, /* AUTO_COMMIT */ STmore = 4, /* more results */ STmore_exists = 8, /* multi query - more resultsets */ STbad_index = 16, /* no good index used */ STindex_unused = 32, /* no index used */ STcursor_exists = 64, /* cursor exists */ STlast_sent = 128, /* last row sent */ STdropped = 256, /* database dropped */ STno_esc = 512 /* no backslash escapes */ }; enum { /* first byte of reply */ Rok = 0, /* OK */ Rerr = 0xff, /* error */ Reof = 0xfe /* end of chunk */ }; enum { Nauth = 20, /* all >= v4.1 authentication strings are this long */ }; typedef struct Field Field; struct Field { Field *next; char *cat; /* catalogue */ char *db; /* database */ char *tab; /* table */ char *otab; /* table name before AS clause */ char *name; /* field name */ char *oname; /* field name before AS clause */ int lang; /* character set ID */ int size; /* size (in backing store ?) */ int type; /* data type */ int flags; /* data type modifier */ int prec; /* digits after decimal to display */ vlong def; /* default value (in table definitions only) */ int hasdef; /* is def field valid ? */ int start; /* start collumn if fixed width output */ int width; /* field width if fixed width output */ }; typedef struct Col Col; struct Col { Col *next; char *str; }; typedef struct Row Row; struct Row { Row *next; Col *cols; }; typedef struct Results Results; struct Results { Field *fields; Row *rows; int nf; /* number of fields */ int nr; /* number of rows */ }; typedef struct Pkt Pkt; struct Pkt { uchar *buf; /* base of buffer */ uchar *pos; /* current position in buffer */ uchar *end; /* one byte off the end of the buffer */ Results *results; /* results */ }; typedef struct Sess Sess; struct Sess { int proto; /* protocol version */ char *server; /* server version */ int tid; /* server's thread ID */ char *salt1; /* salt part1 for authentication */ int caps; /* server capabilities */ int lang; /* server's language */ int stat; /* server's status */ char *salt2; /* salt part1 for authentication */ int net; /* network file descriptor */ Lock lock; /* lock on network - parallel queries no possible */ int mtu; /* maximum transfer unit */ char *db; /* the current database */ }; typedef struct Dbgname Dbgname; struct Dbgname { int n; char *s; }; typedef struct Layout Layout; struct Layout { char rowsep; /* row seperator if not fixed layout */ char colsep; /* collumn seperator if not fixed layout */ int delimited; /* delimited rather than padded collums */ int headings; /* add field headings to collumns */ }; extern vlong gpartnum(Pkt *, int, int *); extern vlong gnum(Pkt *, int *); extern void gskip(Pkt *, int); extern void *gmem(Pkt *, int); extern char *gstr(Pkt *); extern char *gnstr(Pkt *); extern char *gsall(Pkt *); extern uvlong g64(Pkt *); extern uint g32(Pkt *); extern uint g24(Pkt *); extern uint g16(Pkt *); extern uint g8(Pkt *); extern uint peek8(Pkt *); extern void pnum(Pkt *, vlong, int); extern void pskip(Pkt *, int); extern void pmem(Pkt *, void *, int); extern void pstr(Pkt *, char *); extern void p64(Pkt *, uvlong); extern void p32(Pkt *, uint); extern void p24(Pkt *, uint); extern void p16(Pkt *, uint); extern void p8(Pkt *, uint); extern int remain(Pkt *p); void prbits(int, int, Dbgname *); extern void freeres(Results *); extern Sess *mysql_open(char *); extern int mysql_auth(Sess *, char *, char *, uchar *); extern int mysql_query(Sess *, char *, Results **); extern int mysql_use(Sess *, char *); extern char *mysql_stats(Sess *); extern int mysql_kill(Sess *, int id); extern int mysql_ping(Sess *); extern int mysql_ps(Sess *, Results **); extern int mysql_close(Sess *); extern void widths(Results *); extern char *fmtdata(Results *, Layout *, int); extern char *fmtfields(Results *, int); extern int Verbose; extern int Debug; extern Dbgname Cmds[]; extern Dbgname Status[]; extern Dbgname Caps[]; extern Dbgname Fields[]; extern Dbgname Flags[]; extern void xd(void *, int); extern void dumpfield(Field *); extern void dumpresults(Results *);