Statistics
| Revision:

root / trunk / libraries / libFMap / src / com / iver / cit / gvsig / fmap / edition / writers / JdbcWriter.java @ 38044

History | View | Annotate | Download (4.98 KB)

1
package com.iver.cit.gvsig.fmap.edition.writers;
2

    
3
import java.sql.Connection;
4
import java.sql.ResultSet;
5
import java.sql.ResultSetMetaData;
6
import java.sql.SQLException;
7
import java.util.ArrayList;
8

    
9
import org.apache.log4j.Logger;
10

    
11
import sun.jdbc.odbc.JdbcOdbcConnection;
12

    
13
import com.hardcode.gdbms.engine.values.Value;
14
import com.iver.cit.gvsig.exceptions.visitors.ProcessWriterVisitorException;
15
import com.iver.cit.gvsig.exceptions.visitors.StartWriterVisitorException;
16
import com.iver.cit.gvsig.exceptions.visitors.StopWriterVisitorException;
17
import com.iver.cit.gvsig.fmap.core.IRow;
18
import com.iver.cit.gvsig.fmap.drivers.XTypes;
19
import com.iver.cit.gvsig.fmap.edition.IRowEdited;
20
import com.iver.cit.gvsig.fmap.layers.SelectableDataSource;
21

    
22
public class JdbcWriter extends AbstractWriter {
23
        
24
        private static Logger logger = Logger.getLogger(JdbcWriter.class.getName());
25
        
26
        Connection conn;
27
        ResultSet rs;
28
        Value[] record;
29
        int numRecord;
30

    
31
        private boolean bCreateTable;
32

    
33
        private ResultSetMetaData metaData = null;
34
        
35
        protected ArrayList<Integer> rowsToDelete = null;
36

    
37
        public JdbcWriter(){
38
        }
39
        public void initialize(Connection conn, ResultSet rs) throws SQLException{
40
                this.conn = conn;
41
                this.rs = rs;
42
                metaData = rs.getMetaData();
43
                System.out.println("INICIO CONEXI?N DE ESCRITURA");
44
        }
45
        public void preProcess() throws StartWriterVisitorException {
46
                        try {
47
                                numRecord = 0;                                
48
                                conn.setAutoCommit(false);
49
                                rowsToDelete = new ArrayList<Integer>();
50
                        } catch (SQLException e) {
51
                                if (conn instanceof JdbcOdbcConnection) {
52
                                        logger.warn("Driver does not allow autocommit method: " + conn.getClass().getName());
53
                                } else {
54
                                        throw new StartWriterVisitorException(getName(),e);
55
                                }
56
                        }
57
                        /* Statement st = conn.createStatement();
58

59
                        if (bCreateTable) {
60
                                try {
61
                                        st.execute("DROP TABLE " + lyrDef.getTableName() + ";");
62
                                } catch (SQLException e1) {
63
                                        // Si no existe la tabla, no hay que borrarla.
64
                                }
65

66
                                String sqlCreate = PostGIS.getSqlCreateSpatialTable(lyrDef,
67
                                                lyrDef.getFieldsDesc(), true);
68
                                System.out.println("sqlCreate =" + sqlCreate);
69
                                st.execute(sqlCreate);
70
                        } */
71

    
72
        }
73

    
74
        public void process(IRowEdited editedRow) throws ProcessWriterVisitorException {
75
                IRow row = editedRow.getLinkedRow();
76

    
77
                try {
78
                        System.out.println("Intento escribir el registro " +
79
                                        numRecord + " de la capa " + metaData.getTableName(1));
80
                        switch (editedRow.getStatus())
81
                        {
82
                    case IRowEdited.STATUS_ADDED:
83
                            record=row.getAttributes();
84
                            rs.moveToInsertRow();
85
                            for (int i=0; i < record.length; i++)
86
                                    XTypes.updateValue(rs, i, record[i]);
87
                            rs.insertRow();
88
                            break;
89
                    case IRowEdited.STATUS_MODIFIED:
90
                            record=row.getAttributes();
91
                            rs.absolute(editedRow.getIndex()+1);
92
                            for (int i=0; i < record.length; i++)
93
                                    XTypes.updateValue(rs, i, record[i]);
94
                            rs.updateRow();
95
                            break;
96
                    case IRowEdited.STATUS_ORIGINAL:
97
                            if (bWriteAll)
98
                            {
99
                                record=row.getAttributes();
100
                                rs.moveToInsertRow();
101
                                for (int i=0; i < record.length; i++)
102
                                        XTypes.updateValue(rs, i, record[i]);
103
                                rs.insertRow();
104
                            }
105
                            break;
106
                    case IRowEdited.STATUS_DELETED:
107
                            rowsToDelete.add(editedRow.getIndex()+1);
108
                            break;
109
                        }
110
                        numRecord++;
111
                        rs.next();
112

    
113
                } catch (SQLException e) {
114
                        System.out.println(e.getSQLState() + " " + e.getMessage());
115
                        try {
116
                                conn.rollback();
117
                        } catch (SQLException e1) {
118
                                throw new ProcessWriterVisitorException(getName(),e1);
119
                        }
120

    
121
                        throw new ProcessWriterVisitorException(getName(),e);
122
                }
123

    
124
        }
125

    
126
        public void postProcess() throws StopWriterVisitorException {
127
                try {
128
                        for (int i=rowsToDelete.size()-1; i>=0; i--) {
129
                                rs.absolute(rowsToDelete.get(i));
130
                                rs.deleteRow();
131
                        }
132
                        
133
                        conn.commit();
134
                } catch (SQLException e) {
135
                        try {
136
                                conn.rollback();
137
                        } catch (SQLException e1) {
138
                                throw new StopWriterVisitorException(getName(),e1);
139
                        }
140
                        throw new StopWriterVisitorException(getName(),e);
141
                }
142
        }
143

    
144
        public boolean canWriteAttribute(int sqlType) {
145
                return true;
146
        }
147

    
148
        public String getName() {
149
                return "JDBC Writer";
150
        }
151
        /**
152
         * @return Returns the bCreateTable.
153
         */
154
        public boolean isCreateTable() {
155
                return bCreateTable;
156
        }
157

    
158
        /**
159
         * @param createTable
160
         *            The bCreateTable to set.
161
         */
162
        public void setCreateTable(boolean createTable) {
163
                bCreateTable = createTable;
164
        }
165

    
166
        /**
167
         * @return Returns the bWriteAll.
168
         */
169
        public boolean isWriteAll() {
170
                return bWriteAll;
171
        }
172

    
173
        /**
174
         * @param writeAll
175
         *            The bWriteAll to set.
176
         */
177
        public void setWriteAll(boolean writeAll) {
178
                bWriteAll = writeAll;
179
        }
180

    
181
        public void close() throws SQLException
182
        {
183
                rs.close();
184
                // conn.close();
185
                System.out.println("CIERRO CONEXI?N DE ESCRITURA");
186
        }
187
        public boolean canAlterTable() {
188
                // TODO Auto-generated method stub
189
                return false;
190
        }
191
        public boolean canSaveEdits() {
192
                try {
193
                        return (rs.getConcurrency() == ResultSet.CONCUR_UPDATABLE);
194
                } catch (SQLException e) {
195
                        e.printStackTrace();
196
                        return false;
197
                }
198
        }
199
}
200

    
201

    
202
// [eiel-gestion-conexiones]