/* SYMMAPDB (SCM) -- Create Symbol Mapping SQL Database */ /* SYMMAPDB (SCM) -- SQL-Symbolgatterzuordnungsdatenbank aufbauen */ /* // Copyright (c) 2003-2012 Oliver Bartels F+E, Muenchen // Author: Roman Ludwig // Changes History: // rl (120427) RELEASED FOR BAE V7.8. // rl (101019) RELEASED FOR BAE V7.6. // rl (091021) RELEASED FOR BAE V7.4. // rl (081014) RELEASED FOR BAE V7.2. // rl (080625) ENHANCEMENT: // Added optional quick process mode without consistency check. // rl (071029) RELEASED FOR BAE V7.0. // rl (060829) RELEASED FOR BAE V6.8. // rl (050906) RELEASED FOR BAE V6.6. // rl (050511) ENHANCEMENT: // Added sub gate attribute support. // rl (040811) RELEASED FOR BAE V6.4. // rl (031118) ORIGINAL CODING. // // DESCRIPTION // // The symmapdb User Language program provides functions to // create a symbol gate selection SQL database and fill it with // the .map file contents of a selectable input file. */ // Includes #include "pop.ulh" // User Language popup utilities #include "sql.ulh" // User Language SQL utilities // Disable undo state request #pragma ULCALLERNOUNDO // Messages string REPDONE = M("Es wurden keine Fehler festgestellt.", "Operation completed without errors."); string REPREADINP = M("Lesen Eingabe-Datei (%s/%d)...", "Reading Input file (%s/%d)..."); string REPHEADSKIP = M("Ungueltige ignorierte Eintraege", "Invalid Entries ignored:"); string REPILLENT = M("%s : %s","%s : %s"); string REPDIFFENT = M("%s Mapping %s Symbol %s : %d/%s/%s<>%d/%s/%s", "%s Mapping %s Symbol %s : %d/%s/%s<>%d/%s/%s"); string UPRSDIR = M("Mappingverzeichnis ? ","Mapping Directory ? "); string ERRDBINIT = M("SQL/DB-Datei '%s' kann nicht initialisiert werden!", "Error initialyzing SQL/DB file '%s'!"); // INI file parameter name definitions #define PAR_SYMMAPDB "SYMMAPDB_SCM" // Symbol mapping database #define PAR_SYMMAPPATH "SYMMAPPATH_SCM"// Symbol mapping default directory #define PAR_DSYMMAPDB "DSYMMAPDB_SCM" // Symbol mapping dest. database #define PAR_SMAPEXT "SYMMAPEXT_SCM" // Symbol mapping file ext. #define PAR_SMAPCHK "SYMMAPCHK_SCM" // Symbol mapping check flag #define PAR_SSELTSEP "SSELTSEP_SCM" // Table field separator // Database structure definitions #define MINFIELDCNT 4 // Min. input file field count string SYMMAPDB /* Symb. mapping database file name */; string DEFSTARTDIR = bae_inistrval(PAR_SYMMAPPATH,"") /* Default mapping root path */; string MAPEXT = bae_inistrval(PAR_SMAPEXT,".map") /* Input file name extension */; string FIELDSEP = bae_inistrval(PAR_SSELTSEP,";") /* Field separator character */; int SYMMAPCHK = bae_iniintval(PAR_SMAPCHK,1) /* Symbol mapping check flag */; // SQL command definitions #define M_CREATE1 "create table mapdef (mapname string,symbol string," #define M_CREATE2 "symcnt integer,libname string,rlname string,id integer);" #define M_INSERT "insert into mapdef values(%s,%s,%d,%s,%s,%d);" #define M_QINSERT "quickinsert into mapdef values(%s,%s,%d,%s,%s,%d);" #define M_SELECT1 "select libname,symcnt,rlname from mapdef where " #define M_SELECT2 "mapname=%s AND symbol=%s;" #define M_INDEX "index table mapdef;" #define MA_CREATE1 "create table mapattr (attrname string,attrval string," #define MA_CREATE2 "id integer);" #define MA_INSERT "quickinsert into mapattr values(%s,%s,%d);" #define MA_INDEX "index table mapattr;" string msg /* Message buffer */; STRINGS hl /* Report list */; int hn = 0 /* Report count */; STRINGS msgl /* Message list */; int msgn = 0 /* Message count */; string sqlcommand /* SQL command string */; int symcnt /* Symbol count */; string libname /* Library name string */; string rlname /* $rlname attribute value string */; int mapid = 1 /* Mapping entry id */; // Main program void main() /* // Read attributes from attribute list file */ { string fname /* File name */; string startdir /* Start directory */; int len /* String length */; // Set destination database name if ((SYMMAPDB=bae_inistrval(PAR_DSYMMAPDB,""))=="") SYMMAPDB=scmlibdir()+bae_inistrval(PAR_SYMMAPDB,"symmap.dat"); // Select source directory if (DEFSTARTDIR!="") { startdir=DEFSTARTDIR; } else { // Select source directory startdir=UINPOPABORT; if (bae_askdirname(startdir,getcwd(),UPRSDIR)!=0 || startdir==UINPOPABORT) error_abort(); } len=strlen(startdir)-1; if (startdir[len]=='/' || startdir[len]=='\\') startdir[len]='\0'; // Check if special field separator if (FIELDSEP=="tab") FIELDSEP="\t"; // Remove old database fseterrmode(0); remove(SYMMAPDB); // Initialize database dbinit(); // Scan the directory fname=""; while (scandirfnames(startdir,MAPEXT,fname)==1) procfile(startdir+bae_swversion(4)+fname); if (!SYMMAPCHK) sqlcmd(SYMMAPDB,M_INDEX,NULL); sqlcmd(SYMMAPDB,MA_INDEX,NULL); // Test if any errors occurred if (msgn) { // Error(s) occurred hl[hn++]=REPHEADSKIP; hl[hn++]=""; // Display messages with popup menu bae_setintpar(16,3096); popupmenu(0,"",hl,hn,msgl,msgn, UINPOPABORT,0,-1,-1,hn+msgn+2,100,0,""); // Abort return; } bae_prtdialog(REPDONE); } int splitstring(string s,STRINGS ssl) /* // Split string // Return value : // number of substrings // Parameters : // string s : Input string // STRINGS ssl : Substring list */ { int ssn = 0 /* Substring count */; int sl = strlen(s) /* String length */; int pos1 = 1 /* String position buffer 1 */; int pos2 /* String position buffer 2 */; // Repetively scan string while ((pos2=strscannext(s,FIELDSEP,pos1,1))pos1) ssl[ssn++]=strextract(s,pos1-1,pos2-2); else ssl[ssn++]=""; // Update the scan start position pos1=pos2+1; } // Extract last substring if last char not delimiter if (pos10 && s[sl-1]==FIELDSEP[0]) ssl[ssn++]=""; // Remove field quotation marks for (pos1=0;pos10 && ((c=readbuf[len-1])==0x0a || c==0x0d)) len--; readbuf[len]='\0'; buf+=readbuf; for (i=qcnt=0;buf[i]!='\0';i++) if (buf[i]=='"') qcnt++; // Read until all quotes closed } while (buf=="" || (qcnt&1)==1); // Return without errors return(0); } void procfile(string fname) /* // Scan file for mapping definitions // Parameter : // string fname : Scan file name */ { int ifh /* Input file handle */; string readbuf /* Input buffer */; string attrname /* Attribute name */; string attrval /* Attribute value */; STRINGS strl /* String list */; int cnt = 0 /* Symbol count */; int strn = 0 /* String count */; int curline = 0 /* Current input line */; int i, j, k /* Loop control variables */; fseterrmode(0); // Open attribute list file ifh=bae_fopen(fname,0); // Loop for all lines while (readextline(ifh,readbuf)==0) { curline++; sprintf(msg,REPREADINP,fname,curline); bae_prtdialog(msg); // Split line into semicolon-separated strings strl[MINFIELDCNT]=""; if ((strn=splitstring(readbuf,strl))MINFIELDCNT) // Ignore empty input line continue; // Check if already defined symcnt=(-1); cnt=atoi(strl[2]); if (SYMMAPCHK) { sprintf(sqlcommand,M_SELECT1+M_SELECT2, sql_quotestr(strl[0]),sql_quotestr(strl[1])); sqlcmd(SYMMAPDB,sqlcommand,chkfunc); } if (symcnt>=0 && strn<=MINFIELDCNT) { if (symcnt==cnt && libname==strl[3] && rlname==strl[4]) continue; sprintf(msgl[msgn],REPDIFFENT,fname,strl[0],strl[1], cnt,strl[3],strl[4],symcnt,libname,rlname); msgn++; } else { // Store entry to database sprintf(sqlcommand,SYMMAPCHK ? M_INSERT : M_QINSERT, sql_quotestr(strl[0]),sql_quotestr(strl[1]),cnt, sql_quotestr(strl[3]),sql_quotestr(strl[4]),mapid); if (sqlcmd(SYMMAPDB,sqlcommand,NULL)) // SQL/DB error ) sql_dberror(0); for (j=MINFIELDCNT+1;j