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   903 use strict;
  2         4  
  2         51  
4 2     2   9 use warnings;
  2         4  
  2         47  
5 2     2   8 use base qw/DBIx::Class::Storage::DBI::Sybase/;
  2         4  
  2         182  
6 2     2   12 use mro 'c3';
  2         4  
  2         12  
7 2     2   58 use DBIx::Class::_Util 'dbic_internal_try';
  2         6  
  2         102  
8 2     2   11 use namespace::clean;
  2         4  
  2         13  
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 over
18             FreeTDS.
19              
20             It is a subclass of L.
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 value from your
60             L if omitted, lastly falls
61             back to the C<32768> which is the L 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     dbic_internal_try { $self->_dbic_connect_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.
109              
110             =head1 COPYRIGHT AND LICENSE
111              
112             This module is free software L
113             by the L. You can
114             redistribute it and/or modify it under the same terms as the
115             L.
116              
117             =cut
118              
119             1;