void table::delete_row(const row& del_row) { if (del_row.id >= 0) delete_row(del_row.id); else { predicate p; for (int i=0;i<_Tstruct.size();i++) if (del_row.is_defined(_Tstruct[i])) p.And( equalto(_Tstruct[i], del_row[_Tstruct[i]]) ); // build predicate matching the row delete_row(select(query().where(p))); } }
int table::edit_row(const row &old_row, row new_row) { int count = 0; // add column data that is not included to new_row (still enables writing empty values) for (int i=0;i<_Tstruct.size();i++) { if (!new_row.is_defined(new_row[_Tstruct[i].name])) new_row.add(_Tstruct[i], old_row[_Tstruct[i].name]); } if (old_row.id >= 0) { _fdata->seek(old_row.id*_row_size); _write_row(new_row._data); count++; // if old row's key value has changed then update the key entry (insde _keys) if (old_row[_key.name] != new_row[_key.name]) { for (int i=0;i<_keys.size();i++) { if (_keys[i].row_id == old_row.id) { _keys[i].data = new_row[_key.name]; // change key entry data to represent change break; } } } } else { query q; predicate p; for (int i=0;i<_Tstruct.size();i++) p.And( equalto(_Tstruct[i], old_row[_Tstruct[i].name]) ); // build predicate matching the row q.where(p); vector<row> results = select(q); for (int i=0;i<results.size();i++) { _fdata->seek(results[i].id * _row_size); _write_row(new_row._data); count++; // if old row's key value has changed then update the key entry (insde _keys) if (old_row[_key.name] != new_row[_key.name]) { for (int i=0;i<_keys.size();i++) { if (_keys[i].row_id == results[i].id) { _keys[i].data = new_row[_key.name]; // change key entry data to represent change break; } } } } } return count; }