使用序列数据
序列是 SmartEDB 支持的标量数据元素的无界数组。生成的 C API 中的 classname_fieldname_*()
函数用于 C 应用程序管理类型为序列的数据库字段。由于序列实际上是值的向量,因此通过迭代器进行访问。在 classname_fieldname_*()
中使用 C 类型 mco_seq_iterator_h 来执行基本的序列操作。还提供了一组强大的分析方法,用于对序列执行数学和统计操作。
插入和更新序列
通常情况下,序列数据是通过生成的 C API <classname>_<fieldname>_append()
来插入的。
例如,考虑以下模式定义:
#define uint4 unsigned<4>
class Quote {
char<16> symbol;
sequence<uint4 asc> day;
sequence<float> price;
tree<symbol> by_symbol;
};
有了这个类定义,Quote 序列字段 day
和 price
就可以用如下代码进行填充:
#define N_ITEMS 4
uint4 days[N_ITEMS] = { 1, 2, 4, 5 };
float prices[N_ITEMS] = { 10, 20, 40 ,50 };
...
Quote q;
Quote_new(t, &q);
Quote_symbol_put(&q, "IBM", (uint2)(strlen("IBM")));
Quote_day_append(&q, days, N_ITEMS);
Quote_price_append(&q, prices, N_ITEMS);
有时可能需要向有序的时间序列中插入值。可以使用生成的 C API <classname>_<fieldname>_insert()
将值插入到现有序列中。例如,以下代码片段会搜索具有“IBM”符号的 Quote 对象,然后插入日期和价格值:
#define DAY_THREE 3
#define DAY_THREE_PRICE 30
uint4 day_to_insert[1] = { DAY_THREE };
float price_to_insert[1] = { DAY_THREE_PRICE };
...
mco_trans_h t;
mco_cursor_t cur;
...
mco_trans_start(db, MCO_READ_WRITE, MCO_TRANS_FOREGROUND, &t);
rc = Quote_by_symbol_index_cursor(t, &cur);
if (MCO_S_OK == rc)
{
rc = Quote_by_symbol_search(t, &cur, MCO_GE, "IBM",
(uint2)(sizeof("IBM")));
if (MCO_S_OK == rc)
{
// 在这里插入数据
Quote q;
Quote_new(t, &q);
rc = Quote_from_cursor(t, &cur, &q);
rc = Quote_day_iterator(&q, &it);
if (MCO_S_OK == rc)
{
rc = Quote_day_search(&q, &it,
DAY_THREE, MCO_SEQ_BOUNDARY_EXCLUSIVE,
0, MCO_SEQ_BOUNDARY_OPEN);
mco_seq_no_t pos = it.first_seq_no;
rc = Quote_day_insert(&q, pos, day_to_insert, 1);
rc = Quote_price_insert(&q, pos, price_to_insert, 1);
rc = mco_trans_commit(t);
}
}
}