NetSDS::DBI::Table3pm
Usage
use NetSDS::DBI::Table;my $q = NetSDS::DBI::Table->new(dsn => 'dbi:Pg:dbname=netsdsdb;host=127.0.0.1',user => 'netsds',passwd => 'test',table => 'public.messages',) or warn NetSDS::DBI::Table->errstr();
Overview
"NetSDS::DBI::Table" module provides commonly used CRUD functionality for data stored in single database.
Main idea was that we can agree about some limitations:
* every such table contains "id" field that is primary key
* we use PostgreSQL DBMS with all it's features
Class API
new([...])- class constructor-
my $tbl = NetSDS::DBI::Table->new(dsn => 'dbi:Pg:dbname=content',login => 'netsds',passwd => 'topsecret,table => 'content.meta',);
fetch(%params)- get records from table as array of hashrefs-
Paramters (hash):
* fields - fetch fields by list
* filter - arrayref of SQL expressions like
"status = 'active'"for"WHERE"clause* order - arrayref of SQL expressions like
"id desc"for"ORDER BY"clause* limit - max number of records to fetch (LIMIT N)
* offset - records to skip from beginning (OFFSET N)
* for_update - records selected for further update within current transaction
Returns: message as array of hashrefs
Sample:
my @messages = $q->fetch(fields => ['id', 'now() as time'],filter => ['msg_status = 5', 'date_received < now()'], # where msg_status=5 and date_received < now()order => ['id desc', 'src_addr'], # order by id desc, src_addrlimit => 3, # fetch 3 recordsoffset => 5, # from 6-th recordfor_update => 1, # for update)
insert_row(%key_val_pairs)- insert record into table-
Paramters: record fields as hash
Returns: id of inserted record
my $user_id = $tbl->insert_row('login' => 'vasya','password' => $encrypted_passwd,);
insert(@records_list)- mass insert-
Paramters: list of records (as hashrefs)
Returns: array of inserted records "id"
This method allows mass insert of records.
my @user_ids = $tbl->insert({ login => 'vasya', password => $str1 },{ login => 'masha', password => $str2 },{ login => 'petya', password => $str3, active => 'false' },);Warning!This method use separate INSERT queries and in fact is only wrapper for multiple"insert_row()"calls. So it's not so fast as one insert but allows to use different key-value pairs for different records.
- update_row($id, %params) - update record parameters
-
Paramters: id, new parameters as hash
Returns: updated record as hash
Example:
my %upd = $table->update_row($msg_id,status => 'failed',dst_addr => '380121234567',);After this
%updhash will contain updated table record.
update(%params)- update records by filter-
Paramters: filter, new values
$tbl->update(filter => ['active = true', 'created > '2008-01-01'],set => {info => 'Created after 2007 year',});
get_count(%params)- retrieve number of records-
Just return total number of records by calling:
# SELECT COUNT(id) FROM schema.tablemy $count = $tbl->get_count();my $count_active = $tbl->get_count(filter => ['active = true']);
delete_by_id(@ids)- delete records by identifier-
Paramters: list of record id
Returns: 1 if ok, undef if error
Method deletes records from SQL table by it's identifiers.
if ($tbl->remove(5, 8 ,19)) {print "Records successfully removed.";}
delete(@filters)- delete records-
Paramters: list of filters
Returns: 1 if ok, undef if error
$tbl->delete('active = false','expire < now()',);
get_fields()- get list of fields-
Example:
my @fields = @{ $tbl->get_fields() };print "Table fields: " . join (', ', @fields);
has_field($field)- check if field exists-
Paramters: field name
Example:
if ($tbl->has_field('uuid')) {$tbl->call("delete tbldata where uuid=?", $uuid);}NOTE: this method works only for restricted tables that use
"fields"parameter at construction time.
Examples
See "samples/test_db_table.pl" script
Todo
None
Releases
8 releases since Debian 6.0 (Squeeze); the text changed 3 times.