Statistics
| Revision:

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

History | View | Annotate | Download (5.26 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

    
14
import com.iver.cit.gvsig.fmap.core.IRow;
15
import com.iver.cit.gvsig.fmap.drivers.DBLayerDefinition;
16
import com.iver.cit.gvsig.fmap.drivers.FieldDescription;
17
import com.iver.cit.gvsig.fmap.drivers.ITableDefinition;
18
import com.iver.cit.gvsig.fmap.edition.EditionException;
19
import com.iver.cit.gvsig.fmap.edition.IRowEdited;
20
import com.iver.cit.gvsig.fmap.edition.fieldmanagers.JdbcFieldManager;
21
import com.iver.cit.gvsig.fmap.edition.writers.AbstractWriter;
22

    
23
/**
24
 * 
25
 * MySQL alphanumeric writer.
26
 * It is needed because MySQL JDBC driver doesnt allow updatables recordsets.
27
 * @author alzabord
28
 * 
29
 * @see MySQLSpatialWriter from extJDBC project
30
 */
31
public class MySQLWriter extends AbstractWriter{
32

    
33
        private int numRows;
34
        private Connection conn;
35
        private Statement st;
36
        private ResultSetMetaData metaData;
37
        private boolean bCreateTable;
38
        private boolean bWriteAll;
39
        private MySQL mySql = new MySQL();
40
        private JdbcFieldManager fieldManager;
41
        
42
        public void initialize(Connection conn){
43
                this.conn = conn;
44
        }
45
        
46
        public void initialize(ITableDefinition tableDefinition) throws EditionException {
47
                super.initialize(tableDefinition);
48
                try {
49
                        createTableIfNeeded();
50
                } catch (SQLException e) {
51
                        throw new EditionException(e);
52
                }
53
        }
54
        
55
        
56
        private void createTableIfNeeded() throws SQLException{
57
                st = conn.createStatement();
58
                if (bCreateTable) {
59
                        try {
60
                                st.execute("DROP TABLE " + 
61
                                                ((DBLayerDefinition)tableDef).getTableName() + ";");
62
                        } catch (SQLException e1) {
63
                                e1.printStackTrace();
64
                        }
65
                        //In MySQL you can add geometry column in CREATE TABLE statement
66
                        String sqlCreate = mySql.getSqlCreateSpatialTable((DBLayerDefinition) tableDef,
67
                                                                                        tableDef.getFieldsDesc(), 
68
                                                                                        true);
69
                        st.execute(sqlCreate);
70
                        conn.commit();
71
                }//if
72
                conn.setAutoCommit(false);
73
                fieldManager = new JdbcFieldManager(conn, 
74
                                ((DBLayerDefinition) tableDef).getTableName());
75
}
76

    
77
        
78
        public boolean canWriteAttribute(int sqlType) {
79
                switch (sqlType) {
80
                case Types.DOUBLE:
81
                case Types.FLOAT:
82
                case Types.INTEGER:
83
                case Types.BIGINT:
84
                        return true;
85
                case Types.DATE:
86
                        return true;
87
                case Types.BIT:
88
                case Types.BOOLEAN:
89
                        return true;
90
                case Types.VARCHAR:
91
                case Types.CHAR:
92
                case Types.LONGVARCHAR:
93
                        return true; 
94
                }
95
                return false;
96
        }
97

    
98
        
99
        public void preProcess() throws EditionException {
100
                numRows = 0;
101
                try {
102
                        conn.setAutoCommit(false);
103
                        conn.rollback();                        
104
                        alterTable();
105
                } catch (SQLException e) {
106
                        throw new EditionException(e);
107
                }
108
        }
109

    
110
        public boolean alterTable() throws EditionException {
111
                return fieldManager.alterTable();
112
        }
113
        
114
        public void process(IRowEdited row) throws EditionException {
115
                String sqlInsert;
116
                try {
117
                        switch (row.getStatus()) {
118
                        case IRowEdited.STATUS_ADDED:
119
                                IRow record =  row.getLinkedRow();
120
                                sqlInsert = mySql.getSqlInsertFeature((DBLayerDefinition) tableDef, record);
121
                                st.execute(sqlInsert);
122
                                break;
123
                                
124
                        case IRowEdited.STATUS_MODIFIED:
125
                                IRow featM =  row.getLinkedRow();
126
                                if (bWriteAll) {
127
                                        sqlInsert = mySql.getSqlInsertFeature((DBLayerDefinition) tableDef, featM);
128
                                        System.out.println("sql = " + sqlInsert);
129
                                        st.execute(sqlInsert);
130
                                } else {
131
                                        String sqlModify = mySql.getSqlModifyFeature((DBLayerDefinition) tableDef, featM);
132
                                        st.execute(sqlModify);
133
                                }
134
                                break;
135
                                
136
                        case IRowEdited.STATUS_ORIGINAL:
137
                                IRow featO = row.getLinkedRow();
138
                                if (bWriteAll) {
139
                                        sqlInsert = mySql.getSqlInsertFeature((DBLayerDefinition) tableDef, featO);
140
                                        st.execute(sqlInsert);
141
                                }
142
                                break;
143
                                
144
                        case IRowEdited.STATUS_DELETED:
145
                                String sqlDelete = mySql.getSqlDeleteFeature((DBLayerDefinition) tableDef, row);
146
                                System.out.println("sql = " + sqlDelete);
147
                                st.execute(sqlDelete);
148
                                break;
149
                        }
150
                        numRows++;
151
                } catch (SQLException e) {
152
                        e.printStackTrace();
153
                        throw new EditionException(e);
154
                }
155
        }
156

    
157
        
158
        public void postProcess() throws EditionException {
159
                try {
160
                        conn.setAutoCommit(true);
161
                } catch (SQLException e) {
162
                        e.printStackTrace();
163
                        throw new EditionException(e);
164
                }
165
        }
166

    
167
        
168
        public boolean canAlterTable() {
169
                return true;
170
        }
171

    
172
        
173
        public boolean canSaveEdits() {
174
                try {
175
                        return !conn.isReadOnly();
176
                } catch (SQLException e) {
177
                        e.printStackTrace();
178
                        return false;
179
                }
180
        }
181

    
182
        public String getName() {
183
                return "MySQL Alphanumeric Writer";
184
        }
185
        
186
        public void setCreateTable(boolean createTable) {
187
                bCreateTable = createTable;
188
        }
189
        
190
        public boolean isCreateTable() {
191
                return bCreateTable;
192
        }
193

    
194
        public boolean isWriteAll() {
195
                return bWriteAll;
196
        }
197
        
198
        public void setWriteAll(boolean writeAll) {
199
                bWriteAll = writeAll;
200
        }
201
        
202
/*
203
 * TODO 
204
 * Esta parte no se si es necesaria, o si se usa (revisar)
205
 * 
206
 * */
207
        public FieldDescription[] getFields() {
208
                return fieldManager.getFields();
209
        }
210
        
211
        public FieldDescription[] getOriginalFields() {
212
                return tableDef.getFieldsDesc();
213
        }
214

    
215
        public void addField(FieldDescription fieldDesc) {
216
                fieldManager.addField(fieldDesc);
217
                
218
        }
219

    
220
        public FieldDescription removeField(String fieldName) {
221
                return fieldManager.removeField(fieldName);
222
                
223
        }
224

    
225
        public void renameField(String antName, String newName) {
226
                fieldManager.renameField(antName, newName);        
227
        }
228

    
229
}