textsql.php

<?php

define( "TEXTDB_CR", "##CR##" );
define( "TEXTDB_LF", "##LF##" );
define( "TEXTDB_SEP", "##SEP##" );

class CTextDB
{
	var $fpath = "";
	var $columns;
	var $column;
	var $columncnt;
	var $i;
	var	$datas;
	var $condition;
	var $key;
	var	$data;
	var $cmpkey;
	var $cmpdesc;


	function CTextDB( $fpath = "" )
	{
		$this->fpath = $fpath;
	}


	function SetFileName( $fpath )
	{
		$this->fpath = $fpath;
	}


	function insert( $datas, $fpath = "" )
	{
		if( !$fpath )	$fpath = $this->fpath;
		if( $this->_read_header( $fpath, $maxid ) )
		{
			$pieces	= array();
			foreach( $this->columns as $i => $column )
			{
				if( $i )
				{
					$pieces[$column] = $datas[$column];
				}
				else
				{
					$pieces[$column] = $maxid;
				}
			}
			$recode	= implode( TEXTDB_SEP, $pieces );
			$recode	= $this->_initstr( $recode );
			
			$file	= file( $fpath );
			$count	= count( $file );
			if( $fp = fopen( $fpath, "w" ) )
			{
				flock( $fp, LOCK_EX );
				$maxid++;
				fwrite( $fp, $file[0] );
				fwrite( $fp, $maxid . "\n" );
				for( $i = 2; $i < $count; $i++ )
				{
					fwrite( $fp, $file[$i] );
				}
				fwrite( $fp, $recode . "\n" );
				fclose( $fp );
				return TRUE;
			}
		}
		
		return FALSE;
	}
	
	function update( $datas, $condition, $fpath = "" )
	{
		if( !$fpath )	$fpath = $this->fpath;
		if( $this->_read_header( $fpath, $maxid ) )
		{
			$file	= file( $fpath );
			$count	= count( $file );
			if( $fp = fopen( $fpath, "w" ) )
			{
				flock( $fp, LOCK_EX );
				fwrite( $fp, $file[0] );
				fwrite( $fp, $file[1] );
				$this->condition	= $condition;
				for( $i = 2; $i < $count; $i++ )
				{
					$this->datas	= explode( TEXTDB_SEP, trim( $file[$i] ) );
					if( $this->_check_condition() )
					{
						$pieces	= array();
						foreach( $this->columns as $j => $column )
						{
							if( $j )
							{
								if( array_key_exists( $column, $datas ) )
								{
									$pieces[$column] = $datas[$column];
								}
								else
								{
									$pieces[$column] = $this->datas[$j];
								}
							}
							else
							{
								$pieces[$column] = $this->datas[$j];
							}
						}
						$recode	= implode( TEXTDB_SEP, $pieces );
						$recode	= $this->_initstr( $recode );
						fwrite( $fp, $recode . "\n" );
					}
					else
					{
						fwrite( $fp, $file[$i] );
					}
				}
				fclose( $fp );
				return TRUE;
			}
		}
		
		return FALSE;
	}
	
	function delete( $condition, $fpath = "" )
	{
		if( !$fpath )	$fpath = $this->fpath;
		if( $this->_read_header( $fpath, $maxid ) )
		{
			$file	= file( $fpath );
			$count	= count( $file );
			if( $fp = fopen( $fpath, "w" ) )
			{
				flock( $fp, LOCK_EX );
				fwrite( $fp, $file[0] );
				fwrite( $fp, $file[1] );
				if( !strlen( $condition ) )	$condition = "1";
				$this->condition	= $condition;
				for( $i = 2; $i < $count; $i++ )
				{
					$this->datas	= explode( TEXTDB_SEP, trim( $file[$i] ) );
					if( !$this->_check_condition() )
					{
						fwrite( $fp, $file[$i] );
					}
				}
				fclose( $fp );
				return TRUE;
			}
		}
		
		return FALSE;
	}
	
	function select( $condition, $order = "", $fpath = "", $limit = '' )
	{
		if( !$fpath )	$fpath = $this->fpath;
		$ret	= array();
		if( $this->_read_header( $fpath, $maxid ) )
		{
			$file				= file( $fpath );
			$count				= count( $file );
			if( !strlen( $condition ) )	$condition = "1";
			$this->condition	= $condition;
			$limit				= $this->_parse_limit( $limit );
			if( $limit )
			{
				$lstart	= $limit[0];
				$lnum	= $limit[1];
			}
			for( $i = 2; $i < $count; $i++ )
			{
				$this->datas	= explode( TEXTDB_SEP, trim( $file[$i] ) );
				if( $this->_check_condition() )
				{
					$data	= array();
					for( $j = 0; $j < $this->columncnt; $j++ )
					{
						$data[$this->columns[$j]]	= $this->_reversestr( $this->datas[$j] );
					}
					array_push( $ret, $data );
				}
			}
			if( count( $ret ) )
			{
				$this->_sort_records( $ret, $order );
			}
		}
		
		if( $limit )	return array_slice( $ret, $lstart, $lnum );
		
		return $ret;
	}
	
	function count( $condition, $fpath = "" )
	{
		if( !$fpath )	$fpath = $this->fpath;
		$ret	= 0;
		if( $this->_read_header( $fpath, $maxid ) )
		{
			$file				= file( $fpath );
			$count				= count( $file );
			if( !strlen( $condition ) )	$condition = "1";
			$this->condition	= $condition;
			for( $i = 2; $i < $count; $i++ )
			{
				$this->datas	= explode( TEXTDB_SEP, trim( $file[$i] ) );
				if( $this->_check_condition() )
				{
					$ret++;
				}
			}
		}
		
		return $ret;
	}
	
	function _read_header( $fpath, &$maxid )
	{
		$ret	= FALSE;
	
	
		if( $fp = fopen( $fpath, "r" ) )
		{
			$line	= trim( fgets( $fp ) );
			if( $line )
			{
				$this->columns		= explode( ",", $line );
				$this->columncnt	= count( $this->columns );
				$line				= trim( fgets( $fp ) );
				if( $line )
				{
					$maxid	= $line;
					$ret	= TRUE;
				}
			}
			fclose( $fp );
		}
		
		return $ret;
	}
	
	function _check_condition()
	{
		for( $this->i = 0; $this->i < $this->columncnt; $this->i++ )
		{
			$this->column	= $this->columns[$this->i];
			$this->data		= $this->datas[$this->i];
			$str = '$' . $this->column . " = '" . $this->data . "';";
			eval( $str );
		}
		
		$str	= '
		if( ' . $this->condition . ' )
		{
			$ret = TRUE;	
		}
		else
		{
			$ret = FALSE;
		}
		';
		eval( $str );
		
		return $ret;
	}
	
	function _initstr( $str )
	{
		$str	= str_replace( "\r", TEXTDB_CR, $str );
		$str	= str_replace( "\n", TEXTDB_LF, $str );
		return $str;
	}
	
	function _reversestr( $str )
	{
		$str	= str_replace( TEXTDB_CR, "\r", $str );
		$str	= str_replace( TEXTDB_LF, "\n", $str );
		return $str;
	}
	
	function _cmpfunc( $a, $b )
	{
	    if( $a[$this->cmpkey] == $b[$this->cmpkey] )
		{
	        return 0;
	    }
		$ret	= ( $a[$this->cmpkey] < $b[$this->cmpkey] ) ? -1 : 1;
		if( $this->cmpdesc )	$ret *= -1;
	    return $ret;
	}
	
	function _sort_records( &$records, $order )
	{
		switch( $order )
		{
		case 'RAND()':
			shuffle( $records );
			break;
		default:
			$order			= trim( $order );
			$pos			= strpos( $order, " " );
			$this->cmpdesc	= FALSE;
			if( $pos === FALSE )
			{
				$this->cmpkey	= $order;
			}
			else
			{
				$this->cmpkey	= substr( $order, 0, $pos );
				if( trim( strtolower( substr( $order, $pos ) ) ) == "desc" )
				{
					$this->cmpdesc	= TRUE;
				}
			}
			if( $this->cmpkey && array_key_exists( $this->cmpkey, $records[0] ) )
			{
				usort( $records, array( &$this, '_cmpfunc' ) );
			}
			break;
		}
	}
	
	
	function _parse_limit( $limit )
	{
		$limit	= trim( $limit );
		if( !$limit )	return null;
		
		if( strpos( $limit, ',' ) )
		{
			list( $start, $num )	= explode( ',', $limit );
			return array( intval( $start ), intval( $num ) );
		}
		
		return array( 0, intval( $limit ) );
	}
}
?>

スポンサーリンク

関連記事

スポンサーリンク

||演算子 文字列の結合

ホームページ製作・web系アプリ系の製作案件募集中です。

上に戻る