Hi Stefan.
In <svn.apache.org/r1390443>, you wrote:
[[[
Merge third batch of changes from the 10Gb branch.
Switch ra_svn to templated commands.
Revisions 1388276,1390209
]]]
I assume the main reason for this change is to remove the run-time overhead of
parsing a format string, and in that respect it seems fine.
In terms of API style, however, it seems to me that you might as well make the
API have a dedicated function for each RA command instead of using this single
function with a template parameter. Then we would have the benefit of static
checking of the number and types of the arguments. The implementation of this
'templated' API pretty much ends up calling a specific function per command
anyway. I'm sure an implementation with dedicated functions would be shorter
in source code too (and a nanosecond quicker as well :-).
Does that sound good?
For reference, r1390443 looks like this in svn_ra_svn.h:
[[[
+/** List of all commands supported by the SVN:// protocol. */
+typedef enum svn_ra_svn_cmd_t
+{
+ svn_ra_svn_cmd_target_rev,
+ svn_ra_svn_cmd_open_root,
+ svn_ra_svn_cmd_delete_entry,
+ svn_ra_svn_cmd_add_dir,
+ svn_ra_svn_cmd_open_dir,
[...]
+ svn_ra_svn_cmd_replay_range,
+ svn_ra_svn_cmd_get_deleted_rev,
+
+ svn_ra_svn_cmd__last
+} svn_ra_svn_cmd_t;
/** Write a command over the network, using the same format string notation
* as svn_ra_svn_write_tuple().
+ *
+ * @deprecated Provided for backward compatibility with the 1.9 API.
+ * Use svn_ra_svn_write_templated_cmd instead.
*/
+SVN_DEPRECATED
svn_error_t *
svn_ra_svn_write_cmd(svn_ra_svn_conn_t *conn,
apr_pool_t *pool,
const char *cmdname,
const char *fmt, ...);
+/** Write a command of type @a cmd over the network connection @a conn.
+ * The parameters to be provided are command-specific. @a pool will be
+ * used for allocations. */
+svn_error_t *
+svn_ra_svn_write_templated_cmd(svn_ra_svn_conn_t *conn,
+ apr_pool_t *pool,
+ svn_ra_svn_cmd_t cmd, ...);
]]]
and the change to each call site looks like this:
[[[
- SVN_ERR(svn_ra_svn_write_cmd(b->conn, pool, "set-path", "crb(?c)w",
+ SVN_ERR(svn_ra_svn_write_templated_cmd(b->conn, pool,
+ svn_ra_svn_cmd_set_path,
path, rev, start_empty, lock_token, svn_depth_to_word(depth)));
]]]
- Julian
--
Join WANdisco's free daily demo sessions on Scaling Subversion for the
Enterprise
<http://www.wandisco.com/training/webinars>