程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> DB2數據庫 >> DB2教程 >> AerospikeC客戶端手冊———數據掃描—記錄變更

AerospikeC客戶端手冊———數據掃描—記錄變更

編輯:DB2教程

AerospikeC客戶端手冊———數據掃描—記錄變更


記錄變更

Aerospike提供能力來掃描數據庫中的記錄並通過用戶定義函數(UDF)變更每條記錄數據。
在SQL中,不帶條件變更表中所有記錄的UPDATE語句是:
UPDATE test.demo
SET a = 1, b = 2, c = 3
Aeropike提供與上面SQL類似的功能,允許應用一個函數到每條記錄,通過函數來變更記錄數據。這個函數,被稱作UDF(用戶定義函數),被應用到單條記錄。它可以提供參數,能讀取和寫入記錄bin值與執行計算。
目前,掃描並應用UDF到每條記錄只能在後台執行,就是說客戶端把掃描請求發給數據庫,但不用等待結果。掃描請求被放入隊列,並且數據庫中執行,沒有結果返回到客戶端。客戶端會得到一個id,用來標識所發送掃描請求對應的任務,可用這個id檢查掃描的狀態。

定義掃描

除了能定義一個應用到每條記錄的UDF,用於變更記錄內容的掃描定義與正常的掃描定義相同,並且是使用後台掃描操作:aerospike_scan_background()。
我們象在【記錄掃描】章節中所做的類似,先構建一個掃描對象,但不需要去選擇bin,而且增加一個as_scan_apply_each()操作:
as_scan scan;
as_scan_init(&scan, "test", "demo");

as_scan_apply_each(&scan, "mymodule", "mytransform", NULL);
解釋:
第1行 — 在棧上創建一個as_scan對象。
第2行 — 初始化掃描,被掃描數據所在的namespace名稱為“test”、set名稱為“demo“
第4行 — 增加一個用戶定義函數(UDF),此函數被應用到每條掃描到的記錄。UDF函數mytransform()定義於模塊mymodule。在此例中,UDF不需要任何參數。

Defining the Record UDF 定義記錄UDF

The following is the mytransform" Record UDF, defined inmymodule`. It is a pretty simple Record UDF, mimicking the SQL statement above.

下面所示是定義於模塊mymodule中的UDF,名稱是mytransform,它相當簡單,模仿上述SQL語句的行為。

function mytransform(rec)
    rec['a'] = 1
    rec['b'] = 2
    rec['c'] = 3
    aerospike:update(rec)
end

A more elaborate function might be to increment "a", calculate "b" based on "a", and calculate "c" based on the values of "a" and "b":

稍微復雜點兒的函數可增加"a"、基於”a”計算”b",並基於"a"和“b“的數值計算”c”:

function mytransform(rec)
    rec['a'] = rec['a'] + 1
    rec['b'] = rec['a'] * 2
    rec['c'] = rec['a'] + rec['b']
    aerospike:update(rec)
end

執行掃描

此掃描可使用areospike_scan_background()執行:

uint64_t scan_id = 0;
if (aerospike_scan_background(&as, &err, NULL, &scan, &scan_id) != AEROSPIKE_OK) {
    fprintf(stderr, "error(%d) %s at [%s:%d]\n", err.code, err.message, err.file, err.line);
}

scan_id用來查詢掃描的狀態。scand_id為0是未定義,所以掃描操作將生成並設置scan_id的值。

檢查掃描的狀態

可使用aerospike_scan_info()查詢掃描的狀態,狀態信息將填充到一個as_scan_info對象中。

as_scan_info scan_info;
if (aerospike_scan_info(&as, &err, NULL, scan_id, &scan_info) != AEROSPIKE_OK) {
    fprintf(stderr, "error(%d) %s at [%s:%d]\n", err.code, err.message, err.file, err.line);
}

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved