LCOV - code coverage report
Current view: top level - src/dblib/unittests - bcp.c (source / functions) Hit Total Coverage
Test: FreeTDS coverage Lines: 134 152 88.2 %
Date: 2025-01-18 12:13:41 Functions: 3 3 100.0 %

          Line data    Source code
       1             : /* 
       2             :  * Purpose: Test bcp functions
       3             :  * Functions: bcp_batch bcp_bind bcp_done bcp_init bcp_sendrow 
       4             :  */
       5             : 
       6             : #include "common.h"
       7             : 
       8             : #include <assert.h>
       9             : 
      10             : #if HAVE_SYS_STAT_H
      11             : #include <sys/stat.h>
      12             : #endif /* HAVE_SYS_STAT_H */
      13             : 
      14             : #include "bcp.h"
      15             : 
      16             : static char cmd[1024];
      17             : static int init(DBPROCESS * dbproc, const char *name);
      18             : static void test_bind(DBPROCESS * dbproc);
      19             : 
      20             : /*
      21             :  * Static data for insertion
      22             :  */
      23             : static int not_null_bit = 1;
      24             : static char not_null_char[] = "a char";
      25             : static char not_null_varchar[] = "a varchar";
      26             : static char not_null_datetime[]                 = "Dec 17 2003  3:44PM";
      27             : static char not_null_smalldatetime[]    = "Dec 17 2003  3:44PM";
      28             : static char not_null_money[] = "12.34";
      29             : static char not_null_smallmoney[] = "12.34";
      30             : static char not_null_float[] = "12.34";
      31             : static char not_null_real[] = "12.34";
      32             : static char not_null_decimal[] = "12.34";
      33             : static char not_null_numeric[] = "12.34";
      34             : static int not_null_int        = 1234;
      35             : static int not_null_smallint   = 1234;
      36             : static int not_null_tinyint    = 123;
      37             : 
      38             : 
      39             : static int
      40           8 : init(DBPROCESS * dbproc, const char *name)
      41             : {
      42           8 :         int res = 0;
      43             :         RETCODE rc;
      44             : 
      45           8 :         printf("Dropping %s.%s..%s\n", SERVER, DATABASE, name);
      46           8 :         sql_cmd(dbproc);
      47           8 :         dbsqlexec(dbproc);
      48           8 :         while ((rc=dbresults(dbproc)) == SUCCEED) {
      49             :                 /* nop */
      50             :         }
      51           8 :         if (rc != NO_MORE_RESULTS)
      52             :                 return 1;
      53             : 
      54           8 :         printf("Creating %s.%s..%s\n", SERVER, DATABASE, name);
      55           8 :         sql_cmd(dbproc);
      56           8 :         sql_cmd(dbproc);
      57             : 
      58           8 :         if (dbsqlexec(dbproc) == FAIL) {
      59           0 :                 res = 1;
      60             :         }
      61          48 :         while ((rc=dbresults(dbproc)) == SUCCEED) {
      62          40 :                 dbprhead(dbproc);
      63          40 :                 dbprrow(dbproc);
      64          80 :                 while ((rc=dbnextrow(dbproc)) == REG_ROW) {
      65           0 :                         dbprrow(dbproc);
      66             :                 }
      67             :         }
      68           8 :         if (rc != NO_MORE_RESULTS)
      69             :                 return 1;
      70           8 :         printf("%s\n", res? "error" : "ok");
      71           8 :         return res;
      72             : }
      73             : 
      74             : #define VARCHAR_BIND(x) \
      75             :         bcp_bind( dbproc, (unsigned char *) &x, prefixlen, strlen(x), NULL, termlen, SYBVARCHAR, col++ )
      76             : 
      77             : #define INT_BIND(x) \
      78             :         bcp_bind( dbproc, (unsigned char *) &x, prefixlen, -1, NULL, termlen, SYBINT4,    col++ )
      79             : 
      80             : #define NULL_BIND(x, type) \
      81             :         bcp_bind( dbproc, (unsigned char *) &x, prefixlen, 0, NULL, termlen, type,    col++ )
      82             : 
      83             : static void
      84           8 : test_bind(DBPROCESS * dbproc)
      85             : {
      86             :         enum { prefixlen = 0 };
      87             :         enum { termlen = 0 };
      88             :         enum NullValue { IsNull, IsNotNull };
      89             : 
      90             :         RETCODE fOK;
      91           8 :         int col=1;
      92             : 
      93             :         /* non nulls */
      94           8 :         fOK = INT_BIND(not_null_bit);
      95           8 :         assert(fOK == SUCCEED); 
      96             : 
      97           8 :         fOK = VARCHAR_BIND(not_null_char);
      98           8 :         assert(fOK == SUCCEED); 
      99           8 :         fOK = VARCHAR_BIND(not_null_varchar);
     100           8 :         assert(fOK == SUCCEED); 
     101             : 
     102           8 :         fOK = VARCHAR_BIND(not_null_datetime);
     103           8 :         assert(fOK == SUCCEED); 
     104           8 :         fOK = VARCHAR_BIND(not_null_smalldatetime);
     105           8 :         assert(fOK == SUCCEED); 
     106             : 
     107           8 :         fOK = VARCHAR_BIND(not_null_money);
     108           8 :         assert(fOK == SUCCEED); 
     109           8 :         fOK = VARCHAR_BIND(not_null_smallmoney);
     110           8 :         assert(fOK == SUCCEED); 
     111             : 
     112           8 :         fOK = VARCHAR_BIND(not_null_float);
     113           8 :         assert(fOK == SUCCEED); 
     114           8 :         fOK = VARCHAR_BIND(not_null_real);
     115           8 :         assert(fOK == SUCCEED); 
     116             : 
     117           8 :         fOK = VARCHAR_BIND(not_null_decimal);
     118           8 :         assert(fOK == SUCCEED); 
     119           8 :         fOK = VARCHAR_BIND(not_null_numeric);
     120           8 :         assert(fOK == SUCCEED); 
     121             : 
     122           8 :         fOK = INT_BIND(not_null_int);
     123           8 :         assert(fOK == SUCCEED); 
     124           8 :         fOK = INT_BIND(not_null_smallint);
     125           8 :         assert(fOK == SUCCEED); 
     126           8 :         fOK = INT_BIND(not_null_tinyint);
     127           8 :         assert(fOK == SUCCEED); 
     128             : 
     129             :         /* nulls */
     130           8 :         fOK = NULL_BIND(not_null_char, SYBVARCHAR);
     131           8 :         assert(fOK == SUCCEED); 
     132           8 :         fOK = NULL_BIND(not_null_varchar, SYBVARCHAR);
     133           8 :         assert(fOK == SUCCEED); 
     134             : 
     135           8 :         fOK = NULL_BIND(not_null_datetime, SYBVARCHAR);
     136           8 :         assert(fOK == SUCCEED); 
     137           8 :         fOK = NULL_BIND(not_null_smalldatetime, SYBVARCHAR);
     138           8 :         assert(fOK == SUCCEED); 
     139             : 
     140           8 :         fOK = NULL_BIND(not_null_money, SYBVARCHAR);
     141           8 :         assert(fOK == SUCCEED); 
     142           8 :         fOK = NULL_BIND(not_null_smallmoney, SYBVARCHAR);
     143           8 :         assert(fOK == SUCCEED); 
     144             : 
     145           8 :         fOK = NULL_BIND(not_null_float, SYBVARCHAR);
     146           8 :         assert(fOK == SUCCEED); 
     147           8 :         fOK = NULL_BIND(not_null_real, SYBVARCHAR);
     148           8 :         assert(fOK == SUCCEED); 
     149             : 
     150           8 :         fOK = NULL_BIND(not_null_decimal, SYBVARCHAR);
     151           8 :         assert(fOK == SUCCEED); 
     152           8 :         fOK = NULL_BIND(not_null_numeric, SYBVARCHAR);
     153           8 :         assert(fOK == SUCCEED); 
     154             : 
     155           8 :         fOK = NULL_BIND(not_null_int, SYBINT4);
     156           8 :         assert(fOK == SUCCEED); 
     157           8 :         fOK = NULL_BIND(not_null_smallint, SYBINT4);
     158           8 :         assert(fOK == SUCCEED); 
     159           8 :         fOK = NULL_BIND(not_null_tinyint, SYBINT4);
     160           8 :         assert(fOK == SUCCEED); 
     161             : 
     162           8 : }
     163             : 
     164             : int
     165           8 : main(int argc, char **argv)
     166             : {
     167             :         LOGINREC *login;
     168             :         DBPROCESS *dbproc;
     169           8 :         int i, rows_sent=0;
     170             :         const char *s;
     171           8 :         const char *table_name = "all_types_bcp_unittest";
     172             : 
     173           8 :         set_malloc_options();
     174             : 
     175           8 :         read_login_info(argc, argv);
     176             : 
     177           8 :         printf("Starting %s\n", argv[0]);
     178             : 
     179           8 :         dbsetversion(DBVERSION_100);
     180           8 :         dbinit();
     181             : 
     182           8 :         dberrhandle(syb_err_handler);
     183           8 :         dbmsghandle(syb_msg_handler);
     184             : 
     185           8 :         printf("About to logon\n");
     186             : 
     187           8 :         login = dblogin();
     188           8 :         DBSETLPWD(login, PASSWORD);
     189           8 :         DBSETLUSER(login, USER);
     190           8 :         DBSETLAPP(login, "bcp.c unit test");
     191           8 :         BCP_SETL(login, 1);
     192             : 
     193           8 :         printf("About to open %s.%s\n", SERVER, DATABASE);
     194             : 
     195           8 :         dbproc = dbopen(login, SERVER);
     196           8 :         if (strlen(DATABASE))
     197           8 :                 dbuse(dbproc, DATABASE);
     198           8 :         dbloginfree(login);
     199             : 
     200           8 :         if (init(dbproc, table_name))
     201           0 :                 exit(1);
     202             : 
     203             :         /* set up and send the bcp */
     204           8 :         sprintf(cmd, "%s..%s", DATABASE, table_name);
     205           8 :         printf("preparing to insert into %s ... ", cmd);
     206           8 :         if (bcp_init(dbproc, cmd, NULL, NULL, DB_IN) == FAIL) {
     207           0 :                 fprintf(stderr, "failed\n");
     208           0 :                 exit(1);
     209             :         }
     210           8 :         printf("OK\n");
     211             : 
     212           8 :         test_bind(dbproc);
     213             : 
     214           8 :         printf("Sending same row 10 times... \n");
     215          88 :         for (i=0; i<10; i++) {
     216          80 :                 if (bcp_sendrow(dbproc) == FAIL) {
     217           0 :                         fprintf(stderr, "send failed\n");
     218           0 :                         exit(1);
     219             :                 }
     220             :         }
     221             :         
     222           8 :         printf("Sending 5 more rows ... \n");
     223         112 :         for (i=15; i <= 27; i++) {
     224         104 :                 int type = dbcoltype(dbproc, i);
     225         104 :                 int len = (type == SYBCHAR || type == SYBVARCHAR)? dbcollen(dbproc, i) : -1;
     226         104 :                 if (bcp_collen(dbproc, len, i) == FAIL) {
     227           0 :                         fprintf(stderr, "bcp_collen failed for column %d\n", i);
     228           0 :                         exit(1);
     229             :                 }
     230             :         }
     231          40 :         for (i=0; i<5; i++) {
     232          40 :                 if (bcp_sendrow(dbproc) == FAIL) {
     233           0 :                         fprintf(stderr, "send failed\n");
     234           0 :                         exit(1);
     235             :                 }
     236             :         }
     237             : #if 1
     238           8 :         rows_sent = bcp_batch(dbproc);
     239           8 :         if (rows_sent == -1) {
     240           0 :                 fprintf(stderr, "batch failed\n");
     241           0 :                 exit(1);
     242             :         }
     243             : #endif
     244             : 
     245           8 :         printf("OK\n");
     246             : 
     247             :         /* end bcp.  */
     248           8 :         if ((rows_sent += bcp_done(dbproc)) == -1)
     249           0 :             printf("Bulk copy unsuccessful.\n");
     250             :         else
     251           8 :             printf("%d rows copied.\n", rows_sent);
     252             : 
     253             : 
     254           8 :         printf("done\n");
     255             : 
     256             : 
     257             : #if 1
     258           8 :         sql_cmd(dbproc);
     259             : 
     260           8 :         dbsqlexec(dbproc);
     261          24 :         while ((i=dbresults(dbproc)) == SUCCEED) {
     262           8 :                 dbprhead(dbproc);
     263           8 :                 dbprrow(dbproc);
     264          16 :                 while ((i=dbnextrow(dbproc)) == REG_ROW) {
     265           0 :                         dbprrow(dbproc);
     266             :                 }
     267             :         }
     268             : #endif
     269             : 
     270             : #ifdef DB_QUERYOUT
     271             :         /* test initializing with a very long query and DB_QUERYOUT */
     272           8 :         if (bcp_init(dbproc, select_table_sql, NULL, NULL, DB_QUERYOUT) == FAIL) {
     273           0 :                 fprintf(stderr, "failed\n");
     274           0 :                 exit(1);
     275             :         }
     276           8 :         bcp_done(dbproc);
     277           8 :         printf("OK\n");
     278             : #endif
     279             : 
     280           8 :         if ((s = getenv("BCP")) != NULL && 0 == strcmp(s, "nodrop")) {
     281           0 :                 printf("BCP=nodrop: '%s..%s' kept\n", DATABASE, table_name);
     282             :         } else {
     283           8 :                 printf("Dropping table %s\n", table_name);
     284           8 :                 sql_cmd(dbproc);
     285           8 :                 dbsqlexec(dbproc);
     286           8 :                 while (dbresults(dbproc) != NO_MORE_RESULTS) {
     287             :                         /* nop */
     288             :                 }
     289             :         }
     290           8 :         dbexit();
     291             : 
     292           8 :         printf("%s OK\n", __FILE__);
     293             :         return 0;
     294             : }

Generated by: LCOV version 1.13