/* * Copyright (c) 2004, 2005 TADA AB - Taby Sweden * Distributed under the terms shown in the file COPYRIGHT * found in the root folder of this project or at * http://eng.tada.se/osprojects/COPYRIGHT.html */ package org.postgresql.pljava.test; import java.io.File; import java.io.IOException; import java.io.PrintStream; import java.util.ArrayList; import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; /** * PL/Java Test harness * * @author Thomas Hallgren */ public class TestPLJava { // private static final int CMD_AMBIGUOUS = -2; // private static final int CMD_UNKNOWN = -1; private static final int CMD_PGSQLHOME = 0; private static final int CMD_TESTDIR = 1; private static final int CMD_PORT = 2; private static final ArrayList s_commands = new ArrayList(); private final File m_pgsqlHome; private final File m_pljavaHome; private final File m_pljavaBin; private final File m_testHome; private final int m_majorVer; private final int m_minorVer; static { s_commands.add(CMD_PGSQLHOME, "pgsqlhome"); s_commands.add(CMD_TESTDIR, "testdir"); s_commands.add(CMD_PORT, "port"); } /* private static final int getCommand(String arg) { int top = s_commands.size(); int candidateCmd = CMD_UNKNOWN; for(int idx = 0; idx < top; ++idx) { if(((String)s_commands.get(idx)).startsWith(arg)) { if(candidateCmd != CMD_UNKNOWN) return CMD_AMBIGUOUS; candidateCmd = idx; } } return candidateCmd; } */ public static void printUsage() { PrintStream out = System.err; out.println("usage: java org.postgresql.pljava.test.TestPLJava"); out.println(" [ -port <number> ] # default is 5432"); out.println(" [ -pgsqlhome <dir> ] # default is /usr/local/pgsql"); out.println(" [ -testdir <dir> ] # default is current directory"); out.println(" [ -printenv ] # print the env for the postmaster"); out.println(" [ -windows ] # If the server is on a Windows machine"); } class KillPostmaster extends Thread { } private int[] getPostgreSQLVersion() throws IOException { // Get the PostgreSQL version using pg_ctl // CommandReader pg_ctl = CommandReader.create( new String[] { "pg_ctl", "--version" }, this.getPostgresEnvironment().asArray()); String verLine = pg_ctl.readLine(); pg_ctl.close(); int exitVal = pg_ctl.getExitValue(); if(exitVal != 0) throw new IOException("pg_ctl exit value " + exitVal); Pattern verPattern = Pattern.compile("\\D+(\\d+)\\.(\\d+)\\D"); Matcher verMatcher = verPattern.matcher(verLine); if(!verMatcher.lookingAt()) throw new IOException("Unable to determine PostgreSQL version from " + verLine); return new int[] { Integer.parseInt(verMatcher.group(1)), Integer.parseInt(verMatcher.group(2)) }; } public TestPLJava(String pgsqlHome, String pljavaHome) throws IOException { m_pgsqlHome = new File(pgsqlHome); m_pljavaHome = new File(pljavaHome); m_testHome = new File(m_pljavaHome, "test"); m_pljavaBin = new File(new File(new File(m_pljavaHome, "bin"), "build"), "pljava"); int[] ver = this.getPostgreSQLVersion(); m_majorVer = ver[0]; m_minorVer = ver[1]; } class Postmaster extends Thread { Postmaster() { } public void run() { List args = new ArrayList(); args.add("postmaster"); args.add("-D"); args.add(new File(m_testHome, "db").getAbsolutePath()); if(m_minorVer < 5) { args.add("-c"); args.add("tcpip_socket=true"); } else { args.add("-c"); args.add("custom_variable_classes=pljava"); } args.add("-c"); args.add("log_min_messages=debug1"); args.add("-c"); args.add("dynamic_library_path=" + m_pljavaBin.getAbsolutePath()); Runtime rt = Runtime.getRuntime(); KillPostmaster killer = new KillPostmaster(); rt.addShutdownHook(killer); try { rt.exec((String[])args.toArray(new String[args.size()])); } catch(IOException e) { } rt.removeShutdownHook(killer); } } public Environment getPostgresEnvironment() throws IOException { Environment env = new Environment(); Path path = new Path(env.get("PATH")); File pgsqlBin = new File(m_pgsqlHome, "bin"); File pgsqlLib = new File(m_pgsqlHome, "lib"); if(Environment.isWindows()) path.addFirst(pgsqlLib); else { Path ldPath = new Path(env.get("LD_LIBRARY_PATH")); ldPath.addFirst(pgsqlLib); env.put("LD_LIBRARY_PATH", ldPath.toString()); } path.addFirst(pgsqlBin); env.put("PATH", path.toString()); return env; } public static void main(String[] args) { try { TestPLJava tpj = new TestPLJava("c:\\msys\\local\\pgsql", "c:\\"); System.out.println(tpj.getPostgresEnvironment()); } catch(Exception e) { e.printStackTrace(); } } public void initdb() { } public final int getMajorVer() { return m_majorVer; } public final int getMinorVer() { return m_minorVer; } }