Changeset 1593

Show
Ignore:
Timestamp:
04/13/08 11:23:55 (3 months ago)
Author:
Neal
Message:

Added "REPLACE INTO" support to the query builder for PostgreSQL. Please note that this is not actually equivalent to REPLACE INTO in MySQL/SQLite, it's more like INSERT IGNORE would be in MySQL. REPLACE INTO as an SQL statement is not supported by PostgreSQL, so this query does an INSERT based on the result of various SELECTs within the same query. The "UNIQUE" element of the query array is required to tell PostgreSQL what row it should check for the existence of. Special thanks to MattF for testing this change.

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • branches/punbb-1.3-dev/upload/include/dblayer/pgsql.php

    r1375 r1593  
    197197                                $sql .= ' WHERE '.$query['WHERE']; 
    198198                } 
     199                else if (isset($query['REPLACE'])) 
     200                { 
     201                        $sql = 'INSERT INTO '.(isset($query['PARAMS']['NO_PREFIX']) ? '' : $this->prefix).$query['INTO']; 
     202 
     203                        if (!empty($query['REPLACE'])) 
     204                                $sql .= ' ('.$query['REPLACE'].')'; 
     205 
     206                        $sql .= ' SELECT '.$query['VALUES'].' WHERE NOT EXISTS (SELECT 1 FROM '.(isset($query['PARAMS']['NO_PREFIX']) ? '' : $this->prefix).$query['INTO'].' WHERE '.$query['UNIQUE'].')'; 
     207                } 
    199208 
    200209                return $this->query($sql, $unbuffered); 
  • branches/punbb-1.3-dev/upload/include/functions.php

    r1592 r1593  
    142142                                $pun_user['prev_url'] = get_current_url(); 
    143143 
    144                                 // With MySQL/MySQLi/SQLite, REPLACE INTO avoids a user having two rows in the online table 
    145                                 switch ($db_type) 
    146                                 { 
    147                                         case 'pgsql': 
    148                                                 $query = 'INSERT INTO '.$db->prefix.'online (user_id, ident, logged, csrf_token, prev_url) SELECT '.$pun_user['id'].', \''.$db->escape($pun_user['username']).'\', '.$pun_user['logged'].', \''.$pun_user['csrf_token'].'\', \''.$db->escape($pun_user['prev_url']).'\' FROM '.$db->prefix.'users WHERE id = '.$pun_user['id'].' AND NOT EXISTS (SELECT 1 FROM '.$db->prefix.'online WHERE user_id='.$pun_user['id'].')'; 
    149                                                 ($hook = get_hook('fn_qr_add_online_user')) ? eval($hook) : null; 
    150                                                 $db->query($query) or error(__FILE__, __LINE__); 
    151                                                 break; 
    152  
    153                                         default: 
    154                                                 $query = array( 
    155                                                         'REPLACE'       => 'user_id, ident, logged, csrf_token, prev_url', 
    156                                                         'INTO'          => 'online', 
    157                                                         'VALUES'        => $pun_user['id'].', \''.$db->escape($pun_user['username']).'\', '.$pun_user['logged'].', \''.$pun_user['csrf_token'].'\', \''.$db->escape($pun_user['prev_url']).'\'' 
    158                                                 ); 
    159                                                 ($hook = get_hook('fn_qr_add_online_user')) ? eval($hook) : null; 
    160                                                 $db->query_build($query) or error(__FILE__, __LINE__); 
    161                                                 break; 
    162                                 } 
     144                                // REPLACE INTO avoids a user having two rows in the online table 
     145                                $query = array( 
     146                                        'REPLACE'       => 'user_id, ident, logged, csrf_token, prev_url', 
     147                                        'INTO'          => 'online', 
     148                                        'VALUES'        => $pun_user['id'].', \''.$db->escape($pun_user['username']).'\', '.$pun_user['logged'].', \''.$pun_user['csrf_token'].'\', \''.$db->escape($pun_user['prev_url']).'\'', 
     149                                        'UNIQUE'        => 'user_id='.$pun_user['id'] 
     150                                ); 
     151                                ($hook = get_hook('fn_qr_add_online_user')) ? eval($hook) : null; 
     152                                $db->query_build($query) or error(__FILE__, __LINE__); 
    163153 
    164154                                // Reset tracked topics 
     
    253243                $pun_user['prev_url'] = get_current_url(); 
    254244 
    255                 // With MySQL/MySQLi/SQLite, REPLACE INTO avoids a user having two rows in the online table 
    256                 switch ($db_type) 
    257                 { 
    258                         case 'pgsql': 
    259                                 $query = 'INSERT INTO '.$db->prefix.'online (user_id, ident, logged, csrf_token, prev_url) SELECT 1, \''.$db->escape($remote_addr).'\', '.$pun_user['logged'].', \''.$pun_user['csrf_token'].'\', \''.$db->escape($pun_user['prev_url']).'\' FROM '.$db->prefix.'users WHERE id=1 AND NOT EXISTS (SELECT 1 FROM '.$db->prefix.'online WHERE user_id=1 AND ident=\''.$db->escape($remote_addr).'\')'; 
    260                                 ($hook = get_hook('fn_qr_add_online_guest_user')) ? eval($hook) : null; 
    261                                 $db->query($query) or error(__FILE__, __LINE__); 
    262                                 break; 
    263  
    264                         default: 
    265                                 $query = array( 
    266                                         'REPLACE'       => 'user_id, ident, logged, csrf_token, prev_url', 
    267                                         'INTO'          => 'online', 
    268                                         'VALUES'        => '1, \''.$db->escape($remote_addr).'\', '.$pun_user['logged'].', \''.$pun_user['csrf_token'].'\', \''.$db->escape($pun_user['prev_url']).'\'' 
    269                                 ); 
    270                                 ($hook = get_hook('fn_qr_add_online_guest_user')) ? eval($hook) : null; 
    271                                 $db->query_build($query) or error(__FILE__, __LINE__); 
    272                                 break; 
    273                 } 
     245                // REPLACE INTO avoids a user having two rows in the online table 
     246                $query = array( 
     247                        'REPLACE'       => 'user_id, ident, logged, csrf_token, prev_url', 
     248                        'INTO'          => 'online', 
     249                        'VALUES'        => '1, \''.$db->escape($remote_addr).'\', '.$pun_user['logged'].', \''.$pun_user['csrf_token'].'\', \''.$db->escape($pun_user['prev_url']).'\'', 
     250                        'UNIQUE'        => 'user_id=1 AND ident=\''.$db->escape($remote_addr).'\'' 
     251                ); 
     252                ($hook = get_hook('fn_qr_add_online_guest_user')) ? eval($hook) : null; 
     253                $db->query_build($query) or error(__FILE__, __LINE__); 
    274254        } 
    275255        else