Skip to content

Commit 1557c30

Browse files
committed
hello
0 parents  commit 1557c30

51 files changed

Lines changed: 6776 additions & 0 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.github/workflows/ci.yml

Lines changed: 114 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,114 @@
1+
name: Tests
2+
3+
on:
4+
push:
5+
branches:
6+
- main
7+
- develop
8+
pull_request:
9+
branches:
10+
- main
11+
- develop
12+
13+
jobs:
14+
test:
15+
strategy:
16+
matrix:
17+
database:
18+
- name: 'MySQL 5.7'
19+
image: 'mysql:5.7'
20+
- name: 'MySQL 8.0'
21+
image: 'mysql:8.0'
22+
- name: 'MariaDB 10.3'
23+
image: 'mariadb:10.3'
24+
- name: 'MariaDB 10.6'
25+
image: 'mariadb:10.6'
26+
- name: 'MariaDB 10.11'
27+
image: 'mariadb:10.11'
28+
runs-on: ubuntu-latest
29+
30+
services:
31+
mysql:
32+
image: ${{ matrix.database.image }}
33+
env:
34+
MYSQL_ROOT_PASSWORD: 123456
35+
MYSQL_DATABASE: test_db
36+
ports:
37+
- 3306:3306
38+
39+
steps:
40+
- name: Checkout code
41+
uses: actions/checkout@v4
42+
43+
- name: Setup PHP
44+
uses: shivammathur/setup-php@v2
45+
with:
46+
php-version: '8.1'
47+
extensions: posix, pcntl, sockets, pdo, openssl, ev
48+
49+
- name: Cache Composer dependencies
50+
uses: actions/cache@v4
51+
with:
52+
path: ~/.composer/cache
53+
key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }}
54+
restore-keys: |
55+
${{ runner.os }}-composer-
56+
57+
- name: Install dependencies
58+
run: composer install --prefer-dist --no-progress --no-suggest --optimize-autoloader
59+
60+
- name: Wait for database
61+
run: |
62+
echo "Waiting for database to be ready..."
63+
sleep 30
64+
MYSQL_PWD=123456 mysql -h 127.0.0.1 -P 3306 -u root -e "SELECT 1" test_db
65+
echo "Database is ready!"
66+
67+
- name: Create test database
68+
run: |
69+
MYSQL_PWD=123456 mysql -h 127.0.0.1 -P 3306 -u root -e "CREATE DATABASE IF NOT EXISTS test_db;"
70+
71+
- name: Run PHPUnit
72+
run: |
73+
vendor/bin/phpunit \
74+
--coverage-clover=coverage.xml \
75+
--log-junit=test-results.xml
76+
env:
77+
DB_HOST: 127.0.0.1
78+
DB_PORT: 3306
79+
DB_USER: root
80+
DB_PASSWORD: 123456
81+
DB_NAME: test_db
82+
XDEBUG_MODE: coverage
83+
84+
code-quality:
85+
name: Code Quality
86+
runs-on: ubuntu-latest
87+
88+
steps:
89+
- name: Checkout code
90+
uses: actions/checkout@v4
91+
92+
- name: Setup PHP
93+
uses: shivammathur/setup-php@v2
94+
with:
95+
php-version: "8.1"
96+
extensions: pdo, pdo_mysql, openssl, sockets, pcntl, ev
97+
tools: composer:v2
98+
99+
- name: Cache Composer dependencies
100+
uses: actions/cache@v4
101+
with:
102+
path: ~/.composer/cache
103+
key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }}
104+
restore-keys: |
105+
${{ runner.os }}-composer-
106+
107+
- name: Install dependencies
108+
run: composer install --prefer-dist --no-progress --no-suggest --optimize-autoloader
109+
110+
- name: Check for syntax errors
111+
run: find . -name "*.php" -not -path "./vendor/*" -exec php -l {} \;
112+
113+
- name: Run PHP CS Fixer
114+
run: vendor/bin/php-cs-fixer fix --diff --verbose

.gitignore

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
.idea
2+
ripple-database.iml
3+
4+
/debug/
5+
/logs/
6+
/vendor/
7+
8+
composer.lock
9+
10+
.php-cs-fixer.cache
11+
.phpunit*

.php-cs-fixer.php

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
<?php declare(strict_types=1);
2+
3+
use PhpCsFixer\Config;
4+
use PhpCsFixer\Finder;
5+
6+
$finder = Finder::create()->in(__DIR__)
7+
->name('*.php')
8+
->notName('*.blade.php')
9+
->notPath('storage/framework/views')
10+
->notPath('public');
11+
12+
$config = new Config();
13+
14+
$config->setFinder($finder);
15+
$config->setRiskyAllowed(true);
16+
17+
return $config->setRules([
18+
'@PSR12' => true,
19+
'native_function_invocation' => [
20+
'include' => ['@all'],
21+
'scope' => 'all',
22+
'strict' => false
23+
],
24+
'native_constant_invocation' => [
25+
'include' => ['@all'],
26+
'scope' => 'all',
27+
'strict' => false
28+
],
29+
'global_namespace_import' => [
30+
'import_classes' => true,
31+
'import_constants' => true,
32+
'import_functions' => true
33+
],
34+
'declare_strict_types' => true,
35+
'linebreak_after_opening_tag' => false,
36+
'blank_line_after_opening_tag' => false,
37+
'no_unused_imports' => true,
38+
]);

LICENSE

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
MIT License
2+
3+
Copyright (c) 2023 cclilshy
4+
5+
Permission is hereby granted, free of charge, to any person obtaining a copy
6+
of this software and associated documentation files (the "Software"), to deal
7+
in the Software without restriction, including without limitation the rights
8+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9+
copies of the Software, and to permit persons to whom the Software is
10+
furnished to do so, subject to the following conditions:
11+
12+
The above copyright notice and this permission notice shall be included in all
13+
copies or substantial portions of the Software.
14+
15+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21+
SOFTWARE.

README.md

Lines changed: 199 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,199 @@
1+
# Ripple DB
2+
3+
⚡️ 高性能数据库连接池, 完美兼容PDO接口, 内置连接池
4+
5+
| 驱动类型 | 支持 |
6+
|---------|-----|
7+
| `MySQL` | 已支持 |
8+
| `...` | 暂无 |
9+
10+
## 一键安装
11+
12+
```bash
13+
composer require cloudtay/ripple-database
14+
```
15+
16+
### 快速开始
17+
18+
```php
19+
<?php declare(strict_types=1);
20+
21+
require __DIR__ . '/../vendor/autoload.php';
22+
23+
use Ripple\Database\PDO;
24+
25+
$dsn = "mysql:host=127.0.0.1;port=3306;dbname=test_db;charset=utf8mb4";
26+
$pdo = new PDO($dsn, 'root', '123456');
27+
28+
// 创建表
29+
$pdo->exec("CREATE TABLE IF NOT EXISTS users (
30+
id INT AUTO_INCREMENT PRIMARY KEY,
31+
name VARCHAR(100) NOT NULL,
32+
email VARCHAR(255) UNIQUE
33+
)");
34+
35+
// 预处理语句
36+
$stmt = $pdo->prepare("INSERT INTO users (name, email) VALUES (?, ?)");
37+
$stmt->execute(['Alice', 'alice@example.com']);
38+
39+
// 查询数据
40+
$result = $pdo->query("SELECT * FROM users WHERE name = 'Alice'")->fetch();
41+
echo "User: {$result['name']} - {$result['email']}\n";
42+
```
43+
44+
#### 连接选项
45+
46+
| 配置项 | 类型 | 默认值 | 描述 |
47+
|---------------------------|-----|-------|-----------|
48+
| ... | ... | | PDO默认选项类表 |
49+
| `pool_max` | 整数 | `20` | 最大连接数 |
50+
| `pool_min` | 整数 | `5` | 最小连接数 |
51+
| `pool_connection_timeout` | 整数 | `300` | 连接超时时间(秒) |
52+
53+
```php
54+
$pool = new PDOPool($dsn, $user, $password, [
55+
// PDO选项
56+
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
57+
58+
// 连接池选项
59+
'pool_max' => 20, // 最大连接数,自动扩容
60+
'pool_min' => 5, // 最小连接数,初始化时自动连接
61+
'pool_connection_timeout' => 300, // 连接超时时间(惰性检查)
62+
]);
63+
```
64+
65+
## 兼容性
66+
67+
### 已兼容的PDO方法
68+
69+
| 方法名 | 描述 | 支持状态 |
70+
|------------------------------|--------------|-------|
71+
| `PDO::prepare()` | 预处理语句 | 支持 |
72+
| `PDO::query()` | 执行查询 | 支持 |
73+
| `PDO::exec()` | 执行语句并返回受影响行数 | 支持 |
74+
| `PDO::lastInsertId()` | 获取最后插入 ID | 支持 |
75+
| `PDO::beginTransaction()` | 开始事务 | 支持 |
76+
| `PDO::commit()` | 提交事务 | 支持 |
77+
| `PDO::rollBack()` | 回滚事务 | 支持 |
78+
| `PDO::inTransaction()` | 检查是否在事务中 | 支持 |
79+
| `PDO::setAttribute()` | 设置PDO属性 | 支持 |
80+
| `PDO::getAttribute()` | 获取PDO属性 | 支持 |
81+
| `PDO::errorCode()` | 获取错误代码 | 支持 |
82+
| `PDO::errorInfo()` | 获取错误信息 | 支持 |
83+
| `PDO::getAvailableDrivers()` | 获取可用驱动列表 | 支持 |
84+
| `PDO::status()` | 获取连接池状态信息 | 连接池独有 |
85+
| `PDO::close()` | 关闭连接池 | 连接池独有 |
86+
| `PDO::quote()` | 引号转义 | 不支持 |
87+
88+
### 类型兼容性
89+
90+
与原生PDO在数据类型处理上完全一致, 确保数据存储和检索的准确性。
91+
92+
| 数据类型 | MySQL 类型 | 强等于校验 |
93+
|---------|-------------------------------------------------|-------|
94+
| 整数类型 | `TINYINT`, `SMALLINT`, `INT`, `BIGINT` | 通过 |
95+
| 浮点类型 | `FLOAT`, `DOUBLE`, `DECIMAL` | 通过 |
96+
| 字符串类型 | `CHAR`, `VARCHAR`, `TEXT` | 通过 |
97+
| 二进制类型 | `BLOB` | 通过 |
98+
| JSON 类型 | `JSON` | 通过 |
99+
| 日期时间 | `DATE`, `DATETIME`, `TIMESTAMP`, `TIME`, `YEAR` | 通过 |
100+
| 布尔类型 | `BOOLEAN` | 通过 |
101+
| 枚举类型 | `ENUM`, `SET` | 通过 |
102+
103+
项目包含完整的类型兼容性测试, 确保与原生PDO的行为完全一致:
104+
105+
```php
106+
// 测试覆盖的数据类型
107+
$testData = [
108+
'tiny_col' => 1, // TINYINT
109+
'small_col' => 32000, // SMALLINT
110+
'int_col' => 2147483647, // INT
111+
'big_col' => 9223372036854775807, // BIGINT
112+
'float_col' => 3.14159, // FLOAT
113+
'double_col' => 2.718281828459, // DOUBLE
114+
'decimal_col' => '12345.67', // DECIMAL
115+
'char_col' => 'char_text', // CHAR
116+
'varchar_col' => 'varchar_text', // VARCHAR
117+
'text_col' => 'this is text', // TEXT
118+
'blob_col' => random_bytes(16), // BLOB
119+
'json_col' => json_encode(['a' => 1, 'b' => 2]), // JSON
120+
'date_col' => '2025-09-20', // DATE
121+
'datetime_col' => '2025-09-20 19:00:00', // DATETIME
122+
'timestamp_col' => '2025-09-20 19:00:00', // TIMESTAMP
123+
'time_col' => '12:34:56', // TIME
124+
'year_col' => 2025, // YEAR
125+
'bool_col' => 1, // BOOLEAN
126+
'enum_col' => 'b', // ENUM
127+
'set_col' => 'x,y', // SET
128+
'emoji_col' => '😀🚀✨' // UTF-8 Emoji
129+
];
130+
```
131+
132+
## 用法示例
133+
134+
### 连接池使用
135+
136+
```php
137+
<?php declare(strict_types=1);
138+
139+
require __DIR__ . '/../vendor/autoload.php';
140+
141+
use Ripple\Database\PDOPool;
142+
use Ripple\Sync\Channel;
143+
use Ripple\Sync\WaitGroup;
144+
145+
use function Co\go;
146+
147+
$dsn = "mysql:host=127.0.0.1;port=3306;dbname=test_db;charset=utf8mb4";
148+
$pdo = new PDOPool($dsn, 'root', '123456', [
149+
'pool_max' => 10,
150+
'pool_min' => 2
151+
]);
152+
153+
$channel = new Channel(10);
154+
for ($i = 0; $i < 10; $i++) {
155+
go(static function () use ($pdo, $channel) {
156+
$result = $pdo->query("SELECT SLEEP(1);");
157+
$channel->send($result);
158+
});
159+
}
160+
161+
while ($result = $channel->receive()) {
162+
echo json_encode($result->fetch(), JSON_UNESCAPED_UNICODE) . PHP_EOL;
163+
}
164+
```
165+
166+
### 事务处理
167+
168+
```php
169+
<?php
170+
171+
use Ripple\Database\PDO;
172+
173+
$pdo = new PDO($dsn, 'root', '123456');
174+
175+
try {
176+
$pdo->beginTransaction();
177+
178+
$stmt1 = $pdo->prepare("UPDATE accounts SET balance = balance - ? WHERE name = ?");
179+
$stmt1->execute([100.00, 'Alice']);
180+
181+
$stmt2 = $pdo->prepare("UPDATE accounts SET balance = balance + ? WHERE name = ?");
182+
$stmt2->execute([100.00, 'Bob']);
183+
184+
$pdo->commit();
185+
echo "Transaction completed successfully\n";
186+
187+
} catch (Exception $e) {
188+
$pdo->rollback();
189+
echo "Transaction failed: " . $e->getMessage() . "\n";
190+
}
191+
```
192+
193+
## 许可证
194+
195+
MIT License
196+
197+
## 作者
198+
199+
cclilshy <jingnigg@gmail.com>

0 commit comments

Comments
 (0)