/[webpac]/trunk/openisis/tcl/oits.c
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/openisis/tcl/oits.c

Parent Directory Parent Directory | Revision Log Revision Log


Revision 239 - (hide annotations)
Mon Mar 8 17:49:13 2004 UTC (20 years, 1 month ago) by dpavlin
File MIME type: text/plain
File size: 5551 byte(s)
including openisis 0.9.0 into webpac tree

1 dpavlin 237 /*
2     openisis - an open implementation of the CDS/ISIS database
3     Version 0.8.x (patchlevel see file Version)
4     Copyright (C) 2001-2003 by Erik Grziwotz, erik@openisis.org
5    
6     This library is free software; you can redistribute it and/or
7     modify it under the terms of the GNU Lesser General Public
8     License as published by the Free Software Foundation; either
9     version 2.1 of the License, or (at your option) any later version.
10    
11     This library is distributed in the hope that it will be useful,
12     but WITHOUT ANY WARRANTY; without even the implied warranty of
13     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14     Lesser General Public License for more details.
15    
16     You should have received a copy of the GNU Lesser General Public
17     License along with this library; if not, write to the Free Software
18     Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
19    
20     see README for more information
21     EOH */
22    
23     /*
24     $Id: oits.c,v 1.13 2003/06/15 15:57:44 mawag Exp $
25     OpenIsis Tcl server
26     */
27    
28    
29     #include "lsv.h"
30     #include "ldsp.h"
31     #include "openisistcl.h"
32    
33     /*
34     include this after the Tcl stuff for the benefit of those
35     who use the 150% braindead gcc 2.96
36     which barfs on
37     declaration of `index' shadows global declaration
38     in generic/tclDecls.h
39     cause string.h declares
40     char *index(const char *s, int c)
41     */
42     #include <string.h> /* mem* */
43    
44     static Tcl_Interp *interp; /* the 1 + only */
45     static int oitsid;
46     static int oitrid[3];
47    
48    
49     /* the db srv application */
50     static int oitdbs (Con *con, int task) {
51     int rt;
52     switch ( task ) {
53     case LSV_APPGOT:
54     rt = rInt (con->req, OPENISIS_RQS_TYPE, 0, 0);
55     /* interp evaluation in main thread: */
56     con->grp = OPENISIS_RQST_EVAL != rt;
57     default:
58     return 0;
59     case LSV_APPRUN:
60     break;
61     }
62     sMsg( LOG_INFO, "dbs %d: %d fields from %s",
63     svCur()->id, con->req->len, con->nam);
64     rt = ldspProcess (con->req, &(con->ses->res), 0, 0);
65     sMsg( LOG_INFO, "dbs %d: %d fields to %s (%d)",
66     svCur()->id, con->ses->res->len, con->nam, rt);
67     return rt;
68     }
69    
70     /* the echo application */
71     static int oits ( Con *c, int task )
72     {
73     Field *f;
74     int i;
75    
76     switch ( task ) {
77     case LSV_APPINI: /* init thread */
78     case LSV_APPFIN: /* fini thread */
79     case LSV_APPARG: /* new request param arrived */
80     default:
81     return 0;
82     case LSV_APPGOT: /* decide wether request may go to background thread */
83     c->grp = 1; /* non Tcl */
84     for ( i=c->req->len, f = c->req->field; i--; f++ )
85     /* by convention, request with fields >99 are handled by Tcl */
86     if ( 99 < f->tag ) {
87     c->grp = 0;
88     break;
89     }
90     return 0;
91     case LSV_APPRUN:
92     break; /* main code below */
93     }
94     /* run it */
95     sMsg( LOG_INFO, "echo %d: %d fields to %s",
96     svCur()->id, c->req->len, c->nam );
97     /**
98     we have records:
99     req -- the request, allocated by the srv->ses and readonly here
100     ses -- session props, allocated and managed by ses, read/write
101     res -- the responses, allocated and managed by ses, read/write
102    
103     (the identified) ses may be a different session on each call, however,
104     calls are strictly serialized (all in main thread)
105    
106     alternatively, we may use the one main session bound to the
107     main thread as allocator and use the identified session only
108     to keep the session props -- given they are never modified
109     in non-main-thread calls
110     */
111     switch ( c->grp ) {
112     case 0: { /* main thread Tcl request */
113     Rec *rec[3];
114     rec[0] = c->req;
115     rec[1] = c->ses->res;
116     rec[2] = c->ses->prop;
117     if ( openIsisTclEval( oitsid, 3, oitrid, rec, "oitscb" ) ) {
118     const char *errorInfo
119     = Tcl_GetVar( interp, "errorInfo", TCL_GLOBAL_ONLY );
120     sMsg( LOG_ERROR, "error in callback\n%s",
121     errorInfo ? errorInfo : "-" );
122     }
123     c->req = rec[0];
124     c->ses->res = rec[1];
125     c->ses->prop = rec[2];
126     /* don't break; */
127     } /* case 0 */
128     default: /* cp session to response */
129     if ( c->ses->prop )
130     for ( i=c->ses->prop->len, f = c->ses->prop->field; i--; f++ ) {
131     RADDF( c->ses->res, f, !0 );
132     }
133     break;
134     }
135     return 0;
136     } /* oits */
137    
138    
139     #ifdef ORATCL
140     extern int Oratcl_Init ( Tcl_Interp *ip );
141     #endif
142     #ifdef PGTCL
143     extern int Pgtcl_Init ( Tcl_Interp *ip );
144     #endif
145    
146    
147     int main ( int argc, const char **argv )
148     {
149     char *file;
150     int ret, db;
151     Srv echo;
152    
153     cOpen(0);
154    
155     Tcl_FindExecutable (argv[0]);
156     interp = Tcl_CreateInterp();
157     ret = Tcl_Init( interp );
158     sMsg( LOG_VERBOSE, "appinit %d", ret );
159    
160     db = 0;
161     if (1 < argc && 0 == strcmp ("-db", argv[1])) {
162     db = 1;
163     ret = openIsisTclInit (interp);
164     sMsg( LOG_VERBOSE, "openisisinit %d", ret);
165     --argc;
166     ++argv;
167     }
168    
169     #ifdef ORATCL
170     ret = Oratcl_Init( interp );
171     sMsg( LOG_VERBOSE, "orainit %d", ret );
172     #endif
173     #ifdef PGTCL
174     ret = Pgtcl_Init( interp );
175     sMsg( LOG_VERBOSE, "pginit %d", ret );
176     #endif
177     oitsid = openIsisTclNewSession( interp );
178     sMsg( LOG_VERBOSE, "oitsid %d", oitsid );
179     oitrid[0] = openIsisTclCreateRecCmd( oitsid, "request", 0, 0 );
180     sMsg( LOG_VERBOSE, "request %d", oitrid[0] );
181     oitrid[1] = openIsisTclCreateRecCmd( oitsid, "response", 0, 0 );
182     sMsg( LOG_VERBOSE, "response %d", oitrid[1] );
183     oitrid[2] = openIsisTclCreateRecCmd( oitsid, "session", 0, 0 );
184     sMsg( LOG_VERBOSE, "session %d", oitrid[2] );
185     file = 2<argc ? (char*)argv[2] : "oitsrc";
186     ret = Tcl_EvalFile( interp, file );
187     sMsg( LOG_VERBOSE, "file '%s' %d", file, ret );
188     if ( TCL_OK != ret ) {
189     const char *errorInfo = Tcl_GetVar( interp, "errorInfo", TCL_GLOBAL_ONLY );
190     sMsg( LOG_ERROR, "error sourcing file '%s' code %d errorInfo\n%s",
191     file, ret, errorInfo ? errorInfo : "-" );
192     return ret;
193     }
194    
195     memset( &echo, 0, sizeof(echo) );
196     echo.prt = svPlain;
197     echo.app = db ? oitdbs : oits;
198     return svRun( &echo, 1<argc ? argv[1] : 0 );
199     }

  ViewVC Help
Powered by ViewVC 1.1.26