Ok, now that I have a basic understanding of the FOR UPDATE , the initial
selectall_arrayref is confusing me.
The while loop is getting each row , but it's returning a reference.
So when I try to dereference it I am still getting a memory address which
tells me I am not doing it properly.
What I need to do is
foreach my $url (@$url_list) {
my ($url_id) = (@$url[0]);
}
But I can't figure out how to do this in the while loop without causing it
to do the foreach every time thus increasing the foreach loop each time
through. :)
sub select_url() {
my $select_query = "SELECT check.url_id AS url_id, check.url_timeout,
url.url_protocol, url.url, url.contact_ids, MD5.MD5,
check.mc_id, check.lc_status, check.lc_MD5_status
FROM monitor_check check
LEFT OUTER JOIN monitor_url url
ON check.url_id = url.url_id
LEFT OUTER JOIN monitor_MD5 MD5
ON check.url_id = MD5.url_id
WHERE ((active = 1)
AND ((chk_freq + UNIX_TIMESTAMP(lc_epoch)) <= ?))
OR (lc_status = 0)
FOR UPDATE";
my $update_query_statement = "UPDATE monitor_check
SET lc_epoch = FROM_UNIXTIME(?)
WHERE url_id = ?";
my @update_values;
my ($update_query, $update);
my $url_id;
while (my $url_list = $dbh->selectall_arrayref($select_query, undef,
$current_time)
or die "Can't execute statement: $DBI::errstr") {
@update_values = ($current_time, @$url_list[0]);
print "DEBUG - @$url_list[0] $current_time\n";
$update_query = $dbh->prepare($update_query_statement)
or die "Unable to prepare update_query_statement:
$DBI::errstr";
$update = $update_query->execute(@update_values)
or die "Unable to execute update_query: $DBI::errstr";
}
return($url_list);
}