1 package guru.mikelue.jdut.vendor.mssql;
2
3 import java.sql.Connection;
4 import java.sql.SQLException;
5 import java.util.Optional;
6
7 import org.slf4j.Logger;
8 import org.slf4j.LoggerFactory;
9
10 import guru.mikelue.jdut.datagrain.DataRow;
11 import guru.mikelue.jdut.datagrain.SchemaTable;
12 import guru.mikelue.jdut.jdbc.JdbcTemplateFactory;
13 import guru.mikelue.jdut.operation.DataRowOperator;
14
15
16
17
18 public class IdentityInsertOperator implements DataRowOperator {
19 private Logger logger = LoggerFactory.getLogger(IdentityInsertOperator.class);
20
21
22
23
24 private final static String HAS_IDENTITY_COLUMN = "_mssql_has_identity_column_";
25
26
27
28
29
30
31
32
33 public static boolean hasIdentityColumn(DataRow dataRow)
34 {
35 return dataRow.getAttribute(HAS_IDENTITY_COLUMN);
36 }
37
38
39
40
41
42
43
44
45
46 public static boolean identityChecked(DataRow dataRow)
47 {
48 return dataRow.hasAttribute(HAS_IDENTITY_COLUMN);
49 }
50
51 private final DataRowOperator op;
52
53
54
55
56
57
58
59
60 public IdentityInsertOperator(DataRowOperator newOperator)
61 {
62 op = newOperator;
63 }
64
65
66
67
68 @Override
69 public DataRowkelue/jdut/datagrain/DataRow.html#DataRow">DataRow operate(Connection connection, DataRow dataRow) throws SQLException
70 {
71 SchemaTable table = dataRow.getTable();
72
73
74
75
76 if (!identityChecked(dataRow)) {
77 dataRow.putAttribute(
78 HAS_IDENTITY_COLUMN,
79 dataRow.getColumns().stream()
80 .anyMatch(columnName -> {
81 Optional<Boolean> autoIncremental = table.getColumn(columnName).getAutoIncremental();
82 return autoIncremental.isPresent() && autoIncremental.get();
83 })
84 );
85 }
86
87
88
89
90
91 if (hasIdentityColumn(dataRow)) {
92 JdbcTemplateFactory.buildRunnable(
93 () -> connection.createStatement(),
94 stat -> stat.executeUpdate(String.format(
95 "SET IDENTITY_INSERT %s ON",
96 table.getQuotedFullName()
97 ))
98 ).runJdbc();
99 }
100
101
102 DataRow result = op.operate(connection, dataRow);
103
104
105
106
107 if (hasIdentityColumn(dataRow)) {
108 logger.debug("[MS SQL Server] Enable identity: \"{}\"", table.getName());
109 JdbcTemplateFactory.buildRunnable(
110 () -> connection.createStatement(),
111 stat -> stat.executeUpdate(String.format(
112 "SET IDENTITY_INSERT %s OFF",
113 table.getQuotedFullName()
114 ))
115 ).runJdbc();
116 }
117
118
119 return result;
120 }
121 }