공지

2006년 8월 30일 수요일

[펌] patch

많은 개발자들은 자신들이 개발하는 프로그램 소스의 버전을 유지하기 위해, 원소스 외에 패치파일을 준비한다. 일반적으로 패치파일은 diff를 사용해서 작성하고, 해당 패치파일을 적용할 때는 patch 명령어를 사용해 패치적용을 완료한다.
필자는 처음에 커널 공부를 할 때, 패치파일 사용으로 어려움을 겪은적이 있다. 실제 버전업된 커널 소스 파일 전체를 받는게 나은지, 아님, 하나의 커널 소스 파일을 斌? 패치 파일만 받는게 낳은지 잠시나마 고민했던 적도 있다.
따라서, diff 와 patch 파일은 커널에만 관련있는 내용은 아니나, 커널 패치와 유용히 사용될 수 있는 명령어이므로, 아래에서 살펴보고자 합니다.
기본 개념 및 사용법은 아래의 설명을 따라하기 식으로 해보면, 이해할 수 있을겁니다.


Diff 사용법

1. 두개의 빈 파일을 생성합니다.
[css@css ~]$ touch aaa bbb
[css@css ~]$ ls
aaa bbb


2. aaa에 아래의 라인을 추가합니다. (vi 사용법은 애플리케이션 소개란을 참고하세요. ^^) [css@css ~]$ vi aaa

This is first line // 라인을 추가합니다.


3. aaa 를 bbb로 복사하고, 새로운 라인을 추가합니다. [css@css ~]$ cp aaa bbb
[css@css ~]$ vi bbb
This is a first line
This is a second line // 라인 추가


4. aaa와 bbb의 변경 부분을 패치파일로 만듭니다. 그리고, 변경되는 부분이 패치파일에 어떻게 저장되나 확인합니다.
[css@css ~]$ diff -urN aaa bbb > mydiff.patch
[css@css ~]# cat mydiff.patch
--- aaa 2005-03-07 20:23:22.566188880 +0900
+++ bbb 2005-03-07 20:23:32.986604736 +0900
@@ -1 +1,2 @@
this is a first line
+this is a second line


5. bbb를 지우고, 패치파일의 내용을 aaa에 적용시킵니다. [css@css ~]$ rm -f bbb
[css@css ~]$ patch -p 0 < mydiff.patch
patching file aaa


6. aaa에 패치파일의 내용이 적용되었나 확인합니다.
[css@css ~]$ cat aaa
this is a first line
this is a second line // 라인이 추가되었음


php 4.X 버전에서 멀티 쿼리 쓰기

요구 조건 :
mysql server 4.1. 이상
libmysqlclient 버전 3306 이상
php-devel ( centos 나 redhat은 yum으로 깔끔하게 설치 가능)

방법 1
1)  기존 php-mysql은 대부분 함께 제공 되는 낮은버전의 libmysqlclient 를 쓰므로 최신 libmysqlclient로 다시 컴파일 하여 재설치( php-devel 필요)
2) 디비컨넥션 맻을시
          mysql_connect(server, user, passward , false , 65536 );

해당 컨넥션에서 멀티 쿼리가 가능하다.
           ex) $result = mysql_query( " select * from temp ; select * from temp2;");

단 이 경우는 php-mysql 에서 result_set 에 대한 메모리 처리를 안하므로 위와 같은 경우는
첫번째 쿼리의 result_Set에만 접근 가능하고 나머지 result_set은 메모리 누수 발생.....

그러므로
       ex) $result = mysql_query("
             insert something;
             update something;"
              );
등과 같이 result set이 없는 쿼리문만 사용 할 수 있음

방법 2
직접 php-mysql 확장을 수정 여타 result_set을 다룰 수 있는 모듈 작성
-- 멀티 result_set 지원은 따로 해줘야 할게 너무 많아서 GG

PS mysql 4.1 버전이상 innoDB를 사용 할 경우 transaction 도 사용할 수 있다.

     $result = mysql_query("
        start transaction ;
        insert something ~~;
        insert something2 ~~;
       commit;
     );

MYSQL PHP 꽁짜라고 우습게 볼게 아니더라...

관련 자료들
http://dev.mysql.com/doc/refman/4.1/en/c-api-multiple-queries.html mysql
http://kr2.php.net/manual/kr/zend.php  php 확장 모듈 및 코어 확장 자료

2006년 8월 21일 월요일

php의 스트링 처리 방식 및 확장 모듈에서의 스트링 처리 팁

php에서 스트링은 널문자를 허용한다.
<?
$someString = "some String include NULL Char \0 <=== 널문자 허용" ;
?>
<?=$someString?>

이 코드는 정확히
some String include NULL Char  <=== 널문자 허용
요거로 찍힌다.

일반적으로 NULL 문자의 포함은 php 코딩시에 별로 문제가 되지 않지만 확장 모듈 작성시에는 C 코드로 작성되기 때문에 스트링 처리 할때 주의를 기울여야 한다. C에서는 널문자가 스트링의 끝을 의미하므로 의도치 않은 결과가 나올 수 있다. strcpy 나 strlen 등은  C스타일의 스트링을 기준으로 작성되어 있으므로 위의 스트링과 같은 경우 나머지부분은 짤리게 된다.


php 확장 모듈 작성중 발견한 사실.... 해결은 금방 되었지만 ㅋㅋ 모르는게 너무 많다는게 느껴지는 경험 이었음