summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--CHANGELOG.md7
-rw-r--r--Makefile2
-rw-r--r--appinfo/info.xml5
-rw-r--r--lib/Command/CheckInstall.php23
-rw-r--r--lib/Command/MigrateAlpha3.php482
-rw-r--r--lib/Command/Reset.php1
-rw-r--r--lib/Db/FollowsRequest.php6
-rw-r--r--lib/Db/FollowsRequestBuilder.php6
-rw-r--r--lib/Db/StreamTagsRequest.php15
-rw-r--r--lib/Migration/Version0003Date20200611000001.php238
-rw-r--r--package-lock.json17
-rw-r--r--package.json2
12 files changed, 681 insertions, 123 deletions
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 6e929aae..ec8df9ae 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,6 +1,13 @@
# Changelog
+## 0.3.0 (alpha 3.0)
+
+- [setup] fully indexed database structure.
+- [global] fixing issue with hashtags.
+- [global] compat nc19.
+
+
## 0.2.101
- [setup] fixing an issue with migration on pgsql
diff --git a/Makefile b/Makefile
index 4678b43e..9bd559d6 100644
--- a/Makefile
+++ b/Makefile
@@ -12,7 +12,7 @@ cert_dir=$(HOME)/.nextcloud/certificates
github_account=nextcloud
branch=master
codecov_token_dir=$(HOME)/.nextcloud/codecov_token
-version+=0.2.101
+version+=0.3.0
diff --git a/appinfo/info.xml b/appinfo/info.xml
index 4bda7b49..2568bb2b 100644
--- a/appinfo/info.xml
+++ b/appinfo/info.xml
@@ -18,9 +18,9 @@
**🕸 Open standards:** We use the established ActivityPub standard!
]]></description>
- <version>0.3</version>
+ <version>0.3.0</version>
<licence>agpl</licence>
- <author mail="maxence@artificial-owl.com">Maxence Lange</author>
+ <author mail="maxence@artificial-owl.com" homepage="https://artificial-owl.com/">Maxence Lange</author>
<author mail="jus@bitgrid.net">Julius Härtl</author>
<author mail="jonas@violoncello.ch" homepage="https://violoncello.ch">Jonas Sulzer</author>
<author mail="hey@jancborchardt.net" homepage="https://jancborchardt.net">Jan-Christoph Borchardt</author>
@@ -55,6 +55,7 @@
<command>OCA\Social\Command\CacheRefresh</command>
<command>OCA\Social\Command\CheckInstall</command>
<command>OCA\Social\Command\Fediverse</command>
+ <command>OCA\Social\Command\MigrateAlpha3</command>
<command>OCA\Social\Command\NoteLike</command>
<command>OCA\Social\Command\NoteCreate</command>
<command>OCA\Social\Command\NoteBoost</command>
diff --git a/lib/Command/CheckInstall.php b/lib/Command/CheckInstall.php
index c01d85fb..84bc805b 100644
--- a/lib/Command/CheckInstall.php
+++ b/lib/Command/CheckInstall.php
@@ -124,11 +124,11 @@ class CheckInstall extends Base {
parent::configure();
$this->setName('social:check:install')
->addOption('index', '', InputOption::VALUE_NONE, 'regenerate your index')
- ->addOption(
- 'push', '', InputOption::VALUE_REQUIRED,
- 'a local account used to test integration to Nextcloud Push',
- ''
- )
+// ->addOption(
+// 'push', '', InputOption::VALUE_REQUIRED,
+// 'a local account used to test integration to Nextcloud Push',
+// ''
+// )
->setDescription('Check the integrity of the installation');
}
@@ -144,9 +144,9 @@ class CheckInstall extends Base {
return;
}
- if ($this->checkPushApp($input, $output)) {
- return;
- }
+// if ($this->checkPushApp($input, $output)) {
+// return;
+// }
$result = $this->checkService->checkInstallationStatus();
@@ -180,7 +180,7 @@ class CheckInstall extends Base {
// push was not implemented on 18
// $wrapper = $this->pushService->testOnAccount($userId);
- $output->writeln(json_encode($wrapper, JSON_PRETTY_PRINT));
+// $output->writeln(json_encode($wrapper, JSON_PRETTY_PRINT));
return true;
}
@@ -213,17 +213,16 @@ class CheckInstall extends Base {
$this->streamDestRequest->emptyStreamDest();
$this->streamTagsRequest->emptyStreamTags();
- $this->regenerateIndex($input, $output);
+ $this->regenerateIndex($output);
return true;
}
/**
- * @param InputInterface $input
* @param OutputInterface $output
*/
- private function regenerateIndex(InputInterface $input, OutputInterface $output) {
+ private function regenerateIndex(OutputInterface $output) {
$streams = $this->streamRequest->getAll();
$progressBar = new ProgressBar($output, count($streams));
$progressBar->start();
diff --git a/lib/Command/MigrateAlpha3.php b/lib/Command/MigrateAlpha3.php
new file mode 100644
index 00000000..2ec0e337
--- /dev/null
+++ b/lib/Command/MigrateAlpha3.php
@@ -0,0 +1,482 @@
+<?php
+declare(strict_types=1);
+
+
+/**
+ * Nextcloud - Social Support
+ *
+ * This file is licensed under the Affero General Public License version 3 or
+ * later. See the COPYING file.
+ *
+ * @author Maxence Lange <maxence@artificial-owl.com>
+ * @copyright 2018, Maxence Lange <maxence@artificial-owl.com>
+ * @license GNU AGPL version 3 or any later version
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+
+namespace OCA\Social\Command;
+
+
+use daita\MySmallPhpTools\Traits\TArrayTools;
+use Exception;
+use OC\Core\Command\Base;
+use OCA\Social\Db\CoreRequestBuilder;
+use OCA\Social\Service\CheckService;
+use OCA\Social\Service\ConfigService;
+use OCA\Social\Service\MiscService;
+use OCP\DB\QueryBuilder\IParameter;
+use OCP\DB\QueryBuilder\IQueryBuilder;
+use OCP\IDBConnection;
+use Symfony\Component\Console\Input\InputInterface;
+use Symfony\Component\Console\Input\InputOption;
+use Symfony\Component\Console\Output\OutputInterface;
+use Symfony\Component\Console\Question\ConfirmationQuestion;
+
+
+class MigrateAlpha3 extends Base {
+
+
+ use TArrayTools;
+
+
+ /** @var IDBConnection */
+ private $dbConnection;
+
+ /** @var CoreRequestBuilder */
+ private $coreRequestBuilder;
+
+ /** @var CheckService */
+ private $checkService;
+
+ /** @var ConfigService */
+ private $configService;
+
+ /** @var MiscService */
+ private $miscService;
+
+ /** @var array */
+ private $done = [];
+
+
+ /** @var array */
+ public $tables = [
+ 'social_a2_actions' => [
+ ['id_prim'],
+ 'social_3_action',
+ [
+ 'actor_id_prim' => 'PRIM:actor_id',
+ 'object_id_prim' => 'PRIM:object_id'
+ ]
+ ],
+ 'social_a2_actors' => [['user_id'], 'social_3_actor', []],
+ 'social_a2_cache_actors' => [['id_prim'], 'social_3_cache_actor', []],
+ 'social_a2_cache_documts' => [['id_prim'], 'social_3_cache_doc', []],
+ 'social_a2_follows' => [
+ ['id_prim'],
+ 'social_3_follow',
+ [
+ 'actor_id_prim' => 'PRIM:actor_id',
+ 'object_id_prim' => 'PRIM:object_id',
+ 'follow_id_prim' => 'PRIM:follow_id'
+ ]
+ ],
+
+ 'social_a2_hashtags' => [['hashtag'], 'social_3_hashtag', []],
+ 'social_a2_request_queue' => [['id'], 'social_3_req_queue', []],
+ 'social_a2_stream' => [
+ ['id_prim'],
+ 'social_3_stream',
+ [
+ 'object_id_prim' => 'PRIM:object_id',
+ 'in_reply_to_prim' => 'PRIM:in_reply_to',
+ 'attributed_to_prim' => 'PRIM:attributed_to',
+ 'filter_duplicate' => 'COPY:hidden_on_timeline',
+ 'hidden_on_timeline' => 'REMOVED:'
+ ]
+ ],
+ 'social_a2_stream_action' => [
+ ['id'],
+ 'social_3_stream_act',
+ [
+ 'actor_id_prim' => 'PRIM:actor_id',
+ 'stream_id_prim' => 'PRIM:stream_id',
+ '_function_' => 'migrateTableStreamAction'
+ ]
+ ],
+ 'social_a2_stream_queue' => [['id'], 'social_3_stream_queue', []]
+ ];
+
+
+ /**
+ * CacheUpdate constructor.
+ *
+ * @param IDBConnection $dbConnection
+ * @param CoreRequestBuilder $coreRequestBuilder
+ * @param CheckService $checkService
+ * @param ConfigService $configService
+ * @param MiscService $miscService
+ */
+ public function __construct(
+ IDBConnection $dbConnection, CoreRequestBuilder $coreRequestBuilder, CheckService $checkService,
+ ConfigService $configService, MiscService $miscService
+ ) {
+ parent::__construct();
+ $this->dbConnection = $dbConnection;
+ $this->checkService = $checkService;
+ $this->coreRequestBuilder = $coreRequestBuilder;
+ $this->configService = $configService;
+ $this->miscService = $miscService;
+ }
+
+
+ /**
+ *
+ */
+ protected function configure() {
+ parent::configure();
+ $this->setName('social:migrate:alpha3')
+ ->setDescription('Trying to migrate old data to Alpha3')
+ ->addOption(
+ 'remove-migrated-tables', '', InputOption::VALUE_NONE, 'Remove old table once copy is done'
+ )
+ ->addOption(
+ 'force-remove-old-tables', '', InputOption::VALUE_NONE, 'Force remove old tables'
+ );
+ }
+
+
+ /**
+ * @param InputInterface $input
+ * @param OutputInterface $output
+ *
+ * @throws Exception
+ */
+ protected function execute(InputInterface $input, OutputInterface $output) {
+ $tables = $this->checkTables();
+
+ if ($input->getOption('force-remove-old-tables')) {
+ foreach ($tables as $table) {
+ $this->dropTable($table);
+ }
+
+ return;
+ }
+
+ if (empty($tables)) {
+ $output->writeln('Nothing to migrate.');
+
+ return;
+ }
+
+ $defTables = '';
+ if (sizeof($tables) < sizeof($this->tables)) {
+ $defTables = ': \'' . implode("', '", $tables) . '\'';
+ }
+
+ $output->writeln(
+ 'Found ' . sizeof($tables) . ' tables to migrate' . $defTables . '.'
+ );
+
+ if (!$this->confirmExecute($input, $output)) {
+ return;
+ }
+
+ $this->done = [];
+ $this->migrateTables($output, $tables);
+
+ if ($input->getOption('remove-migrated-tables')) {
+ $this->dropDeprecatedTables($input, $output);
+ }
+ }
+
+
+ /**
+ * @return string[]
+ */
+ private function checkTables(): array {
+ $ak = array_keys($this->tables);
+ $tables = [];
+ foreach ($ak as $k) {
+ if ($this->dbConnection->tableExists($k)) {
+ $tables[] = $k;
+ }
+ }
+
+ return $tables;
+ }
+
+
+ /**
+ * @param InputInterface $input
+ * @param OutputInterface $output
+ *
+ * @return bool
+ */
+ private function confirmExecute(InputInterface $input, OutputInterface $output): bool {
+ $helper = $this->getHelper('question');
+ $output->writeln('');
+ $question = new ConfirmationQuestion(
+ '<info>Do you want to migrate data from the old database?</info> (y/N) ', false, '/^(y|Y)/i'
+ );
+
+ if (!$helper->ask($input, $output, $question)) {
+ return false;
+ }
+
+ return true;
+ }
+
+
+ /**
+ * @param OutputInterface $output
+ * @param array $tables
+ */
+ private function migrateTables(OutputInterface $output, array $tables) {
+ foreach ($tables as $table) {
+ try {
+ $this->migrateTable($output, $table);
+ $output->writeln('Migration of \'<comment>' . $table . '</comment>\': <info>ok</info>');
+ } catch (Exception $e) {
+ $output->writeln(
+ 'Migration of \'<comment>' . $table . '</comment>\': <error>fail</error> - '
+ . $e->getMessage()
+ );
+ }
+ }
+
+ }
+
+
+ /**
+ * @param OutputInterface $output
+ * @param string $table
+ */
+ private function migrateTable(OutputInterface $output, string $table) {
+ $output->writeln('');
+ $output->writeln('Retrieving data from \'' . $table . '\'.');
+ $fullContent = $this->getContentFromTable($table);
+
+ $output->write('Found ' . count($fullContent) . ' entries');
+ $m = $copied = 0;
+ foreach ($fullContent as $entry) {
+ if ($m % 50 == 0) {
+ $output->write('.');
+ }
+
+ if ($this->migrateEntry($table, $entry)) {
+ $copied++;
+ }
+
+ $m++;
+ }
+
+ $output->writeln(' <info>' . $copied . ' copied</info>');
+
+ $this->done[] = $table;
+ }
+
+
+ /**
+ * @param string $table
+ *
+ * @return array
+ */
+ private function getContentFromTable(string $table): array {
+ $qb = $this->dbConnection->getQueryBuilder();
+
+ $qb->select('*')
+ ->from($table);
+
+ $entries = [];
+ $cursor = $qb->execute();
+ while ($data = $cursor->fetch()) {
+ $entries[] = $data;
+ }
+ $cursor->closeCursor();
+
+ return $entries;
+ }
+
+
+ /**
+ * @param string $table
+ * @param $entry
+ *
+ * @return bool
+ */
+ private function migrateEntry(string $table, $entry): bool {
+ if (!$this->checkUnique($table, $entry)) {
+ return false;
+ }
+
+ list(, $destTable, $destDefault) = $this->tables[$table];
+
+ $qb = $this->dbConnection->getQueryBuilder();
+
+ $qb->insert($destTable);
+ $ak = array_merge(array_keys($entry), array_keys($destDefault));
+ foreach ($ak as $k) {
+ if ($k === '_function_') {
+ continue;
+ }
+
+ $value = '';
+
+ try {
+ if ($this->get($k, $entry, '') !== '') {
+ $this->manageDefault($qb, $this->get($k, $destDefault), $entry);
+ $value = $entry[$k];
+ } else if (array_key_exists($k, $destDefault)) {
+ $value = $this->manageDefault($qb, $destDefault[$k], $entry);
+ }
+ } catch (Exception $e) {
+ continue;
+ }
+
+ if ($value !== '') {
+ $qb->setValue($k, $qb->createNamedParameter($value));
+ }
+ }
+
+ if (array_key_exists('_function_', $destDefault)) {
+ call_user_func_array([$this, $destDefault['_function_']], [$qb, $entry]);
+ }
+
+ $qb->execute();
+
+ return true;
+ }
+
+
+ /**
+ * @param string $table
+ * @param $entry
+ *
+ * @return bool
+ */
+ private function checkUnique(string $table, $entry): bool {
+ list($unique, $destTable) = $this->tables[$table];
+
+ $qb = $this->dbConnection->getQueryBuilder();
+ $qb->select('*')
+ ->from($destTable);
+
+ $expr = $qb->expr();
+ $andX = $expr->andX();
+ foreach ($unique as $f) {
+ $andX->add($expr->eq($f, $qb->createNamedParameter($entry[$f])));
+ }
+ $qb->andWhere($andX);
+
+ $cursor = $qb->execute();
+ $data = $cursor->fetch();
+ $cursor->closeCursor();
+
+ if ($data === false) {
+ return true;
+ }
+
+ return false;
+ }
+
+
+ /**
+ * @param IQueryBuilder $qb
+ * @param string $default
+ * @param array $entry
+ *
+ * @return IParameter|string
+ * @throws Exception
+ */
+ private function manageDefault(IQueryBuilder $qb, string $default, array $entry) {
+ if ($default === '') {
+ return '';
+ }
+
+ if (!strpos($default, ':')) {
+ return $qb->createNamedParameter($default);
+ }
+
+ list($k, $v) = explode(':', $default, 2);
+ switch ($k) {
+ case 'COPY':
+ return $this->get($v, $entry, '');
+
+ case 'PRIM':
+ if ($this->get($v, $entry, '') === '') {
+ return '';
+ }
+
+ return hash('sha512', $entry[$v]);
+
+ case 'REMOVED':
+ throw new Exception();
+ }
+
+ return '';
+ }
+
+
+ /**
+ * @param InputInterface $input
+ * @param OutputInterface $output
+ */
+ private function dropDeprecatedTables(InputInterface $input, OutputInterface $output) {
+ $helper = $this->getHelper('question');
+ $output->writeln('');
+ $question = new ConfirmationQuestion(
+ '<info>You migrate ' . count($this->done) . ' table. Do you want to remove them ?</info> (y/N) ',
+ false, '/^(y|Y)/i'
+ );
+
+ if (!$helper->ask($input, $output, $question)) {
+ return;
+ }
+
+ foreach ($this->done as $table) {
+ $this->dropTable($table);
+ }
+ }
+
+
+ /**
+ * @param string $table
+ */
+ private function dropTable(string $table) {
+ $this->dbConnection->dropTable($table);
+ }
+
+
+ /**
+ * @param IQueryBuilder $qb
+ * @param array $entry
+ */
+ public function migrateTableStreamAction(IQueryBuilder $qb, array $entry) {
+ $values = json_decode($entry['values'], true);
+ if ($values === null) {
+ return;
+ }
+
+ $liked = ($this->getBool('liked', $values)) ? '1' : '0';
+ $boosted = ($this->getBool('boosted', $values)) ? '1' : '0';
+
+ $qb->setValue('liked', $qb->createNamedParameter($liked));
+ $qb->setValue('boosted', $qb->createNamedParameter($boosted));
+ }
+
+}
+
diff --git a/lib/Command/Reset.php b/lib/Command/Reset.php
index 5601aab4..0a24b5c8 100644
--- a/lib/Command/Reset.php
+++ b/lib/Command/Reset.php
@@ -47,6 +47,7 @@ use Symfony\Component\Console\Question\Question;
class Reset extends Base {
+ /** @var CoreRequestBuilder */
private $coreRequestBuilder;
/** @var CheckService */
diff --git a/lib/Db/FollowsRequest.php b/lib/Db/FollowsRequest.php
index ec46401f..c9138ba4 100644
--- a/lib/Db/FollowsRequest.php
+++ b/lib/Db/FollowsRequest.php
@@ -76,8 +76,7 @@ class FollowsRequest extends FollowsRequestBuilder {
} catch (Exception $e) {
}
- $this->generatePrimaryKey($qb, $follow->getId());
-
+ $qb->generatePrimaryKey($follow->getId());
$qb->execute();
}
@@ -102,8 +101,7 @@ class FollowsRequest extends FollowsRequestBuilder {
} catch (Exception $e) {
}
- $this->generatePrimaryKey($qb, $actor->getId());
-
+ $qb->generatePrimaryKey($actor->getId());
$qb->execute();
}
diff --git a/lib/Db/FollowsRequestBuilder.php b/lib/Db/FollowsRequestBuilder.php
index 91695738..eb3bc2d4 100644
--- a/lib/Db/FollowsRequestBuilder.php
+++ b/lib/Db/FollowsRequestBuilder.php
@@ -51,10 +51,10 @@ class FollowsRequestBuilder extends CoreRequestBuilder {
/**
* Base of the Sql Insert request
*
- * @return IQueryBuilder
+ * @return SocialQueryBuilder
*/
- protected function getFollowsInsertSql(): IQueryBuilder {
- $qb = $this->dbConnection->getQueryBuilder();
+ protected function getFollowsInsertSql(): SocialQueryBuilder {
+ $qb = $this->getQueryBuilder();
$qb->insert(self::TABLE_FOLLOWS);
return $qb;
diff --git a/lib/Db/StreamTagsRequest.php b/lib/Db/StreamTagsRequest.php
index c8504c03..6fcba5ec 100644
--- a/lib/Db/StreamTagsRequest.php
+++ b/lib/Db/StreamTagsRequest.php
@@ -33,6 +33,7 @@ namespace OCA\Social\Db;
use daita\MySmallPhpTools\Traits\TStringTools;
use Doctrine\DBAL\Exception\UniqueConstraintViolationException;
+use OCA\Social\Model\ActivityPub\Object\Note;
use OCA\Social\Model\ActivityPub\Stream;
@@ -51,19 +52,17 @@ class StreamTagsRequest extends StreamTagsRequestBuilder {
* @param Stream $stream
*/
public function generateStreamTags(Stream $stream) {
- $hashtags = $stream->getTags();
+ if ($stream->getType() !== Note::TYPE) {
+ return;
+ }
- foreach ($hashtags as $hashtag) {
- $tag = $this->get('name', $hashtag);
- if ($this->get('type', $hashtag) !== 'Hashtag' || $tag === '') {
- continue;
- }
+ /** @var Note $stream */
+ foreach ($stream->getHashTags() as $hashtag) {
- $tag = substr($tag, 1);
$qb = $this->getStreamTagsInsertSql();
$streamId = $qb->prim($stream->getId());
$qb->setValue('stream_id', $qb->createNamedParameter($streamId));
- $qb->setValue('hashtag', $qb->createNamedParameter($tag));
+ $qb->setValue('hashtag', $qb->createNamedParameter($hashtag));
try {
$qb->execute();
} catch (UniqueConstraintViolationException $e) {
diff --git a/lib/Migration/Version0003Date20200611000001.php b/lib/Migration/Version0003Date20200611000001.php
index c8621ede..6593a912 100644
--- a/lib/Migration/Version0003Date20200611000001.php
+++ b/lib/Migration/Version0003Date20200611000001.php
@@ -128,34 +128,39 @@ class Version0003Date20200611000001 extends SimpleMigrationStep {
[
'notnull' => false,
'length' => 31,
+ 'default' => ''
]
);
$table->addColumn(
'actor_id', 'string',
[
- 'notnull' => true,
+ 'notnull' => false,
'length' => 1000,
+ 'default' => ''
]
);
$table->addColumn(
'actor_id_prim', 'string',
[
- 'notnull' => true,
+ 'notnull' => false,
'length' => 128,
+ 'default' => ''
]
);
$table->addColumn(
'object_id', 'string',
[
- 'notnull' => true,
+ 'notnull' => false,
'length' => 1000,
+ 'default' => ''
]
);
$table->addColumn(
'object_id_prim', 'string',
[
- 'notnull' => true,
+ 'notnull' => false,
'length' => 128,
+ 'default' => ''
]
);
$table->addColumn(
@@ -197,28 +202,30 @@ class Version0003Date20200611000001 extends SimpleMigrationStep {
$table->addColumn(
'user_id', 'string',
[
- 'notnull' => true,
+ 'notnull' => false,
'length' => 63,
]
);
$table->addColumn(
'preferred_username', 'string',
[
- 'notnull' => true,
+ 'notnull' => false,
'length' => 127,
]
);
$table->addColumn(
'name', 'string',
[
- 'notnull' => true,
+ 'notnull' => false,
'length' => 127,
+ 'default' => ''
]
);
$table->addColumn(
'summary', Type::TEXT,
[
- 'notnull' => true
+ 'notnull' => false,
+ 'default' => ''
]
);
$table->addColumn(
@@ -279,48 +286,55 @@ class Version0003Date20200611000001 extends SimpleMigrationStep {
[
'notnull' => false,
'length' => 31,
+ 'default' => ''
]
);
$table->addColumn(
'actor_id', 'string',
[
- 'notnull' => true,
+ 'notnull' => false,
'length' => 1000,
+ 'default' => ''
]
);
$table->addColumn(
'actor_id_prim', 'string',
[
- 'notnull' => true,
+ 'notnull' => false,
'length' => 128,
+ 'default' => ''
]
);
$table->addColumn(
'object_id', 'string',
[
- 'notnull' => true,
+ 'notnull' => false,
'length' => 1000,
+ 'default' => ''
]
);
$table->addColumn(
'object_id_prim', 'string',
[
- 'notnull' => true,
+ 'notnull' => false,
'length' => 128,
+ 'default' => ''
]
);
$table->addColumn(
'follow_id', 'string',
[
- 'notnull' => true,
+ 'notnull' => false,
'length' => 1000,
+ 'default' => ''
]
);
$table->addColumn(
'follow_id_prim', 'string',
[
- 'notnull' => true,
+ 'notnull' => false,
'length' => 128,
+ 'default' => ''
]
);
$table->addColumn(
@@ -363,7 +377,8 @@ class Version0003Date20200611000001 extends SimpleMigrationStep {
'trend', 'string',
[
'notnull' => false,
- 'length' => 500
+ 'length' => 500,
+ 'default' => ''
]
);
@@ -398,59 +413,68 @@ class Version0003Date20200611000001 extends SimpleMigrationStep {
$table->addColumn(
'type', 'string',
[
- 'notnull' => true,
+ 'notnull' => false,
'length' => 31,
+ 'default' => ''
]
);
$table->addColumn(
'subtype', Type::STRING,
[
- 'notnull' => true,
+ 'notnull' => false,
'length' => 31,
+ 'default' => ''
]
);
$table->addColumn(
'to', 'string',
[
- 'notnull' => true,
+ 'notnull' => false,
'length' => 1000,
+ 'default' => ''
]
);
$table->addColumn(
'to_array', Type::TEXT,
[
- 'notnull' => true
+ 'notnull' => false,
+ 'default' => ''
]
);
$table->addColumn(
'cc', Type::TEXT,
[
- 'notnull' => true
+ 'notnull' => false,
+ 'default' => ''
]
);
$table->addColumn(
'bcc', Type::TEXT,
[
- 'notnull' => true
+ 'notnull' => false,
+ 'default' => ''
]
);
$table->addColumn(
'content', Type::TEXT,
[
- 'notnull' => true
+ 'notnull' => false,
+ 'default' => ''
]
);
$table->addColumn(
'summary', Type::TEXT,
[
- 'notnull' => true
+ 'notnull' => false,
+ 'default' => ''
]
);
$table->addColumn(
'published', 'string',
[
- 'notnull' => true,
+ 'notnull' => false,
'length' => 31,
+ 'default' => ''
]
);
$table->addColumn(
@@ -464,13 +488,15 @@ class Version0003Date20200611000001 extends SimpleMigrationStep {
[
'notnull' => false,
'length' => 1000,
+ 'default' => ''
]
);
$table->addColumn(
'attributed_to_prim', 'string',
[
- 'notnull' => true,
+ 'notnull' => false,
'length' => 128,
+ 'default' => ''
]
);
$table->addColumn(
@@ -478,13 +504,15 @@ class Version0003Date20200611000001 extends SimpleMigrationStep {
[
'notnull' => false,
'length' => 1000,
+ 'default' => ''
]
);
$table->addColumn(
'in_reply_to_prim', 'string',
[
- 'notnull' => true,
+ 'notnull' => false,
'length' => 128,
+ 'default' => ''
]
);
$table->addColumn(
@@ -492,6 +520,7 @@ class Version0003Date20200611000001 extends SimpleMigrationStep {
[
'notnull' => false,
'length' => 1000,
+ 'default' => ''
]
);
$table->addColumn(
@@ -499,50 +528,57 @@ class Version0003Date20200611000001 extends SimpleMigrationStep {
[
'notnull' => false,
'length' => 1000,
+ 'default' => ''
]
);
$table->addColumn(
'object_id_prim', 'string',
[
- 'notnull' => true,
+ 'notnull' => false,
'length' => 128,
+ 'default' => ''
]
);
$table->addColumn(
- 'hashtags', 'string',
+ 'hashtags', Type::TEXT,
[
'notnull' => false,