LCOV - differential code coverage report
Current view: top level - src/interfaces/ecpg/preproc - descriptor.c (source / functions) Coverage Total Hit LBC UIC UBC GBC GIC GNC CBC EUB ECB DCB
Current: Differential Code Coverage HEAD vs 15 Lines: 66.5 % 182 121 1 15 45 1 40 1 79 15 39 2
Current Date: 2023-04-08 17:13:01 Functions: 92.3 % 13 12 1 7 1 4 1 7
Baseline: 15 Line coverage date bins:
Baseline Date: 2023-04-08 15:09:40 (240..) days: 66.5 % 182 121 1 15 45 1 40 1 79 15 39
Legend: Lines: hit not hit Function coverage date bins:
(240..) days: 57.1 % 21 12 1 7 1 4 1 7

 Age         Owner                  TLA  Line data    Source code
                                  1                 : /*
                                  2                 :  * functions needed for descriptor handling
                                  3                 :  *
                                  4                 :  * src/interfaces/ecpg/preproc/descriptor.c
                                  5                 :  *
                                  6                 :  * since descriptor might be either a string constant or a string var
                                  7                 :  * we need to check for a constant if we expect a constant
                                  8                 :  */
                                  9                 : 
                                 10                 : #include "postgres_fe.h"
                                 11                 : 
                                 12                 : #include "preproc_extern.h"
                                 13                 : 
                                 14                 : /*
                                 15                 :  * assignment handling function (descriptor)
                                 16                 :  */
                                 17                 : 
                                 18                 : static struct assignment *assignments;
                                 19                 : 
                                 20                 : void
 8397 bruce                      21 CBC          78 : push_assignment(char *var, enum ECPGdtype value)
                                 22                 : {
                                 23              78 :     struct assignment *new = (struct assignment *) mm_alloc(sizeof(struct assignment));
                                 24                 : 
 8451 meskes                     25              78 :     new->next = assignments;
 8447                            26              78 :     new->variable = mm_alloc(strlen(var) + 1);
                                 27              78 :     strcpy(new->variable, var);
                                 28              78 :     new->value = value;
 8451                            29              78 :     assignments = new;
 8452                            30              78 : }
                                 31                 : 
                                 32                 : static void
                                 33              54 : drop_assignments(void)
                                 34                 : {
 8451                            35             132 :     while (assignments)
                                 36                 :     {
                                 37              78 :         struct assignment *old_head = assignments;
                                 38                 : 
                                 39              78 :         assignments = old_head->next;
 8452                            40              78 :         free(old_head->variable);
                                 41              78 :         free(old_head);
                                 42                 :     }
                                 43              54 : }
                                 44                 : 
                                 45                 : static void
 5588                            46              12 : ECPGnumeric_lvalue(char *name)
                                 47                 : {
 8397 bruce                      48              12 :     const struct variable *v = find_variable(name);
                                 49                 : 
 7777 meskes                     50              12 :     switch (v->type->type)
                                 51                 :     {
 8452                            52              12 :         case ECPGt_short:
                                 53                 :         case ECPGt_int:
                                 54                 :         case ECPGt_long:
                                 55                 :         case ECPGt_long_long:
                                 56                 :         case ECPGt_unsigned_short:
                                 57                 :         case ECPGt_unsigned_int:
                                 58                 :         case ECPGt_unsigned_long:
                                 59                 :         case ECPGt_unsigned_long_long:
                                 60                 :         case ECPGt_const:
 2310 tgl                        61              12 :             fputs(name, base_yyout);
 8452 meskes                     62              12 :             break;
 8452 meskes                     63 UBC           0 :         default:
 5189 peter_e                    64               0 :             mmerror(PARSE_ERROR, ET_ERROR, "variable \"%s\" must have a numeric type", name);
 8452 meskes                     65               0 :             break;
                                 66                 :     }
 8452 meskes                     67 CBC          12 : }
                                 68                 : 
                                 69                 : /*
                                 70                 :  * descriptor name lookup
                                 71                 :  */
                                 72                 : 
                                 73                 : static struct descriptor *descriptors;
                                 74                 : 
                                 75                 : void
 8397 bruce                      76              18 : add_descriptor(char *name, char *connection)
                                 77                 : {
                                 78                 :     struct descriptor *new;
                                 79                 : 
 7836                            80              18 :     if (name[0] != '"')
                                 81               1 :         return;
                                 82                 : 
 7903 meskes                     83              17 :     new = (struct descriptor *) mm_alloc(sizeof(struct descriptor));
                                 84                 : 
 8447                            85              17 :     new->next = descriptors;
                                 86              17 :     new->name = mm_alloc(strlen(name) + 1);
 8397 bruce                      87              17 :     strcpy(new->name, name);
                                 88              17 :     if (connection)
                                 89                 :     {
 8447 meskes                     90               2 :         new->connection = mm_alloc(strlen(connection) + 1);
                                 91               2 :         strcpy(new->connection, connection);
                                 92                 :     }
                                 93                 :     else
 8397 bruce                      94              15 :         new->connection = connection;
 8447 meskes                     95              17 :     descriptors = new;
                                 96                 : }
                                 97                 : 
                                 98                 : void
 8397 bruce                      99              16 : drop_descriptor(char *name, char *connection)
                                100                 : {
                                101                 :     struct descriptor *i;
                                102              16 :     struct descriptor **lastptr = &descriptors;
                                103                 : 
 7836                           104              16 :     if (name[0] != '"')
                                105               1 :         return;
                                106                 : 
 8397                           107              19 :     for (i = descriptors; i; lastptr = &i->next, i = i->next)
                                108                 :     {
 4121 peter_e                   109              19 :         if (strcmp(name, i->name) == 0)
                                110                 :         {
 8397 bruce                     111              15 :             if ((!connection && !i->connection)
                                112               2 :                 || (connection && i->connection
 4121 peter_e                   113               2 :                     && strcmp(connection, i->connection) == 0))
                                114                 :             {
 8397 bruce                     115              15 :                 *lastptr = i->next;
  297 peter                     116 GNC          15 :                 free(i->connection);
 8451 meskes                    117 CBC          15 :                 free(i->name);
                                118              15 :                 free(i);
 8451 meskes                    119 GIC          15 :                 return;
                                120                 :             }
                                121                 :         }
 8451 meskes                    122 EUB             :     }
  604 meskes                    123 UBC           0 :     if (connection)
  604 meskes                    124 UIC           0 :         mmerror(PARSE_ERROR, ET_WARNING, "descriptor %s bound to connection %s does not exist", name, connection);
  604 meskes                    125 EUB             :     else
  604 meskes                    126 UIC           0 :         mmerror(PARSE_ERROR, ET_WARNING, "descriptor %s bound to the default connection does not exist", name);
                                127                 : }
                                128                 : 
                                129                 : struct descriptor
 8053 bruce                     130 ECB             :            *
 8053 bruce                     131 GIC          54 : lookup_descriptor(char *name, char *connection)
                                132                 : {
                                133                 :     struct descriptor *i;
 8397 bruce                     134 ECB             : 
 7836 bruce                     135 CBC          54 :     if (name[0] != '"')
 7836 bruce                     136 GIC           1 :         return NULL;
 7903 meskes                    137 ECB             : 
 8447 meskes                    138 GIC          67 :     for (i = descriptors; i; i = i->next)
 8451 meskes                    139 ECB             :     {
 4121 peter_e                   140 GIC          67 :         if (strcmp(name, i->name) == 0)
 8451 meskes                    141 ECB             :         {
 8397 bruce                     142 CBC          53 :             if ((!connection && !i->connection)
                                143               3 :                 || (connection && i->connection
 4121 peter_e                   144               3 :                     && strcmp(connection, i->connection) == 0))
 8451 meskes                    145 GBC          53 :                 return i;
  604 meskes                    146 UIC           0 :             if (connection && !i->connection)
                                147                 :             {
  604 meskes                    148 EUB             :                 /* overwrite descriptor's connection */
  604 meskes                    149 UBC           0 :                 i->connection = mm_strdup(connection);
  604 meskes                    150 UIC           0 :                 return i;
                                151                 :             }
                                152                 :         }
 8451 meskes                    153 EUB             :     }
  604 meskes                    154 UBC           0 :     if (connection)
  604 meskes                    155 UIC           0 :         mmerror(PARSE_ERROR, ET_WARNING, "descriptor %s bound to connection %s does not exist", name, connection);
  604 meskes                    156 EUB             :     else
  604 meskes                    157 UBC           0 :         mmerror(PARSE_ERROR, ET_WARNING, "descriptor %s bound to the default connection does not exist", name);
 8451 meskes                    158 UIC           0 :     return NULL;
                                159                 : }
                                160                 : 
 8452 meskes                    161 ECB             : void
 8452 meskes                    162 GIC          11 : output_get_descr_header(char *desc_name)
                                163                 : {
                                164                 :     struct assignment *results;
 8452 meskes                    165 ECB             : 
 2310 tgl                       166 CBC          11 :     fprintf(base_yyout, "{ ECPGget_desc_header(__LINE__, %s, &(", desc_name);
 8451 meskes                    167 GIC          22 :     for (results = assignments; results != NULL; results = results->next)
 8452 meskes                    168 ECB             :     {
 8447 meskes                    169 CBC          11 :         if (results->value == ECPGd_count)
 5588 meskes                    170 GIC          11 :             ECPGnumeric_lvalue(results->variable);
 8452 meskes                    171 EUB             :         else
 5189 peter_e                   172 UIC           0 :             mmerror(PARSE_ERROR, ET_WARNING, "descriptor header item \"%d\" does not exist", results->value);
                                173                 :     }
 8397 bruce                     174 ECB             : 
 8451 meskes                    175 CBC          11 :     drop_assignments();
 2310 tgl                       176              11 :     fprintf(base_yyout, "));\n");
 8451 meskes                    177              11 :     whenever_action(3);
 8452 meskes                    178 GIC          11 : }
                                179                 : 
 8452 meskes                    180 ECB             : void
 8447 meskes                    181 GIC          31 : output_get_descr(char *desc_name, char *index)
                                182                 : {
                                183                 :     struct assignment *results;
 8447 meskes                    184 ECB             : 
 2310 tgl                       185 CBC          31 :     fprintf(base_yyout, "{ ECPGget_desc(__LINE__, %s, %s,", desc_name, index);
 8447 meskes                    186 GIC          82 :     for (results = assignments; results != NULL; results = results->next)
 8452 meskes                    187 ECB             :     {
 8447 meskes                    188 CBC          51 :         const struct variable *v = find_variable(results->variable);
 2495 rhaas                     189 GIC          51 :         char       *str_zero = mm_strdup("0");
 8397 bruce                     190 ECB             : 
 8447 meskes                    191 GIC          51 :         switch (results->value)
 8452 meskes                    192 EUB             :         {
 8447 meskes                    193 UBC           0 :             case ECPGd_nullable:
 7704 bruce                     194               0 :                 mmerror(PARSE_ERROR, ET_WARNING, "nullable is always 1");
 8447 meskes                    195               0 :                 break;
                                196               0 :             case ECPGd_key_member:
 7704 bruce                     197               0 :                 mmerror(PARSE_ERROR, ET_WARNING, "key_member is always 0");
 8447 meskes                    198 LBC           0 :                 break;
 8447 meskes                    199 CBC          51 :             default:
 8397 bruce                     200 GIC          51 :                 break;
 8452 meskes                    201 ECB             :         }
 2310 tgl                       202 CBC          51 :         fprintf(base_yyout, "%s,", get_dtype(results->value));
 2310 tgl                       203 GIC          51 :         ECPGdump_a_type(base_yyout, v->name, v->type, v->brace_level,
 2310 tgl                       204 ECB             :                         NULL, NULL, -1, NULL, NULL, str_zero, NULL, NULL);
 2858 meskes                    205 GIC          51 :         free(str_zero);
 8452 meskes                    206 ECB             :     }
 8452 meskes                    207 CBC          31 :     drop_assignments();
 2310 tgl                       208 GIC          31 :     fputs("ECPGd_EODT);\n", base_yyout);
 8397 bruce                     209 ECB             : 
 8397 bruce                     210 CBC          31 :     whenever_action(2 | 1);
 8452 meskes                    211 GIC          31 : }
                                212                 : 
 6857 meskes                    213 ECB             : void
 6857 meskes                    214 GIC           1 : output_set_descr_header(char *desc_name)
                                215                 : {
                                216                 :     struct assignment *results;
 6857 meskes                    217 ECB             : 
 2310 tgl                       218 CBC           1 :     fprintf(base_yyout, "{ ECPGset_desc_header(__LINE__, %s, (int)(", desc_name);
 6857 meskes                    219 GIC           2 :     for (results = assignments; results != NULL; results = results->next)
 6857 meskes                    220 ECB             :     {
 6857 meskes                    221 CBC           1 :         if (results->value == ECPGd_count)
 5588 meskes                    222 GIC           1 :             ECPGnumeric_lvalue(results->variable);
 6857 meskes                    223 EUB             :         else
 5189 peter_e                   224 UIC           0 :             mmerror(PARSE_ERROR, ET_WARNING, "descriptor header item \"%d\" does not exist", results->value);
                                225                 :     }
 6857 meskes                    226 ECB             : 
 6857 meskes                    227 CBC           1 :     drop_assignments();
 2310 tgl                       228               1 :     fprintf(base_yyout, "));\n");
 6857 meskes                    229               1 :     whenever_action(3);
 6857 meskes                    230 GIC           1 : }
                                231                 : 
 6857 meskes                    232 EUB             : static const char *
 6857 meskes                    233 UIC           0 : descriptor_item_name(enum ECPGdtype itemcode)
 6857 meskes                    234 EUB             : {
 6857 meskes                    235 UIC           0 :     switch (itemcode)
 6857 meskes                    236 EUB             :     {
 6857 meskes                    237 UBC           0 :         case ECPGd_cardinality:
                                238               0 :             return "CARDINALITY";
                                239               0 :         case ECPGd_count:
                                240               0 :             return "COUNT";
                                241               0 :         case ECPGd_data:
                                242               0 :             return "DATA";
                                243               0 :         case ECPGd_di_code:
                                244               0 :             return "DATETIME_INTERVAL_CODE";
                                245               0 :         case ECPGd_di_precision:
                                246               0 :             return "DATETIME_INTERVAL_PRECISION";
                                247               0 :         case ECPGd_indicator:
                                248               0 :             return "INDICATOR";
                                249               0 :         case ECPGd_key_member:
                                250               0 :             return "KEY_MEMBER";
                                251               0 :         case ECPGd_length:
                                252               0 :             return "LENGTH";
                                253               0 :         case ECPGd_name:
                                254               0 :             return "NAME";
                                255               0 :         case ECPGd_nullable:
                                256               0 :             return "NULLABLE";
                                257               0 :         case ECPGd_octet:
                                258               0 :             return "OCTET_LENGTH";
                                259               0 :         case ECPGd_precision:
                                260               0 :             return "PRECISION";
                                261               0 :         case ECPGd_ret_length:
                                262               0 :             return "RETURNED_LENGTH";
                                263               0 :         case ECPGd_ret_octet:
                                264               0 :             return "RETURNED_OCTET_LENGTH";
                                265               0 :         case ECPGd_scale:
                                266               0 :             return "SCALE";
                                267               0 :         case ECPGd_type:
                                268               0 :             return "TYPE";
                                269               0 :         default:
 6857 meskes                    270 UIC           0 :             return NULL;
                                271                 :     }
                                272                 : }
                                273                 : 
 6857 meskes                    274 ECB             : void
 6857 meskes                    275 GIC          11 : output_set_descr(char *desc_name, char *index)
                                276                 : {
                                277                 :     struct assignment *results;
 6857 meskes                    278 ECB             : 
 2310 tgl                       279 CBC          11 :     fprintf(base_yyout, "{ ECPGset_desc(__LINE__, %s, %s,", desc_name, index);
 6857 meskes                    280 GIC          26 :     for (results = assignments; results != NULL; results = results->next)
 6857 meskes                    281 ECB             :     {
 6857 meskes                    282 GIC          15 :         const struct variable *v = find_variable(results->variable);
 6857 meskes                    283 ECB             : 
 6857 meskes                    284 GIC          15 :         switch (results->value)
 6857 meskes                    285 EUB             :         {
 6857 meskes                    286 UIC           0 :             case ECPGd_cardinality:
                                287                 :             case ECPGd_di_code:
                                288                 :             case ECPGd_di_precision:
                                289                 :             case ECPGd_precision:
 6857 meskes                    290 EUB             :             case ECPGd_scale:
 3435 peter_e                   291 UIC           0 :                 mmfatal(PARSE_ERROR, "descriptor item \"%s\" is not implemented",
                                292                 :                         descriptor_item_name(results->value));
                                293                 :                 break;
 6857 meskes                    294 EUB             : 
 6857 meskes                    295 UIC           0 :             case ECPGd_key_member:
                                296                 :             case ECPGd_name:
                                297                 :             case ECPGd_nullable:
                                298                 :             case ECPGd_octet:
                                299                 :             case ECPGd_ret_length:
 6857 meskes                    300 EUB             :             case ECPGd_ret_octet:
 3435 peter_e                   301 UIC           0 :                 mmfatal(PARSE_ERROR, "descriptor item \"%s\" cannot be set",
                                302                 :                         descriptor_item_name(results->value));
                                303                 :                 break;
 6857 meskes                    304 ECB             : 
 6857 meskes                    305 GIC          15 :             case ECPGd_data:
                                306                 :             case ECPGd_indicator:
                                307                 :             case ECPGd_length:
                                308                 :             case ECPGd_type:
 2858 meskes                    309 ECB             :                 {
 2495 rhaas                     310 GIC          15 :                     char       *str_zero = mm_strdup("0");
 2495 rhaas                     311 ECB             : 
 2310 tgl                       312 CBC          15 :                     fprintf(base_yyout, "%s,", get_dtype(results->value));
 2310 tgl                       313 GIC          15 :                     ECPGdump_a_type(base_yyout, v->name, v->type, v->brace_level,
 2118 tgl                       314 ECB             :                                     NULL, NULL, -1, NULL, NULL, str_zero, NULL, NULL);
 2858 meskes                    315 GIC          15 :                     free(str_zero);
 2858 meskes                    316 ECB             :                 }
 6857 meskes                    317 GIC          15 :                 break;
 6857 meskes                    318 ECB             : 
 6857 meskes                    319 GIC          15 :             default:
                                320                 :                 ;
                                321                 :         }
 6857 meskes                    322 ECB             :     }
 6857 meskes                    323 CBC          11 :     drop_assignments();
 2310 tgl                       324 GIC          11 :     fputs("ECPGd_EODT);\n", base_yyout);
 6857 meskes                    325 ECB             : 
 6857 meskes                    326 CBC          11 :     whenever_action(2 | 1);
 6857 meskes                    327 GIC          11 : }
                                328                 : 
                                329                 : /* I consider dynamic allocation overkill since at most two descriptor
                                330                 :    variables are possible per statement. (input and output descriptor)
                                331                 :    And descriptors are no normal variables, so they don't belong into
                                332                 :    the variable list.
                                333                 : */
                                334                 : 
                                335                 : #define MAX_DESCRIPTOR_NAMELEN 128
 7836 bruce                     336 ECB             : struct variable *
 7836 bruce                     337 GIC          22 : descriptor_variable(const char *name, int input)
                                338                 : {
                                339                 :     static char descriptor_names[2][MAX_DESCRIPTOR_NAMELEN];
                                340                 :     static struct ECPGtype descriptor_type = {ECPGt_descriptor, NULL, NULL, NULL, {NULL}, 0};
                                341                 :     static struct variable varspace[2] = {
                                342                 :         {descriptor_names[0], &descriptor_type, 0, NULL},
                                343                 :         {descriptor_names[1], &descriptor_type, 0, NULL}
                                344                 :     };
 7836 bruce                     345 ECB             : 
 5905 peter_e                   346 CBC          22 :     strlcpy(descriptor_names[input], name, sizeof(descriptor_names[input]));
 4055 peter_e                   347 GIC          22 :     return &varspace[input];
                                348                 : }
                                349                 : 
 4842 meskes                    350 ECB             : struct variable *
 4842 meskes                    351 GIC          24 : sqlda_variable(const char *name)
 4842 meskes                    352 ECB             : {
 4842 meskes                    353 GIC          24 :     struct variable *p = (struct variable *) mm_alloc(sizeof(struct variable));
 4842 meskes                    354 ECB             : 
 4842 meskes                    355 CBC          24 :     p->name = mm_strdup(name);
                                356              24 :     p->type = (struct ECPGtype *) mm_alloc(sizeof(struct ECPGtype));
                                357              24 :     p->type->type = ECPGt_sqlda;
                                358              24 :     p->type->size = NULL;
                                359              24 :     p->type->struct_sizeof = NULL;
                                360              24 :     p->type->u.element = NULL;
 4779                           361              24 :     p->type->counter = 0;
 4842                           362              24 :     p->brace_level = 0;
 4842 meskes                    363 GIC          24 :     p->next = NULL;
 4842 meskes                    364 ECB             : 
 4842 meskes                    365 GIC          24 :     return p;
                                366                 : }
        

Generated by: LCOV version v1.16-55-g56c0a2a