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

AerospikeC客戶端手冊———查詢—查詢記錄

編輯:SyBase教程

AerospikeC客戶端手冊———查詢—查詢記錄


查詢記錄

查詢時除了使用主索引,Aerospike C客戶端也提供API來通過檢索次索引查詢數據庫。
為了使用次索引查詢數據,首先應初始化並填充一個as_query對象;然後,以初始化完成的as_query對象,使用aerospike_query_foreach()執行查詢。一個查詢可以:
對返回的滿足條件記錄逐個調用回調函數。
對返回的滿足條件記錄集合應用流式用戶定義函數(StreamUDF),再對StreamUDF返回結果調用回調用函數。

此章節專注於第一種方式,如想了解第二種方式,請參見【聚合】章節。

後面的代碼引用自示例目錄【examples/query_examples/simple】,由Aerospike C客戶端安裝包自帶。

 

定義查詢

首先,初始化和構建一個的查詢對象。下面代碼片斷初始化了一個查詢對象,要查找的數據所在的namespace名稱為“test”、set名稱為“demoset”,查找bin名是 "test-bin"且整型值等於7的記錄。相當於SQL語句:“select * from test.demoset where test-bin equal 7”。

as_query query;
as_query_init(&query, "test", "demoset");

as_query_where_inita(&query, 1);
as_query_where(&query, "test-bin", integer_equals(7));

注意:不帶“where"語句的查詢將導致全庫掃描。

調用查詢

查詢使用aerospike_query_foreach()函數調用。

此調用為集群中每個節點初始化一個查詢任務。在C客戶端內部,有5個(NUM_QUERY_THREADS)查詢工作線程處理所有節點的查詢任務。若集群多於5個節點,理想狀態下是增加默認的處理線程數,以便讓全部節點並行處理。

if (aerospike_query_foreach(&as, &err, NULL, &query, query_cb, NULL) !=
        AEROSPIKE_OK) {
    LOG("aerospike_query_foreach() returned %d - %s", err.code, err.message);
    as_query_destroy(&query);
    cleanup(&as);
    exit(-1);
}

若在指定的查詢目標上沒有創建次索引,將返回”AEROSPIKE_ERR_INDEX_NOT_FOUND“錯誤。若一個索引正在創建中,將返回AEROSPIKE_ERR_INDEX_NOT_READABLE錯誤。

處理結果

上面的示例中,aerospike_query_foreach()函數使用了一個回調函數query_cd做為參數。回調函數具有如下型構:

typedef bool (*aerospike_query_foreach_callback)(const as_val *value, void *udata);

對任何節點返回的每條記錄,回調函數都被調起,來對記錄進行處理。記錄處理沒有特定順序。你可能注意到參數value是個const as_val *類型,意味著回調函數沒有責任銷毀它,它在回調函數的作用域內可見。回調函數不應將它傳遞到作用域之外。

沒有更多需處理的返回結果時,將以空值(NULL)做為參數value的值,調用回調用函數。

當參數value期望是一個記錄時,可簡單地使用as_record_formval()轉換成記錄類型。若參數value是個記錄,此函數返回一個記錄對象;否則返回空值。也可使用as_val_type()檢查value的類型。

bool callback(const as_val *value, void *udata) {
    if (value == NULL) {
        // query is complete
        return true;
    }

    as_record *rec = as_record_fromval(value);

    if (rec != NULL) {
        // process record
    }

    return true;
}

若想在每次回調時傳遞一個全局對象出來,請在調用aerospike_query_foreach()時提供一個userdata類型的參數。

清理資源

一旦查詢結束,查詢對象與其成員對象可使用as_query_destroy()函數安全地釋放。注意在我們的示例中,可以不用顯式調用as_query_destroy(),因為是從棧上分配的as_query對象,並且使用了as_query_where_inita(),來避免內部使用堆。

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