Identified issues can be fixed automatically using the command `jdbc schema fix` (all items having issues) or `jdbc schema fix <itemName>` (single item).
+Issues than can be identified and possibly fixed:
+
+- Wrong column name case (`time` and `name`).
+- Wrong column type. Before fixing this, make sure that time-zone is correctly configured.
+- Unexpected column (identify only).
+
### For Developers
* Clearly separated source files for the database-specific part of openHAB logic.
*/
@NonNullByDefault
public class JdbcMapper {
- private final Logger logger = LoggerFactory.getLogger(JdbcMapper.class);
+ private static final int MIGRATION_PERCENTAGE_THRESHOLD = 50;
+ private final Logger logger = LoggerFactory.getLogger(JdbcMapper.class);
private final TimeZoneProvider timeZoneProvider;
// Error counter - used to reconnect to database on error
initialized = tmpinit;
return;
}
+ // Safety valve to prevent accidental migrations.
+ int numberOfTables = itemTables.size();
+ if (numberOfTables > 0) {
+ String prefix = conf.getTableNamePrefix();
+ long numberOfItemsWithPrefix = itemTables.stream()
+ .filter(i -> i.startsWith(prefix) || i.toLowerCase().startsWith("item")).count();
+ long percentageWithPrefix = (numberOfItemsWithPrefix * 100) / itemTables.size();
+ if (!prefix.isBlank() && percentageWithPrefix >= MIGRATION_PERCENTAGE_THRESHOLD) {
+ logger.error(
+ "JDBC::formatTableNames: {}% of all tables start with table name prefix '{}' or 'item', but items manage table '{}' was not found or is empty. Check configuration parameter 'itemsManageTable'",
+ percentageWithPrefix, conf.getTableNamePrefix(), conf.getItemsManageTable());
+ if (ifTableExists("items")) {
+ logger.error(
+ "JDBC::formatTableNames: Table 'items' was found, consider updating configuration parameter 'itemsManageTable' accordingly");
+ }
+ initialized = tmpinit;
+ return;
+ }
+ }
oldNewTableNames = new ArrayList<>();
for (String itemName : itemTables) {
ItemsVO isvo = new ItemsVO();
*/
public Collection<String> getSchemaIssues(String tableName, String itemName) throws JdbcSQLException {
List<String> issues = new ArrayList<>();
+
+ if (!checkDBAccessability()) {
+ logger.warn("JDBC::getSchemaIssues: database not connected");
+ return issues;
+ }
+
Item item;
try {
item = itemRegistry.getItem(itemName);
* @throws JdbcSQLException on SQL errors
*/
public boolean fixSchemaIssues(String tableName, String itemName) throws JdbcSQLException {
+ if (!checkDBAccessability()) {
+ logger.warn("JDBC::fixSchemaIssues: database not connected");
+ return false;
+ }
+
Item item;
try {
item = itemRegistry.getItem(itemName);
* @throws JdbcSQLException
*/
public boolean cleanupItem(String itemName, boolean force) throws JdbcSQLException {
+ if (!checkDBAccessability()) {
+ logger.warn("JDBC::cleanupItem: database not connected");
+ return false;
+ }
+
String tableName = itemNameToTableNameMap.get(itemName);
if (tableName == null) {
return false;