Philip Martin <philip.mar...@wandisco.com> writes:

> Still it's hard to ignore the performance gain.  Perhaps we could make
> it (whispers) configurable?

Here's a simple Linux LD_PRELOAD version of the patch.  Build it as a
shared library and then the feature can be enabled on any given svn
invocation by setting the environment variable.

/* 
  Compile like so:
    gcc -rdynamic -fPIC -O2 -Wall -shared -o libxxxx.so xxxx.c -ldl
  Use like so:
    LD_PRELOAD=$PWD/libxxxx.so svn co http://example.com/repo/trunk wc
*/
#include <stdio.h>
#include <stdlib.h>
#include <dlfcn.h>
#include <string.h>
#include <unistd.h>

struct sqlite3;
int sqlite3_open_v2(const char *filename, struct sqlite3 **ppDb, int flags,
                    const char *zVfs) 
{
    static int (*sqlite_sqlite3_open_v2)(const char *, struct sqlite3 **, int,
                                         const char *) = NULL;
    static int (*sqlite_sqlite3_exec)(struct sqlite3 *, const char *,
                                      int (*)(void *, int, char *, char **),
                                      void *, char **);
    int status;
    if (!sqlite_sqlite3_open_v2) {
        void *handle = dlopen("libsqlite3.so.0", RTLD_LAZY);
        if (!handle) {
            char *error = dlerror();
            fprintf(stderr, "dlopen: %s\n", error ? error : "null");
            exit(1);
        }
        sqlite_sqlite3_open_v2 = dlsym(handle, "sqlite3_open_v2");
        char *error = dlerror();
        if (error || !sqlite_sqlite3_open_v2) {
            fprintf(stderr, "dlsym(open_v2): %s\n", error ? error : "null");
            exit(1);
        }
        sqlite_sqlite3_exec = dlsym(handle, "sqlite3_exec");
        error = dlerror();
        if (error || !sqlite_sqlite3_exec) {
            fprintf(stderr, "dlsym(exec): %s\n", error ? error : "null");
            exit(1);
        }
    }
    status = sqlite_sqlite3_open_v2(filename, ppDb, flags, zVfs);
    if (!status) {
        char *error;
        if (sqlite_sqlite3_exec(*ppDb, "pragma locking_mode = exclusive",
                                NULL, NULL, &error)) {
            fprintf(stderr, "sqlite3_exec: %s\n", error ? error : "null");
            exit(1);
        }
    }
    return status;
}

-- 
uberSVN: Apache Subversion Made Easy
http://www.uberSVN.com

Reply via email to