Пример #1
0
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)));
  }
}
Пример #2
0
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;
}