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 にはスレッドが一つもない 2 つのカテゴリが作成されてしまいます。

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

別の vBulletin フォーラムを確認したところ、URL のネスト構造を採用していないことがわかりました。そのため、スクリプトを使用できるようになる前に、フォーラムの URL 構造を以下のように変更する必要があると推測しています。

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

その後、すべてのスレッドに対してカテゴリを手動で割り当て直す必要があります。

このスクリプトを使用した経験のある方はいますか?

もしかすると、スクリプト内に「よりネストされた構造にも対応できるよう修正できる箇所」があるかもしれません。私の推測が完全に的外れである可能性もありますが、ご存知の方がいらっしゃれば教えてください。

「スレッド」とはディスカッションのトピックのことですか?トピックは作成されているが、正しいカテゴリに入っていないのでしょうか?

やあジェイ、

返信ありがとう。

ああ、そうね——Discourseのトピックのことだよ。そこには空のカテゴリしかなくて、すべてのユーザーは正常にインポートされたわ。

マイク

何かがトピックや投稿のインポートを妨げています。実行時にエラーが表示されるはずです。トピックと投稿は、ユーザーの後に作成されます。トピックと投稿は別々の関数にあると思います。インポーターは、ユーザーの場合と同様に、それらの進捗状況を表示するはずです。

インポート中にエラーメッセージは表示されません。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=23contenttypeid=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 も存在するため、それらも対象となってしまいます。


カテゴリは、2 に事前設定された ROOT_NODE を基準としてインポートされます。「3 階層ネストされた」URL をサポートするために、これを 3 に変更する必要があるかもしれません。

更新:ROOT_NODE=3 でインポートを再実行しましたが、何も変化しませんでした。

お使いの vBulletin は、スクリプトが想定しているものと異なるようです。投稿をインポートできるようになる前に、なぜトピックが一つも作成されなかったのか原因を特定する必要があります。

はい、問題は contenttypeid にあります:

def import_categories
    puts "", "トップレベルのカテゴリをインポート中..."

    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 インポーターの更新を含むプルリクエストを作成しました。最も重要な変更点の一つは、これらのハードコードされた ID が削除されたことです。

また、アップロードのサポートが強化され、インポーターはタグをインポートし、トピックおよび(サブ)カテゴリのパーマリンクを作成するようになりました。