数据库对象
C++ 应用程序通常会混合使用 C++ API 和 C API 来管理数据库对象。
创建和修改
使用 mcocomp 模式编译器并加上 -hpp
选项,可为每个数据库类生成 C++ 类定义。这些类接口可用于生成的 create()
和 _put() 方法创建和修改数据库对象。如下所示:
/* 模式定义代码片段 */
class Part
{
string type;
string name;
float price;
unsigned<4> code;
hash< code > ByCode [ 10000 ];
tree< type, name > ByType; // ordered by type, name
};
/* 应用程序代码片段 */
MyPart part;
char temp[200];
rc = mco_trans_start(db, MCO_READ_WRITE, MCO_TRANS_FOREGROUND, &t);
if ( MCO_S_OK == rc )
{
part.create(t);
part.stype_put(i2s(j % 100));
sprintf(temp, "part # %d", j);
part.sname_put(temp);
part.price_put((float)(2.0 + j % 100 / 200.0));
part.code_put(1000000+j);
rc = mco_trans_commit(t);
}
然而,更好的实现则是使用智能指针“smartptr”DDL编译器选项优化C++数据库访问。
为了使用智能指针访问,只需在使用mcocomp编译模式时指定DDL编译器选项-smartptr
,以生成C++风格的访问方法。应用程序可以将标准setter
和getter
与智能指针访问方法结合起来。
从性能的角度来看,以С++的方式访问对象字段比使用put() 和get() 函数更有益。这些
setter
和getter
可以在C++中通过生成代码来实现,这些代码使数据库字段有效地显示为类属性。另一个显著的优点是异常处理可以用于管理错误条件。
智能指针的实现使用了一些巧妙的C++特性来"模拟属性"(隐式强制转换操作符和构造函数)。这些属性使用SmartEDB本机API封装函数从数据库中提取值。
智能指针只在访问实际需要的字段时很高效,但并非总是与数据库交互的最有效方式。例如,
- 如果需要提取所有的类字段,那么将它们提取到一个结构体中比逐个字段访问它们更有效,可参阅 C API中的“fixed_put和_get”。
- 如果应用程序多次访问同一个字段,最好将其提取到一个局部变量中,而不是在每次访问时通过“属性”赋值提取其值。
因此,提供了智能指针选项来启用或禁用此功能。
为了说明指定智能指针选项时生成的内部实现类型,请参考以下代码片段:
class Host
{
uint4 id;
string name;
char<50> domain;
};
当执行 mcocomp -hpp -smartptr schema.mco
时,将为整数字段 id
生成以下代码:
class Host : public MCO::Base_
{
public:
struct
{
Host* handle_;
operator uint4() const
{
uint4 val_;
MCO_CPP_CHECK(Host_id_get(handle_, &val_));
return val_;
}
uint4 operator=(uint4 val_)
{
MCO_CPP_CHECK(Host_id_put(handle_, val_));
return val_;
}
} id;
...
};
动态对象分配器
SmartESQL 引擎使用 Allocator 类的对象来管理诸如 Blob、String、Array 等动态数据对象。
有关更多详细信息,请参阅动态对象分配器页面。
管理日期时间字段
C++ 应用程序使用标准的C API 日期时间字段。