<?php
/*
* =====================================
* 文件:  CtbClass.php
* 版本:  0.0.2 Alpha版
* 用途:  文本数据操作类
* 作者:  windnets
* 版权:  free
* 备注:  请尊重并保留版权信息,谢谢.
* =====================================
*/

class CtbClass {

	var $file;    
	var $index;  

    //建立一个文件并写入输入
	function null_write($new)
	{
		$f=fopen($this->file,"w");    
		flock($f,LOCK_EX);
		fputs($f,$new);    
		fclose($f); 
	}
	// 添加数据记录到文件末端
	function add_write($new) {     
		$f=fopen($this->file,"a");    
		flock($f,LOCK_EX);
		fputs($f,$new);     
		fclose($f); 
	} 
	// 配合readfile()的返回一起使用,把一行数据转换为一维数组
	function make_array($line) {
		$array = explode("\x0E",$line);
		return $array;
	}
	
	//把为一维数组转换一行数据
	function join_array($line) {
		$array = join("\x0E",$line);
		return $array;
	}
	// 返回数据文件的总行数
	function getlines() {
		$f=file($this->file);    
		return count($f);    
	}
	// 返回下一行的数据记录(备用)
	function next_line() {
		$this->index=$this->index++;    
		return $this->get();    
	}

	// 返回上一行的数据记录(备用)
	function prev_line() {
		$this->index=$this->index--;    
		return $this->get();    
	}  
	// 返回当前行的数据记录数据较小
	function get() {
		$f=fopen($this->file,"r");    
		flock($f,LOCK_SH);
		for($i=0;$i<=$this->index;$i++) {
			$rec=fgets($f,1024);    
		}
		$line=explode("\x0E",$rec);
		fclose($f);
		return $line;    
	}  
	// 返回当前行的数据记录数据较大
	function get_big_file() {
		$f=fopen($this->file,"r");    
		flock($f,LOCK_SH);
		for($i=0;$i<=$this->index;$i++) {
			$rec=fgets($f,1024*5);    
		}
		$line=explode("\x0E",$rec);
		fclose($f);
		return $line;    
	}  
	// 打开数据文件---以一维数组返回文件内容
	function read_file() {
		if (file_exists($this->file)) {
			$line =file($this->file);
		}
		return $line;
	}
	// 打开数据文件---以二维数组返回文件内容
	function openFile() {
		if (file_exists($this->file)) {
			$f =file($this->file);
			$lines = array();
			foreach ($f as $rawline) {
				$tmpline = explode("\x0E",$rawline);
				array_push($lines, $tmpline);
			}
		}
		return $lines;
	}
	// 传入一个数组,合并成一行数据,重写整个文件
	function overwrite($array){
		$newline = implode("\x0E",$array);	
		$f = fopen($this->file,"w");
		flock($f,LOCK_EX);
		fputs($f,$newline);
		fclose($f);
	}
  
	// 添加一行数据记录到文件末端
	function add_line($array,$check_n=1) {  
		$s=implode("\x0E",$array);    
		$f=fopen($this->file,"a");    
		flock($f,LOCK_EX);
		fputs($f,$s);    
		if ($check_n==1) fputs($f,"\n");    
		fclose($f); 
	}    

	// 插入一行数据记录到文件最前面
	function insert_line($array) {
		$newfile = implode("\x0E",$array);
		$f = fopen($this->file,"r");
		flock($f,LOCK_SH);
		while ($line = fgets($f,1024)) {
			$newfile .= $line;
		}
		fclose($f);
		$f = fopen($this->file,"w");
		flock($f,LOCK_EX);
		fputs($f,$newfile);
		fclose($f);
	}

	// 更新所有符合条件的数据记录,适用于每行字节数据较大的情况
	function update($column,$query_string,$update_array) {
		$update_string = implode("\x0E",$update_array);   
		$newfile = "";	
		$fc=file($this->file);
		$f=fopen($this->file,"r");
		flock($f,LOCK_SH);
		for ($i=0;$i<count($fc);$i++) {
			$list = explode("\x0E",$fc[$i]);
			if ($list[$column] != $query_string) {
				$newfile = $newfile.chop($fc[$i])."\n";
			} else {
				$newfile = $newfile.$update_string;
			}
		}
		fclose($f);
		$f=fopen($this->file,"w");
		flock($f,LOCK_EX);
		fputs($f,$newfile);
		fclose($f);
	}

	// 更新所有符合条件的数据记录,适用于每行字节数据较小的情况
	function update2($column,$query_string,$update_array) {
		$newline = implode("\x0E",$update_array);   
		$newfile = "";
		$f = fopen($this->file,"r");
		flock($f,LOCK_SH);
		while ($line = fgets($f,1024)) {
			$tmpLine = explode("\x0E",$line);
			if ($tmpLine[$column] == $query_string) {
				$newfile .= $newline;
			} else {
				$newfile .= $line;
			}
		}
		fclose($f);
		$f = fopen($this->file,"w");
		flock($f,LOCK_EX);
		fputs($f,$newfile);
		fclose($f);
	}

	// 删除所有符合条件的数据记录,适用于每行字节数据较大的情况
	function delete($column,$query_string) {
		$newfile = "";	
		$fc=file($this->file);
		$f=fopen($this->file,"r");
		flock($f,LOCK_SH);
		for ($i=0;$i<count($fc);$i++) {
			$list = explode("\x0E",$fc[$i]);
			if ($list[$column] != $query_string) {
				$newfile = $newfile.chop($fc[$i])."\n";
			}
		}
		fclose($f);
		$f=fopen($this->file,"w");
		flock($f,LOCK_EX);
		fputs($f,$newfile);
		fclose($f);
	}    

	// 删除所有符合条件的数据记录,适用于每行字节数据较小的情况
	function delete2($column,$query_string){  
		$newfile = "";
		$f = fopen($this->file,"r");
		flock($f,LOCK_SH);
		while ($line = fgets($f,1024)) {
			$tmpLine = explode("\x0E",$line);
			if ($tmpLine[$column] != $query_string) {
				$newfile .= $line;
			}
		}
		fclose($f);
		$f = fopen($this->file,"w");
		flock($f,LOCK_EX);
		fputs($f,$newfile);
		fclose($f);
	}

    //取得一个文件里某个字段的最大值
	function get_max_value($column) {
		$tlines = file($this->file);
		for ($i=0;$i<=count($tlines);$i++) {
			$line=explode("\x0E",$tlines[$i]);
			$get_value[]=$line[$column];
		}
        $get_max_value = max($get_value);
		return $get_max_value;
	}


	// 根据数据文件的某个字段是否包含$query_string进行查询,以二维数组返回所有符合条件的数据
	function select($column, $query_string) {
		$tline = $this->openfile();
		$lines = array();
		foreach ($tline as $line) {
			if ($line[$column] == $query_string) {
				array_push($lines, $line);
			}
		}

		return $lines;
	}

	// 功能与function select()一样,速度可能略有提升
	function select2($column, $query_string) {
		if (file_exists($this->file)) {
			$tline = $this->read_file();
			foreach ($tline as $tmpLine) {
				$line = $this->make_array($tmpLine);
				if ($line[$column] == $query_string) {
					$lines[]=$tmpLine;
				}
			}
		}

		return $lines;
	}

	// 根据数据文件的某个字段是否包含$query_string进行查询,以一维数组返回第一个符合条件的数据
	function select_line($column, $query_string) {
		$tline = $this->read_file();
		foreach ($tline as $tmpLine) {
			$line = $this->make_array($tmpLine);
			if ($line[$column] == $query_string) {
		        return $line;
				break;
			}
		}
	}
	// select next/prev line(next_prev ==> 1/next, 2/prev) by cx
	function select_next_prev_line($column, $query_string, $next_prev) {
		$tline = $this->read_file();
		$line_key_end = count($tline) - 1;
		$line_key = -1;
		foreach ($tline as $tmpLine) {
			$line_key++;
			$line = $this->make_array($tmpLine);
			if ($next_prev == 1) {  // next?
				if ($line[$column] == $query_string) {
					if ($line_key == 0) {
						return 0;
					} else {
						$line_key_up = $line_key - 1;
						return $up_line;
					}
				} else {
					$up_line = $line;
				}
			} elseif ($next_prev == 2) {  // prev?
				if ($line[$column] == $query_string) {
					if ($line_key == $line_key_end) {
						return 0;
					} else {
						$line_key_down = $line_key + 1;
						break;
					}
				}
			} else {
				return 0;
			}
		}
		$down_line = $this->make_array($tline[$line_key_down]);
		return $down_line;
	}



}
?>