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

Generated by: LCOV version 1.13