<?php
/** @license MIT
 * Copyright 2017 J. King, Dustin Wilson et al.
 * See LICENSE and AUTHORS files for details */

declare(strict_types=1);
namespace JKingWeb\Arsse\Db\PostgreSQL;

use JKingWeb\Arsse\Arsse;
use JKingWeb\Arsse\Conf;
use JKingWeb\Arsse\Db\Exception;
use JKingWeb\Arsse\Db\ExceptionInput;
use JKingWeb\Arsse\Db\ExceptionTimeout;

trait Dispatch {
    protected function dispatchQuery(string $query, array $params = []) {
        pg_send_query_params($this->db, $query, $params);
        $result = pg_get_result($this->db);
        if (($code = pg_result_error_field($result, \PGSQL_DIAG_SQLSTATE)) && isset($code) && $code) {
            return $this->buildException($code, pg_result_error($result));
        } else {
            return $result;
        }
    }

    protected function buildException(string $code, string $msg): array {
        switch ($code) {
            case "22P02":
            case "42804":
                return [ExceptionInput::class, 'engineTypeViolation', $msg];
            case "23000":
            case "23502":
            case "23505":
                return [ExceptionInput::class, "engineConstraintViolation", $msg];
            case "55P03":
            case "57014":
                return [ExceptionTimeout::class, 'general', $msg];
            default:
                return [Exception::class, "engineErrorGeneral", $code.": ".$msg]; // @codeCoverageIgnore
        }
    }
}