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; }
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)); } }
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); }
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(); }
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; }
Int Column<Vector<GeoPoint>>::find_one(const Datum &datum) const { // TODO: Use an index if exists. return scan(parse_datum(datum)); }
bool Column<Vector<GeoPoint>>::contains(const Datum &datum) const { // TODO: Use an index if exists. return !scan(parse_datum(datum)).is_na(); }