/[hr-web]/inc/class.DBI
This is repository of my old source code which isn't updated any more. Go to git.rot13.org for current projects!
ViewVC logotype

Annotation of /inc/class.DBI

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.3 - (hide annotations)
Wed Jun 19 18:32:42 2002 UTC (21 years, 10 months ago) by ravilov
Branch: MAIN
CVS Tags: HEAD
Changes since 1.2: +2 -1 lines
lotsa changes... :)

1 dpavlin 1.1 <?PHP // -*-Mode: C++;-*-
2     /*
3     Bill Adams (bill<at>evil<dot>inetarena<dot>com)
4     DBI.php3 -- A perl DBI like class.
5     See: http://evil.inetarena.com/php/DBI.php for more info.
6    
7     Licence: LGPL (http://www.gnu.org/).
8    
9     This software is provided "AS IS" with no warrenty either implicit,
10     explicit or otherwise. Use at your own risk.
11    
12     ...
13    
14     Notes:
15    
16     o 'do' is called 'dbh_do' in this because 'do' is a reserved word.
17    
18     o Not every function is implemented.
19    
20    
21     28 Mar 2000 baa Fixed the sth function to call the right constructor so
22     . one can have multiple database connections.
23    
24     */
25    
26     class DBI {
27    
28     var $db_type = '';
29     var $dbh = '';
30     var $DBD;
31     var $errorstr = '';
32     var $is_persistent;
33     var $exit_on_fail = 0;
34    
35     function parse_dbi_string( $dbi_connect_str ){
36    
37     if( ereg( "(p)?dbi:(.+):(.+)[;:](host=)?(.+)", $dbi_connect_str, $regs ) ||
38     ereg( "(p)?dbi:(.+):(.+)", $dbi_connect_str, $regs )){
39     $dbi[db_type] = $regs[2];
40     $dbi[db_name] = $regs[3];
41 dpavlin 1.2 $dbi[db_host] = ( $regs[5] ? $regs[5] : '' );
42 dpavlin 1.1 $dbi[is_persistent] = ( $regs[1] ? 1 : 0 );
43     //echo "Connecting: [ ",
44     //$dbi[db_type],"][",
45     //$dbi[db_name],"][",
46     //$dbi[dbh_user], "][",
47     //$dbi[db_host], "]<br>\n";
48     return( $dbi );
49    
50     } else {
51     echo "DBI: Invalid Connect String '$dbi_connect_str'.<br>\n";
52     return;
53     }
54    
55     }
56    
57     function DBI( $dbi_connect_str, $db_user = '', $db_passwd = '' ){
58    
59     $this->is_persistent = 0;
60     $dbi_info = $this->parse_dbi_string( $dbi_connect_str );
61     if( ! $dbi_info ){ return; }
62     $this->is_persistent = $db_info[is_persistent];
63    
64    
65     if( $dbi_info[db_type] != '' ){
66     $this->connect( $dbi_info[db_type], $dbi_info[db_name],
67     $dbi_info[db_host],
68     $db_user, $db_passwd,
69     $dbi_info[is_persistent] );
70     }
71     return $this;
72     //Arrg! There is no way to return a false object on the new.
73     // so that means the user will have to check $this->dbh to see if
74     // the connection was made.
75     }//end constructor
76    
77    
78     function connect( $db_type, $db_name, $db_host = '',
79     $db_user = '', $db_passwd = '',
80     $is_persistent = 0 ){
81    
82     //See if we need to parse the db_type...
83     if( ereg( "(p)?dbi:(.+):(.+)[;:](.+)", $db_type, $regs ) ||
84     ereg( "(p)?dbi:(.+):(.+)[;:]?(.+)?", $db_type, $regs )){
85     $db_user = $db_name;
86     $db_passwd = $db_host;
87     $db_type = $regs[2];
88     $db_name = $regs[3];
89 ravilov 1.3 #$db_host = ( $regs[4] ? $regs[4] : 'localhost' );
90     $db_host = ( $regs[4] ? $regs[4] : '' );
91 dpavlin 1.1 $is_persistent = ( $regs[1] ? 1 : 0 );
92     //echo "Connecting: [ $db_name ][ $dbh_user ][ $db_host ]<br>\n";
93     }
94    
95     $this->is_persistent = $is_persistent;
96    
97     //Select the database type.
98     if( eregi( "^mysql$", $db_type )){
99     $db_type = 'mysql'; //perl string for this database.
100     } else if( eregi( "informix", $db_type )){
101     $db_type = 'Informix';
102     } else if( eregi( "sybase", $db_type )){
103     $db_type = 'sybase';
104     } else if (eregi( "Pg", $db_type )){
105     $db_type = 'Pg';
106     }
107     $this->db_type = $db_type;
108    
109    
110     //Include the file only if we have not already read it.
111     if( ! $GLOBALS['classDBD'.$db_type."_read"] ){
112     include( 'class.DBD::'.$db_type );
113     }
114    
115     //Check to see if we could read it...
116     if( ! $GLOBALS['classDBD'.$db_type."_read"] ){
117     echo "Error: No DBD for $db_type.<br>\n";
118     $this->errstr = "Error: No DBD driver for '$db_type'.";
119     return;
120     }
121    
122     //Track the connections. The reason for doing this is that
123     // if the user tries (at least with MySQL_* functions) to
124     // connecto to a mysql database with the same arguments
125     // then mysql_connect will return the same connection handle.
126     // This is a problem when the user tries to select two different
127     // MySQL databases using the same host, user, and password.
128     //$GLOBALS[classDBI_connectiontrack] = array( );
129     if( $GLOBALS[classDBI_connectiontrack]
130     [$db_type][$db_host][$db_user][$db_passwd]
131     &&
132     $GLOBALS[classDBI_connectiontrack]
133     [$db_type][$db_host][$db_user][$db_passwd] != $db_name ){
134     echo "<B>DBI Warning:</B> You are trying to connect to two different ",
135     $db_type," databases with the same host, user, and password. ",
136     "This will probably give you unexpected results. ",
137     "Expect problems.",
138     "<br>\n";
139     }
140    
141     $DBD_class = 'DBD_'.$db_type;
142     $this->DBD = new $DBD_class;
143    
144     //Originally, I was going to have the sub class set the variables
145     // in this class but when you do something like $class1 = $class2,
146     // PHP makes a copy of the class so changes to class2 will not
147     // be shown in class1. For this reason, functions will need to be
148     // fully parameterized and the value of DBD->errstr will have to be
149     // copied after the call.
150    
151     //Note that the arg list for the DBD connect is different than that
152     // of this connect.
153     $conn = $this->DBD->DBD_connect( $db_name, $db_host,
154     $db_user, $db_passwd,
155     $this->is_persistent );
156    
157     if( !$conn ){
158     $this->errstr = $this->DBD->errstr;
159     return;
160     }
161    
162     $GLOBALS[classDBI_connectiontrack]
163     [$db_type][$db_host][$db_user][$db_passwd] = $db_name;
164    
165     $this->dbh = $conn;
166     return( $this );
167     }//end connect function
168    
169    
170     function disconnect( ){
171     if( $this->DBD ){
172     $this->DBD->disconnect( );
173     }
174     }//end disconnect function
175    
176    
177     function exit_on_fail( $yesno = '' ){
178     //Should the program stop if a query fails?
179     // This is partially implemented.
180     if( $yesno != '' ){
181     $this->DBD->exit_on_fail = $yesno;
182     }
183     return( $this->DBD->exit_on_fail );
184     }
185    
186    
187     function prepare( $query ){
188     //Does nothing but save the query. Be sure we call the
189     // prepare of the DBD object. Otherwise
190     // we get conflicts if we try to have more than one
191     // database handle.
192     if( ! $this->dbh ){ return; }
193     $sth = $this->DBD->prepare( $query );
194     $this->errstr = $this->DBD->errstr;
195     return( $sth );
196     }//end dbh prepare fn
197    
198    
199     //do is a reserved word so I have to name this something else.
200     function dbh_do( $query ){
201     //run the query and return the number of affected rows.
202     $rows = $this->DBD->dbh_do( $query );
203     $this->errstr = $this->DBD->errstr;
204     if( $rows == 0 ){ $rows = '0E0'; }
205     return( $rows );
206     }//end fn do
207    
208    
209     function insert_id( ){
210     //Get the last serial number from an insert.
211     return( $this->DBD->insert_id( ));
212     }//end fn insert_id
213    
214     function quote( $string ){
215     return( $this->DBD->quote( $string ));
216     }
217    
218     }//end DBI class
219    
220     //Print out warnings if the user gets duplicate connections.
221     $GLOBALS[classDBI_connectiontrack] = array( );

  ViewVC Help
Powered by ViewVC 1.1.26