Files
invbrain.neuroinf.jp/etc/dumpCosmoDB.php
T
2020-01-06 13:03:45 +09:00

194 lines
7.0 KiB
PHP

<?php
require_once __DIR__.'/common.inc.php';
if (!isset($XOOPS_MODULE_COSMODB) || empty($XOOPS_MODULE_COSMODB)) {
exit('Not configured for cosmodb module'.PHP_EOL);
}
foreach ($XOOPS_MODULE_COSMODB as $dirname) {
dumpCosmoDB($dirname);
}
function dumpCosmoDB($dirname)
{
global $xoopsDB;
$config = [];
if (!MyDumpTool::canModuleRead($dirname, 0)) {
echo 'No read permission for Guest user: '.$dirname.PHP_EOL;
return false;
}
echo $dirname.PHP_EOL;
MyDumpTool::makeDirectory('public/modules/'.$dirname);
// copy noimage
MyDumpTool::makeDirectory('public/modules/'.$dirname.'/images');
$spath = XOOPS_ROOT_PATH.'/modules/'.$dirname.'/images/noimage.gif';
$dpath = MYDUMPTOOL_OUTPUTDIR.'/public/modules/'.$dirname.'/images/noimage.gif';
MyDumpTool::fileCopy($spath, $dpath);
// component_master table
$sql = sprintf('SELECT * FROM `%s` ORDER BY `sort`,`comp_id`', $xoopsDB->prefix($dirname.'_component_master'));
$modKeys = ['comp_id' => 'i', 'type' => 'i', 'onoff' => 'i', 'sort' => 'i', 'nonull' => 'i', 'textmax' => 'i', 'onoff_refine' => 'i'];
// onoff: use for sort, onoff_refine: use for refine search, 0: means yes, 1: means no
$config['component'] = queryDatabase($sql, $modKeys);
// keyword table
$sql = sprintf('SELECT * FROM `%s` ORDER BY `kw_id`', $xoopsDB->prefix($dirname.'_keyword'));
$modKeys = ['kw_id' => 'i', 'sort' => 'i'];
$res = queryDatabase($sql, $modKeys);
foreach ($res as $idx => $row) {
$path = explode('/', trim($row['path'], '/'));
$parent = array_pop($path);
$res[$idx]['pid'] = ($parent == '') ? 0 : intval($parent);
unset($res[$idx]['path']);
}
$config['keyword'] = $res;
// detail table
$sql = sprintf('SELECT * FROM `%s` WHERE `detail_id`=1', $xoopsDB->prefix($dirname.'_detail'));
$modKeys = ['detail_id' => 'd', 'template' => 'h'];
$res = queryDatabase($sql, $modKeys);
$config['detail'] = $res[0]['template'];
// list table
$sql = sprintf('SELECT * FROM `%s` WHERE `onoff`=0 ORDER BY `sort`,`list_id`', $xoopsDB->prefix($dirname.'_list'));
$modKeys = ['list_id' => 'i', 'type' => 'i', 'onoff' => 'd', 'sort' => 'i'];
$config['list'] = queryDatabase($sql, $modKeys);
//var_dump($config);
$dHandler = Cosmoapi_Utils::getTrustModuleHandler('data', 'cosmoapi');
$dHandler->setDirname($dirname);
$ids = $dHandler->getIds();
foreach ($ids as $id => $label) {
$obj = $dHandler->get($id);
$keywords = [];
foreach ($obj->mKeywords as $kObj) {
$keywords[] = intval($kObj->mKeywordId);
}
$components = [];
foreach ($obj->mComponents as $cObj) {
$components[] = [
'name' => $cObj->mName,
'value' => $cObj->mValue,
];
}
$items = [];
foreach ($obj->mItems as $iObj) {
$items[] = [
'type' => $iObj->mType,
'name' => $iObj->mName,
'path' => $iObj->mPath,
'reg_date' => intval($iObj->mRegDate),
'reg_user' => getUserInfo($iObj->mRegUserId),
];
}
$thumbnails = [];
foreach ($obj->mThumbnails as $thumbnail) {
$thumbnails[] = [
'url' => preg_replace('/^'.preg_quote(XOOPS_URL.'/modules/'.$dirname.'/extract/'.$id.'/thumbnail/','/').'/', '', $thumbnail['url']),
'caption' => $thumbnail['caption'],
];
}
$commentTopics = [];
foreach ($obj->mComments as $ctObj) {
$comment = [
'subject' => $ctObj->mComment->mSubject,
'message' => $ctObj->mComment->mMessage,
'reg_date' => intval($ctObj->mComment->mRegDate),
'reg_user' => getUserInfo($ctObj->mComment->mRegUser),
];
$replies = [];
foreach ($ctObj->mReplies as $cObj) {
$replies[] = [
'subject' => $cObj->mSubject,
'message' => $cObj->mMessage,
'reg_date' => intval($cObj->mRegDate),
'reg_user' => getUserInfo($cObj->mRegUser),
];
}
$commentTopics[] = [
'topic_id' => intval($ctObj->mTopicId),
'com_id' => intval($ctObj->mComId),
'type' => $ctObj->mType,
'comment' => $comment,
'replies' => $replies,
];
}
$links = [];
foreach ($obj->mLinks as $lObj) {
$href = preg_replace(preg_replace('/https/', 'https?', '/'.preg_quote(XOOPS_URL, '/').'/'), '', $lObj->mHref);
if (strpos($href, 'invbrain') !== false) {
var_dump($href);
}
$links[] = [
'type' => (int) $lObj->mType,
'user' => getUserInfo($lObj->mUid),
'name' => $lObj->mName,
'href' => $href,
'note' => $lObj->mNote,
];
}
$basic = [
'id' => $id,
'label' => $obj->mLabel,
'reg_date' => intval($obj->mRegDate),
'author' => getUserInfo($obj->mAuthor),
'views' => intval($obj->mViews),
'components' => $components,
'thumbnails' => $thumbnails,
'items' => $items,
];
$detail = [
'id' => $id,
'users' => array_map('getUserInfo', $obj->mUserIds),
'keywords' => $keywords,
'comment_topics' => $commentTopics,
'links' => $links,
];
MyDumpTool::saveJson('public/modules/'.$dirname.'/'.$id.'.json', $detail);
$config['data'][] = $basic;
}
MyDumpTool::saveJson('public/modules/'.$dirname.'/index.json', $config);
}
function getUserInfo($uid) {
static $users = [];
if (!isset($users[$uid])) {
$memberHandler = xoops_gethandler('member');
$userObj = $memberHandler->getUser($uid);
if (is_object($userObj)) {
$name = trim($userObj->get('name'));
$uname = trim($userObj->get('uname'));
$users[$uid] = $uname; // $name !== '' ? $name.' ('.$uname.')' : $uname;
} else {
$users[$uid] = 'unknown';
}
}
return $users[$uid];
}
function queryDatabase($sql, $modKeys = []) {
global $xoopsDB;
$ret = [];
if (!($res = $xoopsDB->query($sql))) {
var_dump($xoopsDB);
exit();
}
while ($row = $xoopsDB->fetchArray($res)) {
MyDumpTool::decode($row);
foreach ($modKeys as $key => $type) {
switch ($type) {
case 'i':
$row[$key] = intval($row[$key]);
break;
case 'd':
unset($row[$key]);
break;
case 'h':
$row[$key] = preg_replace('/\s+([a-z]+)=\'([^\']*)\'/U', ' \1="\2"', MyDumpTool::fixHtml($row[$key]));
break;
}
}
$ret[] = $row;
}
$xoopsDB->freeRecordSet($res);
return $ret;
}