diff --git a/src/LabsDao.php b/src/LabsDao.php index 797f478..eab0fab 100644 --- a/src/LabsDao.php +++ b/src/LabsDao.php @@ -1,122 +1,122 @@ . */ namespace Tools\Admin; use Wikimedia\Slimapp\Dao\AbstractDao; /** * Data access object for Labs database */ class LabsDao extends AbstractDao { private $cache; private $toolinfo; public function __construct( $dsn, $user, $pass, $cache, $toolinfo, $logger = null ) { parent::__construct( $dsn, $user, $pass, $logger ); - // FIXME: Horrible hack for T164971 - $this->dbh->exec( 'set names latin1' ); + // T164971 + $this->dbh->exec( 'set names utf8mb4' ); $this->cache = $cache; $this->toolinfo = $toolinfo; } public function getAllUsers() { $key = 'labdb:users'; $users = $this->cache->load( $key ); if ( !$users ) { $records = $this->fetchAll( 'SELECT * FROM users' ); foreach ( $records as $idx => $row ) { $users[$row['name']] = $row; } $this->cache->save( $key, $users, 900 ); } return $users; } public function getAllTools() { $key = 'labsdb:alltools:v4'; $tools = $this->cache->load( $key ); if ( !$tools ) { $records = $this->fetchAll( 'SELECT * FROM tools ORDER BY name ASC' ); foreach ( $records as $idx => $row ) { $tools[$row['name']] = $this->toolsRowToArray( $row ); } $this->cache->save( $key, $tools, 900 ); } return $tools; } public function getTool( $name ) { $key = "labsdb:tool:{$name}"; $tool = $this->cache->load( $key ); if ( !$tool ) { $row = $this->fetch( 'SELECT * FROM tools WHERE name = ?', [ $name ] ); if ( $row ) { $tool = $this->toolsRowToArray( $row ); $this->cache->save( $key, $tool, 900 ); } } return $tool; } protected function toolsRowToArray( $row ) { $row['maintainers'] = explode( ' ', $row['maintainers'] ); sort( $row['maintainers'] ); $info = $this->toolinfo->getInfo( $row['name'] ); if ( !$info ) { $info = [ [ 'name' => $row['name'], 'title' => $row['name'], 'description' => $row['description'], 'keywords' => [], 'author' => [], ] ]; } foreach ( $info as $idx => $i ) { $info[$idx]['maintainers'] = $row['maintainers']; $info[$idx]['fulltext'] = $this->makeFulltext( $i, $row['maintainers'] ); } usort( $info, function ( $a, $b ) { $an = $a['title'] ?: $a['name']; $bn = $b['title'] ?: $b['name']; return strcmp( $an, $bn ); } ); $row['toolinfo'] = $info; return $row; } protected function makeFulltext( $tool, $maintainers ) { $ft = []; foreach ( [ 'name', 'title', 'description' ] as $i ) { $ft[] = $tool[$i]; } $ft = array_merge( $ft, $tool['keywords'] ); $ft = array_merge( $ft, $tool['author'] ); $ft = array_merge( $ft, $maintainers ); return strtolower( trim( implode( ' ', $ft ) ) ); } }