/******************************************************************************* * GenBDataMySql.cc BEAM Data output * T.Barnaby, BEAM Ltd, 12/9/03 ******************************************************************************* */ #define DEBUG 1 #include <stdio.h> #include <stdarg.h> #include <strings.h> #include <GenBDataMySql.h> #include <bidl.h> BString GenBDataMySql::getTypeName(BString typeName){ if(typeName == "Int32") return "Int"; else if(typeName == "String") return "Text"; else if(typeName == "Date") return "Date"; else if(typeName == "DateTime") return "DateTime"; else return typeName; } BError GenBDataMySql::produceType(BString& s, BString name, Type* t){ BError err; BString typeName; BString n; BIter i; BList<Node*>* nl; Type* dt; Type* mt; // printf("produceType: %s\n", t->name().retStr()); if(dt = t->derived()){ produceType(s, name, dt); } if(name.len()) name = name + "_"; nl = &t->node()->nodes(); for(nl->start(i); !nl->isEnd(i); nl->next(i)){ n = name + nl->get(i)->node(1)->name(); typeName = nl->get(i)->node(0)->name(); // printf("ProduceMember: %s %s\n", typeName.retStr(), n.retStr()); if(mt = gtypelist.search(typeName)){ produceType(s, n, mt); } else { if(s.len()) s = s + ", "; if(typeName == "Id"){ s = s + "`" + n + "` " + "Int" + " not null auto_increment primary key"; } else if(typeName == "List"){ s = s + "`" + n + "` " + "Text"; } else { s = s + "`" + n + "` " + getTypeName(typeName); } } } return err; } BError GenBDataMySql::produceImp(Node* n){ BError err; BString s; BIter i; Type* tp; int typeId; switch(n->nodeType()){ case Node::TMODULE: omodule = n->name(); // ofileImp.writeLine(BString("database ") + omodule + "\n"); for(n->nodes().start(i); !n->nodes().isEnd(i); n->nodes().next(i)){ produceImp(n->nodes()[i]); } break; case Node::TLIST: for(n->nodes().start(i); !n->nodes().isEnd(i); n->nodes().next(i)){ produceImp(n->nodes()[i]); } break; case Node::TTYPEDOMAIN: otypeDomain = atoi(n->name()); break; case Node::TSTRUCT: s = ""; if((n->name() == "BObjData") || (n->name() == "BObject")) return err; if(tp = gtypelist.search(n->name())){ produceType(s, "", tp); } else { err.set(1, BString("Unknown type: ") + n->name()); return err; } typeId = (otypeDomain << 16) | (otypeNum); s = BString("type Int not null, ") + s; ofileImp.writeLine(n->name() + " (" + s + ")\n"); otypeNum++; break; default: break; } return err; } BError GenBDataMySql::produceHeaderImp(){ BError err; return err; } BError GenBDataMySql::produceTrailerImp(){ BError err; return err; } GenBDataMySql::GenBDataMySql(){ otypeDomain = 0; otypeNum = 1; } GenBDataMySql::~GenBDataMySql(){ } BError GenBDataMySql::produce(Node* n, BString fileName){ BError err; // dprintf("GenBDataMySql::produce: %p\n", n); ofileName = fileName; ofileImp.open(ofileName + ".mysql", "w"); // File Headers produceHeaderImp(); // Generate code produceImp(n); // Generate trailers produceTrailerImp(); ofileImp.close(); return err; }