2015-03-16 13:18:20 -04:00
require 'mysql2'
2014-05-30 15:09:58 -04:00
require File . expand_path ( File . dirname ( __FILE__ ) + " /base.rb " )
2014-05-18 11:33:34 +10:00
2014-05-30 15:09:58 -04:00
class ImportScripts :: Bbpress < ImportScripts :: Base
2014-05-18 11:33:34 +10:00
2016-03-07 18:21:09 +01:00
BB_PRESS_DB || = ENV [ 'BBPRESS_DB' ] || " bbpress "
BATCH_SIZE || = 1000
2014-05-30 15:09:58 -04:00
def initialize
super
2014-05-18 11:33:34 +10:00
2014-05-30 15:09:58 -04:00
@client = Mysql2 :: Client . new (
host : " localhost " ,
username : " root " ,
2016-03-07 18:21:09 +01:00
database : BB_PRESS_DB ,
2014-05-30 15:09:58 -04:00
)
end
2014-05-18 11:33:34 +10:00
2016-03-07 18:21:09 +01:00
def execute
import_users
import_categories
import_topics_and_posts
2015-02-03 10:06:35 -08:00
end
2016-03-07 18:21:09 +01:00
def import_users
puts " " , " importing users... "
last_user_id = - 1
total_users = bbpress_query ( " SELECT COUNT(*) count FROM wp_users WHERE user_email LIKE '%@%' " ) . first [ " count " ]
batches ( BATCH_SIZE ) do | offset |
users = bbpress_query ( <<-SQL
SELECT id , user_nicename , display_name , user_email , user_registered , user_url
FROM wp_users
WHERE user_email LIKE '%@%'
AND id > #{last_user_id}
ORDER BY id
LIMIT #{BATCH_SIZE}
SQL
) . to_a
break if users . empty?
last_user_id = users [ - 1 ] [ " id " ]
user_ids = users . map { | u | u [ " id " ] . to_i }
next if all_records_exist? ( :users , user_ids )
user_ids_sql = user_ids . join ( " , " )
users_description = { }
bbpress_query ( <<-SQL
SELECT user_id , meta_value description
FROM wp_usermeta
WHERE user_id IN ( #{user_ids_sql})
AND meta_key = 'description'
SQL
) . each { | um | users_description [ um [ " user_id " ] ] = um [ " description " ] }
users_last_activity = { }
bbpress_query ( <<-SQL
SELECT user_id , meta_value last_activity
FROM wp_usermeta
WHERE user_id IN ( #{user_ids_sql})
AND meta_key = 'last_activity'
SQL
) . each { | um | users_last_activity [ um [ " user_id " ] ] = um [ " last_activity " ] }
create_users ( users , total : total_users , offset : offset ) do | u |
{
id : u [ " id " ] . to_i ,
username : u [ " user_nicename " ] ,
email : u [ " user_email " ] . downcase ,
name : u [ " display_name " ] ,
created_at : u [ " user_registered " ] ,
website : u [ " user_url " ] ,
bio_raw : users_description [ u [ " id " ] ] ,
last_seen_at : users_last_activity [ u [ " id " ] ] ,
}
end
2014-05-30 15:09:58 -04:00
end
2016-03-07 18:21:09 +01:00
end
2014-05-18 11:33:34 +10:00
2016-03-07 18:21:09 +01:00
def import_categories
puts " " , " importing categories... "
2015-03-20 15:54:42 -04:00
2016-03-07 18:21:09 +01:00
categories = bbpress_query ( <<-SQL
SELECT id , post_name , post_parent
FROM wp_posts
WHERE post_type = 'forum'
AND LENGTH ( COALESCE ( post_name , '' ) ) > 0
ORDER BY post_parent , id
SQL
)
2015-03-20 15:54:42 -04:00
2016-03-07 18:21:09 +01:00
create_categories ( categories ) do | c |
category = { id : c [ 'id' ] , name : c [ 'post_name' ] }
if ( parent_id = c [ 'post_parent' ] . to_i ) > 0
category [ :parent_category_id ] = category_id_from_imported_category_id ( parent_id )
2015-03-16 13:18:20 -04:00
end
2016-03-07 18:21:09 +01:00
category
2014-05-30 15:09:58 -04:00
end
end
2014-05-18 11:33:34 +10:00
2016-03-07 18:21:09 +01:00
def import_topics_and_posts
puts " " , " importing topics and posts... "
2014-05-30 15:09:58 -04:00
2016-03-07 18:21:09 +01:00
last_post_id = - 1
total_posts = bbpress_query ( <<-SQL
SELECT COUNT ( * ) count
FROM wp_posts
2015-02-03 10:06:35 -08:00
WHERE post_status < > 'spam'
2016-03-07 18:21:09 +01:00
AND post_type IN ( 'topic' , 'reply' )
SQL
) . first [ " count " ]
batches ( BATCH_SIZE ) do | offset |
posts = bbpress_query ( <<-SQL
SELECT id ,
post_author ,
post_date ,
post_content ,
post_title ,
post_type ,
post_parent
FROM wp_posts
WHERE post_status < > 'spam'
AND post_type IN ( 'topic' , 'reply' )
AND id > #{last_post_id}
ORDER BY id
LIMIT #{BATCH_SIZE}
SQL
) . to_a
break if posts . empty?
last_post_id = posts [ - 1 ] [ " id " ] . to_i
post_ids = posts . map { | p | p [ " id " ] . to_i }
next if all_records_exist? ( :posts , post_ids )
post_ids_sql = post_ids . join ( " , " )
posts_likes = { }
bbpress_query ( <<-SQL
SELECT post_id , meta_value likes
FROM wp_postmeta
WHERE post_id IN ( #{post_ids_sql})
AND meta_key = 'Likes'
SQL
) . each { | pm | posts_likes [ pm [ " post_id " ] ] = pm [ " likes " ] . to_i }
create_posts ( posts , total : total_posts , offset : offset ) do | p |
2014-05-30 15:09:58 -04:00
skip = false
2016-03-07 18:21:09 +01:00
post = {
id : p [ " id " ] ,
user_id : user_id_from_imported_user_id ( p [ " post_author " ] ) || find_user_by_import_id ( p [ " post_author " ] ) . try ( :id ) || - 1 ,
raw : p [ " post_content " ] ,
created_at : p [ " post_date " ] ,
like_count : posts_likes [ p [ " id " ] ] ,
}
if post [ :raw ] . present?
post [ :raw ] . gsub! ( " <pre><code> " , " ``` \n " )
post [ :raw ] . gsub! ( " </code></pre> " , " \n ``` " )
2015-03-20 15:54:42 -04:00
end
2014-05-30 15:09:58 -04:00
2016-03-07 18:21:09 +01:00
if p [ " post_type " ] == " topic "
post [ :category ] = category_id_from_imported_category_id ( p [ " post_parent " ] )
post [ :title ] = CGI . unescapeHTML ( p [ " post_title " ] )
2014-05-30 15:09:58 -04:00
else
2016-03-07 18:21:09 +01:00
if parent = topic_lookup_from_imported_post_id ( p [ " post_parent " ] )
post [ :topic_id ] = parent [ :topic_id ]
post [ :reply_to_post_number ] = parent [ :post_number ] if parent [ :post_number ] > 1
2014-05-30 15:09:58 -04:00
else
2016-03-07 18:21:09 +01:00
puts " Skipping #{ p [ " id " ] } : #{ p [ " post_content " ] [ 0 .. 40 ] } "
2014-05-30 15:09:58 -04:00
skip = true
end
end
2016-03-07 18:21:09 +01:00
skip ? nil : post
2014-05-30 15:09:58 -04:00
end
2014-05-18 11:33:34 +10:00
end
end
2016-03-07 18:21:09 +01:00
def bbpress_query ( sql )
@client . query ( sql , cache_rows : false )
end
2014-05-18 11:33:34 +10:00
end
2014-05-30 15:09:58 -04:00
ImportScripts :: Bbpress . new . perform