LCOV - code coverage report
Current view: top level - src/dblib/unittests - done_handling.c (source / functions) Hit Total Coverage
Test: FreeTDS coverage Lines: 103 120 85.8 %
Date: 2025-01-18 12:13:41 Functions: 8 8 100.0 %

          Line data    Source code
       1             : #include "common.h"
       2             : 
       3             : static char software_version[] = "$Id: done_handling.c,v 1.11 2010-09-22 07:03:59 freddy77 Exp $";
       4             : static void *no_unused_var_warn[] = { software_version, no_unused_var_warn };
       5             : 
       6             : /*
       7             :  * This test try do discovery how dblib process token looking for state
       8             :  * at every iteration. It issue a query to server and check
       9             :  * - row count (valid number means DONE processed)
      10             :  * - if possible to send another query (means state IDLE)
      11             :  * - if error readed (means ERROR token readed)
      12             :  * - if status present (PARAMRESULT token readed)
      13             :  * - if parameter present (PARAM token readed)
      14             :  * It try these query types:
      15             :  * - normal row
      16             :  * - normal row with no count
      17             :  * - normal row without rows
      18             :  * - error query
      19             :  * - store procedure call with output parameters
      20             :  */
      21             : 
      22             : /* Forward declarations of the error handler and message handler. */
      23             : static int err_handler(DBPROCESS * dbproc, int severity, int dberr, int oserr, char *dberrstr, char *oserrstr);
      24             : static int msg_handler(DBPROCESS * dbproc, DBINT msgno, int msgstate, int severity, char *msgtext, char *srvname, char *procname,
      25             :                        int line);
      26             : 
      27             : static DBPROCESS *dbproc;
      28             : static int silent = 0;
      29             : static int check_idle = 0;
      30             : 
      31             : /* print functions adapted from src/dblib/dblib.c */
      32             : static const char *
      33         204 : prdbretcode(int retcode)
      34             : {
      35             :         static char unknown[24];
      36         204 :         switch(retcode) {
      37             :         case REG_ROW:           return "REG_ROW/MORE_ROWS";
      38         172 :         case NO_MORE_ROWS:      return "NO_MORE_ROWS";
      39           0 :         case BUF_FULL:          return "BUF_FULL";
      40           0 :         case NO_MORE_RESULTS:   return "NO_MORE_RESULTS";
      41           0 :         case SUCCEED:           return "SUCCEED";
      42           0 :         case FAIL:              return "FAIL";
      43           0 :         default:
      44           0 :                 sprintf(unknown, "oops: %u ??", retcode);
      45             :         }
      46           0 :         return unknown;
      47             : }
      48             : 
      49             : static const char *
      50         202 : prretcode(int retcode)
      51             : {
      52             :         static char unknown[24];
      53         202 :         switch(retcode) {
      54             :         case SUCCEED:           return "SUCCEED";
      55           8 :         case FAIL:              return "FAIL";
      56         110 :         case NO_MORE_RESULTS:   return "NO_MORE_RESULTS";
      57           0 :         default:
      58           0 :                 sprintf(unknown, "oops: %u ??", retcode);
      59             :         }
      60           0 :         return unknown;
      61             : }
      62             : 
      63             : static void
      64          80 : query(const char comment[])
      65             : {
      66          80 :         if (comment)
      67          32 :                 printf("%s\n", comment);
      68          80 :         sql_cmd(dbproc);
      69          80 :         dbsqlexec(dbproc);
      70          80 :         while (dbresults(dbproc) == SUCCEED) {
      71             :                 /* nop */
      72             :         }
      73          80 : }
      74             : 
      75             : typedef const char* (*prfunc)(int);
      76             : 
      77             : static void
      78         406 : check_state(const char name[], prfunc print, int erc)
      79             : {
      80         406 :         printf("State %-15s %-20s ", name, print(erc));
      81         406 :         if (dbnumcols(dbproc) > 0)
      82         302 :                 printf("COLS(%d) ", dbnumcols(dbproc));
      83             :         /* row count */
      84         406 :         if (dbcount(dbproc) >= 0)
      85          70 :                 printf("ROWS(%d) ", (int) dbcount(dbproc));
      86         406 :         silent = 1;
      87         406 :         if (dbdata(dbproc, 1))
      88         104 :                 printf("DATA ");
      89         406 :         silent = 0;
      90             :         /* if status present */
      91         406 :         if (dbretstatus(dbproc) == TRUE)
      92           0 :                 printf("STATUS %d ", (int) dbretstatus(dbproc));
      93             :         /* if parameter present */
      94         406 :         if (dbnumrets(dbproc) > 0)
      95           8 :                 printf("PARAMS ");
      96             :         /*
      97             :          * if possible to send another query
      98             :          * NOTE this must be the last
      99             :          */
     100         406 :         if (check_idle) {
     101          48 :                 silent = 1;
     102          48 :                 dbcmd(dbproc, "declare @i int ");
     103          48 :                 if (FAIL != dbsqlexec(dbproc))
     104          16 :                         printf("IDLE ");
     105          48 :                 silent = 0;
     106             :         }
     107         406 :         printf("\n");
     108         406 : }
     109             : 
     110             : static void
     111          48 : do_test(const char comment[])
     112             : {
     113             :         int ret;
     114          48 :         prfunc print_with = NULL;
     115             : 
     116          48 :         if (comment)
     117          48 :                 printf("%s\n", comment);
     118          48 :         sql_cmd(dbproc);
     119             : 
     120          48 :         check_state("sqlexec ", prretcode, dbsqlexec(dbproc));
     121             : 
     122          48 :         check_state("nextrow ", prdbretcode, dbnextrow(dbproc));
     123          48 :         check_state("nextrow ", prdbretcode, dbnextrow(dbproc));
     124          48 :         check_state("results ", prretcode,   dbresults(dbproc));
     125          48 :         check_state("nextrow ", prdbretcode, dbnextrow(dbproc));
     126          48 :         check_state("nextrow ", prdbretcode, dbnextrow(dbproc));
     127             : 
     128          48 :         check_idle = 0;
     129             :         for (;;) {
     130          58 :                 ret = dbresults(dbproc);
     131          58 :                 check_state("results ", prretcode, ret);
     132          58 :                 if (ret != SUCCEED) {
     133          48 :                         print_with = prretcode;
     134             :                         break;
     135             :                 }
     136             : 
     137             :                 do {
     138          12 :                         ret = dbnextrow(dbproc);
     139          12 :                         check_state("nextrow ", prdbretcode, ret);
     140          12 :                 } while (ret == REG_ROW);
     141             :                 print_with = prdbretcode;
     142             :         }
     143          48 :         check_state("more results?", print_with, ret);
     144          48 : }
     145             : 
     146             : int
     147           8 : main(int argc, char *argv[])
     148             : {
     149             :         const static int invalid_column_name = 207;
     150             :         LOGINREC *login;        /* Our login information. */
     151             :         int i;
     152             : 
     153           8 :         setbuf(stdout, NULL);
     154           8 :         read_login_info(argc, argv);
     155             : 
     156           8 :         if (dbinit() == FAIL)
     157           0 :                 exit(1);
     158             : 
     159           8 :         dberrhandle(err_handler);
     160           8 :         dbmsghandle(msg_handler);
     161             : 
     162             : #if 0
     163             :         /* 
     164             :          * FIXME: Should be able to use the common err/msg handlers, but something about
     165             :          * the IDLE checking causes them to fail.  Not sure about purpose of IDLE checking.
     166             :          * -- jkl January 2009
     167             :          */
     168             :         dberrhandle(syb_err_handler);
     169             :         dbmsghandle(syb_msg_handler);
     170             : #endif
     171             : 
     172           8 :         login = dblogin();
     173           8 :         DBSETLUSER(login, USER);
     174           8 :         DBSETLPWD(login, PASSWORD);
     175           8 :         DBSETLAPP(login, __FILE__);
     176             : 
     177           8 :         dbproc = dbopen(login, SERVER);
     178           8 :         dbloginfree(login);
     179           8 :         if (!dbproc)
     180           0 :                 exit(1);
     181           8 :         if (strlen(DATABASE))
     182           8 :                 dbuse(dbproc, DATABASE);
     183             : 
     184          48 :         for (i=0; i < 6; i++)
     185          48 :                 query(NULL);
     186             : #if 0   
     187             :         check_state("setup done ", prretcode, erc);
     188             :         
     189             :         printf("wasting results\n");
     190             :         while ((erc = dbresults(dbproc)) == SUCCEED) {
     191             :                 while (dbnextrow(dbproc) == REG_ROW); /* no-op */
     192             :         }       
     193             : #endif
     194           8 :         check_idle = 1;
     195             : 
     196           8 :         do_test("normal row with rowcount on");
     197           8 :         query("turn rowcount off");
     198           8 :         do_test("normal row with rowcount off");
     199           8 :         query("turn rowcount back on");
     200           8 :         do_test("normal row without rows");
     201           8 :         dbsetuserdata(dbproc, (BYTE*) &invalid_column_name);
     202           8 :         do_test("error query");
     203           8 :         do_test("stored procedure call with output parameters");
     204             : 
     205           8 :         do_test("execute done2");
     206             : 
     207           8 :         query("drop done_test");
     208             : 
     209           8 :         query("drop done_test2");
     210             : 
     211           8 :         dbexit();
     212             :         return 0;
     213             : }
     214             : 
     215             : static int
     216          40 : err_handler(DBPROCESS * dbproc, int severity, int dberr, int oserr, char *dberrstr, char *oserrstr)
     217             : {
     218          40 :         if (silent)
     219             :                 return INT_CANCEL;
     220             : 
     221           8 :         fflush(stdout);
     222           8 :         fprintf(stderr, "DB-Library error (severity %d):\n\t%s\n", severity, dberrstr);
     223             : 
     224           8 :         if (oserr != DBNOERR)
     225           0 :                 fprintf(stderr, "Operating-system error:\n\t%s\n", oserrstr ? oserrstr : "(null)");
     226           8 :         fflush(stderr);
     227             : 
     228           8 :         return INT_CANCEL;
     229             : }
     230             : 
     231             : static int
     232          30 : msg_handler(DBPROCESS * dbproc, DBINT msgno, int msgstate, int severity, char *msgtext, char *srvname, char *procname, int line)
     233             : {
     234          30 :         if (silent)
     235             :                 return 0;
     236             : 
     237          30 :         fflush(stdout);
     238          30 :         fprintf(stderr, "Msg %d, Level %d, State %d\n", (int) msgno, severity, msgstate);
     239             : 
     240          30 :         if (strlen(srvname) > 0)
     241          30 :                 fprintf(stderr, "Server '%s', ", srvname);
     242          30 :         if (procname && strlen(procname) > 0) {
     243           0 :                 fprintf(stderr, "Procedure '%s', ", procname);
     244           0 :                 if (line > 0)
     245           0 :                         fprintf(stderr, "Line %d", line);
     246             :         }
     247             : 
     248          30 :         fprintf(stderr, "\n\t%s\n", msgtext);
     249          30 :         fflush(stderr);
     250             : 
     251          30 :         return 0;
     252             : }

Generated by: LCOV version 1.13