Statistics
| Revision:

root / trunk / libraries / libGDBMS / src / main / java / com / hardcode / gdbms / driver / mysql / MySQLWriter.java @ 9835

History | View | Annotate | Download (7.36 KB)

1
/*
2
 * Created on 16-ene-2007 by azabala
3
 *
4
 */
5
package com.hardcode.gdbms.driver.mysql;
6

    
7
import java.sql.Connection;
8
import java.sql.ResultSetMetaData;
9
import java.sql.SQLException;
10
import java.sql.Statement;
11
import java.sql.Types;
12

    
13
import com.hardcode.gdbms.engine.data.InnerDBUtils;
14
import com.hardcode.gdbms.engine.data.db.DBDataSourceAdapter;
15
import com.hardcode.gdbms.engine.data.db.DBDataWare;
16
import com.hardcode.gdbms.engine.data.db.DBTableSourceInfo;
17
import com.hardcode.gdbms.engine.data.driver.DriverException;
18
import com.hardcode.gdbms.engine.values.Value;
19
import com.hardcode.gdbms.engine.values.ValueCollection;
20
import com.hardcode.gdbms.engine.values.ValueFactory;
21
import com.hardcode.gdbms.engine.values.ValueWriter;
22
import com.iver.cit.gvsig.fmap.core.IRow;
23
import com.iver.cit.gvsig.fmap.drivers.DBLayerDefinition;
24
import com.iver.cit.gvsig.fmap.drivers.FieldDescription;
25
import com.iver.cit.gvsig.fmap.drivers.ITableDefinition;
26
import com.iver.cit.gvsig.fmap.edition.EditionException;
27
import com.iver.cit.gvsig.fmap.edition.IRowEdited;
28
import com.iver.cit.gvsig.fmap.edition.fieldmanagers.JdbcFieldManager;
29
import com.iver.cit.gvsig.fmap.edition.writers.AbstractWriter;
30

    
31
/**
32
 * 
33
 * MySQL alphanumeric writer.
34
 * It is needed because MySQL JDBC driver doesnt allow updatables recordsets.
35
 * @author alzabord
36
 * 
37
 * @see MySQLSpatialWriter from extJDBC project
38
 */
39
public class MySQLWriter extends AbstractWriter{
40

    
41
        private int numRows;
42
        private Connection conn;
43
        private Statement st;
44
        private ResultSetMetaData metaData;
45
        private boolean bCreateTable;
46
        private MySQL mySql = new MySQL();
47
        private JdbcFieldManager fieldManager;
48
        private DBDataWare directDataWare;
49
        
50
        public void initialize(Connection conn){
51
                this.conn = conn;
52
        }
53
        
54
        /* (non-Javadoc)
55
         * @see com.iver.cit.gvsig.fmap.edition.IWriter#initialize(com.iver.cit.gvsig.fmap.drivers.ITableDefinition)
56
         */
57
        public void initialize(ITableDefinition tableDefinition) throws EditionException {
58
                super.initialize(tableDefinition);
59
                try {
60
                        createTableIfNeeded();
61
                } catch (SQLException e) {
62
                        throw new EditionException(e);
63
                }
64
        }
65
        
66
        
67
        private void createTableIfNeeded() throws SQLException{
68
                st = conn.createStatement();
69
                if (bCreateTable) {
70
                        try {
71
                                st.execute("DROP TABLE " + 
72
                                                ((DBLayerDefinition)tableDef).getTableName() + ";");
73
                        } catch (SQLException e1) {
74
                                e1.printStackTrace();
75
                        }
76
                        //In MySQL you can add geometry column in CREATE TABLE statement
77
                        String sqlCreate = mySql.getSqlCreateSpatialTable((DBLayerDefinition) tableDef,
78
                                                                                        tableDef.getFieldsDesc(), 
79
                                                                                        true);
80
                        st.execute(sqlCreate);
81
                        conn.commit();
82
                }//if
83
                conn.setAutoCommit(false);
84
                fieldManager = new JdbcFieldManager(conn, 
85
                                ((DBLayerDefinition) tableDef).getTableName());
86
}
87

    
88
        
89
        public boolean canWriteAttribute(int sqlType) {
90
                switch (sqlType) {
91
                case Types.DOUBLE:
92
                case Types.FLOAT:
93
                case Types.INTEGER:
94
                case Types.BIGINT:
95
                        return true;
96
                case Types.DATE:
97
                        return true;
98
                case Types.BIT:
99
                case Types.BOOLEAN:
100
                        return true;
101
                case Types.VARCHAR:
102
                case Types.CHAR:
103
                case Types.LONGVARCHAR:
104
                        return true; 
105
                }
106
                return false;
107
        }
108

    
109
        
110
        public void preProcess() throws EditionException {
111
                numRows = 0;
112
                try {
113
                        conn.setAutoCommit(false);
114
                        conn.rollback();                        
115
                        alterTable();
116
                } catch (SQLException e) {
117
                        throw new EditionException(e);
118
                }
119
        }
120

    
121
        public boolean alterTable() throws EditionException {
122
                return fieldManager.alterTable();
123
        }
124
        
125
    private ValueCollection getPKValue(Value[] rec) throws DriverException {
126
        int[] fieldsId = directDataWare.getPrimaryKeys();
127
        Value[] pks = new Value[fieldsId.length];
128

    
129
        for (int i = 0; i < pks.length; i++) {
130
            pks[i] = rec[fieldsId[i]];
131
        }
132

    
133
        return ValueFactory.createValue(pks);
134
    }
135

    
136
        
137
        public void process(IRowEdited row) throws EditionException {
138
//                String sqlInsert;
139
                try {
140
                        switch (row.getStatus()) {
141
                        case IRowEdited.STATUS_ADDED:
142
                                IRow record =  row.getLinkedRow();
143
                                directDataWare.insertFilledRow(record.getAttributes());
144
//                                sqlInsert = mySql.getSqlInsertFeature((DBLayerDefinition) tableDef, record);
145
//                                st.execute(sqlInsert);
146
                                break;
147
                                
148
                        case IRowEdited.STATUS_MODIFIED:
149
                                IRow featM =  row.getLinkedRow();
150
                                if (bWriteAll) {
151
                                        directDataWare.insertFilledRow(featM.getAttributes());
152
//                                        sqlInsert = mySql.getSqlInsertFeature((DBLayerDefinition) tableDef, featM);
153
//                                        System.out.println("sql = " + sqlInsert);
154
//                                        st.execute(sqlInsert);
155
                                } else {
156
                                    Value[] rec =row.getAttributes();
157
                                    String sql = InnerDBUtils.createUpdateStatement(((DBTableSourceInfo) directDataWare.getSourceInfo()).tableName,
158
                                                            getPKValue(rec).getValues(), directDataWare.getPKNames(),
159
                                                directDataWare.getFieldNames(), featM.getAttributes(), ((ValueWriter)directDataWare.getDriver()));
160

    
161
                                    st.execute(sql);
162
//                                        String sqlModify = mySql.getSqlModifyFeature((DBLayerDefinition) tableDef, featM);
163
//                                        st.execute(sqlModify);
164
                                }
165
                                break;
166
                                
167
                        case IRowEdited.STATUS_ORIGINAL:
168
                                IRow featO = row.getLinkedRow();
169
                                if (bWriteAll) {
170
                                        directDataWare.insertFilledRow(featO.getAttributes());
171
//                                        sqlInsert = mySql.getSqlInsertFeature((DBLayerDefinition) tableDef, featO);
172
//                                        st.execute(sqlInsert);
173
                                }
174
                                break;
175
                                
176
                        case IRowEdited.STATUS_DELETED:
177
                            Value[] rec =row.getAttributes();
178
                                String sqlDelete = InnerDBUtils.createDeleteStatement(
179
                                                getPKValue(rec).getValues(), 
180
                                            directDataWare.getPKNames(),
181
                                            ((DBTableSourceInfo) directDataWare.getSourceInfo()).tableName,
182
                                            ((ValueWriter)directDataWare.getDriver()));
183

    
184
                                st.execute(sqlDelete);
185
                                
186
//                                String sqlDelete = mySql.getSqlDeleteFeature((DBLayerDefinition) tableDef, row);
187
                                System.out.println("sql = " + sqlDelete);
188
                                st.execute(sqlDelete);
189
                                break;
190
                        }
191
                        numRows++;
192
                } catch (SQLException e) {
193
                        e.printStackTrace();
194
                        throw new EditionException(e);
195
                } catch (DriverException e) {
196
                        e.printStackTrace();
197
                        throw new EditionException(e);
198
                }
199
        }
200

    
201
        
202
        public void postProcess() throws EditionException {
203
                try {
204
                        conn.setAutoCommit(true);
205
                } catch (SQLException e) {
206
                        e.printStackTrace();
207
                        throw new EditionException(e);
208
                }
209
        }
210

    
211
        
212
        public boolean canAlterTable() {
213
                return true;
214
        }
215

    
216
        
217
        public boolean canSaveEdits() {
218
                try {
219
                        return !conn.isReadOnly();
220
                } catch (SQLException e) {
221
                        e.printStackTrace();
222
                        return false;
223
                }
224
        }
225

    
226
        public String getName() {
227
                return "MySQL Alphanumeric Writer";
228
        }
229
        
230
        public void setCreateTable(boolean createTable) {
231
                bCreateTable = createTable;
232
        }
233
        
234
        public boolean isCreateTable() {
235
                return bCreateTable;
236
        }
237

    
238
        public boolean isWriteAll() {
239
                return bWriteAll;
240
        }
241
        
242
        public void setWriteAll(boolean writeAll) {
243
                bWriteAll = writeAll;
244
        }
245
        
246
/*
247
 * TODO 
248
 * Esta parte no se si es necesaria, o si se usa (revisar)
249
 * 
250
 * */
251
        public FieldDescription[] getFields() {
252
                return fieldManager.getFields();
253
        }
254
        
255
        public FieldDescription[] getOriginalFields() {
256
                return tableDef.getFieldsDesc();
257
        }
258

    
259
        public void addField(FieldDescription fieldDesc) {
260
                fieldManager.addField(fieldDesc);
261
                
262
        }
263

    
264
        public FieldDescription removeField(String fieldName) {
265
                return fieldManager.removeField(fieldName);
266
                
267
        }
268

    
269
        public void renameField(String antName, String newName) {
270
                fieldManager.renameField(antName, newName);        
271
        }
272

    
273
        public DBDataWare getDirectDataWare() {
274
                return directDataWare;
275
        }
276

    
277
        public void setDirectDataWare(DBDataWare directDataWare) {
278
                this.directDataWare = directDataWare;
279
        }
280

    
281
}