Page Menu
Home
Phorge
Search
Configure Global Search
Log In
Files
F2894089
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Award Token
Flag For Later
Advanced/Developer...
View Handle
View Hovercard
Size
6 KB
Referenced Files
None
Subscribers
None
View Options
diff --git a/src/applications/conduit/method/user/addstatus/ConduitAPI_user_addstatus_Method.php b/src/applications/conduit/method/user/addstatus/ConduitAPI_user_addstatus_Method.php
index a3301f3fc3..58d212687a 100644
--- a/src/applications/conduit/method/user/addstatus/ConduitAPI_user_addstatus_Method.php
+++ b/src/applications/conduit/method/user/addstatus/ConduitAPI_user_addstatus_Method.php
@@ -1,88 +1,95 @@
<?php
/*
* Copyright 2012 Facebook, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/**
* @group conduit
*/
final class ConduitAPI_user_addstatus_Method extends ConduitAPI_user_Method {
public function getMethodStatus() {
return self::METHOD_STATUS_UNSTABLE;
}
public function getMethodDescription() {
return "Add status information to the logged-in user.";
}
public function defineParamTypes() {
return array(
'fromEpoch' => 'required int',
'toEpoch' => 'required int',
'status' => 'required enum<away, sporadic>',
);
}
public function defineReturnType() {
return 'void';
}
public function defineErrorTypes() {
return array(
'ERR-BAD-EPOCH' => "'toEpoch' must be bigger than 'fromEpoch'.",
'ERR-OVERLAP' =>
'There must be no status in any part of the specified epoch.',
);
}
protected function execute(ConduitAPIRequest $request) {
$user_phid = $request->getUser()->getPHID();
$from = $request->getValue('fromEpoch');
$to = $request->getValue('toEpoch');
if ($to <= $from) {
throw new ConduitException('ERR-BAD-EPOCH');
}
- // TODO: This SELECT should have LOCK IN SHARE MODE and be in transaction
- // with the next INSERT.
- $overlap = id(new PhabricatorUserStatus())->loadAllWhere(
+ $table = new PhabricatorUserStatus();
+ $table->openTransaction();
+ $table->beginWriteLocking();
+
+ $overlap = $table->loadAllWhere(
'userPHID = %s AND dateFrom < %d AND dateTo > %d',
$user_phid,
$to,
$from);
if ($overlap) {
+ $table->endWriteLocking();
+ $table->killTransaction();
throw new ConduitException('ERR-OVERLAP');
}
switch ($request->getValue('status')) {
case 'sporadic':
$status = PhabricatorUserStatus::STATUS_SPORADIC;
break;
default:
$status = PhabricatorUserStatus::STATUS_AWAY;
break;
}
id(new PhabricatorUserStatus())
->setUserPHID($user_phid)
->setDateFrom($from)
->setDateTo($to)
->setStatus($status)
->save();
+
+ $table->endWriteLocking();
+ $table->saveTransaction();
}
}
diff --git a/src/applications/conduit/method/user/removestatus/ConduitAPI_user_removestatus_Method.php b/src/applications/conduit/method/user/removestatus/ConduitAPI_user_removestatus_Method.php
index ef56cb8007..2ee72182e7 100644
--- a/src/applications/conduit/method/user/removestatus/ConduitAPI_user_removestatus_Method.php
+++ b/src/applications/conduit/method/user/removestatus/ConduitAPI_user_removestatus_Method.php
@@ -1,86 +1,93 @@
<?php
/*
* Copyright 2012 Facebook, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/**
* @group conduit
*/
final class ConduitAPI_user_removestatus_Method extends ConduitAPI_user_Method {
public function getMethodStatus() {
return self::METHOD_STATUS_UNSTABLE;
}
public function getMethodDescription() {
return "Delete status information of the logged-in user.";
}
public function defineParamTypes() {
return array(
'fromEpoch' => 'required int',
'toEpoch' => 'required int',
);
}
public function defineReturnType() {
return 'int';
}
public function defineErrorTypes() {
return array(
'ERR-BAD-EPOCH' => "'toEpoch' must be bigger than 'fromEpoch'.",
);
}
protected function execute(ConduitAPIRequest $request) {
$user_phid = $request->getUser()->getPHID();
$from = $request->getValue('fromEpoch');
$to = $request->getValue('toEpoch');
if ($to <= $from) {
throw new ConduitException('ERR-BAD-EPOCH');
}
- $overlap = id(new PhabricatorUserStatus())->loadAllWhere(
+ $table = new PhabricatorUserStatus();
+ $table->openTransaction();
+ $table->beginReadLocking();
+
+ $overlap = $table->loadAllWhere(
'userPHID = %s AND dateFrom < %d AND dateTo > %d',
$user_phid,
$to,
$from);
foreach ($overlap as $status) {
if ($status->getDateFrom() < $from) {
if ($status->getDateTo() > $to) {
// Split the interval.
id(new PhabricatorUserStatus())
->setUserPHID($user_phid)
->setDateFrom($to)
->setDateTo($status->getDateTo())
->setStatus($status->getStatus())
->save();
}
$status->setDateTo($from);
$status->save();
} else if ($status->getDateTo() > $to) {
$status->setDateFrom($to);
$status->save();
} else {
$status->delete();
}
}
+
+ $table->endReadLocking();
+ $table->saveTransaction();
return count($overlap);
}
}
File Metadata
Details
Attached
Mime Type
text/x-diff
Expires
Sun, Jan 19, 19:21 (1 d, 20 h)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
1127922
Default Alt Text
(6 KB)
Attached To
Mode
rP Phorge
Attached
Detach File
Event Timeline
Log In to Comment