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);
}