Advertisement
Guest User

Untitled

a guest
Aug 22nd, 2017
111
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. 'use strict'
  2.  
  3. const { Client } = require('pg')
  4.  
  5. const table = process.argv[2]
  6. const limit = parseInt(process.argv[3], 10) || 0
  7. const st = parseInt(process.argv[4], 10) || 0
  8.  
  9. console.log(table, limit)
  10. const db = new Client({
  11.   host: "db2.eu.skies.zone",
  12.   user: "postgres",
  13.   password: "fFVejV2QgEIc7RWA5DyE",
  14.   database: "skies_0"
  15. })
  16.  
  17. const backup = new Client({
  18.   host: "localhost",
  19.   user: "postgres",
  20.   password: "",
  21.   database: "skies_backup"
  22. })
  23.  
  24. async function start() {
  25.   await db.connect()
  26.   await backup.connect()
  27.  
  28.   let total = limit
  29.  
  30.   if (!total) {
  31.     const count = await db.query(`SELECT COUNT(*) FROM "${ table }"`)
  32.     total = parseInt(count.rows[0].count, 10)
  33.   }
  34.  
  35.   console.log(`Prepare to migrate ${ total } rows`)
  36.  
  37.   let offset = st
  38.   const ranges = []
  39.   while (offset < total) {
  40.     ranges.push([offset, 1])
  41.     offset += 1
  42.   }
  43.  
  44.   let completed = 0
  45.  
  46.   const damaged = []
  47.  
  48.   while (ranges.length) {
  49.     const [offset, limit] = ranges.shift()
  50.  
  51.     try {
  52.       console.log(`Checking range ${ offset }-${ offset + limit }`)
  53.       const res = await db.query(`SELECT * FROM "${ table }" OFFSET $1::numeric LIMIT $2::numeric`, [offset, limit])
  54.       completed += res.rows.length
  55.       await insert(backup, table, res.rows)
  56.  
  57.       console.log(`Completed ${ completed }`)
  58.     } catch (e) {
  59.       console.error(e.message)
  60.       if (limit === 1) {
  61.         damaged.push(offset)
  62.         continue
  63.       }
  64.  
  65.       const l = Math.floor(limit / 2)
  66.       ranges.unshift([offset, l], [offset + l, limit - l])
  67.     }
  68.  
  69.   }
  70.  
  71.   console.log(`Completed: ${ completed }, damaged: ${ damaged.length }`)
  72.   console.log(`Damaged rows: ${ damaged.join(', ') }`)
  73.  
  74.   await backup.end()
  75.   await db.end()
  76. }
  77.  
  78. start().catch(console.error.bind(console))
  79.  
  80. function insert(db, table, payload) {
  81.   const keys = Object.keys(payload[0])
  82.   const values = []
  83.   const data = []
  84.   let ii = 1
  85.   for (const item of payload) {
  86.     const chunk = []
  87.  
  88.     for (const key of keys) {
  89.       chunk.push(`$${ ii++ }`)
  90.       data.push(item[key])
  91.     }
  92.  
  93.     values.push(`(${ chunk.join(', ') })`)
  94.   }
  95.  
  96.   return db.query(`INSERT INTO ${ table }(${ keys.join(", ") }) VALUES ${ values.join(", ") }`, data)
  97. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement