? src/java/org/apache/turbine/util/db/adapter/DBMSSQL7.java
Index: src/java/org/apache/turbine/util/db/Query.java
===================================================================
RCS file: /home/cvspublic/jakarta-turbine/src/java/org/apache/turbine/util/db/Attic/Query.java,v
retrieving revision 1.4.10.1
diff -u -r1.4.10.1 Query.java
--- src/java/org/apache/turbine/util/db/Query.java	2001/05/07 03:06:40	1.4.10.1
+++ src/java/org/apache/turbine/util/db/Query.java	2001/08/13 18:39:23
@@ -78,7 +78,9 @@
     private static final String BETWEEN = " BETWEEN ";
     private static final String LIMIT = " LIMIT ";
     private static final String ROWCOUNT = " SET ROWCOUNT ";
+    private static final String TOP = " TOP ";
 
+
     private StringStackBuffer selectModifiers = new StringStackBuffer();
     private StringStackBuffer selectColumns = new StringStackBuffer();
     private StringStackBuffer fromTables = new StringStackBuffer();
@@ -87,6 +89,18 @@
     private String limit;
     private String rowcount;
 
+    public String getTop()
+    {
+        return top;
+    }
+
+    public void setTop(String top)
+    {
+        this.top = top;
+    }
+
+    private String top;
+
     /**
      * Retrieve the modifier buffer in order to add modifiers to this
      * query.  E.g. DISTINCT and ALL.
@@ -203,8 +217,12 @@
                 .append(rowcount)
                 .append(" ");
         stmt.append(SELECT)
-            .append(selectModifiers.toString(" "))
-            .append(selectColumns.toString(", "))
+            .append(selectModifiers.toString(" "));
+        if ( top != null )
+            stmt.append(TOP)
+                .append(top)
+                .append(" ");
+        stmt.append(selectColumns.toString(", "))
             .append(FROM)
             .append(fromTables.toString(", "));
         if ( !whereCriteria.empty() )
Index: src/java/org/apache/turbine/util/db/adapter/DB.java
===================================================================
RCS file: /home/cvspublic/jakarta-turbine/src/java/org/apache/turbine/util/db/adapter/Attic/DB.java,v
retrieving revision 1.4.10.5
diff -u -r1.4.10.5 DB.java
--- src/java/org/apache/turbine/util/db/adapter/DB.java	2001/08/06 04:48:27	1.4.10.5
+++ src/java/org/apache/turbine/util/db/adapter/DB.java	2001/08/13 18:39:24
@@ -128,6 +128,9 @@
     /** SET ROWCOUNT <limit> SELECT ... SET ROWCOUNT 0 */
     public static final int LIMIT_STYLE_SYBASE = 3;
 
+    /** SELECT TOP <limit> ...  */
+    public static final int LIMIT_STYLE_MSSQL7 = 4;
+
 
     /**
      * Empty constructor.
Index: src/java/org/apache/turbine/om/peer/BasePeer.java
===================================================================
RCS file: /home/cvspublic/jakarta-turbine/src/java/org/apache/turbine/om/peer/Attic/BasePeer.java,v
retrieving revision 1.58.4.8
diff -u -r1.58.4.8 BasePeer.java
--- src/java/org/apache/turbine/om/peer/BasePeer.java	2001/07/28 01:40:20	1.58.4.8
+++ src/java/org/apache/turbine/om/peer/BasePeer.java	2001/08/13 18:39:26
@@ -1051,45 +1051,8 @@
             }
         }
 
-        // Limit the number of rows returned.
-        int limit = criteria.getLimit();
-        int offset = criteria.getOffset();
-        String limitString = null;
-        if ( offset > 0 && db.supportsNativeOffset() )
-        {
-            switch(db.getLimitStyle())
-            {
-                case DB.LIMIT_STYLE_MYSQL:
-                    limitString = new StringBuffer().append(offset)
-                                                    .append(", ")
-                                                    .append(limit)
-                                                    .toString();
-                    break;
-                case DB.LIMIT_STYLE_POSTGRES:
-                    limitString = new StringBuffer().append(limit)
-                                                    .append(", ")
-                                                    .append(offset)
-                                                    .toString();
-                    break;
-            }
+        setLimit(criteria, db, query);
 
-            // Now set the criteria's limit and offset to return the
-            // full resultset since the results are limited on the
-            // server.
-            criteria.setLimit(-1);
-            criteria.setOffset(0);
-        }
-        else if (limit > 0 && db.supportsNativeLimit() )
-        {
-            limitString = String.valueOf(limit);
-
-            // Now set the criteria's limit to return the full
-            // resultset since the results are limited on the server.
-            criteria.setLimit(-1);
-        }
-
-        if (limitString != null) query.setLimit(limitString);
-
         String sql = query.toString();
         TurbineLogging.getLogger(TurbineConstants.SQL_LOG_FACILITY).debug(sql);
         return sql;
@@ -2145,10 +2108,21 @@
             }
         }
 
+        setLimit(criteria, db, query);
+
+        String sql = query.toString();
+        TurbineLogging.getLogger(TurbineConstants.SQL_LOG_FACILITY).debug(sql);
+        queryString.append (sql);
+    }
+
+    private static void setLimit(Criteria criteria, DB db, Query query)
+    {
         // Limit the number of rows returned.
         int limit = criteria.getLimit();
         int offset = criteria.getOffset();
         String limitString = null;
+        String topString = null;
+        String rcString = null;
         if ( offset > 0 && db.supportsNativeOffset() )
         {
             switch(db.getLimitStyle())
@@ -2158,35 +2132,49 @@
                                                     .append(", ")
                                                     .append(limit)
                                                     .toString();
+
+                    criteria.setLimit(-1);
                     break;
                 case DB.LIMIT_STYLE_POSTGRES:
                     limitString = new StringBuffer().append(limit)
                                                     .append(", ")
                                                     .append(offset)
                                                     .toString();
+
+                    criteria.setLimit(-1);
                     break;
+                default: //for DBs which support limit but not offset
+                    limit +=offset; //this needs to be implemented in the retrieval to skip records
+                    throw new UnsupportedOperationException("non-native offset is not implemented");
             }
-
-            // Now set the criteria's limit and offset to return the
-            // full resultset since the results are limited on the
-            // server.
-            criteria.setLimit(-1);
             criteria.setOffset(0);
         }
-        else if (limit > 0 && db.supportsNativeLimit() )
+        if (limit > 0 && db.supportsNativeLimit() )
         {
-            limitString = String.valueOf(limit);
+            switch(db.getLimitStyle())
+            {
+                case DB.LIMIT_STYLE_MYSQL:
+                case DB.LIMIT_STYLE_POSTGRES:
+                    limitString = String.valueOf(limit);
+                    break;
+                case DB.LIMIT_STYLE_MSSQL7:
+                    topString = String.valueOf(limit);
+                    break;
+                case DB.LIMIT_STYLE_SYBASE:
+                    rcString = String.valueOf(limit);
+                    break;
+                default:
+                    throw new UnsupportedOperationException("non-native limit is not implemented");
+            }
 
             // Now set the criteria's limit to return the full
             // resultset since the results are limited on the server.
             criteria.setLimit(-1);
         }
-
-        if (limitString != null) query.setLimit(limitString);
 
-        String sql = query.toString();
-        TurbineLogging.getLogger(TurbineConstants.SQL_LOG_FACILITY).debug(sql);
-        queryString.append (sql);
+        query.setLimit(limitString);
+        query.setRowcount(rcString);
+        query.setTop(topString);
     }
 
 }
