Skip to content

Commit

Permalink
Add bind map, add column style, update doc.
Browse files Browse the repository at this point in the history
  • Loading branch information
twose committed Apr 8, 2018
1 parent 4dfea89 commit 019a362
Show file tree
Hide file tree
Showing 7 changed files with 371 additions and 53 deletions.
68 changes: 61 additions & 7 deletions README-zh.md
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,6 @@ Swoole底层实现协程调度, **业务层无需感知**, 开发者可以无感
除了构造函数有所不同, 其它使用方法完全一样


#### query

```php
Expand Down Expand Up @@ -56,6 +55,7 @@ var_dump($pdo_both === $swpdo_both);
var_dump($pdo_assoc === $swpdo_assoc);
var_dump($pdo_object == $swpdo_object);
var_dump($pdo_number === $swpdo_number);
//output: true true true true
```

#### prepare
Expand All @@ -64,16 +64,70 @@ var_dump($pdo_number === $swpdo_number);
//PDO
$pdo = new \PDO(...$options);
$pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); //strong type
$statement = $pdo->prepare('select * from `user`');
$statement = $pdo->prepare($sql);
$statement->execute();
$pdo_fetch = $statement->fetch(\PDO::FETCH_ASSOC);
$statement->execute();
$pdo_fetch_all = $statement->fetchAll();
$statement->execute();
$pdo_fetch_all_column = $statement->fetchAll(\PDO::FETCH_COLUMN, 1);
$statement->execute();
$pdo_fetch_column = $statement->fetchColumn();
$statement->execute();

//PDO
//SwPDO
$swpdo = SwPDO::construct(...$options);
$statement = $swpdo->prepare('select * from `user`');
$statement = $swpdo->prepare($sql);
$statement->execute();
$swpdo_fetch = $statement->fetch(\PDO::FETCH_ASSOC);
$statement->execute();
$swpdo_fetch_all = $statement->fetchAll();
$statement->execute();
$swpdo_fetch_all_column = $statement->fetchAll(\PDO::FETCH_COLUMN, 1);
$statement->execute();
$swpdo_fetch_column = $statement->fetchColumn();
$statement->execute();

var_dump($pdo_fetch === $swpdo_fetch); //true
var_dump($pdo_fetch_all === $swpdo_fetch_all); //true
var_dump($pdo_fetch_all_column === $swpdo_fetch_all_column); //true
var_dump($pdo_fetch_column === $swpdo_fetch_column); //true
```

### bind

```php
//PDO
$pdo = new \PDO(...$options);
$pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); //strong type
$statement = $pdo->prepare($sql);
$statement->execute(['id' => 1]);
$pdo_bind_exec = $statement->fetch(\PDO::FETCH_ASSOC);

$statement->bindValue(':id', 1);
$statement->execute();
$pdo_bind_val = $statement->fetch(\PDO::FETCH_ASSOC);

$statement->bindParam(':id', $id);
$statement->execute();
$pdo_bind_param = $statement->fetch(\PDO::FETCH_ASSOC);

//SwPDO
$swpdo = SwPDO::construct(...$options);
$statement = $swpdo->prepare($sql);
$statement->execute(['id' => 1]);
$swpdo_bind_exec = $statement->fetch(\PDO::FETCH_ASSOC);

$statement->bindValue(':id', 1);
$statement->execute();
$swpdo_bind_val = $statement->fetch(\PDO::FETCH_ASSOC);

$statement->bindParam(':id', $id);
$statement->execute();
$swpdo_bind_param = $statement->fetch(\PDO::FETCH_ASSOC);

var_dump($pdo_bind_exec === $swpdo_bind_exec); //true
var_dump($pdo_bind_val === $swpdo_bind_val); //true
var_dump($pdo_bind_param === $swpdo_bind_param); //true
```

var_dump($pdo_fetch === $swpdo_fetch);
//output: true
```
65 changes: 60 additions & 5 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,8 @@

Traditional PDO to Swoole Coroutine migration plan without cost.

[中文文档](README-zh.md)

<br>

## Coroutine
Expand Down Expand Up @@ -64,17 +66,70 @@ var_dump($pdo_number === $swpdo_number);
//PDO
$pdo = new \PDO(...$options);
$pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); //strong type
$statement = $pdo->prepare('select * from `user`');
$statement = $pdo->prepare($sql);
$statement->execute();
$pdo_fetch = $statement->fetch(\PDO::FETCH_ASSOC);
$statement->execute();
$pdo_fetch_all = $statement->fetchAll();
$statement->execute();
$pdo_fetch_all_column = $statement->fetchAll(\PDO::FETCH_COLUMN, 1);
$statement->execute();
$pdo_fetch_column = $statement->fetchColumn();
$statement->execute();

//PDO
//SwPDO
$swpdo = SwPDO::construct(...$options);
$statement = $swpdo->prepare('select * from `user`');
$statement = $swpdo->prepare($sql);
$statement->execute();
$swpdo_fetch = $statement->fetch(\PDO::FETCH_ASSOC);
$statement->execute();
$swpdo_fetch_all = $statement->fetchAll();
$statement->execute();
$swpdo_fetch_all_column = $statement->fetchAll(\PDO::FETCH_COLUMN, 1);
$statement->execute();
$swpdo_fetch_column = $statement->fetchColumn();
$statement->execute();

var_dump($pdo_fetch === $swpdo_fetch); //true
var_dump($pdo_fetch_all === $swpdo_fetch_all); //true
var_dump($pdo_fetch_all_column === $swpdo_fetch_all_column); //true
var_dump($pdo_fetch_column === $swpdo_fetch_column); //true
```

### bind

```php
//PDO
$pdo = new \PDO(...$options);
$pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); //strong type
$statement = $pdo->prepare($sql);
$statement->execute(['id' => 1]);
$pdo_bind_exec = $statement->fetch(\PDO::FETCH_ASSOC);

$statement->bindValue(':id', 1);
$statement->execute();
$pdo_bind_val = $statement->fetch(\PDO::FETCH_ASSOC);

$statement->bindParam(':id', $id);
$statement->execute();
$pdo_bind_param = $statement->fetch(\PDO::FETCH_ASSOC);

//SwPDO
$swpdo = SwPDO::construct(...$options);
$statement = $swpdo->prepare($sql);
$statement->execute(['id' => 1]);
$swpdo_bind_exec = $statement->fetch(\PDO::FETCH_ASSOC);

$statement->bindValue(':id', 1);
$statement->execute();
$swpdo_bind_val = $statement->fetch(\PDO::FETCH_ASSOC);

$statement->bindParam(':id', $id);
$statement->execute();
$swpdo_bind_param = $statement->fetch(\PDO::FETCH_ASSOC);

var_dump($pdo_fetch === $swpdo_fetch);
//output: true
var_dump($pdo_bind_exec === $swpdo_bind_exec); //true
var_dump($pdo_bind_val === $swpdo_bind_val); //true
var_dump($pdo_bind_param === $swpdo_bind_param); //true
```

53 changes: 53 additions & 0 deletions examples/bind.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
<?php
/**
* Copyright: Swlib
* Author: Twosee <twose@qq.com>
* Date: 2018/4/7 下午11:53
*/

use Swlib\SwPDO;

require __DIR__ . '/../vendor/autoload.php';

go(function () {
$options = [
'mysql:host=127.0.0.1;dbname=test;charset=UTF8',
'root',
'root'
];
$sql = 'select * from `user` where id=:id';
$id = 1;

//PDO
$pdo = new \PDO(...$options);
$pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); //strong type
$statement = $pdo->prepare($sql);
$statement->execute(['id' => 1]);
$pdo_bind_exec = $statement->fetch(\PDO::FETCH_ASSOC);

$statement->bindValue(':id', 1);
$statement->execute();
$pdo_bind_val = $statement->fetch(\PDO::FETCH_ASSOC);

$statement->bindParam(':id', $id);
$statement->execute();
$pdo_bind_param = $statement->fetch(\PDO::FETCH_ASSOC);

//SwPDO
$swpdo = SwPDO::construct(...$options);
$statement = $swpdo->prepare($sql);
$statement->execute(['id' => 1]);
$swpdo_bind_exec = $statement->fetch(\PDO::FETCH_ASSOC);

$statement->bindValue(':id', 1);
$statement->execute();
$swpdo_bind_val = $statement->fetch(\PDO::FETCH_ASSOC);

$statement->bindParam(':id', $id);
$statement->execute();
$swpdo_bind_param = $statement->fetch(\PDO::FETCH_ASSOC);

var_dump($pdo_bind_exec === $swpdo_bind_exec); //true
var_dump($pdo_bind_val === $swpdo_bind_val); //true
var_dump($pdo_bind_param === $swpdo_bind_param); //true
});
30 changes: 24 additions & 6 deletions examples/prepare.php
Original file line number Diff line number Diff line change
Expand Up @@ -11,23 +11,41 @@

go(function () {
$options = [
'mysql:host=127.0.0.1;port=9502;dbname=custed;charset=UTF8',
'php',
'justfortest'
'mysql:host=127.0.0.1;dbname=test;charset=UTF8',
'root',
'root'
];
$sql = 'select * from `user`';

//PDO
$pdo = new \PDO(...$options);
$pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); //strong type
$statement = $pdo->prepare('select * from `user`');
$statement = $pdo->prepare($sql);
$statement->execute();
$pdo_fetch = $statement->fetch(\PDO::FETCH_ASSOC);
$statement->execute();
$pdo_fetch_all = $statement->fetchAll();
$statement->execute();
$pdo_fetch_all_column = $statement->fetchAll(\PDO::FETCH_COLUMN, 1);
$statement->execute();
$pdo_fetch_column = $statement->fetchColumn();
$statement->execute();

//PDO
//SwPDO
$swpdo = SwPDO::construct(...$options);
$statement = $swpdo->prepare('select * from `user`');
$statement = $swpdo->prepare($sql);
$statement->execute();
$swpdo_fetch = $statement->fetch(\PDO::FETCH_ASSOC);
$statement->execute();
$swpdo_fetch_all = $statement->fetchAll();
$statement->execute();
$swpdo_fetch_all_column = $statement->fetchAll(\PDO::FETCH_COLUMN, 1);
$statement->execute();
$swpdo_fetch_column = $statement->fetchColumn();
$statement->execute();

var_dump($pdo_fetch === $swpdo_fetch);
var_dump($pdo_fetch_all === $swpdo_fetch_all);
var_dump($pdo_fetch_all_column === $swpdo_fetch_all_column);
var_dump($pdo_fetch_column === $swpdo_fetch_column);
});
8 changes: 4 additions & 4 deletions examples/query.php
Original file line number Diff line number Diff line change
Expand Up @@ -32,8 +32,8 @@
$swpdo_object = $swpdo->query($sql)->fetch(\PDO::FETCH_OBJ);
$swpdo_number = $swpdo->query($sql)->fetch(\PDO::FETCH_NUM);

var_dump($pdo_both === $swpdo_both);
var_dump($pdo_assoc === $swpdo_assoc);
var_dump($pdo_object == $swpdo_object);
var_dump($pdo_number === $swpdo_number);
var_dump($pdo_both === $swpdo_both); //true
var_dump($pdo_assoc === $swpdo_assoc); //true
var_dump($pdo_object == $swpdo_object); //true
var_dump($pdo_number === $swpdo_number); //true
});
31 changes: 28 additions & 3 deletions src/Mysql.php
Original file line number Diff line number Diff line change
Expand Up @@ -28,9 +28,14 @@ class Mysql
public static function construct(array $options)
{
$mysql = new self();
if (isset($options['dbname'])) {
$options['database'] = $options['dbname'];
unset($options['dbname']);
static $keyMap = [
'dbname' => 'database'
];
foreach ($keyMap as $pdoKey => $swpdoKey) {
if (isset($options[$pdoKey])) {
$options[$swpdoKey] = $options[$pdoKey];
unset($options[$pdoKey]);
}
}
$options = $options + self::$default_options;
$mysql->client = new \Swoole\Coroutine\Mysql();
Expand Down Expand Up @@ -89,10 +94,30 @@ public function query(string $statement, float $timeout = 1.000)
return new MysqlStatement($this, $statement, ['timeout' => $timeout]);
}

private function rewriteToPosition(string $statement)
{

}

public function prepare(string $statement, array $driver_options = [])
{
//rewriting :name to ? style.
if (strpos($statement, ':') !== false) {
$i = 0;
$bindKeyMap = [];
$statement = preg_replace_callback(
'/:(\w+)\b/',
function ($matches) use (&$i, &$bindKeyMap) {
$bindKeyMap[$matches[1]] = $i++;

return '?';
},
$statement
);
}
$stmt_obj = $this->client->prepare($statement);
if ($stmt_obj) {
$stmt_obj->bindKeyMap = $bindKeyMap ?? [];
return new MysqlStatement($this, $stmt_obj, $driver_options);
} else {
return false;
Expand Down
Loading

0 comments on commit 019a362

Please sign in to comment.