Skip to content

Commit dc94671

Browse files
committed
reactor: 优化对clob的支持
1 parent c2f7c72 commit dc94671

File tree

9 files changed

+129
-13
lines changed

9 files changed

+129
-13
lines changed

hsweb-easy-orm-core/src/main/java/org/hswebframework/ezorm/core/ValueCodec.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package org.hswebframework.ezorm.core;
22

3+
import org.hswebframework.ezorm.core.meta.ColumnMetadata;
4+
35
public interface ValueCodec<E, D> extends Encoder<E>, Decoder<D> {
46

57
default E encodeNull(){
@@ -9,4 +11,12 @@ default E encodeNull(){
911
E encode(Object value);
1012

1113
D decode(Object data);
14+
15+
default E encode(Object value, ColumnMetadata column){
16+
return encode(value);
17+
}
18+
19+
default D decode(Object value, ColumnMetadata column){
20+
return decode(value);
21+
}
1222
}

hsweb-easy-orm-core/src/main/java/org/hswebframework/ezorm/core/meta/AbstractColumnMetadata.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ public Object decode(Object data) {
4646
return null;
4747
}
4848
if (valueCodec != null) {
49-
data = valueCodec.decode(data);
49+
data = valueCodec.decode(data, this);
5050
}
5151
if (dictionaryCodec != null) {
5252
data = dictionaryCodec.decode(data);
@@ -63,7 +63,7 @@ public Object encode(Object data) {
6363
return null;
6464
}
6565
if (valueCodec != null) {
66-
data = valueCodec.encode(data);
66+
data = valueCodec.encode(data, this);
6767
}
6868
if (dictionaryCodec != null) {
6969
data = dictionaryCodec.encode(data);

hsweb-easy-orm-rdb/pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -125,7 +125,7 @@
125125
<dependency>
126126
<groupId>org.postgresql</groupId>
127127
<artifactId>postgresql</artifactId>
128-
<version>42.3.9</version>
128+
<version>42.7.8</version>
129129
<scope>test</scope>
130130
</dependency>
131131

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
package org.hswebframework.ezorm.rdb.codec;
2+
3+
import org.reactivestreams.Publisher;
4+
import reactor.util.annotation.NonNull;
5+
6+
import java.io.IOException;
7+
import java.io.Reader;
8+
import java.io.StringReader;
9+
import java.util.stream.IntStream;
10+
11+
public class ClobValue implements CharSequence {
12+
13+
private final CharSequence charSequence;
14+
15+
public ClobValue(CharSequence charSequence) {
16+
this.charSequence = charSequence;
17+
}
18+
19+
public CharSequence source() {
20+
return charSequence;
21+
}
22+
23+
public Reader reader() {
24+
return new StringReader(String.valueOf(charSequence));
25+
}
26+
27+
@Override
28+
public String toString() {
29+
return charSequence.toString();
30+
}
31+
32+
@Override
33+
public int length() {
34+
return charSequence.length();
35+
}
36+
37+
@Override
38+
public char charAt(int index) {
39+
return charSequence.charAt(index);
40+
}
41+
42+
@Override
43+
public boolean isEmpty() {
44+
return charSequence.isEmpty();
45+
}
46+
47+
@Override
48+
@NonNull
49+
public CharSequence subSequence(int start, int end) {
50+
return charSequence.subSequence(start, end);
51+
}
52+
53+
@Override
54+
@NonNull
55+
public IntStream chars() {
56+
return charSequence.chars();
57+
}
58+
59+
@Override
60+
@NonNull
61+
public IntStream codePoints() {
62+
return charSequence.codePoints();
63+
}
64+
}

hsweb-easy-orm-rdb/src/main/java/org/hswebframework/ezorm/rdb/codec/ClobValueCodec.java

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,24 +4,42 @@
44
import io.netty.buffer.ByteBuf;
55
import lombok.SneakyThrows;
66
import org.hswebframework.ezorm.core.ValueCodec;
7+
import org.hswebframework.ezorm.core.meta.ColumnMetadata;
8+
import org.hswebframework.ezorm.rdb.metadata.RDBColumnMetadata;
79
import org.hswebframework.ezorm.rdb.utils.FeatureUtils;
810
import reactor.core.publisher.Flux;
911
import reactor.core.publisher.Mono;
1012

1113
import java.nio.ByteBuffer;
1214
import java.nio.charset.StandardCharsets;
1315
import java.sql.Clob;
16+
import java.sql.JDBCType;
1417
import java.util.concurrent.TimeUnit;
1518
import java.util.stream.Collectors;
1619

1720
public class ClobValueCodec implements ValueCodec {
1821

1922
public static final ClobValueCodec INSTANCE = new ClobValueCodec();
2023

24+
@Override
25+
public Object encode(Object value, ColumnMetadata column) {
26+
Object val = this.encode(value);
27+
if (val instanceof CharSequence cs && column instanceof RDBColumnMetadata col) {
28+
if (col.getType().getSqlType() == JDBCType.LONGVARCHAR ||
29+
col.getType().getSqlType() == JDBCType.LONGNVARCHAR ||
30+
col.getType().getSqlType() == JDBCType.CLOB) {
31+
return new ClobValue(cs);
32+
}
33+
}
34+
return val;
35+
}
36+
2137
@Override
2238
@SneakyThrows
2339
public Object encode(Object value) {
24-
40+
if (value == null) {
41+
return null;
42+
}
2543
if (value instanceof Clob) {
2644
return value;
2745
}

hsweb-easy-orm-rdb/src/main/java/org/hswebframework/ezorm/rdb/codec/JsonValueCodec.java

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@
1010
import lombok.SneakyThrows;
1111
import lombok.extern.slf4j.Slf4j;
1212
import org.hswebframework.ezorm.core.ValueCodec;
13+
import org.hswebframework.ezorm.core.meta.ColumnMetadata;
14+
import org.hswebframework.ezorm.rdb.metadata.RDBColumnMetadata;
1315
import org.hswebframework.ezorm.rdb.utils.FeatureUtils;
1416
import org.reactivestreams.Publisher;
1517
import reactor.core.publisher.Flux;
@@ -22,6 +24,7 @@
2224
import java.nio.ByteBuffer;
2325
import java.sql.Blob;
2426
import java.sql.Clob;
27+
import java.sql.JDBCType;
2528
import java.util.Collection;
2629
import java.util.Map;
2730
import java.util.TimeZone;
@@ -101,6 +104,20 @@ public JsonValueCodec(Class<?> targetType, JavaType type) {
101104
this.targetType = targetType;
102105
}
103106

107+
@Override
108+
public Object encode(Object value, ColumnMetadata column) {
109+
Object data = encode(value);
110+
if (data instanceof CharSequence cs && column instanceof RDBColumnMetadata col) {
111+
// clob 类型
112+
if (col.getType().getSqlType() == JDBCType.LONGVARCHAR ||
113+
col.getType().getSqlType() == JDBCType.LONGNVARCHAR ||
114+
col.getType().getSqlType() == JDBCType.CLOB) {
115+
return new ClobValue(cs);
116+
}
117+
}
118+
return data;
119+
}
120+
104121
@Override
105122
@SneakyThrows
106123
public Object encode(Object value) {
@@ -145,7 +162,7 @@ public Object decode(Object data) {
145162
} else if (data instanceof ByteBuffer) {
146163
return doRead(new ByteBufferBackedInputStream(((ByteBuffer) data)));
147164
} else if (FeatureUtils.r2dbcIsAlive()) {
148-
Mono mono = null;
165+
Mono<?> mono = null;
149166
if (data instanceof io.r2dbc.spi.Clob) {
150167
mono = Flux.from(((io.r2dbc.spi.Clob) data).stream())
151168
.collect(Collectors.joining())

hsweb-easy-orm-rdb/src/main/java/org/hswebframework/ezorm/rdb/executor/jdbc/JdbcSqlExecutorHelper.java

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,12 @@
11
package org.hswebframework.ezorm.rdb.executor.jdbc;
22

33
import lombok.SneakyThrows;
4+
import org.hswebframework.ezorm.rdb.codec.ClobValue;
45
import org.hswebframework.ezorm.rdb.executor.NullValue;
56

7+
import javax.sql.rowset.serial.SerialClob;
68
import java.io.ByteArrayInputStream;
9+
import java.io.CharArrayReader;
710
import java.sql.*;
811
import java.util.ArrayList;
912
import java.util.Date;
@@ -39,9 +42,11 @@ protected static void preparedStatementParameter(PreparedStatement statement, Ob
3942
statement.setNull(index++, ((NullValue) object).getDataType().getSqlType().getVendorTypeNumber());
4043
} else if (object instanceof Date) {
4144
statement.setTimestamp(index++, new java.sql.Timestamp(((Date) object).getTime()));
42-
} else if (object instanceof byte[]) {
43-
statement.setBlob(index++, new ByteArrayInputStream((byte[]) object));
44-
} else{
45+
} else if (object instanceof byte[] b) {
46+
statement.setBlob(index++, new ByteArrayInputStream(b));
47+
} else if (object instanceof ClobValue cb) {
48+
statement.setCharacterStream(index++, cb.reader());
49+
} else {
4550
statement.setObject(index++, object);
4651
}
4752

hsweb-easy-orm-rdb/src/main/java/org/hswebframework/ezorm/rdb/executor/reactive/r2dbc/R2dbcReactiveSqlExecutor.java

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,11 @@
11
package org.hswebframework.ezorm.rdb.executor.reactive.r2dbc;
22

3-
import io.r2dbc.spi.ColumnMetadata;
4-
import io.r2dbc.spi.Connection;
5-
import io.r2dbc.spi.Result;
6-
import io.r2dbc.spi.Statement;
3+
import io.r2dbc.spi.*;
74
import lombok.Getter;
85
import lombok.Setter;
96
import lombok.extern.slf4j.Slf4j;
107
import org.hswebframework.ezorm.core.CastUtil;
8+
import org.hswebframework.ezorm.rdb.codec.ClobValue;
119
import org.hswebframework.ezorm.rdb.executor.BatchSqlRequest;
1210
import org.hswebframework.ezorm.rdb.executor.DefaultColumnWrapperContext;
1311
import org.hswebframework.ezorm.rdb.executor.NullValue;
@@ -256,6 +254,10 @@ protected Statement prepareStatement(Statement statement, SqlRequest request) {
256254
} else if (parameter instanceof NullValue) {
257255
bindNull(statement, index, ((NullValue) parameter).getDataType().getJavaType());
258256
} else {
257+
// convert clob
258+
if (parameter instanceof ClobValue cb) {
259+
parameter = Clob.from(Mono.just(cb.source()));
260+
}
259261
bind(statement, index, parameter);
260262
}
261263
index++;

hsweb-easy-orm-rdb/src/test/java/org/hswebframework/ezorm/rdb/codec/ClobValueCodecTest.java renamed to hsweb-easy-orm-rdb/src/test/java/org/hswebframework/ezorm/rdb/codec/R2dbcClobValueCodecTest.java

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

77
import static org.junit.Assert.*;
88

9-
public class ClobValueCodecTest {
9+
public class R2dbcClobValueCodecTest {
1010

1111

1212
@Test

0 commit comments

Comments
 (0)