LCOV - code coverage report
Current view: top level - src/ctlib/unittests - t0002.c (source / functions) Hit Total Coverage
Test: FreeTDS coverage Lines: 78 144 54.2 %
Date: 2025-01-18 11:50:39 Functions: 2 2 100.0 %

          Line data    Source code
       1             : #include "common.h"
       2             : 
       3             : static int sp_who(CS_COMMAND *cmd);
       4             : 
       5             : /*
       6             :  * ct_send SQL |select name = @@servername|
       7             :  * ct_bind variable
       8             :  * ct_fetch and print results
       9             :  */
      10             : int
      11           8 : main(void)
      12             : {
      13             :         CS_CONTEXT *ctx;
      14             :         CS_CONNECTION *conn;
      15             :         CS_COMMAND *cmd;
      16           8 :         int verbose = 0;
      17             : 
      18             :         CS_RETCODE ret;
      19             :         CS_RETCODE results_ret;
      20             :         CS_DATAFMT datafmt;
      21             :         CS_INT datalength;
      22             :         CS_SMALLINT ind;
      23           8 :         CS_INT count, row_count = 0;
      24             :         CS_INT result_type;
      25             :         CS_CHAR name[256];
      26             : 
      27           8 :         printf("%s: Testing bind & select\n", __FILE__);
      28             :         if (verbose) {
      29             :                 printf("Trying login\n");
      30             :         }
      31           8 :         check_call(try_ctlogin, (&ctx, &conn, &cmd, verbose));
      32             : 
      33           8 :         check_call(ct_command, (cmd, CS_LANG_CMD, "select name = @@servername", CS_NULLTERM, CS_UNUSED));
      34           8 :         check_call(ct_send, (cmd));
      35          32 :         while ((results_ret = ct_results(cmd, &result_type)) == CS_SUCCEED) {
      36          16 :                 switch ((int) result_type) {
      37             :                 case CS_CMD_SUCCEED:
      38             :                         break;
      39             :                 case CS_CMD_DONE:
      40             :                         break;
      41           0 :                 case CS_CMD_FAIL:
      42           0 :                         fprintf(stderr, "ct_results() result_type CS_CMD_FAIL.\n");
      43           0 :                         return 1;
      44           8 :                 case CS_ROW_RESULT:
      45           8 :                         datafmt.datatype = CS_CHAR_TYPE;
      46           8 :                         datafmt.format = CS_FMT_NULLTERM;
      47           8 :                         datafmt.maxlength = 256;
      48           8 :                         datafmt.count = 1;
      49           8 :                         datafmt.locale = NULL;
      50           8 :                         check_call(ct_bind, (cmd, 1, &datafmt, name, &datalength, &ind));
      51             : 
      52          24 :                         while (((ret = ct_fetch(cmd, CS_UNUSED, CS_UNUSED, CS_UNUSED, &count)) == CS_SUCCEED)
      53           8 :                                || (ret == CS_ROW_FAIL)) {
      54           8 :                                 row_count += count;
      55           8 :                                 if (ret == CS_ROW_FAIL) {
      56           0 :                                         fprintf(stderr, "ct_fetch() CS_ROW_FAIL on row %d.\n", row_count);
      57           0 :                                         return 1;
      58           8 :                                 } else if (ret == CS_SUCCEED) {
      59             :                                         if (verbose) {
      60             :                                                 printf("server name = %s\n", name);
      61             :                                         }
      62             :                                 } else {
      63             :                                         break;
      64             :                                 }
      65             :                         }
      66           8 :                         switch ((int) ret) {
      67             :                         case CS_END_DATA:
      68             :                                 break;
      69           0 :                         case CS_FAIL:
      70           0 :                                 fprintf(stderr, "ct_fetch() returned CS_FAIL.\n");
      71           0 :                                 return 1;
      72           0 :                         default:
      73           0 :                                 fprintf(stderr, "ct_fetch() unexpected return.\n");
      74           0 :                                 return 1;
      75             :                         }
      76             :                         break;
      77           0 :                 case CS_COMPUTE_RESULT:
      78           0 :                         fprintf(stderr, "ct_results() unexpected CS_COMPUTE_RESULT.\n");
      79           0 :                         return 1;
      80           0 :                 default:
      81           0 :                         fprintf(stderr, "ct_results() unexpected result_type.\n");
      82           0 :                         return 1;
      83             :                 }
      84             :         }
      85           8 :         switch ((int) results_ret) {
      86             :         case CS_END_RESULTS:
      87             :                 break;
      88           0 :         case CS_FAIL:
      89           0 :                 fprintf(stderr, "ct_results() failed.\n");
      90           0 :                 return 1;
      91             :                 break;
      92           0 :         default:
      93           0 :                 fprintf(stderr, "ct_results() unexpected return.\n");
      94           0 :                 return 1;
      95             :         }
      96             : 
      97             :         /*
      98             :          * test parameter return code processing with sp_who
      99             :          */
     100           8 :         sp_who(cmd);
     101             : 
     102             :         if (verbose) {
     103             :                 printf("Trying logout\n");
     104             :         }
     105           8 :         check_call(try_ctlogout, (ctx, conn, cmd, verbose));
     106             : 
     107           8 :         return 0;
     108             : }
     109             : 
     110             : int 
     111           8 : sp_who(CS_COMMAND *cmd)
     112             : {
     113             :         enum {maxcol=10, colsize=260};
     114             :         
     115             :         struct _col { 
     116             :                 CS_DATAFMT datafmt;
     117             :                 CS_INT datalength;
     118             :                 CS_SMALLINT ind;
     119             :                 CS_CHAR data[colsize];
     120             :         } col[maxcol];
     121             :         
     122             :         CS_INT num_cols;
     123           8 :         CS_INT count, row_count = 0;
     124             :         CS_INT result_type;
     125             :         CS_RETCODE ret;
     126             :         CS_RETCODE results_ret;
     127             :         int i;
     128           8 :         int is_status_result=0;
     129             : 
     130           8 :         ret = ct_command(cmd, CS_LANG_CMD, "exec sp_who", CS_NULLTERM, CS_UNUSED);
     131           8 :         if (ret != CS_SUCCEED) {
     132           0 :                 fprintf(stderr, "ct_command: \"exec sp_who\" failed with %d\n", ret);
     133           0 :                 return 1;
     134             :         }
     135           8 :         ret = ct_send(cmd);
     136           8 :         if (ret != CS_SUCCEED) {
     137           0 :                 fprintf(stderr, "ct_send: \"exec sp_who\" failed with %d\n", ret);
     138           0 :                 return 1;
     139             :         }
     140          56 :         while ((results_ret = ct_results(cmd, &result_type)) == CS_SUCCEED) {
     141          48 :                 is_status_result = 0;
     142          48 :                 switch ((int) result_type) {
     143             :                 case CS_CMD_SUCCEED:
     144             :                         break;
     145             :                 case CS_CMD_DONE:
     146             :                         break;
     147           0 :                 case CS_CMD_FAIL:
     148           0 :                         fprintf(stderr, "ct_results() result_type CS_CMD_FAIL.\n");
     149           0 :                         return 1;
     150           8 :                 case CS_STATUS_RESULT:
     151           8 :                         printf("ct_results: CS_STATUS_RESULT detected for sp_who\n");
     152           8 :                         is_status_result = 1;
     153             :                         /* fall through */
     154          16 :                 case CS_ROW_RESULT:
     155          16 :                         ret = ct_res_info(cmd, CS_NUMDATA, &num_cols, CS_UNUSED, NULL);
     156          16 :                         if (ret != CS_SUCCEED || num_cols > maxcol) {
     157           0 :                                 fprintf(stderr, "ct_res_info() failed\n");
     158           0 :                                 return 1;
     159             :                         }
     160             : 
     161          16 :                         if (num_cols <= 0) {
     162           0 :                                 fprintf(stderr, "ct_res_info() return strange values\n");
     163           0 :                                 return 1;
     164             :                         }
     165             : 
     166          16 :                         if (is_status_result && num_cols != 1) {
     167           0 :                                 fprintf(stderr, "CS_STATUS_RESULT return more than 1 column\n");
     168           0 :                                 return 1;
     169             :                         }
     170             :                         
     171          96 :                         for (i=0; i < num_cols; i++) {
     172             : 
     173             :                                 /* here we can finally test for the return status column */
     174          80 :                                 ret = ct_describe(cmd, i+1, &col[i].datafmt);
     175             :                                 
     176          80 :                                 if (ret != CS_SUCCEED) {
     177           0 :                                         fprintf(stderr, "ct_describe() failed for column %d\n", i);
     178           0 :                                         return 1;
     179             :                                 }
     180             : 
     181          80 :                                 if (col[i].datafmt.status & CS_RETURN) {
     182           0 :                                         printf("ct_describe() indicates a return code in column %d for sp_who\n", i);
     183             :                                         
     184             :                                         /*
     185             :                                          * other possible values:
     186             :                                          * CS_CANBENULL
     187             :                                          * CS_HIDDEN
     188             :                                          * CS_IDENTITY
     189             :                                          * CS_KEY
     190             :                                          * CS_VERSION_KEY
     191             :                                          * CS_TIMESTAMP
     192             :                                          * CS_UPDATABLE
     193             :                                          * CS_UPDATECOL
     194             :                                          */
     195             :                                 }
     196             :                                 
     197          80 :                                 col[i].datafmt.datatype = CS_CHAR_TYPE;
     198          80 :                                 col[i].datafmt.format = CS_FMT_NULLTERM;
     199          80 :                                 col[i].datafmt.maxlength = colsize;
     200          80 :                                 col[i].datafmt.count = 1;
     201          80 :                                 col[i].datafmt.locale = NULL;
     202             : 
     203          80 :                                 ret = ct_bind(cmd, i+1, &col[i].datafmt, &col[i].data, &col[i].datalength, &col[i].ind);
     204          80 :                                 if (ret != CS_SUCCEED) {
     205           0 :                                         fprintf(stderr, "ct_bind() failed\n");
     206           0 :                                         return 1;
     207             :                                 }
     208             :                                 
     209             :                         }
     210             : 
     211             :                         row_count = 0;
     212         180 :                         while ((ret = ct_fetch(cmd, CS_UNUSED, CS_UNUSED, CS_UNUSED, &count)) == CS_SUCCEED) {
     213         164 :                                 if( row_count == 0) { /* titles */
     214          80 :                                         for (i=0; i < num_cols; i++) {
     215             :                                                 char fmt[40];
     216          80 :                                                 if (col[i].datafmt.namelen == 0) {
     217           8 :                                                         printf("unnamed%d ",i+1);
     218           8 :                                                         continue;
     219             :                                                 }
     220          72 :                                                 sprintf(fmt, "%%-%d.%ds  ", col[i].datafmt.namelen, col[i].datafmt.maxlength);
     221          72 :                                                 printf(fmt, col[i].datafmt.name);
     222             :                                         }
     223          16 :                                         printf("\n");
     224             :                                 }
     225             :                                 
     226        1405 :                                 for (i=0; i < num_cols; i++) { /* data */
     227             :                                         char fmt[40];
     228        1405 :                                         if (col[i].ind)
     229          82 :                                                 continue;
     230        1323 :                                         sprintf(fmt, "%%-%d.%ds  ", col[i].datalength, col[i].datafmt.maxlength);
     231        1323 :                                         printf(fmt, col[i].data);
     232        1323 :                                         if (is_status_result && strcmp(col[i].data,"0")) {
     233           0 :                                                 fprintf(stderr, "CS_STATUS_RESULT should return 0 as result\n");
     234           0 :                                                 return 1;
     235             :                                         }
     236             :                                 }
     237             : 
     238         164 :                                 printf("\n");
     239             : 
     240         164 :                                 row_count += count;
     241             :                         }
     242          16 :                         if (is_status_result && row_count != 1) {
     243           0 :                                 fprintf(stderr, "CS_STATUS_RESULT should return a row\n");
     244           0 :                                 return 1;
     245             :                         }
     246             :                         
     247          16 :                         switch ((int) ret) {
     248          16 :                         case CS_END_DATA:
     249          16 :                                 printf("ct_results fetched %d rows.\n", row_count);
     250             :                                 break;
     251           0 :                         case CS_ROW_FAIL:
     252           0 :                                 fprintf(stderr, "ct_fetch() CS_ROW_FAIL on row %d.\n", row_count);
     253           0 :                                 return 1;
     254           0 :                         case CS_FAIL:
     255           0 :                                 fprintf(stderr, "ct_fetch() returned CS_FAIL.\n");
     256           0 :                                 return 1;
     257           0 :                         default:
     258           0 :                                 fprintf(stderr, "ct_fetch() unexpected return.\n");
     259           0 :                                 return 1;
     260             :                         }
     261          16 :                         break;
     262           0 :                 case CS_COMPUTE_RESULT:
     263           0 :                         fprintf(stderr, "ct_results() unexpected CS_COMPUTE_RESULT.\n");
     264           0 :                         return 1;
     265           0 :                 default:
     266           0 :                         fprintf(stderr, "ct_results() unexpected result_type.\n");
     267           0 :                         return 1;
     268             :                 }
     269             :         }
     270             :         
     271           8 :         switch ((int) results_ret) {
     272             :         case CS_END_RESULTS:
     273             :                 break;
     274           0 :         case CS_FAIL:
     275           0 :                 fprintf(stderr, "ct_results() failed.\n");
     276           0 :                 return 1;
     277             :                 break;
     278           0 :         default:
     279           0 :                 fprintf(stderr, "ct_results() unexpected return.\n");
     280           0 :                 return 1;
     281             :         }
     282             :         
     283             :         return 0;
     284             : }

Generated by: LCOV version 1.13