Source for file OCSP_DB.phpclass

Documentation is available at OCSP_DB.phpclass

  1. <?php
  2. /**
  3.   * Class file OCSP_DB.phpclass
  4.   *
  5.   * @project    Open CSP-Management
  6.   * @package    dbms
  7.   *
  8.   * @author     Peter Krebs (pk) <pitlinz@users.sourceforge.net>
  9.   * @license    http://opensource.org/licenses/gpl-license.php GNU Public License
  10.   *
  11.   * @since pk-07-04-06
  12.   * 
  13.   * @version $Id: OCSP_DB.phpclass,v 1.24 2008/11/20 17:02:47 peterkrebs Exp $
  14.   *
  15.   * @requires ../common/pcf.phpinc [OCSP]
  16.   * @requires ./db/db.phpinc [OCSP]
  17.   *
  18.   ***/
  19.  
  20. /**
  21.   * ---------------------------------------------------
  22.   *
  23.   * common settings and requirements
  24.   *
  25.   */
  26.  
  27. if (!function_exists('pcf_require_class'))
  28. {
  29.     require __OCSP_PHPINCPATH__ ."common" _OCSP_DIRSEP_ ."pcf.phpinc";
  30. }
  31.  
  32. pcf_require_class('OCSP_OBJ',array(__OCSP_PHPINCPATH__,'common','OCSP_OBJ.phpclass'));
  33. pcf_require_class('OCSP_SESSION',array(__OCSP_PHPINCPATH__,'common','OCSP_SESSION.phpclass'));
  34.  
  35.  
  36. if (!defined('PQT_SELECT'))
  37. {
  38.     require __OCSP_PHPINCPATH__ ."db" _OCSP_DIRSEP_ ."db.phpinc";
  39. }
  40.  
  41.  
  42.  
  43.  
  44. /** ---------------------------------------------------
  45.   * Class OCSP_DB
  46.   *
  47.   * @project    Open CSP-Management
  48.   * @package    dbms
  49.   *
  50.   * @author     Peter Krebs (pk) <pitlinz@users.sourceforge.net>
  51.   * @license    http://opensource.org/licenses/gpl-license.php GNU Public License
  52.   *
  53.   * @since pk-07-04-06
  54.   * @version pk-07-06-15
  55.   *
  56.   */
  57. abstract class OCSP_DB {
  58.     /** -----------------------------------------------------
  59.       * Aggregations:
  60.       */
  61.  
  62.     /** -----------------------------------------------------
  63.       * Compositions:
  64.       */
  65.  
  66.     /** -----------------------------------------------------
  67.       * Attributes:
  68.       */
  69.  
  70.     /**
  71.       * @var string $myConfFile 
  72.       * @access protected
  73.       * @since pk-07-06-13
  74.       */
  75.     protected $myConfFile="";
  76.  
  77.     /**
  78.       * @var boolean $iam_connected 
  79.       * @access protected
  80.       * @since pk-07-06-13
  81.       */
  82.     protected $iam_connected = FALSE;
  83.  
  84.     /**
  85.       * @var boolean $iam_initialized 
  86.       * @access protected
  87.       * @since pk-07-06-13
  88.       */
  89.     protected $iam_initialized = FALSE;
  90.  
  91.     /**
  92.       * @var boolean $myServer 
  93.       * @access private
  94.       ***/
  95.     protected $myServer="";
  96.  
  97.     /**
  98.       * @var string $myDB 
  99.       * @access private
  100.       ***/
  101.     protected $myDB ="";
  102.  
  103.     /**
  104.       * var boolean $debugInsert
  105.       * @since pk-06-09-04
  106.       * @access protected
  107.       ***/
  108.     protected $debugInsert=FALSE;
  109.  
  110.     /**
  111.       *
  112.       * METHODS _____________________________________________
  113.       *
  114.       */
  115.  
  116.     /** -----------------------------------------------------
  117.       * Constructors
  118.       */
  119.  
  120.     /**
  121.       * connects to the default database
  122.       *
  123.       * @param string $confFile 
  124.       * @param boolean $reconnect (init a new DB object even we already have one)
  125.       * @param boolean $debug 
  126.       *
  127.       * @global array $OCSP_CONF 
  128.       * @global array $OCSP_OBJ 
  129.       *
  130.       * @return OCSP_DB 
  131.       * @access public
  132.       *
  133.       * @since pk-07-06-28
  134.       *
  135.       */
  136.     function &newDBConnect($confFile="",$reconnect=FALSE,$debug=FALSE)
  137.     {
  138.         global $OCSP_OBJ,$OCSP_CONF;
  139.         
  140.         if ($debugechoDebugMethod(__FILE__,get_class($this),"DBMS_TABLEOBJ::dbConnect()");
  141.         if (!$reconnect{
  142.             if (pcf_is_instance_of($this,'OCSP_DB'&& $this->isConnected())
  143.             {
  144.                 echoDebugLine(__FILE__,__LINE__,"we already have an established connection");
  145.                 return $this;
  146.             }
  147.  
  148.             if (pcf_is_instance_of($OCSP_OBJ['USRDB'],'OCSP_DB')) {
  149.                 if ($debugechoDebugLine(__FILE__,__LINE__,"using global database connection");
  150.                 if (!$OCSP_OBJ['USRDB']->isConnected())
  151.                 {
  152.                     $OCSP_OBJ['USRDB']->connet($confFile,$b_asPublic,FALSE,$debug);
  153.                 }
  154.                 return $OCSP_OBJ['USRDB'];
  155.             }
  156.  
  157.             if (pcf_is_instance_of($OCSP_OBJ['USER'],"OCSP_USER"))
  158.             {
  159.                 return $OCSP_OBJ['USER']->getMyDBObj(FALSE,$confFile,TRUE,$debug);
  160.             else {
  161.                 $b_asPublic=TRUE;
  162.             }
  163.  
  164.             if (empty($confFile)) {
  165.                 if (is_object($this&&  (method_exists($this,'getMyConfFile')))
  166.                 {
  167.                     if (!$confFile=$this->getMyConfFile($debug))
  168.                     {
  169.                         ocsp_logError(__FILE__,__LINE__,"NO DATABASE CONFIGURATION in Class:".get_class($this),E_ERROR);
  170.                         return FALSE;
  171.                     }
  172.                 else {
  173.                     $confFile=$OCSP_CONF['PROJECTPATH'].$OCSP_CONF['DBCONFFILE'];
  174.                 }
  175.             }
  176.  
  177.             require_once $confFile;
  178.  
  179.             if (!isset($DBCONF['CLASS']|| empty($DBCONF['CLASS']))
  180.             {
  181.                 $DBCONF['CLASS']    "OCSP_DB_mySQL";
  182.                 $DBCONF['INCLUDE']  $GLOBALS['OCSP']['PHPINCPATH']."db/OCSP_DB_mySQL.phpclass";
  183.             }
  184.             if (!class_exists($DBCONF['CLASS']))
  185.             {
  186.                 if (!empty($DBCONF['INCLUDE']))
  187.                 {
  188.                     require_once $GLOBALS['OCSP']['PHPINCPATH']."common/pcf_templates.phpinc";
  189.                     $str_inc=pcf_tmpl_parse($DBCONF['INCLUDE']);
  190.                     if ($debugechoDebugLine(__FILE__,__LINE__,"loading DB-ClassFile ".$tsr_inc);
  191.                     require_once $str_inc;
  192.                 else {
  193.                     require_once $GLOBALS['OCSP']['PHPINCPATH']."db/".$DBCONF['CLASS'].".phpclass";
  194.                 }
  195.             }
  196.  
  197.             $str_cmd="\$o_db=new ".$DBCONF['CLASS']."();";
  198.             if ($debugechoDebugLine(__FILE__,__LINE__,"generating db object ".$str_cmd);
  199.  
  200.             eval ($str_cmd);
  201.             $o_db->connect($confFile,$b_asPublic,FALSE,$debug);
  202.             return $o_db;
  203.         else {
  204.             if ($debugechoDebugLine(__FILE__,__LINE__,"DBMS_TABLEOBJ::dbConnect(reconnect) NOT IMPLEMENTED".$tsr_cmd);
  205.         }
  206.     }
  207.  
  208.     /** -----------------------------------------------------
  209.       * getter & setter methods
  210.       */
  211.     /**
  212.      * returns the database type
  213.      * 
  214.      * ('mySQL' for example)
  215.      * 
  216.      * @return string 
  217.      * 
  218.      */
  219.     public function getDBType()
  220.     {
  221.         return str_replace('OCSP_DB_',"",get_class($this));
  222.     }
  223.     
  224.     
  225.     /**
  226.       * @return boolean 
  227.       * @access public
  228.       */
  229.     function isInit()
  230.     {
  231.         return $this->iam_initialized;
  232.     }
  233.  
  234.     /**
  235.       * @return boolean 
  236.       * @access public
  237.       */
  238.     function isConnected()
  239.     {
  240.         return $this->iam_connected;
  241.     }
  242.  
  243.     /**
  244.       * @return string 
  245.       * @access public
  246.       */
  247.     function getMyDBName({
  248.         return $this->myDB;
  249.     }
  250.  
  251.     /**
  252.       * can also be called without object OCSP_DB::getMyConfFile()
  253.       * if $this->myConfFile is empty the global dbConffile is returned
  254.       * 
  255.       * @param boolean $fromUser try to get the conffile from the current user
  256.       * @param boolean $debug 
  257.       * 
  258.       * @return string 
  259.       * 
  260.       * @version pk-08-06-06
  261.       */
  262.     function getMyConfFile($fromUser=True,$fromSession=True,$debug=False)
  263.     {
  264.         if ($debugechoDebugMethod(__FILE__,get_class($this),"OCSP_DB::getMyConfFile()");
  265.                 
  266.         if ((pcf_is_instance_of($this,'OCSP_DB')) && (!empty($this->myConfFile)))
  267.         {
  268.             if ($debugechoDebugLine(__FILE__,__LINE__,"returning object value: ".$this->myConfFile);
  269.             return $this->myConfFile;
  270.         }
  271.  
  272.         if ($fromUser && ($obj_user OCSP_OBJ::currentUser(False)))
  273.         {
  274.             if ($str_ret $obj_user->getDBConfFile(False,$debug))
  275.             {
  276.                 if ($debugechoDebugLine(__FILE__,__LINE__,"returning users conffile: ".$str_ret);
  277.                 return $str_ret;                
  278.             }
  279.         }
  280.         
  281.         if ($fromSession && ($str_ret OCSP_SESSION::getInstance(True)->getValue('USR_DBCONFFILE')))
  282.         {
  283.             if ($debugechoDebugLine(__FILE__,__LINE__,"returning session conffile: ".$str_ret);
  284.             return $str_ret;
  285.         }
  286.         
  287.         if ($str_ret OCSP_CONF::getInstance()->getValue('DBCONFFILE',False&& file_exists($str_ret))
  288.         {
  289.             if ($debugechoDebugLine(__FILE__,__LINE__,"returning DBCONFFILE conffile: ".$str_ret);
  290.             return $str_ret;                
  291.         }
  292.         
  293.         $str_confFile OCSP_OBJ::getConf('PROJ_CONFPATH'OCSP_CONF::getInstance()->getDBType(.".phpconf";
  294.         if ($debugechoDebugLine(__FILE__,__LINE__,"\$str_confFile: " $str_confFile);        
  295.         if (file_exists($str_confFile))
  296.         {
  297.             if ($debugechoDebugLine(__FILE__,__LINE__,"returning PROJ_CONFPATH . DBTYPE . conf conffile: ".$str_confFile);
  298.             return $str_confFile
  299.         }
  300.         
  301.         $str_confFile dirname($_SERVER['DOCUMENT_ROOT']_OCSP_DIRSEP_ "config" _OCSP_DIRSEP_ .  OCSP_CONF::getInstance()->getDBType(.".phpconf";        
  302.         if ($debugechoDebugLine(__FILE__,__LINE__,"\$str_confFile: " $str_confFile);        
  303.         if (file_exists($str_confFile))
  304.         {
  305.             if ($debugechoDebugLine(__FILE__,__LINE__,"returning PROJ_CONFPATH . DBTYPE . conf conffile: ".$str_confFile);
  306.             return $str_confFile
  307.         }        
  308.         
  309.         if ($debugechoDebugLine(__FILE__,__LINE__,"ERROR: could not find a database configuration for ".get_class($this));
  310.         return "";
  311.     }
  312.  
  313.     /** -----------------------------------------------------
  314.       * DB methods
  315.       */
  316.  
  317.     /**
  318.       * generates a query and returns an array of the resultset
  319.       *
  320.       * limit <> a multidimensional array is returned (see queryArray)
  321.       * if limit = 1 a single array is returned (see quickQuery)
  322.       *
  323.       * @param string $aTable (the table name)
  324.       * @param array $conditions (array(COLUMN => VALUE)
  325.       * @param int $offset 
  326.       * @param int $limit (0 is unlimeted)
  327.       * @param string $orderBy (comma seperated list of fields to order)
  328.       * @param boolean $debug 
  329.       *
  330.       * @return array 
  331.       * @access public
  332.       *
  333.       * @since pk-07-06-29
  334.       *
  335.       */
  336.     function getArray($aTable,$conditions,$offset=0,$limit=0,$orderBy="",$debug=false)
  337.     {
  338.         echoDebugMethod(__FILE__,get_class($this),"Method: getArray() not implemented");
  339.     }
  340.  
  341.     /**
  342.       * generates a query and returns an array of the resultset with $idxCol as index and $valCols as values
  343.       *
  344.       * if $valCols is an array of column names this columns are added as array to the returned array
  345.       * if $valCols is empty the complete row is added to the return array
  346.       * else $row[$valCols] is added to the return (simple array)
  347.       * 
  348.       * limit <> a multidimensional array is returned (see queryArray)
  349.       * if limit = 1 a single array is returned (see quickQuery)
  350.       *
  351.       * @param string $aTable (the table name)
  352.       * @param array $conditions (array(COLUMN => VALUE)
  353.       * @param string $idxCol 
  354.       * @param mixed $valCols 
  355.       * @param int $offset 
  356.       * @param int $limit (0 is unlimeted)
  357.       * @param string $orderBy (comma seperated list of fields to order)
  358.       * @param boolean $debug 
  359.       *
  360.       * @return array 
  361.       * @access public
  362.       *
  363.       * @since pk-08-03-28
  364.       *
  365.       */
  366.     public function getIndexedArray($aTable,$conditions,$idxCol,$valCols=null,$offset=0,$limit=0,$orderBy="",$debug=FALSE)
  367.     {
  368.         if ($debugechoDebugMethod(__FILE__,get_class($this),"OCSP_DB::getIndexedArray()");
  369.         
  370.         $arr_ret array();
  371.         if ($arr_result $this->getArray($aTable,$conditions,$offset,$limit,$orderBy,$debug))
  372.         {
  373.             foreach($arr_result as $arr_row)
  374.             {
  375.                 if (!isset($arr_row[$idxCol]))
  376.                 {
  377.                     throw new Exception(_OCSP_EXCEP_QUERYERROR_ ": row " $idxCol " not found in result" );                    
  378.                 }
  379.                 
  380.                 if (is_array($valCols))
  381.                 {
  382.                     $arr_ret[$arr_row[$idxCol]] array();
  383.                     foreach($valCols as $str_col)
  384.                     {
  385.                         $arr_ret[$arr_row[$idxCol]][$str_col$arr_row[$str_col];    
  386.                     }
  387.                 if (empty($valCols)) {
  388.                     $arr_ret[$arr_row[$idxCol]] $arr_row;
  389.                 else {               
  390.                     $arr_ret[$arr_row[$idxCol]] $arr_row[$valCols];
  391.                 }
  392.                  
  393.             }
  394.         
  395.         
  396.         return $arr_ret;
  397.     }
  398.     
  399.     /**
  400.       * Runs the query provided and returns the data from the first column of the first row then frees the result set.
  401.       *
  402.       * @param string $query 
  403.       *
  404.       * @return mixed 
  405.       *
  406.       * @since pk-07-08-07
  407.       */
  408.     function getOne($query)
  409.     {
  410.         if (method_exists($this,"quickQuery"))
  411.         {
  412.             return $this->quickQuery($query,0);
  413.         else {
  414.             ocsp_logError(__FILE__,__LINE__,"Class: ".get_class($this)." does not support quickQuery()");
  415.             return FALSE;
  416.         }
  417.     }
  418.  
  419.     /**
  420.       * returns the first row matching $filter
  421.       *
  422.       * @param string $table 
  423.       * @param array $filter 
  424.       * @param boolean $debug 
  425.       *
  426.       * @return array 
  427.       *
  428.       * @version pk-08-02-15 filter type like (~) added
  429.       */
  430.     function getRow($table,$filter,$debug=false)
  431.     {
  432.         if ($debugechoDebugMethod(__FILE__,get_class($this),"OCSP_DB::getRow()");
  433.  
  434.         $str_query="SELECT * FROM ".$table;
  435.         $str_whereAnd=" WHERE ";
  436.         foreach($filter as $str_col => $mix_val)
  437.         {
  438.             if (substr($str_col,0,1)=="?")
  439.             {
  440.                 $str_query.=$str_whereAnd.$mix_val;
  441.             else if (substr($str_col,0,1)=="~"{
  442.                 $str_query .= $str_whereAnd substr($str_col,1" " $this->qs_getLikeStmt($mix_val);
  443.             else {
  444.                 $str_query.=$str_whereAnd.$str_col "=" $this->qs_getSlashedValue($mix_val);
  445.             }
  446.             $str_whereAnd=" AND ";
  447.         }
  448.         if ($debugechoDebugLine(__FILE__,__LINE__,"Query: ".$str_query);
  449.         return $this->quickQuery($str_query);
  450.     }
  451.  
  452.     /**
  453.       * opens a cursor for a query
  454.       *
  455.       * @param string $aQuery     the sql query
  456.       * @param boolean $secMode 
  457.       * @param boolean $withErrMsg 
  458.       * @param boolean $autoFree 
  459.       * @param boolean $useBuffer 
  460.       *
  461.       * @return OCSP_CURSOR 
  462.       *
  463.       */
  464.     function query($aQuery="",$secMode=True,$withErrMsg=False,$autoFree=True,$useBuffer=True
  465.     {
  466.         throw new Exception("abstract method not implemented:" get_class($this"::" . __FUNCTION__ );        
  467.     }
  468.  
  469.     /**
  470.       * returns an array of table rows
  471.       *
  472.       * if $keyFld == $valueFld
  473.       * a simple array is returned
  474.       *    ( $array[]=$value )
  475.       *
  476.       * if $keyFld != $valueFld
  477.       * a simple array is returned where $keyFld is used as index
  478.       *    ( $array[$key]=$value )
  479.       *
  480.       * if $valueFld == -1
  481.       * a named 2 dimensonal array is returned
  482.       *     ( $array[$key]=$row )
  483.       *
  484.       * if $keyFld == -1 && $valueFld == -1
  485.       * a 2 dimensonal array is returned
  486.       *     ( $array[]=$row )
  487.       *
  488.       * @param string $aQuery   a sql select statement
  489.       * @param int $keyFld      index of the key field in the select result (starts at 0)
  490.       * @param int $valueFld    index of the value field in the select result (starts at 0)
  491.       * @param boolean $secMode check query whith DB_mySQL::checkQuery()
  492.       * @param boolean $debug   show debug info
  493.       *
  494.       * @returns array
  495.       *
  496.       */
  497.     function queryArray($aQuery,$keyFld=0,$valueFld=0,$secMode=True,$debug=False
  498.     {
  499.         throw new Exception("abstract method not implemented:" get_class($this"::" . __FUNCTION__ )
  500.     }
  501.     
  502.     /**
  503.      * inserts a new row out of an array
  504.      * 
  505.      * returns the value of the auto_increment field (idFld) or True
  506.      * in case of an error it returns False
  507.      * 
  508.      * @param string $table 
  509.      * @param array $valueArr 
  510.      * @param boolean $debug 
  511.      * @param string $idFld 
  512.      * 
  513.      * @return mixed 
  514.      */
  515.     function insertArray($table,$valueArr,$debug=False,$idFld="")
  516.     {
  517.         throw new Exception("abstract method not implemented:" get_class($this"::" . __FUNCTION__ );        
  518.     }
  519.     
  520.     /**
  521.      * updates $values in $aTable where $conditions
  522.      *
  523.      * @param string $aTable 
  524.      * @param array $conditions 
  525.      * @param array $values 
  526.      * @param int $limit 
  527.      * @param boolean $debug 
  528.      * 
  529.      * @return int number of effekted rows
  530.      * 
  531.      * @abstract
  532.      * 
  533.      */
  534.     function updateArray($aTable,$conditions,$values,$limit=0,$debug=false)
  535.     {
  536.         throw new Exception("abstract method not implemented:" get_class($this"::updateArray");
  537.     }
  538.     
  539.     /**
  540.      * truncates a table
  541.      *
  542.      * @param string $aTable 
  543.      * @param boolean $backup 
  544.      * 
  545.      */
  546.     public function truncateTable($aTable,$backup=True)
  547.     {
  548.         throw new Exception("abstract method not implemented:" get_class($this"::truncateTable");
  549.     }
  550.     
  551.     /** -----------------------------------------------------
  552.       * DB column values
  553.       */
  554.         
  555.     /**
  556.       * returns $aValue with slashes to use to create query strings
  557.       *
  558.       * @param string $aValue 
  559.       *
  560.       * @returns string
  561.       *
  562.       *  return something like
  563.       *  <code>
  564.       *      return "'".str_replace("'","\'",strval($aValue))."'";
  565.       *  </code>
  566.       * 
  567.       */
  568.     public function qs_getSlashedValue($aValue)
  569.     {
  570.         return "'".str_replace("'","\'",strval($aValue))."'";
  571.     }
  572.  
  573.     /**
  574.       * returns WHERE col IN($valArr)
  575.       *
  576.       * @param string $col 
  577.       * @param array $valArr 
  578.       * @param boolean $valuesAreString 
  579.       *
  580.       * @return string 
  581.       */
  582.     public abstract function qs_getWhereIn($col,$valArr,$valuesAreString=True);
  583.     
  584.     // ------------------------------------------------------
  585.     // DDL methods
  586.     // ------------------------------------------------------
  587.     
  588.     /**
  589.      * returns a valid column name
  590.      *
  591.      * @param string $aName 
  592.      * @return string 
  593.      * 
  594.      * @since pk-08-10-29
  595.      */
  596.     public function checkColName($aName)
  597.     {
  598.         $aName trim($aName);
  599.         $aName str_replace("Ä","Ae",$aName);
  600.         $aName str_replace("ä","ae",$aName);
  601.         $aName str_replace("Ö","Oe",$aName);
  602.         $aName str_replace("ö","oe",$aName);
  603.         $aName str_replace("Ü","Ue",$aName);
  604.         $aName str_replace("ü","ue",$aName);
  605.         $aName str_replace("ß","ss",$aName);
  606.         $aName str_replace("€","EURO",$aName);
  607.     
  608.         return preg_replace('/[^A-Z0-9_]/i'"_"strtoupper($aName));
  609.     }
  610.     
  611.         /**
  612.       * adds a column to a table
  613.       *
  614.       * @param string $aTable 
  615.       * @param string $colName 
  616.       * @param array $dbDesc 
  617.       * @param boolean $debug 
  618.       *
  619.       * @since pk-04-10-08
  620.       *
  621.       ***/
  622.     public function addColumn($aTable,$colName,&$dbDesc,$debug=False
  623.     {
  624.         throw new Exception("method not implemented: " get_class($this"::addColumn()");    
  625.     }
  626.     
  627.     /**
  628.       * returns an array with all tables in the database
  629.       *
  630.       * @param  bool    $debug 
  631.       *
  632.       * @returns array
  633.       */
  634.     function getDBTblList($debug=False
  635.     {
  636.         throw new Exception("method not implemented: " get_class($this"::getDBTblList()");        
  637.     }
  638.     
  639.     /**
  640.       * returns an array with column description arrays for each column
  641.       * where column name is the array index
  642.       *
  643.       * a column description array has the following elements
  644.       *
  645.       * - string ['TYPE'] (type of the column example varchar,int,...)
  646.       * - int ['LEN'] (length of the column if supported by type)
  647.       * - string ['FLAGS'] (mysql flags)
  648.       * - boolean ['AUTO_INCREMENT'] (does the column use auto values on insert)
  649.       * - boolean ['NULL'] (null allowed)
  650.       * - boolean ['PRIMARY_KEY'] (the column is part of the primary key)
  651.       * - boolean ['KEY'] (the column is part of a -none primary- key)
  652.       * - string ['COLNAME'] (the name of the column - same as array index should be)
  653.       *
  654.       * @param  strint  $table 
  655.       * @param  bool    $debug  pk-03-10-24
  656.       *
  657.       * @returns array
  658.       *
  659.       */
  660.     function getDBTblDesc($table,$debug=False
  661.     {
  662.         throw new Exception("method not implemented: " get_class($this"::getDBTblDesc()");                
  663.     }
  664.     
  665. // end class OCSP_DB
  666. ?>

Documentation generated on Thu, 08 Jan 2009 17:45:28 +0100 by phpDocumentor 1.4.0a2