LoginSignup
2
0

More than 3 years have passed since last update.

PervasiveデータベースにNode.jsから接続するサンプル

Last updated at Posted at 2020-09-15

はじめに

20世紀に作られ現在も稼働中のVBのシステムにデータ出力の要件があったので、Node.jsで実装してみました。
あまりにも情報が少なすぎて苦労したので備忘録として残します。

環境

項目 内容
データベース Pervasive PSQL v10
(サービスとして起動)
OS Windwos10
node v13.9.0
jdbcライブラリ jdbc@0.7.2

準備

Pervasiveのインストールディレクトリ配下にある以下の3ファイルが必要です。

  • pvjdbc2.jar
  • pvjdbc2x.jar
  • jpscs.jar

プロジェクトディレクトリに drivers というディレクトリを作ってコピーしておきます。

ソース

PervasiveのMYDATAデータベースのMYTABLEテーブルから全レコードを取得してJSONを返すAPIサーバーのサンプルです。
なお、このプログラムにルーティングするExpress/Routerのプログラムが別途必要です。
Pervasiveのサービスが起動しているホスト上でプログラムが実行されることを前提としています。

const express = require("express");
const router = express.Router();
const JDBC = require("jdbc");
const jinst = require("jdbc/lib/jinst");

if (!jinst.isJvmCreated()) {
  jinst.addOption("-Xrs");
  jinst.setupClasspath([
    "./drivers/pvjdbc2.jar",
    "./drivers/pvjdbc2x.jar",
    "./drivers/jpscs.jar"
  ]);
}

const conf = {
  url: "jdbc:pervasive://localhost:1583/MYDATA?transport=tcp",
  drivername: "com.pervasive.jdbc.v2.Driver",
  minpoolsize: 10,
  maxpoolsize: 100,
  properties: {}
};

const initializeCB = err => {
  if (err) {
    console.log(err);
  }
};

const reserveCB = (err, connObj, sql) => {
  return new Promise((resolve, reject) => {
    if (!connObj) {
      console.log("connObj is undefined");
      reject(err);
    }
    const conn = connObj.conn;
    conn.createStatement((err, statement) => {
      if (err) {
        console.log(err);
        reject(err);
      }
      statement.executeQuery(sql, (err, resultset) => {
          if (err) {
            console.log(err);
            reject(err);
          }
          resultset.toObjArray((err, result) => {
            resolve(result);
          });
      });
    });
  });
};

module.exports = router;

/**
 * テーブルから全レコードを取得しJSONを返す
 */
router.post("/", (req, res) => {
  const jdbc = new JDBC(conf);
  jdbc.initialize(initializeCB);
  jdbc.reserve((err, connObj) => {
    reserveCB(err, connObj, "SELECT * FROM MYTABLE")
    .then(data => {
      const headers = {"Content-Type": "text/json;charset=utf-8"};
      res.set(headers).json(data);
    })
    .then(() => {jdbc.release(connObj, (err) => {if (err) {console.log(err.message);}})
    })
    .then(() => {jdbc.purge(err => {});});
  });
});

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0