예제 #1
0
 /**
  * Генератор INSERT/UPDATE/DELETE процедур для таблицы
  * @param $action
  */
 private function __storedProcedureGeneration($action)
 {
     $proc_query = '';
     $table_name = $this->getTable();
     $prefix = $this->getProcPrefix();
     $query = 'CALL show_table_columns(:tableName)';
     $params = array(':tableName' => $table_name);
     $fields = PdoWrap::select($query, $params);
     $fields_count = count($fields);
     if ($action == 'insert') {
         $proc_query = 'CREATE DEFINER=`' . PdoWrap::getCurrentDbName() . '`@`' . PdoWrap::getCurrentDbHost() . '` PROCEDURE `' . $prefix . '_' . $action . '`(';
         for ($i = 0; $i < $fields_count; $i++) {
             if ($fields[$i]['Extra'] != 'auto_increment' && $fields[$i]['Field'] != 'date_add' && $fields[$i]['Field'] != 'date_edit' && $fields[$i]['Field'] != 'user_edit') {
                 $proc_query .= '
                 IN `field_' . $fields[$i]['Field'] . '` ' . Text::strtoup(preg_replace('/unsigned/', '', $fields[$i]['Type'])) . ',';
             }
         }
         $proc_query = substr($proc_query, 0, -1);
         $proc_query .= '
         )
         BEGIN
         SET';
         for ($i = 0; $i < $fields_count; $i++) {
             if ($fields[$i]['Extra'] != 'auto_increment' && $fields[$i]['Field'] != 'date_add' && $fields[$i]['Field'] != 'date_edit' && $fields[$i]['Field'] != 'user_edit') {
                 $proc_query .= '
             @p' . $i . ' = field_' . $fields[$i]['Field'] . ',';
             }
         }
         $proc_query = substr($proc_query, 0, -1) . ';';
         $proc_query .= '
         INSERT INTO ' . $table_name . ' (';
         for ($i = 0; $i < $fields_count; $i++) {
             if ($fields[$i]['Extra'] != 'auto_increment' && $fields[$i]['Field'] != 'date_edit' && $fields[$i]['Field'] != 'user_edit') {
                 $proc_query .= '`' . $fields[$i]['Field'] . '`,';
             }
         }
         $proc_query = substr($proc_query, 0, -1) . ')';
         $proc_query .= '
         VALUES (';
         for ($i = 0; $i < $fields_count; $i++) {
             if ($fields[$i]['Extra'] != 'auto_increment' && $fields[$i]['Field'] != 'date_edit' && $fields[$i]['Field'] != 'user_edit') {
                 if ($fields[$i]['Field'] == 'date_add') {
                     $proc_query .= 'UNIX_TIMESTAMP(),';
                 } else {
                     $proc_query .= '@p' . $i . ',';
                 }
             }
         }
         $proc_query = substr($proc_query, 0, -1) . ');';
         $proc_query .= '
         SELECT last_insert_id() AS `id`;
         END;';
     } elseif ($action == 'update') {
         $proc_query = 'CREATE DEFINER=`' . PdoWrap::getCurrentDbName() . '`@`' . PdoWrap::getCurrentDbHost() . '` PROCEDURE `' . $prefix . '_' . $action . '` (';
         for ($i = 0; $i < $fields_count; $i++) {
             if ($fields[$i]['Field'] != 'date_add' && $fields[$i]['Field'] != 'date_edit' && $fields[$i]['Field'] != 'user_add') {
                 $proc_query .= '
                 IN `field_' . $fields[$i]['Field'] . '` ' . Text::strtoup(preg_replace('/unsigned/', '', $fields[$i]['Type'])) . ',';
             }
         }
         $proc_query = substr($proc_query, 0, -1);
         $proc_query .= '
         )
         BEGIN
         SET';
         for ($i = 0; $i < $fields_count; $i++) {
             if ($fields[$i]['Field'] != 'date_add' && $fields[$i]['Field'] != 'date_edit' && $fields[$i]['Field'] != 'user_add') {
                 $proc_query .= '
             @p' . $i . ' = field_' . $fields[$i]['Field'] . ',';
             }
         }
         $proc_query = substr($proc_query, 0, -1) . ';';
         $proc_query .= '
         UPDATE `' . $table_name . '` SET';
         for ($i = 0; $i < $fields_count; $i++) {
             if ($fields[$i]['Extra'] != 'auto_increment' && $fields[$i]['Field'] != 'date_add' && $fields[$i]['Field'] != 'user_add') {
                 if ($fields[$i]['Field'] == 'date_edit') {
                     $proc_query .= '
                         `' . $fields[$i]['Field'] . '` = UNIX_TIMESTAMP(),';
                 } else {
                     $proc_query .= '
                         `' . $fields[$i]['Field'] . '` = @p' . $i . ',';
                 }
             } elseif ($fields[$i]['Extra'] == 'auto_increment') {
                 $update_id = '@p' . $i;
             }
         }
         $proc_query = substr($proc_query, 0, -1);
         $proc_query .= '
         WHERE `id` = ' . $update_id . ';
         END;';
     }
     if (!empty($proc_query)) {
         PdoWrap::execute($proc_query);
     }
 }
예제 #2
0
파일: class.Base.php 프로젝트: klimjr/cms
 /**
  * Генерация процедуры поиска
  * @param $table
  */
 protected function __generateSearchStoredProc($table)
 {
     $proc_query = '';
     $table_name = $this->__getPrefixTableName($table);
     $prefix = $table;
     $query = 'CALL get_table_columns(:tableName)';
     $params = array(':tableName' => $table_name);
     $fields = PdoWrap::select($query, $params);
     $fields_count = count($fields);
     $proc_query = "CREATE DEFINER=`" . PdoWrap::getCurrentDbName() . "`@`localhost` PROCEDURE `search_by_" . $prefix . "`(";
     $proc_query .= "\n            IN group_id INT (6),\n            IN sort CHAR(20),\n            IN sort_type CHAR(4),\n            IN table_limit INT(4),\n            IN page_num INT(6),\n            IN search_query TEXT,\n            IN active_field TINYINT(1)\n        )\n        DETERMINISTIC\n        COMMENT 'Get table list with sort and page navigation'\n        BEGIN\n\n        SET @p1 = table_limit*(page_num-1),\n            @p2 = table_limit,\n            @p3 = search_query,\n            @active = '',\n            @group_value = '';\n            ";
     for ($i = 0; $i < $fields_count; $i++) {
         if ($fields[$i]['Field'] == 'group_id') {
             $proc_query .= "\n        IF group_id > 0 THEN SET @group_value = CONCAT(' AND `c`.`group_id` = ', group_id); END IF;\n                ";
         }
         if ($fields[$i]['Field'] == 'active') {
             $proc_query .= "\n        IF active_field = 0 THEN SET @active = ' AND `c`.`active` = 0'; ELSEIF active_field = 1 THEN SET @active = ' AND `c`.`active` = 1'; END IF;\n                ";
         }
     }
     $proc_query .= "\n        SET @count_query = CONCAT('\n            SELECT\n                COUNT(*) INTO @rows_count\n            FROM\n                `" . $this->__getPrefixTableName($table) . "` `c`\n            WHERE\n                (";
     for ($i = 0; $i < $fields_count; $i++) {
         $proc_query .= "\n                    `" . $fields[$i]['Field'] . "` LIKE ? " . ($i + 1 == $fields_count ? "" : "OR");
     }
     $proc_query .= "\n                )\n                ', @active, '\n                ', @group_value, '\n        ');\n\n        PREPARE `count_statement` FROM @count_query;\n        EXECUTE `count_statement` USING ";
     for ($i = 0; $i < $fields_count; $i++) {
         $proc_query .= "@p3" . ($i + 1 == $fields_count ? ";" : ", ");
     }
     $proc_query .= "\n        SET @count := @rows_count;\n\n        # get sorting field\n        IF sort = '' THEN\n            SET @sorting := ' `c`.`date_add` DESC, `c`.`name` ASC';\n        ELSE\n            SET @sorting := CONCAT('`c`.`', sort,'` ', sort_type);\n        END IF;\n\n        SET @query = CONCAT('\n            SELECT\n                `c`.*,\n                IF (`c`.`date_add` = 0, \"\", CONCAT(FROM_UNIXTIME(`c`.`date_add`, \"%d.%m.%Y %H:%i\"), \" \", `u`.`family`)) AS `date_add`,\n                IF (`c`.`date_edit` = 0, \"\", CONCAT(FROM_UNIXTIME(`c`.`date_edit`, \"%d.%m.%Y %H:%i\"), \" \", `u2`.`family`)) AS `date_edit`\n            FROM\n                `" . $this->__getPrefixTableName($table) . "` `c`\n            LEFT JOIN\n                `cms_users` `u`\n            ON\n                `c`.`user_add` = `u`.`id`\n            LEFT JOIN\n                `cms_users` `u2`\n            ON\n                `c`.`user_edit` = `u2`.`id`\n            WHERE\n                (\n            ";
     for ($i = 0; $i < $fields_count; $i++) {
         $proc_query .= "\n                        `c`.`" . $fields[$i]['Field'] . "` LIKE ? " . ($i + 1 == $fields_count ? "" : "OR");
     }
     $proc_query .= "\n                )\n                ', @active, '\n                ', @group_value, '\n            ORDER BY ', @sorting, '\n            LIMIT ?, ?\n        ');\n\n        PREPARE `statement` FROM @query;\n        EXECUTE `statement` USING ";
     for ($i = 0; $i < $fields_count; $i++) {
         $proc_query .= "@p3, ";
     }
     $proc_query .= "@p1, @p2;";
     $proc_query .= "\n        END;";
     if (!empty($proc_query)) {
         PdoWrap::execute($proc_query);
     }
 }