Merge branch 'master' of git.mgm.sipwise.com:ngcp-panel

agranig/subprof
Irina Peshinskaya 12 years ago
commit f5b02e48f0

42
debian/changelog vendored

@ -1,4 +1,4 @@
ngcp-panel (1.2.0+0~mr3.3) unstable; urgency=low
ngcp-panel (1.3.0+0~mr3.3) unstable; urgency=low
[ Lars Dieckow ]
* [aba646f] MT#3929 certificate management
@ -190,6 +190,29 @@ ngcp-panel (1.2.0+0~mr3.3) unstable; urgency=low
* [75fccd3] MT#3961 Install I18N folder in debian.
* [b88d36b] MT#5083 Implement sendfax in ngcp-panel.
* [8c3a279] MT#5473 Fix deleting peering groups.
* [8a6f96d] MT#5867 fix responsive top menu design
* [84e465f] MT#3961 Add Italian translation.
* [9587330] MT#5251 Optimize billing fees upload.
* [c799df3] MT#3925 API: dynamically render API documentation.
* [2c49abb] MT#3925 Add more field descriptions to forms.
* [1f9e407] MT#3925 API: more doc and description fixes.
* [0f26d8f] MT#3961 Update German localization.
* [0218de9] MT#5833 Update italian translation.
* [bc08567] MT#5811 Properly set websocket paths.
* [6dfd792] MT#5835 Update spanish datatables translations.
* [10373d6] MT#5083 Add webfax to subscriber top menu
* [2f749a3] MT#3933 API: add subscriber editing via PUT/PATCH
* [eb1464f] MT#3925 Return json error for 403/404 on /api/.+
* [da79426] MT#3933 API: Implement subscriber preferences.
* [f7de0b6] MT#5967 Perform trusted source ip/net validation.
* [71b8d2e] MT#5967 Validate (man_)allowed_ip input.
* [74d8f83] MT#5811 Prepare adding chat buddy.
* [c61b9ee] MT#3933 API: Handle subscriber lock/termination
* [d445274] MT#5967 API: validate allowed ip entries.
* [74aeb79] MT#5929 Fix lock, ext_xxx_id and dbalias handling.
* [4456bd0] MT#5929 Fix ext_subscriber_id handling.
* [432080d] MT#5929 More external_id fixes.
* [e4990ed] MT#5929 Add script to clean up ext_xxx_id settings
[ Gerhard Jungwirth ]
* [9b0cc33] MT#4767 Show missing registered devices
@ -268,6 +291,10 @@ ngcp-panel (1.2.0+0~mr3.3) unstable; urgency=low
* [3f813d6] MT#3961 fix image file path
* [cc5d36d] MT#3961 Localize the menu title "Language"
* [360d622] MT#3961 check language before login, map en to i-default
* [4e6e9ef] 5861: remove unused fields from SubscriberEdit
* [f99ce65] MT#5859 let subscriber change his webpassword
* [381c440] MT#5859 rename "Line Settings"
* [b424c56] MT#5867 fix modal height on small screens
[ Andrew Pogrebennyk ]
* [cc9fe6e] MT#3997 MT#5193 Fix build_via_routes with only one external sbc.
@ -281,6 +308,8 @@ ngcp-panel (1.2.0+0~mr3.3) unstable; urgency=low
* [86600a6] Start changelog for 1.1.3
* [d52049a] MT#3997 MT#5193 Fix build_via_routes with only one external sbc.
* [7587e66] MT#5193 MT#5195 Fix "Use of uninitialized value" when external_sbc is empty
* [d713bdc] MT#5835 Translate javascript datatables file to Spanish.
* [95cac29] MT#5837 Unify some terms; improve subscriber details look.
[ Victor Seva ]
* [62bcb09] MT#4435 generate just ngcp-panel
@ -291,6 +320,11 @@ ngcp-panel (1.2.0+0~mr3.3) unstable; urgency=low
* [193ab53] MT#4895 fix last commit
* [6775371] MT#5587 Remove apache migration stuff.
* [0ad4699] config for polycom phones
* [ca4df9c] MT#5835 Spanish translation by Jon
* [6d5ec21] MT#5835 Spanish translation update
* [0bf4d26] MT#5835 Spanish translation update
* [2e0bbde] MT#5835 Spanish translation update
* [4b2f507] MT#5835 Spanish translation update
[ Michael Prokop ]
* [47e6925] MT#5215 Add new packages for REST feature to Depends
@ -298,9 +332,13 @@ ngcp-panel (1.2.0+0~mr3.3) unstable; urgency=low
* [ffa81f5] MT#5365 Add further packages to (Build-)Depends
* [679c866] MT#5395 Add further packages to (Build-)Depends
[ Alexander Lutay ]
* [c754aff] MT#5837 Add Russian localisation
* [5be3f87] MT#5835 Fixed Spanish datatables translations.
[ Sipwise Jenkins Builder ]
-- Sipwise Jenkins Builder <jenkins@sipwise.com> Sat, 01 Feb 2014 19:52:07 +0100
-- Sipwise Jenkins Builder <jenkins@sipwise.com> Wed, 26 Feb 2014 10:51:50 +0100
ngcp-panel (1.1.6) unstable; urgency=low

@ -281,6 +281,7 @@ sub peering_create :Chained('peering_list') :PathPart('create') :Args(0) {
delete $form->params->{contract};
my $bprof_id = $form->params->{billing_profile}{id};
delete $form->params->{billing_profile};
$form->params->{external_id} = $form->field('external_id')->value;
$form->{create_timestamp} = $form->{modify_timestamp} = NGCP::Panel::Utils::DateTime::current_local;
my $contract = $schema->resultset('contracts')->create($form->params);
my $billing_profile = $schema->resultset('billing_profiles')->find($bprof_id);
@ -406,6 +407,7 @@ sub reseller_create :Chained('reseller_list') :PathPart('create') :Args(0) {
delete $form->params->{contract};
my $bprof_id = $form->params->{billing_profile}{id};
delete $form->params->{billing_profile};
$form->params->{external_id} = $form->field('external_id')->value;
$form->{create_timestamp} = $form->{modify_timestamp} = NGCP::Panel::Utils::DateTime::current_local;
my $contract = $schema->resultset('contracts')->create($form->params);
my $billing_profile = $schema->resultset('billing_profiles')->find($bprof_id);

@ -135,6 +135,7 @@ sub create :Chained('list_customer') :PathPart('create') :Args(0) {
my $bprof_id = $form->params->{billing_profile}{id};
delete $form->params->{billing_profile};
$form->{create_timestamp} = $form->{modify_timestamp} = NGCP::Panel::Utils::DateTime::current_local;
$form->params->{external_id} = $form->field('external_id')->value;
my $product_id = $form->params->{product}{id};
delete $form->params->{product};
unless($product_id) {
@ -348,13 +349,29 @@ sub edit :Chained('base') :PathPart('edit') :Args(0) {
$form->{modify_timestamp} = NGCP::Panel::Utils::DateTime::current_local;
my $product_id = $form->params->{product}{id} || $billing_mapping->product_id;
delete $form->params->{product};
$form->params->{external_id} = $form->field('external_id')->value;
unless($form->params->{max_subscribers} && length($form->params->{max_subscribers})) {
$form->params->{max_subscribers} = undef;
}
my $old_bprof_id = $billing_mapping->billing_profile_id;
$c->log->debug(">>>>>>>>>>> old bprof_id=$old_bprof_id");
my $old_prepaid = $billing_mapping->billing_profile->prepaid;
my $old_ext_id = $contract->external_id // '';
$contract->update($form->params);
my $new_ext_id = $contract->external_id // '';
if($old_ext_id ne $new_ext_id) { # undef is '' so we don't bail out here
foreach my $sub($contract->voip_subscribers->all) {
my $prov_sub = $sub->provisioning_voip_subscriber;
next unless($prov_sub);
NGCP::Panel::Utils::Subscriber::update_preferences(
c => $c,
prov_subscriber => $prov_sub,
preferences => { ext_contract_id => $contract->external_id }
);
}
}
if($bprof_id != $old_bprof_id) {
$contract->billing_mappings->create({
billing_profile_id => $bprof_id,
@ -560,6 +577,12 @@ sub subscriber_create :Chained('base') :PathPart('subscriber/create') :Args(0) {
$preferences->{display_name} = $form->params->{display_name}
if($form->params->{display_name});
}
if($c->stash->{contract}->external_id) {
$preferences->{ext_contract_id} = $c->stash->{contract}->external_id;
}
if(defined $form->params->{external_id}) {
$preferences->{ext_subscriber_id} = $form->params->{external_id};
}
if($c->stash->{billing_mapping}->billing_profile->prepaid) {
$preferences->{prepaid} = 1;
}

@ -110,11 +110,35 @@ sub base :Chained('/') :PathPart('device') :CaptureArgs(0) {
{ name => 'config.version', search => 1, title => $c->loc('Configuration Version') },
]);
my $fielddev_rs = $c->model('DB')->resultset('autoprov_field_devices');
if($c->user->roles eq "subscriberadmin" || $c->user->roles eq "subscriber") {
$fielddev_rs = $fielddev_rs->search({
'device.reseller_id' => $c->user->voip_subscriber->contract->contact->reseller_id,
}, {
join => { 'profile' => { 'config' => 'device' } },
});
} elsif($c->user->roles eq "reseller") {
$fielddev_rs = $fielddev_rs->search({
'device.reseller_id' => $c->user->reseller_id
}, {
join => { 'profile' => { 'config' => 'device' } },
});
}
$c->stash->{fielddev_dt_columns} = NGCP::Panel::Utils::Datatables::set_columns($c, [
{ name => 'id', search => 1, title => $c->loc('#') },
{ name => 'identifier', search => 1, title => $c->loc('MAC Address / Identifier') },
{ name => 'profile.name', search => 1, title => $c->loc('Profile Name') },
{ name => 'contract.id', search => 1, title => $c->loc('Customer #') },
{ name => 'contract.contact.email', search => 1, title => $c->loc('Customer Email') },
]);
$c->stash(
devmod_rs => $devmod_rs,
devfw_rs => $devfw_rs,
devconf_rs => $devconf_rs,
devprof_rs => $devprof_rs,
fielddev_rs => $fielddev_rs,
template => 'device/list.tt',
);
}
@ -321,11 +345,47 @@ sub devmod_edit :Chained('devmod_base') :PathPart('edit') :Args(0) :Does(ACL) :A
my $linerange = delete $form->params->{linerange};
$c->stash->{devmod}->update($form->params);
$c->stash->{devmod}->autoprov_device_line_ranges->delete_all;
my @existing_range = ();
my $range_rs = $c->stash->{devmod}->autoprov_device_line_ranges;
foreach my $range(@{ $linerange }) {
delete $range->{id};
$c->stash->{devmod}->autoprov_device_line_ranges->create($range);
next unless(defined $range);
my $old_range;
if(defined $range->{id}) {
# should be an existing range, do update
$old_range = $range_rs->find($range->{id});
delete $range->{id};
unless($old_range) {
$old_range = $range_rs->create($range);
} else {
# formhandler only passes set check-boxes, so explicitely unset here
$range->{can_private} //= 0;
$range->{can_shared} //= 0;
$range->{can_blf} //= 0;
$old_range->update($range);
}
} else {
# new range
$old_range = $range_rs->create($range);
}
push @existing_range, $old_range->id; # mark as valid (delete others later)
# delete field device line assignments with are out-of-range or use a
# feature which is not supported anymore after edit
foreach my $fielddev_line($c->model('DB')->resultset('autoprov_field_device_lines')
->search({ linerange_id => $old_range->id })->all) {
if($fielddev_line->key_num >= $old_range->num_lines ||
($fielddev_line->line_type eq 'private' && !$old_range->can_private) ||
($fielddev_line->line_type eq 'shared' && !$old_range->can_shared) ||
($fielddev_line->line_type eq 'blf' && !$old_range->can_blf)) {
$fielddev_line->delete;
}
}
}
# delete invalid range ids (e.g. removed ones)
$range_rs->search({
id => { 'not in' => \@existing_range },
})->delete_all;
delete $c->session->{created_objects}->{reseller};
$c->flash(messages => [{type => 'success', text => 'Successfully updated device model'}]);
@ -864,6 +924,14 @@ sub devprof_edit :Chained('devprof_base') :PathPart('edit') :Args(0) :Does(ACL)
);
}
sub dev_field_ajax :Chained('base') :PathPart('device/ajax') :Args(0) :Does(ACL) :ACLDetachTo('/denied_page') :AllowedRole(admin) :AllowedRole(reseller) {
my ($self, $c) = @_;
my $resultset = $c->stash->{fielddev_rs};
NGCP::Panel::Utils::Datatables::process($c, $resultset, $c->stash->{fielddev_dt_columns});
$c->detach( $c->view("JSON") );
}
sub dev_field_config :Chained('/') :PathPart('device/autoprov/config') :Args() {
my ($self, $c, $id) = @_;

@ -167,6 +167,7 @@ sub create_list :Chained('sub_list') :PathPart('create') :Args(0) :Does(ACL) :AC
username => $c->request->params->{username},
domain_id => $billing_domain->id,
status => $c->request->params->{status},
external_id => $form->field('external_id')->value, # null if empty
});
my $prov_subscriber = $schema->resultset('provisioning_voip_subscribers')->create({
@ -206,11 +207,25 @@ sub create_list :Chained('sub_list') :PathPart('create') :Args(0) :Does(ACL) :AC
'value' => 1,
});
}
if(defined $billing_subscriber->external_id) {
$voip_preferences->find({ 'attribute' => 'ext_subscriber_id' })
->voip_usr_preferences->create({
'subscriber_id' => $prov_subscriber->id,
'value' => $billing_subscriber->external_id,
});
}
$voip_preferences->find({ 'attribute' => 'account_id' })
->voip_usr_preferences->create({
'subscriber_id' => $prov_subscriber->id,
'value' => $prov_subscriber->contract->id,
});
if($contract->external_id) {
$voip_preferences->find({ 'attribute' => 'ext_contract_id' })
->voip_usr_preferences->create({
'subscriber_id' => $prov_subscriber->id,
'value' => $contract->external_id,
});
}
$voip_preferences->find({ 'attribute' => 'ac' })
->voip_usr_preferences->create({
'subscriber_id' => $prov_subscriber->id,
@ -1951,10 +1966,25 @@ sub edit_master :Chained('master') :PathPart('edit') :Args(0) :Does(ACL) :ACLDet
domain => $subscriber->domain->domain,
) if($pbx_ext && defined $old_group_id && $old_group_id != $prov_subscriber->pbx_group_id);
my $old_ext_id = $subscriber->external_id;
$subscriber->update({
status => $form->params->{status},
external_id => $form->params->{external_id},
external_id => $form->field('external_id')->value, # null if empty
});
if(defined $subscriber->external_id) {
my $ext_pref = NGCP::Panel::Utils::Preferences::get_usr_preference_rs(
c => $c, attribute => 'ext_subscriber_id', prov_subscriber => $prov_subscriber);
unless($ext_pref->first) {
$ext_pref->create({ value => $subscriber->external_id });
} else {
$ext_pref->first->update({ value => $subscriber->external_id });
}
} elsif(defined $old_ext_id) {
NGCP::Panel::Utils::Preferences::get_usr_preference_rs(
c => $c, attribute => 'ext_subscriber_id', prov_subscriber => $prov_subscriber)
->delete;
}
if($subscriber->status eq 'locked') {
$form->values->{lock} = 4; # update lock below
} elsif($old_status eq 'locked' && $subscriber->status eq 'active') {

@ -150,8 +150,22 @@ sub update_customer {
}
}
my $old_ext_id = $customer->external_id;
$customer->update($resource);
if($customer->external_id ne $old_ext_id) {
foreach my $sub($customer->voip_subscribers->all) {
my $prov_sub = $sub->provisioning_voip_subscriber;
next unless($prov_sub);
NGCP::Panel::Utils::Subscriber::update_preferences(
c => $c,
prov_subscriber => $prov_sub,
preferences => { ext_contract_id => $customer->external_id }
);
}
}
if($old_resource->{status} ne $resource->{status}) {
if($customer->id == 1) {
$self->error($c, HTTP_FORBIDDEN, "Cannot set customer status to '".$resource->{status}."' for customer id '1'");

@ -60,6 +60,14 @@ sub transform_resource {
push @{ $resource{alias_numbers} }, $alias;
}
}
my $pref = NGCP::Panel::Utils::Preferences::get_usr_preference_rs(
c => $c, attribute => 'lock',
prov_subscriber => $item->provisioning_voip_subscriber);
if($pref->first) {
$resource{lock} = $pref->first->value;
}
$resource{customer_id} = int(delete $resource{contract_id});
$resource{id} = int($item->id);
$resource{domain} = $item->domain->domain;
@ -264,6 +272,12 @@ sub prepare_resource {
$preferences->{cloud_pbx_base_cli} = $base_number->{cc} . $base_number->{ac} . $base_number->{sn};
}
}
if(exists $resource->{external_id}) {
$preferences->{ext_subscriber_id} = $resource->{external_id};
}
if(defined $customer->external_id) {
$preferences->{ext_contract_id} = $customer->external_id;
}
my $billing_profile = $self->get_billing_profile($c, $customer);
return unless($billing_profile);
@ -320,6 +334,7 @@ sub prepare_resource {
alias_numbers => $alias_numbers,
preferences => $preferences,
};
return $r;
}
@ -347,16 +362,18 @@ sub update_item {
return;
}
}
try {
NGCP::Panel::Utils::Subscriber::lock_provisoning_voip_subscriber(
c => $c,
prov_subscriber => $subscriber->provisioning_voip_subscriber,
level => $resource->{lock},
);
} catch($e) {
$c->log->error("failed to lock subscriber id ".$subscriber->id." with level ".$resource->{lock});
$self->error($c, HTTP_INTERNAL_SERVER_ERROR, "Failed to update subscriber lock");
return;
if(defined $resource->{lock}) {
try {
NGCP::Panel::Utils::Subscriber::lock_provisoning_voip_subscriber(
c => $c,
prov_subscriber => $subscriber->provisioning_voip_subscriber,
level => $resource->{lock},
);
} catch($e) {
$c->log->error("failed to lock subscriber id ".$subscriber->id." with level ".$resource->{lock});
$self->error($c, HTTP_INTERNAL_SERVER_ERROR, "Failed to update subscriber lock");
return;
}
}
NGCP::Panel::Utils::Subscriber::update_subscriber_numbers(
@ -385,6 +402,11 @@ sub update_item {
$subscriber->update($billing_res);
$subscriber->provisioning_voip_subscriber->update($provisioning_res);
$subscriber->discard_changes;
NGCP::Panel::Utils::Subscriber::update_preferences(
c => $c,
prov_subscriber => $subscriber->provisioning_voip_subscriber,
preferences => $preferences
);
# TODO: status handling (termination, ...)

@ -198,19 +198,10 @@ sub create_subscriber {
$preferences->{cli} = $cli
if(defined $cli);
foreach my $k(keys %{ $preferences } ) {
my $pref = NGCP::Panel::Utils::Preferences::get_usr_preference_rs(
c => $c, attribute => $k, prov_subscriber => $prov_subscriber);
if($pref->first && $pref->first->attribute->max_occur == 1) {
$pref->first->update({
'value' => $preferences->{$k},
});
} else {
$pref->create({
'value' => $preferences->{$k},
});
}
}
update_preferences(c => $c,
prov_subscriber => $prov_subscriber,
preferences => $preferences
);
$schema->resultset('voicemail_users')->create({
customer_id => $uuid_string,
@ -230,6 +221,31 @@ sub create_subscriber {
});
}
sub update_preferences {
my (%params) = @_;
my $c = $params{c};
my $prov_subscriber = $params{prov_subscriber};
my $preferences = $params{preferences};
foreach my $k(keys %{ $preferences } ) {
my $pref = NGCP::Panel::Utils::Preferences::get_usr_preference_rs(
c => $c, attribute => $k, prov_subscriber => $prov_subscriber);
if($pref->first && $pref->first->attribute->max_occur == 1) {
unless(defined $preferences->{$k}) {
$pref->first->delete;
} else {
$pref->first->update({
'value' => $preferences->{$k},
});
}
} else {
$pref->create({
'value' => $preferences->{$k},
}) if(defined $preferences->{$k});
}
}
}
sub get_custom_subscriber_struct {
my %params = @_;
@ -527,9 +543,11 @@ sub update_subscriber_numbers {
subscriber_id => undef,
reseller_id => undef,
});
$prov_subs->voip_dbaliases->search({
id => { 'not in' => \@dbnums },
})->delete;
if($prov_subs) {
$prov_subs->voip_dbaliases->search({
id => { 'not in' => \@dbnums },
})->delete;
}
return;
}

@ -171,5 +171,41 @@
</div>
</div>
<div class="accordion-group">
<div class="accordion-heading">
<a class="accordion-toggle" data-toggle="collapse" data-parent="#device_details" href="#collapse_fielddev">[% c.loc('Deployed Devices') %]</a>
</div>
<div class="accordion-body collapse" id="collapse_fielddev">
<div class="accordion-inner">
[%
helper.name = c.loc('Deployed Device');
helper.identifier = 'field_device';
helper.data = fielddev;
helper.dt_columns = fielddev_dt_columns;
helper.length_change = 1;
helper.edit_flag = 0;
helper.create_flag = 0;
helper.ajax_uri = c.uri_for('/device/device/ajax');
UNLESS c.user.read_only;
helper.dt_buttons = [
{ name = c.loc('Delete'), uri = "/customer/' + full.contract_id + '/pbx/device/'+full.id+'/delete", class = 'btn-small btn-secondary', icon = 'icon-trash' },
{ name = c.loc('Customer'), uri = "/customer/' + full.contract_id + '/details", class = 'btn-small btn-tertiary', icon = 'icon-user' },
];
ELSE;
helper.dt_buttons = [
{ name = c.loc('Customer'), uri = "/customer/' + full.contract_id + '/details", class = 'btn-small btn-tertiary', icon = 'icon-user' },
];
END;
PROCESS 'helpers/datatables.tt';
-%]
</div>
</div>
</div>
</div>
[% # vim: set tabstop=4 syntax=html expandtab: -%]

@ -0,0 +1,79 @@
#!/usr/bin/perl -w
use strict;
use DBI;
use Data::Dumper;
my $debug = 1;
sub handle_pref;
my ($dbuser, $dbpass);
my $mfile = '/etc/mysql/sipwise.cnf';
if(-f $mfile) {
open my $fh, "<", $mfile
or die "failed to open '$mfile': $!\n";
$_ = <$fh>; chomp;
s/^SIPWISE_DB_PASSWORD='(.+)'$/$1/;
$dbuser = 'sipwise'; $dbpass = $_;
} else {
$dbuser = 'root';
$dbpass = '';
}
print "using user '$dbuser' with pass '$dbpass'\n"
if($debug);
my $dbh = DBI->connect('dbi:mysql:provisioning;host=localhost', $dbuser, $dbpass)
or die "failed to connect to billing DB\n";
my $sub_sth = $dbh->prepare("select ps.uuid as uuid, ps.id as s_id, bs.external_id as s_external_id, ct.external_id as c_external_id from provisioning.voip_subscribers ps left join billing.voip_subscribers bs on ps.uuid = bs.uuid left join billing.contracts ct on bs.contract_id = ct.id order by ps.id asc");
my $prefget_sth = $dbh->prepare("select vup.value from provisioning.voip_usr_preferences vup left join voip_preferences vp on vup.attribute_id = vp.id where vp.attribute = ? and vup.subscriber_id = ?");
my $prefdel_sth = $dbh->prepare("delete vup from provisioning.voip_usr_preferences vup left join voip_preferences vp on vup.attribute_id = vp.id where vp.attribute = ? and vup.subscriber_id = ?");
my $prefup_sth = $dbh->prepare("update provisioning.voip_usr_preferences vup left join voip_preferences vp on vup.attribute_id = vp.id set value = ? where vp.attribute = ? and vup.subscriber_id = ?");
my $prefin_sth = $dbh->prepare("insert into provisioning.voip_usr_preferences values(NULL, ?, (select id from provisioning.voip_preferences where attribute = ?), ?, now())");
my $subup_sth = $dbh->prepare("update billing.voip_subscribers set external_id = null where external_id = ''");
my $conup_sth = $dbh->prepare("update billing.contracts set external_id = null where external_id = ''");
$subup_sth->execute or die "failed to clear empty subscriber external_id\n";
$conup_sth->execute or die "failed to clear empty contract external_id\n";
$sub_sth->execute or die "failed to execute subscriber query\n";
while(my $row = $sub_sth->fetchrow_hashref) {
print Dumper $row if $debug;
handle_pref($row, 'ext_subscriber_id', 's_external_id');
handle_pref($row, 'ext_contract_id', 'c_external_id');
}
$sub_sth->finish;
$dbh->disconnect;
sub handle_pref {
my($row, $p, $name) = @_;
$prefget_sth->execute($p, $row->{s_id})
or die "failed to execute $p fetch query\n";
print "$p has ".$prefget_sth->rows." pref rows\n" if $debug;
unless($row->{$name}) {
if($prefget_sth->rows) {
print "delete $p from prefs as undef in sub\n" if $debug;
$prefdel_sth->execute($p, $row->{s_id});
} else {
print "$p pref not set and not defined in sub, ok\n" if $debug;
}
} else {
if($prefget_sth->rows) {
print "update $p in prefs\n" if $debug;
$prefup_sth->execute($row->{$name}, $p, $row->{s_id});
} else {
print "insert $p in prefs\n" if $debug;
$prefin_sth->execute($row->{s_id}, $p, $row->{$name});
}
}
$prefget_sth->finish;
$prefdel_sth->finish;
$prefup_sth->finish;
$prefin_sth->finish;
}
Loading…
Cancel
Save