Пример #1
0
void Column<Float>::set(Int row_id, const Datum &datum) {
  Float new_value = parse_datum(datum);
  if (!table_->test_row(row_id)) {
    throw "Invalid row ID";  // TODO
  }
  if (new_value.is_na()) {
    unset(row_id);
    return;
  }
  Float old_value = get(row_id);
  if (old_value.match(new_value)) {
    return;
  }
  if (!old_value.is_na()) {
    // Remove the old value from indexes.
    for (size_t i = 0; i < num_indexes(); ++i) {
      indexes_[i]->remove(row_id, old_value);
    }
  }
  size_t value_id = row_id.raw();
  if (value_id >= values_.size()) {
    values_.resize(value_id + 1, Float::na());
  }
  // Insert the new value into indexes.
  for (size_t i = 0; i < num_indexes(); ++i) try {
    indexes_[i]->insert(row_id, datum);
  } catch (...) {
    for (size_t j = 0; j < i; ++i) {
      indexes_[j]->remove(row_id, datum);
    }
    throw;
  }
  values_[value_id] = new_value;
}
Пример #2
0
static void
garmin_txt_read(void)
{
    char *buff;

    current_line = 0;

    while ((buff = gbfgetstr(fin))) {
        char *cin;

        if ((current_line++ == 0) && fin->unicode) cet_convert_init(CET_CHARSET_UTF8, 1);

        cin = lrtrim(buff);
        if (*cin == '\0') continue;

        cin = csv_lineparse(cin, "\t", "", 0);

        if (cin == NULL) continue;

        if (case_ignore_strcmp(cin, "Header") == 0) parse_header();
        else if (case_ignore_strcmp(cin, "Grid") == 0) parse_grid();
        else if (case_ignore_strcmp(cin, "Datum") == 0) parse_datum();
        else if (case_ignore_strcmp(cin, "Waypoint") == 0) parse_waypoint();
        else if (case_ignore_strcmp(cin, "Route Waypoint") == 0) parse_route_waypoint();
        else if (case_ignore_strcmp(cin, "Trackpoint") == 0) parse_track_waypoint();
        else if (case_ignore_strcmp(cin, "Route") == 0) parse_route_header();
        else if (case_ignore_strcmp(cin, "Track") == 0) parse_track_header();
        else if (case_ignore_strcmp(cin, "Map") == 0) /* do nothing */ ;
        else
            fatal(MYNAME ": Unknwon identifier (%s) at line %d!\n", cin, current_line);

        /* flush pending data */
        while (csv_lineparse(NULL, "\t", "", 0));
    }
}
Пример #3
0
Int Column<Float>::find_one(const Datum &datum) const {
  // TODO: Choose the best index.
  Float value = parse_datum(datum);
  if (!value.is_na() && !indexes_.is_empty()) {
    return indexes_[0]->find_one(datum);
  }
  return scan(value);
}
Пример #4
0
bool Column<Float>::contains(const Datum &datum) const {
  // TODO: Choose the best index.
  Float value = parse_datum(datum);
  if (!indexes_.is_empty()) {
    if (value.is_na()) {
      return table_->num_rows() != indexes_[0]->num_entries();
    }
    return indexes_[0]->contains(datum);
  }
  return !scan(value).is_na();
}
Пример #5
0
void Column<Vector<GeoPoint>>::set(Int row_id, const Datum &datum) {
  Vector<GeoPoint> new_value = parse_datum(datum);
  if (!table_->test_row(row_id)) {
    throw "Invalid row ID";  // TODO
  }
  if (new_value.is_na()) {
    unset(row_id);
    return;
  }
  Vector<GeoPoint> old_value = get(row_id);
  if (old_value.match(new_value)) {
    return;
  }
  if (!old_value.is_na()) {
    // TODO: Remove the old value from indexes.
//    for (size_t i = 0; i < num_indexes(); ++i) {
//      indexes_[i]->remove(row_id, old_value);
//    }
  }
  size_t value_id = row_id.raw();
  if (value_id >= headers_.size()) {
    headers_.resize(value_id + 1, na_header());
  }
  // TODO: Insert the new value into indexes.
//  for (size_t i = 0; i < num_indexes(); ++i) try {
//    indexes_[i]->insert(row_id, datum)) {
//  } catch (...) {
//    for (size_t j = 0; j < i; ++i) {
//      indexes_[j]->remove(row_id, datum);
//    }
//    throw;
//  }
  // TODO: Error handling.
  size_t offset = bodies_.size();
  size_t size = new_value.raw_size();
  uint64_t header;
  if (size < 0xFFFF) {
    bodies_.resize(offset + size);
    std::memcpy(&bodies_[offset], new_value.raw_data(),
                sizeof(GeoPoint) * size);
    header = (offset << 16) | size;
  } else {
    // The size of a long vector is stored in front of the body.
    if ((offset % sizeof(uint64_t)) != 0) {
      offset += sizeof(uint64_t) - (offset % sizeof(uint64_t));
    }
    bodies_.resize(offset + sizeof(uint64_t) + size);
    *reinterpret_cast<uint64_t *>(&bodies_[offset]) = size;
    std::memcpy(&bodies_[offset + sizeof(uint64_t)],
                new_value.raw_data(), sizeof(GeoPoint) * size);
    header = (offset << 16) | 0xFFFF;
  }
  headers_[value_id] = header;
}
Пример #6
0
Int Column<Vector<GeoPoint>>::find_one(const Datum &datum) const {
  // TODO: Use an index if exists.
  return scan(parse_datum(datum));
}
Пример #7
0
bool Column<Vector<GeoPoint>>::contains(const Datum &datum) const {
  // TODO: Use an index if exists.
  return !scan(parse_datum(datum)).is_na();
}