| Quintiq file version 2.0 | 
| #parent: #root | 
| Method GetOrCreate ( | 
|   String table, | 
|   String keyNameTuple, | 
|   String nonKeyNameTuple, | 
|   String keyValueTuple, | 
|   String nonKeyValueTuple | 
| ) as Number | 
| { | 
|   Description: 'Maintain by R&D' | 
|   TextBody: | 
|   [* | 
|     // jasperb Feb-21-2012 (created) | 
|     // danr June-6-2012 (changed for WriteToFile in particular) | 
|      | 
|     /* | 
|     Input arguments: | 
|      * table: e.g. benchmark or setup | 
|      * nametuple: comma-seperated column titles | 
|      * keyValueTuple: comma-separated values, these *are* used for matching (avoiding duplicates) | 
|      * nonkeyValueTuple: : comma-separated values, not used for matching | 
|      | 
|     If keyValueTuple = "" then unique entries will always be created | 
|      | 
|     Writing to file makes CSV's (using Benchmark::Delimiter (currently '$') as separator), one for each table. | 
|     First column of "table" is always the id. | 
|     Following columns are always the key columns, after that the non-key ones. | 
|     */ | 
|      | 
|     result := -1; | 
|      | 
|     nameTuple := ''; | 
|     valueTuple := ''; | 
|      | 
|     if( keyValueTuple <> "" and nonKeyValueTuple <> "" ) | 
|     { | 
|       nameTuple := keyNameTuple + "," + nonKeyNameTuple; | 
|       valueTuple := keyValueTuple + "," + nonKeyValueTuple; | 
|     } | 
|     else | 
|     { | 
|       nameTuple := keyNameTuple + nonKeyNameTuple; | 
|       valueTuple := keyValueTuple + nonKeyValueTuple | 
|     } | 
|      | 
|     if( this.WriteToFile() and this.WriteToDB() ) | 
|     { | 
|       error( 'both WriteToFile() = true and WriteToDB() = true; cant deal with that' ); | 
|     } | 
|      | 
|     if( this.WriteToFile() ) | 
|     { | 
|       OS::CreateDirectory( this.Directory() ); | 
|      | 
|       filename := this.Directory() + '/' + table + '.csv' | 
|      | 
|       file := OSFile::Construct(); | 
|       file.Open( filename, 'ReadWrite', true ); | 
|      | 
|       searchFor :=  BenchmarkUtilities::FormatCSV( keyValueTuple ); | 
|       matchID := 0; maxID := 0; count := 0; | 
|       lineID := 0; lineRest := ''; | 
|      | 
|       while( not file.IsEOF() and matchID = 0 ) | 
|       { | 
|         line := file.ReadTextLine(); | 
|         count++; | 
|      | 
|         if( count > 1 ) | 
|         { | 
|           // We skip the header line, if it exists | 
|           BenchmarkUtilities::SplitCSVLine( line, lineID, lineRest ); | 
|           // Keep track of max. ID that occurs | 
|           maxID := maxvalue( lineID, maxID ); | 
|           // See if this is the line we're looking for | 
|           if( keyValueTuple <> '' and lineRest.FindString(searchFor, 0 ) = 0 ) | 
|           { | 
|             matchID := lineID; | 
|           } | 
|         } | 
|       } | 
|      | 
|      | 
|       if( count = 0 ) | 
|       { | 
|         // file is empty | 
|         file.WriteTextLine( BenchmarkUtilities::FormatCSV( table + 'id,' + nameTuple ) ); | 
|       } | 
|      | 
|       result := -1; | 
|       if( matchID = 0 ) | 
|       { | 
|         // No match, write new one | 
|         newID := maxID + 1; | 
|         file.WriteTextLine( BenchmarkUtilities::FormatCSV( [String] newID + ',' + valueTuple ) ); | 
|         result := newID; | 
|       } | 
|       else | 
|       { | 
|         // match | 
|         result := matchID; | 
|       } | 
|       file.Close(); | 
|     } | 
|      | 
|     if( this.WriteToDB() ) | 
|     { | 
|       idname := table + "id"; | 
|      | 
|       selectquery := "SELECT " + idname + " FROM " + table + " WHERE (" + keyNameTuple + ")=(" + keyValueTuple + ") ORDER BY " + idname; | 
|       queryresult := this.FlatQuery( selectquery ); | 
|      | 
|       if( queryresult.NrRows() = 0 ) | 
|       { | 
|         insertquery := "INSERT INTO " + table + " (" + nameTuple + ") VALUES (" + valueTuple + ")"; | 
|         queryresult := this.FlatQuery( insertquery ); | 
|      | 
|         infoquery := "SELECT LAST_INSERT_ID()"; | 
|         queryresult := this.FlatQuery( infoquery ); | 
|      | 
|         if( queryresult.NrRows() = 0 ) | 
|         { | 
|           error('SELECT LAST_INSERT_ID() returns nothing'); | 
|         } | 
|       } | 
|       else if( queryresult.NrRows() > 1 ) | 
|       { | 
|         info('WHOA! More than one matching result found while updating table ' + table); | 
|       } | 
|      | 
|       result := queryresult.Row( 0 ).Field( 0 ).AsNumber(); | 
|     } | 
|      | 
|     if( not this.WriteToFile() and not this.WriteToDB() ) | 
|     { | 
|       result := 0; | 
|     } | 
|      | 
|     return result; | 
|   *] | 
| } |