LCOV - code coverage report
Current view: top level - src/dblib/unittests - string_bind.c (source / functions) Hit Total Coverage
Test: FreeTDS coverage Lines: 86 100 86.0 %
Date: 2025-01-18 11:50:39 Functions: 2 2 100.0 %

          Line data    Source code
       1             : /*
       2             :  * Purpose: Test different string binding combinations.
       3             :  * Functions: dbbind
       4             :  */
       5             : 
       6             : #include "common.h"
       7             : 
       8             : static DBPROCESS *dbproc = NULL;
       9             : static int bind_len = -1;
      10             : static int expected_error = 0;
      11             : static const char *select_cmd = "select 'foo  '";
      12             : 
      13             : static void
      14         208 : test_row(int vartype, const char *vartype_name, const char *expected, int line)
      15             : {
      16             :         char str[11];
      17             :         int i;
      18             : 
      19         208 :         printf("%d: row type %s bind len %d\n", line, vartype_name, bind_len);
      20             : 
      21         208 :         if (dbcmd(dbproc, select_cmd) != SUCCEED) {
      22           0 :                 fprintf(stderr, "error: dbcmd\n");
      23           0 :                 exit(1);
      24             :         }
      25         208 :         dbsqlexec(dbproc);
      26             : 
      27         208 :         if (dbresults(dbproc) != SUCCEED) {
      28           0 :                 fprintf(stderr, "error: expected a result set, none returned.\n");
      29           0 :                 exit(1);
      30             :         }
      31             : 
      32         208 :         memset(str, '$', sizeof(str));
      33         208 :         str[sizeof(str) - 1] = 0;
      34         208 :         if (dbbind(dbproc, 1, vartype, bind_len, (BYTE *) str) != SUCCEED) {
      35           0 :                 fprintf(stderr, "Had problem with bind\n");
      36           0 :                 exit(1);
      37             :         }
      38         208 :         if (dbnextrow(dbproc) != REG_ROW) {
      39           0 :                 fprintf(stderr, "Failed.  Expected a row\n");
      40           0 :                 exit(1);
      41             :         }
      42             : 
      43         208 :         assert(str[sizeof(str) - 1] == 0);
      44         208 :         if (vartype == CHARBIND) {
      45             :                 /* not terminated space padded */
      46          72 :                 char *p = strchr(str, '$');
      47          72 :                 i = p ? p - str : sizeof(str);
      48             :         } else {
      49             :                 /* terminated */
      50         136 :                 char *p = strchr(str, 0);
      51         136 :                 i = p - str + 1;
      52             :         }
      53        1168 :         for (; i < sizeof(str)-1; ++i) {
      54        1168 :                 assert(str[i] == '$');
      55        1168 :                 str[i] = 0;
      56             :         }
      57             : 
      58         208 :         printf("str '%s'\n", str);
      59         208 :         if (strcmp(str, expected) != 0) {
      60           0 :                 fprintf(stderr, "Expected '%s' string\n", expected);
      61           0 :                 exit(1);
      62             :         }
      63             : 
      64         208 :         if (dbnextrow(dbproc) != NO_MORE_ROWS) {
      65           0 :                 fprintf(stderr, "Was expecting no more rows\n");
      66           0 :                 exit(1);
      67             :         }
      68         208 :         assert(expected_error == 0);
      69         208 : }
      70             : 
      71             : #define row(bind, expected) test_row(bind, #bind, expected, __LINE__)
      72             : 
      73             : int
      74           8 : main(int argc, char **argv)
      75             : {
      76             :         LOGINREC *login;
      77             : 
      78           8 :         set_malloc_options();
      79             : 
      80           8 :         read_login_info(argc, argv);
      81             : 
      82           8 :         printf("Starting %s\n", argv[0]);
      83             : 
      84           8 :         dbinit();
      85             : 
      86           8 :         dberrhandle(syb_err_handler);
      87           8 :         dbmsghandle(syb_msg_handler);
      88             : 
      89           8 :         printf("About to logon as \"%s\"\n", USER);
      90             : 
      91           8 :         login = dblogin();
      92           8 :         DBSETLPWD(login, PASSWORD);
      93           8 :         DBSETLUSER(login, USER);
      94           8 :         DBSETLAPP(login, "string_bind");
      95             : 
      96           8 :         printf("About to open \"%s\"\n", SERVER);
      97             : 
      98           8 :         dbproc = dbopen(login, SERVER);
      99           8 :         if (!dbproc) {
     100           0 :                 fprintf(stderr, "Unable to connect to %s\n", SERVER);
     101           0 :                 return 1;
     102             :         }
     103           8 :         dbloginfree(login);
     104             : 
     105           8 :         dbsetuserdata(dbproc, (BYTE*) &expected_error);
     106             : 
     107           8 :         row(NTBSTRINGBIND, "foo");
     108           8 :         row(STRINGBIND, "foo  ");
     109           8 :         row(CHARBIND, "foo  ");
     110             : 
     111           8 :         bind_len = 4;
     112           8 :         row(NTBSTRINGBIND, "foo");
     113           8 :         expected_error = SYBECOFL;
     114           8 :         row(STRINGBIND, "foo");
     115           8 :         expected_error = SYBECOFL;
     116           8 :         row(CHARBIND, "foo ");
     117             : 
     118           8 :         bind_len = 5;
     119           8 :         row(NTBSTRINGBIND, "foo");
     120           8 :         expected_error = SYBECOFL;
     121           8 :         row(STRINGBIND, "foo ");
     122           8 :         row(CHARBIND, "foo  ");
     123             : 
     124           8 :         bind_len = 8;
     125           8 :         row(NTBSTRINGBIND, "foo");
     126           8 :         row(STRINGBIND, "foo    ");
     127           8 :         row(CHARBIND, "foo     ");
     128             : 
     129           8 :         bind_len = 3;
     130           8 :         expected_error = SYBECOFL;
     131           8 :         row(NTBSTRINGBIND, "fo");
     132             : 
     133           8 :         select_cmd = "select 123";
     134             : 
     135           8 :         bind_len = -1;
     136           8 :         row(NTBSTRINGBIND, "123");
     137           8 :         row(STRINGBIND, "123");
     138           8 :         row(CHARBIND, "123");
     139             : 
     140           8 :         bind_len = 4;
     141           8 :         row(NTBSTRINGBIND, "123");
     142           8 :         row(STRINGBIND, "123");
     143           8 :         row(CHARBIND, "123 ");
     144             : 
     145           8 :         bind_len = 6;
     146           8 :         row(NTBSTRINGBIND, "123");
     147           8 :         row(STRINGBIND, "123  ");
     148           8 :         row(CHARBIND, "123   ");
     149             : 
     150           8 :         bind_len = 3;
     151           8 :         expected_error = SYBECOFL;
     152           8 :         row(NTBSTRINGBIND, "12");
     153           8 :         expected_error = SYBECOFL;
     154           8 :         row(STRINGBIND, "12");
     155           8 :         row(CHARBIND, "123");
     156             : 
     157           8 :         bind_len = 2;
     158           8 :         expected_error = SYBECOFL;
     159           8 :         row(CHARBIND, "12");
     160             : 
     161           8 :         dbclose(dbproc);
     162             : 
     163           8 :         dbexit();
     164           8 :         return 0;
     165             : }

Generated by: LCOV version 1.13