]> git.ipfire.org Git - thirdparty/bacula.git/commitdiff
baculum: Change a way of executing SQL queries
authorMarcin Haba <marcin.haba@bacula.pl>
Fri, 3 Mar 2023 12:35:34 +0000 (13:35 +0100)
committerMarcin Haba <marcin.haba@bacula.pl>
Sun, 5 Mar 2023 06:06:30 +0000 (07:06 +0100)
gui/baculum/protected/API/Modules/ClientManager.php
gui/baculum/protected/API/Modules/Database.php
gui/baculum/protected/API/Modules/JobManager.php
gui/baculum/protected/API/Modules/ObjectManager.php

index 2ee07aa27f0b0781f32ac08e7ee9e9ab4c6070f2..1ee3bd4e348e8e9bab2eddae35c4f27ef2a3e082 100644 (file)
@@ -33,29 +33,6 @@ use Prado\Data\ActiveRecord\TActiveRecordCriteria;
  */
 class ClientManager extends APIModule {
 
-       /**
-        * SQL query builder.
-        *
-        * @var TDbCommandBuilder command builder
-        */
-       private static $query_builder;
-
-       /**
-        * Get the SQL query builder instance.
-        * Note: Singleton
-        *
-        * @return TDbCommandBuilder command builder
-        */
-       private function getQueryBuilder() {
-               if (is_null(self::$query_builder)) {
-                       $record = ClientRecord::finder();
-                       $connection = $record->getDbConnection();
-                       $tableInfo = $record->getRecordGateway()->getRecordTableInfo($record);
-                       self::$query_builder = $tableInfo->createCommandBuilder($connection);
-               }
-               return self::$query_builder;
-       }
-
        /**
         * Get client list.
         *
@@ -79,23 +56,7 @@ class ClientManager extends APIModule {
 FROM Client 
 ' . $where['where'] . $offset . $limit;
 
-               $builder = $this->getQueryBuilder();
-               if (count($where['params']) == 0) {
-                       /**
-                        * Please note that in case no params the TDbCommandBuilder::applyCriterias()
-                        * returns empty the PDO statement handler. From this reason here
-                        * the query is called directly by PDO.
-                        */
-                       $connection = JobRecord::finder()->getDbConnection();
-                       $connection->setActive(true);
-                       $pdo = $connection->getPdoInstance();
-                       $statement = $pdo->query($sql);
-
-               } else {
-                       $command = $builder->applyCriterias($sql, $where['params']);
-                       $statement = $command->getPdoStatement();
-                       $command->query();
-               }
+               $statement = Database::runQuery($sql, $where['params']);
                return $statement->fetchAll(\PDO::FETCH_OBJ);
        }
 
index 226f039e7fcaa10ae5812e2466ccd931a6ec95c0..5826be2533942bb5455cdaf515a80f8513aa4721 100644 (file)
@@ -24,6 +24,7 @@ namespace Baculum\API\Modules;
 
 use Baculum\Common\Modules\Logging;
 use Baculum\Common\Modules\Errors\DatabaseError;
+use Baculum\API\Modules\JobRecord;
 use Prado\Data\TDbConnection;
 use Prado\Exceptions\TDbException;
 
@@ -45,6 +46,13 @@ class Database extends APIModule {
        const MYSQL_TYPE = 'mysql';
        const SQLITE_TYPE = 'sqlite';
 
+       /**
+        * SQL query builder.
+        *
+        * @var TDbCommandBuilder command builder
+        */
+       private static $query_builder;
+
        /**
         * Check/test connection to database.
         * 
@@ -246,5 +254,50 @@ class Database extends APIModule {
                        $result = $new_result;
                }
        }
+
+       /**
+        * Get the SQL query builder instance.
+        * Note: Singleton
+        *
+        * @param object $record Active Record object
+        * @return TDbCommandBuilder command builder
+        */
+       private static function getQueryBuilder() {
+               if (is_null(self::$query_builder)) {
+                       $record = JobRecord::finder();
+                       $connection = $record->getDbConnection();
+                       $tableInfo = $record->getRecordGateway()->getRecordTableInfo($record);
+                       self::$query_builder = $tableInfo->createCommandBuilder($connection);
+               }
+               return self::$query_builder;
+       }
+
+       /**
+        * Run query and get SQL query statement.
+        *
+        * @param string $sql SQL query
+        * @param array $params SQL query params
+        * @return PDO statement.
+        */
+       public static function runQuery($sql, $params = []) {
+               $builder = self::getQueryBuilder();
+               if (count($params) == 0) {
+                       /**
+                        * Please note that in case no params the TDbCommandBuilder::applyCriterias()
+                        * returns empty the PDO statement handler. From this reason here
+                        * the query is called directly by PDO.
+                        */
+                       $connection = JobRecord::finder()->getDbConnection();
+                       $connection->setActive(true);
+                       $pdo = $connection->getPdoInstance();
+                       $statement = $pdo->query($sql);
+
+               } else {
+                       $command = $builder->applyCriterias($sql, $params);
+                       $statement = $command->getPdoStatement();
+                       $command->query();
+               }
+               return $statement;
+       }
 }
 ?>
index c100e4b61c0edcac4f30aade0e75aef4faaf6cdc..76c429faa920317e61019bd4bc5e0bcdafbae928 100644 (file)
@@ -34,13 +34,6 @@ use Prado\Data\ActiveRecord\TActiveRecordCriteria;
  */
 class JobManager extends APIModule {
 
-       /**
-        * SQL query builder.
-        *
-        * @var TDbCommandBuilder command builder
-        */
-       private static $query_builder;
-
        /**
         * Job statuses in some parts are not compatible with rest of the API.
         * NOTE: Used here are also internal job statuses that are not used in the Catalog
@@ -110,22 +103,6 @@ class JobManager extends APIModule {
        const JOB_RESULT_VIEW_BASIC = 'basic';
        const JOB_RESULT_VIEW_FULL = 'full';
 
-       /**
-        * Get the SQL query builder instance.
-        * Note: Singleton
-        *
-        * @return TDbCommandBuilder command builder
-        */
-       private function getQueryBuilder() {
-               if (is_null(self::$query_builder)) {
-                       $record = JobRecord::finder();
-                       $connection = $record->getDbConnection();
-                       $tableInfo = $record->getRecordGateway()->getRecordTableInfo($record);
-                       self::$query_builder = $tableInfo->createCommandBuilder($connection);
-               }
-               return self::$query_builder;
-       }
-
        /**
         * Get job status groups.
         *
@@ -185,10 +162,7 @@ LEFT JOIN Pool USING (PoolId)
 LEFT JOIN FileSet USING (FilesetId)'
 . $where['where'] . $order . $limit . $offset;
 
-               $builder = $this->getQueryBuilder();
-               $command = $builder->applyCriterias($sql, $where['params']);
-               $statement = $command->getPdoStatement();
-               $command->query();
+               $statement = Database::runQuery($sql, $where['params']);
                $result = [];
                if ($mode == self::JOB_RESULT_MODE_OVERVIEW) {
                        // Overview mode.
@@ -383,23 +357,7 @@ LEFT JOIN FileSet USING (FilesetId)'
 (SELECT COUNT(1) FROM Job ' . (!empty($where['where']) ? ' WHERE ' . $where['where'] : '') . ') AS all
                ';
 
-               $builder = $this->getQueryBuilder();
-               if (count($where['params']) == 0) {
-                       /**
-                        * Please note that in case no params the TDbCommandBuilder::applyCriterias()
-                        * returns empty the PDO statement handler. From this reason here
-                        * the query is called directly by PDO.
-                        */
-                       $connection = JobRecord::finder()->getDbConnection();
-                       $connection->setActive(true);
-                       $pdo = $connection->getPdoInstance();
-                       $statement = $pdo->query($sql);
-
-               } else {
-                       $command = $builder->applyCriterias($sql, $where['params']);
-                       $statement = $command->getPdoStatement();
-                       $command->query();
-               }
+               $statement = Database::runQuery($sql, $where['params']);
                return $statement->fetch(\PDO::FETCH_ASSOC);
        }
 
index 2f0367ccde1c05a1c3b37bcbefcaedfadd38404a..e9d3b0895f36c25087177aa355c7b1519e5a6516 100644 (file)
@@ -22,6 +22,8 @@
 
 namespace Baculum\API\Modules;
 
+use Baculum\API\Modules\Database;
+
 /**
  * Object manager module.
  *
@@ -49,13 +51,6 @@ class ObjectManager extends APIModule
                'ObjectCount'
        ];
 
-       /**
-        * SQL query builder.
-        *
-        * @var TDbCommandBuilder command builder
-        */
-       private static $query_builder;
-
        /**
         * Object result record view.
         * Views:
@@ -65,23 +60,6 @@ class ObjectManager extends APIModule
        const OBJ_RESULT_VIEW_BASIC = 'basic';
        const OBJ_RESULT_VIEW_FULL = 'full';
 
-
-       /**
-        * Get the SQL query builder instance.
-        * Note: Singleton
-        *
-        * @return TDbCommandBuilder command builder
-        */
-       private static function getQueryBuilder() {
-               if (is_null(self::$query_builder)) {
-                       $record = ObjectRecord::finder();
-                       $connection = $record->getDbConnection();
-                       $tableInfo = $record->getRecordGateway()->getRecordTableInfo($record);
-                       self::$query_builder = $tableInfo->createCommandBuilder($connection);
-               }
-               return self::$query_builder;
-       }
-
        /**
         * Get objects.
         *
@@ -130,11 +108,7 @@ class ObjectManager extends APIModule
 FROM Object 
 LEFT JOIN Job USING (JobId) '
 . $where['where'] . $order . $limit . $offset;
-
-               $builder = $this->getQueryBuilder();
-               $command = $builder->applyCriterias($sql, $where['params']);
-               $statement = $command->getPdoStatement();
-               $command->query();
+               $statement = Database::runQuery($sql, $where['params']);
                $result = $statement->fetchAll(\PDO::FETCH_OBJ);
                Database::groupBy($group_by, $result, $group_limit);
                return $result;
@@ -153,10 +127,7 @@ LEFT JOIN Job USING (JobId) '
 FROM Object 
 JOIN Job USING (JobId) '
 . $where['where'];
-               $builder = $this->getQueryBuilder();
-               $command = $builder->applyCriterias($sql, $where['params']);
-               $statement = $command->getPdoStatement();
-               $command->query();
+               $statement = Database::runQuery($sql, $where['params']);
                return $statement->fetchAll(\PDO::FETCH_ASSOC);
        }