You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@subversion.apache.org by hw...@apache.org on 2011/05/17 15:27:42 UTC

svn commit: r1104234 - in /subversion/trunk/subversion/libsvn_wc: wc-queries.sql wc_db.c

Author: hwright
Date: Tue May 17 13:27:42 2011
New Revision: 1104234

URL: http://svn.apache.org/viewvc?rev=1104234&view=rev
Log:
Use the targets list to implement depth filtering for recursive propgets.

This reduces the number or paths and queries in the code.  The queries could
probably be further optimized.

* subversion/libsvn_wc/wc-queries.sql
  (STMT_CACHE_NODE_PROPS_RECURSIVE, STMT_CACHE_ACTUAL_PROPS_RECURSIVE,
   STMT_CACHE_NODE_BASE_PROPS_RECURSIVE, STMT_CACHE_NODE_PROPS_OF_CHILDREN,
   STMT_CACHE_ACTUAL_PROPS_OF_CHILDREN, STMT_CACHE_NODE_BASE_PROPS_OF_CHILDREN):
    Remove.
  (STMT_CACHE_NODE_PROPS, STMT_CACHE_ACTUAL_PROPS,
   STMT_CACHE_NODE_BASE_PROPS): New.

* subversion/libsvn_wc/wc_db.c
  (cache_props_baton_t): Add depth, remove immediates_only.
  (cache_props_recursive): Choose the statement based upon pristine props or
    not.  Don't worry about depth.
  (svn_wc__db_read_props_streamily): Don't bother with immediates_only.

Modified:
    subversion/trunk/subversion/libsvn_wc/wc-queries.sql
    subversion/trunk/subversion/libsvn_wc/wc_db.c

Modified: subversion/trunk/subversion/libsvn_wc/wc-queries.sql
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_wc/wc-queries.sql?rev=1104234&r1=1104233&r2=1104234&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_wc/wc-queries.sql (original)
+++ subversion/trunk/subversion/libsvn_wc/wc-queries.sql Tue May 17 13:27:42 2011
@@ -1018,60 +1018,31 @@ CREATE TEMPORARY TABLE temp__node_props_
 CREATE UNIQUE INDEX temp__node_props_cache_unique
   ON temp__node_props_cache (local_relpath) */
 
--- STMT_CACHE_NODE_PROPS_RECURSIVE
+-- STMT_CACHE_NODE_PROPS
 INSERT INTO temp__node_props_cache(local_relpath, kind, properties)
  SELECT local_relpath, kind, properties FROM nodes_current
   WHERE wc_id = ?1
-    AND (?2 = '' OR local_relpath = ?2 OR local_relpath LIKE ?3 ESCAPE '#')
+    AND local_relpath IN (SELECT local_relpath FROM targets_list)
     AND local_relpath NOT IN (
       SELECT local_relpath FROM actual_node WHERE wc_id = ?1)
     AND presence IN ('normal', 'incomplete')
 
--- STMT_CACHE_ACTUAL_PROPS_RECURSIVE
+-- STMT_CACHE_ACTUAL_PROPS
 INSERT INTO temp__node_props_cache (local_relpath, kind, properties)
   SELECT A.local_relpath, N.kind, A.properties
   FROM actual_node AS A JOIN nodes_current AS N
     ON A.wc_id = N.wc_id AND A.local_relpath = N.local_relpath
        AND N.presence IN ('normal', 'incomplete')
   WHERE A.wc_id = ?1
-    AND (?2 = '' OR A.local_relpath = ?2 OR A.local_relpath LIKE ?3 ESCAPE '#')
+    AND A.local_relpath IN (SELECT local_relpath FROM targets_list)
     AND A.local_relpath NOT IN
       (SELECT local_relpath FROM temp__node_props_cache)
 
--- STMT_CACHE_NODE_BASE_PROPS_RECURSIVE
+-- STMT_CACHE_NODE_BASE_PROPS
 INSERT INTO temp__node_props_cache (local_relpath, kind, properties)
   SELECT local_relpath, kind, properties FROM nodes_base
   WHERE wc_id = ?1
-    AND (?2 = '' OR local_relpath = ?2 OR local_relpath LIKE ?3 ESCAPE '#')
-    AND local_relpath NOT IN (
-      SELECT local_relpath FROM actual_node WHERE wc_id = ?1)
-    AND presence IN ('normal', 'incomplete')
-
--- STMT_CACHE_NODE_PROPS_OF_CHILDREN
-INSERT INTO temp__node_props_cache (local_relpath, kind, properties)
-  SELECT local_relpath, kind, properties FROM nodes_current
-  WHERE wc_id = ?1
-    AND (local_relpath = ?2 OR parent_relpath = ?2)
-    AND local_relpath NOT IN (
-      SELECT local_relpath FROM actual_node WHERE wc_id = ?1)
-    AND presence IN ('normal', 'incomplete')
-
--- STMT_CACHE_ACTUAL_PROPS_OF_CHILDREN
-INSERT INTO temp__node_props_cache (local_relpath, kind, properties)
-  SELECT A.local_relpath, N.kind, A.properties
-  FROM actual_node AS A JOIN nodes_current AS N
-    ON A.wc_id = N.wc_id AND A.local_relpath = N.local_relpath
-       AND N.presence IN ('normal', 'incomplete')
-  WHERE A.wc_id = ?1
-    AND (A.local_relpath = ?2 OR A.parent_relpath = ?2)
-    AND A.local_relpath NOT IN
-      (SELECT local_relpath FROM temp__node_props_cache)
-
--- STMT_CACHE_NODE_BASE_PROPS_OF_CHILDREN
-INSERT INTO temp__node_props_cache (local_relpath, kind, properties)
-  SELECT local_relpath, kind, properties FROM nodes_base
-  WHERE wc_id = ?1
-    AND (local_relpath = ?2 OR parent_relpath = ?2)
+    AND local_relpath IN (SELECT local_relpath FROM targets_list)
     AND local_relpath NOT IN (
       SELECT local_relpath FROM actual_node WHERE wc_id = ?1)
     AND presence IN ('normal', 'incomplete')

Modified: subversion/trunk/subversion/libsvn_wc/wc_db.c
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_wc/wc_db.c?rev=1104234&r1=1104233&r2=1104234&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_wc/wc_db.c (original)
+++ subversion/trunk/subversion/libsvn_wc/wc_db.c Tue May 17 13:27:42 2011
@@ -7647,7 +7647,7 @@ svn_wc__db_read_props(apr_hash_t **props
 */
 typedef struct cache_props_baton_t
 {
-  svn_boolean_t immediates_only;
+  svn_depth_t depth;
   svn_boolean_t base_props;
   svn_boolean_t pristine;
   svn_cancel_func_t cancel_func;
@@ -7663,32 +7663,21 @@ cache_props_recursive(void *cb_baton,
 {
   cache_props_baton_t *baton = cb_baton;
   svn_sqlite__stmt_t *stmt;
+  int stmt_idx;
+
+  SVN_ERR(populate_targets_tree(wcroot, local_relpath, baton->depth, NULL,
+                                scratch_pool));
 
   SVN_ERR(svn_sqlite__exec_statements(wcroot->sdb,
                                       STMT_CREATE_NODE_PROPS_CACHE));
 
-  if (baton->immediates_only)
-    {
-      if (baton->base_props)
-        SVN_ERR(svn_sqlite__get_statement(&stmt, wcroot->sdb,
-                                    STMT_CACHE_NODE_BASE_PROPS_OF_CHILDREN));
-      else
-        SVN_ERR(svn_sqlite__get_statement(&stmt, wcroot->sdb,
-                                          STMT_CACHE_NODE_PROPS_OF_CHILDREN));
-      SVN_ERR(svn_sqlite__bindf(stmt, "is", wcroot->wc_id, local_relpath));
-    }
+  if (baton->base_props)
+    stmt_idx = STMT_CACHE_NODE_BASE_PROPS;
   else
-    {
-      if (baton->base_props)
-        SVN_ERR(svn_sqlite__get_statement(&stmt, wcroot->sdb,
-                                        STMT_CACHE_NODE_BASE_PROPS_RECURSIVE));
-      else
-        SVN_ERR(svn_sqlite__get_statement(&stmt, wcroot->sdb,
-                                          STMT_CACHE_NODE_PROPS_RECURSIVE));
-      SVN_ERR(svn_sqlite__bindf(stmt, "iss", wcroot->wc_id, local_relpath,
-                                construct_like_arg(local_relpath,
-                                                   scratch_pool)));
-    }
+    stmt_idx = STMT_CACHE_NODE_PROPS;
+
+  SVN_ERR(svn_sqlite__get_statement(&stmt, wcroot->sdb, stmt_idx));
+  SVN_ERR(svn_sqlite__bind_int64(stmt, 1, wcroot->wc_id));
   SVN_ERR(svn_sqlite__step_done(stmt));
 
   /* ACTUAL props aren't relevant in the pristine case. */
@@ -7698,20 +7687,9 @@ cache_props_recursive(void *cb_baton,
   if (baton->cancel_func)
     SVN_ERR(baton->cancel_func(baton->cancel_baton));
  
-  if (baton->immediates_only)
-    {
-      SVN_ERR(svn_sqlite__get_statement(&stmt, wcroot->sdb,
-                                        STMT_CACHE_ACTUAL_PROPS_OF_CHILDREN));
-      SVN_ERR(svn_sqlite__bindf(stmt, "is", wcroot->wc_id, local_relpath));
-    }
-  else
-    {
-      SVN_ERR(svn_sqlite__get_statement(&stmt, wcroot->sdb,
-                                        STMT_CACHE_ACTUAL_PROPS_RECURSIVE));
-      SVN_ERR(svn_sqlite__bindf(stmt, "iss", wcroot->wc_id, local_relpath,
-                                construct_like_arg(local_relpath,
-                                                   scratch_pool)));
-    }
+  SVN_ERR(svn_sqlite__get_statement(&stmt, wcroot->sdb,
+                                    STMT_CACHE_ACTUAL_PROPS));
+  SVN_ERR(svn_sqlite__bind_int64(stmt, 1, wcroot->wc_id));
   SVN_ERR(svn_sqlite__step_done(stmt));
 
   return SVN_NO_ERROR;
@@ -7739,8 +7717,6 @@ svn_wc__db_read_props_streamily(svn_wc__
   int row_number;
   apr_pool_t *iterpool;
   svn_boolean_t files_only = (depth == svn_depth_files);
-  svn_boolean_t immediates_only = ((depth == svn_depth_immediates) ||
-                                   (depth == svn_depth_files));
 
   SVN_ERR_ASSERT(svn_dirent_is_absolute(local_abspath));
   SVN_ERR_ASSERT(receiver_func);
@@ -7753,7 +7729,7 @@ svn_wc__db_read_props_streamily(svn_wc__
                                                 scratch_pool, scratch_pool));
   VERIFY_USABLE_WCROOT(wcroot);
 
-  baton.immediates_only = immediates_only;
+  baton.depth = depth;
   baton.base_props = base_props;
   baton.pristine = pristine;
   baton.cancel_func = cancel_func;