Skip to content

Commit

Permalink
feat: Added exclusive lock and shared lock (swoft-cloud/swoft-compone…
Browse files Browse the repository at this point in the history
…nt#225)

* feat: 为查询构造器添加排他锁和共享锁操作方法

* feat: 为活动记录AR添加排他锁和共享锁操作参数

* feat: 为查询构造器和活动记录AR中的加锁操作添加单元测试

* Optimized coding style and Fixed unit test.

* Optimized coding style and Fixed unit test
  • Loading branch information
adotpeng authored and swoft-bot committed Nov 2, 2018
1 parent 36066bb commit fc9c1e1
Show file tree
Hide file tree
Showing 5 changed files with 158 additions and 46 deletions.
6 changes: 6 additions & 0 deletions src/Executor.php
Original file line number Diff line number Diff line change
Expand Up @@ -635,6 +635,12 @@ private static function applyOptions(QueryBuilder $query, array $options)
}
}

if (isset($options['for_update']) && $options['for_update'] === true) {
$query->forUpdate();
} elseif (isset($options['shared_lock']) && $options['shared_lock'] === true) {
$query->sharedLock();
}

$limit = $options['limit'] ?? null;
$offset = $options['offset'] ?? 0;

Expand Down
88 changes: 60 additions & 28 deletions src/QueryBuilder.php
Original file line number Diff line number Diff line change
Expand Up @@ -237,6 +237,13 @@ class QueryBuilder implements QueryBuilderInterface
*/
protected $limit = [];

/**
* 共享锁,排他锁
*
* @var array
*/
private $locks = [];

/**
* 参数集合
*
Expand Down Expand Up @@ -426,7 +433,7 @@ public function table(string $table, string $alias = null): self
* @return QueryBuilder
* @throws \Swoft\Db\Exception\DbException
*/
public function innerJoin(string $table, $criteria = null, string $alias = null): QueryBuilder
public function innerJoin(string $table, $criteria = null, string $alias = null): self
{
$table = $this->getTableNameByClassName($table);
$this->join($table, $criteria, self::INNER_JOIN, $alias);
Expand All @@ -444,7 +451,7 @@ public function innerJoin(string $table, $criteria = null, string $alias = null)
* @return QueryBuilder
* @throws \Swoft\Db\Exception\DbException
*/
public function leftJoin(string $table, $criteria = null, string $alias = null): QueryBuilder
public function leftJoin(string $table, $criteria = null, string $alias = null): self
{
$table = $this->getTableNameByClassName($table);
$this->join($table, $criteria, self::LEFT_JOIN, $alias);
Expand All @@ -462,7 +469,7 @@ public function leftJoin(string $table, $criteria = null, string $alias = null):
* @return QueryBuilder
* @throws \Swoft\Db\Exception\DbException
*/
public function rightJoin(string $table, $criteria = null, string $alias = null): QueryBuilder
public function rightJoin(string $table, $criteria = null, string $alias = null): self
{
$table = $this->getTableNameByClassName($table);
$this->join($table, $criteria, self::RIGHT_JOIN, $alias);
Expand All @@ -480,7 +487,7 @@ public function rightJoin(string $table, $criteria = null, string $alias = null)
*
* @return QueryBuilder
*/
public function where(string $column, $value, $operator = self::OPERATOR_EQ, $connector = self::LOGICAL_AND): QueryBuilder
public function where(string $column, $value, $operator = self::OPERATOR_EQ, $connector = self::LOGICAL_AND): self
{
$this->criteria($this->where, $column, $value, $operator, $connector);

Expand Down Expand Up @@ -583,7 +590,7 @@ public function andCondition(array $condition)
*
* @return QueryBuilder
*/
public function andWhere(string $column, $value, $operator = self::OPERATOR_EQ): QueryBuilder
public function andWhere(string $column, $value, $operator = self::OPERATOR_EQ): self
{
$this->criteria($this->where, $column, $value, $operator, self::LOGICAL_AND);

Expand All @@ -597,7 +604,7 @@ public function andWhere(string $column, $value, $operator = self::OPERATOR_EQ):
*
* @return QueryBuilder
*/
public function openWhere($connector = self::LOGICAL_AND): QueryBuilder
public function openWhere($connector = self::LOGICAL_AND): self
{
return $this->bracketCriteria($this->where, self::BRACKET_OPEN, $connector);
}
Expand All @@ -607,7 +614,7 @@ public function openWhere($connector = self::LOGICAL_AND): QueryBuilder
*
* @return QueryBuilder
*/
public function closeWhere(): QueryBuilder
public function closeWhere(): self
{
return $this->bracketCriteria($this->where, self::BRACKET_CLOSE);
}
Expand All @@ -621,7 +628,7 @@ public function closeWhere(): QueryBuilder
*
* @return QueryBuilder
*/
public function orWhere($column, $value, $operator = self::OPERATOR_EQ): QueryBuilder
public function orWhere($column, $value, $operator = self::OPERATOR_EQ): self
{
$this->criteria($this->where, $column, $value, $operator, self::LOGICAL_OR);

Expand All @@ -637,7 +644,7 @@ public function orWhere($column, $value, $operator = self::OPERATOR_EQ): QueryBu
*
* @return QueryBuilder
*/
public function whereIn(string $column, array $values, string $connector = self::LOGICAL_AND): QueryBuilder
public function whereIn(string $column, array $values, string $connector = self::LOGICAL_AND): self
{
if (!empty($values)) {
$this->criteria($this->where, $column, $values, self::IN, $connector);
Expand All @@ -655,7 +662,7 @@ public function whereIn(string $column, array $values, string $connector = self:
*
* @return QueryBuilder
*/
public function whereNotIn(string $column, array $values, string $connector = self::LOGICAL_AND): QueryBuilder
public function whereNotIn(string $column, array $values, string $connector = self::LOGICAL_AND): self
{
if (!empty($values)) {
$this->criteria($this->where, $column, $values, self::NOT_IN, $connector);
Expand All @@ -674,7 +681,7 @@ public function whereNotIn(string $column, array $values, string $connector = se
*
* @return QueryBuilder
*/
public function whereBetween(string $column, $min, $max, string $connector = self::LOGICAL_AND): QueryBuilder
public function whereBetween(string $column, $min, $max, string $connector = self::LOGICAL_AND): self
{
$this->criteria($this->where, $column, [$min, $max], self::BETWEEN, $connector);

Expand All @@ -691,7 +698,7 @@ public function whereBetween(string $column, $min, $max, string $connector = sel
*
* @return QueryBuilder
*/
public function whereNotBetween(string $column, $min, $max, string $connector = self::LOGICAL_AND): QueryBuilder
public function whereNotBetween(string $column, $min, $max, string $connector = self::LOGICAL_AND): self
{
$this->criteria($this->where, $column, [$min, $max], self::NOT_BETWEEN, $connector);

Expand All @@ -708,7 +715,7 @@ public function whereNotBetween(string $column, $min, $max, string $connector =
*
* @return QueryBuilder
*/
public function having(string $column, $value, string $operator = self::OPERATOR_EQ, string $connector = self::LOGICAL_AND): QueryBuilder
public function having(string $column, $value, string $operator = self::OPERATOR_EQ, string $connector = self::LOGICAL_AND): self
{
$this->criteria($this->having, $column, $value, $operator, $connector);

Expand All @@ -724,7 +731,7 @@ public function having(string $column, $value, string $operator = self::OPERATOR
*
* @return QueryBuilder
*/
public function andHaving(string $column, $value, string $operator = self::OPERATOR_EQ): QueryBuilder
public function andHaving(string $column, $value, string $operator = self::OPERATOR_EQ): self
{
$this->criteria($this->having, $column, $value, $operator, self::LOGICAL_AND);

Expand All @@ -740,7 +747,7 @@ public function andHaving(string $column, $value, string $operator = self::OPERA
*
* @return QueryBuilder
*/
public function orHaving(string $column, $value, string $operator = self::OPERATOR_EQ): QueryBuilder
public function orHaving(string $column, $value, string $operator = self::OPERATOR_EQ): self
{
$this->criteria($this->having, $column, $value, $operator, self::LOGICAL_OR);

Expand All @@ -756,7 +763,7 @@ public function orHaving(string $column, $value, string $operator = self::OPERAT
*
* @return QueryBuilder
*/
public function havingIn(string $column, array $values, string $connector = self::LOGICAL_AND): QueryBuilder
public function havingIn(string $column, array $values, string $connector = self::LOGICAL_AND): self
{
$this->criteria($this->having, $column, $values, self::IN, $connector);

Expand All @@ -772,7 +779,7 @@ public function havingIn(string $column, array $values, string $connector = self
*
* @return QueryBuilder
*/
public function havingNotIn(string $column, array $values, string $connector = self::LOGICAL_AND): QueryBuilder
public function havingNotIn(string $column, array $values, string $connector = self::LOGICAL_AND): self
{
$this->criteria($this->having, $column, $values, self::NOT_IN, $connector);

Expand All @@ -789,7 +796,7 @@ public function havingNotIn(string $column, array $values, string $connector = s
*
* @return QueryBuilder
*/
public function havingBetween(string $column, $min, $max, string $connector = self::LOGICAL_AND): QueryBuilder
public function havingBetween(string $column, $min, $max, string $connector = self::LOGICAL_AND): self
{
$this->criteria($this->having, $column, [$min, $max], self::BETWEEN, $connector);

Expand All @@ -806,7 +813,7 @@ public function havingBetween(string $column, $min, $max, string $connector = se
*
* @return QueryBuilder
*/
public function havingNotBetween(string $column, $min, $max, string $connector = self::LOGICAL_AND): QueryBuilder
public function havingNotBetween(string $column, $min, $max, string $connector = self::LOGICAL_AND): self
{
$this->criteria($this->having, $column, [$min, $max], self::NOT_BETWEEN, $connector);

Expand All @@ -820,7 +827,7 @@ public function havingNotBetween(string $column, $min, $max, string $connector =
*
* @return QueryBuilder
*/
public function openHaving($connector = self::LOGICAL_AND): QueryBuilder
public function openHaving($connector = self::LOGICAL_AND): self
{
return $this->bracketCriteria($this->having, self::BRACKET_OPEN, $connector);
}
Expand All @@ -830,7 +837,7 @@ public function openHaving($connector = self::LOGICAL_AND): QueryBuilder
*
* @return QueryBuilder
*/
public function closeHaving(): QueryBuilder
public function closeHaving(): self
{
return $this->bracketCriteria($this->having, self::BRACKET_CLOSE);
}
Expand All @@ -843,7 +850,7 @@ public function closeHaving(): QueryBuilder
*
* @return QueryBuilder
*/
public function groupBy(string $column, string $order = null): QueryBuilder
public function groupBy(string $column, string $order = null): self
{
$this->groupBy[] = [
'column' => $column,
Expand All @@ -861,7 +868,7 @@ public function groupBy(string $column, string $order = null): QueryBuilder
*
* @return QueryBuilder
*/
public function orderBy(string $column, string $order = self::ORDER_BY_ASC): QueryBuilder
public function orderBy(string $column, string $order = self::ORDER_BY_ASC): self
{
$this->orderBy[] = [
'column' => $column,
Expand All @@ -879,14 +886,34 @@ public function orderBy(string $column, string $order = self::ORDER_BY_ASC): Que
*
* @return QueryBuilder
*/
public function limit(int $limit, $offset = 0): QueryBuilder
public function limit(int $limit, $offset = 0): self
{
$this->limit['limit'] = $limit;
$this->limit['offset'] = $offset;

return $this;
}

/**
* 排他锁语句
*/
public function forUpdate(): self
{
$this->locks['for_update'] = true;

return $this;
}

/**
* 共享锁语句
*/
public function sharedLock(): self
{
$this->locks['shared_lock'] = true;

return $this;
}

/**
* 设置参数
*
Expand All @@ -897,7 +924,7 @@ public function limit(int $limit, $offset = 0): QueryBuilder
* @return QueryBuilder
* @throws \Swoft\Db\Exception\DbException
*/
public function setParameter($key, $value, $type = null): QueryBuilder
public function setParameter($key, $value, $type = null): self
{
list($key, $value) = EntityHelper::transferParameter($key, $value, $type);
$this->parameters[$key] = $value;
Expand Down Expand Up @@ -1003,7 +1030,7 @@ public function getDecorators(): array
*
* @return QueryBuilder
*/
private function bracketCriteria(array &$criteria, string $bracket = self::BRACKET_OPEN, string $connector = self::LOGICAL_AND): QueryBuilder
private function bracketCriteria(array &$criteria, string $bracket = self::BRACKET_OPEN, string $connector = self::LOGICAL_AND): self
{
$criteria[] = [
'bracket' => $bracket,
Expand All @@ -1023,7 +1050,7 @@ private function bracketCriteria(array &$criteria, string $bracket = self::BRACK
*
* @return QueryBuilder
*/
private function join(string $table, $criteria = null, string $type = self::INNER_JOIN, string $alias = null): QueryBuilder
private function join(string $table, $criteria = null, string $type = self::INNER_JOIN, string $alias = null): self
{
// 是否存在判断...

Expand Down Expand Up @@ -1058,7 +1085,7 @@ private function criteria(
$value,
string $operator = self::OPERATOR_EQ,
string $connector = self::LOGICAL_AND
): QueryBuilder {
): self {
$criteria[] = [
'column' => $column,
'value' => $value,
Expand Down Expand Up @@ -1362,6 +1389,11 @@ public function getLimit(): array
return $this->limit;
}

public function getLocks(): array
{
return $this->locks;
}

/**
* @return array
*/
Expand Down
Loading

0 comments on commit fc9c1e1

Please sign in to comment.