/* * Copyright (c) 1995 Gunther Schadow. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #include "t2c.h" #include #include void output_definition(const char *owner, char *name, const char *type, const struct decl_rec *decl) { resetnames(); Table::TabType tab_type; if(equals("TABLE", type)) tab_type = Table::table; else if(equals("VIEW", type)) tab_type = Table::view; else { cerr << "unknown table type: ``" << type << "''" << endl; exit(1); } const struct decl_rec *p; char filename[strlen(name) + sizeof(".cc") + 1]; strcpy(filename, classname(name)); strcat(filename, ".cc"); fstream out(filename, ios::out); out << "/*" << endl << " * This file was generated by t2c. Copyright (c) 1995 Gunther Schadow." << endl << " *" << endl << " * " << owner << "." << name << " (" << type << ")" << endl << " */" << endl << endl << "#include \"" << classname(name) << ".h\"" << endl << "#include " << endl << "#include " << endl << endl; /* * owner */ out << "const char *" << classname(name) << "::the_owner = \"" << owner << "\";" << endl << endl; /* * static type (table or view) */ out << "Table::TabType " << classname(name) << "::the_type = " << lowername(type) << ';' << endl << endl; /* * select_cmd */ out << "const char" << endl << classname(name) << "::select_cmd[] =" << endl << " \"SELECT "; if(tab_type == Table::table) out << "ROWID, "; out << "ROWNUM, LEVEL, \"" << endl; for(p = decl; p != NULL; p = p->next) { out << " \"" << p->name; if(p->next != NULL) out << ", \"" << endl; else out << " \"" << endl; } out << " \"AS "; if(tab_type == Table::table) out << ":ROWID?, "; out << ":UINT, :UINT, \"" << endl; for(p = decl; p != NULL; p = p->next) { out << " \":" << p->type->cb_type; if(p->size != 0) out << '[' << p->size + 1 << ']'; out << '?'; if(p->next != NULL) out << ", \"" << endl; else out << " \"" << endl; } out << " \"FROM \";" << endl << endl; /* * insert_cmd (trailer) */ out << "const char" << endl << classname(name) << "::insert_cmd[] =" << endl << " \"( \"" << endl; for(p = decl; p != NULL; p = p->next) { out << " \"" << p->name; if(p->next != NULL) out << ", \"" << endl; else out << " ) \"" << endl; } out << " \"VALUES ( \"" << endl; for(p = decl; p != NULL; p = p->next) { out << " \":" << p->type->cb_type; if(p->size != 0) out << '[' << p->size + 1 << ']'; out << '?'; if(p->next != NULL) out << ", \"" << endl; } out << " ) \";" << endl << endl; /* * update_cmd (trailer) */ out << "const char" << endl << classname(name) << "::update_cmd[] =" << endl << " \"SET \"" << endl; for(p = decl; p != NULL; p = p->next) { out << " \"" << p->name << " = :" << p->type->cb_type; if(p->size != 0) out << '[' << p->size + 1 << ']'; out << '?'; if(p->next != NULL) out << ", \"" << endl; } out << " \";" << endl << endl; /* * create_cmd (trailer) */ out << "const char" << endl << classname(name) << "::create_cmd[] =" << endl << " \"(\"" << endl; for(p = decl; p != NULL; p = p->next) { out << " \"" << p->name << " " << p->type->o_type; if(p->size != 0) out << '(' << p->size << ')'; if(p->next != NULL) out << ", \"" << endl; } out << " )\";" << endl << endl; /* * CTOR */ out << classname(name) << "::" << classname(name) << "() : Table()" << endl << "{" << endl; for(p = decl; p != NULL; p = p->next) { if(p->size) out << " V_" << p->name << "[S_" << p->name << "] = '\\0';" << endl; } out << " unset();" << endl << "}" << endl << endl; /* * unset() everything */ out << "void" << endl << classname(name) << "::unset()" << endl << "{" << endl; for(p = decl; p != NULL; p = p->next) { out << " I_" << p->name << " = I_NULL;" << endl; } out << "}" << endl << endl; /* * retrieve() */ out << "result" << endl << classname(name) << "::retrieve(const char *clause)" << endl << "{" << endl << " size_t len = 1;" << endl << " if(the_owner != NULL)" << endl << " len += strlen(the_owner) + 1;" << endl << " len += sizeof(select_cmd) + sizeof(\"" << name << " \") " "+ strlen(clause) - 2;" << endl << " char cmd_buf[len];" << endl << " strcpy(cmd_buf, select_cmd);" << endl << " if(the_owner != NULL)" << endl << " {" << endl << " strcat(cmd_buf, the_owner);" << endl << " strcat(cmd_buf, \".\");" << endl << " }" << endl << " strcat(cmd_buf, \"" << name << " \");" << endl << " strcat(cmd_buf, clause);" << endl << endl << " Cursor = Database->open(cmd_buf," << endl; if(tab_type == Table::table) out << " &the_oid.rowid, &the_oid.indicator," << endl; out << " &the_rownum, &the_level," << endl; for(p = decl; p != NULL; p = p->next) { out << " &V_" << p->name << ", &I_" << p->name; if(p->next != NULL) out << "," << endl; } out << ");" << endl << endl << " if(! Cursor)" << endl << " {" << endl << " cerr << __PRETTY_FUNCTION__ << \":open\" << endl;" << endl << " exit(1);" << endl << " }" << endl << endl << " if(! Database->execute(Cursor))" << endl << " {" << endl << " cerr << __PRETTY_FUNCTION__ << \":execute\" << endl;" << endl << " exit(1);" << endl << " }" << endl << endl << " if(Database->fetch(Cursor))" << endl << " return SUCCESS;" << endl << " else" << endl << " return FAIL;" << endl << "}" << endl << endl; /* * insert() */ out << "void " << classname(name) << "::insert()" << endl << "{" << endl << " size_t len = 1;" << endl << " if(the_owner != NULL)" << endl << " len += strlen(the_owner) + 1;" << endl << " len += sizeof(insert_cmd) + sizeof(\"INSERT INTO " << name << " \") - 2;" << endl << " char cmd_buf[len];" << endl << " strcpy(cmd_buf, \"INSERT INTO \");" << endl << " if(the_owner != NULL)" << endl << " {" << endl << " strcat(cmd_buf, the_owner);" << endl << " strcat(cmd_buf, \".\");" << endl << " }" << endl << " strcat(cmd_buf, \"" << name << " \");" << endl << " strcat(cmd_buf, insert_cmd);" << endl << endl << " if(!Database->perform(cmd_buf," << endl; for(p = decl; p != NULL; p = p->next) { out << " &V_" << p->name << ", &I_" << p->name; if(p->next != NULL) out << "," << endl; } out << "))" << endl << " {" << endl << " cerr << __PRETTY_FUNCTION__ << \":perform\" << endl;" << endl << " exit(1);" << endl << " }" << endl << "}" << endl << endl; /* * update() this object */ out << "void " << classname(name) << "::update()" << endl << "{" << endl << " if(object_id().indicator != I_NON_NULL)" << endl << " {" << endl << " cerr << __PRETTY_FUNCTION__ << \"invalid object id\" << endl;" << endl << " abort();" << endl << " }" << endl << endl << " size_t len = 1;" << endl << " if(the_owner != NULL)" << endl << " len += strlen(the_owner) + 1;" << endl << " len += sizeof(update_cmd) + sizeof(\"UPDATE " << name << " WHERE ROWID = :ROWID? \") - 1;" << endl << " char cmd_buf[len];" << endl << " strcpy(cmd_buf, \"UPDATE \");" << endl << " if(the_owner != NULL)" << endl << " {" << endl << " strcat(cmd_buf, the_owner);" << endl << " strcat(cmd_buf, \".\");" << endl << " }" << endl << " strcat(cmd_buf, \"" << name << " \");" << endl << " strcat(cmd_buf, update_cmd);" << endl << " strcat(cmd_buf, \" WHERE ROWID = :ROWID? \");" << endl << endl << " if(!Database->perform(cmd_buf," << endl; for(p = decl; p != NULL; p = p->next) { out << " &V_" << p->name << ", &I_" << p->name << "," << endl; } out << " &the_oid.rowid, &the_oid.indicator))" << endl << " {" << endl << " cerr << __PRETTY_FUNCTION__ << \":perform\" << endl;" << endl << " exit(1);" << endl << " }" << endl << "}" << endl << endl; /* * update(const char* clause) */ out << "void " << classname(name) << "::update(const char *clause)" << endl << "{" << endl << " size_t len = 1;" << endl << " if(the_owner != NULL)" << endl << " len += strlen(the_owner) + 1;" << endl << " len += sizeof(update_cmd) + sizeof(\"UPDATE " << name << " \") + strlen(clause) - 2;" << endl << " char cmd_buf[len];" << endl << " strcpy(cmd_buf, \"UPDATE \");" << endl << " if(the_owner != NULL)" << endl << " {" << endl << " strcat(cmd_buf, the_owner);" << endl << " strcat(cmd_buf, \".\");" << endl << " }" << endl << " strcat(cmd_buf, \"" << name << " \");" << endl << " strcat(cmd_buf, update_cmd);" << endl << " strcat(cmd_buf, clause);" << endl << endl << " if(!Database->perform(cmd_buf," << endl; for(p = decl; p != NULL; p = p->next) { out << " &V_" << p->name << ", &I_" << p->name; if(p->next != NULL) out << "," << endl; } out << "))" << endl << " {" << endl << " cerr << __PRETTY_FUNCTION__ << \":perform\" << endl;" << endl << " exit(1);" << endl << " }" << endl << "}" << endl << endl; /* * remove() this object */ out << "void " << classname(name) << "::remove()" << endl << "{" << endl << " if(object_id().indicator != I_NON_NULL)" << endl << " {" << endl << " cerr << __PRETTY_FUNCTION__ << \"invalid object id\" << endl;" << endl << " abort();" << endl << " }" << endl << endl << " size_t len = 1;" << endl << " if(the_owner != NULL)" << endl << " len += strlen(the_owner) + 1;" << endl << " len += sizeof(\"DELETE FROM " << name << " WHERE ROWID = :ROWID? \") - 1;" << endl << " char cmd_buf[len];" << endl << " strcpy(cmd_buf, \"DELETE FROM \");" << endl << " if(the_owner != NULL)" << endl << " {" << endl << " strcat(cmd_buf, the_owner);" << endl << " strcat(cmd_buf, \".\");" << endl << " }" << endl << " strcat(cmd_buf, \"" << name << " WHERE ROWID = :ROWID? \");" << endl << endl << " if(!Database->perform(cmd_buf, &the_oid.rowid, &the_oid.indicator))" << endl << " {" << endl << " cerr << __PRETTY_FUNCTION__ << \":perform\" << endl;" << endl << " exit(1);" << endl << " }" << endl << "}" << endl << endl; /* * remove(const char *) some records */ out << "void " << classname(name) << "::remove(const char *clause)" << endl << "{" << endl << " size_t len = 1;" << endl << " if(the_owner != NULL)" << endl << " len += strlen(the_owner) + 1;" << endl << " len += sizeof(\"DELETE FROM " << name << " \") " "+ strlen(clause) - 1;" << endl << " char cmd_buf[len];" << endl << " strcpy(cmd_buf, \"DELETE FROM \");" << endl << " if(the_owner != NULL)" << endl << " {" << endl << " strcat(cmd_buf, the_owner);" << endl << " strcat(cmd_buf, \".\");" << endl << " }" << endl << " strcat(cmd_buf, \"" << name << " \");" << endl << " strcat(cmd_buf, clause);" << endl << endl << " if(!Database->perform(cmd_buf))" << endl << " {" << endl << " cerr << __PRETTY_FUNCTION__ << \":perform\" << endl;" << endl << " exit(1);" << endl << " }" << endl << "}" << endl << endl; /* * create() */ out << "void " << classname(name) << "::create()" << endl << "{" << endl << endl << " size_t len = 1;" << endl << " if(the_owner != NULL)" << endl << " len += strlen(the_owner) + 1;" << endl << " len += sizeof(\"CREATE TABLE " << name << " \") " "+ strlen(create_cmd) - 1;" << endl << " char cmd_buf[len];" << endl << " strcpy(cmd_buf, \"CREATE TABLE \");" << endl << " if(the_owner != NULL)" << endl << " {" << endl << " strcat(cmd_buf, the_owner);" << endl << " strcat(cmd_buf, \".\");" << endl << " }" << endl << " strcat(cmd_buf, \"" << name << " \");" << endl << " strcat(cmd_buf, create_cmd);" << endl << endl << " if(!Database->perform(cmd_buf))" << endl << " {" << endl << " cerr << __PRETTY_FUNCTION__ << \":perform\" << endl;" << endl << " exit(1);" << endl << " }" << endl << "}" << endl << endl; /* * drop() */ out << "void " << classname(name) << "::drop(Table::TabType t)" << endl << "{" << endl << " char *type_name;" << endl << " switch(t) {" << endl << " case table: type_name = \"TABLE\"; break;" << endl << " case view: type_name = \"VIEW\"; break;" << endl << " }" << endl << endl << " size_t len = 1;" << endl << " if(the_owner != NULL)" << endl << " len += strlen(the_owner) + 1;" << endl << " len += sizeof(\"DROP " << name << " \") + strlen(type_name) - 1;" << endl << " char cmd_buf[len];" << endl << " strcpy(cmd_buf, \"DROP \");" << endl << " strcat(cmd_buf, type_name);" << endl << " strcat(cmd_buf, \" \");" << endl << " if(the_owner != NULL)" << endl << " {" << endl << " strcat(cmd_buf, the_owner);" << endl << " strcat(cmd_buf, \".\");" << endl << " }" << endl << " strcat(cmd_buf, \"" << name << " \");" << endl << endl << " if(!Database->perform(cmd_buf))" << endl << " {" << endl << " cerr << __PRETTY_FUNCTION__ << \":perform\" << endl;" << endl << " exit(1);" << endl << " }" << endl << "}" << endl << endl; }