[ Index ] |
PHP Cross Reference of phpBB-3.1.12-deutsch |
[Summary view] [Print] [Text view]
1 <?php 2 /** 3 * 4 * This file is part of the phpBB Forum Software package. 5 * 6 * @copyright (c) phpBB Limited <https://www.phpbb.com> 7 * @license GNU General Public License, version 2 (GPL-2.0) 8 * 9 * For full copyright and license information, please see 10 * the docs/CREDITS.txt file. 11 * 12 */ 13 14 namespace phpbb\db; 15 16 /** 17 * Collects rows for insert into a database until the buffer size is reached. 18 * Then flushes the buffer to the database and starts over again. 19 * 20 * Benefits over collecting a (possibly huge) insert array and then using 21 * $db->sql_multi_insert() include: 22 * 23 * - Going over max packet size of the database connection is usually prevented 24 * because the data is submitted in batches. 25 * 26 * - Reaching database connection timeout is usually prevented because 27 * submission of batches talks to the database every now and then. 28 * 29 * - Usage of less PHP memory because data no longer needed is discarded on 30 * buffer flush. 31 * 32 * Attention: 33 * Please note that users of this class have to call flush() to flush the 34 * remaining rows to the database after their batch insert operation is 35 * finished. 36 * 37 * Usage: 38 * <code> 39 * $buffer = new \phpbb\db\sql_insert_buffer($db, 'test_table', 1234); 40 * 41 * while (do_stuff()) 42 * { 43 * $buffer->insert(array( 44 * 'column1' => 'value1', 45 * 'column2' => 'value2', 46 * )); 47 * } 48 * 49 * $buffer->flush(); 50 * </code> 51 */ 52 class sql_insert_buffer 53 { 54 /** @var \phpbb\db\driver\driver_interface */ 55 protected $db; 56 57 /** @var string */ 58 protected $table_name; 59 60 /** @var int */ 61 protected $max_buffered_rows; 62 63 /** @var array */ 64 protected $buffer = array(); 65 66 /** 67 * @param \phpbb\db\driver\driver_interface $db 68 * @param string $table_name 69 * @param int $max_buffered_rows 70 */ 71 public function __construct(\phpbb\db\driver\driver_interface $db, $table_name, $max_buffered_rows = 500) 72 { 73 $this->db = $db; 74 $this->table_name = $table_name; 75 $this->max_buffered_rows = $max_buffered_rows; 76 } 77 78 /** 79 * Inserts a single row into the buffer if multi insert is supported by the 80 * database (otherwise an insert query is sent immediately). Then flushes 81 * the buffer if the number of rows in the buffer is now greater than or 82 * equal to $max_buffered_rows. 83 * 84 * @param array $row 85 * 86 * @return bool True when some data was flushed to the database. 87 * False otherwise. 88 */ 89 public function insert(array $row) 90 { 91 $this->buffer[] = $row; 92 93 // Flush buffer if it is full or when DB does not support multi inserts. 94 // In the later case, the buffer will always only contain one row. 95 if (!$this->db->get_multi_insert() || sizeof($this->buffer) >= $this->max_buffered_rows) 96 { 97 return $this->flush(); 98 } 99 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 }
title
Description
Body
title
Description
Body
title
Description
Body
title
Body
Generated: Thu Jan 11 00:25:41 2018 | Cross-referenced by PHPXref 0.7.1 |