LCOV - code coverage report
Current view: top level - src/ctlib/unittests - t0004.c (source / functions) Hit Total Coverage
Test: FreeTDS coverage Lines: 48 89 53.9 %
Date: 2025-01-18 12:13:41 Functions: 3 3 100.0 %

          Line data    Source code
       1             : #include <config.h>
       2             : 
       3             : #include <stdio.h>
       4             : #include <ctpublic.h>
       5             : #include "common.h"
       6             : 
       7             : /* protos */
       8             : int do_fetch(CS_COMMAND * cmd);
       9             : CS_RETCODE do_results(CS_COMMAND * cmd, CS_INT * results);
      10             : 
      11             : /* defines */
      12             : #define NUMROWS 5
      13             : 
      14             : /* Testing: Test order of ct_results() */
      15             : int
      16           8 : main(int argc, char **argv)
      17             : {
      18             :         CS_CONTEXT *ctx;
      19             :         CS_CONNECTION *conn;
      20             :         CS_COMMAND *cmd;
      21           8 :         int i, verbose = 0;
      22             : 
      23             :         CS_RETCODE ret;
      24             :         CS_RETCODE results_ret;
      25             : 
      26             :         char query[1024];
      27           8 :         CS_INT insert_results[] = { CS_CMD_SUCCEED, CS_CMD_DONE };
      28           8 :         CS_INT update_results[] = { CS_CMD_SUCCEED, CS_CMD_DONE };
      29           8 :         CS_INT select_results[] = { CS_ROW_RESULT, CS_CMD_DONE };
      30             : 
      31           8 :         printf("%s: Check ordering of returns from cs_results()\n", __FILE__);
      32             :         if (verbose) {
      33             :                 printf("Trying login\n");
      34             :         }
      35           8 :         ret = try_ctlogin(&ctx, &conn, &cmd, verbose);
      36           8 :         if (ret != CS_SUCCEED) {
      37           0 :                 fprintf(stderr, "Login failed\n");
      38           0 :                 return 1;
      39             :         }
      40             : 
      41           8 :         ret = run_command(cmd, "CREATE TABLE #t0004 (id int)");
      42           8 :         if (ret != CS_SUCCEED)
      43             :                 return 1;
      44          40 :         for (i = 0; i < NUMROWS; i++) {
      45          40 :                 sprintf(query, "INSERT #t0004 (id) VALUES (%d)", i);
      46             : 
      47          40 :                 ret = ct_command(cmd, CS_LANG_CMD, query, CS_NULLTERM, CS_UNUSED);
      48          40 :                 if (ret != CS_SUCCEED) {
      49           0 :                         fprintf(stderr, "ct_command() failed\n");
      50           0 :                         return 1;
      51             :                 }
      52          40 :                 ret = ct_send(cmd);
      53          40 :                 if (ret != CS_SUCCEED) {
      54           0 :                         fprintf(stderr, "ct_send() failed\n");
      55           0 :                         return 1;
      56             :                 }
      57             : 
      58          40 :                 results_ret = do_results(cmd, insert_results);
      59          40 :                 switch ((int) results_ret) {
      60             :                 case CS_END_RESULTS:
      61             :                         break;
      62           0 :                 case CS_FAIL:
      63           0 :                         fprintf(stderr, "ct_results() failed.\n");
      64           0 :                         return 1;
      65             :                         break;
      66           0 :                 default:
      67           0 :                         fprintf(stderr, "ct_results() unexpected return.\n");
      68           0 :                         return 1;
      69             :                 }
      70             :         }
      71             : 
      72           8 :         ret = ct_command(cmd, CS_LANG_CMD, "UPDATE #t0004 SET id = id + 1", CS_NULLTERM, CS_UNUSED);
      73           8 :         if (ret != CS_SUCCEED) {
      74           0 :                 fprintf(stderr, "ct_command() failed\n");
      75           0 :                 return 1;
      76             :         }
      77           8 :         ret = ct_send(cmd);
      78           8 :         if (ret != CS_SUCCEED) {
      79           0 :                 fprintf(stderr, "ct_send() failed\n");
      80           0 :                 return 1;
      81             :         }
      82             : 
      83           8 :         results_ret = do_results(cmd, update_results);
      84           8 :         switch ((int) results_ret) {
      85             :         case CS_END_RESULTS:
      86             :                 break;
      87           0 :         case CS_FAIL:
      88           0 :                 fprintf(stderr, "ct_results() failed.\n");
      89           0 :                 return 1;
      90             :                 break;
      91           0 :         default:
      92           0 :                 fprintf(stderr, "ct_results() unexpected return.\n");
      93           0 :                 return 1;
      94             :         }
      95             : 
      96             :         /* single row select */
      97           8 :         ret = ct_command(cmd, CS_LANG_CMD, "SELECT * FROM #t0004 WHERE id = 1", CS_NULLTERM, CS_UNUSED);
      98           8 :         if (ret != CS_SUCCEED) {
      99           0 :                 fprintf(stderr, "ct_command() failed\n");
     100           0 :                 return 1;
     101             :         }
     102           8 :         ret = ct_send(cmd);
     103           8 :         if (ret != CS_SUCCEED) {
     104           0 :                 fprintf(stderr, "ct_send() failed\n");
     105           0 :                 return 1;
     106             :         }
     107             : 
     108           8 :         results_ret = do_results(cmd, select_results);
     109           8 :         switch ((int) results_ret) {
     110             :         case CS_END_RESULTS:
     111             :                 break;
     112           0 :         case CS_FAIL:
     113           0 :                 fprintf(stderr, "ct_results() failed.\n");
     114           0 :                 return 1;
     115             :                 break;
     116           0 :         default:
     117           0 :                 fprintf(stderr, "ct_results() unexpected return.\n");
     118           0 :                 return 1;
     119             :         }
     120             :         if (verbose) {
     121             :                 printf("Trying logout\n");
     122             :         }
     123           8 :         ret = try_ctlogout(ctx, conn, cmd, verbose);
     124           8 :         if (ret != CS_SUCCEED) {
     125           0 :                 fprintf(stderr, "Logout failed\n");
     126           0 :                 return 1;
     127             :         }
     128             : 
     129             :         return 0;
     130             : }
     131             : 
     132             : int
     133           8 : do_fetch(CS_COMMAND * cmd)
     134             : {
     135           8 : CS_INT count, row_count = 0;
     136             : CS_RETCODE ret;
     137             : 
     138          24 :         while ((ret = ct_fetch(cmd, CS_UNUSED, CS_UNUSED, CS_UNUSED, &count)) == CS_SUCCEED) {
     139           8 :                 row_count += count;
     140             :         }
     141           8 :         if (ret == CS_ROW_FAIL) {
     142           0 :                 fprintf(stderr, "ct_fetch() CS_ROW_FAIL on row %d.\n", row_count);
     143           0 :                 return 1;
     144           8 :         } else if (ret == CS_END_DATA) {
     145             :                 return 0;
     146             :         } else {
     147           0 :                 fprintf(stderr, "ct_fetch() unexpected return %d on row %d.\n", ret, row_count);
     148           0 :                 return 1;
     149             :         }
     150             : }
     151             : 
     152             : CS_RETCODE
     153          56 : do_results(CS_COMMAND * cmd, CS_INT * results)
     154             : {
     155             : int result_num;
     156             : CS_RETCODE results_ret, result_type;
     157             : 
     158          56 :         result_num = 0;
     159         224 :         while ((results_ret = ct_results(cmd, &result_type)) == CS_SUCCEED) {
     160         112 :                 printf("result_ret %d result_type %d\n", results_ret, result_type);
     161         112 :                 if (result_type == CS_STATUS_RESULT)
     162           0 :                         continue;
     163         112 :                 if (result_type != results[result_num]) {
     164           0 :                         fprintf(stderr, "ct_results() expected %d received %d\n", results[result_num], result_type);
     165           0 :                         return CS_FAIL;
     166             :                 }
     167         112 :                 switch ((int) result_type) {
     168           8 :                 case CS_ROW_RESULT:
     169           8 :                         if (do_fetch(cmd)) {
     170             :                                 return CS_FAIL;
     171             :                         }
     172             :                         break;
     173             :                 }
     174         112 :                 result_num++;
     175             :         }
     176             :         return results_ret;
     177             : }

Generated by: LCOV version 1.13