static char * generate_sqlrow_insert( Dbptr db, char *(*createsync)(Dbptr db), long flags ) { void *stk = 0; char *table; Tbl *fields; Dbvalue dbvalue; char *field; long ifield; long ftype; char *fformat; char part[STRSZ]; char *sync; char *copy; if( db.record < 0 && db.record != dbSCRATCH && db.record != dbNULL ) { return NULL; } dbquery( db, dbTABLE_NAME, &table ); dbquery( db, dbTABLE_FIELDS, &fields ); pushstr( &stk, "INSERT INTO `" ); pushstr( &stk, table ); pushstr( &stk, "` VALUES(" ); for( ifield = 0; ifield < maxtbl( fields ); ifield++ ) { field = gettbl( fields, ifield ); db = dblookup( db, "", "", field, "" ); dbquery( db, dbFIELD_TYPE, &ftype ); dbquery( db, dbFIELD_FORMAT, &fformat ); dbgetv( db, 0, field, &dbvalue, NULL ); if( ifield > 0 ) { pushstr( &stk, ", " ); } if( ! ( flags & DB2SQL_USE_DATASCOPE_NULLS ) && dbfield_isnull( db ) ) { pushstr( &stk, "NULL" ); continue; } memset( part, '\0', STRSZ ); switch( ftype ) { case dbSTRING: pushstr( &stk, "'" ); if( strchr( dbvalue.s, '\'' ) == (char *) NULL ) { pushstr( &stk, dbvalue.s ); } else { allot( char *, copy, 2 * strlen( dbvalue.s ) ); strsub( dbvalue.s, "'", "\\'", copy ); pushstr( &stk, copy ); free( copy ); } pushstr( &stk, "'" ); break; case dbREAL: case dbTIME: sprintf( part, fformat, dbvalue.d ); pushstr( &stk, part ); break; case dbINTEGER: case dbYEARDAY: sprintf( part, fformat, dbvalue.i ); pushstr( &stk, part ); break; case dbDBPTR: sprintf( part, "%ld %ld %ld %ld", dbvalue.db.database, dbvalue.db.table, dbvalue.db.field, dbvalue.db.record ); pushstr( &stk, part ); break; } } if( ! ( flags & DB2SQL_OMIT_SYNC ) ) { if( createsync != (char *(*)(Dbptr db)) NULL ) { sync = (*createsync)( db ); } else { sync = (char *) NULL; } pushstr( &stk, ", '" ); if( sync != (char *) NULL ) { pushstr( &stk, sync ); } else { pushstr( &stk, DB2SQL_SYNCFIELD_NULL ); } pushstr( &stk, "'" ); if( sync != (char *) NULL ) { free( sync ); } } pushstr( &stk, ");\n" ); return popstr( &stk, 1 ); }
static char * generate_sqltable_create( Dbptr db, long flags ) { char *table; char part[STRSZ]; void *stk = 0; Tbl *primary; Tbl *fields; long ifield; char *field; char field_a[STRSZ]; char field_b[STRSZ]; char *fnull; long fsize; long ftype; char *fformat; int precision; int scale; long longest = 0; if( db.table < 0 ) { return NULL; } dbquery( db, dbTABLE_NAME, &table ); pushstr( &stk, "CREATE TABLE `" ); pushstr( &stk, table ); pushstr( &stk, "`\n (\n" ); dbquery( db, dbTABLE_FIELDS, &fields ); applytbl( fields, find_longest, (void *) &longest ); if( ! ( flags & DB2SQL_OMIT_SYNC ) && longest < strlen( Db2sql_syncfield_name ) ) { longest = strlen( Db2sql_syncfield_name ); } for( ifield = 0; ifield < maxtbl( fields ); ifield++ ) { if( ifield > 0 ) { pushstr( &stk, ",\n" ); } field = gettbl( fields, ifield ); db = dblookup( db, "", table, field, "" ); pushstr( &stk, " `" ); pushstr( &stk, field ); pushstr( &stk, "`" ); pushstr( &stk, spaces( longest - strlen(field) + 2 ) ); dbquery( db, dbFIELD_SIZE, &fsize ); dbquery( db, dbFIELD_TYPE, &ftype ); dbquery( db, dbFIELD_FORMAT, &fformat ); dbquery( db, dbNULL, &fnull ); memset( part, '\0', STRSZ ); switch( ftype ) { case dbSTRING: if( fsize < 256 ) { sprintf( part, "CHAR(%ld)", fsize ); } else { sprintf( part, "TEXT(%ld)", fsize ); } pushstr( &stk, part ); break; case dbREAL: case dbTIME: if( fnull != (char *) NULL && strcontains( fnull, "[eE]", 0, 0, 0 ) ) { sprintf( part, "DOUBLE" ); } else { sscanf( fformat, "%%%d.%d", &precision, &scale ); sprintf( part, "DECIMAL(%d,%d)", precision, scale ); } pushstr( &stk, part ); break; case dbINTEGER: case dbYEARDAY: sprintf( part, "INTEGER(%ld)", fsize ); pushstr( &stk, part ); break; case dbDBPTR: pushstr( &stk, "CHAR(32)" ); break; } /* Disallow defaults for SQL TEXT fields */ if( fnull != (char *) NULL && strncmp( part, "TEXT", 4 ) ) { pushstr( &stk, " DEFAULT " ); if( ftype == dbSTRING ) { pushstr( &stk, "'" ); pushstr( &stk, fnull ); pushstr( &stk, "'" ); } else { pushstr( &stk, fnull ); } } } if( ! ( flags & DB2SQL_OMIT_SYNC ) ) { pushstr( &stk, ",\n" ); pushstr( &stk, " `" ); pushstr( &stk, Db2sql_syncfield_name ); pushstr( &stk, "`" ); pushstr( &stk, spaces( longest - strlen(Db2sql_syncfield_name) + 2 ) ); pushstr( &stk, DB2SQL_SYNCFIELD_SPEC ); } dbquery( db, dbPRIMARY_KEY, &primary ); if( maxtbl( primary ) > 0 ) { pushstr( &stk, ",\n PRIMARY KEY (" ); for( ifield = 0; ifield < maxtbl( primary ); ifield++ ) { if( ifield > 0 ) { pushstr( &stk, ", " ); } field = gettbl( primary, ifield ); if( strcontains( field, "::", 0, 0, 0 ) ) { strsub( field, "::", " ", field ); sscanf( field, "%s %s", field_a, field_b ); pushstr( &stk, "`" ); pushstr( &stk, field_a ); pushstr( &stk, "`" ); /* end-of-range keys can be NULL in Datascope, so don't use it as primary in SQL: pushstr( &stk, ", `" ); pushstr( &stk, field_b ); pushstr( &stk, "`" ); */ } else { pushstr( &stk, "`" ); pushstr( &stk, field ); pushstr( &stk, "`" ); } } pushstr( &stk, ")" ); } pushstr( &stk, "\n );\n" ); return popstr( &stk, 1 ); }