Listing 4: Appointments.p


package Appointments;

use strict;
use DBI;

# Declare global variables
use vars qw($dbhost $dbuser $dbpassword $dsn @ISA);

my $dbhost = 'localhost';
my $dbuser = 'reuven';
my $dbpassword = '';
my $dsn = "DBI:Pg:dbname=atf;host=$dbhost;";

# We don't inherit from anyone
@ISA = ();

# Constructor: Takes a class as an argument, and
# connects to the database. Returns a new
# Appointments object, or undef if there was
# an error.

sub new
{
   # Get our class
   my $class = shift;

   # Create our instance
   my $self = {};

   # Connect to the database.  Set RaiseError, but
   # not PrintError, since objects should not
   # display errors when they occur.
   my $dbh = DBI->connect($dsn, $dbuser, $dbpassword,
                 {RaiseError => 1, AutoCommit => 1});

    # If we could not connect, return undef
    return undef unless (defined $dbh);

    # Store the database handle as an instance
    # variable
    $self->{dbh} = $dbh;

    # Turn $self into an object
  bless $self, $class;

    # Return the new instance
    return $self;
}

# add_appointment
sub add_appointment
{
    # Get myself
    my $self = shift;

    # Get the parameters
    my ($people, $start_time, $end_time, $notes) = @_;***

    # Get the database handle
    my $dbh = $self->{dbh};

    # Make sure that we have everything we need
    return undef unless ($people and $start_time and $end_time);***

    # Create the appropriate SQL
    my $sql = "INSERT INTO Appointments ";
    $sql .= " (person_id, start_time, end_time, notes) ";***
    $sql .= " VALUES (?, ?, ?, ?) ";

    # Execute the query
    my $rows_affected =
        $dbh->do($sql, undef, $people->get_current_person(),***
$start_time,
                 $end_time, $notes);

    if ($rows_affected)
    {
        return $self;
    }
    else
    {
        return undef;
    }
}

# get_today
sub get_today
{
  # Get myself
    my $self = shift;

    # Get the database handle
    my $dbh = $self->{dbh};

    # Create SQL for today's appointments
    my $sql = "SELECT P.first_name, P.last_name, A.start_time, ";***
    $sql .= "A.end_time, A.notes ";
    $sql .= "FROM People P, Appointments A ";
    $sql .= "WHERE P.person_id = A.person_id ";
    $sql .= "  AND A.start_time > CURRENT_DATE ";
    $sql .= "  AND A.end_time < (CURRENT_DATE + 1) ";***

    # Prepare and execute the query
    my $sth = $dbh->prepare($sql);
    $sth->execute();

    # Initialize an array of appointments
    my @appointments = ();

    # Retrieve the results, putting them into an array of hash references
  while (my $hashref = $sth->fetchrow_hashref())
    {
        my %appointment = %{$hashref};
        push @appointments, \%appointment;
    }

    # We're done with this statement
    $sth->finish;

    return @appointments;
}

# get_today_with_person
sub get_today_with_person
{
    # Get myself
    my $self = shift;

    # Get the People object
    my $people = shift;

    # Get the database handle               my $dbh =
    # $self->{dbh};

    # Create SQL for today's appointments
    my $sql = "SELECT P.first_name, P.last_name, A.start_time, ";***
    $sql .= "A.end_time, A.notes ";
    $sql .= "FROM People P, Appointments A ";
    $sql .= "WHERE P.person_id = ? ";
    $sql .= "  AND P.person_id = A.person_id ";
    $sql .= "  AND A.start_time > CURRENT_DATE ";
    $sql .= "  AND A.end_time < (CURRENT_DATE + 1) ";***

    # Prepare and execute the query
    my $sth = $dbh->prepare($sql);
    $sth->execute($people->get_current_person());

    # Initialize an array of appointments
    my @appointments = ();

    # Retrieve the results, putting them into an
    # array of hash references
    while (my $hashref = $sth->fetchrow_hashref())
    {
        my %appointment = %{$hashref};
        push @appointments, \%appointment;
    }

    # We're done with this statement
    $sth->finish;

    return @appointments;
}

# Destructor: Called automatically by Perl. We use
# this to close the database handle. This isn't
# really necessary if we are running
# under Apache::DBI.

sub DESTROY
{
    # Get myself
    my $self = shift;

    # Get the database handle
    my $dbh = $self->{dbh};

    # Close the database handle
    $dbh->disconnect;

    return;
}

# Always return a true value from a module
1;