⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 container.cpp

📁 用于嵌入式环境的数据库
💻 CPP
字号:
//-< CONTAINER.CPP >---------------------------------------------------*--------*
// GigaBASE                  Version 1.0         (c) 1999  GARRET    *     ?  *
// (Main Memory Database Management System)                          *   /\|  *
//                                                                   *  /  \  *
//                          Created:     05-Nov-2002  K.A. Knizhnik  * / [] \ *
//                          Last update: 05-Nov-2002  K.A. Knizhnik  * GARRET *
//-------------------------------------------------------------------*--------*
// T-Tree object container
//-------------------------------------------------------------------*--------*

#define INSIDE_FASTDB

#include "fastdb.h"
#include "compiler.h"
#include "ttree.h"
#include "symtab.h"

void dbAnyContainer::create(dbDatabase* db)
{
    db->beginTransaction(dbDatabase::dbExclusiveLock);
    oid = dbTtree::allocate(db);
}

void dbAnyContainer::add(dbDatabase* db, dbAnyReference const& ref)
{
    db->beginTransaction(dbDatabase::dbExclusiveLock);
    dbTtree::insert(db, oid, ref.getOid(), fd->type, fd->dbsSize, fd->comparator, fd->dbsOffs);
}

void dbAnyContainer::remove(dbDatabase* db, dbAnyReference const& ref)
{
    db->beginTransaction(dbDatabase::dbExclusiveLock);
    dbTtree::insert(db, oid, ref.getOid(), fd->type, fd->dbsSize, fd->comparator, fd->dbsOffs);
}

void dbAnyContainer::purge(dbDatabase* db)
{
    db->beginTransaction(dbDatabase::dbExclusiveLock);
    dbTtree::purge(db, oid);
}

void dbAnyContainer::free(dbDatabase* db)
{
    db->beginTransaction(dbDatabase::dbExclusiveLock);
    dbTtree::drop(db, oid);
}

int dbAnyContainer::prefixSearch(dbAnyCursor& cursor, char const* key)
{
    dbDatabase* db = cursor.table->db;
    db->beginTransaction(cursor.type == dbCursorForUpdate ? dbDatabase::dbExclusiveLock : dbDatabase::dbSharedLock);
    dbDatabaseThreadContext* ctx = db->threadContext.get();
    ctx->cursors.link(&cursor);
    cursor.reset();
    dbSearchContext sc;
    sc.db = db;
    sc.condition = NULL;
    sc.firstKey = (char*)key;
    sc.firstKeyInclusion = 1;
    sc.lastKey = (char*)key;
    sc.lastKeyInclusion = 1;
    sc.type = dbField::tpString;
    sc.offs = fd->dbsOffs;
    sc.cursor = &cursor;
    sc.sizeofType = fd->dbsSize;
    dbTtree::prefixSearch(db, oid, sc);
    return cursor.getNumberOfRecords();
}

int dbAnyContainer::search(dbAnyCursor& cursor, void const* from, void const* till)
{
    dbDatabase* db = cursor.table->db;
    db->beginTransaction(cursor.type == dbCursorForUpdate ? dbDatabase::dbExclusiveLock : dbDatabase::dbSharedLock);
    dbDatabaseThreadContext* ctx = db->threadContext.get();
    ctx->cursors.link(&cursor);
    cursor.reset();
    if (from == NULL && till == NULL) {
        dbTtree::traverseForward(db, oid, &cursor);
    } else {
        dbSearchContext sc;
        sc.db = db;
        sc.condition = NULL;
        sc.firstKey = (char*)from;
        sc.firstKeyInclusion = 1;
        sc.lastKey = (char*)till;
        sc.lastKeyInclusion = 1;
        sc.comparator = fd->comparator;
        sc.type = fd->type;
        sc.offs = fd->dbsOffs;
        sc.cursor = &cursor;
        sc.sizeofType = fd->dbsSize;
        dbTtree::find(db, oid, sc);
    }
    return cursor.getNumberOfRecords();
}

dbAnyContainer::dbAnyContainer(char const* name, dbTableDescriptor& desc)
{
    fd = desc.find(name);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -