/[vdw]/trunk/obj_srvr.l
This is repository of my old source code which isn't updated any more. Go to git.rot13.org for current projects!
ViewVC logotype

Annotation of /trunk/obj_srvr.l

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1 - (hide annotations)
Sun Feb 6 05:28:38 2005 UTC (19 years, 2 months ago) by dpavlin
File size: 6484 byte(s)
initial import into svn

1 dpavlin 1 %{
2     /*
3     * This SQL Lexer is copied from the O'Reilly Lex & Yacc book, 2nd Edition,
4     * 1995, by John R. Levine, Tony Mason, and Doug Brown. It probably contains
5     * words that we don't need for the Object Server, and will probably need
6     * enhancements. I removed the DDL and non-query words, but I'm going to
7     * leave in all other O'Reilly stuff unless it becomes real obvious that we
8     * don't need it.
9     *
10     * Jeremy Hickerson, 5/8/2002
11     */
12     #define LEX_SOURCE_FILE
13    
14     #include <string.h>
15     #include "obj_srvr.h"
16     #include "flexdef.h"
17    
18     #ifdef VMS
19     #include <unixio.h>
20     #endif
21    
22     #include <string.h>
23     #include <stdlib.h>
24     #include <unistd.h>
25     #include <types.h>
26     #include <socket.h>
27     #include <in.h>
28     #include <inet.h>
29     #include <netdb.h>
30     #include <stdio.h>
31     #include <errno.h>
32     #include <time.h>
33     #include <timeb.h>
34    
35     #define bcopy(s,d,l) memcpy(d,s,l)
36     #define bzero(d,l) memset(d,0,l)
37     #define BUF_SIZE 2048
38    
39     char buf[BUF_SIZE];
40     int sock;
41    
42     #include "obj_srvr_tab.h"
43    
44     int lineno = 1;
45     char mode;
46    
47     void yyerror(char *s);
48     void connect_to_oracle_obj_srvr(char *host, int port);
49    
50     /* macro to save the text of a SQL token */
51     #define SV save_str(yytext)
52    
53     /* macro to save the text and return a token */
54     #define TOK(name) { SV; token = name; return name; }
55    
56     /* read input through perl, since perl has access to oracle_obj_srvr socket */
57     /* (we connected to it in perl, because if we connect in C (here) then haven't
58     figured out how to make perl see socket for output) */
59     #define YY_INPUT(buf,result,max_size) { \
60     strcpy(buf, call_perl_get_yyin(max_size) ); \
61     result = strlen(buf); \
62     }
63    
64     %}
65    
66     %s SQL
67     %%
68    
69     /* EXEC[ \t]+SQL { BEGIN SQL; printf("SQL> "); start_save(); } */
70     SQL {
71    
72     BEGIN SQL;
73    
74     call_perl_send_yyout("SQL> ");
75    
76     if (mode == 'S')
77     call_perl_send_yyout("\n");
78    
79     start_save();
80     }
81    
82     QUIT { close(sock); exit(0); }
83    
84     /* literal keyword tokens */
85     <SQL>ALL TOK(ALL)
86     <SQL>AND TOK(AND)
87     <SQL>AVG TOK(AMMSC)
88     <SQL>MIN TOK(AMMSC)
89     <SQL>MAX TOK(AMMSC)
90     <SQL>SUM TOK(AMMSC)
91     <SQL>COUNT TOK(AMMSC)
92     <SQL>ANY TOK(ANY)
93     <SQL>AS TOK(AS)
94     <SQL>ASC TOK(ASC)
95     <SQL>AUTHORIZATION TOK(AUTHORIZATION)
96     <SQL>BETWEEN TOK(BETWEEN)
97     <SQL>BY TOK(BY)
98     <SQL>CHAR(ACTER)? TOK(CHARACTER)
99     <SQL>CHECK TOK(CHECK)
100     <SQL>CLOSE TOK(CLOSE)
101     <SQL>CONTINUE TOK(CONTINUE)
102     <SQL>CURRENT TOK(CURRENT)
103     <SQL>CURSOR TOK(CURSOR)
104     <SQL>DECIMAL TOK(DECIMAL)
105     <SQL>DECLARE TOK(DECLARE)
106     <SQL>DEFAULT TOK(DEFAULT)
107     <SQL>DESC TOK(DESC)
108     <SQL>DISTINCT TOK(DISTINCT)
109     <SQL>DOUBLE TOK(DOUBLE)
110     <SQL>ESCAPE TOK(ESCAPE)
111     <SQL>EXISTS TOK(EXISTS)
112     <SQL>FETCH TOK(FETCH)
113     <SQL>FLOAT TOK(FLOAT)
114     <SQL>FOR TOK(FOR)
115     <SQL>FOREIGN TOK(FOREIGN)
116     <SQL>FOUND TOK(FOUND)
117     <SQL>FROM TOK(FROM)
118     <SQL>GO[ \t]*TO TOK(GOTO)
119     <SQL>GROUP TOK(GROUP)
120     <SQL>HAVING TOK(HAVING)
121     <SQL>IN TOK(IN)
122     <SQL>INDICATOR TOK(INDICATOR)
123     <SQL>INT(EGER)? TOK(INTEGER)
124     <SQL>INTO TOK(INTO)
125     <SQL>IS TOK(IS)
126     <SQL>KEY TOK(KEY)
127     <SQL>LANGUAGE TOK(LANGUAGE)
128     <SQL>LIKE TOK(LIKE)
129     <SQL>NOT TOK(NOT)
130     <SQL>NULL TOK(NULLX)
131     <SQL>NUMERIC TOK(NUMERIC)
132     <SQL>OF TOK(OF)
133     <SQL>ON TOK(ON)
134     <SQL>OPEN TOK(OPEN)
135     <SQL>OPTION TOK(OPTION)
136     <SQL>OR TOK(OR)
137     <SQL>ORDER TOK(ORDER)
138     <SQL>PRECISION TOK(PRECISION)
139     <SQL>PRIMARY TOK(PRIMARY)
140     <SQL>PRIVILEGES TOK(PRIVILEGES)
141     <SQL>PROCEDURE TOK(PROCEDURE)
142     <SQL>REAL TOK(REAL)
143     <SQL>REFERENCES TOK(REFERENCES)
144     <SQL>SCHEMA TOK(SCHEMA)
145     <SQL>SELECT TOK(SELECT)
146     <SQL>SMALLINT TOK(SMALLINT)
147     <SQL>SOME TOK(SOME)
148     <SQL>SQLCODE TOK(SQLCODE)
149     <SQL>TO TOK(TO)
150     <SQL>UNION TOK(UNION)
151     <SQL>UNIQUE TOK(UNIQUE)
152     <SQL>USER TOK(USER)
153     <SQL>VALUES TOK(VALUES)
154     <SQL>WHENEVER TOK(WHENEVER)
155     <SQL>WHERE TOK(WHERE)
156     <SQL>WITH TOK(WITH)
157     <SQL>WORK TOK(WORK)
158    
159    
160    
161     /* punctuation */
162     <SQL>"=" TOK(COMP_EQ)
163     <SQL>"<>" TOK(COMP_NE1)
164     <SQL>"!=" TOK(COMP_NE2)
165     <SQL>"<" TOK(COMP_LT)
166     <SQL>">" TOK(COMP_GT)
167     <SQL>"<=" TOK(COMP_LE)
168     <SQL>">=" TOK(COMP_GE)
169    
170     <SQL>[-+*/:(),.;] TOK(yytext[0])
171    
172    
173     /* names */
174     <SQL>[A-Za-z][A-Za-z0-9_]* TOK(NAME)
175    
176     /* strings */
177     <SQL>'[^'\n]*' TOK(STRING)
178    
179     <SQL>'[^'\n]*$ { yyerror("Unterminated string"); }
180    
181    
182     /* numbers */
183     <SQL>[0-9]+ |
184     <SQL>[0-9]+"."[0-9]* |
185     <SQL>"."[0-9]* TOK(INTNUM)
186    
187     <SQL>[0-9]+[eE][+-]?[0-9]+ |
188     <SQL>[0-9]+"."[0-9]*[eE][+-]?[0-9]+ |
189     <SQL>"."[0-9]*[eE][+-]?[0-9]+ TOK(APPROXNUM)
190    
191    
192     /* whitespace */
193     <SQL>\n { save_str(" "); lineno++; }
194     \n { save_str(" "); lineno++; } /* jh: non-SQL */
195    
196     <SQL>[ \t\r]+ save_str(" "); /* whitespace */
197    
198     <SQL>"--".* ; /* comment */
199    
200    
201     /* anything else */
202     . ; /* ignore */
203    
204     %%
205    
206    
207     void yyerror(char *s) {
208     printf("%d: %s at %s\n", lineno, s, yytext);
209     }
210    
211    
212     /* leave SQL lexing mode */
213     un_sql() {
214     BEGIN INITIAL;
215     }
216    
217    
218     main(int argc, char *argv[]) {
219    
220    
221     if (argc < 4) {
222     fprintf(stderr, "Usage: obj_srvr <db_uid> db_passwd> <mode: (I)nteractive/(S)erver> [host] [port]\n");
223     return;
224     }
225    
226     char perlscript_to_embed[] = "obj_srvr.pl";
227     static char *perl_argv[5];
228     int i;
229    
230     perl_argv[0] = argv[0];
231     perl_argv[1] = perlscript_to_embed;
232     perl_argv[2] = argv[1];
233     perl_argv[3] = argv[2];
234    
235     /* start the perl interpreter and compile obj_srvr.pl */
236     if ( !strcmp(argv[3], "S") || !strcmp(argv[3], "s") ) {
237     strcpy(perl_argv[2], "");
238     strcpy(perl_argv[3], "");
239     }
240     embed_perl_obj_srvr(4, perl_argv, NULL);
241    
242     /* connect to "wrapper" server running on foreign tnslsnr */
243     if ( !strcmp(argv[3], "S") || !strcmp(argv[3], "s") ) {
244     mode = 'S';
245     call_perl_connect2client(argv[4], argv[5]);
246     }
247    
248     do {
249     if (yyparse() ) {
250     call_perl_send_yyout("\nQUIT\n");
251     break;
252     }
253     } while (!feof(yyin) ) ;
254    
255     end_perl();
256     }
257    

  ViewVC Help
Powered by ViewVC 1.1.26