nimg.neuroinf.jp/etc/dumpXooNIps.php
2022-06-20 17:51:03 +09:00

1242 lines
36 KiB
PHP

<?php
require_once __DIR__.'/common.inc.php';
$prefix = $xoopsDB->prefix();
$table = 'xoonips_item_basic';
if (!MyDumpTool::tableExists($table)) {
exit('xoonips module not found'.PHP_EOL);
}
MyDumpTool::makeDirectory('src/xoonips');
MyDumpTool::makeDirectory('src/xoonips/assets');
MyDumpTool::makeDirectory('public/modules/xoonips');
MyDumpTool::makeDirectory('public/modules/xoonips/file');
// xoonips config
$sql = <<< SQL
SELECT
*
FROM `${prefix}_xoonips_config`
SQL;
if (!($res = $xoopsDB->query($sql))) {
var_dump($xoopsDB);
exit();
}
$xoonipsConfigs = [];
while ($row = $xoopsDB->fetchArray($res)) {
MyDumpTool::decode($row);
MyDumpTool::convertToInt($row, ['item_id', 'last_update_date']);
$xoonipsConfigs[$row['name']] = $row['value'];
}
$xoopsDB->freeRecordSet($res);
// Recent Contents
$ranking = [];
$limit = $xoonipsConfigs['ranking_new_num_rows'];
$sql = <<< SQL
SELECT
`ib`.`item_id`, `ib`.`doi`, `ib`.`last_update_date`,
GROUP_CONCAT(DISTINCT `it`.`title` ORDER BY `it`.`title_id` ASC SEPARATOR '\n') AS `title`
FROM `${prefix}_xoonips_ranking_new_item` AS `ri`
INNER JOIN `${prefix}_xoonips_item_basic` AS `ib` ON `ri`.`item_id`=`ib`.`item_id`
INNER JOIN `${prefix}_xoonips_index_item_link` AS `iil` ON `ib`.`item_id`=`iil`.`item_id`
INNER JOIN `${prefix}_xoonips_item_title` AS `it` ON `ib`.`item_id`=`it`.`item_id`
WHERE `iil`.`certify_state`=2
GROUP BY `ib`.`item_id`
ORDER BY `ib`.`last_update_date` DESC
LIMIT $limit
SQL;
if (!($res = $xoopsDB->query($sql))) {
var_dump($xoopsDB);
exit();
}
while ($row = $xoopsDB->fetchArray($res)) {
MyDumpTool::decode($row);
MyDumpTool::convertToInt($row, ['item_id', 'last_update_date']);
$ranking[] = $row;
}
$xoopsDB->freeRecordSet($res);
MyDumpTool::saveJson('public/modules/xoonips/recent-contents.json', $ranking);
unset($ranking);
// Rankings
$ranking = [];
$limit = $xoonipsConfigs['ranking_num_rows'];
$rankingOrder = array_map('trim', explode(',', $xoonipsConfigs['ranking_order']));
$rankingVisible = array_map('trim', explode(',', $xoonipsConfigs['ranking_visible']));
$rankingKey2Index = [
'accessed' => 0,
'downloaded' => 1,
'contributed' => 2,
'searched' => 3,
'groups' => 4,
];
function rankingSortFunc($a, $b)
{
global $rankingOrder;
global $rankingKey2Index;
$na = $rankingOrder[$rankingKey2Index[$a]];
$nb = $rankingOrder[$rankingKey2Index[$b]];
return $na === $nb ? 0 : $na > $nb;
}
$limit = $xoonipsConfigs['ranking_num_rows'];
// - most accessed items
$ranking['accessed'] = [];
if ($rankingVisible[$rankingKey2Index['accessed']]) {
$sql = <<< SQL
SELECT
`ib`.`item_id`, `ib`.`doi`,
GROUP_CONCAT(DISTINCT `it`.`title` ORDER BY `it`.`title_id` ASC SEPARATOR '\n') AS `title`,
`vi`.`count`
FROM `${prefix}_xoonips_ranking_viewed_item` AS `vi`
INNER JOIN `${prefix}_xoonips_item_basic` AS `ib` ON `vi`.`item_id`=`ib`.`item_id`
INNER JOIN `${prefix}_xoonips_item_title` AS `it` ON `ib`.`item_id`=`it`.`item_id`
INNER JOIN `${prefix}_xoonips_index_item_link` AS `iil` ON `ib`.`item_id`=`iil`.`item_id`
WHERE `iil`.`certify_state`=2
GROUP BY `ib`.`item_id`
ORDER BY `vi`.`count` DESC
LIMIT $limit
SQL;
if (!($res = $xoopsDB->query($sql))) {
var_dump($xoopsDB);
exit();
}
while ($row = $xoopsDB->fetchArray($res)) {
MyDumpTool::decode($row);
MyDumpTool::convertToInt($row, ['item_id', 'count']);
$ranking['accessed'][] = $row;
}
$xoopsDB->freeRecordSet($res);
}
// - most accessed items
$ranking['downloaded'] = [];
if ($rankingVisible[$rankingKey2Index['downloaded']]) {
$sql = <<< SQL
SELECT
`ib`.`item_id`, `ib`.`doi`,
GROUP_CONCAT(DISTINCT `it`.`title` ORDER BY `it`.`title_id` ASC SEPARATOR '\n') AS `title`,
`di`.`count`
FROM `${prefix}_xoonips_ranking_downloaded_item` AS `di`
INNER JOIN `${prefix}_xoonips_item_basic` AS `ib` ON `di`.`item_id`=`ib`.`item_id`
INNER JOIN `${prefix}_xoonips_item_title` AS `it` ON `ib`.`item_id`=`it`.`item_id`
INNER JOIN `${prefix}_xoonips_index_item_link` AS `iil` ON `ib`.`item_id`=`iil`.`item_id`
WHERE `iil`.`certify_state`=2
GROUP BY `ib`.`item_id`
ORDER BY `di`.`count` DESC
LIMIT $limit
SQL;
if (!($res = $xoopsDB->query($sql))) {
var_dump($xoopsDB);
exit();
}
while ($row = $xoopsDB->fetchArray($res)) {
MyDumpTool::decode($row);
MyDumpTool::convertToInt($row, ['item_id', 'count']);
$ranking['downloaded'][] = $row;
}
$xoopsDB->freeRecordSet($res);
}
// - most contributed users
$ranking['contributed'] = [];
if ($rankingVisible[$rankingKey2Index['contributed']]) {
$sql = <<< SQL
SELECT
`u`.`uid`, `u`.`uname`, `u`.`name`, COUNT(`cu`.`item_id`) AS `count`
FROM `${prefix}_xoonips_ranking_contributing_user` AS `cu`
INNER JOIN `${prefix}_users` AS `u` ON `cu`.`uid`=`u`.`uid`
GROUP BY `u`.`uid`
ORDER BY `count` DESC
LIMIT $limit
SQL;
if (!($res = $xoopsDB->query($sql))) {
var_dump($xoopsDB);
exit();
}
while ($row = $xoopsDB->fetchArray($res)) {
MyDumpTool::decode($row);
MyDumpTool::convertToInt($row, ['uid', 'count']);
$ranking['contributed'][] = $row;
}
$xoopsDB->freeRecordSet($res);
}
// - most searched keywords
$ranking['searched'] = [];
if ($rankingVisible[$rankingKey2Index['searched']]) {
$sql = <<< SQL
SELECT
`sk`.`keyword`, `sk`.`count`
FROM `${prefix}_xoonips_ranking_searched_keyword` AS `sk`
ORDER BY `sk`.`count` DESC
LIMIT $limit
SQL;
if (!($res = $xoopsDB->query($sql))) {
var_dump($xoopsDB);
exit();
}
while ($row = $xoopsDB->fetchArray($res)) {
MyDumpTool::decode($row);
MyDumpTool::convertToInt($row, ['count']);
$ranking['searched'][] = $row;
}
$xoopsDB->freeRecordSet($res);
}
uksort($ranking, 'rankingSortFunc');
MyDumpTool::saveJson('public/modules/xoonips/rankings.json', $ranking);
unset($ranking);
// get public index with certified item count
$sql = <<< SQL
SELECT
`idx`.*,
`it`.`title`,
(SELECT COUNT(*)
FROM `${prefix}_xoonips_index_item_link` AS `iil`
INNER JOIN `${prefix}_xoonips_item_basic` AS `ib` ON `iil`.`item_id`=`ib`.`item_id`
WHERE `iil`.`index_id`=`idx`.`index_id` AND `iil`.`certify_state`=2
) AS `num_items`
FROM `${prefix}_xoonips_index` AS `idx`
INNER JOIN `${prefix}_xoonips_item_title` AS `it` ON `idx`.`index_id`=`it`.`item_id`
WHERE `it`.`title_id`=0
AND `idx`.`open_level`=1
SQL;
$limitItems = [];
$limitFiles = [];
if (!($res = $xoopsDB->query($sql))) {
var_dump($xoopsDB);
exit();
}
$tree = [];
$root = [];
while ($row = $xoopsDB->fetchArray($res)) {
MyDumpTool::decode($row);
$tree[$row['index_id']] = $row;
$root[$row['parent_index_id']][$row['sort_number']] = $row['index_id'];
}
$xoopsDB->freeRecordSet($res);
foreach ($root as &$node) {
ksort($node);
}
unset($node);
$data[] = getTreeNode($tree, $root, 3);
MyDumpTool::saveJson('src/xoonips/assets/tree.json', $data);
unset($data, $root);
// get simpf link data
$simpflink = parseSimPFLinkFile();
$simpfurls = [];
// get public items
$sql = <<< SQL
SELECT
`ib`.*,
GROUP_CONCAT(DISTINCT `it`.`title` ORDER BY `it`.`title_id` ASC SEPARATOR '\n') AS `title`,
`ity`.`display_name` AS `item_type_display_name`, `ity`.`name` AS `item_type_name`,
`u`.`uname`, `u`.`name`, `u`.`email`
FROM `${prefix}_xoonips_item_basic` AS `ib`
INNER JOIN `${prefix}_xoonips_item_title` AS `it` ON `ib`.`item_id`=`it`.`item_id`
INNER JOIN `${prefix}_xoonips_item_type` AS `ity` ON `ib`.`item_type_id`=`ity`.`item_type_id`
INNER JOIN `${prefix}_xoonips_index_item_link` AS `iil` ON `ib`.`item_id`=`iil`.`item_id`
INNER JOIN `${prefix}_xoonips_index` AS `idx` ON `iil`.`index_id`=`idx`.`index_id`
LEFT JOIN `${prefix}_users` AS `u` ON `ib`.`uid`=`u`.`uid`
WHERE `ity`.`display_name` != 'Index'
AND `iil`.`certify_state`=2
AND `idx`.`open_level`=1
GROUP BY `ib`.`item_id`
ORDER BY `ib`.`item_id` ASC
SQL;
if (!($res = $xoopsDB->query($sql))) {
var_dump($xoopsDB);
exit();
}
$items = [];
$itemIds = [];
$baseItemIds = [];
while ($row = $xoopsDB->fetchArray($res)) {
MyDumpTool::decode($row);
MyDumpTool::convertToInt($row, ['item_id', 'item_type_id', 'uid', 'last_update_date', 'creation_date', 'publication_year', 'publication_month', 'publication_mday']);
$row['index'] = getIndexes($tree, $row['item_id']);
if (0 === count($row['index'])) {
// no public indexes found.
continue;
}
$row['changelog'] = getChangeLogs($row['item_id']);
$row['related_to'] = getRelatedTo($row['item_id']);
$row['keyword'] = getKeyword($row['item_id']);
$row['file'] = getFile($row['item_id']);
switch ($row['item_type_name']) {
case 'xnpbinder':
appendBinderInfo($row);
break;
case 'xnpbook':
appendBookInfo($row);
break;
case 'xnpconference':
appendConferenceInfo($row);
break;
case 'xnpdata':
appendDataInfo($row);
break;
case 'xnpfiles':
appendFilesInfo($row);
break;
case 'xnpmemo':
appendMemoInfo($row);
break;
case 'xnpmodel':
appendModelInfo($row);
break;
case 'xnppaper':
appendPaperInfo($row);
break;
case 'xnppresentation':
appendPresentationInfo($row);
break;
case 'xnpsimulator':
appendSimulatorInfo($row);
break;
case 'xnpstimulus':
appendStimulusInfo($row);
break;
case 'xnptool':
appendToolInfo($row);
break;
case 'xnpurl':
appendUrlInfo($row);
break;
case 'xnpnimgcenter':
appendNimgcenterInfo($row);
break;
default:
exit('Unsupported item type: '.$row['item_type_name']);
}
if (isset($row['attachment_dl_limit']) && $row['attachment_dl_limit']) {
$found = false;
foreach ($row['file'] as $file) {
if ('preview' !== $file['file_type_name']) {
$limitFiles[] = $file['file_id'];
$found = true;
}
}
if ($found) {
$limitItems[] = [
'uname' => $row['uname'],
'name' => $row['name'],
'email' => $row['email'],
'item_id' => $row['item_id'],
'doi' => $row['doi'],
];
}
}
MyDumpTool::dropColumn($row, ['email', 'item_type_id']);
if (isset($row['rights']) && isset($row['use_cc']) && isset($row['cc_commercial_use']) && isset($row['cc_modification']) && 1 == $row['use_cc']) {
$label = 'Creative Commons Attribution';
if (0 == $row['cc_commercial_use']) {
$label .= '-NonCommercial';
}
switch ($row['cc_modification']) {
case 0:
$label .= '-NoDerivatives';
break;
case 1:
$label .= '-ShareAlike';
break;
}
$label .= ' 4.0 International License.';
$row['rights'] = $label;
}
$items[] = $row;
$simpfurl = '';
if ('' != $row['doi'] && isset($simpflink['id'][$row['doi']])) {
$simpfurl = $simpflink['id'][$row['doi']];
} elseif (isset($simpflink['item_id'][$row['item_id']])) {
$simpfurl = $simpflink['item_id'][$row['item_id']];
}
if ('' !== $simpfurl) {
$simpfurls[] = [
'id' => $row['item_id'],
'url' => $simpfurl,
];
}
$itemIds[] = $row['item_id'];
}
$xoopsDB->freeRecordSet($res);
MyDumpTool::saveJson('public/modules/xoonips/items.json', $items);
MyDumpTool::saveJson('src/xoonips/assets/simpf-links.json', $simpfurls);
foreach ($baseItemIds as $bid) {
if (!in_array($bid, $itemIds)) {
echo 'Warning: baseitem_id('.$bid.') not found'.PHP_EOL;
}
}
$fp = fopen(MYDUMPTOOL_OUTPUTDIR.'/dl-limit-items.csv', 'w');
foreach ($limitItems as $row) {
$data = [
$row['item_id'],
$row['uname'],
$row['name'],
$row['email'],
getItemUrl($row),
];
fputcsv($fp, $data);
}
fclose($fp);
// get files
$fileutil = xoonips_getutility('file');
$basePath = $xoonipsConfigs['upload_dir'];
$sql = <<< SQL
SELECT
`f`.`file_id`, `f`.`item_id`, `f`.`original_file_name`,
`ft`.`name` AS `file_type_name`
FROM `${prefix}_xoonips_file` AS `f`
INNER JOIN `${prefix}_xoonips_file_type` AS `ft` ON `f`.`file_type_id`=`ft`.`file_type_id`
INNER JOIN `${prefix}_xoonips_index_item_link` AS `iil` ON `f`.`item_id`=`iil`.`item_id`
INNER JOIN `${prefix}_xoonips_index` AS `idx` ON `iil`.`index_id`=`idx`.`index_id`
WHERE `f`.`is_deleted`=0
AND `ft`.`name` NOT IN('readme' , 'license', 'rights')
AND `iil`.`certify_state`=2
AND `idx`.`open_level`=1
GROUP BY `f`.`file_id`
ORDER BY `f`.`file_id` ASC
SQL;
if (!($res = $xoopsDB->query($sql))) {
var_dump($xoopsDB);
exit();
}
$filesDir = MYDUMPTOOL_OUTPUTDIR.'/public/modules/xoonips/file';
while ($row = $xoopsDB->fetchArray($res)) {
MyDumpTool::decode($row);
MyDumpTool::convertToInt($row, ['file_id', 'item_id']);
$file_id = $row['file_id'];
$item_id = $row['item_id'];
$file_name = $row['original_file_name'];
$file_type = $row['file_type_name'];
if (in_array($file_id, $limitFiles)) {
echo "download limit file found.. skip to copy.. item_id:$item_id, file_id:$file_id".PHP_EOL;
continue;
}
$file_dir = $filesDir.'/'.$file_id;
$src_file = $basePath.'/'.$file_id;
if (!is_dir($file_dir)) {
@mkdir($file_dir);
}
//if (!file_exists($file_dir.'/'.$file_name)) {
if (!MyDumpTool::fileCopy($src_file, $file_dir.'/'.$file_name)) {
echo 'failed to copy file: '.$basePath.'/'.$file_id.PHP_EOL;
}
$htaccess = $file_dir.'/.htaccess';
$xfilename = str_replace(' ', '\\ ', $file_name);
$data = "RewriteEngine On\nRewriteBase /database/file/$file_id\nRewriteCond %{REQUEST_FILENAME} !-f\nRewriteRule .* $xfilename [R=301,L]\n";
file_put_contents($htaccess, $data);
//}
if ('preview' == $file_type) {
$thumbnail_file = $file_dir.'.png';
if (!file_exists($thumbnail_file)) {
$mimetype = $fileutil->get_mimetype($src_file, $file_name);
$thumbnail = $fileutil->get_thumbnail($src_file, $mimetype);
if (null !== $thumbnail) {
file_put_contents($thumbnail_file, $thumbnail);
} else {
createThumbnail($src_file, $mimetype, $thumbnail_file);
}
}
}
}
$xoopsDB->freeRecordSet($res);
// functions
function getItemUrl($row)
{
$url = XOONIPS_URL.'/detail.php?';
if ('' != $row['doi']) {
$url .= XNP_CONFIG_DOI_FIELD_PARAM_NAME.'='.$row['doi'];
} else {
$url .= 'item_id='.$row['item_id'];
}
return $url;
}
function getTreeNode($tree, $root, $index_id)
{
$children = [];
if (isset($root[$index_id])) {
foreach ($root[$index_id] as $child_index_id) {
$children[] = getTreeNode($tree, $root, $child_index_id);
}
}
return [
'id' => (int) $tree[$index_id]['index_id'],
'title' => $tree[$index_id]['title'],
'num_of_items' => (int) $tree[$index_id]['num_items'],
'children' => $children,
];
}
function getIndexes($tree, $item_id)
{
global $xoopsDB;
$prefix = $xoopsDB->prefix();
$sql = <<< SQL
SELECT
`iil`.`index_id`
FROM `${prefix}_xoonips_index_item_link` AS `iil`
WHERE `iil`.`item_id`=$item_id
ORDER BY `iil`.`index_id`
SQL;
if (!($res = $xoopsDB->query($sql))) {
var_dump($xoopsDB);
exit();
}
$indexes = [];
while ($row = $xoopsDB->fetchArray($res)) {
$index_id = $row['index_id'];
if (isset($tree[$index_id])) {
$idxes = [];
$idxes[] = $tree[$index_id]['title'];
$parent_id = $tree[$index_id]['parent_index_id'];
while (1 != $parent_id) {
$idxes[] = $tree[$parent_id]['title'];
$parent_id = $tree[$parent_id]['parent_index_id'];
}
$idxes[] = '';
$indexes[] = [
'index_id' => (int) $index_id,
'title' => trim(implode(' / ', array_reverse($idxes))),
];
}
}
$xoopsDB->freeRecordSet($res);
return $indexes;
}
function getChangeLogs($item_id)
{
global $xoopsDB;
$prefix = $xoopsDB->prefix();
$sql = <<< SQL
SELECT `log_date`, `log`
FROM `${prefix}_xoonips_changelog`
WHERE `item_id`=$item_id
ORDER BY `log_date` DESC
SQL;
if (!($res = $xoopsDB->query($sql))) {
var_dump($xoopsDB);
exit();
}
$ret = [];
while ($row = $xoopsDB->fetchArray($res)) {
MyDumpTool::decode($row);
MyDumpTool::convertToInt($row, ['log_date']);
$ret[] = $row;
}
$xoopsDB->freeRecordSet($res);
return $ret;
}
function getRelatedTo($item_id)
{
global $xoopsDB;
$prefix = $xoopsDB->prefix();
$sql = <<< SQL
SELECT `item_id`
FROM `${prefix}_xoonips_related_to`
WHERE `parent_id`=$item_id
SQL;
if (!($res = $xoopsDB->query($sql))) {
var_dump($xoopsDB);
exit();
}
$ret = [];
while ($row = $xoopsDB->fetchArray($res)) {
$ret[] = (int) $row['item_id'];
}
$xoopsDB->freeRecordSet($res);
return $ret;
}
function getKeyword($item_id)
{
global $xoopsDB;
$prefix = $xoopsDB->prefix();
$sql = <<< SQL
SELECT *
FROM `${prefix}_xoonips_item_keyword`
WHERE `item_id`=$item_id
ORDER BY `keyword_id` ASC
SQL;
if (!($res = $xoopsDB->query($sql))) {
var_dump($xoopsDB);
exit();
}
$ret = [];
while ($row = $xoopsDB->fetchArray($res)) {
MyDumpTool::decode($row);
$ret[] = $row['keyword'];
}
$xoopsDB->freeRecordSet($res);
return $ret;
}
function getFile($item_id)
{
global $xoopsDB;
$prefix = $xoopsDB->prefix();
$sql = <<< SQL
SELECT `f`.`file_id`, `f`.`original_file_name`, `f`.`mime_type`, `f`.`file_size`, `f`.`caption`, `f`.`timestamp`,
`ft`.`name` AS `file_type_name`, `ft`.`display_name` AS `file_type_display_name`
FROM `${prefix}_xoonips_file` AS `f`
INNER JOIN `${prefix}_xoonips_file_type` AS `ft` ON `f`.`file_type_id`=`ft`.`file_type_id`
WHERE `item_id`=$item_id
AND `is_deleted`=0
ORDER BY `ft`.`name` ASC
SQL;
if (!($res = $xoopsDB->query($sql))) {
var_dump($xoopsDB);
exit();
}
$ret = [];
while ($row = $xoopsDB->fetchArray($res)) {
MyDumpTool::decode($row);
MyDumpTool::convertToInt($row, ['file_id', 'file_size']);
$ret[] = $row;
}
$xoopsDB->freeRecordSet($res);
return $ret;
}
function appendBinderInfo(&$row)
{
global $xoopsDB;
$prefix = $xoopsDB->prefix();
$item_id = $row['item_id'];
$sql = <<< SQL
SELECT *
FROM `${prefix}_xnpbinder_item_detail`
WHERE `binder_id`=$item_id
SQL;
if (!($res = $xoopsDB->query($sql))) {
var_dump($xoopsDB);
exit();
}
while ($detail = $xoopsDB->fetchArray($res)) {
MyDumpTool::decode($detail);
MyDumpTool::convertToInt($detail, ['binder_id']);
MyDumpTool::dropColumn($detail, ['binder_id']);
$row += $detail;
}
$xoopsDB->freeRecordSet($res);
$sql = <<< SQL
SELECT *
FROM `${prefix}_xnpbinder_binder_item_link`
WHERE `binder_id`=$item_id
ORDER BY `item_id` ASC
SQL;
if (!($res = $xoopsDB->query($sql))) {
var_dump($xoopsDB);
exit();
}
$row['item_link'] = [];
while ($row2 = $xoopsDB->fetchArray($res)) {
MyDumpTool::decode($row2);
$row['item_link'][] = (int) $row2['item_id'];
}
$xoopsDB->freeRecordSet($res);
}
function appendBookInfo(&$row)
{
global $xoopsDB;
$prefix = $xoopsDB->prefix();
$item_id = $row['item_id'];
$sql = <<< SQL
SELECT *
FROM `${prefix}_xnpbook_item_detail`
WHERE `book_id`=$item_id
SQL;
if (!($res = $xoopsDB->query($sql))) {
var_dump($xoopsDB);
exit();
}
while ($detail = $xoopsDB->fetchArray($res)) {
MyDumpTool::decode($detail);
MyDumpTool::convertToInt($detail, ['book_id', 'attachment_dl_limit', 'attachment_dl_notify']);
MyDumpTool::convertToInt($detail, ['volume', 'number']); // for CBSN
MyDumpTool::dropColumn($detail, ['book_id']);
$row += $detail;
}
$xoopsDB->freeRecordSet($res);
$sql = <<< SQL
SELECT *
FROM `${prefix}_xnpbook_author`
WHERE `book_id`=$item_id
ORDER BY `author_order` ASC
SQL;
if (!($res = $xoopsDB->query($sql))) {
var_dump($xoopsDB);
exit();
}
$row['author'] = [];
while ($author = $xoopsDB->fetchArray($res)) {
MyDumpTool::decode($author);
$row['author'][] = $author['author'];
}
$xoopsDB->freeRecordSet($res);
}
function appendConferenceInfo(&$row)
{
global $xoopsDB;
$prefix = $xoopsDB->prefix();
$item_id = $row['item_id'];
$sql = <<< SQL
SELECT *
FROM `${prefix}_xnpconference_item_detail`
WHERE `conference_id`=$item_id
SQL;
if (!($res = $xoopsDB->query($sql))) {
var_dump($xoopsDB);
exit();
}
while ($detail = $xoopsDB->fetchArray($res)) {
MyDumpTool::decode($detail);
MyDumpTool::convertToInt($detail, ['conference_id', 'conference_from_year', 'conference_from_month', 'conference_from_mday', 'conference_to_year', 'conference_to_month', 'conference_to_mday', 'attachment_dl_limit', 'attachment_dl_notify']);
MyDumpTool::dropColumn($detail, ['conference_id']);
$row += $detail;
}
$xoopsDB->freeRecordSet($res);
$sql = <<< SQL
SELECT *
FROM `${prefix}_xnpconference_author`
WHERE `conference_id`=$item_id
ORDER BY `author_order` ASC
SQL;
if (!($res = $xoopsDB->query($sql))) {
var_dump($xoopsDB);
exit();
}
$row['author'] = [];
while ($author = $xoopsDB->fetchArray($res)) {
MyDumpTool::decode($author);
$row['author'][] = $author['author'];
}
$xoopsDB->freeRecordSet($res);
}
function appendDataInfo(&$row)
{
global $xoopsDB;
$prefix = $xoopsDB->prefix();
$item_id = $row['item_id'];
$sql = <<< SQL
SELECT *
FROM `${prefix}_xnpdata_item_detail`
WHERE `data_id`=$item_id
SQL;
if (!($res = $xoopsDB->query($sql))) {
var_dump($xoopsDB);
exit();
}
while ($detail = $xoopsDB->fetchArray($res)) {
MyDumpTool::decode($detail);
MyDumpTool::convertToInt($detail, ['data_id', 'use_cc', 'cc_commercial_use', 'cc_modification', 'attachment_dl_limit', 'attachment_dl_notify']);
MyDumpTool::dropColumn($detail, ['data_id']);
$row += $detail;
}
$xoopsDB->freeRecordSet($res);
$sql = <<< SQL
SELECT *
FROM `${prefix}_xnpdata_experimenter`
WHERE `data_id`=$item_id
ORDER BY `experimenter_order` ASC
SQL;
if (!($res = $xoopsDB->query($sql))) {
var_dump($xoopsDB);
exit();
}
$row['experimenter'] = [];
while ($author = $xoopsDB->fetchArray($res)) {
MyDumpTool::decode($author);
$row['experimenter'][] = $author['experimenter'];
}
$xoopsDB->freeRecordSet($res);
}
function appendFilesInfo(&$row)
{
global $xoopsDB;
$prefix = $xoopsDB->prefix();
$item_id = $row['item_id'];
$sql = <<< SQL
SELECT *
FROM `${prefix}_xnpfiles_item_detail`
WHERE `files_id`=$item_id
SQL;
if (!($res = $xoopsDB->query($sql))) {
var_dump($xoopsDB);
exit();
}
while ($detail = $xoopsDB->fetchArray($res)) {
MyDumpTool::decode($detail);
MyDumpTool::convertToInt($detail, ['files_id']);
MyDumpTool::dropColumn($detail, ['files_id']);
$row += $detail;
}
$xoopsDB->freeRecordSet($res);
}
function appendMemoInfo(&$row)
{
global $xoopsDB;
$prefix = $xoopsDB->prefix();
$item_id = $row['item_id'];
$sql = <<< SQL
SELECT *
FROM `${prefix}_xnpmemo_item_detail`
WHERE `memo_id`=$item_id
SQL;
if (!($res = $xoopsDB->query($sql))) {
var_dump($xoopsDB);
exit();
}
while ($detail = $xoopsDB->fetchArray($res)) {
MyDumpTool::decode($detail);
MyDumpTool::convertToInt($detail, ['memo_id']);
MyDumpTool::dropColumn($detail, ['memo_id']);
$row += $detail;
}
$xoopsDB->freeRecordSet($res);
}
function appendModelInfo(&$row)
{
global $xoopsDB;
$prefix = $xoopsDB->prefix();
$item_id = $row['item_id'];
$sql = <<< SQL
SELECT *
FROM `${prefix}_xnpmodel_item_detail`
WHERE `model_id`=$item_id
SQL;
if (!($res = $xoopsDB->query($sql))) {
var_dump($xoopsDB);
exit();
}
while ($detail = $xoopsDB->fetchArray($res)) {
MyDumpTool::decode($detail);
MyDumpTool::convertToInt($detail, ['model_id', 'use_cc', 'cc_commercial_use', 'cc_modification', 'attachment_dl_limit', 'attachment_dl_notify']);
MyDumpTool::dropColumn($detail, ['model_id']);
$row += $detail;
}
$xoopsDB->freeRecordSet($res);
$sql = <<< SQL
SELECT *
FROM `${prefix}_xnpmodel_creator`
WHERE `model_id`=$item_id
ORDER BY `creator_order` ASC
SQL;
if (!($res = $xoopsDB->query($sql))) {
var_dump($xoopsDB);
exit();
}
$row['creator'] = [];
while ($author = $xoopsDB->fetchArray($res)) {
MyDumpTool::decode($author);
$row['creator'][] = $author['creator'];
}
$xoopsDB->freeRecordSet($res);
}
function appendPaperInfo(&$row)
{
global $xoopsDB;
$prefix = $xoopsDB->prefix();
$item_id = $row['item_id'];
$sql = <<< SQL
SELECT *
FROM `${prefix}_xnppaper_item_detail`
WHERE `paper_id`=$item_id
SQL;
if (!($res = $xoopsDB->query($sql))) {
var_dump($xoopsDB);
exit();
}
while ($detail = $xoopsDB->fetchArray($res)) {
MyDumpTool::decode($detail);
MyDumpTool::convertToInt($detail, ['paper_id', 'volume', 'number']);
MyDumpTool::dropColumn($detail, ['paper_id']);
$row += $detail;
}
$xoopsDB->freeRecordSet($res);
$sql = <<< SQL
SELECT *
FROM `${prefix}_xnppaper_author`
WHERE `paper_id`=$item_id
ORDER BY `author_order` ASC
SQL;
if (!($res = $xoopsDB->query($sql))) {
var_dump($xoopsDB);
exit();
}
$row['author'] = [];
while ($author = $xoopsDB->fetchArray($res)) {
MyDumpTool::decode($author);
$row['author'][] = $author['author'];
}
$xoopsDB->freeRecordSet($res);
}
function appendPresentationInfo(&$row)
{
global $xoopsDB;
$prefix = $xoopsDB->prefix();
$item_id = $row['item_id'];
$sql = <<< SQL
SELECT *
FROM `${prefix}_xnppresentation_item_detail`
WHERE `presentation_id`=$item_id
SQL;
if (!($res = $xoopsDB->query($sql))) {
var_dump($xoopsDB);
exit();
}
while ($detail = $xoopsDB->fetchArray($res)) {
MyDumpTool::decode($detail);
MyDumpTool::convertToInt($detail, ['presentation_id', 'use_cc', 'cc_commercial_use', 'cc_modification', 'attachment_dl_limit', 'attachment_dl_notify']);
MyDumpTool::dropColumn($detail, ['presentation_id']);
$row += $detail;
}
$xoopsDB->freeRecordSet($res);
$sql = <<< SQL
SELECT *
FROM `${prefix}_xnppresentation_creator`
WHERE `presentation_id`=$item_id
ORDER BY `creator_order` ASC
SQL;
if (!($res = $xoopsDB->query($sql))) {
var_dump($xoopsDB);
exit();
}
$row['creator'] = [];
while ($author = $xoopsDB->fetchArray($res)) {
MyDumpTool::decode($author);
$row['creator'][] = $author['creator'];
}
$xoopsDB->freeRecordSet($res);
}
function appendSimulatorInfo(&$row)
{
global $xoopsDB;
$prefix = $xoopsDB->prefix();
$item_id = $row['item_id'];
$sql = <<< SQL
SELECT *
FROM `${prefix}_xnpsimulator_item_detail`
WHERE `simulator_id`=$item_id
SQL;
if (!($res = $xoopsDB->query($sql))) {
var_dump($xoopsDB);
exit();
}
while ($detail = $xoopsDB->fetchArray($res)) {
MyDumpTool::decode($detail);
MyDumpTool::convertToInt($detail, ['simulator_id', 'use_cc', 'cc_commercial_use', 'cc_modification', 'attachment_dl_limit', 'attachment_dl_notify']);
MyDumpTool::dropColumn($detail, ['simulator_id']);
$row += $detail;
}
$xoopsDB->freeRecordSet($res);
$sql = <<< SQL
SELECT *
FROM `${prefix}_xnpsimulator_developer`
WHERE `simulator_id`=$item_id
ORDER BY `developer_order` ASC
SQL;
if (!($res = $xoopsDB->query($sql))) {
var_dump($xoopsDB);
exit();
}
$row['developer'] = [];
while ($author = $xoopsDB->fetchArray($res)) {
MyDumpTool::decode($author);
$row['developer'][] = $author['developer'];
}
$xoopsDB->freeRecordSet($res);
}
function appendStimulusInfo(&$row)
{
global $xoopsDB;
$prefix = $xoopsDB->prefix();
$item_id = $row['item_id'];
$sql = <<< SQL
SELECT *
FROM `${prefix}_xnpstimulus_item_detail`
WHERE `stimulus_id`=$item_id
SQL;
if (!($res = $xoopsDB->query($sql))) {
var_dump($xoopsDB);
exit();
}
while ($detail = $xoopsDB->fetchArray($res)) {
MyDumpTool::decode($detail);
MyDumpTool::convertToInt($detail, ['stimulus_id', 'use_cc', 'cc_commercial_use', 'cc_modification', 'attachment_dl_limit', 'attachment_dl_notify']);
MyDumpTool::dropColumn($detail, ['stimulus_id']);
$row += $detail;
}
$xoopsDB->freeRecordSet($res);
$sql = <<< SQL
SELECT *
FROM `${prefix}_xnpstimulus_developer`
WHERE `stimulus_id`=$item_id
ORDER BY `developer_order` ASC
SQL;
if (!($res = $xoopsDB->query($sql))) {
var_dump($xoopsDB);
exit();
}
$row['developer'] = [];
while ($author = $xoopsDB->fetchArray($res)) {
MyDumpTool::decode($author);
$row['developer'][] = $author['developer'];
}
$xoopsDB->freeRecordSet($res);
}
function appendToolInfo(&$row)
{
global $xoopsDB;
$prefix = $xoopsDB->prefix();
$item_id = $row['item_id'];
$sql = <<< SQL
SELECT *
FROM `${prefix}_xnptool_item_detail`
WHERE `tool_id`=$item_id
SQL;
if (!($res = $xoopsDB->query($sql))) {
var_dump($xoopsDB);
exit();
}
while ($detail = $xoopsDB->fetchArray($res)) {
MyDumpTool::decode($detail);
MyDumpTool::convertToInt($detail, ['tool_id', 'use_cc', 'cc_commercial_use', 'cc_modification', 'attachment_dl_limit', 'attachment_dl_notify']);
MyDumpTool::dropColumn($detail, ['tool_id']);
$row += $detail;
}
$xoopsDB->freeRecordSet($res);
$sql = <<< SQL
SELECT *
FROM `${prefix}_xnptool_developer`
WHERE `tool_id`=$item_id
ORDER BY `developer_order` ASC
SQL;
if (!($res = $xoopsDB->query($sql))) {
var_dump($xoopsDB);
exit();
}
$row['developer'] = [];
while ($author = $xoopsDB->fetchArray($res)) {
MyDumpTool::decode($author);
$row['developer'][] = $author['developer'];
}
$xoopsDB->freeRecordSet($res);
}
function appendUrlInfo(&$row)
{
global $xoopsDB;
$prefix = $xoopsDB->prefix();
$item_id = $row['item_id'];
$sql = <<< SQL
SELECT *
FROM `${prefix}_xnpurl_item_detail`
WHERE `url_id`=$item_id
SQL;
if (!($res = $xoopsDB->query($sql))) {
var_dump($xoopsDB);
exit();
}
while ($detail = $xoopsDB->fetchArray($res)) {
MyDumpTool::decode($detail);
MyDumpTool::convertToInt($detail, ['url_id', 'url_count']);
MyDumpTool::dropColumn($detail, ['url_id']);
$row += $detail;
}
$xoopsDB->freeRecordSet($res);
}
function appendNimgcenterInfo(&$row)
{
global $xoopsDB;
$prefix = $xoopsDB->prefix();
$coord_type_names = [
0 => 'Talairach',
1 => 'NMI',
2 => 'Unclear',
];
$item_id = $row['item_id'];
$sql = <<< SQL
SELECT `id`.*,
`ity`.`display_name` AS `base_type_display_name`
FROM `${prefix}_xnpnimgcenter_item_detail` AS `id`
INNER JOIN `${prefix}_xoonips_item_type` AS `ity` ON `id`.`base_type_name`=`ity`.`name`
WHERE `id`.`nimgcenter_id`=$item_id
SQL;
if (!($res = $xoopsDB->query($sql))) {
var_dump($xoopsDB);
exit();
}
while ($detail = $xoopsDB->fetchArray($res)) {
MyDumpTool::decode($detail);
MyDumpTool::convertToInt($detail, ['baseitem_id', 'coord_type']);
$detail['coord_type_name'] = $coord_type_names[$detail['coord_type']];
MyDumpTool::dropColumn($detail, ['nimgcenter_id']);
$row += $detail;
}
$xoopsDB->freeRecordSet($res);
$sql = <<< SQL
SELECT *
FROM `${prefix}_xnpnimgcenter_talairach_list`
WHERE `nimgcenter_id`=$item_id
SQL;
if (!($res = $xoopsDB->query($sql))) {
var_dump($xoopsDB);
exit();
}
$row['coordinate'] = [];
while ($t = $xoopsDB->fetchArray($res)) {
MyDumpTool::dropColumn($t, ['nimgcenter_id']);
MyDumpTool::convertToInt($t, ['x', 'y', 'z']);
$row['coordinate'][] = $t;
}
$xoopsDB->freeRecordSet($res);
global $baseItemIds;
$baseItemIds[$row['item_id']] = $row['baseitem_id'];
}
function createThumbnail($inputFile, $mime_type, $outputFile)
{
$finfo = finfo_open(FILEINFO_NONE);
$label = finfo_file($finfo, $inputFile);
finfo_close($finfo);
if (preg_match('/^([^\\/]*)\\/(.*)$/', $mime_type, $matches)) {
if ('audio' == $matches[1]) {
$img_type = 'audio';
} elseif ('image' == $matches[1]) {
$img_type = 'image';
} elseif ('video' == $matches[1]) {
$img_type = 'video';
} elseif ('text' == $matches[1]) {
$img_type = 'text';
} elseif ('application' == $matches[1]) {
$text_types = ['pdf', 'xml', 'msword', 'vnd.ms-excel'];
$image_types = ['vnd.ms-powerpoint', 'postscript'];
$audio_types = ['vnd.rn-realmedia'];
if (in_array($matches[2], $text_types)) {
$img_type = 'text';
} elseif (in_array($matches[2], $audio_types)) {
$img_type = 'audio';
} elseif (in_array($matches[2], $image_types)) {
$img_type = 'image';
} else {
$img_type = 'application';
}
} else {
$img_type = 'unknown';
}
} else {
$img_type = 'unknown';
}
$img_file = XOOPS_ROOT_PATH.'/modules/xoonips/images/thumbnail_'.$img_type.'.png';
// create image resource
$w = 100;
$h = 100;
$im = imagecreatetruecolor($w, $h);
// label setting
$f = 2;
// font number
$lp = 5;
// label padding
$fw = imagefontwidth($f);
// font width
$fh = imagefontheight($f);
// font height
$fmaxlen = ($w - $lp * 2) / $fw;
// max label length
$labels = explode(',', $label);
$label = $labels[0];
$llen = strlen($label);
if ($llen > $fmaxlen) {
$label = substr($label, 0, $fmaxlen - 3);
$label .= '...';
$llen = strlen($label);
}
$lx = ($w - $llen * $fw) / 2;
$ly = $h - $fh - $lp;
// change alpha attributes and create transparent color
imageantialias($im, true);
imagealphablending($im, false);
imagesavealpha($im, true);
$transparent = imagecolorallocatealpha($im, 255, 255, 255, 0);
$col_white = imagecolorallocate($im, 255, 255, 255);
$col_gray = imagecolorallocate($im, 127, 127, 127);
$col_black = imagecolorallocate($im, 0, 0, 0);
// fill all area with transparent color
imagefill($im, 0, 0, $col_white);
imagealphablending($im, true);
$imicon = imagecreatefrompng($img_file);
imagecopy($im, $imicon, $w / 2 - 48 / 2, $h / 2 - 48 / 2, 0, 0, 48, 48);
imagepolygon($im, [0, 0, $w - 1, 0, $w - 1, $h - 1, 0, $h - 1], 4, $col_gray);
if (0 != strlen($label)) {
imagestring($im, $f, $lx, $ly, $label, $col_black);
}
imagepng($im, $outputFile);
imagedestroy($imicon);
imagedestroy($im);
return true;
}
function parseSimPFLinkFile()
{
global $XOONIPS_SIMPF_LINKFILE;
$xoops_url_path = parse_url(XOOPS_URL, PHP_URL_PATH);
$ret = [];
if (isset($XOONIPS_SIMPF_LINKFILE) && file_exists($XOONIPS_SIMPF_LINKFILE)) {
$lines = file($XOONIPS_SIMPF_LINKFILE);
foreach ($lines as $line) {
list($pfname, $pfurl, $simpfurl) = explode(',', $line);
if (preg_match('/^'.preg_quote(XOOPS_URL, '/').'/', $pfurl)) {
$pUrl = parse_url($pfurl);
if ($pUrl['path'] != $xoops_url_path.'/modules/xoonips/detail.php') {
echo 'not xoonips url found in simpf link file. URL:'.$pfurl.PHP_EOL;
continue;
}
if (preg_match('/(?:^|&)(id|item_id)=([^$&]+)/', $pUrl['query'], $matches)) {
$key = $matches[1];
$value = $matches[2];
$ret[$key][$value] = trim($simpfurl);
}
}
}
}
return $ret;
}