Cleanup ops

This commit is contained in:
Victor Dubiniuk 2013-08-07 16:49:52 +03:00 committed by Tobias Hintze
parent 9400fc8218
commit accbdf7284
2 changed files with 31 additions and 26 deletions

View File

@ -66,39 +66,29 @@ try{
$esId = $request->getParam('args/es_id'); $esId = $request->getParam('args/es_id');
$memberId = $request->getParam('args/member_id'); $memberId = $request->getParam('args/member_id');
$ops = $request->getParam('args/client_ops'); $ops = $request->getParam('args/client_ops');
$hasOps = is_array($ops) && count($ops>0);
$currentHead = OCA\Office\Op::getHeadSeq($esId); $currentHead = OCA\Office\Op::getHeadSeq($esId);
// TODO handle the case ($currentHead == "") && ($seqHead != "") // TODO handle the case ($currentHead == "") && ($seqHead != "")
if ($seqHead == $currentHead) { if ($seqHead == $currentHead) {
// matching heads // matching heads
if (count($ops) > 0) { if ($hasOps) {
// incoming ops without conflict // incoming ops without conflict
// Add incoming ops, respond with a new head // Add incoming ops, respond with a new head
$lastSeq = $currentHead; // empty op stack $newHead = OCA\Office\Op::addOpsArray($esId, $memberId, $ops);
foreach ($ops as $op) {
$op['opspec'] = json_encode($op);
$op['member'] = $memberId;
$lastSeq = OCA\Office\Op::add($esId, $op);
}
$response["result"] = 'added'; $response["result"] = 'added';
$response["headSeq"] = $lastSeq; $response["headSeq"] = $newHead ? $newHead : $currentHead;
} else { } else {
// no incoming ops (just checking for new ops...) // no incoming ops (just checking for new ops...)
$response["result"] = 'newOps'; $response["result"] = 'newOps';
$response["ops"] = []; $response["ops"] = array();
$response["headSeq"] = $currentHead; $response["headSeq"] = $currentHead;
} }
} else { // HEADs do not match } else { // HEADs do not match
$response["ops"] = OCA\Office\Op::getOpsAfter($esId, $seqHead); $response["ops"] = OCA\Office\Op::getOpsAfter($esId, $seqHead);
$response["headSeq"] = $currentHead; $response["headSeq"] = $currentHead;
if (count($ops) > 0) { // a conflict $response["result"] = $hasOps ? 'conflict' : 'newOps';
$response["result"] = 'conflict';
} else { // not a conflict
$response["result"] = 'newOps';
}
} }
} else { } else {
// Error - no seq_head passed // Error - no seq_head passed

View File

@ -4,18 +4,27 @@ namespace OCA\Office;
class Op { class Op {
public static function add($esId, $op){ public static function add($esId, $memberId, $opspec){
$query = \OCP\DB::prepare('INSERT INTO `*PREFIX*office_op` (`es_id`, `member`, `opspec`) VALUES (?, ?, ?) '); $query = \OCP\DB::prepare('INSERT INTO `*PREFIX*office_op` (`es_id`, `member`, `opspec`) VALUES (?, ?, ?) ');
$query->execute(array( $query->execute(array(
$esId, $esId,
$op['member'], $memberId,
$op['opspec'], $opspec,
)); ));
// throw something - if query fails - thats fatal // throw something - if query fails - thats fatal
return \OCP\DB::insertid(`*PREFIX*office_op`); return \OCP\DB::insertid(`*PREFIX*office_op`);
} }
public static function addOpsArray($esId, $memberId, $ops){
$lastSeq = false;
foreach ($ops as $op) {
$lastSeq = self::add($esId, $memberId, json_encode($op));
}
return $lastSeq;
}
/** /**
* @returns "" when there are no Ops, or the seq of the last Op * @returns "" when there are no Ops, or the seq of the last Op
*/ */
@ -26,18 +35,24 @@ class Op {
)) ))
->fetchOne() ->fetchOne()
; ;
return is_null($result) ? "" : $result; return !$result ? "" : $result;
}
public static function getOpsAfterJson($esId, $seq){
return array_map(
json_decode,
self::getOpsAfter($esId, $seq)
);
} }
public static function getOpsAfter($esId, $seq){ public static function getOpsAfter($esId, $seq){
if ($seq == "") $seq = -1; if ($seq == ""){
$oplist = []; $seq = -1;
}
$oplist = array();
$query = \OCP\DB::prepare('SELECT `opspec` FROM `*PREFIX*office_op` WHERE `es_id`=? AND `seq`>? ORDER BY `seq` ASC'); $query = \OCP\DB::prepare('SELECT `opspec` FROM `*PREFIX*office_op` WHERE `es_id`=? AND `seq`>? ORDER BY `seq` ASC');
$result = $query->execute(array($esId, $seq)); $result = $query->execute(array($esId, $seq));
while( $row = $result->fetchRow() ) { return $result;
$oplist[] = json_decode($row['opspec']);
}
return $oplist;
} }
} }