X-Git-Url: http://git.cinelerra-gg.org/git/?a=blobdiff_plain;f=cinelerra-5.0%2Fdb%2Fxsch.C;fp=cinelerra-5.0%2Fdb%2Fxsch.C;h=0000000000000000000000000000000000000000;hb=30bdb85eb33a8ee7ba675038a86c6be59c43d7bd;hp=f05ef0aa26f4eb2c8ff3f8dc1a78e6e502d87f11;hpb=52fcc46226f9df46f9ce9d0566dc568455a7db0b;p=goodguy%2Fhistory.git diff --git a/cinelerra-5.0/db/xsch.C b/cinelerra-5.0/db/xsch.C deleted file mode 100644 index f05ef0aa..00000000 --- a/cinelerra-5.0/db/xsch.C +++ /dev/null @@ -1,1637 +0,0 @@ -#include -#include -#include -#include -#include - -using namespace std; - -#define MAX_LINE_SZ 256 -#define expect(c) do { if( ch != c ) return -1; ++cp; } while(0) - -class iline { -public: - FILE *fp; long pos; - char line[MAX_LINE_SZ]; - int no; - iline(FILE *f) : fp(f), pos(0), no(0) {} - iline(iline &i) { - fp = i.fp; pos = i.pos; - strcpy(line,i.line); no = i.no; - } -}; - -class ichar : public virtual iline { -public: - int i, n; - ichar(FILE *f) : iline(f) { i = n = 0; } - ~ichar() {} - ichar tws(); - char &operator *(); - char &operator [](int n) { return line[i+n]; } - char &operator +=(int n) { i+=n; return operator*(); } - char &operator -=(int n) { i-=n; return operator*(); } - friend ichar &operator ++(ichar &t); - friend char operator ++(ichar &t,int); -}; - -ichar &operator ++(ichar &t) { ++t.i; return t; } -char operator ++(ichar &t,int) { return t.line[t.i++]; } - -char &ichar::operator *() -{ - if( i == n ) { - int ch; fseek(fp, pos, SEEK_SET); - for( i=n=0; n eobjs; - -class dobj { -public: - tobj *top; - string *name; - enum { ty_none, ty_bit, ty_boolean, - ty_tinyint, ty_smallint, ty_mediumint, ty_decimal, - ty_integer, ty_bigint, ty_real, ty_double, ty_float, - ty_date, ty_time, ty_timestamp, ty_datetime, ty_year, - ty_char, ty_varchar, ty_binary, ty_varbinary, - ty_blob, ty_tinyblob, ty_mediumblob, ty_longblob, - ty_text, ty_tinytext, ty_mediumtext, ty_longtext, - ty_enum, ty_set, ty_media } ty; - enum { - var_types = (1<>ty) & 1; } - int is_text() { return (text_types>>ty) & 1; } - int length, zeroed, is_null, is_autoincr, is_binary, is_unsign, has_def; - iobj *idx; - eobjs eop; - enum def_type { def_none, def_integer, def_double, def_string, def_null, }; - union { int i; double d; string *s; } def; - dobj(tobj *tp) : top(tp) { - ty = ty_none; idx = 0; - length = zeroed = is_null = is_autoincr = is_binary = is_unsign = has_def = -1; - } - ~dobj() {} -}; - -typedef list dobjs; - -class tobj { -public: - string *name; - dobjs dop; - - tobj() : name(0), dop(0) {} - ~tobj() {}; -}; - -list tables; - - -class kobj { -public: - string *name; - - kobj(string *s) : name(s) {} - ~kobj() {}; -}; - -typedef list kobjs; - -class iobj { -public: - string *name; - string *tbl; - list keys; - short unique; - short primary; - int length; - - iobj() : name(0), tbl(0), unique(0), primary(0), length(-1) {} - ~iobj() {}; -}; - -list indecies; - - -class robj { -public: - string *name; - enum { xref_no_action, xref_restrict, xref_cascade, xref_set_null, }; - int on_delete, on_update; - list keys; - robj() : on_delete(xref_no_action), on_update(xref_no_action) {} - ~robj() {} -}; - - -// trim white space -ichar &tws(ichar &c) -{ - ichar b = c; - for(;;) { - if( isspace(*b) ) { ++b; continue; } - if( *b == '/' && b[1] == '*' ) { - ++b; do { ++b; } while( *b != '*' || b[1] != '/' ); - b += 2; continue; - } - else if( *b == '-' && b[1] == '-' ) { - ++b; do { ++b; } while( *b != '\n' ); - ++b; continue; - } - break; - } - c = b; - return c; -} - -// scan id -string *tid(ichar &c, string *sp=0) -{ - string *rp = 0; - ichar b = tws(c); - if( *b && (isalpha(*b) || *b == '_') ) { - rp = !sp ? new string() : sp; - rp->push_back(toupper(b++)); - while( *b && (isalpha(*b) || isdigit(*b) || *b == '_') ) { - rp->push_back(tolower(b++)); - } - } - if( rp ) c = b; - return rp; -} - -// scan string '..' or ".." -int str_value(ichar &cp, string *&sp) -{ - ichar bp = cp; sp = 0; - int ch = *cp; - if( ch != '\'' && ch != '"' ) return -1; - int delim = ch; ++cp; - for( sp=new string(); (ch=*cp) && ch != delim; ++cp ) { - if( ch == '\\' && !(ch=*++cp) ) break; - sp->push_back(ch); - } - if( ch != delim ) { - delete sp; sp = 0; - cp = bp; - return -1; - } - ++cp; - return 0; -} - -// scan string '..' or "..", or number, or NULL -int def_value(ichar &cp, dobj *dp) -{ - ichar bp = cp; - if( str_value(cp,dp->def.s) >= 0 ) { - dp->has_def = dobj::def_string; - return 0; - } - int ch = *tws(cp); - if( isdigit(ch) || ch == '-' || ch == '+' ) { - int sign = 0; - if( ch == '-' ) sign = -1; - if( ch == '+' ) sign = 1; - if( sign ) ++cp; else sign = 1; - int n = 0; - while( (ch-='0') >= 0 && ch <= 9 ) { - n = n*10 + ch; ch = *++cp; - } - if( ch == '.' ) { - double v = n; - double frac = 1.; - while( (ch-='0') >= 0 && ch <= 9 ) { - v = v + ch/(frac*=10); ch = *++cp; - } - dp->has_def = dobj::def_double; - dp->def.d = v * sign; - } - else { - dp->has_def = dobj::def_integer; - dp->def.i = n * sign; - } - return 0; - } - string *id = tid(cp); - if( id ) { - if( *id == "Null" ) { - dp->has_def = dobj::def_null; - dp->def.s = 0; - return 0; - } - delete id; - } - cp = bp; - return -1; -} - -// scan (number) -int dimen(ichar &cp, dobj *dp) -{ - int n = 0; - int ch = *tws(cp); - if( ch == '(' ) { - ++cp; ch = *tws(cp); - while( (ch-='0') >= 0 && ch <= 9 ) { - n = n*10 + ch; ch = *++cp; - } - ch = *tws(cp); expect(')'); - dp->length = n; - } - return 0; -} - -// scan Unsigned or Signed, Zerofill -int numeric(ichar &cp, dobj *dp) -{ - ichar bp = cp; - string *id = tid(cp); - if( id && *id == "Unsigned" ) { - dp->is_unsign = 1; - bp = cp; id = tid(cp); - } - else if( id && *id == "Signed" ) { - dp->is_unsign = 0; - bp = cp; id = tid(cp); - } - if( id && *id == "Zerofill" ) { - dp->zeroed = 1; - } - else - cp = bp; - return 0; -} - -// (number) or numeric qualifier -int dimen0(ichar &cp, dobj *dp) -{ - return dimen(cp, dp) < 0 || numeric(cp, dp) < 0 ? -1 : 0; -} - -// scan data type -int dtype(ichar &cp, dobj *dp) -{ - string *id = tid(cp); - - if( id ) { - if( *id == "Bit" ) { - dp->ty = dobj::ty_bit; - if( dimen0(cp, dp) < 0 ) return -1; - return 0; - } - - if( *id == "Tinyint" ) { - dp->ty = dobj::ty_tinyint; - if( dimen0(cp, dp) < 0 ) return -1; - return 0; - } - - if( *id == "Smallint" ) { - dp->ty = dobj::ty_smallint; - if( dimen0(cp, dp) < 0 ) return -1; - return 0; - } - - if( *id == "Mediumint" ) { - dp->ty = dobj::ty_mediumint; - if( dimen0(cp, dp) < 0 ) return -1; - return 0; - } - - if( *id == "Int" || *id == "Integer" ) { - dp->ty = dobj::ty_integer; - if( dimen0(cp, dp) < 0 ) return -1; - return 0; - } - - if( *id == "Bigint" ) { - dp->ty = dobj::ty_bigint; - if( dimen0(cp, dp) < 0 ) return -1; - return 0; - } - - if( *id == "Real" ) { - dp->ty = dobj::ty_real; - if( dimen0(cp, dp) < 0 ) return -1; - return 0; - } - - if( *id == "Double" ) { - dp->ty = dobj::ty_double; - if( dimen0(cp, dp) < 0 ) return -1; - return 0; - } - - if( *id == "Float" ) { - dp->ty = dobj::ty_float; - if( dimen0(cp, dp) < 0 ) return -1; - return 0; - } - - if( *id == "Decimal" ) { - dp->ty = dobj::ty_decimal; - if( dimen0(cp, dp) < 0 ) return -1; - return 0; - } - - if( *id == "Date" ) { - dp->ty = dobj::ty_date; - return 0; - } - else if( *id == "Time" ) { - dp->ty = dobj::ty_time; - return 0; - } - else if( *id == "Timestamp" ) { - dp->ty = dobj::ty_timestamp; - return 0; - } - else if( *id == "Datetime" ) { - dp->ty = dobj::ty_datetime; - return 0; - } - else if( *id == "Year" ) { - dp->ty = dobj::ty_year; - return 0; - } - - if( *id == "Char" ) { - dp->ty = dobj::ty_char; - if( dimen(cp, dp) < 0 ) return -1; - return 0; - } - - if( *id == "Varchar" ) { - dp->ty = dobj::ty_varchar; - if( dimen(cp, dp) < 0 ) return -1; - if( (id=tid(cp)) != 0 ) { - ichar bp = cp; - if( *id == "Binary" ) { - dp->is_binary = 1; - } - else - cp = bp; - } - return 0; - } - - if( *id == "Binary" ) { - dp->ty = dobj::ty_binary; - if( dimen(cp, dp) < 0 ) return -1; - return 0; - } - - if( *id == "Varbinary" ) { - dp->ty = dobj::ty_varbinary; - if( dimen(cp, dp) < 0 ) return -1; - return 0; - } - - if( *id == "Tinyblob" ) { - dp->ty = dobj::ty_tinyblob; - return 0; - } - - if( *id == "Blob" ) { - dp->ty = dobj::ty_blob; - return 0; - } - - if( *id == "Mediumblob" ) { - dp->is_unsign = 1; - dp->ty = dobj::ty_mediumblob; - return 0; - } - - if( *id == "Longblob" ) { - dp->ty = dobj::ty_longblob; - return 0; - } - - if( *id == "Tinytext" ) { - dp->ty = dobj::ty_tinytext; - return 0; - } - - if( *id == "Text" ) { - dp->ty = dobj::ty_text; - return 0; - } - - if( *id == "Mediumtext" ) { - dp->ty = dobj::ty_mediumtext; - return 0; - } - - if( *id == "Longtext" ) { - dp->ty = dobj::ty_longtext; - return 0; - } - - if( *id == "Bool" || *id == "Boolean" ) { - dp->ty = dobj::ty_boolean; - return 0; - } - - if( *id == "Enum" ) { - dp->ty = dobj::ty_enum; - int ch = *tws(cp); expect('('); - if( str_value(tws(cp),id) < 0 ) return -1; - dp->eop.push_back(id); - while( *tws(cp) == ',' ) { - if( str_value(tws(++cp),id) < 0 ) return -1; - dp->eop.push_back(id); - } - ch = *tws(cp); expect(')'); - return 0; - } - - if( *id == "Media" ) { - dp->ty = dobj::ty_media; - return 0; - } - } - - return -1; -} - -// scan reference -int xrefer(ichar &cp, robj *rp) -{ - string *id = tid(cp); - if( !id ) return -1; - rp->name = id; - int ch = *tws(cp); expect('('); - if( !(id=tid(cp)) ) return -1; - rp->keys.push_back(id); - while( *tws(cp) == ',' ) { - if( !(id=tid(++cp)) ) return -1; - rp->keys.push_back(id); - } - ch = *tws(cp); expect(')'); - if( !(id=tid(cp)) ) return -1; - if( *id != "On" ) return -1; - if( !(id=tid(cp)) ) return -1; - int *pp = 0; - if( *id == "Delete" ) { - pp = &rp->on_delete; - } - else if( *id == "Update" ) { - pp = &rp->on_update; - } - if( !pp ) return -1; - if( !(id=tid(cp)) ) return -1; - if( *id == "Restrict" ) { - rp->on_delete = robj::xref_restrict; - return 0; - } - if( *id == "Cascade" ) { - rp->on_delete = robj::xref_cascade; - return 0; - } - if( *id == "Set" ) { - if( !(id=tid(cp)) ) return -1; - if( *id != "Null" ) return -1; - rp->on_delete = robj::xref_set_null; - return 0; - } - if( *id == "No" ) { - if( !(id=tid(cp)) ) return -1; - if( *id != "Action" ) return -1; - rp->on_delete = robj::xref_no_action; - return 0; - } - return -1; -} - -// scan datatype extension -int xtype(ichar &cp, dobj *dp) -{ - string *id = tid(cp); - if( id ) { - if( *id == "Not" ) { - if( *tid(cp) != "Null" ) return -1; - dp->is_null = 0; - return 0; - } - - if( *id == "Null" ) { - dp->is_null = 1; - return 0; - } - - if( *id == "Default" ) { - if( def_value(tws(cp),dp) < 0 ) return -1; - return 0; - } - - if( *id == "Auto_increment" ) { - dp->is_autoincr = 1; - if( dp->idx ) dp->idx->unique = 1; - return 0; - } - - if( *id == "Unique" || *id == "Primary" ) { - int unique = dp->is_autoincr > 0 ? 1 : 0; - int primary = 0; - if( *id == "Unique" ) { - unique = 1; id = tid(cp); - } - if( *id == "Primary" ) primary = 1; - ichar bp = cp; - if( *tid(cp) != "Key" ) cp = bp; - iobj *idx = new iobj(); - dp->idx = idx; - idx->name = new string(*dp->name); - idx->name->push_back('_'); - idx->tbl = new string(*dp->top->name); - idx->unique = unique; - idx->primary = primary; - idx->keys.push_back(dp->name); - indecies.push_back(idx); - return 0; - } - -#if 0 - if( *id == "Comment" ) { - return 0; - } - - if( *id == "Column_format" ) { - return 0; - } - - if( *id == "Storage" ) { - return 0; - } -#endif - - if( *id == "References" ) { - ichar bp = cp; - robj *rop = new robj(); - if ( xrefer(cp, rop) < 0 ) { - cp = bp; - return -1; - } - return 0; - } - } - return -1; -} - -// scan table member line -int member(ichar &cp, dobj *dp) -{ - dp->name = tid(cp); - if( dtype(cp,dp) < 0 ) return -1; - - for( int ch=*tws(cp); (ch=*tws(cp)) && isalpha(ch); ) { - if( xtype(cp,dp) < 0 ) return -1; - } - - return 0; -} - -// scan create table line -int table(ichar &cp, tobj *top) -{ - string *id = tid(cp); - if( !id ) return -1; - top->name = id; - int ch = *tws(cp); expect('('); - for(;;) { - dobj *dp = new dobj(top); - if( member(cp,dp) < 0 ) return -1; - top->dop.push_back(dp); - if( (ch=*tws(cp)) == ')' ) break; - expect(','); - } - expect(')'); - while( (id=tid(cp)) ) { - ch = *tws(cp); expect('='); - printf(" skipping %s at %d\n",id->c_str(),cp.no); - if( isdigit(*tws(cp)) ) while( isdigit(*++cp) ); - else if( !tid(cp) ) return -1; - } - ch = *tws(cp); expect(';'); - return 0; -} - -// scan (number) -int keylen(ichar &cp, iobj *ip) -{ - int n = 0; - int ch = *tws(cp); - if( ch == '(' ) { - ++cp; ch = *tws(cp); - while( (ch-='0') >= 0 && ch <= 9 ) { - n = n*10 + ch; ch = *++cp; - } - ch = *tws(cp); expect(')'); - ip->length = n; - } - return 0; -} - -// scan create index line -int index(ichar &cp, iobj *iop) -{ - string *id = tid(cp); - if( !id ) return -1; - iop->name = id; - if( !(id=tid(cp)) ) return -1; - if( *id != "On" ) return -1; - if( !(id=tid(cp)) ) return -1; - iop->tbl = id; - int ch = *tws(cp); expect('('); - if( !(id=tid(cp)) ) return -1; - iop->keys.push_back(id); - if( keylen(cp,iop) < 0 ) return -1; - while( *tws(cp) == ',' ) { - if( !(id=tid(++cp)) ) return -1; - iop->keys.push_back(id); - if( keylen(cp,iop) < 0 ) return -1; - } - ch = *tws(cp); expect(')'); - ch = *tws(cp); expect(';'); - return 0; -} - -// process create line -int create(ichar &cp) -{ - int online = -1; (void) online; // avoid unused warn - enum { none, unique, fulltext, spatial } modifier = none; - - string *tp = tid(cp); - if( *tp == "Table" ) { - printf("Create Table at %d\n",cp.no); - tobj *top = new tobj(); - if( table(cp, top) < 0 ) { - delete top; - return -1; - } - tables.push_back(top); - return 0; - } - if( *tp == "Online" ) { - online = 1; - tp = tid(cp); - } - else if( *tp == "Offine" ) { - online = 0; - tp = tid(cp); - } - if( *tp == "Unique" ) { - modifier = unique; - tp = tid(cp); - } - else if( *tp == "Fulltext" ) { - modifier = fulltext; - tp = tid(cp); - } - else if( *tp == "Spatial" ) { - modifier = spatial; - tp = tid(cp); - } - if( *tp == "Index" ) { - printf("Create index at %d\n",cp.no); - iobj *iop = new iobj(); - if( index(cp, iop) < 0 ) { - delete iop; - return -1; - } - if( modifier == unique ) iop->unique = 1; - indecies.push_back(iop); - return 0; - } - fprintf(stderr,"unknown keyword - %s\n", tp->c_str()); - return -1; -} - -#if 0 -void put_args(FILE *sp, tobj *tp, iobj *ip) -{ - list::iterator ekey=ip->keys.end(); - list::iterator key=ip->keys.begin(); - if( key == ekey ) return; - - for(;;) { - const char *knm = (*key)->c_str(); - - list::iterator eid = tp->dop.end(); - list::iterator id = tp->dop.begin(); - while( id!=eid && *(*id)->name!=knm ) ++id; - if( id == eid ) { - fprintf(stderr," error: cant find index key %s in %s\n",knm,tp->name->c_str()); - continue; - } - - dobj *dp = *id; - const char *nm = dp->name->c_str(); - fprintf(sp,"%s::t_%s &%s",tp->name->c_str(),nm,nm); - if( ++key == ekey ) break; - fprintf(sp, ", "); - } -} -#endif - -#if 0 -void varg_dobj(FILE *sp, dobj *dp, const char *ty, int is_unsign=-1) -{ - if( is_unsign < 0 ) is_unsign = dp->is_unsign; - if( is_unsign > 0 ) fprintf(sp, "unsigned "); - fprintf(sp,"%s *%s", ty, dp->name->c_str()); -} -#else -void varg_dobj(FILE *sp, dobj *dp, const char *ty, int is_unsign=-1) -{ - const char *tnm = dp->top->name->c_str(); - const char *nm = dp->name->c_str(); - fprintf(sp,"const %sObj::t_%s &%s", tnm, nm, nm); -} -#endif - -void arg_dobj(FILE *sp, dobj *dp, const char *ty, int is_unsign=-1) -{ - if( is_unsign < 0 ) is_unsign = dp->is_unsign; - if( is_unsign > 0 ) fprintf(sp, "unsigned "); - fprintf(sp,"%s ", ty); - if( dp->length > 0 ) fprintf(sp, "*"); - fprintf(sp,"%s", dp->name->c_str()); -} - -void arg_dobj(FILE *sp, dobj *dp) -{ - switch( dp->ty ) { - case dobj::ty_boolean: - case dobj::ty_bit: - case dobj::ty_binary: arg_dobj(sp, dp, "char", 1); break; - case dobj::ty_char: - case dobj::ty_tinyint: arg_dobj(sp, dp, "char"); break; - case dobj::ty_enum: - case dobj::ty_smallint: arg_dobj(sp, dp, "short"); break; - case dobj::ty_decimal: - case dobj::ty_mediumint: - case dobj::ty_integer: arg_dobj(sp, dp, "int"); break; - case dobj::ty_bigint: arg_dobj(sp, dp, "long"); break; - case dobj::ty_real: - case dobj::ty_double: arg_dobj(sp, dp, "double", 0); break; - case dobj::ty_float: arg_dobj(sp, dp, "float", 0); break; - case dobj::ty_date: - case dobj::ty_time: - case dobj::ty_timestamp: - case dobj::ty_datetime: - case dobj::ty_year: varg_dobj(sp, dp, "char",0); break; - case dobj::ty_varchar: - if( dp->is_binary ) { varg_dobj(sp, dp, "char",1); break; } - case dobj::ty_tinytext: - case dobj::ty_text: - case dobj::ty_mediumtext: - case dobj::ty_longtext: varg_dobj(sp, dp, "char",0); break; - case dobj::ty_varbinary: - case dobj::ty_tinyblob: - case dobj::ty_blob: - case dobj::ty_mediumblob: - case dobj::ty_longblob: - case dobj::ty_media: varg_dobj(sp, dp, "char",1); break; - default: - fprintf(sp,"unimplemented %s,", dp->name->c_str()); - break; - } -} - -void put_targs(FILE *sp, tobj *tp, iobj *ip) -{ - list::iterator ekey=ip->keys.end(); - list::iterator key=ip->keys.begin(); - - for( ; key != ekey; ) { - const char *knm = (*key)->c_str(); ++key; - list::iterator eid = tp->dop.end(); - list::iterator id = tp->dop.begin(); - while( id!=eid && *(*id)->name!=knm ) ++id; - if( id == eid ) { - fprintf(stderr," error: cant find index key %s in %s\n",knm,tp->name->c_str()); - continue; - } - dobj *dp = *id; - if( dp->ty == dobj::ty_none ) { - fprintf(stderr," %s member %s error: ty_none\n", - tp->name->c_str(),dp->name->c_str()); - continue; - } - fprintf(sp," "); - arg_dobj(sp, dp); - if( key == ekey ) continue; - fprintf(sp,",\n"); - } -} - -void typ_dobj(FILE *sp, dobj *dp) -{ - const char *cp; - switch( dp->ty ) { - case dobj::ty_boolean: - case dobj::ty_bit: - case dobj::ty_binary: cp = "unsigned char"; break; - case dobj::ty_char: - case dobj::ty_tinyint: cp = dp->is_unsign > 0 ? "unsigned char" : "char"; break; - case dobj::ty_enum: - case dobj::ty_smallint: cp = dp->is_unsign > 0 ? "unsigned short" : "short"; break; - case dobj::ty_decimal: - case dobj::ty_mediumint: - case dobj::ty_integer: cp = dp->is_unsign > 0 ? "unsigned int" : "int"; break; - case dobj::ty_bigint: cp = dp->is_unsign > 0 ? "unsigned long" : "long"; break; - case dobj::ty_real: - case dobj::ty_double: cp = "double"; break; - case dobj::ty_float: cp = "float"; break; - case dobj::ty_date: - case dobj::ty_time: - case dobj::ty_timestamp: - case dobj::ty_datetime: - case dobj::ty_year: cp = "char"; break; - case dobj::ty_varchar: - if( dp->is_binary ) { cp = "unsigned char"; break; } - case dobj::ty_tinytext: - case dobj::ty_text: - case dobj::ty_mediumtext: - case dobj::ty_longtext: cp = "char"; break; - case dobj::ty_varbinary: - case dobj::ty_tinyblob: - case dobj::ty_blob: - case dobj::ty_mediumblob: - case dobj::ty_longblob: - case dobj::ty_media: cp = "unsigned char"; break; - default: cp = "unimplemented"; break; - } - fprintf(sp,"%s",cp); -} - -void put_keys(FILE *sp, tobj *tp, iobj *ip) -{ - list::iterator ekey=ip->keys.end(); - list::iterator key=ip->keys.begin(); - const char *tnm = tp->name->c_str(); - - for( ; key != ekey; ++key ) { - const char *knm = (*key)->c_str(); - - list::iterator eid = tp->dop.end(); - list::iterator id = tp->dop.begin(); - while( id!=eid && *(*id)->name!=knm ) ++id; - if( id == eid ) { - fprintf(stderr," error: cant find index key %s in %s\n", knm, tnm); - continue; - } - - dobj *dp = *id; - const char *nm = dp->name->c_str(); - fprintf(sp," %sObj::t_%s v_%s;\n", tnm, nm, nm); - } - if( ip->unique <= 0 ) fprintf(sp," int v_id;\n"); -} - -void put_init(FILE *sp, tobj *tp, iobj *ip) -{ - list::iterator ekey=ip->keys.end(); - list::iterator key; - - for( key=ip->keys.begin(); key!=ekey; ++key ) { - const char *knm = (*key)->c_str(); - - list::iterator eid = tp->dop.end(); - list::iterator id = tp->dop.begin(); - while( id!=eid && *(*id)->name!=knm ) ++id; - if( id == eid ) { - fprintf(stderr," error: cant find index key %s in %s\n",knm,tp->name->c_str()); - continue; - } - - dobj *dp = *id; - const char *nm = dp->name->c_str(); - fprintf(sp,",\n v_%s(%s)", nm, nm); - } -} - -void put_cmpr(FILE *sp, dobj *dp) -{ - const char *cp; - switch( dp->ty ) { - case dobj::ty_boolean: - case dobj::ty_bit: - case dobj::ty_binary: cp = "uchar"; break; - case dobj::ty_char: - case dobj::ty_tinyint: cp = dp->is_unsign > 0 ? "uchar" : "char"; break; - case dobj::ty_enum: - case dobj::ty_smallint: cp = dp->is_unsign > 0 ? "ushort" : "short"; break; - case dobj::ty_decimal: - case dobj::ty_mediumint: - case dobj::ty_integer: cp = dp->is_unsign > 0 ? "uint" : "int"; break; - case dobj::ty_bigint: cp = dp->is_unsign > 0 ? "ulong" : "long"; break; - case dobj::ty_real: - case dobj::ty_double: cp = "double"; break; - case dobj::ty_float: cp = "float"; break; - case dobj::ty_date: - case dobj::ty_time: - case dobj::ty_timestamp: - case dobj::ty_datetime: - case dobj::ty_year: cp = "char"; break; - case dobj::ty_varchar: - if( dp->is_binary ) { cp = "uchar"; break; } - case dobj::ty_tinytext: - case dobj::ty_text: - case dobj::ty_mediumtext: - case dobj::ty_longtext: cp = "char"; break; - case dobj::ty_varbinary: - case dobj::ty_tinyblob: - case dobj::ty_blob: - case dobj::ty_mediumblob: - case dobj::ty_longblob: cp = "uchar"; break; - case dobj::ty_media: cp = "media"; break; - default: cp = "unimplemented"; break; - } - fprintf(sp,"%s",cp); -} - -void put_rcmpr(FILE *sp, tobj *tp, iobj *ip) -{ - list::iterator ekey=ip->keys.end(); - list::iterator skey=ip->keys.begin(); - list::iterator key; - - for( key=skey; key!=ekey; ++key ) { - const char *knm = (*key)->c_str(); - - list::iterator eid = tp->dop.end(); - list::iterator id = tp->dop.begin(); - while( id!=eid && *(*id)->name!=knm ) ++id; - if( id == eid ) { - fprintf(stderr," error: cant find index key %s in %s\n",knm,tp->name->c_str()); - continue; - } - - dobj *dp = *id; - const char *nm = dp->name->c_str(); - fprintf(sp," v = cmpr_"); put_cmpr(sp,dp); - fprintf(sp,"( kloc._%s(), kloc->v_%s.size(),\n", nm, nm); - fprintf(sp," vloc._%s(), vloc->v_%s.size());\n", nm, nm); - fprintf(sp," if( v != 0 ) return v;\n"); - } - if( ip->unique <= 0 ) { - fprintf(sp," v = cmpr_int(kloc._id(), kloc._id_size(),\n"); - fprintf(sp," vloc._id(), vloc._id_size());\n"); - fprintf(sp," if( v != 0 ) return v;\n"); - } -} - -void put_icmpr(FILE *sp, tobj *tp, iobj *ip) -{ - list::iterator ekey=ip->keys.end(); - list::iterator skey=ip->keys.begin(); - list::iterator key; - - for( key=skey; key!=ekey; ++key ) { - const char *knm = (*key)->c_str(); - - list::iterator eid = tp->dop.end(); - list::iterator id = tp->dop.begin(); - while( id!=eid && *(*id)->name!=knm ) ++id; - if( id == eid ) { - fprintf(stderr," error: cant find index key %s in %s\n",knm,tp->name->c_str()); - continue; - } - - dobj *dp = *id; - const char *nm = dp->name->c_str(); - fprintf(sp," v = cmpr_"); put_cmpr(sp,dp); - fprintf(sp,"( kp->v_%s.addr(), kp->v_%s.size(),\n", nm, nm); - fprintf(sp," vloc._%s(), vloc->v_%s.size());\n", nm, nm); - fprintf(sp," if( v != 0 ) return v;\n"); - } - if( ip->unique <= 0 ) { - fprintf(sp," if( kp->v_id >= 0 ) {\n"); - fprintf(sp," v = cmpr_int(&kp->v_id, sizeof(kp->v_id),\n"); - fprintf(sp," vloc._id(), vloc._id_size());\n"); - fprintf(sp," if( v != 0 ) return v;\n"); - fprintf(sp," }\n"); - } -} - -void put_dobj(FILE *sp, dobj *dp, const char *dty, int n) -{ - fprintf(sp," array_%s(char,%s,%d);\n", dty, dp->name->c_str(), n); -} - -void put_dobj(FILE *sp, dobj *dp, const char *dty, const char *ty, int is_unsign=-1) -{ - fprintf(sp," %s_%s(", dp->length > 0 ? "array" : "basic", dty); - if( is_unsign < 0 ) is_unsign = dp->is_unsign; - if( is_unsign > 0 ) fprintf(sp, "unsigned "); - fprintf(sp,"%s,%s", ty, dp->name->c_str()); - if( dp->length > 0 ) fprintf(sp, ",%d", dp->length); - fprintf(sp, ");\n"); -} - -void put_decl(FILE *sp, dobj *dp, const char *dty) -{ - switch( dp->ty ) { - case dobj::ty_boolean: - case dobj::ty_bit: - case dobj::ty_binary: put_dobj(sp, dp, dty, "char", 1); break; - case dobj::ty_char: - case dobj::ty_tinyint: put_dobj(sp, dp, dty, "char"); break; - case dobj::ty_enum: - case dobj::ty_smallint: put_dobj(sp, dp, dty, "short"); break; - case dobj::ty_decimal: - case dobj::ty_mediumint: - case dobj::ty_integer: put_dobj(sp, dp, dty, "int"); break; - case dobj::ty_bigint: put_dobj(sp, dp, dty, "long"); break; - case dobj::ty_real: - case dobj::ty_double: put_dobj(sp, dp, dty, "double", 0); break; - case dobj::ty_float: put_dobj(sp, dp, dty, "float", 0); break; - case dobj::ty_date: put_dobj(sp, dp, dty, 8); break; - case dobj::ty_time: put_dobj(sp, dp, dty, 6); break; - case dobj::ty_timestamp: - case dobj::ty_datetime: put_dobj(sp, dp, dty, 14); break; - case dobj::ty_year: put_dobj(sp, dp, dty, 4); break; - case dobj::ty_text: - case dobj::ty_tinytext: - case dobj::ty_mediumtext: - case dobj::ty_longtext: - fprintf(sp," sarray_%s(char,%s);\n", dty, dp->name->c_str()); - break; - case dobj::ty_varchar: - if( !dp->is_binary ) { - fprintf(sp," varray_%s(char,%s);\n", dty, dp->name->c_str()); - break; - } - case dobj::ty_varbinary: - case dobj::ty_blob: - case dobj::ty_tinyblob: - case dobj::ty_mediumblob: - case dobj::ty_longblob: - case dobj::ty_media: - fprintf(sp," varray_%s(unsigned char,%s);\n", dty, dp->name->c_str()); - dp->is_unsign = 1; - break; - default: - fprintf(sp," %s %s unimplemented;\n", dty, dp->name->c_str()); - break; - } -} - - -int main(int ac, char **av) -{ - const char *tdb = ac > 1 ? av[1] : "theDb"; - const char *sfn = ac > 2 ? av[2] : "./s"; - - setbuf(stdout,0); - setbuf(stderr,0); - ichar cp(stdin); - - for( string *sp=tid(cp); sp!=0; sp=tid(cp) ) { - if( *sp == "Create" ) create(cp); - } - - printf(" %d Tables\n",(int)tables.size()); - printf(" %d Indecies\n",(int)indecies.size()); - - char fn[512]; sprintf(fn,"%s.h",sfn); - FILE *sp = fopen(fn,"w"); - - // get basename for sfn.h, _SFN_H_ - const char *bp = 0; - for( const char *ap=sfn; *ap; ++ap ) - if( *ap == '/' ) bp = ap+1; - if( !bp ) bp = sfn; - char ups[512], *up = ups; *up++ = '_'; - for( const char *cp=bp; *cp; ++cp ) *up++ = toupper(*cp); - *up++ = '_'; *up++ = 'H'; *up++ = '_'; *up = 0; - - fprintf(sp,"#ifndef %s\n",ups); - fprintf(sp,"#define %s\n",ups); - fprintf(sp,"#include \n"); - fprintf(sp,"#include \n"); - fprintf(sp,"#include \n"); - fprintf(sp,"#include \n"); - fprintf(sp,"#include \n"); - fprintf(sp,"\n"); - fprintf(sp,"#include \"tdb.h\"\n"); - fprintf(sp,"\n"); - fprintf(sp,"\n"); - - list::iterator sit = tables.begin(); - list::iterator eit = tables.end(); - list::iterator it; - - int i=0; - for( it=sit ; it!=eit; ++i, ++it ) { - tobj *tp = *it; - const char *tnm = tp->name->c_str(); - printf(" %2d. %s (",i,tnm); - fprintf(sp,"// %s\n",tnm); - fprintf(sp,"DbObj(%s)\n",tnm); - - list::iterator sid = tp->dop.begin(); - list::iterator eid = tp->dop.end(); - list::iterator id; - - // output table member declarations - for( id=sid ; id!=eid; ++id ) { - dobj *dp = *id; - printf(" %s",dp->name->c_str()); - if( dp->ty == dobj::ty_none ) { - fprintf(stderr," %s member %s error: ty_none\n", - tnm,dp->name->c_str()); - continue; - } - put_decl(sp,dp,"def"); - } - printf(" )\n"); - - fprintf(sp,"};\n"); - fprintf(sp,"\n"); - - list::iterator sidx=indecies.begin(); - list::iterator eidx=indecies.end(); - list::iterator idx; - - int j = 0, n = 0; - for( idx=sidx; idx!=eidx; ++idx ) { - if( *(*idx)->tbl != *(*it)->name ) continue; - ++n; - printf(" %2d.%d. %s on %s(",i,j++, - (*idx)->name->c_str(),(*idx)->tbl->c_str()); - list::iterator skey=(*idx)->keys.begin(); - list::iterator ekey=(*idx)->keys.end(); - list::iterator key; - for( key=skey; key!=ekey; ++key ) - printf(" %s", (*key)->c_str()); - printf(" )\n"); - } - if( n > 0 ) printf("\n"); - - // output table member accessors - fprintf(sp,"DbLoc(%s)\n",tnm); - for( id=sid ; id!=eid; ++id ) { - dobj *dp = *id; - if( dp->ty == dobj::ty_none ) { - fprintf(stderr," %s member %s error: ty_none\n", - tnm,dp->name->c_str()); - continue; - } - put_decl(sp, dp, "ref"); - } - - for( idx=sidx; idx!=eidx; ++idx ) { - if( *(*idx)->tbl != *(*it)->name ) continue; - const char *knm = (*idx)->name->c_str(); - fprintf(sp,"\n"); - fprintf(sp," class ikey_%s : public Db::iKey { public:\n", knm); - put_keys(sp, *it, *idx); - fprintf(sp," static int cmpr(char *a, char *b);\n"); - // key constructors - fprintf(sp," ikey_%s(ObjectLoc &loc,\n", knm); - put_targs(sp, *it, *idx); - if( (*idx)->unique <= 0 ) fprintf(sp,", int id=-1"); - fprintf(sp,")\n : iKey(\"%s\",loc,cmpr)", knm); - put_init(sp, *it, *idx); - if( (*idx)->unique <= 0 ) fprintf(sp,",\n v_id(id)"); - fprintf(sp," {}\n"); - fprintf(sp," };\n"); - fprintf(sp," class rkey_%s : public Db::rKey { public:\n", knm); - fprintf(sp," static int cmpr(char *a, char *b);\n"); - fprintf(sp," rkey_%s(ObjectLoc &loc) : rKey(\"%s\",loc,cmpr)", knm, knm); - fprintf(sp," {}\n"); - fprintf(sp," };\n"); - } - fprintf(sp,"\n"); - fprintf(sp," int Allocate();\n"); - fprintf(sp," int Construct();\n"); - fprintf(sp," int Destruct();\n"); - fprintf(sp," void Deallocate();\n"); -#ifdef COPY - fprintf(sp," int Copy(ObjectLoc &that);\n"); -#endif - fprintf(sp,"};\n"); - } - fprintf(sp,"\n"); - - fprintf(sp,"\n"); - fprintf(sp,"class %s : public Db {\n",tdb); - fprintf(sp," int dfd, dkey, no_atime;\n"); - fprintf(sp," int db_create();\n"); - fprintf(sp," int db_open();\n"); - fprintf(sp," int db_access();\n"); - fprintf(sp,"public:\n"); - fprintf(sp," Objects objects;\n"); - for( it=sit ; it!=eit; ++it ) { - tobj *tp = *it; - const char *tnm = tp->name->c_str(); - fprintf(sp," Entity %s; %sLoc %c%s;\n", tnm, tnm, tolower(tnm[0]), &tnm[1]); - } - fprintf(sp,"\n"); - fprintf(sp," int create(const char *dfn);\n"); - fprintf(sp," int open(const char *dfn, int key=-1);\n"); - fprintf(sp," int access(const char *dfn, int key=-1, int rw=0);\n"); - fprintf(sp," void close();\n"); - fprintf(sp," int attach(int rw=0) { return Db::attach(rw); }\n"); - fprintf(sp," int detach() { return Db::detach(); }\n"); - fprintf(sp,"\n"); - fprintf(sp," %s();\n",tdb); - fprintf(sp," ~%s() { finit(objects); }\n",tdb); - fprintf(sp,"};\n"); - fprintf(sp,"\n"); - fprintf(sp,"#endif\n"); - fclose(sp); - - sprintf(fn,"%s.C",sfn); - sp = fopen(fn,"w"); - fprintf(sp,"#include \"%s.h\"\n",bp); - fprintf(sp,"\n"); - - for( it=sit ; it!=eit; ++it ) { - tobj *tp = *it; - const char * tnm = tp->name->c_str(); - list::iterator sidx=indecies.begin(); - list::iterator eidx=indecies.end(); - list::iterator idx; - - for( idx=sidx; idx!=eidx; ++idx ) { - if( *(*idx)->tbl != *(*it)->name ) continue; - const char *knm = (*idx)->name->c_str(); - fprintf(sp,"\n"); - fprintf(sp,"int %sLoc::ikey_%s::\n", tnm, knm); - fprintf(sp,"cmpr(char *a, char *b)\n"); - fprintf(sp,"{\n"); - fprintf(sp," ikey_%s *kp = (ikey_%s *)a;\n", knm, knm); - fprintf(sp," int v = *(int*)b;\n"); - if( (*idx)->unique <= 0 ) fprintf(sp," if( kp->v_id == v ) return 0;\n"); - fprintf(sp," %sLoc vloc(kp->loc.entity);\n", tnm); - fprintf(sp," if( vloc.FindId(v) )\n"); - fprintf(sp," vloc.err_(Db::errCorrupt);\n"); - put_icmpr(sp, tp, *idx); - fprintf(sp," return 0;\n"); - fprintf(sp,"}\n"); - fprintf(sp,"\n"); - fprintf(sp,"int %sLoc::rkey_%s::\n", tnm, knm); - fprintf(sp,"cmpr(char *a, char *b)\n"); - fprintf(sp,"{\n"); - fprintf(sp," rkey_%s *kp = (rkey_%s *)a;\n", knm, knm); - fprintf(sp," %sLoc &kloc = (%sLoc&)kp->loc;\n", tnm, tnm); - fprintf(sp," int v = kloc->id, b_id = *(int*)b;\n"); - fprintf(sp," if( v == b_id ) return 0;\n"); - fprintf(sp," %sLoc vloc(kloc.entity);\n", tnm); - fprintf(sp," if( vloc.FindId(b_id) )\n"); - fprintf(sp," kloc.err_(Db::errCorrupt);\n"); - put_rcmpr(sp, tp, *idx); - fprintf(sp," return 0;\n"); - fprintf(sp,"}\n"); - } - fprintf(sp,"\n"); - fprintf(sp,"int %sLoc::Allocate()\n", tnm); - fprintf(sp,"{\n"); - fprintf(sp," if_err( allocate() );\n"); - fprintf(sp," if( !addr_wr() ) return err_(Db::errNoMemory);\n"); - - int n = 0; - list::iterator sid = tp->dop.begin(); - list::iterator eid = tp->dop.end(); - list::iterator id; - - for( id=sid ; !n && id!=eid; ++id ) { - dobj *dp = *id; - switch( dp->ty ) { - case dobj::ty_varchar: - case dobj::ty_tinytext: - case dobj::ty_text: - case dobj::ty_mediumtext: - case dobj::ty_longtext: - case dobj::ty_varbinary: - case dobj::ty_tinyblob: - case dobj::ty_blob: - case dobj::ty_mediumblob: - case dobj::ty_longblob: - case dobj::ty_media: - if( !n++ ) fprintf(sp," v_init();\n"); - break; - default: - break; - } - } - - for( id=sid ; id!=eid; ++id ) { - dobj *dp = *id; - const char *dnm = dp->name->c_str(); - if( dp->is_autoincr > 0 && dp->idx ) { - const char *inm = dp->idx->name->c_str(); - fprintf(sp," { "); typ_dobj(sp, dp); - fprintf(sp," (%sLoc::*fn)() = &%sLoc::%s;\n", tnm, tnm, dnm); - fprintf(sp," "); typ_dobj(sp, dp); - fprintf(sp," v = last(\"%s\",(", inm); typ_dobj(sp, dp); - fprintf(sp," (Db::ObjectLoc::*)())fn); %s(v+1); }\n", dnm); - } - if( dp->has_def > 0 ) { - switch( dp->has_def ) { - case dobj::def_integer: - fprintf(sp," %s(%d);\n", dnm, dp->def.i); - break; - case dobj::def_double: - fprintf(sp," %s(%f);\n", dnm, dp->def.d); - break; - case dobj::def_string: - switch( dp->ty ) { - case dobj::ty_enum: { - list::iterator snm = dp->eop.begin(); - list::iterator enm = dp->eop.end(); - list::iterator nm; - for( n=0,nm=snm; nm!=enm && *(*nm)!=*dp->def.s; ++nm ) ++n; - fprintf(sp," %s(%d);\n", dnm, n); - break; } - case dobj::ty_boolean: - case dobj::ty_bit: - case dobj::ty_tinyint: - case dobj::ty_smallint: - case dobj::ty_decimal: - case dobj::ty_mediumint: - case dobj::ty_integer: - case dobj::ty_bigint: { - fprintf(sp," %s(%ld);\n", dnm, strtol(dp->def.s->c_str(),0,0)); - break; } - case dobj::ty_real: - case dobj::ty_double: - case dobj::ty_float: { - fprintf(sp," %s(%f);\n", dnm, strtod(dp->def.s->c_str(),0)); - break; } - case dobj::ty_date: - case dobj::ty_time: - case dobj::ty_timestamp: - case dobj::ty_binary: - case dobj::ty_char: - case dobj::ty_datetime: - case dobj::ty_year: - case dobj::ty_varchar: - case dobj::ty_tinytext: - case dobj::ty_text: - case dobj::ty_mediumtext: - case dobj::ty_longtext: - case dobj::ty_varbinary: - case dobj::ty_tinyblob: - case dobj::ty_blob: - case dobj::ty_mediumblob: - case dobj::ty_longblob: - case dobj::ty_media: { - fprintf(sp," %s((", dnm); typ_dobj(sp,dp); - fprintf(sp," *)\"%s\",%d);\n", dp->def.s->c_str(), (int)dp->def.s->size()); - break; } - default: - break; - } - break; - default: - break; - } - } - } - fprintf(sp," return 0;\n"); - fprintf(sp,"}\n"); - fprintf(sp,"\n"); - fprintf(sp,"int %sLoc::Construct()\n", tnm); - fprintf(sp,"{\n"); - fprintf(sp," if_err( insertProhibit() );\n"); - fprintf(sp," if_err( construct() );\n"); - n = 0; - for( idx=sidx; idx!=eidx; ++idx ) { - if( *(*idx)->tbl != *(*it)->name ) continue; - if( !n++ ) fprintf(sp," int id = this->id();\n"); - const char *knm = (*idx)->name->c_str(); - fprintf(sp," { rkey_%s rkey(*this);\n",knm); - fprintf(sp," if_err( entity->index(\"%s\")->Insert(rkey,&id) ); }\n",knm); - } - fprintf(sp," if_err( insertCascade() );\n"); - fprintf(sp," return 0;\n"); - fprintf(sp,"}\n"); - fprintf(sp,"\n"); - fprintf(sp,"int %sLoc::Destruct()\n", tnm); - fprintf(sp,"{\n"); - fprintf(sp," if_err( deleteProhibit() );\n"); - for( idx=sidx; idx!=eidx; ++idx ) { - if( *(*idx)->tbl != *(*it)->name ) continue; - const char *knm = (*idx)->name->c_str(); - fprintf(sp," { rkey_%s rkey(*this);\n",knm); - fprintf(sp," if_err( entity->index(\"%s\")->Delete(rkey) ); }\n",knm); - } - fprintf(sp," if_err( destruct() );\n"); - fprintf(sp," if_err( deleteCascade() );\n"); - fprintf(sp," return 0;\n"); - fprintf(sp,"}\n"); - fprintf(sp,"\n"); - fprintf(sp,"void %sLoc::Deallocate()\n", tnm); - fprintf(sp,"{\n"); - n = 0; - for( id=sid ; !n && id!=eid; ++id ) { - dobj *dp = *id; - switch( dp->ty ) { - case dobj::ty_varchar: - case dobj::ty_tinytext: - case dobj::ty_text: - case dobj::ty_mediumtext: - case dobj::ty_longtext: - case dobj::ty_varbinary: - case dobj::ty_tinyblob: - case dobj::ty_blob: - case dobj::ty_mediumblob: - case dobj::ty_longblob: - case dobj::ty_media: - if( !n++ ) fprintf(sp," v_del();\n"); - break; - default: - break; - } - } - fprintf(sp," deallocate();\n"); - fprintf(sp,"}\n"); - fprintf(sp,"\n"); - } - - fprintf(sp,"\n"); - fprintf(sp,"int %s::\n",tdb); - fprintf(sp,"create(const char *dfn)\n"); - fprintf(sp,"{\n"); - fprintf(sp," dfd = ::open(dfn,O_RDWR+O_CREAT+O_TRUNC+no_atime,0666);\n"); - fprintf(sp," if( dfd < 0 ) { perror(dfn); return -1; }\n"); - fprintf(sp," int ret = db_create();\n"); - fprintf(sp," close();\n"); - fprintf(sp," return ret;\n"); - fprintf(sp,"}\n"); - fprintf(sp,"\n"); - fprintf(sp,"int %s::\n",tdb); - fprintf(sp,"db_create()\n"); - fprintf(sp,"{\n"); - fprintf(sp," if_ret( Db::make(dfd) );\n"); - for( it=sit ; it!=eit; ++it ) { - tobj *tp = *it; - const char *tnm = tp->name->c_str(); - fprintf(sp," if_ret( %s.new_entity(\"%s\", sizeof(%sObj)) );\n", tnm, tnm, tnm); - list::iterator sidx=indecies.begin(); - list::iterator eidx=indecies.end(); - list::iterator idx; - for( idx=sidx; idx!=eidx; ++idx ) { - if( *(*idx)->tbl != *(*it)->name ) continue; - const char *nm = (*idx)->name->c_str(); - fprintf(sp," if_ret( %s.add_kindex(\"%s\") );\n", tnm, nm); - } - fprintf(sp,"\n"); - } - fprintf(sp," if_ret( Db::commit(1) );\n"); - fprintf(sp," return 0;\n"); - fprintf(sp,"}\n"); - fprintf(sp,"\n"); - - fprintf(sp,"%s::\n", tdb); - fprintf(sp,"%s()\n", tdb); - fprintf(sp," : dfd(-1), dkey(-1), no_atime(getuid()?0:O_NOATIME), objects(0)"); - for( it=sit ; it!=eit; ++it ) { - tobj *tp = *it; - const char *tnm = tp->name->c_str(); - fprintf(sp,",\n %s(this)", tnm); - fprintf(sp,", %c%s(%s)", tolower(tnm[0]), &tnm[1], tnm); - } - fprintf(sp,"\n"); - fprintf(sp,"{"); - for( it=sit ; it!=eit; ++it ) { - tobj *tp = *it; - const char *tnm = tp->name->c_str(); - fprintf(sp,"\n objects = new ObjectList(objects, %c%s);", - tolower(tnm[0]), &tnm[1]); - } - fprintf(sp,"\n"); - for( it=sit ; it!=eit; ++it ) { - tobj *tp = *it; - const char *tnm = tp->name->c_str(); - list::iterator sid = tp->dop.begin(); - list::iterator eid = tp->dop.end(); - list::iterator id; - for( id=sid ; id!=eid; ++id ) { - dobj *dp = *id; - const char *dnm = dp->name->c_str(); - switch( dp->ty ) { - case dobj::ty_varchar: - case dobj::ty_tinytext: - case dobj::ty_text: - case dobj::ty_mediumtext: - case dobj::ty_longtext: - case dobj::ty_varbinary: - case dobj::ty_tinyblob: - case dobj::ty_blob: - case dobj::ty_mediumblob: - case dobj::ty_longblob: - case dobj::ty_media: { - fprintf(sp," %s.add_vref((vRef)&%sObj::v_%s);\n", tnm, tnm, dnm); - break; } - default: - break; - } - } - } - fprintf(sp,"}\n"); - fprintf(sp,"\n"); - - fprintf(sp,"int %s::\n",tdb); - fprintf(sp,"open(const char *dfn, int key)\n"); - fprintf(sp,"{\n"); - fprintf(sp," dfd = ::open(dfn,O_RDWR+no_atime);\n"); - fprintf(sp," if( dfd < 0 ) { perror(dfn); return errNotFound; }\n"); - fprintf(sp," if( (dkey=key) >= 0 ) Db::use_shm(1);\n"); - fprintf(sp," int ret = Db::open(dfd, dkey);\n"); - fprintf(sp," if( !ret ) ret = db_open();\n"); - fprintf(sp," if( ret ) close();\n"); - fprintf(sp," return ret;\n"); - fprintf(sp,"}\n"); - fprintf(sp,"\n"); - - fprintf(sp,"int %s::\n",tdb); - fprintf(sp,"db_open()\n"); - fprintf(sp,"{\n"); - for( it=sit ; it!=eit; ++it ) { - tobj *tp = *it; - const char *tnm = tp->name->c_str(); - fprintf(sp," if_ret( %s.get_entity(\"%s\") );\n", tnm, tnm); - list::iterator sidx=indecies.begin(); - list::iterator eidx=indecies.end(); - list::iterator idx; - for( idx=sidx; idx!=eidx; ++idx ) { - if( *(*idx)->tbl != *(*it)->name ) continue; - const char *nm = (*idx)->name->c_str(); - fprintf(sp," if_ret( %s.key_index(\"%s\") );\n", tnm, nm); - } - fprintf(sp,"\n"); - } - fprintf(sp," if_ret( Db::start_transaction() );\n"); - fprintf(sp," return 0;\n"); - fprintf(sp,"}\n"); - fprintf(sp,"\n"); - fprintf(sp,"void %s::\n",tdb); - fprintf(sp,"close()\n"); - fprintf(sp,"{\n"); - fprintf(sp," Db::close();\n"); - fprintf(sp," if( dfd >= 0 ) { ::close(dfd); dfd = -1; }\n"); - fprintf(sp,"}\n"); - fprintf(sp,"\n"); - fprintf(sp,"int %s::\n",tdb); - fprintf(sp,"access(const char *dfn, int key, int rw)\n"); - fprintf(sp,"{\n"); - fprintf(sp," if( key < 0 ) return Db::errInvalid;\n"); - fprintf(sp," dfd = ::open(dfn,O_RDWR+no_atime);\n"); - fprintf(sp," if( dfd < 0 ) { perror(dfn); return Db::errNotFound; }\n"); - fprintf(sp," dkey = key; Db::use_shm(1);\n"); - fprintf(sp," int ret = Db::attach(dfd, dkey, rw);\n"); - fprintf(sp," if( !ret ) ret = db_access();\n"); - fprintf(sp," else if( ret == errNotFound ) {\n"); - fprintf(sp," ret = Db::open(dfd, dkey);\n"); - fprintf(sp," if( !ret ) ret = db_open();\n"); - fprintf(sp," if( !ret ) ret = Db::attach(rw);\n"); - fprintf(sp," }\n"); - fprintf(sp," if( ret ) close();\n"); - fprintf(sp," return ret;\n"); - fprintf(sp,"}\n"); - fprintf(sp,"\n"); - fprintf(sp,"int %s::\n",tdb); - fprintf(sp,"db_access()\n"); - fprintf(sp,"{\n"); - for( it=sit ; it!=eit; ++it ) { - tobj *tp = *it; - const char *tnm = tp->name->c_str(); - fprintf(sp," if_ret( %s.get_entity(\"%s\") );\n", tnm, tnm); - } - fprintf(sp," return 0;\n"); - fprintf(sp,"}\n"); - fprintf(sp,"\n"); - fprintf(sp,"\n"); - printf("ended on line %d - ",cp.no); - for( int i=0, n=cp.i; i