<?php
// +----------------------------------------------------------------------
// | TOPThink [ WE CAN DO IT JUST THINK ]
// +----------------------------------------------------------------------
// | Copyright (c) 2013 http://topthink.com All rights reserved.
// +----------------------------------------------------------------------
// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
// +----------------------------------------------------------------------
// | Author: luofei614 <weibo.com/luofei614>
// +----------------------------------------------------------------------
namespace Think\Storage\Driver;

use Think\Storage;

// SAE环境文件写入存储类
class Sae extends Storage
{

    /**
     * 架构函数
     * @access public
     */
    private $mc;
    private $kvs      = array();
    private $htmls    = array();
    private $contents = array();
    public function __construct()
    {
        if (!function_exists('memcache_init')) {
            header('Content-Type:text/html;charset=utf-8');
            exit('请在SAE平台上运行代码。');
        }
        $this->mc = @memcache_init();
        if (!$this->mc) {
            header('Content-Type:text/html;charset=utf-8');
            exit('您未开通Memcache服务，请在SAE管理平台初始化Memcache服务');
        }
    }

    /**
     * 获得SaeKv对象
     */
    private function getKv()
    {
        static $kv;
        if (!$kv) {
            $kv = new \SaeKV();
            if (!$kv->init()) {
                E('您没有初始化KVDB，请在SAE管理平台初始化KVDB服务');
            }

        }
        return $kv;
    }

    /**
     * 文件内容读取
     * @access public
     * @param string $filename  文件名
     * @return string
     */
    public function read($filename, $type = '')
    {
        switch (strtolower($type)) {
            case 'f':
                $kv = $this->getKv();
                if (!isset($this->kvs[$filename])) {
                    $this->kvs[$filename] = $kv->get($filename);
                }
                return $this->kvs[$filename];
            default:
                return $this->get($filename, 'content', $type);
        }
    }

    /**
     * 文件写入
     * @access public
     * @param string $filename  文件名
     * @param string $content  文件内容
     * @return boolean
     */
    public function put($filename, $content, $type = '')
    {
        switch (strtolower($type)) {
            case 'f':
                $kv                   = $this->getKv();
                $this->kvs[$filename] = $content;
                return $kv->set($filename, $content);
            case 'html':
                $kv                     = $this->getKv();
                $content                = time() . $content;
                $this->htmls[$filename] = $content;
                return $kv->set($filename, $content);
            default:
                $content = time() . $content;
                if (!$this->mc->set($filename, $content, MEMCACHE_COMPRESSED, 0)) {
                    E(L('_STORAGE_WRITE_ERROR_') . ':' . $filename);
                } else {
                    $this->contents[$filename] = $content;
                    return true;
                }
        }
    }

    /**
     * 文件追加写入
     * @access public
     * @param string $filename  文件名
     * @param string $content  追加的文件内容
     * @return boolean
     */
    public function append($filename, $content, $type = '')
    {
        if ($old_content = $this->read($filename, $type)) {
            $content = $old_content . $content;
        }
        return $this->put($filename, $content, $type);
    }

    /**
     * 加载文件
     * @access public
     * @param string $_filename  文件名
     * @param array $vars  传入变量
     * @return void
     */
    public function load($_filename, $vars = null)
    {
        if (!is_null($vars)) {
            extract($vars, EXTR_OVERWRITE);
        }

        eval('?>' . $this->read($_filename));
    }

    /**
     * 文件是否存在
     * @access public
     * @param string $filename  文件名
     * @return boolean
     */
    public function has($filename, $type = '')
    {
        if ($this->read($filename, $type)) {
            return true;
        } else {
            return false;
        }
    }

    /**
     * 文件删除
     * @access public
     * @param string $filename  文件名
     * @return boolean
     */
    public function unlink($filename, $type = '')
    {
        switch (strtolower($type)) {
            case 'f':
                $kv = $this->getKv();
                unset($this->kvs[$filename]);
                return $kv->delete($filename);
            case 'html':
                $kv = $this->getKv();
                unset($this->htmls[$filename]);
                return $kv->delete($filename);
            default:
                unset($this->contents[$filename]);
                return $this->mc->delete($filename);
        }
    }

    /**
     * 读取文件信息
     * @access public
     * @param string $filename  文件名
     * @param string $name  信息名 mtime或者content
     * @return boolean
     */
    public function get($filename, $name, $type = '')
    {
        switch (strtolower($type)) {
            case 'html':
                if (!isset($this->htmls[$filename])) {
                    $kv                     = $this->getKv();
                    $this->htmls[$filename] = $kv->get($filename);
                }
                $content = $this->htmls[$filename];
                break;
            default:
                if (!isset($this->contents[$filename])) {
                    $this->contents[$filename] = $this->mc->get($filename);
                }
                $content = $this->contents[$filename];
        }
        if (false === $content) {
            return false;
        }
        $info = array(
            'mtime'   => substr($content, 0, 10),
            'content' => substr($content, 10),
        );
        return $info[$name];
    }

}
