2 * Copyright (C) 2011 Openismus GmbH
4 * This file is part of GWT-Glom.
6 * GWT-Glom is free software: you can redistribute it and/or modify it
7 * under the terms of the GNU Lesser General Public License as published by the
8 * Free Software Foundation, either version 3 of the License, or (at your
9 * option) any later version.
11 * GWT-Glom is distributed in the hope that it will be useful, but WITHOUT
12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
16 * You should have received a copy of the GNU Lesser General Public License
17 * along with GWT-Glom. If not, see <http://www.gnu.org/licenses/>.
20 package org.glom.web.server.database;
22 import java.sql.Connection;
23 import java.sql.ResultSet;
24 import java.sql.SQLException;
25 import java.sql.Statement;
26 import java.util.ArrayList;
28 import org.glom.libglom.Document;
29 import org.glom.libglom.Field;
30 import org.glom.libglom.Glom;
31 import org.glom.libglom.LayoutFieldVector;
32 import org.glom.libglom.SqlBuilder;
33 import org.glom.libglom.Value;
34 import org.glom.web.server.Log;
35 import org.glom.web.server.Utils;
36 import org.glom.web.shared.DataItem;
37 import org.glom.web.shared.TypedDataItem;
39 import com.mchange.v2.c3p0.ComboPooledDataSource;
42 * @author Ben Konrath <ben@bagu.org>
45 public class DetailsDBAccess extends DBAccess {
47 public DetailsDBAccess(Document document, String documentID, ComboPooledDataSource cpds, String tableName) {
48 super(document, documentID, cpds, tableName);
49 this.tableName = tableName;
52 public DataItem[] getData(TypedDataItem primaryKeyValue) {
54 LayoutFieldVector fieldsToGet = getFieldsToShowForSQLQuery(document
55 .get_data_layout_groups("details", tableName));
57 if (fieldsToGet == null || fieldsToGet.size() <= 0) {
58 Log.warn(documentID, tableName, "Didn't find any fields to show. Returning null.");
62 Field primaryKey = getPrimaryKeyField();
64 if (primaryKey == null) {
65 Log.error(documentID, tableName, "Couldn't find primary key in table. Returning null.");
69 ArrayList<DataItem[]> rowsList = new ArrayList<DataItem[]>();
70 Connection conn = null;
73 Value gdaPrimaryKeyValue = null;
75 // Setup the JDBC driver and get the query.
76 conn = cpds.getConnection();
77 st = conn.createStatement(ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY);
79 gdaPrimaryKeyValue = Utils.getGlomTypeGdaValueForTypedDataItem(documentID, tableName,
80 primaryKey.get_glom_type(), primaryKeyValue);
82 // Only create the query if we've created a Gda Value from the TypedDataItem.
83 if (gdaPrimaryKeyValue != null) {
85 SqlBuilder builder = Glom.build_sql_select_with_key(tableName, fieldsToGet, primaryKey,
87 String query = Glom.sqlbuilder_get_full_query(builder);
89 rs = st.executeQuery(query);
91 // get the results from the ResultSet
92 // using 2 as a length parameter so we can log a warning if appropriate
93 rowsList = convertResultSetToDTO(2, fieldsToGet, rs);
96 } catch (SQLException e) {
97 Log.error(documentID, tableName, "Error executing database query.", e);
98 // TODO: somehow notify user of problem
101 // cleanup everything that has been used
109 } catch (Exception e) {
110 Log.error(documentID, tableName,
111 "Error closing database resources. Subsequent database queries may not work.", e);
115 if (rowsList.size() == 0) {
116 Log.error(documentID, tableName, "The query returned an empty ResultSet. Returning null.");
118 } else if (rowsList.size() > 1 && !gdaPrimaryKeyValue.is_null()) {
119 // Only log a warning if the result size is greater than 1 and the gdaPrimaryKeyValue is not null. When
120 // gdaPrimaryKeyValue.is_null() is true, the default query for the details view is being executed so we
121 // expect a result set that is larger than one.
122 Log.warn(documentID, tableName,
123 "The query did not return the expected unique result. Returning the first result in the set.");
126 return rowsList.get(0);