summaryrefslogtreecommitdiffstats
path: root/org/madore/damlengine/WeblogDatabaseConnection.java
blob: 5d3c8a208d8c87ffd57fd6b342efc24a8441e2cd (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
package org.madore.damlengine;

import java.util.Properties;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.io.BufferedReader;
import java.io.IOException;
import java.sql.Connection;
import java.sql.SQLException;
import org.postgresql.Driver;

public final class WeblogDatabaseConnection {

    private WeblogDatabaseConnection() { // Forbid instantiation
	throw new AssertionError("WeblogDatabaseConnection cannot be instantiated");
    }

    public static ThreadLocal<Connection> pconn
	= new ThreadLocal<Connection>();

    public static Connection getConnection()
        throws SQLException {
	Connection conn = pconn.get();
	if ( conn == null || conn.isClosed() || ! conn.isValid(5) ) {
	    String dbHost = null;
	    if ( ! DamlEngine.runAsServlet )
		dbHost = System.getenv("DAMLENGINE_PGHOST");
	    if ( dbHost == null )
		dbHost = DamlEngine.appProps.getProperty("pghost");
	    if ( dbHost == null && ! DamlEngine.runAsServlet )
		dbHost = System.getenv("PGHOST");
	    if ( dbHost == null )
		dbHost = "localhost";
	    String dbPort = null;
	    if ( ! DamlEngine.runAsServlet )
		dbPort = System.getenv("DAMLENGINE_PGPORT");
	    if ( dbPort == null )
		dbPort = DamlEngine.appProps.getProperty("pgport");
	    if ( dbPort == null && ! DamlEngine.runAsServlet )
		dbPort = System.getenv("PGPORT");
	    if ( dbPort == null )
		dbPort = "5432";
	    String dbName = null;
	    if ( ! DamlEngine.runAsServlet )
		dbName = System.getenv("DAMLENGINE_DBNAME");
	    if ( dbName == null )
		dbName = DamlEngine.appProps.getProperty("dbname");
	    if ( dbName == null )
		dbName = "weblog";
	    String dbUser = null;
	    if ( ! DamlEngine.runAsServlet )
		dbUser = System.getenv("DAMLENGINE_PGUSER");
	    if ( dbUser == null )
		dbUser = DamlEngine.appProps.getProperty("pguser");
	    if ( dbUser == null && ! DamlEngine.runAsServlet )
		dbUser = System.getenv("PGUSER");
	    if ( dbUser == null && ! DamlEngine.runAsServlet )
		dbUser = System.getenv("USER");
	    if ( dbUser == null )
		dbUser = System.getProperty("user.name");
	    if ( dbUser == null )
		dbUser = dbName;
	    String dbPass = null;
	    if ( ! DamlEngine.runAsServlet )
		dbPass = System.getenv("DAMLENGINE_PGPASSWORD");
	    if ( dbPass == null )
		dbPass = DamlEngine.appProps.getProperty("pgpassword");
	    if ( dbPass == null && ! DamlEngine.runAsServlet )
		dbPass = System.getenv("PGPASSWORD");
	    if ( dbPass == null ) {
		String dbPassFile = null;
		if ( ! DamlEngine.runAsServlet )
		    dbPassFile = System.getenv("DAMLENGINE_PGPASSFILE");
		if ( dbPassFile == null )
		    dbPassFile = DamlEngine.appProps.getProperty("pgpassfile");
		if ( dbPassFile == null && ! DamlEngine.runAsServlet )
		    dbPassFile = System.getenv("PGPASSFILE");
		if ( dbPassFile == null && ! DamlEngine.runAsServlet )
		    dbPassFile = System.getProperty("user.home")
			+ "/.pgpass";
		if ( dbPassFile != null ) try {
		    BufferedReader buf
			= new BufferedReader(new InputStreamReader(new FileInputStream(dbPassFile)));
			String line;
			while ( ( line = buf.readLine() ) != null ) {
			    String[] elts = line.split(":");
			    if ( elts.length == 5
				 && ( elts[0].equals("*") || elts[0].equals(dbHost) )
				 && ( elts[1].equals("*") || elts[1].equals(dbPort) )
				 && ( elts[2].equals("*") || elts[2].equals(dbName) )
				 && ( elts[3].equals("*") || elts[3].equals(dbUser) ) ) {
				dbPass = elts[4];
				break;
			    }
			}
		    } catch (IOException e) {
			// Ignore
		    }
	    }
	    if ( dbPass == null )
		dbPass = "";
	    final String dbUrl
		= "jdbc:postgresql://"+dbHost+":"+dbPort+"/"+dbName;
	    final Properties dbProps = new Properties();
	    final Driver drv = new Driver();
	    dbProps.setProperty("user", dbUser);
	    dbProps.setProperty("password", dbPass);
	    dbProps.setProperty("ssl", "true");
	    if ( drv.getMajorVersion() >= 42 )
		dbProps.setProperty("sslmode", "prefer");
	    dbProps.setProperty("sslfactory", "org.postgresql.ssl.NonValidatingFactory");
	    conn = drv.connect(dbUrl, dbProps);
	    conn.createStatement().execute("SET TIME ZONE 0");
	    pconn.set(conn);
	}
	return conn;
    }

}