StoredHash::Tutorial

- NAME
- Using Autonumbered primary keys with StoredHash
- How do I use the StoredHash in a CGI / mod_perl application ?
- I'm sending an AJAX JSON Message From Browser, is there any way store that in stored hash ?
- Ways to use StoredHash in data-pump / replication
- StoredHash in a Perl/GTKBuilder App
- SEE ALSO

# NAME

StoredHash::Tutorial - Practical use-case scenarios for StoredHash

# Using Autonumbered primary keys with StoredHash

Using automatic DB backed assigned numbering for primary keys is a common practice. When using this convention use StoredHash construction parameter 'autoid' set to true value:

        my $shp = StoredHash->new(.... , 'autoid' => 1);

At the DB backend these columns are typically defined:

MySQL: id int NOT NULL AUTO_INCREMENT
SQLite: id INTEGER PRIMARY KEY (Must set 'integer' not only 'int')
MSSQL: id int IDENTITY(1,1) NOT NULL (Start at 1, inc. 1)
Postgres: id SERIAL (NO Type !)

Refer to the latest manuals of respective databases for most recent and accurate information.

StoredHash::ARS does not require primary key ('pkey') or ('autoid') as these are pre-determined by ARS/Remedy conventions.

# How do I use the StoredHash in a CGI / mod_perl application ?

A simple example of a HTML form processing, assuming the db attribute names were used 1:1 on the HTML form:

        sub handle_store {
            my ($cgi) = @_;
            my $h = $cgi->Vars();
            delete($h->{'extrakey'}); # Or any other keys that do not belong to DB
            my $id = $shp->insert($h);
            print("<p>Your entry was stored successfully (By ID: $id)\n</p>");
            my $hfromdb = $shp->load([$id]);

            return(0);
        }

Note: multiple values on a single key are encoded to null-byte delimited serial form by CGI.pm, above example assumes single value per key. On multi-valued keys you'd likely hit problems.

# I'm sending an AJAX JSON Message From Browser, is there any way store that in stored hash ?

Lets use CGI.pm module for its ubiquitouness. You did use content type other than "application/x-www-form-urlencoded" - right ? Because sender is AJAX client, lets respond with

       use JSON::XS;

       sub handle_store_json {
          my ($cgi) = @_;
          my $reqtype = $cgi->content_type();
          my $reqmeth = $cgi->request_method();
          if ($reqtype eq 'application/x-www-form-urlencoded') {die("Not valid POST content-type");}
          if ($reqmeth ne 'POST') {die("Only POST allowed for JSON/REST");}
          # Grab JSON from Body of HTTP Request
          my $msg = decode_json($cgi->param('POSTDATA'));
          if ($msg->{'type'} ne 'store') {die("Not valid message");}
          my $h = $msg->{'entry'};
          my $resp = {'status' => 'OK'};
          my $id = $shp->insert($h);
          if (!$id) {@$resp{'status','msg'} = ('FAIL', "Failed to Store Entry");}
          print(encode_json($resp));
          return(0);
       }

# Ways to use StoredHash in data-pump / replication

        my $shps = StoredHash->new('table' => 'Products', 'pkey' => ['ProdID'],
           'dbh' => $dbh, 'autoid' => 1);
        my $shpt = StoredHash->new('table' => 'Products', 'pkey' => ['ProdID'],
           'dbh' => $dbh, 'autoid' => 1);
        # Verify Schema sync (No strict type check, but if names match
        # it is likely no-one messed up the schema
        my $cols_s = $shps->cols();
        my $cols_t = $shpt->cols();
        # If target has superset of cols, replication would still (likely) work,
        # But this is just an example of possible validation assisted by StoredHash
        if (join('', @cols_s) ne join('', @cols_t)) {die("Schema Mismatch");}

        # Load from SOURCE ($shps)
        my $arr = $shps->loadset(); # Load ALL
        # Replicate to target ($shpt)
        map({
           if ($shpt->exists($_)) {$shpt->update($_, [$_->{'ProdID'}]);}
           else {$shpt->insert($_);}
        } @$arr);

# New API allows you to use with single persister with long lifetime by passing $dbh # at the insert / update / exists methodcall

#my $arr = $shps->loadset('dbh' => $dbh_src); #'dbh' => $dbh_tgt

TODO: NoIDUpdate with autoid

# StoredHash in a Perl/GTKBuilder App

        # Method for getting values
        sub onclick_save {
            my ($widget, $udata) = @_;
            my %uivals = (};
            # Use GTKBuilder / GTK widget methods to access form values
            $uivals{'fullname'} = $builder->get_object("fullname")->get_text();
            # ...
            my $ok = $shp->insert(\%uivals);
            # Run dialog / Show in status
            $dialog->run();
        }

#=head1 Replacing Stored Procedures with StoredHash # #Vision the following StoredProcedure stored in DB: # # INSERT INTO ... # #And its replacement using StoredHash # # my $id = $shp->insert($e); # # #Do you still want to maintain the Stored Procedure ?

# SEE ALSO

CGI, Text::Template, JSON::XS