RFC C++ Interface - Mailing list pgsql-interfaces
From | Randy Jonasz |
---|---|
Subject | RFC C++ Interface |
Date | |
Msg-id | Pine.BSF.4.30.0012061646490.32123-100000@nietzsche.jaded.net Whole thread Raw |
List | pgsql-interfaces |
I know it's been a while since we last discussed a possible rewrite of the C++ API but I now have some time to devote to it. The following are my ideas for implementing the C++ API: I need suggestions, additions, comments etc! All classes will be defined in postgres namespace. The desired usage would be as follows //create a database object postgres::db = database("host = somewhere.com user=someone password=something dbname=mydb"); //synchronous connection returns TRUE upon success FALSE upon error if( db.connect() ) { string sql("SELECT * FROM foo"); postgres::result res = db.exec(sql); if( !res.error() ) { int numrows = res.numrows(); //used to obtain number of rows returned //by previous sql statement int numcols = res.numcols(); //used to obtain number of columns //returned by previous sql statement int field1; char field2[size],field3[size]; long field4; //results can be obtained within a for loop using numrows, numcols or as //below while( res.getrow() ) { //increment row //result object has insert operator and array operator overloaded res >> field1 >> field2; //result object will returndatatypes not //just chars field3 = res[0]; field4 = res["fieldname"]; //.. do something with values .. } } else { cerr << res.display_error(); } } else { cerr << db.display_error(); } Alternatively one could access db asynchronously //create a database object postgres::db = database("host = somewhere.com user=someone password=something dbname=mydb"); db.setasync(); //set asyncrhonous conection with back-end //setsync does the opposite while( !db.connect() && !db.error() ) { //..do something } if( db.error() ) { cerr << db.display_error(); exit(1); } string sql("SELECT * FROM foo"); postgres::result res = db.exec(sql); while( !res.ready() && !res.error() ) { //..do something } One could also set exceptions with //create a database object postgres::db = database("host = somewhere.com user=someone password=something dbname=mydb"); db.setexception(); try { db.connect(); string sql("SELECT * FROM foo"); postgres::result res = db.exec(sql); } catch( postgres::error& err ) { //..do something cerr << err.display_error(); } The above examples make use of embedded sql being passed to the db object via a string object. ( exec will be overloaded to accept a const char * as well). I also envision a higher level which might prove usefull. //create a database object postgres::db = database("host = somewhere.com user=someone password=something dbname=mydb"); postgres::table mytable = db.gettable("tablename"); //table can now be queried about characteristics of table uint64_t numcols = mytable.numcols(); //need to find the max values and return an appropriate type uint64_t numrows = mytable.numrows(); size_t colsize = mytable.colsize("column"); //obtain an inserter postgres::inserter myinsert mytable.getinsert(); inserter.setcolumn("colname"); ifstream infile; infile.open("myfile"); char data[32]; while (infile.getline(line,sizeof(data),'\t')) { inserter << data; } the above can be extended to include update and delete functions as well postgres::updater myupdate mytable.getupdate(); myupdate.setcolumn("colname"); myupdate.setcond("WHERE something = something"); ifstream infile; infile.open("myfile"); char data[32]; while (infile.getline(line,sizeof(data),'\t')) { myupdate << data; } Randy Jonasz Software Engineer Click2net Inc. Web: http://www.click2net.com Phone: (905) 271-3550 "You cannot possibly pay a philosopher what he's worth, but try your best" -- Aristotle
pgsql-interfaces by date: