Mercurial Hosting > luan
annotate src/luan/modules/sql/Database.java @ 1341:a015a0b5c388
add Html.decode(), Lucene.count_tokens(), lucene boosts, Sql.database.set()
author | Franklin Schmidt <fschmidt@gmail.com> |
---|---|
date | Tue, 19 Feb 2019 08:14:40 -0700 |
parents | 8b61c8c4e07a |
children | 002152af497a |
rev | line source |
---|---|
1267 | 1 package luan.modules.sql; |
2 | |
3 import java.sql.Connection; | |
4 import java.sql.DriverManager; | |
5 import java.sql.Statement; | |
6 import java.sql.PreparedStatement; | |
7 import java.sql.ResultSet; | |
8 import java.sql.SQLException; | |
9 import java.util.Map; | |
10 import java.util.HashMap; | |
11 import java.util.Properties; | |
1337 | 12 import luan.lib.logging.Logger; |
13 import luan.lib.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 | 15 import luan.LuanTable; |
16 import luan.LuanException; | |
17 | |
18 | |
1268
725e52076f03
remove broken pooling
Franklin Schmidt <fschmidt@gmail.com>
parents:
1267
diff
changeset
|
19 public final class Database { |
1267 | 20 private static final Logger logger = LoggerFactory.getLogger(Database.class); |
21 | |
22 public final Connection con; | |
23 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
|
24 private int fetchSize = 0; |
1267 | 25 |
26 public Database(Connection con) { | |
27 this.con = con; | |
28 } | |
29 | |
1268
725e52076f03
remove broken pooling
Franklin Schmidt <fschmidt@gmail.com>
parents:
1267
diff
changeset
|
30 public Database(LuanTable specTbl) |
1267 | 31 throws LuanException, ClassNotFoundException, SQLException |
32 { | |
1268
725e52076f03
remove broken pooling
Franklin Schmidt <fschmidt@gmail.com>
parents:
1267
diff
changeset
|
33 Map<Object,Object> spec = specTbl.asMap(); |
1267 | 34 String cls = getString(spec,"class"); |
35 Class.forName(cls); | |
36 String url = getString(spec,"url"); | |
37 Properties props = new Properties(); | |
38 props.putAll(spec); | |
39 this.con = DriverManager.getConnection(url,props); | |
1341
a015a0b5c388
add Html.decode(), Lucene.count_tokens(), lucene boosts, Sql.database.set()
Franklin Schmidt <fschmidt@gmail.com>
parents:
1337
diff
changeset
|
40 set(spec); |
a015a0b5c388
add Html.decode(), Lucene.count_tokens(), lucene boosts, Sql.database.set()
Franklin Schmidt <fschmidt@gmail.com>
parents:
1337
diff
changeset
|
41 } |
a015a0b5c388
add Html.decode(), Lucene.count_tokens(), lucene boosts, Sql.database.set()
Franklin Schmidt <fschmidt@gmail.com>
parents:
1337
diff
changeset
|
42 |
a015a0b5c388
add Html.decode(), Lucene.count_tokens(), lucene boosts, Sql.database.set()
Franklin Schmidt <fschmidt@gmail.com>
parents:
1337
diff
changeset
|
43 public void set(LuanTable options) throws LuanException, SQLException { |
a015a0b5c388
add Html.decode(), Lucene.count_tokens(), lucene boosts, Sql.database.set()
Franklin Schmidt <fschmidt@gmail.com>
parents:
1337
diff
changeset
|
44 set(options.asMap()); |
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 |
a015a0b5c388
add Html.decode(), Lucene.count_tokens(), lucene boosts, Sql.database.set()
Franklin Schmidt <fschmidt@gmail.com>
parents:
1337
diff
changeset
|
47 private void set(Map<Object,Object> options) throws LuanException, SQLException { |
a015a0b5c388
add Html.decode(), Lucene.count_tokens(), lucene boosts, Sql.database.set()
Franklin Schmidt <fschmidt@gmail.com>
parents:
1337
diff
changeset
|
48 Object obj; |
a015a0b5c388
add Html.decode(), Lucene.count_tokens(), lucene boosts, Sql.database.set()
Franklin Schmidt <fschmidt@gmail.com>
parents:
1337
diff
changeset
|
49 obj = options.remove("auto_commit"); |
a015a0b5c388
add Html.decode(), Lucene.count_tokens(), lucene boosts, Sql.database.set()
Franklin Schmidt <fschmidt@gmail.com>
parents:
1337
diff
changeset
|
50 if( obj != null ) { |
a015a0b5c388
add Html.decode(), Lucene.count_tokens(), lucene boosts, Sql.database.set()
Franklin Schmidt <fschmidt@gmail.com>
parents:
1337
diff
changeset
|
51 if( !(obj instanceof Boolean) ) |
a015a0b5c388
add Html.decode(), Lucene.count_tokens(), lucene boosts, Sql.database.set()
Franklin Schmidt <fschmidt@gmail.com>
parents:
1337
diff
changeset
|
52 throw new LuanException( "parameter 'auto_commit' must be a boolean" ); |
a015a0b5c388
add Html.decode(), Lucene.count_tokens(), lucene boosts, Sql.database.set()
Franklin Schmidt <fschmidt@gmail.com>
parents:
1337
diff
changeset
|
53 con.setAutoCommit((Boolean)obj); |
a015a0b5c388
add Html.decode(), Lucene.count_tokens(), lucene boosts, Sql.database.set()
Franklin Schmidt <fschmidt@gmail.com>
parents:
1337
diff
changeset
|
54 } |
a015a0b5c388
add Html.decode(), Lucene.count_tokens(), lucene boosts, Sql.database.set()
Franklin Schmidt <fschmidt@gmail.com>
parents:
1337
diff
changeset
|
55 obj = options.remove("fetch_size"); |
a015a0b5c388
add Html.decode(), Lucene.count_tokens(), lucene boosts, Sql.database.set()
Franklin Schmidt <fschmidt@gmail.com>
parents:
1337
diff
changeset
|
56 if( obj != null ) { |
a015a0b5c388
add Html.decode(), Lucene.count_tokens(), lucene boosts, Sql.database.set()
Franklin Schmidt <fschmidt@gmail.com>
parents:
1337
diff
changeset
|
57 Integer n = Luan.asInteger(obj); |
a015a0b5c388
add Html.decode(), Lucene.count_tokens(), lucene boosts, Sql.database.set()
Franklin Schmidt <fschmidt@gmail.com>
parents:
1337
diff
changeset
|
58 if( n == null ) |
a015a0b5c388
add Html.decode(), Lucene.count_tokens(), lucene boosts, Sql.database.set()
Franklin Schmidt <fschmidt@gmail.com>
parents:
1337
diff
changeset
|
59 throw new LuanException( "parameter 'fetch_size' must be an integer" ); |
a015a0b5c388
add Html.decode(), Lucene.count_tokens(), lucene boosts, Sql.database.set()
Franklin Schmidt <fschmidt@gmail.com>
parents:
1337
diff
changeset
|
60 fetchSize = n; |
a015a0b5c388
add Html.decode(), Lucene.count_tokens(), lucene boosts, Sql.database.set()
Franklin Schmidt <fschmidt@gmail.com>
parents:
1337
diff
changeset
|
61 } |
a015a0b5c388
add Html.decode(), Lucene.count_tokens(), lucene boosts, Sql.database.set()
Franklin Schmidt <fschmidt@gmail.com>
parents:
1337
diff
changeset
|
62 if( !options.isEmpty() ) |
a015a0b5c388
add Html.decode(), Lucene.count_tokens(), lucene boosts, Sql.database.set()
Franklin Schmidt <fschmidt@gmail.com>
parents:
1337
diff
changeset
|
63 throw new LuanException( "unrecognized parameters: "+options ); |
1267 | 64 } |
65 | |
66 private static String getString(Map spec,String key) throws LuanException { | |
67 Object val = spec.remove(key); | |
68 if( val==null ) | |
69 throw new LuanException( "parameter '"+key+"' is required" ); | |
70 if( !(val instanceof String) ) | |
71 throw new LuanException( "parameter '"+key+"' must be a string" ); | |
72 return (String)val; | |
73 } | |
74 | |
1341
a015a0b5c388
add Html.decode(), Lucene.count_tokens(), lucene boosts, Sql.database.set()
Franklin Schmidt <fschmidt@gmail.com>
parents:
1337
diff
changeset
|
75 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
|
76 if( fetchSize > 0 ) |
a015a0b5c388
add Html.decode(), Lucene.count_tokens(), lucene boosts, Sql.database.set()
Franklin Schmidt <fschmidt@gmail.com>
parents:
1337
diff
changeset
|
77 stmt.setFetchSize(fetchSize); |
a015a0b5c388
add Html.decode(), Lucene.count_tokens(), lucene boosts, Sql.database.set()
Franklin Schmidt <fschmidt@gmail.com>
parents:
1337
diff
changeset
|
78 } |
a015a0b5c388
add Html.decode(), Lucene.count_tokens(), lucene boosts, Sql.database.set()
Franklin Schmidt <fschmidt@gmail.com>
parents:
1337
diff
changeset
|
79 |
1267 | 80 private PreparedStatement prepareStatement(String sql,Object[] args) throws SQLException { |
81 PreparedStatement pstmt = pstmts.get(sql); | |
82 if( pstmt==null ) { | |
83 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
|
84 fix(pstmt); |
1267 | 85 pstmts.put(sql,pstmt); |
86 } | |
87 for( int i=0; i<args.length; i++ ) { | |
88 pstmt.setObject(i+1,args[i]); | |
89 } | |
90 return pstmt; | |
91 } | |
92 | |
93 public ResultSet query(String sql,Object... args) throws SQLException { | |
94 if( args.length == 0 ) { | |
95 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
|
96 fix(stmt); |
1267 | 97 return stmt.executeQuery(sql); |
98 } else { | |
99 PreparedStatement pstmt = prepareStatement(sql,args); | |
100 return pstmt.executeQuery(); | |
101 } | |
102 } | |
103 | |
104 public int update(String sql,Object... args) throws SQLException { | |
105 if( args.length == 0 ) { | |
106 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
|
107 fix(stmt); |
1267 | 108 int n = stmt.executeUpdate(sql); |
109 stmt.close(); | |
110 return n; | |
111 } else { | |
112 PreparedStatement pstmt = prepareStatement(sql,args); | |
113 return pstmt.executeUpdate(); | |
114 } | |
115 } | |
116 | |
117 } |