'use strict' /** * 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;