The London Perl and Raku Workshop takes place on 26th Oct 2024. If your company depends on Perl, please consider sponsoring and/or attending.
use strict;
use warnings;
use SQL::DB;
use SQL::DBx::SQLite;
use Test::More;
use Test::Database;

foreach my $handle ( Test::Database->handles(qw/SQLite/) ) {

    if ( $handle->dbd eq 'SQLite' ) {
        $handle->driver->drop_database( $handle->name );
    }

    my ( $dsn, $user, $pass ) = $handle->connection_info;

    my $db = SQL::DB->new(
        dsn      => $dsn,
        username => $user,
        password => $pass,
    );

    if ( $handle->dbd eq 'SQLite' ) {
        $db->sqlite_create_function_nextval;
        $db->sqlite_create_function_currval;
    }

    eval { $db->conn->dbh->do('DROP SEQUENCE seq_testseq'); };

    eval { $db->conn->dbh->selectrow_array("SELECT nextval('testseq')") };
    ok $@, 'exception on no sequences func';

    eval { $db->nextval('testseq') };
    ok $@, 'exception on no sequences method' . $@;

    $db->sqlite_create_sequence('testseq');

    eval { $db->conn->dbh->selectrow_array("SELECT nextval('JUNK')") };
    ok $@, 'exception on non-existent func';

    eval { $db->nextval('JUNK') };
    ok $@, 'exception on non-existent method' . $@;

    my ( $id1, $id2, $id3, $id4, $id5 );

    $id1 = $db->nextval('testseq');
    ok $id1, 'nextval:' . $id1;

    $id2 = $db->nextval('testseq');
    ok $id2 > $id1, "$id2 > $id1";

    $id3 = ( $db->conn->dbh->selectrow_array("SELECT nextval('testseq')") )[0];
    ok $id3 > $id2, "$id3 > $id2 for nextval builtin";

    $id4 = ( $db->conn->dbh->selectrow_array("SELECT currval('testseq')") )[0];
    ok $id4 == $id3, "$id4 == $id3 for currval builtin";

    $id5 = ( $db->currval('testseq') )[0];
    ok $id4 == $id5, "$id4 == $id3 for currval";
}

done_testing();