函數aerospike_scan_foreach()執行掃描,對查找到的記錄逐個調用回調函數。回調函數的型構是:
typedef bool (*aerospike_scan_foreach_callback)(const as_val *value, void *udata);
這個回調函數在掃描期間找到的每條記錄上被調用,記錄通過參數value傳遞,用戶提供數據由參數udata傳遞。需注意到value的類型是const as_val *,意味著回調函數沒有責任去銷毀value,並且value僅在回調函數作用域中可見。回調函數不能將value傳遞到函數作用域以外。
沒有更多的結果需要處理時,會以NULL做為參數value的值調用回調函數。
對於正常的掃描操作,value將是一個記錄,可簡單地使用as_record_fromval()轉換成記錄對象。若參數value是個記錄,此函數返回一個記錄對象;否則返回空值(NULL)。也可使用as_val_type()檢查value的類型。
bool callback(const as_val *value, void *udata) {
if (value == NULL) {
// scan is complete
return true;
}
as_record *rec = as_record_fromval(value);
if (rec != NULL) {
// process record
}
return true;
}
檢查後台掃描狀態
函數aerospike_scan_background()把發送掃描請求發給到數據庫執行,客戶端不用等待結果。客戶端會被返給一個掃描id(scan id),用來檢查掃描的運行狀態。
掃描id能用來周期性檢查掃描的狀態,理想狀況下,應用將根據獲取到的掃描狀態,智能判斷輪詢狀態的頻度。
掃描的狀態信息被填充到as_scane_info實例對象中:
as_scan_info scan_info;
if (aerospike_scan_info(&as, &err, NULL, scan_id, &scan_info) != AEROSPIKE_OK) {
fprintf(stderr, "err(%d) %s at [%s:%d]\n", err.code, err.message, err.file, err.line);
}
以上代碼只是很簡單地檢查狀態,並假設狀態檢查只做一次。
若應用持續跟蹤運行已用時間,那在獲取狀態後就能通過檢查scan_info的成員域progress_pct,估計出掃描還將占用多長時間,。