184 lines
		
	
	
		
			6.0 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			184 lines
		
	
	
		
			6.0 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
| <?php
 | |
| namespace nur\m;
 | |
| 
 | |
| use nur\m\base\QueryException;
 | |
| 
 | |
| /**
 | |
|  * Interface IConn: une connexion à une base de données
 | |
|  */
 | |
| interface IConn {
 | |
|   /**
 | |
|    * obtenir des infos sur la connexion. le tableau retour fait au moins 3
 | |
|    * éléments: [$dbname, $dbuser, $dbpass]
 | |
|    */
 | |
|   function getInfos(): array;
 | |
| 
 | |
|   /**
 | |
|    * Démarrer une transaction si nécessaire. Si on est dans une transaction,
 | |
|    * cette méthode est un NOP.
 | |
|    *
 | |
|    * @throws QueryException
 | |
|    */
 | |
|   function beginTransaction(): void;
 | |
| 
 | |
|   /**
 | |
|    * Valider la transaction en cours, le cas échéant
 | |
|    *
 | |
|    * @throws QueryException
 | |
|    */
 | |
|   function commit(): void;
 | |
| 
 | |
|   /**
 | |
|    * Annuler la transaction en cours, le cas échéant
 | |
|    *
 | |
|    * @throws QueryException
 | |
|    */
 | |
|   function rollback(): void;
 | |
| 
 | |
|   const EXECUTE_PARAMS_SCHEMA = [
 | |
|     "transaction" => [null, false, "faut-il automatiquement démarrer une transaction pour cette requête?"],
 | |
|     "stmt" => [null, true, "faut-il retourner un objet 'statement' pour récupérer le résultat de la requête?"],
 | |
|     "num_rows" => [null, false, "faut-il retourner le nombre de ligne affectées?"],
 | |
|     "last_insert_id" => [null, false, "faut-il retourner l'id de la dernière ligne ajoutée?"],
 | |
|   ];
 | |
| 
 | |
|   const EXECUTE_PARAMS_DQL = [
 | |
|     "transaction" => false,
 | |
|     "stmt" => true,
 | |
|     "num_rows" => false,
 | |
|     "last_insert_id" => false,
 | |
|   ];
 | |
| 
 | |
|   const EXECUTE_PARAMS_DML_UPDATE = [
 | |
|     "transaction" => true,
 | |
|     "stmt" => false,
 | |
|     "num_rows" => true,
 | |
|     "last_insert_id" => false,
 | |
|   ];
 | |
| 
 | |
|   const EXECUTE_PARAMS_DML_INSERT = [
 | |
|     "transaction" => true,
 | |
|     "stmt" => false,
 | |
|     "num_rows" => false,
 | |
|     "last_insert_id" => true,
 | |
|   ];
 | |
| 
 | |
|   const EXECUTE_RETURN_VALUE_SCHEMA = [
 | |
|     "num_rows" => [null, null, "le nombre de ligne affectées par la requête"],
 | |
|     "insert_id" => [null, null, "id de la dernière ligne ajoutée"],
 | |
|     "stmt" => [null, null, "objet 'statement' permettant de récupérer le résultat de la requête"],
 | |
|   ];
 | |
| 
 | |
|   /**
 | |
|    * exécuter une requête générique de bas niveau (aucun traitement du type de
 | |
|    * ceux effectués par {@link IRowIncarnation} n'est fait au préalable)
 | |
|    *
 | |
|    * $params est un tableau conforme à {@link EXECUTE_PARAMS_SCHEMA} et indique
 | |
|    * les attendus concernant la requête et son résultat
 | |
|    * - "transaction" indique qu'il faut démarrer une transaction si ce n'est
 | |
|    * déjà le cas
 | |
|    * - "stmt" indique que des lignes seront retournées, et qu'il ne faut pas
 | |
|    * fermer l'objet "statement"
 | |
|    * - "num_rows" indique qu'on souhaite avoir le nombre de lignes concernées
 | |
|    * par l'opération de mise à jour
 | |
|    * - "last_insert_id" indique qu'on souhaite avoir l'identifiant de la dernière
 | |
|    * ligne ajoutée, si cela est possible
 | |
|    *
 | |
|    * Retourner un tableau conforme à {@link EXECUTE_RETURN_VALUE_SCHEMA}
 | |
|    * - "stmt" est un objet 'statement' permettant de récupérer les lignes
 | |
|    * résultat de la requête (la nature de cet objet dépend de l'implémentation)
 | |
|    * - "num_rows" est le nom de lignes affectées par la requête
 | |
|    * - "insert_id" est l'identifiant de la dernière ligne ajoutée
 | |
|    *
 | |
|    * @throws QueryException
 | |
|    */
 | |
|   function _execute(string $sql, ?array &$bindings=null, ?array $params=null): array;
 | |
| 
 | |
|   /**
 | |
|    * frontend de bas niveau pour {@link _execute()} retournant toutes les lignes
 | |
|    * résultat d'une requête de type DQL.
 | |
|    *
 | |
|    * @throws QueryException
 | |
|    */
 | |
|   function _fetchAll(string $sql, ?array &$bindings=null): array;
 | |
| 
 | |
|   /**
 | |
|    * frontend de bas niveau pour {@link _execute()} permettant de récupérer
 | |
|    * l'unique résultat (ou au moins le premier résultat) d'une requête de type
 | |
|    * DQL. Retourner null si la requête ne retourne pas de résultat
 | |
|    *
 | |
|    * @throws QueryException
 | |
|    */
 | |
|   function _fetchFirst(string $sql, ?array &$bindings=null): ?array;
 | |
| 
 | |
|   /**
 | |
|    * exécuter une requête qui met à jour jour des lignes. retourner le nombre de
 | |
|    * lignes affectées.
 | |
|    *
 | |
|    * une transaction est commencée implicitement. les méthodes {@link commit()}
 | |
|    * ou {@link rollback()} doivent être appelées explicitement.
 | |
|    *
 | |
|    * @throws QueryException
 | |
|    */
 | |
|   function _update(string $sql, ?array &$bindings=null): int;
 | |
| 
 | |
|   /**
 | |
|    * retourner une instance par défaut de IQuery appropriée pour cette connexion.
 | |
|    * l'instance est configurée par défaut pour une requête de type DQL
 | |
|    */
 | |
|   function query(?string $sql=null, ?array $filter=null, ?IRowIncarnation $incarnation=null): IQuery;
 | |
| 
 | |
|   #############################################################################
 | |
| 
 | |
|   /**
 | |
|    * méthode de convenance retournant toutes les lignes résultat d'une requête
 | |
|    * de type DQL.
 | |
|    *
 | |
|    * @throws QueryException
 | |
|    */
 | |
|   function all(string $sql, ?array $filter=null): array;
 | |
| 
 | |
|   /**
 | |
|    * retourner une liste de valeurs [$value] tel que $value = $row[$name] pour
 | |
|    * chaque ligne de résultat de {@link all()}
 | |
|    *
 | |
|    * NB: si $name===null, prendre le premier champ de $row
 | |
|    *
 | |
|    * @throws QueryException
 | |
|    */
 | |
|   function allVals(?string $name, string $sql, ?array $filter=null): array;
 | |
| 
 | |
|   /**
 | |
|    * méthode de convenance permettant de récupérer l'unique résultat (ou au
 | |
|    * moins le premier résultat) d'une requête de type DQL.
 | |
|    *
 | |
|    * Retourner null si la requête ne retourne pas de résultat
 | |
|    *
 | |
|    * @throws QueryException
 | |
|    */
 | |
|   function first(string $sql, ?array $filter=null): ?array;
 | |
| 
 | |
|   /**
 | |
|    * retourner la valeur $row[$name] où $row est la valeur retournée par
 | |
|    * {@link first()}. Retourner $default si {@link first()} ne retourne
 | |
|    * pas de résultat
 | |
|    *
 | |
|    * NB: si $name===null, prendre le premier champ de $row
 | |
|    *
 | |
|    * @throws QueryException
 | |
|    */
 | |
|   function firstVal(?string $name, string $sql, ?array $filter=null, $default=null);
 | |
| 
 | |
|   /**
 | |
|    * méthode de convenance pour exécuter une requête qui met à jour jour des
 | |
|    * lignes. retourner le nombre de lignes affectées.
 | |
|    *
 | |
|    * une transaction est commencée si ce n'est pas déjà le cas. ensuite, la
 | |
|    * transaction (celle déjà existante ou la nouvelle) est systématiquement
 | |
|    * commitée.
 | |
|    *
 | |
|    * @throws QueryException
 | |
|    */
 | |
|   function update(string $sql, ?array $filter=null): int;
 | |
| }
 |