C++开发基础

这里介绍如何使用 C++ 客户端驱动接口编写使用 SequoiaDB 数据库的程序。为了简单起见,下面的示例不全部是完整的代码,只起示例性作用。可到 /sequoiadb/client/samples/CPP 下获取相应的完整的代码。更多查看 C++ API

数据库操作

  • 连接数据库:connect.cpp 演示如何连接到数据库。文件应当包含“client.hpp”头文件及使用命名空间 sdbclient。
  1. #include <iostream>
  2. #include "client.hpp"
  3.  
  4. using namespace std ;
  5. using namespace sdbclient ;
  6.  
  7. // Display Syntax Error
  8. void displaySyntax ( CHAR *pCommand ) ;
  9.  
  10. INT32 main ( INT32 argc, CHAR **argv )
  11. {
  12. // verify syntax
  13. if ( 5 != argc )
  14. {
  15. displaySyntax ( (CHAR*)argv[0] ) ;
  16. exit ( 0 ) ;
  17. }
  18. // read argument
  19. CHAR *pHostName = (CHAR*)argv[1] ;
  20. CHAR *pPort = (CHAR*)argv[2] ;
  21. CHAR *pUsr = (CHAR*)argv[3] ;
  22. CHAR *pPasswd = (CHAR*)argv[4] ;
  23.  
  24. // define local variable
  25. sdb connection ;
  26. INT32 rc = SDB_OK ;
  27.  
  28. // connect to database
  29. rc = connection.connect ( pHostName, pPort, pUsr, pPasswd ) ;
  30. if( rc!=SDB_OK )
  31. {
  32. cout << "Fail to connet to database, rc = " << rc << endl ;
  33. goto error ;
  34. }
  35. else
  36. cout << "Connect success!" << endl ;
  37.  
  38. done:
  39. // disconnect from database
  40. connection.disconnect () ;
  41. return 0 ;
  42. error:
  43. goto done ;
  44. }
  45.  
  46. // Display Syntax Error
  47. void displaySyntax ( CHAR *pCommand )
  48. {
  49. cout << "Syntax:" << pCommand << " &lt;hostname&gt; &lt;servicename&gt; &lt;username&gt; &lt;password&gt; " << endl ;
  50. }

在 Linux下,可以如下编译及链接动态链接库文件 libsdbcpp.so:

  1. $ g++ -o connect connect.cpp -I &lt;PATH&gt;/sdbdriver/include -lsdbcpp -L &lt;PATH&gt;/sdbdriver/lib
  2. 执行结果如下:
  3. $ ./connect localhost 11810 "" ""
  4. Connect success!

Note:

本例程连接到本地数据库的11810端口,使用的是空的用户名和密码。用户需要根据自己的实际情况配置参数。譬如:./connect localhost 11810 "sequoiadb" "sequoiadb"。当数据库已经创建用户时,应该使用正确的用户及密码连接到数据库,否则连接失败。

  • 创建集合空间和集合

首先,定义集合空间,集合对象。

  1. sdbCollectionSpace collectionspace ;
  2. sdbCollection collection ;

创建集合空间"foo"

  1. rc = connection.createCollectionSpace ( "foo", SDB_PAGESIZE_4K, collectionspace ) ;

在新建立的集合空间中创建集合"bar"

  1. rc = collectionspace.createCollection ( "bar", collection ) ;

以上创建了一个名字为“foo”的集合空间和一个名字为“bar”的集合,集合空间内的集合的数据页大小为4k。可根据实际情况选择不同大小的数据页。创建集合后,可对集合做增删改查等操作。

Note:

在创建集合“bar”时并没有附加分区,压缩等信息,详情请查阅 C++ API

  • 插入数据:insert

首先,需要创建一个插入的 bson 对象。

  1. BSONObj obj ;
  2. obj = BSON ( "name" << "tom" << "age" << 24 ) ;

接着,把此 bson 对象插入集合中

  1. collection.insert ( obj ) ;

obj 为输入参数,为要插入的数据。

  • 查询:query

定义一个游标对象

  1. sdbCursor cursor ;

查询所有记录,并把查询结果放在游标对象中

  1. collection.query ( cursor ) ;

从游标中显示所有记录

  1. while( !( rc=cursor.next( obj ) ) )
  2. {
  3. cout << obj.toString() << endl ;
  4. }

查询操作需要一个游标对象存放查询的结果到本地。要获得查询的结果需要使用游标操作。本例使用了游标操作的 next 接口,表示从查询结果中取到一条记录。此示例中没有设置查询条件,筛选条件,排序情况,及仅使用默认索引。

  • 创建索引:index
  1. # define INDEX_NAME "index"

首先创建一 BSONObj 对象包含将要创建的索引的信息

  1. BSONObj obj ;
  2. obj = BSON ( "name" << 1 << "age" << -1 ) ;

创建一个以"name"为升序,"age"为降序的索引

  1. collection.createIndex ( obj, INDEX_NAME, FALSE, FALSE ) ;

集合对象 collection 中创建一个以"name"为升序,"age"为降序的索引。

  • 更新:update

先创建一个包含更新规则的 BSONObj 对象

  1. BSONObj rule = BSON ( "$set" << BSON ( "age" << 19 ) ) ;

打印出更新规则

  1. cout << rule.toString() << endl ;

更新记录

  1. collection.update( rule ) ;

在集合对象 collection 中更新了记录。示例中没有指定数据匹配规则,所以此示例将更新集合中所有的记录。

集群操作

  • 分区组操作

分区组操作包括创建分区组(sdb:createReplicaGroup),得到分区组实例(sdb:getReplicaGroup),启动分区组所有数据节点(sdbReplicaGroup::start),停止分区组所有数据节点(sdbReplicaGroup::stop)等。

以下为分区组操作示例性的例子。真正的应用应包括错误检测等。

定义一个分区组实例

  1. sdbReplicaGroup rg ;

定义创建节点需要使用的配置项,此处定义一个空的配置项,表示使用默认配置

  1. BSONObj conf ;

先建立一个编目分区组

  1. connection.createCataReplicaGroup ( "ubuntu-dev1", "30000", "/opt/sequoiadb/database/catalog/30000", conf ) ;

创建数据分区组

  1. connection.createRG ( "dataGroup1", rg ) ;

创建第一个数据节点

  1. rg.createNode ( "ubuntu-dev1", "40000", "/opt/sequoiadb/database/data/40000", conf ) ;

启动分区组

  1. rg.start () ;
  • 数据节点操作

数据节点操作包括创建数据节点(sdbReplicaGroup::createNode),得到主数据节点(sdbReplicaGroup::getMaster),得到从数据节点(sdbReplicaGroup::getSlave),启动数据节点(sdbNode::start),停止数据节点(sdbNode::stop)等。

以下为数据节点操作示例性的例子。真正的应用应包括错误检测等。

定义一个数据节点实例

  1. sdbNode masternode ;
  2. sdbNode slavenode ;

获取主数据节点

  1. rg.getMaster( masternode ) ;

获取从数据节点

  1. rg.getSlave( slavenode ) ;