在Postgresql扩展C中获取用户定义的类型OID

时间:2017-08-25 18:27:51

标签: c postgresql

我正在使用C开发PostgreSQL的扩展。我创建了一个名为geo_trajc_elem的用户定义类型。我还创建了一个函数来生成这种新类型的数组。

  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,因为我没有将新类型作为参数传递,而是在函数本身中创建它,对吗?

提前致谢

1 个答案:

答案 0 :(得分:2)

要了解属于某个类型名称的Oid,您需要咨询pg_type

您可以使用typenameTypeId中的parser/parse_type.h函数将NULL作为第一个参数。

如果您拥有数组类型Oid,要获取元素类型的Oid,请使用get_element_type中的utils/lsyscache.h