Aerospike 提供掃描資料庫中所有記錄,並透過使用者定義函數(UDF)逐筆轉換記錄資料的能力。這類似於 SQL 中無條件的 UPDATE 敘述:
UPDATE test.demo SET a = 1, b = 2, c = 3
Aerospike 允許應用程式定義一個 UDF 套用至每一筆掃描到的記錄。UDF 可接收參數、讀寫 Bin 值並執行計算。目前掃描並套用 UDF 僅支援背景執行模式:客戶端發送請求後不等待結果,掃描任務排入佇列由伺服器端執行,不回傳結果給客戶端。客戶端獲得一個 scan_id 以追蹤任務狀態。
除了指定套用至每筆記錄的 UDF,轉換掃描的定義與一般掃描相同,使用背景掃描操作 aerospike_scan_background()。建立掃描物件後,透過 as_scan_apply_each() 加入 UDF:
as_scan scan;
as_scan_init(&scan, "test", "demo");
as_scan_apply_each(&scan, "mymodule", "mytransform", NULL);
說明:
as_scan 物件。mymodule 中的 mytransform() 函數,套用至每筆掃描記錄。本例無參數。以下為定義於 mymodule 中的 mytransform UDF,模仿上述 SQL 行為:
function mytransform(rec)
rec['a'] = 1
rec['b'] = 2
rec['c'] = 3
aerospike:update(rec)
end
進階範例:遞增 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
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 初始為 0 表示未定義,掃描操作會產生並設定該值。此 ID 用於後續查詢掃描狀態。
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);
}
狀態資訊填入 as_scan_info 物件,包含進度百分比等欄位,應用程式可據此估算剩餘時間並決定輪詢頻率。