/* @(#)gen_structures.c 2.1 95/05/11 */ /******************************************************************************/ /* function : gen_structures.c */ /* */ /* subsystem : chgen */ /* */ /* input : */ /* */ /* output : (writes to output schema .h file) */ /* */ /* returns : void */ /* */ /* author : Steve Smith / Craig Smith */ /* */ /* created : July, 1991 */ /* */ /* revisions : 93s523: change output method for key fields, output table */ /* index global hcg_tbl_abbr. */ /* 99s523: added rcsId lines, merged in 97 wang updates. JK-KS */ /* 11/30/00 : kmiu : Removed unreferenced variables */ /* 11/30/00 : kmiu : Fixed bug: removed extra semicolon after '\n' in */ /* make_declare_ops() under case 'd' in switch stmt */ /* 2kf522 : kmiu & mottesen : STL modifications: Added a table class and */ /* replaced old row class with new one */ /* */ /* description : This routine will write the actual structure definitions for */ /* each table in the schema to the schema output .h file. */ /* This is done by traversing the tt and ta tables. Other */ /* routines are called to generate the parent/child pointers */ /* as needed. This module also marks the end of the output .h */ /* file. */ /* */ /******************************************************************************/ /******************************************************************************/ /* 95s523 (V10), chwang modifies the file to generate the btree structure for */ /* pr_find macro. The btrees is built for binary tree search by pkey. 5,11,95 */ /******************************************************************************/ #include #include #include "chgen_define.h" #include "chgen_externs.h" #include "prototypes.h" void gen_structures() { static char rcsid[] = "$Id: gen_structures.c,v 1.4.4.2 1999/05/04 17:00:06 jkarner Exp $"; int dimension, j ; fprintf(schh_fp,"/******************************************************************************/\n"); fprintf(schh_fp,"/* The remainder of this file holds the 'C' structure definitions for each */\n"); fprintf(schh_fp,"/* table in the schema. */\n"); fprintf(schh_fp,"/******************************************************************************/\n\n"); { int i; fprintf(schh_fp, "\nstatic char *hcg_tbl_abbr[] = {\n"); for(i=0; i < num_tables - 1; i++) fprintf(schh_fp, "\t\t\t\t\t\t\"%s\",\n", lut_get_name(&hcg_table_abbrev_lut, i)); fprintf(schh_fp, "\t\t\t\t\t\t\"%s\" };\n\n", lut_get_name(&hcg_table_abbrev_lut, i)); } fprintf(schh_fp,"\n/******************************************************************************/\n"); fprintf(schh_fp,"/* Class: RC (Root Class) */\n"); fprintf(schh_fp,"/******************************************************************************/\n"); fprintf(schh_fp, "class RC\n") ; fprintf(schh_fp, "{\n") ; fprintf(schh_fp, "private :\n") ; fprintf(schh_fp, " hcg_key pkid;\n") ; fprintf(schh_fp, " int RFLAG; /* for pr_utility macro log */\n") ; fprintf(schh_fp, "\npublic :\n") ; fprintf(schh_fp, " void set_pkid (hcg_key id)\n") ; fprintf(schh_fp, " {\n") ; fprintf(schh_fp, " pkid = id;\n") ; fprintf(schh_fp, " }\n\n") ; fprintf(schh_fp, " void set_RFLAG (int flag)\n") ; fprintf(schh_fp, " {\n") ; fprintf(schh_fp, " RFLAG = flag;\n") ; fprintf(schh_fp, " }\n\n") ; fprintf(schh_fp, " hcg_key get_pkid ()\n") ; fprintf(schh_fp, " {\n") ; fprintf(schh_fp, " return pkid;\n") ; fprintf(schh_fp, " }\n\n") ; fprintf(schh_fp, " int get_RFLAG ()\n") ; fprintf(schh_fp, " {\n") ; fprintf(schh_fp, " return RFLAG;\n") ; fprintf(schh_fp, " }\n\n") ; fprintf(schh_fp, "} ;\n") ; fprintf(schh_fp, "#endif\n") ; tt_curr = tt; while (tt_curr != NULL) { j = encoding(tt_curr->TTabbr) ; fprintf(XXschh_fp[j],"/******************************************************************************/\n"); fprintf(XXschh_fp[j],"/* File : %sschema.h */\n", tt_curr->TTabbr); fprintf(XXschh_fp[j],"/* Schema : %-58s */\n",sch_text_file_name); fprintf(XXschh_fp[j],"/* GENCPP Version : %-58s */\n",CHGEN_VERSION); fprintf(XXschh_fp[j],"/******************************************************************************/\n\n"); fprintf(XXschh_fp[j],"#ifndef __%sSCHEMA_H__\n",tt_curr->TTabbr); fprintf(XXschh_fp[j],"#define __%sSCHEMA_H__\n",tt_curr->TTabbr); fprintf(XXschh_fp[j],"#include \"%s\"\n\n",sch_header_file_name) ; fprintf(XXschh_fp[j],"#ifdef USE_STL\n"); fprintf(XXschh_fp[j],"#include \n"); fprintf(XXschh_fp[j],"#endif /* USE_STL */\n\n"); make_class_pptr(tt_curr->ta_ptr->FieldName,cp_table, j); make_class_cptr(tt_curr->ta_ptr->FieldName,pc_table, j); fprintf(XXschh_fp[j],"\n#ifndef USE_STL"); fprintf(XXschh_fp[j], "\nclass %s : public RC", tt_curr->TTabbr); if (tt_curr->comment[0] == '\0') fprintf(XXschh_fp[j], "\n"); else fprintf(XXschh_fp[j], "\t\t\t%s\n", tt_curr->comment); fprintf(XXschh_fp[j], "{\n"); fprintf(XXschh_fp[j], "private :\n"); ta_curr = tt_curr->ta_ptr->next_ptr; while (ta_curr != NULL) { if(ta_curr->IsKey) fprintf(XXschh_fp[j], " hcg_key %s;", ta_curr->FieldName); else switch(ta_curr->FieldType[0]) { case 'i' : fprintf(XXschh_fp[j]," int %s;",ta_curr->FieldName); break; case 'f' : fprintf(XXschh_fp[j]," float %s;",ta_curr->FieldName); break; case 'c' : case 't' : dimension = atoi(&(ta_curr->FieldType[1])) +1; fprintf(XXschh_fp[j]," char %s[%d];",ta_curr->FieldName,dimension); break; case 'd' : fprintf(XXschh_fp[j]," char %s[26];",ta_curr->FieldName); break; } /* switch */ if (ta_curr->comment[0] == '\0') fprintf(XXschh_fp[j], "\n"); else fprintf(XXschh_fp[j], "\t%s\n", ta_curr->comment); ta_curr = ta_curr->next_ptr; } /* end while ta_curr */ fprintf(XXschh_fp[j], "public :\n"); make_pptr(tt_curr->ta_ptr->FieldName,cp_table, j); make_cptr(tt_curr->ta_ptr->FieldName,pc_table, j); fprintf(XXschh_fp[j],"\n %s *prev_ptr;\n" ,tt_curr->TTabbr); fprintf(XXschh_fp[j]," %s *next_ptr;\n" ,tt_curr->TTabbr); fprintf(XXschh_fp[j],"\n"); tt_curr = tt_curr->next_ptr; } /* end while tt_cur */ make_declare_ops(FALSE) ; tt_curr = tt; while (tt_curr != NULL) { j = encoding(tt_curr->TTabbr) ; fprintf(XXschh_fp[j],"\n#else\n"); /* row class */ fprintf(XXschh_fp[j], "\nclass %s : public RC", tt_curr->TTabbr); fprintf(XXschh_fp[j], "\n{\n"); fprintf(XXschh_fp[j], "private :\n"); ta_curr = tt_curr->ta_ptr->next_ptr; while (ta_curr != NULL) { if(ta_curr->IsKey) fprintf(XXschh_fp[j], " hcg_key %s;", ta_curr->FieldName); else switch(ta_curr->FieldType[0]) { case 'i' : fprintf(XXschh_fp[j]," int %s;",ta_curr->FieldName); break; case 'f' : fprintf(XXschh_fp[j]," float %s;",ta_curr->FieldName); break; case 'c' : case 't' : dimension = atoi(&(ta_curr->FieldType[1])) +1; fprintf(XXschh_fp[j]," char %s[%d];",ta_curr->FieldName,dimension); break; case 'd' : fprintf(XXschh_fp[j]," char %s[26];",ta_curr->FieldName); break; } /* switch */ if (ta_curr->comment[0] == '\0') fprintf(XXschh_fp[j], "\n"); else fprintf(XXschh_fp[j], "\t%s\n", ta_curr->comment); ta_curr = ta_curr->next_ptr; } /* end while ta_curr */ make_pptr_rowclass(tt_curr->ta_ptr->FieldName,cp_table, j); make_cptr_rowclass(tt_curr->ta_ptr->FieldName,pc_table, j); fprintf(XXschh_fp[j],"\n"); fprintf(XXschh_fp[j], "public :\n"); tt_curr = tt_curr->next_ptr; } /* end while tt_cur */ make_declare_ops(TRUE) ; /* table class */ tt_curr = tt; while (tt_curr != NULL) { j = encoding(tt_curr->TTabbr) ; fprintf(XXschh_fp[j],"\nclass %stable", tt_curr->TTabbr); if (tt_curr->comment[0] == '\0') fprintf(XXschh_fp[j], "\n"); else fprintf(XXschh_fp[j]," %s\n", tt_curr->comment); fprintf(XXschh_fp[j], "{\n"); fprintf(XXschh_fp[j], "private :\n"); fprintf(XXschh_fp[j], " char abbrev[5]; /* 2-char abbreviation */\n"); fprintf(XXschh_fp[j], " char *name; /* Table name */\n"); fprintf(XXschh_fp[j], " list<%s*> row; /* List of rows */\n", tt_curr->TTabbr); fprintf(XXschh_fp[j], "\npublic :\n"); fprintf(XXschh_fp[j], " char *getAbbrev(); /* Returns table abbreviation */\n"); fprintf(XXschh_fp[j], " char *getName(); /* Returns table name */\n"); fprintf(XXschh_fp[j], "\n unsigned int getRowCount(); /* Returns number of rows in table */\n"); fprintf(XXschh_fp[j], " list<%s*>::iterator getFirstRow(); /* Returns iterator to first row */\n", tt_curr->TTabbr); fprintf(XXschh_fp[j], " %s *getPrevRow(%s *curr); /* Returns prev iterator */\n", tt_curr->TTabbr, tt_curr->TTabbr); fprintf(XXschh_fp[j], " %s *getNextRow(%s *curr); /* Returns next iterator */\n", tt_curr->TTabbr, tt_curr->TTabbr); fprintf(XXschh_fp[j], " %s *getLastRow(); /* Returns last iterator */\n", tt_curr->TTabbr); fprintf(XXschh_fp[j], " list<%s*>::iterator Terminator(); /* Returns list terminator */\n", tt_curr->TTabbr); fprintf(XXschh_fp[j], " bool isFirstRow(%s * curr); /* True if curr is iterator to first row */\n", tt_curr->TTabbr); fprintf(XXschh_fp[j], " bool isLastRow(%s * curr); /* True if curr is iterator to last row */\n", tt_curr->TTabbr); fprintf(XXschh_fp[j], "\n void insertRow(%s *newRow); /* Inserts a row at end of table */\n", tt_curr->TTabbr); fprintf(XXschh_fp[j], " list<%s*>::iterator removeRow(list<%s*>::iterator i); /* Removes row from table */\n", tt_curr->TTabbr, tt_curr->TTabbr); fprintf(XXschh_fp[j], "\n /* Prints out entire table to file */\n"); fprintf(XXschh_fp[j], " void dump_table(char *viewname, char *file_name, int new_version, char *modestr);\n"); fprintf(XXschh_fp[j], "\n /* Prints out entire table to terminal */\n"); fprintf(XXschh_fp[j], " /* void dump_table(char *viewname, int new_version, char *modestr); */\n"); fprintf(XXschh_fp[j], "\n %stable(char *abbrev, char *name); /* Constructor */\n", tt_curr->TTabbr); fprintf(XXschh_fp[j], " ~%stable(); /* Destructor */\n", tt_curr->TTabbr); fprintf(XXschh_fp[j], "};\n"); fprintf(XXschh_fp[j],"#endif /* USE_STL */\n"); fprintf(XXschh_fp[j],"#endif /* __%sSCHEMA_H__ */\n",tt_curr->TTabbr); tt_curr = tt_curr->next_ptr; } /*** 95s523,chwang,5,11,95. Add btree structures and other relative btree arguments. ***/ /*** ---lines begin--- ***/ /* Trial with ignore the rest - maldred has duplicate fix with extern XXbtidx here, defs in gen_utils.c - RJL 2k0929 */ return; /* rjl 2k0329 */ fprintf(schh_fp,"\n\n/******************************************************************************/\n"); fprintf(schh_fp,"/* The following define the btree structures and relative variables for each */\n"); fprintf(schh_fp,"/* table which defines btree search in schema file. */\n"); fprintf(schh_fp,"/******************************************************************************/\n\n"); fprintf(schh_fp,"\n#define BTREESEARCH 1 \n"); fprintf(schh_fp,"#define SEQUENCESEARCH 0 \n"); fprintf(schh_fp,"#define LEFT 2 \n"); fprintf(schh_fp,"#define RIGHT 3 \n\n"); tt_curr = tt; while (tt_curr != NULL) { fprintf(schh_fp,"int %sbtidx; \n",tt_curr->TTabbr); if (tt_curr->comment[0] != '\0') if (tt_curr->comment[2] == '1') { fprintf(schh_fp,"/******************************************************************************/\n"); fprintf(schh_fp,"/* Table %s btree structure : %sbtree */\n",tt_curr->TTabbr,tt_curr->TTabbr); fprintf(schh_fp,"/******************************************************************************/\n"); fprintf(schh_fp,"struct %sbtree \n",tt_curr->TTabbr); fprintf(schh_fp,"{ \n"); fprintf(schh_fp,"hcg_key key; /* primary key */ \n"); fprintf(schh_fp,"struct %s *ptr; \n",tt_curr->TTabbr); fprintf(schh_fp,"struct %sbtree *parent; \n",tt_curr->TTabbr); fprintf(schh_fp,"struct %sbtree *left; \n",tt_curr->TTabbr); fprintf(schh_fp,"struct %sbtree *right; \n",tt_curr->TTabbr); fprintf(schh_fp,"}; \n"); fprintf(schh_fp,"hcg_extern struct %sbtree *%sbtroot,*%sbtelt,*%sbttemp,*%sbtcurr; \n\n" ,tt_curr->TTabbr,tt_curr->TTabbr,tt_curr->TTabbr,tt_curr->TTabbr ,tt_curr->TTabbr,tt_curr->TTabbr); } tt_curr=tt_curr->next_ptr; } /* end while tt_cur */ fprintf(schh_fp,"hcg_extern char tempbtree[BUFSIZE]; \n"); fprintf(schh_fp,"hcg_extern hcg_key btfinish,btresult;\n"); fprintf(schh_fp,"void pr_find_bt(); \n\n"); return; } void make_declare_ops(unsigned int bDoXXrow) { int dimension, j; char temp_string[ABBREV_NAME_LENGTH]; struct rr_type *tmp_ptr; /* to hold the current position */ tt_curr = tt; while (tt_curr != NULL) { j = encoding(tt_curr->TTabbr) ; ta_curr = tt_curr->ta_ptr->next_ptr; while (ta_curr != NULL) { if(ta_curr->IsKey) fprintf(XXschh_fp[j], " void set_%s (hcg_key id);\n", ta_curr->FieldName); else switch(ta_curr->FieldType[0]) { case 'i' : fprintf(XXschh_fp[j]," void set_%s (int value);\n", ta_curr->FieldName); break; case 'f' : fprintf(XXschh_fp[j]," void set_%s (float value);\n",ta_curr->FieldName); break; case 'c' : case 't' : dimension = atoi(&(ta_curr->FieldType[1])) +1; fprintf(XXschh_fp[j]," void set_%s (char *value);\n",ta_curr->FieldName); break; case 'd' : /* kmiu-removed extra semicolon after '\n' */ fprintf(XXschh_fp[j]," void set_%s (char *value);\n",ta_curr->FieldName); break; } /* switch */ ta_curr = ta_curr->next_ptr; } /* end while ta_curr */ tt_curr = tt_curr->next_ptr; fprintf(XXschh_fp[j],"\n"); } /* end while tt_cur */ tt_curr = tt; while (tt_curr != NULL) { j = encoding(tt_curr->TTabbr) ; ta_curr = tt_curr->ta_ptr->next_ptr; while (ta_curr != NULL) { if(ta_curr->IsKey) fprintf(XXschh_fp[j], " hcg_key get_%s ();\n", ta_curr->FieldName); else switch(ta_curr->FieldType[0]) { case 'i' : fprintf(XXschh_fp[j]," int get_%s ();\n", ta_curr->FieldName); break; case 'f' : fprintf(XXschh_fp[j]," float get_%s ();\n",ta_curr->FieldName); break; case 'c' : case 't' : dimension = atoi(&(ta_curr->FieldType[1])) +1; fprintf(XXschh_fp[j]," char* get_%s ();\n",ta_curr->FieldName); break; case 'd' : fprintf(XXschh_fp[j]," char* get_%s ();\n",ta_curr->FieldName); break; } /* switch */ ta_curr = ta_curr->next_ptr; } /* end while ta_curr */ fprintf(XXschh_fp[j],"\n"); tt_curr = tt_curr->next_ptr; } /* end while tt_cur */ tt_curr = tt; while (tt_curr != NULL) { j = encoding(tt_curr->TTabbr) ; if (!bDoXXrow) { fprintf(XXschh_fp[j]," %s* create_row(); \n",tt_curr->TTabbr); fprintf(XXschh_fp[j]," void link_row () ; \n"); fprintf(XXschh_fp[j]," void parse_row (char *buffer, int idx, hcg_key hcg_k) ; \n"); fprintf(XXschh_fp[j]," void add_row (char *viewname) ; \n"); fprintf(XXschh_fp[j]," void delete_row () ; \n"); fprintf(XXschh_fp[j]," void dump_table (char *viewname, char *file_name, int new_version, char *modestr) ; \n"); fprintf(XXschh_fp[j]," void dump_row (char *viewname, char *file_name, int new_version, char *modestr) ; \n"); } else { /* child methods */ tmp_ptr = pc_table; while(tmp_ptr) /* not end of list */ { if (strncmp(tt_curr->ta_ptr->FieldName,tmp_ptr->firstid, strlen(tt_curr->ta_ptr->FieldName)) == 0) { strncpy_null(temp_string, tmp_ptr->secondid, hcg_abbr_size); fprintf(XXschh_fp[j]," void insertChild_%s(%s *childRow); /* Adds a child to list */\n", tmp_ptr->secondid, temp_string); fprintf(XXschh_fp[j]," void removeChild_%s(list<%s*>::iterator rowIter); /* Remove child */\n", tmp_ptr->secondid, temp_string); fprintf(XXschh_fp[j]," list<%s*>::iterator getFirstChild_%s(); /* Returns 1st child */\n", temp_string, tmp_ptr->secondid); fprintf(XXschh_fp[j]," list<%s*>::iterator getLastChild_%s(); /* Returns last child */\n", temp_string, tmp_ptr->secondid); fprintf(XXschh_fp[j]," list<%s*>::iterator %s_Terminator(); /* Returns terminator */\n", temp_string, tmp_ptr->secondid); } tmp_ptr = tmp_ptr->next_ptr; } /* parent methods */ tmp_ptr = cp_table; while(tmp_ptr) /* not end of list */ { if (strncmp(tt_curr->ta_ptr->FieldName,tmp_ptr->firstid, strlen(tt_curr->ta_ptr->FieldName)) == 0) { strncpy_null(temp_string, tmp_ptr->secondid, hcg_abbr_size); fprintf(XXschh_fp[j],"\n void setParent_%s(%s *currentRow); /* Initializes parent */\n", tmp_ptr->secondid, temp_string); fprintf(XXschh_fp[j]," %s *getParent_%s(); /* Returns parent */\n", temp_string, tmp_ptr->secondid); } tmp_ptr = tmp_ptr->next_ptr; } fprintf(XXschh_fp[j],"\n void link_row () ; \n"); fprintf(XXschh_fp[j]," void parse_row (char *buffer, int idx, hcg_key hcg_k); \n"); fprintf(XXschh_fp[j]," void add_row (char *viewname); \n"); fprintf(XXschh_fp[j]," list<%s*>::iterator delete_row (list<%s*>::iterator rowIter); /* Deletes the row */\n", tt_curr->TTabbr, tt_curr->TTabbr); fprintf(XXschh_fp[j],"\n /* Prints a row to a file */\n"); fprintf(XXschh_fp[j]," void dump_row (char *viewname, char *file_name, int new_version, char *modestr); \n"); fprintf(XXschh_fp[j],"\n /* Prints a row to terminal */\n"); fprintf(XXschh_fp[j]," void dump_row (char *viewname, int new_version, char *modestr); \n"); fprintf(XXschh_fp[j],"\n %s(); /* Constructor */\n",tt_curr->TTabbr); fprintf(XXschh_fp[j]," ~%s(); /* Destructor */\n", tt_curr->TTabbr); } if (cli_log == 1) { fprintf(XXschh_fp[j]," void add_row_log(char *);\n"); fprintf(XXschh_fp[j]," void log_do_add_row (char *, char *, int);\n"); fprintf(XXschh_fp[j]," void log_do_set_int_row (const char *, const int );\n"); fprintf(XXschh_fp[j]," void log_do_set_flt_row (const char *, const int );\n"); fprintf(XXschh_fp[j]," void log_do_set_key_row (const char *, hcg_key );\n"); fprintf(XXschh_fp[j]," void log_do_set_str_row (const char *, const char * );\n"); } fprintf(XXschh_fp[j],"} ;\n"); tt_curr = tt_curr->next_ptr; } /* end while tt_cur */ }