File Coverage

blib/lib/DBIx/Class/Storage/DBI/Sybase/FreeTDS.pm
Criterion Covered Total %
statement 18 41 43.9
branch 0 8 0.0
condition 0 2 0.0
subroutine 6 14 42.8
pod 1 1 100.0
total 25 66 37.8


line stmt bran cond sub pod time code
1             package DBIx::Class::Storage::DBI::Sybase::FreeTDS;
2              
3 2     2   1323 use strict;
  2         5  
  2         55  
4 2     2   11 use warnings;
  2         4  
  2         51  
5 2     2   10 use base qw/DBIx::Class::Storage::DBI::Sybase/;
  2         4  
  2         248  
6 2     2   13 use mro 'c3';
  2         4  
  2         9  
7 2     2   45 use Try::Tiny;
  2         5  
  2         96  
8 2     2   15 use namespace::clean;
  2         4  
  2         10  
9              
10             =head1 NAME
11              
12             DBIx::Class::Storage::DBI::Sybase::FreeTDS - Base class for drivers using
13             DBD::Sybase over FreeTDS.
14              
15             =head1 DESCRIPTION
16              
17             This is the base class for Storages designed to work with L<DBD::Sybase> over
18             FreeTDS.
19              
20             It is a subclass of L<DBIx::Class::Storage::DBI::Sybase>.
21              
22             =head1 METHODS
23              
24             =cut
25              
26             # The subclass storage driver defines _set_autocommit_stmt
27             # for MsSQL it is SET IMPLICIT_TRANSACTIONS ON/OFF
28             # for proper Sybase it's SET CHAINED ON/OFF
29             sub _set_autocommit {
30 0     0     my $self = shift;
31              
32 0 0         if ($self->_dbh_autocommit) {
33 0           $self->_dbh->do($self->_set_autocommit_stmt(1));
34             } else {
35 0           $self->_dbh->do($self->_set_autocommit_stmt(0));
36             }
37             }
38              
39             # Handle AutoCommit and SET TEXTSIZE because LongReadLen doesn't work.
40             #
41             sub _run_connection_actions {
42 0     0     my $self = shift;
43              
44             # based on LongReadLen in connect_info
45 0           $self->set_textsize;
46              
47 0           $self->_set_autocommit;
48              
49 0           $self->next::method(@_);
50             }
51              
52             =head2 set_textsize
53              
54             When using DBD::Sybase with FreeTDS, C<< $dbh->{LongReadLen} >> is not available,
55             use this function instead. It does:
56              
57             $dbh->do("SET TEXTSIZE $bytes");
58              
59             Takes the number of bytes, or uses the C<LongReadLen> value from your
60             L<connect_info|DBIx::Class::Storage::DBI/connect_info> if omitted, lastly falls
61             back to the C<32768> which is the L<DBD::Sybase> default.
62              
63             =cut
64              
65             sub set_textsize {
66 0     0 1   my $self = shift;
67             my $text_size =
68             shift
69             ||
70 0     0     try { $self->_dbic_cinnect_attributes->{LongReadLen} }
71             ||
72 0   0       32768; # the DBD::Sybase default
73              
74 0           $self->_dbh->do("SET TEXTSIZE $text_size");
75             }
76              
77             sub _exec_txn_begin {
78 0     0     my $self = shift;
79              
80 0 0         if ($self->{_in_do_block}) {
81 0           $self->_dbh->do('BEGIN TRAN');
82             }
83             else {
84 0     0     $self->dbh_do(sub { $_[1]->do('BEGIN TRAN') });
  0            
85             }
86             }
87              
88             sub _exec_txn_commit {
89 0     0     my $self = shift;
90              
91 0 0         my $dbh = $self->_dbh
92             or $self->throw_exception('cannot COMMIT on a disconnected handle');
93              
94 0           $dbh->do('COMMIT');
95             }
96              
97             sub _exec_txn_rollback {
98 0     0     my $self = shift;
99              
100 0 0         my $dbh = $self->_dbh
101             or $self->throw_exception('cannot ROLLBACK on a disconnected handle');
102              
103 0           $dbh->do('ROLLBACK');
104             }
105              
106             =head1 FURTHER QUESTIONS?
107              
108             Check the list of L<additional DBIC resources|DBIx::Class/GETTING HELP/SUPPORT>.
109              
110             =head1 COPYRIGHT AND LICENSE
111              
112             This module is free software L<copyright|DBIx::Class/COPYRIGHT AND LICENSE>
113             by the L<DBIx::Class (DBIC) authors|DBIx::Class/AUTHORS>. You can
114             redistribute it and/or modify it under the same terms as the
115             L<DBIx::Class library|DBIx::Class/COPYRIGHT AND LICENSE>.
116              
117             =cut
118              
119             1;