You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@subversion.apache.org by ko...@apache.org on 2021/02/13 14:25:35 UTC

svn commit: r1886488 - in /subversion/trunk/subversion: include/private/svn_sqlite.h libsvn_wc/wc_db_private.h

Author: kotkov
Date: Sat Feb 13 14:25:35 2021
New Revision: 1886488

URL: http://svn.apache.org/viewvc?rev=1886488&view=rev
Log:
Provide a couple of helper macros that allow executing 2 or 3 expressions
within an SQLite savepoint.  We already have versions of these macros for
1 and 4 expressions, so add their missing counterparts, as those could be
useful in the future.

* subversion/include/private/svn_sqlite.h
  (SVN_SQLITE__WITH_LOCK2, SVN_SQLITE__WITH_LOCK3): New.

* subversion/libsvn_wc/wc_db_private.h
  (SVN_WC__DB_WITH_TXN2, SVN_WC__DB_WITH_TXN3): New.

Modified:
    subversion/trunk/subversion/include/private/svn_sqlite.h
    subversion/trunk/subversion/libsvn_wc/wc_db_private.h

Modified: subversion/trunk/subversion/include/private/svn_sqlite.h
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/include/private/svn_sqlite.h?rev=1886488&r1=1886487&r2=1886488&view=diff
==============================================================================
--- subversion/trunk/subversion/include/private/svn_sqlite.h (original)
+++ subversion/trunk/subversion/include/private/svn_sqlite.h Sat Feb 13 14:25:35 2021
@@ -501,6 +501,49 @@ svn_sqlite__with_immediate_transaction(s
     SVN_ERR(svn_sqlite__finish_savepoint(svn_sqlite__db, svn_sqlite__err));   \
   } while (0)
 
+/* Evaluate the expression EXPR1..EXPR2 within a 'savepoint'.  Savepoints can
+ * be nested.
+ *
+ * Begin a savepoint in DB; evaluate the expression EXPR1, which would
+ * typically be a function call that does some work in DB; if no error occurred,
+ * run EXPR2 and release the savepoint if all expressions evaluated to
+ * SVN_NO_ERROR, otherwise roll back to the savepoint and then release it.
+ */
+#define SVN_SQLITE__WITH_LOCK2(expr1, expr2, db)                              \
+  do {                                                                        \
+    svn_sqlite__db_t *svn_sqlite__db = (db);                                  \
+    svn_error_t *svn_sqlite__err;                                             \
+                                                                              \
+    SVN_ERR(svn_sqlite__begin_savepoint(svn_sqlite__db));                     \
+    svn_sqlite__err = (expr1);                                                \
+    if (!svn_sqlite__err)                                                     \
+      svn_sqlite__err = (expr2);                                              \
+    SVN_ERR(svn_sqlite__finish_savepoint(svn_sqlite__db, svn_sqlite__err));   \
+  } while (0)
+
+/* Evaluate the expression EXPR1..EXPR3 within a 'savepoint'.  Savepoints can
+ * be nested.
+ *
+ * Begin a savepoint in DB; evaluate the expression EXPR1, which would
+ * typically be a function call that does some work in DB; if no error occurred,
+ * run EXPR2; if no error occurred EXPR3; ... and finally release
+ * the savepoint if all expressions evaluated to SVN_NO_ERROR, otherwise
+ * roll back to the savepoint and then release it.
+ */
+#define SVN_SQLITE__WITH_LOCK3(expr1, expr2, expr3, db)                       \
+  do {                                                                        \
+    svn_sqlite__db_t *svn_sqlite__db = (db);                                  \
+    svn_error_t *svn_sqlite__err;                                             \
+                                                                              \
+    SVN_ERR(svn_sqlite__begin_savepoint(svn_sqlite__db));                     \
+    svn_sqlite__err = (expr1);                                                \
+    if (!svn_sqlite__err)                                                     \
+      svn_sqlite__err = (expr2);                                              \
+    if (!svn_sqlite__err)                                                     \
+      svn_sqlite__err = (expr3);                                              \
+    SVN_ERR(svn_sqlite__finish_savepoint(svn_sqlite__db, svn_sqlite__err));   \
+  } while (0)
+
 /* Evaluate the expression EXPR1..EXPR4 within a 'savepoint'.  Savepoints can
  * be nested.
  *

Modified: subversion/trunk/subversion/libsvn_wc/wc_db_private.h
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_wc/wc_db_private.h?rev=1886488&r1=1886487&r2=1886488&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_wc/wc_db_private.h (original)
+++ subversion/trunk/subversion/libsvn_wc/wc_db_private.h Sat Feb 13 14:25:35 2021
@@ -382,6 +382,27 @@ svn_wc__db_mark_conflict_internal(svn_wc
 #define SVN_WC__DB_WITH_TXN(expr, wcroot) \
   SVN_SQLITE__WITH_LOCK(expr, (wcroot)->sdb)
 
+/* Evaluate the expressions EXPR1..EXPR2 within a transaction, returning the
+ * first error if an error occurs.
+ *
+ * Begin a transaction in WCROOT's DB; evaluate the expressions, which would
+ * typically be function calls that do some work in DB; finally commit
+ * the transaction if EXPR evaluated to SVN_NO_ERROR, otherwise roll back
+ * the transaction.
+ */
+#define SVN_WC__DB_WITH_TXN2(expr1, expr2, wcroot) \
+  SVN_SQLITE__WITH_LOCK2(expr1, expr2, (wcroot)->sdb)
+
+/* Evaluate the expressions EXPR1..EXPR3 within a transaction, returning the
+ * first error if an error occurs.
+ *
+ * Begin a transaction in WCROOT's DB; evaluate the expressions, which would
+ * typically be function calls that do some work in DB; finally commit
+ * the transaction if EXPR evaluated to SVN_NO_ERROR, otherwise roll back
+ * the transaction.
+ */
+#define SVN_WC__DB_WITH_TXN3(expr1, expr2, expr3, wcroot) \
+  SVN_SQLITE__WITH_LOCK3(expr1, expr2, expr3, (wcroot)->sdb)
 
 /* Evaluate the expressions EXPR1..EXPR4 within a transaction, returning the
  * first error if an error occurs.