package net.jforum.tools.phpbb2jforum; import java.io.IOException; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import net.jforum.util.DbUtils; import net.jforum.util.preferences.SystemGlobals; import org.apache.commons.lang.StringUtils; /** * @author Rafael Steil * @version $Id: Main.java,v 1.12 2007/08/31 01:21:34 rafaelsteil Exp $ */ public class Main { private Connection conn; private Connection conn2; private String[][] regexps; public Main() { this.regexps = new String[][] { { ConfigKeys.B_REGEX, ConfigKeys.B_REPLACE }, { ConfigKeys.COLOR_REGEX, ConfigKeys.COLOR_REPLACE }, { ConfigKeys.I_REGEX, ConfigKeys.I_REPLACE }, { ConfigKeys.LIST_REGEX, ConfigKeys.LIST_REPLACE }, { ConfigKeys.QUOTE_REGEX, ConfigKeys.QUOTE_REPLACE }, { ConfigKeys.QUOTE_USERNAME_OPEN_REGEX, ConfigKeys.QUOTE_USERNAME_OPEN_REPLACE }, { ConfigKeys.QUOTE_USERNAME_CLOSE_REGEX, ConfigKeys.QUOTE_USERNAME_CLOSE_REPLACE }, { ConfigKeys.U_REGEX, ConfigKeys.U_REPLACE }, { ConfigKeys.IMG_REGEX, ConfigKeys.IMG_REPLACE }, { ConfigKeys.CODE_REGEX, ConfigKeys.CODE_REPLACE }, { ConfigKeys.SIZE_REGEX, ConfigKeys.SIZE_REPLACE } }; } private Connection openConnection() throws ClassNotFoundException, SQLException { Class.forName(SystemGlobals.getValue(ConfigKeys.DATABASE_DRIVER)); return DriverManager.getConnection(SystemGlobals.getValue(ConfigKeys.DATABASE_JFORUM_URL)); } private void init(String baseDir) throws IOException { SystemGlobals.initGlobals(baseDir, baseDir + "/phpbb2jforum/resource/SystemGlobals.properties"); SystemGlobals.loadQueries(baseDir + "/phpbb2jforum/resource/" + SystemGlobals.getValue(ConfigKeys.DATABASE_QUERIES)); } private void runForrestRun() throws Exception { this.cleanTables(); this.importUsers(); this.importTables(); this.importPrivateMessages(); this.importPosts(); this.setupPermissions(); } private void importPosts() throws SQLException { int total = this.getTotalPosts(); if (total == 0) { System.out.println("Seems like there are no posts to import. Skipping..."); return; } System.out.println("Importing posts. This may take a looooong time..."); System.out.println("Going to process " + total + " posts..."); int counter = 0; Statement s = null; ResultSet rs = null; PreparedStatement insert = null; try { s = this.conn2.createStatement(ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY); s.setFetchSize(50); insert = this.conn.prepareStatement(this.getSql(ConfigKeys.QUERY_POSTS_TEXT)); rs = s.executeQuery(this.getSql(ConfigKeys.QUERY_SELECT_POSTS_TEXT)); System.out.println("Ok, here we go"); while (rs.next()) { if ((++counter % 100) == 0) { System.out.println("Processed " + counter + " posts so far"); } insert.setInt(1, rs.getInt("post_id")); insert.setString(2, rs.getString("post_subject")); insert.setString(3, this.applyRegexToPostText(rs.getString("post_text"))); insert.executeUpdate(); } } finally { DbUtils.close(rs, insert); DbUtils.close(s); } System.out.println("Post importing done..."); } private void importPrivateMessages() throws SQLException { System.out.println("Importing private messages..."); Statement s = null; ResultSet rs = null; PreparedStatement insert = null; try { insert = this.conn.prepareStatement(this.getSql(ConfigKeys.QUERY_PRIVMSGS_TEXT)); s = this.conn.createStatement(ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY); s.setFetchSize(50); rs = s.executeQuery(this.getSql(ConfigKeys.QUERY_SELECT_PM)); while (rs.next()) { insert.setInt(1, rs.getInt("privmsgs_text_id")); insert.setString(2, this.applyRegexToPostText(rs.getString("privmsgs_text"))); insert.executeUpdate(); } } finally { DbUtils.close(rs, insert); DbUtils.close(s); } System.out.println("Private messages text imported..."); } private void importUsers() throws SQLException { System.out.println("Importing users..."); ResultSet rs = null; Statement s = null; PreparedStatement insert = null; try { insert = this.conn.prepareStatement(this.getSql(ConfigKeys.QUERY_USERS)); s = this.conn.createStatement(ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY); s.setFetchSize(50); rs = s.executeQuery(this.getSql(ConfigKeys.QUERY_SELECT_USERS)); while (rs.next()) { insert.setInt(1, rs.getInt("user_id")); insert.setString(2, rs.getString("user_active")); insert.setString(3, rs.getString("username")); insert.setString(4, rs.getString("user_password")); insert.setString(5, rs.getString("user_regdate")); insert.setString(6, rs.getString("user_level")); insert.setString(7, rs.getString("user_posts")); insert.setString(8, rs.getString("user_timezone")); insert.setString(9, rs.getString("user_style")); insert.setString(10, ""); insert.setString(11, rs.getString("user_dateformat")); insert.setString(12, rs.getString("user_new_privmsg")); insert.setString(13, rs.getString("user_unread_privmsg")); insert.setString(14, rs.getString("user_last_privmsg")); insert.setString(15, rs.getString("user_viewemail")); insert.setString(16, rs.getString("user_attachsig")); insert.setString(17, rs.getString("user_allowhtml")); insert.setString(18, rs.getString("user_allowbbcode")); insert.setString(19, rs.getString("user_allowsmile")); insert.setString(20, rs.getString("user_allowavatar")); insert.setString(21, rs.getString("user_allow_pm")); insert.setString(22, rs.getString("user_notify")); insert.setString(23, rs.getString("user_notify_pm")); insert.setString(24, rs.getString("user_popup_pm")); insert.setString(25, rs.getString("user_rank")); insert.setString(26, rs.getString("user_avatar")); insert.setString(27, rs.getString("user_avatar_type")); insert.setString(28, rs.getString("user_email")); insert.setString(29, rs.getString("user_icq")); insert.setString(30, rs.getString("user_website")); insert.setString(31, rs.getString("user_from")); insert.setString(32, this.applyRegexToPostText(rs.getString("user_sig"))); insert.setString(33, rs.getString("user_aim")); insert.setString(34, rs.getString("user_yim")); insert.setString(35, rs.getString("user_msnm")); insert.setString(36, rs.getString("user_occ")); insert.setString(37, rs.getString("user_interests")); insert.setString(38, rs.getString("user_allow_viewonline")); insert.executeUpdate(); } } finally { DbUtils.close(rs, insert); DbUtils.close(s); } } private String applyRegexToPostText(String text) { for (int i = 0; i < this.regexps.length; i++) { if (text == null) { text = ""; } else { text = text.replaceAll(SystemGlobals.getValue(this.regexps[i][0]), SystemGlobals.getValue(this.regexps[i][1])); } } return text; } private int getTotalPosts() throws SQLException { int total = 0; Statement s = null; ResultSet rs = null; try { s = this.conn.createStatement(); rs = s.executeQuery(this.getSql(ConfigKeys.QUERY_TOTAL_POSTS)); if (rs.next()) { total = rs.getInt(1); } } finally { DbUtils.close(rs, s); } return total; } private void cleanTables() throws SQLException { System.out.println("Cleaning tables..."); String[] queries = { ConfigKeys.QUERY_CLEAN_BANLIST, ConfigKeys.QUERY_CLEAN_CATEGORIES, ConfigKeys.QUERY_CLEAN_FORUMS, ConfigKeys.QUERY_CLEAN_POSTS, ConfigKeys.QUERY_CLEAN_POSTS_TEXT, ConfigKeys.QUERY_CLEAN_PRIVMSGS, ConfigKeys.QUERY_CLEAN_PRIVMSGS_TEXT, ConfigKeys.QUERY_CLEAN_RANKS, ConfigKeys.QUERY_CLEAN_SMILIES, ConfigKeys.QUERY_CLEAN_TOPICS, ConfigKeys.QUERY_CLEAN_TOPICS_WATCH, ConfigKeys.QUERY_CLEAN_USERS, ConfigKeys.QUERY_CLEAN_VOTE_DESC, ConfigKeys.QUERY_CLEAN_VOTE_RESULTS, ConfigKeys.QUERY_CLEAN_VOTE_VOTERS, ConfigKeys.QUERY_CLEAN_GROUPS, ConfigKeys.QUERY_CLEAN_USERGROUPS }; for (int i = 0; i < queries.length; i++) { System.out.println("Cleaning " + queries[i]); Statement s = this.conn.createStatement(); s.executeUpdate(this.getSql(queries[i])); s.close(); } System.out.println("Tables cleaned..."); } private void importTables() throws SQLException { String[][] queries = { { "categories", ConfigKeys.QUERY_CATEGORIES }, { "forums", ConfigKeys.QUERY_FORUMS }, { "private messages", ConfigKeys.QUERY_PRIVMSGS }, { "rankings", ConfigKeys.QUERY_RANKS }, { "topics", ConfigKeys.QUERY_TOPICS }, { "topics watch", ConfigKeys.QUERY_TOPICS_WATCH }, { "posts", ConfigKeys.QUERY_POSTS }, { "anonymous update", ConfigKeys.QUERY_UPDATE_ANONYMOUS }, { "banlist", ConfigKeys.QUERY_BANLIST }, { "Vote Desc", ConfigKeys.QUERY_VOTE_DESC }, { "Vote voters", ConfigKeys.QUERY_VOTE_VOTERS }, { "Vote results", ConfigKeys.QUERY_VOTE_RESULTS}, { "Groups", ConfigKeys.QUERY_GROUPS }, { "User groups", ConfigKeys.QUERY_USERGROUPS }, { "Anonymous user", ConfigKeys.QUERY_ANONYMOUSUSER_GROUP }, { "Admin group", ConfigKeys.QUERY_ADMINGROUP }, { "Admin role", ConfigKeys.QUERY_ADMINROLE } }; for (int i = 0; i < queries.length; i++) { System.out.println("Importing " + queries[i][0] + "..."); Statement s = null; try { s = this.conn.createStatement(); s.executeUpdate(this.getSql(queries[i][1])); } finally { DbUtils.close(s); } } } private void setupPermissions() throws SQLException { Statement s = null; ResultSet rs = null; PreparedStatement p = null; try { s = this.conn.createStatement(); rs = s.executeQuery(this.getSql(ConfigKeys.QUERY_MAXGROUPID)); if (rs.next()) { int groupId = rs.getInt(1); p = this.conn.prepareStatement(this.getSql(ConfigKeys.QUERY_ADMINUSERGROUPS)); p.setInt(1, groupId); p.executeUpdate(); } } finally { DbUtils.close(rs, p); DbUtils.close(s); } } private String getSql(String queryName) { String query = SystemGlobals.getSql(queryName); query = StringUtils.replace(query, "${phpbb}", SystemGlobals.getValue(ConfigKeys.DATABASE_PHPBB)); query = StringUtils.replace(query, "${table.prefix}", SystemGlobals.getValue(ConfigKeys.PHPBB_TABLE_PREFIX)); return query; } public static void main(String[] args) { Main program = new Main(); if (args.length != 1) { System.out.println("Usage: phpbb2jforum <base_directory>"); System.out.println("Example: phpbb2jforum c:/jforum/tools \n"); return; } try { program.init(args[0]); // We use autoCommit = true because if something wrong // happen, it's easier to just drop the database and create it again program.conn = program.openConnection(); program.conn.setAutoCommit(true); // We need a second connection because the forward-only // query we use later will block until the query is // complete and so we can't write the to new table will // reading from the old program.conn2 = program.openConnection(); program.conn2.setAutoCommit(true); long start = System.currentTimeMillis(); program.runForrestRun(); long end = System.currentTimeMillis() - start; System.out.println("\nDone!!!"); System.out.println("Migration was performed in about " + (end / 1000) + " seconds "); } catch (Exception e) { e.printStackTrace(); } finally { if (program.conn != null) { try { program.conn.close(); } catch (SQLException e) { } } if (program.conn2 != null) { try { program.conn2.close(); } catch (SQLException e) { } } } } }