This repository was archived by the owner on Feb 13, 2025. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathSqlServerQueryDialect.java
More file actions
69 lines (57 loc) · 2.29 KB
/
SqlServerQueryDialect.java
File metadata and controls
69 lines (57 loc) · 2.29 KB
1
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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
package com.upsolver.datasources.jdbc.querybuilders;
import com.upsolver.datasources.jdbc.metadata.SimpleSqlType;
import microsoft.sql.Types;
import java.lang.reflect.Field;
import java.sql.Connection;
import java.sql.JDBCType;
import java.sql.SQLException;
import java.sql.SQLType;
import java.util.Arrays;
import java.util.Collection;
import java.util.HashSet;
import java.util.Map;
import java.util.Optional;
import java.util.stream.Collectors;
public class SqlServerQueryDialect extends DefaultQueryDialect {
private static final Map<Integer, SQLType> sqlServerTypes = Arrays.stream(Types.class.getFields())
.map(f -> new SimpleSqlType(f.getName(), "microsoft", getIntValue(f))).collect(Collectors.toMap(SimpleSqlType::getVendorTypeNumber, t -> t));
private static final Collection<Integer> sqlServerTimeTypeCodes = new HashSet<>(Arrays.asList(Types.DATETIMEOFFSET, Types.DATETIME, Types.SMALLDATETIME));
private static final Collection<SQLType> sqlServerTimeTypes = sqlServerTypes.values().stream()
.filter(f -> sqlServerTimeTypeCodes.contains(f.getVendorTypeNumber())).collect(Collectors.toSet());
public SqlServerQueryDialect() {
super(false);
}
@Override
public long utcOffsetSeconds(Connection connection) throws SQLException {
var rs = connection.prepareStatement("SELECT DATEDIFF(second, GETDATE(), GETUTCDATE());").executeQuery();
rs.next();
return rs.getLong(1);
}
@Override
protected String topLimit(long amount) {
return amount >= 0 ? "top " + amount : "";
}
@Override
protected String endLimit(long amount) {
return "";
}
@Override
public SQLType getSqlType(int code) {
return Optional.ofNullable(sqlServerTypes.get(code)).orElseGet(() -> JDBCType.valueOf(code));
}
@Override
public boolean isTimeType(SQLType sqlType) throws SQLException {
return sqlServerTimeTypes.contains(sqlType) || super.isTimeType(sqlType);
}
private static int getIntValue(Field field) {
try {
return field.getInt(null);
} catch (IllegalAccessException e) {
throw new IllegalStateException(e);
}
}
@Override
public boolean acceptsURL(String url) {
return url.startsWith("jdbc:sqlserver:");
}
}