Verzeichnisstruktur phpBB-3.1.0


Veröffentlicht
27.10.2014

So funktioniert es


Auf das letzte Element klicken. Dies geht jeweils ein Schritt zurück

Auf das Icon klicken, dies öffnet das Verzeichnis. Nochmal klicken schließt das Verzeichnis.
Auf den Verzeichnisnamen klicken, dies zeigt nur das Verzeichnis mit Inhalt an

(Beispiel Datei-Icons)

Auf das Icon klicken um den Quellcode anzuzeigen

sql_insert_buffer.php

Zuletzt modifiziert: 09.10.2024, 12:52 - Dateigröße: 3.52 KiB


001  <?php
002  /**
003  *
004  * This file is part of the phpBB Forum Software package.
005  *
006  * @copyright (c) phpBB Limited <https://www.phpbb.com>
007  * @license GNU General Public License, version 2 (GPL-2.0)
008  *
009  * For full copyright and license information, please see
010  * the docs/CREDITS.txt file.
011  *
012  */
013   
014  namespace phpbb\db;
015   
016  /**
017  * Collects rows for insert into a database until the buffer size is reached.
018  * Then flushes the buffer to the database and starts over again.
019  *
020  * Benefits over collecting a (possibly huge) insert array and then using
021  * $db->sql_multi_insert() include:
022  *
023  *  - Going over max packet size of the database connection is usually prevented
024  *    because the data is submitted in batches.
025  *
026  *  - Reaching database connection timeout is usually prevented because
027  *    submission of batches talks to the database every now and then.
028  *
029  *  - Usage of less PHP memory because data no longer needed is discarded on
030  *    buffer flush.
031  *
032  * Attention:
033  * Please note that users of this class have to call flush() to flush the
034  * remaining rows to the database after their batch insert operation is
035  * finished.
036  *
037  * Usage:
038  * <code>
039  *    $buffer = new \phpbb\db\sql_insert_buffer($db, 'test_table', 1234);
040  *
041  *    while (do_stuff())
042  *    {
043  *        $buffer->insert(array(
044  *            'column1' => 'value1',
045  *            'column2' => 'value2',
046  *        ));
047  *    }
048  *
049  *    $buffer->flush();
050  * </code>
051  */
052  class sql_insert_buffer
053  {
054      /** @var \phpbb\db\driver\driver_interface */
055      protected $db;
056   
057      /** @var string */
058      protected $table_name;
059   
060      /** @var int */
061      protected $max_buffered_rows;
062   
063      /** @var array */
064      protected $buffer = array();
065   
066      /**
067      * @param \phpbb\db\driver\driver_interface $db
068      * @param string          $table_name
069      * @param int             $max_buffered_rows
070      */
071      public function __construct(\phpbb\db\driver\driver_interface $db, $table_name, $max_buffered_rows = 500)
072      {
073          $this->db = $db;
074          $this->table_name = $table_name;
075          $this->max_buffered_rows = $max_buffered_rows;
076      }
077   
078      /**
079      * Inserts a single row into the buffer if multi insert is supported by the
080      * database (otherwise an insert query is sent immediately). Then flushes
081      * the buffer if the number of rows in the buffer is now greater than or
082      * equal to $max_buffered_rows.
083      *
084      * @param array $row
085      *
086      * @return bool        True when some data was flushed to the database.
087      *                    False otherwise.
088      */
089      public function insert(array $row)
090      {
091          $this->buffer[] = $row;
092   
093          // Flush buffer if it is full or when DB does not support multi inserts.
094          // In the later case, the buffer will always only contain one row.
095          if (!$this->db->get_multi_insert() || sizeof($this->buffer) >= $this->max_buffered_rows)
096          {
097              return $this->flush();
098          }
099   
100          return false;
101      }
102   
103      /**
104      * Inserts a row set, i.e. an array of rows, by calling insert().
105      *
106      * Please note that it is in most cases better to use insert() instead of
107      * first building a huge rowset. Or at least sizeof($rows) should be kept
108      * small.
109      *
110      * @param array $rows 
111      *
112      * @return bool        True when some data was flushed to the database.
113      *                    False otherwise.
114      */
115      public function insert_all(array $rows)
116      {
117          // Using bitwise |= because PHP does not have logical ||=
118          $result = 0;
119   
120          foreach ($rows as $row)
121          {
122              $result |= (int) $this->insert($row);
123          }
124   
125          return (bool) $result;
126      }
127   
128      /**
129      * Flushes the buffer content to the DB and clears the buffer.
130      *
131      * @return bool        True when some data was flushed to the database.
132      *                    False otherwise.
133      */
134      public function flush()
135      {
136          if (!empty($this->buffer))
137          {
138              $this->db->sql_multi_insert($this->table_name, $this->buffer);
139              $this->buffer = array();
140   
141              return true;
142          }
143   
144          return false;
145      }
146  }
147