Statistics
| Revision:

svn-gvsig-desktop / trunk / org.gvsig.desktop / org.gvsig.desktop.compat.cdc / org.gvsig.fmap.dal / org.gvsig.fmap.dal.db / org.gvsig.fmap.dal.db.jdbc / src / main / java / org / gvsig / fmap / dal / store / jdbc2 / spi / operations / CreateTableOperation.java @ 44058

History | View | Annotate | Download (5.05 KB)

1
package org.gvsig.fmap.dal.store.jdbc2.spi.operations;
2

    
3
import java.sql.Connection;
4
import java.sql.SQLException;
5
import java.sql.Statement;
6
import java.util.ArrayList;
7
import java.util.List;
8
import org.apache.commons.lang3.tuple.Pair;
9
import org.gvsig.fmap.dal.exception.DataException;
10
import org.gvsig.fmap.dal.feature.FeatureAttributeDescriptor;
11
import org.gvsig.fmap.dal.feature.FeatureType;
12
import org.gvsig.fmap.dal.SQLBuilder;
13
import org.gvsig.fmap.dal.store.jdbc2.JDBCHelper;
14
import org.gvsig.fmap.dal.store.jdbc2.spi.JDBCSQLBuilderBase;
15
import org.gvsig.fmap.dal.store.jdbc.exception.JDBCSQLException;
16
import org.gvsig.fmap.dal.store.jdbc2.JDBCUtils;
17
import org.gvsig.fmap.dal.store.jdbc2.OperationsFactory.TableReference;
18
import org.gvsig.fmap.geom.DataTypes;
19

    
20
public class CreateTableOperation extends AbstractConnectionWritableOperation {
21

    
22
    private final TableReference table;
23
    private final FeatureType type;
24
    private final List<Pair<String, SQLBuilder.Privilege>> userAndPrivileges;
25
    private final List<String> additionalSQLs;
26

    
27
    public CreateTableOperation(
28
            JDBCHelper helper
29
        ) {
30
        this(helper, null, null, null, null);
31
    }
32
    
33
    public CreateTableOperation(
34
            JDBCHelper helper,
35
            TableReference table,
36
            FeatureType type,
37
            List<Pair<String, SQLBuilder.Privilege>> userAndPrivileges,
38
            List<String> additionalSQLs
39
        ) {
40
        super(helper);
41
        this.table = table;
42
        this.type = type;
43
        this.userAndPrivileges = userAndPrivileges;
44
        this.additionalSQLs = additionalSQLs;
45
    }
46

    
47
    @Override
48
    public final Object perform(Connection conn) throws DataException {
49
        return this.performCreateTable(conn, 
50
                table, type, userAndPrivileges, additionalSQLs);
51
    }
52

    
53
    protected List<String> buildCreateIndexesSQL(
54
            TableReference table,
55
            FeatureType type
56
        ) {
57
        ArrayList<String> sqls = new ArrayList<>();
58
        
59
        for (FeatureAttributeDescriptor attr : type) {
60
            if( attr.isIndexed() ) {
61
                JDBCSQLBuilderBase sqlbuilder = createSQLBuilder();
62
                if( attr.getType()==org.gvsig.fmap.dal.DataTypes.GEOMETRY ) {
63
                    sqlbuilder.create_index().spatial();
64
                }
65
                sqlbuilder.create_index().if_not_exist();
66
                sqlbuilder.create_index().name("idx_" + table + "_" + attr.getName());
67
                sqlbuilder.create_index().column(attr.getName());
68
                sqlbuilder.create_index().table()
69
                        .database(this.table.getDatabase())
70
                        .schema(this.table.getSchema())
71
                        .name(this.table.getTable()
72
                );
73
                sqls.addAll(sqlbuilder.create_index().toStrings());
74
            }
75
        }
76
        return sqls;
77
    }
78
    
79
    public boolean performCreateTable(Connection conn,
80
            TableReference table,
81
            FeatureType type,
82
            List<Pair<String, SQLBuilder.Privilege>> rolesAndPrivileges,
83
            List<String> additionalSQLs) throws DataException {
84

    
85
        JDBCSQLBuilderBase sqlbuilder = this.createSQLBuilder();
86
        sqlbuilder.create_table().table()
87
                .database(this.table.getDatabase())
88
                .schema(this.table.getSchema())
89
                .name(this.table.getTable());
90
        for (FeatureAttributeDescriptor attr : type) {
91
            if( attr.getType()==DataTypes.GEOMETRY ) {
92
                sqlbuilder.create_table().add_geometry_column(
93
                        attr.getName(),
94
                        attr.getGeomType().getType(),
95
                        attr.getGeomType().getSubType(),
96
                        attr.getSRS(),
97
                        attr.isIndexed(),
98
                        attr.allowNull()
99
                );
100
            } else {
101
                sqlbuilder.create_table().add_column(
102
                        attr.getName(),
103
                        attr.getType(),
104
                        attr.getSize(),
105
                        attr.getPrecision(),
106
                        attr.isPrimaryKey(),
107
                        attr.isIndexed(),
108
                        attr.allowNull(),
109
                        attr.isAutomatic(),
110
                        attr.getDefaultValue()
111
                );
112
            }
113
        }
114
        for (Pair<String, SQLBuilder.Privilege> roleAndPrivilege : rolesAndPrivileges) {
115
            sqlbuilder.grant().role(roleAndPrivilege.getLeft()).privilege(roleAndPrivilege.getRight());
116
        }
117

    
118
        List<String> sqls;
119
        sqls = sqlbuilder.create_table().toStrings();
120
        sqls.addAll(buildCreateIndexesSQL(this.table,type));
121
        sqls.addAll(sqlbuilder.grant().toStrings());
122
        sqls.addAll(additionalSQLs);
123

    
124
        Statement st = null;
125
        try {
126
            st = conn.createStatement();
127
            for (String sql : sqls) {
128
                JDBCUtils.execute(st, sql);
129
            }
130
        } catch (SQLException ex) {
131
            throw new JDBCSQLException(ex);
132
        } finally {
133
            JDBCUtils.closeQuietly(st);
134
        }
135
        return true;
136
    }
137
}