LCOV - code coverage report
Current view: top level - src/ctlib/unittests - ct_cursors.c (source / functions) Hit Total Coverage
Test: FreeTDS coverage Lines: 124 225 55.1 %
Date: 2025-01-18 12:13:41 Functions: 1 1 100.0 %

          Line data    Source code
       1             : #include <config.h>
       2             : 
       3             : #include <stdio.h>
       4             : 
       5             : #ifdef HAVE_STRING_H
       6             : #include <string.h>
       7             : #endif
       8             : 
       9             : #include <ctpublic.h>
      10             : #include "common.h"
      11             : 
      12             : int
      13           8 : main(int argc, char **argv)
      14             : {
      15             :         CS_CONTEXT *ctx;
      16             :         CS_CONNECTION *conn;
      17             :         CS_COMMAND *cmd;
      18             :         CS_COMMAND *cmd2;
      19             :         CS_COMMAND *cmd3;
      20             :         CS_RETCODE ret;
      21             :         CS_RETCODE ret2;
      22             :         CS_RETCODE results_ret;
      23             :         CS_INT result_type;
      24           8 :         CS_INT count, count2, row_count = 0;
      25             :         CS_DATAFMT datafmt;
      26             :         CS_DATAFMT datafmt2;
      27             :         CS_SMALLINT ind;
      28           8 :         int verbose = 1;
      29           8 :         CS_CHAR *name = "c1";
      30           8 :         CS_CHAR *name2 = "c2";
      31             :         CS_CHAR col1[6];
      32             :         CS_CHAR col2[6];
      33             :         CS_INT datalength;
      34             :         CS_CHAR text[128];
      35             :         CS_INT num_cols, i;
      36             : 
      37           8 :         memset(col1, 0, sizeof(col1));
      38           8 :         memset(col2, 0, sizeof(col2));
      39             : 
      40           8 :         printf("%s: use multiple cursors on the same connection\n", __FILE__);
      41             : 
      42             :         if (verbose) {
      43           8 :                 printf("Trying login\n");
      44             :         }
      45           8 :         ret = try_ctlogin(&ctx, &conn, &cmd, verbose);
      46           8 :         if (ret != CS_SUCCEED) {
      47           0 :                 fprintf(stderr, "Login failed\n");
      48           0 :                 return 1;
      49             :         }
      50             : 
      51           8 :         ret = ct_cmd_alloc(conn, &cmd2);
      52           8 :         if (ret != CS_SUCCEED) {
      53             :                 if (verbose) {
      54           0 :                         fprintf(stderr, "Command Alloc failed!\n");
      55             :                 }
      56           0 :                 return ret;
      57             :         }
      58             : 
      59           8 :         ret = ct_cmd_alloc(conn, &cmd3);
      60           8 :         if (ret != CS_SUCCEED) {
      61             :                 if (verbose) {
      62           0 :                         fprintf(stderr, "Command Alloc failed!\n");
      63             :                 }
      64           0 :                 return ret;
      65             :         }
      66             : 
      67           8 :         ret = run_command(cmd, "CREATE TABLE #test_table (col1 char(4))");
      68           8 :         if (ret != CS_SUCCEED)
      69             :                 return 1;
      70             : 
      71           8 :         ret = run_command(cmd, "INSERT #test_table (col1) VALUES ('AAA')");
      72           8 :         if (ret != CS_SUCCEED)
      73             :                 return 1;
      74           8 :         ret = run_command(cmd, "INSERT #test_table (col1) VALUES ('BBB')");
      75           8 :         if (ret != CS_SUCCEED)
      76             :                 return 1;
      77           8 :         ret = run_command(cmd, "INSERT #test_table (col1) VALUES ('CCC')");
      78           8 :         if (ret != CS_SUCCEED)
      79             :                 return 1;
      80             : 
      81           8 :         ret = run_command(cmd, "CREATE TABLE #test_table2 (col1 char(4))");
      82           8 :         if (ret != CS_SUCCEED)
      83             :                 return 1;
      84             : 
      85           8 :         ret = run_command(cmd, "INSERT #test_table2 (col1) VALUES ('XXX')");
      86           8 :         if (ret != CS_SUCCEED)
      87             :                 return 1;
      88             : 
      89           8 :         ret = run_command(cmd, "INSERT #test_table2 (col1) VALUES ('YYY')");
      90           8 :         if (ret != CS_SUCCEED)
      91             :                 return 1;
      92             : 
      93           8 :         ret = run_command(cmd, "INSERT #test_table2 (col1) VALUES ('ZZZ')");
      94             : 
      95             : 
      96           8 :         if (ret != CS_SUCCEED)
      97             :                 return 1;
      98             : 
      99             : 
     100             :         if (verbose) {
     101           8 :                 printf("opening first cursor on connection\n");
     102             :         }
     103             : 
     104           8 :         strcpy(text, "select col1 from #test_table order by col1");
     105             : 
     106           8 :         ret = ct_cursor(cmd, CS_CURSOR_DECLARE, name, CS_NULLTERM, text, CS_NULLTERM, CS_UNUSED);
     107             : 
     108           8 :         if (ret != CS_SUCCEED) {
     109           0 :                 fprintf(stderr, "ct_cursor declare failed\n");
     110           0 :                 return 1;
     111             :         }
     112             : 
     113           8 :         ret = ct_cursor(cmd, CS_CURSOR_ROWS, name, CS_NULLTERM, NULL, CS_UNUSED, (CS_INT) 1);
     114           8 :         if (ret != CS_SUCCEED) {
     115           0 :                 fprintf(stderr, "ct_cursor set cursor rows failed");
     116           0 :                 return 1;
     117             :         }
     118             : 
     119           8 :         ret = ct_cursor(cmd, CS_CURSOR_OPEN, name, CS_NULLTERM, text, CS_NULLTERM, CS_UNUSED);
     120             : 
     121           8 :         if (ret != CS_SUCCEED) {
     122           0 :                 fprintf(stderr, "ct_cursor open failed\n");
     123           0 :                 return 1;
     124             :         }
     125             : 
     126           8 :         ret = ct_send(cmd);
     127             : 
     128           8 :         if (ret != CS_SUCCEED) {
     129           0 :                 fprintf(stderr, "ct_send failed\n");
     130           0 :                 return 1;
     131             :         }
     132             : 
     133          24 :         while ((results_ret = ct_results(cmd, &result_type)) == CS_SUCCEED) {
     134          16 :                 switch ((int) result_type) {
     135             : 
     136           0 :                 case CS_CMD_FAIL:
     137           0 :                         fprintf(stderr, "ct_results failed\n");
     138           0 :                         return 1;
     139             :                 case CS_CMD_SUCCEED:
     140             :                 case CS_CMD_DONE:
     141             :                 case CS_STATUS_RESULT:
     142             :                         break;
     143             : 
     144           8 :                 case CS_CURSOR_RESULT:
     145           8 :                         ret = ct_res_info(cmd, CS_NUMDATA, &num_cols, CS_UNUSED, NULL);
     146             : 
     147           8 :                         if (ret != CS_SUCCEED) {
     148           0 :                                 fprintf(stderr, "ct_res_info() failed");
     149           0 :                                 return 1;
     150             :                         }
     151             : 
     152           8 :                         if (num_cols != 1) {
     153           0 :                                 fprintf(stderr, "unexpected num of columns =  %d \n", num_cols);
     154           0 :                                 return 1;
     155             :                         }
     156             : 
     157          16 :                         for (i = 0; i < num_cols; i++) {
     158             : 
     159             :                                 /* here we can finally test for the return status column */
     160           8 :                                 ret = ct_describe(cmd, i + 1, &datafmt);
     161             : 
     162           8 :                                 if (ret != CS_SUCCEED) {
     163           0 :                                         fprintf(stderr, "ct_describe() failed for column %d\n", i);
     164           0 :                                         return 1;
     165             :                                 }
     166             : 
     167           8 :                                 if (datafmt.status & CS_RETURN) {
     168           0 :                                         printf("ct_describe() column %d \n", i);
     169             :                                 }
     170             : 
     171           8 :                                 datafmt.datatype = CS_CHAR_TYPE;
     172           8 :                                 datafmt.format = CS_FMT_NULLTERM;
     173           8 :                                 datafmt.maxlength = 6;
     174           8 :                                 datafmt.count = 1;
     175           8 :                                 datafmt.locale = NULL;
     176           8 :                                 ret = ct_bind(cmd, 1, &datafmt, col1, &datalength, &ind);
     177           8 :                                 if (ret != CS_SUCCEED) {
     178           0 :                                         fprintf(stderr, "ct_bind() failed\n");
     179           0 :                                         return 1;
     180             :                                 }
     181             : 
     182             :                         }
     183             :                         break;
     184             : 
     185           0 :                 case CS_COMPUTE_RESULT:
     186           0 :                         fprintf(stderr, "ct_results() unexpected CS_COMPUTE_RESULT.\n");
     187           0 :                         return 1;
     188           0 :                 default:
     189           0 :                         fprintf(stderr, "ct_results() unexpected result_type.\n");
     190           0 :                         return 1;
     191             :                 }
     192             :         }
     193             : 
     194             :         if (verbose) {
     195           8 :                 printf("opening second cursor on connection\n");
     196             :         }
     197             : 
     198           8 :         strcpy(text, "select col1 from #test_table2 order by col1");
     199             : 
     200           8 :         ret = ct_cursor(cmd2, CS_CURSOR_DECLARE, name2, CS_NULLTERM, text, CS_NULLTERM, CS_UNUSED);
     201             : 
     202           8 :         if (ret != CS_SUCCEED) {
     203           0 :                 fprintf(stderr, "ct_cursor declare failed\n");
     204           0 :                 return 1;
     205             :         }
     206             : 
     207           8 :         ret = ct_cursor(cmd2, CS_CURSOR_ROWS, name2, CS_NULLTERM, NULL, CS_UNUSED, (CS_INT) 1);
     208           8 :         if (ret != CS_SUCCEED) {
     209           0 :                 fprintf(stderr, "ct_cursor set cursor rows failed");
     210           0 :                 return 1;
     211             :         }
     212             : 
     213           8 :         ret = ct_cursor(cmd2, CS_CURSOR_OPEN, name2, CS_NULLTERM, text, CS_NULLTERM, CS_UNUSED);
     214             : 
     215           8 :         if (ret != CS_SUCCEED) {
     216           0 :                 fprintf(stderr, "ct_cursor open failed\n");
     217           0 :                 return 1;
     218             :         }
     219             : 
     220           8 :         ret = ct_send(cmd2);
     221             : 
     222           8 :         if (ret != CS_SUCCEED) {
     223           0 :                 fprintf(stderr, "ct_send failed\n");
     224           0 :                 return 1;
     225             :         }
     226             : 
     227          24 :         while ((results_ret = ct_results(cmd2, &result_type)) == CS_SUCCEED) {
     228          16 :                 switch ((int) result_type) {
     229             : 
     230           0 :                 case CS_CMD_FAIL:
     231           0 :                         fprintf(stderr, "ct_results failed\n");
     232           0 :                         return 1;
     233             :                 case CS_CMD_SUCCEED:
     234             :                 case CS_CMD_DONE:
     235             :                 case CS_STATUS_RESULT:
     236             :                         break;
     237             : 
     238           8 :                 case CS_CURSOR_RESULT:
     239           8 :                         ret = ct_res_info(cmd2, CS_NUMDATA, &num_cols, CS_UNUSED, NULL);
     240             : 
     241           8 :                         if (ret != CS_SUCCEED) {
     242           0 :                                 fprintf(stderr, "ct_res_info() failed");
     243           0 :                                 return 1;
     244             :                         }
     245             : 
     246           8 :                         if (num_cols != 1) {
     247           0 :                                 fprintf(stderr, "unexpected num of columns =  %d \n", num_cols);
     248           0 :                                 return 1;
     249             :                         }
     250             : 
     251          16 :                         for (i = 0; i < num_cols; i++) {
     252             : 
     253             :                                 /* here we can finally test for the return status column */
     254           8 :                                 ret = ct_describe(cmd2, i + 1, &datafmt2);
     255             : 
     256           8 :                                 if (ret != CS_SUCCEED) {
     257           0 :                                         fprintf(stderr, "ct_describe() failed for column %d\n", i);
     258           0 :                                         return 1;
     259             :                                 }
     260             : 
     261           8 :                                 if (datafmt2.status & CS_RETURN) {
     262           0 :                                         printf("ct_describe() column %d \n", i);
     263             :                                 }
     264             : 
     265           8 :                                 datafmt2.datatype = CS_CHAR_TYPE;
     266           8 :                                 datafmt2.format = CS_FMT_NULLTERM;
     267           8 :                                 datafmt2.maxlength = 6;
     268           8 :                                 datafmt2.count = 1;
     269           8 :                                 datafmt2.locale = NULL;
     270           8 :                                 ret = ct_bind(cmd2, 1, &datafmt2, col2, &datalength, &ind);
     271           8 :                                 if (ret != CS_SUCCEED) {
     272           0 :                                         fprintf(stderr, "ct_bind() failed\n");
     273           0 :                                         return 1;
     274             :                                 }
     275             : 
     276             :                         }
     277             :                         break;
     278             : 
     279           0 :                 case CS_COMPUTE_RESULT:
     280           0 :                         fprintf(stderr, "ct_results() unexpected CS_COMPUTE_RESULT.\n");
     281           0 :                         return 1;
     282           0 :                 default:
     283           0 :                         fprintf(stderr, "ct_results() unexpected result_type.\n");
     284           0 :                         return 1;
     285             :                 }
     286             :         }
     287             : 
     288             :         row_count = 0;
     289             : 
     290          32 :         while (((ret = ct_fetch(cmd, CS_UNUSED, CS_UNUSED, CS_UNUSED, &count)) == CS_SUCCEED)
     291           8 :                || (ret == CS_ROW_FAIL)) {
     292             : 
     293          24 :                 ret2 = ct_fetch(cmd2, CS_UNUSED, CS_UNUSED, CS_UNUSED, &count2);
     294          24 :                 if (ret == CS_SUCCEED && ret2 == CS_SUCCEED) {
     295          24 :                         printf("%s\t\t\t%s\n", col1, col2);
     296             :                 }
     297             :         }
     298             : 
     299           8 :         switch ((int) ret) {
     300             :         case CS_END_DATA:
     301             :                 break;
     302           0 :         case CS_ROW_FAIL:
     303           0 :                 fprintf(stderr, "ct_fetch() CS_ROW_FAIL on row %d.\n", row_count);
     304           0 :                 return 1;
     305           0 :         case CS_FAIL:
     306           0 :                 fprintf(stderr, "ct_fetch() returned CS_FAIL.\n");
     307           0 :                 return 1;
     308           0 :         default:
     309           0 :                 fprintf(stderr, "ct_fetch() unexpected return.\n");
     310           0 :                 return 1;
     311             :         }
     312             : 
     313             :         if (verbose) {
     314           8 :                 printf("closing first cursor on connection\n");
     315             :         }
     316             : 
     317           8 :         ret = ct_cursor(cmd, CS_CURSOR_CLOSE, name, CS_NULLTERM, NULL, CS_UNUSED, CS_UNUSED);
     318             : 
     319           8 :         if (ret != CS_SUCCEED) {
     320           0 :                 fprintf(stderr, "ct_cursor(close) failed\n");
     321           0 :                 return ret;
     322             :         }
     323             : 
     324           8 :         if ((ret = ct_send(cmd)) != CS_SUCCEED) {
     325           0 :                 fprintf(stderr, "BILL ct_send() failed\n");
     326           0 :                 return ret;
     327             :         }
     328             : 
     329          12 :         while ((results_ret = ct_results(cmd, &result_type)) == CS_SUCCEED) {
     330           4 :                 if (result_type == CS_CMD_FAIL) {
     331           0 :                         fprintf(stderr, "ct_results(2) result_type CS_CMD_FAIL.\n");
     332           0 :                         return 1;
     333             :                 }
     334             :         }
     335           8 :         if (results_ret != CS_END_RESULTS) {
     336           0 :                 fprintf(stderr, "ct_results() returned BAD.\n");
     337           0 :                 return 1;
     338             :         }
     339             : 
     340           8 :         ret = ct_cursor(cmd, CS_CURSOR_DEALLOC, name, CS_NULLTERM, NULL, CS_UNUSED, CS_UNUSED);
     341             : 
     342           8 :         if (ret != CS_SUCCEED) {
     343           0 :                 fprintf(stderr, "ct_cursor(dealloc) failed\n");
     344           0 :                 return ret;
     345             :         }
     346             : 
     347           8 :         if ((ret = ct_send(cmd)) != CS_SUCCEED) {
     348           0 :                 fprintf(stderr, "ct_send() failed\n");
     349           0 :                 return ret;
     350             :         }
     351             : 
     352          12 :         while ((results_ret = ct_results(cmd, &result_type)) == CS_SUCCEED) {
     353           4 :                 if (result_type == CS_CMD_FAIL) {
     354           0 :                         fprintf(stderr, "ct_results(3) result_type CS_CMD_FAIL.\n");
     355           0 :                         return 1;
     356             :                 }
     357             :         }
     358           8 :         if (results_ret != CS_END_RESULTS) {
     359           0 :                 fprintf(stderr, "ct_results() returned BAD.\n");
     360           0 :                 return 1;
     361             :         }
     362             : 
     363             :         if (verbose) {
     364           8 :                 printf("closing second cursor on connection\n");
     365             :         }
     366             : 
     367           8 :         ret = ct_cursor(cmd2, CS_CURSOR_CLOSE, name2, CS_NULLTERM, NULL, CS_UNUSED, CS_UNUSED);
     368             : 
     369           8 :         if (ret != CS_SUCCEED) {
     370           0 :                 fprintf(stderr, "ct_cursor(close) failed\n");
     371           0 :                 return ret;
     372             :         }
     373             : 
     374           8 :         if ((ret = ct_send(cmd2)) != CS_SUCCEED) {
     375           0 :                 fprintf(stderr, "BILL ct_send() failed\n");
     376           0 :                 return ret;
     377             :         }
     378             : 
     379          12 :         while ((results_ret = ct_results(cmd2, &result_type)) == CS_SUCCEED) {
     380           4 :                 if (result_type == CS_CMD_FAIL) {
     381           0 :                         fprintf(stderr, "ct_results(2) result_type CS_CMD_FAIL.\n");
     382           0 :                         return 1;
     383             :                 }
     384             :         }
     385           8 :         if (results_ret != CS_END_RESULTS) {
     386           0 :                 fprintf(stderr, "ct_results() returned BAD.\n");
     387           0 :                 return 1;
     388             :         }
     389             : 
     390           8 :         ret = ct_cursor(cmd2, CS_CURSOR_DEALLOC, name2, CS_NULLTERM, NULL, CS_UNUSED, CS_UNUSED);
     391             : 
     392           8 :         if (ret != CS_SUCCEED) {
     393           0 :                 fprintf(stderr, "ct_cursor(dealloc) failed\n");
     394           0 :                 return ret;
     395             :         }
     396             : 
     397           8 :         if ((ret = ct_send(cmd2)) != CS_SUCCEED) {
     398           0 :                 fprintf(stderr, "ct_send() failed\n");
     399           0 :                 return ret;
     400             :         }
     401             : 
     402          12 :         while ((results_ret = ct_results(cmd2, &result_type)) == CS_SUCCEED) {
     403           4 :                 if (result_type == CS_CMD_FAIL) {
     404           0 :                         fprintf(stderr, "ct_results(3) result_type CS_CMD_FAIL.\n");
     405           0 :                         return 1;
     406             :                 }
     407             :         }
     408           8 :         if (results_ret != CS_END_RESULTS) {
     409           0 :                 fprintf(stderr, "ct_results() returned BAD.\n");
     410           0 :                 return 1;
     411             :         }
     412             : 
     413           8 :         ct_cmd_drop(cmd2);
     414           8 :         ct_cmd_drop(cmd3);
     415             : 
     416             :         if (verbose) {
     417           8 :                 printf("Trying logout\n");
     418             :         }
     419           8 :         ret = try_ctlogout(ctx, conn, cmd, verbose);
     420           8 :         if (ret != CS_SUCCEED) {
     421           0 :                 fprintf(stderr, "Logout failed\n");
     422           0 :                 return 2;
     423             :         }
     424             : 
     425             :         if (verbose) {
     426           8 :                 printf("Test succeded\n");
     427             :         }
     428           8 :         return 0;
     429             : }

Generated by: LCOV version 1.13