操作系统:ubuntu
IDE:eclipse
最近一直在读一本书,叫做innodb存储引擎;对数据库有了新的认识,再加上一直关注着ssdb的作者的进展,所以也想搞一个自己的数据库;显然现在的hashmap类型的nosql数据库被大家用烂了,自己想搞一个关系型的内存数据库;不过再开始之前还是现了解下leveldb吧。
首先在github上把源代码下载下来,并且解压;打开eclipse,创建C++ hello world工程;创建levelDB source folder,引入leveldb的源代码。
右键点击工程属性,在头文件中引入leveldb,leveldb/include,levelDB/util;链接库中加入pthread,预编译中加入变量LEVELDB_PLATFORM_POSIX,然后把工程里面的main入口全部删除,然后再删除一些报错的run之类的。
如果不是太倒霉的话,应该可以编译成功;这样在代码里面就可以直接引用leveldb了,举个例子:
//============================================================================
// Name : ArchyDB.cpp
// Author : archy_yu
// Version :
// Copyright : Your copyright notice
// Description : Hello World in C++, Ansi-style
//============================================================================
#include <iostream>
#include <vector>
#include "leveldb/db.h"
using namespace std;
using namespace leveldb;
void split(string &s,std::vector<std::string> &ret)
{
size_t last = 0;
string delim = " ";
size_t index=s.find_first_of(delim,last);
while (index!=std::string::npos)
{
ret.push_back(s.substr(last,index-last));
last=index+1;
index=s.find_first_of(delim,last);
}
if (index-last>0)
{
ret.push_back(s.substr(last,index-last));
}
}
int main() {
DB *db;
Options op;
op.create_if_missing = true;
Status s = DB::Open(op, "/tmp/testdb", &db);
if (!s.ok()) {
cout << "invalid" << endl;
delete db;
return 0;
}
string line;
while(1)
{
getline(std::cin,line);
std::vector<std::string> vect ;
split(line,vect);
if(vect.size() <= 1)
{
cout << "invalid cmd and params" << endl;
}
if(vect[0] == "get" && vect.size() >= 2)
{
string value;
db->Get(ReadOptions(),vect[1],&value);
cout << value << endl;
}
else if(vect[0] == "set" && vect.size() >= 3)
{
db->Put(WriteOptions(),vect[1],vect[2]);
}
else
{
cout << "invalid cmd" << endl;
}
}
delete db;
return 0;
}
一个建议的leveldb服务器就跑起来了,后面我们将添加网络支持!