Spaces:
Sleeping
Sleeping
| /** | |
| * Copyright (c) 2017~2021, OBCon Inc. | |
| * All rights reserved. | |
| */ | |
| /** | |
| * @file | |
| * @copyright 2017~2021, OBCon Inc. | |
| * @author gye hyun james kim [pnuskgh@gmail.com] | |
| */ | |
| const Sequelize = require('sequelize'); | |
| const path = require('path');; | |
| const fs = require('fs'); | |
| const Batch = utils.getClass('include', 'batch.js'); | |
| //--- node bin/cms_batch.js --conf config_batch_override.js | |
| // conf['batch'] = { | |
| // path: ['modules', 'batch', 'MediaWikiDBToFile.js'], | |
| // options: {}, | |
| // waitTime: 1 | |
| // }; | |
| class MediaWikiDBToFile extends Batch { | |
| constructor() { | |
| super(); | |
| this._folder = 'C:/work/obcon/obcon/manual/service_cms_jopenbusiness/default/ko_KR/Jopenbusiness'; | |
| } | |
| async batchJob(options = {}, callback) { | |
| try { | |
| const sequelize = new Sequelize(options.database, options.username, options.password, options); | |
| let count = 0; | |
| let save_page_id = -1; | |
| let save_item = null; | |
| for (let idx of [ 0, 500, 1000, 1500, 2000, 2500, 3000, 3500, 4000, 4500, 5000 ]) { | |
| // for (let idx of [ 600, 610 ]) { | |
| let page_id_fr = idx; | |
| let page_id_to = idx + 500; | |
| // let page_id_to = idx + 20; | |
| // let page_id_fr = 602; | |
| // let page_id_to = 603; | |
| //--- page_namespace : 0. 일반, 6. 파일, 10. 틀, 14. 분류 | |
| let query = `\ | |
| SELECT a.page_id, a.page_namespace, a.page_title, b.rev_id, b.rev_parent_id, c.old_id, c.old_text \ | |
| FROM jopen_page a, jopen_revision b, jopen_text c \ | |
| WHERE ${page_id_fr} <= a.page_id \ | |
| AND a.page_id < ${page_id_to} \ | |
| AND a.page_namespace IN (0, 10, 14) \ | |
| AND a.page_is_redirect = 0 \ | |
| AND b.rev_deleted = 0 \ | |
| AND a.page_id = b.rev_page \ | |
| AND b.rev_text_id = c.old_id \ | |
| ORDER BY a.page_namespace DESC, a.page_id ASC, b.rev_parent_id ASC`; | |
| let data = await sequelize.query(query, { type: Sequelize.QueryTypes.SELECT, tableHint: Sequelize.TableHints.NOLOCK }); | |
| for (let item of data) { | |
| // console.log(`Read ${item.page_namespace}, ${item.page_id}, ${item.page_title}, ${item.rev_parent_id}, ${item.old_id}`); | |
| if (save_page_id == -1) { | |
| save_page_id = item.page_id; | |
| save_item = item; | |
| // console.log(` save page_id : ${save_item.page_id}, ${save_item.rev_parent_id}`); | |
| continue; | |
| } | |
| if (item.page_id != save_page_id) { | |
| count = count + 1; | |
| // console.log(`saveFile ${count} : ${save_item.page_namespace}, ${save_item.page_id}, ${save_item.page_title}, ${save_item.rev_parent_id}, ${save_item.old_id}`); | |
| this.saveFile(count, save_item); | |
| save_page_id = item.page_id; | |
| save_item = item; | |
| // console.log(` save page_id : ${save_item.page_id}, ${save_item.rev_parent_id}`); | |
| } else { | |
| // console.log(` Skip ${save_page_id} : ${save_item.page_namespace}, ${save_item.page_id}, ${save_item.page_title}, ${save_item.rev_parent_id}`); | |
| save_item = item; | |
| } | |
| } | |
| } | |
| if (save_item != null) { | |
| count = count + 1; | |
| console.log(`saveFile ${count} : ${save_item.page_namespace}, ${save_item.page_id}, ${save_item.page_title}, ${save_item.old_id}`); | |
| this.saveFile(count, save_item); | |
| } | |
| console.log(''); | |
| callback(0, 'ok'); | |
| } catch (error) { | |
| console.log(error); | |
| callback(101, JSON.stringify(error)); | |
| } | |
| } | |
| saveFile(count, item) { | |
| let folder = null; | |
| let filename = `${item.page_title}.mediawiki`; | |
| if (-1 < filename.indexOf('/')) { | |
| let data = filename.split('/'); | |
| switch (data.length) { | |
| case 4: | |
| folder = `${data[0]}/${data[1]}/${data[2]}`; | |
| filename = data[3]; | |
| if ((folder != null) && (!fs.existsSync(path.join(this._folder, 'folderMediawiki', folder)))) { | |
| fs.mkdirSync(path.join(this._folder, 'folderMediawiki', folder)); | |
| } | |
| break; | |
| case 3: | |
| folder = `${data[0]}/${data[1]}`; | |
| filename = data[2]; | |
| if ((folder != null) && (!fs.existsSync(path.join(this._folder, 'folderMediawiki', folder)))) { | |
| fs.mkdirSync(path.join(this._folder, 'folderMediawiki', folder)); | |
| } | |
| break; | |
| default: | |
| folder = data[0]; | |
| filename = data[1]; | |
| if ((folder != null) && (!fs.existsSync(path.join(this._folder, 'folderMediawiki', folder)))) { | |
| fs.mkdirSync(path.join(this._folder, 'folderMediawiki', folder)); | |
| } | |
| break; | |
| } | |
| } | |
| switch (item.page_namespace) { | |
| case 14: filename = `분류_${filename}`; break; | |
| case 10: filename = `틀_${filename}`; break; | |
| } | |
| if (item.old_text == null) { | |
| if (folder == null) { | |
| console.log(`Makefile skip null : ${count}, ${item.page_title}.mediawiki, ${filename}`); | |
| } else { | |
| console.log(`Makefile skip null : ${count}, ${item.page_title}.mediawiki, ${folder}, ${filename}`); | |
| } | |
| } else { | |
| if (folder == null) { | |
| console.log(`Makefile : ${count}, ${item.page_title}.mediawiki, ${filename}`); | |
| fs.writeFileSync(path.join(this._folder, 'folderMediawiki', filename), item.old_text,'utf-8'); | |
| } else { | |
| console.log(`Makefile : ${count}, ${item.page_title}.mediawiki, ${folder}, ${filename}`); | |
| fs.writeFileSync(path.join(this._folder, 'folderMediawiki', folder, filename), item.old_text,'utf-8'); | |
| } | |
| } | |
| } | |
| } | |
| module.exports = MediaWikiDBToFile; | |