1387
|
1 package luan.modules.lucene;
|
|
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.SQLException;
|
|
8 import java.util.Properties;
|
|
9 import luan.LuanTable;
|
|
10 import luan.LuanException;
|
|
11 import luan.modules.parsers.LuanToString;
|
|
12 import luan.lib.logging.Logger;
|
|
13 import luan.lib.logging.LoggerFactory;
|
|
14
|
|
15
|
|
16 final class PostgresBackup {
|
|
17 private static final Logger logger = LoggerFactory.getLogger(PostgresBackup.class);
|
|
18
|
|
19 static PostgresBackup newInstance() {
|
|
20 try {
|
|
21 return new PostgresBackup();
|
|
22 } catch(ClassNotFoundException e) {
|
|
23 logger.error("creation failed",e);
|
|
24 return null;
|
|
25 } catch(SQLException e) {
|
|
26 logger.error("creation failed",e);
|
|
27 return null;
|
|
28 }
|
|
29 }
|
|
30
|
|
31 final boolean wasCreated;
|
|
32 private final Connection con;
|
|
33 private final PreparedStatement insertStmt;
|
|
34 private final PreparedStatement updateStmt;
|
|
35 private final PreparedStatement deleteStmt;
|
|
36 private int trans = 0;
|
|
37
|
|
38 private PostgresBackup()
|
|
39 throws ClassNotFoundException, SQLException
|
|
40 {
|
|
41 Class.forName("org.postgresql.Driver");
|
|
42
|
|
43 String url = "jdbc:postgresql://localhost:5432/luan";
|
|
44 Properties props = new Properties();
|
|
45 props.setProperty("user","postgres");
|
|
46 props.setProperty("password","");
|
|
47
|
|
48 con = DriverManager.getConnection(url,props);
|
|
49
|
|
50 Statement stmt = con.createStatement();
|
|
51 boolean hasTable = stmt.executeQuery(
|
|
52 "select * from information_schema.tables where table_name='lucene'"
|
|
53 ).next();
|
|
54 if( !hasTable ) {
|
|
55 stmt.executeUpdate(
|
|
56 "create table lucene ("
|
|
57 +" id integer not null primary key,"
|
|
58 +" data text not null"
|
|
59 +")"
|
|
60 );
|
|
61 }
|
|
62 stmt.close();
|
|
63 wasCreated = !hasTable;
|
|
64
|
|
65 insertStmt = con.prepareStatement(
|
|
66 "insert into lucene (id,data) values (?,?)"
|
|
67 );
|
|
68 updateStmt = con.prepareStatement(
|
|
69 "update lucene set data=? where id=?"
|
|
70 );
|
|
71 deleteStmt = con.prepareStatement(
|
|
72 "delete from lucene where id=?"
|
|
73 );
|
|
74 }
|
|
75
|
|
76 void close() {
|
|
77 try {
|
|
78 insertStmt.close();
|
|
79 updateStmt.close();
|
|
80 deleteStmt.close();
|
|
81 con.close();
|
|
82 } catch(SQLException e) {
|
|
83 logger.error("close failed",e);
|
|
84 }
|
|
85 }
|
|
86
|
|
87 protected void finalize() throws Throwable {
|
|
88 super.finalize();
|
|
89 if( !con.isClosed() ) {
|
|
90 logger.error("con not closed");
|
|
91 con.close();
|
|
92 }
|
|
93 }
|
|
94
|
|
95 void add(long id,LuanTable doc) throws LuanException {
|
|
96 try {
|
|
97 //logger.info("getAutoCommit="+con.getAutoCommit());
|
|
98 String data = LuanToString.toString(doc,true);
|
|
99 insertStmt.setLong(1,id);
|
|
100 insertStmt.setString(2,data);
|
|
101 insertStmt.executeUpdate();
|
|
102 } catch(SQLException e) {
|
|
103 logger.error("add failed",e);
|
|
104 }
|
|
105 }
|
|
106
|
|
107 void update(long id,LuanTable doc) throws LuanException {
|
|
108 try {
|
|
109 String data = LuanToString.toString(doc,true);
|
|
110 updateStmt.setString(1,data);
|
|
111 updateStmt.setLong(2,id);
|
|
112 int n = updateStmt.executeUpdate();
|
|
113 if( n==0 ) {
|
|
114 logger.error("update not found for id="+id+", trying add");
|
|
115 add(id,doc);
|
|
116 } else if( n!=1 )
|
|
117 throw new RuntimeException();
|
|
118 } catch(SQLException e) {
|
|
119 logger.error("update failed",e);
|
|
120 }
|
|
121 }
|
|
122
|
|
123 void deleteAll() {
|
|
124 try {
|
|
125 Statement stmt = con.createStatement();
|
|
126 stmt.executeUpdate("delete from lucene");
|
|
127 stmt.close();
|
|
128 } catch(SQLException e) {
|
|
129 logger.error("update failed",e);
|
|
130 }
|
|
131 }
|
|
132
|
|
133 void delete(long id) {
|
|
134 try {
|
|
135 deleteStmt.setLong(1,id);
|
|
136 int n = deleteStmt.executeUpdate();
|
|
137 if( n==0 ) {
|
|
138 logger.error("delete not found for id="+id);
|
|
139 }
|
|
140 } catch(SQLException e) {
|
|
141 logger.error("update failed",e);
|
|
142 }
|
|
143 }
|
|
144
|
|
145 void begin() {
|
|
146 try {
|
|
147 if( trans++ == 0 )
|
|
148 con.setAutoCommit(false);
|
|
149 } catch(SQLException e) {
|
|
150 logger.error("begin failed",e);
|
|
151 }
|
|
152 }
|
|
153
|
|
154 void commit() {
|
|
155 try {
|
|
156 if( trans <= 0 ) {
|
|
157 logger.error("commit not in transaction");
|
|
158 return;
|
|
159 }
|
|
160 if( --trans == 0 )
|
|
161 con.setAutoCommit(true);
|
|
162 } catch(SQLException e) {
|
|
163 logger.error("begin failed",e);
|
|
164 }
|
|
165 }
|
|
166
|
|
167 void rollback() {
|
|
168 try {
|
|
169 if( --trans != 0 ) {
|
|
170 logger.error("rollback failed trans="+trans);
|
|
171 return;
|
|
172 }
|
|
173 con.rollback();
|
|
174 con.setAutoCommit(true);
|
|
175 } catch(SQLException e) {
|
|
176 logger.error("begin failed",e);
|
|
177 }
|
|
178 }
|
|
179
|
|
180 }
|