2017-08-25 10 views
2

私は、Cを使ってPostgreSQLの拡張を開発しています。私はgeo_trajc_elemというユーザ定義型を作成しました。私はこの新しいタイプの配列を生成する関数も作成しました。Postgresql拡張Cでユーザ定義型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); 

オブジェクトのオブジェクト型を取得する関数はありますか?このような場合、get_fn_expr_argtypeを使用することはできません。これは、引数として新しい型を渡すのではなく、関数自体で作成しているからですか?正しいですか?get_oid_elem(struct geo_trajc_elem)のようにします。

特定の型の名前に属しOidを知るために、事前

+0

あなたはPostgreSQLのCレベルの配列APIがどれほど恐ろしいかを思い出しました。 –

+0

ちょっとした作業...... –

答えて

2

おかげで、あなたはpg_typeに相談する必要があります。

parser/parse_type.hの関数typenameTypeIdは、その目的のための最初の引数としてNULLを使用できます。

Oidの場合はOid、ならget_element_type、を入力してください。

+3

ユーザ定義型のoidのプリプロセッサ定義を追加することはできません。これは、DBインスタンスをDBインスタンスに変更する可能性があるためです。 –

+0

本当に、訂正していただきありがとうございます。 –

+0

@LaurenzAlbeご回答いただきありがとうございました。それは私が望んでいたものです... TypeName; D –

関連する問題