Re: INFORMIX schemas -> C header files
Posted in 1992
Path: emory!wupost!cs.utexas.edu!sun-barr!news2me.ebay.sun.com!exodus.Eng.Sun.COM!appserv.Eng.Sun.COM!sun!amdcad!weitek!pyramid!infmx!markj
From: markj@informix.com (Mark Jeske(Chicago Consultan)t)
Newsgroups: comp.databases.informix
Message-ID: <1992Mar5.051017.17231@informix.com>
Date: 5 Mar 92 05:10:17 GMT
References: <1992Mar3.233906.8757@dbsm.oz.au>
Sender: news@informix.com (Usenet News)
Organization: Informix Software, Inc.
In article <1992Mar3.233906.8757@dbsm.oz.au> ralph@thor (Ralph Michael Gyoery) writes:
>Does anyone know of a public domain utility that will generate for me
>C header files from an INFORMIX database schema?.
The following is now posted into the public domain. Please feel
free to email me any comments or bugs. This program will generate
an esql/c template program with c structures for the database and
tables listed. For example,
$ esqlutil stores items customers
All output goes to standard out.
mark
/*
esqlutil.ec
Generate the beginning of an esql/c program. Structures for the
tables specified will be generated as well as the neccesary include
files and an error checking function.
cc -o esqlutil esqlutil.ec
Author: Mark Jeske (Informix) markj@informix.com
Date: 11-19-91
*/
#include <stdio.h>
$include sqlca;
$include sqlda;
$include sqltypes;
#define sqlerr() sqlerrln( __LINE__ )
$char dbname[20] ;
int ansi ;
int numproccessed ;
char *progtop[] = {
"#include <stdio.h>\\n\\n",
"#define sqlerr() sqlerrln( __LINE__ )\\n",
"\\n\\n",
0
} ;
char *funcs[] = {
"/*\\n",
" Checks global sqlca.sqlcode for errors. Displays error and exits.\\n",
"*/\\n",
"void sqlerrln( ln )\\n",
"",
" int ln ; /* line # of caller */\\n",
"{\\n",
" char msg[160] ;\\n",
"",
" if( sqlca.sqlcode ) {\\n",
" fprintf( stderr,\\n",
" \\"sqlcode %ld, isam %ld line %d\\\\n\\", \\n",
" sqlca.sqlcode, sqlca.sqlerrd[1], ln ) ;\\n",
" rgetmsg( sqlca.sqlcode, msg, sizeof(msg) ) ;\\n",
" fprintf( stderr, \\"%s\\", msg ) ;\\n",
" exit(1) ;\\n",
" }\\n",
"}\\n",
"\\n\\n",
0
} ;
char *ansiincl[] = {
"EXEC SQL include sqlca ;\\n",
"EXEC SQL include sqlda ;\\n",
"EXEC SQL include sqlstype ;\\n",
"EXEC SQL include sqltypes ;\\n",
"EXEC SQL include locator ;\\n",
/* "EXEC SQL include decimal ;\\n", */
"EXEC SQL include datetime ;\\n",
"\\n\\n",
0
} ;
char *incl[] = {
"$include sqlca ;\\n",
"$include sqlda ;\\n",
"$include sqlstype ;\\n",
"$include sqltypes ;\\n",
"$include locator ;\\n",
/* "$include decimal ;\\n", */
"$include datetime ;\\n",
"\\n\\n",
0
} ;
char *progbot[] = {
"main( argc, argv )\\n\\n",
" int argc ;\\n",
" char **argv ;\\n",
"{\\n",
" printf( \\"Hello world\\\\n\\" ) ;\\n",
" exit(0) ;\\n",
"}\\n",
0
} ;
/*
Checks global sqlca.sqlcode for errors. Displays error and exits.
*/
void sqlerrln( ln )
int ln ; /* line # of caller */
{
char msg[160] ;
if( sqlca.sqlcode ) {
fprintf( stderr,
"sqlcode %ld, isam %ld line %d\\n",
sqlca.sqlcode, sqlca.sqlerrd[1], ln ) ;
rgetmsg( sqlca.sqlcode, msg, sizeof(msg) ) ;
fprintf( stderr, "%s", msg ) ;
exit(1) ;
}
}
rtrim( s )
char *s ;
{
int i ;
while( s[ i=strlen(s)-1 ] == ' ' )
s[i] = '\\0' ;
}
usage( s )
char *s ;
{
fprintf( stderr,
"usage: %s [-a] dbname tblname ...\\n\\n", s ) ;
fprintf( stderr,
"-a Generate ansi sql definitions\\n\\n" ) ;
fprintf( stderr,
"Generate esql structure definitions for the indicated tables.\\n" ) ;
fprintf( stderr,
"If no tables are listed generate structs for all tables in the db.\\n" ) ;
fprintf( stderr,
"Information is written to standard output.\\n" ) ;
exit( 1 ) ;
}
procargs( argc, argv )
int argc ;
char **argv ;
{
int first = 1 ;
int i ;
if( argc < 2 ) usage( argv[0] ) ;
for( i=1; i<argc; ++i ) {
if( argv[i][0] == '-' ) {
switch( argv[i][1] ) {
case 'a' :
ansi = 1 ;
break ;
default:
usage( argv[0] ) ;
break ;
}
}
else {
if( first ) {
first = 0 ;
strncpy( dbname, argv[i], 19 ) ;
dbname[19] = '\\0' ;
$database $dbname ;
sqlerr() ;
showstr( progtop ) ;
includes() ;
}
else {
onetable( argv[i] ) ;
}
}
}
}
main( argc, argv )
int argc ;
char **argv ;
{
int i ;
procargs( argc, argv ) ;
if( numproccessed == 0 )
alltbl() ;
showstr( funcs ) ;
showstr( progbot ) ;
exit( 0 ) ;
}
showstr( s )
char **s ;
{
int i ;
for( i=0; s[i]; ++i )
printf( "%s", s[i] ) ;
}
includes()
{
int i ;
if( ansi )
showstr( ansiincl ) ;
else
showstr( incl ) ;
}
alltbl()
{
$char tbl[20] ;
$prepare p2 from "select tabname from systables where tabid > 99" ;
sqlerr() ;
$declare c1 cursor for p2 ;
sqlerr() ;
$open c1 ;
sqlerr() ;
while( 1 ) {
$fetch c1 into $tbl ;
if( sqlca.sqlcode == 100 ) break ;
sqlerr() ;
onetable( tbl ) ;
}
$close c1 ;
sqlerr() ;
}
onetable( tbl )
char *tbl ;
{
$char s[40] ;
int i ;
struct sqlda *udesc;
struct sqlvar_struct *col;
rtrim( tbl ) ;
++numproccessed ;
sprintf( s, "select * from %s", tbl ) ;
$prepare p1 from $s;
sqlerr() ;
$describe p1 into udesc;
sqlerr() ;
if( ansi ) {
printf( "EXEC SQL BEGIN DECLARE SECTION\\n" ) ;
printf( " struct %s_s {\\n", tbl ) ;
}
else
printf( "$struct %s_s {\\n", tbl ) ;
for (col = udesc->sqlvar, i = 0; i < udesc->sqld; col++, i++) {
printf( " " ) ;
if( ansi ) printf( " " ) ;
switch( col->sqltype ) {
case SQLVCHAR:
case SQLCHAR: printf( "char " )