Index: include/mdbsql.h =================================================================== RCS file: /cvsroot/mdbtools/mdbtools/include/mdbsql.h,v retrieving revision 1.9 diff -u -r1.9 mdbsql.h --- include/mdbsql.h 10 Jan 2004 01:52:56 -0000 1.9 +++ include/mdbsql.h 19 Jan 2004 07:50:51 -0000 @@ -14,6 +14,7 @@ int num_tables; GPtrArray *tables; int num_sargs; + int max_rows; GPtrArray *sargs; MdbTableDef *cur_table; MdbSargNode *sarg_tree; @@ -42,7 +43,7 @@ MdbSarg *sarg; } MdbSQLSarg; -char *g_input_ptr; +extern char *g_input_ptr; #undef YY_INPUT #define YY_INPUT(b, r, ms) (r = mdb_sql_yyinput(b, ms)); @@ -70,5 +71,6 @@ extern void mdb_sql_listtables(MdbSQL *sql); extern void mdb_sql_add_not(MdbSQL *sql); extern void mdb_sql_describe_table(MdbSQL *sql); - +int mdbsql_run_query(MdbSQL *sql, char *mybuf); +void mdb_sql_set_maxrow(MdbSQL *sql,int aMaxrow); #endif Index: include/mdbtools.h =================================================================== RCS file: /cvsroot/mdbtools/mdbtools/include/mdbtools.h,v retrieving revision 1.27 diff -u -r1.27 mdbtools.h --- include/mdbtools.h 10 Jan 2004 01:52:56 -0000 1.27 +++ include/mdbtools.h 19 Jan 2004 07:50:52 -0000 @@ -132,7 +132,7 @@ #define IS_JET3(mdb) (mdb->f->jet_version==MDB_VER_JET3) /* hash to store registered backends */ -GHashTable *mdb_backends; +extern GHashTable *mdb_backends; /* forward declarations */ typedef struct mdbindex MdbIndex; Index: src/libmdb/backend.c =================================================================== RCS file: /cvsroot/mdbtools/mdbtools/src/libmdb/backend.c,v retrieving revision 1.11 diff -u -r1.11 backend.c --- src/libmdb/backend.c 10 Jan 2004 01:52:57 -0000 1.11 +++ src/libmdb/backend.c 19 Jan 2004 07:50:52 -0000 @@ -27,6 +27,7 @@ #include "dmalloc.h" #endif +GHashTable *mdb_backends; /* Access data types */ MdbBackendType mdb_access_types[] = { */ Index: src/sql/lexer.l =================================================================== RCS file: /cvsroot/mdbtools/mdbtools/src/sql/lexer.l,v retrieving revision 1.6 diff -u -r1.6 lexer.l --- src/sql/lexer.l 20 Jan 2003 16:04:31 -0000 1.6 +++ src/sql/lexer.l 19 Jan 2004 07:50:59 -0000 @@ -40,13 +40,16 @@ (<=) { return LTEQ; } (>=) { return GTEQ; } like { return LIKE; } +1[ ]=[ ]0 { return MAX0ROW; } +0[ ]=[ ]1 { return MAX0ROW; } + [ \t\r] ; -\"[A-z][A-z0-9 _]*\" { +\"[a-zA-Z_][a-zA-Z0-9_ #@i ]*\" { yylval.name = strdup(&yytext[1]); yylval.name[strlen(yylval.name)-1]='\0'; return IDENT; } -[A-z][A-z0-9_]* { yylval.name = strdup(yytext); return NAME; } +[a-zA-Z_][a-zA-Z0-9_#@]* { yylval.name = strdup(yytext); return NAME; } '.*' { yylval.name = strdup(yytext); return STRING; } ([0-9]+|([0-9]*\.[0-9+)([eE][-+]?[0-9]+)?) { Index: src/sql/mdbsql.c =================================================================== RCS file: /cvsroot/mdbtools/mdbtools/src/sql/mdbsql.c,v retrieving revision 1.14 diff -u -r1.14 mdbsql.c --- src/sql/mdbsql.c 10 Jan 2004 01:52:57 -0000 1.14 +++ src/sql/mdbsql.c 19 Jan 2004 07:51:00 -0000 @@ -31,6 +31,8 @@ #include #endif +char *g_input_ptr; + void mdb_sql_error(char *fmt, ...) { @@ -65,8 +67,38 @@ sql->sargs = g_ptr_array_new(); sql->sarg_tree = NULL; sql->sarg_stack = NULL; + sql->max_rows = -1; return sql; +} + + int _parse(MdbSQL *sql, char *buf) + { + g_input_ptr = buf; + /* begin unsafe */ + _mdb_sql(sql); + if (yyparse()) { + /* end unsafe */ + fprintf(stderr, "Couldn't parse SQL\n"); + mdb_sql_reset(sql); + return 0; + } else { + return 1; + } + } +int mdbsql_run_query(MdbSQL *sql, char *mybuf) +{ + if (_parse(sql, mybuf) && sql->cur_table) { + mdbsql_bind_all(sql); + return 1; + } + else + return 0; +} + +void mdb_sql_set_maxrow(MdbSQL *sql,int aMaxrow) +{ + sql->max_rows = aMaxrow; } MdbSQLSarg *mdb_sql_alloc_sarg() Index: src/sql/parser.y =================================================================== RCS file: /cvsroot/mdbtools/mdbtools/src/sql/parser.y,v retrieving revision 1.7 diff -u -r1.7 parser.y --- src/sql/parser.y 20 Jan 2003 16:04:31 -0000 1.7 +++ src/sql/parser.y 19 Jan 2004 07:51:01 -0000 @@ -40,7 +40,7 @@ -%token IDENT NAME PATH STRING NUMBER +%token IDENT NAME PATH STRING NUMBER MAX0ROW %token SELECT FROM WHERE CONNECT DISCONNECT TO LIST TABLES WHERE AND OR NOT %token DESCRIBE TABLE %token LTEQ GTEQ LIKE @@ -48,6 +48,7 @@ %type database %type constant %type operator +%type identify %% @@ -80,7 +81,11 @@ ; sarg_list: - sarg + MAX0ROW { + mdb_sql_set_maxrow(_mdb_sql(NULL), 0); + } + | sarg + | '(' sarg AND sarg_list ')' | '(' sarg_list ')' | NOT sarg_list { mdb_sql_add_not(_mdb_sql(NULL)); } | sarg_list OR sarg_list { mdb_sql_add_or(_mdb_sql(NULL)); } @@ -88,18 +93,33 @@ ; sarg: - NAME operator constant { + '(' sarg ')' + | identify operator constant { mdb_sql_add_sarg(_mdb_sql(NULL), $1, $2, $3); free($1); free($3); } - | constant operator NAME { + | constant operator identify { + mdb_sql_add_sarg(_mdb_sql(NULL), $3, $2, $1); + free($1); + free($3); + } + | identify operator identify { + mdb_sql_add_sarg(_mdb_sql(NULL), $3, $2, $1); + free($1); + free($3); + } + | constant operator constant { mdb_sql_add_sarg(_mdb_sql(NULL), $3, $2, $1); free($1); free($3); } ; +identify: + IDENT + | NAME + operator: '=' { $$ = MDB_EQUAL; } | '>' { $$ = MDB_GT; } @@ -115,12 +135,12 @@ database: PATH - | NAME + | identify ; table: - NAME { mdb_sql_add_table(_mdb_sql(NULL), $1); free($1); } - | IDENT { mdb_sql_add_table(_mdb_sql(NULL), $1); free($1); } + identify { mdb_sql_add_table(_mdb_sql(NULL), $1); free($1); } + | identify identify { mdb_sql_add_table(_mdb_sql(NULL), $1); free($1); } ; column_list: @@ -130,8 +150,7 @@ ; column: - NAME { mdb_sql_add_column(_mdb_sql(NULL), $1); free($1); } - | IDENT { mdb_sql_add_column(_mdb_sql(NULL), $1); free($1); } + identify { mdb_sql_add_column(_mdb_sql(NULL), $1); free($1); } ; %%