Ver código fonte

update sqlserver dialect

mxd 5 anos atrás
pai
commit
e0abb2e395

+ 1 - 1
pom.xml

@@ -11,7 +11,7 @@
     </parent>
     <groupId>org.ssssssss</groupId>
     <artifactId>magic-api</artifactId>
-    <version>0.1.1</version>
+    <version>0.1.2</version>
     <packaging>jar</packaging>
     <name>magic-api</name>
     <description>auto generate http api based on xml</description>

+ 7 - 5
src/main/java/org/ssssssss/magicapi/dialect/DialectUtils.java

@@ -21,15 +21,17 @@ public class DialectUtils {
     public static Dialect getDialectFromUrl(String fromUrl) {
         Dialect dialect = dialectMap.get(fromUrl);
         if (dialect == null && !dialectMap.containsKey(fromUrl)) {
-            if (fromUrl.startsWith("jdbc:mysql:") || fromUrl.startsWith("jdbc:cobar:") || fromUrl.startsWith("jdbc:log4jdbc:mysql:") || fromUrl.startsWith("jdbc:mariadb:")) {
+            if (fromUrl.contains(":mysql:") || fromUrl.contains(":cobar:") || fromUrl.contains("jdbc:mariadb:")) {
                 dialect = new MySQLDialect();
-            } else if (fromUrl.startsWith("jdbc:oracle:") || fromUrl.startsWith("jdbc:log4jdbc:oracle:")) {
+            } else if (fromUrl.contains(":oracle:")) {
                 dialect = new OracleDialect();
-            } else if (fromUrl.startsWith("jdbc:sqlserver2012:")) {
+            } else if (fromUrl.contains(":sqlserver:")) {
+                dialect = new SQLServer2005Dialect();
+            } else if (fromUrl.contains(":sqlserver2012:")) {
                 dialect = new SQLServerDialect();
-            } else if (fromUrl.startsWith("jdbc:postgresql:") || fromUrl.startsWith("jdbc:log4jdbc:postgresql:")) {
+            } else if (fromUrl.contains(":postgresql:")) {
                 dialect = new PostgreSQLDialect();
-            } else if (fromUrl.startsWith("jdbc:db2:")) {
+            } else if (fromUrl.contains(":db2:")) {
                 dialect = new DB2Dialect();
             } else {
                 logger.warn(String.format("magic-api在%s中无法获取dialect", fromUrl));

+ 58 - 0
src/main/java/org/ssssssss/magicapi/dialect/SQLServer2005Dialect.java

@@ -0,0 +1,58 @@
+package org.ssssssss.magicapi.dialect;
+
+import org.apache.commons.lang3.StringUtils;
+import org.ssssssss.magicapi.context.RequestContext;
+
+public class SQLServer2005Dialect implements Dialect {
+    @Override
+    public String getPageSql(String sql, RequestContext context, long offset, long limit) {
+        context.addParameter(offset);
+        context.addParameter(limit);
+        StringBuilder pagingBuilder = new StringBuilder();
+        String orderby = getOrderByPart(sql);
+        String distinctStr = "";
+
+        String loweredString = sql.toLowerCase();
+        String sqlPartString = sql;
+        if (loweredString.trim().startsWith("select")) {
+            int index = 6;
+            if (loweredString.startsWith("select distinct")) {
+                distinctStr = "DISTINCT ";
+                index = 15;
+            }
+            sqlPartString = sqlPartString.substring(index);
+        }
+        pagingBuilder.append(sqlPartString);
+
+        // if no ORDER BY is specified use fake ORDER BY field to avoid errors
+        if (StringUtils.isEmpty(orderby)) {
+            orderby = "ORDER BY CURRENT_TIMESTAMP";
+        }
+
+        StringBuilder result = new StringBuilder();
+        result.append("WITH query AS (SELECT ")
+                .append(distinctStr)
+                .append("TOP 100 PERCENT ")
+                .append(" ROW_NUMBER() OVER (")
+                .append(orderby)
+                .append(") as __row_number__, ")
+                .append(pagingBuilder)
+                .append(") SELECT * FROM query WHERE __row_number__ BETWEEN ? AND ?")
+                .append(" ORDER BY __row_number__");
+        context.addParameter(offset + 1);
+        context.addParameter(offset + limit);
+        return result.toString();
+    }
+
+    private String getOrderByPart(String sql) {
+        String loweredString = sql.toLowerCase();
+        int orderByIndex = loweredString.indexOf("order by");
+        if (orderByIndex != -1) {
+            // if we find a new "order by" then we need to ignore
+            // the previous one since it was probably used for a subquery
+            return sql.substring(orderByIndex);
+        } else {
+            return "";
+        }
+    }
+}