annotate src/luan/modules/sql/Database.java @ 1802:ca98dee04e08 default tip

add Parsers.json_null
author Franklin Schmidt <fschmidt@gmail.com>
date Sun, 21 Apr 2024 21:25:15 -0600
parents 225808b90cee
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1267
9fa8b8389578 add LuanTable.luan;
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
1 package luan.modules.sql;
9fa8b8389578 add LuanTable.luan;
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
2
9fa8b8389578 add LuanTable.luan;
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
3 import java.sql.Connection;
9fa8b8389578 add LuanTable.luan;
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
4 import java.sql.DriverManager;
9fa8b8389578 add LuanTable.luan;
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
5 import java.sql.Statement;
9fa8b8389578 add LuanTable.luan;
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
6 import java.sql.PreparedStatement;
9fa8b8389578 add LuanTable.luan;
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
7 import java.sql.ResultSet;
9fa8b8389578 add LuanTable.luan;
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
8 import java.sql.SQLException;
9fa8b8389578 add LuanTable.luan;
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
9 import java.util.Map;
9fa8b8389578 add LuanTable.luan;
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
10 import java.util.HashMap;
9fa8b8389578 add LuanTable.luan;
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
11 import java.util.Properties;
1402
27efb1fcbcb5 move luan.lib to goodjava
Franklin Schmidt <fschmidt@gmail.com>
parents: 1392
diff changeset
12 import goodjava.logging.Logger;
27efb1fcbcb5 move luan.lib to goodjava
Franklin Schmidt <fschmidt@gmail.com>
parents: 1392
diff changeset
13 import goodjava.logging.LoggerFactory;
1341
a015a0b5c388 add Html.decode(), Lucene.count_tokens(), lucene boosts, Sql.database.set()
Franklin Schmidt <fschmidt@gmail.com>
parents: 1337
diff changeset
14 import luan.Luan;
1267
9fa8b8389578 add LuanTable.luan;
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
15 import luan.LuanTable;
9fa8b8389578 add LuanTable.luan;
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
16 import luan.LuanException;
1392
002152af497a hosted postgres
Franklin Schmidt <fschmidt@gmail.com>
parents: 1341
diff changeset
17 import luan.modules.Utils;
1267
9fa8b8389578 add LuanTable.luan;
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
18
9fa8b8389578 add LuanTable.luan;
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
19
1268
725e52076f03 remove broken pooling
Franklin Schmidt <fschmidt@gmail.com>
parents: 1267
diff changeset
20 public final class Database {
1267
9fa8b8389578 add LuanTable.luan;
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
21 private static final Logger logger = LoggerFactory.getLogger(Database.class);
9fa8b8389578 add LuanTable.luan;
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
22
9fa8b8389578 add LuanTable.luan;
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
23 public final Connection con;
9fa8b8389578 add LuanTable.luan;
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
24 private final Map<String,PreparedStatement> pstmts = new HashMap<String,PreparedStatement>();
1341
a015a0b5c388 add Html.decode(), Lucene.count_tokens(), lucene boosts, Sql.database.set()
Franklin Schmidt <fschmidt@gmail.com>
parents: 1337
diff changeset
25 private int fetchSize = 0;
1267
9fa8b8389578 add LuanTable.luan;
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
26
9fa8b8389578 add LuanTable.luan;
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
27 public Database(Connection con) {
9fa8b8389578 add LuanTable.luan;
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
28 this.con = con;
9fa8b8389578 add LuanTable.luan;
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
29 }
9fa8b8389578 add LuanTable.luan;
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
30
1420
225808b90cee options handling
Franklin Schmidt <fschmidt@gmail.com>
parents: 1402
diff changeset
31 public Database(LuanTable spec)
1267
9fa8b8389578 add LuanTable.luan;
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
32 throws LuanException, ClassNotFoundException, SQLException
9fa8b8389578 add LuanTable.luan;
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
33 {
1420
225808b90cee options handling
Franklin Schmidt <fschmidt@gmail.com>
parents: 1402
diff changeset
34 spec = new LuanTable(spec);
1392
002152af497a hosted postgres
Franklin Schmidt <fschmidt@gmail.com>
parents: 1341
diff changeset
35 String cls = Utils.removeRequiredString(spec,"class");
1267
9fa8b8389578 add LuanTable.luan;
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
36 Class.forName(cls);
1392
002152af497a hosted postgres
Franklin Schmidt <fschmidt@gmail.com>
parents: 1341
diff changeset
37 String url = Utils.removeRequiredString(spec,"url");
1267
9fa8b8389578 add LuanTable.luan;
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
38 Properties props = new Properties();
1420
225808b90cee options handling
Franklin Schmidt <fschmidt@gmail.com>
parents: 1402
diff changeset
39 props.putAll(spec.asMap());
1267
9fa8b8389578 add LuanTable.luan;
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
40 this.con = DriverManager.getConnection(url,props);
1392
002152af497a hosted postgres
Franklin Schmidt <fschmidt@gmail.com>
parents: 1341
diff changeset
41 spec.remove("user");
002152af497a hosted postgres
Franklin Schmidt <fschmidt@gmail.com>
parents: 1341
diff changeset
42 spec.remove("password");
1420
225808b90cee options handling
Franklin Schmidt <fschmidt@gmail.com>
parents: 1402
diff changeset
43 set2(spec);
1341
a015a0b5c388 add Html.decode(), Lucene.count_tokens(), lucene boosts, Sql.database.set()
Franklin Schmidt <fschmidt@gmail.com>
parents: 1337
diff changeset
44 }
a015a0b5c388 add Html.decode(), Lucene.count_tokens(), lucene boosts, Sql.database.set()
Franklin Schmidt <fschmidt@gmail.com>
parents: 1337
diff changeset
45
a015a0b5c388 add Html.decode(), Lucene.count_tokens(), lucene boosts, Sql.database.set()
Franklin Schmidt <fschmidt@gmail.com>
parents: 1337
diff changeset
46 public void set(LuanTable options) throws LuanException, SQLException {
1420
225808b90cee options handling
Franklin Schmidt <fschmidt@gmail.com>
parents: 1402
diff changeset
47 set2(new LuanTable(options));
1341
a015a0b5c388 add Html.decode(), Lucene.count_tokens(), lucene boosts, Sql.database.set()
Franklin Schmidt <fschmidt@gmail.com>
parents: 1337
diff changeset
48 }
a015a0b5c388 add Html.decode(), Lucene.count_tokens(), lucene boosts, Sql.database.set()
Franklin Schmidt <fschmidt@gmail.com>
parents: 1337
diff changeset
49
1420
225808b90cee options handling
Franklin Schmidt <fschmidt@gmail.com>
parents: 1402
diff changeset
50 private void set2(LuanTable options) throws LuanException, SQLException {
1392
002152af497a hosted postgres
Franklin Schmidt <fschmidt@gmail.com>
parents: 1341
diff changeset
51 Boolean autoCommit = Utils.removeBoolean(options,"auto_commit");
002152af497a hosted postgres
Franklin Schmidt <fschmidt@gmail.com>
parents: 1341
diff changeset
52 if( autoCommit != null )
002152af497a hosted postgres
Franklin Schmidt <fschmidt@gmail.com>
parents: 1341
diff changeset
53 con.setAutoCommit(autoCommit);
002152af497a hosted postgres
Franklin Schmidt <fschmidt@gmail.com>
parents: 1341
diff changeset
54 Integer n = Utils.removeInteger(options,"fetch_size");
002152af497a hosted postgres
Franklin Schmidt <fschmidt@gmail.com>
parents: 1341
diff changeset
55 if( n != null )
1341
a015a0b5c388 add Html.decode(), Lucene.count_tokens(), lucene boosts, Sql.database.set()
Franklin Schmidt <fschmidt@gmail.com>
parents: 1337
diff changeset
56 fetchSize = n;
1392
002152af497a hosted postgres
Franklin Schmidt <fschmidt@gmail.com>
parents: 1341
diff changeset
57 Utils.checkEmpty(options);
1267
9fa8b8389578 add LuanTable.luan;
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
58 }
9fa8b8389578 add LuanTable.luan;
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
59
1341
a015a0b5c388 add Html.decode(), Lucene.count_tokens(), lucene boosts, Sql.database.set()
Franklin Schmidt <fschmidt@gmail.com>
parents: 1337
diff changeset
60 private void fix(Statement stmt) throws SQLException {
a015a0b5c388 add Html.decode(), Lucene.count_tokens(), lucene boosts, Sql.database.set()
Franklin Schmidt <fschmidt@gmail.com>
parents: 1337
diff changeset
61 if( fetchSize > 0 )
a015a0b5c388 add Html.decode(), Lucene.count_tokens(), lucene boosts, Sql.database.set()
Franklin Schmidt <fschmidt@gmail.com>
parents: 1337
diff changeset
62 stmt.setFetchSize(fetchSize);
a015a0b5c388 add Html.decode(), Lucene.count_tokens(), lucene boosts, Sql.database.set()
Franklin Schmidt <fschmidt@gmail.com>
parents: 1337
diff changeset
63 }
a015a0b5c388 add Html.decode(), Lucene.count_tokens(), lucene boosts, Sql.database.set()
Franklin Schmidt <fschmidt@gmail.com>
parents: 1337
diff changeset
64
1267
9fa8b8389578 add LuanTable.luan;
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
65 private PreparedStatement prepareStatement(String sql,Object[] args) throws SQLException {
9fa8b8389578 add LuanTable.luan;
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
66 PreparedStatement pstmt = pstmts.get(sql);
9fa8b8389578 add LuanTable.luan;
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
67 if( pstmt==null ) {
9fa8b8389578 add LuanTable.luan;
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
68 pstmt = con.prepareStatement(sql);
1341
a015a0b5c388 add Html.decode(), Lucene.count_tokens(), lucene boosts, Sql.database.set()
Franklin Schmidt <fschmidt@gmail.com>
parents: 1337
diff changeset
69 fix(pstmt);
1267
9fa8b8389578 add LuanTable.luan;
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
70 pstmts.put(sql,pstmt);
9fa8b8389578 add LuanTable.luan;
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
71 }
9fa8b8389578 add LuanTable.luan;
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
72 for( int i=0; i<args.length; i++ ) {
9fa8b8389578 add LuanTable.luan;
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
73 pstmt.setObject(i+1,args[i]);
9fa8b8389578 add LuanTable.luan;
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
74 }
9fa8b8389578 add LuanTable.luan;
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
75 return pstmt;
9fa8b8389578 add LuanTable.luan;
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
76 }
9fa8b8389578 add LuanTable.luan;
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
77
9fa8b8389578 add LuanTable.luan;
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
78 public ResultSet query(String sql,Object... args) throws SQLException {
9fa8b8389578 add LuanTable.luan;
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
79 if( args.length == 0 ) {
9fa8b8389578 add LuanTable.luan;
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
80 Statement stmt = con.createStatement();
1341
a015a0b5c388 add Html.decode(), Lucene.count_tokens(), lucene boosts, Sql.database.set()
Franklin Schmidt <fschmidt@gmail.com>
parents: 1337
diff changeset
81 fix(stmt);
1267
9fa8b8389578 add LuanTable.luan;
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
82 return stmt.executeQuery(sql);
9fa8b8389578 add LuanTable.luan;
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
83 } else {
9fa8b8389578 add LuanTable.luan;
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
84 PreparedStatement pstmt = prepareStatement(sql,args);
9fa8b8389578 add LuanTable.luan;
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
85 return pstmt.executeQuery();
9fa8b8389578 add LuanTable.luan;
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
86 }
9fa8b8389578 add LuanTable.luan;
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
87 }
9fa8b8389578 add LuanTable.luan;
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
88
9fa8b8389578 add LuanTable.luan;
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
89 public int update(String sql,Object... args) throws SQLException {
9fa8b8389578 add LuanTable.luan;
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
90 if( args.length == 0 ) {
9fa8b8389578 add LuanTable.luan;
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
91 Statement stmt = con.createStatement();
1341
a015a0b5c388 add Html.decode(), Lucene.count_tokens(), lucene boosts, Sql.database.set()
Franklin Schmidt <fschmidt@gmail.com>
parents: 1337
diff changeset
92 fix(stmt);
1267
9fa8b8389578 add LuanTable.luan;
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
93 int n = stmt.executeUpdate(sql);
9fa8b8389578 add LuanTable.luan;
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
94 stmt.close();
9fa8b8389578 add LuanTable.luan;
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
95 return n;
9fa8b8389578 add LuanTable.luan;
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
96 } else {
9fa8b8389578 add LuanTable.luan;
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
97 PreparedStatement pstmt = prepareStatement(sql,args);
9fa8b8389578 add LuanTable.luan;
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
98 return pstmt.executeUpdate();
9fa8b8389578 add LuanTable.luan;
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
99 }
9fa8b8389578 add LuanTable.luan;
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
100 }
9fa8b8389578 add LuanTable.luan;
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
101
9fa8b8389578 add LuanTable.luan;
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
102 }