Tkrzw
Classes | Public Member Functions | Static Public Attributes | List of all members
tkrzw::StdHashDBM Class Referencefinal

On-memory database manager implemented with std::unordered_map. More...

#include <tkrzw_dbm_std.h>

Classes

class  Iterator
 Iterator for each record. More...
 

Public Member Functions

 StdHashDBM (int64_t num_buckets=-1)
 Default constructor. More...
 
 StdHashDBM (std::unique_ptr< File > file, int64_t num_buckets=-1)
 Constructor with a file object. More...
 
 ~StdHashDBM ()
 Destructor. More...
 
 StdHashDBM (const StdHashDBM &rhs)=delete
 Copy and assignment are disabled. More...
 
StdHashDBMoperator= (const StdHashDBM &rhs)=delete
 
Status Open (const std::string &path, bool writable, int32_t options=File::OPEN_DEFAULT) override
 Opens a database file. More...
 
Status Close () override
 Closes the database file. More...
 
Status Process (std::string_view key, RecordProcessor *proc, bool writable) override
 Processes a record with a processor. More...
 
Status ProcessMulti (const std::vector< std::pair< std::string_view, DBM::RecordProcessor * >> &key_proc_pairs, bool writable) override
 Processes multiple records with processors. More...
 
Status ProcessFirst (RecordProcessor *proc, bool writable) override
 Processes the first record with a processor. More...
 
Status ProcessEach (RecordProcessor *proc, bool writable) override
 Processes each and every record in the database with a processor. More...
 
Status Count (int64_t *count) override
 Gets the number of records. More...
 
Status GetFileSize (int64_t *size) override
 Gets the current file size of the database. More...
 
Status GetFilePath (std::string *path) override
 Gets the path of the database file. More...
 
Status GetTimestamp (double *timestamp) override
 Gets the timestamp in seconds of the last modified time. More...
 
Status Clear () override
 Removes all records. More...
 
Status Rebuild () override
 Rebuilds the entire database. More...
 
Status ShouldBeRebuilt (bool *tobe) override
 Checks whether the database should be rebuilt. More...
 
Status Synchronize (bool hard, FileProcessor *proc=nullptr) override
 Synchronizes the content of the database to the file system. More...
 
std::vector< std::pair< std::string, std::string > > Inspect () override
 Inspects the database. More...
 
bool IsOpen () const override
 Checks whether the database is open. More...
 
bool IsWritable () const override
 Checks whether the database is writable. More...
 
bool IsHealthy () const override
 Checks whether the database condition is healthy. More...
 
bool IsOrdered () const override
 Checks whether ordered operations are supported. More...
 
std::unique_ptr< DBM::IteratorMakeIterator () override
 Makes an iterator for each record. More...
 
std::unique_ptr< DBMMakeDBM () const override
 Makes a new DBM object of the same concrete class. More...
 
UpdateLoggerGetUpdateLogger () const override
 Gets the logger to write all update operations. More...
 
void SetUpdateLogger (UpdateLogger *update_logger) override
 Sets the logger to write all update operations. More...
 
FileGetInternalFile () const
 Gets the pointer to the internal file object. More...
 
- Public Member Functions inherited from tkrzw::DBM
virtual ~DBM ()=default
 Destructor. More...
 
virtual Status Process (std::string_view key, RecordLambdaType rec_lambda, bool writable)
 Processes a record with a lambda function. More...
 
virtual Status Get (std::string_view key, std::string *value=nullptr)
 Gets the value of a record of a key. More...
 
virtual std::string GetSimple (std::string_view key, std::string_view default_value="")
 Gets the value of a record of a key, in a simple way. More...
 
virtual Status GetMulti (const std::vector< std::string_view > &keys, std::map< std::string, std::string > *records)
 Gets the values of multiple records of keys, with a string view vector. More...
 
virtual Status GetMulti (const std::initializer_list< std::string_view > &keys, std::map< std::string, std::string > *records)
 Gets the values of multiple records of keys, with an initializer list. More...
 
virtual Status GetMulti (const std::vector< std::string > &keys, std::map< std::string, std::string > *records)
 Gets the values of multiple records of keys, with a string vector. More...
 
virtual Status Set (std::string_view key, std::string_view value, bool overwrite=true, std::string *old_value=nullptr)
 Sets a record of a key and a value. More...
 
virtual Status SetMulti (const std::map< std::string_view, std::string_view > &records, bool overwrite=true)
 Sets multiple records, with a map of string views. More...
 
virtual Status SetMulti (const std::initializer_list< std::pair< std::string_view, std::string_view >> &records, bool overwrite=true)
 Sets multiple records, with an initializer list. More...
 
virtual Status SetMulti (const std::map< std::string, std::string > &records, bool overwrite=true)
 Sets multiple records, with a map of strings. More...
 
virtual Status Remove (std::string_view key, std::string *old_value=nullptr)
 Removes a record of a key. More...
 
virtual Status RemoveMulti (const std::vector< std::string_view > &keys)
 Removes records of keys, with a string view vector. More...
 
virtual Status RemoveMulti (const std::initializer_list< std::string_view > &keys)
 Removes records of keys, with an initializer list. More...
 
virtual Status RemoveMulti (const std::vector< std::string > &keys)
 Removes records of keys, with a string vector. More...
 
virtual Status Append (std::string_view key, std::string_view value, std::string_view delim="")
 Appends data at the end of a record of a key. More...
 
virtual Status AppendMulti (const std::map< std::string_view, std::string_view > &records, std::string_view delim="")
 Appends data to multiple records, with a map of string views. More...
 
virtual Status AppendMulti (const std::initializer_list< std::pair< std::string_view, std::string_view >> &records, std::string_view delim="")
 Appends data to multiple records, with an initializer list. More...
 
virtual Status AppendMulti (const std::map< std::string, std::string > &records, std::string_view delim="")
 Appends data to multiple records, with a map of strings. More...
 
virtual Status CompareExchange (std::string_view key, std::string_view expected, std::string_view desired, std::string *actual=nullptr, bool *found=nullptr)
 Compares the value of a record and exchanges if the condition meets. More...
 
virtual Status Increment (std::string_view key, int64_t increment=1, int64_t *current=nullptr, int64_t initial=0)
 Increments the numeric value of a record. More...
 
virtual int64_t IncrementSimple (std::string_view key, int64_t increment=1, int64_t initial=0)
 Increments the numeric value of a record, in a simple way. More...
 
virtual Status ProcessMulti (const std::vector< std::pair< std::string_view, RecordProcessor * >> &key_proc_pairs, bool writable)=0
 Processes multiple records with processors. More...
 
virtual Status ProcessMulti (const std::vector< std::pair< std::string_view, RecordLambdaType >> &key_lambda_pairs, bool writable)
 Processes multiple records with lambda functions. More...
 
virtual Status CompareExchangeMulti (const std::vector< std::pair< std::string_view, std::string_view >> &expected, const std::vector< std::pair< std::string_view, std::string_view >> &desired)
 Compares the values of records and exchanges if the condition meets. More...
 
virtual Status Rekey (std::string_view old_key, std::string_view new_key, bool overwrite=true, bool copying=false, std::string *value=nullptr)
 Changes the key of a record. More...
 
virtual Status ProcessFirst (RecordLambdaType rec_lambda, bool writable)
 Processes the first record with a lambda function. More...
 
virtual Status PopFirst (std::string *key=nullptr, std::string *value=nullptr)
 Gets the first record and removes it. More...
 
virtual Status PushLast (std::string_view value, double wtime=-1, std::string *key=nullptr)
 Adds a record with a key of the current timestamp. More...
 
virtual Status ProcessEach (RecordLambdaType rec_lambda, bool writable)
 Processes each and every record in the database with a lambda function. More...
 
virtual int64_t CountSimple ()
 Gets the number of records, in a simple way. More...
 
virtual int64_t GetFileSizeSimple ()
 Gets the current file size of the database, in a simple way. More...
 
virtual std::string GetFilePathSimple ()
 Gets the path of the database file, in a simple way. More...
 
virtual double GetTimestampSimple ()
 Gets the timestamp of the last modified time, in a simple way. More...
 
virtual bool ShouldBeRebuiltSimple ()
 Checks whether the database should be rebuilt, in a simple way. More...
 
virtual Status CopyFileData (const std::string &dest_path, bool sync_hard=false)
 Copies the content of the database file to another file. More...
 
virtual Status Export (DBM *dest_dbm)
 Exports all records to another database. More...
 
const std::type_info & GetType () const
 Gets the type information of the actual class. More...
 

Static Public Attributes

static constexpr int64_t DEFAULT_NUM_BUCKETS = 1048583
 The default value of the number of buckets. More...
 
- Static Public Attributes inherited from tkrzw::DBM
static const std::string_view ANY_DATA
 The special string_view value to represent any data. More...
 

Additional Inherited Members

- Public Types inherited from tkrzw::DBM
typedef std::function< std::string_view(std::string_view, std::string_view)> RecordLambdaType
 Lambda function type to process a record. More...
 

Detailed Description

On-memory database manager implemented with std::unordered_map.

All operations are thread-safe; Multiple threads can access the same database concurrently.

Constructor & Destructor Documentation

◆ StdHashDBM() [1/3]

tkrzw::StdHashDBM::StdHashDBM ( int64_t  num_buckets = -1)
explicit

Default constructor.

Parameters
num_bucketsThe number of buckets of the rebuild hash table. -1 means that the default value 1048583 is set.

◆ StdHashDBM() [2/3]

tkrzw::StdHashDBM::StdHashDBM ( std::unique_ptr< File file,
int64_t  num_buckets = -1 
)
explicit

Constructor with a file object.

Parameters
fileThe file object to handle the data. The ownership is taken.
num_bucketsThe number of buckets of the rebuild hash table. -1 means that the default value 1048583 is set.

◆ ~StdHashDBM()

tkrzw::StdHashDBM::~StdHashDBM ( )

Destructor.

◆ StdHashDBM() [3/3]

tkrzw::StdHashDBM::StdHashDBM ( const StdHashDBM rhs)
explicitdelete

Copy and assignment are disabled.

Member Function Documentation

◆ Open()

Status tkrzw::StdHashDBM::Open ( const std::string &  path,
bool  writable,
int32_t  options = File::OPEN_DEFAULT 
)
overridevirtual

Opens a database file.

Parameters
pathA path of the file.
writableIf true, the file is writable. If false, it is read-only.
optionsBit-sum options of File::OpenOption enums for opening the file.
Returns
The result status.

As this database is an on-memory database, you can set records and retrieve them without opening a file. If you open a file, records are loaded from the file.

Implements tkrzw::DBM.

◆ Close()

Status tkrzw::StdHashDBM::Close ( )
overridevirtual

Closes the database file.

Returns
The result status.

If a file is opened as writable, records are saved in the file.

Implements tkrzw::DBM.

◆ Process()

Status tkrzw::StdHashDBM::Process ( std::string_view  key,
RecordProcessor proc,
bool  writable 
)
overridevirtual

Processes a record with a processor.

Parameters
keyThe key of the record.
procThe pointer to the processor object.
writableTrue if the processor can edit the record.
Returns
The result status.

If the specified record exists, the ProcessFull of the processor is called. Otherwise, the ProcessEmpty of the processor is called.

Implements tkrzw::DBM.

◆ ProcessMulti()

Status tkrzw::StdHashDBM::ProcessMulti ( const std::vector< std::pair< std::string_view, DBM::RecordProcessor * >> &  key_proc_pairs,
bool  writable 
)
override

Processes multiple records with processors.

Parameters
key_proc_pairsPairs of the keys and their processor objects.
writableTrue if the processors can edit the records.
Returns
The result status.

Precondition: The database is opened. The writable parameter should be consistent to the open mode.

If the specified record exists, the ProcessFull of the processor is called. Otherwise, the ProcessEmpty of the processor is called.

◆ ProcessFirst()

Status tkrzw::StdHashDBM::ProcessFirst ( RecordProcessor proc,
bool  writable 
)
overridevirtual

Processes the first record with a processor.

Parameters
procThe pointer to the processor object.
writableTrue if the processor can edit the record.
Returns
The result status.

If the first record exists, the ProcessFull of the processor is called. Otherwise, this method fails and no method of the processor is called. This method can be slow because it can scan all buckets.

Implements tkrzw::DBM.

◆ ProcessEach()

Status tkrzw::StdHashDBM::ProcessEach ( RecordProcessor proc,
bool  writable 
)
overridevirtual

Processes each and every record in the database with a processor.

Parameters
procThe pointer to the processor object.
writableTrue if the processor can edit the record.
Returns
The result status.

The ProcessFull of the processor is called repeatedly for each record. The ProcessEmpty of the processor is called once before the iteration and once after the iteration.

Implements tkrzw::DBM.

◆ Count()

Status tkrzw::StdHashDBM::Count ( int64_t *  count)
overridevirtual

Gets the number of records.

Parameters
countThe pointer to an integer object to contain the result count.
Returns
The result status.

Implements tkrzw::DBM.

◆ GetFileSize()

Status tkrzw::StdHashDBM::GetFileSize ( int64_t *  size)
overridevirtual

Gets the current file size of the database.

Parameters
sizeThe pointer to an integer object to contain the result size.
Returns
The result status.

Implements tkrzw::DBM.

◆ GetFilePath()

Status tkrzw::StdHashDBM::GetFilePath ( std::string *  path)
overridevirtual

Gets the path of the database file.

Parameters
pathThe pointer to a string object to contain the result path.
Returns
The result status.

Implements tkrzw::DBM.

◆ GetTimestamp()

Status tkrzw::StdHashDBM::GetTimestamp ( double *  timestamp)
overridevirtual

Gets the timestamp in seconds of the last modified time.

Parameters
timestampThe pointer to a double object to contain the timestamp.
Returns
The result status.

The timestamp is updated when the database opened in the writable mode is closed or synchronized, even if no updating opertion is done.

Implements tkrzw::DBM.

◆ Clear()

Status tkrzw::StdHashDBM::Clear ( )
overridevirtual

Removes all records.

Returns
The result status.

Implements tkrzw::DBM.

◆ Rebuild()

Status tkrzw::StdHashDBM::Rebuild ( )
overridevirtual

Rebuilds the entire database.

Returns
The result status.

Implements tkrzw::DBM.

◆ ShouldBeRebuilt()

Status tkrzw::StdHashDBM::ShouldBeRebuilt ( bool *  tobe)
overridevirtual

Checks whether the database should be rebuilt.

Parameters
tobeThe pointer to a boolean object to contain the result decision.
Returns
The result status.

Implements tkrzw::DBM.

◆ Synchronize()

Status tkrzw::StdHashDBM::Synchronize ( bool  hard,
FileProcessor proc = nullptr 
)
overridevirtual

Synchronizes the content of the database to the file system.

Parameters
hardTrue to do physical synchronization with the hardware or false to do only logical synchronization with the file system.
procThe pointer to the file processor object, whose Process method is called while the content of the file is synchronized. If it is nullptr, it is ignored.
Returns
The result status.

If a file is opened as writable, records are saved in the file.

Implements tkrzw::DBM.

◆ Inspect()

std::vector<std::pair<std::string, std::string> > tkrzw::StdHashDBM::Inspect ( )
overridevirtual

Inspects the database.

Returns
A vector of pairs of a property name and its value.

Implements tkrzw::DBM.

◆ IsOpen()

bool tkrzw::StdHashDBM::IsOpen ( ) const
overridevirtual

Checks whether the database is open.

Returns
True if the database is open, or false if not.

Implements tkrzw::DBM.

◆ IsWritable()

bool tkrzw::StdHashDBM::IsWritable ( ) const
overridevirtual

Checks whether the database is writable.

Returns
True if the database is writable, or false if not.

Implements tkrzw::DBM.

◆ IsHealthy()

bool tkrzw::StdHashDBM::IsHealthy ( ) const
overridevirtual

Checks whether the database condition is healthy.

Returns
Always true. On-memory databases never cause system errors.

Implements tkrzw::DBM.

◆ IsOrdered()

bool tkrzw::StdHashDBM::IsOrdered ( ) const
overridevirtual

Checks whether ordered operations are supported.

Returns
Always false. Ordered operations are not supported.

Implements tkrzw::DBM.

◆ MakeIterator()

std::unique_ptr<DBM::Iterator> tkrzw::StdHashDBM::MakeIterator ( )
overridevirtual

Makes an iterator for each record.

Returns
The iterator for each record.

Implements tkrzw::DBM.

◆ MakeDBM()

std::unique_ptr<DBM> tkrzw::StdHashDBM::MakeDBM ( ) const
overridevirtual

Makes a new DBM object of the same concrete class.

Returns
The new DBM object.

Implements tkrzw::DBM.

◆ GetUpdateLogger()

UpdateLogger* tkrzw::StdHashDBM::GetUpdateLogger ( ) const
overridevirtual

Gets the logger to write all update operations.

Returns
The update logger if it has been set or nullptr if it hasn't.

Implements tkrzw::DBM.

◆ SetUpdateLogger()

void tkrzw::StdHashDBM::SetUpdateLogger ( UpdateLogger update_logger)
overridevirtual

Sets the logger to write all update operations.

Parameters
update_loggerThe pointer to the update logger object. Ownership is not taken. If it is nullptr, no logger is used.

Implements tkrzw::DBM.

◆ GetInternalFile()

File* tkrzw::StdHashDBM::GetInternalFile ( ) const

Gets the pointer to the internal file object.

Returns
The pointer to the internal file object.

Accessing the internal file viorates encapsulation policy. This should be used only for testing and debugging.

Member Data Documentation

◆ DEFAULT_NUM_BUCKETS

constexpr int64_t tkrzw::StdHashDBM::DEFAULT_NUM_BUCKETS = 1048583
staticconstexpr

The default value of the number of buckets.