/**
  * 初始化
  *
  * @access public static
  * @return void
  */
 public static function init($expire = 60)
 {
     self::$expire = (int) $expire;
     if (empty(self::$mysql)) {
         self::$mysql = \Myfox\Lib\Mysql::instance('default');
     }
 }
 public function execute()
 {
     if (!$this->isReady('thedate', 'priority')) {
         return self::IGNO;
     }
     $date1 = date('Ymd', strtotime(Setting::get('last_date')));
     $date2 = date('Ymd', strtotime($this->option('thedate')));
     if ($date1 >= $date2) {
         return self::IGNO;
     }
     $mysql = \Myfox\Lib\Mysql::instance('default');
     $count = (int) $mysql->getOne($mysql->query(sprintf('SELECT COUNT(*) FROM %stask_queque WHERE autokid < %u AND priority <= %u ' . "AND task_flag NOT IN (%d,%d) AND task_type='import'", $mysql->option('prefix'), $this->id, $this->option('priority'), \Myfox\App\Queque::FLAG_IGNO, \Myfox\App\Queque::FLAG_DONE)));
     if ($count > 0) {
         $this->setError(sprintf('Waiting for %d import task(s)', $count));
         return self::FAIL;
     }
     if (!Router::flush()) {
         $this->setError('flush route failed');
         return self::FAIL;
     }
     Setting::set('last_date', $date2, '', '集群数据最新日期');
     // TODO:
     // CALL nodefox to reload route info info cache
     return self::SUCC;
 }
 protected function setUp()
 {
     parent::setUp();
     \Myfox\Lib\Mysql::register('default', __DIR__ . '/ini/mysql.ini');
     self::$mysql = \Myfox\Lib\Mysql::instance('default');
     self::$mysql->query(sprintf('TRUNCATE TABLE %stask_queque', self::$mysql->option('prefix', '')));
 }
 /**
  * 清理失效的路由
  *
  * @access public static
  * @return void
  */
 public static function clean_invalidated_routes()
 {
     $mysql = \Myfox\Lib\Mysql::instance('default');
     $query = sprintf("SHOW TABLES LIKE '%sroute_info%%'", $mysql->option('prefix'));
     foreach ((array) $mysql->getAll($mysql->query($query)) as $table) {
         $table = end($table);
         $query = sprintf('SELECT autokid,hosts_list,real_table,route_text FROM %s WHERE route_flag IN (%d) AND modtime < %d', $table, Router::FLAG_IS_DELETED, time() - 100000);
         $ids = array();
         foreach ((array) $mysql->getAll($mysql->query($query)) as $row) {
             $hosts = trim($row['hosts_list'], '{}$');
             if (!empty($hosts)) {
                 $where = array();
                 foreach (Router::parse($row['route_text']) as $k => $v) {
                     $where[] = sprintf('%s = %s', $k, $v);
                 }
                 $info = array('host' => $hosts, 'path' => $row['real_table'], 'where' => implode(' AND ', $where));
                 if (!Queque::instance()->insert('delete', $info, 0, array('adduser' => 'cleaner'))) {
                     continue;
                 }
             }
             $ids[] = (int) $row['autokid'];
         }
         $mysql->query(sprintf('DELETE FROM %s WHERE (route_flag = %d AND addtime < %d)%s', $table, Router::FLAG_PRE_IMPORT, time() - 10 * 86400, empty($ids) ? '' : sprintf(' OR (autokid IN (%s))', implode(',', $ids))));
     }
 }
 protected function setUp()
 {
     parent::setUp();
     \Myfox\Lib\Mysql::removeAllNames();
     \Myfox\Lib\Mysql::register('default', __DIR__ . '/ini/mysql.ini');
     self::$mysql = \Myfox\Lib\Mysql::instance('default');
 }
 protected function setUp()
 {
     parent::setUp();
     \Myfox\Lib\Mysql::register('default', __DIR__ . '/ini/mysql.ini');
     Table::cleanAllStatic();
     self::$mysql = \Myfox\Lib\Mysql::instance('default');
 }
 /**
  * 各个对象初始化 
  *
  * @access public static
  * @return void
  */
 public static function init($ini)
 {
     self::setAutoLoad();
     /**
      * @配置文件
      */
     \Myfox\Lib\Config::register('default', $ini);
     $config = \Myfox\Lib\Config::instance('default');
     /**
      * @数据库
      */
     foreach ((array) $config->get('mysql') as $name => $file) {
         \Myfox\Lib\Mysql::register($name, $file);
     }
     /**
      * @日志对象
      */
     foreach ((array) $config->get('log') as $name => $url) {
         \Myfox\Lib\Factory::registerLog($name, $url);
     }
     /**
      * @告警提醒
      */
     \Myfox\Lib\Alert::init(__DIR__ . '/../etc/alert.ini');
 }
 protected function setUp()
 {
     parent::setUp();
     \Myfox\Lib\Mysql::removeAllNames();
     \Myfox\Lib\Mysql::register('default', __DIR__ . '/ini/mysql.ini');
     self::$mysql = \Myfox\Lib\Mysql::instance('default');
     self::$mysql->query(sprintf("DELETE FROM %shost_list WHERE host_name LIKE 'unittest%%'", self::$mysql->option('prefix', '')));
 }
 protected function setUp()
 {
     parent::setUp();
     \Myfox\Lib\Mysql::register('default', __DIR__ . '/ini/mysql.ini');
     self::$mysql = \Myfox\Lib\Mysql::instance('default');
     self::$mysql->query(sprintf('DELETE FROM %ssettings WHERE ownname LIKE "unittest%%"', self::$mysql->option('prefix')));
     Setting::$queries = 0;
 }
 protected function setUp()
 {
     parent::setUp();
     \Myfox\Lib\Mysql::register('default', __DIR__ . '/ini/mysql.ini');
     self::$mysql = \Myfox\Lib\Mysql::instance('default');
     self::cleanTable('default', 'route_info');
     self::cleanTable('default', 'task_queque');
 }
 protected function setUp()
 {
     parent::setUp();
     \Myfox\Lib\Mysql::register('default', __DIR__ . '/ini/mysql.ini');
     self::$mysql = \Myfox\Lib\Mysql::instance('default');
     self::$inifile = __DIR__ . '/ini/myfox.ini';
     self::cleanTable('default', 'process_locker');
 }
 /**
  * 构造函数
  * @param void
  */
 public function __construct($option = array('m' => 'run'))
 {
     parent::__construct($option);
     $this->mysql = \Myfox\Lib\Mysql::instance('default');
     $hosts = $this->mysql->getAll($this->mysql->query(sprintf('SELECT host_id,host_name FROM %shost_list', $this->mysql->option('prefix'))));
     foreach ($hosts as $host) {
         $this->hosts[$host['host_id']] = $host['host_name'];
     }
 }
Beispiel #13
0
 /**
  * 构造函数
  *
  * @access public
  * @param  Integer $id
  * @param  Array $option
  * @return void
  */
 public function __construct($id, $option, $status = '')
 {
     $this->id = (int) $id;
     $this->option = (array) $option;
     $this->status = $status;
     if (empty(self::$mysql)) {
         self::$mysql = \Myfox\Lib\Mysql::instance('default');
     }
 }
 public function test_should_simple_query_works_fine()
 {
     $mysql = new Mysql(__DIR__ . '/ini/mysql_test.ini');
     try {
         $mysql->connectToSlave();
     } catch (\Exception $e) {
         $this->assertContains("\tCONNECT_ERROR\t-\t{\"host\":\"127.0.0.1\",\"port\":3306,\"user\":\"user_ro\",\"pass\":\"**\",\"error\":", self::getLogContents($this->logfile, -1));
     }
     $rs = self::$mysql->getAll(self::$mysql->query('SHOW DATABASES'));
     $this->assertContains("\tQUERY_OK\t-\t{\"sql\":\"SHOW DATABASES\"", self::getLogContents($this->logfile, -1));
     $this->assertContains(array('Database' => 'test'), $rs);
     $this->assertFalse(self::$mysql->query('I AM A WRONG QUERY'));
     $this->assertContains("\tQUERY_ERROR\t-\t{\"sql\":\"I AM A WRONG QUERY\",\"async\":false,\"error\":", self::getLogContents($this->logfile, -1));
     $this->assertEquals(1, self::$mysql->query('INSERT INTO only_for_test (content) VALUES ("aabbcc")'));
     $lastId = self::$mysql->lastId();
     $this->assertEquals($lastId, self::$mysql->getOne(self::$mysql->query('SELECT MAX(id) FROM only_for_test')));
     self::$mysql->query('INSERT INTO only_for_test (content) VALUES ("aabbcc2")');
     $this->assertTrue($lastId < self::$mysql->lastId());
 }
 protected function setUp()
 {
     parent::setUp();
     \Myfox\Lib\Mysql::register('default', __DIR__ . '/ini/mysql.ini');
     self::$mysql = \Myfox\Lib\Mysql::instance('default');
     self::$mysql->query(sprintf("DELETE FROM %stable_list WHERE table_name = 'i am not exists'", self::$mysql->option('prefix')));
     self::$mysql->query(sprintf("DELETE FROM %ssettings WHERE cfgname IN ('table_route_count', 'table_real_count')", self::$mysql->option('prefix')));
     self::cleanTable('default', 'route_info');
     Setting::set('last_assign_host', 0);
 }
 protected static function cleanTable($mysql, $prefix)
 {
     $table = null;
     $mysql = \Myfox\Lib\Mysql::instance($mysql);
     $query = sprintf("SHOW TABLES LIKE '%s%s%%'", $mysql->option('prefix'), trim($prefix));
     foreach ((array) $mysql->getAll($mysql->query($query)) as $table) {
         $table = end($table);
         $mysql->query(sprintf('TRUNCATE TABLE %s', $table));
     }
     return $table;
 }
 /**
  * 执行
  *
  * @access public
  * @return Boolean true or false (next loop)
  */
 public function execute($loop = true)
 {
     $mysql = \Myfox\Lib\Mysql::instance('default');
     $count = 0;
     $query = sprintf('SELECT host_id AS id, host_name AS name FROM %shost_list', $mysql->option('prefix'));
     foreach ((array) $mysql->getAll($mysql->query($query)) as $host) {
         $db = Server::instance($host['name'])->getlink();
         try {
             $databases = $db->getAll($db->query('SHOW DATABASES'));
         } catch (\Exception $e) {
             $this->log->error('EXCEPTION', $e->getMessage());
             continue;
         }
         foreach ((array) $databases as $dbname) {
             $dbname = reset($dbname);
             if (preg_match('/^(mysql|test|information_schema)$/', $dbname) || !preg_match('/^\\w+_\\d+$/', $dbname)) {
                 continue;
             }
             foreach ((array) $db->getAll($db->query('SHOW TABLE STATUS FROM ' . $dbname)) as $row) {
                 $table = sprintf('%s.%s', $dbname, $row['Name']);
                 $logvar = array('server' => $host['name'], 'table' => $table, 'engine' => $row['Engine'], 'create' => $row['Create_time'], 'update' => $row['Update_time'], 'check' => $row['Check_time']);
                 if (true !== $this->option['full'] && $row['Check_time'] > $row['Update_time'] && !empty($row['Engine'])) {
                     $this->log->debug('CHECK_IGN1', $logvar);
                     continue;
                 }
                 switch (self::realcheck($table, $db)) {
                     case 0:
                         $this->log->debug('CHECK_IGN2', $logvar);
                         break;
                     case 1:
                         $this->log->notice('CHECK_OK', $logvar);
                         break;
                     default:
                         $this->log->debug('CHECK_FAIL', $logvar);
                         break;
                 }
                 if (++$count % 10 == 0) {
                     self::breakup();
                 }
             }
         }
     }
     return false;
 }
    /**
     * 测试表及信息创建
     */
    protected function setUp()
    {
        parent::setUp();
        \Myfox\Lib\Mysql::removeAllNames();
        \Myfox\Lib\Mysql::register('default', __DIR__ . '/ini/mysql.ini');
        $this->mysql = \Myfox\Lib\Mysql::instance('default');
        $config = new \Myfox\Lib\Config(__DIR__ . '/ini/mysql.ini');
        foreach ($config->get('master') as $host) {
            $urlRes = parse_url($host);
            $this->infos['host'] = $urlRes['host'];
            $this->infos['port'] = array_key_exists('port', $urlRes) ? $urlRes['port'] : 3306;
            $this->infos['user'] = array_key_exists('user', $urlRes) ? $urlRes['user'] : '******';
            $this->infos['pass'] = array_key_exists('pass', $urlRes) ? $urlRes['pass'] : '';
        }
        self::cleanTable('default', 'route_info');
        $this->table_bak('table_list');
        $this->table_bak('host_list');
        $this->table_bak('settings');
        //插入测试分片表1
        $this->mysql->query('CREATE TABLE `test_table_real1` (
			`id` int(10) unsigned NOT NULL auto_increment,
			`key1` varchar(64) NOT NULL default "",
			`key2` int(10) NOT NULL default 0,
			PRIMARY KEY (`id`)
		)');
        //插入测试分片表2
        $this->mysql->query('CREATE TABLE `test_table_real2` (
			`id` int(10) unsigned NOT NULL auto_increment,
			`key1` varchar(64) NOT NULL default "",
			`key2` int(10) NOT NULL default 0,
			PRIMARY KEY (`id`)
		)');
        //插入测试分片表3
        $this->mysql->query('CREATE TABLE `test_table_real3` (
			`id` int(10) unsigned NOT NULL auto_increment,
			`key1` varchar(64) NOT NULL default "",
			`key2` int(10) NOT NULL default 0,
			PRIMARY KEY (`id`)
		)');
    }
 /**
  * 构造函数
  *
  * @access private
  * @return void
  */
 private function __construct($name)
 {
     $this->name = empty($name) ? '' : '_' . $name;
     if (empty(self::$mysql)) {
         self::$mysql = \Myfox\Lib\Mysql::instance('default');
     }
     if (empty(self::$mypos)) {
         self::$mypos = Context::addr(true);
     }
 }
 /**
  * 释放锁
  *
  * @access public
  * @return void
  */
 public function freelock()
 {
     $name = strtolower(trim($this->worker->locker()));
     if (empty($name)) {
         return;
     }
     $mysql = \Myfox\Lib\Mysql::instance('default');
     return $mysql->query(sprintf("UPDATE %sprocess_locker SET wholock='' WHERE lockkey='%s' AND lockenv='%s' AND wholock='%s'", $mysql->option('prefix'), $mysql->escape($name), $mysql->escape(self::$runmode), $mysql->escape(self::$identy)));
 }
 public function test_should_mysql_reconnect_when_gone_away_works_fine()
 {
     $mysql = new Mysql(__DIR__ . '/ini/mysql.ini');
     $result = $mysql->getAll($mysql->query('SHOW DATABASES'));
     $this->assertEquals(0, $mysql->query(sprintf('KILL %d', $mysql->thread_id)));
     $this->assertEquals($result, $mysql->getAll($mysql->query('SHOW DATABASES')));
 }
 /**
  * 构造函数
  *
  * @access private
  * @return void
  */
 private function __construct($tbname)
 {
     $this->tbname = strtolower(trim($tbname));
     $this->option = null;
     if (empty(self::$mysql)) {
         self::$mysql = \Myfox\Lib\Mysql::instance('default');
     }
 }
Beispiel #23
0
 /**
  * 构造函数
  *
  * @access private
  * @return void
  */
 private function __construct($tbname)
 {
     $this->table = Table::instance($tbname);
     if (!$this->table->get('autokid')) {
         throw new \Myfox\Lib\Exception(sprintf('Undefined table named as "%s"', $tbname));
     }
     $this->tbname = $this->table->get('table_name', '');
     if (empty(self::$mysql)) {
         self::$mysql = \Myfox\Lib\Mysql::instance('default');
     }
     if (null === self::$hostall || null === self::$onlines) {
         self::metadata();
     }
 }
Beispiel #24
0
 /**
  * 构造函数
  *
  * @access private
  * @return void
  */
 private function __construct($name)
 {
     if (empty(self::$mysql)) {
         self::$mysql = \Myfox\Lib\Mysql::instance('default');
     }
     $this->dbname = $name;
     $this->option = null;
 }
Beispiel #25
0
 /**
  * 根据ID获取机器名字
  *
  * @access private static
  * @return Mixture
  */
 private static function hostname($id)
 {
     if (time() - self::$last_ts >= 300) {
         $mysql = \Myfox\Lib\Mysql::instance('default');
         $query = sprintf('SELECT host_id, host_name FROM %shost_list', $mysql->option('prefix'));
         self::$hostmap = array();
         foreach ($mysql->getAll($mysql->query($query)) as $row) {
             self::$hostmap[(int) $row['host_id']] = trim($row['host_name']);
         }
     }
     return isset(self::$hostmap[$id]) ? self::$hostmap[$id] : null;
 }
 protected function setUp()
 {
     parent::setUp();
     \Myfox\Lib\Mysql::register('default', __DIR__ . '/ini/mysql.ini');
 }