xref: /template/strap/ComboStrap/SqliteRequest.php (revision 04fd306c7c155fa133ebb3669986875d65988276)
1c3437056SNickeau<?php
2c3437056SNickeau
3c3437056SNickeau
4c3437056SNickeaunamespace ComboStrap;
5c3437056SNickeau
6c3437056SNickeau
7c3437056SNickeauclass SqliteRequest
8c3437056SNickeau{
9c3437056SNickeau    /**
10c3437056SNickeau     * @var Sqlite
11c3437056SNickeau     */
12c3437056SNickeau    private $sqlite;
13c3437056SNickeau    /**
14c3437056SNickeau     * @var string
15c3437056SNickeau     */
16c3437056SNickeau    private $tableName;
17c3437056SNickeau    /**
18c3437056SNickeau     * @var array
19c3437056SNickeau     */
20c3437056SNickeau    private $data;
21c3437056SNickeau    /**
22c3437056SNickeau     * @var SqliteResult
23c3437056SNickeau     */
24c3437056SNickeau    private $result;
25c3437056SNickeau    /**
26c3437056SNickeau     * @var string
27c3437056SNickeau     */
28c3437056SNickeau    private $query;
29c3437056SNickeau
30c3437056SNickeau    private $sqlitePlugin;
31c3437056SNickeau    /**
32c3437056SNickeau     * @var array|string[]
33c3437056SNickeau     */
34c3437056SNickeau    private $queryParametrized;
35c3437056SNickeau    /**
36c3437056SNickeau     * A statement that is not a query
37c3437056SNickeau     * @var string
38c3437056SNickeau     */
39c3437056SNickeau    private $statement;
40c3437056SNickeau
41c3437056SNickeau    /**
42c3437056SNickeau     * SqliteRequest constructor.
43c3437056SNickeau     * @param Sqlite $sqlite
44c3437056SNickeau     */
45c3437056SNickeau    public function __construct(Sqlite $sqlite)
46c3437056SNickeau    {
47c3437056SNickeau        $this->sqlite = $sqlite;
48c3437056SNickeau        $this->sqlitePlugin = $sqlite->getSqlitePlugin();
49c3437056SNickeau    }
50c3437056SNickeau
51c3437056SNickeau    public function setTableRow(string $tableName, array $data): SqliteRequest
52c3437056SNickeau    {
53c3437056SNickeau        $this->tableName = $tableName;
54c3437056SNickeau        $this->data = $data;
55c3437056SNickeau        return $this;
56c3437056SNickeau    }
57c3437056SNickeau
58c3437056SNickeau    /**
59*04fd306cSNickeau     * @throws ExceptionCompile
60c3437056SNickeau     */
61c3437056SNickeau    public function execute(): SqliteResult
62c3437056SNickeau    {
63c3437056SNickeau        $res = null;
64c3437056SNickeau        $requestType = "";
65*04fd306cSNickeau        $queryExecuted="";
66c3437056SNickeau        if ($this->data !== null && $this->tableName !== null) {
67c3437056SNickeau            $res = $this->sqlitePlugin->storeEntry($this->tableName, $this->data);
68c3437056SNickeau            $requestType = "Upsert";
69*04fd306cSNickeau            $queryExecuted = "upsert of table $this->tableName";
70c3437056SNickeau        }
71c3437056SNickeau
72c3437056SNickeau        if ($this->query !== null) {
73c3437056SNickeau            $res = $this->sqlitePlugin->query($this->query);
74c3437056SNickeau            $requestType = "Query Simple";
75*04fd306cSNickeau            $queryExecuted = $this->query;
76c3437056SNickeau        }
77c3437056SNickeau
78c3437056SNickeau        if ($this->queryParametrized !== null) {
79c3437056SNickeau            $res = $this->sqlitePlugin->getAdapter()->query($this->queryParametrized);
80c3437056SNickeau            $requestType = "Query Parametrized"; // delete, insert, update, query
81*04fd306cSNickeau            $queryExecuted = $this->queryParametrized;
82c3437056SNickeau        }
83c3437056SNickeau
84c3437056SNickeau        if ($this->statement !== null) {
85c3437056SNickeau            $res = $this->sqlitePlugin->getAdapter()->getDb()->exec($this->statement);
86c3437056SNickeau            $requestType = "statement";
87*04fd306cSNickeau            $queryExecuted = $this->statement;
88c3437056SNickeau        }
89c3437056SNickeau
90c3437056SNickeau        if ($res === null) {
91*04fd306cSNickeau            throw new ExceptionCompile("No Sql request was found to be executed");
92c3437056SNickeau        }
93c3437056SNickeau
94c3437056SNickeau        if ($res === false) {
95c3437056SNickeau            $message = $this->getErrorMessage();
96*04fd306cSNickeau            throw new ExceptionCompile("Error in the $requestType. Message: {$message}");
97*04fd306cSNickeau        }
98*04fd306cSNickeau
99*04fd306cSNickeau        if((!$res instanceof \PDOStatement)){
100*04fd306cSNickeau            $message = $this->getErrorMessage();
101*04fd306cSNickeau            throw new ExceptionCompile("Error in the request type `$requestType`. res is not a PDOStatement but as the value ($res). Message: {$message}, Query: {$queryExecuted}");
102c3437056SNickeau        }
103c3437056SNickeau
104c3437056SNickeau        $this->result = new SqliteResult($this, $res);
105c3437056SNickeau        return $this->result;
106c3437056SNickeau    }
107c3437056SNickeau
108c3437056SNickeau    public function getErrorMessage(): string
109c3437056SNickeau    {
110c3437056SNickeau        $adapter = $this->sqlitePlugin->getAdapter();
111c3437056SNickeau        if ($adapter === null) {
112*04fd306cSNickeau            throw new ExceptionRuntimeInternal("The database adapter is null, no error info can be retrieved");
113c3437056SNickeau        }
114c3437056SNickeau        $do = $adapter->getDb();
115c3437056SNickeau        if ($do === null) {
116*04fd306cSNickeau            throw new ExceptionRuntimeInternal("The database object is null, it seems that the database connection has been closed. Are you in two differents execution context ?");
117c3437056SNickeau        }
118c3437056SNickeau        $errorInfo = $do->errorInfo();
119c3437056SNickeau        $message = "";
120c3437056SNickeau        $errorCode = $errorInfo[0];
121c3437056SNickeau        if ($errorCode === '0000') {
122c3437056SNickeau            $message = ("No rows were deleted or updated");
123c3437056SNickeau        }
124c3437056SNickeau        $errorInfoAsString = implode(", ", $errorInfo);
125c3437056SNickeau        return "$message. : {$errorInfoAsString}";
126c3437056SNickeau    }
127c3437056SNickeau
128c3437056SNickeau    public function getSqliteConnection(): Sqlite
129c3437056SNickeau    {
130c3437056SNickeau        return $this->sqlite;
131c3437056SNickeau    }
132c3437056SNickeau
133c3437056SNickeau    public function close()
134c3437056SNickeau    {
135c3437056SNickeau
136c3437056SNickeau        if ($this->result !== null) {
137c3437056SNickeau            $this->result->close();
138c3437056SNickeau            $this->result = null;
139c3437056SNickeau        }
140c3437056SNickeau
141c3437056SNickeau    }
142c3437056SNickeau
143c3437056SNickeau    public function setQuery(string $string): SqliteRequest
144c3437056SNickeau    {
145c3437056SNickeau        $this->query = $string;
146c3437056SNickeau        return $this;
147c3437056SNickeau    }
148c3437056SNickeau
149c3437056SNickeau    /**
150c3437056SNickeau     * @param string $executableSql
151c3437056SNickeau     * @param array $parameters
152c3437056SNickeau     * @return SqliteResult
153c3437056SNickeau     */
154c3437056SNickeau    public function setQueryParametrized(string $executableSql, array $parameters): SqliteRequest
155c3437056SNickeau    {
156c3437056SNickeau
157c3437056SNickeau        $args = [$executableSql];
158c3437056SNickeau        $this->queryParametrized = array_merge($args, $parameters);
159c3437056SNickeau        return $this;
160c3437056SNickeau
161c3437056SNickeau    }
162c3437056SNickeau
163c3437056SNickeau    /**
164c3437056SNickeau     * @param string $statement
165c3437056SNickeau     * @return $this - a statement that will execute
166c3437056SNickeau     */
167c3437056SNickeau    public function setStatement(string $statement): SqliteRequest
168c3437056SNickeau    {
169c3437056SNickeau        $this->statement = $statement;
170c3437056SNickeau        return $this;
171c3437056SNickeau    }
172c3437056SNickeau
173c3437056SNickeau}
174