176 lines
6.4 KiB
C
176 lines
6.4 KiB
C
|
|
/***************************************************************
|
|
* Run Time Access
|
|
* Copyright (C) 2003 Robert W Smith (bsmith@linuxtoys.org)
|
|
*
|
|
* This program is distributed under the terms of the GNU LGPL.
|
|
* See the file COPYING file.
|
|
**************************************************************/
|
|
|
|
/***************************************************************
|
|
* do_sql.h
|
|
**************************************************************/
|
|
|
|
#ifndef DO_SQL_H
|
|
#define DO_SQL_H 1
|
|
|
|
#include "rta.h"
|
|
|
|
/* types of SQL statements recognized */
|
|
#define RTA_SELECT 0
|
|
#define RTA_UPDATE 1
|
|
#define RTA_CALL 2
|
|
#define RTA_BEGIN 3
|
|
#define RTA_COMMIT 4
|
|
|
|
/* types of relations allowed in WHERE */
|
|
#define RTA_EQ 0
|
|
#define RTA_NE 1
|
|
#define RTA_GT 2
|
|
#define RTA_LT 3
|
|
#define RTA_GE 4
|
|
#define RTA_LE 5
|
|
|
|
/* SQL errors to the front ends */
|
|
#define E_NOTABLE "EERROR: Relation '%s' does not exist\n"
|
|
#define E_NOCOLUMN "EERROR: Attribute '%s' not found\n"
|
|
#define E_BADPARSE "EERROR: SQL parse error\n",""
|
|
#define E_BIGSTR "EERROR: String too long for '%s'\n"
|
|
#define E_NOWRITE "EERROR: Can not update read-only column '%s'\n"
|
|
#define E_FULLBUF "EERROR: Output buffer full\n",""
|
|
|
|
/* Defines for the meta tables. The table of tables must always be
|
|
table #0, and the table of columns must always be table #1. */
|
|
#define RTA_TABLES 0
|
|
#define RTA_COLUMNS 1
|
|
|
|
/* Used to remove a few characters from dbg() lines */
|
|
#define LOC __FILE__,__LINE__
|
|
|
|
/* Maximum number of characters in printed data type */
|
|
#define MX_INT_STRING (12)
|
|
#define MX_LONG_STRING (24)
|
|
#define MX_FLOT_STRING (24)
|
|
|
|
/* Max # strings in our private stack for yacc */
|
|
#define MXPARSESTR ((NCMDCOLS *2) + 4)
|
|
|
|
/** ************************************************************
|
|
* This structure contains/encodes the parsed SQL command from
|
|
* one of the UI or client interfaces.
|
|
* This structure is filled in by the yacc parser. If the parse
|
|
* is successful, the completed structure is passed to do_sql()
|
|
* for execution.
|
|
*
|
|
* The 'command' is just the type of SQL command.
|
|
* The 'cols' field is a list of names from the "SELECT cols"
|
|
* or from the "UPDATE col=X [,...]".
|
|
* The 'vals' field is a list of the strings "X" in an UPDATE.
|
|
* The 'tbl' field has the name of the table in use.
|
|
* The 'whrcols' and 'whrvals' fields are similar to the cols
|
|
* and vals fields.
|
|
* Note that cols, vals, whrcols, and whrvals in the structure
|
|
* below point to alloc()'ed memory and must be freed when done.
|
|
**************************************************************/
|
|
struct Sql_Cmd
|
|
{
|
|
char *sqlcmd; /* points to text of SQL command */
|
|
int command; /* RTA_SELECT, UPDATE, or CALL */
|
|
char *tbl; /* the table in question */
|
|
TBLDEF *ptbl; /* pointer to table in TBLDEFS */
|
|
int itbl; /* Index of table in Tbl */
|
|
int ncols; /* count of columns to display/update */
|
|
char *cols[NCMDCOLS]; /* col to display/update */
|
|
COLDEF *pcol[NCMDCOLS]; /* pointers to cols in COLDEFS */
|
|
char *updvals[NCMDCOLS]; /* values for column updates */
|
|
int updints[NCMDCOLS]; /* integer values for updates */
|
|
long long updlngs[NCMDCOLS]; /* long values for updates */
|
|
float updflot[NCMDCOLS]; /* float values for updates */
|
|
int nwhrcols; /* count of columns in where clause */
|
|
char *whrcols[NCMDCOLS]; /* cols in where */
|
|
int whrrel[NCMDCOLS]; /* relation (EQ, GT...) in where */
|
|
COLDEF *pwhr[NCMDCOLS]; /* pointers to Wcols in COLDEFS */
|
|
char *whrvals[NCMDCOLS]; /* values in the where clause */
|
|
int whrints[NCMDCOLS]; /* integer values of whrvals[] */
|
|
long long whrlngs[NCMDCOLS]; /* long values of whrvals[] */
|
|
float whrflot[NCMDCOLS]; /* float values of whrvals[] */
|
|
int limit; /* max num rows to output, 0=no_limit */
|
|
int offset; /* scan past this # rows before output */
|
|
char *out; /* put command response here */
|
|
int *nout; /* I/O number free bytes at 'out' */
|
|
char *errout; /* ==out at start. But for err msgs */
|
|
int nerrout; /* ==nout at start. But for err msgs */
|
|
int err; /* set =1 if error in SQL parse */
|
|
int nlineout; /* #bytes in SELECT row response */
|
|
};
|
|
|
|
/* Define the debug config structure */
|
|
struct EpgDbg
|
|
{
|
|
int syserr; /* !=0 to log system errors */
|
|
int rtaerr; /* !=0 to log rta errors */
|
|
int sqlerr; /* !=0 to log SQL errors */
|
|
int trace; /* !=0 to log SQL commands */
|
|
int target; /* 0=off, 1=syslog, 2=stderr, 3=both */
|
|
int priority; /* syslog() priority level */
|
|
int facility; /* syslog() facility */
|
|
char ident[MXDBGIDENT]; /* ident string for syslog() */
|
|
};
|
|
|
|
/* Define the stats structure */
|
|
struct EpgStat
|
|
{
|
|
long long nsyserr; /* count of failed OS calls. */
|
|
long long nrtaerr; /* count of internal rta failures. */
|
|
long long nsqlerr; /* count of SQL failures. */
|
|
long long nauth; /* count of DB authorizations. */
|
|
long long nupdate; /* count of UPDATE requests */
|
|
long long nselect; /* count of SELECT requests */
|
|
};
|
|
|
|
typedef struct
|
|
{
|
|
int id; /* FD of TCP conn (=-1 if not in use) */
|
|
char username[33]; /* Index of next location in cmd buffer */
|
|
char password[33];
|
|
char cmd[1000]; /* SQL command from UI program */
|
|
int rspfree; /* Number of free bytes in rsp buffer */
|
|
char rsp[50000]; /* SQL response to the UI program */
|
|
int ctm; /* connect time (==time();) */
|
|
int cdur; /* duration time (== now()-ctm;) */
|
|
char strid[33];
|
|
} EpgConn;
|
|
|
|
/* the connections list */
|
|
list_t *pgconn;
|
|
|
|
|
|
/* this is a struct that stores the RTA runtime config */
|
|
struct RTA_Conf
|
|
{
|
|
logcb loggingfunc; /* logging callback */
|
|
} RTA_Conf;
|
|
|
|
|
|
|
|
|
|
/* Forward references */
|
|
void do_sql(char *, int *);
|
|
void send_error(char *, int, char *, char *);
|
|
void verify_table_name(char *, int *);
|
|
void verify_select_list(char *, int *);
|
|
void verify_update_list(char *, int *);
|
|
void verify_where_list(char *, int *);
|
|
void sqldo_update(char *, int *);
|
|
void sqldo_update(char *, int *);
|
|
int send_row_description(char *, int *);
|
|
void do_select(char *, int *);
|
|
void do_call(char *, int *);
|
|
void do_begin(char *, int *);
|
|
void do_commit(char *, int *);
|
|
void ad_str(char **, char *);
|
|
void ad_int2(char **, int);
|
|
void ad_int4(char **, int);
|
|
void rtalog(char *, int, char *, ...);
|
|
|
|
#endif
|