<?php 
⁄**
 * 
 *
 *
 * @author Darryl Patterson 
 * @copyright Euro RSCG 4D
 *
 *⁄


require_once('common/util/class-Config.php');
require_once(
  'common/dataobject/class-ReadOnlyResultSet.php');

class DataObject {
    var $dop_config;
    var $dop_tableName;
    var $dop_pk;
    var $dop_className;
    var $dop_DEBUG;
    var $dop_databaseName;

    function DataObject($tableName, $pk)
    {
        $className = $tableName;
        $databaseName = '';
        $this->dop_DEBUG = false;

        if (strpos($tableName, '.') !== false){
            list($databaseName, $className) = explode('.', $tableName);
        }

        $this->dop_config       = Config::instance();
        $this->dop_databaseName = $databaseName;
        $this->dop_tableName    = $tableName;
        $this->dop_pk           = $pk;
        $this->dop_className    = 'DO_' . $className;
    }

    function setField($name, $value)
    {
        if ($this->isValidProperty($name)){
            $this->$name = $value;
        }
    }

    function getField($name)     {
        return $this->$name;
    }

    function setDebug($debug)
    {
        $this->dop_DEBUG = $debug;
    }

    function getDebug()
    {
        return $this->dop_DEBUG;
    }

    function getAll($orderBy = false)
    {
        $orderByString = '';
        if ($orderBy !== false){
            $orderByString = ' ORDER BY ' .mysql_real_escape_string($orderBy);
        }
        $sql = "SELECT
                    *
                FROM " .
                    $this->dop_tableName . " " .
                    $orderByString;

        if($this->dop_DEBUG){
            echo '<!-- SQL from table ' .
              $this->dop_tableName . ', function getAll(): ' . $sql . "\n-->";
        }

        $rs = mysql_query($sql, $this->getConnection());

        if($this->dop_DEBUG){
            echo '<!-- SQL error: ' . mysql_error() . "\n-->";
        }

        return new ReadOnlyResultSet($rs);
    }

    // この関数は指定されたプライマリキーで検索するselect文として働く。
    function get($id)
    {
        $sql = "SELECT
                    *
                FROM " .
                    $this->dop_tableName . " ";
        if (is_array($this->dop_pk)){
            $whereClause = array();
            for ($i=0; $i < count($this->dop_pk); $i++){
                $whereClause[] = $this->dop_pk[$i] .
                  ' = "' . mysql_real_escape_string( $id[$i]) . '" ';
            }
            $sql .= " WHERE " . implode(' AND ', $whereClause);
        } else {
            $sql .= " WHERE " . $this->dop_pk .
              ' = "' . mysql_real_escape_string($id) . '" ';
        }

        if($this->dop_DEBUG){
            echo '<!-- SQL from table ' .
              $this->dop_tableName . ', function get(): ' . $sql . "\n-->";
        }
        $rs = mysql_query($sql, $this->getConnection());

        if($this->dop_DEBUG){
            echo '<!-- SQL error: ' . mysql_error() . "\n-->";
        }

        if (mysql_num_rows($rs) > 0) {
            $row = mysql_fetch_array($rs);
            $this->populate($row);
            return true;
        } else {
            return false;
        }
    }

    function insert()
    {
        $setClause = array();

        $properties=get_class_vars($this->dop_className);

        foreach($properties as $propertyName => $propertyValue){
            if ($this->isValidProperty($propertyName) 
                && $propertyName != $this->dop_pk){
                $nameKey = '`' . $propertyName . '`';
                $setClause[$nameKey] = '"' . mysql_real_escape_string(
                  $this->getField($propertyName)) . '"';
            }
        }

        if (count($setClause) > 0){

            $sql = "INSERT INTO " . $this->dop_tableName .
                   " (" . implode(',', array_keys($setClause)) . ") " .
                   " VALUES(" . implode(',', array_values($setClause)) . ")";
            $sql = str_replace("\\'", "'", $sql);

            if($this->dop_DEBUG){
                echo '<!-- SQL from table ' .
                  $this->dop_tableName .
                  ', function insert(): ' . $sql . "\n-->";
            }

            if (mysql_query($sql,$this->getConnection())){

                if (!is_array($this->dop_pk)) {
                    $pk = $this->dop_pk;
                    $this->$pk = mysql_insert_id(
                      $this->getConnection());
                }

                return true;
            }

        }
        if($this->dop_DEBUG){
            echo '<!-- SQL error: ' . mysql_error() . "\n-->";
        }

        return false;

    }

    function replace()
    {
        $setClause = array();

        $properties=get_class_vars($this->dop_className);

        foreach($properties as $propertyName => $propertyValue){
            if ($this->isValidProperty($propertyName) 
              && $propertyName != $this->dop_pk){
                $nameKey = '`' . $propertyName . '`';
                $setClause[$nameKey] = '"' .
                  mysql_real_escape_string(
                $this->getField($propertyName)) . '"';
            }
        }

        if (count($setClause) > 0){

            $sql = "REPLACE INTO ". $this->dop_tableName .
                   " (" . implode(',', array_keys($setClause)) . ") " .
                   " VALUES(" . implode(',', array_values($setClause)) . ")";
            $sql = str_replace("\\'", "'", $sql);   

            if($this->dop_DEBUG){
                echo '<!-- SQL from table ' .
                  $this->dop_tableName .
                  ', function replace(): ' . $sql . "\n-->";
            }

            if (mysql_query($sql,$this->getConnection())){
                if (!is_array($this->dop_pk)) {
                    $pk = $this->dop_pk;
                    $this->$pk = mysql_insert_id(
                      $this->getConnection());
                }

                return true;
            }
        }

        if($this->dop_DEBUG){
            echo '<!-- SQL error: ' . mysql_error() . "\n-->";
        }

        return false;
    }

    function update()
    {
        $setClause = array();

        $sql = 'UPDATE ' . $this->dop_tableName . ' ';

        $properties=get_class_vars($this->dop_className);

        foreach($properties as $propertyName =>
          $propertyValue){
            if ($this->isValidProperty($propertyName) &&
              $propertyName != $this->dop_pk){
                $setClause[] = '`' . $propertyName . '`'
                  . '="' . mysql_real_escape_string(
                    $this->getField($propertyName)) . '"';
            }
        }
        if (count($setClause) > 0){
            $sql .= ' SET ' . implode(',', $setClause);
            if (is_array($this->dop_pk)){
                $whereClause = array();
                for ($i=0;$i < count($this->dop_pk);$i++){
                    $whereClause[] = $this->dop_pk[$i] .
                      ' = "' . mysql_real_escape_string(
                      $this->{$this->dop_pk[$i]}) . '" ';
                }
                $sql .= " WHERE " . implode(' AND ', $whereClause);
            } else {
                $sql .= " WHERE " . $this->dop_pk . ' = "'
                  . mysql_real_escape_string(
                  $this->{$this->dop_pk}) . '" ';
            }
            $sql = str_replace("\\'", "'", $sql);

            if($this->dop_DEBUG){
                echo '<!-- SQL from table ' .
                  $this->dop_tableName . ',
                  function update(): ' . $sql . "\n-->";
            }

            mysql_query($sql, $this->getConnection());

            if($this->dop_DEBUG){
                echo '<!-- SQL error: ' . mysql_error() . "\n-->";
            }
        }
    }

    function delete()
    {
        $sql = "DELETE FROM " . $this->dop_tableName.' ';
        if (is_array($this->dop_pk)){
            $whereClause = array();
            for ($i=0; $i < count($this->dop_pk); $i++){
                $whereClause[] = $this->dop_pk[$i] .
                ' = "' . mysql_real_escape_string(
                  $this->{$this->dop_pk[$i]}) . '" ';
            }
            $sql .= " WHERE " . implode(' AND ', $whereClause);
        } else {
            $sql .= " WHERE " . $this->dop_pk . ' = "' .
              mysql_real_escape_string(
                $this->{$this->dop_pk}) . '" ';
        }

        if($this->dop_DEBUG){
            echo '<!-- SQL from table ' .
              $this->dop_tableName .
              ', function delete(): ' . $sql . "\n-->";
        }

        if (mysql_query($sql, $this->getConnection())) {
            return true;
        }

        if($this->dop_DEBUG){
            echo '<!-- SQL error: ' . mysql_error() . "\n-->";
        }

        return false;
    }

    ⁄**
     * このクラスの現在のプロパティにマッチするレコードを全て見つける。
     * ReadOnlyResultSetを返す。
     * 
     * AND条件でしか使えないことに注意。
     * (ie userId=1 AND userName='joe').
     * 
     * @example $myDO->userId = 1; $rs = $myDO->find(); // userId=1となるすべてのレコードに結果セットを返す。
     * @param string $sort What DB field to sort by (inserted into ORDER BY clause
     * @return ReadOnlyResultSet
     *⁄

    function find($sort='')
    {
        if ($sort != '') {
            $orderBy = ' ORDER BY ' . $sort;
        } else {
            $orderBy = '';
        }
        $sql = "SELECT * FROM ".$this->dop_tableName." ";

        $whereClause = array();

        $properties=get_class_vars($this->dop_className);

        foreach($properties as $propertyName =>
          $propertyValue){
            if ($this->isValidProperty($propertyName) &&
              $this->getField($propertyName) != ""){
                $whereClause[] = '`' . $propertyName .
                '`' . '="' . mysql_real_escape_string(
                $this->getField($propertyName)) . '"';
            }
        }

        if (count($whereClause) > 0){
            $sql .= " WHERE " . implode(' AND ', $whereClause);
        }
        $sql .= $orderBy;

        if($this->dop_DEBUG){
            echo '<!-- SQL from table ' .
              $this->dop_tableName .
              ', function find(): ' . $sql . "\n-->";
        }

        $rs = mysql_query($sql, $this->getConnection());

        if($this->dop_DEBUG){
            echo '<!-- SQL error: ' . mysql_error() . "\n-->";
        }

        return new ReadOnlyResultSet($rs);
    }



    function isValidProperty($name)v     {
        $name = str_replace('`', '', $name);
        if ($name == 'dop_config' || $name == 'dop_pk' ||
          $name == 'dop_tableName' ||
          $name == 'dop_className' ||
          $name == 'dop_databaseName' ||
          $name == 'dop_DEBUG'){
            return false;
        } else {
            return true;
        }
    }

    function getConnection()
    {
        return $this->dop_config->getDBConnection();
    }

    function populate($row)
    {
        while (list($fieldName, $fieldVal) = each($row)){
            $this->setField($fieldName, $fieldVal);
        }
    }
}
?>