快速开始
第一步:数据库定义
对于使用 C++ API 的数据库应用程序,与 C API 一样,在主机环境中的开发包括三个阶段:
- 数据布局定义(创建数据库模式)和编译(生成数据库接口文件,包括数据库字典)。
- 在应用程序中使用 SmartEDB静态和特定于模式生成的 API。
- 将数据库接口文件与应用程序源代码一起编译,并与适当的 SmartEDB运行时库进行链接。
模式定义
该数据库模式是在一种类似于高级 C 语言的数据定义语言(DDL)中定义的。基本的 DDL 语句包括声明数据库<db_name>
以分配数据库名称,以及类<class_name>
以定义数据库类(在 SQL 术语中对应于表)。例如,以下定义了一个名为 mydb 的简单数据库和一个具有两个字段 id(一个非负 4 字节整数)和 name(一个可变长度字符串)的单一类(表)MyClass:
declare database mydb;
class MyClass {
unsigned<4> id;
string name;
};
模式编译
通常,模式文件的扩展名会是.mco
;比如 schema.mco
或 mydb.mco
。然后,该文件由 DDL 编译器 mcocomp
进行编译,以生成特定于模式的数据库字典和数据访问 API,其形式为 C++实现文件 <db_name>.hpp
、C <db_name>.h
头文件和 C <db_name>.c
实现文件。例如,以下命令将在当前工作目录中生成文件 mydb.hpp
、mydb.h
和 mydb.c
:
../../host/bin/mcocomp -hpp mydb.mco
在 SDK 示例 samples/native/core/20_languages/cpp/cppdemo.mco
中可以看到一个更有趣的 DDL 使用示例。
在应用程序源代码中实现
C++ API 是围绕 C API 的一个“薄”包装器。实际上,生成的 C++实现文件(<db_name>.hpp
)为模式文件中定义的每个数据库类定义了一个命名空间 <db_name>
和一个 C++类。C++类实现了类级别的方法,如 create()
、remove()
和 checkpoint()
,以及字段访问方法,如 id_get()
、id_put()
、name_get()
、name_size()
和 name_put()
。这些方法只是实现了相应生成的 C API 函数 MyClass_new()
、MyClass_delete()
、MyClass_checkpoint()
、MyClass_id_get()
、MyClass_id_put()
、MyClass_name_get()
、MyClass_name_put()
等。要使用生成的 C++类实现,应用程序必须首先包含 <db_name>.hpp 并声明使用命名空间 <db_name>
。通过创建一个应用程序级别的类来子类化生成的类通常很方便,该类继承生成的类,并通过诸如 print()
或 ToString()
之类的方法扩展其功能。例如,以下代码片段定义了一个应用程序级别的类 AppClass,它扩展了生成的 MyClass:
#include "mydb.hpp"
using namespace mydb;
class AppClass: public MyClass
{
public:
void ToString()
{
uint4 id;
uint2 len;
char name[20];
id_get(id);
name_get(name, sizeof(name), len);
name[len] = 0;
printf("\n[%d]: %s\n", id, name);
}
}
编译和链接应用程序
在常规内存中创建 SmartEDB 数据库的简单应用程序将需要以下库(按照惯例,我们使用缩写名称,例如,mcolib
,在 Windows 平台上它将以 mcolib.lib
存在,在 Unix-Linux 平台上以 libmcolib.a
存在):
库 | 说明 |
---|---|
mcolib | 核心运行时库。 |
mcovtmem | 用于全内存数据库“虚拟表”库。 |
mcomconv | 用于常规内存“内存设备”库。 |
mcosw32, mcosw32n, or mcoslnx | 同步库。 |
mcouwrt | 实用程序库。 |
请参阅 SDK示例 sample samples/native/core/20_languages/cpp/cppdemo
了解实际使用.
第二步:C++ 实例
针对 C API 描述的所有实现细节也适用于 C++ 应用程序。例如,获取 SmartEDB运行时信息、打开和连接数据库都是使用 C API 来执行的。
生成的 C++ 封装类的主要便利之一是能够通过应用程序级别的类继承和扩展其功能。
参阅示例 samples/native/core/20-languages/cpp/cppdemo。
请注意
应用程序级别的类 MyPart 是如何扩展生成类 Part 的功能,以及函数 populate_db()
是如何使用 C API 的 mco_trans_start()
和 mco_trans_commit()
来管理数据库事务,并使用 MyPart 的继承方法来创建数据库对象并在其各个字段中存储值的。函数 printPartsOfType()
进一步展示了如何将 C API 函数与 MyPart 方法一起使用,以搜索给定类型的 Part,然后实例化并滚动游标以显示数据库对象的结果集。
第三步:C++ 智能指针
从性能的角度来看,以更标准的 C++ 方式访问对象字段是更优的,这些封装方法会调用底层的 C API函数,使得数据库字段有效地表现为类属性。
为了使用智能指针访问,只需按如下方式指定 -smartptr
选项:
../../host/bin/mcocomp -hpp -smartptr schema.mco
参阅示例 samples/native/core/20-languages/cpp/smartptr 了解如何使用智能指针。