aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authortomsmeding <hallo@tomsmeding.nl>2015-05-23 20:51:49 +0200
committertomsmeding <hallo@tomsmeding.nl>2015-05-23 20:51:49 +0200
commit8bf922f71c0e37ac590f9527a6cf1a6d2cab793c (patch)
treeafa69d9778442c203e604e3cc1dc88cf7a1a97c1
parent91f7a1c413a8be587fdc0b357fe6412e89d16d7d (diff)
UpdateQuery
-rw-r--r--engine.cpp22
-rw-r--r--enginedata.cpp36
-rw-r--r--enginedata.h9
-rw-r--r--query.cpp40
-rw-r--r--query.h18
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;i<nc;i++){
- if(table->header[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<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){
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<WhereClause> where;
+ vector<ColValueClause> where;
FindQuery(void);
pair<vector<map<string,Row>::const_iterator>,string> executeIterators(map<string,Table> &tables);
@@ -63,8 +63,16 @@ struct InsertQuery : public Query{
QueryResult execute(map<string,Table> &tables);
};
+struct UpdateQuery : public Query{
+ vector<ColValueClause> where;
+ vector<ColValueClause> updates;
+
+ UpdateQuery(void);
+ QueryResult execute(map<string,Table> &tables);
+};
+
struct DeleteQuery : public Query{
- vector<WhereClause> where;
+ vector<ColValueClause> where;
DeleteQuery(void);
QueryResult execute(map<string,Table> &tables);