#include "postgres_fe.h"#include "extern.h"
Go to the source code of this file.
Defines | |
| #define | MAX_DESCRIPTOR_NAMELEN 128 |
Functions | |
| void | push_assignment (char *var, enum ECPGdtype value) |
| static void | drop_assignments (void) |
| static void | ECPGnumeric_lvalue (char *name) |
| void | add_descriptor (char *name, char *connection) |
| void | drop_descriptor (char *name, char *connection) |
| struct descriptor * | lookup_descriptor (char *name, char *connection) |
| void | output_get_descr_header (char *desc_name) |
| void | output_get_descr (char *desc_name, char *index) |
| void | output_set_descr_header (char *desc_name) |
| static const char * | descriptor_item_name (enum ECPGdtype itemcode) |
| void | output_set_descr (char *desc_name, char *index) |
| struct variable * | descriptor_variable (const char *name, int input) |
| struct variable * | sqlda_variable (const char *name) |
Variables | |
| static struct assignment * | assignments |
| static struct descriptor * | descriptors |
| #define MAX_DESCRIPTOR_NAMELEN 128 |
Definition at line 315 of file descriptor.c.
| void add_descriptor | ( | char * | name, | |
| char * | connection | |||
| ) |
Definition at line 76 of file descriptor.c.
References mm_alloc(), and descriptor::name.
{
struct descriptor *new;
if (name[0] != '"')
return;
new = (struct descriptor *) mm_alloc(sizeof(struct descriptor));
new->next = descriptors;
new->name = mm_alloc(strlen(name) + 1);
strcpy(new->name, name);
if (connection)
{
new->connection = mm_alloc(strlen(connection) + 1);
strcpy(new->connection, connection);
}
else
new->connection = connection;
descriptors = new;
}
| static const char* descriptor_item_name | ( | enum ECPGdtype | itemcode | ) | [static] |
Definition at line 219 of file descriptor.c.
References ECPGd_cardinality, ECPGd_count, ECPGd_data, ECPGd_di_code, ECPGd_di_precision, ECPGd_indicator, ECPGd_key_member, ECPGd_length, ECPGd_name, ECPGd_nullable, ECPGd_octet, ECPGd_precision, ECPGd_ret_length, ECPGd_ret_octet, ECPGd_scale, and ECPGd_type.
Referenced by output_set_descr().
{
switch (itemcode)
{
case ECPGd_cardinality:
return "CARDINALITY";
case ECPGd_count:
return "COUNT";
case ECPGd_data:
return "DATA";
case ECPGd_di_code:
return "DATETIME_INTERVAL_CODE";
case ECPGd_di_precision:
return "DATETIME_INTERVAL_PRECISION";
case ECPGd_indicator:
return "INDICATOR";
case ECPGd_key_member:
return "KEY_MEMBER";
case ECPGd_length:
return "LENGTH";
case ECPGd_name:
return "NAME";
case ECPGd_nullable:
return "NULLABLE";
case ECPGd_octet:
return "OCTET_LENGTH";
case ECPGd_precision:
return "PRECISION";
case ECPGd_ret_length:
return "RETURNED_LENGTH";
case ECPGd_ret_octet:
return "RETURNED_OCTET_LENGTH";
case ECPGd_scale:
return "SCALE";
case ECPGd_type:
return "TYPE";
default:
return NULL;
}
}
| struct variable* descriptor_variable | ( | const char * | name, | |
| int | input | |||
| ) | [read] |
Definition at line 317 of file descriptor.c.
References NULL, and strlcpy().
{
static char descriptor_names[2][MAX_DESCRIPTOR_NAMELEN];
static struct ECPGtype descriptor_type = {ECPGt_descriptor, NULL, NULL, NULL, {NULL}, 0};
static struct variable varspace[2] = {
{descriptor_names[0], &descriptor_type, 0, NULL},
{descriptor_names[1], &descriptor_type, 0, NULL}
};
strlcpy(descriptor_names[input], name, sizeof(descriptor_names[input]));
return &varspace[input];
}
| static void drop_assignments | ( | void | ) | [static] |
Definition at line 33 of file descriptor.c.
References free, assignment::next, and assignment::variable.
Referenced by output_get_descr(), output_get_descr_header(), output_set_descr(), and output_set_descr_header().
{
while (assignments)
{
struct assignment *old_head = assignments;
assignments = old_head->next;
free(old_head->variable);
free(old_head);
}
}
| void drop_descriptor | ( | char * | name, | |
| char * | connection | |||
| ) |
Definition at line 99 of file descriptor.c.
References descriptor::connection, ET_WARNING, free, i, mmerror(), descriptor::name, descriptor::next, and PARSE_ERROR.
{
struct descriptor *i;
struct descriptor **lastptr = &descriptors;
if (name[0] != '"')
return;
for (i = descriptors; i; lastptr = &i->next, i = i->next)
{
if (strcmp(name, i->name) == 0)
{
if ((!connection && !i->connection)
|| (connection && i->connection
&& strcmp(connection, i->connection) == 0))
{
*lastptr = i->next;
if (i->connection)
free(i->connection);
free(i->name);
free(i);
return;
}
}
}
mmerror(PARSE_ERROR, ET_WARNING, "descriptor \"%s\" does not exist", name);
}
| static void ECPGnumeric_lvalue | ( | char * | name | ) | [static] |
Definition at line 46 of file descriptor.c.
References ECPGt_const, ECPGt_int, ECPGt_long, ECPGt_long_long, ECPGt_short, ECPGt_unsigned_int, ECPGt_unsigned_long, ECPGt_unsigned_long_long, ECPGt_unsigned_short, ET_ERROR, find_variable(), mmerror(), PARSE_ERROR, variable::type, and yyout.
Referenced by output_get_descr_header(), and output_set_descr_header().
{
const struct variable *v = find_variable(name);
switch (v->type->type)
{
case ECPGt_short:
case ECPGt_int:
case ECPGt_long:
case ECPGt_long_long:
case ECPGt_unsigned_short:
case ECPGt_unsigned_int:
case ECPGt_unsigned_long:
case ECPGt_unsigned_long_long:
case ECPGt_const:
fputs(name, yyout);
break;
default:
mmerror(PARSE_ERROR, ET_ERROR, "variable \"%s\" must have a numeric type", name);
break;
}
}
| struct descriptor* lookup_descriptor | ( | char * | name, | |
| char * | connection | |||
| ) | [read] |
Definition at line 129 of file descriptor.c.
References descriptor::connection, ET_WARNING, i, mmerror(), descriptor::name, descriptor::next, and PARSE_ERROR.
{
struct descriptor *i;
if (name[0] != '"')
return NULL;
for (i = descriptors; i; i = i->next)
{
if (strcmp(name, i->name) == 0)
{
if ((!connection && !i->connection)
|| (connection && i->connection
&& strcmp(connection, i->connection) == 0))
return i;
}
}
mmerror(PARSE_ERROR, ET_WARNING, "descriptor \"%s\" does not exist", name);
return NULL;
}
| void output_get_descr | ( | char * | desc_name, | |
| char * | index | |||
| ) |
Definition at line 170 of file descriptor.c.
References variable::brace_level, drop_assignments(), ECPGd_key_member, ECPGd_nullable, ECPGdump_a_type(), ET_WARNING, find_variable(), get_dtype(), mm_strdup(), mmerror(), variable::name, assignment::next, NULL, PARSE_ERROR, variable::type, assignment::value, assignment::variable, whenever_action(), and yyout.
{
struct assignment *results;
fprintf(yyout, "{ ECPGget_desc(__LINE__, %s, %s,", desc_name, index);
for (results = assignments; results != NULL; results = results->next)
{
const struct variable *v = find_variable(results->variable);
switch (results->value)
{
case ECPGd_nullable:
mmerror(PARSE_ERROR, ET_WARNING, "nullable is always 1");
break;
case ECPGd_key_member:
mmerror(PARSE_ERROR, ET_WARNING, "key_member is always 0");
break;
default:
break;
}
fprintf(yyout, "%s,", get_dtype(results->value));
ECPGdump_a_type(yyout, v->name, v->type, v->brace_level, NULL, NULL, -1, NULL, NULL, mm_strdup("0"), NULL, NULL);
}
drop_assignments();
fputs("ECPGd_EODT);\n", yyout);
whenever_action(2 | 1);
}
| void output_get_descr_header | ( | char * | desc_name | ) |
Definition at line 151 of file descriptor.c.
References drop_assignments(), ECPGd_count, ECPGnumeric_lvalue(), ET_WARNING, mmerror(), assignment::next, PARSE_ERROR, assignment::value, assignment::variable, whenever_action(), and yyout.
{
struct assignment *results;
fprintf(yyout, "{ ECPGget_desc_header(__LINE__, %s, &(", desc_name);
for (results = assignments; results != NULL; results = results->next)
{
if (results->value == ECPGd_count)
ECPGnumeric_lvalue(results->variable);
else
mmerror(PARSE_ERROR, ET_WARNING, "descriptor header item \"%d\" does not exist", results->value);
}
drop_assignments();
fprintf(yyout, "));\n");
whenever_action(3);
}
| void output_set_descr | ( | char * | desc_name, | |
| char * | index | |||
| ) |
Definition at line 261 of file descriptor.c.
References variable::brace_level, descriptor_item_name(), drop_assignments(), ECPGd_cardinality, ECPGd_data, ECPGd_di_code, ECPGd_di_precision, ECPGd_indicator, ECPGd_key_member, ECPGd_length, ECPGd_name, ECPGd_nullable, ECPGd_octet, ECPGd_precision, ECPGd_ret_length, ECPGd_ret_octet, ECPGd_scale, ECPGd_type, ECPGdump_a_type(), ET_FATAL, find_variable(), get_dtype(), mm_strdup(), mmerror(), variable::name, assignment::next, NULL, PARSE_ERROR, variable::type, assignment::value, assignment::variable, whenever_action(), and yyout.
{
struct assignment *results;
fprintf(yyout, "{ ECPGset_desc(__LINE__, %s, %s,", desc_name, index);
for (results = assignments; results != NULL; results = results->next)
{
const struct variable *v = find_variable(results->variable);
switch (results->value)
{
case ECPGd_cardinality:
case ECPGd_di_code:
case ECPGd_di_precision:
case ECPGd_precision:
case ECPGd_scale:
mmerror(PARSE_ERROR, ET_FATAL, "descriptor item \"%s\" is not implemented",
descriptor_item_name(results->value));
break;
case ECPGd_key_member:
case ECPGd_name:
case ECPGd_nullable:
case ECPGd_octet:
case ECPGd_ret_length:
case ECPGd_ret_octet:
mmerror(PARSE_ERROR, ET_FATAL, "descriptor item \"%s\" cannot be set",
descriptor_item_name(results->value));
break;
case ECPGd_data:
case ECPGd_indicator:
case ECPGd_length:
case ECPGd_type:
fprintf(yyout, "%s,", get_dtype(results->value));
ECPGdump_a_type(yyout, v->name, v->type, v->brace_level, NULL, NULL, -1, NULL, NULL, mm_strdup("0"), NULL, NULL);
break;
default:
;
}
}
drop_assignments();
fputs("ECPGd_EODT);\n", yyout);
whenever_action(2 | 1);
}
| void output_set_descr_header | ( | char * | desc_name | ) |
Definition at line 200 of file descriptor.c.
References drop_assignments(), ECPGd_count, ECPGnumeric_lvalue(), ET_WARNING, mmerror(), assignment::next, PARSE_ERROR, assignment::value, assignment::variable, whenever_action(), and yyout.
{
struct assignment *results;
fprintf(yyout, "{ ECPGset_desc_header(__LINE__, %s, (int)(", desc_name);
for (results = assignments; results != NULL; results = results->next)
{
if (results->value == ECPGd_count)
ECPGnumeric_lvalue(results->variable);
else
mmerror(PARSE_ERROR, ET_WARNING, "descriptor header item \"%d\" does not exist", results->value);
}
drop_assignments();
fprintf(yyout, "));\n");
whenever_action(3);
}
| void push_assignment | ( | char * | var, | |
| enum ECPGdtype | value | |||
| ) |
Definition at line 21 of file descriptor.c.
References mm_alloc(), and assignment::variable.
{
struct assignment *new = (struct assignment *) mm_alloc(sizeof(struct assignment));
new->next = assignments;
new->variable = mm_alloc(strlen(var) + 1);
strcpy(new->variable, var);
new->value = value;
assignments = new;
}
| struct variable* sqlda_variable | ( | const char * | name | ) | [read] |
Definition at line 331 of file descriptor.c.
References variable::brace_level, mm_alloc(), mm_strdup(), variable::name, variable::next, and variable::type.
{
struct variable *p = (struct variable *) mm_alloc(sizeof(struct variable));
p->name = mm_strdup(name);
p->type = (struct ECPGtype *) mm_alloc(sizeof(struct ECPGtype));
p->type->type = ECPGt_sqlda;
p->type->size = NULL;
p->type->struct_sizeof = NULL;
p->type->u.element = NULL;
p->type->counter = 0;
p->brace_level = 0;
p->next = NULL;
return p;
}
struct assignment* assignments [static] |
Definition at line 18 of file descriptor.c.
struct descriptor* descriptors [static] |
Definition at line 73 of file descriptor.c.
1.7.1