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

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
    }
51

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

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

    
119
        List<String> sqls;
120
        sqls = sqlbuilder.create_table().toStrings();
121
        sqls.addAll(buildCreateIndexesSQL(this.table,type));
122
        sqls.addAll(sqlbuilder.grant().toStrings());
123
        if( additionalSQLs!=null ) {
124
          sqls.addAll(additionalSQLs);
125
        }
126
        
127
        return sqls;
128
    }
129
    
130
    public boolean performCreateTable(Connection conn) throws DataException {
131
      
132
        List<String> sqls = this.getSQLs();
133
        Statement st = null;
134
        try {
135
            st = conn.createStatement();
136
            for (String sql : sqls) {
137
                JDBCUtils.execute(st, sql);
138
            }
139
        } catch (SQLException ex) {
140
            throw new JDBCSQLException(ex);
141
        } finally {
142
            JDBCUtils.closeQuietly(st);
143
        }
144
        return true;
145
    }
146
}