From 91763b406a7b2128ff0d9232a617ba86f48b9486 Mon Sep 17 00:00:00 2001 From: Sindre Aarsaether Date: Thu, 7 Apr 2022 15:45:19 +0200 Subject: [PATCH] Load type names when fetching types --- cjs/src/connection.js | 28 +++++++++++++++++++++++++--- cjs/src/query.js | 1 + deno/src/connection.js | 28 +++++++++++++++++++++++++--- deno/src/query.js | 1 + src/connection.js | 26 +++++++++++++++++++++++--- 5 files changed, 75 insertions(+), 9 deletions(-) diff --git a/cjs/src/connection.js b/cjs/src/connection.js index d10ce9c7..344ef812 100644 --- a/cjs/src/connection.js +++ b/cjs/src/connection.js @@ -730,22 +730,44 @@ function Connection(options, queues = {}, { onopen = noop, onend = noop, onclose async function fetchArrayTypes() { needsTypes = false const types = await new Query([` - select b.oid, b.typarray + select b.oid, b.typarray, b.typname from pg_catalog.pg_type a left join pg_catalog.pg_type b on b.oid = a.typelem where a.typcategory = 'A' group by b.oid, b.typarray order by b.oid `], [], execute) - types.forEach(({ oid, typarray }) => addArrayType(oid, typarray)) + types.forEach(({ oid, typarray, typname }) => addArrayType(oid, typarray, typname)) } - function addArrayType(oid, typarray) { + function addArrayType(oid, typarray, typname) { + console.log('add type with name',typname); + + const namedtype = options.types[typname]; + if(namedtype){ + if(namedtype.to == undefined){ + namedtype.to ||= oid; + options.serializers[oid] = namedtype.serialize + } + + options.serializers[namedtype] = options.serializers[oid]; + + if(namedtype.from == undefined){ + namedtype.from = [oid] + options.parsers[oid] = namedtype.parse + } + options.parsers[namedtype] = options.parsers[oid]; + } + const parser = options.parsers[oid] options.shared.typeArrayMap[oid] = typarray options.parsers[typarray] = (xs) => arrayParser(xs, parser) options.parsers[typarray].array = true options.serializers[typarray] = (xs) => arraySerializer(xs, options.serializers[oid]) + + if(options.serializers[oid]){ + options.serializers[typname] = options.serializers[oid] + } } function tryNext(x, xs) { diff --git a/cjs/src/query.js b/cjs/src/query.js index 545090c5..5f2ddb96 100644 --- a/cjs/src/query.js +++ b/cjs/src/query.js @@ -118,6 +118,7 @@ const Query = module.exports.Query = class Query extends Promise { forEach(fn) { this.forEachFn = fn + this.handle() return this } diff --git a/deno/src/connection.js b/deno/src/connection.js index 9597242d..dc9437c4 100644 --- a/deno/src/connection.js +++ b/deno/src/connection.js @@ -733,22 +733,44 @@ function Connection(options, queues = {}, { onopen = noop, onend = noop, onclose async function fetchArrayTypes() { needsTypes = false const types = await new Query([` - select b.oid, b.typarray + select b.oid, b.typarray, b.typname from pg_catalog.pg_type a left join pg_catalog.pg_type b on b.oid = a.typelem where a.typcategory = 'A' group by b.oid, b.typarray order by b.oid `], [], execute) - types.forEach(({ oid, typarray }) => addArrayType(oid, typarray)) + types.forEach(({ oid, typarray, typname }) => addArrayType(oid, typarray, typname)) } - function addArrayType(oid, typarray) { + function addArrayType(oid, typarray, typname) { + console.log('add type with name',typname); + + const namedtype = options.types[typname]; + if(namedtype){ + if(namedtype.to == undefined){ + namedtype.to ||= oid; + options.serializers[oid] = namedtype.serialize + } + + options.serializers[namedtype] = options.serializers[oid]; + + if(namedtype.from == undefined){ + namedtype.from = [oid] + options.parsers[oid] = namedtype.parse + } + options.parsers[namedtype] = options.parsers[oid]; + } + const parser = options.parsers[oid] options.shared.typeArrayMap[oid] = typarray options.parsers[typarray] = (xs) => arrayParser(xs, parser) options.parsers[typarray].array = true options.serializers[typarray] = (xs) => arraySerializer(xs, options.serializers[oid]) + + if(options.serializers[oid]){ + options.serializers[typname] = options.serializers[oid] + } } function tryNext(x, xs) { diff --git a/deno/src/query.js b/deno/src/query.js index 96db0b33..c709feb8 100644 --- a/deno/src/query.js +++ b/deno/src/query.js @@ -118,6 +118,7 @@ export class Query extends Promise { forEach(fn) { this.forEachFn = fn + this.handle() return this } diff --git a/src/connection.js b/src/connection.js index f589ecdc..c8f1cfae 100644 --- a/src/connection.js +++ b/src/connection.js @@ -730,22 +730,42 @@ function Connection(options, queues = {}, { onopen = noop, onend = noop, onclose async function fetchArrayTypes() { needsTypes = false const types = await new Query([` - select b.oid, b.typarray + select b.oid, b.typarray, b.typname from pg_catalog.pg_type a left join pg_catalog.pg_type b on b.oid = a.typelem where a.typcategory = 'A' group by b.oid, b.typarray order by b.oid `], [], execute) - types.forEach(({ oid, typarray }) => addArrayType(oid, typarray)) + types.forEach(({ oid, typarray, typname }) => addArrayType(oid, typarray, typname)) } - function addArrayType(oid, typarray) { + function addArrayType(oid, typarray, typname) { + const namedtype = options.types[typname]; + if(namedtype){ + if(namedtype.to == undefined){ + namedtype.to ||= oid; + options.serializers[oid] = namedtype.serialize + } + + options.serializers[namedtype] = options.serializers[oid]; + + if(namedtype.from == undefined){ + namedtype.from = [oid] + options.parsers[oid] = namedtype.parse + } + options.parsers[namedtype] = options.parsers[oid]; + } + const parser = options.parsers[oid] options.shared.typeArrayMap[oid] = typarray options.parsers[typarray] = (xs) => arrayParser(xs, parser) options.parsers[typarray].array = true options.serializers[typarray] = (xs) => arraySerializer(xs, options.serializers[oid]) + + if(options.serializers[oid]){ + options.serializers[typname] = options.serializers[oid] + } } function tryNext(x, xs) {