Statistics
| Revision:

svn-gvsig-desktop / tags / v1_0_2_RELEASE / libraries / libGDBMS / src / main / java / com / hardcode / gdbms / engine / data / driver / AbstractJDBCDriver.java @ 11432

History | View | Annotate | Download (8.77 KB)

1 5690 fjp
/* gvSIG. Sistema de Informaci?n Geogr?fica de la Generalitat Valenciana
2
 *
3
 * Copyright (C) 2004 IVER T.I. and Generalitat Valenciana.
4
 *
5
 * This program is free software; you can redistribute it and/or
6
 * modify it under the terms of the GNU General Public License
7
 * as published by the Free Software Foundation; either version 2
8
 * of the License, or (at your option) any later version.
9
 *
10
 * This program is distributed in the hope that it will be useful,
11
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13
 * GNU General Public License for more details.
14
 *
15
 * You should have received a copy of the GNU General Public License
16
 * along with this program; if not, write to the Free Software
17
 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307,USA.
18
 *
19
 * For more information, contact:
20
 *
21
 *  Generalitat Valenciana
22
 *   Conselleria d'Infraestructures i Transport
23
 *   Av. Blasco Ib??ez, 50
24
 *   46010 VALENCIA
25
 *   SPAIN
26
 *
27
 *      +34 963862235
28
 *   gvsig@gva.es
29
 *      www.gvsig.gva.es
30
 *
31
 *    or
32
 *
33
 *   IVER T.I. S.A
34
 *   Salamanca 50
35
 *   46005 Valencia
36
 *   Spain
37
 *
38
 *   +34 963163400
39
 *   dac@iver.es
40
 */
41
package com.hardcode.gdbms.engine.data.driver;
42
43
import java.sql.Connection;
44
import java.sql.Date;
45
import java.sql.ResultSet;
46
import java.sql.SQLException;
47
import java.sql.Statement;
48
import java.sql.Time;
49
import java.sql.Timestamp;
50
import java.text.DateFormat;
51
import java.text.SimpleDateFormat;
52
import java.util.HashMap;
53
54
import com.hardcode.gdbms.engine.data.DataSourceFactory;
55
import com.hardcode.gdbms.engine.data.db.JDBCSupport;
56
import com.hardcode.gdbms.engine.values.Value;
57
import com.hardcode.gdbms.engine.values.ValueWriter;
58 9887 fjp
import com.iver.cit.gvsig.fmap.drivers.FieldDescription;
59
import com.iver.cit.gvsig.fmap.drivers.ITableDefinition;
60
import com.iver.cit.gvsig.fmap.drivers.TableDefinition;
61 5690 fjp
import com.iver.cit.gvsig.fmap.edition.IWriteable;
62
import com.iver.cit.gvsig.fmap.edition.IWriter;
63
import com.iver.cit.gvsig.fmap.edition.writers.JdbcWriter;
64 9887 fjp
import com.iver.utiles.NumberUtilities;
65 5690 fjp
66 5700 fjp
public abstract class AbstractJDBCDriver implements AlphanumericDBDriver,
67
                IWriteable {
68 5690 fjp
69 5700 fjp
        protected JDBCSupport jdbcSupport;
70 5690 fjp
71 5700 fjp
        protected JdbcWriter jdbcWriter = new JdbcWriter();
72 5690 fjp
73 5700 fjp
        private static DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
74 5690 fjp
75 5700 fjp
        private static DateFormat timeFormat = new SimpleDateFormat(
76
                        "yyyy-MM-dd HH:mm:ss");
77 5690 fjp
78 5700 fjp
        private ValueWriter vWriter = ValueWriter.internalValueWriter;
79 5690 fjp
80 5700 fjp
        /**
81
         * @see com.hardcode.gdbms.engine.data.driver.DBDriver#executeSQL(java.sql.Connection,
82
         *      java.lang.String)
83
         */
84
        public void open(Connection con, String sql) throws SQLException {
85
                jdbcSupport = JDBCSupport.newJDBCSupport(con, sql);
86
                Statement st = con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,
87
                                ResultSet.CONCUR_UPDATABLE);
88
                ResultSet res = st.executeQuery(sql);
89
                if (res.getConcurrency() != ResultSet.CONCUR_UPDATABLE) {
90
                        System.err.println("Error: No se puede editar la tabla " + sql);
91
                        jdbcWriter = null;
92
                } else
93 5736 fjp
                {
94 5700 fjp
                        jdbcWriter.initialize(con, res);
95 5736 fjp
                        jdbcWriter.setCreateTable(false);
96
                        jdbcWriter.setWriteAll(false);
97
                }
98 5700 fjp
        }
99 5690 fjp
100 5700 fjp
        /**
101
         * DOCUMENT ME!
102
         *
103
         * @return DOCUMENT ME!
104
         *
105
         * @throws DriverException
106
         *             DOCUMENT ME!
107
         */
108
        public int getFieldCount() throws DriverException {
109
                return jdbcSupport.getFieldCount();
110
        }
111 5690 fjp
112 5700 fjp
        /**
113
         * DOCUMENT ME!
114
         *
115
         * @param fieldId
116
         *            DOCUMENT ME!
117
         *
118
         * @return DOCUMENT ME!
119
         *
120
         * @throws DriverException
121
         *             DOCUMENT ME!
122
         */
123
        public String getFieldName(int fieldId) throws DriverException {
124
                return jdbcSupport.getFieldName(fieldId);
125
        }
126 5690 fjp
127 5700 fjp
        /**
128
         * DOCUMENT ME!
129
         *
130
         * @param i
131
         *            DOCUMENT ME!
132
         *
133
         * @return DOCUMENT ME!
134
         *
135
         * @throws DriverException
136
         *             DOCUMENT ME!
137
         */
138
        public int getFieldType(int i) throws DriverException {
139
                return jdbcSupport.getFieldType(i);
140
        }
141 5690 fjp
142 5700 fjp
        /**
143
         * DOCUMENT ME!
144
         *
145
         * @param rowIndex
146
         *            DOCUMENT ME!
147
         * @param fieldId
148
         *            DOCUMENT ME!
149
         *
150
         * @return DOCUMENT ME!
151
         *
152
         * @throws DriverException
153
         *             DOCUMENT ME!
154
         */
155
        public Value getFieldValue(long rowIndex, int fieldId)
156
                        throws DriverException {
157
                return jdbcSupport.getFieldValue(rowIndex, fieldId);
158
        }
159 5690 fjp
160 5700 fjp
        /**
161
         * DOCUMENT ME!
162
         *
163
         * @return DOCUMENT ME!
164
         *
165
         * @throws DriverException
166
         *             DOCUMENT ME!
167
         */
168
        public long getRowCount() throws DriverException {
169
                return jdbcSupport.getRowCount();
170
        }
171 5690 fjp
172 5700 fjp
        /**
173
         * @see com.hardcode.gdbms.engine.data.driver.DBDriver#close()
174
         */
175
        public void close() throws SQLException {
176
                jdbcSupport.close();
177
                jdbcWriter.close();
178
        }
179 5690 fjp
180 5700 fjp
        /**
181
         * @see com.hardcode.gdbms.engine.data.driver.DriverCommons#getDriverProperties()
182
         */
183
        public HashMap getDriverProperties() {
184
                return null;
185
        }
186 5690 fjp
187 5700 fjp
        /**
188
         * @see com.hardcode.gdbms.engine.data.driver.DriverCommons#setDataSourceFactory(com.hardcode.gdbms.engine.data.DataSourceFactory)
189
         */
190
        public void setDataSourceFactory(DataSourceFactory dsf) {
191
        }
192 5690 fjp
193 5700 fjp
        /**
194
         * @see com.hardcode.gdbms.engine.data.driver.DBDriver#execute(java.sql.Connection,
195
         *      java.lang.String, com.hardcode.gdbms.engine.data.HasProperties)
196
         */
197
        public void execute(Connection con, String sql) throws SQLException {
198
                JDBCSupport.execute(con, sql);
199
        }
200 5690 fjp
201 5700 fjp
        /**
202
         * @see com.hardcode.gdbms.engine.data.driver.DBDriver#getInternalTableName(java.lang.String)
203
         */
204
        public String getInternalTableName(String tableName) {
205
                return tableName;
206
        }
207 5690 fjp
208 5700 fjp
        /**
209
         * @see com.hardcode.gdbms.engine.data.driver.DBDriver#getStatementString(long)
210
         */
211
        public String getStatementString(long i) {
212
                return vWriter.getStatementString(i);
213
        }
214 5690 fjp
215 5700 fjp
        /**
216
         * @see com.hardcode.gdbms.engine.data.driver.DBDriver#getStatementString(int,
217
         *      int)
218
         */
219
        public String getStatementString(int i, int sqlType) {
220
                return vWriter.getStatementString(i, sqlType);
221
        }
222 5690 fjp
223 5700 fjp
        /**
224
         * @see com.hardcode.gdbms.engine.data.driver.DBDriver#getStatementString(double,
225
         *      int)
226
         */
227
        public String getStatementString(double d, int sqlType) {
228
                return vWriter.getStatementString(d, sqlType);
229
        }
230 5690 fjp
231 5700 fjp
        /**
232
         * @see com.hardcode.gdbms.engine.data.driver.DBDriver#getStatementString(java.lang.String,
233
         *      int)
234
         */
235
        public String getStatementString(String str, int sqlType) {
236
                return vWriter.getStatementString(str, sqlType);
237
        }
238 5690 fjp
239 5700 fjp
        /**
240
         * @see com.hardcode.gdbms.engine.data.driver.DBDriver#getStatementString(java.sql.Date)
241
         */
242
        public String getStatementString(Date d) {
243
                return dateFormat.format(d);
244
        }
245 5690 fjp
246 5700 fjp
        /**
247
         * @see com.hardcode.gdbms.engine.data.driver.DBDriver#getStatementString(java.sql.Time)
248
         */
249
        public String getStatementString(Time t) {
250
                return timeFormat.format(t);
251
        }
252 5690 fjp
253 5700 fjp
        /**
254
         * @see com.hardcode.gdbms.engine.data.driver.DBDriver#getStatementString(java.sql.Timestamp)
255
         */
256
        public String getStatementString(Timestamp ts) {
257
                return timeFormat.format(ts);
258
        }
259 5690 fjp
260 5700 fjp
        /**
261
         * @see com.hardcode.gdbms.engine.data.driver.DBDriver#getStatementString(byte[])
262
         */
263
        public String getStatementString(byte[] binary) {
264
                return "x" + vWriter.getStatementString(binary);
265
        }
266 5690 fjp
267 5700 fjp
        /**
268
         * @see com.hardcode.gdbms.engine.data.driver.DBDriver#getStatementString(boolean)
269
         */
270
        public String getStatementString(boolean b) {
271
                return vWriter.getStatementString(b);
272
        }
273
274
        /**
275
         * @see com.hardcode.gdbms.engine.values.ValueWriter#getNullStatementString()
276
         */
277
        public String getNullStatementString() {
278
                return "null";
279
        }
280
281 5690 fjp
        public int getFieldWidth(int i) throws DriverException {
282
                return jdbcSupport.getFieldWidth(i);
283
        }
284
285
        public IWriter getWriter() {
286
                return jdbcWriter;
287
        }
288 9887 fjp
289
        /**
290
         * Return the default tabledefinition (only
291
         * has field description values).
292
         * Each driver that inheret this class must overwrite
293
         * this.
294
         *
295
         * */
296 10051 fjp
//        public ITableDefinition getTableDefinition(){
297
//                TableDefinition tableDef = new TableDefinition();
298
//                try {
299
//                        tableDef.setFieldsDesc(getFieldsDescription());
300
//                } catch (DriverException e) {
301
//                        throw new RuntimeException(e);//excepcion sin chequear
302
//                }
303
//                return tableDef;
304
//        }
305 9887 fjp
306
307
        /*azabala
308
        TODO Copypasteado de SelectableDataSource.
309
        ?No estar?a mejor aqu??
310
        *
311
        */
312
        private FieldDescription[] getFieldsDescription() throws DriverException
313
        {
314
                int numFields = getFieldCount();
315
                FieldDescription[] fieldsDescrip = new FieldDescription[numFields];
316
                for (int i = 0; i < numFields; i++) {
317
                        fieldsDescrip[i] = new FieldDescription();
318
                        int type = getFieldType(i);
319
                        fieldsDescrip[i].setFieldType(type);
320
                        fieldsDescrip[i].setFieldName(getFieldName(i));
321
                        fieldsDescrip[i].setFieldLength(getFieldWidth(i));
322
                        if (NumberUtilities.isNumeric(type))
323
                        {
324
                                if (!NumberUtilities.isNumericInteger(type))
325
                                        // TODO: If there is a lost in precision, this should be changed.
326
                                        fieldsDescrip[i].setFieldDecimalCount(6);
327
                        }
328
                        else
329
                                fieldsDescrip[i].setFieldDecimalCount(0);
330
                        // TODO: ?DEFAULTVALUE?
331
                        // fieldsDescrip[i].setDefaultValue(get)
332
                }
333
                return fieldsDescrip;
334
        }
335 5690 fjp
}