1 : /*
2 : * Purpose: Test retrieving output parameters and return status
3 : * Functions: DBTDS dbnumrets dbresults dbretdata dbretlen dbretname dbrettype dbsqlexec
4 : */
5 :
6 : #if HAVE_CONFIG_H
7 : #include <config.h>
8 : #endif /* HAVE_CONFIG_H */
9 :
10 : #include <stdio.h>
11 :
12 : #if HAVE_STDLIB_H
13 : #include <stdlib.h>
14 : #endif /* HAVE_STDLIB_H */
15 :
16 : #if HAVE_STRING_H
17 : #include <string.h>
18 : #endif /* HAVE_STRING_H */
19 :
20 : #include <sqlfront.h>
21 : #include <sqldb.h>
22 :
23 : #include "common.h"
24 :
25 :
26 : static char software_version[] = "$Id: t0022.c,v 1.19 2005/05/11 07:56:44 freddy77 Exp $";
27 : static void *no_unused_var_warn[] = { software_version, no_unused_var_warn };
28 :
29 :
30 :
31 : int
32 : main(int argc, char **argv)
33 2 : {
34 : char cmd[1024];
35 : LOGINREC *login;
36 : DBPROCESS *dbproc;
37 : int i;
38 : char teststr[1024];
39 2 : int failed = 0;
40 2 : char *retname = NULL;
41 2 : int rettype = 0, retlen = 0;
42 :
43 2 : set_malloc_options();
44 :
45 2 : read_login_info(argc, argv);
46 :
47 2 : fprintf(stdout, "Start\n");
48 2 : add_bread_crumb();
49 :
50 2 : dbinit();
51 :
52 2 : add_bread_crumb();
53 2 : dberrhandle(syb_err_handler);
54 2 : dbmsghandle(syb_msg_handler);
55 :
56 2 : fprintf(stdout, "About to logon\n");
57 :
58 2 : add_bread_crumb();
59 2 : login = dblogin();
60 2 : DBSETLPWD(login, PASSWORD);
61 2 : DBSETLUSER(login, USER);
62 2 : DBSETLAPP(login, "t0022");
63 :
64 2 : fprintf(stdout, "About to open\n");
65 :
66 2 : add_bread_crumb();
67 2 : dbproc = dbopen(login, SERVER);
68 2 : if (strlen(DATABASE))
69 2 : dbuse(dbproc, DATABASE);
70 2 : add_bread_crumb();
71 2 : dbloginfree(login);
72 2 : add_bread_crumb();
73 :
74 2 : fprintf(stdout, "Dropping proc\n");
75 2 : add_bread_crumb();
76 2 : dbcmd(dbproc, "drop proc t0022");
77 2 : add_bread_crumb();
78 2 : dbsqlexec(dbproc);
79 2 : add_bread_crumb();
80 2 : while (dbresults(dbproc) != NO_MORE_RESULTS) {
81 : /* nop */
82 : }
83 2 : add_bread_crumb();
84 :
85 2 : fprintf(stdout, "creating proc\n");
86 2 : dbcmd(dbproc, "create proc t0022 (@b int out) as\nbegin\n select @b = 42\nend\n");
87 2 : if (dbsqlexec(dbproc) == FAIL) {
88 0 : add_bread_crumb();
89 0 : fprintf(stdout, "Failed to create proc t0022.\n");
90 0 : exit(1);
91 : }
92 4 : while (dbresults(dbproc) != NO_MORE_RESULTS) {
93 : /* nop */
94 : }
95 :
96 2 : sprintf(cmd, "declare @b int\nexec t0022 @b = @b output\n");
97 2 : fprintf(stdout, "%s\n", cmd);
98 2 : dbcmd(dbproc, cmd);
99 2 : dbsqlexec(dbproc);
100 2 : add_bread_crumb();
101 :
102 :
103 2 : if (dbresults(dbproc) == FAIL) {
104 0 : add_bread_crumb();
105 0 : fprintf(stdout, "Was expecting a result set.\n");
106 0 : exit(1);
107 : }
108 2 : add_bread_crumb();
109 :
110 2 : if ((dbnumrets(dbproc) == 0)
111 : && ((DBTDS(dbproc) == DBTDS_7_0)
112 : || (DBTDS(dbproc) == DBTDS_8_0))) {
113 1 : fprintf(stdout, "WARNING: Received no return parameters from server!\n");
114 1 : fprintf(stdout, "WARNING: This is likely due to a bug in Microsoft\n");
115 1 : fprintf(stdout, "WARNING: SQL Server 7.0 SP3 and later.\n");
116 1 : fprintf(stdout, "WARNING: Please try again using TDS protocol 4.2.\n");
117 1 : dbcmd(dbproc, "drop proc t0022");
118 1 : dbsqlexec(dbproc);
119 2 : while (dbresults(dbproc) != NO_MORE_RESULTS) {
120 : /* nop */
121 : }
122 1 : dbexit();
123 1 : free_bread_crumb();
124 1 : exit(0);
125 : }
126 2 : for (i = 1; i <= dbnumrets(dbproc); i++) {
127 1 : add_bread_crumb();
128 1 : retname = dbretname(dbproc, i);
129 1 : printf("ret name %d is %s\n", i, retname);
130 1 : rettype = dbrettype(dbproc, i);
131 1 : printf("ret type %d is %d\n", i, rettype);
132 1 : retlen = dbretlen(dbproc, i);
133 1 : printf("ret len %d is %d\n", i, retlen);
134 1 : dbconvert(dbproc, rettype, dbretdata(dbproc, i), retlen, SYBVARCHAR, (BYTE*) teststr, -1);
135 1 : printf("ret data %d is %s\n", i, teststr);
136 1 : add_bread_crumb();
137 : }
138 1 : if ((retname == NULL) || strcmp(retname, "@b")) {
139 0 : fprintf(stdout, "Was expecting a retname to be @b.\n");
140 0 : exit(1);
141 : }
142 1 : if (strcmp(teststr, "42")) {
143 0 : fprintf(stdout, "Was expecting a retdata to be 42.\n");
144 0 : exit(1);
145 : }
146 1 : if (rettype != SYBINT4) {
147 0 : fprintf(stdout, "Was expecting a rettype to be SYBINT4 was %d.\n", rettype);
148 0 : exit(1);
149 : }
150 1 : if (retlen != 4) {
151 0 : fprintf(stdout, "Was expecting a retlen to be 4.\n");
152 0 : exit(1);
153 : }
154 :
155 1 : fprintf(stdout, "Dropping proc\n");
156 1 : add_bread_crumb();
157 1 : dbcmd(dbproc, "drop proc t0022");
158 1 : add_bread_crumb();
159 1 : dbsqlexec(dbproc);
160 1 : add_bread_crumb();
161 2 : while (dbresults(dbproc) != NO_MORE_RESULTS) {
162 : /* nop */
163 : }
164 1 : add_bread_crumb();
165 1 : dbexit();
166 1 : add_bread_crumb();
167 :
168 1 : fprintf(stdout, "dblib %s on %s\n", (failed ? "failed!" : "okay"), __FILE__);
169 1 : free_bread_crumb();
170 1 : return failed ? 1 : 0;
171 : }
|