From 8bf922f71c0e37ac590f9527a6cf1a6d2cab793c Mon Sep 17 00:00:00 2001 From: tomsmeding Date: Sat, 23 May 2015 20:51:49 +0200 Subject: UpdateQuery --- engine.cpp | 22 +++++++++++----------- enginedata.cpp | 36 +++++++++++++++++++++++++----------- enginedata.h | 9 ++++++--- query.cpp | 40 ++++++++++++++++++++++++++++++++++++++-- query.h | 18 +++++++++++++----- 5 files changed, 93 insertions(+), 32 deletions(-) diff --git a/engine.cpp b/engine.cpp index 6e46269..568245b 100644 --- a/engine.cpp +++ b/engine.cpp @@ -46,10 +46,10 @@ int main(int argc,char **argv){ { Row row(3,hoitb); - row.items[0].rh_int32=UINT_MAX; - row.items[1].rh_uint32=UINT_MAX; - row.items[2].rh_bytes=new unsigned char[10]; - memcpy((char*)row.items[2].rh_bytes,"hallo daar",10); + row.items[0].v.rh_int32=UINT_MAX; + row.items[1].v.rh_uint32=UINT_MAX; + row.items[2].v.rh_bytes=new unsigned char[10]; + memcpy((char*)row.items[2].v.rh_bytes,"hallo daar",10); InsertQuery iqu(move(row)); iqu.tablename="hoi"; @@ -62,10 +62,10 @@ int main(int argc,char **argv){ { Row row(3,hoitb); - row.items[0].rh_int32=42; - row.items[1].rh_uint32=UINT_MAX; - row.items[2].rh_bytes=new unsigned char[10]; - memcpy((char*)row.items[2].rh_bytes,"doei!\0\0\0\0",10); + row.items[0].v.rh_int32=42; + row.items[1].v.rh_uint32=UINT_MAX; + row.items[2].v.rh_bytes=new unsigned char[10]; + memcpy((char*)row.items[2].v.rh_bytes,"doei!\0\0\0\0",10); InsertQuery iqu(move(row)); iqu.tablename="hoi"; @@ -79,7 +79,7 @@ int main(int argc,char **argv){ { FindQuery fqu; fqu.tablename="hoi"; - RowItem ri; ri.rh_uint32=UINT_MAX; + RowItem ri; ri.v.rh_uint32=UINT_MAX; fqu.where.emplace_back(1,ri); QueryResult res=fqu.execute(tables); @@ -91,7 +91,7 @@ int main(int argc,char **argv){ { DeleteQuery dqu; dqu.tablename="hoi"; - RowItem ri; ri.rh_int32=-1; + RowItem ri; ri.v.rh_int32=-1; dqu.where.emplace_back(0,ri); QueryResult res=dqu.execute(tables); @@ -103,7 +103,7 @@ int main(int argc,char **argv){ { FindQuery fqu; fqu.tablename="hoi"; - RowItem ri; ri.rh_uint32=UINT_MAX; + RowItem ri; ri.v.rh_uint32=UINT_MAX; fqu.where.emplace_back(1,ri); QueryResult res=fqu.execute(tables); diff --git a/enginedata.cpp b/enginedata.cpp index 5cc357f..8b4d3fa 100644 --- a/enginedata.cpp +++ b/enginedata.cpp @@ -6,6 +6,23 @@ using namespace std; +RowItem RowItem::copy(const ColHeader &header){ + RowItem ri; + switch(header.type){ + case RH_INT32: + ri.v.rh_int32=v.rh_int32; + break; + case RH_UINT32: + ri.v.rh_uint32=v.rh_uint32; + break; + case RH_BYTES: + ri.v.rh_bytes=new unsigned char[header.arg]; + memcpy(ri.v.rh_bytes,v.rh_bytes,header.arg); + break; + } + return ri; +} + Row::Row(void):nc(0),table(NULL){} Row::Row(const int _nc,const Table *const _t):nc(_nc),table(_t){ items=new RowItem[nc]; @@ -18,12 +35,9 @@ Row::Row(Row &&other):nc(other.nc),table(other.table),items(other.items){ //move } Row::Row(const Row &other):nc(other.nc),table(other.table){ //copy constr items=new RowItem[nc]; - memcpy(items,other.items,nc*sizeof(RowItem)); + //memcpy(items,other.items,nc*sizeof(RowItem)); for(int i=0;iheader[i].type==RH_BYTES){ - items[i].rh_bytes=new unsigned char[table->header[i].arg]; - memcpy(items[i].rh_bytes,other.items[i].rh_bytes,table->header[i].arg); - } + items[i]=other.items[i].copy(table->header[i]); } } ostream& operator<<(ostream &os,const Row &r){ @@ -55,9 +69,9 @@ Table::Table(Table &&other):name(move(other.name)),nc(other.nc),header(other.hea string serialise(const ColHeader &header,const RowItem &rowitem){ switch(header.type){ - case RH_INT32: return serialise(rowitem.rh_int32); - case RH_UINT32: return serialise(rowitem.rh_uint32); - case RH_BYTES: return serialise(rowitem.rh_bytes,header.arg); + case RH_INT32: return serialise(rowitem.v.rh_int32); + case RH_UINT32: return serialise(rowitem.v.rh_uint32); + case RH_BYTES: return serialise(rowitem.v.rh_bytes,header.arg); default: assert(false); } } @@ -67,9 +81,9 @@ string serialise(unsigned char *v,int len){return string((char*)v,len);} int riCompare(const ColHeader &header,const RowItem &ri1,const RowItem &ri2){ switch(header.type){ - case RH_INT32: return riCompare(ri1.rh_int32,ri2.rh_int32); - case RH_UINT32: return riCompare(ri1.rh_uint32,ri2.rh_uint32); - case RH_BYTES: return riCompare(ri1.rh_bytes,ri2.rh_bytes,header.arg); + case RH_INT32: return riCompare(ri1.v.rh_int32,ri2.v.rh_int32); + case RH_UINT32: return riCompare(ri1.v.rh_uint32,ri2.v.rh_uint32); + case RH_BYTES: return riCompare(ri1.v.rh_bytes,ri2.v.rh_bytes,header.arg); default: assert(false); } } diff --git a/enginedata.h b/enginedata.h index 2b7ca96..071dd93 100644 --- a/enginedata.h +++ b/enginedata.h @@ -12,9 +12,12 @@ struct ColHeader; struct Table; struct RowItem{ - int32_t rh_int32; - uint32_t rh_uint32; - unsigned char *rh_bytes; + union{ + int32_t rh_int32; + uint32_t rh_uint32; + unsigned char *rh_bytes; + } v; + RowItem copy(const ColHeader&); }; enum ColHeaderType{ diff --git a/query.cpp b/query.cpp index 8dee06f..039a869 100644 --- a/query.cpp +++ b/query.cpp @@ -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::const_iterator>,string> FindQuery::executeIterators cit_t end=table.rows.end(); pair::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 &tables){ } +UpdateQuery::UpdateQuery(void){}; + +QueryResult UpdateQuery::execute(map &tables){ + const map::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::const_iterator>,string> ret=fqu.executeIterators(table); + if(ret.second.size()!=0)return QueryResult(0,ret.second); + map::const_iterator it; + int i,j; + const int numupdates=updates.size(); + for(i=0;i=table.nc)return QueryResult(0,"invalid col (UQ:ex)"); + } + for(i=0;i<(int)ret.first.size();i++){ + for(j=0;jsecond.items[col]=updates[j].value.copy(table.header[col]); + } + } + return QueryResult(ret.first.size()); +} + + DeleteQuery::DeleteQuery(void){}; QueryResult DeleteQuery::execute(map &tables){ diff --git a/query.h b/query.h index 1e06264..467aa7f 100644 --- a/query.h +++ b/query.h @@ -8,12 +8,12 @@ using namespace std; -struct WhereClause{ +struct ColValueClause{ int col; RowItem value; - WhereClause(void); - WhereClause(const int _c,const RowItem &_v); + ColValueClause(void); + ColValueClause(const int _c,const RowItem &_v); }; @@ -47,7 +47,7 @@ struct CreateQuery : public Query{ struct FindQuery : public Query{ unsigned int limit; //-1=unlimited - vector where; + vector where; FindQuery(void); pair::const_iterator>,string> executeIterators(map &tables); @@ -63,8 +63,16 @@ struct InsertQuery : public Query{ QueryResult execute(map &tables); }; +struct UpdateQuery : public Query{ + vector where; + vector updates; + + UpdateQuery(void); + QueryResult execute(map &tables); +}; + struct DeleteQuery : public Query{ - vector where; + vector where; DeleteQuery(void); QueryResult execute(map &tables); -- cgit v1.2.3-54-g00ecf