1001),array('id' => 1002),array('id' => 1003))) * $aWhere 附加条件,二维数组(内层数组:0字段名,1条件符,2是值),条件符(=,<>,!=,>,>=,<,<=) * 如:array(array('desc','=','4515')); * */ class mubcache { /** * * 表配置 * @var unknown_type */ private $_config; private $_compositeKey; //是否组合主键 private $_keyField; //主键字段 private $_aKeyWhere; //主键条件 private $_keyWhereCount; //条件值的数量 /** * @var BcServer */ private $_bcServer; //BcServer对象 /** * * 构造函数 * @param unknown_type $config * server bcache地址 * port bcache端口 * key_field 键字段名 * key_type 键字段类型 */ public function __construct(array $config) { $this->_config = $config; $this->_keyField = $config['keyField']; $this->_compositeKey = $config['compositeKey']; $this->_keys = $config['keys']; } /** * * 设置bcache服务器 */ public function createBcServer() { $this->_bcServer = new BcServer(); //创建BcServer对象 $code = $this->_bcServer->setAddress( $this->_config['server'], $this->_config['port'] ); if ($code != 0) { //错误码 $this->error( $code, $this->_bcServer->errorMessage(), __LINE__ ); } //设置表名 $code = $this->_bcServer->setTablename( $this->_config['tablename'] ); if ($code != 0) { //错误码 $this->error( $code, $this->_bcServer->errorMessage(), __LINE__ ); } //设置键 //组合主键 if ($this->_compositeKey) { } else { $keyType = intval( $this->_config['keyType'] ); if ($this->_keyWhereCount > 1) { //单键多值 if ( $this->_keyWhereCount > 31){ bc_set_key_value_max( 20000); } $code = $this->_bcServer->addKey( $this->_keyField, $keyType ); if ($code != 0) { $this->error( $code, $this->_bcServer->errorMessage(), __LINE__ ); } } else { //单键单值 if ($keyType == BC_INT_KEY) { $code = $this->_bcServer->intKey(); if ($code != 0) { $this->error( $code, $this->_bcServer->errorMessage(), __LINE__ ); } } elseif ($keyType == BC_STRING_KEY) { $code = $this->_bcServer->stringKey(); if ($code != 0) { $this->error( $code, $this->_bcServer->errorMessage(), __LINE__ ); } } } } } private function reset() { $this->_aKeyWhere = null; $this->_bcServer = null; } /** * * 新添加数据 键-值对 * @param unknown_type $aFieldVal array('key'=>value, 'key'=>value) * @return int */ public function insert(array $aFieldVal) { if (! is_array( $aFieldVal )) { return 0; } $this->createBcServer(); $req = new BcRequest( $this->_bcServer, BC_INSERT ); //创建BcRequest对象 foreach ( $aFieldVal as $field => $value ) { if ($field == $this->_keyField) { //主键 $code = $req->setKey( $value ); if ($code != 0) { $this->error( $code, $this->_bcServer->errorMessage(), __LINE__ ); } } else { $code = $req->set( $field, $value ); //其他字段值 if ($code != 0) { $this->error( $code, $this->_bcServer->errorMessage(), __LINE__ ); } } } $res = new BcResult(); $code = $req->execute( $res ); if ($code != 0) { $this->error( $code, $res->errorMessage() . 'DB:' . $res->errorFrom(), __LINE__ ); } $affected = $res->affectedRows(); $insertId = $res->insertId(); $this->reset(); return ($affected && $insertId ? $insertId : $affected); } /** * * 更新记录 * @param unknown_type $aSet 需要修改的键值对 * @param unknown_type $aKeyWhere 主键条件键值对 * @param unknown_type $aWhere 附加条件 * @param unknown_type $aLimit 限制记录数 array(array(1)) * @return int(true/false) */ public function update(array $aSet, array $aKeyWhere, array $aWhere = array(), array $aLimit = array()) { $this->_aKeyWhere = $aKeyWhere; $this->_keyWhereCount = count( $aKeyWhere ); $this->createBcServer(); $req = new BcRequest( $this->_bcServer, BC_UPDATE ); //创建BcRequest对象 $this->makeKeyWhere( $req, $aKeyWhere ); $this->makeWhereAndLimit( $req, $aWhere, $aLimit ); foreach ( $aSet as $field => $value ) { $code = $req->set( $field, $value ); } $res = new BcResult(); $code = $req->execute( $res ); if ($code != 0) { $this->error( $code, $res->errorMessage() . 'DB:' . $res->errorFrom(), __LINE__ ); } return $res->affectedRows(); } /** * 删除记录(一次只能删除一条记录) * @param unknown_type $aKeyWhere 主键条件键值对 * @param unknown_type $aWhere 附加条件 * @param unknown_type $aLimit 限制记录数 * @return int(0失败/1成功) */ public function delete(array $aKeyWhere, array $aWhere = array(), array $aLimit = array()) { $this->_aKeyWhere = $aKeyWhere; $this->_keyWhereCount = count( $aKeyWhere ); $this->createBcServer(); $req = new BcRequest( $this->_bcServer, BC_DELETE ); //创建BcRequest对象 $this->makeKeyWhere( $req, $aKeyWhere ); $this->makeWhereAndLimit( $req, $aWhere, $aLimit ); $res = new BcResult(); $code = $req->execute( $res ); if ($code != 0) { $this->error( $code, $res->errorMessage() . 'DB:' . $res->errorFrom(), __LINE__ ); } return $res->affectedRows(); } /** * 查询一条记录 * @param array $fields 需要的字段 array( key=>value, key=>value) * @param array $aKeyWhere 主键条件键值对 array( array(key=>value))) * @param array $aWhere 附加条件 array * @return array() */ public function getOne(array $fields, array $aKeyWhere, array $aWhere = array()) { $this->_aKeyWhere = $aKeyWhere; $this->_keyWhereCount = count( $aKeyWhere ); $this->createBcServer(); $req = new BcRequest( $this->_bcServer, BC_SELECT ); //创建BcRequest对象 $this->makeKeyWhere( $req, $aKeyWhere ); $this->makeWhereAndLimit( $req, $aWhere, array(0, 1 ) ); foreach ( $fields as $field ) { $code = $req->need( $field ); if ($code != 0) { $this->error( $code, $this->_bcServer->errorMessage(), __LINE__ ); } } $res = new BcResult(); $code = $req->execute( $res ); if ($code != 0) { $this->error( $code, $res->errorMessage() . 'DB:' . $res->errorFrom(), __LINE__ ); } return $res->fetchRow( BC_FETCH_ASSOC ); } /** * * 查询多条记录 * @param array $fields 需要的字段 * @param array $aKeyWhere 主键条件键值对 * @param array $aWhere 附加条件 * @param array $aLimit 限制记录数 */ public function getMulti(array $fields, array $aKeyWhere, array $aWhere = array(), array $aLimit = array()) { $this->_aKeyWhere = $aKeyWhere; $this->_keyWhereCount = count( $aKeyWhere ); $this->createBcServer(); $req = new BcRequest( $this->_bcServer, BC_SELECT ); //创建BcRequest对象 $this->makeKeyWhere( $req, $aKeyWhere ); $this->makeWhereAndLimit( $req, $aWhere, $aLimit ); foreach ( $fields as $field ) { $code = $req->need( $field ); if ($code != 0) { $this->error( $code, $this->_bcServer->errorMessage(), __LINE__ ); } } $res = new BcResult(); $code = $req->execute( $res ); if ($code != 0) { $this->error( $code, $res->errorMessage() . 'DB:' . $res->errorFrom(), __LINE__ ); } $result = array(); while ( $row = $res->fetchRow( BC_FETCH_ASSOC ) ) { $result[] = $row; } return $result; } /** * 统计记录数 * @param unknown_type $aKeyWhere * @param unknown_type $aWhere */ public function count(array $aKeyWhere, array $aWhere = array()){ $this->_aKeyWhere = $aKeyWhere; $this->_keyWhereCount = count( $aKeyWhere ); $this->createBcServer(); $req = new BcRequest( $this->_bcServer, BC_SELECT ); //创建BcRequest对象 $this->makeKeyWhere( $req, $aKeyWhere ); $this->makeWhereAndLimit( $req, $aWhere, array() ); $res = new BcResult(); $code = $req->execute( $res ); if ($code != 0) { $this->error( $code, $res->errorMessage() . 'DB:' . $res->errorFrom(), __LINE__ ); } return $res->totalRows(); } /** * 自增操作(int++) * @param unknown_type $field 自增字段 * @param unknown_type $step 步长 * @param unknown_type $aKeyWhere 主键条件 * @param unknown_type $aWhere 附加条件 */ public function inc($field, array $aKeyWhere, array $aWhere = array(), $step = 1){ $this->_aKeyWhere = $aKeyWhere; $this->_keyWhereCount = count( $aKeyWhere ); $this->createBcServer(); $req = new BcRequest( $this->_bcServer, BC_UPDATE ); //创建BcRequest对象 $this->makeKeyWhere( $req, $aKeyWhere ); $this->makeWhereAndLimit( $req, $aWhere, array() ); $req->add($field, $step); $res = new BcResult(); $code = $req->execute( $res ); if ($code != 0) { $this->error( $code, $res->errorMessage() . 'DB:' . $res->errorFrom(), __LINE__ ); } return $res->affectedRows(); } /** * 自减操作(int--) * @param unknown_type $field 自增字段 * @param unknown_type $step 步长 * @param unknown_type $aKeyWhere 主键条件 * @param unknown_type $aWhere 附加条件 */ public function dec($field, array $aKeyWhere, array $aWhere = array(), $step = 1){ $this->_aKeyWhere = $aKeyWhere; $this->_keyWhereCount = count( $aKeyWhere ); $this->createBcServer(); $req = new BcRequest( $this->_bcServer, BC_UPDATE ); //创建BcRequest对象 $this->makeKeyWhere( $req, $aKeyWhere ); $this->makeWhereAndLimit( $req, $aWhere, array() ); $req->sub($field, $step); $res = new BcResult(); $code = $req->execute( $res ); if ($code != 0) { $this->error( $code, $res->errorMessage() . 'DB:' . $res->errorFrom(), __LINE__ ); } return $res->affectedRows(); } /** * * 生成主键条件 * @param unknown_type $req */ public function makeKeyWhere(&$req, array $aKeyWhere) { foreach ( $aKeyWhere as $row ) { foreach ( $row as $field => $value ) { if ($this->_keyWhereCount > 1) { //单键多值 $code = $req->addKeyValue( $field, $value ); //var_dump( $code, 'xxxxxxxxxxx', $field, '------',$value,'

'); } else { $code = $req->setKey( $value ); } if ($code != 0) { $this->error( $code, $this->_bcServer->errorMessage(), __LINE__ ); } } } } /** * * 生成附加条件和限制记录 * @param unknown_type $aWhere * @param unknown_type $aLimit */ public function makeWhereAndLimit(&$req, array $aWhere, array $aLimit = array()) { foreach ( $aWhere as $row ) { $field = $row[0]; $op = strtolower( $row[1] ); $value = $row[2]; $op = strtolower( $op ); switch ($op) { case '!=' : case '<>' : $op = 'ne'; break; case '<' : $op = 'lt'; break; case '>' : $op = 'gt'; break; case '<=' : $op = 'le'; break; case '>=' : $op = 'ge'; break; default : $op = 'eq'; break; } $code = $req->$op( $field, $value ); if ($code != 0) { $this->error( $code, $this->_bcServer->errorMessage(), __LINE__ ); } } if (intval( $aLimit[1] ) > 0) { $code = $req->limit( intval( $aLimit[0] ), intval( $aLimit[1] ) ); if ($code != 0) { $this->error( $code, $this->_bcServer->errorMessage(), __LINE__ ); } } return true; } public function error($code, $msg, $line) { $str = 'line:' . $line . '--code:' . $code . '---msg:' . $msg; die( $str ); } }