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 @ 44669

History | View | Annotate | Download (5.16 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.isComputed() ) {
92
                continue;
93
            }
94
            if( attr.getType()==DataTypes.GEOMETRY ) {
95
                sqlbuilder.create_table().add_geometry_column(
96
                        attr.getName(),
97
                        attr.getGeomType().getType(),
98
                        attr.getGeomType().getSubType(),
99
                        attr.getSRS(),
100
                        attr.isIndexed(),
101
                        attr.allowNull()
102
                );
103
            } else {
104
                sqlbuilder.create_table().add_column(
105
                        attr.getName(),
106
                        attr.getType(),
107
                        attr.getSize(),
108
                        attr.getPrecision(),
109
                        attr.getScale(),
110
                        attr.isPrimaryKey(),
111
                        attr.isIndexed(),
112
                        attr.allowNull(),
113
                        attr.isAutomatic(),
114
                        attr.getDefaultValue()
115
                );
116
            }
117
        }
118
        for (Pair<String, SQLBuilder.Privilege> roleAndPrivilege : rolesAndPrivileges) {
119
            sqlbuilder.grant().role(roleAndPrivilege.getLeft()).privilege(roleAndPrivilege.getRight());
120
        }
121

    
122
        List<String> sqls;
123
        sqls = sqlbuilder.create_table().toStrings();
124
        sqls.addAll(buildCreateIndexesSQL(this.table,type));
125
        sqls.addAll(sqlbuilder.grant().toStrings());
126
        sqls.addAll(additionalSQLs);
127

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