00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #include "read_write_base.hpp"
00022
00023
00024 read_write_base::read_write_base()
00025 :DbMaker(PROVIDER,CONNECTSTRING),db(DbMaker.db())
00026 ,RsMaker(db),rs(RsMaker.rs())
00027 ,CmdMaker(db),cmd(CmdMaker.cmd()),m_name("")
00028 ,m_result(""),m_key(0LL),actDerived(false)
00029 {
00030 ;
00031 }
00032
00033
00034 read_write_base::read_write_base( dbProvider Provider, const char * Connectstring )
00035 :DbMaker(Provider,Connectstring),db(DbMaker.db())
00036 ,RsMaker(db),rs(RsMaker.rs())
00037 ,CmdMaker(db),cmd(CmdMaker.cmd()),m_name("")
00038 ,m_result(""),m_key(0LL),actDerived(false)
00039 {
00040 ;
00041 }
00042 read_write_base::~read_write_base()
00043 {
00044 clearMaps();
00045 }
00046 void read_write_base::clearMaps( void )
00047 {
00048 for(int i=0; i<xfers.size(); ++i )
00049 {
00050 delete xfers[i];
00051 }
00052 xfers.clear();
00053 }
00054 bool read_write_base::db_action( string mode, changeMap & changes )
00055 {
00056 bool breturn = false;
00057 m_result = "";
00058 switch( mode[0] )
00059 {
00060 case 'u':
00061 breturn = db_update(changes);
00062 get_data();
00063 if( breturn ) usupplemental(changes);
00064 break;
00065 case 'i':
00066 breturn = db_insert();
00067 if( breturn ) breturn = get_data();
00068 if( breturn ) isupplemental();
00069 break;
00070 case 'd':
00071 breturn = db_delete();
00072 if( breturn ) dsupplemental();
00073 case 'r':
00074 case 'n':
00075 key(0);
00076 break;
00077 case 's':
00078 default:
00079 breturn = get_data();
00080 if( breturn ) ssupplemental();
00081 break;
00082 }
00083 return breturn;
00084 }
00085 bool read_write_base::db_insert( void )
00086 {
00087 bool breturn = false;
00088 if( key() && !actDerived )
00089 {
00090 m_result = "Reset key! ";
00091 key(0);
00092 }
00093 if( ivalidate() )
00094 {
00095 string sql = "insert into ";
00096 string colNames = " ( ", colVals = " values ( ";
00097 sql += data_name();
00098
00099
00100
00101 for( int i=actDerived?0:1;
00102 i<xfers.size();
00103 ++i )
00104 {
00105 colNames += xfers[i]->name();
00106 colVals += xfers[i]->toFieldVar();
00107 if( i<xfers.size()-1 )
00108 {
00109 colNames += ", ";
00110 colVals += ", ";
00111
00112 }
00113 }
00114 colNames += " ) ";
00115 colVals += " ) ";
00116 sql += colNames;
00117 sql += colVals;
00118 if( cmd.execute(sql) )
00119 {
00120 key( cmd.resultKey( xfers[0]->name() , data_name() ) );
00121 breturn = true;
00122 m_result = "Insert Successful\n";
00123 m_result += "<!-- ";
00124 m_result += sql;
00125 m_result += " Key Returned: ";
00126 m_result.append(key());
00127 m_result += " -->\n";
00128 }
00129 else
00130 {
00131 m_result = "Insert Command Failed: ";
00132 m_result += "<!-- ";
00133 m_result += sql;
00134 m_result += " -->";
00135 m_result += " - ";
00136 m_result += cmd.getErrors();
00137 }
00138 }
00139 return breturn;
00140 }
00141 bool read_write_base::db_update( changeMap & changes )
00142 {
00143 bool breturn = false;
00144 bool foundChange = false;
00145 if( uvalidate(changes) )
00146 {
00147 bool cols=0;
00148 if( changes.size() )
00149 {
00150 ocString sql = "update ";
00151 sql += data_name();
00152 sql += " set ";
00153
00154
00155 for(int i=actDerived?0:1;
00156 i<xfers.size();
00157 ++i )
00158 {
00159
00160 if( changes.find(xfers[i]->name()) != changes.end() )
00161 {
00162 if( cols )
00163 {
00164 sql += ", ";
00165 }
00166 sql += xfers[i]->name();
00167 sql += " = ";
00168 sql += xfers[i]->toFieldVar();
00169 ++cols;
00170 foundChange = true;
00171 }
00172 }
00173 sql += " where ";
00174 sql += xfers[0]->name();
00175 sql += " = ";
00176 sql.append(key());
00177 if( !foundChange )
00178 {
00179 m_result = "No Changes Made";
00180 breturn = true;
00181 }
00182 else if( cmd.execute(sql) )
00183 {
00184 m_result = "Update Successful\n<!-- ";
00185 m_result += sql;
00186 m_result += " -->\n";
00187 breturn = true;
00188 }
00189 else
00190 {
00191 m_result = "Update Command Failed: ";
00192 m_result += "<!-- ";
00193 m_result += sql;
00194 m_result += " -->";
00195 m_result += " - ";
00196 m_result += cmd.getErrors();
00197 }
00198 }
00199 else
00200 {
00201 m_result += " No Changes Made.";
00202 }
00203 }
00204 return breturn;
00205 }
00206 bool read_write_base::db_delete( void )
00207 {
00208 bool breturn = false;
00209 if(dvalidate())
00210 {
00211 ocString sql = "delete from ";
00212 sql += data_name();
00213 sql += " where ";
00214 sql += xfers[0]->name();
00215 sql += " = ";
00216 sql.append(key());
00217
00218 if( cmd.execute(sql) )
00219 {
00220 breturn = true;
00221 m_result = "Delete Successful\n<!-- ";
00222 m_result += sql;
00223 m_result += " -->\n";
00224 }
00225 else
00226 {
00227 m_result = "Delete Command Failed: ";
00228 m_result += sql;
00229 m_result += " - ";
00230 m_result += cmd.getErrors();
00231 }
00232 }
00233 return breturn;
00234 }
00235 bool read_write_base::get_data( void )
00236 {
00237 bool breturn = false;
00238 if( key() == 0 )
00239 {
00240 return breturn;
00241 }
00242 int i;
00243 ocString sql = "select ";
00244 for(i=0; i<xfers.size(); ++i )
00245 {
00246 sql += xfers[i]->name();
00247 if( i<xfers.size()-1 )
00248 {
00249 sql += ", ";
00250 }
00251 }
00252 sql += " from ";
00253 sql += data_name();
00254 sql += " where ";
00255 sql += xfers[0]->name();
00256 sql += " = ";
00257 sql.append(key());
00258 if( rs.open(sql) )
00259 {
00260 breturn=true;
00261 for(i=0; i<xfers.size(); ++i )
00262 {
00263 xfers[i]->toClassVar( rs.getField(i) );
00264 }
00265 }
00266 else
00267 {
00268 m_result += " Could not get data\n<!-- ";
00269 m_result += sql;
00270 m_result += "\n";
00271 m_result += rs.getErrors();
00272 m_result += " -->\n";
00273 }
00274 return breturn;
00275 }
00276
00277
00278 bool read_write_base::get_data( string whereClause, string orderClause )
00279 {
00280 bool breturn = false;
00281 int i;
00282 ocString sql = "select ";
00283 for(i=0; i<xfers.size(); ++i )
00284 {
00285 sql += xfers[i]->name();
00286 if( i<xfers.size()-1 )
00287 {
00288 sql += ", ";
00289 }
00290 }
00291 sql += " from ";
00292 sql += data_name();
00293 if( whereClause.length() )
00294 {
00295 sql += " where ";
00296 sql += whereClause;
00297 }
00298
00299 if( orderClause.length() )
00300 {
00301 sql += " order by ";
00302 sql += orderClause;
00303 }
00304
00305 if( rs.open(sql) )
00306 {
00307 breturn=true;
00308
00309
00310 key( atoll(rs.getField(0).format().c_str()) );
00311
00312 for(i=0; i<xfers.size(); ++i )
00313 {
00314 xfers[i]->toClassVar( rs.getField(i) );
00315 }
00316 }
00317 else
00318 {
00319 m_result += " Could not get data <!--";
00320 m_result += sql;
00321 m_result += " - ";
00322 m_result += rs.getErrors();
00323 m_result += " -->";
00324 }
00325 return breturn;
00326 }
00327
00328
00329
00330
00331 bool read_write_base::next( void )
00332 {
00333 bool ret = rs.next();
00334 if( ret )
00335 {
00336 key( atoll(rs.getField(0).format().c_str()) );
00337 for(int i=0; i<xfers.size(); ++i )
00338 {
00339 xfers[i]->toClassVar( rs.getField(i) );
00340 }
00341 }
00342 return ret;
00343 }
00344
00345
00346 bool read_write_base::commit( void )
00347 {
00348 return cmd.commit();
00349 }
00350
00351
00352
00353
00354
00355 bool read_write_base::addDXMap( dataXfer * xfer )
00356 {
00357 bool breturn = true;
00358 xfers.push_back(xfer);
00359 return breturn;
00360 }
00361
00362 bool read_write_base::ivalidate( void ) { return true; }
00363 bool read_write_base::uvalidate( changeMap & changes ) { return true; }
00364 bool read_write_base::dvalidate( void ) { return true; }
00365
00366 bool read_write_base::isupplemental( void ){ return true; }
00367 bool read_write_base::usupplemental( changeMap & changes ){ return true; }
00368 bool read_write_base::dsupplemental( void ){ return true; }
00369 bool read_write_base::ssupplemental( void ){ return true; }
00370
00371
00372
00373