ExpressionEngine CMS
Open, Free, Amazing

Thread

This is an archived forum and the content is probably no longer relevant, but is provided here for posterity.

The active forums are here.

My Adodb Library integration

November 23, 2007 3:52pm

Subscribe [4]
  • #1 / Nov 23, 2007 3:52pm

    edwardj

    2 posts

    I wanted to integrate ADODB with the codeigniter, and I noticed that the implementation in the wiki looked like it was designed for the older versions of CI.  I made my own implementation with modifications, based off some of the other posts I saw here on the boards. This version lets you load multiple database connections and it goes off your database.php config.

    For this to work, unzip the adodb files to applications/libraries/adodb.
    And have the below file: adodb_loader.php in your applications/libraries folder.

    <?php if (!defined('BASEPATH')) exit('No direct script access allowed');
    
    class Adodb_loader
    {
        function Adodb_loader($params=null)
        {
            // check if adodb already loaded
            if (!class_exists('ADONewConnection'))
            {
                require_once(APPPATH.'libraries/adodb/adodb.inc'.EXT);
            }
    
            // database handler's name, defaults to 'adodb'
            $dbh = (isset($params['name'])) ? $params['name'] : 'adodb';
    
            // the db settings group from the database.php config
            $db_group = (isset($params['group'])) ? $params['group'] : '';
    
            $this->_init_adodb_library($dbh,$db_group);
        }
    
        function _init_adodb_library($dbh,$db_group)
        {
            // get CI instance
            $CI =& get_instance();
    
            // get database config
            include(APPPATH.'config/database'.EXT);
    
            // check which database group settings to use
            // default to database setting default
            $db_group = (!empty($db_group)) ? $db_group : $active_group;
            $cfg = $db[$db_group];
    
            // check that driver is set
            if (isset($cfg['dbdriver']))
            {
                $CI->$dbh =& ADONewConnection($cfg['dbdriver']);
    
                // set debug
                $CI->$dbh->debug = $cfg['db_debug'];
    
                // check for persistent connection
                if ($cfg['pconnect'])
                {
                    // persistent
                    $CI->$dbh->PConnect($cfg['hostname'],$cfg['username'],$cfg['password'],$cfg['database']) or die("can't do it: " . $CI->$dbh->ErrorMsg());
                }
                else
                {
                    // normal
                    $CI->$dbh->Connect($cfg['hostname'],$cfg['username'],$cfg['password'],$cfg['database']) or die("can't do it: " . $CI->$dbh->ErrorMsg());
                }
    
                // use associated array as default format
                $CI->$dbh->SetFetchMode(ADODB_FETCH_ASSOC);
            }
            else
            {
                die("database settings not set");
            }
        }
    }
    
    ?>

    Here some examples:

    // will create $this->adodb and use the default settings group in config/database.php
    $this->load->library('adodb_loader');
    
    // will create $this->db1 and use the default settings group
    $this->load->library('adodb_loader',array('name'=>'db1'));
    
    // will create $this->db2 and use the settings group 'setting1' from the config
    $this->load->library('adodb_loader',array('name'=>'db2','group'=>'settings1'));

    I was able to implement persistent connections and debug settings which are set in config/database.php, but I couldn’t get caching working (it’s not a flag in adodb, but a separate execute cached sql command) and active records isn’t implemented.

    Feedback/improvements are more than welcome.  Enjoy!

  • #2 / Nov 24, 2007 9:33am

    Thoer

    111 posts

    Thank you edwardj!

    I’m only planning to use ADOdb, but I’ll definietly use your code as it’s quite pretty. Thanks again!

  • #3 / Jan 05, 2008 12:47am

    Kepler

    25 posts

    I used a slightly different approach. I have pass through functions from my ADODB class. I place my class directly in system/libraries so those who want to put the class in system/application/libraries will have to change the CI_AdoDB to MY_AdoDB.

    Here is the version that you can place in system/libraries/Adodb.php (Case is important!)

    <?php  if (!defined('BASEPATH')) exit('No direct script access allowed');
    
    /**
     * AdoDB Class
     *
     * @package    CodeIgniter
     * @subpackage    Libraries
     * @category    AdoDB
     * @author    Kepler Gelotte
     */
    require_once( BASEPATH.'/libs/adodb/adodb.inc.php' );
    
    class CI_AdoDB {
    
        var $conn = false;
    
        function CI_AdoDB()
        {
            log_message('debug', "AdoDB Class Initialized");
        }
    
        function connect( $name_space = '' )
        {
            include(APPPATH.'config/database'.EXT);
    
            $group = ($name_space == '') ? $active_group : $name_space;
            
            if ( ! isset($db[$group]))
            {
                show_error('You have specified an invalid database connection group: '.$group);
            }
            
            $params = $db[$group];
    
            $this->conn = &ADONewConnection;( $params['dbdriver'].'://'.$params['username'].':'.$params['password'].'@'.$params['hostname'].'/'.$params['database'] );
            if ( ! $this->conn ) die( "Connection failed to database " . $db );
        }
    
        function execute( $statement )
        {
            $recordSet = $this->conn->Execute( $statement );
            return $recordSet;
        }
    
        function replace( $table, $fields, $keys, $autoQuote = false )
        {
            $rc = $this->conn->Replace( $table, $fields, $keys, $autoQuote );
            return $rc;
        }
    
        function startTrans( )
        {
            $rc = $this->conn->StartTrans( );
            return $rc;
        }
    
        function failTrans( )
        {
            $rc = $this->conn->FailTrans( );
            return $rc;
        }
    
        function completeTrans( )
        {
            $rc = $this->conn->CompleteTrans( );
            return $rc;
        }
    
        function getErrorMsg()
        {
    
            return $this->conn->ErrorMsg();
        }
    
        function disconnect()
        {
            // $recordSet->Close(); # optional
            $this->conn->Close();
        }
    
    }
    // END AdoDB Class
    ?>

    I load the library automatically from system/config/autoload.php

    $autoload['libraries'] = array('adodb',...

    Here is an example of a model class using this code

    function _get_data()
        {
            $pages = false;
    
            // Get the pages from the database using adodb if needed
            $this->adodb->connect();
    
            $recordSet = $this->adodb->execute( 'select page_id, page_name, page_url, page_title, page_author, page_keywords, page_description, page_language_id, page_is_active, page_order from pages' );
            if ( ! $recordSet )
            {
                log_message( 'error', 'Error connecting to the database' );
                log_message( 'debug', $this->adodb->getErrorMsg());
            }
            else
            {
                unset( $this->pages );
                while (!$recordSet->EOF)
                {
                    $pages[] = array(
                        'page'    => $recordSet->fields[0],
                        'name'    => $recordSet->fields[1],
                        'url'    => $recordSet->fields[2],
                        'title'    => $recordSet->fields[3],
                        'author'    => $recordSet->fields[4],
                        'keywords'    => $recordSet->fields[5],
                        'description'    => $recordSet->fields[6],
                        'lang'    => $recordSet->fields[7],
                        'is_active'    => $recordSet->fields[8],
                        'order'    => $recordSet->fields[9]
                    );
                    
                    $recordSet->MoveNext();
                }
                $this->pages = $pages;
            }
    
            $this->adodb->disconnect();
    }

    Regards,
    Kepler

  • #4 / May 23, 2012 1:16pm

    I’ve created a similar loader for the tiny adodb-lite layer ( http://sourceforge.net/projects/adodblite/ ) wich consume much less memory and it’s faster.

    put your adodb_lite library under: application/vendor/adodb_lite

    Enjoy!

    <?php
    
    if (!defined('BASEPATH'))
            exit('No direct script access allowed');
    
    class Adodb_lite_loader {
    
            function Adodb_lite_loader($params = null)
            {
                    // check if adodb already loaded
                    if (!class_exists('ADONewConnection'))
                    {
                            require_once(APPPATH . 'vendor/adodb_lite/adodb.inc' . EXT);
                    }
    
                    // database handler's name, defaults to 'adodb'
                    $dbh = (isset($params['name'])) ? $params['name'] : 'adodb_lite';
    
                    // the db settings group from the database.php config
                    $db_group = (isset($params['group'])) ? $params['group'] : '';
    
                    $this->_init_adodb_lite_library($dbh, $db_group);
            }
    
            function _init_adodb_lite_library($dbh, $db_group)
            {
                    // get CI instance
                    $CI = & get_instance();
    
                    // get database config
                    include(APPPATH . 'config/database' . EXT);
    
                    // check which database group settings to use
                    // default to database setting default
                    $db_group = (!empty($db_group)) ? $db_group : $active_group;
                    $cfg = $db[$db_group];
    
                    // check that driver is set
                    if (isset($cfg['dbdriver']))
                    {
                            $CI->$dbh = & ADONewConnection($cfg['dbdriver'], 'object');
    
                            // set debug
                            $CI->$dbh->debug = $cfg['db_debug'];
    
                            // check for persistent connection
                            if ($cfg['pconnect'])
                            {
                                    // persistent
                                    $CI->$dbh->PConnect($cfg['hostname'], $cfg['username'], $cfg['password'], $cfg['database']) or die("can't do it: " . $CI->$dbh->ErrorMsg());
                            } else
                            {
                                    // normal
                                    $CI->$dbh->Connect($cfg['hostname'], $cfg['username'], $cfg['password'], $cfg['database']) or die("can't do it: " . $CI->$dbh->ErrorMsg());
                            }
    
                            // use associated array as default format
                            //$CI->$dbh->SetFetchMode(ADODB_FETCH_ASSOC);
                    } else
                    {
                            die("database settings not set");
                    }
            }
    
    }
.(JavaScript must be enabled to view this email address)

ExpressionEngine News!

#eecms, #events, #releases