<?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\SQLite3;

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

trait ExceptionBuilder {
    protected function buildException(): array {
        return self::buildEngineException($this->db->lastErrorCode(), $this->db->lastErrorMsg());
    }

    public static function buildEngineException($code, string $msg): array {
        switch ($code) {
            case Driver::SQLITE_BUSY:
                return [ExceptionTimeout::class, 'general', $msg];
            case Driver::SQLITE_SCHEMA:
                // sometimes encountered with PDO, because PDO sucks
                return [ExceptionRetry::class, 'schemaChange', $msg]; // @codeCoverageIgnore
            case Driver::SQLITE_CONSTRAINT:
                return [ExceptionInput::class, 'engineConstraintViolation', $msg];
            case Driver::SQLITE_MISMATCH:
                return [ExceptionInput::class, 'engineTypeViolation', $msg];
            default:
                return [Exception::class, 'engineErrorGeneral', $msg];
        }
    }
}