124 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			124 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
<?php
 | 
						|
namespace nur\sery\db\sqlite;
 | 
						|
 | 
						|
use nur\sery\StateException;
 | 
						|
use nur\sery\ValueException;
 | 
						|
use SQLite3;
 | 
						|
use SQLite3Stmt;
 | 
						|
 | 
						|
class SqliteQuery {
 | 
						|
  static function verifix(&$query, ?array &$params=null): void {
 | 
						|
    if (is_array($query)) {
 | 
						|
      throw StateException::not_implemented(); #XXX
 | 
						|
      $prefix = $query[0] ?? null;
 | 
						|
      if ($prefix === null) {
 | 
						|
        throw new ValueException("requête invalide");
 | 
						|
      } elseif (self::is_create($prefix)) {
 | 
						|
        $query = self::parse_create($query, $params);
 | 
						|
      } elseif (self::is_select($prefix)) {
 | 
						|
        $query = self::parse_select($query, $params);
 | 
						|
      } elseif (self::is_insert($prefix)) {
 | 
						|
        $query = self::parse_insert($query, $params);
 | 
						|
      } elseif (self::is_update($prefix)) {
 | 
						|
        $query = self::parse_update($query, $params);
 | 
						|
      } elseif (self::is_delete($prefix)) {
 | 
						|
        $query = self::parse_delete($query, $params);
 | 
						|
      } else {
 | 
						|
        throw new ValueException("requête invalide");
 | 
						|
      }
 | 
						|
    } elseif (!is_string($query)) {
 | 
						|
      $query = strval($query);
 | 
						|
    }
 | 
						|
  }
 | 
						|
 | 
						|
  const create_SCHEMA = [
 | 
						|
    "prefix" => "string",
 | 
						|
    "table" => "string",
 | 
						|
    "cols" => "array",
 | 
						|
    "suffix" => "?string",
 | 
						|
  ];
 | 
						|
  static function is_create(string $sql): bool {
 | 
						|
  }
 | 
						|
  static function parse_create(array $query, ?array &$params=null): string {
 | 
						|
  }
 | 
						|
 | 
						|
  const select_SCHEMA = [
 | 
						|
    "prefix" => "string",
 | 
						|
    "cols" => "?array",
 | 
						|
    "from" => "?string",
 | 
						|
    "where" => "?array",
 | 
						|
    "order by" => "?array",
 | 
						|
    "group by" => "?array",
 | 
						|
    "having" => "?array",
 | 
						|
  ];
 | 
						|
  static function is_select(string $sql): bool {
 | 
						|
  }
 | 
						|
  static function parse_select(array $query, ?array &$params=null): string {
 | 
						|
  }
 | 
						|
 | 
						|
  const insert_SCHEMA = [
 | 
						|
    "prefix" => "string",
 | 
						|
    "into" => "?string",
 | 
						|
    "cols" => "?array",
 | 
						|
    "values" => "?array",
 | 
						|
  ];
 | 
						|
  static function is_insert(string $sql): bool {
 | 
						|
  }
 | 
						|
  static function parse_insert(array $query, ?array &$params=null): string {
 | 
						|
  }
 | 
						|
 | 
						|
  const update_SCHEMA = [
 | 
						|
    "prefix" => "string",
 | 
						|
    "table" => "?string",
 | 
						|
    "cols" => "?array",
 | 
						|
    "values" => "?array",
 | 
						|
    "where" => "?array",
 | 
						|
  ];
 | 
						|
  static function is_update(string $sql): bool {
 | 
						|
  }
 | 
						|
  static function parse_update(array $query, ?array &$params=null): string {
 | 
						|
  }
 | 
						|
 | 
						|
  const delete_SCHEMA = [
 | 
						|
    "prefix" => "string",
 | 
						|
    "from" => "?string",
 | 
						|
    "where" => "?array",
 | 
						|
  ];
 | 
						|
  static function is_delete(string $sql): bool {
 | 
						|
  }
 | 
						|
  static function parse_delete(array $query, ?array &$params=null): string {
 | 
						|
  }
 | 
						|
 | 
						|
  function __construct($sql, ?array $params=null) {
 | 
						|
    self::verifix($sql, $params);
 | 
						|
    $this->sql = $sql;
 | 
						|
    $this->params = $params;
 | 
						|
  }
 | 
						|
 | 
						|
  /** @var string */
 | 
						|
  protected $sql;
 | 
						|
 | 
						|
  /** @var ?array */
 | 
						|
  protected $params;
 | 
						|
 | 
						|
  function useStmt(SQLite3 $db, ?SQLite3Stmt &$stmt=null, ?string &$sql=null): bool {
 | 
						|
    if ($this->params !== null) {
 | 
						|
      /** @var SQLite3Stmt $stmt */
 | 
						|
      $stmt = SqliteException::check($db, $db->prepare($this->sql));
 | 
						|
      $close = true;
 | 
						|
      try {
 | 
						|
        foreach ($this->params as $param => $value) {
 | 
						|
          SqliteException::check($db, $stmt->bindValue($param, $value));
 | 
						|
        }
 | 
						|
        $close = false;
 | 
						|
        return true;
 | 
						|
      } finally {
 | 
						|
        if ($close) $stmt->close();
 | 
						|
      }
 | 
						|
    } else {
 | 
						|
      $sql = $this->sql;
 | 
						|
      return false;
 | 
						|
    }
 | 
						|
  }
 | 
						|
}
 |