skipIf( $this->legacyCheck($schema, 'Framadate\Migration\RPadVotes_from_0_8'), 'Migration has been executed in an earlier database migration system' ); foreach ([Utils::table('poll'), Utils::table('slot'), Utils::table('vote'), Utils::table( 'comment' )] as $table) { $this->skipIf(!$schema->hasTable($table), 'Missing table ' . $table); } $driver_name = $this->connection->getDatabasePlatform()->getName(); switch ($driver_name) { case 'mysql': $this->addSql( 'UPDATE ' . Utils::table('vote') . ' fv INNER JOIN ( SELECT v.id, RPAD(v.choices, inn.slots_count, \'0\') new_choices FROM ' . Utils::table('vote') . ' v INNER JOIN (SELECT s.poll_id, SUM(IFNULL(LENGTH(s.moments) - LENGTH(REPLACE(s.moments, \',\', \'\')) + 1, 1)) slots_count FROM ' . Utils::table('slot') . ' s GROUP BY s.poll_id ORDER BY s.poll_id) inn ON inn.poll_id = v.poll_id WHERE LENGTH(v.choices) != inn.slots_count ) computed ON fv.id = computed.id SET fv.choices = computed.new_choices' ); break; case 'postgresql': $this->addSql( "UPDATE " . Utils::table('vote') . " fv SET choices = computed.new_choices FROM ( SELECT v.id, RPAD(v.choices::text, inn.slots_count::int, '0') new_choices FROM " . Utils::table('vote') . " v INNER JOIN (SELECT s.poll_id, SUM(coalesce(LENGTH(s.moments) - LENGTH(REPLACE(s.moments, ',', '')) + 1, 1)) slots_count FROM " . Utils::table('slot') . " s GROUP BY s.poll_id ORDER BY s.poll_id) inn ON inn.poll_id = v.poll_id WHERE LENGTH(v.choices) != inn.slots_count ) computed WHERE fv.id = computed.id" ); break; default: $this->skipIf(true, "Not on MySQL or PostgreSQL"); break; } } public function down(Schema $schema) { // TODO: Implement down() method. } }