2017-08-25 130 views
2

我正在使用C開發PostgreSQL的擴展。我創建了一個名爲geo_trajc_elem的用戶定義類型。我還創建了一個函數來生成這個新類型的數組。在Postgresql擴展中獲取用戶定義的類型OID C

ArrayType *result_array; 
    struct geo_trajc_elem *traje = (struct geo_trajc_elem *)palloc(sizeof(struct geo_trajc_elem)); 

    Timestamp time_el = PG_GETARG_TIMESTAMP(1); 
    struct geo_point *pt = PG_GETARG_GEOPOINT_TYPE_P(2); 

    int16 typlen; 
    bool typbyval; 
    char typalign; 

    Datum datum_element; 


    traje = DatumGetGeoTrajETypeP(DirectFunctionCall2(get_trajectory_elem, PointerGetDatum(time_el), PointerGetDatum(pt))); 
    datum_element = PointerGetDatum(traje); 

    /* Oid element_type = get_fn_expr_argtype(fcinfo->flinfo, 0); */ 

    Oid element_type = ? 

    get_typlenbyvalalign(element_type, &typlen, &typbyval, &typalign); 

是否有一個函數來獲取oid類型的對象?像get_oid_elem(struct geo_trajc_elem)

在這種情況下,不可能使用get_fn_expr_argtype,因爲我沒有將新類型作爲參數傳遞,而是在函數本身中創建它,對嗎?

在此先感謝

+0

呃,你剛剛提醒我PostgreSQL的C級數組API是多麼可怕。 –

+0

給予一點工作...... –

回答

2

要知道,屬於某一類型名稱Oid,你要諮詢pg_type

您可以使用函數typenameTypeIdparser/parse_type.h與NULL作爲第一個參數爲此目的。

要獲取元素類型的Oid(如果陣列類型爲Oid),請使用utils/lsyscache.h中的get_element_type

+3

您不能爲用戶定義類型的oid添加預處理器定義,因爲它們可以將數據庫實例改變爲數據庫實例。 –

+0

不錯,謝謝你的糾正。 –

+0

@LaurenzAlbe非常感謝您的回覆,這就是我想要的......我只需要創建類型TypeName; D –