package Db::Backend;

use strict;

sub new {
  my $self = {};
  bless($self, shift);
  $self->_init(@_);
  return $self;
}

#
# Required parameters: 'name', 'user', 'password'.
# Optional parameters:
#  'host' - database host name, if remote. If not specified, local UNIX-socket will be used.
#  'port' - database port
#
# Additional parameters are defined in subclasses.
#

sub _init {
  my ($self, %params) = @_;

  $self->{name} = $params{name};
  $self->{user} = $params{user};
  $self->{password} = $params{password};
  $self->{host} = $params{host} if defined $params{host};
  $self->{port} = $params{port} if defined $params{port};
}

sub description {
  my ($self) = @_;

  my $s = "db $self->{name}, user $self->{user}, ";
  if (defined $self->{host}) {
    $s .= "host $self->{host}";
  } else {
    $s .= "local socket";
  }
  return $s;
}

#
# Subclass must override this function.
# Return value: 0 - error, <> 0 - success.
# errstr must be set on error.
#
sub connect {
  die "Pure virtual function call";
}

sub disconnect {
  die "Pure virtual function call";
}

sub execute {
  die "Pure virtual function call";
}

sub errstr {
  my ($self) = @_;

  return $self->{errstr};
}

sub _set_errstr {
  my ($self, $errstr) = @_;
  $self->{errstr} = $errstr;
}

sub quote {
  my ($self, $sql) = @_;
  return $sql;
}

1;
