Skip to content

Commit db675db

Browse files
committed
refactor(jdbc): extract DeclaredType parsing
1 parent da2a2d0 commit db675db

2 files changed

Lines changed: 74 additions & 48 deletions

File tree

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
package com.github.magnusp.libsql.jdbc;
2+
3+
import com.github.magnusp.libsql.hrana.codec.Col;
4+
5+
import java.util.Locale;
6+
import java.util.regex.Matcher;
7+
import java.util.regex.Pattern;
8+
9+
final class DeclaredType {
10+
11+
private static final Pattern COLUMN_TYPENAME = Pattern.compile("([^\\(]*)");
12+
private static final Pattern COLUMN_TYPECAST =
13+
Pattern.compile("cast\\(.*?\\s+as\\s+(.*?)\\s*\\)");
14+
private static final Pattern COLUMN_PRECISION = Pattern.compile(".*?\\((.*?)\\)");
15+
16+
private final String declType;
17+
18+
private DeclaredType(String declType) {
19+
this.declType = declType;
20+
}
21+
22+
static DeclaredType of(Col col) {
23+
String declType = col.decltype();
24+
if (declType == null) {
25+
String name = col.name();
26+
if (name != null) {
27+
Matcher matcher = COLUMN_TYPECAST.matcher(name);
28+
declType = matcher.find() ? matcher.group(1) : null;
29+
}
30+
}
31+
return new DeclaredType(declType);
32+
}
33+
34+
boolean isDeclared() {
35+
return declType != null;
36+
}
37+
38+
String typeName() {
39+
if (declType != null) {
40+
Matcher matcher = COLUMN_TYPENAME.matcher(declType);
41+
matcher.find();
42+
return matcher.group(1).toUpperCase(Locale.ENGLISH);
43+
}
44+
return "NUMERIC";
45+
}
46+
47+
int precision() {
48+
if (declType == null) {
49+
return 0;
50+
}
51+
Matcher matcher = COLUMN_PRECISION.matcher(declType);
52+
return matcher.find() ? Integer.parseInt(matcher.group(1).split(",")[0].trim()) : 0;
53+
}
54+
55+
int scale() {
56+
if (declType == null) {
57+
return 0;
58+
}
59+
Matcher matcher = COLUMN_PRECISION.matcher(declType);
60+
if (matcher.find()) {
61+
String[] parts = matcher.group(1).split(",");
62+
if (parts.length == 2) {
63+
return Integer.parseInt(parts[1].trim());
64+
}
65+
}
66+
return 0;
67+
}
68+
}

‎libsql-jdbc/src/main/java/com/github/magnusp/libsql/jdbc/LibsqlResultSetMetaData.java‎

Lines changed: 6 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -13,16 +13,9 @@
1313
import java.util.List;
1414
import java.util.Locale;
1515
import java.util.Map;
16-
import java.util.regex.Matcher;
17-
import java.util.regex.Pattern;
1816

1917
public class LibsqlResultSetMetaData implements ResultSetMetaData {
2018

21-
private static final Pattern COLUMN_TYPENAME = Pattern.compile("([^\\(]*)");
22-
private static final Pattern COLUMN_TYPECAST =
23-
Pattern.compile("cast\\(.*?\\s+as\\s+(.*?)\\s*\\)");
24-
private static final Pattern COLUMN_PRECISION = Pattern.compile(".*?\\((.*?)\\)");
25-
2619
private final List<Col> cols;
2720
private final List<Row> rows;
2821
private final String sql;
@@ -104,8 +97,9 @@ public int isNullable(int column) throws SQLException {
10497

10598
@Override
10699
public boolean isSigned(int column) throws SQLException {
107-
if (declType(column) != null) {
108-
return switch (getColumnTypeName(column)) {
100+
DeclaredType declared = DeclaredType.of(getCol(column));
101+
if (declared.isDeclared()) {
102+
return switch (declared.typeName()) {
109103
case "NUMERIC", "INTEGER", "REAL" -> true;
110104
default -> false;
111105
};
@@ -143,28 +137,12 @@ public String getSchemaName(int column) throws SQLException {
143137

144138
@Override
145139
public int getPrecision(int column) throws SQLException {
146-
String declType = declType(column);
147-
if (declType == null) {
148-
return 0;
149-
}
150-
Matcher matcher = COLUMN_PRECISION.matcher(declType);
151-
return matcher.find() ? Integer.parseInt(matcher.group(1).split(",")[0].trim()) : 0;
140+
return DeclaredType.of(getCol(column)).precision();
152141
}
153142

154143
@Override
155144
public int getScale(int column) throws SQLException {
156-
String declType = declType(column);
157-
if (declType == null) {
158-
return 0;
159-
}
160-
Matcher matcher = COLUMN_PRECISION.matcher(declType);
161-
if (matcher.find()) {
162-
String[] parts = matcher.group(1).split(",");
163-
if (parts.length == 2) {
164-
return Integer.parseInt(parts[1].trim());
165-
}
166-
}
167-
return 0;
145+
return DeclaredType.of(getCol(column)).scale();
168146
}
169147

170148
@Override
@@ -189,14 +167,7 @@ public int getColumnType(int column) throws SQLException {
189167

190168
@Override
191169
public String getColumnTypeName(int column) throws SQLException {
192-
getCol(column);
193-
String declType = declType(column);
194-
if (declType != null) {
195-
Matcher matcher = COLUMN_TYPENAME.matcher(declType);
196-
matcher.find();
197-
return matcher.group(1).toUpperCase(Locale.ENGLISH);
198-
}
199-
return "NUMERIC";
170+
return DeclaredType.of(getCol(column)).typeName();
200171
}
201172

202173
@Override
@@ -223,19 +194,6 @@ public String getColumnClassName(int column) throws SQLException {
223194
return XerialColumnType.className(runtimeValue(column));
224195
}
225196

226-
private String declType(int column) throws SQLException {
227-
Col col = getCol(column);
228-
String declType = col.decltype();
229-
if (declType == null) {
230-
String name = col.name();
231-
if (name != null) {
232-
Matcher matcher = COLUMN_TYPECAST.matcher(name);
233-
declType = matcher.find() ? matcher.group(1) : null;
234-
}
235-
}
236-
return declType;
237-
}
238-
239197
private String columnName(int column) throws SQLException {
240198
String name = getCol(column).name();
241199
return name != null ? name.toLowerCase(Locale.ROOT) : "";

0 commit comments

Comments
 (0)