forked from Lainports/opnsense-ports
151 lines
5.6 KiB
C
151 lines
5.6 KiB
C
--- src/plpl.c.orig 2019-08-04 04:35:14 UTC
|
|
+++ src/plpl.c
|
|
@@ -137,12 +137,21 @@ pl_query_name(VALUE obj)
|
|
}
|
|
res = rb_ary_new2(tpl->dsc->natts);
|
|
for (i = 0; i < tpl->dsc->natts; i++) {
|
|
+#if PG_VERSION_NUM < 110000
|
|
if (tpl->dsc->attrs[i]->attisdropped) {
|
|
attname = "";
|
|
}
|
|
else {
|
|
attname = NameStr(tpl->dsc->attrs[i]->attname);
|
|
}
|
|
+#else
|
|
+ if (TupleDescAttr(tpl->dsc, i)->attisdropped) {
|
|
+ attname = "";
|
|
+ }
|
|
+ else {
|
|
+ attname = NameStr(TupleDescAttr(tpl->dsc, i)->attname);
|
|
+ }
|
|
+#endif
|
|
rb_ary_push(res, rb_tainted_str_new2(attname));
|
|
}
|
|
return res;
|
|
@@ -178,6 +187,7 @@ pl_query_type(VALUE obj)
|
|
}
|
|
res = rb_ary_new2(tpl->dsc->natts);
|
|
for (i = 0; i < tpl->dsc->natts; i++) {
|
|
+#if PG_VERSION_NUM < 110000
|
|
if (tpl->dsc->attrs[i]->attisdropped)
|
|
continue;
|
|
PLRUBY_BEGIN(1);
|
|
@@ -189,6 +199,19 @@ pl_query_type(VALUE obj)
|
|
rb_raise(pl_ePLruby, "Cache lookup for attribute '%s' type %ld failed",
|
|
attname, OidGD(tpl->dsc->attrs[i]->atttypid));
|
|
}
|
|
+#else
|
|
+ if (TupleDescAttr(tpl->dsc, i)->attisdropped)
|
|
+ continue;
|
|
+ PLRUBY_BEGIN(1);
|
|
+ attname = NameStr(TupleDescAttr(tpl->dsc, i)->attname);
|
|
+ typeTup = SearchSysCache(TYPEOID, OidGD(TupleDescAttr(tpl->dsc, i)->atttypid),
|
|
+ 0, 0, 0);
|
|
+ PLRUBY_END;
|
|
+ if (!HeapTupleIsValid(typeTup)) {
|
|
+ rb_raise(pl_ePLruby, "Cache lookup for attribute '%s' type %ld failed",
|
|
+ attname, OidGD(TupleDescAttr(tpl->dsc, i)->atttypid));
|
|
+ }
|
|
+#endif
|
|
fpgt = (Form_pg_type) GETSTRUCT(typeTup);
|
|
rb_ary_push(res, rb_tainted_str_new2(NameStr(fpgt->typname)));
|
|
ReleaseSysCache(typeTup);
|
|
@@ -588,14 +611,23 @@ pl_tuple_heap(VALUE c, VALUE tuple)
|
|
MEMZERO(nulls, char, RARRAY_LEN(c));
|
|
for (i = 0; i < RARRAY_LEN(c); i++) {
|
|
if (NIL_P(RARRAY_PTR(c)[i]) ||
|
|
+#if PG_VERSION_NUM < 110000
|
|
tupdesc->attrs[i]->attisdropped) {
|
|
+#else
|
|
+ TupleDescAttr(tupdesc, i)->attisdropped) {
|
|
+#endif
|
|
dvalues[i] = (Datum)0;
|
|
nulls[i] = 'n';
|
|
}
|
|
else {
|
|
nulls[i] = ' ';
|
|
+#if PG_VERSION_NUM < 110000
|
|
typid = tupdesc->attrs[i]->atttypid;
|
|
if (tupdesc->attrs[i]->attndims != 0 ||
|
|
+#else
|
|
+ typid = TupleDescAttr(tupdesc, i)->atttypid;
|
|
+ if (TupleDescAttr(tupdesc, i)->attndims != 0 ||
|
|
+#endif
|
|
tpl->att->attinfuncs[i].fn_addr == (PGFunction)array_in) {
|
|
pl_proc_desc prodesc;
|
|
FmgrInfo func;
|
|
@@ -1088,6 +1120,7 @@ plruby_build_tuple(HeapTuple tuple, TupleDesc tupdesc,
|
|
}
|
|
|
|
for (i = 0; i < tupdesc->natts; i++) {
|
|
+#if PG_VERSION_NUM < 110000
|
|
if (tupdesc->attrs[i]->attisdropped)
|
|
continue;
|
|
PLRUBY_BEGIN(1);
|
|
@@ -1101,7 +1134,21 @@ plruby_build_tuple(HeapTuple tuple, TupleDesc tupdesc,
|
|
rb_raise(pl_ePLruby, "Cache lookup for attribute '%s' type %ld failed",
|
|
attname, OidGD(tupdesc->attrs[i]->atttypid));
|
|
}
|
|
+#else
|
|
+ if (TupleDescAttr(tupdesc, i)->attisdropped)
|
|
+ continue;
|
|
+ PLRUBY_BEGIN(1);
|
|
+ attname = NameStr(TupleDescAttr(tupdesc, i)->attname);
|
|
+ attr = heap_getattr(tuple, i + 1, tupdesc, &isnull);
|
|
+ typeTup = SearchSysCache(TYPEOID, OidGD(TupleDescAttr(tupdesc, i)->atttypid),
|
|
+ 0, 0, 0);
|
|
+ PLRUBY_END;
|
|
|
|
+ if (!HeapTupleIsValid(typeTup)) {
|
|
+ rb_raise(pl_ePLruby, "Cache lookup for attribute '%s' type %ld failed",
|
|
+ attname, OidGD(TupleDescAttr(tupdesc, i)->atttypid));
|
|
+ }
|
|
+#endif
|
|
fpgt = (Form_pg_type) GETSTRUCT(typeTup);
|
|
typoutput = (Oid) (fpgt->typoutput);
|
|
#if PG_PL_VERSION >= 75
|
|
@@ -1115,6 +1162,7 @@ plruby_build_tuple(HeapTuple tuple, TupleDesc tupdesc,
|
|
int alen;
|
|
|
|
typname = NameStr(fpgt->typname);
|
|
+#if PG_VERSION_NUM < 110000
|
|
alen = tupdesc->attrs[i]->attlen;
|
|
typeid = tupdesc->attrs[i]->atttypid;
|
|
if (strcmp(typname, "text") == 0) {
|
|
@@ -1129,6 +1177,22 @@ plruby_build_tuple(HeapTuple tuple, TupleDesc tupdesc,
|
|
alen = tupdesc->attrs[i]->atttypmod - 4;
|
|
}
|
|
}
|
|
+#else
|
|
+ alen = TupleDescAttr(tupdesc, i)->attlen;
|
|
+ typeid = TupleDescAttr(tupdesc, i)->atttypid;
|
|
+ if (strcmp(typname, "text") == 0) {
|
|
+ alen = -1;
|
|
+ }
|
|
+ else if (strcmp(typname, "bpchar") == 0 ||
|
|
+ strcmp(typname, "varchar") == 0) {
|
|
+ if (TupleDescAttr(tupdesc, i)->atttypmod == -1) {
|
|
+ alen = 0;
|
|
+ }
|
|
+ else {
|
|
+ alen = TupleDescAttr(tupdesc, i)->atttypmod - 4;
|
|
+ }
|
|
+ }
|
|
+#endif
|
|
if ((type_ret & RET_DESC_ARR) == RET_DESC_ARR) {
|
|
res = rb_ary_new();
|
|
rb_ary_push(res, rb_tainted_str_new2(attname));
|
|
@@ -1190,8 +1254,13 @@ plruby_build_tuple(HeapTuple tuple, TupleDesc tupdesc,
|
|
|
|
fmgr_info(typoutput, &finfo);
|
|
|
|
+#if PG_VERSION_NUM < 110000
|
|
s = pl_convert_arg(attr, tupdesc->attrs[i]->atttypid,
|
|
&finfo, typelem,tupdesc->attrs[i]->attlen);
|
|
+#else
|
|
+ s = pl_convert_arg(attr, tupdesc->attrs[i].atttypid,
|
|
+ &finfo, typelem, TupleDescAttr(tupdesc, i)->attlen);
|
|
+#endif
|
|
}
|
|
PLRUBY_END_PROTECT;
|
|
|