package com.railway.common.utils.sql;

import com.railway.common.exception.base.BaseException;
import com.railway.common.utils.StringUtils;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * sql操作工具类
 *
 * @author railway
 */
public class SqlUtil {

  /**
   * 仅支持字母、数字、下划线、空格、逗号、小数点（支持多个字段排序）
   */
  public static String SQL_PATTERN = "[a-zA-Z0-9_\\ \\,\\.]+";

  /**
   * 检查字符，防止注入绕过
   */
  public static String escapeOrderBySql(String value) {
    if (StringUtils.isNotEmpty(value) && !isValidOrderBySql(value)) {
      throw new BaseException("参数不符合规范，不能进行查询");
    }
    return value;
  }

  /**
   * 验证 order by 语法是否符合规范
   */
  public static boolean isValidOrderBySql(String value) {
    return value.matches(SQL_PATTERN);
  }

  private static final Pattern HUMP_PATTERN = Pattern.compile("[A-Z]");

  /**
   * 驼峰转下划线
   */
  public static String humpToLine(String str) {
    Matcher matcher = HUMP_PATTERN.matcher(str);
    StringBuffer sb = new StringBuffer();
    while (matcher.find()) {
      matcher.appendReplacement(sb, "_" + matcher.group(0).toLowerCase());
    }
    matcher.appendTail(sb);
    return sb.toString();
  }

}
