From 059a8baa815f0b50d11546ad26b854572ef52182 Mon Sep 17 00:00:00 2001 From: tomsmeding Date: Fri, 22 May 2015 21:13:51 +0200 Subject: CreateQuery, InsertQuery, add message in QueryResult --- query.cpp | 56 ++++++++++++++++++++++++++++++++++++++++++++------------ 1 file changed, 44 insertions(+), 12 deletions(-) (limited to 'query.cpp') diff --git a/query.cpp b/query.cpp index 3f3d6ec..2e1606f 100644 --- a/query.cpp +++ b/query.cpp @@ -11,25 +11,39 @@ WhereClause::WhereClause(const int _c,const RowItem &_v):col(_c),value(_v){} QueryResult::QueryResult(void):res(0){} QueryResult::QueryResult(int _res):res(_res){} QueryResult::QueryResult(int _res,const vector &_rows):res(_res),rows(_rows){} +QueryResult::QueryResult(int _res,const vector &_rows,const string &_m):res(_res),rows(_rows),msg(_m){} +QueryResult::QueryResult(int _res,const string &_m):res(_res),msg(_m){} -Query::Query(void):limit(-1){} +QueryResult Query::execute(map &tables){return QueryResult(-1);} -QueryResult Query::execute(const map &tables){return QueryResult(-1);} +CreateQuery::CreateQuery(void):nc(0),header(NULL){} -FindQuery::FindQuery(void):sort(0){}; +void CreateQuery::setHeader(const ColHeader *hd){ + header=new ColHeader[nc]; + memcpy(header,hd,nc*sizeof(ColHeader)); +} + +QueryResult CreateQuery::execute(map &tables){ + if(nc==0)return QueryResult(0,"zero nc"); + if(header==NULL)return QueryResult(0,"null header"); + const map::const_iterator tit=tables.find(tablename); + if(tit!=tables.cend())return QueryResult(0,"existing table"); + tables.emplace(piecewise_construct, + forward_as_tuple(tablename), + forward_as_tuple(tablename,nc,header)); + return QueryResult(1); +} -QueryResult FindQuery::execute(const map &tables){ - if(limit==0)return QueryResult(0); + +FindQuery::FindQuery(void):limit(-1),sort(0){}; + +QueryResult FindQuery::execute(map &tables){ + if(limit==0)return QueryResult(0,"zero limit"); int i,j; - /*for(i=0;i<(int)tables.size();i++){ - if(tables[i].name==from)break; - } - if(i==(int)tables.size())return QueryResult(0); - const Table &table=tables[i];*/ - const map::const_iterator tit=tables.find(from); - if(tit==tables.cend())return QueryResult(0); + const map::const_iterator tit=tables.find(tablename); + if(tit==tables.cend())return QueryResult(0,"non-existent table"); const Table &table=tit->second; for(i=0;i<(int)where.size();i++){ @@ -62,7 +76,25 @@ QueryResult FindQuery::execute(const map &tables){ if(i==(int)where.size()){ ret.res++; ret.rows.emplace_back(it->second); + if(ret.res==limit)return ret; } } return ret; } + + +InsertQuery::InsertQuery(const Row &_r):row(_r){} +InsertQuery::InsertQuery(Row &&_r):row(move(_r)){} + +QueryResult InsertQuery::execute(map &tables){ + map::iterator tit=tables.find(tablename); + if(tit==tables.end())return QueryResult(0,"non-existent table"); + Table &table=tit->second; + + if(table.nc!=row.nc)return QueryResult(0,"non-conformant row width"); + const string primkey=serialise(table.header[0],row.items[0]); + const map::const_iterator rit=table.rows.find(primkey); + if(rit!=table.rows.cend())return QueryResult(0,"existing primary key"); + table.rows.insert(make_pair(primkey,row)); + return QueryResult(1); +} -- cgit v1.2.3-54-g00ecf