mirror of
https://github.com/alchemy-fr/Phraseanet.git
synced 2025-10-14 05:23:21 +00:00
Merge pull request #1267 from bburnichon/feature/insight-fixes
[WIP] Insight fixes
This commit is contained in:
@@ -49,7 +49,8 @@ script:
|
||||
- bin/developer assets:compile-less
|
||||
- bin/developer system:uninstall
|
||||
- bin/setup system:install --email=test@phraseanet.com --password=test --db-user=root --db-template=fr --db-password= --databox=db_test --appbox=ab_test --server-name=http://127.0.0.1 -y;
|
||||
- sh -c " if [ '$SETUP_MODE' = 'update' ]; then
|
||||
- >
|
||||
sh -c "if [ '$SETUP_MODE' = 'update' ]; then
|
||||
bin/developer ini:reset --email=test@phraseanet.com --password=test --run-patches --no-setup-dbs;
|
||||
php resources/hudson/cleanupSubdefs.php;
|
||||
fi"
|
||||
|
1
AUTHORS
1
AUTHORS
@@ -1,5 +1,6 @@
|
||||
** Phraseanet is written and maintained by the Phraseanet Developer Team **
|
||||
|
||||
Benoît Burnichon
|
||||
Jean-Yves Gaulier
|
||||
Andrey Kalinovsky
|
||||
Nicolas Legoff
|
||||
|
@@ -71,7 +71,7 @@ main:
|
||||
host: 127.0.0.1
|
||||
port: 6700
|
||||
storage:
|
||||
subdefs:null
|
||||
subdefs: null
|
||||
cache: null
|
||||
log : null
|
||||
download: null
|
||||
|
@@ -29,11 +29,11 @@ class Status implements AttributeInterface
|
||||
} elseif (ctype_digit($status)) {
|
||||
$status = decbin((int) $status);
|
||||
} elseif (strpos($status, '0x') === 0 && ctype_xdigit(substr($status, 2))) {
|
||||
$status = \databox_status::hex2bin($app, $status);
|
||||
$status = \databox_status::hex2bin($status);
|
||||
} elseif (strpos($status, '0b') === 0 && preg_match('/^[01]+$/', substr($status, 2))) {
|
||||
$status = substr($status, 2);
|
||||
} elseif (ctype_xdigit($status)) {
|
||||
$status = \databox_status::hex2bin($app, $status);
|
||||
$status = \databox_status::hex2bin($status);
|
||||
} else {
|
||||
throw new \InvalidArgumentException('Invalid status argument');
|
||||
}
|
||||
|
@@ -348,13 +348,13 @@ class Edit implements ControllerProviderInterface
|
||||
if (!in_array($statbits, ['', 'null'])) {
|
||||
$mask_and = ltrim(str_replace(['x', '0', '1', 'z'], ['1', 'z', '0', '1'], $statbits), '0');
|
||||
if ($mask_and != '') {
|
||||
$newstat = \databox_status::operation_and_not($app, $newstat, $mask_and);
|
||||
$newstat = \databox_status::operation_and_not($newstat, $mask_and);
|
||||
}
|
||||
|
||||
$mask_or = ltrim(str_replace('x', '0', $statbits), '0');
|
||||
|
||||
if ($mask_or != '') {
|
||||
$newstat = \databox_status::operation_or($app, $newstat, $mask_or);
|
||||
$newstat = \databox_status::operation_or($newstat, $mask_or);
|
||||
}
|
||||
|
||||
$record->set_binary_status($newstat);
|
||||
|
@@ -1381,7 +1381,7 @@ class Xmlhttp implements ControllerProviderInterface
|
||||
// first, count the number of records to update
|
||||
foreach ($tsbas as $ksbas => $sbas) {
|
||||
|
||||
/* @var $databox databox */
|
||||
/* @var $databox \databox */
|
||||
try {
|
||||
$databox = $appbox->get_databox($sbas['sbas_id']);
|
||||
$connbas = $databox->get_connection();
|
||||
@@ -1394,7 +1394,7 @@ class Xmlhttp implements ControllerProviderInterface
|
||||
continue;
|
||||
}
|
||||
|
||||
$lid = '';
|
||||
$lids = [];
|
||||
$xpathct = new \DOMXPath($tsbas[$ksbas]['domct']);
|
||||
|
||||
foreach ($sbas['tids'] as $tid) {
|
||||
@@ -1403,7 +1403,7 @@ class Xmlhttp implements ControllerProviderInterface
|
||||
if ($nodes->length == 1) {
|
||||
$sy = $nodes->item(0);
|
||||
$syid = str_replace('.', 'd', $sy->getAttribute('id')) . 'd';
|
||||
$lid .= ( $lid ? ',' : '') . "'" . $syid . "'";
|
||||
$lids[] = $syid;
|
||||
$field = $sy->parentNode->parentNode->getAttribute('field');
|
||||
|
||||
if (!array_key_exists($field, $tsbas[$ksbas]['tvals'])) {
|
||||
@@ -1413,19 +1413,18 @@ class Xmlhttp implements ControllerProviderInterface
|
||||
}
|
||||
}
|
||||
|
||||
if ($lid == '') {
|
||||
if (empty($lids)) {
|
||||
// no cterm was found
|
||||
continue;
|
||||
}
|
||||
$tsbas[$ksbas]['lid'] = $lid;
|
||||
$tsbas[$ksbas]['lid'] = "'" . implode("','", $lids) . "'";
|
||||
|
||||
// count records
|
||||
$sql = 'SELECT DISTINCT record_id AS r
|
||||
FROM thit WHERE value IN (' . $lid . ')
|
||||
FROM thit WHERE value IN (:lids)
|
||||
ORDER BY record_id';
|
||||
$stmt = $connbas->prepare($sql);
|
||||
$stmt->execute();
|
||||
|
||||
$stmt->execute(['lids' => $lids]);
|
||||
$tsbas[$ksbas]['trids'] = $stmt->fetchAll(\PDO::FETCH_COLUMN, 0);
|
||||
$stmt->closeCursor();
|
||||
|
||||
|
@@ -11,8 +11,6 @@
|
||||
|
||||
namespace Alchemy\Phrasea\Core\Connection;
|
||||
|
||||
use Doctrine\Common\EventManager;
|
||||
use Doctrine\DBAL\Configuration;
|
||||
use Doctrine\DBAL\Driver\Connection;
|
||||
use Doctrine\DBAL\DriverManager;
|
||||
use Psr\Log\LoggerInterface;
|
||||
|
@@ -16,6 +16,7 @@ use Alchemy\Phrasea\Exception\InvalidArgumentException;
|
||||
use Alchemy\Phrasea\Model\Entities\User;
|
||||
use Alchemy\Phrasea\Notification\Mail\MailSuccessEmailUpdate;
|
||||
use Alchemy\Phrasea\Notification\Receiver;
|
||||
use Doctrine\DBAL\Connection;
|
||||
use Symfony\Component\HttpFoundation\Request;
|
||||
use Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException;
|
||||
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
|
||||
@@ -131,25 +132,39 @@ class Edit extends \Alchemy\Phrasea\Helper\Helper
|
||||
ON (bu.base_id = b.base_id AND u.id = bu.usr_id)
|
||||
LEFT join sbasusr sbu
|
||||
ON (sbu.sbas_id = b.sbas_id AND u.id = sbu.usr_id)
|
||||
WHERE ( (u.id = " . implode(' OR u.id = ', $this->users) . " )
|
||||
WHERE ( (u.id IN (:users) )
|
||||
AND b.sbas_id = s.sbas_id
|
||||
AND (b.base_id = '" . implode("' OR b.base_id = '", $list) . "'))
|
||||
AND (b.base_id IN (:bases)))
|
||||
GROUP BY b.base_id
|
||||
ORDER BY s.ord, s.sbas_id, b.ord, b.base_id ";
|
||||
|
||||
$stmt = $this->app['phraseanet.appbox']->get_connection()->prepare($sql);
|
||||
$stmt->execute();
|
||||
$rs = $stmt->fetchAll(\PDO::FETCH_ASSOC);
|
||||
$stmt->closeCursor();
|
||||
$rs = $this->app['phraseanet.appbox']->get_connection()->fetchAll(
|
||||
$sql,
|
||||
[
|
||||
'users' => $this->users,
|
||||
'bases' => $list,
|
||||
],
|
||||
[
|
||||
'users' => Connection::PARAM_INT_ARRAY,
|
||||
'bases' => Connection::PARAM_INT_ARRAY,
|
||||
]
|
||||
);
|
||||
|
||||
$sql = 'SELECT base_id, sum(1) as access FROM basusr
|
||||
WHERE (usr_id = ' . implode(' OR usr_id = ', $this->users) . ')
|
||||
AND (base_id = ' . implode(' OR base_id = ', $list) . ')
|
||||
WHERE (usr_id IN (:users))
|
||||
AND (base_id IN (:bases))
|
||||
GROUP BY base_id';
|
||||
$stmt = $this->app['phraseanet.appbox']->get_connection()->prepare($sql);
|
||||
$stmt->execute();
|
||||
$access = $stmt->fetchAll(\PDO::FETCH_ASSOC);
|
||||
$stmt->closeCursor();
|
||||
$access = $this->app['phraseanet.appbox']->get_connection()->fetchAll(
|
||||
$sql,
|
||||
[
|
||||
'users' => $this->users,
|
||||
'bases' => $list,
|
||||
],
|
||||
[
|
||||
'users' => Connection::PARAM_INT_ARRAY,
|
||||
'bases' => Connection::PARAM_INT_ARRAY,
|
||||
]
|
||||
);
|
||||
|
||||
$base_ids = [];
|
||||
foreach ($access as $acc) {
|
||||
@@ -194,14 +209,20 @@ class Edit extends \Alchemy\Phrasea\Helper\Helper
|
||||
|
||||
$sql = "SELECT u.id, restrict_dwnld, remain_dwnld, month_dwnld_max
|
||||
FROM (Users u INNER JOIN basusr bu ON u.id = bu.usr_id)
|
||||
WHERE (u.id = " . implode(' OR u.id = ', $this->users) . ")
|
||||
AND bu.base_id = :base_id";
|
||||
WHERE (u.id IN (:users)) AND bu.base_id = :base_id";
|
||||
|
||||
/** @var Connection $conn */
|
||||
$conn = $this->app['phraseanet.appbox']->get_connection();
|
||||
$stmt = $conn->prepare($sql);
|
||||
$stmt->execute([':base_id' => $this->base_id]);
|
||||
$rs = $stmt->fetchAll(\PDO::FETCH_ASSOC);
|
||||
$stmt->closeCursor();
|
||||
$rs = $conn->fetchAll($sql,
|
||||
[
|
||||
'base_id' => $this->base_id,
|
||||
'users' => $this->users,
|
||||
],
|
||||
[
|
||||
'base_id' => \PDO::PARAM_INT,
|
||||
'users' => Connection::PARAM_INT_ARRAY,
|
||||
]
|
||||
);
|
||||
|
||||
$this->users_datas = $rs;
|
||||
|
||||
@@ -220,14 +241,21 @@ class Edit extends \Alchemy\Phrasea\Helper\Helper
|
||||
|
||||
$sql = "SELECT BIN(mask_and) AS mask_and, BIN(mask_xor) AS mask_xor
|
||||
FROM basusr
|
||||
WHERE usr_id IN (" . implode(',', $this->users) . ")
|
||||
WHERE usr_id IN (:users)
|
||||
AND base_id = :base_id";
|
||||
|
||||
/** @var Connection $conn */
|
||||
$conn = $this->app['phraseanet.appbox']->get_connection();
|
||||
$stmt = $conn->prepare($sql);
|
||||
$stmt->execute([':base_id' => $this->base_id]);
|
||||
$rs = $stmt->fetchAll(\PDO::FETCH_ASSOC);
|
||||
$stmt->closeCursor();
|
||||
$rs = $conn->fetchAll($sql,
|
||||
[
|
||||
'base_id' => $this->base_id,
|
||||
'users' => $this->users,
|
||||
],
|
||||
[
|
||||
'base_id' => \PDO::PARAM_INT,
|
||||
'users' => Connection::PARAM_INT_ARRAY,
|
||||
]
|
||||
);
|
||||
|
||||
$tbits_and = [];
|
||||
$tbits_xor = [];
|
||||
@@ -317,14 +345,20 @@ class Edit extends \Alchemy\Phrasea\Helper\Helper
|
||||
|
||||
$sql = "SELECT u.id, time_limited, limited_from, limited_to
|
||||
FROM (Users u INNER JOIN basusr bu ON u.id = bu.usr_id)
|
||||
WHERE (u.id = " . implode(' OR u.id = ', $this->users) . ")
|
||||
AND bu.base_id = :base_id";
|
||||
WHERE (u.id IN (:users)) AND bu.base_id = :base_id";
|
||||
|
||||
/** @var Connection $conn */
|
||||
$conn = $this->app['phraseanet.appbox']->get_connection();
|
||||
$stmt = $conn->prepare($sql);
|
||||
$stmt->execute([':base_id' => $this->base_id]);
|
||||
$rs = $stmt->fetchAll(\PDO::FETCH_ASSOC);
|
||||
$stmt->closeCursor();
|
||||
$rs = $conn->fetchAll($sql,
|
||||
[
|
||||
'base_id' => $this->base_id,
|
||||
'users' => $this->users,
|
||||
],
|
||||
[
|
||||
'base_id' => \PDO::PARAM_INT,
|
||||
'users' => Connection::PARAM_INT_ARRAY,
|
||||
]
|
||||
);
|
||||
|
||||
$time_limited = -1;
|
||||
$limited_from = $limited_to = false;
|
||||
@@ -373,14 +407,20 @@ class Edit extends \Alchemy\Phrasea\Helper\Helper
|
||||
FROM (Users u
|
||||
INNER JOIN basusr bu ON u.id = bu.usr_id
|
||||
INNER JOIN bas b ON b.base_id = bu.base_id)
|
||||
WHERE (u.id = " . implode(' OR u.id = ', $this->users) . ")
|
||||
AND b.sbas_id = :sbas_id";
|
||||
WHERE (u.id IN (:users)) AND b.sbas_id = :sbas_id";
|
||||
|
||||
/** @var Connection $conn */
|
||||
$conn = $this->app['phraseanet.appbox']->get_connection();
|
||||
$stmt = $conn->prepare($sql);
|
||||
$stmt->execute([':sbas_id' => $sbas_id]);
|
||||
$rs = $stmt->fetchAll(\PDO::FETCH_ASSOC);
|
||||
$stmt->closeCursor();
|
||||
$rs = $conn->fetchAll($sql,
|
||||
[
|
||||
'sbas_id' => $sbas_id,
|
||||
'users' => $this->users,
|
||||
],
|
||||
[
|
||||
'sbas_id' => \PDO::PARAM_INT,
|
||||
'users' => Connection::PARAM_INT_ARRAY,
|
||||
]
|
||||
);
|
||||
|
||||
$time_limited = $limited_from = $limited_to = [];
|
||||
|
||||
|
@@ -24,20 +24,18 @@ class LazaretFileRepository extends EntityRepository
|
||||
{
|
||||
public function findPerPage(array $base_ids, $offset = 0, $perPage = 10)
|
||||
{
|
||||
$base_ids = implode(', ', array_map(function ($int) {
|
||||
return (int) $int;
|
||||
}, $base_ids));
|
||||
$builder = $this->createQueryBuilder('f');
|
||||
|
||||
$dql = '
|
||||
SELECT f
|
||||
FROM Phraseanet:LazaretFile f'
|
||||
. ('' === $base_ids ? '' : ' WHERE f.base_id IN (' . $base_ids . ')')
|
||||
. ' ORDER BY f.id DESC';
|
||||
if (! empty($base_ids)) {
|
||||
$builder->where($builder->expr()->in('f.base_id', $base_ids));
|
||||
}
|
||||
|
||||
$query = $this->_em->createQuery($dql);
|
||||
$query->setFirstResult($offset)
|
||||
->setMaxResults($perPage);
|
||||
$builder
|
||||
->orderBy('f.id', 'DESC')
|
||||
->setFirstResult($offset)
|
||||
->setMaxResults($perPage)
|
||||
;
|
||||
|
||||
return new Paginator($query, true);
|
||||
return new Paginator($builder->getQuery(), true);
|
||||
}
|
||||
}
|
||||
|
@@ -38,7 +38,7 @@ class RegistrationRepository extends EntityRepository
|
||||
|
||||
if (count($collections) > 0) {
|
||||
$qb->andWhere('d.baseId IN (:bases)');
|
||||
$qb->setParameter(':bases', array_map(function ($collection) {
|
||||
$qb->setParameter(':bases', array_map(function (\collection $collection) {
|
||||
return $collection->get_base_id();
|
||||
}, $collections));
|
||||
}
|
||||
|
@@ -293,7 +293,7 @@ class PhraseaEngine implements SearchEngineInterface
|
||||
*/
|
||||
public function updateRecord(\record_adapter $record)
|
||||
{
|
||||
$record->set_binary_status(\databox_status::dec2bin($this->app, bindec($record->get_status()) & ~7 | 4));
|
||||
$record->set_binary_status(\databox_status::dec2bin(bindec($record->get_status()) & ~7 | 4));
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
@@ -12,7 +12,7 @@
|
||||
namespace Alchemy\Phrasea\Setup\Version;
|
||||
|
||||
use Alchemy\Phrasea\Application;
|
||||
use Alchemy\Phrasea\Core\Version;
|
||||
use Doctrine\DBAL\Driver\Statement;
|
||||
|
||||
/**
|
||||
* In version 3.9 the user table have been removed.
|
||||
@@ -21,23 +21,42 @@ use Alchemy\Phrasea\Core\Version;
|
||||
*/
|
||||
class MailChecker
|
||||
{
|
||||
/** @var \appbox */
|
||||
private $appbox;
|
||||
/** @var string */
|
||||
private $table;
|
||||
|
||||
/**
|
||||
* Constructor
|
||||
*
|
||||
* @param \appbox $appbox
|
||||
* @param string $table
|
||||
*/
|
||||
public function __construct(\appbox $appbox, $table = 'usr')
|
||||
{
|
||||
$this->appbox = $appbox;
|
||||
$this->table = $table;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns users with duplicated emails
|
||||
*
|
||||
* @param \Application $app
|
||||
* @param string $table The table name where to look
|
||||
*
|
||||
* @return array An array of User
|
||||
*/
|
||||
public static function getWrongEmailUsers(Application $app, $table = 'usr')
|
||||
public function getWrongEmailUsers()
|
||||
{
|
||||
if (version_compare(Version::getNumber(), '3.9', '>')) {
|
||||
if (version_compare($this->appbox->get_version(), '3.9', '>=')) {
|
||||
return [];
|
||||
}
|
||||
|
||||
$sql = 'SELECT usr_mail, usr_id, last_conn, usr_login FROM '. $table .' WHERE usr_mail IS NOT NULL';
|
||||
$stmt = $app['phraseanet.appbox']->get_connection()->prepare($sql);
|
||||
$stmt->execute();
|
||||
$builder = $this->appbox->get_connection()->createQueryBuilder();
|
||||
/** @var Statement $stmt */
|
||||
$stmt = $builder
|
||||
->select('u.usr_mail', 'u.usr_id', 'u.last_conn', 'u.usr_login')
|
||||
->from($this->table, 'u')
|
||||
->where($builder->expr()->isNotNull('u.usr_mail'))
|
||||
->execute()
|
||||
;
|
||||
$rs = $stmt->fetchAll(\PDO::FETCH_ASSOC);
|
||||
$stmt->closeCursor();
|
||||
|
||||
@@ -66,4 +85,14 @@ class MailChecker
|
||||
|
||||
return $badUsers;
|
||||
}
|
||||
|
||||
/**
|
||||
* Whether there is users with same emails
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public function hasWrongEmailUsers()
|
||||
{
|
||||
return count($this->getWrongEmailUsers()) > 0;
|
||||
}
|
||||
}
|
||||
|
@@ -14,6 +14,7 @@ namespace Alchemy\Phrasea\Setup\Version\PreSchemaUpgrade;
|
||||
use Alchemy\Phrasea\Application;
|
||||
use Alchemy\Phrasea\Model\Entities\User;
|
||||
use Alchemy\Phrasea\Model\Entities\FtpCredential;
|
||||
use Doctrine\DBAL\Connection;
|
||||
use Doctrine\DBAL\Migrations\Configuration\Configuration;
|
||||
use Doctrine\ORM\EntityManager;
|
||||
use Doctrine\ORM\NoResultException;
|
||||
@@ -357,7 +358,11 @@ class Upgrade39Users implements PreSchemaUpgradeInterface
|
||||
);
|
||||
|
||||
$em->getConnection()->executeUpdate('UPDATE Users SET geoname_id=NULL WHERE geoname_id=0');
|
||||
$em->getConnection()->executeUpdate('UPDATE Users SET locale=NULL WHERE locale NOT IN ("'.implode('", "', array_keys(Application::getAvailableLanguages())).'")');
|
||||
$em->getConnection()->executeUpdate(
|
||||
'UPDATE Users SET locale=NULL WHERE locale NOT IN (:locales)',
|
||||
['locales' => array_keys(Application::getAvailableLanguages())],
|
||||
['locales' => Connection::PARAM_STR_ARRAY]
|
||||
);
|
||||
$em->getConnection()->executeUpdate('UPDATE Users SET deleted=1, login=SUBSTRING(login, 11) WHERE login LIKE "(#deleted_%"');
|
||||
}
|
||||
|
||||
@@ -367,14 +372,28 @@ class Upgrade39Users implements PreSchemaUpgradeInterface
|
||||
$perBatch = 100;
|
||||
|
||||
do {
|
||||
$sql = 'SELECT usr_id, activeFTP, addrFTP, loginFTP,
|
||||
retryFTP, passifFTP, pwdFTP, destFTP, prefixFTPfolder
|
||||
FROM usr
|
||||
WHERE
|
||||
usr_login NOT LIKE "(#deleted_%"
|
||||
AND model_of = 0
|
||||
AND addrFTP != ""'
|
||||
.sprintf(' LIMIT %d, %d', $offset, $perBatch);
|
||||
$builder = $em->getConnection()->createQueryBuilder();
|
||||
$sql = $builder
|
||||
->select(
|
||||
'u.usr_id',
|
||||
'u.activeFTP',
|
||||
'u.addrFTP',
|
||||
'u.loginFTP',
|
||||
'u.retryFTP',
|
||||
'u.passifFTP',
|
||||
'u.pwdFTP',
|
||||
'u.destFTP',
|
||||
'u.prefixFTPfolder'
|
||||
)
|
||||
->from('usr', 'u')
|
||||
->where(
|
||||
$builder->expr()->notLike('u.usr_login', $builder->expr()->literal('(#deleted_%')),
|
||||
$builder->expr()->eq('u.model_of', 0),
|
||||
$builder->expr()->neq('u.addrFTP', $builder->expr()->literal(''))
|
||||
)
|
||||
->setFirstResult($offset)
|
||||
->setMaxResults($perBatch)
|
||||
->getSQL();
|
||||
|
||||
$rs = $em->getConnection()->fetchAll($sql);
|
||||
|
||||
|
@@ -985,7 +985,7 @@ class ArchiveJob extends AbstractJob
|
||||
|
||||
public function createStory(Application $app, \collection $collection, $pathfile, $captionFile, $stat0, $stat1)
|
||||
{
|
||||
$status = \databox_status::operation_or($app, $stat0, $stat1);
|
||||
$status = \databox_status::operation_or($stat0, $stat1);
|
||||
|
||||
$media = $app['mediavorus']->guess($pathfile);
|
||||
|
||||
@@ -1000,7 +1000,7 @@ class ArchiveJob extends AbstractJob
|
||||
$captionStatus = $this->parseStatusBit(@simplexml_load_file($captionFile));
|
||||
|
||||
if ($captionStatus) {
|
||||
$status = \databox_status::operation_mask($app, $status, $captionStatus);
|
||||
$status = \databox_status::operation_mask($status, $captionStatus);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1013,7 +1013,7 @@ class ArchiveJob extends AbstractJob
|
||||
$story->set_metadatas($metaFields->toMetadataArray($metadatasStructure), true);
|
||||
}
|
||||
|
||||
$story->set_binary_status(\databox_status::operation_or($app, $stat0, $stat1));
|
||||
$story->set_binary_status(\databox_status::operation_or($stat0, $stat1));
|
||||
$story->rebuild_subdefs();
|
||||
|
||||
unset($media);
|
||||
@@ -1033,7 +1033,7 @@ class ArchiveJob extends AbstractJob
|
||||
*/
|
||||
public function createRecord(Application $app, \collection $collection, $pathfile, $captionFile, $grp_rid, $force, $stat0, $stat1)
|
||||
{
|
||||
$status = \databox_status::operation_or($app, $stat0, $stat1);
|
||||
$status = \databox_status::operation_or($stat0, $stat1);
|
||||
|
||||
$media = $app['mediavorus']->guess($pathfile);
|
||||
|
||||
@@ -1048,7 +1048,7 @@ class ArchiveJob extends AbstractJob
|
||||
$captionStatus = $this->parseStatusBit(@simplexml_load_file($captionFile));
|
||||
|
||||
if ($captionStatus) {
|
||||
$status = \databox_status::operation_mask($app, $status, $captionStatus);
|
||||
$status = \databox_status::operation_mask($status, $captionStatus);
|
||||
}
|
||||
}
|
||||
$file = new File($app, $media, $collection);
|
||||
|
@@ -39,8 +39,8 @@ class Setup_Upgrade
|
||||
|
||||
$this->app = $app;
|
||||
|
||||
if (version_compare($this->app['phraseanet.appbox']->get_version(), '3.9', '<')
|
||||
&& count(MailChecker::getWrongEmailUsers($app)) > 0) {
|
||||
$checker = new MailChecker($app['phraseanet.appbox']);
|
||||
if ($checker->hasWrongEmailUsers()) {
|
||||
throw new \Exception_Setup_FixBadEmailAddresses('Please fix the database before starting');
|
||||
}
|
||||
|
||||
|
@@ -21,22 +21,14 @@ use vierbergenlars\SemVer\version;
|
||||
|
||||
class appbox extends base
|
||||
{
|
||||
/**
|
||||
*
|
||||
* @var int
|
||||
*/
|
||||
/** @var int */
|
||||
protected $id;
|
||||
|
||||
/**
|
||||
*
|
||||
* constant defining the app type
|
||||
*/
|
||||
const BASE_TYPE = self::APPLICATION_BOX;
|
||||
|
||||
/**
|
||||
*
|
||||
* @var <type>
|
||||
*/
|
||||
protected $cache;
|
||||
protected $connection;
|
||||
protected $app;
|
||||
@@ -46,25 +38,16 @@ class appbox extends base
|
||||
const CACHE_LIST_BASES = 'list_bases';
|
||||
const CACHE_SBAS_IDS = 'sbas_ids';
|
||||
|
||||
/**
|
||||
* Constructor
|
||||
*
|
||||
* @return appbox
|
||||
*/
|
||||
public function __construct(Application $app)
|
||||
{
|
||||
$this->app = $app;
|
||||
$connexion = $app['conf']->get(['main', 'database']);
|
||||
|
||||
$this->connection = $app['db.provider']($connexion);
|
||||
parent::__construct($app, $app['db.provider']($connexion));
|
||||
|
||||
$this->host = $connexion['host'];
|
||||
$this->port = $connexion['port'];
|
||||
$this->user = $connexion['user'];
|
||||
$this->passwd = $connexion['password'];
|
||||
$this->dbname = $connexion['dbname'];
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
public function write_collection_pic(Alchemyst $alchemyst, Filesystem $filesystem, collection $collection, SymfoFile $pathfile = null, $pic_type)
|
||||
@@ -372,8 +355,7 @@ class appbox extends base
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* @return Array
|
||||
* @return databox[]
|
||||
*/
|
||||
public function get_databoxes()
|
||||
{
|
||||
|
@@ -12,74 +12,37 @@
|
||||
use Alchemy\Phrasea\Application;
|
||||
use Alchemy\Phrasea\Core\Version as PhraseaVersion;
|
||||
use vierbergenlars\SemVer\version;
|
||||
use Alchemy\Phrasea\Model\Entities\User;
|
||||
use Doctrine\DBAL\Driver\Connection;
|
||||
use Doctrine\DBAL\Connection;
|
||||
|
||||
abstract class base implements cache_cacheableInterface
|
||||
{
|
||||
protected $version;
|
||||
|
||||
/**
|
||||
*
|
||||
* @var int
|
||||
*/
|
||||
/** @var int */
|
||||
protected $id;
|
||||
|
||||
/**
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $schema;
|
||||
|
||||
/**
|
||||
*
|
||||
* @var <type>
|
||||
*/
|
||||
protected $dbname;
|
||||
|
||||
/**
|
||||
*
|
||||
* @var <type>
|
||||
*/
|
||||
protected $passwd;
|
||||
|
||||
/**
|
||||
* Database Username
|
||||
*
|
||||
* @var <type>
|
||||
*/
|
||||
protected $user;
|
||||
|
||||
/**
|
||||
*
|
||||
* @var <type>
|
||||
*/
|
||||
protected $port;
|
||||
|
||||
/**
|
||||
*
|
||||
* @var <type>
|
||||
*/
|
||||
protected $host;
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
/** @var Connection */
|
||||
protected $connection;
|
||||
/** @var Application */
|
||||
protected $app;
|
||||
|
||||
const APPLICATION_BOX = 'APPLICATION_BOX';
|
||||
/**
|
||||
*
|
||||
*/
|
||||
const DATA_BOX = 'DATA_BOX';
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
public function __construct(Application $application, Connection $connection)
|
||||
{
|
||||
$this->app = $application;
|
||||
$this->connection = $connection;
|
||||
}
|
||||
|
||||
abstract public function get_base_type();
|
||||
|
||||
/**
|
||||
*
|
||||
* @return <type>
|
||||
*/
|
||||
public function get_schema()
|
||||
{
|
||||
if ($this->schema) {
|
||||
@@ -91,55 +54,32 @@ abstract class base implements cache_cacheableInterface
|
||||
return $this->schema;
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* @return <type>
|
||||
*/
|
||||
public function get_dbname()
|
||||
{
|
||||
return $this->dbname;
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* @return <type>
|
||||
*/
|
||||
public function get_passwd()
|
||||
{
|
||||
return $this->passwd;
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* @return <type>
|
||||
*/
|
||||
public function get_user()
|
||||
{
|
||||
return $this->user;
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* @return <type>
|
||||
*/
|
||||
public function get_port()
|
||||
{
|
||||
return $this->port;
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* @return <type>
|
||||
*/
|
||||
public function get_host()
|
||||
{
|
||||
return $this->host;
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* @return Connection
|
||||
*/
|
||||
/** @return Connection */
|
||||
public function get_connection()
|
||||
{
|
||||
return $this->connection;
|
||||
@@ -150,11 +90,6 @@ abstract class base implements cache_cacheableInterface
|
||||
return $this->app['cache'];
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* @param <type> $option
|
||||
* @return <type>
|
||||
*/
|
||||
public function get_data_from_cache($option = null)
|
||||
{
|
||||
if ($this->get_base_type() == self::DATA_BOX) {
|
||||
@@ -340,7 +275,7 @@ abstract class base implements cache_cacheableInterface
|
||||
try {
|
||||
$sql = '';
|
||||
if ($this->get_base_type() === self::APPLICATION_BOX)
|
||||
$sql = 'UPDATE sitepreff SET version = "' . $version->getNumber() . '"';
|
||||
$sql = 'UPDATE sitepreff SET version = :version';
|
||||
if ($this->get_base_type() === self::DATA_BOX) {
|
||||
$sql = 'DELETE FROM pref WHERE prop="version" AND locale IS NULL';
|
||||
$this->get_connection()->query($sql);
|
||||
@@ -363,7 +298,6 @@ abstract class base implements cache_cacheableInterface
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* @return base
|
||||
*/
|
||||
protected function load_schema()
|
||||
@@ -387,7 +321,6 @@ abstract class base implements cache_cacheableInterface
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* @return base
|
||||
*/
|
||||
public function insert_datas()
|
||||
@@ -404,7 +337,6 @@ abstract class base implements cache_cacheableInterface
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* @param SimpleXMLElement $table
|
||||
* @return base
|
||||
*/
|
||||
|
@@ -10,6 +10,7 @@
|
||||
*/
|
||||
|
||||
use Alchemy\Phrasea\Application;
|
||||
use Doctrine\DBAL\Driver\Statement;
|
||||
|
||||
class caption_field implements cache_cacheableInterface
|
||||
{
|
||||
@@ -284,35 +285,35 @@ class caption_field implements cache_cacheableInterface
|
||||
|
||||
public static function rename_all_metadatas(Application $app, databox_field $databox_field)
|
||||
{
|
||||
$sql = 'SELECT count(id) as count_id FROM metadatas
|
||||
WHERE meta_struct_id = :meta_struct_id';
|
||||
$stmt = $databox_field->get_databox()->get_connection()->prepare($sql);
|
||||
$params = [
|
||||
':meta_struct_id' => $databox_field->get_id()
|
||||
];
|
||||
$connection = $databox_field->get_databox()->get_connection();
|
||||
$builder = $connection->createQueryBuilder();
|
||||
$builder
|
||||
->select('COUNT(m.id) AS count_id')
|
||||
->from('metadatas', 'm')
|
||||
->where($builder->expr()->eq('m.meta_struct_id', ':meta_struct_id'))
|
||||
->setParameter('meta_struct_id', $databox_field->get_id())
|
||||
;
|
||||
|
||||
$stmt->execute($params);
|
||||
$rowcount = $stmt->rowCount();
|
||||
/** @var Statement $stmt */
|
||||
$stmt = $builder->execute();
|
||||
$rowcount = $stmt->fetchColumn();
|
||||
$stmt->closeCursor();
|
||||
unset($stmt);
|
||||
|
||||
$n = 0;
|
||||
$increment = 500;
|
||||
|
||||
$builder
|
||||
->select('m.record_id', 'm.id')
|
||||
->setMaxResults($increment)
|
||||
;
|
||||
while ($n < $rowcount) {
|
||||
$sql = 'SELECT record_id, id FROM metadatas
|
||||
WHERE meta_struct_id = :meta_struct_id LIMIT ' . $n . ', ' . $increment;
|
||||
|
||||
$params = [
|
||||
':meta_struct_id' => $databox_field->get_id()
|
||||
];
|
||||
|
||||
$stmt = $databox_field->get_databox()->get_connection()->prepare($sql);
|
||||
$stmt->execute($params);
|
||||
$rowcount = $stmt->rowCount();
|
||||
$rs = $stmt->fetchAll(PDO::FETCH_ASSOC);
|
||||
$stmt->closeCursor();
|
||||
unset($stmt);
|
||||
/** @var Statement $stmt */
|
||||
$stmt = $builder
|
||||
->setFirstResult($n)
|
||||
->execute();
|
||||
|
||||
$rs = $stmt->fetchAll(\PDO::FETCH_ASSOC);
|
||||
foreach ($rs as $row) {
|
||||
try {
|
||||
$record = $databox_field->get_databox()->get_record($row['record_id']);
|
||||
@@ -326,43 +327,39 @@ class caption_field implements cache_cacheableInterface
|
||||
|
||||
$n += $increment;
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
public static function delete_all_metadatas(Application $app, databox_field $databox_field)
|
||||
{
|
||||
$sql = 'SELECT count(id) as count_id FROM metadatas
|
||||
WHERE meta_struct_id = :meta_struct_id';
|
||||
$connection = $databox_field->get_databox()->get_connection();
|
||||
$builder = $connection->createQueryBuilder();
|
||||
$builder
|
||||
->select('COUNT(m.id) AS count_id')
|
||||
->from('metadatas', 'm')
|
||||
->where($builder->expr()->eq('m.meta_struct_id', ':meta_struct_id'))
|
||||
->setParameter('meta_struct_id', $databox_field->get_id())
|
||||
;
|
||||
|
||||
$stmt = $databox_field->get_databox()->get_connection()->prepare($sql);
|
||||
$params = [
|
||||
':meta_struct_id' => $databox_field->get_id()
|
||||
];
|
||||
|
||||
$stmt->execute($params);
|
||||
$rowcount = $stmt->rowCount();
|
||||
/** @var Statement $stmt */
|
||||
$stmt = $builder->execute();
|
||||
$rowcount = $stmt->fetchColumn();
|
||||
$stmt->closeCursor();
|
||||
unset($stmt);
|
||||
|
||||
$n = 0;
|
||||
$increment = 500;
|
||||
|
||||
$builder
|
||||
->select('m.record_id', 'm.id')
|
||||
->setMaxResults($increment)
|
||||
;
|
||||
while ($n < $rowcount) {
|
||||
$sql = 'SELECT record_id, id FROM metadatas
|
||||
WHERE meta_struct_id = :meta_struct_id
|
||||
LIMIT ' . $n . ', ' . $increment;
|
||||
|
||||
$params = [
|
||||
':meta_struct_id' => $databox_field->get_id()
|
||||
];
|
||||
|
||||
$stmt = $databox_field->get_databox()->get_connection()->prepare($sql);
|
||||
$stmt->execute($params);
|
||||
$rowcount = $stmt->rowCount();
|
||||
$rs = $stmt->fetchAll(PDO::FETCH_ASSOC);
|
||||
$stmt->closeCursor();
|
||||
unset($stmt);
|
||||
/** @var Statement $stmt */
|
||||
$stmt = $builder
|
||||
->setFirstResult($n)
|
||||
->execute();
|
||||
|
||||
$rs = $stmt->fetchAll(\PDO::FETCH_ASSOC);
|
||||
foreach ($rs as $row) {
|
||||
try {
|
||||
$record = $databox_field->get_databox()->get_record($row['record_id']);
|
||||
|
@@ -12,7 +12,8 @@
|
||||
use Alchemy\Phrasea\Application;
|
||||
use Alchemy\Phrasea\Model\Entities\User;
|
||||
use Alchemy\Phrasea\Exception\InvalidArgumentException;
|
||||
use Doctrine\DBAL\Driver\Connection;
|
||||
use Doctrine\DBAL\Connection;
|
||||
use Doctrine\DBAL\Driver\Statement;
|
||||
use Symfony\Component\Filesystem\Filesystem;
|
||||
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
|
||||
use Symfony\Component\Translation\TranslatorInterface;
|
||||
@@ -101,42 +102,42 @@ class databox extends base
|
||||
const PIC_PDF = 'logopdf';
|
||||
|
||||
protected $cache;
|
||||
protected $connection;
|
||||
protected $app;
|
||||
private $labels = [];
|
||||
private $ord;
|
||||
private $viewname;
|
||||
private $loaded = false;
|
||||
|
||||
/**
|
||||
* @param Application $app
|
||||
* @param int $sbas_id
|
||||
*/
|
||||
public function __construct(Application $app, $sbas_id)
|
||||
{
|
||||
assert(is_int($sbas_id));
|
||||
assert($sbas_id > 0);
|
||||
|
||||
$this->app = $app;
|
||||
$this->id = $sbas_id;
|
||||
|
||||
$connection_params = phrasea::sbas_params($this->app);
|
||||
$connection_params = phrasea::sbas_params($app);
|
||||
|
||||
if (! isset($connection_params[$sbas_id])) {
|
||||
throw new NotFoundHttpException(sprintf('databox %d not found', $sbas_id));
|
||||
}
|
||||
|
||||
$this->connection = $app['db.provider']([
|
||||
$params = [
|
||||
'host' => $connection_params[$sbas_id]['host'],
|
||||
'port' => $connection_params[$sbas_id]['port'],
|
||||
'user' => $connection_params[$sbas_id]['user'],
|
||||
'password' => $connection_params[$sbas_id]['pwd'],
|
||||
'dbname' => $connection_params[$sbas_id]['dbname'],
|
||||
]);
|
||||
];
|
||||
parent::__construct($app, $app['db.provider']($params));
|
||||
|
||||
$this->host = $connection_params[$sbas_id]['host'];
|
||||
$this->port = $connection_params[$sbas_id]['port'];
|
||||
$this->user = $connection_params[$sbas_id]['user'];
|
||||
$this->passwd = $connection_params[$sbas_id]['pwd'];
|
||||
$this->dbname = $connection_params[$sbas_id]['dbname'];
|
||||
|
||||
return $this;
|
||||
$this->host = $params['host'];
|
||||
$this->port = $params['port'];
|
||||
$this->user = $params['user'];
|
||||
$this->passwd = $params['password'];
|
||||
$this->dbname = $params['dbname'];
|
||||
}
|
||||
|
||||
private function load()
|
||||
@@ -796,6 +797,7 @@ class databox extends base
|
||||
*/
|
||||
public function get_mountable_colls()
|
||||
{
|
||||
/** @var Connection $conn */
|
||||
$conn = $this->app['phraseanet.appbox']->get_connection();
|
||||
$colls = [];
|
||||
|
||||
@@ -804,6 +806,7 @@ class databox extends base
|
||||
$stmt->execute([':sbas_id' => $this->id]);
|
||||
$rs = $stmt->fetchAll(PDO::FETCH_ASSOC);
|
||||
$stmt->closeCursor();
|
||||
unset($stmt);
|
||||
|
||||
foreach ($rs as $row) {
|
||||
$colls[] = (int) $row['server_coll_id'];
|
||||
@@ -811,16 +814,22 @@ class databox extends base
|
||||
|
||||
$mountable_colls = [];
|
||||
|
||||
$sql = 'SELECT coll_id, asciiname FROM coll';
|
||||
|
||||
$builder = $this->get_connection()->createQueryBuilder();
|
||||
$builder
|
||||
->select('c.coll_id', 'c.asciiname')
|
||||
->from('coll', 'c');
|
||||
if (count($colls) > 0) {
|
||||
$sql .= ' WHERE coll_id NOT IN (' . implode(',', $colls) . ')';
|
||||
$builder
|
||||
->where($builder->expr()->notIn('c.coll_id', [':colls']))
|
||||
->setParameter('colls', $colls, Connection::PARAM_INT_ARRAY)
|
||||
;
|
||||
}
|
||||
|
||||
$stmt = $this->get_connection()->prepare($sql);
|
||||
$stmt->execute();
|
||||
/** @var Statement $stmt */
|
||||
$stmt = $builder->execute();
|
||||
$rs = $stmt->fetchAll(PDO::FETCH_ASSOC);
|
||||
$stmt->closeCursor();
|
||||
unset($stmt);
|
||||
|
||||
foreach ($rs as $row) {
|
||||
$mountable_colls[$row['coll_id']] = $row['asciiname'];
|
||||
@@ -831,6 +840,7 @@ class databox extends base
|
||||
|
||||
public function get_activable_colls()
|
||||
{
|
||||
/** @var Connection $conn */
|
||||
$conn = $this->app['phraseanet.appbox']->get_connection();
|
||||
$base_ids = [];
|
||||
|
||||
@@ -858,8 +868,7 @@ class databox extends base
|
||||
$dom_struct->documentElement
|
||||
->setAttribute("modification_date", $now = date("YmdHis"));
|
||||
|
||||
$sql = "UPDATE pref SET value= :structure, updated_on= :now
|
||||
WHERE prop='structure'";
|
||||
$sql = "UPDATE pref SET value= :structure, updated_on= :now WHERE prop='structure'";
|
||||
|
||||
$this->structure = $dom_struct->saveXML();
|
||||
|
||||
@@ -1075,10 +1084,7 @@ class databox extends base
|
||||
public function clear_logs()
|
||||
{
|
||||
foreach (['log', 'log_colls', 'log_docs', 'log_search', 'log_view', 'log_thumb'] as $table) {
|
||||
$sql = 'DELETE FROM ' . $table;
|
||||
$stmt = $this->get_connection()->prepare($sql);
|
||||
$stmt->execute();
|
||||
$stmt->closeCursor();
|
||||
$this->get_connection()->delete($table, []);
|
||||
}
|
||||
|
||||
return $this;
|
||||
@@ -1086,10 +1092,7 @@ class databox extends base
|
||||
|
||||
public function reindex()
|
||||
{
|
||||
$sql = 'UPDATE pref SET updated_on="0000-00-00 00:00:00" WHERE prop="indexes"';
|
||||
$stmt = $this->get_connection()->prepare($sql);
|
||||
$stmt->execute();
|
||||
$stmt->closeCursor();
|
||||
$this->get_connection()->update('pref', ['updated_on' => '0000-00-00 00:00:00'], ['prop' => 'indexes']);
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
@@ -149,126 +149,68 @@ class databox_status
|
||||
return true;
|
||||
}
|
||||
|
||||
public static function operation_and(Application $app, $stat1, $stat2)
|
||||
public static function operation_and($stat1, $stat2)
|
||||
{
|
||||
$conn = $app['phraseanet.appbox']->get_connection();
|
||||
|
||||
$status = '0';
|
||||
|
||||
if (substr($stat1, 0, 2) === '0x') {
|
||||
$stat1 = self::hex2bin($app, substr($stat1, 2));
|
||||
$stat1 = self::hex2bin(substr($stat1, 2));
|
||||
}
|
||||
if (substr($stat2, 0, 2) === '0x') {
|
||||
$stat2 = self::hex2bin($app, substr($stat2, 2));
|
||||
$stat2 = self::hex2bin(substr($stat2, 2));
|
||||
}
|
||||
|
||||
$sql = 'select bin(0b' . trim($stat1) . ' & 0b' . trim($stat2) . ') as result';
|
||||
|
||||
$stmt = $conn->prepare($sql);
|
||||
$stmt->execute();
|
||||
$row = $stmt->fetch(PDO::FETCH_ASSOC);
|
||||
$stmt->closeCursor();
|
||||
|
||||
if ($row) {
|
||||
$status = $row['result'];
|
||||
}
|
||||
|
||||
return $status;
|
||||
return dechex(hexdec($stat1) & hexdec($stat2));
|
||||
}
|
||||
|
||||
/**
|
||||
* compute ((0 M s1) M s2) where M is the "mask" operator
|
||||
* nb : s1,s2 are binary mask strings as "01x0xx1xx0x", no other format (hex) supported
|
||||
*
|
||||
* @param Application $app
|
||||
* @param $stat1 a binary mask "010x1xx0.." STRING
|
||||
* @param $stat2 a binary mask "x100x1..." STRING
|
||||
*
|
||||
* @return binary string
|
||||
* @return string
|
||||
*/
|
||||
public static function operation_mask(Application $app, $stat1, $stat2)
|
||||
public static function operation_mask($stat1, $stat2)
|
||||
{
|
||||
$conn = $app['phraseanet.appbox']->get_connection();
|
||||
$stat1 = str_pad($stat1, 32, '0', STR_PAD_LEFT);
|
||||
$stat2 = str_pad($stat2, 32, '0', STR_PAD_LEFT);
|
||||
$stat1_or = bindec(trim(str_replace("x", "0", $stat1)));
|
||||
$stat1_and = bindec(trim(str_replace("x", "1", $stat1)));
|
||||
$stat2_or = bindec(trim(str_replace("x", "0", $stat2)));
|
||||
$stat2_and = bindec(trim(str_replace("x", "1", $stat2)));
|
||||
|
||||
$status = '0';
|
||||
$stat1_or = '0b' . trim(str_replace("x", "0", $stat1));
|
||||
$stat1_and = '0b' . trim(str_replace("x", "1", $stat1));
|
||||
$stat2_or = '0b' . trim(str_replace("x", "0", $stat2));
|
||||
$stat2_and = '0b' . trim(str_replace("x", "1", $stat2));
|
||||
|
||||
// $sql = "SELECT BIN(((((0 | :o1) & :a1)) | :o2) & :a2) AS result";
|
||||
// $stmt = $conn->prepare($sql);
|
||||
// $stmt->execute(array(':o1'=>$stat1_or, ':a1'=>$stat1_and, ':o2'=>$stat2_or, ':a2'=>$stat2_and));
|
||||
|
||||
$sql = "SELECT BIN(((((0 | $stat1_or) & $stat1_and)) | $stat2_or) & $stat2_and) AS result";
|
||||
$stmt = $conn->prepare($sql);
|
||||
$stmt->execute();
|
||||
|
||||
$row = $stmt->fetch(\PDO::FETCH_ASSOC);
|
||||
$stmt->closeCursor();
|
||||
|
||||
if ($row) {
|
||||
$status = $row['result'];
|
||||
return decbin((((0 | $stat1_or) & $stat1_and) | $stat2_or) & $stat2_and);
|
||||
}
|
||||
|
||||
return $status;
|
||||
}
|
||||
|
||||
public static function operation_and_not(Application $app, $stat1, $stat2)
|
||||
public static function operation_and_not($stat1, $stat2)
|
||||
{
|
||||
$conn = $app['phraseanet.appbox']->get_connection();
|
||||
|
||||
$status = '0';
|
||||
|
||||
if (substr($stat1, 0, 2) === '0x') {
|
||||
$stat1 = self::hex2bin($app, substr($stat1, 2));
|
||||
$stat1 = self::hex2bin(substr($stat1, 2));
|
||||
}
|
||||
if (substr($stat2, 0, 2) === '0x') {
|
||||
$stat2 = self::hex2bin($app, substr($stat2, 2));
|
||||
$stat2 = self::hex2bin(substr($stat2, 2));
|
||||
}
|
||||
$stat1 = str_pad($stat1, 32, '0', STR_PAD_LEFT);
|
||||
$stat2 = str_pad($stat2, 32, '0', STR_PAD_LEFT);
|
||||
|
||||
return decbin(bindec($stat1) & ~bindec($stat2));
|
||||
}
|
||||
|
||||
$sql = 'select bin(0b' . trim($stat1) . ' & ~0b' . trim($stat2) . ') as result';
|
||||
|
||||
$stmt = $conn->prepare($sql);
|
||||
$stmt->execute();
|
||||
$row = $stmt->fetch(PDO::FETCH_ASSOC);
|
||||
$stmt->closeCursor();
|
||||
|
||||
if ($row) {
|
||||
$status = $row['result'];
|
||||
}
|
||||
|
||||
return $status;
|
||||
}
|
||||
|
||||
public static function operation_or(Application $app, $stat1, $stat2)
|
||||
public static function operation_or($stat1, $stat2)
|
||||
{
|
||||
$conn = $app['phraseanet.appbox']->get_connection();
|
||||
|
||||
$status = '0';
|
||||
|
||||
if (substr($stat1, 0, 2) === '0x') {
|
||||
$stat1 = self::hex2bin($app, substr($stat1, 2));
|
||||
$stat1 = self::hex2bin(substr($stat1, 2));
|
||||
}
|
||||
if (substr($stat2, 0, 2) === '0x') {
|
||||
$stat2 = self::hex2bin($app, substr($stat2, 2));
|
||||
$stat2 = self::hex2bin(substr($stat2, 2));
|
||||
}
|
||||
$stat1 = str_pad($stat1, 32, '0', STR_PAD_LEFT);
|
||||
$stat2 = str_pad($stat2, 32, '0', STR_PAD_LEFT);
|
||||
|
||||
return decbin(bindec($stat1) | bindec($stat2));
|
||||
}
|
||||
|
||||
$sql = 'select bin(0b' . trim($stat1) . ' | 0b' . trim($stat2) . ') as result';
|
||||
|
||||
$stmt = $conn->prepare($sql);
|
||||
$stmt->execute();
|
||||
$row = $stmt->fetch(PDO::FETCH_ASSOC);
|
||||
$stmt->closeCursor();
|
||||
|
||||
if ($row) {
|
||||
$status = $row['result'];
|
||||
}
|
||||
|
||||
return $status;
|
||||
}
|
||||
|
||||
public static function dec2bin(Application $app, $status)
|
||||
public static function dec2bin($status)
|
||||
{
|
||||
$status = (string) $status;
|
||||
|
||||
@@ -276,25 +218,10 @@ class databox_status
|
||||
throw new \Exception(sprintf('`%s`is non-decimal value', $status));
|
||||
}
|
||||
|
||||
$conn = $app['phraseanet.appbox']->get_connection();
|
||||
|
||||
$sql = 'select bin(' . $status . ') as result';
|
||||
|
||||
$stmt = $conn->prepare($sql);
|
||||
$stmt->execute();
|
||||
$row = $stmt->fetch(PDO::FETCH_ASSOC);
|
||||
$stmt->closeCursor();
|
||||
|
||||
$status = '0';
|
||||
|
||||
if ($row) {
|
||||
$status = $row['result'];
|
||||
return decbin($status);
|
||||
}
|
||||
|
||||
return $status;
|
||||
}
|
||||
|
||||
public static function hex2bin(Application $app, $status)
|
||||
public static function hex2bin($status)
|
||||
{
|
||||
$status = (string) $status;
|
||||
if (substr($status, 0, 2) === '0x') {
|
||||
@@ -305,22 +232,7 @@ class databox_status
|
||||
throw new \Exception('Non-hexadecimal value');
|
||||
}
|
||||
|
||||
$conn = $app['phraseanet.appbox']->get_connection();
|
||||
|
||||
$sql = 'select BIN( CAST( 0x' . trim($status) . ' AS UNSIGNED ) ) as result';
|
||||
|
||||
$stmt = $conn->prepare($sql);
|
||||
$stmt->execute();
|
||||
$row = $stmt->fetch(PDO::FETCH_ASSOC);
|
||||
$stmt->closeCursor();
|
||||
|
||||
$status = '0';
|
||||
|
||||
if ($row) {
|
||||
$status = $row['result'];
|
||||
}
|
||||
|
||||
return $status;
|
||||
return base_convert($status, 16, 2);
|
||||
}
|
||||
|
||||
public static function bitIsSet($bitValue, $nthBit)
|
||||
|
@@ -11,6 +11,7 @@
|
||||
|
||||
use Alchemy\Phrasea\Application;
|
||||
use Alchemy\Phrasea\Model\Entities\User;
|
||||
use Doctrine\DBAL\Connection;
|
||||
|
||||
class eventsmanager_broker
|
||||
{
|
||||
@@ -260,13 +261,28 @@ class eventsmanager_broker
|
||||
return false;
|
||||
}
|
||||
|
||||
$sql = 'UPDATE notifications SET unread="0"
|
||||
WHERE usr_id = :usr_id
|
||||
AND (id="' . implode('" OR id="', $notifications) . '")';
|
||||
|
||||
$stmt = $this->app['phraseanet.appbox']->get_connection()->prepare($sql);
|
||||
$stmt->execute([':usr_id' => $usr_id]);
|
||||
$stmt->closeCursor();
|
||||
/** @var Connection $connection */
|
||||
$connection = $this->app['phraseanet.appbox']->get_connection();
|
||||
$builder = $connection->createQueryBuilder();
|
||||
$builder
|
||||
->update('notifications')
|
||||
->set('unread', '0')
|
||||
->where(
|
||||
$builder->expr()->eq('usr_id', ':usr_id'),
|
||||
$builder->expr()->in('id', [':notifications'])
|
||||
)
|
||||
->setParameters(
|
||||
[
|
||||
'usr_id' => $usr_id,
|
||||
'notifications' => $notifications,
|
||||
],
|
||||
[
|
||||
'usr_id' => PDO::PARAM_INT,
|
||||
'notifications' => Connection::PARAM_INT_ARRAY,
|
||||
]
|
||||
)
|
||||
->execute()
|
||||
;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
@@ -44,6 +44,7 @@ class module_console_fieldsMerge extends Command
|
||||
$output->writeln("");
|
||||
|
||||
try {
|
||||
/** @var databox $databox */
|
||||
$databox = $this->getService('phraseanet.appbox')->get_databox((int) $input->getArgument('sbas_id'));
|
||||
} catch (\Exception $e) {
|
||||
$output->writeln("<error>Invalid databox id </error>");
|
||||
@@ -155,11 +156,16 @@ class module_console_fieldsMerge extends Command
|
||||
$start = 0;
|
||||
$quantity = 100;
|
||||
|
||||
$builder = $databox->get_connection()->createQueryBuilder();
|
||||
$builder
|
||||
->select('r.record_id')
|
||||
->from('record', 'r')
|
||||
->orderBy('r.record_id', 'ASC')
|
||||
->setFirstResult($start)
|
||||
->setMaxResults($quantity)
|
||||
;
|
||||
do {
|
||||
$sql = 'SELECT record_id FROM record
|
||||
ORDER BY record_id LIMIT ' . $start . ', ' . $quantity;
|
||||
$stmt = $databox->get_connection()->prepare($sql);
|
||||
$stmt->execute();
|
||||
$stmt = $builder->execute();
|
||||
$results = $stmt->fetchAll(PDO::FETCH_ASSOC);
|
||||
$stmt->closeCursor();
|
||||
|
||||
|
@@ -35,6 +35,7 @@ class module_console_fieldsRename extends Command
|
||||
$new_name = $input->getArgument('name');
|
||||
|
||||
try {
|
||||
/** @var databox $databox */
|
||||
$databox = $this->getService('phraseanet.appbox')->get_databox((int) $input->getArgument('sbas_id'));
|
||||
} catch (\Exception $e) {
|
||||
$output->writeln("<error>Invalid databox id </error>");
|
||||
@@ -84,13 +85,18 @@ class module_console_fieldsRename extends Command
|
||||
$start = 0;
|
||||
$quantity = 100;
|
||||
|
||||
$builder = $databox->get_connection()->createQueryBuilder();
|
||||
$builder
|
||||
->select('r.record_id')
|
||||
->from('record', 'r')
|
||||
->orderBy('r.record_id', 'ASC')
|
||||
->setFirstResult($start)
|
||||
->setMaxResults($quantity)
|
||||
;
|
||||
do {
|
||||
$output->write("\rUpdating records... <info>".min($start, $total)." / $total</info>");
|
||||
|
||||
$sql = 'SELECT record_id FROM record
|
||||
ORDER BY record_id LIMIT ' . $start . ', ' . $quantity;
|
||||
$stmt = $databox->get_connection()->prepare($sql);
|
||||
$stmt->execute();
|
||||
$stmt = $builder->execute();
|
||||
$results = $stmt->fetchAll(PDO::FETCH_ASSOC);
|
||||
$stmt->closeCursor();
|
||||
|
||||
|
@@ -11,6 +11,7 @@
|
||||
|
||||
use Alchemy\Phrasea\Command\Command;
|
||||
use Alchemy\Phrasea\Model\Serializer\CaptionSerializer;
|
||||
use Doctrine\DBAL\Connection;
|
||||
use Symfony\Component\Console\Input\InputInterface;
|
||||
use Symfony\Component\Console\Input\InputOption;
|
||||
use Symfony\Component\Console\Output\OutputInterface;
|
||||
@@ -120,6 +121,7 @@ class module_console_systemExport extends Command
|
||||
|
||||
$total = $errors = 0;
|
||||
|
||||
/** @var databox $databox */
|
||||
foreach ($this->getService('phraseanet.appbox')->get_databoxes() as $databox) {
|
||||
$output->writeln(sprintf("Processing <info>%s</info>", $databox->get_label($this->container['locale'])));
|
||||
|
||||
@@ -153,20 +155,27 @@ class module_console_systemExport extends Command
|
||||
|
||||
$this->getService('filesystem')->mkdir($local_export);
|
||||
|
||||
$sql = 'SELECT record_id FROM record WHERE parent_record_id = 0 ';
|
||||
$builder = $databox->get_connection()->createQueryBuilder();
|
||||
$builder
|
||||
->select('r.record_id')
|
||||
->from('record', 'r')
|
||||
->where($builder->expr()->eq('r.parent_record_id', $builder->expr()->literal(0)))
|
||||
;
|
||||
|
||||
if (count($coll_ids) > 0) {
|
||||
$sql .= ' AND coll_id IN (' . implode(', ', $coll_ids) . ') ';
|
||||
$builder
|
||||
->andWhere($builder->expr()->in('r.coll_id', [':collIds']))
|
||||
->setParameter('collIds', $coll_ids, Connection::PARAM_INT_ARRAY)
|
||||
;
|
||||
}
|
||||
|
||||
$sql .= ' ORDER BY record_id ASC ';
|
||||
$builder->orderBy('r.record_id', 'ASC');
|
||||
|
||||
if ($limit) {
|
||||
$sql .= ' LIMIT 0, ' . $limit;
|
||||
$builder->setMaxResults($limit);
|
||||
}
|
||||
|
||||
$stmt = $databox->get_connection()->prepare($sql);
|
||||
$stmt->execute();
|
||||
$stmt = $builder->execute();
|
||||
$rs = $stmt->fetchAll(PDO::FETCH_ASSOC);
|
||||
$stmt->closeCursor();
|
||||
|
||||
|
@@ -35,15 +35,15 @@ class module_console_systemMailCheck extends Command
|
||||
{
|
||||
$output->writeln("Processing...");
|
||||
|
||||
$bad_users = [];
|
||||
if (version_compare($this->getService('phraseanet.appbox')->get_version(), '3.9', '<')) {
|
||||
$bad_users = MailChecker::getWrongEmailUsers($this->container);
|
||||
}
|
||||
/** @var appbox $appBox */
|
||||
$appBox = $this->getService('phraseanet.appbox');
|
||||
$checker = new MailChecker($appBox);
|
||||
$bad_users = $checker->getWrongEmailUsers();
|
||||
|
||||
foreach ($bad_users as $email => $users) {
|
||||
if ($input->getOption('list')) {
|
||||
$this->write_infos($email, $users, $output, $this->getService('phraseanet.appbox'));
|
||||
} elseif ($this->manage_group($email, $users, $output, $this->getService('phraseanet.appbox')) === false) {
|
||||
$this->write_infos($email, $users, $output, $appBox);
|
||||
} elseif ($this->manage_group($email, $users, $output, $appBox) === false) {
|
||||
break;
|
||||
}
|
||||
|
||||
|
@@ -106,8 +106,6 @@ class module_report_activity extends module_report
|
||||
WHERE (" . $filter['sql'] . ") AND !ISNULL(usrid)
|
||||
GROUP BY heures;";
|
||||
|
||||
// no_file_put_contents("/tmp/report.txt", sprintf("%s (%s)\n%s\n\n", __FILE__, __LINE__, $sql), FILE_APPEND);
|
||||
|
||||
$stmt = $sqlBuilder->getConnBas()->prepare($sql);
|
||||
$stmt->execute($params);
|
||||
$rs = $stmt->fetchAll(PDO::FETCH_ASSOC);
|
||||
|
@@ -207,7 +207,7 @@ class SetupTest extends \PhraseanetWebTestCase
|
||||
"port" => $connexion['port'],
|
||||
"user" => $connexion['user'],
|
||||
"password" => $connexion['password'],
|
||||
"dbname" => $connexion['dbname'],
|
||||
"db_name" => $connexion['dbname'],
|
||||
);
|
||||
|
||||
$client = $this->createClient();
|
||||
@@ -266,7 +266,7 @@ class SetupTest extends \PhraseanetWebTestCase
|
||||
"port" => $connexion['port'],
|
||||
"user" => $connexion['user'],
|
||||
"password" => $connexion['password'],
|
||||
"dbname" => "fake-DTABASE-name"
|
||||
"db_name" => "fake-DTABASE-name"
|
||||
);
|
||||
|
||||
$client = $this->createClient();
|
||||
|
@@ -8,8 +8,13 @@ class MailCheckerTest extends \PhraseanetTestCase
|
||||
{
|
||||
public function testMailChecker()
|
||||
{
|
||||
$users = MailChecker::getWrongEmailUsers(self::$DI['app'], 'usr_tmp');
|
||||
$checker = new MailChecker(self::$DI['app']['phraseanet.appbox'], 'usr_tmp');
|
||||
$this->assertEmpty($checker->getWrongEmailUsers());
|
||||
}
|
||||
|
||||
$this->assertEquals(0, count($users));
|
||||
public function testItHasNoDuplicateEmailUsers()
|
||||
{
|
||||
$checker = new MailChecker(self::$DI['app']['phraseanet.appbox'], 'usr_tmp');
|
||||
$this->assertFalse($checker->hasWrongEmailUsers());
|
||||
}
|
||||
}
|
||||
|
@@ -1,65 +1,52 @@
|
||||
<?php
|
||||
|
||||
class databox_statusTest extends \PhraseanetTestCase
|
||||
class databox_statusTest extends PHPUnit_Framework_TestCase
|
||||
{
|
||||
/**
|
||||
* @var databox_status
|
||||
*/
|
||||
protected $object;
|
||||
protected $databox;
|
||||
|
||||
public function setUp()
|
||||
{
|
||||
parent::setUp();
|
||||
$this->databox = self::$DI['record_1']->get_databox();
|
||||
$this->object = $this->databox->getStatusStructure();
|
||||
}
|
||||
|
||||
public function testOperation_and()
|
||||
{
|
||||
$this->assertEquals('0', databox_status::operation_and(self::$DI['app'], '0x001', '0x010'));
|
||||
$this->assertEquals('1', databox_status::operation_and(self::$DI['app'], '01', '11'));
|
||||
$this->assertEquals('0', databox_status::operation_and(self::$DI['app'], '01', '10'));
|
||||
$this->assertEquals('10', databox_status::operation_and(self::$DI['app'], '11', '10'));
|
||||
$this->assertEquals('0', databox_status::operation_and('0x001', '0x010'));
|
||||
$this->assertEquals('1', databox_status::operation_and('01', '11'));
|
||||
$this->assertEquals('0', databox_status::operation_and('01', '10'));
|
||||
$this->assertEquals('10', databox_status::operation_and('11', '10'));
|
||||
}
|
||||
|
||||
public function testOperation_and_not()
|
||||
{
|
||||
$this->assertEquals('0', databox_status::operation_and_not(self::$DI['app'], '0x001', '0x011'));
|
||||
$this->assertEquals('0', databox_status::operation_and_not(self::$DI['app'], '01', '11'));
|
||||
$this->assertEquals('1', databox_status::operation_and_not(self::$DI['app'], '01', '10'));
|
||||
$this->assertEquals('1', databox_status::operation_and_not(self::$DI['app'], '11', '10'));
|
||||
$this->assertEquals('10', databox_status::operation_and_not(self::$DI['app'], '10', '01'));
|
||||
$this->assertEquals('0', databox_status::operation_and_not('0x001', '0x011'));
|
||||
$this->assertEquals('0', databox_status::operation_and_not('01', '11'));
|
||||
$this->assertEquals('1', databox_status::operation_and_not('01', '10'));
|
||||
$this->assertEquals('1', databox_status::operation_and_not('11', '10'));
|
||||
$this->assertEquals('10', databox_status::operation_and_not('10', '01'));
|
||||
}
|
||||
|
||||
public function testOperation_mask()
|
||||
{
|
||||
$this->assertEquals('001101', databox_status::operation_mask(self::$DI['app'], '010101', '0011xx'));
|
||||
$this->assertEquals('001100', databox_status::operation_mask(self::$DI['app'], '0', '0011xx'));
|
||||
$this->assertEquals('001101', databox_status::operation_mask(self::$DI['app'], '1', '0011xx'));
|
||||
$this->assertEquals('001101', databox_status::operation_mask('010101', '0011xx'));
|
||||
$this->assertEquals('001100', databox_status::operation_mask('0', '0011xx'));
|
||||
$this->assertEquals('001101', databox_status::operation_mask('1', '0011xx'));
|
||||
}
|
||||
|
||||
public function testOperation_or()
|
||||
{
|
||||
$this->assertEquals('10001', databox_status::operation_or(self::$DI['app'], '0x001', '0x011'));
|
||||
$this->assertEquals('11', databox_status::operation_or(self::$DI['app'], '01', '11'));
|
||||
$this->assertEquals('10001', databox_status::operation_or('0x001', '0x011'));
|
||||
$this->assertEquals('11', databox_status::operation_or('01', '11'));
|
||||
}
|
||||
|
||||
public function testDec2bin()
|
||||
{
|
||||
$this->assertEquals('1010', databox_status::dec2bin(self::$DI['app'], '10'));
|
||||
$this->assertEquals('1010', databox_status::dec2bin('10'));
|
||||
}
|
||||
|
||||
public function testHex2bin()
|
||||
{
|
||||
$this->assertEquals('10100001', databox_status::hex2bin(self::$DI['app'], '0x0A1'));
|
||||
$this->assertEquals('10100001', databox_status::hex2bin(self::$DI['app'], '0A1'));
|
||||
$this->assertEquals('10100001', databox_status::hex2bin('0x0A1'));
|
||||
$this->assertEquals('10100001', databox_status::hex2bin('0A1'));
|
||||
|
||||
try {
|
||||
databox_status::hex2bin(self::$DI['app'], 'G1');
|
||||
databox_status::hex2bin('G1');
|
||||
$this->fail('Should raise an exception');
|
||||
} catch (Exception $e) {
|
||||
|
||||
$this->assertEquals('Non-hexadecimal value', $e->getMessage());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@@ -3,7 +3,7 @@
|
||||
*
|
||||
* mmSWFUpload 1.0: Flash upload dialog - http://profandesign.se/swfupload/, http://www.vinterwebb.se/
|
||||
*
|
||||
* SWFUpload is (c) 2006-2007 Lars Huring, Olov Nilz<EFBFBD>n and Mammon Media and is released under the MIT License:
|
||||
* SWFUpload is (c) 2006-2007 Lars Huring, Olov Nilzén and Mammon Media and is released under the MIT License:
|
||||
* http://www.opensource.org/licenses/mit-license.php
|
||||
*
|
||||
* SWFUpload 2 is (c) 2007-2008 Jake Roberts and is released under the MIT License:
|
||||
|
Reference in New Issue
Block a user