Ejemplo n.º 1
0
static bool dbase_add_or_replace_record(int dbase_identifier, const Variant& record, boost::optional<int64_t> recnum) {
  if (!record.isArray()) {
    raise_warning("Argument two must be of type 'Array'");
    return false;
  }

  open_db_map::iterator it = dbase_find_connection(dbase_identifier);
  if (it != open_dbases->end()) {
    dbhead_t* dbh = it->second->dbh;
    assert(dbh != nullptr);
    Array arr_record = record.toArray();

    ssize_t num_fields = arr_record.size();

    if (num_fields != dbh->db_nfields) {
      raise_warning("Wrong number of fields specified");
      return false;
    }

    char* cp = (char*)malloc(dbh->db_rlen + 1);
    char* t_cp = cp;
    *t_cp++ = VALID_RECORD;

    dbfield_t* dbf = dbh->db_fields;
    dbfield_t* cur_f = dbf;
    for (ArrayIter arr_it(arr_record); arr_it; ++arr_it, cur_f++) {
      assert(cur_f < &dbf[num_fields]);
      //snprintf(t_cp, cur_f->db_flen+1, cur_f->db_format, Z_STRVAL(tmp));
      snprintf(t_cp, cur_f->db_flen+1, cur_f->db_format, arr_it.second().toString().c_str());
      t_cp += cur_f->db_flen;
    }

    int put_recnum;
    if (recnum) {
      put_recnum = recnum.get();
    } else {
      put_recnum = dbh->db_records++;
    }

    if (put_dbf_record(dbh, put_recnum, cp) < 0) {
      raise_warning("unable to put record at %d", put_recnum);
      free(cp);
      return false;
    }

    put_dbf_info(dbh);
    free(cp);

    return true;
  } else {
    return false;
  }
}
Ejemplo n.º 2
0
int del_dbf_record(dbhead_t *dbh, long rec_num)
{
    int ret = 0;
    char *cp;

    if (rec_num > dbh->db_records)
        return -1;
    if ((cp = get_dbf_record(dbh, rec_num))) {
        *cp = DELETED_RECORD;
        ret = put_dbf_record(dbh, rec_num, cp);
        free(cp);
    }
    return ret;
}