Guest User

Untitled

a guest
Apr 18th, 2018
85
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.75 KB | None | 0 0
  1. package hoffrocket
  2.  
  3.  
  4. import _root_.net.liftweb.mapper._
  5. import _root_.java.sql.{PreparedStatement,Types, Connection,DriverManager}
  6. import scala.collection.mutable.HashMap
  7. import _root_.net.liftweb.util._
  8. import Helpers._
  9.  
  10. /**
  11. Usage Example:
  12.  
  13. val fromDbMan = new DbMigrator.SimpleConnManager("com.mysql.jdbc.Driver","jdbc:mysql://localhost/mydb",Full("user"),Full("pass"))
  14. val toDbMan = new DbMigrator.SimpleConnManager("org.h2.Driver","jdbc:h2:~/test;DB_CLOSE_DELAY=-1",None,None)
  15. val batchSize = 1000
  16. DbMigrator.migrate(fromDbMan, toDbMan, batchSize, User, Dog, Employee, Etc)
  17.  
  18. println("The counts should be equal: " + User.countDb(DbMigrator.FromConnectionIdentifier) == User.countDb(DbMigrator.ToConnectionIdentifier))
  19. */
  20. object DbMigrator {
  21.  
  22. def metaCast[T <: MetaMapper[T]](s:Any):T = s.asInstanceOf[T]
  23. def findSlice[T <: Mapper[T]](mapper: KeyedMetaMapper[_,T], start:Long, maxRows:Long):List[Mapper[T]] = mapper.findAllDb(FromConnectionIdentifier, StartAt(start), MaxRows(maxRows), OrderBy(mapper.primaryKeyField, Ascending))
  24.  
  25. def migrate(fromManager:ConnectionManager, toManager:ConnectionManager, batchSize:Long, tables:KeyedMetaMapper[_,_]*) {
  26.  
  27. DB.defineConnectionManager(FromConnectionIdentifier, fromManager)
  28. DB.defineConnectionManager(ToConnectionIdentifier, toManager)
  29.  
  30. Schemifier.schemify(true, Log.infoF _, ToConnectionIdentifier, tables:_*)
  31. for (table <- tables){
  32. val mappedColumnsMethod = table.getClass.getMethod("net$liftweb$mapper$MetaMapper$$mappedColumns")
  33. val mappedColumns = mappedColumnsMethod.invoke(table).asInstanceOf[HashMap[String,java.lang.reflect.Method]]
  34. val query = "INSERT INTO "+table.dbTableName+" (" + mappedColumns.map(_._1).mkString(",") + ") VALUES ("+ mappedColumns.map(p=>"?").mkString(",") + ")"
  35. Log.info("INSERTING with " + query)
  36.  
  37. def batchCopy(start:Long) {
  38. findSlice(metaCast(table), start, batchSize) match {
  39. case Nil =>
  40. case records => {
  41. DB.use(ToConnectionIdentifier){
  42. conn=> {
  43. def prepStat(record: Any,st: PreparedStatement) {
  44. var colNum = 1
  45.  
  46. for (col <- mappedColumns) {
  47. val colVal = col._2.invoke(record).asInstanceOf[MappedField[AnyRef, _]]
  48. colVal.targetSQLType(col._1) match {
  49. case Types.VARCHAR =>
  50. st.setString(colNum, colVal.jdbcFriendly(col._1).asInstanceOf[String])
  51.  
  52. case _ => st.setObject(colNum, colVal.jdbcFriendly(col._1), conn.driverType.columnTypeMap(colVal.targetSQLType(col._1)))
  53. }
  54. colNum = colNum + 1
  55. }
  56. }
  57. DB.prepareStatement(query, conn){ stmt =>
  58. for(record <- records){
  59. prepStat(record, stmt)
  60. stmt.addBatch
  61. }
  62. Log.info("\tExecuting a batch")
  63. stmt.executeBatch
  64. }
  65. }
  66. }
  67.  
  68. if (records.length == batchSize) {
  69. batchCopy(start + batchSize)
  70. }
  71. }
  72. }
  73. }
  74.  
  75. batchCopy(0L)
  76. }
  77.  
  78. }
  79.  
  80. class SimpleConnManager(driver:String, url:String, username:Box[String],password:Box[String]) extends ConnectionManager {
  81. def newConnection(name: ConnectionIdentifier): Box[Connection] = {
  82. try {
  83. Class.forName(driver)
  84. val dm = (username, password) match {
  85. case (Full(user), Full(pwd)) => DriverManager.getConnection(url, user, pwd)
  86. case _ => DriverManager.getConnection(url)
  87. }
  88. Full(dm)
  89. } catch {
  90. case e : Exception => e.printStackTrace; Empty
  91. }
  92. }
  93. def releaseConnection(conn: Connection) {conn.close}
  94. }
  95.  
  96. case class NamedConnectionIdentifier(jndiName:String) extends ConnectionIdentifier
  97. case object ToConnectionIdentifier extends NamedConnectionIdentifier("migrateTo")
  98. case object FromConnectionIdentifier extends NamedConnectionIdentifier("migrateFrom")
  99. }
Add Comment
Please, Sign In to add comment