#native_company# #native_desc#
#native_cta#

mycnfOptions

By Ben Jones
on March 24, 2001

Version: 0.1

Type: Class

Category: Databases

License: GNU General Public License

Description: Inspired by Perl DBI’s built in support to read MySQL options from the standard ~/.my.cnf, I thought I would be nice to have the same support in PHP. That’s what this class does. It reads options from any specified group in ~/.my.cnf and returns an associative array. Read the top of the file for more info.

<?php

/*

FILENAME:   mycnfOptions.class.php
AUTHOR:     Benjamin D. Jones ([email protected])
COPYRIGHT:  Copyright (C) 2001 Benjamin D. Jones
PURPOSE:    Read group options from ~/.my.cnf and return the values for use in a script
VERSION:    0.1 (22.Mar.2001)


This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or (at
your option) any later version.

This program is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
General Public License for more details.

You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  


NOTE:
=====

Why is this an object? Are you a moron?

No. Two reasons why I took an object oriented approach.

1.) to eliminate namespace conflicts (you never know)

2.) because I find that code is easier to manage this way.

You're welcome to retool it as a single function if you like.


USAGE:
======

$mycnf = new mycnfOptions([$group], [$home]);
$array_of_options = $mycnf -> readMycnf();


DOCUMENTATION:
==============

This class reads MySQL options from the standard ~/.my.cnf file that
other MySQL programs read. You specify the group to be read when
instantiating the object. The group name can be anything you want, as
long as that section actually exists in ~/.my.cnf, then those options
will be read, and placed in an associative array.

Read more about the my.cnf file in the MySQL manual.

This is guaranteed not to work with the Win32 version of PHP and
MySQL. I don't use Windows so I don't develop for Windows.

A quick example . . . 
  
   <?php
      require_once('mycnfOptions.class.hpp');
      $mycnf = new mycnfOptions('phpscripts', '/home/username/'); 
      $dbInfo = $mycnf -> readMycnf();
   ?>
  

If ~/.my.cnf contained the following group entries . . . 
  
   # ~/.my.cnf

   [phpscripts]
   host = localhost
   user = username
   password = secret
   database = myDB

   # end ~/.my.cnf

   . . . then $dbInfo would have the indexes 'host', 'user',
   'password', and 'database' with the corresponding values.

  The first constructor argument is optional and defaults to
  'php'. You can use any group name you want as long as you acutally
  have entries for it in your ~/.my.cnf

  The second constuctor argument is optional, if omitted, the
  enviromental variable $HOME is used. This probably won't be set
  unless you are running your script from the command line or have set
  it previously with putenv().

  By using this class, you can eliminate the need for various config
  files, etc. for your different scripts. You can keep all you MySQL
  options in the file in which they were meant to be kept.


*/


class mycnfOptions
{

  var $groupName;
  var $mycnfFile;
  var $options;

  function mycnfOptions($groupName = 'client', $homeDir = '')
  {

    $this -> groupName = $groupName;
    $this -> mycnfFile  = $this -> findMycnf ($homeDir);
    $this -> options = array();

  }


  function findMycnf($homeDir = '')
  {
    // PURPOSE: set up the location of the ~/.my.cnf file


    // if $homeDir is empty (it's optional), use the enviroment

    if ( empty($homeDir) ) {

      $homeDir = getenv('HOME');

    }

    // strip the trailing '/' if there is one

    $homedir = preg_replace('@/$@', '', $homeDir);


    return "$homeDir/.my.cnf";

  }


  function readMycnf()
  {
    // PURPOSE: Read the ~/.my.cnf file 
    //          Return the options for the appropriate group
    //          as an associative array
   
    
    if ( $this -> fh = fopen($this -> mycnfFile, 'r') ) {
      
      // find the correct group

      $this -> findFilePosition();


      // extract the options for the appropriate group

      $this -> getOptions();

      
      fclose($this -> fh);

    }

    return $this -> options;
    
  }


  function getOptions()
  {
    // PURPOSE: extract the options from the file for this group
    
    while ( $line = fgets($this -> fh, 100) ) {
        
      $line = trim($line);

      if ( preg_match('/^([a-z_A-Z]*) *= *(.*)$/', $line, $match) ) {

        // an option is listed so create a new key/value set 
        // in the options array

        $this -> options[$match[1]] = $match[2];
      
      } else if ( preg_match('/^[/', $line) ) {

        // the next group has started so exit the loop

        break;

      }

    }

    return true;

  }


  function findFilePosition()
  {
    // PURPOSE: Find the desired group section in the file
    
    while ( $line = fgets($this -> fh, 100) ) {
      
      if ( preg_match('/^[' . $this -> groupName . ']$/', $line) ) {
 
        // found the correct position

        return true;

      }

    }

    return false;
           
  }

}

?>