Skip to content

Commit 0408d3d

Browse files
authored
fix: Doctrine 4 fix (#13)
* Fix method calls for Doctrine 4 * Add a simple PSR-3 logger when testing with Doctrine 4
1 parent 0ef3ce0 commit 0408d3d

File tree

4 files changed

+198
-149
lines changed

4 files changed

+198
-149
lines changed

src/Adapter.php

Lines changed: 21 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -135,7 +135,7 @@ public function savePolicyLine($pType, array $rule)
135135
$queryBuilder->setValue('v' . strval($key), '?')->setParameter($key + 1, $value);
136136
}
137137

138-
return $queryBuilder->execute();
138+
return $this->executeQuery($queryBuilder);
139139
}
140140

141141
/**
@@ -147,8 +147,7 @@ public function savePolicyLine($pType, array $rule)
147147
public function loadPolicy(Model $model): void
148148
{
149149
$queryBuilder = $this->connection->createQueryBuilder();
150-
$query = $queryBuilder->select('p_type', 'v0', 'v1', 'v2', 'v3', 'v4', 'v5')->from($this->policyTableName);
151-
$stmt = method_exists($query, "executeQuery") ? $query->executeQuery() : $query->execute();
150+
$stmt = $this->executeQuery($queryBuilder->select('p_type', 'v0', 'v1', 'v2', 'v3', 'v4', 'v5')->from($this->policyTableName));
152151

153152
while ($row = $this->fetch($stmt)) {
154153
$this->loadPolicyArray($this->filterRule($row), $model);
@@ -180,7 +179,7 @@ public function loadFilteredPolicy(Model $model, $filter): void
180179
throw new \Exception('invalid filter type');
181180
}
182181

183-
$stmt = $queryBuilder->from($this->policyTableName)->execute();
182+
$stmt = $this->executeQuery($queryBuilder->from($this->policyTableName));
184183
while ($row = $this->fetch($stmt)) {
185184
$line = implode(', ', array_filter($row, function ($val) {
186185
return '' != $val && !is_null($val);
@@ -255,7 +254,7 @@ public function addPolicies(string $sec, string $ptype, array $rules): void
255254
$sql = 'INSERT INTO ' . $table . ' (' . implode(', ', $columns) . ')' .
256255
' VALUES' . $valuesStr;
257256

258-
$this->connection->executeUpdate($sql, $values);
257+
$this->connection->executeStatement($sql, $values);
259258
}
260259

261260
/**
@@ -275,7 +274,7 @@ private function _removePolicy(Connection $conn, string $sec, string $ptype, arr
275274
$queryBuilder->andWhere('v' . strval($key) . ' = ?')->setParameter($key + 1, $value);
276275
}
277276

278-
$queryBuilder->delete($this->policyTableName)->execute();
277+
$this->executeQuery($queryBuilder->delete($this->policyTableName));
279278
}
280279

281280
/**
@@ -332,13 +331,13 @@ public function _removeFilteredPolicy(string $sec, string $ptype, int $fieldInde
332331
$fieldIndex++;
333332
}
334333

335-
$stmt = $queryBuilder->select(...$this->columns)->from($this->policyTableName)->execute();
334+
$stmt = $this->executeQuery($queryBuilder->select(...$this->columns)->from($this->policyTableName));
336335

337336
while ($row = $this->fetch($stmt)) {
338337
$removedRules[] = $this->filterRule($row);
339338
}
340339

341-
$queryBuilder->delete($this->policyTableName)->execute();
340+
$this->executeQuery($queryBuilder->delete($this->policyTableName));
342341
});
343342

344343
return $removedRules;
@@ -384,7 +383,7 @@ public function updatePolicy(string $sec, string $ptype, array $oldRule, array $
384383

385384
$queryBuilder->update($this->policyTableName);
386385

387-
$queryBuilder->execute();
386+
$this->executeQuery($queryBuilder);
388387
}
389388

390389
/**
@@ -501,4 +500,17 @@ private function fetch($stmt)
501500
return $stmt->fetch();
502501
}
503502

503+
/**
504+
* Calls correct query execution method depending on Doctrine version and
505+
* returns the result.
506+
*
507+
* @param \Doctrine\DBAL\Query\QueryBuilder $query
508+
*
509+
* @return mixed
510+
*/
511+
private function executeQuery($query)
512+
{
513+
return method_exists($query, "executeQuery") ? $query->executeQuery() : $query->execute();
514+
}
515+
504516
}

tests/AdapterTest.php

Lines changed: 69 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -1,50 +1,69 @@
1-
<?php
2-
3-
namespace CasbinAdapter\DBAL\Tests;
4-
5-
use CasbinAdapter\DBAL\Adapter as DatabaseAdapter;
6-
use Doctrine\DBAL\Configuration;
7-
use Doctrine\DBAL\DriverManager;
8-
use Doctrine\DBAL\Exception;
9-
10-
class AdapterTest extends TestCase
11-
{
12-
13-
/**
14-
* @throws Exception
15-
*/
16-
public function testUpdateFilteredPolicies()
17-
{
18-
$this->initConfig();
19-
$connConfig = new Configuration();
20-
$logger = new DebugStackLogger();
21-
$connConfig->setSQLLogger($logger);
22-
$conn = DriverManager::getConnection(
23-
$this->config,
24-
$connConfig
25-
);
26-
$adapter = DatabaseAdapter::newAdapter($conn);
27-
$conn->delete($adapter->policyTableName, ["1" => "1"]);
28-
$conn->insert($adapter->policyTableName, ["p_type" => "p", "v0" => "alice", "v1" => "data", "v2" => "read", "v3" => "allow"]);
29-
$conn->insert($adapter->policyTableName, ["p_type" => "p", "v0" => "alice", "v1" => "data1", "v2" => "write", "v3" => "allow"]);
30-
$conn->insert($adapter->policyTableName, ["p_type" => "p", "v0" => "bob", "v1" => "data", "v2" => "write", "v3" => "allow"]);
31-
$conn->insert($adapter->policyTableName, ["p_type" => "p", "v0" => "bob", "v1" => "data1", "v2" => "read", "v3" => "allow"]);
32-
33-
$newPolicies = [
34-
["alice", "data", "read", "allow"],
35-
["bob", "data", "read", "allow"]
36-
];
37-
$oldRules = $adapter->updateFilteredPolicies("p", "p", $newPolicies, 1, "data", null, "allow");
38-
$this->assertEquals([
39-
["p", "alice", "data", "read", "allow"],
40-
["p", "bob", "data", "write", "allow"]
41-
], $oldRules);
42-
43-
$stmt = $conn->createQueryBuilder()->from($adapter->policyTableName)->where('p_type = "p" and v1 = "data" and v3 = "allow"')->select("v0", "v1", "v2", "v3")->execute();
44-
$result = method_exists($stmt, 'fetchAssociative') ? $stmt->fetchAllAssociative() : $stmt->fetchAll();
45-
46-
$result = array_map([$adapter, "filterRule"], $result);
47-
48-
$this->assertEquals($newPolicies, $result);
49-
}
50-
}
1+
<?php
2+
3+
namespace CasbinAdapter\DBAL\Tests;
4+
5+
use CasbinAdapter\DBAL\Adapter as DatabaseAdapter;
6+
use Doctrine\DBAL\Configuration;
7+
use Doctrine\DBAL\DriverManager;
8+
use Doctrine\DBAL\Exception;
9+
use Doctrine\DBAL\Logging\Middleware as LoggingMiddleware;
10+
11+
class AdapterTest extends TestCase
12+
{
13+
/**
14+
* @throws Exception
15+
*/
16+
public function testUpdateFilteredPolicies()
17+
{
18+
$this->initConfig();
19+
$connConfig = new Configuration();
20+
$this->configureLogger($connConfig);
21+
$conn = DriverManager::getConnection(
22+
$this->config,
23+
$connConfig
24+
);
25+
$adapter = DatabaseAdapter::newAdapter($conn);
26+
$conn->delete($adapter->policyTableName, ["1" => "1"]);
27+
$conn->insert($adapter->policyTableName, ["p_type" => "p", "v0" => "alice", "v1" => "data", "v2" => "read", "v3" => "allow"]);
28+
$conn->insert($adapter->policyTableName, ["p_type" => "p", "v0" => "alice", "v1" => "data1", "v2" => "write", "v3" => "allow"]);
29+
$conn->insert($adapter->policyTableName, ["p_type" => "p", "v0" => "bob", "v1" => "data", "v2" => "write", "v3" => "allow"]);
30+
$conn->insert($adapter->policyTableName, ["p_type" => "p", "v0" => "bob", "v1" => "data1", "v2" => "read", "v3" => "allow"]);
31+
32+
$newPolicies = [
33+
["alice", "data", "read", "allow"],
34+
["bob", "data", "read", "allow"]
35+
];
36+
$oldRules = $adapter->updateFilteredPolicies("p", "p", $newPolicies, 1, "data", null, "allow");
37+
$this->assertEquals([
38+
["p", "alice", "data", "read", "allow"],
39+
["p", "bob", "data", "write", "allow"]
40+
], $oldRules);
41+
42+
$query = $conn->createQueryBuilder()->from($adapter->policyTableName)->where('p_type = "p" and v1 = "data" and v3 = "allow"')->select("v0", "v1", "v2", "v3");
43+
$stmt = method_exists($query, "executeQuery") ? $query->executeQuery() : $query->execute();
44+
$result = method_exists($stmt, 'fetchAssociative') ? $stmt->fetchAllAssociative() : $stmt->fetchAll();
45+
46+
$result = array_map([$adapter, "filterRule"], $result);
47+
48+
$this->assertEquals($newPolicies, $result);
49+
}
50+
51+
/**
52+
*
53+
* @param \Doctrine\DBAL\Configuration $connConfig
54+
* @return void
55+
*/
56+
private function configureLogger($connConfig)
57+
{
58+
// Doctrine < 4.0
59+
if(method_exists($connConfig, "setSQLLogger")) {
60+
$connConfig->setSQLLogger(new DebugStackLogger());
61+
}
62+
// Doctrine >= 4.0
63+
else {
64+
$connConfig->setMiddlewares([
65+
new LoggingMiddleware(new PsrLogger())
66+
]);
67+
}
68+
}
69+
}

tests/PsrLogger.php

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
<?php
2+
3+
namespace CasbinAdapter\DBAL\Tests;
4+
5+
use Psr\Log\AbstractLogger;
6+
7+
class PsrLogger extends AbstractLogger
8+
{
9+
public function log($level, string|\Stringable $message, array $context = [])
10+
{
11+
foreach($context as $k => $v) {
12+
$context[$k] = is_string($v) ? $v : json_encode($v);
13+
}
14+
printf(date('Y-m-d H:i:s') . '[SQL]: ' . strtr($message, $context) . PHP_EOL);
15+
}
16+
}

0 commit comments

Comments
 (0)