60 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
		
		
			
		
	
	
			60 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
| 
								 | 
							
								<?php
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								namespace SparkPlug\Com\Noccy\Pdo;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								use Spark\Resource\ResourceType;
							 | 
						||
| 
								 | 
							
								use PDO;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								class PdoResource extends ResourceType
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    private PDO|null $pdo = null;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    private array $options;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    public function __construct(array $options)
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        $this->options = $options;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    private function createFromURI(string $uri)
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        $uris = parse_url($uri);
							 | 
						||
| 
								 | 
							
								        $username = $uris['user']??null;
							 | 
						||
| 
								 | 
							
								        $password = $uris['pass']??null;
							 | 
						||
| 
								 | 
							
								        
							 | 
						||
| 
								 | 
							
								        switch ($uris['scheme']??null) {
							 | 
						||
| 
								 | 
							
								            case 'mysql':
							 | 
						||
| 
								 | 
							
								                $database = ltrim($uris['path']??null, '/');
							 | 
						||
| 
								 | 
							
								                $dsn = sprintf("mysql:host=%s;port=%d;dbname=%s", $uris['host']??'127.0.0.1', $uris['port']??3306, $database);
							 | 
						||
| 
								 | 
							
								                break;
							 | 
						||
| 
								 | 
							
								            case 'sqlite':
							 | 
						||
| 
								 | 
							
								                $database = $uris['path']??':memory:';
							 | 
						||
| 
								 | 
							
								                $dsn = sprintf("sqlite:%s", $database);
							 | 
						||
| 
								 | 
							
								                break;
							 | 
						||
| 
								 | 
							
								            default:
							 | 
						||
| 
								 | 
							
								                fprintf(STDERR, "error: Unable to create PDO resource from URI, invalid type %s\n", $uris['scheme']??null);
							 | 
						||
| 
								 | 
							
								                return;
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        $this->pdo = new \PDO($dsn, $username, $password);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    public function getPDO(): ?PDO
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        if (!$this->pdo) {
							 | 
						||
| 
								 | 
							
								            $this->createFromURI($this->options['uri']);
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        return $this->pdo;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    public function info()
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        return $this->options['uri'];
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    public function createTable(string $name, array $columns, bool $ifNotExists=false)
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								}
							 |