#| Base role to DB statements
#| Returned by .query
unit role Red::Statement;
has $.statement;
has @.binds is rw;
has $.driver is required;
has Bool $!predefined-bind = False;

# How to execute a query must be implemented
method stt-exec($, *@) { ... }

method predefined-bind { $!predefined-bind = True }

#| Execute the pre-prepared query
method execute(*@binds) is hidden-from-backtrace {
    CATCH {
        default {
            $!driver.map-exception($_).throw
        }
    }
    $!statement = self.stt-exec: $!statement, |@binds;
    self
}

method prepare($query) { $!driver.prepare: $query }

#| How to get a row must be implemented
method stt-row($ --> Hash()) { ... }

#| Get the next row
method row {
    my \resp = self.stt-row: $!statement;
    note resp if $*RED-DEBUG-RESPONSE;
    resp
}