1 package fr.ifremer.quadrige2.synchro.dao;
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26 import com.google.common.collect.ArrayListMultimap;
27 import com.google.common.collect.Multimap;
28 import fr.ifremer.quadrige2.core.exception.Quadrige2TechnicalException;
29 import fr.ifremer.quadrige2.core.config.Quadrige2Configuration;
30 import fr.ifremer.quadrige2.core.dao.technical.Daos;
31 import fr.ifremer.quadrige2.core.dao.technical.jdbc.OptionalDataSourceJdbcDaoSupport;
32 import org.apache.commons.collections4.CollectionUtils;
33 import org.apache.commons.logging.Log;
34 import org.apache.commons.logging.LogFactory;
35 import org.springframework.beans.factory.annotation.Autowired;
36 import org.springframework.context.annotation.Lazy;
37 import org.springframework.stereotype.Repository;
38
39 import javax.annotation.Resource;
40 import javax.sql.DataSource;
41 import java.sql.Connection;
42 import java.sql.DatabaseMetaData;
43 import java.sql.ResultSet;
44 import java.sql.SQLException;
45 import java.util.Properties;
46 import java.util.Set;
47
48
49
50
51 @Repository("synchroClientDao")
52 @Lazy
53 public class SynchroClientDaoImpl extends OptionalDataSourceJdbcDaoSupport implements SynchroClientDao {
54
55
56 private static final Log log =
57 LogFactory.getLog(SynchroClientDaoImpl.class);
58
59 @Resource
60 private Quadrige2Configuration config;
61
62
63
64
65
66
67
68 @Autowired
69 public SynchroClientDaoImpl(DataSource dataSource) {
70 super(dataSource);
71 }
72
73
74
75
76 public SynchroClientDaoImpl() {
77 super();
78 config = Quadrige2Configuration.getInstance();
79 }
80
81
82 @Override
83 public boolean isAllTablesEmpty(Set<String> tableNames) {
84 return isAllTablesEmpty(null, tableNames);
85 }
86
87
88 @Override
89 public boolean isAllTablesEmpty(Properties connectionProperties, Set<String> tableNames) {
90 if (CollectionUtils.isEmpty(tableNames)) {
91 return true;
92 }
93
94 Connection connection = null;
95 try {
96 connection = createConnection(connectionProperties);
97
98 for (String tableName : tableNames) {
99 long count = Daos.countTableRows(connection, tableName);
100 if (count > 0) {
101 return false;
102 }
103 }
104
105 return true;
106 } catch (SQLException e) {
107 throw new Quadrige2TechnicalException("Error while getting if all tables are empty");
108 } finally {
109 closeSilently(connection);
110 }
111 }
112
113
114 @Override
115 public Multimap<String, String> getExportedKeys(String pkTableName, String pkColumnName) {
116
117
118 Multimap<String, String> result = ArrayListMultimap.create();
119
120
121 Connection connection = null;
122 ResultSet rs = null;
123 try {
124 connection = createConnection(null);
125 DatabaseMetaData dbMeta = connection.getMetaData();
126
127 rs = dbMeta.getExportedKeys(config.getJdbcCatalog(), config.getJdbcSchema(), pkTableName);
128 while (rs.next()) {
129 String columnName = rs.getString("PKCOLUMN_NAME").toLowerCase();
130 if (columnName.equalsIgnoreCase(pkColumnName)) {
131 String fkTableName = rs.getString("FKTABLE_NAME").toUpperCase();
132 String fkColumnName = rs.getString("FKCOLUMN_NAME").toLowerCase();
133 result.put(fkTableName, fkColumnName);
134 }
135 }
136 } catch (SQLException e) {
137 throw new Quadrige2TechnicalException(String.format("Error while getting exported keys for table [%s]", pkTableName));
138 } finally {
139 fr.ifremer.common.synchro.dao.Daos.closeSilently(rs);
140 }
141
142 return result;
143 }
144
145
146
147 }