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 --- engine.cpp | 48 ++++++++++++++++++++++++++++++------------------ enginedata.cpp | 12 +----------- enginedata.h | 6 ++---- query.cpp | 56 ++++++++++++++++++++++++++++++++++++++++++++------------ query.h | 27 ++++++++++++++++++++++----- 5 files changed, 99 insertions(+), 50 deletions(-) diff --git a/engine.cpp b/engine.cpp index 098a55e..608d641 100644 --- a/engine.cpp +++ b/engine.cpp @@ -30,31 +30,43 @@ int main(int argc,char **argv){ header[0]={RH_INT32,0}; header[1]={RH_UINT32,0}; header[2]={RH_BYTES,10}; - //tables.emplace("hoi",Table("hoi",3,header)); - createTable("hoi",3,header); + + CreateQuery cqu; + cqu.tablename="hoi"; + cqu.nc=3; + cqu.setHeader(header); + QueryResult res=cqu.execute(tables); + + cout<<"Create, Result: "<insert(row))cout<<"Failed to insert row!"<insert(row))cout<<"Failed to insert row!"<rows.size()<<" row"<<(hoitb->rows.size()==1?"":"s")<<'.'< found=hoitb->find(serialise((int32_t)-1)); - cout<<"Found for key -1:"<header[0],row.items[0]); - cerr<name<<"' key="<name<<"' key="<::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); +} diff --git a/query.h b/query.h index d19494e..5018f9d 100644 --- a/query.h +++ b/query.h @@ -19,23 +19,40 @@ struct WhereClause{ struct QueryResult{ int res; vector rows; + string msg; //empty message indicates success QueryResult(void); QueryResult(int); QueryResult(int,const vector&); + QueryResult(int,const vector&,const string&); + QueryResult(int,const string&); }; struct Query{ - string from; - int limit; //-1=unlimited - Query(void); - virtual QueryResult execute(const map&); + string tablename; + virtual QueryResult execute(map&); +}; + +struct CreateQuery : public Query{ + int nc; + ColHeader *header; + CreateQuery(void); + void setHeader(const ColHeader *hd); + QueryResult execute(map &tables); }; struct FindQuery : public Query{ + unsigned int limit; //-1=unlimited int sort; //0=no sort, 1=sort, -1=reverse sort vector where; FindQuery(void); - QueryResult execute(const map&); + QueryResult execute(map &tables); +}; + +struct InsertQuery : public Query{ + Row row; + InsertQuery(const Row &_r); + InsertQuery(Row &&_r); + QueryResult execute(map &tables); }; -- cgit v1.2.3-54-g00ecf