Skip to content

Commit

Permalink
Merge branch 'master' into rxsocks
Browse files Browse the repository at this point in the history
  • Loading branch information
RockyLOMO committed Jan 4, 2025
2 parents eda8b52 + aeb81e0 commit 2c4ed2e
Show file tree
Hide file tree
Showing 13 changed files with 235 additions and 28 deletions.
2 changes: 1 addition & 1 deletion pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
<modelVersion>4.0.0</modelVersion>
<groupId>com.github.rockylomo</groupId>
<artifactId>rx</artifactId>
<version>2.20.10-SNAPSHOT</version>
<version>2.20.11-SNAPSHOT</version>
<packaging>pom</packaging>

<parent>
Expand Down
2 changes: 1 addition & 1 deletion rxlib-x/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
<parent>
<groupId>com.github.rockylomo</groupId>
<artifactId>rx</artifactId>
<version>2.20.10-SNAPSHOT</version>
<version>2.20.11-SNAPSHOT</version>
</parent>
<artifactId>rxlib-x</artifactId>
<packaging>jar</packaging>
Expand Down
8 changes: 8 additions & 0 deletions rxlib-x/src/main/java/org/rx/jdbc/JdbcExecutable.java
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,10 @@ public interface JdbcExecutable {

ResultSet executeQuery(String sql, Object[] params, long executeTimeoutMillis);

<T> T executeScalar(String sql, Object[] params);

<T> T executeScalar(String sql, Object[] params, long executeTimeoutMillis);

<T> T executeQuery(String sql, Object[] params, BiFunc<ResultSet, T> func);

<T> T executeQuery(String sql, Object[] params, BiFunc<ResultSet, T> func, long executeTimeoutMillis);
Expand All @@ -32,6 +36,10 @@ public interface JdbcExecutable {

ResultSet executeQuery(String sql, long executeTimeoutMillis);

<T> T executeScalar(String sql);

<T> T executeScalar(String sql, long executeTimeoutMillis);

<T> T executeQuery(String sql, BiFunc<ResultSet, T> func);

<T> T executeQuery(String sql, BiFunc<ResultSet, T> func, long executeTimeoutMillis);
Expand Down
32 changes: 32 additions & 0 deletions rxlib-x/src/main/java/org/rx/jdbc/JdbcExecutor.java
Original file line number Diff line number Diff line change
Expand Up @@ -342,6 +342,22 @@ public ResultSet executeQuery(String sql, Object[] params, int cursorType, long
}
}

@Override
public <T> T executeScalar(String sql, Object[] params) {
return executeScalar(sql, params, executeTimeoutMillis);
}

@SneakyThrows
@Override
public <T> T executeScalar(String sql, Object[] params, long executeTimeoutMillis) {
try (ResultSet rs = executeQuery(sql, params, executeTimeoutMillis)) {
if (rs.next()) {
return (T) rs.getObject(1);
}
return null;
}
}

@Override
public <T> T executeQuery(String sql, Object[] params, BiFunc<ResultSet, T> func) {
return executeQuery(sql, params, func, executeTimeoutMillis);
Expand Down Expand Up @@ -500,6 +516,22 @@ public ResultSet executeQuery(String sql, long executeTimeoutMillis) {
}
}

@Override
public <T> T executeScalar(String sql) {
return executeScalar(sql, executeTimeoutMillis);
}

@SneakyThrows
@Override
public <T> T executeScalar(String sql, long executeTimeoutMillis) {
try (ResultSet rs = executeQuery(sql, executeTimeoutMillis)) {
if (rs.next()) {
return (T) rs.getObject(1);
}
return null;
}
}

@Override
public <T> T executeQuery(String sql, BiFunc<ResultSet, T> func) {
return executeQuery(sql, func, executeTimeoutMillis);
Expand Down
10 changes: 0 additions & 10 deletions rxlib-x/src/main/java/org/rx/jdbc/JdbcUtil.java
Original file line number Diff line number Diff line change
Expand Up @@ -205,16 +205,6 @@ public static void print(ResultSet resultSet) {
}
}

@SneakyThrows
public static <T> T executeScalar(ResultSet resultSet) {
try (ResultSet rs = resultSet) {
if (rs.next()) {
return (T) rs.getObject(1);
}
return null;
}
}

public static final BiFunc<String, String> TO_CAMEL_COLUMN_MAPPING = p -> CaseFormat.LOWER_UNDERSCORE.to(CaseFormat.LOWER_CAMEL, p);

public static <T> List<T> readAs(ResultSet resultSet, Type type) {
Expand Down
114 changes: 114 additions & 0 deletions rxlib-x/src/main/java/org/rx/jdbc/SimpleORM.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,114 @@
package org.rx.jdbc;

import lombok.Getter;
import lombok.RequiredArgsConstructor;
import lombok.SneakyThrows;
import org.rx.annotation.DbColumn;
import org.rx.annotation.Metadata;
import org.rx.bean.$;
import org.rx.bean.Tuple;
import org.rx.core.Cache;
import org.rx.core.Linq;
import org.rx.core.Reflects;
import org.rx.core.StringBuilder;
import org.rx.core.Sys;
import org.rx.exception.InvalidException;
import org.rx.io.EntityQueryLambda;
import org.rx.third.guava.CaseFormat;
import org.rx.util.function.BiFunc;

import java.lang.reflect.Field;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.List;

import static org.rx.core.Sys.fastCacheKey;

@RequiredArgsConstructor
public class SimpleORM {
@Getter
final JdbcExecutor executor;

static final BiFunc<Class<?>, String> TO_UNDERSCORE_TABLE_MAPPING = t -> {
Metadata md = t.getAnnotation(Metadata.class);
if (md != null) {
return md.value();
}
return CaseFormat.UPPER_CAMEL.to(CaseFormat.LOWER_UNDERSCORE, t.getSimpleName());
};

public <T> int insert(T r) {
Class<?> entityType = r.getClass();
String sql = JdbcUtil.buildInsertSql(r, TO_UNDERSCORE_TABLE_MAPPING, EntityQueryLambda.TO_UNDERSCORE_COLUMN_MAPPING, null);
return Sys.callLog(JdbcExecutor.class, entityType.getSimpleName(), new Object[]{sql}, () -> {
Tuple<Field, DbColumn> t = primaryKey(entityType);
$<Long> lastInsertId = $.$();
int re = executor.execute(sql, t.right.autoIncrement()
? Statement.RETURN_GENERATED_KEYS
: Statement.NO_GENERATED_KEYS, lastInsertId);
// log.info("insert {}[{}] -> {}", t.left.getName(), t.right.autoIncrement(), lastInsertId.v);
if (t.right.autoIncrement()) {
t.left.set(r, lastInsertId.v);
}
return re;
});
}

Tuple<Field, DbColumn> primaryKey(Class<?> entityType) {
return Cache.getOrSet(fastCacheKey("primaryKey", entityType), k -> {
Tuple<Field, DbColumn> t = Linq.from(Reflects.getFieldMap(entityType).values()).select(p -> Tuple.of(p, p.getAnnotation(DbColumn.class))).firstOrDefault(p -> {
DbColumn c = p.right;
return p.right != null && c.primaryKey();
});
if (t == null) {
throw new InvalidException("Type {} has no primary key", entityType.getName());
}
return t;
});
}

@SneakyThrows
public <T> int updateByPrimaryKey(T r) {
Class<?> entityType = r.getClass();
Field primaryKey = primaryKey(entityType).left;
Object id = primaryKey.get(r);
if (id == null) {
throw new InvalidException("Primary key {} is null", primaryKey.getName());
}
primaryKey.set(r, null);
try {
return updateBy(r, new EntityQueryLambda<T>((Class<T>) entityType) {
@Override
public String toString() {
return EntityQueryLambda.TO_UNDERSCORE_COLUMN_MAPPING.apply(primaryKey.getName()) + "=" + EntityQueryLambda.toValueString(id);
}
});
} finally {
primaryKey.set(r, id);
}
}

public <T> int updateBy(T r, EntityQueryLambda<T> q) {
Class<?> entityType = r.getClass();
String sql = JdbcUtil.buildUpdateSql(r, q, TO_UNDERSCORE_TABLE_MAPPING, EntityQueryLambda.TO_UNDERSCORE_COLUMN_MAPPING, null);
return Sys.callLog(JdbcExecutor.class, entityType.getSimpleName(), new Object[]{sql}, () -> executor.execute(sql));
}

public <T> T selectFirst(EntityQueryLambda<T> q) {
return Linq.from(selectList(q.limit(1))).firstOrDefault();
}

@SneakyThrows
public <T> List<T> selectList(EntityQueryLambda<T> q) {
q.setColumnMapping(EntityQueryLambda.TO_UNDERSCORE_COLUMN_MAPPING);
Class<?> entityType = Reflects.readField(q, "entityType");
String sql = new StringBuilder(128)
.appendMessageFormat("SELECT * FROM {} WHERE ", TO_UNDERSCORE_TABLE_MAPPING.apply(entityType))
.append(q).toString();
return Sys.callLog(JdbcExecutor.class, entityType.getSimpleName(), new Object[]{sql}, () -> {
try (ResultSet rs = executor.executeQuery(sql)) {
return JdbcUtil.readAs(rs, entityType);
}
});
}
}
4 changes: 2 additions & 2 deletions rxlib/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
<parent>
<groupId>com.github.rockylomo</groupId>
<artifactId>rx</artifactId>
<version>2.20.10-SNAPSHOT</version>
<version>2.20.11-SNAPSHOT</version>
</parent>
<!-- -SNAPSHOT -->
<artifactId>rxlib</artifactId>
Expand All @@ -15,7 +15,7 @@
<properties>
<slf4j-api.version>2.0.4</slf4j-api.version>
<logback.version>1.3.12</logback.version>
<fastjson2.version>2.0.50</fastjson2.version>
<fastjson2.version>2.0.53</fastjson2.version>
<caffeine.version>2.9.3</caffeine.version>
<commons-lang3.version>3.12.0</commons-lang3.version>
<commons-collections4.version>4.4</commons-collections4.version>
Expand Down
13 changes: 13 additions & 0 deletions rxlib/src/main/java/org/rx/core/Reflects.java
Original file line number Diff line number Diff line change
Expand Up @@ -813,4 +813,17 @@ public static boolean isBasicType(@NonNull Class<?> type) {
// || type == UUID.class;
}
//endregion

@SneakyThrows
public static void trimToNull(Object dto) {
if (dto == null) {
return;
}
for (Field field : Linq.from(getFieldMap(dto.getClass()).values()).where(p -> p.getType() == String.class)) {
String v = (String) field.get(dto);
if (Strings.isEmpty(v)) {
field.set(dto, null);
}
}
}
}
4 changes: 4 additions & 0 deletions rxlib/src/main/java/org/rx/core/Strings.java
Original file line number Diff line number Diff line change
Expand Up @@ -483,6 +483,10 @@ public interface RegularExp {
* 大小写+数字
*/
String PWD_STRENGTH = "^(?=.*\\d)(?=.*[a-z])(?=.*[A-Z]).{8,40}$";

String CN_NAME = "^[\\u4e00-\\u9fa5]{1,2}[\\u4e00-\\u9fa5·]{1,15}[\\u4e00-\\u9fa5]{1,2}$";

String EN_NAME = "^[A-Za-z.'’-]{1,20}\\s[A-Za-z.'’-]{1,20}$";
}
//endregion

Expand Down
2 changes: 1 addition & 1 deletion rxlib/src/main/java/org/rx/core/Tasks.java
Original file line number Diff line number Diff line change
Expand Up @@ -75,7 +75,7 @@ public boolean isTerminated() {
}

@Override
public boolean awaitTermination(long timeout, TimeUnit unit) throws InterruptedException {
public boolean awaitTermination(long timeout, TimeUnit unit) {
return shutdown;
}
};
Expand Down
9 changes: 9 additions & 0 deletions rxlib/src/main/java/org/rx/core/WheelTimer.java
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
import io.netty.util.internal.ThreadLocalRandom;
import lombok.*;
import org.rx.bean.$;
import org.rx.bean.DateTime;
import org.rx.bean.FlagsEnum;
import org.rx.util.function.Action;
import org.rx.util.function.Func;
Expand Down Expand Up @@ -218,6 +219,14 @@ public void run(Timeout timeout) throws Exception {

static final long TICK_DURATION = 100;
static final Map<Object, TimeoutFuture> holder = new ConcurrentHashMap<>();

public static LongUnaryOperator dailyOperator(@NonNull Func<String> timeFn) {
return d -> {
long delay = DateTime.now().setTimePart(timeFn.get()).getTime() - System.currentTimeMillis();
return delay > 0 ? delay : Constants.ONE_DAY_TOTAL_SECONDS * 1000 + delay;
};
}

final ExecutorService executor;
final HashedWheelTimer timer = new HashedWheelTimer(ThreadPool.newThreadFactory("TIMER", Thread.NORM_PRIORITY), TICK_DURATION, TimeUnit.MILLISECONDS);
final EmptyTimeout nonTask = new EmptyTimeout();
Expand Down
22 changes: 13 additions & 9 deletions rxlib/src/main/java/org/rx/spring/MxController.java
Original file line number Diff line number Diff line change
Expand Up @@ -48,15 +48,6 @@ public class MxController {
@SneakyThrows
@RequestMapping("health")
public Object health(HttpServletRequest request) {
final String rt = "1";
String multicast = request.getParameter("multicast");
if (multicast != null) {
String group = request.getParameter("group");
Integer mcId = Reflects.changeType(request.getParameter("mcId"), Integer.class);
NetEventWait.multicastLocal(Sockets.parseEndpoint(multicast), group, ifNull(mcId, 0));
return rt;
}

final HttpHeaders headers = new HttpHeaders();
// headers.setContentType(MediaType.valueOf("text/plain;charset=UTF-8"));
headers.setContentType(MediaType.TEXT_PLAIN);
Expand All @@ -74,7 +65,18 @@ public Object health(HttpServletRequest request) {
TraceHandler.INSTANCE.log("rx replay {}", buf);
return new ResponseEntity<>(buf, headers, HttpStatus.OK);
}

final String rt = "1";
ThreadPool.startTrace(null);
try {
String multicast = request.getParameter("multicast");
if (multicast != null) {
String group = request.getParameter("group");
Integer mcId = Reflects.changeType(request.getParameter("mcId"), Integer.class);
NetEventWait.multicastLocal(Sockets.parseEndpoint(multicast), group, ifNull(mcId, 0));
return rt;
}

switch (Integer.parseInt(x)) {
case 1:
Sys.diagnosticMx.setVMOption(request.getParameter("k"), request.getParameter("v"));
Expand Down Expand Up @@ -137,6 +139,8 @@ public Object health(HttpServletRequest request) {
return svrState(request);
} catch (Throwable e) {
return new ResponseEntity<>(String.format("%s\n%s", e, ExceptionUtils.getStackTrace(e)), headers, HttpStatus.OK);
} finally {
ThreadPool.endTrace();
}
}

Expand Down
Loading

0 comments on commit 2c4ed2e

Please sign in to comment.