Skip to content

Commit

Permalink
Merge branch '6.0'
Browse files Browse the repository at this point in the history
  • Loading branch information
BurntimeX committed Apr 19, 2024
2 parents dbd586c + 4b3035b commit 081f9ed
Show file tree
Hide file tree
Showing 3 changed files with 190 additions and 21 deletions.
4 changes: 2 additions & 2 deletions files/lib/system/exporter/VB5xExporter.class.php
Original file line number Diff line number Diff line change
Expand Up @@ -386,7 +386,7 @@ public function exportUsers($offset, $limit)
'activationCode' => $row['activationType'] !== null && $row['activationType'] == 0 && $row['emailchange'] == 0 ? UserRegistrationUtil::getActivationCode() : 0, // vB's codes are strings
'oldUsername' => '',
'registrationIpAddress' => UserUtil::convertIPv4To6($row['ipaddress']), // TODO: check whether this is the registration IP
'signature' => self::fixBBCodes($row['signature']),
'signature' => self::fixBBCodes($row['signature'] ?: ''),
'userTitle' => ($row['customtitle'] != 0) ? $row['usertitle'] : '',
'lastActivityTime' => $row['lastactivity'],
];
Expand Down Expand Up @@ -903,7 +903,7 @@ public function exportPosts($offset, $limit)
'threadID' => $row['parentid'],
'userID' => $row['userid'],
'username' => $row['authorname'] ?: '',
'subject' => StringUtil::decodeHTML($row['title']),
'subject' => StringUtil::decodeHTML($row['title'] ?: ''),
'message' => self::fixBBCodes($row['rawtext']),
'time' => $row['created'],
'isDeleted' => $row['deleteuserid'] !== null ? 1 : 0,
Expand Down
191 changes: 184 additions & 7 deletions files/lib/system/exporter/WBB4xExporter.class.php
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
namespace wcf\system\exporter;

use blog\system\BLOGCore;
use filebase\data\license\License;
use gallery\system\GALLERYCore;
use wcf\data\object\type\ObjectTypeCache;
use wcf\data\package\Package;
Expand Down Expand Up @@ -100,6 +101,7 @@ final class WBB4xExporter extends AbstractExporter
'com.woltlab.calendar.event.like' => 'CalendarEventLikes',

'com.woltlab.filebase.category' => 'FilebaseCategories',
'com.woltlab.filebase.license' => 'FilebaseLicenses',
'com.woltlab.filebase.file' => 'FilebaseFiles',
'com.woltlab.filebase.file.version' => 'FilebaseFileVersions',
'com.woltlab.filebase.file.comment' => 'FilebaseFileComments',
Expand Down Expand Up @@ -206,6 +208,7 @@ public function getSupportedData()
],
'com.woltlab.filebase.file' => [
'com.woltlab.filebase.category',
'com.woltlab.filebase.license',
'com.woltlab.filebase.file.attachment',
'com.woltlab.filebase.file.comment',
'com.woltlab.filebase.file.like',
Expand Down Expand Up @@ -433,6 +436,9 @@ public function getQueue()
if (\in_array('com.woltlab.filebase.category', $this->selectedData)) {
$queue[] = 'com.woltlab.filebase.category';
}
if (\in_array('com.woltlab.filebase.license', $this->selectedData)) {
$queue[] = 'com.woltlab.filebase.license';
}
$queue[] = 'com.woltlab.filebase.file';
$queue[] = 'com.woltlab.filebase.file.version';

Expand Down Expand Up @@ -645,8 +651,8 @@ public function exportUsers($offset, $limit)
'authData' => $row['authData'],
];
$additionalData = [
'groupIDs' => \explode(',', $row['groupIDs']),
'languages' => \explode(',', $row['languageCodes']),
'groupIDs' => $row['groupIDs'] ? \explode(',', $row['groupIDs']) : [],
'languages' => $row['languageCodes'] ? \explode(',', $row['languageCodes']) : [],
'options' => [],
];

Expand Down Expand Up @@ -2001,12 +2007,37 @@ public function countBlogs()
*/
public function exportBlogs($offset, $limit)
{
$sql = "SELECT blog.*, language.languageCode
$sourceVersion52 = \version_compare(
$this->getPackageVersion('com.woltlab.blog'),
'5.2.0 Alpha 1',
'>='
);

$sql = "SELECT packageDir
FROM wcf" . $this->dbNo . "_package
WHERE package = ?";
$statement = $this->database->prepareStatement($sql, 1);
$statement->execute(['com.woltlab.blog']);
$packageDir = $statement->fetchColumn();
$blogFilePath = FileUtil::getRealPath($this->fileSystemPath . '/' . $packageDir);

if ($sourceVersion52) {
$sql = "SELECT blog.*, language.languageCode, coverPhoto.fileExtension, coverPhoto.fileHash
FROM blog" . $this->dbNo . "_blog blog
LEFT JOIN wcf" . $this->dbNo . "_language language
ON language.languageID = blog.languageID
WHERE blogID BETWEEN ? AND ?
ORDER BY blogID";
LEFT JOIN blog" . $this->dbNo . "_cover_photo coverPhoto
ON coverPhoto.coverPhotoID = blog.coverPhotoID
WHERE blog.blogID BETWEEN ? AND ?
ORDER BY blog.blogID";
} else {
$sql = "SELECT blog.*, language.languageCode
FROM blog" . $this->dbNo . "_blog blog
LEFT JOIN wcf" . $this->dbNo . "_language language
ON language.languageID = blog.languageID
WHERE blog.blogID BETWEEN ? AND ?
ORDER BY blog.blogID";
}
$statement = $this->database->prepareStatement($sql);
$statement->execute([$offset + 1, $offset + $limit]);
while ($row = $statement->fetchArray()) {
Expand All @@ -2023,6 +2054,9 @@ public function exportBlogs($offset, $limit)
if ($row['languageCode']) {
$additionalData['languageCode'] = $row['languageCode'];
}
if ($sourceVersion52 && $row['coverPhotoID']) {
$additionalData['coverPhoto'] = $this->getCoverPhotoPath($blogFilePath, $row);
}

ImportHandler::getInstance()
->getImporter('com.woltlab.blog.blog')
Expand Down Expand Up @@ -2084,6 +2118,19 @@ public function exportBlogEntries($offset, $limit)
'2.1.0 Alpha 1',
'>='
);
$sourceVersion52 = \version_compare(
$this->getPackageVersion('com.woltlab.blog'),
'5.2.0 Alpha 1',
'>='
);

$sql = "SELECT packageDir
FROM wcf" . $this->dbNo . "_package
WHERE package = ?";
$statement = $this->database->prepareStatement($sql, 1);
$statement->execute(['com.woltlab.blog']);
$packageDir = $statement->fetchColumn();
$blogFilePath = FileUtil::getRealPath($this->fileSystemPath . '/' . $packageDir);

// get entry ids
$entryIDs = [];
Expand Down Expand Up @@ -2125,11 +2172,21 @@ public function exportBlogEntries($offset, $limit)
$conditionBuilder = new PreparedStatementConditionBuilder();
$conditionBuilder->add('entry.entryID IN (?)', [$entryIDs]);

$sql = "SELECT entry.*, language.languageCode
if ($sourceVersion52) {
$sql = "SELECT entry.*, language.languageCode, coverPhoto.fileExtension, coverPhoto.fileHash
FROM blog" . $this->dbNo . "_entry entry
LEFT JOIN wcf" . $this->dbNo . "_language language
ON language.languageID = entry.languageID
LEFT JOIN blog" . $this->dbNo . "_cover_photo coverPhoto
ON entry.coverPhotoID = entry.coverPhotoID
" . $conditionBuilder;
} else {
$sql = "SELECT entry.*, language.languageCode
FROM blog" . $this->dbNo . "_entry entry
LEFT JOIN wcf" . $this->dbNo . "_language language
ON language.languageID = entry.languageID
" . $conditionBuilder;
}
$statement = $this->database->prepareStatement($sql);
$statement->execute($conditionBuilder->getParameters());
while ($row = $statement->fetchArray()) {
Expand All @@ -2143,6 +2200,9 @@ public function exportBlogEntries($offset, $limit)
if (isset($categories[$row['entryID']])) {
$additionalData['categories'] = $categories[$row['entryID']];
}
if ($sourceVersion52 && $row['coverPhotoID']) {
$additionalData['coverPhoto'] = $this->getCoverPhotoPath($blogFilePath, $row);
}

$data = [
'userID' => $row['userID'],
Expand Down Expand Up @@ -2177,6 +2237,16 @@ public function exportBlogEntries($offset, $limit)
}
}

private function getCoverPhotoPath(string $filePath, array $row): string
{
$coverPhotoID = $row['coverPhotoID'];
$fileHash = $row["fileHash"];
$fileExtension = $row["fileExtension"];
$directory = \substr($fileHash, 0, 2);

return "{$filePath}images/coverPhotos/{$directory}/{$coverPhotoID}-{$fileHash}.{$fileExtension}";
}

/**
* Counts blog attachments.
*/
Expand Down Expand Up @@ -2633,6 +2703,20 @@ public function exportCalendarEvents($offset, $limit)
return;
}

$sourceVersion52 = \version_compare(
$this->getPackageVersion('com.woltlab.calendar'),
'5.2.0 Alpha 1',
'>='
);

$sql = "SELECT packageDir
FROM wcf" . $this->dbNo . "_package
WHERE package = ?";
$statement = $this->database->prepareStatement($sql, 1);
$statement->execute(['com.woltlab.calendar']);
$packageDir = $statement->fetchColumn();
$calendarFilePath = FileUtil::getRealPath($this->fileSystemPath . '/' . $packageDir);

// get tags
$tags = $this->getTags('com.woltlab.calendar.event', $eventIDs);

Expand All @@ -2659,11 +2743,21 @@ public function exportCalendarEvents($offset, $limit)
// get event
$conditionBuilder = new PreparedStatementConditionBuilder();
$conditionBuilder->add('event.eventID IN (?)', [$eventIDs]);
$sql = "SELECT event.*, language.languageCode
if ($sourceVersion52) {
$sql = "SELECT event.*, language.languageCode, coverPhoto.fileExtension, coverPhoto.fileHash
FROM calendar" . $this->dbNo . "_event event
LEFT JOIN wcf" . $this->dbNo . "_language language
ON language.languageID = event.languageID
LEFT JOIN calendar" . $this->dbNo . "_cover_photo coverPhoto
ON coverPhoto.coverPhotoID = event.coverPhotoID
" . $conditionBuilder;
} else {
$sql = "SELECT event.*, language.languageCode
FROM calendar" . $this->dbNo . "_event event
LEFT JOIN wcf" . $this->dbNo . "_language language
ON language.languageID = event.languageID
" . $conditionBuilder;
}
$statement = $this->database->prepareStatement($sql);
$statement->execute($conditionBuilder->getParameters());
while ($row = $statement->fetchArray()) {
Expand Down Expand Up @@ -2709,6 +2803,9 @@ public function exportCalendarEvents($offset, $limit)
// 3.0+
$data['categoryID'] = $row['categoryID'];
}
if ($sourceVersion52 && $row['coverPhotoID']) {
$additionalData['coverPhoto'] = $this->getCoverPhotoPath($calendarFilePath, $row);
}

ImportHandler::getInstance()
->getImporter('com.woltlab.calendar.event')
Expand Down Expand Up @@ -2940,6 +3037,77 @@ public function exportFilebaseCategories($offset, $limit)
);
}

/**
* Counts filebase licenses.
*/
public function countFilebaseLicenses()
{
if (\version_compare($this->getPackageVersion('com.woltlab.filebase'), '2.1.0 Alpha 1', '>=')) {
return $this->__getMaxID("filebase" . $this->dbNo . "_license", 'licenseID');
}

return 0;
}

/**
* Exports filebase licenses.
*
* @param int $offset
* @param int $limit
*/
public function exportFilebaseLicenses($offset, $limit)
{
// license support was added in 2.1.x
if (\version_compare($this->getPackageVersion('com.woltlab.filebase'), '2.1.0 Alpha 1', '<')) {
return;
}

$sql = "SELECT *
FROM filebase" . $this->dbNo . "_license
WHERE licenseID BETWEEN ? AND ?
ORDER BY licenseID";
$statement = $this->database->prepareStatement($sql);
$statement->execute([$offset + 1, $offset + $limit]);

$sql = "SELECT language_item.languageItemValue, language.languageCode
FROM wcf1_language_item language_item
LEFT JOIN wcf1_language language ON (language.languageID = language_item.languageID)
WHERE language_item.languageItem = ?";
$languageStatement = $this->database->prepareStatement($sql);

while ($row = $statement->fetchArray()) {
$additionalData = [];
$data = [
'licenseName' => $row['licenseName'],
'licenseURL' => $row['licenseURL'],
'licenseType' => License::LICENSE_TYPE_URL,
];
if (\version_compare($this->getPackageVersion('com.woltlab.filebase'), '5.2.0 Alpha 1', '>=')) {
// support licenseType `text`
if ($row['licenseType'] === License::LICENSE_TYPE_TEXT) {
$data['licenseType'] = License::LICENSE_TYPE_TEXT;
$data['licenseText'] = $row['licenseText'];

// load multi-language license text
if (\preg_match('~^filebase\.file\.license\d+\.licenseText$~', $data['licenseText'])) {
$languageStatement->execute([$data['licenseText']]);
while ($languageRow = $languageStatement->fetchArray()) {
$additionalData['licenseText'][$languageRow['languageCode']] = $languageRow['languageItemValue'];
}
}
}
}

ImportHandler::getInstance()
->getImporter('com.woltlab.filebase.license')
->import(
$row['licenseID'],
$data,
$additionalData
);
}
}

/**
* Counts filebase files.
*/
Expand Down Expand Up @@ -3110,8 +3278,11 @@ protected function exportFilebaseFilesHelper(array $row, array $contents = [], a
'isDeleted' => $row['isDeleted'],
'ipAddress' => $row['ipAddress'],
'deleteTime' => $row['deleteTime'],
'licenseID' => $row['licenseID'] ?? null,
'licenseName' => ($row['licenseName'] ?? ''),
'licenseType' => ($row['licenseType'] ?? 'predefined'),
'licenseURL' => ($row['licenseURL'] ?? ''),
'licenseText' => ($row['licenseText'] ?? ''),
'downloads' => $row['downloads'],
'isFeatured' => $row['isFeatured'],
'lastChangeTime' => $row['lastChangeTime'],
Expand All @@ -3123,6 +3294,9 @@ protected function exportFilebaseFilesHelper(array $row, array $contents = [], a
$data['iconExtension'] = $row['iconExtension'];
$additionalData['iconLocation'] = $this->getFilebaseDir() . 'images/file/' . \substr($row['iconHash'], 0, 2) . '/' . $row['fileID'] . '.' . $row['iconExtension'];
}
if (!empty($row['fontAwesomeIcon'])) {
$data['fontAwesomeIcon'] = $row['fontAwesomeIcon'];
}

if (!empty($categories)) {
if (\count($categories) == 1) {
Expand Down Expand Up @@ -4265,6 +4439,9 @@ private function exportCategories($objectType, $importer, $offset, $limit)
if (\str_starts_with($row['description'], 'wcf.category')) {
$i18nValues[] = $row['description'];
}
if ($row['additionalData'] !== null && @\unserialize($row['additionalData']) !== false) {
$categories[$row['categoryID']]['additionalData'] = $row['additionalData'];
}
}

$i18nValues = $this->getI18nValues($i18nValues);
Expand Down
16 changes: 4 additions & 12 deletions package.xml
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,8 @@
<packagename language="de">WoltLab Suite Core: Importer</packagename>
<packagedescription>Import data from other discussion board systems.</packagedescription>
<packagedescription language="de">Ermöglicht den Datenimport aus anderen Forensystemen.</packagedescription>
<version>6.0.0 RC 1</version>
<date>2023-09-15</date>
<version>6.0.7</version>
<date>2024-01-29</date>
</packageinformation>

<authorinformation>
Expand All @@ -15,7 +15,7 @@
</authorinformation>

<requiredpackages>
<requiredpackage minversion="6.0.0 RC 1">com.woltlab.wcf</requiredpackage>
<requiredpackage minversion="6.0.7">com.woltlab.wcf</requiredpackage>
</requiredpackages>

<excludedpackages>
Expand All @@ -30,15 +30,7 @@
<instruction type="objectType" />
</instructions>

<instructions type="update" fromversion="5.5.*">
<instruction type="file" />

<instruction type="language" />

<instruction type="objectType" />
</instructions>

<instructions type="update" fromversion="6.0.0 Beta 4">
<instructions type="update" fromversion="6.0.5">
<instruction type="file">files_update.tar</instruction>
</instructions>
</package>

0 comments on commit 081f9ed

Please sign in to comment.