@@ -69,9 +69,13 @@ protected function acquireLock($name, $timeout = 0)
69
69
{
70
70
return $ this ->db ->useMaster (function ($ db ) use ($ name , $ timeout ) {
71
71
/** @var \yii\db\Connection $db */
72
- return (bool ) $ db ->createCommand (
73
- 'SELECT GET_LOCK(SUBSTRING(CONCAT(:prefix, :name), 1, 64), :timeout) ' ,
74
- [':name ' => $ this ->hashLockName ($ name ), ':timeout ' => $ timeout , ':prefix ' => $ this ->keyPrefix ]
72
+ $ nameData = $ this ->prepareName ();
73
+ return (bool )$ db ->createCommand (
74
+ 'SELECT GET_LOCK( ' . $ nameData [0 ] . ', :timeout), :prefix ' ,
75
+ array_merge (
76
+ [':name ' => $ this ->hashLockName ($ name ), ':timeout ' => $ timeout , ':prefix ' => $ this ->keyPrefix ],
77
+ $ nameData [1 ]
78
+ )
75
79
)->queryScalar ();
76
80
});
77
81
}
@@ -86,13 +90,33 @@ protected function releaseLock($name)
86
90
{
87
91
return $ this ->db ->useMaster (function ($ db ) use ($ name ) {
88
92
/** @var \yii\db\Connection $db */
89
- return (bool ) $ db ->createCommand (
90
- 'SELECT RELEASE_LOCK(SUBSTRING(CONCAT(:prefix, :name), 1, 64)) ' ,
91
- [':name ' => $ this ->hashLockName ($ name ), ':prefix ' => $ this ->keyPrefix ]
93
+ $ nameData = $ this ->prepareName ();
94
+ return (bool )$ db ->createCommand (
95
+ 'SELECT RELEASE_LOCK( ' . $ nameData [0 ] . '), :prefix ' ,
96
+ array_merge (
97
+ [':name ' => $ this ->hashLockName ($ name ), ':prefix ' => $ this ->keyPrefix ],
98
+ $ nameData [1 ]
99
+ )
92
100
)->queryScalar ();
93
101
});
94
102
}
95
103
104
+ /**
105
+ * Prepare lock name
106
+ * @return array expression and params
107
+ * @since 2.0.48
108
+ */
109
+ protected function prepareName ()
110
+ {
111
+ $ params = [];
112
+ $ expression = "SUBSTRING(CONCAT(:prefix, :name), 1, 64) " ;
113
+ if ($ this ->keyPrefix instanceof Expression) {
114
+ $ expression = strtr ($ expression , [':prefix ' => $ this ->keyPrefix ->expression ]);
115
+ $ params = $ this ->keyPrefix ->params ;
116
+ }
117
+ return [$ expression , $ params ];
118
+ }
119
+
96
120
/**
97
121
* Generate hash for lock name to avoid exceeding lock name length limit.
98
122
*
@@ -101,7 +125,8 @@ protected function releaseLock($name)
101
125
* @since 2.0.16
102
126
* @see https://github.com/yiisoft/yii2/pull/16836
103
127
*/
104
- protected function hashLockName ($ name ) {
128
+ protected function hashLockName ($ name )
129
+ {
105
130
return sha1 ($ name );
106
131
}
107
132
}
0 commit comments