drivers/nodejs/src/index.ts (31 lines of code) (raw):
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
import { Client } from 'pg'
import pgTypes from 'pg-types'
import { CharStreams, CommonTokenStream } from 'antlr4ts'
import { AgtypeLexer } from './antlr4/AgtypeLexer'
import { AgtypeParser } from './antlr4/AgtypeParser'
import CustomAgTypeListener from './antlr4/CustomAgTypeListener'
import { ParseTreeWalker } from 'antlr4ts/tree'
function AGTypeParse (input: string) {
const chars = CharStreams.fromString(input)
const lexer = new AgtypeLexer(chars)
const tokens = new CommonTokenStream(lexer)
const parser = new AgtypeParser(tokens)
const tree = parser.agType()
const printer = new CustomAgTypeListener()
ParseTreeWalker.DEFAULT.walk(printer, tree)
return printer.getResult()
}
async function setAGETypes (client: Client, types: typeof pgTypes) {
await client.query(`
CREATE EXTENSION IF NOT EXISTS age;
LOAD 'age';
SET search_path = ag_catalog, "$user", public;
`)
const oidResults = await client.query(`
select typelem
from pg_type
where typname = '_agtype';`)
if (oidResults.rows.length < 1) { throw new Error() }
types.setTypeParser(oidResults.rows[0].typelem, AGTypeParse)
}
export { setAGETypes, AGTypeParse }