1   package ch.qos.logback.access.db;
2   
3   import java.sql.Connection;
4   import java.sql.DriverManager;
5   import java.sql.SQLException;
6   import java.sql.Statement;
7   
8   import org.hsqldb.Server;
9   
10  public class DBAppenderTestFixture  {
11  
12    public static final String DRIVER_CLASS = "org.hsqldb.jdbcDriver";
13    String serverProps;
14    String url;
15    String user = "sa";
16    String password = "";
17    Server server;
18    boolean isNetwork = true;
19  
20  
21    void setUp() throws SQLException {
22      if (isNetwork) {
23        if (url == null) {
24          url = "jdbc:hsqldb:hsql://localhost/test";
25        }
26  
27        server = new Server();
28  
29        server.setDatabaseName(0, "test");
30        server.setDatabasePath(0, "mem:test;sql.enforce_strict_size=true");
31        server.setLogWriter(null);
32        server.setErrWriter(null);
33        server.setTrace(false);
34        server.setSilent(true);
35        server.start();
36      } else {
37        if (url == null) {
38          url = "jdbc:hsqldb:file:test;sql.enforce_strict_size=true";
39        }
40      }
41  
42      try {
43        Class.forName(DRIVER_CLASS);
44      } catch (Exception e) {
45        e.printStackTrace();
46        System.out.println(this + ".setUp() error: " + e.getMessage());
47      }
48      Thread.yield();
49      
50      createTables();
51    }
52  
53    void tearDown() throws SQLException {
54      dropTables();
55      if (isNetwork) {
56        server.stop();
57        server = null;
58      }
59    }
60  
61    Connection newConnection() throws SQLException {
62      return DriverManager.getConnection(url, user, password);
63    }
64  
65    private void createTables() throws SQLException {
66      Connection conn = newConnection();
67      StringBuffer buf = new StringBuffer();
68      buf.append("CREATE TABLE access_event (");
69      buf.append("timestmp BIGINT NOT NULL,");
70      buf.append("requestURI VARCHAR(254),");
71      buf.append("requestURL VARCHAR(254),");
72      buf.append("remoteHost VARCHAR(254),");
73      buf.append("remoteUser VARCHAR(254),");
74      buf.append("remoteAddr VARCHAR(254),");
75      buf.append("protocol VARCHAR(254),");
76      buf.append("method VARCHAR(254),");
77      buf.append("serverName VARCHAR(254),");
78      buf.append("postContent VARCHAR(254),");
79      buf.append("event_id INT NOT NULL IDENTITY);");
80      query(conn, buf.toString());
81  
82      buf = new StringBuffer();
83      buf.append("CREATE TABLE access_event_header (");
84      buf.append("event_id INT NOT NULL,");
85      buf.append("header_key  VARCHAR(254) NOT NULL,");
86      buf.append("header_value LONGVARCHAR,");
87      buf.append("PRIMARY KEY(event_id, header_key),");
88      buf.append("FOREIGN KEY (event_id) REFERENCES access_event(event_id));");
89      query(conn, buf.toString());
90    }
91  
92    private  void dropTables() throws SQLException {
93      Connection conn = newConnection();
94      
95      StringBuffer buf = new StringBuffer();
96      buf.append("DROP TABLE access_event_header IF EXISTS;");
97      query(conn, buf.toString());
98      
99      buf = new StringBuffer();
100     buf.append("DROP TABLE access_event IF EXISTS;");
101     query(conn, buf.toString());
102   }
103 
104   private  void query(Connection conn, String expression) throws SQLException {
105     Statement st = null;
106     st = conn.createStatement();
107 
108     int i = st.executeUpdate(expression);
109     if (i == -1) {
110       System.out.println("db error : " + expression);
111     }
112 
113     st.close();
114   }
115 }