|
|
|
|
@ -1264,6 +1264,53 @@ public class TDengineService {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 验证表名是否符合TDengine规则
|
|
|
|
|
*/
|
|
|
|
|
public void validateTableName(String tableName) {
|
|
|
|
|
if (StrUtil.isBlank(tableName)) {
|
|
|
|
|
throw exception(DEVICE_MODEL_POINT_CODE_EXISTS, "表名不能为空");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// TDengine 表名规则验证
|
|
|
|
|
// 1. 不能是保留关键字
|
|
|
|
|
Set<String> reservedKeywords = new HashSet<>(Arrays.asList(
|
|
|
|
|
"value", "timestamp", "current", "database", "table", "user", "password",
|
|
|
|
|
"select", "insert", "update", "delete", "create", "drop", "alter",
|
|
|
|
|
"show", "describe", "use", "ts", "now", "current_timestamp"
|
|
|
|
|
));
|
|
|
|
|
|
|
|
|
|
if (reservedKeywords.contains(tableName.toLowerCase())) {
|
|
|
|
|
throw exception(DEVICE_MODEL_POINT_CODE_EXISTS,
|
|
|
|
|
"表名不能使用保留关键字: " + tableName);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 2. 必须以字母开头
|
|
|
|
|
if (!Character.isLetter(tableName.charAt(0))) {
|
|
|
|
|
throw exception(DEVICE_MODEL_POINT_CODE_EXISTS,
|
|
|
|
|
"表名必须以字母开头: " + tableName);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 3. 只能包含字母、数字、下划线
|
|
|
|
|
if (!tableName.matches("^[a-zA-Z][a-zA-Z0-9_]*$")) {
|
|
|
|
|
throw exception(DEVICE_MODEL_POINT_CODE_EXISTS,
|
|
|
|
|
"表名只能包含字母、数字和下划线: " + tableName);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 4. 长度限制(TDengine表名最大长度通常为192)
|
|
|
|
|
if (tableName.length() > 192) {
|
|
|
|
|
throw exception(DEVICE_MODEL_POINT_CODE_EXISTS,
|
|
|
|
|
"表名长度不能超过192个字符: " + tableName);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 5. 不能以下划线开头(与列名策略保持一致)
|
|
|
|
|
if (tableName.startsWith("_")) {
|
|
|
|
|
throw exception(DEVICE_MODEL_POINT_CODE_EXISTS,
|
|
|
|
|
"表名不能以下划线开头: " + tableName);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 根据deviceId批量查询最新时间
|
|
|
|
|
* @param deviceIds
|
|
|
|
|
|