LTP GCOV extension - code coverage report
Current view: directory - dblib/unittests - bcp.c
Test: FreeTDS coverage
Date: 2008-11-21 Instrumented lines: 142
Code covered: 93.0 % Executed lines: 132

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

Generated by: LTP GCOV extension version 1.6