@matheusbsbs / matheus-bagliano / commits / 6aeeffd144
Fork 0

Allow git-cvsserver database table name prefix to be specified.

Adds a gitcvs.dbtablenameprefix config variable, the contents of which are prepended to any database tables names used by git-cvsserver. The same substutions as gitcvs.dbname and gitcvs.dbuser are supported, and any non-alphabetic characters are replaced with underscores. A typo found in contrib/completion/git-completion.bash is also fixed. Signed-off-by: Junio C Hamano <gitster@pobox.com>

Josh Elsasser committed Mar 27, 2008 at 14:02 UTC 6aeeffd14447348f3ab4a7d34927d6aff8c0a75c
4 files changed +107 -31
Documentation/config.txt
+7
@@ -661,6 +661,13 @@ gitcvs.dbuser, gitcvs.dbpass::
661 'gitcvs.dbuser' supports variable substitution (see
662 linkgit:git-cvsserver[1] for details).
663
664 +gitcvs.dbTableNamePrefix::
665 + Database table name prefix. Prepended to the names of any
666 + database tables used, allowing a single database to be used
667 + for several repositories. Supports variable substitution (see
668 + linkgit:git-cvsserver[1] for details). Any non-alphabetic
669 + characters will be replaced with underscores.
670 +
671 All gitcvs variables except for 'gitcvs.allbinary' can also be
672 specified as 'gitcvs.<access_method>.<varname>' (where 'access_method'
673 is one of "ext" and "pserver") to make them apply only for the given
Documentation/git-cvsserver.txt
+5
@@ -227,6 +227,11 @@ gitcvs.dbpass::
227 Database password. Only useful if setting `dbdriver`, since
228 SQLite has no concept of database passwords.
229
230 +gitcvs.dbTableNamePrefix::
231 + Database table name prefix. Supports variable substitution
232 + (see below). Any non-alphabetic characters will be replaced
233 + with underscores.
234 +
235 All variables can also be set per access method, see <<configaccessmethod,above>>.
236
237 Variable substitution
contrib/completion/git-completion.bash
+2 -1
@@ -999,7 +999,8 @@ _git_config ()
999 gitcvs.enabled
1000 gitcvs.logfile
1001 gitcvs.allbinary
1002 - gitcvs.dbname gitcvs.dbdriver gitcvs.dbuser gitcvs.dvpass
1002 + gitcvs.dbname gitcvs.dbdriver gitcvs.dbuser gitcvs.dbpass
1003 + gitcvs.dbtablenameprefix
1004 gc.packrefs
1005 gc.reflogexpire
1006 gc.reflogexpireunreachable
git-cvsserver.perl
+93 -30
@@ -2311,6 +2311,14 @@ sub new
2311
2312 bless $self, $class;
2313
2314 + $self->{valid_tables} = {'revision' => 1,
2315 + 'revision_ix1' => 1,
2316 + 'revision_ix2' => 1,
2317 + 'head' => 1,
2318 + 'head_ix1' => 1,
2319 + 'properties' => 1,
2320 + 'commitmsgs' => 1};
2321 +
2322 $self->{module} = $module;
2323 $self->{git_path} = $config . "/";
2324
@@ -2326,6 +2334,8 @@ sub new
2334 $cfg->{gitcvs}{dbuser} || "";
2335 $self->{dbpass} = $cfg->{gitcvs}{$state->{method}}{dbpass} ||
2336 $cfg->{gitcvs}{dbpass} || "";
2337 + $self->{dbtablenameprefix} = $cfg->{gitcvs}{$state->{method}}{dbtablenameprefix} ||
2338 + $cfg->{gitcvs}{dbtablenameprefix} || "";
2339 my %mapping = ( m => $module,
2340 a => $state->{method},
2341 u => getlogin || getpwuid($<) || $<,
@@ -2334,6 +2344,8 @@ sub new
2344 );
2345 $self->{dbname} =~ s/%([mauGg])/$mapping{$1}/eg;
2346 $self->{dbuser} =~ s/%([mauGg])/$mapping{$1}/eg;
2347 + $self->{dbtablenameprefix} =~ s/%([mauGg])/$mapping{$1}/eg;
2348 + $self->{dbtablenameprefix} = mangle_tablename($self->{dbtablenameprefix});
2349
2350 die "Invalid char ':' in dbdriver" if $self->{dbdriver} =~ /:/;
2351 die "Invalid char ';' in dbname" if $self->{dbname} =~ /;/;
@@ -2349,10 +2361,13 @@ sub new
2361 }
2362
2363 # Construct the revision table if required
2352 - unless ( $self->{tables}{revision} )
2364 + unless ( $self->{tables}{$self->tablename("revision")} )
2365 {
2366 + my $tablename = $self->tablename("revision");
2367 + my $ix1name = $self->tablename("revision_ix1");
2368 + my $ix2name = $self->tablename("revision_ix2");
2369 $self->{dbh}->do("
2355 - CREATE TABLE revision (
2370 + CREATE TABLE $tablename (
2371 name TEXT NOT NULL,
2372 revision INTEGER NOT NULL,
2373 filehash TEXT NOT NULL,
@@ -2363,20 +2378,22 @@ sub new
2378 )
2379 ");
2380 $self->{dbh}->do("
2366 - CREATE INDEX revision_ix1
2367 - ON revision (name,revision)
2381 + CREATE INDEX $ix1name
2382 + ON $tablename (name,revision)
2383 ");
2384 $self->{dbh}->do("
2370 - CREATE INDEX revision_ix2
2371 - ON revision (name,commithash)
2385 + CREATE INDEX $ix2name
2386 + ON $tablename (name,commithash)
2387 ");
2388 }
2389
2390 # Construct the head table if required
2376 - unless ( $self->{tables}{head} )
2391 + unless ( $self->{tables}{$self->tablename("head")} )
2392 {
2393 + my $tablename = $self->tablename("head");
2394 + my $ix1name = $self->tablename("head_ix1");
2395 $self->{dbh}->do("
2379 - CREATE TABLE head (
2396 + CREATE TABLE $tablename (
2397 name TEXT NOT NULL,
2398 revision INTEGER NOT NULL,
2399 filehash TEXT NOT NULL,
@@ -2387,16 +2404,17 @@ sub new
2404 )
2405 ");
2406 $self->{dbh}->do("
2390 - CREATE INDEX head_ix1
2391 - ON head (name)
2407 + CREATE INDEX $ix1name
2408 + ON $tablename (name)
2409 ");
2410 }
2411
2412 # Construct the properties table if required
2396 - unless ( $self->{tables}{properties} )
2413 + unless ( $self->{tables}{$self->tablename("properties")} )
2414 {
2415 + my $tablename = $self->tablename("properties");
2416 $self->{dbh}->do("
2399 - CREATE TABLE properties (
2417 + CREATE TABLE $tablename (
2418 key TEXT NOT NULL PRIMARY KEY,
2419 value TEXT
2420 )
@@ -2404,10 +2422,11 @@ sub new
2422 }
2423
2424 # Construct the commitmsgs table if required
2407 - unless ( $self->{tables}{commitmsgs} )
2425 + unless ( $self->{tables}{$self->tablename("commitmsgs")} )
2426 {
2427 + my $tablename = $self->tablename("commitmsgs");
2428 $self->{dbh}->do("
2410 - CREATE TABLE commitmsgs (
2429 + CREATE TABLE $tablename (
2430 key TEXT NOT NULL PRIMARY KEY,
2431 value TEXT
2432 )
@@ -2417,6 +2436,21 @@ sub new
2436 return $self;
2437 }
2438
2439 +=head2 tablename
2440 +
2441 +=cut
2442 +sub tablename
2443 +{
2444 + my $self = shift;
2445 + my $name = shift;
2446 +
2447 + if (exists $self->{valid_tables}{$name}) {
2448 + return $self->{dbtablenameprefix} . $name;
2449 + } else {
2450 + return undef;
2451 + }
2452 +}
2453 +
2454 =head2 update
2455
2456 =cut
@@ -2782,8 +2816,9 @@ sub insert_rev
2816 my $modified = shift;
2817 my $author = shift;
2818 my $mode = shift;
2819 + my $tablename = $self->tablename("revision");
2820
2786 - my $insert_rev = $self->{dbh}->prepare_cached("INSERT INTO revision (name, revision, filehash, commithash, modified, author, mode) VALUES (?,?,?,?,?,?,?)",{},1);
2821 + my $insert_rev = $self->{dbh}->prepare_cached("INSERT INTO $tablename (name, revision, filehash, commithash, modified, author, mode) VALUES (?,?,?,?,?,?,?)",{},1);
2822 $insert_rev->execute($name, $revision, $filehash, $commithash, $modified, $author, $mode);
2823 }
2824
@@ -2792,16 +2827,18 @@ sub insert_mergelog
2827 my $self = shift;
2828 my $key = shift;
2829 my $value = shift;
2830 + my $tablename = $self->tablename("commitmsgs");
2831
2796 - my $insert_mergelog = $self->{dbh}->prepare_cached("INSERT INTO commitmsgs (key, value) VALUES (?,?)",{},1);
2832 + my $insert_mergelog = $self->{dbh}->prepare_cached("INSERT INTO $tablename (key, value) VALUES (?,?)",{},1);
2833 $insert_mergelog->execute($key, $value);
2834 }
2835
2836 sub delete_head
2837 {
2838 my $self = shift;
2839 + my $tablename = $self->tablename("head");
2840
2804 - my $delete_head = $self->{dbh}->prepare_cached("DELETE FROM head",{},1);
2841 + my $delete_head = $self->{dbh}->prepare_cached("DELETE FROM $tablename",{},1);
2842 $delete_head->execute();
2843 }
2844
@@ -2815,8 +2852,9 @@ sub insert_head
2852 my $modified = shift;
2853 my $author = shift;
2854 my $mode = shift;
2855 + my $tablename = $self->tablename("head");
2856
2819 - my $insert_head = $self->{dbh}->prepare_cached("INSERT INTO head (name, revision, filehash, commithash, modified, author, mode) VALUES (?,?,?,?,?,?,?)",{},1);
2857 + my $insert_head = $self->{dbh}->prepare_cached("INSERT INTO $tablename (name, revision, filehash, commithash, modified, author, mode) VALUES (?,?,?,?,?,?,?)",{},1);
2858 $insert_head->execute($name, $revision, $filehash, $commithash, $modified, $author, $mode);
2859 }
2860
@@ -2824,8 +2862,9 @@ sub _headrev
2862 {
2863 my $self = shift;
2864 my $filename = shift;
2865 + my $tablename = $self->tablename("head");
2866
2828 - my $db_query = $self->{dbh}->prepare_cached("SELECT filehash, revision, mode FROM head WHERE name=?",{},1);
2867 + my $db_query = $self->{dbh}->prepare_cached("SELECT filehash, revision, mode FROM $tablename WHERE name=?",{},1);
2868 $db_query->execute($filename);
2869 my ( $hash, $revision, $mode ) = $db_query->fetchrow_array;
2870
@@ -2836,8 +2875,9 @@ sub _get_prop
2875 {
2876 my $self = shift;
2877 my $key = shift;
2878 + my $tablename = $self->tablename("properties");
2879
2840 - my $db_query = $self->{dbh}->prepare_cached("SELECT value FROM properties WHERE key=?",{},1);
2880 + my $db_query = $self->{dbh}->prepare_cached("SELECT value FROM $tablename WHERE key=?",{},1);
2881 $db_query->execute($key);
2882 my ( $value ) = $db_query->fetchrow_array;
2883
@@ -2849,13 +2889,14 @@ sub _set_prop
2889 my $self = shift;
2890 my $key = shift;
2891 my $value = shift;
2892 + my $tablename = $self->tablename("properties");
2893
2853 - my $db_query = $self->{dbh}->prepare_cached("UPDATE properties SET value=? WHERE key=?",{},1);
2894 + my $db_query = $self->{dbh}->prepare_cached("UPDATE $tablename SET value=? WHERE key=?",{},1);
2895 $db_query->execute($value, $key);
2896
2897 unless ( $db_query->rows )
2898 {
2858 - $db_query = $self->{dbh}->prepare_cached("INSERT INTO properties (key, value) VALUES (?,?)",{},1);
2899 + $db_query = $self->{dbh}->prepare_cached("INSERT INTO $tablename (key, value) VALUES (?,?)",{},1);
2900 $db_query->execute($key, $value);
2901 }
2902
@@ -2869,10 +2910,11 @@ sub _set_prop
2910 sub gethead
2911 {
2912 my $self = shift;
2913 + my $tablename = $self->tablename("head");
2914
2915 return $self->{gethead_cache} if ( defined ( $self->{gethead_cache} ) );
2916
2875 - my $db_query = $self->{dbh}->prepare_cached("SELECT name, filehash, mode, revision, modified, commithash, author FROM head ORDER BY name ASC",{},1);
2917 + my $db_query = $self->{dbh}->prepare_cached("SELECT name, filehash, mode, revision, modified, commithash, author FROM $tablename ORDER BY name ASC",{},1);
2918 $db_query->execute();
2919
2920 my $tree = [];
@@ -2894,8 +2936,9 @@ sub getlog
2936 {
2937 my $self = shift;
2938 my $filename = shift;
2939 + my $tablename = $self->tablename("revision");
2940
2898 - my $db_query = $self->{dbh}->prepare_cached("SELECT name, filehash, author, mode, revision, modified, commithash FROM revision WHERE name=? ORDER BY revision DESC",{},1);
2941 + my $db_query = $self->{dbh}->prepare_cached("SELECT name, filehash, author, mode, revision, modified, commithash FROM $tablename WHERE name=? ORDER BY revision DESC",{},1);
2942 $db_query->execute($filename);
2943
2944 my $tree = [];
@@ -2919,19 +2962,21 @@ sub getmeta
2962 my $self = shift;
2963 my $filename = shift;
2964 my $revision = shift;
2965 + my $tablename_rev = $self->tablename("revision");
2966 + my $tablename_head = $self->tablename("head");
2967
2968 my $db_query;
2969 if ( defined($revision) and $revision =~ /^\d+$/ )
2970 {
2926 - $db_query = $self->{dbh}->prepare_cached("SELECT * FROM revision WHERE name=? AND revision=?",{},1);
2971 + $db_query = $self->{dbh}->prepare_cached("SELECT * FROM $tablename_rev WHERE name=? AND revision=?",{},1);
2972 $db_query->execute($filename, $revision);
2973 }
2974 elsif ( defined($revision) and $revision =~ /^[a-zA-Z0-9]{40}$/ )
2975 {
2931 - $db_query = $self->{dbh}->prepare_cached("SELECT * FROM revision WHERE name=? AND commithash=?",{},1);
2976 + $db_query = $self->{dbh}->prepare_cached("SELECT * FROM $tablename_rev WHERE name=? AND commithash=?",{},1);
2977 $db_query->execute($filename, $revision);
2978 } else {
2934 - $db_query = $self->{dbh}->prepare_cached("SELECT * FROM head WHERE name=?",{},1);
2979 + $db_query = $self->{dbh}->prepare_cached("SELECT * FROM $tablename_head WHERE name=?",{},1);
2980 $db_query->execute($filename);
2981 }
2982
@@ -2947,11 +2992,12 @@ sub commitmessage
2992 {
2993 my $self = shift;
2994 my $commithash = shift;
2995 + my $tablename = $self->tablename("commitmsgs");
2996
2997 die("Need commithash") unless ( defined($commithash) and $commithash =~ /^[a-zA-Z0-9]{40}$/ );
2998
2999 my $db_query;
2954 - $db_query = $self->{dbh}->prepare_cached("SELECT value FROM commitmsgs WHERE key=?",{},1);
3000 + $db_query = $self->{dbh}->prepare_cached("SELECT value FROM $tablename WHERE key=?",{},1);
3001 $db_query->execute($commithash);
3002
3003 my ( $message ) = $db_query->fetchrow_array;
@@ -2979,9 +3025,10 @@ sub gethistory
3025 {
3026 my $self = shift;
3027 my $filename = shift;
3028 + my $tablename = $self->tablename("revision");
3029
3030 my $db_query;
2984 - $db_query = $self->{dbh}->prepare_cached("SELECT revision, filehash, commithash FROM revision WHERE name=? ORDER BY revision DESC",{},1);
3031 + $db_query = $self->{dbh}->prepare_cached("SELECT revision, filehash, commithash FROM $tablename WHERE name=? ORDER BY revision DESC",{},1);
3032 $db_query->execute($filename);
3033
3034 return $db_query->fetchall_arrayref;
@@ -3001,9 +3048,10 @@ sub gethistorydense
3048 {
3049 my $self = shift;
3050 my $filename = shift;
3051 + my $tablename = $self->tablename("revision");
3052
3053 my $db_query;
3006 - $db_query = $self->{dbh}->prepare_cached("SELECT revision, filehash, commithash FROM revision WHERE name=? AND filehash!='deleted' ORDER BY revision DESC",{},1);
3054 + $db_query = $self->{dbh}->prepare_cached("SELECT revision, filehash, commithash FROM $tablename WHERE name=? AND filehash!='deleted' ORDER BY revision DESC",{},1);
3055 $db_query->execute($filename);
3056
3057 return $db_query->fetchall_arrayref;
@@ -3061,4 +3109,19 @@ sub mangle_dirname {
3109 return $dirname;
3110 }
3111
3112 +=head2 mangle_tablename
3113 +
3114 +create a string from a that is suitable to use as part of an SQL table
3115 +name, mainly by converting all chars except \w to _
3116 +
3117 +=cut
3118 +sub mangle_tablename {
3119 + my $tablename = shift;
3120 + return unless defined $tablename;
3121 +
3122 + $tablename =~ s/[^\w_]/_/g;
3123 +
3124 + return $tablename;
3125 +}
3126 +
3127 1;