LCOV - code coverage report
Current view: top level - src/dblib/unittests - setnull.c (source / functions) Hit Total Coverage
Test: FreeTDS coverage Lines: 69 100 69.0 %
Date: 2025-02-21 09:36:06 Functions: 2 2 100.0 %

          Line data    Source code
       1             : /* 
       2             :  * Purpose: dbnull behavior
       3             :  */
       4             : 
       5             : #include "common.h"
       6             : #include <freetds/replacements.h>
       7             : 
       8             : static int failed = 0;
       9             : static DBPROCESS *dbproc = NULL;
      10             : 
      11             : static void
      12         100 : char_test(const char *null, int bindlen, const char *expected)
      13             : {
      14             :         char db_c[16];
      15             :         RETCODE ret;
      16             : 
      17         100 :         if (null) {
      18          70 :                 fprintf(stderr, "\tdbsetnull(CHARBIND, %u, '%s').\n", (unsigned int) strlen(null), null);
      19          70 :                 ret = dbsetnull(dbproc, CHARBIND, strlen(null), (BYTE *) null);
      20          70 :                 if (ret != SUCCEED) {
      21           0 :                         fprintf(stderr, "dbsetnull returned error %d\n", (int) ret);
      22           0 :                         failed = 1;
      23             :                 }
      24             :         }
      25             : 
      26         100 :         memset(db_c, '_', sizeof(db_c));
      27         100 :         strcpy(db_c, "123456");
      28         100 :         dbcmd(dbproc, "select convert(char(20), null)");
      29             : 
      30         100 :         dbsqlexec(dbproc);
      31             : 
      32         100 :         if (dbresults(dbproc) != SUCCEED) {
      33           0 :                 fprintf(stderr, "Was expecting a row.\n");
      34           0 :                 failed = 1;
      35           0 :                 dbcancel(dbproc);
      36             :         }
      37             : 
      38         100 :         fprintf(stderr, "dbbind(CHARBIND, bindlen= %d).\n", bindlen);
      39         100 :         dbbind(dbproc, 1, CHARBIND, bindlen, (BYTE *) &db_c);
      40         100 :         db_c[sizeof(db_c)-1] = 0;
      41         100 :         printf("buffer before/after dbnextrow: '%s'/", db_c);
      42             : 
      43         100 :         if (dbnextrow(dbproc) != REG_ROW) {
      44           0 :                 fprintf(stderr, "Was expecting a row.\n");
      45           0 :                 failed = 1;
      46           0 :                 dbcancel(dbproc);
      47             :         }
      48         100 :         db_c[sizeof(db_c)-1] = 0;
      49         100 :         printf("'%s'\n", db_c);
      50             : 
      51         100 :         if (dbnextrow(dbproc) != NO_MORE_ROWS) {
      52           0 :                 fprintf(stderr, "Only one row expected\n");
      53           0 :                 dbcancel(dbproc);
      54           0 :                 failed = 1;
      55             :         }
      56             : 
      57         100 :         while (dbresults(dbproc) == SUCCEED) {
      58             :                 /* nop */
      59             :         }
      60             : 
      61         100 :         if (strcmp(db_c, expected) != 0) {
      62           0 :                 fprintf(stderr, "Invalid NULL '%s' returned expected '%s' (%s:%d)\n", db_c, expected, basename(__FILE__), __LINE__);
      63           0 :                 failed = 1;
      64             :         }
      65         100 : }
      66             : 
      67             : int
      68          10 : main(int argc, char **argv)
      69             : {
      70             :         LOGINREC *login;
      71             :         DBINT db_i;
      72             :         RETCODE ret;
      73             :         
      74          10 :         read_login_info(argc, argv);
      75             : 
      76          10 :         printf("Starting %s\n", argv[0]);
      77          10 :         dbinit();
      78             : 
      79          10 :         dberrhandle(syb_err_handler);
      80          10 :         dbmsghandle(syb_msg_handler);
      81             : 
      82          10 :         login = dblogin();
      83          10 :         DBSETLPWD(login, PASSWORD);
      84          10 :         DBSETLUSER(login, USER);
      85          10 :         DBSETLAPP(login, "setnull");
      86             : 
      87             : 
      88          10 :         printf("About to open %s.%s\n", SERVER, DATABASE);
      89             : 
      90          10 :         dbproc = dbopen(login, SERVER);
      91          10 :         if (strlen(DATABASE))
      92          10 :                 dbuse(dbproc, DATABASE);
      93          10 :         dbloginfree(login);
      94             : 
      95             :         /* try to set an int */
      96          10 :         db_i = 0xdeadbeef;
      97          10 :         ret = dbsetnull(dbproc, INTBIND, 0, (BYTE *) &db_i);
      98          10 :         if (ret != SUCCEED) {
      99           0 :                 fprintf(stderr, "dbsetnull returned error %d\n", (int) ret);
     100           0 :                 failed = 1;
     101             :         }
     102             : 
     103          10 :         ret = dbsetnull(dbproc, INTBIND, 1, (BYTE *) &db_i);
     104          10 :         if (ret != SUCCEED) {
     105           0 :                 fprintf(stderr, "dbsetnull returned error %d\n", (int) ret);
     106           0 :                 failed = 1;
     107             :         }
     108             : 
     109             :         /* check result */
     110          10 :         db_i = 0;
     111          10 :         dbcmd(dbproc, "select convert(int, null)");
     112             : 
     113          10 :         dbsqlexec(dbproc);
     114             : 
     115          10 :         if (dbresults(dbproc) != SUCCEED) {
     116           0 :                 fprintf(stderr, "Was expecting a row.\n");
     117           0 :                 failed = 1;
     118           0 :                 dbcancel(dbproc);
     119             :         }
     120             : 
     121          10 :         dbbind(dbproc, 1, INTBIND, 0, (BYTE *) &db_i);
     122          10 :         printf("db_i = %ld\n", (long int) db_i);
     123             : 
     124          10 :         if (dbnextrow(dbproc) != REG_ROW) {
     125           0 :                 fprintf(stderr, "Was expecting a row.\n");
     126           0 :                 failed = 1;
     127           0 :                 dbcancel(dbproc);
     128             :         }
     129          10 :         printf("db_i = %ld\n", (long int) db_i);
     130             : 
     131          10 :         if (dbnextrow(dbproc) != NO_MORE_ROWS) {
     132           0 :                 fprintf(stderr, "Only one row expected\n");
     133           0 :                 dbcancel(dbproc);
     134           0 :                 failed = 1;
     135             :         }
     136             : 
     137          10 :         while (dbresults(dbproc) == SUCCEED) {
     138             :                 /* nop */
     139             :         }
     140             : 
     141          10 :         if (db_i != 0xdeadbeef) {
     142           0 :                 fprintf(stderr, "Invalid NULL %ld returned (%s:%d)\n", (long int) db_i, basename(__FILE__), __LINE__);
     143           0 :                 failed = 1;
     144             :         }
     145             : 
     146             :         /* try if dbset null consider length */
     147         320 :         for (db_i = 1; db_i > 0; db_i <<= 1) {
     148         310 :                 printf("db_i = %ld\n", (long int) db_i);
     149         310 :                 ret = dbsetnull(dbproc, INTBIND, db_i, (BYTE *) &db_i);
     150         310 :                 if (ret != SUCCEED) {
     151           0 :                         fprintf(stderr, "dbsetnull returned error %d for bindlen %ld\n", (int) ret, (long int) db_i);
     152           0 :                         failed = 1;
     153           0 :                         break;
     154             :                 }
     155             :         }
     156             : 
     157          10 :         char_test(NULL, -1, "123456");
     158          10 :         char_test(NULL, 0,  "123456");
     159          10 :         char_test(NULL, 2,  "  3456");
     160             : 
     161          10 :         char_test("foo", -1,  "foo456");
     162          10 :         char_test("foo", 0,   "foo456");
     163             : /*      char_test("foo", 2,   ""); */
     164          10 :         char_test("foo", 5,   "foo  6");
     165             : 
     166          10 :         char_test("foo ", -1,  "foo 56");
     167          10 :         char_test("foo ", 0,   "foo 56");
     168             : /*      char_test("foo ", 2,   ""); */
     169          10 :         char_test("foo ", 5,   "foo  6");
     170             : 
     171          10 :         char_test("foo ", 10,  "foo       _____");
     172             : 
     173          10 :         printf("dblib %s on %s\n", (failed ? "failed!" : "okay"), __FILE__);
     174          10 :         dbexit();
     175             : 
     176          10 :         return failed ? 1 : 0;
     177             : }

Generated by: LCOV version 1.13