??
记录使用
记录是Aerospike表示存储在
数据库中数据的形式。记录由元数据和多个bin组成。这些bin保存记录的数据。每个bin有一个名称与一个值。元数据是关于记录的附加信息。在数据库中使用键(key)查找记录。
初始化记录
通过下列函数之一可初始化一条记录:
as_record_inita() — 在栈上初始化一条记录及其bin。
as_record_init() — 在栈上初始化一条记录,但在堆上分配bin。
as_record_new() — 在堆上分配一条记录及其bin并初始化。
无论何时初始化的记录,不再使用时应通过as_record_destroy()释放资源。
栈上分配记录
as_record_inita()与as_record_init()都在栈上分配且初始化一个记录,但它们分配记录bin的行为不同。
as_record_inita() 在栈上分配bin。
as_record_init() 在堆上分配bin。
下面是一个简单的as_record_inita()例子。在使用上没有区别,只是在如何分配空间上存在不同。
as_record rec;
as_record_inita(&rec, 3);
as_record_set_int64(&rec, 1);
as_record_set_int64(&rec, 2);
as_record_set_int64(&rec, 3);
as_record_destroy(&rec);
即使记录和bin都是在栈上分配,bin值所用空间还是可能会从堆上分配。因此,应使用as_record_destroy()安全地释放记录及其相关资源。
堆上分配记录
使用as_record_new()将在堆上分配记录。
as_record *rec = as_record_new(10); as_record_set_int64(rec, 1); as_record_set_int64(rec, 2); as_record_set_int64(rec, 3); as_record_destroy(rec);
当不再需要此记录时,应使用as_record_destroy()安全地释放记录及其相关资源。
访问记录的bin
API提供多种方法来访问记录的bin。
为访问记录的bin,首先需要初始化一条记录并以bin数据填充。有两种获取记录数据的方法:
初始化并填充记录的bin。请参见【填充记录的bin】。
从读取操作的返回中获取记录数据。请参见【记录与读操作】。
一旦有个初始化完成的记录,就可使用这些功能之一,读取记录的bin数据。
获取Bin
API提供了一系列getter函数,从记录中取出指定数据类型的bin数值。getter函数要求一个记录对象与bin名称做为参数。
下面的getter函数用于获取bin的原生类型(native-type)数值:
as_record_get_int64()
as_record_get_str()
更详细内容在【API文档】。
以下是getter函数使用示例:
int64_t ibin = as_record_get_int64(rec, "ibin", 123); char *sbin = as_record_get_str(rec, "sbin");
下面的getter函数返回非原生类型数值的指针:
as_record_get_integer()
as_record_get_string()
as_record_get_bytes()
as_record_get_list()
as_record_get_map()
若应用保存这些getter函数返回的数值指针,然后销毁了这条记录,那么指针将指向无效数据。为防止出现这种情况,可通过as_val_reserve()增加这些getter函数返回值的引用计数。
as_list *lbin = (as_list*)as_val_reserve(as_record_get_list(&rec, "lbin")); as_record_destroy(&rec); int64_t i1 = as_arraylist_get_int64(lbin, 1); int64_t i2 = as_arraylist_get_int64(lbin, 2); int64_t i3 = as_arraylist_get_int64(lbin, 3); as_list_destroy(lbin);
上面代码中的5-7行会有效地读取数据。若as_val_reserve()没被调用,就会引起无效读取,可能导致数据损坏。完成数据读取后,应使用相应的销毁函数释放它。
填充记录的bin
在能填充一条记录数据前,必须先初始化它。有三个初始化记录的方法。
as_record_inita() — 在栈上初始化一条记录及其bin。
as_record_init() — 在栈上初始化一条记录,但在堆上分配bin。
as_record_new() — 在堆上分配一条记录及其bin并初始化。
这些函数都接受一个参数指明需分配bin的个数,初始化完成的记录能用来填充数据。
设置Bin值
有一系列的setter函数,用来设置不同数据类型的bin。每个setter函数要求一个记录对象、一个bin名称和一个bin值做为参数,操作成功返回true。
下面是设置原生类型bin数据的setter函数:
as_record_set_int64() — 设置一个int64_t类型的值。
as_record_set_str() — 设置值为一个以空字符(NULL)结束的字符串。
as_record_set_strp() — 设置值为一个以空字符(NULL)结束的字符串,指定在记录销毁时是否释放原值所占用的空间。
as_record_set_raw() — 设置一个字节数组类型的值
as_record_set_rawp() — 设置一个字节数组类型的值,指明在记录销毁时是否释放原值所占用的空间。
具体细节请参见【API文档】。
下面是一些使用setter函数的例子:
as_record_set_int64(rec, "ibin", 123); as_record_set_str(rec, "sbin", "abc"); as_record_set_strp(rec, "spbin", strdup("ijk"), true); as_record_set_raw(rec, "rbin", (uint8_t*)"xyz", 3);
下列setter函数保持对非原生类型数据的指针引用:
as_record_set_integer() — Sets an as_integer value. as_record_set_string() — Sets an as_string value. as_record_set_bytes() — Sets an as_bytes value. as_record_set_list() — Sets an as_list value. as_record_set_map() — Sets an as_map value.
当通过as_record_destroy()释放一个记录,使用这些调用设置的值也将被释放。若在其它地方使用这些值,在向记录设置这些值时应用通过as_