4#include "facilities/Util.h"
5#include "rdbModel/Db/MysqlConnection.h"
6#include "rdbModel/Db/MysqlResults.h"
7#include "rdbModel/Management/Manager.h"
8#include "rdbModel/Management/XercesBuilder.h"
9#include "rdbModel/Rdb.h"
10#include "rdbModel/RdbException.h"
11#include "rdbModel/Tables/Assertion.h"
12#include "rdbModel/Tables/Column.h"
13#include "rdbModel/Tables/Datatype.h"
14#include "rdbModel/Tables/Table.h"
30 std::string infile(
"$(RDBMODELROOT)/xml/calib_test.xml" );
38 int errcode = man->
build();
42 std::cerr <<
"Build failed with error code " << errcode << std::endl;
56 std::vector<FieldVal> oldFields;
57 oldFields.reserve( 10 );
58 oldFields.push_back( FieldVal(
"proc_level",
"PROD",
false ) );
59 oldFields.push_back( FieldVal(
"calib_type",
"CAL_Ped",
false ) );
60 oldFields.push_back( FieldVal(
"ser_no",
"17",
false ) );
61 oldFields.push_back( FieldVal(
"completion",
"OK",
false ) );
62 oldFields.push_back( FieldVal(
"prod_start",
"",
true ) );
67 bool checkOld = a->
verify( oldRow1, toBeRow );
69 std::cout <<
"Result of verifying 'maySupersede' against oldRow1: " << checkOld << std::endl
73 oldFields.push_back( FieldVal(
"proc_level",
"DEV",
false ) );
74 oldFields.push_back( FieldVal(
"calib_type",
"CAL_Ped",
false ) );
75 oldFields.push_back( FieldVal(
"ser_no",
"17",
false ) );
76 oldFields.push_back( FieldVal(
"completion",
"OK",
false ) );
80 checkOld = a->
verify( oldRow2, toBeRow );
82 std::cout <<
"Result of verifying 'maySupersede' against oldRow2: " << checkOld << std::endl
93 std::cout <<
"Value of isPrimaryKey() for column ser_no is: " << serCol->
isPrimaryKey()
97 { std::cout <<
"Min and max for ser_no are " << colMin <<
", " << colMax << std::endl; }
98 else { std::cout <<
"ser_no has no min, max " << std::endl; }
100 else std::cout <<
"no such column as 'ser_no' " << std::endl;
108 { std::cout <<
"Min and max for vstart are " << colMin <<
", " << colMax << std::endl; }
109 else { std::cout <<
"vstart has no min, max " << std::endl; }
111 else std::cout <<
"no such column as 'vstart' " << std::endl;
116 std::string connectfileT(
"$(RDBMODELROOT)/xml/connect/mysqlTester.xml" );
118 std::string connectfileT(
"$(RDBMODELROOT)/xml/connect/mysqlSlacT.xml" );
124 std::string connectfile(
"$(RDBMODELROOT)/xml/connect/mysqlSlac.xml" );
126 if ( !( con->
open( connectfile ) ) )
128 std::cerr <<
"Unable to connect to MySQL database" << std::endl;
137 std::cout <<
"XML schema and MySQL database are equivalent!" << std::endl;
140 std::cout <<
"XML schema and MySQL database are compatible" << std::endl;
143 std::cout <<
"XML schema and MySQL database are NOT compatible" << std::endl;
146 std::cout <<
"Connection failed while attempting match" << std::endl;
152 rq[0] =
"select * from metadata_v2r1";
153 rq[1] =
"select calib_type from metadata_v2r1";
154 rq[2] =
"select garbage from metadata_v2r1";
155 for (
int i = 0; i < 3; i++ )
162 std::cout <<
"dbRequest '" << rq[i] <<
"'" << std::endl;
163 std::cout <<
"succeeded, returned " << res->
getNRows() <<
" rows" << std::endl;
167 std::cout <<
"dbRequest '" << rq[i] <<
"'" << std::endl;
168 std::cout <<
"succeeded, no returned data expected" << std::endl;
172 std::cerr <<
"dbRequest '" << rq[i] <<
"'" << std::endl;
173 std::cerr <<
" failed with error: " << ex.
getMsg() << std::endl;
174 std::cerr <<
"Code " << ex.
getCode() << std::endl;
181 if ( !( con->
open( connectfile ) ) )
183 std::cerr <<
"Unable to connect to MySQL database" << std::endl;
189 if ( !( con->
open( connectfileT ) ) )
191 std::cerr <<
"Unable to connect to MySQL database" << std::endl;
205 std::cout <<
"Hallelujah! Inserted new row, serial# " << serial << std::endl;
227 int nUpdates =
doUpdate( rdb, serial );
229 if ( nUpdates ) { std::cout <<
"Did " << nUpdates <<
" on row " << serial << std::endl; }
230 else std::cout <<
"Failed to update row " << serial << std::endl;
232 else { std::cout <<
"Bah, humbug. Insert failed. " << std::endl; }
237 std::cout <<
"Did insertLatest, inserted new row with ser_no = " << serial << std::endl;
243 std::cout <<
"Supersede of " << serial <<
" successful." << std::endl;
244 std::cout <<
"New row is " << newSerial << std::endl;
246 else { std::cout <<
"Supersede of " << serial <<
" failed" << std::endl; }
248 else if ( !disable ) { std::cout <<
"Bah, humbug. insertLatest failed. " << std::endl; }
256 std::cout <<
"XML schema and MySQL database are equivalent!" << std::endl;
259 std::cout <<
"XML schema and MySQL database are compatible" << std::endl;
262 std::cout <<
"XML schema and MySQL database are NOT compatible" << std::endl;
266 std::cout <<
"Connection failed while attempting match" << std::endl;
277 std::cout <<
"XML schema and MySQL database are equivalent!" << std::endl;
280 std::cout <<
"XML schema and MySQL database are compatible" << std::endl;
283 std::cout <<
"XML schema and MySQL database are NOT compatible" << std::endl;
286 std::cout <<
"Connection failed while attempting match" << std::endl;
301 std::vector<FieldVal> fields;
302 fields.reserve( 15 );
304 fields.push_back( FieldVal(
"instrument",
"LAT" ) );
305 fields.push_back( FieldVal(
"calib_type",
"Test_Gen" ) );
306 fields.push_back( FieldVal(
"flavor",
"berry" ) );
307 fields.push_back( FieldVal(
"data_fmt",
"nonsense" ) );
308 fields.push_back( FieldVal(
"vstart",
"2003-02-01" ) );
309 fields.push_back( FieldVal(
"data_size",
"0" ) );
310 fields.push_back( FieldVal(
"locale",
"phobos" ) );
311 fields.push_back( FieldVal(
"completion",
"ABORT" ) );
312 fields.push_back( FieldVal(
"data_ident",
"$(mycalibs)/test/moreJunk.xml" ) );
313 fields.push_back( FieldVal(
"notes",
"Absurd test item, setting input_desc to NULL" ) );
314 fields.push_back( FieldVal(
"input_desc",
"",
true ) );
320 rdb->
insertRow(
"metadata_v2r1", row, &serial );
328 std::vector<FieldVal> fields;
329 fields.reserve( 15 );
331 fields.push_back( FieldVal(
"instrument",
"LAT" ) );
332 fields.push_back( FieldVal(
"calib_type",
"CAL_Ped" ) );
333 fields.push_back( FieldVal(
"flavor",
"vanilla" ) );
334 fields.push_back( FieldVal(
"proc_level",
"PROD" ) );
335 fields.push_back( FieldVal(
"completion",
"OK" ) );
336 fields.push_back( FieldVal(
"data_fmt",
"XML" ) );
337 fields.push_back( FieldVal(
"fmt_version",
"1.1" ) );
338 fields.push_back( FieldVal(
"data_ident",
"nofile.xml" ) );
339 fields.push_back( FieldVal(
"vstart",
"2004-01-04" ) );
340 fields.push_back( FieldVal(
"vend",
"2030-01-01" ) );
341 fields.push_back( FieldVal(
"locale",
"Oz" ) );
342 fields.push_back( FieldVal(
"input_desc",
"none" ) );
343 fields.push_back( FieldVal(
"notes",
"trying out insertLatest" ) );
344 fields.push_back( FieldVal(
"prod_end",
"",
true ) );
345 fields.push_back( FieldVal(
"input_start",
"",
true ) );
346 fields.push_back( FieldVal(
"input_end",
"",
true ) );
353 { std::cerr <<
"insertLatest failed with message" << ex.
getMsg(); }
366 std::string serialStr;
367 Util::itoa( serial, serialStr );
368 Assertion::Operator* serEquals =
372 Assertion* whereSer =
new Assertion( serEquals );
378 std::vector<FieldVal> fields;
380 fields.push_back( FieldVal(
"notes",
"1st update: set data_size to non-zero value" ) );
381 fields.push_back( FieldVal(
"data_size",
"883" ) );
385 std::string table(
"metadata_v2r1" );
387 unsigned nChange = rdb->
updateRows( table, row, whereSer );
391 fields.push_back( FieldVal(
"data_size",
"",
true ) );
392 fields.push_back( FieldVal(
"notes",
"2nd update: data_size set to NULL" ) );
395 nChange += rdb->
updateRows( table, row2, whereSer );
405 std::cerr << colname <<
" not found by getQuick" << std::endl;
409 std::string name = col->
getName();
410 if ( colname.compare( name ) != 0 )
411 { std::cerr <<
"Instead of " << colname <<
", getColumnByName found " << name << std::endl; }
414 { std::cout <<
"getColumnByName found correct column with name " << colname << std::endl; }
426 row.
addField( FieldVal(
"data_ident",
"supFile.xml" ) );
427 row.addField( FieldVal(
"notes",
"this supersede is not supposed to work" ) );
428 row.addField( FieldVal(
"instrument",
"cello" ) );
430 retVal =
doSupersede( rdb, row, serial, newSerial );
431 if ( !retVal ) nSuccess++;
435 row.addField( FieldVal(
"notes",
"oops! left out data_ident" ) );
437 retVal =
doSupersede( rdb, row, serial, newSerial );
438 if ( !retVal ) nSuccess++;
442 row.addField( FieldVal(
"data_ident",
"supFile.xml" ) );
443 row.addField( FieldVal(
"notes",
"Try supersede with good row input" ) );
444 retVal =
doSupersede( rdb, row, serial, newSerial );
445 if ( !retVal ) nSuccess++;
447 std::cout <<
"Attempted 3 supersedes; # success = " << nSuccess << std::endl;
453 std::string table(
"metadata_v2r1" );
458 retVal = rdb->
supersedeRow( table, row, serial, newSerial );
461 std::cout <<
"supersede of row " << serial <<
" failed with code " << retVal
464 else { std::cout <<
"supsersede of row " << serial <<
" succeeded" << std::endl; }
467 std::cout <<
"supersede of row " << serial <<
" failed with exception " << std::endl;
468 std::cout << ex.
getMsg() << std::endl;
bool verify(Row &old, Row &toBe) const
bool isPrimaryKey() const
Datatype * getDatatype() const
const std::string & getName() const
bool getInterval(std::string &min, std::string &max)
void setInputSource(std::string pname)
void setBuilder(Builder *b)
static Manager * getManager()
virtual bool open(const std::string &host, const std::string &userid, const std::string &password, const std::string &dbName)
virtual ResultHandle * dbRequest(const std::string &request)
virtual void disableModify(bool disable)
virtual MATCH matchSchema(Rdb *rdb, bool matchDbName=true)
virtual int getCode() const
virtual std::string getMsg()
int supersedeRow(const std::string &tName, Row &row, int oldKey, int *newKey=0) const
Table * getTable(const std::string &name) const
int insertLatest(Table *t, Row &row, int *serial=0) const
int updateRows(const std::string &tName, Row &row, Assertion *where) const
Column * getColumn(const std::string &tableName, const std::string &colName) const
int insertRow(const std::string &tName, Row &row, int *serial=0) const
virtual unsigned int getNRows() const =0
Return number of rows in results.
void addField(const FieldVal &f)
int doInsert(rdbModel::Rdb *con)
int doSmartInsert(rdbModel::Rdb *rdb)
void tryQuick(rdbModel::Table *t, const std::string &colname)
int doSupersedes(rdbModel::Rdb *rdb, int serial, int *newSerial)
int doSupersede(rdbModel::Rdb *rdb, rdbModel::Row &row, int serial, int *newSerial)
int doUpdate(rdbModel::Rdb *, int serial)