App-Sqitch
view release on metacpan or search on metacpan
lib/App/Sqitch/Engine/oracle.pm view on Meta::CPAN
FROM all_tables
WHERE owner = UPPER(?)
AND table_name = 'CHANGES'
}, undef, $self->registry)->[0];
}
sub _log_event {
my ( $self, $event, $change, $tags, $requires, $conflicts) = @_;
my $dbh = $self->dbh;
my $sqitch = $self->sqitch;
$tags ||= $self->_log_tags_param($change);
$requires ||= $self->_log_requires_param($change);
$conflicts ||= $self->_log_conflicts_param($change);
# Use the sqitch_array() constructor to insert arrays of values.
my $tag_ph = 'sqitch_array('. join(', ', ('?') x @{ $tags }) . ')';
my $req_ph = 'sqitch_array('. join(', ', ('?') x @{ $requires }) . ')';
my $con_ph = 'sqitch_array('. join(', ', ('?') x @{ $conflicts }) . ')';
my $ts = $self->_ts_default;
$dbh->do(qq{
INSERT INTO events (
event
, change_id
, change
, project
, note
, tags
, requires
, conflicts
, committer_name
, committer_email
, planned_at
, planner_name
, planner_email
, committed_at
)
VALUES (?, ?, ?, ?, ?, $tag_ph, $req_ph, $con_ph, ?, ?, ?, ?, ?, $ts)
}, undef,
$event,
$change->id,
$change->name,
$change->project,
$change->note,
@{ $tags },
@{ $requires },
@{ $conflicts },
$sqitch->user_name,
$sqitch->user_email,
$self->_char2ts( $change->timestamp ),
$change->planner_name,
$change->planner_email,
);
return $self;
}
sub changes_requiring_change {
my ( $self, $change ) = @_;
# Why CTE: https://forums.oracle.com/forums/thread.jspa?threadID=1005221
return @{ $self->dbh->selectall_arrayref(q{
WITH tag AS (
SELECT tag, committed_at, project,
ROW_NUMBER() OVER (partition by project ORDER BY committed_at) AS rnk
FROM tags
)
SELECT c.change_id, c.project, c.change, t.tag AS asof_tag
FROM dependencies d
JOIN changes c ON c.change_id = d.change_id
LEFT JOIN tag t ON t.project = c.project AND t.committed_at >= c.committed_at
WHERE d.dependency_id = ?
AND (t.rnk IS NULL OR t.rnk = 1)
}, { Slice => {} }, $change->id) };
}
sub name_for_change_id {
my ( $self, $change_id ) = @_;
# Why CTE: https://forums.oracle.com/forums/thread.jspa?threadID=1005221
return $self->dbh->selectcol_arrayref(q{
WITH tag AS (
SELECT tag, committed_at, project,
ROW_NUMBER() OVER (partition by project ORDER BY committed_at) AS rnk
FROM tags
)
SELECT change || COALESCE(t.tag, '@HEAD')
FROM changes c
LEFT JOIN tag t ON c.project = t.project AND t.committed_at >= c.committed_at
WHERE change_id = ?
AND (t.rnk IS NULL OR t.rnk = 1)
}, undef, $change_id)->[0];
}
sub change_id_offset_from_id {
my ( $self, $change_id, $offset ) = @_;
# Just return the ID if there is no offset.
return $change_id unless $offset;
# Are we offset forwards or backwards?
my ( $dir, $op ) = $offset > 0 ? ( 'ASC', '>' ) : ( 'DESC' , '<' );
return $self->dbh->selectcol_arrayref(qq{
SELECT id FROM (
SELECT id, rownum AS rnum FROM (
SELECT change_id AS id
FROM changes
WHERE project = ?
AND committed_at $op (
SELECT committed_at FROM changes WHERE change_id = ?
)
ORDER BY committed_at $dir
)
) WHERE rnum = ?
}, undef, $self->plan->project, $change_id, abs $offset)->[0];
}
sub change_offset_from_id {
my ( $self, $change_id, $offset ) = @_;
# Just return the object if there is no offset.
return $self->load_change($change_id) unless $offset;
# Are we offset forwards or backwards?
my ( $dir, $op ) = $offset > 0 ? ( 'ASC', '>' ) : ( 'DESC' , '<' );
my $tscol = sprintf $self->_ts2char_format, 'c.planned_at';
my $tagcol = sprintf $self->_listagg_format, 't.tag';
my $change = $self->dbh->selectrow_hashref(qq{
SELECT id, name, project, note, timestamp, planner_name, planner_email, tags, script_hash
FROM (
SELECT id, name, project, note, timestamp, planner_name, planner_email, tags, script_hash, rownum AS rnum
FROM (
SELECT c.change_id AS id, c.change AS name, c.project, c.note,
$tscol AS timestamp, c.planner_name, c.planner_email,
$tagcol AS tags, c.script_hash
FROM changes c
LEFT JOIN tags t ON c.change_id = t.change_id
WHERE c.project = ?
AND c.committed_at $op (
( run in 0.869 second using v1.01-cache-2.11-cpan-437f7b0c052 )