// Copyright (c) 2011-present, Facebook, Inc. All rights reserved. // This source code is licensed under both the GPLv2 (found in the // COPYING file in the root directory) and Apache 2.0 License // (found in the LICENSE.Apache file in the root directory). // #ifndef ROCKSDB_LITE #pragma once #include #include #include "rocksdb/utilities/stackable_db.h" #include "rocksdb/status.h" namespace rocksdb { // // Configurable options needed for setting up a Geo database // struct GeoDBOptions { // Backup info and error messages will be written to info_log // if non-nullptr. // Default: nullptr Logger* info_log; explicit GeoDBOptions(Logger* _info_log = nullptr):info_log(_info_log) { } }; // // A position in the earth's geoid // class GeoPosition { public: double latitude; double longitude; explicit GeoPosition(double la = 0, double lo = 0) : latitude(la), longitude(lo) { } }; // // Description of an object on the Geoid. It is located by a GPS location, // and is identified by the id. The value associated with this object is // an opaque string 'value'. Different objects identified by unique id's // can have the same gps-location associated with them. // class GeoObject { public: GeoPosition position; std::string id; std::string value; GeoObject() {} GeoObject(const GeoPosition& pos, const std::string& i, const std::string& val) : position(pos), id(i), value(val) { } }; class GeoIterator { public: GeoIterator() = default; virtual ~GeoIterator() {} virtual void Next() = 0; virtual bool Valid() const = 0; virtual const GeoObject& geo_object() = 0; virtual Status status() const = 0; }; // // Stack your DB with GeoDB to be able to get geo-spatial support // class GeoDB : public StackableDB { public: // GeoDBOptions have to be the same as the ones used in a previous // incarnation of the DB // // GeoDB owns the pointer `DB* db` now. You should not delete it or // use it after the invocation of GeoDB // GeoDB(DB* db, const GeoDBOptions& options) : StackableDB(db) {} GeoDB(DB* db, const GeoDBOptions& options) : StackableDB(db) {} virtual ~GeoDB() {} // Insert a new object into the location database. The object is // uniquely identified by the id. If an object with the same id already // exists in the db, then the old one is overwritten by the new // object being inserted here. virtual Status Insert(const GeoObject& object) = 0; // Retrieve the value of the object located at the specified GPS // location and is identified by the 'id'. virtual Status GetByPosition(const GeoPosition& pos, const Slice& id, std::string* value) = 0; // Retrieve the value of the object identified by the 'id'. This method // could be potentially slower than GetByPosition virtual Status GetById(const Slice& id, GeoObject* object) = 0; // Delete the specified object virtual Status Remove(const Slice& id) = 0; // Returns an iterator for the items within a circular radius from the // specified gps location. If 'number_of_values' is specified, // then the iterator is capped to that number of objects. // The radius is specified in 'meters'. virtual GeoIterator* SearchRadial(const GeoPosition& pos, double radius, int number_of_values = INT_MAX) = 0; }; } // namespace rocksdb #endif // ROCKSDB_LITE