<?php
/**
 * -----------------------------------------------------------------------------
 *
 * SyL - Web Application Framework for PHP
 *
 * PHP version 4 (>= 4.3.x) or 5
 *
 * Copyright (C) 2006 k.watanabe
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 *
 * This library 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
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 *
 * -----------------------------------------------------------------------------
 * @package   SyL
 * @author    k.watanabe <k.watanabe@syl.jp>
 * @copyright 2006 k.watanabe
 * @license   http://www.opensource.org/licenses/lgpl-license.php
 * @version   CVS: $Id: SyL_DB_Odbc.php,v 1.3 2006/12/23 11:13:09 seasonstream Exp $
 * @link      http://www.syl.jp/
 * -----------------------------------------------------------------------------
 */

/**
 *  DB操作クラス（ODBC）
 *
 * @package   SyL
 * @author    k.watanabe <k.watanabe@syl.jp>
 * @copyright 2006 k.watanabe
 * @license   http://www.opensource.org/licenses/lgpl-license.php
 * @version   CVS: $Id: SyL_DB_Odbc.php,v 1.3 2006/12/23 11:13:09 seasonstream Exp $
 * @link      http://www.syl.jp/
 */
class SyL_DB_Odbc extends SyL_DB
{
    /**
     * 接続カーソルタイプ
     *
     * @access private
     * @var int
     */
    var $cursor_type = SQL_CUR_USE_ODBC;

    /**
     * DB接続実行
     * 
     * @access public
     * @param string データベース名
     * @param string ユーザー名
     * @param string パスワード
     * @param string ホスト名
     * @param string ポート番号
     * @param bool 持続的接続を行うか
     * @return boolean 接続OK: true, 接続NG: false
     */
    function openConnection($dbname, $user, $passwd, $host, $port, $persistent)
    {
        $this->connection = ($persistent) ? odbc_pconnect($dbname, $user, $passwd, $this->cursor_type)
                                          : odbc_connect ($dbname, $user, $passwd, $this->cursor_type);
        return is_resource($this->connection);
    }

    /**
     * DB接続終了
     * 
     * @access public
     */
    function closeConnection()
    {
        if (is_resource($this->connection)) {
            odbc_close($this->connection);
            $this->connection = null;
        }
    }

    /**
     * 最後に起こったエラーメッセージを取得
     *
     * @access public
     * @return string 最後に起こったエラーメッセージ
     */
    function getLastError()
    {
        $error_code = odbc_error($this->connection);
        $error_message = '';
        if ($error_code) {
            $error_message = "[Error Code {$error_code}]" . odbc_errormsg($this->connection);
        }
        return $error_message;
    }

    /**
     * トランザクション開始
     *
     * @access public
     */
    function begin()
    {
        parent::begin();
        odbc_autocommit($this->connection, false);
    }

    /**
     * トランザクション破棄
     *
     * @access public
     */
    function rollback()
    {
        odbc_rollback($this->connection);
        parent::rollback();
    }

    /**
     * トランザクション確定
     *
     * @access public
     */
    function commit()
    {
        odbc_commit($this->connection);
        parent::commit();
    }

    /**
     * SQLを実行し、DBリソースを取得
     *
     * @access public
     * @param string SQL文
     * @return mixed 実行OK: DBリソース, 実行NG: false
     */
    function executeSelect($sql)
    {
        $result = @odbc_exec($this->connection, $sql);
        if ($result !== false) {
            return $result;
        } else {
            $this->executeTriggerError($this->getLastError());
            return false;
        }
    }

    /**
     * SQLを実行し、実行結果影響件数を取得
     *
     * @access public
     * @param string SQL文
     * @return mixed 実行OK: 実行結果影響件数, 実行NG: false
     */
    function executeUpdate($sql)
    {
        // 実行時エラー判定
        $result = @odbc_exec($this->connection, $sql);
        $num = odbc_num_rows($result);
        if ($num != -1) {
            return $num;
        } else {
            $this->executeTriggerError($this->getLastError());
            return false;
        }
    }

    /**
     * SQL実行のみ
     *
     * @access public
     * @param string SQL文
     * @return boolean 実行OK: true, 実行NG: false
     */
    function executeNoReturn($sql)
    {
        // 実行時エラー判定
        $result = @odbc_exec($this->connection, $sql);
        if ($result !== false) {
            return true;
        } else {
            $this->executeTriggerError($this->getLastError());
            return false;
        }
    }
  
    /**
     * SQL実行し、結果データを取得
     *
     * ・第3パラメータが、'one'の場合
     *    最初の1カラムを文字列として取得
     * ・第3パラメータが、'record'の場合
     *    最初の1レコードを配列として取得
     * ・第3パラメータが、'all'の場合
     *    全レコードを配列として取得
     *
     * @access public
     * @param string SQL文
     * @param mixed  実行結果を取得
     * @param string 結果取得フラグ
     * @return boolean 実行OK: true, 実行NG: false
     */
    function executeGet($sql, &$data, $get='all')
    {
        // SQL実行
        $this->execute($sql, $query);
  
        // 実行時エラー判定
        if (is_resource($query)) {
            switch ($get) {
            // 1フィールド
            case 'one':
                if (odbc_fetch_row($query)) {
                    $data = odbc_result($query, 1);
                } else {
                    $data = '';
                }
                break;
            // 1レコード
            case 'record':
                $data = array();
                if (odbc_fetch_row($query)) {
                    $cols = odbc_num_fields($query);
                    for ($i=1; $i<=$cols; $i++) {
                        $data[odbc_field_name($query, $i)] = odbc_result($query, $i);
                    }
                    $data = $this->changeFieldName($data);
                }
                break;
            // 全レコード
            case 'all':
                $data = array();
                $cols = odbc_num_fields($query);
                while (odbc_fetch_row($query)) {
                    $tmp = array();
                    for ($i=1; $i<=$cols; $i++) {
                        $tmp[odbc_field_name($query, $i)] = odbc_result($query, $i);
                    }
                    $data[] = $this->changeFieldName($tmp);
                }
                break;
            }
            odbc_free_result($query);
            return true;
        } else {
            $this->executeTriggerError($this->getLastError());
            return false;
        }
    }

    /**
     * SQLを実行し、ページ毎にデータを取得
     * ※実行前に「initializePage」メソッド実行必須
     * ※SQL文の「FROM」句の直前にタブ文字必須。（それ以外のタブ文字不可）
     *
     * @access public
     * @param string SQL文
     * @param array 実行結果格納配列
     * @param object ページオブジェクト
     * @param int 1ページの表示件数
     * @param int 表示対象ページ数 
     * @return bool 実行結果
     */
    function executePage($sql, &$result, &$page_control, $limit, $page=1)
    {
/*
        // ページ制御クラス
        include_once dirname(dirname(__FILE__)) . DIRECTORY_SEPARATOR . 'SyL_Pager.php';
        $page_control = new SyL_Pager();
        $page_control->setCount($limit);
        $page_control->setPage($page);

        // 総件数取得SQL作成
        $sql_count = "SELECT COUNT(*) FROM (" . $sql . ") AS SyL$";
        // 件数取得SQL実行
        if (!$this->executeGet($sql_count, $record, 'one')) return false;
        $page_control->setCountAll($record);

        // ページ単位レコード取得
        $sql_page  = $sql;
        $sql_page .= " LIMIT "  . $page_control->getCount();
        $sql_page .= " OFFSET " . $page_control->getStartRecord();

        // データ取得SQL実行
        return $this->executeGet($sql_page, $result, 'all');
*/
    }
}

?>
