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;