DESCRIPTION

DBIx::SearchBuilder::Record is designed to work with DBIx::SearchBuilder.

What is it trying to do.

DBIx::SearchBuilder::Record abstracts the agony of writing the common and generally simple SQL statements needed to serialize and De-serialize an object to the database. In a traditional system, you would define various methods on your object 'create', 'find', 'modify', and 'delete' being the most common. In each method you would have a SQL statement like:

select * from table where value='blah';

If you wanted to control what data a user could modify, you would have to do some special magic to make accessors do the right thing. Etc. The problem with this approach is that in a majority of the cases, the SQL is incredibly simple and the code from one method/object to the next was basically the same.

<trumpets>

Enter, DBIx::SearchBuilder::Record.

With::Record, you can in the simple case, remove all of that code and replace it by defining two methods and inheriting some code. Its pretty simple, and incredibly powerful. For more complex cases, you can, gasp, do more complicated things by overriding certain methods. Lets stick with the simple case for now.

The two methods in question are '_Init' and '_ClassAccessible', all they really do are define some values and send you on your way. As you might have guessed the '_' suggests that these are private methods, they are. They will get called by your record objects constructor.

'_Init'

Defines what table we are talking about, and set a variable to store the database handle.

'_ClassAccessible

Defines what operations may be performed on various data selected from the database. For example you can define fields to be mutable, or immutable, there are a few other options but I don't understand what they do at this time.

Here we set our handle and table name, while its not obvious so far, we'll see later that $handle (line: 006) gets passed via ::Record::new when a new instance is created. Thats actually an important concept, the DB handle is not bound to a single object but rather, its shared across objects.

Creates a new DBIx::SearchBuilder::Handle, and then connects to the database using that handle. Pretty straight forward, the password '' is what I use when there is no password. I could probably leave it blank, but I find it to be more clear to define it.

009:
010: my $s = Simple->new($handle);
011:
012: $s->LoadById(1);

LoadById is one of four 'LoadBy' methods, as the name suggests it searches for an row in the database that has id='0'. ::SearchBuilder has, what I think is a bug, in that it current requires there to be an id field. More reasonably it also assumes that the id field is unique. LoadById($id) will do undefined things if there is >1 row with the same id.

In addition to LoadById, we also have:

LoadByCol

Takes two arguments, a column name and a value. Again, it will do undefined things if you use non-unique things.

LoadByCols

Takes a hash of columns=>values and returns the *first* to match. First is probably lossy across databases vendors.

LoadFromHash

Populates this record with data from a DBIx::SearchBuilder. I'm currently assuming that DBIx::SearchBuilder is what we use in cases where we expect > 1 record. More on this later.

Now that we have a populated object, we should do something with it! ::Record automagically generates accessos and mutators for us, so all we need to do is call the methods. Accessors are named <Field>(), and Mutators are named Set<Field>($). On to the example, just appending this to the code from the last example.

Pretty simple! Thats really all there is to it. Set<Field>($) returns a boolean and a string describing the problem. Lets look at an example of what will happen if we try to set a 'Id' which we previously defined as read only.

Currently Set<Field> updates the data in the database as soon as you call it. In the future I hope to extend ::Record to better support transactional operations, such that updates will only happen when "you" say so.

Finally, adding a removing records from the database. ::Record provides a Create method which simply takes a hash of key=>value pairs. The keys exactly map to database fields.

primary_keys

PrimaryKeys

_Accessible KEY MODE

_PrimaryKeys

Return our primary keys. (Subclasses should override this, but our default is that we have one primary key, named 'id'.)

_ClassAccessible

An older way to specify fields attributes in a derived class. (The current preferred method is by overriding Schema; if you do this and don't override _ClassAccessible, the module will generate an appropriate _ClassAccessible based on your Schema.)

ReadableAttributes

Returns an array of the attributes of this class defined as "read" => 1 in this class' _ClassAccessible datastructure

WritableAttributes

Returns an array of the attributes of this class defined as "write" => 1 in this class' _ClassAccessible datastructure

__Value

Takes a field name and returns that field's value. Subclasses should never override __Value.

_Value

_Value takes a single column name and returns that column's value for this row. Subclasses can override _Value to insert custom access control.

_Set

_Set takes a single column name and a single unquoted value. It updates both the in-memory value of this column and the in-database copy. Subclasses can override _Set to insert custom access control.

_Canonicalize PARAMHASH

This routine massages an input value (VALUE) for FIELD into something that's going to be acceptable.

Takes

FIELD

VALUE

FUNCTION

Takes:

FIELD

VALUE

FUNCTION

Returns a replacement VALUE.

_Validate FIELD VALUE

Validate that VALUE will be an acceptable value for FIELD.

Currently, this routine does nothing whatsoever.

If it succeeds (which is always the case right now), returns true. Otherwise returns false.

TruncateValue KEY VALUE

Truncate a value that's about to be set so that it will fit inside the database' s idea of how big the column is.

(Actually, it looks at SearchBuilder's concept of the database, not directly into the db).

_Object

_Object takes a single column name and an array reference. It creates new object instance of class specified in _ClassAccessable structure and calls LoadById on recently created object with the current column value as argument. It uses the array reference as the object constructor's arguments. Subclasses can override _Object to insert custom access control or define default contructor arguments.

Note that if you are using a Schema with a REFERENCES field, this is unnecessary: the method to access the column's value will automatically turn it into the appropriate object.

Load

Takes a single argument, $id. Calls LoadById to retrieve the row whose primary key is $id

LoadByCol

Takes two arguments, a column and a value. The column can be any table column which contains unique values. Behavior when using a non-unique value is undefined

LoadByCols

Takes a hash of columns and values. Loads the first record that matches all keys.

The hash's keys are the columns to look at.

The hash's values are either: scalar values to look for OR has references which contain 'operator' and 'value'

LoadById

Loads a record by its primary key. Your record class must define a single primary key column.

LoadByPrimaryKeys

Like LoadById with basic support for compound primary keys.

LoadFromHash

Takes a hashref, such as created by DBIx::SearchBuilder and populates this record's loaded values hash.

_LoadFromSQL QUERYSTRING @BIND_VALUES

Load a record as the result of an SQL statement

Create

Takes an array of key-value pairs and drops any keys that aren't known as columns for this recordtype

Delete

Delete this record from the database. On failure return a Class::ReturnValue with the error. On success, return 1;

As a valued partner and proud supporter of MetaCPAN, StickerYou is
happy to offer a 10% discount on all Custom Stickers,
Business Labels, Roll Labels,
Vinyl Lettering or Custom Decals. StickerYou.com
is your one-stop shop to make your business stick.
Use code METACPAN10 at checkout to apply your discount.