Skip to content

Commit 8116166

Browse files
authored
fixed escaping in sybase-dialect (#27)
1 parent e13b46f commit 8116166

27 files changed

Lines changed: 258 additions & 36 deletions

pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33

44
<groupId>de.jaggl.sqlbuilder</groupId>
55
<artifactId>sqlbuilder-core</artifactId>
6-
<version>2.7.0</version>
6+
<version>2.7.1</version>
77

88
<packaging>jar</packaging>
99

Lines changed: 161 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,161 @@
1+
package de.jaggl.sqlbuilder.core.columns.datetime;
2+
3+
import static de.jaggl.sqlbuilder.core.conditions.GenericCondition.GenericConditionType.IS_BETWEEN;
4+
import static de.jaggl.sqlbuilder.core.conditions.GenericCondition.GenericConditionType.IS_EQUAL_TO;
5+
import static de.jaggl.sqlbuilder.core.conditions.GenericCondition.GenericConditionType.IS_GREATER_THAN;
6+
import static de.jaggl.sqlbuilder.core.conditions.GenericCondition.GenericConditionType.IS_GREATER_THAN_OR_EQUAL_TO;
7+
import static de.jaggl.sqlbuilder.core.conditions.GenericCondition.GenericConditionType.IS_LESS_THAN;
8+
import static de.jaggl.sqlbuilder.core.conditions.GenericCondition.GenericConditionType.IS_LESS_THAN_OR_EQUAL_TO;
9+
import static de.jaggl.sqlbuilder.core.conditions.GenericCondition.GenericConditionType.IS_NOT_EQUAL_TO;
10+
import static de.jaggl.sqlbuilder.core.conditions.GenericCondition.GenericConditionType.IS_NOT_NULL;
11+
import static de.jaggl.sqlbuilder.core.conditions.GenericCondition.GenericConditionType.IS_NULL;
12+
import static java.sql.Types.DATE;
13+
14+
import java.time.LocalTime;
15+
16+
import de.jaggl.sqlbuilder.core.columns.Column;
17+
import de.jaggl.sqlbuilder.core.columns.ColumnDefinition;
18+
import de.jaggl.sqlbuilder.core.conditions.Condition;
19+
import de.jaggl.sqlbuilder.core.conditions.GenericCondition;
20+
import de.jaggl.sqlbuilder.core.domain.Placeholder;
21+
import de.jaggl.sqlbuilder.core.schema.Table;
22+
import lombok.ToString;
23+
24+
/**
25+
* @author Martin Schumacher
26+
*
27+
* @since 2.0.0
28+
*/
29+
@ToString(callSuper = true)
30+
public class TimeColumn extends Column
31+
{
32+
public TimeColumn(Table table, String name, String alias, ColumnDefinition columnDefinition)
33+
{
34+
super(table, name, alias, columnDefinition, DATE);
35+
}
36+
37+
public TimeColumn as(String alias)
38+
{
39+
return new TimeColumn(table, name, alias, columnDefinition);
40+
}
41+
42+
public Condition isEqualTo(LocalTime value)
43+
{
44+
return value == null ? new GenericCondition(IS_NULL, this) : new GenericCondition(IS_EQUAL_TO, this, value);
45+
}
46+
47+
public Condition eq(LocalTime value)
48+
{
49+
return isEqualTo(value);
50+
}
51+
52+
public Condition isNotEqualTo(LocalTime value)
53+
{
54+
return value == null ? new GenericCondition(IS_NOT_NULL, this) : new GenericCondition(IS_NOT_EQUAL_TO, this, value);
55+
}
56+
57+
public Condition nEq(LocalTime value)
58+
{
59+
return isNotEqualTo(value);
60+
}
61+
62+
public Condition isAfter(LocalTime value)
63+
{
64+
return new GenericCondition(IS_GREATER_THAN, this, value);
65+
}
66+
67+
public Condition isAfter(Column otherColumn)
68+
{
69+
return new GenericCondition(IS_GREATER_THAN, this, otherColumn);
70+
}
71+
72+
public Condition isAfter(Placeholder placeholder)
73+
{
74+
return new GenericCondition(IS_GREATER_THAN, this, placeholder);
75+
}
76+
77+
public Condition isAfterOrEqualTo(LocalTime value)
78+
{
79+
return new GenericCondition(IS_GREATER_THAN_OR_EQUAL_TO, this, value);
80+
}
81+
82+
public Condition isAfterOrEqualTo(Column otherColumn)
83+
{
84+
return new GenericCondition(IS_GREATER_THAN_OR_EQUAL_TO, this, otherColumn);
85+
}
86+
87+
public Condition isAfterOrEqualTo(Placeholder placeholder)
88+
{
89+
return new GenericCondition(IS_GREATER_THAN_OR_EQUAL_TO, this, placeholder);
90+
}
91+
92+
public Condition isBefore(LocalTime value)
93+
{
94+
return new GenericCondition(IS_LESS_THAN, this, value);
95+
}
96+
97+
public Condition isBefore(Column otherColumn)
98+
{
99+
return new GenericCondition(IS_LESS_THAN, this, otherColumn);
100+
}
101+
102+
public Condition isBefore(Placeholder placeholder)
103+
{
104+
return new GenericCondition(IS_LESS_THAN, this, placeholder);
105+
}
106+
107+
public Condition isBeforeOrEqualTo(LocalTime value)
108+
{
109+
return new GenericCondition(IS_LESS_THAN_OR_EQUAL_TO, this, value);
110+
}
111+
112+
public Condition isBeforeOrEqualTo(Column otherColumn)
113+
{
114+
return new GenericCondition(IS_LESS_THAN_OR_EQUAL_TO, this, otherColumn);
115+
}
116+
117+
public Condition isBeforeOrEqualTo(Placeholder placeholder)
118+
{
119+
return new GenericCondition(IS_LESS_THAN_OR_EQUAL_TO, this, placeholder);
120+
}
121+
122+
public Condition isBetween(LocalTime value1, LocalTime value2)
123+
{
124+
return new GenericCondition(IS_BETWEEN, this, value1, value2);
125+
}
126+
127+
public Condition isBetween(Column otherColumn1, Column otherColumn2)
128+
{
129+
return new GenericCondition(IS_BETWEEN, this, otherColumn1, otherColumn2);
130+
}
131+
132+
public Condition isBetween(LocalTime value, Column otherColumn)
133+
{
134+
return new GenericCondition(IS_BETWEEN, this, value, otherColumn);
135+
}
136+
137+
public Condition isBetween(Column otherColumn, LocalTime value)
138+
{
139+
return new GenericCondition(IS_BETWEEN, this, otherColumn, value);
140+
}
141+
142+
public Condition isBetween(Column otherColumn, Placeholder placeholder)
143+
{
144+
return new GenericCondition(IS_BETWEEN, this, otherColumn, placeholder);
145+
}
146+
147+
public Condition isBetween(LocalTime value, Placeholder placeholder)
148+
{
149+
return new GenericCondition(IS_BETWEEN, this, value, placeholder);
150+
}
151+
152+
public Condition isBetween(Placeholder placeholder, LocalTime value)
153+
{
154+
return new GenericCondition(IS_BETWEEN, this, placeholder, value);
155+
}
156+
157+
public Condition isBetween(Placeholder placeholder, Column otherColumn)
158+
{
159+
return new GenericCondition(IS_BETWEEN, this, placeholder, otherColumn);
160+
}
161+
}
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
package de.jaggl.sqlbuilder.core.columns.datetime;
2+
3+
import java.time.LocalDate;
4+
5+
import de.jaggl.sqlbuilder.core.columns.ColumnBuilder;
6+
import de.jaggl.sqlbuilder.core.columns.ColumnDefinition;
7+
import de.jaggl.sqlbuilder.core.schema.Table;
8+
9+
/**
10+
* @author Martin Schumacher
11+
*
12+
* @since 2.0.0
13+
*/
14+
public class TimeColumnBuilder extends ColumnBuilder<TimeColumn, TimeColumnBuilder, LocalDate>
15+
{
16+
public TimeColumnBuilder(Table table, String name)
17+
{
18+
super(table, name);
19+
}
20+
21+
@Override
22+
protected TimeColumn getColumnInstance()
23+
{
24+
return new TimeColumn(table, name, null, new ColumnDefinition("TIME", null, isNullable, isDefaultNull, false, false, defaultValue));
25+
}
26+
}

src/main/java/de/jaggl/sqlbuilder/core/dialect/DefaultDialect.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,9 +42,16 @@ public abstract class DefaultDialect implements Dialect
4242
{
4343
static final DateTimeFormatter DATE_FORMATTER = DateTimeFormatter.ISO_DATE;
4444
static final DateTimeFormatter DATE_TIME_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.nnnnnn");
45+
static final DateTimeFormatter TIME_FORMATTER = DateTimeFormatter.ofPattern("HH:mm:ss.nnnnnn");
4546

4647
private Labels labels = DefaultLabels.getInstance();
4748

49+
@Override
50+
public String escape(String value, char apostrophe)
51+
{
52+
return value.replace("\\", "\\\\").replace(Character.toString(apostrophe), "\\" + apostrophe);
53+
}
54+
4855
@Override
4956
public final String build(Insert insert, Indentation indentation)
5057
{
@@ -409,6 +416,12 @@ public DateTimeFormatter getDateTimeFormatter()
409416
return DATE_TIME_FORMATTER;
410417
}
411418

419+
@Override
420+
public DateTimeFormatter getTimeFormatter()
421+
{
422+
return TIME_FORMATTER;
423+
}
424+
412425
@Override
413426
public Labels getLabels()
414427
{

src/main/java/de/jaggl/sqlbuilder/core/dialect/Dialect.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,8 +34,12 @@ public interface Dialect
3434

3535
DateTimeFormatter getDateTimeFormatter();
3636

37+
DateTimeFormatter getTimeFormatter();
38+
3739
Labels getLabels();
3840

41+
String escape(String value, char apostrophe);
42+
3943
public static void register(Dialect dialect)
4044
{
4145
Dialects.register(dialect);

src/main/java/de/jaggl/sqlbuilder/core/dialect/SybaseDialect.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,12 @@ public String getName()
4040
return "Sybase";
4141
}
4242

43+
@Override
44+
public String escape(String value, char apostrophe)
45+
{
46+
return value.replace(String.valueOf(apostrophe), String.valueOf(apostrophe) + String.valueOf(apostrophe));
47+
}
48+
4349
@Override
4450
protected void appendInsertStatement(StringBuilder builder, Insert insert, BuildingContext context, Indentation indentation)
4551
{

src/main/java/de/jaggl/sqlbuilder/core/queries/Insert.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,14 @@
44

55
import java.time.LocalDate;
66
import java.time.LocalDateTime;
7+
import java.time.LocalTime;
78
import java.util.LinkedHashMap;
89
import java.util.Map;
910

1011
import de.jaggl.sqlbuilder.core.columns.Column;
1112
import de.jaggl.sqlbuilder.core.columns.datetime.DateColumn;
1213
import de.jaggl.sqlbuilder.core.columns.datetime.DateTimeColumn;
14+
import de.jaggl.sqlbuilder.core.columns.datetime.TimeColumn;
1315
import de.jaggl.sqlbuilder.core.columns.number.NumberColumn;
1416
import de.jaggl.sqlbuilder.core.columns.string.StringColumn;
1517
import de.jaggl.sqlbuilder.core.dialect.Dialect;
@@ -96,6 +98,11 @@ public Insert set(DateTimeColumn column, LocalDateTime value)
9698
return addValue(column, new PlainValuable(value));
9799
}
98100

101+
public Insert set(TimeColumn column, LocalTime value)
102+
{
103+
return addValue(column, new PlainValuable(value));
104+
}
105+
99106
private Insert addValue(Column column, Valuable value)
100107
{
101108
values.put(column, value);

src/main/java/de/jaggl/sqlbuilder/core/schema/Table.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@
1010
import de.jaggl.sqlbuilder.core.columns.datetime.DateColumnBuilder;
1111
import de.jaggl.sqlbuilder.core.columns.datetime.DateTimeColumn;
1212
import de.jaggl.sqlbuilder.core.columns.datetime.DateTimeColumnBuilder;
13+
import de.jaggl.sqlbuilder.core.columns.datetime.TimeColumn;
14+
import de.jaggl.sqlbuilder.core.columns.datetime.TimeColumnBuilder;
1315
import de.jaggl.sqlbuilder.core.columns.number.doubletype.DecimalColumn;
1416
import de.jaggl.sqlbuilder.core.columns.number.doubletype.DecimalColumnBuilder;
1517
import de.jaggl.sqlbuilder.core.columns.number.doubletype.DoubleColumn;
@@ -256,6 +258,17 @@ public DateTimeColumnBuilder dateTimeColumn(String columnName)
256258
return new DateTimeColumnBuilder(this, columnName);
257259
}
258260

261+
/**
262+
* Creates a {@link TimeColumnBuilder} to build a {@link TimeColumn} with the given name for the current {@link Table}
263+
*
264+
* @param columnName the name for the {@link TimeColumn} to be build
265+
* @return the {@link TimeColumnBuilder} to build a {@link TimeColumn} from
266+
*/
267+
public TimeColumnBuilder timeColumn(String columnName)
268+
{
269+
return new TimeColumnBuilder(this, columnName);
270+
}
271+
259272
<T extends Column> T addColumn(T column)
260273
{
261274
if (columns == null)

src/main/java/de/jaggl/sqlbuilder/core/utils/BuilderUtils.java

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66

77
import java.time.LocalDate;
88
import java.time.LocalDateTime;
9+
import java.time.LocalTime;
910

1011
import de.jaggl.sqlbuilder.core.columns.Column;
1112
import de.jaggl.sqlbuilder.core.domain.BuildingContext;
@@ -63,22 +64,26 @@ private static String getValued(Object value, String prefix, String postfix, Bui
6364
{
6465
return valueApostrophe(prefix + context.getDialect().getDateTimeFormatter().format((LocalDateTime) value) + postfix, context);
6566
}
67+
if (LocalTime.class.isAssignableFrom(value.getClass()))
68+
{
69+
return valueApostrophe(prefix + context.getDialect().getTimeFormatter().format((LocalTime) value) + postfix, context);
70+
}
6671
return valueApostrophe(prefix + String.valueOf(value) + postfix, context);
6772
}
6873

6974
public static String columnApostrophe(String value, BuildingContext context)
7075
{
71-
return apostrophe(value, context.getDialect().getLabels().getColumnApostrophe());
76+
return apostrophe(value, context.getDialect().getLabels().getColumnApostrophe(), context);
7277
}
7378

7479
public static String valueApostrophe(String value, BuildingContext context)
7580
{
76-
return apostrophe(value, context.getDialect().getLabels().getValueApostrophe());
81+
return apostrophe(value, context.getDialect().getLabels().getValueApostrophe(), context);
7782
}
7883

79-
private static String apostrophe(String value, char apostrophe)
84+
private static String apostrophe(String value, char apostrophe, BuildingContext context)
8085
{
81-
return apostrophe + value.replaceAll("\\\\", "\\\\\\\\").replaceAll(Character.toString(apostrophe), "\\\\" + apostrophe) + apostrophe;
86+
return apostrophe + context.getDialect().escape(value, apostrophe) + apostrophe;
8287
}
8388

8489
public static String buildLikePart(Object value, LikeType likeType, BuildingContext context, Indentation indentation)

src/test/java/de/jaggl/sqlbuilder/core/conditions/CombinedConditionTest.java

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,6 @@
44

55
import org.junit.jupiter.api.Test;
66

7-
import de.jaggl.sqlbuilder.core.conditions.CombinedCondition;
8-
97
class CombinedConditionTest
108
{
119
@Test

0 commit comments

Comments
 (0)