2009-11-11 2 views
0

사이트를 새로운 서버로 미러링해야한다는 과제가 있습니다. 이전 사이트에는 필자가 내부적으로 볼 수있는 몇 가지 Perl 스크립트가 있습니다 (일반적으로 코딩에 대해 잘 알고 있지만 Perl에 대해서는 알지 못합니다. 특히 PHP/js/등)는 예전에 의존하지 않습니다. 섬기는 사람. 즉, 데이터베이스 파일을 통해 적절한 기사 파일을 찾는이 스크립트를 실행하려고하면 아무것도 검색되지 않습니다.펄 스크립트/dbm을 새 서버로 이동하고 dbm 밖으로 이동 하시겠습니까?

기본적으로,이 파일은 PAG 파일에서 파일 이름을 검색하여 표시 한 것으로, 기본적으로 오래된 CMS입니다. 나는 여기서 조금 잃어 버렸다. 미러링이 새 사이트에서 작동하지 않는 이유가 있습니까? 퍼미션을 체크했는데 Perl이 같은 /usr/etc 디렉토리에 설치되어 있는지 확인했습니다.

dbmopen(%ARTS, $art_dbm, 0644); 
$entry = $ARTS{$article_id}; 
dbmclose(%ARTS); 

그것은 바로, DBM해야합니다 : 나는 내가 다음과 같은 명령을 참조하면, according to another article 때문에 DBM을 사용하여 생각?

관련된 참고로, 엄청나게 정교한 Perl 스크립트없이 해당 PAG 파일의 정보를 원본 파일과 병합 할 수있는 방법이 있습니까? 별도로 저장하기보다는 파일 자체에 해당 정보가 포함 된 100 개의 텍스트 파일을 다시 만드십시오.

편집 : 아래의 첫 번째 답변에 감사드립니다. 그 해시가 무엇이겠습니까, 그리고 가면을 설명 할 수 있습니까? 필자는 .pag 파일 (데이터베이스 이름)이 실제로 .pl 파일에서 정의 된 위치에 있고 이진 파일로 전송되었다는 사실을 다시 확인했습니다. 아직 어쨌든 나는 그것을 정확하게 열 수 없습니다!

편집 3 : 좋아, 죄송합니다, 현재 최종 편집 : 나는 다이 코드 아래 (Shwern을)를 사용하고 거기에도 불구하고, 즉 DB 파일을 발견되지 않은 (두 파일이 articles.pag 및 기사 것을 발견했다. dir, 변수는 확장자가없는 "articles"만 참조) 올바른 권한과 올바른 권한으로 ... 여기서 질문은 이제 도대체 어떻게되고있는 것입니까? perl의 다른 버전입니까? 아니면 그냥 바보 같은 짓하고있는거야? 기록 (예, 그 끔찍한)을 위해 나는 아직 쉘 접근을하지 못했다. 그러나 나는 그것에 대해 연구 중이다 ... 나는 나의 "새로운 웹"기술 때문에 이것을 해달라는 요청을 받았으며, 나는 확실히 적절하지 않다. perl이나 dbm과 같은 사람이긴하지만 파일을 읽고 이해할 수는 있습니다. 마지막 제안으로서, 누군가는 ASCII 서버 덤프를 수행 할 원래 서버 사용자 (코더가 아닌)에게 어떻게 요청할 수 있는지 (스크립트 등) 알고 있습니까? 이걸 CSV로 가져 와서 파일로 다시 가져 와서 다른 DB에서 그것을 재사용 할 수 있어야합니다 ... 어쩌면 악몽일까요!

답변

1

질문을 올바르게 읽으면 새 컴퓨터에서 데이터베이스를 여는 데 어려움을 겪고 있습니다. 거기에 데이터베이스가 존재합니까?

dbmopen 메서드에 대한 설명은 perldoc -f dbmopen을 통해 명령 줄에서 사용할 수 있습니다 (최신 stable perl 릴리스는 5.10.1).

문서에서 볼 수 있듯이 dbmopen의 두 번째 인수에는 파일 이름이 열립니다. 붙여 넣은 코드에는 스칼라 변수 $art_dbm에 포함되어 있습니다. 그래서 여러분이해야 할 일은이 변수에 대한 초기 선언을 찾는 것입니다 (아마도 설정 파일에서로드되거나 하드 코딩 될 수 있습니다). 그런 다음 DB를 찾으면 필요한 파일을 새 컴퓨터로 전송해야합니다.

코드를 해독하는 데 도움이 더 필요하면 코드 스 니펫으로 질문을 수정하면됩니다.

는 (데이터베이스를 발견했습니다하지만 당신은 단지 그것을 열 수없는 경우에 지금, 당신은 PAG 그러나 파일을 내가 처리 이후 오랜 시간이되었습니다 .. 다른 문제가 생겼어요.)

1

원래 컴퓨터에 계속 액세스 할 수 있습니까?

DBM 파일을 사용하고 있지만 실제 기능은 여러 구현 중 하나에서 제공 될 수 있으며 일부는 호환되지 않습니다. 내가 만든 파일과 동일한 펄을 사용하여 파일을 덤프 한 다음 새 perl로 파일을 다시 작성합니다.

0

잘못 될 수있는 몇 가지 사항이 있습니다. 가장 확실한 것은 dbmopen() 호출이 파일을 열지 않는다는 것입니다. dbmopen()이 실패하지 않고 DBM 파일이 존재하지 않으면 그냥 비어있는 것처럼 보이는 새 파일을 만듭니다.

이러한 가능성을 제거하려면 DBM 파일이 존재하고 읽을 수 있어야합니다. 또한 dbmopen()이 성공했는지 확인하기를 원할 경우 잘못된 형식 일 경우 (일반적으로) 오류가 발생합니다.

die "$art_dbm does not exist" unless -e $art_dbm; 
die "Cannot read $art_dbm" unless -r $art_dbm; 
dbmopen(%ARTS, $art_dbm, 0644) or die "dbmopen of $art_dbm failed: $!"; 

불행히도 dbmopen()은 자신의 이익을 위해 너무 영리합니다. "foo"라고 지정하면 일 수도 있고은 "foo.db"를 대신 생성 할 수 있습니다. 구현에 따라 다릅니다. 아래를 참조하십시오.

또 다른 가능성은 두 개의 Perl이 두 개의 서로 다른 DBM 구현으로 파일을 여는 중입니다. Perl은 다른 머신에서 DBM 구현 세트로 컴파일 될 수 있습니다. dbmopen()은 하드 코딩 된 (그리고 역사적으로 barnacled) 목록에서 첫 번째 것을 사용합니다. 실제로 AnyDBM_File 주위 래퍼입니다. 어떤 구현을 사용하고 있는지 확인할 수 있습니다 ...

use AnyDBM_File; 
print "@AnyDBM_File::ISA\n"; 

동일해야합니다. 그렇지 않다면 dbmopen을 사용하기 전에 해당 DBM 라이브러리를로드하십시오. perldoc -f dbmopen가 설명합니다.

다음은 데모입니다. 먼저 dbmopen()이 기본값으로 사용하는 것을 확인합니다.

$ perl -wle 'use AnyDBM_File; print "@AnyDBM_File::ISA"' 
NDBM_File 

그런 다음 dbm 파일을 만들고 채 웁니다.

$ perl -wle 'dbmopen(%foo, "tmpdbm", 0644) or die $!; $foo{23} = 42; print %foo' 
2342 

이제 우리는 그것을 읽을 수 있음을 보여줍니다.

$ perl -wle 'dbmopen(%foo, "tmpdbm", 0644) or die $!; print %foo' 
2342 

그리고 다른 DBM 구현을 사용하여 읽으십시오.

$ perl -wle 'use GDBM_File; dbmopen(%foo, "tmpdbm", 0644) or die $!; print %foo' 

아무 것도 오류가 없습니다. tdbdbm이라는 파일을 만들었지 만 ndbm은 tmpdbm.db를 사용하고있었습니다. Berkeley DB를 사용해 봅시다.

$ perl -wle 'use DB_File; dbmopen(%foo, "tmpdbm", 0644) or die $!; print %foo' 
Inappropriate file type or format at -e line 1. 

적어도 오류가 발생합니다.

가장 좋은 방법은 dbmopen() 호출 이전에 원래의 기계가 사용하고있는 DBM 구현을 파악하고 해당 모듈을 사용하는 것입니다. 그것은 상황을 정적으로 만들 것입니다.

추신 : 유닉스 file 유틸리티는 어떤 유형의 DBM 인지도 알려줍니다.

$ file tmpdbm 
tmpdbm: GNU dbm 1.x or ndbm database, little endian 
$ file tmpdbm.db 
tmpdbm.db: Berkeley DB 1.85 (Hash, version 2, native byte-order) 

그리고이 $diety이 아니 바이트 순서 문제에 희망을, 일반적이지 지금은 거의 모든 86입니다.

PPS 아시다시피 DBM 파일을 사용하는 것은 다소 엉망입니다. 디스크 해시 일 뿐이라고 생각하는 이상.