diff options
Diffstat (limited to 'query.cpp')
-rw-r--r-- | query.cpp | 40 |
1 files changed, 38 insertions, 2 deletions
@@ -4,8 +4,8 @@ using namespace std; -WhereClause::WhereClause(void):col(0){} -WhereClause::WhereClause(const int _c,const RowItem &_v):col(_c),value(_v){} +ColValueClause::ColValueClause(void):col(0){} +ColValueClause::ColValueClause(const int _c,const RowItem &_v):col(_c),value(_v){} QueryResult::QueryResult(void):res(0){} @@ -71,6 +71,13 @@ pair<vector<map<string,Row>::const_iterator>,string> FindQuery::executeIterators cit_t end=table.rows.end(); pair<vector<map<string,Row>::const_iterator>,string> ret; + for(i=0;i<(int)where.size();i++){ + const int col=where[i].col; + if(col<0||col>=table.nc){ + ret.second="invalid col (DQ:eI)"; + return ret; + } + } for(cit_t it=table.rows.begin();it!=end;it++){ for(i=0;i<(int)where.size();i++){ const int col=where[i].col; @@ -113,6 +120,35 @@ QueryResult InsertQuery::execute(map <string,Table> &tables){ } +UpdateQuery::UpdateQuery(void){}; + +QueryResult UpdateQuery::execute(map<string,Table> &tables){ + const map<string,Table>::iterator tit=tables.find(tablename); + if(tit==tables.cend())return {{},"non-existent table (UQ:ex)"}; + Table &table=tit->second; + + FindQuery fqu; + fqu.tablename=tablename; + fqu.where=where; + pair<vector<map<string,Row>::const_iterator>,string> ret=fqu.executeIterators(table); + if(ret.second.size()!=0)return QueryResult(0,ret.second); + map<string,Row>::const_iterator it; + int i,j; + const int numupdates=updates.size(); + for(i=0;i<numupdates;i++){ + const int col=updates[i].col; + if(col<0||col>=table.nc)return QueryResult(0,"invalid col (UQ:ex)"); + } + for(i=0;i<(int)ret.first.size();i++){ + for(j=0;j<numupdates;j++){ + const int col=updates[j].col; + it->second.items[col]=updates[j].value.copy(table.header[col]); + } + } + return QueryResult(ret.first.size()); +} + + DeleteQuery::DeleteQuery(void){}; QueryResult DeleteQuery::execute(map<string,Table> &tables){ |