Proyectos de Subversion Moodle

Rev

Rev 1 | Mostrar el archivo completo | | | Autoría | Ultima modificación | Ver Log |

Rev 1 Rev 1441
Línea 391... Línea 391...
391
                $table = preg_replace('/^' . preg_quote($prefix, '/') . '/', '', $table);
391
                $table = preg_replace('/^' . preg_quote($prefix, '/') . '/', '', $table);
392
                $empties[$table] = $table;
392
                $empties[$table] = $table;
393
            }
393
            }
394
            $rs->close();
394
            $rs->close();
395
            return $empties;
395
            return $empties;
396
        } else if ($dbfamily === 'oracle') {
-
 
397
            $sequences = self::get_sequencenames();
-
 
398
            $sequences = array_map('strtoupper', $sequences);
-
 
399
            $lookup = array_flip($sequences);
-
 
400
            $empties = [];
-
 
401
            [$seqs, $params] = $DB->get_in_or_equal($sequences);
-
 
402
            $sql = "SELECT sequence_name FROM user_sequences WHERE last_number = 1 AND sequence_name $seqs";
-
 
403
            $rs = $DB->get_recordset_sql($sql, $params);
-
 
404
            foreach ($rs as $seq) {
-
 
405
                $table = $lookup[$seq->sequence_name];
-
 
406
                $empties[$table] = $table;
-
 
407
            }
-
 
408
            $rs->close();
-
 
409
            return $empties;
-
 
410
        } else {
396
        } else {
411
            return [];
397
            return [];
412
        }
398
        }
413
    }
399
    }
Línea 446... Línea 432...
446
     *
432
     *
447
     * @static
433
     * @static
448
     * @param array $empties tables that are known to be unmodified and empty
434
     * @param array $empties tables that are known to be unmodified and empty
449
     * @return void
435
     * @return void
450
     */
436
     */
451
    public static function reset_all_database_sequences(array $empties = null) {
437
    public static function reset_all_database_sequences(?array $empties = null) {
452
        global $DB;
438
        global $DB;
Línea 453... Línea 439...
453
 
439
 
454
        if (!$data = self::get_tabledata()) {
440
        if (!$data = self::get_tabledata()) {
455
            // Not initialised yet.
441
            // Not initialised yet.
Línea 526... Línea 512...
526
                }
512
                }
527
            }
513
            }
528
            if ($queries) {
514
            if ($queries) {
529
                $DB->change_database_structure(implode(';', $queries));
515
                $DB->change_database_structure(implode(';', $queries));
530
            }
516
            }
531
        } else if ($dbfamily === 'oracle') {
-
 
532
            $sequences = self::get_sequencenames();
-
 
533
            $sequences = array_map('strtoupper', $sequences);
-
 
534
            $lookup = array_flip($sequences);
-
 
535
 
-
 
536
            $current = [];
-
 
537
            [$seqs, $params] = $DB->get_in_or_equal($sequences);
-
 
538
            $sql = "SELECT sequence_name, last_number FROM user_sequences WHERE sequence_name $seqs";
-
 
539
            $rs = $DB->get_recordset_sql($sql, $params);
-
 
540
            foreach ($rs as $seq) {
-
 
541
                $table = $lookup[$seq->sequence_name];
-
 
542
                $current[$table] = $seq->last_number;
-
 
543
            }
-
 
544
            $rs->close();
-
 
545
 
-
 
546
            foreach ($data as $table => $records) {
-
 
547
                // If table is not modified then no need to do anything.
-
 
548
                if (!isset($updatedtables[$table])) {
-
 
549
                    continue;
-
 
550
                }
-
 
551
                if (isset($structure[$table]['id']) && $structure[$table]['id']->auto_increment) {
-
 
552
                    $lastrecord = end($records);
-
 
553
                    if ($lastrecord) {
-
 
554
                        $nextid = $lastrecord->id + 1;
-
 
555
                    } else {
-
 
556
                        $nextid = 1;
-
 
557
                    }
-
 
558
                    if (!isset($current[$table])) {
-
 
559
                        $DB->get_manager()->reset_sequence($table);
-
 
560
                    } else if ($nextid == $current[$table]) {
-
 
561
                        continue;
-
 
562
                    }
-
 
563
                    // Reset as fast as possible.
-
 
564
                    // Alternatively we could use http://stackoverflow.com/questions/51470/how-do-i-reset-a-sequence-in-oracle.
-
 
565
                    $seqname = $sequences[$table];
-
 
566
                    $cachesize = $DB->get_manager()->generator->sequence_cache_size;
-
 
567
                    $DB->change_database_structure("DROP SEQUENCE $seqname");
-
 
568
                    $DB->change_database_structure(
-
 
569
                        "CREATE SEQUENCE $seqname START WITH $nextid INCREMENT BY 1 NOMAXVALUE CACHE $cachesize",
-
 
570
                    );
-
 
571
                }
-
 
572
            }
-
 
573
        } else {
517
        } else {
574
            // Note: does mssql support any kind of faster reset?
518
            // Note: does mssql support any kind of faster reset?
575
            // This also implies mssql will not use unique sequence values.
519
            // This also implies mssql will not use unique sequence values.
576
            if (is_null($empties) && (empty($updatedtables))) {
520
            if (is_null($empties) && (empty($updatedtables))) {
577
                $empties = self::guess_unmodified_empty_tables();
521
                $empties = self::guess_unmodified_empty_tables();