java.lang.Object
com.renomad.minum.database.Db<T>
- Type Parameters:
T
- the type of data we'll be persisting (must extend fromDbData
a memory-based disk-persisted database class.
-
Constructor Summary
Constructors -
Method Summary
Modifier and TypeMethodDescriptionvoid
Delete datafindExactlyOne
(String indexName, String indexKey) A utility to find exactly one item from the database.findExactlyOne
(String indexName, String indexKey, Callable<T> alternate) Find one item, with an alternate value if null
This utility will search the indexes for a particular data by indexName and indexKey.getIndexedData
(String indexName, String key) Given the name of a registered index (seeregisterIndex(String, Function)
), use the key to find the collection of data that matches it.Get a set of the currently-registered indexes on this database, useful for debugging.boolean
registerIndex
(String indexName, Function<T, String> keyObtainingFunction) Register an index in the database for higher performance data accessvoid
stop()
This function will stop the minum.database persistence cleanly.void
stop
(int count, int sleepTime) Similar tostop()
but gives more control over how long we'll wait before crashing it closed.values()
This method provides read capability for the values of a database.Write data to the database.
-
Constructor Details
-
Db
Constructs an in-memory disk-persisted database. Loading of data from disk happens at the first invocation of any command changing or requesting data, such aswrite(DbData)
,delete(DbData)
, orvalues()
. See the private method loadData() for details.- Parameters:
dbDirectory
- this uniquely names your database, and also sets the directory name for this data. The expected use case is to name this after the data in question. For example, "users", or "accounts".context
- used to provide important state data to several componentsinstance
- an instance of theDbData
object relevant for use in this database. Note that each database (that is, each instance of this class), focuses on just one data, which must be an implementation ofDbData
.
-
-
Method Details
-
stop
public void stop()This function will stop the minum.database persistence cleanly.In order to do this, we need to wait for our threads to finish their work. In particular, we have offloaded our file writes to [actionQueue], which has an internal thread for serializing all actions on our minum.database
-
stop
public void stop(int count, int sleepTime) Similar tostop()
but gives more control over how long we'll wait before crashing it closed. SeeActionQueue.stop(int, int)
-
write
Write data to the database. Use an index of 0 to store new data, and a positive non-zero value to update data.Example of adding new data to the database:
final var newSalt = StringUtils.generateSecureRandomString(10); final var hashedPassword = CryptoUtils.createPasswordHash(newPassword, newSalt); final var newUser = new User(0L, newUsername, hashedPassword, newSalt); userDb.write(newUser);
Example of updating data:
// write the updated salted password to the database final var updatedUser = new User( user().getIndex(), user().getUsername(), hashedPassword, newSalt); userDb.write(updatedUser);
- Parameters:
newData
- the data we are writing
-
delete
Delete dataExample:
userDb.delete(user);
- Parameters:
dataToDelete
- the data we are serializing and writing
-
values
This method provides read capability for the values of a database.
The returned collection is a read-only view over the data, throughCollections.unmodifiableCollection(Collection)
Example:
boolean doesUserAlreadyExist(String username) { return userDb.values().stream().anyMatch(x -> x.getUsername().equals(username)); }
-
registerIndex
Register an index in the database for higher performance data access- Parameters:
indexName
- a string used to distinguish this index. This string will be used again when requesting data in a method likegetIndexedData(java.lang.String, java.lang.String)
orfindExactlyOne(java.lang.String, java.lang.String)
keyObtainingFunction
- a function which obtains data from the data in this database, used to partition the data into groups (potentially up to a 1-to-1 correspondence between id and object)- Returns:
- true if the registration succeeded
-
getIndexedData
Given the name of a registered index (seeregisterIndex(String, Function)
), use the key to find the collection of data that matches it.- Parameters:
indexName
- the name of an indexkey
- a string value that matches a partition calculated from the partition function provided toregisterIndex(String, Function)
- Returns:
- a collection of data, an empty collection if nothing found
-
getSetOfIndexes
Get a set of the currently-registered indexes on this database, useful for debugging. -
findExactlyOne
A utility to find exactly one item from the database.
This utility will search the indexes for a particular data by indexName and indexKey. If not found, it will return null. If found, it will be returned. If more than one are found, an exception will be thrown. Use this tool when the data has been uniquely indexed, like for example when setting a unique identifier into each data.- Parameters:
indexName
- the name of the index, an arbitrary value set by the user to help distinguish among potentially many indexes set on this dataindexKey
- the key for this particular value, such as a UUID or a name or any other way to partition the data- See Also:
-
findExactlyOne
Find one item, with an alternate value if null
This utility will search the indexes for a particular data by indexName and indexKey. If not found, it will return null. If found, it will be returned. If more than one are found, an exception will be thrown. Use this tool when the data has been uniquely indexed, like for example when setting a unique identifier into each data.- Parameters:
indexName
- the name of the index, an arbitrary value set by the user to help distinguish among potentially many indexes set on this dataindexKey
- the key for this particular value, such as a UUID or a name or any other way to partition the dataalternate
- a functional interface that will be run if the result would have been null, useful for situations where you don't want the output to be null when nothing is found.- See Also:
-