Skip to content

Commit ab839a0

Browse files
committed
better structure for options
1 parent 84ca383 commit ab839a0

File tree

4 files changed

+99
-66
lines changed

4 files changed

+99
-66
lines changed

src/ClientSession.php

Lines changed: 55 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,9 @@
88
namespace yii\mongodb;
99

1010
use Yii;
11-
11+
use MongoDB\Driver\ReadConcern;
12+
use MongoDB\Driver\WriteConcern;
13+
use MongoDB\Driver\ReadPreference;
1214

1315
/**
1416
* ClientSession represents a client session and Commands, queries, and write operations may then be associated the session.
@@ -39,6 +41,57 @@ class ClientSession extends \yii\base\BaseObject
3941
*/
4042
private $_transaction = null;
4143

44+
/**
45+
* preapare options for some purpose
46+
* @param array by reference
47+
* convert string option to object
48+
* [
49+
* 'defaultTransactionOptions' => [
50+
* 'readConcern' => 'snapshot',
51+
* 'writeConcern' => 'majority',
52+
* 'writeConcern' => ['majority',true],
53+
* 'readPreference' => 'primary',
54+
* ],
55+
* ]
56+
* convert to :
57+
* [
58+
* 'defaultTransactionOptions' => [
59+
* 'readConcern' => new \MongoDB\Driver\ReadConcern('snapshot'),
60+
* 'writeConcern' => new \MongoDB\Driver\WriteConcern('majority'),
61+
* 'writeConcern' => new \MongoDB\Driver\WriteConcern('majority',true),
62+
* 'readPreference' => new \MongoDB\Driver\ReadPreference('primary'),
63+
* ],
64+
* ]
65+
*/
66+
public static function prepareOptions(&$options){
67+
68+
if(array_key_exists('defaultTransactionOptions',$options)){
69+
70+
#convert readConcern
71+
if(
72+
array_key_exists('readConcern',$options['defaultTransactionOptions']) &&
73+
is_string($options['defaultTransactionOptions']['readConcern'])
74+
)
75+
$options['defaultTransactionOptions']['readConcern'] = new ReadConcern($options['defaultTransactionOptions']['readConcern']);
76+
77+
#convert writeConcern
78+
if(array_key_exists('writeConcern',$options['defaultTransactionOptions'])){
79+
if(is_string($options['defaultTransactionOptions']['writeConcern']))
80+
$options['defaultTransactionOptions']['writeConcern'] = new WriteConcern($options['defaultTransactionOptions']['writeConcern']);
81+
else if(is_array($options['defaultTransactionOptions']['writeConcern']))
82+
$options['defaultTransactionOptions']['writeConcern'] = (new \ReflectionClass('\MongoDB\Driver\WriteConcern'))->newInstanceArgs($options['defaultTransactionOptions']['writeConcern']);
83+
}
84+
85+
#convert readPreference
86+
if(array_key_exists('readPreference',$options['defaultTransactionOptions'])){
87+
if(is_string($options['defaultTransactionOptions']['readPreference']))
88+
$options['defaultTransactionOptions']['readPreference'] = new ReadPreference($options['defaultTransactionOptions']['readPreference']);
89+
else if(is_array($options['defaultTransactionOptions']['readPreference']))
90+
$options['defaultTransactionOptions']['readPreference'] = (new \ReflectionClass('\MongoDB\Driver\ReadPreference'))->newInstanceArgs($options['defaultTransactionOptions']['readPreference']);
91+
}
92+
}
93+
}
94+
4295
/**
4396
* Start a new session in a connection.
4497
* @param Connection $db
@@ -47,7 +100,7 @@ class ClientSession extends \yii\base\BaseObject
47100
* @return ClientSession return new session base on a session options for the given connection
48101
*/
49102
public static function start($db, $sessionOptions = []){
50-
Connection::prepareExecOptions($sessionOptions);
103+
self::prepareOptions($sessionOptions);
51104
Yii::trace('Starting mongodb session ...', __METHOD__);
52105
$db->trigger(Connection::EVENT_START_SESSION);
53106
$newSession = new self([

src/Command.php

Lines changed: 41 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,9 @@
1111
use MongoDB\Driver\BulkWrite;
1212
use MongoDB\Driver\Exception\RuntimeException;
1313
use MongoDB\Driver\WriteResult;
14+
use MongoDB\Driver\ReadConcern;
15+
use MongoDB\Driver\WriteConcern;
16+
use MongoDB\Driver\ReadPreference;
1417
use Yii;
1518
use yii\base\InvalidConfigException;
1619
use yii\base\BaseObject;
@@ -78,7 +81,44 @@ class Command extends BaseObject
7881
*/
7982
private function prepareExecOptions(&$execOptions){
8083
$execOptions = empty($execOptions) ? $this->globalExecOptions : $execOptions;
81-
$this->db->prepareExecOptions($execOptions);
84+
85+
self::prepareCPOptions($execOptions);
86+
87+
#convert session option
88+
if(array_key_exists('session',$execOptions) && $execOptions['session'] instanceof ClientSession)
89+
$execOptions['session'] = $execOptions['session']->mongoSession;
90+
}
91+
92+
/**
93+
* preapare Concern and Preference options for easy use
94+
* @param array|object by reference
95+
* convert string option to object
96+
* ['readConcern' => 'snapshot'] > ['readConcern' => new \MongoDB\Driver\ReadConcern('snapshot')]
97+
* ['writeConcern' => 'majority'] > ['writeConcern' => new \MongoDB\Driver\WriteConcern('majority')]
98+
* ['writeConcern' => ['majority',true]] > ['writeConcern' => new \MongoDB\Driver\WriteConcern('majority',true)]
99+
* ['readPreference' => 'snapshot'] > ['readPreference' => new \MongoDB\Driver\ReadPreference('primary')]
100+
*/
101+
public static function prepareCPOptions(&$options){
102+
103+
#convert readConcern option
104+
if(array_key_exists('readConcern', $options) && is_string($options['readConcern']))
105+
$options['readConcern'] = new ReadConcern($options['readConcern']);
106+
107+
#convert writeConcern option
108+
if(array_key_exists('writeConcern', $options)){
109+
if(is_string($options['writeConcern']))
110+
$options['writeConcern'] = new WriteConcern($options['writeConcern']);
111+
elseif(is_array($options['writeConcern']))
112+
$options['writeConcern'] = (new \ReflectionClass('\MongoDB\Driver\WriteConcern'))->newInstanceArgs($options['writeConcern']);
113+
}
114+
115+
#conver readPreference option
116+
if(array_key_exists('readPreference', $options)){
117+
if(is_string($options['readPreference']))
118+
$options['readPreference'] = new ReadPreference($options['readPreference']);
119+
elseif(is_array($options['readPreference']))
120+
$options['readPreference'] = (new \ReflectionClass('\MongoDB\Driver\ReadPreference'))->newInstanceArgs($options['readPreference']);
121+
}
82122
}
83123

84124
/**

src/Connection.php

Lines changed: 2 additions & 62 deletions
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,6 @@
1010
use MongoDB\Driver\Manager;
1111
use yii\base\Component;
1212
use yii\base\InvalidConfigException;
13-
use \MongoDB\Driver\ReadConcern;
14-
use \MongoDB\Driver\WriteConcern;
15-
use \MongoDB\Driver\ReadPreference;
1613
use Yii;
1714

1815
/**
@@ -473,63 +470,6 @@ public function execOptions($execOptions){
473470
return $this;
474471
}
475472

476-
/**
477-
* preapare execOptions for some purpose
478-
* @param array|object by reference
479-
* convert string option to object
480-
* ['readConcern' => 'snapshot'] > ['readConcern' => new \MongoDB\Driver\ReadConcern('snapshot')]
481-
* ['writeConcern' => 'majority'] > ['writeConcern' => new \MongoDB\Driver\WriteConcern('majority')]
482-
* ['writeConcern' => ['majority',true]] > ['writeConcern' => new \MongoDB\Driver\WriteConcern('majority',true)]
483-
*/
484-
public static function prepareExecOptions(&$execOptions){
485-
486-
#convert readConcern option
487-
if(array_key_exists('readConcern', $execOptions) && is_string($execOptions['readConcern']))
488-
$execOptions['readConcern'] = new ReadConcern($execOptions['readConcern']);
489-
490-
#convert writeConcern option
491-
if(array_key_exists('writeConcern', $execOptions)){
492-
if(is_string($execOptions['writeConcern']))
493-
$execOptions['writeConcern'] = new WriteConcern($execOptions['writeConcern']);
494-
elseif(is_array($execOptions['writeConcern']))
495-
$execOptions['writeConcern'] = (new \ReflectionClass('\MongoDB\Driver\WriteConcern'))->newInstanceArgs($execOptions['writeConcern']);
496-
}
497-
498-
#conver readPreference option
499-
if(array_key_exists('readPreference', $execOptions)){
500-
if(is_string($execOptions['readPreference']))
501-
$execOptions['readPreference'] = new ReadPreference($execOptions['readPreference']);
502-
elseif(is_array($execOptions['readPreference']))
503-
$execOptions['readPreference'] = (new \ReflectionClass('\MongoDB\Driver\ReadPreference'))->newInstanceArgs($execOptions['readPreference']);
504-
}
505-
506-
#convert session option
507-
if(array_key_exists('session',$execOptions))
508-
$execOptions['session'] = $execOptions['session']->mongoSession;
509-
510-
#convert defaultTransactionOptions for MongoDB\Driver\Manager::startSession
511-
if(
512-
array_key_exists('defaultTransactionOptions',$execOptions) &&
513-
array_key_exists('readConcern',$execOptions['defaultTransactionOptions']) &&
514-
is_string($execOptions['defaultTransactionOptions']['readConcern'])
515-
)
516-
$execOptions['defaultTransactionOptions']['readConcern'] = new ReadConcern($execOptions['defaultTransactionOptions']['readConcern']);
517-
518-
if(array_key_exists('defaultTransactionOptions',$execOptions) && array_key_exists('writeConcern',$execOptions['defaultTransactionOptions'])){
519-
if(is_string($execOptions['defaultTransactionOptions']['writeConcern']))
520-
$execOptions['defaultTransactionOptions']['writeConcern'] = new WriteConcern($execOptions['defaultTransactionOptions']['writeConcern']);
521-
else if(is_array($execOptions['defaultTransactionOptions']['writeConcern']))
522-
$execOptions['defaultTransactionOptions']['writeConcern'] = (new \ReflectionClass('\MongoDB\Driver\WriteConcern'))->newInstanceArgs($execOptions['defaultTransactionOptions']['writeConcern']);
523-
}
524-
525-
if(array_key_exists('defaultTransactionOptions',$execOptions) && array_key_exists('readPreference',$execOptions['defaultTransactionOptions'])){
526-
if(is_string($execOptions['defaultTransactionOptions']['readPreference']))
527-
$execOptions['defaultTransactionOptions']['readPreference'] = new ReadPreference($execOptions['defaultTransactionOptions']['readPreference']);
528-
else if(is_array($execOptions['defaultTransactionOptions']['readPreference']))
529-
$execOptions['defaultTransactionOptions']['readPreference'] = (new \ReflectionClass('\MongoDB\Driver\ReadPreference'))->newInstanceArgs($execOptions['defaultTransactionOptions']['readPreference']);
530-
}
531-
}
532-
533473
/**
534474
* start new session for current connection
535475
* @param array $sessionOptions see doc of ClientSession::start()
@@ -559,7 +499,7 @@ public function getSession(){
559499
* start transaction with three step :
560500
* - start new session
561501
* - start transaction of new session
562-
* - set new session to current command
502+
* - set new session to current connection
563503
* @param array $transactionOptions see doc of Transaction::start()
564504
* @param array $sessionOptions see doc of ClientSession::start()
565505
* return ClientSession
@@ -583,7 +523,7 @@ public function commitTransaction(){
583523
}
584524

585525
/**
586-
* commit transaction in current session
526+
* rollback transaction in current session
587527
*/
588528
public function rollBackTransaction(){
589529
if(!$this->getInSession())

src/Transaction.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ public function getIsActive(){
5252
* @see https://www.php.net/manual/en/mongodb-driver-session.starttransaction.php#refsect1-mongodb-driver-session.starttransaction-parameters
5353
*/
5454
public function start($transactionOptions = []){
55-
Connection::prepareExecOptions($transactionOptions);
55+
Command::prepareCPOptions($transactionOptions);
5656
yii::trace('Starting mongodb transaction ...', __METHOD__);
5757
if($this->clientSession->mongoSession->isInTransaction())
5858
throw new Exception('Nested transaction not supported');

0 commit comments

Comments
 (0)