Statistics
| Revision:

root / trunk / libraries / libGDBMS / src / main / java / com / hardcode / gdbms / driver / odbc / ODBCDriver.java @ 10627

History | View | Annotate | Download (8.91 KB)

1
/*
2
 * Created on 16-oct-2004
3
 */
4
package com.hardcode.gdbms.driver.odbc;
5

    
6
import com.hardcode.gdbms.driver.exceptions.ReadDriverException;
7
import com.hardcode.gdbms.engine.data.DataSourceFactory;
8
import com.hardcode.gdbms.engine.data.db.JDBCSupport;
9
import com.hardcode.gdbms.engine.data.driver.AlphanumericDBDriver;
10
import com.hardcode.gdbms.engine.data.driver.DriverException;
11
import com.hardcode.gdbms.engine.values.Value;
12
import com.hardcode.gdbms.engine.values.ValueWriter;
13
import com.iver.cit.gvsig.fmap.drivers.FieldDescription;
14
import com.iver.cit.gvsig.fmap.drivers.ITableDefinition;
15
import com.iver.cit.gvsig.fmap.drivers.TableDefinition;
16
import com.iver.cit.gvsig.fmap.edition.IWriteable;
17
import com.iver.cit.gvsig.fmap.edition.IWriter;
18
import com.iver.cit.gvsig.fmap.edition.writers.JdbcWriter;
19
import com.iver.utiles.NumberUtilities;
20

    
21
import java.sql.Connection;
22
import java.sql.Date;
23
import java.sql.DriverManager;
24
import java.sql.ResultSet;
25
import java.sql.SQLException;
26
import java.sql.Statement;
27
import java.sql.Time;
28
import java.sql.Timestamp;
29

    
30
import java.text.DateFormat;
31
import java.text.SimpleDateFormat;
32

    
33
import java.util.HashMap;
34

    
35

    
36
/**
37
 * MySQL driver
38
 *
39
 * @author Fernando Gonz?lez Cort?s
40
 */
41
public class ODBCDriver implements AlphanumericDBDriver, IWriteable {
42
    private static Exception driverException;
43
    private static DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
44
    private static DateFormat timeFormat = new SimpleDateFormat(
45
            "yyyy-MM-dd HH:mm:ss");
46
    private static ValueWriter vWriter = ValueWriter.internalValueWriter;
47

    
48
    static {
49
        try {
50
            Class.forName("sun.jdbc.odbc.JdbcOdbcDriver").newInstance();
51
        } catch (Exception ex) {
52
            driverException = ex;
53
        }
54
    }
55

    
56
    private JDBCSupport jdbcSupport;
57
    private JdbcWriter jdbcWriter = new JdbcWriter();
58

    
59
    /**
60
     * DOCUMENT ME!
61
     *
62
     * @param host DOCUMENT ME!
63
     * @param port DOCUMENT ME!
64
     * @param dbName DOCUMENT ME!
65
     * @param user DOCUMENT ME!
66
     * @param password DOCUMENT ME!
67
     *
68
     * @return DOCUMENT ME!
69
     *
70
     * @throws SQLException
71
     * @throws RuntimeException DOCUMENT ME!
72
     *
73
     * @see com.hardcode.gdbms.engine.data.driver.DBDriver#connect(java.lang.String)
74
     */
75
    public Connection getConnection(String host, int port, String dbName,
76
        String user, String password) throws SQLException {
77
        if (driverException != null) {
78
            throw new RuntimeException(driverException);
79
        }
80

    
81
        String connectionString = "jdbc:odbc:" + dbName;
82

    
83
        if (user != null) {
84
            connectionString += (";UID=" + user + ";PWD=" + password);
85
        }
86

    
87
        return DriverManager.getConnection(connectionString);
88
    }
89

    
90
    /**
91
     * @see com.hardcode.driverManager.Driver#getName()
92
     */
93
    public String getName() {
94
        return "odbc";
95
    }
96

    
97
    /**
98
     * @see com.hardcode.gdbms.engine.data.driver.DBDriver#executeSQL(java.sql.Connection,
99
     *      java.lang.String)
100
     */
101
    public void open(Connection con, String sql) throws SQLException {
102
        jdbcSupport = JDBCSupport.newJDBCSupport(con, sql);
103

    
104
        jdbcWriter.setCreateTable(false);
105
        jdbcWriter.setWriteAll(false);
106
        Statement st = con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,
107
                ResultSet.CONCUR_UPDATABLE);
108
        ResultSet res = st.executeQuery(sql);
109

    
110
        jdbcWriter.initialize(con, res);
111

    
112
    }
113

    
114
    /**
115
     * DOCUMENT ME!
116
     *
117
     * @return DOCUMENT ME!
118
     */
119
    public int getFieldCount() throws ReadDriverException {
120
        return jdbcSupport.getFieldCount();
121
    }
122

    
123
    /**
124
     * DOCUMENT ME!
125
     *
126
     * @param fieldId DOCUMENT ME!
127
     *
128
     * @return DOCUMENT ME!
129
     */
130
    public String getFieldName(int fieldId) throws ReadDriverException {
131
        return jdbcSupport.getFieldName(fieldId);
132
    }
133

    
134
    /**
135
     * DOCUMENT ME!
136
     *
137
     * @param i DOCUMENT ME!
138
     *
139
     * @return DOCUMENT ME!
140
     */
141
    public int getFieldType(int i) throws ReadDriverException {
142
        return jdbcSupport.getFieldType(i);
143
    }
144

    
145
    /**
146
     * DOCUMENT ME!
147
     *
148
     * @param rowIndex DOCUMENT ME!
149
     * @param fieldId DOCUMENT ME!
150
     *
151
     * @return DOCUMENT ME!
152
     */
153
    public Value getFieldValue(long rowIndex, int fieldId)
154
        throws ReadDriverException {
155
        return jdbcSupport.getFieldValue(rowIndex, fieldId);
156
    }
157

    
158
    /**
159
     * DOCUMENT ME!
160
     *
161
     * @return DOCUMENT ME!
162
     */
163
    public long getRowCount() throws ReadDriverException {
164
        return jdbcSupport.getRowCount();
165
    }
166

    
167
    /**
168
     * @see com.hardcode.gdbms.engine.data.driver.DBDriver#close()
169
     */
170
    public void close() throws SQLException {
171
        jdbcSupport.close();
172
    }
173

    
174
    /**
175
     * @see com.hardcode.gdbms.engine.data.driver.DriverCommons#getDriverProperties()
176
     */
177
    public HashMap getDriverProperties() {
178
        return null;
179
    }
180

    
181
    /**
182
     * @see com.hardcode.gdbms.engine.data.driver.DriverCommons#setDataSourceFactory(com.hardcode.gdbms.engine.data.DataSourceFactory)
183
     */
184
    public void setDataSourceFactory(DataSourceFactory dsf) {
185
    }
186

    
187
    /**
188
     * @see com.hardcode.gdbms.engine.data.driver.DBDriver#execute(java.sql.Connection,
189
     *      java.lang.String, com.hardcode.gdbms.engine.data.HasProperties)
190
     */
191
    public void execute(Connection con, String sql) throws SQLException {
192
        JDBCSupport.execute(con, sql);
193
    }
194

    
195
    /**
196
     * @see com.hardcode.gdbms.engine.data.driver.DBDriver#getInternalTableName(java.lang.String)
197
     */
198
    public String getInternalTableName(String tableName) {
199
        return tableName;
200
    }
201

    
202
    /**
203
     * @see com.hardcode.gdbms.engine.data.driver.DBDriver#getStatementString(long)
204
     */
205
    public String getStatementString(long i) {
206
        return vWriter.getStatementString(i);
207
    }
208

    
209
    /**
210
     * @see com.hardcode.gdbms.engine.data.driver.DBDriver#getStatementString(int,
211
     *      int)
212
     */
213
    public String getStatementString(int i, int sqlType) {
214
        return vWriter.getStatementString(i, sqlType);
215
    }
216

    
217
    /**
218
     * @see com.hardcode.gdbms.engine.data.driver.DBDriver#getStatementString(double,
219
     *      int)
220
     */
221
    public String getStatementString(double d, int sqlType) {
222
        return vWriter.getStatementString(d, sqlType);
223
    }
224

    
225
    /**
226
     * @see com.hardcode.gdbms.engine.data.driver.DBDriver#getStatementString(java.lang.String,
227
     *      int)
228
     */
229
    public String getStatementString(String str, int sqlType) {
230
        return vWriter.getStatementString(str, sqlType);
231
    }
232

    
233
    /**
234
     * @see com.hardcode.gdbms.engine.data.driver.DBDriver#getStatementString(java.sql.Date)
235
     */
236
    public String getStatementString(Date d) {
237
        return dateFormat.format(d);
238
    }
239

    
240
    /**
241
     * @see com.hardcode.gdbms.engine.data.driver.DBDriver#getStatementString(java.sql.Time)
242
     */
243
    public String getStatementString(Time t) {
244
        return timeFormat.format(t);
245
    }
246

    
247
    /**
248
     * @see com.hardcode.gdbms.engine.data.driver.DBDriver#getStatementString(java.sql.Timestamp)
249
     */
250
    public String getStatementString(Timestamp ts) {
251
        return timeFormat.format(ts);
252
    }
253

    
254
    /**
255
     * @see com.hardcode.gdbms.engine.data.driver.DBDriver#getStatementString(byte[])
256
     */
257
    public String getStatementString(byte[] binary) {
258
        return "x" + vWriter.getStatementString(binary);
259
    }
260

    
261
    /**
262
     * @see com.hardcode.gdbms.engine.data.driver.DBDriver#getStatementString(boolean)
263
     */
264
    public String getStatementString(boolean b) {
265
        return vWriter.getStatementString(b);
266
    }
267

    
268
    /**
269
     * @see com.hardcode.gdbms.engine.values.ValueWriter#getNullStatementString()
270
     */
271
    public String getNullStatementString() {
272
        return "null";
273
    }
274
        public int getFieldWidth(int i) throws ReadDriverException {
275
                return jdbcSupport.getFieldWidth(i);
276
        }
277

    
278
        public IWriter getWriter() {
279
                return jdbcWriter;
280
        }
281

    
282
        public ITableDefinition getTableDefinition() throws ReadDriverException {
283
                TableDefinition tableDef = new TableDefinition();
284
                tableDef.setFieldsDesc(getFieldsDescription());
285
                return tableDef;
286
        }
287

    
288
        /*azabala
289
        TODO Codigo repetido entre ODBCDriver y AbstractJDBCDriver.
290
        Igual hay que ponerlo en una clase auxiliar comun
291
        *
292
        */
293
        private FieldDescription[] getFieldsDescription() throws ReadDriverException{
294
                int numFields = getFieldCount();
295
                FieldDescription[] fieldsDescrip = new FieldDescription[numFields];
296
                for (int i = 0; i < numFields; i++) {
297
                        fieldsDescrip[i] = new FieldDescription();
298
                        int type = getFieldType(i);
299
                        fieldsDescrip[i].setFieldType(type);
300
                        fieldsDescrip[i].setFieldName(getFieldName(i));
301
                        fieldsDescrip[i].setFieldLength(getFieldWidth(i));
302
                        if (NumberUtilities.isNumeric(type))
303
                        {
304
                                if (!NumberUtilities.isNumericInteger(type))
305
                                        // TODO: If there is a lost in precision, this should be changed.
306
                                        fieldsDescrip[i].setFieldDecimalCount(6);
307
                        }
308
                        else
309
                                fieldsDescrip[i].setFieldDecimalCount(0);
310
                        // TODO: ?DEFAULTVALUE?
311
                        // fieldsDescrip[i].setDefaultValue(get)
312
                }
313
                return fieldsDescrip;
314
        }
315
}