📄 database.h
字号:
/**
* Number of nodes in replicasted database
*/
int nNodes;
/**
* Interval of polling nodes
*/
int pollInterval; // milliseconds
/**
* Timeput of waoting confirmation from standby node by new master node when it becomes active at startup
*/
int waitReadyTimeout; // milliseconds
/**
* Timeout of requesting status of other nodes during startup
*/
int waitStatusTimeout; // milliseconds
/**
* Maximal number of attempt to establish with other nodes during recovery
*/
int recoveryConnectionAttempts;
/**
* Maximal number of attempt to establish with other nodes at strtup
*/
int startupConnectionAttempts;
/**
* Timeout of writing to replication node.
* If write can not be completed within specified timeout, then node is considered to be dead
* and connection is hanged up.
*/
int replicationWriteTimeout;
/**
* Maximal number of asynchronous recovery iterations. If due to permanent updates of master database
* recovery can not be completed within specified number of iterations, then synchronous recovery is performed
* (master will not perform any transaction commits until the end of recovery).
*/
int maxAsyncRecoveryIterations;
OpenParameters() {
databaseName = NULL;
databaseFilePath = NULL;
transactionCommitDelay = 0;
waitLockTimeoutMsec = INFINITE;
accessType = dbAllAccess;
extensionQuantum = dbDefaultExtensionQuantum;
initSize = dbDefaultInitDatabaseSize;
initIndexSize = dbDefaultInitIndexSize;
nThreads = 1;
freeSpaceReuseThreshold = dbDefaultExtensionQuantum;
nodeId = 0;
nodeAddresses = NULL;
nNodes = 0;
parallelScanThreshold = dbDefaultParallelScanThreshold;
pollInterval = dbDefaultPollInterval;
waitReadyTimeout = dbWaitReadyTimeout;
waitStatusTimeout = dbWaitStatusTimeout;
recoveryConnectionAttempts = dbRecoveryConnectionAttempts;
startupConnectionAttempts = dbStartupConnectionAttempts;
replicationWriteTimeout = dbReplicationWriteTimeout;
maxAsyncRecoveryIterations = dbMaxAsyncRecoveryIterations;
}
};
/**
* Open database with parameters defined in OpenParameters structure
* @param params parameters for openning database
* @return <code>true</code> if database was successfully opened
*/
bool open(OpenParameters& params);
/**
* Close database
*/
void close();
/**
* Commit transaction
*/
void commit();
/**
* Release all locks hold by transaction allowing other clients to proceed
* but do not flush changes to the disk
*/
void precommit();
/**
* Rollback transaction
*/
void rollback();
/**
* Schedule backup
* @param fileName path to backup file. If name ends with '?', then
* each backup willbe placed in seprate file with '?' replaced with current timestamp
* @param periodSec preiod of performing backups in seconds
*/
void scheduleBackup(char const* fileName, time_t periodSec);
/**
* Attach current thread to the database. This method should be executed
* for all threads except one which opened the database.
*/
void attach();
/**
* Set transaction context for the current thread. Using this method allows to share the same transaction
* between different threads
* @param ctx transaction context which will be associated with the current thread
*/
void attach(dbDatabaseThreadContext* ctx);
enum DetachFlags {
COMMIT = 1,
DESTROY_CONTEXT = 2
};
/**
* Detach thread from the database.
* @param flags mask of DetachFlags COMMIT and DESTROY_CONTEXT
*/
void detach(int flags = COMMIT|DESTROY_CONTEXT);
/**
* Exclusivly lock the database.
*/
void lock() { beginTransaction(dbExclusiveLock); }
/**
* Perform backup to the file with specified name
* @param file path to the backup file
* @param comactify if true then databae will be compactificated during backup -
* i.e. all used objects will be placed together without holes; if false then
* backup is performed by just writting memory mapped object to the backup file.
* @return whether backup was succeseful or not
*/
bool backup(char const* file, bool compactify);
/**
* Perform backup to the specified file
* @param file opened file to path to the backup file. This file will not be closed after
* backup completion.
* @param comactify if true then databae will be compactificated during backup -
* i.e. all used objects will be placed together without holes; if false then
* backup is performed by just writting memory mapped object to the backup file.
* @return whether backup was succeseful or not
*/
bool backup(dbFile* file, bool compactify);
/**
* Assign table to the database
* @param desc table descriptor
*/
void assign(dbTableDescriptor& desc) {
assert(((void)"Table is not yet assigned to the database",
desc.tableId == 0));
desc.db = this;
desc.fixedDatabase = true;
}
/**
* Set concurrency level for sequential search and sort operations.
* By default, FastDB tries to detect number of CPUs in system and create
* the same number of threads.
* @param nThreads maximal number of threads to be created for
* perfroming cincurrent sequential search and sorting.
*/
void setConcurrency(unsigned nThreads);
/**
* Get size allocated in the database since open
* @return delta between size of allocated and deallocated data
*/
long getAllocatedSize() { return allocatedSize; }
/**
* Get size of the database file
* @return database file size
*/
long getDatabaseSize() { return header->size; }
/**
* Get number of threads accessing database in shared mode (readonly)
* @return number of granted shared locks
*/
int getNumberOfReaders() {
return monitor->nReaders;
}
/**
* Get number of threads accessing database in exclusiveh mode (for update)
* @return number of granted exclusive locks (can be either 0 either 1)
*/
int getNumberOfWriters() {
return monitor->nWriters;
}
/**
* Get number of threads blocked while starting read-only transaction
* @return number of threads which shared lock request was blocked
*/
int getNumberOfBlockedReaders() {
return monitor->nReaders;
}
/**
* Get number of threads blocked while starting update transaction
* @return number of threads which exclusive lock request was blocked
*/
int getNumberOfBlockedWriters() {
return monitor->nWriters;
}
/**
* Get number of processes attached to the database
* @return number of processes openned the database
*/
int getNumberOfUsers() {
return monitor->users;
}
/**
* Enable deletion of columns from the table when correspondent fields
* are renamed from class descriptor. By default it is switched of
* and database allows to delete fields only from empty table (to prevent
* unindented loose of data).
* @param enabled true to enable column deletion in non empty tables
*/
void allowColumnsDeletion(bool enabled = true) {
confirmDeleteColumns = enabled;
}
/**
* Prepare query. This method can be used for explicit compilation of query and
* it's validation
* @param cursor result set
* @param query query expression
* @return <code>true</code> if query is successfully compiled, <code>false</code> othgerwise
*/
bool prepareQuery(dbAnyCursor* cursor, dbQuery& query);
enum dbErrorClass {
NoError,
QueryError,
ArithmeticError,
IndexOutOfRangeError,
DatabaseOpenError,
FileError,
OutOfMemoryError,
Deadlock,
NullReferenceError,
LockRevoked,
FileLimitExeeded,
InconsistentInverseReference,
DatabaseReadOnly
};
static char const* const errorMessage[];
typedef void (*dbErrorHandler)(int error, char const* msg, int msgarg, void* context);
/**
* Set error handler. Handler should be no-return function which perform stack unwind.
* @param newHandler new error handler
* @return previous handler
*/
dbErrorHandler setErrorHandler(dbErrorHandler newHandler, void* errorHandlerContext = NULL);
/**
* Error handler.
* It can be redifined by application to implement application specific error handling.
* @param error class of the error
* @param msg error message
* @param arg optional argument
*/
virtual void handleError(dbErrorClass error, char const* msg = NULL,
int arg = 0);
/**
* Insert record in the database
* @param table table descriptor
* @param ref [out] pointer to the references where ID of created object will be stored
* @param record pointer to the transient object to be inserted in the table
*/
void insertRecord(dbTableDescriptor* table, dbAnyReference* ref,
void const* record);
/**
* Check if database is opened
*/
bool isOpen() const { return opened; }
/**
* Check if current transaction is committed. Used mostly for debugging purposes.
*/
bool isCommitted();
/**
* Check if thread was attached to the database. Used mostly for debugging purposes.
*/
bool isAttached();
/**
* Check if current transaction is updating database
*/
bool isUpdateTransaction();
/**
* Get database version
*/
int getVersion();
/**
* Specify database file size limit. Attempt to exeed this limit cause database error.
* @param limit maximal file size in bytes
*/
void setFileSizeLimit(size_t limit) {
fileSizeLimit = limit;
}
#ifdef FUZZY_CHECKPOINT
/**
* Specify maximal length of qeueue of write requests during fuzzy checkpoint.
* If this limit is reached, commit is blocked until some of the requests are proceeded
* @param nPages maximal number of pages in write queue
*/
void setFuzzyCheckpointBuffer(size_t nPages) {
file.setCheckpointBufferSize(nPages);
}
#endif
#ifndef NO_MEMBER_TEMPLATES
/**
* Insert record in the database
* @param record transient object to be insrted in the database
* @return reference to the created object
*/
template<class T>
dbReference<T> insert(T const& record) {
dbReference<T> ref;
insertRecord(lookupTable(&T::dbDescriptor), &ref, &record);
return ref;
}
#endif
/**
* Find cloned table desciptor assigned to this database
* @param des static unassigned table descriptor
* @return clone of this table descriptor assigned to this databae or NULL
* if not found.
*/
dbTableDescriptor* lookupTable(dbTableDescriptor* desc);
/**
* Get information about state of database memory
* @param stat placeholder for memory statistic
*/
void getMemoryStatistic(dbMemoryStatistic& stat);
/**
* Initialize fixed size allocator
* @param minSize minial object size allocated by this allocator
* @param maxSize maximal object size allocated by this allocator
* @param quantum difference in size between fixed size allocator chains
* @param bufSize maximal number of free elements hold by this allocator
*/
void setFixedSizeAllocator(size_t minSize, size_t maxSize, size_t quantum, size_t bufSize) {
fixedSizeAllocator.init(minSize, maxSize, quantum, bufSize);
}
enum dbThreadMode {
dbNotUsePthreads,
dbUsePthreads
};
enum dbReplicationMode {
dbReplicated,
dbStandalone
};
/**
* Database constructor
* @param type access type: <code>dbDatabase::dbReadOnly</code> or <code>dbDatabase::dbAllAcces</code>
* @param dbInitSize initial size of the database. If FastDB is compiled with
* DISKLESS_CONFIGURATION option, then in this parameter <B>MAXIMAL</B> size of the
* database should be specified (in this mode database can not be reallocated)
* @param dbExtensionQuantum quantum for extending memory allocation bitmap
* @param dbInitIndexSize initial index size (objects)
* @param nThreads concurrency level for sequential search and sort operations
* @see setConcurrency(unsigned nThreads)
*/
dbDatabase(dbAccessType type = dbAllAccess,
size_t dbInitSize = dbDefaultInitDatabaseSize,
size_t dbExtensionQuantum = dbDefaultExtensionQuantum,
size_t dbInitIndexSize = dbDefaultInitIndexSize,
int nThreads = 1
// Do not specify the following parameter - them are used only for checking
// that application and FastDB library were built with the
// same compiler options (-DNO_PTHREADS and -REPPLICATION_SUPPORT)
// Mismached parameters should cause linker error
#ifdef NO_PTHREADS
, dbThreadMode threadMode = dbNotUsePthreads
#endif
#ifdef REPLICATION_SUPPORT
, dbReplicationMode replicationMode = dbReplicated
#endif
);
/**
* Database detructor
*/
virtual ~dbDatabase();
dbAccessType accessType;
size_t initSize;
size_t extensionQuantum;
size_t initIndexSize;
offs_t freeSpaceReuseThreshold;
protected:
static size_t internalObjectSize[];
dbThreadPool threadPool;
FixedSizeAllocator fixedSizeAllocator;
dbThreadContext<dbDatabaseThreadContext> threadContext;
byte* baseAddr; // base address of database file mapping
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -