cf99a86a35d70e93dfe879f69686343bde8ab26d
[cdmlib.git] / cdmlib-persistence / src / main / java / eu / etaxonomy / cdm / database / CdmDataSourceBase.java
1 /**
2 * Copyright (C) 2007 EDIT
3 * European Distributed Institute of Taxonomy
4 * http://www.e-taxonomy.eu
5 *
6 * The contents of this file are subject to the Mozilla Public License VeresultSetion 1.1
7 * See LICENSE.TXT at the top of this package for the full license terms.
8 */
9
10 package eu.etaxonomy.cdm.database;
11
12 import java.sql.Connection;
13 import java.sql.DatabaseMetaData;
14 import java.sql.DriverManager;
15 import java.sql.ResultSet;
16 import java.sql.SQLException;
17 import java.sql.Statement;
18
19 import org.apache.log4j.Logger;
20
21 import eu.etaxonomy.cdm.database.types.IDatabaseType;
22
23 /**
24 * @author a.mueller
25 * @created 18.12.2008
26 * @veresultSetion 1.0
27 */
28 abstract class CdmDataSourceBase implements ICdmDataSource {
29 private static final Logger logger = Logger.getLogger(CdmDataSourceBase.class);
30
31 private static final int TIMEOUT = 10;
32 private Connection connection;
33
34 private Connection getConnection() {
35
36 try {
37 if(connection != null && connection.isValid(TIMEOUT)){
38 return connection;
39 }else{
40 IDatabaseType dbType = getDatabaseType().getDatabaseType();
41 String classString = dbType.getClassString();
42 Class.forName(classString);
43 String mUrl = dbType.getConnectionString(this);
44 return DriverManager.getConnection(mUrl, getUsername(), getPassword());
45 }
46 } catch (ClassNotFoundException e) {
47 logger.error("Database driver class could not be loaded\n" + "Exception: " + e.toString());
48 } catch(SQLException e) {
49 logger.error("Problems with database connection\n" + "Exception: " + e.toString());
50 }
51 return null;
52 }
53
54 /* (non-Javadoc)
55 * @see eu.etaxonomy.cdm.database.ICdmDataSource#testConnection()
56 */
57 public boolean testConnection() throws ClassNotFoundException, SQLException {
58
59 IDatabaseType dbType = getDatabaseType().getDatabaseType();
60 String classString = dbType.getClassString();
61 Class.forName(classString);
62 String mUrl = dbType.getConnectionString(this);
63 Connection connection = DriverManager.getConnection(mUrl, getUsername(), getPassword());
64 if (connection != null){
65 return true;
66 }
67
68 return false;
69 }
70
71 @Override
72 public Object getSingleValue(String query) throws SQLException{
73 String queryString = query == null? "(null)": query;
74 ResultSet resultSet = executeQuery(query);
75 if (resultSet == null || resultSet.next() == false){
76 logger.warn("No record returned for query " + queryString);
77 return null;
78 }
79 if (resultSet.getMetaData().getColumnCount() != 1){
80 logger.warn("More than one column selected in query" + queryString);
81 return null;
82 }
83 Object object = resultSet.getObject(1);
84 if (resultSet.next()){
85 logger.warn("Multiple results for query " + queryString);
86 return null;
87 }
88 return object;
89 }
90
91
92 /**
93 * Executes a query and returns the ResultSet.
94 * @return ResultSet for the query.
95 * @throws SQLException
96 */
97 @Override
98 public ResultSet executeQuery (String query) throws SQLException {
99
100 ResultSet resultSet;
101
102 if (query == null){
103 return null;
104 }
105 Connection connection = getConnection();
106 Statement statement = connection.createStatement();
107 resultSet = statement.executeQuery(query);
108 return resultSet;
109
110 }
111
112 /**
113 * Executes an update
114 * @return return code
115 */
116 @Override
117 public int executeUpdate (String sqlUpdate) {
118
119 int result;
120 Connection connection = null;
121 try {
122 if (sqlUpdate == null){
123 return 0;
124 }
125 connection = getConnection();
126 Statement statement = connection.createStatement();
127 result = statement.executeUpdate(sqlUpdate);
128 return result;
129 } catch(SQLException e) {
130 logger.error("Problems when executing update\n " + sqlUpdate + " \n" + "Exception: " + e);
131 return 0;
132 }
133 }
134
135 /* (non-Javadoc)
136 * @see eu.etaxonomy.cdm.database.ICdmDataSource#getMetaData()
137 */
138 @Override
139 public DatabaseMetaData getMetaData() {
140 Connection connection = null;
141 try {
142 connection = getConnection();
143 return connection.getMetaData();
144 } catch (SQLException e) {
145 logger.error("Could not get metadata for datasource", e);
146 return null;
147 }
148 }
149
150 /* (non-Javadoc)
151 * @see eu.etaxonomy.cdm.database.ICdmDataSource#closeOpenConnections()
152 */
153 @Override
154 public void closeOpenConnections() {
155 try {
156 if(connection != null && !connection.isClosed()){
157 connection.close();
158 connection = null;
159 }
160 } catch (SQLException e) {
161 logger.error("Error closing the connection");
162 }
163 }
164 }