package Apache::DnsZone::DB::MySQL;

# $Id: MySQL.pm,v 1.16 2001/06/21 21:20:23 thomas Exp $

use strict;
use vars qw($VERSION);
($VERSION) = qq$Revision: 1.16 $ =~ /([\d\.]+)/;

package Apache::DnsZone::DB;

use strict;
use DBI;
use Apache::DnsZone;
use Apache::DnsZone::DB;

sub db_conn {
    my $dbsrc = shift;
    my $dbuser = shift;
    my $dbpass = shift;
    Apache::DnsZone::Debug(5, qq{Apache::DnsZone::DB::db_conn called with $dbsrc:$dbuser:****});
    my $db = DBI->connect($dbsrc, $dbuser, $dbpass, { RaiseError => 1 }); # We can't do much more in MySQL
    return $db;
}

sub a_lookup {
    my $self = shift;
    my $domain_id = shift;
    my $a_id = shift;
    my ($name, $ip, $ttl) = $self->{'dbh'}->selectrow_array("select name,address,ttl from records_A where id = ? and domain = ?", undef, $a_id, $domain_id);
    return $name, $ip, $ttl if wantarray;
    return qq{$name $ip $ttl};
}

sub aaaa_lookup {
    my $self = shift;
    my $domain_id = shift;
    my $aaaa_id = shift;
    my ($name, $address, $ttl) = $self->{'dbh'}->selectrow_array("select name,address,ttl from records_AAAA where id = ? and domain = ?", undef, $aaaa_id, $domain_id);
    return $name, $address, $ttl if wantarray;
    return qq{$name $address $ttl};
}

sub cname_lookup {
    my $self = shift;
    my $domain_id = shift;
    my $cname_id = shift;
    my ($name, $cname, $ttl) = $self->{'dbh'}->selectrow_array("select name,cname,ttl from records_CNAME where id = ? and domain = ?", undef, $cname_id, $domain_id);
    return $name, $cname, $ttl if wantarray;
    return qq{$name $cname $ttl};
}

sub mx_lookup {
    my $self = shift;
    my $domain_id = shift;
    my $mx_id = shift;
    my ($name, $exchanger, $preference, $ttl) = $self->{'dbh'}->selectrow_array("select name,exchanger,preference,ttl from records_MX where id = ? and domain = ?", undef, $mx_id, $domain_id);
    return $name, $exchanger, $preference, $ttl if wantarray;
    return qq{$name $exchanger $preference $ttl};
}

sub ns_lookup {
    my $self = shift;
    my $domain_id = shift;
    my $ns_id = shift;
    my ($name, $ns, $ttl) = $self->{'dbh'}->selectrow_array("select name,nsdname,ttl from records_NS where id = ? and domain = ?", undef, $ns_id, $domain_id);
    return $name, $ns, $ttl if wantarray;
    return qq{$name $ns $ttl};
}

sub ptr_lookup {
    my $self = shift;
    my $domain_id = shift;
    my $ptr_id = shift;
    my ($name, $ptrdname, $ttl) = $self->{'dbh'}->selectrow_array("select name,ptrdname,ttl from records_PTR where id = ? and domain = ?", undef, $ptr_id, $domain_id);
    return $name, $ptrdname, $ttl if wantarray;
    return qq{$name $ptrdname $ttl};
}

sub txt_lookup {
    my $self = shift;
    my $domain_id = shift;
    my $txt_id = shift;
    my ($name, $txt, $ttl) = $self->{'dbh'}->selectrow_array("select name,txtdata,ttl from records_TXT where id = ? and domain = ?", undef, $txt_id, $domain_id);
    return $name, $txt, $ttl if wantarray;
    return qq{$name $txt $ttl};
}

sub soa_lookup {
    my $self = shift;
    my $domain_id = shift;
    return $self->{'dbh'}->selectrow_array("select auth_ns, email, serial, refresh, retry, expire, default_ttl,rec_lock from soa where domain = ?", undef, $domain_id);
}

sub id2domain {
    my $self = shift;
    my $id = shift;
    return $self->{'dbh'}->selectrow_array("select domain from domains where id = ?", undef, $id);
}

sub domain2ns {
    my $self = shift;
    my $id = shift;
    return $self->{'dbh'}->selectrow_array("select domains.domain, soa.auth_ns from domains, soa where domains.id = soa.domain and domains.id = ?", undef, $id);
    # returns both domain and nameserver (used in resolver_setup)
}

sub get_auth_ns {
    my $self = shift;
    my $id = shift;
    return $self->{'dbh'}->selectrow_array("select auth_ns from soa where domain = ?", undef, $id);
}

sub get_authns_serial {
    my $self = shift;
    my $dom_id = shift;
    return $self->{'dbh'}->selectrow_array("select auth_ns, serial from soa where domain = ?", undef, $dom_id);
}

sub get_user_info {
    my $self = shift;
    my $username = shift;
    return $self->{'dbh'}->selectrow_array("select users.id, users.email, users.lang, languages.lang from users,languages where users.username = ? and users.lang = languages.id", undef, $username);
}

sub get_user_id {
    my $self = shift;
    my $username = shift;
    return $self->{'dbh'}->selectrow_array("select users.id from users where users.username = ?", undef, $username);
}

sub get_user_lang_id {
    my $self = shift;
    my $uid = shift;
    return $self->{'dbh'}->selectrow_array("select users.lang from users where users.id = ?", undef, $uid);
}

sub get_user_lang {
    my $self = shift;
    my $username = shift;
    return $self->{'dbh'}->selectrow_array("select languages.lang from users, languages where users.username = ? and users.lang = languages.id", undef, $username);
}

sub set_user_lang_email {
    my $self = shift;
    my $uid = shift;
    my $lang_id = shift;
    my $email = shift;
    my $sth = $self->{'dbh'}->prepare("update users set lang = ?, email = ? where id = ?");
    $sth->execute($lang_id, $email, $uid);
    $sth->finish();
    return 1;
}

sub set_user_password {
    my $self = shift;
    my $uid = shift;
    my $password = shift;
    my $sth = $self->{'dbh'}->prepare("update users set password = ? where id = ?");
    $sth->execute($password, $uid);
    $sth->finish();
    return 1;
}

sub get_domain_count {
    my $self = shift;
    my $uid = shift;
    return $self->{'dbh'}->selectrow_array("select count(id) from domains where owner = ?", undef, $uid);
}

sub get_one_domain_id {
    my $self = shift;
    my $uid = shift;
    return $self->{'dbh'}->selectrow_array("select id from domains where owner = ?", undef, $uid);
}

sub is_valid_lang {
    my $self = shift;
    my $lang_id = shift;
    return $self->{'dbh'}->selectrow_array("select 1 from languages where id = ?", undef, $lang_id);
}

sub is_valid_abbrev {
    my $self = shift;
    my $lang_abbrev = shift;
    return $self->{'dbh'}->selectrow_array("select 1 from languages where abbrev = ?", undef, $lang_abbrev);
}

sub get_lang_from_abbrev {
    my $self = shift;
    my $lang_abbrev = shift;
    return $self->{'dbh'}->selectrow_array("select lang from languages where abbrev = ?", undef, $lang_abbrev);
}

sub lang_select_box {
    my $self = shift;
    my $uid = shift;
    my $lang_id = shift || 0;
    if ($lang_id == 0) {
	$lang_id = $self->get_user_lang_id($uid);
    }
    my $lang_select = qq{<select name="lang">\n};
    my $sth_lang = $self->{'dbh'}->prepare("select id,lang,language from languages order by language asc");
    $sth_lang->execute();
    while (my ($l_id, $l_lang, $l_language) = $sth_lang->fetchrow_array()) {
	$lang_select .= qq{<option value="$l_id"};
	if ($lang_id == $l_id) {
	    $lang_select .= qq{ selected};
	}
	$lang_select .= qq{>$l_language ($l_lang)</option>\n};
    }
    $sth_lang->finish();
    $lang_select .= qq{</select>\n};
    return $lang_select;
}

sub update_password {
    my $self = shift;
    my $uid = shift;
    my $password = shift;
    
    my $sth_password_update = $self->{'dbh'}->prepare("update users set password = ? where id = ?");
    $sth_password_update->execute($password, $uid);
    $sth_password_update->finish();

    return 1;
}

sub domain_stat {
    my $self = shift;
    my $dom_id = shift;
    return $self->{'dbh'}->selectrow_array("select domain,owner from domains where id = ?", undef, $dom_id);
}

sub get_max_record_count {
    my $self = shift;
    my $dom_id = shift;
    return $self->{'dbh'}->selectrow_array("select A_count, AAAA_count, CNAME_count, MX_count, NS_count, PTR_count, TXT_count from rec_count where domain = ?", undef, $dom_id);
}

sub get_a_count {
    my $self = shift;
    my $dom_id = shift;
    return $self->{'dbh'}->selectrow_array("select count(id) from records_A where domain = ?", undef, $dom_id);
}

sub does_A_exist {
    my $self = shift;
    my $dom_id = shift;
    my $host = shift;
    return $self->{'dbh'}->selectrow_array("select count(id) from records_A where domain = ? and name = ?", undef, $dom_id, $host)
}

sub is_duplicate_A {
    my $self = shift;
    my $dom_id = shift;
    my $host = shift;
    my $address = shift;
    return $self->{'dbh'}->selectrow_array("select count(id) from records_A where domain = ? and name = ? and address = ?", undef, $dom_id, $host, $address)
}

sub get_aaaa_count {
    my $self = shift;
    my $dom_id = shift;
    return $self->{'dbh'}->selectrow_array("select count(id) from records_AAAA where domain = ?", undef, $dom_id);
}

sub does_AAAA_exist {
    my $self = shift;
    my $dom_id = shift;
    my $host = shift;
    return $self->{'dbh'}->selectrow_array("select count(id) from records_AAAA where domain = ? and name = ?", undef, $dom_id, $host)
}

sub is_duplicate_AAAA {
    my $self = shift;
    my $dom_id = shift;
    my $host = shift;
    my $address = shift;
    return $self->{'dbh'}->selectrow_array("select count(id) from records_AAAA where domain = ? and name = ? and address = ?", undef, $dom_id, $host, $address)
}

sub get_cname_count {
    my $self = shift;
    my $dom_id = shift;
    return $self->{'dbh'}->selectrow_array("select count(id) from records_CNAME where domain = ?", undef, $dom_id);
}

sub does_CNAME_exist {
    my $self = shift;
    my $dom_id = shift;
    my $host = shift;
    return $self->{'dbh'}->selectrow_array("select count(id) from records_CNAME where domain = ? and name = ?", undef, $dom_id, $host);
}

sub is_duplicate_CNAME {
    my $self = shift;
    my $dom_id = shift;
    my $host = shift;
    my $cname = shift;
    return $self->{'dbh'}->selectrow_array("select count(id) from records_CNAME where domain = ? and name = ? and cname = ?", undef, $dom_id, $host, $cname);
}

sub get_mx_count {
    my $self = shift;
    my $dom_id = shift;
    return $self->{'dbh'}->selectrow_array("select count(id) from records_MX where domain = ?", undef, $dom_id);
}

sub does_MX_exist {
    my $self = shift;
    my $dom_id = shift;
    my $host = shift;
    return $self->{'dbh'}->selectrow_array("select count(id) from records_MX where domain = ? and name = ?", undef, $dom_id, $host);
}

sub is_duplicate_MX {
    my $self = shift;
    my $dom_id = shift;
    my $host = shift;
    my $preference = shift;
    return $self->{'dbh'}->selectrow_array("select count(id) from records_MX where domain = ? and name = ? and preference = ?", undef, $dom_id, $host, $preference);
}

sub get_ns_count {
    my $self = shift;
    my $dom_id = shift;
    return $self->{'dbh'}->selectrow_array("select count(id) from records_NS where domain = ?", undef, $dom_id);
}

sub does_NS_exist {
    my $self = shift;
    my $dom_id = shift;
    my $host = shift;
    return $self->{'dbh'}->selectrow_array("select count(id) from records_NS where domain = ? and name = ?", undef, $dom_id, $host);
}

sub is_duplicate_NS {
    my $self = shift;
    my $dom_id = shift;
    my $host = shift;
    my $nsdname = shift;
    return $self->{'dbh'}->selectrow_array("select count(id) from records_NS where domain = ? and name = ? and nsdname = ?", undef, $dom_id, $host, $nsdname);
}

sub get_ptr_count {
    my $self = shift;
    my $dom_id = shift;
    return $self->{'dbh'}->selectrow_array("select count(id) from records_PTR where domain = ?", undef, $dom_id);
}

sub does_PTR_exist {
    my $self = shift;
    my $dom_id = shift;
    my $host = shift;
    return $self->{'dbh'}->selectrow_Array("select count(id) from records_PTR where domain = ? and name = ?", undef, $dom_id, $host);
}

sub is_duplicate_PTR {
    my $self = shift;
    my $dom_id = shift;
    my $host = shift;
    my $ptrdname = shift;
    return $self->{'dbh'}->selectrow_array("select count(id) from records_PTR where domain = ? and name = ? and ptrdname = ?", undef, $dom_id, $host, $ptrdname);
}

sub get_txt_count {
    my $self = shift;
    my $dom_id = shift;
    return $self->{'dbh'}->selectrow_array("select count(id) from records_TXT where domain = ?", undef, $dom_id);
}

sub does_TXT_exist {
    my $self = shift;
    my $dom_id = shift;
    my $host = shift;
    return $self->{'dbh'}->selectrow_array("select count(id) from records_TXT where domain = ? and name = ?", undef, $dom_id, $host);
}

sub is_duplicate_TXT {
    my $self = shift;
    my $dom_id = shift;
    my $host = shift;
    my $txtdata = shift;
    return $self->{'dbh'}->selectrow_array("select count(id) from records_TXT where domain = ? and name = ? and txtdata = ?", undef, $dom_id, $host, $txtdata);
}

sub get_lock_SOA {
    my $self = shift;
    my $dom_id = shift;
    return $self->{'dbh'}->selectrow_array("select rec_lock from soa where domain = ?", undef, $dom_id);
}

sub get_lock_A {
    my $self = shift;
    my $dom_id = shift;
    my $record_id = shift;
    return $self->{'dbh'}->selectrow_array("select rec_lock from records_A where id = ? and domain = ?", undef, $record_id, $dom_id);
}

sub get_lock_AAAA {
    my $self = shift;
    my $dom_id = shift;
    my $record_id = shift;
    return $self->{'dbh'}->selectrow_array("select rec_lock from records_AAAA where id = ? and domain = ?", undef, $record_id, $dom_id);
}

sub get_lock_CNAME {
    my $self = shift;
    my $dom_id = shift;
    my $record_id = shift;
    return $self->{'dbh'}->selectrow_array("select rec_lock from records_CNAME where id = ? and domain = ?", undef, $record_id, $dom_id);
}

sub get_lock_MX {
    my $self = shift;
    my $dom_id = shift;
    my $record_id = shift;
    return $self->{'dbh'}->selectrow_array("select rec_lock from records_MX where id = ? and domain = ?", undef, $record_id, $dom_id);
}

sub get_lock_NS {
    my $self = shift;
    my $dom_id = shift;
    my $record_id = shift;
    return $self->{'dbh'}->selectrow_array("select rec_lock from records_NS where id = ? and domain = ?", undef, $record_id, $dom_id);
}

sub get_lock_PTR {
    my $self = shift;
    my $dom_id = shift;
    my $record_id = shift;
    return $self->{'dbh'}->selectrow_array("select rec_lock from records_PTR where id = ? and domain = ?", undef, $record_id, $dom_id);
}

sub get_lock_TXT {
    my $self = shift;
    my $dom_id = shift;
    my $record_id = shift;
    return $self->{'dbh'}->selectrow_array("select rec_lock from records_TXT where id = ? and domain = ?", undef, $record_id, $dom_id);
}

sub list_domains_prepare {
    my $self = shift;
    my $owner_id = shift;
    my $sth = $self->{'dbh'}->prepare("select id, domain from domains where owner = ?");
    $sth->execute($owner_id);
    return $sth;
}

sub view_domain_A_prepare {
    my $self = shift;
    my $dom_id = shift;
    my $sth = $self->{'dbh'}->prepare("select id, name, address, ttl, rec_lock from records_A where domain = ?");
    $sth->execute($dom_id);
    return $sth;
}

sub view_domain_AAAA_prepare {
    my $self = shift;
    my $dom_id = shift;
    my $sth = $self->{'dbh'}->prepare("select id, name, address, ttl, rec_lock from records_AAAA where domain = ?");
    $sth->execute($dom_id);
    return $sth;
}

sub view_domain_CNAME_prepare {
    my $self = shift;
    my $dom_id = shift;
    my $sth = $self->{'dbh'}->prepare("select id, name, cname, ttl, rec_lock from records_CNAME where domain = ?");
    $sth->execute($dom_id);
    return $sth;
}

sub view_domain_MX_prepare {
    my $self = shift;
    my $dom_id = shift;
    my $sth = $self->{'dbh'}->prepare("select id, name, exchanger, preference, ttl, rec_lock from records_MX where domain = ?");
    $sth->execute($dom_id);
    return $sth;
}

sub view_domain_NS_prepare {
    my $self = shift;
    my $dom_id = shift;
    my $sth = $self->{'dbh'}->prepare("select id, name, nsdname, ttl, rec_lock from records_NS where domain = ?");
    $sth->execute($dom_id);
    return $sth;
}

sub view_domain_PTR_prepare {
    my $self = shift;
    my $dom_id = shift;
    my $sth = $self->{'dbh'}->prepare("select id, name, ptrdname, ttl, rec_lock from records_PTR where domain = ?");
    $sth->execute($dom_id);
    return $sth;
}

sub view_domain_TXT_prepare {
    my $self = shift;
    my $dom_id = shift;
    my $sth = $self->{'dbh'}->prepare("select id, name, txtdata, ttl, rec_lock from records_TXT where domain = ?");
    $sth->execute($dom_id);
    return $sth;
}

sub update_serial_soa {
    my $self = shift;
    my $domain_id = shift;
    my $serial = shift;
    Apache::DnsZone::Debug(5, qq{Apache::DnsZone::DB::update_serial_soa called});
    eval {
	my $sth = $self->{'dbh'}->prepare("update soa set serial = ? where domain = ?");
	$sth->execute($serial, $domain_id);
	$sth->finish();
    };
    if ($@) {
        Apache::DnsZone::Debug(1, qq{Apache::DnsZone::DB::update_SOA failed: $@});
	return 0;
    }
    return 1;
}

sub update_SOA {
    my $self = shift;
    my $domain_id = shift;
    my $serial = shift;
    my $soa_email = shift;
    my $refresh = shift;
    my $retry = shift;
    my $expire = shift;
    my $default_ttl = shift;
    Apache::DnsZone::Debug(5, qq{Apache::DnsZone::DB::update_SOA called});
    eval {
	my $sth = $self->{'dbh'}->prepare("update soa set email = ?, serial = ?, refresh = ?, retry = ?, expire = ?, default_ttl = ? where domain = ?");
	$sth->execute($soa_email, $serial, $refresh, $retry, $expire, $default_ttl, $domain_id);
	$sth->finish();
    };
    if ($@) {
        Apache::DnsZone::Debug(1, qq{Apache::DnsZone::DB::update_SOA failed: $@});
	return 0;
    }
    return 1;
}

sub set_A {
    my $self = shift;
    my $domain_id = shift;
    my $name = shift;
    my $ip = shift;
    my $ttl = shift;
    Apache::DnsZone::Debug(5, qq{Apache::DnsZone::DB::set_A called});
    eval {
	my $sth = $self->{'dbh'}->prepare("insert into records_A (domain, name, address, ttl) values (?, ?, ?, ?)");
	$sth->execute($domain_id, $name, $ip, $ttl);
	$sth->finish();
    };
    if ($@) {
        Apache::DnsZone::Debug(1, qq{Apache::DnsZone::DB::set_A failed: $@});
	return 0;
    }
    return 1;
}

sub update_A {
    my $self = shift;
    my $domain_id = shift;
    my $a_id = shift;
    my $name = shift;
    my $ip = shift;
    my $ttl = shift;
    Apache::DnsZone::Debug(5, qq{Apache::DnsZone::DB::update_A called});
    eval {
	my $sth = $self->{'dbh'}->prepare("update records_A set name = ?, address = ?, ttl = ? where id = ? and domain = ?");
	$sth->execute($name, $ip, $ttl, $a_id, $domain_id);
	$sth->finish();
    };
    if ($@) {
        Apache::DnsZone::Debug(1, qq{Apache::DnsZone::DB::update_A failed: $@});
	return 0;
    }
    Apache::DnsZone::update_serial($domain_id);
    return 1;
}

sub delete_A {
    my $self = shift;
    my $domain_id = shift;
    my $a_id = shift;
    Apache::DnsZone::Debug(5, qq{Apache::DnsZone::DB::delete_A called});
    eval {
	my $sth = $self->{'dbh'}->prepare("delete from records_A where id = ? and domain = ?");
	$sth->execute($a_id, $domain_id);
	$sth->finish();
    };
    if ($@) {
        Apache::DnsZone::Debug(1, qq{Apache::DnsZone::DB::delete_A failed: $@});
	return 0;
    }
    Apache::DnsZone::update_serial($domain_id);
    return 1;
}

sub set_AAAA {
    my $self = shift;
    my $domain_id = shift;
    my $name = shift;
    my $address = shift;
    my $ttl = shift;
    Apache::DnsZone::Debug(5, qq{Apache::DnsZone::DB::set_AAAA called});
    eval {
	my $sth = $self->{'dbh'}->prepare("insert into records_AAAA (domain, name, address, ttl) values (?, ?, ?, ?)");
	$sth->execute($domain_id, $name, $address, $ttl);
	$sth->finish();
    };
    if ($@) {
        Apache::DnsZone::Debug(1, qq{Apache::DnsZone::DB::set_AAAA failed: $@});
	return 0;
    }
    return 1;
}

sub update_AAAA {
    my $self = shift;
    my $domain_id = shift;
    my $aaaa_id = shift;
    my $name = shift;
    my $address = shift;
    my $ttl = shift;
    Apache::DnsZone::Debug(5, qq{Apache::DnsZone::DB::update_AAAA called});
    eval {
	my $sth = $self->{'dbh'}->prepare("update records_AAAA set name = ?, address = ?, ttl = ? where id = ? and domain = ?");
	$sth->execute($name, $address, $ttl, $aaaa_id, $domain_id);
	$sth->finish();
    };
    if ($@) {
        Apache::DnsZone::Debug(1, qq{Apache::DnsZone::DB::update_AAAA failed: $@});
	return 0;
    }
    Apache::DnsZone::update_serial($domain_id);
    return 1;
}

sub delete_AAAA {
    my $self = shift;
    my $domain_id = shift;
    my $aaaa_id = shift;
    Apache::DnsZone::Debug(5, qq{Apache::DnsZone::DB::delete_AAAA called});
    eval {
	my $sth = $self->{'dbh'}->prepare("delete from records_AAAA where id = ? and domain = ?");
	$sth->execute($aaaa_id, $domain_id);
	$sth->finish();
    };
    if ($@) {
        Apache::DnsZone::Debug(1, qq{Apache::DnsZone::DB::delete_AAAA failed: $@});
	return 0;
    }
    Apache::DnsZone::update_serial($domain_id);
    return 1;
}

sub set_CNAME {
    my $self = shift;
    my $domain_id = shift;
    my $name = shift;
    my $cname = shift;
    my $ttl = shift;
    Apache::DnsZone::Debug(5, qq{Apache::DnsZone::DB::set_CNAME called});
    eval {
	my $sth = $self->{'dbh'}->prepare("insert into records_CNAME (domain, name, cname, ttl) values (?, ?, ?, ?)");
	$sth->execute($domain_id, $name, $cname, $ttl);
	$sth->finish();
    };
    if ($@) {
        Apache::DnsZone::Debug(1, qq{Apache::DnsZone::DB::set_CNAME failed: $@});
	return 0;
    }
    Apache::DnsZone::update_serial($domain_id);
    return 1;
}

sub update_CNAME {
    my $self = shift;
    my $domain_id = shift;
    my $cname_id = shift;
    my $name = shift;
    my $cname = shift;
    my $ttl = shift;
    Apache::DnsZone::Debug(5, qq{Apache::DnsZone::DB::update_CNAME called});
    eval {
	my $sth = $self->{'dbh'}->prepare("update records_CNAME set name = ?, cname = ?, ttl = ? where id = ? and domain = ?");
	$sth->execute($name, $cname, $ttl, $cname_id, $domain_id);
	$sth->finish();
    };
    if ($@) {
        Apache::DnsZone::Debug(1, qq{Apache::DnsZone::DB::update_CNAME failed: $@});
	return 0;
    }
    Apache::DnsZone::update_serial($domain_id);
    return 1;
}

sub delete_CNAME {
    my $self = shift;
    my $domain_id = shift;
    my $cname_id = shift;
    Apache::DnsZone::Debug(5, qq{Apache::DnsZone::DB::delete_CNAME called});
    eval {
	my $sth = $self->{'dbh'}->prepare("delete from records_CNAME where id = ? and domain = ?");
	$sth->execute($cname_id, $domain_id);
	$sth->finish();
    };
    if ($@) {
        Apache::DnsZone::Debug(1, qq{Apache::DnsZone::DB::delete_CNAME failed: $@});
	return 0;
    }
    Apache::DnsZone::update_serial($domain_id);
    return 1;
}

sub set_MX {
    my $self = shift;
    my $domain_id = shift;
    my $name = shift;
    my $exchanger = shift;
    my $preferece = shift;
    my $ttl = shift;
    Apache::DnsZone::Debug(5, qq{Apache::DnsZone::DB::set_MX called});
    eval {
	my $sth = $self->{'dbh'}->prepare("insert into records_MX (domain, name, exchanger, preference, ttl) values (?, ?, ?, ?, ?)");
	$sth->execute($domain_id, $name, $exchanger, $preferece, $ttl);
	$sth->finish();
    };
    if ($@) {
        Apache::DnsZone::Debug(1, qq{Apache::DnsZone::DB::set_MX failed: $@});
	return 0;
    }
    Apache::DnsZone::update_serial($domain_id);
    return 1;
}

sub update_MX {
    my $self = shift;
    my $domain_id = shift;
    my $mx_id = shift;
    my $name = shift;
    my $exchanger = shift;
    my $preference = shift;
    my $ttl = shift;
    Apache::DnsZone::Debug(5, qq{Apache::DnsZone::DB::update_MX called});
    eval {
	my $sth = $self->{'dbh'}->prepare("update records_MX set name = ?, exchanger = ?, preference = ?, ttl = ? where id = ? and domain = ?");
	$sth->execute($name, $exchanger, $preference, $ttl, $mx_id, $domain_id);
	$sth->finish();
    };
    if ($@) {
        Apache::DnsZone::Debug(1, qq{Apache::DnsZone::DB::update_MX failed: $@});
	return 0;
    }
    Apache::DnsZone::update_serial($domain_id);
    return 1;
}

sub delete_MX {
    my $self = shift;
    my $domain_id = shift;
    my $mx_id = shift;
    Apache::DnsZone::Debug(5, qq{Apache::DnsZone::DB::delete_MX called});
    eval {
	my $sth = $self->{'dbh'}->prepare("delete from records_MX where id = ? and domain = ?");
	$sth->execute($mx_id, $domain_id);
	$sth->prepare();
    };
    if ($@) {
        Apache::DnsZone::Debug(1, qq{Apache::DnsZone::DB::delete_MX failed: $@});
	return 0;
    }
    Apache::DnsZone::update_serial($domain_id);
    return 1;
}

sub set_NS {
    my $self = shift;
    my $domain_id = shift;
    my $name = shift;
    my $ns = shift;
    my $ttl = shift;
    Apache::DnsZone::Debug(5, qq{Apache::DnsZone::DB::set_NS called});
    eval {
	my $sth = $self->{'dbh'}->prepare("insert into records_NS (domain, name, nsdname, ttl) values (?, ?, ?, ?)");
	$sth->execute($domain_id, $name, $ns, $ttl);
	$sth->finish();
    };
    if ($@) {
        Apache::DnsZone::Debug(1, qq{Apache::DnsZone::DB::set_NS failed: $@});
	return 0;
    }
    Apache::DnsZone::update_serial($domain_id);
    return 1;
}

sub update_NS {
    my $self = shift;
    my $domain_id = shift;
    my $ns_id = shift;
    my $name = shift;
    my $ns = shift;
    my $ttl = shift;
    Apache::DnsZone::Debug(5, qq{Apache::DnsZone::DB::update_NS called});
    eval {
	my $sth = $self->{'dbh'}->prepare("update records_NS set name = ?, nsdname = ?, ttl = ? where id = ? and domain = ?");
	$sth->execute($name, $ns, $ttl, $ns_id, $domain_id);
	$sth->finish();
    };
    if ($@) {
        Apache::DnsZone::Debug(1, qq{Apache::DnsZone::DB::update_NS failed: $@});
	return 0;
    }
    Apache::DnsZone::update_serial($domain_id);
    return 1;
}

sub delete_NS {
    my $self = shift;
    my $domain_id = shift;
    my $ns_id = shift;
    Apache::DnsZone::Debug(5, qq{Apache::DnsZone::DB::delete_NS called});
    eval {
	my $sth = $self->{'dbh'}->prepare("delete from records_NS where id = ? and domain = ?");
	$sth->execute($ns_id, $domain_id);
	$sth->finish();
    };
    if ($@) {
        Apache::DnsZone::Debug(1, qq{Apache::DnsZone::DB::delete_NS failed: $@});
	return 0;
    }
    Apache::DnsZone::update_serial($domain_id);
    return 1;
}

sub set_PTR {
    my $self = shift;
    my $domain_id = shift;
    my $name = shift;
    my $ptrdname = shift;
    my $ttl = shift;
    Apache::DnsZone::Debug(5, qq{Apache::DnsZone::DB::set_PTR called});
    eval {
	my $sth = $self->{'dbh'}->prepare("insert into records_PTR (domain, name, ptrdname, ttl) values (?, ?, ?, ?)");
	$sth->execute($domain_id, $name, $ptrdname, $ttl);
	$sth->finish();
    };
    if ($@) {
        Apache::DnsZone::Debug(1, qq{Apache::DnsZone::DB::set_PTR failed: $@});
	return 0;
    }
    Apache::DnsZone::update_serial($domain_id);
    return 1;
}

sub update_PTR {
    my $self = shift;
    my $domain_id = shift;
    my $ptr_id = shift;
    my $name = shift;
    my $ptrdname = shift;
    my $ttl = shift;
    Apache::DnsZone::Debug(5, qq{Apache::DnsZone::DB::update_PTR called});
    eval {
	my $sth = $self->{'dbh'}->prepare("update records_PTR set name = ?, ptrdname = ?, ttl = ? where id = ? and domain = ?");
	$sth->execute($name, $ptrdname, $ttl, $ptr_id, $domain_id);
	$sth->finish();
    };
    if ($@) {
        Apache::DnsZone::Debug(1, qq{Apache::DnsZone::DB::update_PTR failed: $@});
	return 0;
    }
    Apache::DnsZone::update_serial($domain_id);
    return 1;
}

sub delete_PTR {
    my $self = shift;
    my $domain_id = shift;
    my $ptr_id = shift;
    Apache::DnsZone::Debug(5, qq{Apache::DnsZone::DB::delete_PTR called});
    eval {
	my $sth = $self->{'dbh'}->prepare("delete from records_PTR where id = ? and domain = ?");
	$sth->execute($ptr_id, $domain_id);
	$sth->finish();
    };
    if ($@) {
        Apache::DnsZone::Debug(1, qq{Apache::DnsZone::DB::delete_PTR failed: $@});
	return 0;
    }
    Apache::DnsZone::update_serial($domain_id);
    return 1;
}

sub set_TXT {
    my $self = shift;
    my $domain_id = shift;
    my $name = shift;
    my $txt = shift;
    my $ttl = shift;
    Apache::DnsZone::Debug(5, qq{Apache::DnsZone::DB::set_TXT called});
    eval {
	my $sth = $self->{'dbh'}->prepare("insert into records_TXT (domain, name, txtdata, ttl) values (?, ?, ?, ?)");
	$sth->execute($domain_id, $name, $txt, $ttl);
	$sth->finish();
    };
    if ($@) {
        Apache::DnsZone::Debug(1, qq{Apache::DnsZone::DB::set_TXT failed: $@});
	return 0;
    }
    Apache::DnsZone::update_serial($domain_id);
    return 1;
}

sub update_TXT {
    my $self = shift;
    my $domain_id = shift;
    my $txt_id = shift;
    my $name = shift;
    my $txt = shift;
    my $ttl = shift;
    Apache::DnsZone::Debug(5, qq{Apache::DnsZone::DB::update_TXT called});
    eval {
	my $sth = $self->{'dbh'}->prepare("update records_TXT set name = ?, txtdata = ?, ttl = ? where id = ? and domain = ?");
	$sth->execute($name, $txt, $ttl, $txt_id, $domain_id);
	$sth->finish();
    };
    if ($@) {
        Apache::DnsZone::Debug(1, qq{Apache::DnsZone::DB::update_TXT failed: $@});
	return 0;
    }
    Apache::DnsZone::update_serial($domain_id);
    return 1;
}

sub delete_TXT {
    my $self = shift;
    my $domain_id = shift;
    my $txt_id = shift;
    Apache::DnsZone::Debug(5, qq{Apache::DnsZone::DB::delete_TXT called});
    eval {
	my $sth = $self->{'dbh'}->prepare("delete from records_TXT where id = ? and domain = ?");
	$sth->execute($txt_id, $domain_id);
	$sth->finish();
    };
    if ($@) {
        Apache::DnsZone::Debug(1, qq{Apache::DnsZone::DB::delete_TXT failed: $@});
	return 0;
    }
    Apache::DnsZone::update_serial($domain_id);
    return 1;
}

1;