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-05-05 12:32:54 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, (int) 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          10 : TEST_MAIN()
      68             : {
      69             :         LOGINREC *login;
      70             :         DBINT db_i;
      71             :         RETCODE ret;
      72             :         
      73          10 :         read_login_info(argc, argv);
      74             : 
      75          10 :         printf("Starting %s\n", argv[0]);
      76          10 :         dbinit();
      77             : 
      78          10 :         dberrhandle(syb_err_handler);
      79          10 :         dbmsghandle(syb_msg_handler);
      80             : 
      81          10 :         login = dblogin();
      82          10 :         DBSETLPWD(login, PASSWORD);
      83          10 :         DBSETLUSER(login, USER);
      84          10 :         DBSETLAPP(login, "setnull");
      85             : 
      86             : 
      87          10 :         printf("About to open %s.%s\n", SERVER, DATABASE);
      88             : 
      89          10 :         dbproc = dbopen(login, SERVER);
      90          10 :         if (strlen(DATABASE))
      91          10 :                 dbuse(dbproc, DATABASE);
      92          10 :         dbloginfree(login);
      93             : 
      94             :         /* try to set an int */
      95          10 :         db_i = 0xdeadbeef;
      96          10 :         ret = dbsetnull(dbproc, INTBIND, 0, (BYTE *) &db_i);
      97          10 :         if (ret != SUCCEED) {
      98           0 :                 fprintf(stderr, "dbsetnull returned error %d\n", (int) ret);
      99           0 :                 failed = 1;
     100             :         }
     101             : 
     102          10 :         ret = dbsetnull(dbproc, INTBIND, 1, (BYTE *) &db_i);
     103          10 :         if (ret != SUCCEED) {
     104           0 :                 fprintf(stderr, "dbsetnull returned error %d\n", (int) ret);
     105           0 :                 failed = 1;
     106             :         }
     107             : 
     108             :         /* check result */
     109          10 :         db_i = 0;
     110          10 :         dbcmd(dbproc, "select convert(int, null)");
     111             : 
     112          10 :         dbsqlexec(dbproc);
     113             : 
     114          10 :         if (dbresults(dbproc) != SUCCEED) {
     115           0 :                 fprintf(stderr, "Was expecting a row.\n");
     116           0 :                 failed = 1;
     117           0 :                 dbcancel(dbproc);
     118             :         }
     119             : 
     120          10 :         dbbind(dbproc, 1, INTBIND, 0, (BYTE *) &db_i);
     121          10 :         printf("db_i = %ld\n", (long int) db_i);
     122             : 
     123          10 :         if (dbnextrow(dbproc) != REG_ROW) {
     124           0 :                 fprintf(stderr, "Was expecting a row.\n");
     125           0 :                 failed = 1;
     126           0 :                 dbcancel(dbproc);
     127             :         }
     128          10 :         printf("db_i = %ld\n", (long int) db_i);
     129             : 
     130          10 :         if (dbnextrow(dbproc) != NO_MORE_ROWS) {
     131           0 :                 fprintf(stderr, "Only one row expected\n");
     132           0 :                 dbcancel(dbproc);
     133           0 :                 failed = 1;
     134             :         }
     135             : 
     136          10 :         while (dbresults(dbproc) == SUCCEED) {
     137             :                 /* nop */
     138             :         }
     139             : 
     140          10 :         if (db_i != 0xdeadbeef) {
     141           0 :                 fprintf(stderr, "Invalid NULL %ld returned (%s:%d)\n", (long int) db_i, basename(__FILE__), __LINE__);
     142           0 :                 failed = 1;
     143             :         }
     144             : 
     145             :         /* try if dbset null consider length */
     146         320 :         for (db_i = 1; db_i > 0; db_i <<= 1) {
     147         310 :                 printf("db_i = %ld\n", (long int) db_i);
     148         310 :                 ret = dbsetnull(dbproc, INTBIND, db_i, (BYTE *) &db_i);
     149         310 :                 if (ret != SUCCEED) {
     150           0 :                         fprintf(stderr, "dbsetnull returned error %d for bindlen %ld\n", (int) ret, (long int) db_i);
     151           0 :                         failed = 1;
     152           0 :                         break;
     153             :                 }
     154             :         }
     155             : 
     156          10 :         char_test(NULL, -1, "123456");
     157          10 :         char_test(NULL, 0,  "123456");
     158          10 :         char_test(NULL, 2,  "  3456");
     159             : 
     160          10 :         char_test("foo", -1,  "foo456");
     161          10 :         char_test("foo", 0,   "foo456");
     162             : /*      char_test("foo", 2,   ""); */
     163          10 :         char_test("foo", 5,   "foo  6");
     164             : 
     165          10 :         char_test("foo ", -1,  "foo 56");
     166          10 :         char_test("foo ", 0,   "foo 56");
     167             : /*      char_test("foo ", 2,   ""); */
     168          10 :         char_test("foo ", 5,   "foo  6");
     169             : 
     170          10 :         char_test("foo ", 10,  "foo       _____");
     171             : 
     172          10 :         printf("dblib %s on %s\n", (failed ? "failed!" : "okay"), __FILE__);
     173          10 :         dbexit();
     174             : 
     175          10 :         return failed ? 1 : 0;
     176             : }

Generated by: LCOV version 1.13