Skip to content

Commit 42dec9b

Browse files
Support for Local(Date/Time/DateTime).
1 parent 87b5d92 commit 42dec9b

File tree

11 files changed

+207
-27
lines changed

11 files changed

+207
-27
lines changed

build.gradle

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,20 @@
11
group 'com.softwareverde'
2-
version '3.3.1'
2+
version '3.3.2'
33

44
apply plugin: 'java'
55
apply plugin: 'java-library'
66

7-
sourceCompatibility = 1.8
7+
java {
8+
sourceCompatibility = JavaVersion.VERSION_11
9+
targetCompatibility = JavaVersion.VERSION_11
10+
}
811

912
task makeJar(type: Jar) {
1013
manifest {
1114
attributes 'Implementation-Title': 'Java Database Wrapper',
1215
'Implementation-Version': archiveVersion
1316
}
14-
from { configurations.compile.collect { it.isDirectory() ? it : zipTree(it) } }
17+
duplicatesStrategy = DuplicatesStrategy.EXCLUDE
1518
with jar
1619
}
1720

@@ -21,7 +24,7 @@ repositories {
2124
}
2225

2326
dependencies {
24-
implementation group: 'com.github.softwareverde', name: 'java-util', version: 'v2.7.8'
27+
implementation group: 'com.github.softwareverde', name: 'java-util', version: 'v2.9.2'
2528

2629
testImplementation group: 'junit', name: 'junit', version: '4.12'
2730
testImplementation group: 'com.h2database', name: 'h2', version: '1.4.192'
@@ -70,4 +73,4 @@ task javadocJar(type: Jar, dependsOn: javadoc) {
7073
artifacts {
7174
archives sourcesJar
7275
archives javadocJar
73-
}
76+
}

src/main/java/com/softwareverde/database/jdbc/JdbcDatabaseConnection.java

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9,11 +9,7 @@
99
import com.softwareverde.database.row.RowFactory;
1010
import com.softwareverde.util.Util;
1111

12-
import java.sql.Connection;
13-
import java.sql.PreparedStatement;
14-
import java.sql.ResultSet;
15-
import java.sql.SQLException;
16-
import java.sql.Statement;
12+
import java.sql.*;
1713
import java.util.ArrayList;
1814
import java.util.List;
1915

@@ -62,6 +58,15 @@ protected PreparedStatement _prepareStatement(final String query, final TypedPar
6258
case FLOATING_POINT_NUMBER: {
6359
preparedStatement.setDouble(parameterIndex, (Double) parameters[i].value);
6460
} break;
61+
case TIME: {
62+
preparedStatement.setObject(parameterIndex, parameters[i].value, JDBCType.TIME);
63+
} break;
64+
case DATE: {
65+
preparedStatement.setObject(parameterIndex, parameters[i].value, JDBCType.DATE);
66+
} break;
67+
case DATETIME: {
68+
preparedStatement.setObject(parameterIndex, parameters[i].value, JDBCType.TIMESTAMP);
69+
} break;
6570
}
6671
}
6772
}

src/main/java/com/softwareverde/database/jdbc/row/JdbcRow.java

Lines changed: 37 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,9 @@
66
import com.softwareverde.util.Util;
77

88
import java.nio.charset.Charset;
9+
import java.time.LocalDate;
10+
import java.time.LocalDateTime;
11+
import java.time.LocalTime;
912
import java.util.ArrayList;
1013
import java.util.HashMap;
1114
import java.util.List;
@@ -53,12 +56,13 @@ protected TypedParameter _getValue(final String columnName) throws IllegalArgume
5356

5457
protected String _getString(final String columnName) {
5558
final TypedParameter value = _getValue(columnName);
59+
if (value.value == null) { return null; }
5660

5761
if (value.type == ParameterType.BYTE_ARRAY) {
5862
return new String((byte[]) value.value, CHARSET);
5963
}
6064
else if (value.type != ParameterType.STRING) {
61-
return ( (value.value != null) ? value.value.toString() : null);
65+
return value.value.toString();
6266
}
6367

6468
return (String) value.value;
@@ -156,4 +160,36 @@ public byte[] getBytes(final String columnName) {
156160

157161
return (byte[]) value.value;
158162
}
163+
164+
@Override
165+
public LocalDate getDate(String columnName) {
166+
final TypedParameter value = _getValue(columnName);
167+
if (value.value == null) { return null; }
168+
169+
if (value.type == ParameterType.DATETIME) {
170+
final LocalDateTime dateTime = (LocalDateTime) value.value;
171+
return dateTime.toLocalDate();
172+
}
173+
174+
return (LocalDate) value.value;
175+
}
176+
177+
@Override
178+
public LocalTime getTime(String columnName) {
179+
final TypedParameter value = _getValue(columnName);
180+
if (value.value == null) { return null; }
181+
182+
if (value.type == ParameterType.DATETIME) {
183+
final LocalDateTime dateTime = (LocalDateTime) value.value;
184+
return dateTime.toLocalTime();
185+
}
186+
187+
return (LocalTime) value.value;
188+
}
189+
190+
@Override
191+
public LocalDateTime getDateTime(String columnName) {
192+
final TypedParameter value = _getValue(columnName);
193+
return (LocalDateTime) value.value;
194+
}
159195
}

src/main/java/com/softwareverde/database/jdbc/row/JdbcRowFactory.java

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,36 @@
88
import java.sql.ResultSetMetaData;
99
import java.sql.SQLException;
1010
import java.sql.Types;
11+
import java.time.LocalDate;
12+
import java.time.LocalDateTime;
13+
import java.time.LocalTime;
1114

1215
public class JdbcRowFactory implements RowFactory {
1316

17+
protected static Boolean isDateType(final Integer sqlDataType) {
18+
return sqlDataType == Types.DATE;
19+
}
20+
21+
protected static Boolean isTimeType(final Integer sqlDataType) {
22+
switch (sqlDataType) {
23+
case Types.TIME:
24+
case Types.TIME_WITH_TIMEZONE: {
25+
return true;
26+
}
27+
default: { return false; }
28+
}
29+
}
30+
31+
protected static Boolean isDateTimeType(final Integer sqlDataType) {
32+
switch (sqlDataType) {
33+
case Types.TIMESTAMP:
34+
case Types.TIMESTAMP_WITH_TIMEZONE: {
35+
return true;
36+
}
37+
default: { return false; }
38+
}
39+
}
40+
1441
protected static Boolean isBinaryType(final Integer sqlDataType) {
1542
switch (sqlDataType) {
1643
case Types.BLOB:
@@ -76,6 +103,18 @@ else if (JdbcRowFactory.isFloatingPointNumberType(sqlDataType)) {
76103
final boolean wasNull = resultSet.wasNull();
77104
typedValue = (wasNull ? TypedParameter.NULL : new TypedParameter(doubleValue));
78105
}
106+
else if (JdbcRowFactory.isDateType(sqlDataType)) {
107+
final LocalDate date = resultSet.getObject(columnIndex, java.time.LocalDate.class);
108+
typedValue = ((date == null) ? TypedParameter.NULL : new TypedParameter(date));
109+
}
110+
else if (JdbcRowFactory.isTimeType(sqlDataType)) {
111+
final LocalTime time = resultSet.getObject(columnIndex, java.time.LocalTime.class);
112+
typedValue = ((time == null) ? TypedParameter.NULL : new TypedParameter(time));
113+
}
114+
else if (JdbcRowFactory.isDateTimeType(sqlDataType)) {
115+
final LocalDateTime datetime = resultSet.getObject(columnIndex, java.time.LocalDateTime.class);
116+
typedValue = ((datetime == null) ? TypedParameter.NULL : new TypedParameter(datetime));
117+
}
79118
else {
80119
final String stringValue = resultSet.getString(columnIndex);
81120
typedValue = ((stringValue == null) ? TypedParameter.NULL : new TypedParameter(stringValue));

src/main/java/com/softwareverde/database/query/ParameterFactoryCore.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,10 @@
55
import com.softwareverde.database.query.parameter.TypedParameter;
66
import com.softwareverde.util.type.identifier.Identifier;
77

8+
import java.time.LocalDate;
9+
import java.time.LocalDateTime;
10+
import java.time.LocalTime;
11+
812
public class ParameterFactoryCore implements ParameterFactory {
913
@Override
1014
public TypedParameter fromObject(final Object object) {
@@ -37,6 +41,15 @@ else if (object instanceof ByteArray) {
3741
else if (object instanceof Identifier) {
3842
return new TypedParameter(((Identifier) object).longValue());
3943
}
44+
else if (object instanceof LocalDate) {
45+
return new TypedParameter((LocalDate) object);
46+
}
47+
else if (object instanceof LocalTime) {
48+
return new TypedParameter((LocalTime) object);
49+
}
50+
else if (object instanceof LocalDateTime) {
51+
return new TypedParameter((LocalDateTime) object);
52+
}
4053
else if (object instanceof TypedParameter) {
4154
return (TypedParameter) object;
4255
}

src/main/java/com/softwareverde/database/query/Query.java

Lines changed: 36 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,17 @@
22

33
import com.softwareverde.constable.bytearray.ByteArray;
44
import com.softwareverde.constable.list.List;
5+
import com.softwareverde.constable.list.mutable.MutableArrayList;
56
import com.softwareverde.constable.list.mutable.MutableList;
67
import com.softwareverde.database.query.parameter.InClauseParameter;
78
import com.softwareverde.database.query.parameter.ParameterFactory;
89
import com.softwareverde.database.query.parameter.TypedParameter;
910
import com.softwareverde.util.Util;
1011
import com.softwareverde.util.type.identifier.Identifier;
1112

13+
import java.time.LocalDate;
14+
import java.time.LocalDateTime;
15+
import java.time.LocalTime;
1216
import java.util.ArrayList;
1317
import java.util.regex.Matcher;
1418
import java.util.regex.Pattern;
@@ -114,12 +118,12 @@ protected static String buildExpandedWhereInClause(final List<String> columnName
114118
protected final MutableList<TypedParameter> _parameters;
115119
protected final ParameterFactory _parameterFactory;
116120

117-
protected final MutableList<ExtendedInClauseParameters> _inClauseParameters = new MutableList<ExtendedInClauseParameters>();
118-
protected final MutableList<Integer> _inClauseParameterIndexes = new MutableList<Integer>();
121+
protected final MutableList<ExtendedInClauseParameters> _inClauseParameters = new MutableArrayList<>();
122+
protected final MutableList<Integer> _inClauseParameterIndexes = new MutableArrayList<Integer>();
119123
protected Integer _nextParameterIndex = 0;
120124

121125
protected void _setInClauseParameters(final InClauseParameter inClauseParameter, final InClauseParameter[] extraInClauseParameters, final Boolean enableExpandedInClause) {
122-
final MutableList<InClauseParameter> valueTuples = new MutableList<InClauseParameter>((extraInClauseParameters != null ? extraInClauseParameters.length : 0) + 1);
126+
final MutableList<InClauseParameter> valueTuples = new MutableArrayList<InClauseParameter>((extraInClauseParameters != null ? extraInClauseParameters.length : 0) + 1);
123127
valueTuples.add(Util.coalesce(inClauseParameter, InClauseParameter.NULL));
124128

125129
if (extraInClauseParameters != null) {
@@ -134,7 +138,7 @@ protected void _setInClauseParameters(final InClauseParameter inClauseParameter,
134138
}
135139

136140
protected <T> void _setInClauseParameters(final Iterable<? extends T> values, final ValueExtractor<T> valueExtractor, final Boolean enableExpandedInClause) {
137-
final MutableList<InClauseParameter> typedParameters = new MutableList<InClauseParameter>();
141+
final MutableList<InClauseParameter> typedParameters = new MutableArrayList<InClauseParameter>();
138142
for (final T value : values) {
139143
final InClauseParameter inClauseParameter = valueExtractor.extractValues(value);
140144
typedParameters.add(Util.coalesce(inClauseParameter, InClauseParameter.NULL));
@@ -152,15 +156,15 @@ protected Query(final Query query, final Boolean shouldConsumeQuery, final Param
152156
}
153157
else {
154158
_query = query._query;
155-
_parameters = new MutableList<TypedParameter>(query._parameters);
159+
_parameters = new MutableArrayList<TypedParameter>(query._parameters);
156160
}
157161

158162
_parameterFactory = parameterFactory;
159163
}
160164

161165
protected Query(final String query, final ParameterFactory parameterFactory) {
162166
_query = query;
163-
_parameters = new MutableList<TypedParameter>();
167+
_parameters = new MutableArrayList<TypedParameter>();
164168
_parameterFactory = parameterFactory;
165169
}
166170

@@ -170,7 +174,7 @@ public Query(final Query query) {
170174

171175
public Query(final String query) {
172176
_query = query;
173-
_parameters = new MutableList<TypedParameter>();
177+
_parameters = new MutableArrayList<TypedParameter>();
174178
_parameterFactory = new ParameterFactoryCore();
175179
}
176180

@@ -262,6 +266,30 @@ public Query setParameter(final String value) {
262266
return this;
263267
}
264268

269+
public Query setParameter(final LocalDate value) {
270+
final TypedParameter typedParameter = _parameterFactory.fromObject(value);
271+
_parameters.add(typedParameter);
272+
273+
_nextParameterIndex += 1;
274+
return this;
275+
}
276+
277+
public Query setParameter(final LocalTime value) {
278+
final TypedParameter typedParameter = _parameterFactory.fromObject(value);
279+
_parameters.add(typedParameter);
280+
281+
_nextParameterIndex += 1;
282+
return this;
283+
}
284+
285+
public Query setParameter(final LocalDateTime value) {
286+
final TypedParameter typedParameter = _parameterFactory.fromObject(value);
287+
_parameters.add(typedParameter);
288+
289+
_nextParameterIndex += 1;
290+
return this;
291+
}
292+
265293
public Query setNullParameter() {
266294
_parameters.add(NULL);
267295
_nextParameterIndex += 1;
@@ -312,7 +340,7 @@ public String getQueryString() {
312340
if (useExpandedInClause) {
313341
final Matcher columnNameMatcher = Query.TUPLE_PATTERN.matcher(rawColumnNames);
314342

315-
final MutableList<String> columnNames = new MutableList<String>();
343+
final MutableList<String> columnNames = new MutableArrayList<String>();
316344
while (columnNameMatcher.find()) {
317345
final String columnName = columnNameMatcher.group(1);
318346
columnNames.add(columnName);
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
package com.softwareverde.database.query.parameter;
22

33
public enum ParameterType {
4-
BYTE_ARRAY, STRING, WHOLE_NUMBER, FLOATING_POINT_NUMBER
4+
BYTE_ARRAY, STRING, WHOLE_NUMBER, FLOATING_POINT_NUMBER, DATE, TIME, DATETIME
55
}

src/main/java/com/softwareverde/database/query/parameter/TypedParameter.java

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
11
package com.softwareverde.database.query.parameter;
22

3+
import java.time.LocalDate;
4+
import java.time.LocalDateTime;
5+
import java.time.LocalTime;
6+
37
public class TypedParameter {
48
/**
59
* Provided only for efficiency so a new TypedParameter doesn't have to be created for a null value.
@@ -43,7 +47,7 @@ public TypedParameter(final Long value) {
4347
}
4448

4549
/**
46-
* Creates a Integer TypedParameter. The value may be null.
50+
* Creates an Integer TypedParameter. The value may be null.
4751
*/
4852
public TypedParameter(final Integer value) {
4953
this.type = ParameterType.WHOLE_NUMBER;
@@ -81,4 +85,28 @@ public TypedParameter(final byte[] value) {
8185
this.type = ParameterType.BYTE_ARRAY;
8286
this.value = value;
8387
}
88+
89+
/**
90+
* Creates a LocalDate TypedParameter. The value may be null.
91+
*/
92+
public TypedParameter(final LocalDate value) {
93+
this.type = ParameterType.DATE;
94+
this.value = value;
95+
}
96+
97+
/**
98+
* Creates a LocalTime TypedParameter. The value may be null.
99+
*/
100+
public TypedParameter(final LocalTime value) {
101+
this.type = ParameterType.TIME;
102+
this.value = value;
103+
}
104+
105+
/**
106+
* Creates a LocalDateTime TypedParameter. The value may be null.
107+
*/
108+
public TypedParameter(final LocalDateTime value) {
109+
this.type = ParameterType.DATETIME;
110+
this.value = value;
111+
}
84112
}

src/main/java/com/softwareverde/database/row/Row.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
11
package com.softwareverde.database.row;
22

3+
import java.time.LocalDate;
4+
import java.time.LocalDateTime;
5+
import java.time.LocalTime;
36
import java.util.List;
47

58
public interface Row {
@@ -12,4 +15,7 @@ public interface Row {
1215
Double getDouble(String columnName);
1316
Boolean getBoolean(String columnName);
1417
byte[] getBytes(String columnName);
18+
LocalDate getDate(String columnName);
19+
LocalTime getTime(String columnName);
20+
LocalDateTime getDateTime(String columnName);
1521
}

0 commit comments

Comments
 (0)