2 Subject: Re: Sybase module -- input sought
3 From: jredford@lehman.com
4 To: ags@uncompaghre.informatics.jax.org (Alexander G. Smith)
6 Date: Tue, 10 May 94 11:53:13 -0400
9 input sought? how about a complete module? :)
11 This is a fairly incomplete work.. but I have done things dramatically
12 differently than sybperl would. Given the nature of the language I
13 find it is easier to simply get ALL results & then muck with the rows
14 later as parts of the data. This is a subset of the functionality of a
15 Modula-3 interface to Sybase that I wrote.. I could send you that if
16 you are interested in a more complete picture.
24 #include "allobjects.h"
25 #include "modsupport.h"
28 static object
*SybaseError
; /* exception sybase.error */
33 LOGINREC
*login
; /* login record */
34 DBPROCESS
*dbproc
; /* login record */
37 extern typeobject SybDbtype
; /* Forward */
41 newsybdbobject(char *user
, char *passwd
, char *server
)
45 s
= NEWOBJ(sybdbobject
, &SybDbtype
);
49 (void)DBSETLUSER(s
->login
, user
);
52 (void)DBSETLPWD(s
->login
, passwd
);
54 if(!(s
->dbproc
= dbopen(s
->login
, server
))) {
55 dbloginfree(s
->login
);
63 /* OBJECT FUNCTIONS: sybdb */
65 /* Common code for returning pending results */
67 *getresults (DBPROCESS
*dbp
)
78 results
= newlistobject(0);
79 while ((retcode
= dbresults(dbp
)) != NO_MORE_RESULTS
) {
80 if (retcode
== SUCCEED
&& DBROWS(dbp
) == SUCCEED
) {
81 list
= newlistobject(0);
82 cols
= dbnumcols(dbp
);
83 fmt
= (int *)malloc(sizeof(int) * cols
);
84 for (i
= 1; i
<= cols
; i
++) {
85 switch(dbcoltype(dbp
, i
)) {
103 while (dbnextrow(dbp
) != NO_MORE_ROWS
) {
104 tuple
= newtupleobject(cols
);
105 for (i
= 1; i
<= cols
; i
++) {
108 o
= newsizedstringobject((char *)dbdata(dbp
, i
), dbdatlen(dbp
, i
));
109 settupleitem(tuple
, i
-1, o
);
112 o
= newintobject(*((char *)dbdata(dbp
, i
)));
113 settupleitem(tuple
, i
-1, o
);
116 o
= newintobject(*((short *)dbdata(dbp
, i
)));
117 settupleitem(tuple
, i
-1, o
);
120 o
= newintobject(*((int *)dbdata(dbp
, i
)));
121 settupleitem(tuple
, i
-1, o
);
124 o
= newfloatobject(*((double *)dbdata(dbp
, i
)));
125 settupleitem(tuple
, i
-1, o
);
129 addlistitem(list
,tuple
);
132 addlistitem(results
,list
);
139 *sybdb_sql (self
, args
)
146 dbp
= ((sybdbobject
*)self
)->dbproc
;
148 if (!getargs (args
, "s", &sql
)) {
154 return getresults(dbp
);
158 *sybdb_sp (self
, args
)
172 dbp
= ((sybdbobject
*)self
)->dbproc
;
174 if (!getargs (args
, "(sO)", &sp
, &spargs
)) {
179 dbrpcinit(dbp
, sp
, 0);
181 if (is_tupleobject(spargs
)) {
182 spargcnt
=gettuplesize(spargs
);
183 for (i
=0; i
< spargcnt
; i
++) {
184 sparg
= gettupleitem(spargs
,i
);
185 if (is_intobject(sparg
)) {
187 i
= getintvalue(sparg
);
188 dbrpcparam(dbp
, NULL
, 0, SYBINT4
, -1, -1, &i
);
189 } else if (is_floatobject(sparg
)) {
191 i
= getfloatvalue(sparg
);
192 dbrpcparam(dbp
, NULL
, 0, SYBFLT8
, -1, -1, &i
);
193 } else if (is_stringobject(sparg
)) {
194 dbrpcparam(dbp
, NULL
, 0, SYBCHAR
, -1, getstringsize(sparg
), getstringvalue(sparg
));
196 err_setstr (SybaseError
, "Could not handle paramaters to procedure.");
200 } else if (spargs
!= None
) {
201 err_setstr (SybaseError
, "Could not handle paramaters to procedure.");
207 results
= getresults(dbp
);
208 retstatus
= dbretstatus(dbp
);
210 r
= mkvalue("(iO)", retstatus
, results
);
216 static struct methodlist sybdb_methods
[] = {
219 {NULL
, NULL
} /* sentinel */
226 dbloginfree(s
->login
);
232 sybdb_getattr(s
, name
)
236 return findmethod(sybdb_methods
, (object
*) s
, name
);
240 typeobject SybDbtype
= {
241 OB_HEAD_INIT(&Typetype
)
246 sybdb_dealloc
, /*tp_dealloc*/
248 sybdb_getattr
, /*tp_getattr*/
253 0, /*tp_as_sequence*/
261 /* MODULE FUNCTIONS: sybase */
264 *sybase_new (self
, args
)
265 object
*self
; /* Not used */
268 char *user
, *passwd
, *server
;
272 if (!getargs (args
, "(zzz)", &user
, &passwd
, &server
)) {
275 db
= (object
*) newsybdbobject(user
, passwd
, server
);
277 /* XXX Should be setting some errstr stuff here based on sybase errors */
278 err_setstr (SybaseError
, "Could not open connection to server.");
285 /* List of module functions */
286 static struct methodlist sybase_methods
[]=
289 {NULL
, NULL
} /* sentinel */
292 /* Module initialisation */
297 /* Create the module and add the functions */
298 m
= initmodule ("sybase", sybase_methods
);
299 /* Add some symbolic constants to the module */
300 d
= getmoduledict (m
);
301 SybaseError
= newstringobject ("sybase.error");
302 if (SybaseError
== NULL
|| dictinsert (d
, "error", SybaseError
) != 0) {
303 fatal ("can't define sybase.error");
305 /* Check for errors */
306 if (err_occurred ()){
307 fatal ("can't initialize module sybase");