LINUX.ORG.RU

Кто-нить знает как использовать Berkley DB.


0

0

Кто-нить знает как использовать Berkley DB.
Мож примеры какие ... вообше доки по описанию концепцииэтой БД.
желательно конечно на русском, Мож кто видел где.
Примерчик с описанием создания и использования маленькой базы.
всё это применительно к С/С++.

Заренее благодарен.
anonymous

Скачать исходники, там есть и документация и api и примеры на С и С++.

P.S. Ну до чего ж ленивый народ пошел :)

Dead ★★★★
()

На русском описания точно нету

Но база простая как три рубля, если не заморачиваться ее Гиганскими возможностями.

anonymous
()

> Примерчик с описанием создания и использования маленькой базы.
> всё это применительно к С/С++.

ну вот примерчик (но IMHO всёже доки лучше, даже на англицком - http://www.sleepycat.com/docs/index.html)

кусок из хедера:
______________

#ifndef EXTSYS_H
# define EXTSYS_H

# include "common.h"
# include <db41/db_cxx.h>

...

typedef std::pair<std::string, S_AccInfo> T_Account;

class C_DbCtrl
{
public:
    C_DbCtrl(std::string = "");
    C_DbCtrl(const C_DbCtrl&);
    ~C_DbCtrl();
    bool open(std::string = "");
    bool reopen(std::string = "");
    bool close(void);
    inline bool active(void);
    T_Account get
        (std::string);
    bool put(T_Account);
    bool set
        (T_Account);
protected:
    Db db;
private:
    bool ok;
    std::string file;
    const char* nm;
};

...

#endif //EXTSYS_H


It's a source:
______________

#include "extsys.h"

...

using namespace std;

...

C_DbCtrl::C_DbCtrl(string name)
        : db(NULL, 0)
        , nm("cache")
{
    ok = false;
    file = "";
    if(!name.empty())
    {
        open(name);
    }
}
C_DbCtrl::C_DbCtrl(const C_DbCtrl& that)
        : db(NULL, 0)
        , nm(that.nm)
{
    ok = false;
    file = that.file;
    if(!file.empty())
    {
        open(file);
    }
}
C_DbCtrl::~C_DbCtrl()
{
    close();
}
bool C_DbCtrl::open(string name)
{
    try
    {
        if(ok)
        {
            return true;
        }
        int res = db.open(NULL, name.empty() ? cfg.intCache.c_str() : name.c_str(), nm, DB_HASH, DB_CREATE, 0);
        if(res)
        {
            Log("Can't open DB '" + name + "' - " + DbEnv::strerror(res), logWrn);
            return false;
        }
        else
        {
            ok = true;
            file = name;
        }
    }
    catch(const DbException& err)
    {
        Log("Opening DB '" + name + "' failed: " + err.what(), logWrn);
        return false;
    }
    return true;
}
bool C_DbCtrl::reopen(string database)
{
    string name = database.empty() ? file : database;
    try
    {

        if(ok)
        {
            if(!close())
            {
                return false;
            }
        }
        int res = db.open(NULL, name.empty() ? cfg.intCache.c_str() : name.c_str(), nm, DB_UNKNOWN, 0, 0);
        if(res)
        {
            Log("Can't open DB '" + name + "' - " + DbEnv::strerror(res), logWrn);
            return false;
        }
        else
        {
            ok = true;
            file = name;
        }
    }
    catch(const DbException& err)
    {
        Log("Opening DB '" + name + "' failed: " + err.what(), logWrn);
        return false;
    }
    return true;
}
bool C_DbCtrl::close(void)
{
    try
    {
        if(!ok)
        {
            return true;
        }
        int res = db.close(0);
        if(res)
        {
            Log("Can't close DB '" + file + "' - " + DbEnv::strerror(res), logWrn);
            return false;
        }
        else
        {
            ok = false;
        }
    }
    catch(const DbException& err)
    {
        Log("Closing DB '" + file + "' failed: " + err.what(), logWrn);
        return false;
    }
    return true;
}
inline bool C_DbCtrl::active(void)
{
    return ok;
}

T_Account C_DbCtrl::get
    (string name)
{
    S_AccInfo nfo;
    string ret;
    bool tmp = false;
    try
    {
        if(!active())
        {
            tmp = reopen();
        }
        if(active())
        {
            Dbt key;
            Dbt data;
            char *buf = new char[name.length() + 1];
            name.copy(buf, name.length());
            buf[name.length()] = '\0';
            key.set_data(buf);
            key.set_size(name.length());
            int res = db.get(NULL, &key, &data, 0);
            if(res && res != DB_NOTFOUND)
            {
                Log(std::string("Can't get DB account '") + buf + "' - " + DbEnv::strerror(res), logWrn);
            }
            else
            {
                unsigned int size = data.get_size();
                if(size)
                {
                    const char* buf = static_cast<char*>(data.get_data());
                    if(buf)
                    {
                        if(nfo.init(buf, size))
                        {
                            ret = name;
                        }
                    }
                }
            }
            delete buf;
        }
    }
    catch(const DbException& err)
    {
        Log("Getting DB account '" + name + "' failed: " + err.what(), logWrn);
    }
    if(tmp)
    {
        close();
    }
    return make_pair(ret, nfo);
}
bool C_DbCtrl::put(T_Account acc)
{
    bool ret = false;
    bool tmp = false;
    try
    {
        if(!active())
        {
            tmp = reopen();
        }
        if(active())
        {
            Dbt key(const_cast<char*>(acc.first.c_str()), acc.first.length());
            Dbt data(&acc.second, sizeof(acc.second));
            int res = db.put(NULL, &key, &data, DB_NOOVERWRITE);
            if(res && res != DB_KEYEXIST)
            {
                Log("Can't put DB account '" + acc.first + "' - " + DbEnv::strerror(res), logWrn);
            }
            else if(!res)
            {
                ret = true;
            }
        }
    }
    catch(const DbException& err)
    {
        Log("Putting DB account '" + acc.first + "' failed: " + err.what(), logWrn);
    }
    if(tmp)
    {
        close();
    }
    return ret;
}
bool C_DbCtrl::set
    (T_Account acc)
{
    bool ret = false;
    bool tmp = false;
    try
    {
        if(!active())
        {
            tmp = reopen();
        }
        if(active())
        {
            Dbt key(const_cast<char*>(acc.first.c_str()), acc.first.length());
            Dbt data(&acc.second, sizeof(acc.second));
            int res = db.put(NULL, &key, &data, 0);
            if(res)
            {
                Log("Can't set DB account '" + acc.first + "' - " + DbEnv::strerror(res), logWrn);
            }
            else
            {
                ret = true;
            }
        }
    }
    catch(const DbException& err)
    {
        Log("Setting DB account '" + acc.first + "' failed: " + err.what(), logWrn);
    }
    if(tmp)
    {
        close();
    }
    return ret;
}

_______________


Звиняюсь за неполный код - нелезет он весь в сообщение...
 

loki
()
Ответ на: комментарий от loki

> Звиняюсь за неполный код - нелезет он весь в сообщение...

И слава Богу!

ansi ★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.