Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
D
doctrine-dbal
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Tomáš Trávníček
doctrine-dbal
Commits
684122ca
Unverified
Commit
684122ca
authored
Mar 29, 2018
by
Marco Pivetta
Committed by
GitHub
Mar 29, 2018
Browse files
Options
Browse Files
Download
Plain Diff
Merge pull request #3031 from fullbl/master
Connection parameters are cached hashed
parents
1853a6dd
017991a0
Changes
2
Show whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
89 additions
and
88 deletions
+89
-88
QueryCacheProfile.php
lib/Doctrine/DBAL/Cache/QueryCacheProfile.php
+13
-14
QueryCacheProfileTest.php
tests/Doctrine/Tests/DBAL/Cache/QueryCacheProfileTest.php
+76
-74
No files found.
lib/Doctrine/DBAL/Cache/QueryCacheProfile.php
View file @
684122ca
...
...
@@ -20,18 +20,19 @@
namespace
Doctrine\DBAL\Cache
;
use
Doctrine\Common\Cache\Cache
;
use
function
hash
;
use
function
serialize
;
use
function
sha1
;
/**
* Query Cache Profile handles the data relevant for query caching.
*
* It is a value object, setter methods return NEW instances.
*
* @author Benjamin Eberlei <kontakt@beberlei.de>
*/
class
QueryCacheProfile
{
/**
* @var
\Doctrine\Common\Cache\
Cache|null
* @var Cache|null
*/
private
$resultCacheDriver
;
...
...
@@ -48,9 +49,8 @@ class QueryCacheProfile
/**
* @param int $lifetime
* @param string|null $cacheKey
* @param \Doctrine\Common\Cache\Cache|null $resultCache
*/
public
function
__construct
(
$lifetime
=
0
,
$cacheKey
=
null
,
Cache
$resultCache
=
null
)
public
function
__construct
(
$lifetime
=
0
,
$cacheKey
=
null
,
?
Cache
$resultCache
=
null
)
{
$this
->
lifetime
=
$lifetime
;
$this
->
cacheKey
=
$cacheKey
;
...
...
@@ -58,7 +58,7 @@ class QueryCacheProfile
}
/**
* @return
\Doctrine\Common\Cache\
Cache|null
* @return Cache|null
*/
public
function
getResultCacheDriver
()
{
...
...
@@ -76,7 +76,7 @@ class QueryCacheProfile
/**
* @return string
*
* @throws
\Doctrine\DBAL\Cache\
CacheException
* @throws CacheException
*/
public
function
getCacheKey
()
{
...
...
@@ -102,7 +102,7 @@ class QueryCacheProfile
$realCacheKey
=
'query='
.
$query
.
'¶ms='
.
serialize
(
$params
)
.
'&types='
.
serialize
(
$types
)
.
'&connectionParams='
.
serialize
(
$connectionParams
);
'&connectionParams='
.
hash
(
'sha256'
,
serialize
(
$connectionParams
)
);
// should the key be automatically generated using the inputs or is the cache key set?
if
(
$this
->
cacheKey
===
null
)
{
...
...
@@ -111,11 +111,10 @@ class QueryCacheProfile
$cacheKey
=
$this
->
cacheKey
;
}
return
array
(
$cacheKey
,
$realCacheKey
)
;
return
[
$cacheKey
,
$realCacheKey
]
;
}
/**
* @param \Doctrine\Common\Cache\Cache $cache
*
* @return \Doctrine\DBAL\Cache\QueryCacheProfile
*/
...
...
tests/Doctrine/Tests/DBAL/Cache/QueryCacheProfileTest.php
View file @
684122ca
...
...
@@ -5,15 +5,44 @@ namespace Doctrine\Tests\DBAL\Cache;
use
Doctrine\DBAL\Cache\QueryCacheProfile
;
use
Doctrine\DBAL\ParameterType
;
use
Doctrine\Tests\DbalTestCase
;
use
function
parse_str
;
class
QueryCacheProfileTest
extends
DbalTestCase
{
const
LIFETIME
=
3600
;
const
CACHE_KEY
=
'user_specified_cache_key'
;
private
const
LIFETIME
=
3600
;
private
const
CACHE_KEY
=
'user_specified_cache_key'
;
/** @var QueryCacheProfile */
/**
* @var QueryCacheProfile
*/
private
$queryCacheProfile
;
/**
* @var string
*/
private
$query
=
'SELECT * FROM foo WHERE bar = ?'
;
/**
* @var int[]
*/
private
$params
=
[
666
];
/**
* @var string[]
*/
private
$types
=
[
ParameterType
::
INTEGER
];
/**
* @var string[]
*/
private
$connectionParams
=
[
'dbname'
=>
'database_name'
,
'user'
=>
'database_user'
,
'password'
=>
'database_password'
,
'host'
=>
'database_host'
,
'driver'
=>
'database_driver'
,
];
protected
function
setUp
()
{
$this
->
queryCacheProfile
=
new
QueryCacheProfile
(
self
::
LIFETIME
,
self
::
CACHE_KEY
);
...
...
@@ -21,23 +50,11 @@ class QueryCacheProfileTest extends DbalTestCase
public
function
testShouldUseTheGivenCacheKeyIfPresent
()
{
$query
=
'SELECT * FROM foo WHERE bar = ?'
;
$params
=
[
666
];
$types
=
[
ParameterType
::
INTEGER
];
$connectionParams
=
array
(
'dbname'
=>
'database_name'
,
'user'
=>
'database_user'
,
'password'
=>
'database_password'
,
'host'
=>
'database_host'
,
'driver'
=>
'database_driver'
);
list
(
$cacheKey
)
=
$this
->
queryCacheProfile
->
generateCacheKeys
(
$query
,
$params
,
$types
,
$connectionParams
$
this
->
query
,
$
this
->
params
,
$t
his
->
t
ypes
,
$
this
->
connectionParams
);
self
::
assertEquals
(
self
::
CACHE_KEY
,
$cacheKey
,
'The returned cache key should match the given one'
);
...
...
@@ -45,25 +62,13 @@ class QueryCacheProfileTest extends DbalTestCase
public
function
testShouldGenerateAnAutomaticKeyIfNoKeyHasBeenGiven
()
{
$query
=
'SELECT * FROM foo WHERE bar = ?'
;
$params
=
[
666
];
$types
=
[
ParameterType
::
INTEGER
];
$connectionParams
=
array
(
'dbname'
=>
'database_name'
,
'user'
=>
'database_user'
,
'password'
=>
'database_password'
,
'host'
=>
'database_host'
,
'driver'
=>
'database_driver'
);
$this
->
queryCacheProfile
=
$this
->
queryCacheProfile
->
setCacheKey
(
null
);
list
(
$cacheKey
)
=
$this
->
queryCacheProfile
->
generateCacheKeys
(
$query
,
$params
,
$types
,
$connectionParams
$
this
->
query
,
$
this
->
params
,
$t
his
->
t
ypes
,
$
this
->
connectionParams
);
self
::
assertNotEquals
(
...
...
@@ -77,67 +82,64 @@ class QueryCacheProfileTest extends DbalTestCase
public
function
testShouldGenerateDifferentKeysForSameQueryAndParamsAndDifferentConnections
()
{
$query
=
'SELECT * FROM foo WHERE bar = ?'
;
$params
=
[
666
];
$types
=
[
ParameterType
::
INTEGER
];
$connectionParams
=
array
(
'dbname'
=>
'database_name'
,
'user'
=>
'database_user'
,
'password'
=>
'database_password'
,
'host'
=>
'database_host'
,
'driver'
=>
'database_driver'
);
$this
->
queryCacheProfile
=
$this
->
queryCacheProfile
->
setCacheKey
(
null
);
list
(
$firstCacheKey
)
=
$this
->
queryCacheProfile
->
generateCacheKeys
(
$query
,
$params
,
$types
,
$connectionParams
$
this
->
query
,
$
this
->
params
,
$t
his
->
t
ypes
,
$
this
->
connectionParams
);
$connectionParams
[
'host'
]
=
'a_different_host'
;
$
this
->
connectionParams
[
'host'
]
=
'a_different_host'
;
list
(
$secondCacheKey
)
=
$this
->
queryCacheProfile
->
generateCacheKeys
(
$query
,
$params
,
$types
,
$connectionParams
$
this
->
query
,
$
this
->
params
,
$t
his
->
t
ypes
,
$
this
->
connectionParams
);
self
::
assertNotEquals
(
$firstCacheKey
,
$secondCacheKey
,
'Cache keys should be different'
);
}
public
function
test
ShouldGenerateSameKeysIfNoneOfTheParamsChanges
()
public
function
test
ConnectionParamsShouldBeHashed
()
{
$query
=
'SELECT * FROM foo WHERE bar = ?'
;
$params
=
[
666
];
$types
=
[
ParameterType
::
INTEGER
];
$this
->
queryCacheProfile
=
$this
->
queryCacheProfile
->
setCacheKey
(
null
);
$connectionParams
=
array
(
'dbname'
=>
'database_name'
,
'user'
=>
'database_user'
,
'password'
=>
'database_password'
,
'host'
=>
'database_host'
,
'driver'
=>
'database_driver'
list
(
$cacheKey
,
$queryString
)
=
$this
->
queryCacheProfile
->
generateCacheKeys
(
$this
->
query
,
$this
->
params
,
$this
->
types
,
$this
->
connectionParams
);
$params
=
[];
parse_str
(
$queryString
,
$params
);
self
::
assertArrayHasKey
(
'connectionParams'
,
$params
);
foreach
(
$this
->
connectionParams
as
$param
)
{
self
::
assertNotContains
(
$param
,
$params
[
'connectionParams'
]);
}
}
public
function
testShouldGenerateSameKeysIfNoneOfTheParamsChanges
()
{
$this
->
queryCacheProfile
=
$this
->
queryCacheProfile
->
setCacheKey
(
null
);
list
(
$firstCacheKey
)
=
$this
->
queryCacheProfile
->
generateCacheKeys
(
$query
,
$params
,
$types
,
$connectionParams
$
this
->
query
,
$
this
->
params
,
$t
his
->
t
ypes
,
$
this
->
connectionParams
);
list
(
$secondCacheKey
)
=
$this
->
queryCacheProfile
->
generateCacheKeys
(
$query
,
$params
,
$types
,
$connectionParams
$
this
->
query
,
$
this
->
params
,
$t
his
->
t
ypes
,
$
this
->
connectionParams
);
self
::
assertEquals
(
$firstCacheKey
,
$secondCacheKey
,
'Cache keys should be the same'
);
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment