Index: trunk/DNSDB.pm
===================================================================
--- trunk/DNSDB.pm	(revision 703)
+++ trunk/DNSDB.pm	(revision 704)
@@ -2316,5 +2316,5 @@
 # Add a domain
 # Takes a database handle, domain name, numeric group, boolean(ish) state (active/inactive),
-# and user info hash (for logging).
+# and a default location indicator
 # Returns a status code and message
 sub addDomain {
@@ -2341,9 +2341,9 @@
   return ('FAIL', "Invalid characters in domain") if $domain !~ /^[a-zA-Z0-9_.-]+$/;
 
-  my $sth = $dbh->prepare("SELECT domain_id FROM domains WHERE lower(domain) = lower(?)");
+  my $sth = $dbh->prepare("SELECT domain_id FROM domains WHERE lower(domain) = lower(?) AND location = ?");
   my $dom_id;
 
 # quick check to start to see if we've already got one
-  $sth->execute($domain);
+  $sth->execute($domain, $defloc);
   ($dom_id) = $sth->fetchrow_array;
 
@@ -2362,6 +2362,6 @@
 
     # get the ID...
-    ($dom_id) = $dbh->selectrow_array("SELECT domain_id FROM domains WHERE lower(domain) = lower(?)",
-	undef, ($domain));
+    ($dom_id) = $dbh->selectrow_array("SELECT domain_id FROM domains WHERE lower(domain) = lower(?) AND location = ?",
+	undef, ($domain, $defloc));
 
     $self->_log(domain_id => $dom_id, group_id => $group,
@@ -2602,5 +2602,6 @@
 
 # quick check to start to see if we've already got one
-  my ($rdns_id) = $dbh->selectrow_array("SELECT rdns_id FROM revzones WHERE revnet=?", undef, ("$zone"));
+  my ($rdns_id) = $dbh->selectrow_array("SELECT rdns_id FROM revzones WHERE revnet = ? AND default_location = ?",
+	undef, ("$zone", $defloc));
 
   return ('FAIL', "Zone already exists") if $rdns_id;
@@ -2843,7 +2844,14 @@
   if ($args{revrec} eq 'n') {
     $args{sortby} = 'domain' if !$args{sortby} || !grep /^$args{sortby}$/, ('domain','group','status');
-    $sql = "SELECT domain_id AS zoneid,domain AS zone,status,groups.group_name AS group FROM domains".
-	" INNER JOIN groups ON domains.group_id=groups.group_id".
-	" WHERE domains.group_id IN ($args{curgroup}".($args{childlist} ? ",$args{childlist}" : '').")".
+    $sql = q(SELECT
+		domain_id AS zoneid,
+		domain AS zone,
+		status,
+		groups.group_name AS group,
+		l.description AS location
+	FROM domains
+	LEFT JOIN locations l ON domains.default_location=l.location
+	INNER JOIN groups ON domains.group_id=groups.group_id ).
+	"WHERE domains.group_id IN ($args{curgroup}".($args{childlist} ? ",$args{childlist}" : '').")".
 	($args{startwith} ? " AND domain ~* ?" : '').
 	($args{filter} ? " AND domain ~* ?" : '');
@@ -2851,6 +2859,13 @@
 ##fixme:  arguably startwith here is irrelevant.  depends on the UI though.
     $args{sortby} = 'revnet' if !$args{sortby} || !grep /^$args{sortby}$/, ('revnet','group','status');
-    $sql = "SELECT rdns_id AS zoneid,revnet AS zone,status,groups.group_name AS group FROM revzones".
-	" INNER JOIN groups ON revzones.group_id=groups.group_id".
+    $sql = q(SELECT
+		rdns_id AS zoneid,
+		revnet AS zone,
+		status,
+		groups.group_name AS group,
+		l.description AS location
+	FROM revzones
+	LEFT JOIN locations l ON revzones.default_location=l.location
+	INNER JOIN groups ON revzones.group_id=groups.group_id ).
 	" WHERE revzones.group_id IN ($args{curgroup}".($args{childlist} ? ",$args{childlist}" : '').")".
 	($args{startwith} ? " AND CAST(revnet AS VARCHAR) ~* ?" : '');
Index: trunk/dns-upd-1.2.6.sql
===================================================================
--- trunk/dns-upd-1.2.6.sql	(revision 704)
+++ trunk/dns-upd-1.2.6.sql	(revision 704)
@@ -0,0 +1,8 @@
+-- SQL to update DNS DB schema for 1.2.6
+
+-- Allow zones to be duplicated, so long as each version is in a unique location
+ALTER TABLE domains DROP CONSTRAINT domains_pkey;
+ALTER TABLE domains ADD PRIMARY KEY (domain,default_location);
+
+ALTER TABLE revzones DROP CONSTRAINT revzones_pkey;
+ALTER TABLE revzones ADD PRIMARY KEY (revnet,default_location);
Index: trunk/dns.cgi
===================================================================
--- trunk/dns.cgi	(revision 703)
+++ trunk/dns.cgi	(revision 704)
@@ -528,6 +528,5 @@
 
   fill_grouplist("grouplist");
-  my $loclist = $dnsdb->getLocDropdown($curgroup);
-  $page->param(loclist => $loclist);
+  fill_loclist($curgroup, $webvar{defloc} ? $webvar{defloc} : '');
 
   # prepopulate revpatt with the matching default record
Index: trunk/templates/domlist.tmpl
===================================================================
--- trunk/templates/domlist.tmpl	(revision 703)
+++ trunk/templates/domlist.tmpl	(revision 704)
@@ -42,5 +42,5 @@
 <TMPL_LOOP name=domtable>
 <tr class="row<TMPL_IF __odd__>0<TMPL_ELSE>1</TMPL_IF>">
- 	<td align="left"><a href="<TMPL_VAR NAME=script_self>&amp;page=reclist&amp;id=<TMPL_VAR NAME=zoneid>&amp;defrec=n<TMPL_UNLESS domlist>&amp;revrec=y</TMPL_UNLESS>"><TMPL_VAR NAME=zone></a></td>
+ 	<td align="left"><a href="<TMPL_VAR NAME=script_self>&amp;page=reclist&amp;id=<TMPL_VAR NAME=zoneid>&amp;defrec=n<TMPL_UNLESS domlist>&amp;revrec=y</TMPL_UNLESS>"><TMPL_VAR NAME=zone></a><TMPL_IF location> (<TMPL_VAR NAME=location>)</TMPL_IF></td>
 	<td><TMPL_IF status>Active<TMPL_ELSE>Inactive</TMPL_IF></td>
 	<td><TMPL_VAR name=group></td>
