vbulletin5.rb 가져오기 스크립트

공식 vBulletin v5 가져오기 스크립트를 사용 중이며 문제가 발생했습니다.

제 vBulletin 포럼 구조는 다음과 같습니다:

/forum/
/forum/sub-category1/
/forum/sub-category1/thread1/
/forum/sub-category1/thread2/
/forum/sub-category2/
/forum/sub-category2/thread1/
/forum/sub-category2/thread2/

가져오기 스크립트를 실행하면 Discourse에서 스레드가 없는 두 개의 카테고리가 생성됩니다:

/c/sub-category1
/c/sub-category2

다른 vBulletin 포럼을 확인해 보니 URL을 중첩하지 않는 것을 알게 되었습니다. 이제 스크립트를 사용하려면 포럼 구조를 다음과 같이 변경해야 한다고 가정합니다:

/forum/
/forum/sub-category1/
/forum/sub-category2/
/forum/thread1a/
/forum//thread2a/
/forum/thread1b/
/forum//thread2b/

그 후 모든 스레드에 카테고리를 다시 수동으로 지정해야 합니다.

이 스크립트를 사용해 본 경험이 있는 분이 계신가요?

스크립트 내부에서 더 중첩된 구조를 처리할 수 있도록 변경할 수 있는 부분이 있을까요? 제 접근 방식 자체가 완전히 틀렸을 수도 있습니다.

“스레드”라고 하셨을 때, 디스코ourse의 주제(Topic)를 말씀하시는 건가요? 주제는 생성되는데 올바른 카테고리에 표시되지 않는 건가요?

제이님,

답장 주셔서 감사합니다.

아, 네 - 제가 말씀드린 것은 디스커스(Discourse) 주제(Topics)입니다. 빈 카테고리들만 있고 다른 것은 아무것도 없습니다. 그리고 모든 사용자는 성공적으로 가져와졌습니다.

마이크

무언가가 주제와 게시물의 가져오기를 방해하고 있습니다. 실행 시 오류가 표시되어야 할 것 같은데, 주제와 게시물은 사용자의 가져오기 후에 생성됩니다. 주제와 게시물은 별도의 함수에서 처리된다고 생각합니다. 가져오기 도구가 사용자의 경우처럼 주제와 게시물에 대한 진행 상황도 표시해야 합니다.

가져오기 과정에서 오류 메시지는 발생하지 않으며, create_users 함수가 실행될 때 잘못된 사용자 이메일 주소에 대한 경고 몇 가지만 표시됩니다. 하지만 결국 사용자 가져오기는 성공적으로 완료됩니다. 로그는 다음과 같습니다(고객 이메일 주소를 포함하고 있어 경고를 제거했습니다):

importing posts...
5 / 5 (100.0%)  [290527 items/min]                                                            
importing attachments...   
20182 / 5 (403640.0%)

여기서 제 생각에는 5개의 카테고리를 게시글로 인식하여 가져오고, 실제 가져오지 않은 주제에 대한 첨부 파일은 어떻게 처리해야 할지 모르는 것 같습니다.

면책 조항:

처음에는 가져오기가 실패했는데, 주어진 vBulletin 데이터베이스에 customprofilepic 테이블이 없어서였습니다. 저는 여기에 빈 테이블을 추가했습니다.

또한 사용자 정의 아바타가 없었기 때문에 가져오기 스크립트에서 참조되는 AVATAR_DIR는 제가 만든 빈 폴더일 뿐입니다. 가져오기 스크립트에서 해당 자산을 참조하던 다음 줄들을 주석 처리했습니다:

create_users(users, total: user_count, offset: offset) do |user|
        username = @htmlentities.decode(user["username"]).strip
        {
          id: user["userid"],
          name: username,
          username: username,
          email: user["email"].presence || fake_email,
          admin: user['admin'] == 1,
          password: user["password"],
          website: user["homepage"].strip,
          title: @htmlentities.decode(user["usertitle"]).strip,
          primary_group_id: group_id_from_imported_group_id(user["usergroupid"]),
          created_at: parse_timestamp(user["joindate"])
          # post_create_action: proc do |u|
          #   @old_username_to_new_usernames[user["username"]] = u.username
          #   import_profile_picture(user, u)
          #   import_profile_background(user, u)
          # end
        }
      end

하지만 제 이해로는, 이러한 변경 사항은 사용자 생성에만 영향을 미칩니다. 그리고 사용자는 성공적으로 생성됩니다.

제가 사용하는 전체 가져오기 스크립트는 다음과 같습니다:

해당 스크립트는 vBulletin 데이터베이스의 node 테이블에서 모든 주제를 수집합니다. 이 테이블에는 약 34,000개의 게시물이 저장되어 있습니다. 컬럼 이름은 스크립트에서 참조하는 것과 동일합니다:

그냥 바로 작동할 것 같은데 :roll_eyes:

가져오기 스크립트는 게시물을 생성하기 위해 contenttypeid=23과 contenttypeid=22를 검색합니다.

node 테이블을 빠르게 살펴본 결과, __23__은 첨부파일이 있는 게시물을, __22__는 첨부파일 자체를 나타내는 것 같습니다.

대부분의 게시물은 첨부파일 없이 contenttypeid=21입니다. 그런데 이러한 게시물에 대한 가져오기는 보이지 않습니다. 아니면 다음 코드에서 처리되는 것일까요?

post_count = mysql_query("SELECT COUNT(nodeid) cnt FROM #{DBPREFIX}node WHERE parentid NOT IN (
SELECT nodeid FROM #{DBPREFIX}node WHERE contenttypeid=23 ) AND contenttypeid=22;").first["cnt"]

이 코드는 23/22에 대한 가져오기가 완료된 후 남은 모든 항목을 처리합니다. 하지만 23/22/21 외에도 다른 콘텐츠 유형 ID가 있으므로, 이 경우에도 해당 항목들이 함께 가져와질 것입니다.


그리고 카테고리들은 미리 설정된 ROOT_NODE인 __2__를 기준으로 가져와집니다. 제 “3단계 중첩” URL을 지원하려면 이를 3으로 설정해야 할까요?

업데이트: 방금 ROOT_NODE=3으로 가져오기를 다시 실행해 보았지만 아무런 변화가 없었습니다

vBulletin이 스크립트가 기대하는 것과 다른 것 같습니다. 게시글을 가져오기 전에, 왜 아무 주제도 생성되지 않았는지 원인을 파악해야 합니다.

알겠습니다. 문제가 발생하는 부분은 contenttypeid입니다:

def import_categories
    puts "", "importing top level categories..."

    categories = mysql_query("SELECT nodeid AS forumid, title, description, displayorder, parentid
	      FROM #{DBPREFIX}node
          WHERE parentid=#{ROOT_NODE}
        UNION
          SELECT nodeid, title, description, displayorder, parentid
          FROM #{DBPREFIX}node
          WHERE contenttypeid = 20
            AND parentid IN (SELECT nodeid FROM #{DBPREFIX}node WHERE parentid=#{ROOT_NODE})").to_a

예를 들어 import_categories 함수는 contenttypeid = 23을 사용하는데, 이는 스크립트가 게시글에 사용하는 ID와 동일합니다. 카테고리의 ID는 20입니다. 스크립트 내부에서 이 값을 변경한 후 마침내 하위 카테고리/토픽을 볼 수 있게 되었습니다 :raised_hands:

이제 남은 것은 스레드/게시글뿐입니다

VBulletin5 가져오기에 대한 몇 가지 업데이트를 포함하여 pull request를 만들었습니다. 가장 중요한 변경 사항 중 하나는 이러한 하드코딩된 ID를 제거했다는 것입니다.

또한 업로드에 대한 지원이 개선되었으며, 가져오기가 이제 태그를 가져오고 주제 및 (하위) 카테고리에 대한 영구 링크(permalinks)를 생성합니다.