LCOV - code coverage report
Current view: top level - src/dblib/unittests - t0022.c (source / functions) Hit Total Coverage
Test: FreeTDS coverage Lines: 109 136 80.1 %
Date: 2025-05-13 09:49:23 Functions: 1 1 100.0 %

          Line data    Source code
       1             : /* 
       2             :  * Purpose: Test retrieving output parameters and return status 
       3             :  * Functions: DBTDS dbnumrets dbresults dbretdata dbretlen dbretname dbrettype dbsqlexec
       4             :  */
       5             : 
       6             : #include "common.h"
       7             : #include <assert.h>
       8             : 
       9          10 : TEST_MAIN()
      10             : {
      11             :         LOGINREC *login;
      12             :         DBPROCESS *dbproc;
      13             :         int i;
      14             :         char teststr[1024];
      15          10 :         int erc, failed = 0;
      16          10 :         char *retname = NULL;
      17          10 :         int rettype = 0, retlen = 0;
      18             : 
      19          10 :         set_malloc_options();
      20             : 
      21          10 :         read_login_info(argc, argv);
      22             : 
      23          10 :         printf("Starting %s\n", argv[0]);
      24             : 
      25          10 :         dbinit();
      26             : 
      27          10 :         dberrhandle(syb_err_handler);
      28          10 :         dbmsghandle(syb_msg_handler);
      29             : 
      30          10 :         printf("About to logon\n");
      31             : 
      32          10 :         login = dblogin();
      33          10 :         DBSETLPWD(login, PASSWORD);
      34          10 :         DBSETLUSER(login, USER);
      35          10 :         DBSETLAPP(login, "t0022");
      36             : 
      37          10 :         printf("About to open\n");
      38             : 
      39          10 :         dbproc = dbopen(login, SERVER);
      40          10 :         if (strlen(DATABASE))
      41          10 :                 dbuse(dbproc, DATABASE);
      42          10 :         dbloginfree(login);
      43             : 
      44          10 :         printf("Dropping proc\n");
      45          10 :         sql_cmd(dbproc);
      46          10 :         dbsqlexec(dbproc);
      47          10 :         while ((erc = dbresults(dbproc)) == SUCCEED) {
      48          14 :                 printf("dbresult succeeded dropping procedure\n");
      49          14 :                 while ((erc = dbnextrow(dbproc)) == SUCCEED) {
      50           0 :                         printf("dbnextrow returned spurious rows dropping procedure\n");
      51           0 :                         assert(0); /* dropping a procedure returns no rows */
      52             :                 }
      53          14 :                 assert(erc == NO_MORE_ROWS);
      54             :         }
      55          10 :         assert(erc == NO_MORE_RESULTS);
      56             : 
      57          10 :         printf("creating proc\n");
      58          10 :         sql_cmd(dbproc);
      59          10 :         if (dbsqlexec(dbproc) == FAIL) {
      60           0 :                 printf("Failed to create proc t0022.\n");
      61           0 :                 exit(1);
      62             :         }
      63          20 :         while ((erc = dbresults(dbproc)) != NO_MORE_RESULTS) {
      64          10 :                 assert(erc != FAIL);
      65          10 :                 while ((erc = dbnextrow(dbproc)) == SUCCEED) {
      66           0 :                         assert(0); /* creating a procedure returns no rows */
      67             :                 }
      68          10 :                 assert(erc == NO_MORE_ROWS);
      69             :         }
      70             : 
      71          10 :         sql_cmd(dbproc);
      72          10 :         dbsqlexec(dbproc);
      73             : 
      74          10 :         while ((erc = dbresults(dbproc)) != NO_MORE_RESULTS) {
      75          10 :                 if (erc == FAIL) {
      76           0 :                         printf("Was expecting a result set.\n");
      77           0 :                         exit(1);
      78             :                 }
      79          10 :                 while ((erc = dbnextrow(dbproc)) == SUCCEED) {
      80           0 :                         assert(0); /* procedure returns no rows */
      81             :                 }
      82          10 :                 assert(erc == NO_MORE_ROWS);
      83             :         }
      84             : 
      85             : #if defined(DBTDS_7_0) && defined(DBTDS_7_1) && defined(DBTDS_7_2) && defined(DBTDS_7_3) \
      86             :         && defined(DBTDS_7_4) && defined(DBTDS_8_0_)
      87          10 :         if ((dbnumrets(dbproc) == 0)
      88           8 :             && ((DBTDS(dbproc) == DBTDS_7_0)
      89           8 :                 || (DBTDS(dbproc) == DBTDS_7_1)
      90           4 :                 || (DBTDS(dbproc) == DBTDS_7_2)
      91           4 :                 || (DBTDS(dbproc) == DBTDS_7_3)
      92           2 :                 || (DBTDS(dbproc) == DBTDS_7_4)
      93           0 :                 || (DBTDS(dbproc) == DBTDS_8_0_))) {
      94           8 :                 printf("WARNING:  Received no return parameters from server!\n");
      95           8 :                 printf("WARNING:  This is likely due to a bug in Microsoft\n");
      96           8 :                 printf("WARNING:  SQL Server 7.0 SP3 and later.\n");
      97           8 :                 printf("WARNING:  Please try again using TDS protocol 4.2.\n");
      98           8 :                 dbcmd(dbproc, "drop proc t0022");
      99           8 :                 dbsqlexec(dbproc);
     100           8 :                 while (dbresults(dbproc) != NO_MORE_RESULTS) {
     101             :                         /* nop */
     102             :                 }
     103           8 :                 dbexit();
     104           8 :                 exit(0);
     105             :         }
     106             : #endif
     107           2 :         for (i = 1; i <= dbnumrets(dbproc); i++) {
     108           2 :                 retname = dbretname(dbproc, i);
     109           2 :                 printf("ret name %d is %s\n", i, retname);
     110           2 :                 rettype = dbrettype(dbproc, i);
     111           2 :                 printf("ret type %d is %d\n", i, rettype);
     112           2 :                 retlen = dbretlen(dbproc, i);
     113           2 :                 printf("ret len %d is %d\n", i, retlen);
     114           2 :                 dbconvert(dbproc, rettype, dbretdata(dbproc, i), retlen, SYBVARCHAR, (BYTE*) teststr, -1);
     115           2 :                 printf("ret data %d is %s\n", i, teststr);
     116             :         }
     117           2 :         if ((retname == NULL) || strcmp(retname, "@b")) {
     118           0 :                 printf("Was expecting a retname to be @b.\n");
     119           0 :                 exit(1);
     120             :         }
     121           2 :         if (strcmp(teststr, "42")) {
     122           0 :                 printf("Was expecting a retdata to be 42.\n");
     123           0 :                 exit(1);
     124             :         }
     125           2 :         if (rettype != SYBINT4) {
     126           0 :                 printf("Was expecting a rettype to be SYBINT4 was %d.\n", rettype);
     127           0 :                 exit(1);
     128             :         }
     129           2 :         if (retlen != 4) {
     130           0 :                 printf("Was expecting a retlen to be 4.\n");
     131           0 :                 exit(1);
     132             :         }
     133             : 
     134           2 :         printf("Dropping proc\n");
     135           2 :         sql_cmd(dbproc);
     136           2 :         dbsqlexec(dbproc);
     137           2 :         while (dbresults(dbproc) != NO_MORE_RESULTS) {
     138             :                 /* nop */
     139             :         }
     140             :         
     141             :         /*
     142             :          * Chapter 2: test for resultsets containing only a return status
     143             :          */
     144             :         
     145           2 :         printf("Dropping proc t0022a\n");
     146           2 :         sql_cmd(dbproc);
     147             : 
     148           2 :         dbsqlexec(dbproc);
     149             : 
     150           2 :         while ((erc = dbresults(dbproc)) == SUCCEED) {
     151           4 :                 printf("dbresult succeeded dropping procedure\n");
     152           4 :                 while ((erc = dbnextrow(dbproc)) == SUCCEED) {
     153           0 :                         printf("dbnextrow returned spurious rows dropping procedure\n");
     154           0 :                         assert(0); /* dropping a procedure returns no rows */
     155             :                 }
     156           4 :                 assert(erc == NO_MORE_ROWS);
     157             :         }
     158           2 :         assert(erc == NO_MORE_RESULTS);
     159             : 
     160           2 :         printf("creating proc t0022a\n");
     161           2 :         sql_cmd(dbproc);
     162           2 :         if (dbsqlexec(dbproc) == FAIL) {
     163           0 :                 printf("Failed to create proc t0022a.\n");
     164           0 :                 exit(1);
     165             :         }
     166           4 :         while ((erc = dbresults(dbproc)) != NO_MORE_RESULTS) {
     167           2 :                 assert(erc != FAIL);
     168           2 :                 while ((erc = dbnextrow(dbproc)) == SUCCEED) {
     169           0 :                         assert(0); /* creating a procedure returns no rows */
     170             :                 }
     171           2 :                 assert(erc == NO_MORE_ROWS);
     172             :         }
     173             : 
     174           2 :         sql_cmd(dbproc);
     175           2 :         dbsqlexec(dbproc);
     176             : 
     177           4 :         for (i=1; (erc = dbresults(dbproc)) != NO_MORE_RESULTS; i++) {
     178             :                 enum {expected_iterations = 2};
     179             :                 DBBOOL fret;
     180             :                 DBINT  status;
     181           2 :                 if (erc == FAIL) {
     182           0 :                         printf("t0022a failed for some reason.\n");
     183           0 :                         exit(1);
     184             :                 }
     185           2 :                 printf("procedure returned %srows\n", DBROWS(dbproc)==SUCCEED? "" : "no ");
     186           2 :                 while ((erc = dbnextrow(dbproc)) == SUCCEED) {
     187           0 :                         assert(0); /* procedure returns no rows */
     188             :                 }
     189           2 :                 assert(erc == NO_MORE_ROWS);
     190             :                 
     191           2 :                 fret = dbhasretstat(dbproc);
     192           2 :                 printf("procedure has %sreturn status\n", fret==TRUE? "" : "no ");
     193           2 :                 assert(fret == TRUE);
     194             :                 
     195           2 :                 status = dbretstatus(dbproc);
     196           2 :                 printf("return status %d is %d\n", i, (int) status);
     197           2 :                 switch (i) {
     198           2 :                 case 1: assert(status == 17); break;
     199           0 :                 case 2: assert(status == 1024); break;
     200           0 :                 default: assert(i <= expected_iterations);
     201             :                 }
     202             :                 
     203             :         }
     204             : 
     205             :         assert(erc == NO_MORE_RESULTS);
     206             :         
     207           2 :         printf("Dropping proc t0022a\n");
     208           2 :         sql_cmd(dbproc);
     209           2 :         dbsqlexec(dbproc);
     210           2 :         while (dbresults(dbproc) != NO_MORE_RESULTS) {
     211             :                 /* nop */
     212             :         }
     213             :         
     214             :         /* end chapter 2 */
     215             : 
     216             : 
     217           2 :         dbexit();
     218             : 
     219           2 :         printf("%s %s\n", __FILE__, (failed ? "failed!" : "OK"));
     220           2 :         return failed ? 1 : 0;
     221             : }

Generated by: LCOV version 1.13