인터넷정보

PHP를 이용한 메모리 DB

알 수 없는 사용자 2007. 10. 11. 22:07

memdb.inc 

<?
//////////////////////////////////////////////////////////////////////////////////////
//
// MEM_DB  메모리 점유형 DB
//
// MEM DB v0.5
//  제작자 : 이현구(닉 : ent24)
//
//
// 현재 기능
// sql_create      데이터 베이스 생성
//  사용법 : sql_create("테이블명","필드1,필드2");
//  ex) sql_create("a","b,c");
//  리턴값 : 없음

// sql_select      데이터 선택
//  사용법 : sql_select("테이블명","추출필드1,추출필드1","조건(현재는 = 만 사용가능함 중복 검색시 and/or 가능)","정렬(desc) 기본 asc");
//  ex) : sql_select("a","b,c","b=10 and c=10","desc");
//  리턴값 : Array[레코드번호][필드명]

// sql_select_limit    데이터 선택된 데이터 개수 반환
//  사용법 : sql_select_limit("테이블명");
//  ex) : echo sql_select_limit("a");
// 리턴값 : INT

// sql_insert      데이터 삽입
//  사용법 : sql_insert("테이블명","첫필드 데이터1,두번째 필드 데이터2");  //필드는 순서대로 입력
//  ex) : sql_select_limit("a","10,20");
//  리턴값 : 없음

// sql_drop       데이터 테이블 삭제
//  사용법 : sql_drop("테이블명");
//  ex) : sql_drop("a");
//  리턴값 : 없음

//
//////////////////////////////////////////////////////////////////////////////////////


class Mem_SQL
{
 //기본
 var $Mem_db_TABLE_BASE_LIMIT_Num;
 function Mem_SQL()
 {
  $this->Mem_db_TABLE_BASE_LIMIT_Num=4;
 }

 //테이블생성
 function sql_create($TB_name,$Fild_name_s)
 {
  //필드명 정의
  $Fild_name=split(",",$Fild_name_s);
  //필드명개수
  $Fild_count=count($Fild_name);

  //테이블의정보저장
  $this->{$TB_name}[fild_limit]=$Fild_count;
  $this->{$TB_name}[filds]=$Fild_name_s;
  $this->{$TB_name}[limit]=0;
  $this->{$TB_name}[select_limit]=0;
 }
 //테이블 레코드 개수 반환
 function sql_select_limit($TB_name)
 {
  return $this->{$TB_name}[select_limit];
 }
 //선택
 function sql_select($TB_name,$Fild_name_s,$Fild_search_s,$Fild_sort)
 {
  //전달 데이터 정의
  $Result_data=Array();

  //필드명 정의
  $Fild_name=split(",",$Fild_name_s);
  //필드명개수
  $Fild_count=count($Fild_name);

  //필드 개수 체크
  $Table_count=count($this->{$TB_name});

  //검색필드
  $Fild_search_ary=$this->Search_query_data($Fild_search_s);
  $Fild_search_count=count($Fild_search_ary[1]);

  //해당 쿼리 개수 체크
  $Check_fild_count=0;

  //데이터 삽입
  for($rof=$this->Mem_db_TABLE_BASE_LIMIT_Num;$rof<$Table_count;$rof++)
  {

   $Insert_check=0;
   if($Fild_search_s)
   {
    for($rof_serach=0;$rof_serach<$Fild_search_count;$rof_serach++)
    {
     $cut_pos=strpos($Fild_search_ary[1][$rof_serach],"=");


     $search_Fild_name=trim(substr($Fild_search_ary[1][$rof_serach],0,$cut_pos));
     $search_Fild_data=substr($Fild_search_ary[1][$rof_serach],$cut_pos+1);


     $Insert_check_mem=0;
     if($this->{$TB_name}[$rof][ $search_Fild_name ]==$search_Fild_data)  $Insert_check_mem=1;

     if($Fild_search_ary[0][$rof_serach-1])
     {
      if($Fild_search_ary[0][$rof_serach-1]=="and") $Insert_check=$Insert_check*$Insert_check_mem;
      if($Fild_search_ary[0][$rof_serach-1]=="or") $Insert_check=$Insert_check+$Insert_check_mem;
     }

     $Insert_check=$Insert_check+$Insert_check_mem;
    }
   }
   else
    $Insert_check=1;

   if($Insert_check)
   {
    for($rof_fild=0;$rof_fild<$Fild_count;$rof_fild++)
    {
     $Result_data[$Check_fild_count][$rof_fild]=$this->{$TB_name}[$rof][ $Fild_name[$rof_fild] ];
     $Result_data[$Check_fild_count][$Fild_name[$rof_fild]]=$this->{$TB_name}[$rof][ $Fild_name[$rof_fild] ];
    }
    $Check_fild_count++;
   }
  }


  //데이터 정렬
  $this->{$TB_name}[select_limit]=$Check_fild_count;
  if($Fild_sort)
  {
   $Fild_sort_set_ary=explode(" ",$Fild_sort);

   $Fild_sort_name=$Fild_sort_set_ary[0];

   if($Fild_sort_set_ary[1]=="desc")
   {


    for($rof1=1;$rof1<$Check_fild_count;$rof2=$rof1, $rof1=$rof1*3+1);

    do
    {
     for($rof3=0;$rof3<$rof2;$rof3++)
     {
      for($rof1=$rof3+$rof2;$rof1<$Check_fild_count;$rof1+=$rof2)
      {
       for($rof_fild=0;$rof_fild<$Fild_count;$rof_fild++)
        $tmp_data_ary[$Fild_name[$rof_fild]]=$Result_data[$rof1][$Fild_name[$rof_fild]];

       for($rof4=$rof1-$rof2, $tmp_data=$Result_data[$rof1][$Fild_sort_name];$rof4>=$rof3 && $Result_data[$rof4][$Fild_sort_name]<$tmp_data;$rof4-=$rof2)
       {

        for($rof_fild=0;$rof_fild<$Fild_count;$rof_fild++)
         $Result_data[$rof4+$rof2][$Fild_name[$rof_fild]]=$Result_data[$rof4][$Fild_name[$rof_fild]];

       }

       for($rof_fild=0;$rof_fild<$Fild_count;$rof_fild++)
        $Result_data[$rof4+$rof2][$Fild_name[$rof_fild]]=$tmp_data_ary[$Fild_name[$rof_fild]];

      }
     }
     $rof2=($rof2-1)/3;

    }while($rof2>=1);

   }
   else
   {

    for($rof1=1;$rof1<$Check_fild_count;$rof2=$rof1, $rof1=$rof1*3+1);

    do
    {
     for($rof3=0;$rof3<$rof2;$rof3++)
     {
      for($rof1=$rof3+$rof2;$rof1<$Check_fild_count;$rof1+=$rof2)
      {
       for($rof_fild=0;$rof_fild<$Fild_count;$rof_fild++)
        $tmp_data_ary[$Fild_name[$rof_fild]]=$Result_data[$rof1][$Fild_name[$rof_fild]];

       for($rof4=$rof1-$rof2, $tmp_data=$Result_data[$rof1][$Fild_sort_name];$rof4>=$rof3 && $Result_data[$rof4][$Fild_sort_name]>$tmp_data;$rof4-=$rof2)
       {

        for($rof_fild=0;$rof_fild<$Fild_count;$rof_fild++)
         $Result_data[$rof4+$rof2][$Fild_name[$rof_fild]]=$Result_data[$rof4][$Fild_name[$rof_fild]];

       }

       for($rof_fild=0;$rof_fild<$Fild_count;$rof_fild++)
        $Result_data[$rof4+$rof2][$Fild_name[$rof_fild]]=$tmp_data_ary[$Fild_name[$rof_fild]];

      }
     }
     $rof2=($rof2-1)/3;

    }while($rof2>=1);

   }
  }


  return $Result_data;
 }
 //삽입
 function sql_insert($TB_name,$Fild_data_s)
 {
  //필드 이름 삽입
  $Fild_name_s=$this->{$TB_name}[filds];
  //필드명 정의
  $Fild_name=split(",",$Fild_name_s);
  //필드개수
  $Fild_count=$this->{$TB_name}[fild_limit];

  //다음필드 배열수
  $Next_count=count($this->{$TB_name});

  //필드 명체크
  $Fild_data=split(",",$Fild_data_s);

  //삽입
  for($rof=0;$rof<$Fild_count;$rof++)
   $this->{$TB_name}[$Next_count][$Fild_name[$rof]]=$Fild_data[$rof];

  //현재 배열 개수저장
  $this->{$TB_name}[limit]=$Next_count-$this->Mem_db_TABLE_BASE_LIMIT_Num;

  //전달값
  return $Next_count;
 }
 //삽입
 function sql_drop($TB_name)
 {
  $this->{$TB_name}="";

 }

 //조건문 해석기
 function Search_query_data($querys)
 {
  $String_data=array();

  $querys_org=$querys;
  $Query_Operators_string=array(" and "," or ");

  $Query_counts=0;
  for($rof=0;$rof<count($Query_Operators_string);$rof++)
  {
   $Search_counts=count(explode($Query_Operators_string[$rof],$querys));
   if($Search_counts>1)
    $Query_counts+=$Search_counts-1;
  }

 
  for($rof_chk=0;$rof_chk<$Query_counts;$rof_chk++)
  {
   $Max_nums=100000;
   $Cut_values=0;
   for($rof=0;$rof<count($Query_Operators_string);$rof++)
   {
    $chk_counts_value=strpos($querys,$Query_Operators_string[$rof]);
    if($Max_nums>$chk_counts_value&&$chk_counts_value!==false)
    {
     $Cut_values=strlen($Query_Operators_string[$rof]);
     $Max_nums=$chk_counts_value;
     $String_data[0][$rof_chk]=$Query_Operators_string[$rof];
     break;
    }
   }
   $querys=substr($querys,$Max_nums+$Cut_values);
  }


  for($rof=0;$rof<count($String_data[0]);$rof++)
  {
   $start_point=strpos($querys_org,$String_data[0][$rof]);

   $datas_str_more=substr($querys_org,0,$start_point-1);
   $querys_org=substr($querys_org,$start_point+strlen($String_data[0][$rof]));
   $String_data[1][$rof]=$datas_str_more;
  }
  $String_data[1][$rof]=$querys_org;

  return $String_data;
 }
}

?>


----------------------------------------------------------------------------------


memdb.php


<?
$memdb=new Mem_SQL;

//  사용법 : sql_create("테이블명","필드1,필드2");
$memdb->sql_create("test","counts,names");

//  사용법 : sql_insert("테이블명","첫필드 데이터1,두번째 필드 데이터2");  //필드는 순서대로 입력
$memdb->sql_insert("test","10,자료3");
$memdb->sql_insert("test","20,자료2");
$memdb->sql_insert("test","30,자료1");
$memdb->sql_insert("test","40,자료4");

//  사용법 : sql_select("테이블명","추출필드1,추출필드1","조건(현재는 = 만 사용가능함 중복 검색시 and/or 가능)","정렬(desc) 기본 asc");
$item_data=$memdb->sql_select("test","counts,names","","names");

//  사용법 : sql_select_limit("테이블명");
$item_count=$memdb->sql_select_limit("test");

//  사용법 : sql_drop("테이블명");
$memdb->sql_drop("test");

//출력
for($i=0;$i<$item_count;$i++)
{
 echo $item_data[$i][counts]."-".$item_data[$i][names]."<br>";
}
?>


---------------------------------------------------------------------------------


php 프로세스 간의 db 공유가 가능하도록 기능을 추가할 계획이 없다면,
sqlite::memory: 도 좋은 방법입니다.

<?php

$db = new PDO('sqlite::memory:');
$db->exec('CREATE TABLE a (b, c)');
$db->exec('INSERT INTO a VALUES (1,2)');
$stmt = $db->query('SELECT * FROM a');
$data = $stmt->fetchAll();

print_r($data);

?>
역시 단점은 한 프로세스가 끝나면 데이터가 소실되기 때문에,
어디에 써야 할지를 모르겠다는 것이죠.

반응형