Merge "Rename variables for Title objects in PermissionManager"
authorjenkins-bot <jenkins-bot@gerrit.wikimedia.org>
Wed, 14 Aug 2019 23:31:21 +0000 (23:31 +0000)
committerGerrit Code Review <gerrit@wikimedia.org>
Wed, 14 Aug 2019 23:31:21 +0000 (23:31 +0000)
245 files changed:
RELEASE-NOTES-1.34
autoload.php
includes/DefaultSettings.php
includes/EditPage.php
includes/ServiceWiring.php
includes/api/ApiFeedContributions.php
includes/api/i18n/mk.json
includes/cache/GenderCache.php
includes/db/CloneDatabase.php
includes/db/DatabaseOracle.php [deleted file]
includes/installer/DatabaseInstaller.php
includes/installer/Installer.php
includes/installer/MssqlInstaller.php [deleted file]
includes/installer/MssqlUpdater.php [deleted file]
includes/installer/OracleInstaller.php [deleted file]
includes/installer/OracleUpdater.php [deleted file]
includes/installer/SqliteInstaller.php
includes/installer/WebInstallerDBConnect.php
includes/installer/i18n/en.json
includes/installer/i18n/pl.json
includes/installer/i18n/qqq.json
includes/jobqueue/JobQueueDB.php
includes/libs/objectcache/MediumSpecificBagOStuff.php
includes/libs/objectcache/MemcachedBagOStuff.php
includes/libs/rdbms/database/Database.php
includes/libs/rdbms/database/DatabaseMssql.php [deleted file]
includes/libs/rdbms/database/DatabaseMysqli.php
includes/libs/rdbms/database/DatabaseSqlite.php
includes/objectcache/ObjectCache.php
includes/parser/Sanitizer.php
includes/search/SearchSqlite.php
includes/specialpage/RedirectSpecialArticle.php
includes/specials/SpecialContributions.php
includes/specials/SpecialCreateAccount.php
includes/specials/SpecialNewSection.php
includes/title/TitleValue.php
languages/i18n/ar.json
languages/i18n/awa.json
languages/i18n/bcc.json
languages/i18n/bg.json
languages/i18n/bn.json
languages/i18n/bs.json
languages/i18n/ca.json
languages/i18n/ce.json
languages/i18n/cs.json
languages/i18n/de.json
languages/i18n/diq.json
languages/i18n/el.json
languages/i18n/eo.json
languages/i18n/es.json
languages/i18n/fa.json
languages/i18n/fr.json
languages/i18n/gcr.json
languages/i18n/gom-latn.json
languages/i18n/he.json
languages/i18n/hu.json
languages/i18n/hyw.json
languages/i18n/io.json
languages/i18n/it.json
languages/i18n/ko.json
languages/i18n/ku-latn.json
languages/i18n/lb.json
languages/i18n/lki.json
languages/i18n/lt.json
languages/i18n/mk.json
languages/i18n/ml.json
languages/i18n/mni.json
languages/i18n/nl.json
languages/i18n/nqo.json
languages/i18n/pl.json
languages/i18n/pt-br.json
languages/i18n/qqq.json
languages/i18n/ru.json
languages/i18n/sc.json
languages/i18n/sh.json
languages/i18n/sk.json
languages/i18n/skr-arab.json
languages/i18n/sl.json
languages/i18n/sv.json
languages/i18n/tg-cyrl.json
languages/i18n/tt-cyrl.json
languages/i18n/uk.json
languages/i18n/ur.json
languages/i18n/yue.json
languages/i18n/zh-hans.json
languages/i18n/zh-hant.json
languages/messages/MessagesDe.php
maintenance/minify.php
maintenance/mssql/archives/patch-actor-table.sql [deleted file]
maintenance/mssql/archives/patch-add-3d.sql [deleted file]
maintenance/mssql/archives/patch-add-cl_collation_ext_index.sql [deleted file]
maintenance/mssql/archives/patch-alter-table-oldimage.sql [deleted file]
maintenance/mssql/archives/patch-ar_rev_id-not-null.sql [deleted file]
maintenance/mssql/archives/patch-archive-drop-fks.sql [deleted file]
maintenance/mssql/archives/patch-bot_passwords.sql [deleted file]
maintenance/mssql/archives/patch-categorylinks-constraints.sql [deleted file]
maintenance/mssql/archives/patch-change_tag-ct_id.sql [deleted file]
maintenance/mssql/archives/patch-change_tag-tag_id.sql [deleted file]
maintenance/mssql/archives/patch-change_tag_def.sql [deleted file]
maintenance/mssql/archives/patch-comment-table.sql [deleted file]
maintenance/mssql/archives/patch-content.sql [deleted file]
maintenance/mssql/archives/patch-content_models.sql [deleted file]
maintenance/mssql/archives/patch-drop-ar_text.sql [deleted file]
maintenance/mssql/archives/patch-drop-comment-fields.sql [deleted file]
maintenance/mssql/archives/patch-drop-ct_tag.sql [deleted file]
maintenance/mssql/archives/patch-drop-page_counter.sql [deleted file]
maintenance/mssql/archives/patch-drop-rc_cur_time.sql [deleted file]
maintenance/mssql/archives/patch-drop-ss_total_views.sql [deleted file]
maintenance/mssql/archives/patch-drop-user_options.sql [deleted file]
maintenance/mssql/archives/patch-externallinks-el_index_60-drop-default.sql [deleted file]
maintenance/mssql/archives/patch-fa_major_mime-chemical.sql [deleted file]
maintenance/mssql/archives/patch-filearchive-constraints.sql [deleted file]
maintenance/mssql/archives/patch-filearchive-schema.sql [deleted file]
maintenance/mssql/archives/patch-il_from_namespace.sql [deleted file]
maintenance/mssql/archives/patch-image-constraints.sql [deleted file]
maintenance/mssql/archives/patch-image-img_description_id.sql [deleted file]
maintenance/mssql/archives/patch-image-schema.sql [deleted file]
maintenance/mssql/archives/patch-img_major_mime-chemical.sql [deleted file]
maintenance/mssql/archives/patch-interwiki-pk.sql [deleted file]
maintenance/mssql/archives/patch-ipb_sitewide.sql [deleted file]
maintenance/mssql/archives/patch-ipblocks_restrictions-table.sql [deleted file]
maintenance/mssql/archives/patch-kill-cl_collation_index.sql [deleted file]
maintenance/mssql/archives/patch-logging-drop-fks.sql [deleted file]
maintenance/mssql/archives/patch-oi_major_mime-chemical.sql [deleted file]
maintenance/mssql/archives/patch-oldimage-constraints.sql [deleted file]
maintenance/mssql/archives/patch-oldimage-schema.sql [deleted file]
maintenance/mssql/archives/patch-page_page_lang.sql [deleted file]
maintenance/mssql/archives/patch-page_props-pk.sql [deleted file]
maintenance/mssql/archives/patch-pl_from_namespace.sql [deleted file]
maintenance/mssql/archives/patch-pp_sortkey.sql [deleted file]
maintenance/mssql/archives/patch-protected_titles-pk.sql [deleted file]
maintenance/mssql/archives/patch-rc_patrolled_type.sql [deleted file]
maintenance/mssql/archives/patch-recentchanges-drop-fks.sql [deleted file]
maintenance/mssql/archives/patch-rev_text_id-default.sql [deleted file]
maintenance/mssql/archives/patch-site_identifiers-pk.sql [deleted file]
maintenance/mssql/archives/patch-site_stats-modify.sql [deleted file]
maintenance/mssql/archives/patch-site_stats-pk.sql [deleted file]
maintenance/mssql/archives/patch-slot-origin.sql [deleted file]
maintenance/mssql/archives/patch-slot_roles.sql [deleted file]
maintenance/mssql/archives/patch-slots.sql [deleted file]
maintenance/mssql/archives/patch-tl_from_namespace.sql [deleted file]
maintenance/mssql/archives/patch-uploadstash-constraints.sql [deleted file]
maintenance/mssql/archives/patch-user_groups-ug_expiry.sql [deleted file]
maintenance/mssql/archives/patch-user_password_expires.sql [deleted file]
maintenance/mssql/archives/patch-watchlist-wl_id.sql [deleted file]
maintenance/mssql/patch-change_tag-change_tag_rc_tag_id.sql [deleted file]
maintenance/mssql/tables.sql [deleted file]
maintenance/mssql/update-keys.sql [deleted file]
maintenance/oracle/alterSharedConstraints.php [deleted file]
maintenance/oracle/archives/patch-actor-table.sql [deleted file]
maintenance/oracle/archives/patch-add-rc_name_type_patrolled_timestamp_index.sql [deleted file]
maintenance/oracle/archives/patch-ar_rev_id-not-null.sql [deleted file]
maintenance/oracle/archives/patch-ar_sha1_field.sql [deleted file]
maintenance/oracle/archives/patch-archive-ar_content_format.sql [deleted file]
maintenance/oracle/archives/patch-archive-ar_content_model.sql [deleted file]
maintenance/oracle/archives/patch-archive-ar_id.sql [deleted file]
maintenance/oracle/archives/patch-archive-ar_rev_id-unique.sql [deleted file]
maintenance/oracle/archives/patch-auto_increment_triggers.sql [deleted file]
maintenance/oracle/archives/patch-cat_hidden.sql [deleted file]
maintenance/oracle/archives/patch-change_tag-change_tag_rc_tag_id.sql [deleted file]
maintenance/oracle/archives/patch-change_tag-ct_id.sql [deleted file]
maintenance/oracle/archives/patch-change_tag-tag_id.sql [deleted file]
maintenance/oracle/archives/patch-change_tag_def.sql [deleted file]
maintenance/oracle/archives/patch-comment-table.sql [deleted file]
maintenance/oracle/archives/patch-content.sql [deleted file]
maintenance/oracle/archives/patch-content_models.sql [deleted file]
maintenance/oracle/archives/patch-drop-ar_text.sql [deleted file]
maintenance/oracle/archives/patch-drop-comment-fields.sql [deleted file]
maintenance/oracle/archives/patch-drop-ct_tag.sql [deleted file]
maintenance/oracle/archives/patch-externallinks-el_id.sql [deleted file]
maintenance/oracle/archives/patch-externallinks-el_index_60.sql [deleted file]
maintenance/oracle/archives/patch-fa_sha1.sql [deleted file]
maintenance/oracle/archives/patch-image-img_description_id.sql [deleted file]
maintenance/oracle/archives/patch-ipb_sitewide.sql [deleted file]
maintenance/oracle/archives/patch-ipblocks_i05_index.sql [deleted file]
maintenance/oracle/archives/patch-ipblocks_restrictions-table.sql [deleted file]
maintenance/oracle/archives/patch-job_attempts.sql [deleted file]
maintenance/oracle/archives/patch-job_timestamp_field.sql [deleted file]
maintenance/oracle/archives/patch-job_timestamp_index.sql [deleted file]
maintenance/oracle/archives/patch-job_token.sql [deleted file]
maintenance/oracle/archives/patch-logging_type_action_index.sql [deleted file]
maintenance/oracle/archives/patch-logging_user_text_time_index.sql [deleted file]
maintenance/oracle/archives/patch-logging_user_text_type_time_index.sql [deleted file]
maintenance/oracle/archives/patch-page-page_content_model.sql [deleted file]
maintenance/oracle/archives/patch-page-page_lang.sql [deleted file]
maintenance/oracle/archives/patch-page_links_updated.sql [deleted file]
maintenance/oracle/archives/patch-page_redirect_namespace_len.sql [deleted file]
maintenance/oracle/archives/patch-page_restrictions_pkuk_fix.sql [deleted file]
maintenance/oracle/archives/patch-rc_moved.sql [deleted file]
maintenance/oracle/archives/patch-rc_source.sql [deleted file]
maintenance/oracle/archives/patch-recentchanges-nttindex.sql [deleted file]
maintenance/oracle/archives/patch-rev_sha1_field.sql [deleted file]
maintenance/oracle/archives/patch-revision-rev_content_format.sql [deleted file]
maintenance/oracle/archives/patch-revision-rev_content_model.sql [deleted file]
maintenance/oracle/archives/patch-revision_i05_index.sql [deleted file]
maintenance/oracle/archives/patch-site_stats-modify.sql [deleted file]
maintenance/oracle/archives/patch-site_stats-pk.sql [deleted file]
maintenance/oracle/archives/patch-sites.sql [deleted file]
maintenance/oracle/archives/patch-slot-origin.sql [deleted file]
maintenance/oracle/archives/patch-slot_roles.sql [deleted file]
maintenance/oracle/archives/patch-slots.sql [deleted file]
maintenance/oracle/archives/patch-ss_admins.sql [deleted file]
maintenance/oracle/archives/patch-testrun.sql [deleted file]
maintenance/oracle/archives/patch-ufg_group-length-increase-255.sql [deleted file]
maintenance/oracle/archives/patch-ug_group-length-increase-255.sql [deleted file]
maintenance/oracle/archives/patch-up_property.sql [deleted file]
maintenance/oracle/archives/patch-uploadstash-us_props.sql [deleted file]
maintenance/oracle/archives/patch-uploadstash.sql [deleted file]
maintenance/oracle/archives/patch-us_chunk_inx_field.sql [deleted file]
maintenance/oracle/archives/patch-user_email_index.sql [deleted file]
maintenance/oracle/archives/patch-user_former_groups.sql [deleted file]
maintenance/oracle/archives/patch-user_groups-ug_expiry.sql [deleted file]
maintenance/oracle/archives/patch-user_password_expire.sql [deleted file]
maintenance/oracle/archives/patch-watchlist-wl_id.sql [deleted file]
maintenance/oracle/archives/patch_16_17_schema_changes.sql [deleted file]
maintenance/oracle/archives/patch_create_17_functions.sql [deleted file]
maintenance/oracle/archives/patch_fk_rename_deferred.sql [deleted file]
maintenance/oracle/archives/patch_namespace_defaults.sql [deleted file]
maintenance/oracle/archives/patch_rebuild_dupfunc.sql [deleted file]
maintenance/oracle/archives/patch_recentchanges_fk2_cascade.sql [deleted file]
maintenance/oracle/archives/patch_remove_not_null_empty_defs.sql [deleted file]
maintenance/oracle/archives/patch_remove_not_null_empty_defs2.sql [deleted file]
maintenance/oracle/patch_seq_names_pre1.16.sql [deleted file]
maintenance/oracle/tables.sql [deleted file]
maintenance/oracle/update-keys.sql [deleted file]
maintenance/oracle/user.sql [deleted file]
maintenance/populateChangeTagDef.php
tests/parser/ParserTestRunner.php
tests/parser/parserTests.txt
tests/phpunit/MediaWikiIntegrationTestCase.php
tests/phpunit/bootstrap.php
tests/phpunit/includes/MergeHistoryTest.php
tests/phpunit/includes/MovePageTest.php
tests/phpunit/includes/TitleTest.php
tests/phpunit/includes/api/ApiFeedContributionsTest.php [new file with mode: 0644]
tests/phpunit/includes/db/LBFactoryTest.php
tests/phpunit/includes/db/LoadBalancerTest.php
tests/phpunit/includes/libs/objectcache/BagOStuffTest.php
tests/phpunit/includes/libs/rdbms/database/DatabaseMssqlTest.php [deleted file]
tests/phpunit/includes/libs/rdbms/database/DatabaseTest.php
tests/phpunit/includes/rcfeed/RCFeedIntegrationTest.php
tests/phpunit/suites/ParserTestTopLevelSuite.php
tests/phpunit/unit/includes/db/DatabaseOracleTest.php [deleted file]
tests/phpunit/unit/includes/installer/OracleInstallerTest.php [deleted file]
tests/phpunit/unit/includes/title/TitleValueTest.php

index 5e4f61d..69a64d0 100644 (file)
@@ -340,6 +340,8 @@ because of Phabricator reports.
 * Database::getProperty(), deprecated in 1.28, has been removed.
 * IDatabase::getWikiId(), deprecated in 1.30, has been removed.
   Use IDatabase::getDomainID() instead.
+* (T191231) Support for using Oracle or MSSQL as database backends has been
+  dropped.
 * …
 
 === Deprecations in 1.34 ===
index e4afbf5..9a555d0 100644 (file)
@@ -20,7 +20,6 @@ $wgAutoloadLocalClasses = [
        'AllMessagesTablePager' => __DIR__ . '/includes/specials/pagers/AllMessagesTablePager.php',
        'AllTrans' => __DIR__ . '/maintenance/language/alltrans.php',
        'AlphabeticPager' => __DIR__ . '/includes/pager/AlphabeticPager.php',
-       'AlterSharedConstraints' => __DIR__ . '/maintenance/oracle/alterSharedConstraints.php',
        'AncientPagesPage' => __DIR__ . '/includes/specials/SpecialAncientpages.php',
        'AnsiTermColorer' => __DIR__ . '/maintenance/term/MWTerm.php',
        'ApiAMCreateAccount' => __DIR__ . '/includes/api/ApiAMCreateAccount.php',
@@ -358,10 +357,8 @@ $wgAutoloadLocalClasses = [
        'DatabaseInstaller' => __DIR__ . '/includes/installer/DatabaseInstaller.php',
        'DatabaseLag' => __DIR__ . '/maintenance/lag.php',
        'DatabaseLogEntry' => __DIR__ . '/includes/logging/DatabaseLogEntry.php',
-       'DatabaseMssql' => __DIR__ . '/includes/libs/rdbms/database/DatabaseMssql.php',
        'DatabaseMysqlBase' => __DIR__ . '/includes/libs/rdbms/database/DatabaseMysqlBase.php',
        'DatabaseMysqli' => __DIR__ . '/includes/libs/rdbms/database/DatabaseMysqli.php',
-       'DatabaseOracle' => __DIR__ . '/includes/db/DatabaseOracle.php',
        'DatabasePostgres' => __DIR__ . '/includes/libs/rdbms/database/DatabasePostgres.php',
        'DatabaseSqlite' => __DIR__ . '/includes/libs/rdbms/database/DatabaseSqlite.php',
        'DatabaseUpdater' => __DIR__ . '/includes/installer/DatabaseUpdater.php',
@@ -1011,8 +1008,6 @@ $wgAutoloadLocalClasses = [
        'MoveLogFormatter' => __DIR__ . '/includes/logging/MoveLogFormatter.php',
        'MovePage' => __DIR__ . '/includes/MovePage.php',
        'MovePageForm' => __DIR__ . '/includes/specials/SpecialMovepage.php',
-       'MssqlInstaller' => __DIR__ . '/includes/installer/MssqlInstaller.php',
-       'MssqlUpdater' => __DIR__ . '/includes/installer/MssqlUpdater.php',
        'MultiConfig' => __DIR__ . '/includes/config/MultiConfig.php',
        'MultiHttpClient' => __DIR__ . '/includes/libs/http/MultiHttpClient.php',
        'MultiWriteBagOStuff' => __DIR__ . '/includes/libs/objectcache/MultiWriteBagOStuff.php',
@@ -1052,8 +1047,6 @@ $wgAutoloadLocalClasses = [
        'OldChangesList' => __DIR__ . '/includes/changes/OldChangesList.php',
        'OldLocalFile' => __DIR__ . '/includes/filerepo/file/OldLocalFile.php',
        'OldRevisionImporter' => __DIR__ . '/includes/import/OldRevisionImporter.php',
-       'OracleInstaller' => __DIR__ . '/includes/installer/OracleInstaller.php',
-       'OracleUpdater' => __DIR__ . '/includes/installer/OracleUpdater.php',
        'OrderedStreamingForkController' => __DIR__ . '/includes/OrderedStreamingForkController.php',
        'OrphanStats' => __DIR__ . '/maintenance/storage/orphanStats.php',
        'Orphans' => __DIR__ . '/maintenance/orphans.php',
@@ -1664,7 +1657,6 @@ $wgAutoloadLocalClasses = [
        'Wikimedia\\Rdbms\\DBUnexpectedError' => __DIR__ . '/includes/libs/rdbms/exception/DBUnexpectedError.php',
        'Wikimedia\\Rdbms\\Database' => __DIR__ . '/includes/libs/rdbms/database/Database.php',
        'Wikimedia\\Rdbms\\DatabaseDomain' => __DIR__ . '/includes/libs/rdbms/database/domain/DatabaseDomain.php',
-       'Wikimedia\\Rdbms\\DatabaseMssql' => __DIR__ . '/includes/libs/rdbms/database/DatabaseMssql.php',
        'Wikimedia\\Rdbms\\DatabaseMysqlBase' => __DIR__ . '/includes/libs/rdbms/database/DatabaseMysqlBase.php',
        'Wikimedia\\Rdbms\\DatabaseMysqli' => __DIR__ . '/includes/libs/rdbms/database/DatabaseMysqli.php',
        'Wikimedia\\Rdbms\\DatabasePostgres' => __DIR__ . '/includes/libs/rdbms/database/DatabasePostgres.php',
index 1b348f3..fea5ff9 100644 (file)
@@ -330,15 +330,22 @@ $wgAppleTouchIcon = false;
 $wgReferrerPolicy = false;
 
 /**
- * The local filesystem path to a temporary directory. This is not required to
- * be web accessible.
+ * The local filesystem path to a temporary directory. This must not be web accessible.
  *
- * When this setting is set to false, its value will be set through a call
- * to wfTempDir(). See that methods implementation for the actual detection
- * logic.
+ * When this setting is set to false, its value will automatically be decided
+ * through the first call to wfTempDir(). See that method's implementation for
+ * the actual detection logic.
  *
- * Developers should use the global function wfTempDir() instead of this
- * variable.
+ * To find the temporary path for the current wiki, developers must not use
+ * this variable directly. Use the global function wfTempDir() instead.
+ *
+ * The temporary directory is expected to be shared with other applications,
+ * including other MediaWiki instances (which might not run the same version
+ * or configution). When storing files here, take care to avoid conflicts
+ * with other instances of MediaWiki. For example, when caching the result
+ * of a computation, the file name should incorporate the input of the
+ * computation so that it cannot be confused for the result of a similar
+ * computation by another MediaWiki instance.
  *
  * @see wfTempDir()
  * @note Default changed to false in MediaWiki 1.20.
@@ -5796,6 +5803,7 @@ $wgGrantPermissions = [];
 // @TODO: clean up grants
 // @TODO: auto-include read/editsemiprotected rights?
 
+$wgGrantPermissions['basic']['autocreateaccount'] = true;
 $wgGrantPermissions['basic']['autoconfirmed'] = true;
 $wgGrantPermissions['basic']['autopatrol'] = true;
 $wgGrantPermissions['basic']['editsemiprotected'] = true;
index f288327..74ec883 100644 (file)
@@ -622,7 +622,7 @@ class EditPage {
                        wfDebug( __METHOD__ . ": User can't edit\n" );
 
                        if ( $this->context->getUser()->getBlock() ) {
-                               // track block with a cookie if it doesn't exists already
+                               // Track block with a cookie if it doesn't exist already
                                MediaWikiServices::getInstance()->getBlockManager()
                                        ->trackBlockWithCookie( $this->context->getUser() );
 
index 9073de1..c192b5a 100644 (file)
@@ -215,7 +215,12 @@ return [
        },
 
        'GenderCache' => function ( MediaWikiServices $services ) : GenderCache {
-               return new GenderCache( $services->getNamespaceInfo() );
+               $nsInfo = $services->getNamespaceInfo();
+               // Database layer may be disabled, so processing without database connection
+               $dbLoadBalancer = $services->isServiceDisabled( 'DBLoadBalancer' )
+                       ? null
+                       : $services->getDBLoadBalancer();
+               return new GenderCache( $nsInfo, $dbLoadBalancer );
        },
 
        'HttpRequestFactory' =>
index 08be8e0..28b0a4b 100644 (file)
@@ -34,6 +34,9 @@ class ApiFeedContributions extends ApiBase {
        /** @var RevisionStore */
        private $revisionStore;
 
+       /** @var TitleParser */
+       private $titleParser;
+
        /**
         * This module uses a custom feed wrapper printer.
         *
@@ -45,6 +48,7 @@ class ApiFeedContributions extends ApiBase {
 
        public function execute() {
                $this->revisionStore = MediaWikiServices::getInstance()->getRevisionStore();
+               $this->titleParser = MediaWikiServices::getInstance()->getTitleParser();
 
                $params = $this->extractRequestParams();
 
@@ -67,9 +71,19 @@ class ApiFeedContributions extends ApiBase {
                        ' [' . $config->get( 'LanguageCode' ) . ']';
                $feedUrl = SpecialPage::getTitleFor( 'Contributions', $params['user'] )->getFullURL();
 
-               $target = $params['user'] == 'newbies'
-                       ? 'newbies'
-                       : Title::makeTitleSafe( NS_USER, $params['user'] )->getText();
+               $target = 'newbies';
+               if ( $params['user'] != 'newbies' ) {
+                       try {
+                               $target = $this->titleParser
+                                       ->parseTitle( $params['user'], NS_USER )
+                                       ->getText();
+                       } catch ( MalformedTitleException $e ) {
+                               $this->dieWithError(
+                                       [ 'apierror-baduser', 'user', wfEscapeWikiText( $params['user'] ) ],
+                                       'baduser_' . $this->encodeParamName( 'user' )
+                               );
+                       }
+               }
 
                $feed = new $feedClasses[$params['feedformat']] (
                        $feedTitle,
index 968d963..2845340 100644 (file)
        "apihelp-login-example-login": "Најава",
        "apihelp-logout-summary": "Одјави се и исчисти ги податоците на седницата.",
        "apihelp-logout-example-logout": "Одјави го тековниот корисник",
+       "apihelp-managetags-summary": "Извршување на раководни задачи по промена на ознаки.",
+       "apihelp-managetags-param-reason": "Незадолжителна причина за создавање, бришење, активирање или деактивирање на ознаката.",
        "apihelp-mergehistory-summary": "Спојување на истории на страници.",
        "apihelp-move-summary": "Премести страница.",
        "apihelp-move-param-from": "Наслов на страницата што треба да се премести. Не може да се користи заедно со <var>$1fromid</var>.",
        "api-help-right-apihighlimits": "Употреба на повисоки ограничувања за приложни барања (бавни барања: $1; брзи барања: $2). Ограничувањата за бавни барања важат и за повеќевредносни параметри.",
        "apierror-badgenerator-unknown": "Непознат <kbd>generator=$1</kbd>.",
        "apierror-badquery": "Неважечко барање.",
+       "apierror-copyuploadbaddomain": "Подигањето преку URL не е дозволено од овој домен.",
+       "apierror-copyuploadbadurl": "Подигањето не е дозволено од оваа URL-адреса.",
+       "apierror-emptynewsection": "Создавањето на нови празни поднаслови не е дозволено.",
+       "apierror-emptypage": "Создавањето на нови празни страници не е дозволено.",
+       "apierror-filedoesnotexist": "Податотеката не постои.",
+       "apierror-imageusage-badtitle": "Насловот за <kbd>$1</kbd> мора да е податотека.",
+       "apierror-import-unknownerror": "Непозната грешка при увозот: $1.",
+       "apierror-invalidcategory": "Наведеното име на категорија не е важечко.",
+       "apierror-invalid-file-key": "Не е важечки податотечен клуч.",
+       "apierror-missingtitle": "Наведената страница не постои.",
+       "apierror-missingtitle-byname": "Страницата $1 не постои.",
        "apierror-offline": "Не можев да продолжам поради проблем при поврзувањето со мрежата. Проверете дали сте поврзани со семрежјето и обидете се повторно.",
        "apierror-timeout": "Опслужувачот не одговори во очекуваното време.",
        "api-credits-header": "Признанија",
index eedc3c6..a181507 100644 (file)
@@ -21,7 +21,9 @@
  * @author Niklas Laxström
  * @ingroup Cache
  */
+
 use MediaWiki\MediaWikiServices;
+use Wikimedia\Rdbms\ILoadBalancer;
 
 /**
  * Caches user genders when needed to use correct namespace aliases.
@@ -37,8 +39,12 @@ class GenderCache {
        /** @var NamespaceInfo */
        private $nsInfo;
 
-       public function __construct( NamespaceInfo $nsInfo = null ) {
+       /** @var ILoadBalancer|null */
+       private $loadBalancer;
+
+       public function __construct( NamespaceInfo $nsInfo = null, ILoadBalancer $loadBalancer = null ) {
                $this->nsInfo = $nsInfo ?? MediaWikiServices::getInstance()->getNamespaceInfo();
+               $this->loadBalancer = $loadBalancer;
        }
 
        /**
@@ -164,7 +170,13 @@ class GenderCache {
                        return;
                }
 
-               $dbr = wfGetDB( DB_REPLICA );
+               // Only query database, when load balancer is provided by service wiring
+               // This maybe not happen when running as part of the installer
+               if ( $this->loadBalancer === null ) {
+                       return;
+               }
+
+               $dbr = $this->loadBalancer->getConnectionRef( DB_REPLICA );
                $table = [ 'user', 'user_properties' ];
                $fields = [ 'user_name', 'up_value' ];
                $conds = [ 'user_name' => $usersToCheck ];
index cdf0f79..df5f115 100644 (file)
@@ -93,9 +93,7 @@ class CloneDatabase {
 
                        // Postgres: Temp tables are automatically deleted upon end of session
                        //           Same Temp table name hides existing table for current session
-                       if ( $this->dropCurrentTables
-                               && !in_array( $this->db->getType(), [ 'oracle' ] )
-                       ) {
+                       if ( $this->dropCurrentTables ) {
                                if ( $oldTableName === $newTableName ) {
                                        // Last ditch check to avoid data loss
                                        throw new LogicException( "Not dropping new table, as '$newTableName'"
diff --git a/includes/db/DatabaseOracle.php b/includes/db/DatabaseOracle.php
deleted file mode 100644 (file)
index 82fff6b..0000000
+++ /dev/null
@@ -1,1387 +0,0 @@
-<?php
-/**
- * This is the Oracle database abstraction layer.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- * @ingroup Database
- */
-
-use Wikimedia\AtEase\AtEase;
-use Wikimedia\Timestamp\ConvertibleTimestamp;
-use Wikimedia\Rdbms\Database;
-use Wikimedia\Rdbms\DatabaseDomain;
-use Wikimedia\Rdbms\Blob;
-use Wikimedia\Rdbms\ResultWrapper;
-use Wikimedia\Rdbms\IResultWrapper;
-use Wikimedia\Rdbms\DBUnexpectedError;
-use Wikimedia\Rdbms\DBExpectedError;
-
-/**
- * @ingroup Database
- */
-class DatabaseOracle extends Database {
-       /** @var resource */
-       protected $mLastResult = null;
-
-       /** @var int The number of rows affected as an integer */
-       protected $mAffectedRows;
-
-       /** @var bool */
-       private $ignoreDupValOnIndex = false;
-
-       /** @var bool|array */
-       private $sequenceData = null;
-
-       /** @var string Character set for Oracle database */
-       private $defaultCharset = 'AL32UTF8';
-
-       /** @var array */
-       private $mFieldInfoCache = [];
-
-       /** @var string[] Map of (reserved table name => alternate table name) */
-       private $keywordTableMap = [];
-
-       /**
-        * @see Database::__construct()
-        * @param array $params Additional parameters include:
-        *   - keywordTableMap : Map of reserved table names to alternative table names to use
-        */
-       public function __construct( array $params ) {
-               $this->keywordTableMap = $params['keywordTableMap'] ?? [];
-               $params['tablePrefix'] = strtoupper( $params['tablePrefix'] );
-               parent::__construct( $params );
-       }
-
-       function __destruct() {
-               if ( $this->conn ) {
-                       AtEase::suppressWarnings();
-                       $this->close();
-                       AtEase::restoreWarnings();
-               }
-       }
-
-       function getType() {
-               return 'oracle';
-       }
-
-       function implicitOrderby() {
-               return false;
-       }
-
-       protected function open( $server, $user, $password, $dbName, $schema, $tablePrefix ) {
-               if ( !function_exists( 'oci_connect' ) ) {
-                       throw $this->newExceptionAfterConnectError(
-                               "Oracle functions missing, have you compiled PHP with the --with-oci8 option?\n " .
-                               "(Note: if you recently installed PHP, you may need to restart your webserver\n " .
-                               "and database)"
-                       );
-               }
-
-               $this->close();
-
-               if ( $schema !== null ) {
-                       // This uses the *database* aspect of $domain for schema, not the domain schema
-                       throw $this->newExceptionAfterConnectError(
-                               "Got schema '$schema'; not supported. " .
-                               "The database component '$dbName' is actually interpreted as the Oracle schema."
-                       );
-               }
-
-               $this->user = $user;
-               $this->password = $password;
-               if ( strlen( $server ) ) {
-                       // Transparent Network Substrate (TNS) endpoint
-                       $this->server = $server;
-                       // Database name, defaulting to the user name
-                       $realDatabase = strlen( $dbName ) ? $dbName : $user;
-               } else {
-                       // Backward compatibility; $server used to be null and $dbName was the TNS
-                       $this->server = $dbName;
-                       $realDatabase = $user;
-               }
-               $session_mode = ( $this->flags & DBO_SYSDBA ) ? OCI_SYSDBA : OCI_DEFAULT;
-
-               $this->installErrorHandler();
-               try {
-                       $this->conn = $this->getFlag( DBO_PERSISTENT )
-                               ? oci_pconnect(
-                                       $this->user,
-                                       $this->password,
-                                       $this->server,
-                                       $this->defaultCharset,
-                                       $session_mode
-                               )
-                               : oci_new_connect(
-                                       $this->user,
-                                       $this->password,
-                                       $this->server,
-                                       $this->defaultCharset,
-                                       $session_mode
-                               );
-               } catch ( Exception $e ) {
-                       $this->restoreErrorHandler();
-                       throw $this->newExceptionAfterConnectError( $e->getMessage() );
-               }
-               $error = $this->restoreErrorHandler();
-
-               if ( !$this->conn ) {
-                       throw $this->newExceptionAfterConnectError( $error ?: $this->lastError() );
-               }
-
-               try {
-                       if ( $this->user != $realDatabase ) {
-                               // Change current schema for the entire session
-                               $this->selectDomain( new DatabaseDomain(
-                                       $realDatabase,
-                                       $this->currentDomain->getSchema(),
-                                       $this->currentDomain->getTablePrefix()
-                               ) );
-                       } else {
-                               $this->currentDomain = new DatabaseDomain( $realDatabase, null, $tablePrefix );
-                       }
-                       $set = [
-                               'NLS_TIMESTAMP_FORMAT' => 'DD-MM-YYYY HH24:MI:SS.FF6',
-                               'NLS_TIMESTAMP_TZ_FORMAT' => 'DD-MM-YYYY HH24:MI:SS.FF6',
-                               'NLS_NUMERIC_CHARACTERS' => '.,'
-                       ];
-                       foreach ( $set as $var => $val ) {
-                               $this->query(
-                                       "ALTER SESSION SET {$var}=" . $this->addQuotes( $val ),
-                                       __METHOD__,
-                                       self::QUERY_IGNORE_DBO_TRX | self::QUERY_NO_RETRY
-                               );
-                       }
-               } catch ( Exception $e ) {
-                       throw $this->newExceptionAfterConnectError( $e->getMessage() );
-               }
-       }
-
-       /**
-        * Closes a database connection, if it is open
-        * Returns success, true if already closed
-        * @return bool
-        */
-       protected function closeConnection() {
-               return oci_close( $this->conn );
-       }
-
-       function execFlags() {
-               return $this->trxLevel() ? OCI_NO_AUTO_COMMIT : OCI_COMMIT_ON_SUCCESS;
-       }
-
-       /**
-        * @param string $sql
-        * @return bool|mixed|ORAResult
-        */
-       protected function doQuery( $sql ) {
-               if ( !mb_check_encoding( (string)$sql, 'UTF-8' ) ) {
-                       throw new DBUnexpectedError( $this, "SQL encoding is invalid\n$sql" );
-               }
-
-               // handle some oracle specifics
-               // remove AS column/table/subquery namings
-               if ( !$this->getFlag( DBO_DDLMODE ) ) {
-                       $sql = preg_replace( '/ as /i', ' ', $sql );
-               }
-
-               // Oracle has issues with UNION clause if the statement includes LOB fields
-               // So we do a UNION ALL and then filter the results array with array_unique
-               $union_unique = ( preg_match( '/\/\* UNION_UNIQUE \*\/ /', $sql ) != 0 );
-               // EXPLAIN syntax in Oracle is EXPLAIN PLAN FOR and it return nothing
-               // you have to select data from plan table after explain
-               $explain_id = MWTimestamp::getLocalInstance()->format( 'dmYHis' );
-
-               $sql = preg_replace(
-                       '/^EXPLAIN /',
-                       'EXPLAIN PLAN SET STATEMENT_ID = \'' . $explain_id . '\' FOR',
-                       $sql,
-                       1,
-                       $explain_count
-               );
-
-               Wikimedia\suppressWarnings();
-
-               $this->mLastResult = $stmt = oci_parse( $this->conn, $sql );
-               if ( $stmt === false ) {
-                       $e = oci_error( $this->conn );
-                       $this->reportQueryError( $e['message'], $e['code'], $sql, __METHOD__ );
-
-                       return false;
-               }
-
-               if ( !oci_execute( $stmt, $this->execFlags() ) ) {
-                       $e = oci_error( $stmt );
-                       if ( !$this->ignoreDupValOnIndex || $e['code'] != '1' ) {
-                               $this->reportQueryError( $e['message'], $e['code'], $sql, __METHOD__ );
-
-                               return false;
-                       }
-               }
-
-               Wikimedia\restoreWarnings();
-
-               if ( $explain_count > 0 ) {
-                       return $this->doQuery( 'SELECT id, cardinality "ROWS" FROM plan_table ' .
-                               'WHERE statement_id = \'' . $explain_id . '\'' );
-               } elseif ( oci_statement_type( $stmt ) == 'SELECT' ) {
-                       return new ORAResult( $this, $stmt, $union_unique );
-               } else {
-                       $this->mAffectedRows = oci_num_rows( $stmt );
-
-                       return true;
-               }
-       }
-
-       function queryIgnore( $sql, $fname = '' ) {
-               return $this->query( $sql, $fname, true );
-       }
-
-       /**
-        * Frees resources associated with the LOB descriptor
-        * @param IResultWrapper|ORAResult $res
-        */
-       function freeResult( $res ) {
-               ResultWrapper::unwrap( $res )->free();
-       }
-
-       /**
-        * @param IResultWrapper|ORAResult $res
-        * @return stdClass|bool
-        */
-       function fetchObject( $res ) {
-               return ResultWrapper::unwrap( $res )->fetchObject();
-       }
-
-       /**
-        * @param IResultWrapper|ORAResult $res
-        * @return stdClass|bool
-        */
-       function fetchRow( $res ) {
-               return ResultWrapper::unwrap( $res )->fetchRow();
-       }
-
-       /**
-        * @param IResultWrapper|ORAResult $res
-        * @return int
-        */
-       function numRows( $res ) {
-               return ResultWrapper::unwrap( $res )->numRows();
-       }
-
-       /**
-        * @param IResultWrapper|ORAResult $res
-        * @return int
-        */
-       function numFields( $res ) {
-               return ResultWrapper::unwrap( $res )->numFields();
-       }
-
-       function fieldName( $stmt, $n ) {
-               return oci_field_name( $stmt, $n );
-       }
-
-       function insertId() {
-               $res = $this->query( "SELECT lastval_pkg.getLastval FROM dual" );
-               $row = $this->fetchRow( $res );
-               return is_null( $row[0] ) ? null : (int)$row[0];
-       }
-
-       /**
-        * @param mixed $res
-        * @param int $row
-        */
-       function dataSeek( $res, $row ) {
-               if ( $res instanceof ORAResult ) {
-                       $res->seek( $row );
-               } else {
-                       ResultWrapper::unwrap( $res )->seek( $row );
-               }
-       }
-
-       function lastError() {
-               if ( $this->conn === false ) {
-                       $e = oci_error();
-               } else {
-                       $e = oci_error( $this->conn );
-               }
-
-               return $e['message'];
-       }
-
-       function lastErrno() {
-               if ( $this->conn === false ) {
-                       $e = oci_error();
-               } else {
-                       $e = oci_error( $this->conn );
-               }
-
-               return $e['code'];
-       }
-
-       protected function fetchAffectedRowCount() {
-               return $this->mAffectedRows;
-       }
-
-       /**
-        * Returns information about an index
-        * If errors are explicitly ignored, returns NULL on failure
-        * @param string $table
-        * @param string $index
-        * @param string $fname
-        * @return bool
-        */
-       function indexInfo( $table, $index, $fname = __METHOD__ ) {
-               return false;
-       }
-
-       function indexUnique( $table, $index, $fname = __METHOD__ ) {
-               return false;
-       }
-
-       function insert( $table, $a, $fname = __METHOD__, $options = [] ) {
-               if ( !count( $a ) ) {
-                       return true;
-               }
-
-               if ( !is_array( $options ) ) {
-                       $options = [ $options ];
-               }
-
-               if ( in_array( 'IGNORE', $options ) ) {
-                       $this->ignoreDupValOnIndex = true;
-               }
-
-               if ( !is_array( reset( $a ) ) ) {
-                       $a = [ $a ];
-               }
-
-               foreach ( $a as &$row ) {
-                       $this->insertOneRow( $table, $row, $fname );
-               }
-
-               if ( in_array( 'IGNORE', $options ) ) {
-                       $this->ignoreDupValOnIndex = false;
-               }
-
-               return true;
-       }
-
-       private function fieldBindStatement( $table, $col, &$val, $includeCol = false ) {
-               $col_info = $this->fieldInfoMulti( $table, $col );
-               $col_type = $col_info != false ? $col_info->type() : 'CONSTANT';
-
-               $bind = '';
-               if ( is_numeric( $col ) ) {
-                       $bind = $val;
-                       $val = null;
-
-                       return $bind;
-               } elseif ( $includeCol ) {
-                       $bind = "$col = ";
-               }
-
-               if ( $val == '' && $val !== 0 && $col_type != 'BLOB' && $col_type != 'CLOB' ) {
-                       $val = null;
-               }
-
-               if ( $val === 'NULL' ) {
-                       $val = null;
-               }
-
-               if ( $val === null ) {
-                       if (
-                               $col_info != false &&
-                               $col_info->isNullable() == 0 &&
-                               $col_info->defaultValue() != null
-                       ) {
-                               $bind .= 'DEFAULT';
-                       } else {
-                               $bind .= 'NULL';
-                       }
-               } else {
-                       $bind .= ':' . $col;
-               }
-
-               return $bind;
-       }
-
-       /**
-        * @param string $table
-        * @param array $row
-        * @param string $fname
-        * @return bool
-        * @throws DBUnexpectedError
-        */
-       private function insertOneRow( $table, $row, $fname ) {
-               $table = $this->tableName( $table );
-               // "INSERT INTO tables (a, b, c)"
-               $sql = "INSERT INTO " . $table . " (" . implode( ',', array_keys( $row ) ) . ')';
-               $sql .= " VALUES (";
-
-               // for each value, append ":key"
-               $first = true;
-               foreach ( $row as $col => &$val ) {
-                       if ( !$first ) {
-                               $sql .= ', ';
-                       } else {
-                               $first = false;
-                       }
-                       if ( $this->isQuotedIdentifier( $val ) ) {
-                               $sql .= $this->removeIdentifierQuotes( $val );
-                               unset( $row[$col] );
-                       } else {
-                               $sql .= $this->fieldBindStatement( $table, $col, $val );
-                       }
-               }
-               $sql .= ')';
-
-               $this->mLastResult = $stmt = oci_parse( $this->conn, $sql );
-               if ( $stmt === false ) {
-                       $e = oci_error( $this->conn );
-                       $this->reportQueryError( $e['message'], $e['code'], $sql, $fname );
-
-                       return false;
-               }
-               foreach ( $row as $col => &$val ) {
-                       $col_info = $this->fieldInfoMulti( $table, $col );
-                       $col_type = $col_info != false ? $col_info->type() : 'CONSTANT';
-
-                       if ( $val === null ) {
-                               // do nothing ... null was inserted in statement creation
-                       } elseif ( $col_type != 'BLOB' && $col_type != 'CLOB' ) {
-                               if ( is_object( $val ) ) {
-                                       $val = $val->fetch();
-                               }
-
-                               // backward compatibility
-                               if (
-                                       preg_match( '/^timestamp.*/i', $col_type ) == 1 &&
-                                       strtolower( $val ) == 'infinity'
-                               ) {
-                                       $val = $this->getInfinity();
-                               }
-
-                               $val = $this->getVerifiedUTF8( $val );
-                               if ( oci_bind_by_name( $stmt, ":$col", $val, -1, SQLT_CHR ) === false ) {
-                                       $e = oci_error( $stmt );
-                                       $this->reportQueryError( $e['message'], $e['code'], $sql, $fname );
-
-                                       return false;
-                               }
-                       } else {
-                               /** @var OCI_Lob[] $lob */
-                               $lob[$col] = oci_new_descriptor( $this->conn, OCI_D_LOB );
-                               if ( $lob[$col] === false ) {
-                                       $e = oci_error( $stmt );
-                                       throw new DBUnexpectedError(
-                                               $this,
-                                               "Cannot create LOB descriptor: " . $e['message']
-                                       );
-                               }
-
-                               if ( is_object( $val ) ) {
-                                       $val = $val->fetch();
-                               }
-
-                               if ( $col_type == 'BLOB' ) {
-                                       $lob[$col]->writeTemporary( $val, OCI_TEMP_BLOB );
-                                       oci_bind_by_name( $stmt, ":$col", $lob[$col], -1, OCI_B_BLOB );
-                               } else {
-                                       $lob[$col]->writeTemporary( $val, OCI_TEMP_CLOB );
-                                       oci_bind_by_name( $stmt, ":$col", $lob[$col], -1, OCI_B_CLOB );
-                               }
-                       }
-               }
-
-               Wikimedia\suppressWarnings();
-
-               if ( oci_execute( $stmt, $this->execFlags() ) === false ) {
-                       $e = oci_error( $stmt );
-                       if ( !$this->ignoreDupValOnIndex || $e['code'] != '1' ) {
-                               $this->reportQueryError( $e['message'], $e['code'], $sql, $fname );
-
-                               return false;
-                       } else {
-                               $this->mAffectedRows = oci_num_rows( $stmt );
-                       }
-               } else {
-                       $this->mAffectedRows = oci_num_rows( $stmt );
-               }
-
-               Wikimedia\restoreWarnings();
-
-               if ( isset( $lob ) ) {
-                       foreach ( $lob as $lob_v ) {
-                               $lob_v->free();
-                       }
-               }
-
-               if ( !$this->trxLevel() ) {
-                       oci_commit( $this->conn );
-               }
-
-               return oci_free_statement( $stmt );
-       }
-
-       function nativeInsertSelect( $destTable, $srcTable, $varMap, $conds, $fname = __METHOD__,
-               $insertOptions = [], $selectOptions = [], $selectJoinConds = []
-       ) {
-               $destTable = $this->tableName( $destTable );
-
-               $sequenceData = $this->getSequenceData( $destTable );
-               if ( $sequenceData !== false &&
-                       !isset( $varMap[$sequenceData['column']] )
-               ) {
-                       $varMap[$sequenceData['column']] =
-                               'GET_SEQUENCE_VALUE(\'' . $sequenceData['sequence'] . '\')';
-               }
-
-               // count-alias subselect fields to avoid abigious definition errors
-               $i = 0;
-               foreach ( $varMap as &$val ) {
-                       $val .= ' field' . $i;
-                       $i++;
-               }
-
-               $selectSql = $this->selectSQLText(
-                       $srcTable,
-                       array_values( $varMap ),
-                       $conds,
-                       $fname,
-                       $selectOptions,
-                       $selectJoinConds
-               );
-
-               $sql = "INSERT INTO $destTable (" .
-                       implode( ',', array_keys( $varMap ) ) . ') ' . $selectSql;
-
-               if ( in_array( 'IGNORE', $insertOptions ) ) {
-                       $this->ignoreDupValOnIndex = true;
-               }
-
-               $this->query( $sql, $fname );
-
-               if ( in_array( 'IGNORE', $insertOptions ) ) {
-                       $this->ignoreDupValOnIndex = false;
-               }
-       }
-
-       public function upsert( $table, array $rows, $uniqueIndexes, array $set,
-               $fname = __METHOD__
-       ) {
-               if ( $rows === [] ) {
-                       return true; // nothing to do
-               }
-
-               if ( !is_array( reset( $rows ) ) ) {
-                       $rows = [ $rows ];
-               }
-
-               $sequenceData = $this->getSequenceData( $table );
-               if ( $sequenceData !== false ) {
-                       // add sequence column to each list of columns, when not set
-                       foreach ( $rows as &$row ) {
-                               if ( !isset( $row[$sequenceData['column']] ) ) {
-                                       $row[$sequenceData['column']] =
-                                               $this->addIdentifierQuotes( 'GET_SEQUENCE_VALUE(\'' .
-                                                       $sequenceData['sequence'] . '\')' );
-                               }
-                       }
-               }
-
-               return parent::upsert( $table, $rows, $uniqueIndexes, $set, $fname );
-       }
-
-       public function tableName( $name, $format = 'quoted' ) {
-               // Replace reserved words with better ones
-               $name = $this->remappedTableName( $name );
-
-               return strtoupper( parent::tableName( $name, $format ) );
-       }
-
-       /**
-        * @param string $name
-        * @return string Value of $name or remapped name if $name is a reserved keyword
-        */
-       public function remappedTableName( $name ) {
-               return $this->keywordTableMap[$name] ?? $name;
-       }
-
-       function tableNameInternal( $name ) {
-               $name = $this->tableName( $name );
-
-               return preg_replace( '/.*\.(.*)/', '$1', $name );
-       }
-
-       /**
-        * Return sequence_name if table has a sequence
-        *
-        * @param string $table
-        * @return string[]|bool
-        */
-       private function getSequenceData( $table ) {
-               if ( $this->sequenceData == null ) {
-                       $dbname = $this->currentDomain->getDatabase();
-                       $prefix = $this->currentDomain->getTablePrefix();
-                       // See https://docs.oracle.com/cd/B19306_01/server.102/b14200/functions040.htm
-                       $decodeArgs = [ 'atc.table_name' ]; // the switch
-                       foreach ( $this->keywordTableMap as $reserved => $alternative ) {
-                               $search = strtoupper( $prefix . $alternative ); // case
-                               $replace = strtoupper( $prefix . $reserved ); // result
-                               $decodeArgs[] = $this->addQuotes( $search );
-                               $decodeArgs[] = $this->addQuotes( $replace );
-                       }
-                       $decodeArgs[] = [ 'atc.table_name' ]; // default
-                       $decodeArgs = implode( ', ', $decodeArgs );
-
-                       $result = $this->doQuery(
-                               "SELECT lower(asq.sequence_name), lower(atc.table_name), lower(atc.column_name)
-                               FROM all_sequences asq, all_tab_columns atc
-                               WHERE decode({$decodeArgs}) || '_' ||
-                               atc.column_name || '_SEQ' = '{$prefix}' || asq.sequence_name
-                               AND asq.sequence_owner = upper('{$dbname}')
-                               AND atc.owner = upper('{$dbname}')"
-                       );
-
-                       while ( ( $row = $result->fetchRow() ) !== false ) {
-                               $this->sequenceData[$row[1]] = [
-                                       'sequence' => $row[0],
-                                       'column' => $row[2]
-                               ];
-                       }
-               }
-               $table = strtolower( $this->removeIdentifierQuotes( $this->tableName( $table ) ) );
-
-               return $this->sequenceData[$table] ?? false;
-       }
-
-       /**
-        * Returns the size of a text field, or -1 for "unlimited"
-        *
-        * @param string $table
-        * @param string $field
-        * @return mixed
-        */
-       function textFieldSize( $table, $field ) {
-               $fieldInfoData = $this->fieldInfo( $table, $field );
-
-               return $fieldInfoData->maxLength();
-       }
-
-       function limitResult( $sql, $limit, $offset = false ) {
-               if ( $offset === false ) {
-                       $offset = 0;
-               }
-
-               return "SELECT * FROM ($sql) WHERE rownum >= (1 + $offset) AND rownum < (1 + $limit + $offset)";
-       }
-
-       function encodeBlob( $b ) {
-               return new Blob( $b );
-       }
-
-       function unionQueries( $sqls, $all ) {
-               $glue = ' UNION ALL ';
-
-               return 'SELECT * ' . ( $all ? '' : '/* UNION_UNIQUE */ ' ) .
-                       'FROM (' . implode( $glue, $sqls ) . ')';
-       }
-
-       function wasDeadlock() {
-               return $this->lastErrno() == 'OCI-00060';
-       }
-
-       function duplicateTableStructure( $oldName, $newName, $temporary = false,
-               $fname = __METHOD__
-       ) {
-               $temporary = $temporary ? 'TRUE' : 'FALSE';
-               $tablePrefix = $this->currentDomain->getTablePrefix();
-
-               $newName = strtoupper( $newName );
-               $oldName = strtoupper( $oldName );
-
-               $tabName = substr( $newName, strlen( $tablePrefix ) );
-               $oldPrefix = substr( $oldName, 0, strlen( $oldName ) - strlen( $tabName ) );
-               $newPrefix = strtoupper( $tablePrefix );
-
-               return $this->doQuery( "BEGIN DUPLICATE_TABLE( '$tabName', " .
-                       "'$oldPrefix', '$newPrefix', $temporary ); END;" );
-       }
-
-       function listTables( $prefix = null, $fname = __METHOD__ ) {
-               $listWhere = '';
-               if ( !empty( $prefix ) ) {
-                       $listWhere = ' AND table_name LIKE \'' . strtoupper( $prefix ) . '%\'';
-               }
-
-               $owner = strtoupper( $this->getDBname() );
-               $result = $this->doQuery( "SELECT table_name FROM all_tables " .
-                       "WHERE owner='$owner' AND table_name NOT LIKE '%!_IDX\$_' ESCAPE '!' $listWhere" );
-
-               // dirty code ... i know
-               $endArray = [];
-               $endArray[] = strtoupper( $prefix . 'MWUSER' );
-               $endArray[] = strtoupper( $prefix . 'PAGE' );
-               $endArray[] = strtoupper( $prefix . 'IMAGE' );
-               $fixedOrderTabs = $endArray;
-               while ( ( $row = $result->fetchRow() ) !== false ) {
-                       if ( !in_array( $row['table_name'], $fixedOrderTabs ) ) {
-                               $endArray[] = $row['table_name'];
-                       }
-               }
-
-               return $endArray;
-       }
-
-       public function dropTable( $tableName, $fName = __METHOD__ ) {
-               $tableName = $this->tableName( $tableName );
-               if ( !$this->tableExists( $tableName ) ) {
-                       return false;
-               }
-
-               return $this->doQuery( "DROP TABLE $tableName CASCADE CONSTRAINTS PURGE" );
-       }
-
-       public function timestamp( $ts = 0 ) {
-               $t = new ConvertibleTimestamp( $ts );
-               // Let errors bubble up to avoid putting garbage in the DB
-               return $t->getTimestamp( TS_ORACLE );
-       }
-
-       /**
-        * Return aggregated value function call
-        *
-        * @param array $valuedata
-        * @param string $valuename
-        * @return mixed
-        */
-       public function aggregateValue( $valuedata, $valuename = 'value' ) {
-               return $valuedata;
-       }
-
-       /**
-        * @return string Wikitext of a link to the server software's web site
-        */
-       public function getSoftwareLink() {
-               return '[{{int:version-db-oracle-url}} Oracle]';
-       }
-
-       /**
-        * @return string Version information from the database
-        */
-       function getServerVersion() {
-               // better version number, fallback on driver
-               $rset = $this->doQuery(
-                       'SELECT version FROM product_component_version ' .
-                               'WHERE UPPER(product) LIKE \'ORACLE DATABASE%\''
-               );
-               $row = $rset->fetchRow();
-               if ( !$row ) {
-                       return oci_server_version( $this->conn );
-               }
-
-               return $row['version'];
-       }
-
-       /**
-        * Query whether a given index exists
-        * @param string $table
-        * @param string $index
-        * @param string $fname
-        * @return bool
-        */
-       function indexExists( $table, $index, $fname = __METHOD__ ) {
-               $table = $this->tableName( $table );
-               $table = strtoupper( $this->removeIdentifierQuotes( $table ) );
-               $index = strtoupper( $index );
-               $owner = strtoupper( $this->getDBname() );
-               $sql = "SELECT 1 FROM all_indexes WHERE owner='$owner' AND index_name='{$table}_{$index}'";
-               $res = $this->doQuery( $sql );
-               if ( $res ) {
-                       $count = $res->numRows();
-                       $res->free();
-               } else {
-                       $count = 0;
-               }
-
-               return $count != 0;
-       }
-
-       /**
-        * Query whether a given table exists (in the given schema, or the default mw one if not given)
-        * @param string $table
-        * @param string $fname
-        * @return bool
-        */
-       function tableExists( $table, $fname = __METHOD__ ) {
-               $table = $this->tableName( $table );
-               $table = $this->addQuotes( strtoupper( $this->removeIdentifierQuotes( $table ) ) );
-               $owner = $this->addQuotes( strtoupper( $this->getDBname() ) );
-               $sql = "SELECT 1 FROM all_tables WHERE owner=$owner AND table_name=$table";
-               $res = $this->doQuery( $sql );
-               if ( $res && $res->numRows() > 0 ) {
-                       $exists = true;
-               } else {
-                       $exists = false;
-               }
-
-               $res->free();
-
-               return $exists;
-       }
-
-       /**
-        * Function translates mysql_fetch_field() functionality on ORACLE.
-        * Caching is present for reducing query time.
-        * For internal calls. Use fieldInfo for normal usage.
-        * Returns false if the field doesn't exist
-        *
-        * @param array|string $table
-        * @param string $field
-        * @return ORAField|ORAResult|false
-        */
-       private function fieldInfoMulti( $table, $field ) {
-               $field = strtoupper( $field );
-               if ( is_array( $table ) ) {
-                       $table = array_map( [ $this, 'tableNameInternal' ], $table );
-                       $tableWhere = 'IN (';
-                       foreach ( $table as &$singleTable ) {
-                               $singleTable = $this->removeIdentifierQuotes( $singleTable );
-                               if ( isset( $this->mFieldInfoCache["$singleTable.$field"] ) ) {
-                                       return $this->mFieldInfoCache["$singleTable.$field"];
-                               }
-                               $tableWhere .= '\'' . $singleTable . '\',';
-                       }
-                       $tableWhere = rtrim( $tableWhere, ',' ) . ')';
-               } else {
-                       $table = $this->removeIdentifierQuotes( $this->tableNameInternal( $table ) );
-                       if ( isset( $this->mFieldInfoCache["$table.$field"] ) ) {
-                               return $this->mFieldInfoCache["$table.$field"];
-                       }
-                       $tableWhere = '= \'' . $table . '\'';
-               }
-
-               $fieldInfoStmt = oci_parse(
-                       $this->conn,
-                       'SELECT * FROM wiki_field_info_full WHERE table_name ' .
-                               $tableWhere . ' and column_name = \'' . $field . '\''
-               );
-               if ( oci_execute( $fieldInfoStmt, $this->execFlags() ) === false ) {
-                       $e = oci_error( $fieldInfoStmt );
-                       $this->reportQueryError( $e['message'], $e['code'], 'fieldInfo QUERY', __METHOD__ );
-
-                       return false;
-               }
-               $res = new ORAResult( $this, $fieldInfoStmt );
-               if ( $res->numRows() == 0 ) {
-                       if ( is_array( $table ) ) {
-                               foreach ( $table as &$singleTable ) {
-                                       $this->mFieldInfoCache["$singleTable.$field"] = false;
-                               }
-                       } else {
-                               $this->mFieldInfoCache["$table.$field"] = false;
-                       }
-                       $fieldInfoTemp = null;
-               } else {
-                       $fieldInfoTemp = new ORAField( $res->fetchRow() );
-                       $table = $fieldInfoTemp->tableName();
-                       $this->mFieldInfoCache["$table.$field"] = $fieldInfoTemp;
-               }
-               $res->free();
-
-               return $fieldInfoTemp;
-       }
-
-       /**
-        * @throws DBUnexpectedError
-        * @param string $table
-        * @param string $field
-        * @return ORAField
-        */
-       function fieldInfo( $table, $field ) {
-               if ( is_array( $table ) ) {
-                       throw new DBUnexpectedError(
-                               $this,
-                               'DatabaseOracle::fieldInfo called with table array!'
-                       );
-               }
-
-               return $this->fieldInfoMulti( $table, $field );
-       }
-
-       protected function doBegin( $fname = __METHOD__ ) {
-               $this->query( 'SET CONSTRAINTS ALL DEFERRED' );
-       }
-
-       protected function doCommit( $fname = __METHOD__ ) {
-               if ( $this->trxLevel() ) {
-                       $ret = oci_commit( $this->conn );
-                       if ( !$ret ) {
-                               throw new DBUnexpectedError( $this, $this->lastError() );
-                       }
-                       $this->query( 'SET CONSTRAINTS ALL IMMEDIATE' );
-               }
-       }
-
-       protected function doRollback( $fname = __METHOD__ ) {
-               if ( $this->trxLevel() ) {
-                       oci_rollback( $this->conn );
-                       $ignoreErrors = true;
-                       $this->query( 'SET CONSTRAINTS ALL IMMEDIATE', $fname, $ignoreErrors );
-               }
-       }
-
-       function sourceStream(
-               $fp,
-               callable $lineCallback = null,
-               callable $resultCallback = null,
-               $fname = __METHOD__, callable $inputCallback = null
-       ) {
-               $cmd = '';
-               $done = false;
-               $dollarquote = false;
-
-               $replacements = [];
-               // Defines must comply with ^define\s*([^\s=]*)\s*=\s?'\{\$([^\}]*)\}';
-               while ( !feof( $fp ) ) {
-                       if ( $lineCallback ) {
-                               $lineCallback();
-                       }
-                       $line = trim( fgets( $fp, 1024 ) );
-                       $sl = strlen( $line ) - 1;
-
-                       if ( $sl < 0 ) {
-                               continue;
-                       }
-                       if ( $line[0] == '-' && $line[1] == '-' ) {
-                               continue;
-                       }
-
-                       // Allow dollar quoting for function declarations
-                       if ( substr( $line, 0, 8 ) == '/*$mw$*/' ) {
-                               if ( $dollarquote ) {
-                                       $dollarquote = false;
-                                       $line = str_replace( '/*$mw$*/', '', $line ); // remove dollarquotes
-                                       $done = true;
-                               } else {
-                                       $dollarquote = true;
-                               }
-                       } elseif ( !$dollarquote ) {
-                               if ( $line[$sl] == ';' && ( $sl < 2 || $line[$sl - 1] != ';' ) ) {
-                                       $done = true;
-                                       $line = substr( $line, 0, $sl );
-                               }
-                       }
-
-                       if ( $cmd != '' ) {
-                               $cmd .= ' ';
-                       }
-                       $cmd .= "$line\n";
-
-                       if ( $done ) {
-                               $cmd = str_replace( ';;', ";", $cmd );
-                               if ( strtolower( substr( $cmd, 0, 6 ) ) == 'define' ) {
-                                       if ( preg_match( '/^define\s*([^\s=]*)\s*=\s*\'\{\$([^\}]*)\}\'/', $cmd, $defines ) ) {
-                                               $replacements[$defines[2]] = $defines[1];
-                                       }
-                               } else {
-                                       foreach ( $replacements as $mwVar => $scVar ) {
-                                               $cmd = str_replace( '&' . $scVar . '.', '`{$' . $mwVar . '}`', $cmd );
-                                       }
-
-                                       $cmd = $this->replaceVars( $cmd );
-                                       if ( $inputCallback ) {
-                                               $inputCallback( $cmd );
-                                       }
-                                       $res = $this->doQuery( $cmd );
-                                       if ( $resultCallback ) {
-                                               call_user_func( $resultCallback, $res, $this );
-                                       }
-
-                                       if ( $res === false ) {
-                                               $err = $this->lastError();
-
-                                               return "Query \"{$cmd}\" failed with error code \"$err\".\n";
-                                       }
-                               }
-
-                               $cmd = '';
-                               $done = false;
-                       }
-               }
-
-               return true;
-       }
-
-       protected function doSelectDomain( DatabaseDomain $domain ) {
-               if ( $domain->getSchema() !== null ) {
-                       // We use the *database* aspect of $domain for schema, not the domain schema
-                       throw new DBExpectedError(
-                               $this,
-                               __CLASS__ . ": domain '{$domain->getId()}' has a schema component; " .
-                               "the database component is actually interpreted as the Oracle schema."
-                       );
-               }
-
-               $database = $domain->getDatabase();
-               if ( $database === null || $database === $this->user ) {
-                       // Backward compatibility
-                       $this->currentDomain = $domain;
-
-                       return true;
-               }
-
-               // https://docs.oracle.com/javadb/10.8.3.0/ref/rrefsqlj32268.html
-               $encDatabase = $this->addIdentifierQuotes( strtoupper( $database ) );
-               $sql = "ALTER SESSION SET CURRENT_SCHEMA=$encDatabase";
-               $stmt = oci_parse( $this->conn, $sql );
-               Wikimedia\suppressWarnings();
-               $success = oci_execute( $stmt );
-               Wikimedia\restoreWarnings();
-               if ( $success ) {
-                       // Update that domain fields on success (no exception thrown)
-                       $this->currentDomain = $domain;
-               } else {
-                       $e = oci_error( $stmt );
-                       $this->reportQueryError( $e['message'], $e['code'], $sql, __METHOD__ );
-               }
-
-               return true;
-       }
-
-       function strencode( $s ) {
-               return str_replace( "'", "''", $s );
-       }
-
-       function addQuotes( $s ) {
-               return "'" . $this->strencode( $this->getVerifiedUTF8( $s ) ) . "'";
-       }
-
-       public function addIdentifierQuotes( $s ) {
-               if ( !$this->getFlag( DBO_DDLMODE ) ) {
-                       $s = '/*Q*/' . $s;
-               }
-
-               return $s;
-       }
-
-       public function removeIdentifierQuotes( $s ) {
-               return strpos( $s, '/*Q*/' ) === false ? $s : substr( $s, 5 );
-       }
-
-       public function isQuotedIdentifier( $s ) {
-               return strpos( $s, '/*Q*/' ) !== false;
-       }
-
-       private function wrapFieldForWhere( $table, &$col, &$val ) {
-               $col_info = $this->fieldInfoMulti( $table, $col );
-               $col_type = $col_info != false ? $col_info->type() : 'CONSTANT';
-               if ( $col_type == 'CLOB' ) {
-                       $col = 'TO_CHAR(' . $col . ')';
-                       $val = $this->getVerifiedUTF8( $val );
-               } elseif ( $col_type == 'VARCHAR2' ) {
-                       $val = $this->getVerifiedUTF8( $val );
-               }
-       }
-
-       private function wrapConditionsForWhere( $table, $conds, $parentCol = null ) {
-               $conds2 = [];
-               foreach ( $conds as $col => $val ) {
-                       if ( is_array( $val ) ) {
-                               $conds2[$col] = $this->wrapConditionsForWhere( $table, $val, $col );
-                       } else {
-                               if ( is_numeric( $col ) && $parentCol != null ) {
-                                       $this->wrapFieldForWhere( $table, $parentCol, $val );
-                               } else {
-                                       $this->wrapFieldForWhere( $table, $col, $val );
-                               }
-                               $conds2[$col] = $val;
-                       }
-               }
-
-               return $conds2;
-       }
-
-       function selectRow( $table, $vars, $conds, $fname = __METHOD__,
-               $options = [], $join_conds = []
-       ) {
-               if ( is_array( $conds ) ) {
-                       $conds = $this->wrapConditionsForWhere( $table, $conds );
-               }
-
-               return parent::selectRow( $table, $vars, $conds, $fname, $options, $join_conds );
-       }
-
-       /**
-        * Returns an optional USE INDEX clause to go after the table, and a
-        * string to go at the end of the query
-        *
-        * @param array $options An associative array of options to be turned into
-        *   an SQL query, valid keys are listed in the function.
-        * @return array
-        */
-       function makeSelectOptions( $options ) {
-               $preLimitTail = $postLimitTail = '';
-               $startOpts = '';
-
-               $noKeyOptions = [];
-               foreach ( $options as $key => $option ) {
-                       if ( is_numeric( $key ) ) {
-                               $noKeyOptions[$option] = true;
-                       }
-               }
-
-               $preLimitTail .= $this->makeGroupByWithHaving( $options );
-
-               $preLimitTail .= $this->makeOrderBy( $options );
-
-               if ( isset( $noKeyOptions['FOR UPDATE'] ) ) {
-                       $postLimitTail .= ' FOR UPDATE';
-               }
-
-               if ( isset( $noKeyOptions['DISTINCT'] ) || isset( $noKeyOptions['DISTINCTROW'] ) ) {
-                       $startOpts .= 'DISTINCT';
-               }
-
-               if ( isset( $options['USE INDEX'] ) && !is_array( $options['USE INDEX'] ) ) {
-                       $useIndex = $this->useIndexClause( $options['USE INDEX'] );
-               } else {
-                       $useIndex = '';
-               }
-
-               if ( isset( $options['IGNORE INDEX'] ) && !is_array( $options['IGNORE INDEX'] ) ) {
-                       $ignoreIndex = $this->ignoreIndexClause( $options['IGNORE INDEX'] );
-               } else {
-                       $ignoreIndex = '';
-               }
-
-               return [ $startOpts, $useIndex, $preLimitTail, $postLimitTail, $ignoreIndex ];
-       }
-
-       public function delete( $table, $conds, $fname = __METHOD__ ) {
-               global $wgActorTableSchemaMigrationStage;
-
-               if ( is_array( $conds ) ) {
-                       $conds = $this->wrapConditionsForWhere( $table, $conds );
-               }
-               // a hack for deleting pages, users and images (which have non-nullable FKs)
-               // all deletions on these tables have transactions so final failure rollbacks these updates
-               // @todo: Normalize the schema to match MySQL, no special FKs and such
-               $table = $this->tableName( $table );
-               if ( $table == $this->tableName( 'user' ) &&
-                       ( $wgActorTableSchemaMigrationStage & SCHEMA_COMPAT_WRITE_OLD )
-               ) {
-                       $this->update( 'archive', [ 'ar_user' => 0 ],
-                               [ 'ar_user' => $conds['user_id'] ], $fname );
-                       $this->update( 'ipblocks', [ 'ipb_user' => 0 ],
-                               [ 'ipb_user' => $conds['user_id'] ], $fname );
-                       $this->update( 'image', [ 'img_user' => 0 ],
-                               [ 'img_user' => $conds['user_id'] ], $fname );
-                       $this->update( 'oldimage', [ 'oi_user' => 0 ],
-                               [ 'oi_user' => $conds['user_id'] ], $fname );
-                       $this->update( 'filearchive', [ 'fa_deleted_user' => 0 ],
-                               [ 'fa_deleted_user' => $conds['user_id'] ], $fname );
-                       $this->update( 'filearchive', [ 'fa_user' => 0 ],
-                               [ 'fa_user' => $conds['user_id'] ], $fname );
-                       $this->update( 'uploadstash', [ 'us_user' => 0 ],
-                               [ 'us_user' => $conds['user_id'] ], $fname );
-                       $this->update( 'recentchanges', [ 'rc_user' => 0 ],
-                               [ 'rc_user' => $conds['user_id'] ], $fname );
-                       $this->update( 'logging', [ 'log_user' => 0 ],
-                               [ 'log_user' => $conds['user_id'] ], $fname );
-               } elseif ( $table == $this->tableName( 'image' ) ) {
-                       $this->update( 'oldimage', [ 'oi_name' => 0 ],
-                               [ 'oi_name' => $conds['img_name'] ], $fname );
-               }
-
-               return parent::delete( $table, $conds, $fname );
-       }
-
-       /**
-        * @param string $table
-        * @param array $values
-        * @param array $conds
-        * @param string $fname
-        * @param array $options
-        * @return bool
-        * @throws DBUnexpectedError
-        */
-       function update( $table, $values, $conds, $fname = __METHOD__, $options = [] ) {
-               $table = $this->tableName( $table );
-               $opts = $this->makeUpdateOptions( $options );
-               $sql = "UPDATE $opts $table SET ";
-
-               $first = true;
-               foreach ( $values as $col => &$val ) {
-                       $sqlSet = $this->fieldBindStatement( $table, $col, $val, true );
-
-                       if ( !$first ) {
-                               $sqlSet = ', ' . $sqlSet;
-                       } else {
-                               $first = false;
-                       }
-                       $sql .= $sqlSet;
-               }
-
-               if ( $conds !== [] && $conds !== '*' ) {
-                       $conds = $this->wrapConditionsForWhere( $table, $conds );
-                       $sql .= ' WHERE ' . $this->makeList( $conds, LIST_AND );
-               }
-
-               $this->mLastResult = $stmt = oci_parse( $this->conn, $sql );
-               if ( $stmt === false ) {
-                       $e = oci_error( $this->conn );
-                       $this->reportQueryError( $e['message'], $e['code'], $sql, __METHOD__ );
-
-                       return false;
-               }
-               foreach ( $values as $col => &$val ) {
-                       $col_info = $this->fieldInfoMulti( $table, $col );
-                       $col_type = $col_info != false ? $col_info->type() : 'CONSTANT';
-
-                       if ( $val === null ) {
-                               // do nothing ... null was inserted in statement creation
-                       } elseif ( $col_type != 'BLOB' && $col_type != 'CLOB' ) {
-                               if ( is_object( $val ) ) {
-                                       $val = $val->getData();
-                               }
-
-                               if (
-                                       preg_match( '/^timestamp.*/i', $col_type ) == 1 &&
-                                       strtolower( $val ) == 'infinity'
-                               ) {
-                                       $val = '31-12-2030 12:00:00.000000';
-                               }
-
-                               $val = $this->getVerifiedUTF8( $val );
-                               if ( oci_bind_by_name( $stmt, ":$col", $val ) === false ) {
-                                       $e = oci_error( $stmt );
-                                       $this->reportQueryError( $e['message'], $e['code'], $sql, __METHOD__ );
-
-                                       return false;
-                               }
-                       } else {
-                               /** @var OCI_Lob[] $lob */
-                               $lob[$col] = oci_new_descriptor( $this->conn, OCI_D_LOB );
-                               if ( $lob[$col] === false ) {
-                                       $e = oci_error( $stmt );
-                                       throw new DBUnexpectedError(
-                                               $this,
-                                               "Cannot create LOB descriptor: " . $e['message']
-                                       );
-                               }
-
-                               if ( is_object( $val ) ) {
-                                       $val = $val->getData();
-                               }
-
-                               if ( $col_type == 'BLOB' ) {
-                                       $lob[$col]->writeTemporary( $val );
-                                       oci_bind_by_name( $stmt, ":$col", $lob[$col], -1, SQLT_BLOB );
-                               } else {
-                                       $lob[$col]->writeTemporary( $val );
-                                       oci_bind_by_name( $stmt, ":$col", $lob[$col], -1, OCI_B_CLOB );
-                               }
-                       }
-               }
-
-               Wikimedia\suppressWarnings();
-
-               if ( oci_execute( $stmt, $this->execFlags() ) === false ) {
-                       $e = oci_error( $stmt );
-                       if ( !$this->ignoreDupValOnIndex || $e['code'] != '1' ) {
-                               $this->reportQueryError( $e['message'], $e['code'], $sql, __METHOD__ );
-
-                               return false;
-                       } else {
-                               $this->mAffectedRows = oci_num_rows( $stmt );
-                       }
-               } else {
-                       $this->mAffectedRows = oci_num_rows( $stmt );
-               }
-
-               Wikimedia\restoreWarnings();
-
-               if ( isset( $lob ) ) {
-                       foreach ( $lob as $lob_v ) {
-                               $lob_v->free();
-                       }
-               }
-
-               if ( !$this->trxLevel() ) {
-                       oci_commit( $this->conn );
-               }
-
-               return oci_free_statement( $stmt );
-       }
-
-       function bitNot( $field ) {
-               // expecting bit-fields smaller than 4bytes
-               return 'BITNOT(' . $field . ')';
-       }
-
-       function bitAnd( $fieldLeft, $fieldRight ) {
-               return 'BITAND(' . $fieldLeft . ', ' . $fieldRight . ')';
-       }
-
-       function bitOr( $fieldLeft, $fieldRight ) {
-               return 'BITOR(' . $fieldLeft . ', ' . $fieldRight . ')';
-       }
-
-       public function buildGroupConcatField(
-               $delim, $table, $field, $conds = '', $join_conds = []
-       ) {
-               $fld = "LISTAGG($field," . $this->addQuotes( $delim ) . ") WITHIN GROUP (ORDER BY $field)";
-
-               return '(' . $this->selectSQLText( $table, $fld, $conds, null, [], $join_conds ) . ')';
-       }
-
-       public function buildSubstring( $input, $startPosition, $length = null ) {
-               $this->assertBuildSubstringParams( $startPosition, $length );
-               $params = [ $input, $startPosition ];
-               if ( $length !== null ) {
-                       $params[] = $length;
-               }
-               return 'SUBSTR(' . implode( ',', $params ) . ')';
-       }
-
-       /**
-        * @param string $field Field or column to cast
-        * @return string
-        * @since 1.28
-        */
-       public function buildStringCast( $field ) {
-               return 'CAST ( ' . $field . ' AS VARCHAR2 )';
-       }
-
-       public function getInfinity() {
-               return '31-12-2030 12:00:00.000000';
-       }
-
-       /**
-        * @param string $s
-        * @return string
-        */
-       private function getVerifiedUTF8( $s ) {
-               if ( mb_check_encoding( (string)$s, 'UTF-8' ) ) {
-                       return $s; // valid
-               }
-
-               throw new DBUnexpectedError( $this, "Non BLOB/CLOB field must be UTF-8." );
-       }
-}
index ba5da6d..8b94d97 100644 (file)
@@ -447,8 +447,7 @@ abstract class DatabaseInstaller {
         * @return string
         */
        public function getReadableName() {
-               // Messages: config-type-mysql, config-type-postgres, config-type-sqlite,
-               // config-type-oracle
+               // Messages: config-type-mysql, config-type-postgres, config-type-sqlite
                return wfMessage( 'config-type-' . $this->getName() )->text();
        }
 
index 7452b7c..de15456 100644 (file)
@@ -105,8 +105,6 @@ abstract class Installer {
        protected static $dbTypes = [
                'mysql',
                'postgres',
-               'oracle',
-               'mssql',
                'sqlite',
        ];
 
@@ -761,8 +759,7 @@ abstract class Installer {
 
                $allNames = [];
 
-               // Messages: config-type-mysql, config-type-postgres, config-type-oracle,
-               // config-type-sqlite
+               // Messages: config-type-mysql, config-type-postgres, config-type-sqlite
                foreach ( self::getDBTypes() as $name ) {
                        $allNames[] = wfMessage( "config-type-$name" )->text();
                }
diff --git a/includes/installer/MssqlInstaller.php b/includes/installer/MssqlInstaller.php
deleted file mode 100644 (file)
index 8b5ff11..0000000
+++ /dev/null
@@ -1,738 +0,0 @@
-<?php
-/**
- * Microsoft SQL Server-specific installer.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- * @ingroup Deployment
- */
-
-use Wikimedia\Rdbms\Database;
-use Wikimedia\Rdbms\DBQueryError;
-use Wikimedia\Rdbms\DBConnectionError;
-
-/**
- * Class for setting up the MediaWiki database using Microsoft SQL Server.
- *
- * @ingroup Deployment
- * @since 1.23
- */
-class MssqlInstaller extends DatabaseInstaller {
-
-       protected $globalNames = [
-               'wgDBserver',
-               'wgDBname',
-               'wgDBuser',
-               'wgDBpassword',
-               'wgDBmwschema',
-               'wgDBprefix',
-               'wgDBWindowsAuthentication',
-       ];
-
-       protected $internalDefaults = [
-               '_InstallUser' => 'sa',
-               '_InstallWindowsAuthentication' => 'sqlauth',
-               '_WebWindowsAuthentication' => 'sqlauth',
-       ];
-
-       // SQL Server 2005 RTM
-       // @todo Are SQL Express version numbers different?)
-       public static $minimumVersion = '9.00.1399';
-       protected static $notMinimumVersionMessage = 'config-mssql-old';
-
-       // These are schema-level privs
-       // Note: the web user will be created will full permissions if possible, this permission
-       // list is only used if we are unable to grant full permissions.
-       public $webUserPrivs = [
-               'DELETE',
-               'INSERT',
-               'SELECT',
-               'UPDATE',
-               'EXECUTE',
-       ];
-
-       /**
-        * @return string
-        */
-       public function getName() {
-               return 'mssql';
-       }
-
-       /**
-        * @return bool
-        */
-       public function isCompiled() {
-               return self::checkExtension( 'sqlsrv' );
-       }
-
-       /**
-        * @return string
-        */
-       public function getConnectForm() {
-               if ( $this->getVar( '_InstallWindowsAuthentication' ) == 'windowsauth' ) {
-                       $displayStyle = 'display: none;';
-               } else {
-                       $displayStyle = 'display: block;';
-               }
-
-               return $this->getTextBox(
-                       'wgDBserver',
-                       'config-db-host',
-                       [],
-                       $this->parent->getHelpBox( 'config-db-host-help' )
-               ) .
-                       Html::openElement( 'fieldset' ) .
-                       Html::element( 'legend', [], wfMessage( 'config-db-wiki-settings' )->text() ) .
-                       $this->getTextBox( 'wgDBname', 'config-db-name', [ 'dir' => 'ltr' ],
-                               $this->parent->getHelpBox( 'config-db-name-help' ) ) .
-                       $this->getTextBox( 'wgDBmwschema', 'config-db-schema', [ 'dir' => 'ltr' ],
-                               $this->parent->getHelpBox( 'config-db-schema-help' ) ) .
-                       $this->getTextBox( 'wgDBprefix', 'config-db-prefix', [ 'dir' => 'ltr' ],
-                               $this->parent->getHelpBox( 'config-db-prefix-help' ) ) .
-                       Html::closeElement( 'fieldset' ) .
-                       Html::openElement( 'fieldset' ) .
-                       Html::element( 'legend', [], wfMessage( 'config-db-install-account' )->text() ) .
-                       $this->getRadioSet( [
-                               'var' => '_InstallWindowsAuthentication',
-                               'label' => 'config-mssql-auth',
-                               'itemLabelPrefix' => 'config-mssql-',
-                               'values' => [ 'sqlauth', 'windowsauth' ],
-                               'itemAttribs' => [
-                                       'sqlauth' => [
-                                               'class' => 'showHideRadio',
-                                               'rel' => 'dbCredentialBox',
-                                       ],
-                                       'windowsauth' => [
-                                               'class' => 'hideShowRadio',
-                                               'rel' => 'dbCredentialBox',
-                                       ]
-                               ],
-                               'help' => $this->parent->getHelpBox( 'config-mssql-install-auth' )
-                       ] ) .
-                       Html::openElement( 'div', [ 'id' => 'dbCredentialBox', 'style' => $displayStyle ] ) .
-                       $this->getTextBox(
-                               '_InstallUser',
-                               'config-db-username',
-                               [ 'dir' => 'ltr' ],
-                               $this->parent->getHelpBox( 'config-db-install-username' )
-                       ) .
-                       $this->getPasswordBox(
-                               '_InstallPassword',
-                               'config-db-password',
-                               [ 'dir' => 'ltr' ],
-                               $this->parent->getHelpBox( 'config-db-install-password' )
-                       ) .
-                       Html::closeElement( 'div' ) .
-                       Html::closeElement( 'fieldset' );
-       }
-
-       public function submitConnectForm() {
-               // Get variables from the request.
-               $newValues = $this->setVarsFromRequest( [
-                       'wgDBserver',
-                       'wgDBname',
-                       'wgDBmwschema',
-                       'wgDBprefix'
-               ] );
-
-               // Validate them.
-               $status = Status::newGood();
-               if ( !strlen( $newValues['wgDBserver'] ) ) {
-                       $status->fatal( 'config-missing-db-host' );
-               }
-               if ( !strlen( $newValues['wgDBname'] ) ) {
-                       $status->fatal( 'config-missing-db-name' );
-               } elseif ( !preg_match( '/^[a-z0-9_]+$/i', $newValues['wgDBname'] ) ) {
-                       $status->fatal( 'config-invalid-db-name', $newValues['wgDBname'] );
-               }
-               if ( !preg_match( '/^[a-z0-9_]*$/i', $newValues['wgDBmwschema'] ) ) {
-                       $status->fatal( 'config-invalid-schema', $newValues['wgDBmwschema'] );
-               }
-               if ( !preg_match( '/^[a-z0-9_]*$/i', $newValues['wgDBprefix'] ) ) {
-                       $status->fatal( 'config-invalid-db-prefix', $newValues['wgDBprefix'] );
-               }
-               if ( !$status->isOK() ) {
-                       return $status;
-               }
-
-               // Check for blank schema and remap to dbo
-               if ( $newValues['wgDBmwschema'] === '' ) {
-                       $this->setVar( 'wgDBmwschema', 'dbo' );
-               }
-
-               // User box
-               $this->setVarsFromRequest( [
-                       '_InstallUser',
-                       '_InstallPassword',
-                       '_InstallWindowsAuthentication'
-               ] );
-
-               // Try to connect
-               $status = $this->getConnection();
-               if ( !$status->isOK() ) {
-                       return $status;
-               }
-               /**
-                * @var Database $conn
-                */
-               $conn = $status->value;
-
-               // Check version
-               return static::meetsMinimumRequirement( $conn->getServerVersion() );
-       }
-
-       /**
-        * @return Status
-        */
-       public function openConnection() {
-               global $wgDBWindowsAuthentication;
-               $status = Status::newGood();
-               $user = $this->getVar( '_InstallUser' );
-               $password = $this->getVar( '_InstallPassword' );
-
-               if ( $this->getVar( '_InstallWindowsAuthentication' ) == 'windowsauth' ) {
-                       // Use Windows authentication for this connection
-                       $wgDBWindowsAuthentication = true;
-               } else {
-                       $wgDBWindowsAuthentication = false;
-               }
-
-               try {
-                       /** @var DatabaseMssql $db */
-                       $db = Database::factory( 'mssql', [
-                               'host' => $this->getVar( 'wgDBserver' ),
-                               'port' => $this->getVar( 'wgDBport' ),
-                               'user' => $user,
-                               'password' => $password,
-                               'dbname' => false,
-                               'flags' => 0,
-                               'schema' => $this->getVar( 'wgDBmwschema' ),
-                               'tablePrefix' => $this->getVar( 'wgDBprefix' ) ] );
-                       $db->prepareStatements( false );
-                       $db->scrollableCursor( false );
-                       $status->value = $db;
-               } catch ( DBConnectionError $e ) {
-                       $status->fatal( 'config-connection-error', $e->getMessage() );
-               }
-
-               return $status;
-       }
-
-       public function preUpgrade() {
-               global $wgDBuser, $wgDBpassword;
-
-               $status = $this->getConnection();
-               if ( !$status->isOK() ) {
-                       $this->parent->showStatusMessage( $status );
-
-                       return;
-               }
-               /**
-                * @var Database $conn
-                */
-               $conn = $status->value;
-               $conn->selectDB( $this->getVar( 'wgDBname' ) );
-
-               # Normal user and password are selected after this step, so for now
-               # just copy these two
-               $wgDBuser = $this->getVar( '_InstallUser' );
-               $wgDBpassword = $this->getVar( '_InstallPassword' );
-       }
-
-       /**
-        * Return true if the install user can create accounts
-        *
-        * @return bool
-        */
-       public function canCreateAccounts() {
-               $status = $this->getConnection();
-               if ( !$status->isOK() ) {
-                       return false;
-               }
-               /** @var Database $conn */
-               $conn = $status->value;
-
-               // We need the server-level ALTER ANY LOGIN permission to create new accounts
-               $res = $conn->query( "SELECT permission_name FROM sys.fn_my_permissions( NULL, 'SERVER' )" );
-               $serverPrivs = [
-                       'ALTER ANY LOGIN' => false,
-                       'CONTROL SERVER' => false,
-               ];
-
-               foreach ( $res as $row ) {
-                       $serverPrivs[$row->permission_name] = true;
-               }
-
-               if ( !$serverPrivs['ALTER ANY LOGIN'] ) {
-                       return false;
-               }
-
-               // Check to ensure we can grant everything needed as well
-               // We can't actually tell if we have WITH GRANT OPTION for a given permission, so we assume we do
-               // and just check for the permission
-               // https://technet.microsoft.com/en-us/library/ms178569.aspx
-               // The following array sets up which permissions imply whatever permissions we specify
-               $implied = [
-                       // schema           database  server
-                       'DELETE'  => [ 'DELETE', 'CONTROL SERVER' ],
-                       'EXECUTE' => [ 'EXECUTE', 'CONTROL SERVER' ],
-                       'INSERT'  => [ 'INSERT', 'CONTROL SERVER' ],
-                       'SELECT'  => [ 'SELECT', 'CONTROL SERVER' ],
-                       'UPDATE'  => [ 'UPDATE', 'CONTROL SERVER' ],
-               ];
-
-               $grantOptions = array_flip( $this->webUserPrivs );
-
-               // Check for schema and db-level permissions, but only if the schema/db exists
-               $schemaPrivs = $dbPrivs = [
-                       'DELETE' => false,
-                       'EXECUTE' => false,
-                       'INSERT' => false,
-                       'SELECT' => false,
-                       'UPDATE' => false,
-               ];
-
-               $dbPrivs['ALTER ANY USER'] = false;
-
-               if ( $this->databaseExists( $this->getVar( 'wgDBname' ) ) ) {
-                       $conn->selectDB( $this->getVar( 'wgDBname' ) );
-                       $res = $conn->query( "SELECT permission_name FROM sys.fn_my_permissions( NULL, 'DATABASE' )" );
-
-                       foreach ( $res as $row ) {
-                               $dbPrivs[$row->permission_name] = true;
-                       }
-
-                       // If the db exists, we need ALTER ANY USER privs on it to make a new user
-                       if ( !$dbPrivs['ALTER ANY USER'] ) {
-                               return false;
-                       }
-
-                       if ( $this->schemaExists( $this->getVar( 'wgDBmwschema' ) ) ) {
-                               // wgDBmwschema is validated to only contain alphanumeric + underscore, so this is safe
-                               $res = $conn->query( "SELECT permission_name FROM sys.fn_my_permissions( "
-                                       . "'{$this->getVar( 'wgDBmwschema' )}', 'SCHEMA' )" );
-
-                               foreach ( $res as $row ) {
-                                       $schemaPrivs[$row->permission_name] = true;
-                               }
-                       }
-               }
-
-               // Now check all the grants we'll need to be doing to see if we can
-               foreach ( $this->webUserPrivs as $permission ) {
-                       if ( ( isset( $schemaPrivs[$permission] ) && $schemaPrivs[$permission] )
-                                       || ( isset( $dbPrivs[$implied[$permission][0]] )
-                                               && $dbPrivs[$implied[$permission][0]] )
-                                       || ( isset( $serverPrivs[$implied[$permission][1]] )
-                                               && $serverPrivs[$implied[$permission][1]] )
-                       ) {
-                               unset( $grantOptions[$permission] );
-                       }
-               }
-
-               if ( count( $grantOptions ) ) {
-                       // Can't grant everything
-                       return false;
-               }
-
-               return true;
-       }
-
-       /**
-        * @return string
-        */
-       public function getSettingsForm() {
-               if ( $this->canCreateAccounts() ) {
-                       $noCreateMsg = false;
-               } else {
-                       $noCreateMsg = 'config-db-web-no-create-privs';
-               }
-
-               $wrapperStyle = $this->getVar( '_SameAccount' ) ? 'display: none' : '';
-               $displayStyle = $this->getVar( '_WebWindowsAuthentication' ) == 'windowsauth'
-                       ? 'display: none'
-                       : '';
-               $s = Html::openElement( 'fieldset' ) .
-                       Html::element( 'legend', [], wfMessage( 'config-db-web-account' )->text() ) .
-                       $this->getCheckBox(
-                               '_SameAccount', 'config-db-web-account-same',
-                               [ 'class' => 'hideShowRadio', 'rel' => 'dbOtherAccount' ]
-                       ) .
-                       Html::openElement( 'div', [ 'id' => 'dbOtherAccount', 'style' => $wrapperStyle ] ) .
-                       $this->getRadioSet( [
-                               'var' => '_WebWindowsAuthentication',
-                               'label' => 'config-mssql-auth',
-                               'itemLabelPrefix' => 'config-mssql-',
-                               'values' => [ 'sqlauth', 'windowsauth' ],
-                               'itemAttribs' => [
-                                       'sqlauth' => [
-                                               'class' => 'showHideRadio',
-                                               'rel' => 'dbCredentialBox',
-                                       ],
-                                       'windowsauth' => [
-                                               'class' => 'hideShowRadio',
-                                               'rel' => 'dbCredentialBox',
-                                       ]
-                               ],
-                               'help' => $this->parent->getHelpBox( 'config-mssql-web-auth' )
-                       ] ) .
-                       Html::openElement( 'div', [ 'id' => 'dbCredentialBox', 'style' => $displayStyle ] ) .
-                       $this->getTextBox( 'wgDBuser', 'config-db-username' ) .
-                       $this->getPasswordBox( 'wgDBpassword', 'config-db-password' ) .
-                       Html::closeElement( 'div' );
-
-               if ( $noCreateMsg ) {
-                       $s .= $this->parent->getWarningBox( wfMessage( $noCreateMsg )->plain() );
-               } else {
-                       $s .= $this->getCheckBox( '_CreateDBAccount', 'config-db-web-create' );
-               }
-
-               $s .= Html::closeElement( 'div' ) . Html::closeElement( 'fieldset' );
-
-               return $s;
-       }
-
-       /**
-        * @return Status
-        */
-       public function submitSettingsForm() {
-               $this->setVarsFromRequest( [
-                               'wgDBuser',
-                               'wgDBpassword',
-                               '_SameAccount',
-                               '_CreateDBAccount',
-                               '_WebWindowsAuthentication'
-               ] );
-
-               if ( $this->getVar( '_SameAccount' ) ) {
-                       $this->setVar( '_WebWindowsAuthentication', $this->getVar( '_InstallWindowsAuthentication' ) );
-                       $this->setVar( 'wgDBuser', $this->getVar( '_InstallUser' ) );
-                       $this->setVar( 'wgDBpassword', $this->getVar( '_InstallPassword' ) );
-               }
-
-               if ( $this->getVar( '_WebWindowsAuthentication' ) == 'windowsauth' ) {
-                       $this->setVar( 'wgDBuser', '' );
-                       $this->setVar( 'wgDBpassword', '' );
-                       $this->setVar( 'wgDBWindowsAuthentication', true );
-               } else {
-                       $this->setVar( 'wgDBWindowsAuthentication', false );
-               }
-
-               if ( $this->getVar( '_CreateDBAccount' )
-                       && $this->getVar( '_WebWindowsAuthentication' ) == 'sqlauth'
-                       && strval( $this->getVar( 'wgDBpassword' ) ) == ''
-               ) {
-                       return Status::newFatal( 'config-db-password-empty', $this->getVar( 'wgDBuser' ) );
-               }
-
-               // Validate the create checkbox
-               $canCreate = $this->canCreateAccounts();
-               if ( !$canCreate ) {
-                       $this->setVar( '_CreateDBAccount', false );
-                       $create = false;
-               } else {
-                       $create = $this->getVar( '_CreateDBAccount' );
-               }
-
-               if ( !$create ) {
-                       // Test the web account
-                       $user = $this->getVar( 'wgDBuser' );
-                       $password = $this->getVar( 'wgDBpassword' );
-
-                       if ( $this->getVar( '_WebWindowsAuthentication' ) == 'windowsauth' ) {
-                               $user = 'windowsauth';
-                               $password = 'windowsauth';
-                       }
-
-                       try {
-                               Database::factory( 'mssql', [
-                                       'host' => $this->getVar( 'wgDBserver' ),
-                                       'user' => $user,
-                                       'password' => $password,
-                                       'dbname' => false,
-                                       'flags' => 0,
-                                       'tablePrefix' => $this->getVar( 'wgDBprefix' ),
-                                       'schema' => $this->getVar( 'wgDBmwschema' ),
-                               ] );
-                       } catch ( DBConnectionError $e ) {
-                               return Status::newFatal( 'config-connection-error', $e->getMessage() );
-                       }
-               }
-
-               return Status::newGood();
-       }
-
-       public function preInstall() {
-               # Add our user callback to installSteps, right before the tables are created.
-               $callback = [
-                       'name' => 'user',
-                       'callback' => [ $this, 'setupUser' ],
-               ];
-               $this->parent->addInstallStep( $callback, 'tables' );
-       }
-
-       /**
-        * @return Status
-        */
-       public function setupDatabase() {
-               $status = $this->getConnection();
-               if ( !$status->isOK() ) {
-                       return $status;
-               }
-               /** @var Database $conn */
-               $conn = $status->value;
-               $dbName = $this->getVar( 'wgDBname' );
-               $schemaName = $this->getVar( 'wgDBmwschema' );
-               if ( !$this->databaseExists( $dbName ) ) {
-                       $conn->query(
-                               "CREATE DATABASE " . $conn->addIdentifierQuotes( $dbName ),
-                               __METHOD__
-                       );
-               }
-               $conn->selectDB( $dbName );
-               if ( !$this->schemaExists( $schemaName ) ) {
-                       $conn->query(
-                               "CREATE SCHEMA " . $conn->addIdentifierQuotes( $schemaName ),
-                               __METHOD__
-                       );
-               }
-               if ( !$this->catalogExists( $schemaName ) ) {
-                       $conn->query(
-                               "CREATE FULLTEXT CATALOG " . $conn->addIdentifierQuotes( $schemaName ),
-                               __METHOD__
-                       );
-               }
-               $this->setupSchemaVars();
-
-               return $status;
-       }
-
-       /**
-        * @return Status
-        */
-       public function setupUser() {
-               $dbUser = $this->getVar( 'wgDBuser' );
-               if ( $dbUser == $this->getVar( '_InstallUser' )
-                               || ( $this->getVar( '_InstallWindowsAuthentication' ) == 'windowsauth'
-                                       && $this->getVar( '_WebWindowsAuthentication' ) == 'windowsauth' ) ) {
-                       return Status::newGood();
-               }
-               $status = $this->getConnection();
-               if ( !$status->isOK() ) {
-                       return $status;
-               }
-
-               $this->setupSchemaVars();
-               $dbName = $this->getVar( 'wgDBname' );
-               $this->db->selectDB( $dbName );
-               $password = $this->getVar( 'wgDBpassword' );
-               $schemaName = $this->getVar( 'wgDBmwschema' );
-
-               if ( $this->getVar( '_WebWindowsAuthentication' ) == 'windowsauth' ) {
-                       $dbUser = 'windowsauth';
-                       $password = 'windowsauth';
-               }
-
-               if ( $this->getVar( '_CreateDBAccount' ) ) {
-                       $tryToCreate = true;
-               } else {
-                       $tryToCreate = false;
-               }
-
-               $escUser = $this->db->addIdentifierQuotes( $dbUser );
-               $escDb = $this->db->addIdentifierQuotes( $dbName );
-               $escSchema = $this->db->addIdentifierQuotes( $schemaName );
-               $grantableNames = [];
-               if ( $tryToCreate ) {
-                       $escPass = $this->db->addQuotes( $password );
-
-                       if ( !$this->loginExists( $dbUser ) ) {
-                               try {
-                                       $this->db->begin();
-                                       $this->db->selectDB( 'master' );
-                                       $logintype = $this->getVar( '_WebWindowsAuthentication' ) == 'windowsauth'
-                                               ? 'FROM WINDOWS'
-                                               : "WITH PASSWORD = $escPass";
-                                       $this->db->query( "CREATE LOGIN $escUser $logintype" );
-                                       $this->db->selectDB( $dbName );
-                                       $this->db->query( "CREATE USER $escUser FOR LOGIN $escUser WITH DEFAULT_SCHEMA = $escSchema" );
-                                       $this->db->commit();
-                                       $grantableNames[] = $dbUser;
-                               } catch ( DBQueryError $dqe ) {
-                                       $this->db->rollback();
-                                       $status->warning( 'config-install-user-create-failed', $dbUser, $dqe->getMessage() );
-                               }
-                       } elseif ( !$this->userExists( $dbUser ) ) {
-                               try {
-                                       $this->db->begin();
-                                       $this->db->selectDB( $dbName );
-                                       $this->db->query( "CREATE USER $escUser FOR LOGIN $escUser WITH DEFAULT_SCHEMA = $escSchema" );
-                                       $this->db->commit();
-                                       $grantableNames[] = $dbUser;
-                               } catch ( DBQueryError $dqe ) {
-                                       $this->db->rollback();
-                                       $status->warning( 'config-install-user-create-failed', $dbUser, $dqe->getMessage() );
-                               }
-                       } else {
-                               $status->warning( 'config-install-user-alreadyexists', $dbUser );
-                               $grantableNames[] = $dbUser;
-                       }
-               }
-
-               // Try to grant to all the users we know exist or we were able to create
-               $this->db->selectDB( $dbName );
-               if ( $grantableNames ) {
-                       try {
-                               // First try to grant full permissions
-                               $fullPrivArr = [
-                                       'BACKUP DATABASE', 'BACKUP LOG', 'CREATE FUNCTION', 'CREATE PROCEDURE',
-                                       'CREATE TABLE', 'CREATE VIEW', 'CREATE FULLTEXT CATALOG', 'SHOWPLAN'
-                               ];
-                               $fullPrivList = implode( ', ', $fullPrivArr );
-                               $this->db->begin();
-                               $this->db->query( "GRANT $fullPrivList ON DATABASE :: $escDb TO $escUser", __METHOD__ );
-                               $this->db->query( "GRANT CONTROL ON SCHEMA :: $escSchema TO $escUser", __METHOD__ );
-                               $this->db->commit();
-                       } catch ( DBQueryError $dqe ) {
-                               // If that fails, try to grant the limited subset specified in $this->webUserPrivs
-                               try {
-                                       $privList = implode( ', ', $this->webUserPrivs );
-                                       $this->db->rollback();
-                                       $this->db->begin();
-                                       $this->db->query( "GRANT $privList ON SCHEMA :: $escSchema TO $escUser", __METHOD__ );
-                                       $this->db->commit();
-                               } catch ( DBQueryError $dqe ) {
-                                       $this->db->rollback();
-                                       $status->fatal( 'config-install-user-grant-failed', $dbUser, $dqe->getMessage() );
-                               }
-                               // Also try to grant SHOWPLAN on the db, but don't fail if we can't
-                               // (just makes a couple things in mediawiki run slower since
-                               // we have to run SELECT COUNT(*) instead of getting the query plan)
-                               try {
-                                       $this->db->query( "GRANT SHOWPLAN ON DATABASE :: $escDb TO $escUser", __METHOD__ );
-                               } catch ( DBQueryError $dqe ) {
-                               }
-                       }
-               }
-
-               return $status;
-       }
-
-       public function createTables() {
-               $status = parent::createTables();
-
-               // Do last-minute stuff like fulltext indexes (since they can't be inside a transaction)
-               if ( $status->isOK() ) {
-                       $searchindex = $this->db->tableName( 'searchindex' );
-                       $schema = $this->db->addIdentifierQuotes( $this->getVar( 'wgDBmwschema' ) );
-                       try {
-                               $this->db->query( "CREATE FULLTEXT INDEX ON $searchindex (si_title, si_text) "
-                                       . "KEY INDEX si_page ON $schema" );
-                       } catch ( DBQueryError $dqe ) {
-                               $status->fatal( 'config-install-tables-failed', $dqe->getMessage() );
-                       }
-               }
-
-               return $status;
-       }
-
-       public function getGlobalDefaults() {
-               // The default $wgDBmwschema is null, which breaks Postgres and other DBMSes that require
-               // the use of a schema, so we need to set it here
-               return array_merge( parent::getGlobalDefaults(), [
-                       'wgDBmwschema' => 'mediawiki',
-               ] );
-       }
-
-       /**
-        * Try to see if the login exists
-        * @param string $user Username to check
-        * @return bool
-        */
-       private function loginExists( $user ) {
-               $res = $this->db->selectField( 'sys.sql_logins', 1, [ 'name' => $user ] );
-               return (bool)$res;
-       }
-
-       /**
-        * Try to see if the user account exists
-        * We assume we already have the appropriate database selected
-        * @param string $user Username to check
-        * @return bool
-        */
-       private function userExists( $user ) {
-               $res = $this->db->selectField( 'sys.sysusers', 1, [ 'name' => $user ] );
-               return (bool)$res;
-       }
-
-       /**
-        * Try to see if a given database exists
-        * @param string $dbName Database name to check
-        * @return bool
-        */
-       private function databaseExists( $dbName ) {
-               $res = $this->db->selectField( 'sys.databases', 1, [ 'name' => $dbName ] );
-               return (bool)$res;
-       }
-
-       /**
-        * Try to see if a given schema exists
-        * We assume we already have the appropriate database selected
-        * @param string $schemaName Schema name to check
-        * @return bool
-        */
-       private function schemaExists( $schemaName ) {
-               $res = $this->db->selectField( 'sys.schemas', 1, [ 'name' => $schemaName ] );
-               return (bool)$res;
-       }
-
-       /**
-        * Try to see if a given fulltext catalog exists
-        * We assume we already have the appropriate database selected
-        * @param string $catalogName Catalog name to check
-        * @return bool
-        */
-       private function catalogExists( $catalogName ) {
-               $res = $this->db->selectField( 'sys.fulltext_catalogs', 1, [ 'name' => $catalogName ] );
-               return (bool)$res;
-       }
-
-       /**
-        * Get variables to substitute into tables.sql and the SQL patch files.
-        *
-        * @return array
-        */
-       public function getSchemaVars() {
-               return [
-                       'wgDBname' => $this->getVar( 'wgDBname' ),
-                       'wgDBmwschema' => $this->getVar( 'wgDBmwschema' ),
-                       'wgDBuser' => $this->getVar( 'wgDBuser' ),
-                       'wgDBpassword' => $this->getVar( 'wgDBpassword' ),
-               ];
-       }
-
-       public function getLocalSettings() {
-               $schema = LocalSettingsGenerator::escapePhpString( $this->getVar( 'wgDBmwschema' ) );
-               $prefix = LocalSettingsGenerator::escapePhpString( $this->getVar( 'wgDBprefix' ) );
-               $windowsauth = $this->getVar( 'wgDBWindowsAuthentication' ) ? 'true' : 'false';
-
-               return "# MSSQL specific settings
-\$wgDBWindowsAuthentication = {$windowsauth};
-\$wgDBmwschema = \"{$schema}\";
-\$wgDBprefix = \"{$prefix}\";";
-       }
-}
diff --git a/includes/installer/MssqlUpdater.php b/includes/installer/MssqlUpdater.php
deleted file mode 100644 (file)
index b8dc5ff..0000000
+++ /dev/null
@@ -1,199 +0,0 @@
-<?php
-/**
- * Microsoft SQL Server-specific installer.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- * @ingroup Deployment
- */
-
-use Wikimedia\Rdbms\DatabaseMssql;
-
-/**
- * Class for setting up the MediaWiki database using Microsoft SQL Server.
- *
- * @ingroup Deployment
- * @since 1.23
- */
-
-class MssqlUpdater extends DatabaseUpdater {
-
-       /**
-        * @var DatabaseMssql
-        */
-       protected $db;
-
-       protected function getCoreUpdateList() {
-               return [
-                       // 1.23
-                       [ 'addField', 'mwuser', 'user_password_expires', 'patch-user_password_expires.sql' ],
-
-                       // 1.24
-                       [ 'addField', 'page', 'page_lang', 'patch-page_page_lang.sql' ],
-
-                       // 1.25
-                       [ 'dropTable', 'hitcounter' ],
-                       [ 'dropField', 'site_stats', 'ss_total_views', 'patch-drop-ss_total_views.sql' ],
-                       [ 'dropField', 'page', 'page_counter', 'patch-drop-page_counter.sql' ],
-                       // scripts were updated in 1.27 due to SQL errors; retaining old updatekeys so that people
-                       // updating from 1.23->1.25->1.27 do not execute these scripts twice even though the
-                       // updatekeys no longer make sense as they are.
-                       [ 'updateSchema', 'categorylinks', 'cl_type-category_types-ck',
-                               'patch-categorylinks-constraints.sql' ],
-                       [ 'updateSchema', 'filearchive', 'fa_major_mime-major_mime-ck',
-                               'patch-filearchive-constraints.sql' ],
-                       [ 'updateSchema', 'oldimage', 'oi_major_mime-major_mime-ck',
-                               'patch-oldimage-constraints.sql' ],
-                       [ 'updateSchema', 'image', 'img_major_mime-major_mime-ck', 'patch-image-constraints.sql' ],
-                       [ 'updateSchema', 'uploadstash', 'us_media_type-media_type-ck',
-                               'patch-uploadstash-constraints.sql' ],
-
-                       [ 'modifyField', 'image', 'img_major_mime',
-                               'patch-img_major_mime-chemical.sql' ],
-                       [ 'modifyField', 'oldimage', 'oi_major_mime',
-                               'patch-oi_major_mime-chemical.sql' ],
-                       [ 'modifyField', 'filearchive', 'fa_major_mime',
-                               'patch-fa_major_mime-chemical.sql' ],
-
-                       // 1.27
-                       [ 'dropTable', 'msg_resource_links' ],
-                       [ 'dropTable', 'msg_resource' ],
-                       [ 'addField', 'watchlist', 'wl_id', 'patch-watchlist-wl_id.sql' ],
-                       [ 'dropField', 'mwuser', 'user_options', 'patch-drop-user_options.sql' ],
-                       [ 'addTable', 'bot_passwords', 'patch-bot_passwords.sql' ],
-                       [ 'addField', 'pagelinks', 'pl_from_namespace', 'patch-pl_from_namespace.sql' ],
-                       [ 'addField', 'templatelinks', 'tl_from_namespace', 'patch-tl_from_namespace.sql' ],
-                       [ 'addField', 'imagelinks', 'il_from_namespace', 'patch-il_from_namespace.sql' ],
-                       [ 'dropIndex', 'categorylinks', 'cl_collation', 'patch-kill-cl_collation_index.sql' ],
-                       [ 'addIndex', 'categorylinks', 'cl_collation_ext',
-                               'patch-add-cl_collation_ext_index.sql' ],
-                       [ 'dropField', 'recentchanges', 'rc_cur_time', 'patch-drop-rc_cur_time.sql' ],
-                       [ 'addField', 'page_props', 'pp_sortkey', 'patch-pp_sortkey.sql' ],
-                       [ 'updateSchema', 'oldimage', 'oldimage varchar', 'patch-oldimage-schema.sql' ],
-                       [ 'updateSchema', 'filearchive', 'filearchive varchar', 'patch-filearchive-schema.sql' ],
-                       [ 'updateSchema', 'image', 'image varchar', 'patch-image-schema.sql' ],
-                       [ 'updateSchema', 'recentchanges', 'recentchanges-drop-fks',
-                               'patch-recentchanges-drop-fks.sql' ],
-                       [ 'updateSchema', 'logging', 'logging-drop-fks', 'patch-logging-drop-fks.sql' ],
-                       [ 'updateSchema', 'archive', 'archive-drop-fks', 'patch-archive-drop-fks.sql' ],
-
-                       // 1.28
-                       [ 'addIndex', 'recentchanges', 'rc_name_type_patrolled_timestamp',
-                               'patch-add-rc_name_type_patrolled_timestamp_index.sql' ],
-                       [ 'addField', 'change_tag', 'ct_id', 'patch-change_tag-ct_id.sql' ],
-
-                       // 1.29
-                       [ 'addField', 'externallinks', 'el_index_60', 'patch-externallinks-el_index_60.sql' ],
-                       [ 'dropIndex', 'oldimage', 'oi_name_archive_name',
-                               'patch-alter-table-oldimage.sql' ],
-
-                       // 1.30
-                       [ 'modifyField', 'image', 'img_media_type', 'patch-add-3d.sql' ],
-                       [ 'addIndex', 'site_stats', 'PRIMARY', 'patch-site_stats-pk.sql' ],
-
-                       // Should have been in 1.30
-                       [ 'addTable', 'comment', 'patch-comment-table.sql' ],
-                       // This field was added in 1.31, but is put here so it can be used by 'migrateComments'
-                       [ 'addField', 'image', 'img_description_id', 'patch-image-img_description_id.sql' ],
-                       // Should have been in 1.30
-                       [ 'migrateComments' ],
-
-                       // 1.31
-                       [ 'addTable', 'slot_roles', 'patch-slot_roles.sql' ],
-                       [ 'addTable', 'content_models', 'patch-content_models.sql' ],
-                       [ 'addTable', 'content', 'patch-content.sql' ],
-                       [ 'addTable', 'slots', 'patch-slots.sql' ],
-                       [ 'addField', 'slots', 'slot_origin', 'patch-slot-origin.sql' ],
-                       [ 'migrateArchiveText' ],
-                       [ 'addTable', 'actor', 'patch-actor-table.sql' ],
-                       [ 'migrateActors' ],
-                       [ 'modifyField', 'revision', 'rev_text_id', 'patch-rev_text_id-default.sql' ],
-                       [ 'modifyTable', 'site_stats', 'patch-site_stats-modify.sql' ],
-                       [ 'populateArchiveRevId' ],
-                       [ 'modifyField', 'recentchanges', 'rc_patrolled', 'patch-rc_patrolled_type.sql' ],
-                       [ 'addIndex', 'recentchanges', 'rc_namespace_title_timestamp',
-                               'patch-recentchanges-nttindex.sql' ],
-
-                       // 1.32
-                       [ 'addTable', 'change_tag_def', 'patch-change_tag_def.sql' ],
-                       [ 'populateExternallinksIndex60' ],
-                       [ 'modifyfield', 'externallinks', 'el_index_60',
-                               'patch-externallinks-el_index_60-drop-default.sql' ],
-                       [ 'runMaintenance', DeduplicateArchiveRevId::class, 'maintenance/deduplicateArchiveRevId.php' ],
-                       [ 'addField', 'change_tag', 'ct_tag_id', 'patch-change_tag-tag_id.sql' ],
-                       [ 'addIndex', 'archive', 'ar_revid_uniq', 'patch-archive-ar_rev_id-unique.sql' ],
-                       [ 'populateContentTables' ],
-                       [ 'addIndex', 'logging', 'log_type_action', 'patch-logging-log-type-action-index.sql' ],
-                       [ 'dropIndex', 'logging', 'type_action', 'patch-logging-drop-type-action-index.sql' ],
-                       [ 'addIndex', 'interwiki', 'PRIMARY', 'patch-interwiki-pk.sql' ],
-                       [ 'addIndex', 'protected_titles', 'PRIMARY', 'patch-protected_titles-pk.sql' ],
-                       [ 'addIndex', 'page_props', 'PRIMARY', 'patch-page_props-pk.sql' ],
-                       [ 'addIndex', 'site_identifiers', 'PRIMARY', 'patch-site_identifiers-pk.sql' ],
-                       [ 'addIndex', 'recentchanges', 'rc_this_oldid', 'patch-recentchanges-rc_this_oldid-index.sql' ],
-                       [ 'dropTable', 'transcache' ],
-                       [ 'runMaintenance', PopulateChangeTagDef::class, 'maintenance/populateChangeTagDef.php' ],
-                       [ 'addIndex', 'change_tag', 'change_tag_rc_tag_id',
-                               'patch-change_tag-change_tag_rc_tag_id.sql' ],
-                       [ 'addField', 'ipblocks', 'ipb_sitewide', 'patch-ipb_sitewide.sql' ],
-                       [ 'addTable', 'ipblocks_restrictions', 'patch-ipblocks_restrictions-table.sql' ],
-                       [ 'migrateImageCommentTemp' ],
-
-                       // 1.33
-                       [ 'dropField', 'change_tag', 'ct_tag', 'patch-drop-ct_tag.sql' ],
-                       [ 'dropTable', 'valid_tag' ],
-                       [ 'dropTable', 'tag_summary' ],
-                       [ 'dropField', 'protected_titles', 'pt_reason', 'patch-drop-comment-fields.sql' ],
-               ];
-       }
-
-       protected function applyPatch( $path, $isFullPath = false, $msg = null ) {
-               $prevScroll = $this->db->scrollableCursor( false );
-               $prevPrep = $this->db->prepareStatements( false );
-               parent::applyPatch( $path, $isFullPath, $msg );
-               $this->db->scrollableCursor( $prevScroll );
-               $this->db->prepareStatements( $prevPrep );
-               return true;
-       }
-
-       /**
-        * General schema update for a table that touches more than one field or requires
-        * destructive actions (such as dropping and recreating the table). NOTE: Usage of
-        * this function is highly discouraged, use it's successor DatabaseUpdater::modifyTable
-        * instead.
-        *
-        * @param string $table
-        * @param string $updatekey
-        * @param string $patch
-        * @param bool $fullpath
-        * @return bool
-        */
-       protected function updateSchema( $table, $updatekey, $patch, $fullpath = false ) {
-               if ( !$this->db->tableExists( $table, __METHOD__ ) ) {
-                       $this->output( "...$table table does not exist, skipping schema update patch.\n" );
-               } elseif ( $this->updateRowExists( $updatekey ) ) {
-                       $this->output( "...$table already had schema updated by $patch.\n" );
-               } else {
-                       $apply = $this->applyPatch( $patch, $fullpath, "Updating schema of table $table" );
-                       if ( $apply ) {
-                               $this->insertUpdateRow( $updatekey );
-                       }
-                       return $apply;
-               }
-
-               return true;
-       }
-}
diff --git a/includes/installer/OracleInstaller.php b/includes/installer/OracleInstaller.php
deleted file mode 100644 (file)
index 1a4e0f7..0000000
+++ /dev/null
@@ -1,340 +0,0 @@
-<?php
-/**
- * Oracle-specific installer.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- * @ingroup Deployment
- */
-
-use Wikimedia\Rdbms\Database;
-use Wikimedia\Rdbms\DBConnectionError;
-
-/**
- * Class for setting up the MediaWiki database using Oracle.
- *
- * @ingroup Deployment
- * @since 1.17
- */
-class OracleInstaller extends DatabaseInstaller {
-
-       protected $globalNames = [
-               'wgDBserver',
-               'wgDBname',
-               'wgDBuser',
-               'wgDBpassword',
-               'wgDBprefix',
-       ];
-
-       protected $internalDefaults = [
-               '_OracleDefTS' => 'USERS',
-               '_OracleTempTS' => 'TEMP',
-               '_InstallUser' => 'SYSTEM',
-       ];
-
-       public static $minimumVersion = '9.0.1'; // 9iR1
-       protected static $notMinimumVersionMessage = 'config-oracle-old';
-
-       protected $connError = null;
-
-       public function getName() {
-               return 'oracle';
-       }
-
-       public function isCompiled() {
-               return self::checkExtension( 'oci8' );
-       }
-
-       public function getConnectForm() {
-               if ( $this->getVar( 'wgDBserver' ) == 'localhost' ) {
-                       $this->parent->setVar( 'wgDBserver', '' );
-               }
-
-               return $this->getTextBox(
-                       'wgDBserver',
-                       'config-db-host-oracle',
-                       [],
-                       $this->parent->getHelpBox( 'config-db-host-oracle-help' )
-               ) .
-                       Html::openElement( 'fieldset' ) .
-                       Html::element( 'legend', [], wfMessage( 'config-db-wiki-settings' )->text() ) .
-                       $this->getTextBox( 'wgDBprefix', 'config-db-prefix' ) .
-                       $this->getTextBox( '_OracleDefTS', 'config-oracle-def-ts' ) .
-                       $this->getTextBox(
-                               '_OracleTempTS',
-                               'config-oracle-temp-ts',
-                               [],
-                               $this->parent->getHelpBox( 'config-db-oracle-help' )
-                       ) .
-                       Html::closeElement( 'fieldset' ) .
-                       $this->parent->getWarningBox( wfMessage( 'config-db-account-oracle-warn' )->text() ) .
-                       $this->getInstallUserBox() .
-                       $this->getWebUserBox();
-       }
-
-       public function submitInstallUserBox() {
-               parent::submitInstallUserBox();
-               $this->parent->setVar( '_InstallDBname', $this->getVar( '_InstallUser' ) );
-
-               return Status::newGood();
-       }
-
-       public function submitConnectForm() {
-               // Get variables from the request
-               $newValues = $this->setVarsFromRequest( [
-                       'wgDBserver',
-                       'wgDBprefix',
-                       'wgDBuser',
-                       'wgDBpassword'
-               ] );
-               $this->parent->setVar( 'wgDBname', $this->getVar( 'wgDBuser' ) );
-
-               // Validate them
-               $status = Status::newGood();
-               if ( !strlen( $newValues['wgDBserver'] ) ) {
-                       $status->fatal( 'config-missing-db-server-oracle' );
-               } elseif ( !self::checkConnectStringFormat( $newValues['wgDBserver'] ) ) {
-                       $status->fatal( 'config-invalid-db-server-oracle', $newValues['wgDBserver'] );
-               }
-               if ( !preg_match( '/^[a-zA-Z0-9_]*$/', $newValues['wgDBprefix'] ) ) {
-                       $status->fatal( 'config-invalid-schema', $newValues['wgDBprefix'] );
-               }
-               if ( !$status->isOK() ) {
-                       return $status;
-               }
-
-               // Submit user box
-               $status = $this->submitInstallUserBox();
-               if ( !$status->isOK() ) {
-                       return $status;
-               }
-
-               // Try to connect trough multiple scenarios
-               // Scenario 1: Install with a manually created account
-               $status = $this->getConnection();
-               if ( !$status->isOK() ) {
-                       if ( $this->connError == 28009 ) {
-                               // _InstallUser seems to be a SYSDBA
-                               // Scenario 2: Create user with SYSDBA and install with new user
-                               $status = $this->submitWebUserBox();
-                               if ( !$status->isOK() ) {
-                                       return $status;
-                               }
-                               $status = $this->openSYSDBAConnection();
-                               if ( !$status->isOK() ) {
-                                       return $status;
-                               }
-                               if ( !$this->getVar( '_CreateDBAccount' ) ) {
-                                       $status->fatal( 'config-db-sys-create-oracle' );
-                               }
-                       } else {
-                               return $status;
-                       }
-               } else {
-                       // check for web user credentials
-                       // Scenario 3: Install with a priviliged user but use a restricted user
-                       $statusIS3 = $this->submitWebUserBox();
-                       if ( !$statusIS3->isOK() ) {
-                               return $statusIS3;
-                       }
-               }
-
-               /**
-                * @var Database $conn
-                */
-               $conn = $status->value;
-
-               // Check version
-               $status->merge( static::meetsMinimumRequirement( $conn->getServerVersion() ) );
-
-               return $status;
-       }
-
-       public function openConnection() {
-               return $this->doOpenConnection();
-       }
-
-       public function openSYSDBAConnection() {
-               return $this->doOpenConnection( DatabaseOracle::DBO_SYSDBA );
-       }
-
-       /**
-        * @param int $flags
-        * @return Status Status with DatabaseOracle or null as the value
-        */
-       private function doOpenConnection( $flags = 0 ) {
-               $status = Status::newGood();
-               try {
-                       $db = Database::factory(
-                               'oracle',
-                               [
-                                       'host' => $this->getVar( 'wgDBserver' ),
-                                       'user' => $this->getVar( '_InstallUser' ),
-                                       'password' => $this->getVar( '_InstallPassword' ),
-                                       'dbname' => $this->getVar( '_InstallDBname' ),
-                                       'tablePrefix' => $this->getVar( 'wgDBprefix' ),
-                                       'flags' => $flags
-                               ]
-                       );
-                       $status->value = $db;
-               } catch ( DBConnectionError $e ) {
-                       $this->connError = $e->db->lastErrno();
-                       $status->fatal( 'config-connection-error', $e->getMessage() );
-               }
-
-               return $status;
-       }
-
-       public function needsUpgrade() {
-               $tempDBname = $this->getVar( 'wgDBname' );
-               $this->parent->setVar( 'wgDBname', $this->getVar( 'wgDBuser' ) );
-               $retVal = parent::needsUpgrade();
-               $this->parent->setVar( 'wgDBname', $tempDBname );
-
-               return $retVal;
-       }
-
-       public function preInstall() {
-               # Add our user callback to installSteps, right before the tables are created.
-               $callback = [
-                       'name' => 'user',
-                       'callback' => [ $this, 'setupUser' ]
-               ];
-               $this->parent->addInstallStep( $callback, 'database' );
-       }
-
-       public function setupDatabase() {
-               $status = Status::newGood();
-
-               return $status;
-       }
-
-       public function setupUser() {
-               global $IP;
-
-               if ( !$this->getVar( '_CreateDBAccount' ) ) {
-                       return Status::newGood();
-               }
-
-               // normaly only SYSDBA users can create accounts
-               $status = $this->openSYSDBAConnection();
-               if ( !$status->isOK() ) {
-                       if ( $this->connError == 1031 ) {
-                               // insufficient  privileges (looks like a normal user)
-                               $status = $this->openConnection();
-                               if ( !$status->isOK() ) {
-                                       return $status;
-                               }
-                       } else {
-                               return $status;
-                       }
-               }
-
-               $this->db = $status->value;
-               $this->setupSchemaVars();
-
-               if ( !$this->db->selectDB( $this->getVar( 'wgDBuser' ) ) ) {
-                       $this->db->setFlag( DBO_DDLMODE );
-                       $error = $this->db->sourceFile( "$IP/maintenance/oracle/user.sql" );
-                       if ( $error !== true || !$this->db->selectDB( $this->getVar( 'wgDBuser' ) ) ) {
-                               $status->fatal( 'config-install-user-failed', $this->getVar( 'wgDBuser' ), $error );
-                       }
-               } elseif ( $this->db->getFlag( DBO_SYSDBA ) ) {
-                       $status->fatal( 'config-db-sys-user-exists-oracle', $this->getVar( 'wgDBuser' ) );
-               }
-
-               if ( $status->isOK() ) {
-                       // user created or already existing, switching back to a normal connection
-                       // as the new user has all needed privileges to setup the rest of the schema
-                       // i will be using that user as _InstallUser from this point on
-                       $this->db->close();
-                       $this->db = false;
-                       $this->parent->setVar( '_InstallUser', $this->getVar( 'wgDBuser' ) );
-                       $this->parent->setVar( '_InstallPassword', $this->getVar( 'wgDBpassword' ) );
-                       $this->parent->setVar( '_InstallDBname', $this->getVar( 'wgDBuser' ) );
-                       $status = $this->getConnection();
-               }
-
-               return $status;
-       }
-
-       /**
-        * Overload: after this action field info table has to be rebuilt
-        * @return Status
-        */
-       public function createTables() {
-               $this->setupSchemaVars();
-               $this->db->setFlag( DBO_DDLMODE );
-               $this->parent->setVar( 'wgDBname', $this->getVar( 'wgDBuser' ) );
-               $status = parent::createTables();
-               $this->db->clearFlag( DBO_DDLMODE );
-
-               $this->db->query( 'BEGIN fill_wiki_info; END;' );
-
-               return $status;
-       }
-
-       public function getSchemaVars() {
-               $varNames = [
-                       # These variables are used by maintenance/oracle/user.sql
-                       '_OracleDefTS',
-                       '_OracleTempTS',
-                       'wgDBuser',
-                       'wgDBpassword',
-
-                       # These are used by tables.sql
-                       'wgDBprefix',
-               ];
-               $vars = [];
-               foreach ( $varNames as $name ) {
-                       $vars[$name] = $this->getVar( $name );
-               }
-
-               return $vars;
-       }
-
-       public function getLocalSettings() {
-               $prefix = $this->getVar( 'wgDBprefix' );
-
-               return "# Oracle specific settings
-\$wgDBprefix = \"{$prefix}\";
-";
-       }
-
-       /**
-        * Function checks the format of Oracle connect string
-        * The actual validity of the string is checked by attempting to connect
-        *
-        * Regex should be able to validate all connect string formats
-        * [//](host|tns_name)[:port][/service_name][:POOLED]
-        * http://www.orafaq.com/wiki/EZCONNECT
-        *
-        * @since 1.22
-        *
-        * @param string $connect_string
-        *
-        * @return bool Whether the connection string is valid.
-        */
-       public static function checkConnectStringFormat( $connect_string ) {
-               // phpcs:disable Generic.Files.LineLength
-               // @todo Very long regular expression. Make more readable?
-               $isValid = preg_match( '/^[[:alpha:]][\w\-]*(?:\.[[:alpha:]][\w\-]*){0,2}$/', $connect_string ); // TNS name
-               $isValid |= preg_match( '/^(?:\/\/)?[\w\-\.]+(?::[\d]+)?(?:\/(?:[\w\-\.]+(?::(pooled|dedicated|shared))?)?(?:\/[\w\-\.]+)?)?$/', $connect_string ); // EZConnect
-               // phpcs:enable
-               return (bool)$isValid;
-       }
-}
diff --git a/includes/installer/OracleUpdater.php b/includes/installer/OracleUpdater.php
deleted file mode 100644 (file)
index d3a7b13..0000000
+++ /dev/null
@@ -1,374 +0,0 @@
-<?php
-/**
- * Oracle-specific updater.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- * @ingroup Deployment
- */
-
-/**
- * Class for handling updates to Oracle databases.
- *
- * @ingroup Deployment
- * @since 1.17
- */
-class OracleUpdater extends DatabaseUpdater {
-
-       /**
-        * Handle to the database subclass
-        *
-        * @var DatabaseOracle
-        */
-       protected $db;
-
-       protected function getCoreUpdateList() {
-               return [
-                       [ 'disableContentHandlerUseDB' ],
-
-                       // 1.17
-                       [ 'doNamespaceDefaults' ],
-                       [ 'doFKRenameDeferr' ],
-                       [ 'doFunctions17' ],
-                       [ 'doSchemaUpgrade17' ],
-                       [ 'doInsertPage0' ],
-                       [ 'doRemoveNotNullEmptyDefaults' ],
-                       [ 'addTable', 'user_former_groups', 'patch-user_former_groups.sql' ],
-
-                       // 1.18
-                       [ 'addIndex', 'user', 'i02', 'patch-user_email_index.sql' ],
-                       [ 'modifyField', 'user_properties', 'up_property', 'patch-up_property.sql' ],
-                       [ 'addTable', 'uploadstash', 'patch-uploadstash.sql' ],
-                       [ 'doRecentchangesFK2Cascade' ],
-
-                       // 1.19
-                       [ 'addIndex', 'logging', 'i05', 'patch-logging_type_action_index.sql' ],
-                       [ 'addField', 'revision', 'rev_sha1', 'patch-rev_sha1_field.sql' ],
-                       [ 'addField', 'archive', 'ar_sha1', 'patch-ar_sha1_field.sql' ],
-                       [ 'doRemoveNotNullEmptyDefaults2' ],
-                       [ 'addIndex', 'page', 'i03', 'patch-page_redirect_namespace_len.sql' ],
-                       [ 'addField', 'uploadstash', 'us_chunk_inx', 'patch-us_chunk_inx_field.sql' ],
-                       [ 'addField', 'job', 'job_timestamp', 'patch-job_timestamp_field.sql' ],
-                       [ 'addIndex', 'job', 'i02', 'patch-job_timestamp_index.sql' ],
-                       [ 'doPageRestrictionsPKUKFix' ],
-
-                       // 1.20
-                       [ 'addIndex', 'ipblocks', 'i05', 'patch-ipblocks_i05_index.sql' ],
-                       [ 'addIndex', 'revision', 'i05', 'patch-revision_i05_index.sql' ],
-                       [ 'dropField', 'category', 'cat_hidden', 'patch-cat_hidden.sql' ],
-
-                       // 1.21
-                       [ 'addField', 'revision', 'rev_content_format',
-                               'patch-revision-rev_content_format.sql' ],
-                       [ 'addField', 'revision', 'rev_content_model',
-                               'patch-revision-rev_content_model.sql' ],
-                       [ 'addField', 'archive', 'ar_content_format', 'patch-archive-ar_content_format.sql' ],
-                       [ 'addField', 'archive', 'ar_content_model', 'patch-archive-ar_content_model.sql' ],
-                       [ 'addField', 'archive', 'ar_id', 'patch-archive-ar_id.sql' ],
-                       [ 'addField', 'externallinks', 'el_id', 'patch-externallinks-el_id.sql' ],
-                       [ 'addField', 'page', 'page_content_model', 'patch-page-page_content_model.sql' ],
-                       [ 'enableContentHandlerUseDB' ],
-                       [ 'dropField', 'site_stats', 'ss_admins', 'patch-ss_admins.sql' ],
-                       [ 'dropField', 'recentchanges', 'rc_moved_to_title', 'patch-rc_moved.sql' ],
-                       [ 'addTable', 'sites', 'patch-sites.sql' ],
-                       [ 'addField', 'filearchive', 'fa_sha1', 'patch-fa_sha1.sql' ],
-                       [ 'addField', 'job', 'job_token', 'patch-job_token.sql' ],
-                       [ 'addField', 'job', 'job_attempts', 'patch-job_attempts.sql' ],
-                       [ 'addField', 'uploadstash', 'us_props', 'patch-uploadstash-us_props.sql' ],
-                       [ 'modifyField', 'user_groups', 'ug_group', 'patch-ug_group-length-increase-255.sql' ],
-                       [ 'modifyField', 'user_former_groups', 'ufg_group',
-                               'patch-ufg_group-length-increase-255.sql' ],
-
-                       // 1.23
-                       [ 'addIndex', 'logging', 'i06', 'patch-logging_user_text_type_time_index.sql' ],
-                       [ 'addIndex', 'logging', 'i07', 'patch-logging_user_text_time_index.sql' ],
-                       [ 'addField', 'user', 'user_password_expires', 'patch-user_password_expire.sql' ],
-                       [ 'addField', 'page', 'page_links_updated', 'patch-page_links_updated.sql' ],
-                       [ 'addField', 'recentchanges', 'rc_source', 'patch-rc_source.sql' ],
-
-                       // 1.24
-                       [ 'addField', 'page', 'page_lang', 'patch-page-page_lang.sql' ],
-
-                       // 1.25
-                       [ 'dropTable', 'hitcounter' ],
-                       [ 'dropField', 'site_stats', 'ss_total_views', 'patch-drop-ss_total_views.sql' ],
-                       [ 'dropField', 'page', 'page_counter', 'patch-drop-page_counter.sql' ],
-
-                       // 1.27
-                       [ 'dropTable', 'msg_resource_links' ],
-                       [ 'dropTable', 'msg_resource' ],
-                       [ 'addField', 'watchlist', 'wl_id', 'patch-watchlist-wl_id.sql' ],
-
-                       // 1.28
-                       [ 'addIndex', 'recentchanges', 'rc_name_type_patrolled_timestamp',
-                               'patch-add-rc_name_type_patrolled_timestamp_index.sql' ],
-                       [ 'addField', 'change_tag', 'ct_id', 'patch-change_tag-ct_id.sql' ],
-
-                       // 1.29
-                       [ 'addField', 'externallinks', 'el_index_60', 'patch-externallinks-el_index_60.sql' ],
-                       [ 'addField', 'user_groups', 'ug_expiry', 'patch-user_groups-ug_expiry.sql' ],
-
-                       // 1.30
-                       [ 'doAutoIncrementTriggers' ],
-                       [ 'addIndex', 'site_stats', 'PRIMARY', 'patch-site_stats-pk.sql' ],
-
-                       // Should have been in 1.30
-                       [ 'addTable', 'comment', 'patch-comment-table.sql' ],
-                       // This field was added in 1.31, but is put here so it can be used by 'migrateComments'
-                       [ 'addField', 'image', 'img_description_id', 'patch-image-img_description_id.sql' ],
-                       // Should have been in 1.30
-                       [ 'migrateComments' ],
-
-                       // 1.31
-                       [ 'addTable', 'slots', 'patch-slots.sql' ],
-                       [ 'addField', 'slots', 'slot_origin', 'patch-slot-origin.sql' ],
-                       [ 'addTable', 'content', 'patch-content.sql' ],
-                       [ 'addTable', 'slot_roles', 'patch-slot_roles.sql' ],
-                       [ 'addTable', 'content_models', 'patch-content_models.sql' ],
-                       [ 'migrateArchiveText' ],
-                       [ 'addTable', 'actor', 'patch-actor-table.sql' ],
-                       [ 'migrateActors' ],
-                       [ 'modifyTable', 'site_stats', 'patch-site_stats-modify.sql' ],
-                       [ 'populateArchiveRevId' ],
-                       [ 'addIndex', 'recentchanges', 'rc_namespace_title_timestamp',
-                               'patch-recentchanges-nttindex.sql' ],
-
-                       // 1.32
-                       [ 'addTable', 'change_tag_def', 'patch-change_tag_def.sql' ],
-                       [ 'populateExternallinksIndex60' ],
-                       [ 'runMaintenance', DeduplicateArchiveRevId::class, 'maintenance/deduplicateArchiveRevId.php' ],
-                       [ 'addField', 'change_tag', 'ct_tag_id', 'patch-change_tag-tag_id.sql' ],
-                       [ 'addIndex', 'archive', 'ar_revid_uniq', 'patch-archive-ar_rev_id-unique.sql' ],
-                       [ 'populateContentTables' ],
-                       [ 'addIndex', 'recentchanges', 'rc_this_oldid', 'patch-recentchanges-rc_this_oldid-index.sql' ],
-                       [ 'dropTable', 'transcache' ],
-                       [ 'runMaintenance', PopulateChangeTagDef::class, 'maintenance/populateChangeTagDef.php' ],
-                       [ 'addIndex', 'change_tag', 'change_tag_i03',
-                               'patch-change_tag-change_tag_rc_tag_id.sql' ],
-                       [ 'addField', 'ipblocks', 'ipb_sitewide', 'patch-ipb_sitewide.sql' ],
-                       [ 'addTable', 'ipblocks_restrictions', 'patch-ipblocks_restrictions-table.sql' ],
-                       [ 'migrateImageCommentTemp' ],
-
-                       // 1.33
-                       [ 'dropField', 'change_tag', 'ct_tag', 'patch-drop-ct_tag.sql' ],
-                       [ 'dropTable', 'valid_tag' ],
-                       [ 'dropTable', 'tag_summary' ],
-                       [ 'dropField', 'protected_titles', 'pt_reason', 'patch-drop-comment-fields.sql' ],
-
-                       // KEEP THIS AT THE BOTTOM!!
-                       [ 'doRebuildDuplicateFunction' ],
-
-               ];
-       }
-
-       /**
-        * MySQL uses datatype defaults for NULL inserted into NOT NULL fields
-        * In namespace case that results into insert of 0 which is default namespace
-        * Oracle inserts NULL, so namespace fields should have a default value
-        */
-       protected function doNamespaceDefaults() {
-               $meta = $this->db->fieldInfo( 'page', 'page_namespace' );
-               if ( $meta->defaultValue() != null ) {
-                       return;
-               }
-
-               $this->applyPatch(
-                       'patch_namespace_defaults.sql',
-                       false,
-                       'Altering namespace fields with default value'
-               );
-       }
-
-       /**
-        * Uniform FK names + deferrable state
-        */
-       protected function doFKRenameDeferr() {
-               $meta = $this->db->query( '
-                       SELECT COUNT(*) cnt
-                       FROM user_constraints
-                       WHERE constraint_type = \'R\' AND deferrable = \'DEFERRABLE\''
-               );
-               $row = $meta->fetchRow();
-               if ( $row && $row['cnt'] > 0 ) {
-                       return;
-               }
-
-               $this->applyPatch( 'patch_fk_rename_deferred.sql', false, "Altering foreign keys ... " );
-       }
-
-       /**
-        * Recreate functions to 17 schema layout
-        */
-       protected function doFunctions17() {
-               $this->applyPatch( 'patch_create_17_functions.sql', false, "Recreating functions" );
-       }
-
-       /**
-        * Schema upgrade 16->17
-        * there are no incremental patches prior to this
-        */
-       protected function doSchemaUpgrade17() {
-               // check if iwlinks table exists which was added in 1.17
-               if ( $this->db->tableExists( 'iwlinks' ) ) {
-                       return;
-               }
-               $this->applyPatch( 'patch_16_17_schema_changes.sql', false, "Updating schema to 17" );
-       }
-
-       /**
-        * Insert page (page_id = 0) to prevent FK constraint violation
-        */
-       protected function doInsertPage0() {
-               $this->output( "Inserting page 0 if missing ... " );
-               $row = [
-                       'page_id' => 0,
-                       'page_namespace' => 0,
-                       'page_title' => ' ',
-                       'page_is_redirect' => 0,
-                       'page_is_new' => 0,
-                       'page_random' => 0,
-                       'page_touched' => $this->db->timestamp(),
-                       'page_latest' => 0,
-                       'page_len' => 0
-               ];
-               $this->db->insert( 'page', $row, 'OracleUpdater:doInserPage0', [ 'IGNORE' ] );
-               $this->output( "ok\n" );
-       }
-
-       /**
-        * Remove DEFAULT '' NOT NULL constraints from fields as '' is internally
-        * converted to NULL in Oracle
-        */
-       protected function doRemoveNotNullEmptyDefaults() {
-               $meta = $this->db->fieldInfo( 'categorylinks', 'cl_sortkey_prefix' );
-               if ( $meta->isNullable() ) {
-                       return;
-               }
-               $this->applyPatch(
-                       'patch_remove_not_null_empty_defs.sql',
-                       false,
-                       'Removing not null empty constraints'
-               );
-       }
-
-       protected function doRemoveNotNullEmptyDefaults2() {
-               $meta = $this->db->fieldInfo( 'ipblocks', 'ipb_by_text' );
-               if ( $meta->isNullable() ) {
-                       return;
-               }
-               $this->applyPatch(
-                       'patch_remove_not_null_empty_defs2.sql',
-                       false,
-                       'Removing not null empty constraints'
-               );
-       }
-
-       /**
-        * Removed forcing of invalid state on recentchanges_fk2.
-        * cascading taken in account in the deleting function
-        */
-       protected function doRecentchangesFK2Cascade() {
-               $meta = $this->db->query( 'SELECT 1 FROM all_constraints WHERE owner = \'' .
-                       strtoupper( $this->db->getDBname() ) .
-                       '\' AND constraint_name = \'' .
-                       $this->db->tablePrefix() .
-                       'RECENTCHANGES_FK2\' AND delete_rule = \'CASCADE\''
-               );
-               $row = $meta->fetchRow();
-               if ( $row ) {
-                       return;
-               }
-
-               $this->applyPatch( 'patch_recentchanges_fk2_cascade.sql', false, "Altering RECENTCHANGES_FK2" );
-       }
-
-       /**
-        * Fixed wrong PK, UK definition
-        */
-       protected function doPageRestrictionsPKUKFix() {
-               $this->output( "Altering PAGE_RESTRICTIONS keys ... " );
-
-               $meta = $this->db->query( 'SELECT column_name FROM all_cons_columns WHERE owner = \'' .
-                       strtoupper( $this->db->getDBname() ) .
-                       '\' AND constraint_name = \'' .
-                       $this->db->tablePrefix() .
-                       'PAGE_RESTRICTIONS_PK\' AND rownum = 1'
-               );
-               $row = $meta->fetchRow();
-               if ( $row['column_name'] == 'PR_ID' ) {
-                       $this->output( "seems to be up to date.\n" );
-
-                       return;
-               }
-
-               $this->applyPatch( 'patch-page_restrictions_pkuk_fix.sql', false );
-               $this->output( "ok\n" );
-       }
-
-       /**
-        * Add auto-increment triggers
-        */
-       protected function doAutoIncrementTriggers() {
-               $this->output( "Adding auto-increment triggers ... " );
-
-               $meta = $this->db->query( 'SELECT trigger_name FROM user_triggers WHERE table_owner = \'' .
-                       strtoupper( $this->db->getDBname() ) .
-                       '\' AND trigger_name = \'' .
-                       $this->db->tablePrefix() .
-                       'PAGE_DEFAULT_PAGE_ID\''
-               );
-               $row = $meta->fetchRow();
-               if ( $row['column_name'] ) {
-                       $this->output( "seems to be up to date.\n" );
-
-                       return;
-               }
-
-               $this->applyPatch( 'patch-auto_increment_triggers.sql', false );
-
-               $this->output( "ok\n" );
-       }
-
-       /**
-        * rebuilding of the function that duplicates tables for tests
-        */
-       protected function doRebuildDuplicateFunction() {
-               $this->applyPatch( 'patch_rebuild_dupfunc.sql', false, "Rebuilding duplicate function" );
-       }
-
-       /**
-        * Overload: after this action field info table has to be rebuilt
-        *
-        * @param array $what
-        */
-       public function doUpdates( array $what = [ 'core', 'extensions', 'purge', 'stats' ] ) {
-               parent::doUpdates( $what );
-
-               $this->db->query( 'BEGIN fill_wiki_info; END;' );
-       }
-
-       /**
-        * Overload: because of the DDL_MODE tablename escaping is a bit dodgy
-        */
-       public function purgeCache() {
-               # We can't guarantee that the user will be able to use TRUNCATE,
-               # but we know that DELETE is available to us
-               $this->output( "Purging caches..." );
-               $this->db->delete( '/*Q*/' . $this->db->tableName( 'objectcache' ), '*', __METHOD__ );
-               $this->output( "done.\n" );
-       }
-}
index cf91ccd..7c39ded 100644 (file)
@@ -356,7 +356,14 @@ EOT;
                global $IP;
 
                $module = DatabaseSqlite::getFulltextSearchModule();
-               $fts3tTable = $this->db->checkForEnabledSearch();
+               $searchIndexSql = (string)$this->db->selectField(
+                       $this->db->addIdentifierQuotes( 'sqlite_master' ),
+                       'sql',
+                       [ 'tbl_name' => $this->db->tableName( 'searchindex', 'raw' ) ],
+                       __METHOD__
+               );
+               $fts3tTable = ( stristr( $searchIndexSql, 'fts' ) !== false );
+
                if ( $fts3tTable && !$module ) {
                        $status->warning( 'config-sqlite-fts3-downgrade' );
                        $this->db->sourceFile( "$IP/maintenance/sqlite/archives/searchindex-no-fts.sql" );
index 7546bdf..3bacb76 100644 (file)
@@ -48,8 +48,7 @@ class WebInstallerDBConnect extends WebInstallerPage {
                $settings = '';
                $defaultType = $this->getVar( 'wgDBtype' );
 
-               // Messages: config-dbsupport-mysql, config-dbsupport-postgres, config-dbsupport-oracle,
-               // config-dbsupport-sqlite, config-dbsupport-mssql
+               // Messages: config-dbsupport-mysql, config-dbsupport-postgres, config-dbsupport-sqlite
                $dbSupport = '';
                foreach ( Installer::getDBTypes() as $type ) {
                        $dbSupport .= wfMessage( "config-dbsupport-$type" )->plain() . "\n";
@@ -78,8 +77,7 @@ class WebInstallerDBConnect extends WebInstallerPage {
                                ) .
                                "</li>\n";
 
-                       // Messages: config-header-mysql, config-header-postgres, config-header-oracle,
-                       // config-header-sqlite
+                       // Messages: config-header-mysql, config-header-postgres, config-header-sqlite
                        $settings .= Html::openElement(
                                        'div',
                                        [
index a9da56d..758221f 100644 (file)
        "config-db-type": "Database type:",
        "config-db-host": "Database host:",
        "config-db-host-help": "If your database server is on a different server, enter the host name or IP address here.\n\nIf you are using shared web hosting, your hosting provider should give you the correct host name in their documentation.\n\nIf you are using MySQL, using \"localhost\" may not work for the server name. If it does not, try \"127.0.0.1\" for the local IP address.\n\nIf you are using PostgreSQL, leave this field blank to connect via a Unix socket.",
-       "config-db-host-oracle": "Database TNS:",
-       "config-db-host-oracle-help": "Enter a valid [http://download.oracle.com/docs/cd/B28359_01/network.111/b28317/tnsnames.htm Local Connect Name]; a tnsnames.ora file must be visible to this installation.<br />If you are using client libraries 10g or newer you can also use the [http://download.oracle.com/docs/cd/E11882_01/network.112/e10836/naming.htm Easy Connect] naming method.",
        "config-db-wiki-settings": "Identify this wiki",
        "config-db-name": "Database name (no hyphens):",
        "config-db-name-help": "Choose a name that identifies your wiki.\nIt should not contain spaces.\n\nIf you are using shared web hosting, your hosting provider will either give you a specific database name to use or let you create databases via a control panel.",
-       "config-db-name-oracle": "Database schema:",
-       "config-db-account-oracle-warn": "There are three supported scenarios for installing Oracle as database backend:\n\nIf you wish to create database account as part of the installation process, please supply an account with SYSDBA role as database account for installation and specify the desired credentials for the web-access account, otherwise you can either create the web-access account manually and supply only that account (if it has required permissions to create the schema objects) or supply two different accounts, one with create privileges and a restricted one for web access.\n\nScript for creating an account with required privileges can be found in \"maintenance/oracle/\" directory of this installation. Keep in mind that using a restricted account will disable all maintenance capabilities with the default account.",
        "config-db-install-account": "User account for installation",
        "config-db-username": "Database username:",
        "config-db-password": "Database password:",
        "config-pg-test-error": "Cannot connect to database <strong>$1</strong>: $2",
        "config-sqlite-dir": "SQLite data directory:",
        "config-sqlite-dir-help": "SQLite stores all data in a single file.\n\nThe directory you provide must be writable by the webserver during installation.\n\nIt should <strong>not</strong> be accessible via the web; this is why we're not putting it where your PHP files are.\n\nThe installer will write a <code>.htaccess</code> file along with it, but if that fails someone can gain access to your raw database.\nThat includes raw user data (email addresses, hashed passwords) as well as deleted revisions and other restricted data on the wiki.\n\nConsider putting the database somewhere else altogether, for example in <code>/var/lib/mediawiki/yourwiki</code>.",
-       "config-oracle-def-ts": "Default tablespace:",
-       "config-oracle-temp-ts": "Temporary tablespace:",
        "config-type-mysql": "MariaDB, MySQL, or compatible",
        "config-type-postgres": "PostgreSQL",
        "config-type-sqlite": "SQLite",
-       "config-type-oracle": "Oracle",
-       "config-type-mssql": "Microsoft SQL Server",
        "config-support-info": "MediaWiki supports the following database systems:\n\n$1\n\nIf you do not see the database system you are trying to use listed below, then follow the instructions linked above to enable support.",
        "config-dbsupport-mysql": "* [{{int:version-db-mariadb-url}} MariaDB] is the primary target for MediaWiki and is best supported. MediaWiki also works with [{{int:version-db-mysql-url}} MySQL] and [{{int:version-db-percona-url}} Percona Server], which are MariaDB compatible. ([https://www.php.net/manual/en/mysqli.installation.php How to compile PHP with MySQL support])",
        "config-dbsupport-postgres": "* [{{int:version-db-postgres-url}} PostgreSQL] is a popular open source database system as an alternative to MySQL. ([https://www.php.net/manual/en/pgsql.installation.php How to compile PHP with PostgreSQL support])",
        "config-dbsupport-sqlite": "* [{{int:version-db-sqlite-url}} SQLite] is a lightweight database system that is very well supported. ([https://www.php.net/manual/en/pdo.installation.php How to compile PHP with SQLite support], uses PDO)",
-       "config-dbsupport-oracle": "* [{{int:version-db-oracle-url}} Oracle] is a commercial enterprise database. ([https://www.php.net/manual/en/oci8.installation.php How to compile PHP with OCI8 support])",
-       "config-dbsupport-mssql": "* [{{int:version-db-mssql-url}} Microsoft SQL Server] is a commercial enterprise database for Windows. ([https://www.php.net/manual/en/sqlsrv.installation.php How to compile PHP with SQLSRV support])",
        "config-header-mysql": "MariaDB/MySQL settings",
        "config-header-postgres": "PostgreSQL settings",
        "config-header-sqlite": "SQLite settings",
-       "config-header-oracle": "Oracle settings",
-       "config-header-mssql": "Microsoft SQL Server settings",
        "config-invalid-db-type": "Invalid database type.",
        "config-missing-db-name": "You must enter a value for \"{{int:config-db-name}}\".",
        "config-missing-db-host": "You must enter a value for \"{{int:config-db-host}}\".",
-       "config-missing-db-server-oracle": "You must enter a value for \"{{int:config-db-host-oracle}}\".",
-       "config-invalid-db-server-oracle": "Invalid database TNS \"$1\".\nUse either \"TNS Name\" or an \"Easy Connect\" string ([http://docs.oracle.com/cd/E11882_01/network.112/e10836/naming.htm Oracle Naming Methods]).",
        "config-invalid-db-name": "Invalid database name \"$1\".\nUse only ASCII letters (a-z, A-Z), numbers (0-9), underscores (_) and hyphens (-).",
        "config-invalid-db-prefix": "Invalid database prefix \"$1\".\nUse only ASCII letters (a-z, A-Z), numbers (0-9), underscores (_) and hyphens (-).",
        "config-connection-error": "$1.\n\nCheck the host, username and password and try again. If using \"localhost\" as the database host, try using \"127.0.0.1\" instead (or vice versa).",
        "config-invalid-schema": "Invalid schema for MediaWiki \"$1\".\nUse only ASCII letters (a-z, A-Z), numbers (0-9) and underscores (_).",
-       "config-db-sys-create-oracle": "Installer only supports using a SYSDBA account for creating a new account.",
-       "config-db-sys-user-exists-oracle": "User account \"$1\" already exists. SYSDBA can only be used for creating of a new account!",
        "config-postgres-old": "PostgreSQL $1 or later is required. You have $2.",
-       "config-mssql-old": "Microsoft SQL Server $1 or later is required. You have $2.",
        "config-sqlite-name-help": "Choose a name that identifies your wiki.\nDo not use spaces or hyphens.\nThis will be used for the SQLite data filename.",
        "config-sqlite-parent-unwritable-group": "Cannot create the data directory <code><nowiki>$1</nowiki></code>, because the parent directory <code><nowiki>$2</nowiki></code> is not writable by the webserver.\n\nThe installer has determined the user your webserver is running as.\nMake the <code><nowiki>$3</nowiki></code> directory writable by it to continue.\nOn a Unix/Linux system do:\n\n<pre>cd $2\nmkdir $3\nchgrp $4 $3\nchmod g+w $3</pre>",
        "config-sqlite-parent-unwritable-nogroup": "Cannot create the data directory <code><nowiki>$1</nowiki></code>, because the parent directory <code><nowiki>$2</nowiki></code> is not writable by the webserver.\n\nThe installer could not determine the user your webserver is running as.\nMake the <code><nowiki>$3</nowiki></code> directory globally writable by it (and others!) to continue.\nOn a Unix/Linux system do:\n\n<pre>cd $2\nmkdir $3\nchmod a+w $3</pre>",
        "config-mysql-engine": "Storage engine:",
        "config-mysql-innodb": "InnoDB (recommended)",
        "config-mysql-engine-help": "<strong>InnoDB</strong> is almost always the best option, since it has good concurrency support.\n\n<strong>MyISAM</strong> may be faster in single-user or read-only installations.\nMyISAM databases tend to get corrupted more often than InnoDB databases.",
-       "config-mssql-auth": "Authentication type:",
-       "config-mssql-install-auth": "Select the authentication type that will be used to connect to the database during the installation process.\nIf you select \"{{int:config-mssql-windowsauth}}\", the credentials of whatever user the webserver is running as will be used.",
-       "config-mssql-web-auth": "Select the authentication type that the web server will use to connect to the database server, during ordinary operation of the wiki.\nIf you select \"{{int:config-mssql-windowsauth}}\", the credentials of whatever user the webserver is running as will be used.",
-       "config-mssql-sqlauth": "SQL Server Authentication",
-       "config-mssql-windowsauth": "Windows Authentication",
        "config-site-name": "Name of wiki:",
        "config-site-name-help": "This will appear in the title bar of the browser and in various other places.",
        "config-site-name-blank": "Enter a site name.",
index feda6b2..d34367e 100644 (file)
        "config-skins-must-enable-some": "Musisz wybrać co najmniej jedną skórkę, aby ją włączyć.",
        "config-skins-must-enable-default": "Skórka wybrana jako domyślna musi być włączona.",
        "config-install-alreadydone": "'''Uwaga''' – wydaje się, że MediaWiki jest już zainstalowane, a obecnie próbujesz zainstalować je ponownie.\nPrzejdź do następnej strony.",
-       "config-install-begin": "Po naciśnięciu \"{{int:config-continue}}\", rozpocznie się instalacja MediaWiki.\nJeśli nadal chcesz dokonać zmian, naciśnij \"{{int:config-back}}\".",
+       "config-install-begin": "Po naciśnięciu „{{int:config-continue}}”, rozpocznie się instalacja MediaWiki.\nJeśli nadal chcesz dokonać zmian, naciśnij „{{int:config-back}}”.",
        "config-install-step-done": "gotowe",
        "config-install-step-failed": "nieudane",
        "config-install-extensions": "Dołączanie rozszerzeń",
index 039cd26..42211b4 100644 (file)
        "config-db-type": "Field label in the MediaWiki installer followed by possible database types.",
        "config-db-host": "Used as label.\n\nAlso used in {{msg-mw|Config-missing-db-host}}.",
        "config-db-host-help": "{{doc-singularthey}}",
-       "config-db-host-oracle": "TNS = [[w:Transparent Network Substrate]].\n\nUsed as label.\n\nAlso used in {{msg-mw|Config-missing-db-server-oracle}}.",
-       "config-db-host-oracle-help": "See also:\n* {{msg-mw|Config-invalid-db-server-oracle}}",
        "config-db-wiki-settings": "This is more acurate: \"Enter identifying or distinguishing data for this wiki\" since a MySQL database can host tables of several wikis.",
        "config-db-name": "Used as label.\n\nAlso used in {{msg-mw|Config-missing-db-name}}.\n{{Identical|Database name}}",
        "config-db-name-help": "Help box text in the MediaWiki installer.",
-       "config-db-name-oracle": "Field label in the MediaWiki installer where an Oracle database schema can be specified.",
-       "config-db-account-oracle-warn": "A \"[[:wikipedia:Front and back ends|backend]]\" is a system or component that ordinary users don't interact with directly and don't need to know about, and that is responsible for a distinct task or service - for example, a storage back-end is a generic system for storing data which other applications can use. Possible alternatives for back-end are \"system\" or \"service\", or (depending on context and language) even leave it untranslated.",
        "config-db-install-account": "Legend in the MediaWiki installer for the section where database username and password have to be provided.",
        "config-db-username": "Used as label.",
        "config-db-password": "Field label in the MediaWiki installer where database password has to be provided.",
        "config-pg-test-error": "Parameters:\n* $1 - database name\n* $2 - error message",
        "config-sqlite-dir": "Field label for a folder location.",
        "config-sqlite-dir-help": "{{doc-important|Do not translate <code>.htaccess</code> and <code>/var/lib/mediawiki/yourwiki</code>.}}\nUsed in help box.",
-       "config-oracle-def-ts": "Field label for an Oracle default tablespace.",
-       "config-oracle-temp-ts": "Field label for an Oracle temporary tablespace.",
        "config-type-mysql": "\"Or compatible\" refers to several database systems that are compatible with MySQL, as explained in {{msg-mw|config-dbsupport-mysql}}, and thus also work with this choice of database type.",
        "config-type-postgres": "{{optional}}",
        "config-type-sqlite": "{{optional}}",
-       "config-type-oracle": "{{optional}}",
-       "config-type-mssql": "{{optional}}",
-       "config-support-info": "Parameters:\n* $1 - a list of DBMSs that MediaWiki supports, composed with config-dbsupport-* messages.\nSee also:\n* {{msg-mw|Config-dbsupport-mysql}}\n* {{msg-mw|Config-dbsupport-postgres}}\n* {{msg-mw|Config-dbsupport-oracle}}\n* {{msg-mw|Config-dbsupport-sqlite}}\n* {{msg-mw|Config-dbsupport-mssql}}",
+       "config-support-info": "Parameters:\n* $1 - a list of DBMSs that MediaWiki supports, composed with config-dbsupport-* messages.\nSee also:\n* {{msg-mw|Config-dbsupport-mysql}}\n* {{msg-mw|Config-dbsupport-postgres}}\n* {{msg-mw|Config-dbsupport-sqlite}}",
        "config-dbsupport-mysql": "Used in:\n* {{msg-mw|config-support-info}}\n{{Related|Config-dbsupport}}",
        "config-dbsupport-postgres": "Used in:\n* {{msg-mw|config-support-info}}\n{{Related|Config-dbsupport}}",
        "config-dbsupport-sqlite": "Used in:\n* {{msg-mw|config-support-info}}\n{{Related|Config-dbsupport}}",
-       "config-dbsupport-oracle": "Used in:\n* {{msg-mw|Config-support-info}}.\n{{Related|Config-dbsupport}}",
-       "config-dbsupport-mssql": "Used in:\n* {{msg-mw|Config-support-info}}\n{{Related|Config-dbsupport}}",
        "config-header-mysql": "Header for MySQL database settings in the MediaWiki installer.",
        "config-header-postgres": "Header for PostgreSQL database settings in the MediaWiki installer.",
        "config-header-sqlite": "Header for SQLite database settings in the MediaWiki installer.",
-       "config-header-oracle": "Header for Oracle database settings in the MediaWiki installer.",
-       "config-header-mssql": "Used as a section heading on the installer form, inside of a fieldset",
        "config-invalid-db-type": "Error message in MediaWiki installer when an invalid database type has been provided.",
        "config-missing-db-name": "Refers to {{msg-mw|Config-db-name}}.\n{{Related|Config-missing}}",
        "config-missing-db-host": "Refers to {{msg-mw|Config-db-host}}.\n{{Related|Config-missing}}",
-       "config-missing-db-server-oracle": "Refers to {{msg-mw|Config-db-host-oracle}}.\n{{Related|Config-missing}}",
-       "config-invalid-db-server-oracle": "Used as error message. Parameters:\n* $1 - database server name\nSee also:\n* {{msg-mw|Config-db-host-oracle-help}}",
        "config-invalid-db-name": "Used as error message. Parameters:\n* $1 - database name\nSee also:\n* {{msg-mw|Config-invalid-db-prefix}}",
        "config-invalid-db-prefix": "Used as error message. Parameters:\n* $1 - database prefix\nSee also:\n* {{msg-mw|Config-invalid-db-name}}",
        "config-connection-error": "$1 is the external error from the database, such as \"DB connection error: Access denied for user 'dba'@'localhost' (using password: YES) (localhost).\"\n\nIf you're translating this message to a right-to-left language, consider writing <nowiki><div dir=\"ltr\">$1.</div></nowiki>. (When the bidi features for HTML5 will be implemented in the browsers, it will probably be a good idea to write it as <nowiki><div dir=\"auto\">$1.</div></nowiki>.)",
        "config-invalid-schema": "*$1 - schema name",
-       "config-db-sys-create-oracle": "Error message in the MediaWiki installer when Oracle is used as database and an incorrect user account type has been provided.",
-       "config-db-sys-user-exists-oracle": "Used as error message. Parameters:\n* $1 - database username",
        "config-postgres-old": "Used as error message. Used as warning. Parameters:\n* $1 - minimum version\n* $2 - the version of PostgreSQL that has been installed\n{{Related|Config-old}}",
-       "config-mssql-old": "Used as an error message. Parameters:\n* $1 - minimum version\n* $2 - the version of Microsoft SQL Server that has been installed\n{{Related|Config-old}}",
        "config-sqlite-name-help": "Help text for the form field for the SQLite data file name.",
        "config-sqlite-parent-unwritable-group": "Used as SQLite error message. Parameters:\n* $1 - data directory\n* $2 - \"dirname\" part of $1\n* $3 - \"basename\" part of $1\n* $4 - web server's primary group name\nSee also:\n* {{msg-mw|Config-sqlite-parent-unwritable-nogroup}}",
        "config-sqlite-parent-unwritable-nogroup": "Used as SQLite error message. Parameters:\n* $1 - data directory\n* $2 - \"dirname\" part of $1\n* $3 - \"basename\" part of $1\nSee also:\n* {{msg-mw|Config-sqlite-parent-unwritable-group}}",
        "config-mysql-engine": "Field label for MySQL storage engine in the MediaWiki installer.",
        "config-mysql-innodb": "Option for the MySQL storage engine in the MediaWiki installer.",
        "config-mysql-engine-help": "Help text in MediaWiki installer with advice for picking a MySQL storage engine.",
-       "config-mssql-auth": "Radio button group label.\n\nFollowed by the following radio button labels:\n* {{msg-mw|Config-mssql-sqlauth}}\n* {{msg-mw|Config-mssql-windowsauth}}",
-       "config-mssql-install-auth": "Used as the help text for the \"Authentication type\" radio button when typing in database settings for installation.\n\nRefers to {{msg-mw|Config-mssql-windowsauth}}.\n\nSee also:\n* {{msg-mw|Config-mssql-web-auth}}",
-       "config-mssql-web-auth": "Used as the help text for the \"Authentication type\" radio button when typing in database settings for normal wiki usage.\n\nRefers to {{msg-mw|Config-mssql-windowsauth}}.\n\nSee also:\n* {{msg-mw|Config-mssql-install-auth}}",
-       "config-mssql-sqlauth": "Radio button.\n\n\"SQL Server\" refers to \"Microsoft SQL Server\".\n\nSee also:\n* {{msg-mw|Config-mssql-windowsauth}}",
-       "config-mssql-windowsauth": "Radio button. The official term is \"Integrated Windows Authentication\" but Microsoft itself uses \"Windows Authentication\" elsewhere in Microsoft SQL Server as a synonym.\n\nAlso used in:\n* {{msg-mw|Config-mssql-install-auth}}\n* {{msg-mw|Config-mssql-web-auth}}\n\nSee also:\n* {{msg-mw|Config-mssql-sqlauth}}",
        "config-site-name": "Field label for the form field where a wiki name has to be entered.",
        "config-site-name-help": "Help text for the form field where a wiki name has to be entered.",
        "config-site-name-blank": "Error text in the MediaWiki installer when the site name is left empty.",
index f7b8ed2..d449e8a 100644 (file)
@@ -690,9 +690,9 @@ class JobQueueDB extends JobQueue {
                                        $dbw->update( 'job',
                                                [
                                                        'job_token' => '',
-                                                       'job_token_timestamp' => $dbw->timestamp( $now ) ], // time of release
-                                               [
-                                                       'job_id' => $ids ],
+                                                       'job_token_timestamp' => $dbw->timestamp( $now ) // time of release
+                                               ],
+                                               [ 'job_id' => $ids, "job_token != ''" ],
                                                __METHOD__
                                        );
                                        $affected = $dbw->affectedRows();
index fe17628..62a8aec 100644 (file)
@@ -783,12 +783,12 @@ abstract class MediumSpecificBagOStuff extends BagOStuff {
        }
 
        /**
-        * @param int $exptime
-        * @return bool
+        * @param int|float $exptime
+        * @return bool Whether the expiry is non-infinite, and, negative or not a UNIX timestamp
         * @since 1.34
         */
        final protected function isRelativeExpiration( $exptime ) {
-               return ( $exptime != self::TTL_INDEFINITE && $exptime < ( 10 * self::TTL_YEAR ) );
+               return ( $exptime !== self::TTL_INDEFINITE && $exptime < ( 10 * self::TTL_YEAR ) );
        }
 
        /**
index ff9dedf..dc40931 100644 (file)
@@ -96,17 +96,24 @@ abstract class MemcachedBagOStuff extends MediumSpecificBagOStuff {
        }
 
        /**
-        * TTLs higher than 30 days will be detected as absolute TTLs
-        * (UNIX timestamps), and will result in the cache entry being
-        * discarded immediately because the expiry is in the past.
-        * Clamp expires >30d at 30d, unless they're >=1e9 in which
-        * case they are likely to really be absolute (1e9 = 2011-09-09)
-        * @param int $exptime
+        * @param int|float $exptime
         * @return int
         */
        protected function fixExpiry( $exptime ) {
-               return ( $exptime > self::TTL_MONTH && !$this->isRelativeExpiration( $exptime ) )
-                       ? self::TTL_MONTH
-                       : (int)$exptime;
+               if ( $exptime < 0 ) {
+                       // The PECL driver does not seem to like negative relative values
+                       $expiresAt = $this->getCurrentTime() + $exptime;
+               } elseif ( $this->isRelativeExpiration( $exptime ) ) {
+                       // TTLs higher than 30 days will be detected as absolute TTLs
+                       // (UNIX timestamps), and will result in the cache entry being
+                       // discarded immediately because the expiry is in the past.
+                       // Clamp expires >30d at 30d, unless they're >=1e9 in which
+                       // case they are likely to really be absolute (1e9 = 2011-09-09)
+                       $expiresAt = min( $exptime, self::TTL_MONTH );
+               } else {
+                       $expiresAt = $exptime;
+               }
+
+               return (int)$expiresAt;
        }
 }
index 5a40f44..aa8a899 100644 (file)
@@ -453,7 +453,6 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware
                // we auto-detect the first available driver. For types without built-in support,
                // an class named "Database<Type>" us used, eg. DatabaseFoo for type 'foo'.
                static $builtinTypes = [
-                       'mssql' => DatabaseMssql::class,
                        'mysql' => [ 'mysqli' => DatabaseMysqli::class ],
                        'sqlite' => DatabaseSqlite::class,
                        'postgres' => DatabasePostgres::class,
diff --git a/includes/libs/rdbms/database/DatabaseMssql.php b/includes/libs/rdbms/database/DatabaseMssql.php
deleted file mode 100644 (file)
index 9d4a364..0000000
+++ /dev/null
@@ -1,1418 +0,0 @@
-<?php
-/**
- * This is the MS SQL Server Native database abstraction layer.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- * @ingroup Database
- * @author Joel Penner <a-joelpe at microsoft dot com>
- * @author Chris Pucci <a-cpucci at microsoft dot com>
- * @author Ryan Biesemeyer <v-ryanbi at microsoft dot com>
- * @author Ryan Schmidt <skizzerz at gmail dot com>
- */
-
-namespace Wikimedia\Rdbms;
-
-use Exception;
-use RuntimeException;
-use stdClass;
-use Wikimedia\AtEase\AtEase;
-
-/**
- * @ingroup Database
- */
-class DatabaseMssql extends Database {
-       /** @var int */
-       protected $serverPort;
-       /** @var bool */
-       protected $useWindowsAuth = false;
-       /** @var int|null */
-       protected $lastInsertId = null;
-       /** @var int|null */
-       protected $lastAffectedRowCount = null;
-       /** @var int */
-       protected $subqueryId = 0;
-       /** @var bool */
-       protected $scrollableCursor = true;
-       /** @var bool */
-       protected $prepareStatements = true;
-       /** @var stdClass[][]|null */
-       protected $binaryColumnCache = null;
-       /** @var stdClass[][]|null */
-       protected $bitColumnCache = null;
-       /** @var bool */
-       protected $ignoreDupKeyErrors = false;
-       /** @var string[] */
-       protected $ignoreErrors = [];
-
-       public function implicitOrderby() {
-               return false;
-       }
-
-       public function unionSupportsOrderAndLimit() {
-               return false;
-       }
-
-       public function __construct( array $params ) {
-               $this->serverPort = $params['port'];
-               $this->useWindowsAuth = $params['UseWindowsAuth'];
-
-               parent::__construct( $params );
-       }
-
-       protected function open( $server, $user, $password, $dbName, $schema, $tablePrefix ) {
-               if ( !function_exists( 'sqlsrv_connect' ) ) {
-                       throw new DBConnectionError(
-                               $this,
-                               "Microsoft SQL Server Native (sqlsrv) functions missing.\n
-                               You can download the driver from: http://go.microsoft.com/fwlink/?LinkId=123470"
-                       );
-               }
-
-               $this->close();
-
-               if ( $schema !== null ) {
-                       throw $this->newExceptionAfterConnectError( "Got schema '$schema'; not supported." );
-               }
-
-               $this->server = $server;
-               $this->user = $user;
-               $this->password = $password;
-
-               $connectionInfo = [];
-               if ( strlen( $dbName ) ) {
-                       $connectionInfo['Database'] = $dbName;
-               }
-               if ( !$this->useWindowsAuth ) {
-                       $connectionInfo['UID'] = $user;
-                       $connectionInfo['PWD'] = $password;
-               }
-
-               AtEase::suppressWarnings();
-               $this->conn = sqlsrv_connect( $server, $connectionInfo ) ?: null;
-               AtEase::restoreWarnings();
-
-               if ( !$this->conn ) {
-                       throw $this->newExceptionAfterConnectError( $this->lastError() );
-               }
-
-               try {
-                       $this->currentDomain = new DatabaseDomain(
-                               strlen( $dbName ) ? $dbName : null,
-                               null,
-                               $tablePrefix
-                       );
-               } catch ( Exception $e ) {
-                       throw $this->newExceptionAfterConnectError( $e->getMessage() );
-               }
-       }
-
-       /**
-        * Closes a database connection, if it is open
-        * Returns success, true if already closed
-        * @return bool
-        */
-       protected function closeConnection() {
-               return sqlsrv_close( $this->conn );
-       }
-
-       /**
-        * @param bool|MssqlResultWrapper|resource $result
-        * @return bool|MssqlResultWrapper
-        */
-       protected function resultObject( $result ) {
-               if ( !$result ) {
-                       return false;
-               } elseif ( $result instanceof MssqlResultWrapper ) {
-                       return $result;
-               } elseif ( $result === true ) {
-                       // Successful write query
-                       return $result;
-               } else {
-                       return new MssqlResultWrapper( $this, $result );
-               }
-       }
-
-       /**
-        * @param string $sql
-        * @return bool|MssqlResultWrapper|resource
-        */
-       protected function doQuery( $sql ) {
-               // several extensions seem to think that all databases support limits
-               // via LIMIT N after the WHERE clause, but  MSSQL uses SELECT TOP N,
-               // so to catch any of those extensions we'll do a quick check for a
-               // LIMIT clause and pass $sql through $this->LimitToTopN() which parses
-               // the LIMIT clause and passes the result to $this->limitResult();
-               if ( preg_match( '/\bLIMIT\s*/i', $sql ) ) {
-                       // massage LIMIT -> TopN
-                       $sql = $this->LimitToTopN( $sql );
-               }
-
-               // MSSQL doesn't have EXTRACT(epoch FROM XXX)
-               if ( preg_match( '#\bEXTRACT\s*?\(\s*?EPOCH\s+FROM\b#i', $sql, $matches ) ) {
-                       // This is same as UNIX_TIMESTAMP, we need to calc # of seconds from 1970
-                       $sql = str_replace( $matches[0], "DATEDIFF(s,CONVERT(datetime,'1/1/1970'),", $sql );
-               }
-
-               // perform query
-
-               // SQLSRV_CURSOR_STATIC is slower than SQLSRV_CURSOR_CLIENT_BUFFERED (one of the two is
-               // needed if we want to be able to seek around the result set), however CLIENT_BUFFERED
-               // has a bug in the sqlsrv driver where wchar_t types (such as nvarchar) that are empty
-               // strings make php throw a fatal error "Severe error translating Unicode"
-               if ( $this->scrollableCursor ) {
-                       $scrollArr = [ 'Scrollable' => SQLSRV_CURSOR_STATIC ];
-               } else {
-                       $scrollArr = [];
-               }
-
-               if ( $this->prepareStatements ) {
-                       // we do prepare + execute so we can get its field metadata for later usage if desired
-                       $stmt = sqlsrv_prepare( $this->conn, $sql, [], $scrollArr );
-                       $success = sqlsrv_execute( $stmt );
-               } else {
-                       $stmt = sqlsrv_query( $this->conn, $sql, [], $scrollArr );
-                       $success = (bool)$stmt;
-               }
-
-               // Make a copy to ensure what we add below does not get reflected in future queries
-               $ignoreErrors = $this->ignoreErrors;
-
-               if ( $this->ignoreDupKeyErrors ) {
-                       // ignore duplicate key errors
-                       // this emulates INSERT IGNORE in MySQL
-                       $ignoreErrors[] = '2601'; // duplicate key error caused by unique index
-                       $ignoreErrors[] = '2627'; // duplicate key error caused by primary key
-                       $ignoreErrors[] = '3621'; // generic "the statement has been terminated" error
-               }
-
-               if ( $success === false ) {
-                       $errors = sqlsrv_errors();
-                       $success = true;
-
-                       foreach ( $errors as $err ) {
-                               if ( !in_array( $err['code'], $ignoreErrors ) ) {
-                                       $success = false;
-                                       break;
-                               }
-                       }
-
-                       if ( $success === false ) {
-                               return false;
-                       }
-               }
-               // remember number of rows affected
-               $this->lastAffectedRowCount = sqlsrv_rows_affected( $stmt );
-
-               return $stmt;
-       }
-
-       public function freeResult( $res ) {
-               sqlsrv_free_stmt( ResultWrapper::unwrap( $res ) );
-       }
-
-       /**
-        * @param IResultWrapper $res
-        * @return stdClass
-        */
-       public function fetchObject( $res ) {
-               // $res is expected to be an instance of MssqlResultWrapper here
-               return $res->fetchObject();
-       }
-
-       /**
-        * @param IResultWrapper $res
-        * @return array
-        */
-       public function fetchRow( $res ) {
-               return $res->fetchRow();
-       }
-
-       /**
-        * @param mixed $res
-        * @return int
-        */
-       public function numRows( $res ) {
-               $res = ResultWrapper::unwrap( $res );
-
-               $ret = sqlsrv_num_rows( $res );
-               if ( $ret === false ) {
-                       // we cannot get an amount of rows from this cursor type
-                       // has_rows returns bool true/false if the result has rows
-                       $ret = (int)sqlsrv_has_rows( $res );
-               }
-
-               return $ret;
-       }
-
-       /**
-        * @param mixed $res
-        * @return int
-        */
-       public function numFields( $res ) {
-               return sqlsrv_num_fields( ResultWrapper::unwrap( $res ) );
-       }
-
-       /**
-        * @param mixed $res
-        * @param int $n
-        * @return int
-        */
-       public function fieldName( $res, $n ) {
-               return sqlsrv_field_metadata( ResultWrapper::unwrap( $res ) )[$n]['Name'];
-       }
-
-       /**
-        * This must be called after nextSequenceVal
-        * @return int|null
-        */
-       public function insertId() {
-               return $this->lastInsertId;
-       }
-
-       /**
-        * @param MssqlResultWrapper $res
-        * @param int $row
-        * @return bool
-        */
-       public function dataSeek( $res, $row ) {
-               return $res->seek( $row );
-       }
-
-       /**
-        * @return string
-        */
-       public function lastError() {
-               $strRet = '';
-               $retErrors = sqlsrv_errors( SQLSRV_ERR_ALL );
-               if ( $retErrors != null ) {
-                       foreach ( $retErrors as $arrError ) {
-                               $strRet .= $this->formatError( $arrError ) . "\n";
-                       }
-               } else {
-                       $strRet = "No errors found";
-               }
-
-               return $strRet;
-       }
-
-       /**
-        * @param array $err
-        * @return string
-        */
-       private function formatError( $err ) {
-               return '[SQLSTATE ' .
-                       $err['SQLSTATE'] . '][Error Code ' . $err['code'] . ']' . $err['message'];
-       }
-
-       /**
-        * @return string|int
-        */
-       public function lastErrno() {
-               $err = sqlsrv_errors( SQLSRV_ERR_ALL );
-               if ( $err !== null && isset( $err[0] ) ) {
-                       return $err[0]['code'];
-               } else {
-                       return 0;
-               }
-       }
-
-       protected function wasKnownStatementRollbackError() {
-               $errors = sqlsrv_errors( SQLSRV_ERR_ALL );
-               if ( !$errors ) {
-                       return false;
-               }
-               // The transaction vs statement rollback behavior depends on XACT_ABORT, so make sure
-               // that the "statement has been terminated" error (3621) is specifically present.
-               // https://docs.microsoft.com/en-us/sql/t-sql/statements/set-xact-abort-transact-sql
-               $statementOnly = false;
-               $codeWhitelist = [ '2601', '2627', '547' ];
-               foreach ( $errors as $error ) {
-                       if ( $error['code'] == '3621' ) {
-                               $statementOnly = true;
-                       } elseif ( !in_array( $error['code'], $codeWhitelist ) ) {
-                               $statementOnly = false;
-                               break;
-                       }
-               }
-
-               return $statementOnly;
-       }
-
-       public function serverIsReadOnly() {
-               $encDatabase = $this->addQuotes( $this->getDBname() );
-               $res = $this->query(
-                       "SELECT IS_READ_ONLY FROM SYS.DATABASES WHERE NAME = $encDatabase",
-                       __METHOD__
-               );
-               $row = $this->fetchObject( $res );
-
-               return $row ? (bool)$row->IS_READ_ONLY : false;
-       }
-
-       /**
-        * @return int
-        */
-       protected function fetchAffectedRowCount() {
-               return $this->lastAffectedRowCount;
-       }
-
-       /**
-        * SELECT wrapper
-        *
-        * @param mixed $table Array or string, table name(s) (prefix auto-added)
-        * @param mixed $vars Array or string, field name(s) to be retrieved
-        * @param mixed $conds Array or string, condition(s) for WHERE
-        * @param string $fname Calling function name (use __METHOD__) for logs/profiling
-        * @param array $options Associative array of options (e.g.
-        *   [ 'GROUP BY' => 'page_title' ]), see Database::makeSelectOptions
-        *   code for list of supported stuff
-        * @param array $join_conds Associative array of table join conditions
-        *   (optional) (e.g. [ 'page' => [ 'LEFT JOIN','page_latest=rev_id' ] ]
-        * @return mixed Database result resource (feed to Database::fetchObject
-        *   or whatever), or false on failure
-        * @throws DBQueryError
-        * @throws DBUnexpectedError
-        * @throws Exception
-        */
-       public function select( $table, $vars, $conds = '', $fname = __METHOD__,
-               $options = [], $join_conds = []
-       ) {
-               $sql = $this->selectSQLText( $table, $vars, $conds, $fname, $options, $join_conds );
-               if ( isset( $options['EXPLAIN'] ) ) {
-                       try {
-                               $this->scrollableCursor = false;
-                               $this->prepareStatements = false;
-                               $this->query( "SET SHOWPLAN_ALL ON" );
-                               $ret = $this->query( $sql, $fname );
-                               $this->query( "SET SHOWPLAN_ALL OFF" );
-                       } catch ( DBQueryError $dqe ) {
-                               if ( isset( $options['FOR COUNT'] ) ) {
-                                       // likely don't have privs for SHOWPLAN, so run a select count instead
-                                       $this->query( "SET SHOWPLAN_ALL OFF" );
-                                       unset( $options['EXPLAIN'] );
-                                       $ret = $this->select(
-                                               $table,
-                                               'COUNT(*) AS EstimateRows',
-                                               $conds,
-                                               $fname,
-                                               $options,
-                                               $join_conds
-                                       );
-                               } else {
-                                       // someone actually wanted the query plan instead of an est row count
-                                       // let them know of the error
-                                       $this->scrollableCursor = true;
-                                       $this->prepareStatements = true;
-                                       throw $dqe;
-                               }
-                       }
-                       $this->scrollableCursor = true;
-                       $this->prepareStatements = true;
-                       return $ret;
-               }
-               return $this->query( $sql, $fname );
-       }
-
-       /**
-        * SELECT wrapper
-        *
-        * @param mixed $table Array or string, table name(s) (prefix auto-added)
-        * @param mixed $vars Array or string, field name(s) to be retrieved
-        * @param mixed $conds Array or string, condition(s) for WHERE
-        * @param string $fname Calling function name (use __METHOD__) for logs/profiling
-        * @param array $options Associative array of options (e.g. [ 'GROUP BY' => 'page_title' ]),
-        *   see Database::makeSelectOptions code for list of supported stuff
-        * @param array $join_conds Associative array of table join conditions (optional)
-        *    (e.g. [ 'page' => [ 'LEFT JOIN','page_latest=rev_id' ] ]
-        * @return string The SQL text
-        */
-       public function selectSQLText( $table, $vars, $conds = '', $fname = __METHOD__,
-               $options = [], $join_conds = []
-       ) {
-               if ( isset( $options['EXPLAIN'] ) ) {
-                       unset( $options['EXPLAIN'] );
-               }
-
-               $sql = parent::selectSQLText( $table, $vars, $conds, $fname, $options, $join_conds );
-
-               // try to rewrite aggregations of bit columns (currently MAX and MIN)
-               if ( strpos( $sql, 'MAX(' ) !== false || strpos( $sql, 'MIN(' ) !== false ) {
-                       $bitColumns = [];
-                       if ( is_array( $table ) ) {
-                               $tables = $table;
-                               while ( $tables ) {
-                                       $t = array_pop( $tables );
-                                       if ( is_array( $t ) ) {
-                                               $tables = array_merge( $tables, $t );
-                                       } else {
-                                               $bitColumns += $this->getBitColumns( $this->tableName( $t ) );
-                                       }
-                               }
-                       } else {
-                               $bitColumns = $this->getBitColumns( $this->tableName( $table ) );
-                       }
-
-                       foreach ( $bitColumns as $col => $info ) {
-                               $replace = [
-                                       "MAX({$col})" => "MAX(CAST({$col} AS tinyint))",
-                                       "MIN({$col})" => "MIN(CAST({$col} AS tinyint))",
-                               ];
-                               $sql = str_replace( array_keys( $replace ), array_values( $replace ), $sql );
-                       }
-               }
-
-               return $sql;
-       }
-
-       public function deleteJoin( $delTable, $joinTable, $delVar, $joinVar, $conds,
-               $fname = __METHOD__
-       ) {
-               $this->scrollableCursor = false;
-               try {
-                       parent::deleteJoin( $delTable, $joinTable, $delVar, $joinVar, $conds, $fname );
-               } catch ( Exception $e ) {
-                       $this->scrollableCursor = true;
-                       throw $e;
-               }
-               $this->scrollableCursor = true;
-       }
-
-       public function delete( $table, $conds, $fname = __METHOD__ ) {
-               $this->scrollableCursor = false;
-               try {
-                       parent::delete( $table, $conds, $fname );
-               } catch ( Exception $e ) {
-                       $this->scrollableCursor = true;
-                       throw $e;
-               }
-               $this->scrollableCursor = true;
-
-               return true;
-       }
-
-       /**
-        * Estimate rows in dataset
-        * Returns estimated count, based on SHOWPLAN_ALL output
-        * This is not necessarily an accurate estimate, so use sparingly
-        * Returns -1 if count cannot be found
-        * Takes same arguments as Database::select()
-        * @param string $table
-        * @param string $var
-        * @param string $conds
-        * @param string $fname
-        * @param array $options
-        * @param array $join_conds
-        * @return int
-        */
-       public function estimateRowCount( $table, $var = '*', $conds = '',
-               $fname = __METHOD__, $options = [], $join_conds = []
-       ) {
-               $conds = $this->normalizeConditions( $conds, $fname );
-               $column = $this->extractSingleFieldFromList( $var );
-               if ( is_string( $column ) && !in_array( $column, [ '*', '1' ] ) ) {
-                       $conds[] = "$column IS NOT NULL";
-               }
-
-               // http://msdn2.microsoft.com/en-us/library/aa259203.aspx
-               $options['EXPLAIN'] = true;
-               $options['FOR COUNT'] = true;
-               $res = $this->select( $table, $var, $conds, $fname, $options, $join_conds );
-
-               $rows = -1;
-               if ( $res ) {
-                       $row = $this->fetchRow( $res );
-
-                       if ( isset( $row['EstimateRows'] ) ) {
-                               $rows = (int)$row['EstimateRows'];
-                       }
-               }
-
-               return $rows;
-       }
-
-       /**
-        * Returns information about an index
-        * If errors are explicitly ignored, returns NULL on failure
-        * @param string $table
-        * @param string $index
-        * @param string $fname
-        * @return array|bool|null
-        */
-       public function indexInfo( $table, $index, $fname = __METHOD__ ) {
-               # This does not return the same info as MYSQL would, but that's OK
-               # because MediaWiki never uses the returned value except to check for
-               # the existence of indexes.
-               $sql = "sp_helpindex '" . $this->tableName( $table ) . "'";
-               $res = $this->query( $sql, $fname );
-
-               if ( !$res ) {
-                       return null;
-               }
-
-               $result = [];
-               foreach ( $res as $row ) {
-                       if ( $row->index_name == $index ) {
-                               $row->Non_unique = !stristr( $row->index_description, "unique" );
-                               $cols = explode( ", ", $row->index_keys );
-                               foreach ( $cols as $col ) {
-                                       $row->Column_name = trim( $col );
-                                       $result[] = clone $row;
-                               }
-                       } elseif ( $index == 'PRIMARY' && stristr( $row->index_description, 'PRIMARY' ) ) {
-                               $row->Non_unique = 0;
-                               $cols = explode( ", ", $row->index_keys );
-                               foreach ( $cols as $col ) {
-                                       $row->Column_name = trim( $col );
-                                       $result[] = clone $row;
-                               }
-                       }
-               }
-
-               return $result ?: false;
-       }
-
-       /**
-        * INSERT wrapper, inserts an array into a table
-        *
-        * $arrToInsert may be a single associative array, or an array of these with numeric keys, for
-        * multi-row insert.
-        *
-        * Usually aborts on failure
-        * If errors are explicitly ignored, returns success
-        * @param string $table
-        * @param array $arrToInsert
-        * @param string $fname
-        * @param array $options
-        * @return bool
-        * @throws Exception
-        */
-       public function insert( $table, $arrToInsert, $fname = __METHOD__, $options = [] ) {
-               # No rows to insert, easy just return now
-               if ( !count( $arrToInsert ) ) {
-                       return true;
-               }
-
-               if ( !is_array( $options ) ) {
-                       $options = [ $options ];
-               }
-
-               $table = $this->tableName( $table );
-
-               if ( !( isset( $arrToInsert[0] ) && is_array( $arrToInsert[0] ) ) ) { // Not multi row
-                       $arrToInsert = [ 0 => $arrToInsert ]; // make everything multi row compatible
-               }
-
-               // We know the table we're inserting into, get its identity column
-               $identity = null;
-               // strip matching square brackets and the db/schema from table name
-               $tableRawArr = explode( '.', preg_replace( '#\[([^\]]*)\]#', '$1', $table ) );
-               $tableRaw = array_pop( $tableRawArr );
-               $res = $this->doQuery(
-                       "SELECT NAME AS idColumn FROM SYS.IDENTITY_COLUMNS " .
-                               "WHERE OBJECT_NAME(OBJECT_ID)='{$tableRaw}'"
-               );
-               if ( $res && sqlsrv_has_rows( $res ) ) {
-                       // There is an identity for this table.
-                       $identityArr = sqlsrv_fetch_array( $res, SQLSRV_FETCH_ASSOC );
-                       $identity = array_pop( $identityArr );
-               }
-               sqlsrv_free_stmt( $res );
-
-               // Determine binary/varbinary fields so we can encode data as a hex string like 0xABCDEF
-               $binaryColumns = $this->getBinaryColumns( $table );
-
-               // INSERT IGNORE is not supported by SQL Server
-               // remove IGNORE from options list and set ignore flag to true
-               if ( in_array( 'IGNORE', $options ) ) {
-                       $options = array_diff( $options, [ 'IGNORE' ] );
-                       $this->ignoreDupKeyErrors = true;
-               }
-
-               $ret = null;
-               foreach ( $arrToInsert as $a ) {
-                       // start out with empty identity column, this is so we can return
-                       // it as a result of the INSERT logic
-                       $sqlPre = '';
-                       $sqlPost = '';
-                       $identityClause = '';
-
-                       // if we have an identity column
-                       if ( $identity ) {
-                               // iterate through
-                               foreach ( $a as $k => $v ) {
-                                       if ( $k == $identity ) {
-                                               if ( !is_null( $v ) ) {
-                                                       // there is a value being passed to us,
-                                                       // we need to turn on and off inserted identity
-                                                       $sqlPre = "SET IDENTITY_INSERT $table ON;";
-                                                       $sqlPost = ";SET IDENTITY_INSERT $table OFF;";
-                                               } else {
-                                                       // we can't insert NULL into an identity column,
-                                                       // so remove the column from the insert.
-                                                       unset( $a[$k] );
-                                               }
-                                       }
-                               }
-
-                               // we want to output an identity column as result
-                               $identityClause = "OUTPUT INSERTED.$identity ";
-                       }
-
-                       $keys = array_keys( $a );
-
-                       // Build the actual query
-                       $sql = $sqlPre . 'INSERT ' . implode( ' ', $options ) .
-                               " INTO $table (" . implode( ',', $keys ) . ") $identityClause VALUES (";
-
-                       $first = true;
-                       foreach ( $a as $key => $value ) {
-                               if ( isset( $binaryColumns[$key] ) ) {
-                                       $value = new MssqlBlob( $value );
-                               }
-                               if ( $first ) {
-                                       $first = false;
-                               } else {
-                                       $sql .= ',';
-                               }
-                               if ( is_null( $value ) ) {
-                                       $sql .= 'null';
-                               } else {
-                                       $sql .= $this->addQuotes( $value );
-                               }
-                       }
-                       $sql .= ')' . $sqlPost;
-
-                       // Run the query
-                       $this->scrollableCursor = false;
-                       try {
-                               $ret = $this->query( $sql );
-                       } catch ( Exception $e ) {
-                               $this->scrollableCursor = true;
-                               $this->ignoreDupKeyErrors = false;
-                               throw $e;
-                       }
-                       $this->scrollableCursor = true;
-
-                       if ( $ret instanceof IResultWrapper && !is_null( $identity ) ) {
-                               // Then we want to get the identity column value we were assigned and save it off
-                               $row = $ret->fetchObject();
-                               if ( is_object( $row ) ) {
-                                       $this->lastInsertId = $row->$identity;
-                                       // It seems that mAffectedRows is -1 sometimes when OUTPUT INSERTED.identity is
-                                       // used if we got an identity back, we know for sure a row was affected, so
-                                       // adjust that here
-                                       if ( $this->lastAffectedRowCount == -1 ) {
-                                               $this->lastAffectedRowCount = 1;
-                                       }
-                               }
-                       }
-               }
-
-               $this->ignoreDupKeyErrors = false;
-
-               return true;
-       }
-
-       /**
-        * INSERT SELECT wrapper
-        * $varMap must be an associative array of the form [ 'dest1' => 'source1', ... ]
-        * Source items may be literals rather than field names, but strings should
-        * be quoted with Database::addQuotes().
-        * @param string $destTable
-        * @param array|string $srcTable May be an array of tables.
-        * @param array $varMap
-        * @param array $conds May be "*" to copy the whole table.
-        * @param string $fname
-        * @param array $insertOptions
-        * @param array $selectOptions
-        * @param array $selectJoinConds
-        * @throws Exception
-        */
-       protected function nativeInsertSelect( $destTable, $srcTable, $varMap, $conds, $fname = __METHOD__,
-               $insertOptions = [], $selectOptions = [], $selectJoinConds = []
-       ) {
-               $this->scrollableCursor = false;
-               try {
-                       parent::nativeInsertSelect(
-                               $destTable,
-                               $srcTable,
-                               $varMap,
-                               $conds,
-                               $fname,
-                               $insertOptions,
-                               $selectOptions,
-                               $selectJoinConds
-                       );
-               } catch ( Exception $e ) {
-                       $this->scrollableCursor = true;
-                       throw $e;
-               }
-               $this->scrollableCursor = true;
-       }
-
-       /**
-        * UPDATE wrapper. Takes a condition array and a SET array.
-        *
-        * @param string $table Name of the table to UPDATE. This will be passed through
-        *                Database::tableName().
-        *
-        * @param array $values An array of values to SET. For each array element,
-        *                the key gives the field name, and the value gives the data
-        *                to set that field to. The data will be quoted by
-        *                Database::addQuotes().
-        *
-        * @param array $conds An array of conditions (WHERE). See
-        *                Database::select() for the details of the format of
-        *                condition arrays. Use '*' to update all rows.
-        *
-        * @param string $fname The function name of the caller (from __METHOD__),
-        *                for logging and profiling.
-        *
-        * @param array $options An array of UPDATE options, can be:
-        *                   - IGNORE: Ignore unique key conflicts
-        * @return bool
-        * @throws DBUnexpectedError
-        * @throws Exception
-        */
-       function update( $table, $values, $conds, $fname = __METHOD__, $options = [] ) {
-               $table = $this->tableName( $table );
-               $binaryColumns = $this->getBinaryColumns( $table );
-
-               $opts = $this->makeUpdateOptions( $options );
-               $sql = "UPDATE $opts $table SET " . $this->makeList( $values, LIST_SET, $binaryColumns );
-
-               if ( $conds !== [] && $conds !== '*' ) {
-                       $sql .= " WHERE " . $this->makeList( $conds, LIST_AND, $binaryColumns );
-               }
-
-               $this->scrollableCursor = false;
-               try {
-                       $this->query( $sql );
-               } catch ( Exception $e ) {
-                       $this->scrollableCursor = true;
-                       throw $e;
-               }
-               $this->scrollableCursor = true;
-               return true;
-       }
-
-       /**
-        * Makes an encoded list of strings from an array
-        * @param array $a Containing the data
-        * @param int $mode Constant
-        *      - LIST_COMMA:          comma separated, no field names
-        *      - LIST_AND:            ANDed WHERE clause (without the WHERE). See
-        *        the documentation for $conds in Database::select().
-        *      - LIST_OR:             ORed WHERE clause (without the WHERE)
-        *      - LIST_SET:            comma separated with field names, like a SET clause
-        *      - LIST_NAMES:          comma separated field names
-        * @param array $binaryColumns Contains a list of column names that are binary types
-        *      This is a custom parameter only present for MS SQL.
-        *
-        * @throws DBUnexpectedError
-        * @return string
-        */
-       public function makeList( $a, $mode = LIST_COMMA, $binaryColumns = [] ) {
-               if ( !is_array( $a ) ) {
-                       throw new DBUnexpectedError( $this, __METHOD__ . ' called with incorrect parameters' );
-               }
-
-               if ( $mode != LIST_NAMES ) {
-                       // In MS SQL, values need to be specially encoded when they are
-                       // inserted into binary fields. Perform this necessary encoding
-                       // for the specified set of columns.
-                       foreach ( array_keys( $a ) as $field ) {
-                               if ( !isset( $binaryColumns[$field] ) ) {
-                                       continue;
-                               }
-
-                               if ( is_array( $a[$field] ) ) {
-                                       foreach ( $a[$field] as &$v ) {
-                                               $v = new MssqlBlob( $v );
-                                       }
-                                       unset( $v );
-                               } else {
-                                       $a[$field] = new MssqlBlob( $a[$field] );
-                               }
-                       }
-               }
-
-               return parent::makeList( $a, $mode );
-       }
-
-       /**
-        * @param string $table
-        * @param string $field
-        * @return int Returns the size of a text field, or -1 for "unlimited"
-        */
-       public function textFieldSize( $table, $field ) {
-               $table = $this->tableName( $table );
-               $sql = "SELECT CHARACTER_MAXIMUM_LENGTH,DATA_TYPE FROM INFORMATION_SCHEMA.Columns
-                       WHERE TABLE_NAME = '$table' AND COLUMN_NAME = '$field'";
-               $res = $this->query( $sql );
-               $row = $this->fetchRow( $res );
-               $size = -1;
-               if ( strtolower( $row['DATA_TYPE'] ) != 'text' ) {
-                       $size = $row['CHARACTER_MAXIMUM_LENGTH'];
-               }
-
-               return $size;
-       }
-
-       /**
-        * Construct a LIMIT query with optional offset
-        * This is used for query pages
-        *
-        * @param string $sql SQL query we will append the limit too
-        * @param int $limit The SQL limit
-        * @param bool|int $offset The SQL offset (default false)
-        * @return array|string
-        * @throws DBUnexpectedError
-        */
-       public function limitResult( $sql, $limit, $offset = false ) {
-               if ( $offset === false || $offset == 0 ) {
-                       if ( strpos( $sql, "SELECT" ) === false ) {
-                               return "TOP {$limit} " . $sql;
-                       } else {
-                               return preg_replace( '/\bSELECT(\s+DISTINCT)?\b/Dsi',
-                                       'SELECT$1 TOP ' . $limit, $sql, 1 );
-                       }
-               } else {
-                       // This one is fun, we need to pull out the select list as well as any ORDER BY clause
-                       $select = $orderby = [];
-                       $s1 = preg_match( '#SELECT\s+(.+?)\s+FROM#Dis', $sql, $select );
-                       $s2 = preg_match( '#(ORDER BY\s+.+?)(\s*FOR XML .*)?$#Dis', $sql, $orderby );
-                       $postOrder = '';
-                       $first = $offset + 1;
-                       $last = $offset + $limit;
-                       $sub1 = 'sub_' . $this->subqueryId;
-                       $sub2 = 'sub_' . ( $this->subqueryId + 1 );
-                       $this->subqueryId += 2;
-                       if ( !$s1 ) {
-                               // wat
-                               throw new DBUnexpectedError( $this, "Attempting to LIMIT a non-SELECT query\n" );
-                       }
-                       if ( !$s2 ) {
-                               // no ORDER BY
-                               $overOrder = 'ORDER BY (SELECT 1)';
-                       } else {
-                               if ( !isset( $orderby[2] ) || !$orderby[2] ) {
-                                       // don't need to strip it out if we're using a FOR XML clause
-                                       $sql = str_replace( $orderby[1], '', $sql );
-                               }
-                               $overOrder = $orderby[1];
-                               $postOrder = ' ' . $overOrder;
-                       }
-                       $sql = "SELECT {$select[1]}
-                                       FROM (
-                                               SELECT ROW_NUMBER() OVER({$overOrder}) AS rowNumber, *
-                                               FROM ({$sql}) {$sub1}
-                                       ) {$sub2}
-                                       WHERE rowNumber BETWEEN {$first} AND {$last}{$postOrder}";
-
-                       return $sql;
-               }
-       }
-
-       /**
-        * If there is a limit clause, parse it, strip it, and pass the remaining
-        * SQL through limitResult() with the appropriate parameters. Not the
-        * prettiest solution, but better than building a whole new parser. This
-        * exists becase there are still too many extensions that don't use dynamic
-        * sql generation.
-        *
-        * @param string $sql
-        * @return array|mixed|string
-        */
-       public function LimitToTopN( $sql ) {
-               // Matches: LIMIT {[offset,] row_count | row_count OFFSET offset}
-               $pattern = '/\bLIMIT\s+((([0-9]+)\s*,\s*)?([0-9]+)(\s+OFFSET\s+([0-9]+))?)/i';
-               if ( preg_match( $pattern, $sql, $matches ) ) {
-                       $row_count = $matches[4];
-                       $offset = $matches[3] ?: $matches[6] ?: false;
-
-                       // strip the matching LIMIT clause out
-                       $sql = str_replace( $matches[0], '', $sql );
-
-                       return $this->limitResult( $sql, $row_count, $offset );
-               }
-
-               return $sql;
-       }
-
-       /**
-        * @return string Wikitext of a link to the server software's web site
-        */
-       public function getSoftwareLink() {
-               return "[{{int:version-db-mssql-url}} MS SQL Server]";
-       }
-
-       /**
-        * @return string Version information from the database
-        */
-       public function getServerVersion() {
-               $server_info = sqlsrv_server_info( $this->conn );
-               $version = $server_info['SQLServerVersion'] ?? 'Error';
-
-               return $version;
-       }
-
-       /**
-        * @param string $table
-        * @param string $fname
-        * @return bool
-        */
-       public function tableExists( $table, $fname = __METHOD__ ) {
-               list( $db, $schema, $table ) = $this->tableName( $table, 'split' );
-
-               if ( $db !== false ) {
-                       // remote database
-                       $this->queryLogger->error( "Attempting to call tableExists on a remote table" );
-                       return false;
-               }
-
-               if ( $schema === false ) {
-                       $schema = $this->dbSchema();
-               }
-
-               $res = $this->query( "SELECT 1 FROM INFORMATION_SCHEMA.TABLES
-                       WHERE TABLE_TYPE = 'BASE TABLE'
-                       AND TABLE_SCHEMA = '$schema' AND TABLE_NAME = '$table'" );
-
-               if ( $res->numRows() ) {
-                       return true;
-               } else {
-                       return false;
-               }
-       }
-
-       /**
-        * Query whether a given column exists in the mediawiki schema
-        * @param string $table
-        * @param string $field
-        * @param string $fname
-        * @return bool
-        */
-       public function fieldExists( $table, $field, $fname = __METHOD__ ) {
-               list( $db, $schema, $table ) = $this->tableName( $table, 'split' );
-
-               if ( $db !== false ) {
-                       // remote database
-                       $this->queryLogger->error( "Attempting to call fieldExists on a remote table" );
-                       return false;
-               }
-
-               $res = $this->query( "SELECT 1 FROM INFORMATION_SCHEMA.COLUMNS
-                       WHERE TABLE_SCHEMA = '$schema' AND TABLE_NAME = '$table' AND COLUMN_NAME = '$field'" );
-
-               if ( $res->numRows() ) {
-                       return true;
-               } else {
-                       return false;
-               }
-       }
-
-       public function fieldInfo( $table, $field ) {
-               list( $db, $schema, $table ) = $this->tableName( $table, 'split' );
-
-               if ( $db !== false ) {
-                       // remote database
-                       $this->queryLogger->error( "Attempting to call fieldInfo on a remote table" );
-                       return false;
-               }
-
-               $res = $this->query( "SELECT * FROM INFORMATION_SCHEMA.COLUMNS
-                       WHERE TABLE_SCHEMA = '$schema' AND TABLE_NAME = '$table' AND COLUMN_NAME = '$field'" );
-
-               $meta = $res->fetchRow();
-               if ( $meta ) {
-                       return new MssqlField( $meta );
-               }
-
-               return false;
-       }
-
-       protected function doSavepoint( $identifier, $fname ) {
-               $this->query( 'SAVE TRANSACTION ' . $this->addIdentifierQuotes( $identifier ), $fname );
-       }
-
-       protected function doReleaseSavepoint( $identifier, $fname ) {
-               // Not supported. Also not really needed, a new doSavepoint() for the
-               // same identifier will overwrite the old.
-       }
-
-       protected function doRollbackToSavepoint( $identifier, $fname ) {
-               $this->query( 'ROLLBACK TRANSACTION ' . $this->addIdentifierQuotes( $identifier ), $fname );
-       }
-
-       protected function doBegin( $fname = __METHOD__ ) {
-               if ( !sqlsrv_begin_transaction( $this->conn ) ) {
-                       $this->reportQueryError( $this->lastError(), $this->lastErrno(), 'BEGIN', $fname );
-               }
-       }
-
-       /**
-        * End a transaction
-        * @param string $fname
-        */
-       protected function doCommit( $fname = __METHOD__ ) {
-               if ( !sqlsrv_commit( $this->conn ) ) {
-                       $this->reportQueryError( $this->lastError(), $this->lastErrno(), 'COMMIT', $fname );
-               }
-       }
-
-       /**
-        * Rollback a transaction.
-        * No-op on non-transactional databases.
-        * @param string $fname
-        */
-       protected function doRollback( $fname = __METHOD__ ) {
-               if ( !sqlsrv_rollback( $this->conn ) ) {
-                       $this->queryLogger->error(
-                               "{fname}\t{db_server}\t{errno}\t{error}\t",
-                               $this->getLogContext( [
-                                       'errno' => $this->lastErrno(),
-                                       'error' => $this->lastError(),
-                                       'fname' => $fname,
-                                       'trace' => ( new RuntimeException() )->getTraceAsString()
-                               ] )
-                       );
-               }
-       }
-
-       /**
-        * @param string $s
-        * @return string
-        */
-       public function strencode( $s ) {
-               // Should not be called by us
-               return str_replace( "'", "''", $s );
-       }
-
-       /**
-        * @param string|int|null|bool|Blob $s
-        * @return string|int
-        */
-       public function addQuotes( $s ) {
-               if ( $s instanceof MssqlBlob ) {
-                       return $s->fetch();
-               } elseif ( $s instanceof Blob ) {
-                       // this shouldn't really ever be called, but it's here if needed
-                       // (and will quite possibly make the SQL error out)
-                       $blob = new MssqlBlob( $s->fetch() );
-                       return $blob->fetch();
-               } else {
-                       if ( is_bool( $s ) ) {
-                               $s = $s ? 1 : 0;
-                       }
-                       return parent::addQuotes( $s );
-               }
-       }
-
-       /**
-        * @param string $s
-        * @return string
-        */
-       public function addIdentifierQuotes( $s ) {
-               // http://msdn.microsoft.com/en-us/library/aa223962.aspx
-               return '[' . $s . ']';
-       }
-
-       /**
-        * @param string $name
-        * @return bool
-        */
-       public function isQuotedIdentifier( $name ) {
-               return strlen( $name ) && $name[0] == '[' && substr( $name, -1, 1 ) == ']';
-       }
-
-       /**
-        * MS SQL supports more pattern operators than other databases (ex: [,],^)
-        *
-        * @param string $s
-        * @param string $escapeChar
-        * @return string
-        */
-       protected function escapeLikeInternal( $s, $escapeChar = '`' ) {
-               return str_replace( [ $escapeChar, '%', '_', '[', ']', '^' ],
-                       [ "{$escapeChar}{$escapeChar}", "{$escapeChar}%", "{$escapeChar}_",
-                               "{$escapeChar}[", "{$escapeChar}]", "{$escapeChar}^" ],
-                       $s );
-       }
-
-       protected function doSelectDomain( DatabaseDomain $domain ) {
-               if ( $domain->getSchema() !== null ) {
-                       throw new DBExpectedError(
-                               $this,
-                               __CLASS__ . ": domain '{$domain->getId()}' has a schema component"
-                       );
-               }
-
-               $database = $domain->getDatabase();
-               if ( $database !== $this->getDBname() ) {
-                       $sql = 'USE ' . $this->addIdentifierQuotes( $database );
-                       list( $res, $err, $errno ) =
-                               $this->executeQuery( $sql, __METHOD__, self::QUERY_IGNORE_DBO_TRX );
-
-                       if ( $res === false ) {
-                               $this->reportQueryError( $err, $errno, $sql, __METHOD__ );
-                               return false; // unreachable
-                       }
-               }
-               // Update that domain fields on success (no exception thrown)
-               $this->currentDomain = $domain;
-
-               return true;
-       }
-
-       /**
-        * @param array $options An associative array of options to be turned into
-        *   an SQL query, valid keys are listed in the function.
-        * @return array
-        */
-       public function makeSelectOptions( $options ) {
-               $tailOpts = '';
-               $startOpts = '';
-
-               $noKeyOptions = [];
-               foreach ( $options as $key => $option ) {
-                       if ( is_numeric( $key ) ) {
-                               $noKeyOptions[$option] = true;
-                       }
-               }
-
-               $tailOpts .= $this->makeGroupByWithHaving( $options );
-
-               $tailOpts .= $this->makeOrderBy( $options );
-
-               if ( isset( $noKeyOptions['DISTINCT'] ) || isset( $noKeyOptions['DISTINCTROW'] ) ) {
-                       $startOpts .= 'DISTINCT';
-               }
-
-               if ( isset( $noKeyOptions['FOR XML'] ) ) {
-                       // used in group concat field emulation
-                       $tailOpts .= " FOR XML PATH('')";
-               }
-
-               // we want this to be compatible with the output of parent::makeSelectOptions()
-               return [ $startOpts, '', $tailOpts, '', '' ];
-       }
-
-       public function getType() {
-               return 'mssql';
-       }
-
-       /**
-        * @param array $stringList
-        * @return string
-        */
-       public function buildConcat( $stringList ) {
-               return implode( ' + ', $stringList );
-       }
-
-       /**
-        * Build a GROUP_CONCAT or equivalent statement for a query.
-        * MS SQL doesn't have GROUP_CONCAT so we emulate it with other stuff (and boy is it nasty)
-        *
-        * This is useful for combining a field for several rows into a single string.
-        * NULL values will not appear in the output, duplicated values will appear,
-        * and the resulting delimiter-separated values have no defined sort order.
-        * Code using the results may need to use the PHP unique() or sort() methods.
-        *
-        * @param string $delim Glue to bind the results together
-        * @param string|array $table Table name
-        * @param string $field Field name
-        * @param string|array $conds Conditions
-        * @param string|array $join_conds Join conditions
-        * @return string SQL text
-        * @since 1.23
-        */
-       public function buildGroupConcatField( $delim, $table, $field, $conds = '',
-               $join_conds = []
-       ) {
-               $gcsq = 'gcsq_' . $this->subqueryId;
-               $this->subqueryId++;
-
-               $delimLen = strlen( $delim );
-               $fld = "{$field} + {$this->addQuotes( $delim )}";
-               $sql = "(SELECT LEFT({$field}, LEN({$field}) - {$delimLen}) FROM ("
-                       . $this->selectSQLText( $table, $fld, $conds, null, [ 'FOR XML' ], $join_conds )
-                       . ") {$gcsq} ({$field}))";
-
-               return $sql;
-       }
-
-       public function buildSubstring( $input, $startPosition, $length = null ) {
-               $this->assertBuildSubstringParams( $startPosition, $length );
-               if ( $length === null ) {
-                       /**
-                        * MSSQL doesn't allow an empty length parameter, so when we don't want to limit the
-                        * length returned use the default maximum size of text.
-                        * @see https://docs.microsoft.com/en-us/sql/t-sql/statements/set-textsize-transact-sql
-                        */
-                       $length = 2147483647;
-               }
-               return 'SUBSTRING(' . implode( ',', [ $input, $startPosition, $length ] ) . ')';
-       }
-
-       /**
-        * Returns an associative array for fields that are of type varbinary, binary, or image
-        * $table can be either a raw table name or passed through tableName() first
-        * @param string $table
-        * @return array
-        */
-       private function getBinaryColumns( $table ) {
-               $tableRawArr = explode( '.', preg_replace( '#\[([^\]]*)\]#', '$1', $table ) );
-               $tableRaw = array_pop( $tableRawArr );
-
-               if ( $this->binaryColumnCache === null ) {
-                       $this->populateColumnCaches();
-               }
-
-               return $this->binaryColumnCache[$tableRaw] ?? [];
-       }
-
-       /**
-        * @param string $table
-        * @return array
-        */
-       private function getBitColumns( $table ) {
-               $tableRawArr = explode( '.', preg_replace( '#\[([^\]]*)\]#', '$1', $table ) );
-               $tableRaw = array_pop( $tableRawArr );
-
-               if ( $this->bitColumnCache === null ) {
-                       $this->populateColumnCaches();
-               }
-
-               return $this->bitColumnCache[$tableRaw] ?? [];
-       }
-
-       private function populateColumnCaches() {
-               $res = $this->select( 'INFORMATION_SCHEMA.COLUMNS', '*',
-                       [
-                               'TABLE_CATALOG' => $this->getDBname(),
-                               'TABLE_SCHEMA' => $this->dbSchema(),
-                               'DATA_TYPE' => [ 'varbinary', 'binary', 'image', 'bit' ]
-                       ] );
-
-               $this->binaryColumnCache = [];
-               $this->bitColumnCache = [];
-               foreach ( $res as $row ) {
-                       if ( $row->DATA_TYPE == 'bit' ) {
-                               $this->bitColumnCache[$row->TABLE_NAME][$row->COLUMN_NAME] = $row;
-                       } else {
-                               $this->binaryColumnCache[$row->TABLE_NAME][$row->COLUMN_NAME] = $row;
-                       }
-               }
-       }
-
-       /**
-        * @param string $name
-        * @param string $format One of "quoted" (default), "raw", or "split".
-        * @return string|array When the requested $format is "split", a list of database, schema, and
-        *  table name is returned. Database and schema can be `false`.
-        */
-       function tableName( $name, $format = 'quoted' ) {
-               # Replace reserved words with better ones
-               switch ( $name ) {
-                       case 'user':
-                               return $this->realTableName( 'mwuser', $format );
-                       default:
-                               return $this->realTableName( $name, $format );
-               }
-       }
-
-       /**
-        * call this instead of tableName() in the updater when renaming tables
-        * @param string $name
-        * @param string $format One of "quoted" (default), "raw", or "split".
-        * @return string|array When the requested $format is "split", a list of database, schema, and
-        *  table name is returned. Database and schema can be `false`.
-        * @private
-        */
-       function realTableName( $name, $format = 'quoted' ) {
-               $table = parent::tableName( $name, $format );
-               if ( $format == 'split' ) {
-                       // Used internally, we want the schema split off from the table name and returned
-                       // as a list with 3 elements (database, schema, table)
-                       return array_pad( explode( '.', $table, 3 ), -3, false );
-               }
-               return $table;
-       }
-
-       /**
-        * Delete a table
-        * @param string $tableName
-        * @param string $fName
-        * @return bool|IResultWrapper
-        * @since 1.18
-        */
-       public function dropTable( $tableName, $fName = __METHOD__ ) {
-               if ( !$this->tableExists( $tableName, $fName ) ) {
-                       return false;
-               }
-
-               // parent function incorrectly appends CASCADE, which we don't want
-               $sql = "DROP TABLE " . $this->tableName( $tableName );
-
-               return $this->query( $sql, $fName );
-       }
-
-       /**
-        * Called in the installer and updater.
-        * Probably doesn't need to be called anywhere else in the codebase.
-        * @param bool|null $value
-        * @return bool|null
-        */
-       public function prepareStatements( $value = null ) {
-               $old = $this->prepareStatements;
-               if ( $value !== null ) {
-                       $this->prepareStatements = $value;
-               }
-
-               return $old;
-       }
-
-       /**
-        * Called in the installer and updater.
-        * Probably doesn't need to be called anywhere else in the codebase.
-        * @param bool|null $value
-        * @return bool|null
-        */
-       public function scrollableCursor( $value = null ) {
-               $old = $this->scrollableCursor;
-               if ( $value !== null ) {
-                       $this->scrollableCursor = $value;
-               }
-
-               return $old;
-       }
-
-       public function buildStringCast( $field ) {
-               return "CAST( $field AS NVARCHAR )";
-       }
-
-       public static function getAttributes() {
-               return [ self::ATTR_SCHEMAS_AS_TABLE_GROUPS => true ];
-       }
-}
-
-/**
- * @deprecated since 1.29
- */
-class_alias( DatabaseMssql::class, 'DatabaseMssql' );
index ddb3944..4c18911 100644 (file)
@@ -82,8 +82,10 @@ class DatabaseMysqli extends DatabaseMysqlBase {
                }
 
                $mysqli = mysqli_init();
-
-               $connFlags = 0;
+               // Make affectedRows() for UPDATE reflect the number of matching rows, regardless
+               // of whether any column values changed. This is what callers want to know and is
+               // consistent with what Postgres, SQLite, and SQL Server return.
+               $connFlags = MYSQLI_CLIENT_FOUND_ROWS;
                if ( $this->getFlag( self::DBO_SSL ) ) {
                        $connFlags |= MYSQLI_CLIENT_SSL;
                        $mysqli->ssl_set(
index 97c4c9f..b1521dc 100644 (file)
@@ -269,28 +269,6 @@ class DatabaseSqlite extends Database {
                return preg_match( '/^(:memory:$|file:(:memory:|[^?]+\?mode=memory(&|$)))/', $path );
        }
 
-       /**
-        * Check if the searchindext table is FTS enabled.
-        * @return bool False if not enabled.
-        */
-       public function checkForEnabledSearch() {
-               if ( self::$fulltextEnabled === null ) {
-                       self::$fulltextEnabled = false;
-                       $table = $this->tableName( 'searchindex' );
-                       $res = $this->query(
-                               "SELECT sql FROM sqlite_master WHERE tbl_name = '$table'",
-                               __METHOD__,
-                               self::QUERY_IGNORE_DBO_TRX
-                       );
-                       if ( $res ) {
-                               $row = $res->fetchRow();
-                               self::$fulltextEnabled = stristr( $row['sql'], 'fts' ) !== false;
-                       }
-               }
-
-               return self::$fulltextEnabled;
-       }
-
        /**
         * Returns version of currently supported SQLite fulltext search module or false if none present.
         * @return string
index ffbc378..3bb0771 100644 (file)
@@ -178,7 +178,8 @@ class ObjectCache {
                } elseif ( isset( $params['class'] ) ) {
                        $class = $params['class'];
                        // Automatically set the 'async' update handler
-                       $params['asyncHandler'] = $params['asyncHandler'] ?? 'DeferredUpdates::addCallableUpdate';
+                       $params['asyncHandler'] = $params['asyncHandler']
+                               ?? [ DeferredUpdates::class, 'addCallableUpdate' ];
                        // Enable reportDupes by default
                        $params['reportDupes'] = $params['reportDupes'] ?? true;
                        // Do b/c logic for SqlBagOStuff
index 8e0cf5c..d411046 100644 (file)
@@ -2036,6 +2036,7 @@ class Sanitizer {
         *
         * @param string $html HTML fragment
         * @return string
+        * @return-taint tainted
         */
        static function stripAllTags( $html ) {
                // Use RemexHtml to tokenize $html and extract the text
index 9375ef2..84e6edd 100644 (file)
@@ -22,7 +22,6 @@
  */
 
 use MediaWiki\MediaWikiServices;
-use Wikimedia\Rdbms\DatabaseSqlite;
 
 /**
  * Search engine hook for SQLite
@@ -34,14 +33,15 @@ class SearchSqlite extends SearchDatabase {
         * @return bool
         */
        private function fulltextSearchSupported() {
-               // Avoid getConnectionRef() in order to get DatabaseSqlite specifically
-               /** @var DatabaseSqlite $dbr */
-               $dbr = $this->lb->getConnection( DB_REPLICA );
-               try {
-                       return $dbr->checkForEnabledSearch();
-               } finally {
-                       $this->lb->reuseConnection( $dbr );
-               }
+               $dbr = $this->lb->getMaintenanceConnectionRef( DB_REPLICA );
+               $sql = (string)$dbr->selectField(
+                       $dbr->addIdentifierQuotes( 'sqlite_master' ),
+                       'sql',
+                       [ 'tbl_name' => $dbr->tableName( 'searchindex', 'raw' ) ],
+                       __METHOD__
+               );
+
+               return ( stristr( $sql, 'fts' ) !== false );
        }
 
        /**
index b8dce3f..27cd2ab 100644 (file)
@@ -106,4 +106,25 @@ abstract class RedirectSpecialArticle extends RedirectSpecialPage {
                Hooks::run( "RedirectSpecialArticleRedirectParams", [ &$redirectParams ] );
                $this->mAllowedRedirectParams = $redirectParams;
        }
+
+       /**
+        * @inheritDoc
+        */
+       public function getRedirectQuery( $subpage ) {
+               $query = parent::getRedirectQuery( $subpage );
+               $title = $this->getRedirect( $subpage );
+               // Avoid double redirect for action=edit&redlink=1 for existing pages
+               // (compare to the check in EditPage::edit)
+               if (
+                       $query &&
+                       ( $query['action'] === 'edit' || $query['action'] === 'submit' ) &&
+                       (bool)$query['redlink'] &&
+                       $title instanceof Title &&
+                       $title->exists()
+               ) {
+                       return false;
+               }
+               return $query;
+       }
+
 }
index 4f5c150..0425a58 100644 (file)
@@ -286,7 +286,7 @@ class SpecialContributions extends IncludableSpecialPage {
         */
        protected function contributionsSub( $userObj ) {
                if ( $userObj->isAnon() ) {
-                       // Show a warning message that the user being searched for doesn't exists.
+                       // Show a warning message that the user being searched for doesn't exist.
                        // User::isIP returns true for IP address and usemod IPs like '123.123.123.xxx',
                        // but returns false for IP ranges. We don't want to suggest either of these are
                        // valid usernames which we would with the 'contributions-userdoesnotexist' message.
index 8396b4d..9b5dd3f 100644 (file)
@@ -64,7 +64,7 @@ class SpecialCreateAccount extends LoginSignupSpecialPage {
                $user = $this->getUser();
                $status = AuthManager::singleton()->checkAccountCreatePermissions( $user );
                if ( !$status->isGood() ) {
-                       // track block with a cookie if it doesn't exists already
+                       // Track block with a cookie if it doesn't exist already
                        if ( $user->isBlockedFromCreateAccount() ) {
                                MediaWikiServices::getInstance()->getBlockManager()->trackBlockWithCookie( $user );
                        }
index a24d8cd..c124c14 100644 (file)
@@ -62,7 +62,11 @@ class SpecialNewSection extends RedirectSpecialPage {
 
        public function onFormSubmit( $formData ) {
                $title = $formData['page'];
-               $page = Title::newFromText( $title );
+               try {
+                       $page = Title::newFromTextThrow( $title );
+               } catch ( MalformedTitleException $e ) {
+                       return Status::newFatal( $e->getMessageObject() );
+               }
                $query = [ 'action' => 'edit', 'section' => 'new' ];
                $url = $page->getFullUrlForRedirect( $query );
                $this->getOutput()->redirect( $url );
index 722e5ef..b657f13 100644 (file)
@@ -72,26 +72,25 @@ class TitleValue implements LinkTarget {
        /**
         * Constructs a TitleValue.
         *
-        * @note TitleValue expects a valid DB key; typically, a TitleValue is constructed either
-        * from a database entry, or by a TitleParser. We could apply "some" normalization here,
-        * such as substituting spaces by underscores, but that would encourage the use of
-        * un-normalized text when constructing TitleValues. For constructing a TitleValue from
-        * user input or external sources, use a TitleParser.
+        * @note TitleValue expects a valid namespace and name; typically, a TitleValue is constructed
+        * either from a database entry, or by a TitleParser. For constructing a TitleValue from user
+        * input or external sources, use a TitleParser.
         *
         * @param int $namespace The namespace ID. This is not validated.
-        * @param string $dbkey The page title in valid DBkey form. No normalization is applied.
+        * @param string $title The page title in either DBkey or text form. No normalization is applied
+        *   beyond underscore/space conversion.
         * @param string $fragment The fragment title. Use '' to represent the whole page.
         *   No validation or normalization is applied.
         * @param string $interwiki The interwiki component
         *
         * @throws InvalidArgumentException
         */
-       public function __construct( $namespace, $dbkey, $fragment = '', $interwiki = '' ) {
+       public function __construct( $namespace, $title, $fragment = '', $interwiki = '' ) {
                if ( !is_int( $namespace ) ) {
                        throw new ParameterTypeException( '$namespace', 'int' );
                }
-               if ( !is_string( $dbkey ) ) {
-                       throw new ParameterTypeException( '$dbkey', 'string' );
+               if ( !is_string( $title ) ) {
+                       throw new ParameterTypeException( '$title', 'string' );
                }
                if ( !is_string( $fragment ) ) {
                        throw new ParameterTypeException( '$fragment', 'string' );
@@ -101,13 +100,13 @@ class TitleValue implements LinkTarget {
                }
 
                // Sanity check, no full validation or normalization applied here!
-               Assert::parameter( !preg_match( '/^_|[ \r\n\t]|_$/', $dbkey ), '$dbkey',
-                       "invalid DB key '$dbkey'" );
-               Assert::parameter( $dbkey !== '' || ( $fragment !== '' && $namespace === NS_MAIN ),
-                       '$dbkey', 'should not be empty unless namespace is main and fragment is non-empty' );
+               Assert::parameter( !preg_match( '/^[_ ]|[\r\n\t]|[_ ]$/', $title ), '$title',
+                       "invalid name '$title'" );
+               Assert::parameter( $title !== '' || ( $fragment !== '' && $namespace === NS_MAIN ),
+                       '$title', 'should not be empty unless namespace is main and fragment is non-empty' );
 
                $this->namespace = $namespace;
-               $this->dbkey = $dbkey;
+               $this->dbkey = strtr( $title, ' ', '_' );
                $this->fragment = $fragment;
                $this->interwiki = $interwiki;
        }
index 3089341..c6fe5ba 100644 (file)
        "changecontentmodel": "تغيير نموذج المحتوى لصفحة",
        "changecontentmodel-legend": "غير نموذج المحتوى",
        "changecontentmodel-title-label": "عنوان الصفحة",
-       "changecontentmodel-current-label": "نموذج المحتوى الحالي",
+       "changecontentmodel-current-label": "نموذج المحتوى الحالي:",
        "changecontentmodel-model-label": "نموذج محتوى جديد",
        "changecontentmodel-reason-label": "السبب:",
        "changecontentmodel-submit": "تغيير",
        "permanentlink": "وصلة دائمة",
        "permanentlink-revid": "معرف المراجعة",
        "permanentlink-submit": "الذهاب إلى المراجعة",
+       "newsection": "قسم جديد",
+       "newsection-page": "الصفحات المستهدفة",
+       "newsection-submit": "انتقل إلى صفحة",
        "dberr-problems": "عذرا! هذا الموقع يعاني من صعوبات تقنية.",
        "dberr-again": "جرب الانتظار بضع دقائق وإعادة التحميل.",
        "dberr-info": "(لا يمكن الوصول إلى قاعدة البيانات: $1)",
index c4273e9..b8a53e4 100644 (file)
@@ -14,6 +14,7 @@
        "tog-hideminor": "नँवा बदलावमें छोट बदलाव लुकुआवा जाय",
        "tog-hidepatrolled": "नँवा बदलावमें परीक्षित बदलाव लुकुआवा जाय",
        "tog-newpageshidepatrolled": "नवा पन्नन कय सूची में परीक्षित पन्ना लुकुआवा जाय",
+       "tog-hidecategorization": "पृष्ठों का श्रेणीकरण छिपाएं",
        "tog-extendwatchlist": "खाली हालिए कय नाहीं, बल्कि कुल बदलाव कय देखावे कय लिए ध्यानसूची कय विस्तारित करा जाय",
        "tog-usenewrc": "नँवा बदलाव में अउर ध्यानसूची बदलाव कय पन्ना अनुसार समूह में बाँटा जाय",
        "tog-numberheadings": "शीर्षक स्व-क्रमांकित करा जाय",
@@ -23,6 +24,7 @@
        "tog-watchdefault": "हमार सम्पादन करल पन्ना अव फाइल कय ध्यानसूची में जोडो",
        "tog-watchmoves": "हमरे द्वारा  घुसकाइल पन्ना अव फ़ाइल कय हमरे ध्यानसूची में जोडो",
        "tog-watchdeletion": "हमार हटावल पन्ना अव फाइल कय हमरे ध्यानसूची में जोडो",
+       "tog-watchuploads": "मेरे द्वारा अपलोड की गयी नई फ़ाइलें मेरी ध्यानसूची में जोडें",
        "tog-watchrollback": "हमार प्रत्यापन्न (रोलबैक) करल  पन्ना कय हमरे ध्यानसूची में जोडो।",
        "tog-minordefault": "हमार कुल सम्पादन छोट बदलाव होय",
        "tog-previewontop": "सम्पादन बक्सा कय ऊप्पर झलक देखावो",
        "tog-enotifminoredits": "छोटे परिवर्तन कय लिए भी हम्म्य ई-मेल पठवो",
        "tog-enotifrevealaddr": "अधिसूचना ई-मेल में हमार ई-मेल ठाँव देखावो",
        "tog-shownumberswatching": "ध्यान रख्खय वाले सदस्यन् कय संख्या देखावो",
-       "tog-oldsig": "à¤\85भिन à¤\95य हस्ताक्षर:",
+       "tog-oldsig": "à¤\86पà¤\95ा à¤µà¤°à¥\8dतमान हस्ताक्षर:",
        "tog-fancysig": "हस्ताक्षर कय विकिपाठ जैसन मानों (बिना स्वचालित कड़ी कय)",
-       "tog-uselivepreview": "सà¤\9cिव à¤\9dलà¤\95 à¤¦à¥\87à¤\96ा à¤\9cाय",
+       "tog-uselivepreview": "सà¤\9cà¥\80वन à¤\9dलà¤\95 à¤\95ा à¤\89पयà¥\8bà¤\97 à¤\95रà¥\87à¤\82",
        "tog-forceeditsummary": "यदि सम्पादन सारांश नाई दिहा है तो हम्मै बतावा जाय",
        "tog-watchlisthideown": "हमरे ध्यानसूची से हमार करल बदलाव लुकुवाओ",
        "tog-watchlisthidebots": "हमरे ध्यानसूची से बॉट कय करल परिवर्तन लुकुवाओ",
        "tog-watchlisthideminor": "हमरे ध्यानसूची से छोट बदलाव लुकुवाओ",
        "tog-watchlisthideliu": "हमरे ध्यानसूची में ल़ाग इन करल सदस्यन् कय सम्पादन ना देखावा जाय",
+       "tog-watchlistreloadautomatically": "जब भी छननी बदलने पर ध्यानसूची को अपने आप ही लोड करें (जावास्क्रिप्ट अनिवार्य)",
+       "tog-watchlistunwatchlinks": "देखनेवाली सूची प्रविष्टियों के लिए सीधा अनदेखा/देखा चिह्न ({{int:Watchlist-unwatch}}/{{int:Watchlist-unwatch-undo}}) पृष्ठों को परिवर्तन के साथ जोड़ें (टॉगल के कार्य करने हेतु जावास्क्रिप्ट आवश्यक है)",
        "tog-watchlisthideanons": "आइ॰पी सदस्यन् कय करल सम्पादन हमरे ध्यानसूची में ना देखाओ",
        "tog-watchlisthidepatrolled": "परीक्षित सम्पादन हमरे ध्यानसूची में लुकुवाओ",
+       "tog-watchlisthidecategorization": "पृष्ठों का श्रेणीकरण छुपाएँ",
        "tog-ccmeonemails": "हमरे द्वारा अउर सदस्यन् कय पठावल् ई-मेल कय प्रति हमहु कय पठओ",
        "tog-diffonly": "अवतरणन् में अन्तर देखावत समय पुरान अवतरण ना देखाओ",
        "tog-showhiddencats": "लुकुवावल श्रेणि देखाओ",
-       "tog-norollbackdiff": "समà¥\8dपादन à¤µà¤¾à¤ªà¤¿à¤¸ à¤²à¥\87वà¥\87à¤\95 à¤¬à¤¾à¤¦ à¤\85नà¥\8dतर à¤¨à¤¾ à¤¦à¥\87à¤\96ाà¤\93",
+       "tog-norollbackdiff": "समà¥\8dपादन à¤µà¤¾à¤ªà¤¸ à¤²à¥\87नà¥\87 à¤\95à¥\87 à¤¬à¤¾à¤¦ à¤\85नà¥\8dतर à¤¨ à¤¦à¤¿à¤\96ायà¥\87à¤\82",
        "tog-useeditwarning": "जब हम कवनो सम्पादन पन्ना कय बिना सहेजे बदलाव कय साथे छोड दि तव हम्मै बतावो।",
-       "tog-prefershttps": "लॉगिन करेक बाद हमेशा सुरक्षित कनेक्शन कय प्रयोग करो",
+       "tog-prefershttps": "सत्र आरम्भ करते समय सदैव सुरक्षित कनेक्शन का प्रयोग करें",
+       "tog-showrollbackconfirmation": "रोलबैक लिंक पर क्लिक करते समय एक पुष्टिकरण संकेत दिखाएं",
        "underline-always": "हमेशा",
        "underline-never": "कब्बो नाई",
        "underline-default": "देखावट या ब्राउज़र डिफ़ॉल्ट",
        "october-date": "अक्टूबर $1",
        "november-date": "नोभेम्बर $1",
        "december-date": "डिसेम्बर $1",
+       "period-am": "पूर्वाह्न",
+       "period-pm": "अपराह्न",
        "pagecategories": "{{PLURAL:$1|श्रेणी|श्रेणिन्}}",
        "category_header": "\"$1\" श्रेणी में पन्ना",
        "subcategories": "उपश्रेणिन्",
        "newwindow": "(नवा विंडो में खुलत अहै)",
        "cancel": "रद्द करा जाय",
        "moredotdotdot": "अउर...",
-       "morenotlisted": "à¤\88 à¤ªà¥\82रा à¤¸à¥\82à¤\9aà¥\80 à¤¨à¤¾à¤\88 होय।",
+       "morenotlisted": "हà¥\8bà¤\87 à¤¸à¤\95त à¤¹à¥\88 à¤¸à¥\82à¤\9aà¥\80 à¤ªà¥\82रà¥\80 à¤¨à¤¾ होय।",
        "mypage": "पन्ना",
        "mytalk": "बातचीत",
-       "anontalk": "à¤\88 à¤\86à¤\87॰पà¥\80 à¤\95य à¤\96रतिन à¤¬à¤¾à¤¤à¤\9aà¥\80त",
+       "anontalk": "बतà¤\95हà¥\80",
        "navigation": "घुमाई",
        "and": "&#32;अउर",
        "faq": "साधारण सवाल",
        "returnto": "$1 मे लौटो।",
        "tagline": "{{SITENAME}} से",
        "help": "मदद",
+       "help-mediawiki": "मीडियाविकि के बारे मा सहायता",
        "search": "खोजा जाय",
+       "search-ignored-headings": " #<!-- इस पंक्ति को जैसा है वैसा ही रहने दें। --> <pre>\n# शीर्षक, जिसे खोजते समय अनदेखा कर दिया जाता है।\n# इसमें कोई भी बदलाव तुरंत दिखाई देता है, जब वह शीर्षक इंडेक्स हो जाता है।\n# आप किसी पृष्ठ को फिर से इंडेक्स करने के लिए रिक्त सम्पादन कर सकते हैं।\n# इन चिन्हों का पालन करें:\n#   * हर चीज जो \"#\" से शुरू होता है, वह केवल टिप्पणी है।\n#   * हर बिना रिक्त पंक्ति एक सटीक शीर्षक है, जो रूप आदि हर चीज को अनदेखा कर देता है।\nसन्दर्भ\nबाहरी कड़ियाँ\nइन्हें भी देखें\n #</pre> <!-- इस पंक्ति को जैसा है वैसा ही रहने दें।  -->",
        "searchbutton": "खोजा जाय",
        "go": "जावा जाय",
        "searcharticle": "जावा जाय",
        "history": "पन्ना कय इतिहास",
        "history_short": "इतिहास",
+       "history_small": "इतिहास",
        "updatedmarker": "हमरे अन्तिम दाँइ आवे कय बाद कय अपडेट",
        "printableversion": "छापए लायक संस्करण",
        "permalink": "स्थायी कड़ी",
        "talk": "चर्चा",
        "views": "दर्शाव",
        "toolbox": "औजार कय बक्सा",
+       "tool-link-userrights": "{{GENDER:$1|सदस्य}} समूह बदलें",
+       "tool-link-userrights-readonly": "{{GENDER:$1|सदस्य}} समूह देखें",
+       "tool-link-emailuser": "इस {{GENDER:$1|सदस्य}} को ई-मेल करें।",
        "imagepage": "फ़ाइल पन्ना देखा जाय",
        "mediawikipage": "सनेशा पन्ना देखा जाय",
        "templatepage": "साँचा पन्ना देखा जाय",
        "nstab-template": "साँचा",
        "nstab-help": "मदद पन्ना",
        "nstab-category": "श्रेणी",
+       "mainpage-nstab": "प्रधान पन्ना",
        "nosuchaction": "अईसन कवनो काम नाई है",
        "nosuchactiontext": "इ यू॰आर॰एल से निर्दिष्ट काम अवैध है।\nआप यू॰आर॰एल गलत लिखा गा है, या कवनो गलत कड़ी कय प्रयोग करा गा है।\nई {{SITENAME}} कय सॉफ़्टवेयर में त्रुटि भी होई सकत है।",
        "nosuchspecialpage": "अईसन कौनो विशेष पन्ना नाई है",
        "databaseerror-query": "अनुरोध: $1",
        "databaseerror-function": "फ़ंक्शन: $1",
        "databaseerror-error": "त्रुटि: $1",
+       "transaction-duration-limit-exceeded": "उच्च प्रतिकृति अंतराल निर्माण से बचने के लिए, यह मसौदा निरस्त किया गया क्योंकि लेखन काल ($1) दूसरी सीमा $2 को पार कर गया।\nयदि आप कई आयटमों को एक साथ परिवर्तित कर रहे हैं तो इसके स्थान पर अधिक संख्या में छोटी संक्रियायें करें।",
        "laggedslavemode": "'''चेतावनी:''' यह पृष्ठ अद्यतनीत जानकारी-युक्त ना होने की आशंका है।",
        "readonly": "डाटाबेस लॉक करा है",
        "enterlockreason": "लॉक करने का कारण दीजिए, साथ ही लॉक खुलने के समय का लगभग आकलन दिजीये।",
-       "readonlytext": "शायद मेंटेनन्स के चलते डाटाबेस नये संपादन और अन्य बदलावों से लॉक किया गया है, जिसके बाद यह सामान्य स्थिति में आ जाना चाहिये।\n\nजिस प्रबंधक ने यह लॉक किया था उसने यह कारण दिया है: $1",
+       "readonlytext": "शायद à¤®à¥\87à¤\82à¤\9fà¥\87ननà¥\8dस à¤\95à¥\87 à¤\9aलतà¥\87 à¤¡à¤¾à¤\9fाबà¥\87स à¤¨à¤¯à¥\87 à¤¸à¤\82पादन à¤\94र à¤\85नà¥\8dय à¤¬à¤¦à¤²à¤¾à¤µà¥\8bà¤\82 à¤¸à¥\87 à¤²à¥\89à¤\95 à¤\95िया à¤\97या à¤¹à¥\88, à¤\9cिसà¤\95à¥\87 à¤¬à¤¾à¤¦ à¤¯à¤¹ à¤¸à¤¾à¤®à¤¾à¤¨à¥\8dय à¤¸à¥\8dथिति à¤®à¥\87à¤\82 à¤\86 à¤\9cाना à¤\9aाहियà¥\87।\n\nà¤\9cिस à¤\95ारà¥\8dयà¤\95ारà¥\80 à¤ªà¥\8dरबà¤\82धà¤\95 à¤¨à¥\87 à¤¯à¤¹ à¤²à¥\89à¤\95 à¤\95िया à¤¥à¤¾ à¤\89सनà¥\87 à¤¯à¤¹ à¤\95ारण à¤¦à¤¿à¤¯à¤¾ à¤¹à¥\88: $1",
        "missing-article": "डाटाबेस में $2 के अंदर कहीं भी \"$1\" नहीं मिला।\n\nआम तौर पर हटाए जा चुके पृष्ठ की इतिहास कड़ी का प्रयोग करने पर ऐसा होता है।\n\nअगर ऐसा नहीं है, तो शायद आपने सॉफ़्टवेयर में त्रुटि खोज ली है।\nकृपया यू॰आर॰एल पते समेत किसी [[Special:ListUsers/sysop|प्रबंधक]] को इसका ब्यौरा दें।",
        "missingarticle-rev": "(अवतरण#: $1)",
        "missingarticle-diff": "(अंतर: $1, $2)",
        "readonly_lag": "उपमुख्य डाटाबेस सर्वर मुख्य डाटाबेस सर्वर के बराबर अद्यातानीत होने तक मुख्य डाटाबेस सर्वर लॉक हो गया है।",
+       "nonwrite-api-promise-error": "'Promise-Non-Write-API-Action' को एचटीटीपी शीर्षक द्वारा भेजा पर एपीआई में लेखन मॉड्यूल है।",
        "internalerror": "आन्तरिक त्रुटि",
        "internalerror_info": "आन्तरिक त्रुटि: $1",
        "internalerror-fatal-exception": "प्रकार की गंभीर अपवाद \"$1\"",
        "badarticleerror": "यह पन्ना पे ई काम नाई कई सका जात अहै।",
        "cannotdelete": "\"$1\" पन्ना या फ़ाइल कय नाई हटाय सका जात अहै।\nशायद केहु अउर एका पहिलवे हटाई दिहे है।",
        "cannotdelete-title": "\"$1\" पन्ना नाई मेटाए सका जात है",
+       "delete-scheduled": "पृष्ठ \"$1\" को हटाने के लिए अनुसूचित किया गया है।\nकृपया शान्त रहें।",
        "delete-hook-aborted": "हुक द्वारा हटाना बीच में ही छोड़ा गया।\nइसने कोई कारण नहीं बताया।",
        "no-null-revision": "\"$1\" पृष्ठ के लिए बिना बदलावों का नया अवतरण बनाने में असफल।",
        "badtitle": "खराब शीर्षक",
        "title-invalid-empty": "निवेदित पन्ना कय शीर्षक खाली है या खाली नामस्थान है।",
        "title-invalid-utf8": "निवेदित पन्ना कय शीर्षक अवैध यू०टी०एफ़-८ कय सिलसिला राखत है।",
        "title-invalid-interwiki": "निवेदित पन्ना कय शीर्षक एकठु अंतर-विकी कड़ी रक्खत है जवने कय शीर्षक मा प्रयोग नाइ कै सका जात है।",
+       "title-invalid-talk-namespace": "निवेदित पृष्ठ का शीर्षक एक वार्ता पृष्ठ से सन्दर्भित है जो मौजूद नहीं है।",
+       "title-invalid-characters": "निवेदित पृष्ठ का शीर्षक अवैध कैरेक्टर: \"$1\" रखता है।",
+       "title-invalid-relative": "शीर्षक एक सन्दर्भित मार्ग रखता है। सन्दर्भित पृष्ठ के शीर्षक (./, ../)अवैध हैं, क्योंकि वे अधिकांश रूप पहुँच से बाहर हैं जब उन्हें उपयोगकर्ता के ब्रौज़र से प्रयोग में लाने का प्रयास किया जाता है।",
+       "title-invalid-magic-tilde": "निवेदित पृष्ठ का शीर्षक अवैध जादूई टिल्ड सिलसिला रखता है।",
+       "title-invalid-too-long": "माँग किए गए पृष्ठ का शीर्षक बहुत लम्बा है। इसे यू०टी०एफ़० कोडिंग मे $1 {{PLURAL:$1|बाइट|बाइट्स}} से बढ़कर नहीं होना चाहिए और इसे यू०टी०एफ़०-८ एनकोडिंग में होना चाहिए।",
+       "title-invalid-leading-colon": "निवेदित पृष्ठ का शीर्षक प्रारंभ में अवैध कोलन रखता है।",
        "perfcached": "नीचे दिया हुआ डेटा कैशे मेमोरी से लिया हुआ है, अतः हो सकता है कि इसका पूर्ण अद्यतन न हुआ हो। कैशे मेमोरी में अधिकतम {{PLURAL:$1|एक  नतीजा|$1 नतीजे}} उपलब्ध हैं।",
        "perfcachedts": "नीचे दिया हुआ डेटा कैशे मेमोरी से है, और इसका अंतिम अद्यतन $1 को हुआ था। कैशे मेमोरी में अधिकतम {{PLURAL:$4|एक  नतीजा|$4 नतीजे}} उपलब्ध हैं।",
        "querypage-no-updates": "इस पृष्ठ का नवीनीकरण करना मना है। अभी यहाँ के डाटा को ताज़ा नहीं कर सकते।",
        "viewsource": "स्रोत देखा जाय",
        "viewsource-title": "$1 कय लिए स्रोत देखा जाय",
        "actionthrottled": "काम खतम कई दिहा है",
-       "actionthrottledtext": "सà¥\8dपà¥\88म à¤\95य à¤°à¥\8bà¤\95à¥\87à¤\95à¥\8d à¤²à¤¿à¤¯à¥\87, à¤\87 à¤\95ाम à¤\8fतना à¤\95म à¤¸à¤®à¤¯ à¤®à¥\87à¤\82 à¤\8fà¤\95ठà¥\81 à¤¸à¥\80मा à¤¸à¥\87 à¤¢à¥\87र à¤¦à¤¾à¤\81à¤\87 à¤\95रà¥\87 à¤\95य à¤®à¤¿à¤¨à¤¾à¤¹à¥\80 à¤¹à¥\88, à¤\85व à¤\86प à¤\87 à¤¸à¥\80मा à¤\95य à¤ªà¤¾à¤° à¤\95à¤\88 à¤\9aà¥\81à¤\95ा à¤\97ा à¤¹à¥\88।\nà¤\95à¥\83पया à¤\95à¥\81à¤\9b à¤¸à¤®à¤¯ à¤¬à¤¾à¤¦ à¤«à¤¿à¤° à¤¸à¥\87 à¤ªà¥\8dरयास à¤\95रा à¤\9cाय।",
+       "actionthrottledtext": "सà¥\8dपà¥\88म à¤\95à¥\80 à¤°à¥\8bà¤\95थाम à¤\95à¥\87 à¤²à¤¿à¤¯à¥\87, à¤¯à¤¹ à¤\95à¥\8dरिया à¤\87तनà¥\87 à¤\95म à¤¸à¤®à¤¯ à¤®à¥\87à¤\82 à¤\8fà¤\95 à¤¸à¥\80मा à¤¸à¥\87 à¤\85धिà¤\95 à¤¬à¤¾à¤° à¤\95रनà¥\87 à¤¸à¥\87 à¤®à¤¨à¤¾à¤\88 à¤¹à¥\88, à¤\94र à¤\86प à¤\87स à¤¸à¥\80मा à¤\95à¥\8b à¤ªà¤¾à¤° à¤\95र à¤\9aà¥\81à¤\95à¥\87 à¤¹à¥\88à¤\82।\nà¤\95à¥\83पया à¤\95à¥\81à¤\9b à¤¸à¤®à¤¯ à¤¬à¤¾à¤¦ à¤ªà¥\81न: à¤¯à¤¤à¥\8dन à¤\95रà¥\87à¤\82।",
        "protectedpagetext": "ई पन्ना संपादन अव अउर काम से सुरक्षित किहा है।",
        "viewsourcetext": "आप इ पन्ना कय स्रोत देखी सका जात है औ ओकर नकल उतार सका जात है:",
-       "viewyourtext": "à¤\86प à¤\88 à¤ªà¤¨à¥\8dना à¤®à¥\87à¤\82 ''à¤\86पन à¤¸à¤®à¥\8dपादन'' à¤\95य à¤¸à¥\8dरà¥\8bत à¤¦à¥\87à¤\96à¥\80 à¤¸à¤\95ा à¤\9cात à¤¹à¥\88 à¤\94 à¤\93à¤\95र à¤¨à¤\95ल à¤\89तार à¤¸à¤\95ा à¤\9cात à¤¹à¥\88:",
+       "viewyourtext": "à¤\86प à¤\87स à¤ªà¥\83षà¥\8dठ à¤®à¥\87à¤\82 ''à¤\85पनà¥\87 à¤¸à¤®à¥\8dपादन'' à¤\95ा à¤¸à¥\8dरà¥\8bत à¤¦à¥\87à¤\96 à¤¸à¤\95तà¥\87 à¤¹à¥\88à¤\82 à¤\94र à¤\89सà¤\95à¥\80 à¤¨à¤\95ल à¤\89तार à¤¸à¤\95तà¥\87 à¤¹à¥\88à¤\82:",
        "protectedinterface": "इ पन्ना  विकी कय सॉफ़्टवेयर कय इंटरफ़ेस पाठ देत है,अव एकर गलत प्रयोग से बचावेक लिये सुरक्षित करा है।\nकुल विकिन् कय लिए अनुवाद जोड़य या बदलय कय लिए कृपया मीडियाविकि कय क्षेत्रीयकरण प्रकल्प [https://translatewiki.net/ translatewiki.net] कय प्रयोग करा जाय।",
        "editinginterface": "<strong>चेतावनी:</strong> आप एकठु अइसन पन्ना कय बदलय जावा जात हैं जवन सॉफ़्टवेयर कय इंटरफ़ेस पाठ देत है।\nइ पन्ना कय बदलय से अउर सदस्यन् कय देखावेवाला इंटरफ़ेस कय शकल सूरत में बदलाव आई जाइ।",
        "translateinterface": "कुल विकिन् कय ट्रान्सलेशन करय अव बदलय खर्तिन [https://translatewiki.net/ ट्रान्शलेटविकि.नेट] कय प्रयोग करा जाय ।",
-       "cascadeprotected": "à¤\88 à¤ªà¤¨à¥\8dना à¤¸à¥\81रà¤\95à¥\8dषित à¤¹à¥\88, à¤\95ाहà¥\87 à¤¸à¥\87 à¤\87 à¤¨à¤¿à¤\9aà¥\87 à¤¦à¤¿à¤¹à¤¾ {{PLURAL:$1|पनà¥\8dना|पनà¥\8dननà¥\8d}} à¤\95य à¤¸à¥\81रà¤\95à¥\8dषा-सà¥\80ढ़à¥\80 à¤®à¥\87à¤\82 है:\n$2",
+       "cascadeprotected": "यह à¤ªà¥\83षà¥\8dठ à¤¸à¥\81रà¤\95à¥\8dषित à¤¹à¥\88à¤\82, à¤\95à¥\8dयà¥\8bà¤\82à¤\95ि à¤¯à¤¹ à¤¨à¤¿à¤®à¥\8dनलिà¤\96ित {{PLURAL:$1|पà¥\83षà¥\8dठ|पà¥\83षà¥\8dठà¥\8bà¤\82}} à¤\95à¥\80 à¤¸à¥\81रà¤\95à¥\8dषा-सà¥\80ढ़à¥\80 à¤®à¥\87à¤\82 à¤¸à¤®à¤¾à¤µà¤¿à¤·à¥\8dà¤\9f है:\n$2",
        "namespaceprotected": "आप कय '''$1''' नामस्थान में रहल पन्नन कय बदलै कय अनुमति नाइ है।",
        "customcssprotected": "आप कय इ CSS पन्ना कय संपादन करेक अनुमति नाई है, काहे से एहमा अउर सदस्य कय व्यक्तिगत सेटिंग्स शामिल है।",
+       "customjsonprotected": "आपको इस JSON पृष्ठ को संपादित करने की अनुमति नहीं है, क्योंकि इसमें अन्य सदस्य की व्यक्तिगत सेटिंग्स शामिल हैं।",
        "customjsprotected": "आप कय इ जावास्क्रिप्ट पन्ना कय संपादन करेक अनुमति नाई है, काहे से एहमा अउर सदस्य कय व्यक्तिगत सेटिंग्स शामिल है।",
+       "sitecssprotected": "आपको इस सी.एस.एस पृष्ठ को सम्पादित करने की अनुमति नहीं है क्योंकि यह सभी प्रयोक्ताओं को प्रभावित कर सकता है।",
+       "sitejsonprotected": "आपको इस JSON पृष्ठ को सम्पादित करने की अनुमति नहीं है क्योंकि यह सभी प्रयोक्ताओं को प्रभावित कर सकता है।",
+       "sitejsprotected": "आपको इस जावास्क्रिप्ट पृष्ठ को सम्पादित करने की अनुमति नहीं है क्योंकि यह सभी प्रयोक्ताओं को प्रभावित कर सकता है।",
        "mycustomcssprotected": "आप कय इ CSS पन्ना कय संपादन करेक अनुमति नाई है ।",
+       "mycustomjsonprotected": "आपके पास इस JSON पृष्ठ को सम्पादित करने का अधिकार नहीं है।",
        "mycustomjsprotected": "आप कय इ जावास्क्रिप्ट पन्ना कय संपादन करेक अधिकार नाई है ।",
        "myprivateinfoprotected": "आप कय लगे आपन व्यक्तिगत जानकारी बदलेक अनुमति नाई है।",
        "mypreferencesprotected": "आप कय लगे आपन वरीयता बदलेक  अनुमति नाई है।",
        "ns-specialprotected": "विशेष पन्ना सम्पादित नाई होइहैं।",
        "titleprotected": "सदस्य [[User:$1|$1]] इ शीर्षक कय पन्ना बनावे से सुरक्षित करे हँय।\nएकरे लिये कारण होय: <em>$2</em>",
-       "filereadonlyerror": "\"$1\" फ़ाइल को बदलने में असक्षम क्योंकि भण्डार \"$2\" इस समय 'केवल पाठन हेतु' (रीड ओनली) है।\n\nजिस प्रबंधक ने ये प्रबंध लगाया है उन्होंने निम्न विवरण प्रदान किया है: \"$3\"।",
+       "filereadonlyerror": "\"$1\" फ़ाइल को बदलने में असक्षम क्योंकि भण्डार \"$2\" इस समय 'केवल पाठन हेतु' (रीड ओनली) है।\n\nजिस कार्यकारी प्रबंधक ने ये प्रबंध लगाया है उन्होंने निम्न विवरण प्रदान किया है: \"$3\"।",
+       "invalidtitle": "अवैध शीर्षक",
        "invalidtitle-knownnamespace": "\"$2\" नामस्थान अउर \"$3\" नाँव वाला गलत शीर्षक",
        "invalidtitle-unknownnamespace": "अज्ञात नामस्थान संख्या $1 अउर नाँव \"$2\" वाला गलत शीर्षक",
        "exception-nologin": "लॉग इन नाइ करे हव",
        "virus-scanfailed": "जाँच विफल (कूट $1)",
        "virus-unknownscanner": "अज्ञात ऐंटीवायरस:",
        "logouttext": "'''अब आप खाता से बहरे आइ गवा गय।'''\nध्यान दिहा जाय कि जब तक आप आपन ब्राउज़र कैशे खाली नाई करा जाई, कुछ पन्ना अईसन देखाइ जैसय कि आप अबहिनो लॉगिन करा गा है।",
+       "logging-out-notify": "आप का लॉग आउट कीन जात अहै, कृपया इंतजार करैं।",
+       "logout-failed": "अभी प्रस्थान नहीं हो रहा है:$1",
+       "cannotlogoutnow-title": "अभी प्रस्थान नहीं हो रहा है",
+       "cannotlogoutnow-text": "$1 के उपयोग समय प्रस्थान नहीं किया जा सकता है।",
        "welcomeuser": "आप कय स्वागत है, $1!",
        "welcomecreation-msg": "आप कय खाता बनी गए।\nआपन [[Special:Preferences|{{SITENAME}} वरीयता]] बदलेक ना भूलावा जाइ।",
        "yourname": "सदस्यनावँ:",
        "createacct-yourpasswordagain-ph": "गुप्त कुंजी फिर से लिखो",
        "userlogin-remembermypassword": "हम्मै लॉग्ड इन रखो",
        "userlogin-signwithsecure": "सुरक्षित कनेक्शन कय प्रयोग करो",
+       "cannotlogin-title": "लॉग इन नहीं किया जा सकता",
+       "cannotlogin-text": "लॉग इन संभव नहीं है",
+       "cannotloginnow-title": "अभी लॉग इन नहीं किया जा सकता",
+       "cannotloginnow-text": "$1 का उपयोग करते समय लॉग इन नहीं हो सकता है।",
+       "cannotcreateaccount-title": "खाता नहीं खोल सकते",
+       "cannotcreateaccount-text": "सीधे खाता बनाना इस विकि में सक्रिय नहीं है।",
        "yourdomainname": "आप कय डोमेन:",
        "password-change-forbidden": "आप इ विकि पे पासवर्ड नाई बदल सका जात है।",
        "externaldberror": "या तो प्रमाणिकरण डाटाबेस में त्रुटि होई गवा है या फिर आप कय आपन बहरेक खाता अपडेट करेक अनुमति नाई है।",
        "login": "लॉग इन",
+       "login-security": "अपनी पहचान सत्यापित करें",
        "nav-login-createaccount": "लाग इन / खाता खोला जाय",
        "logout": "बहरे निकरा जाय",
        "userlogout": "बहरे निकरा जाय",
        "userlogin-resetpassword-link": "आपन गुप्त कुंजी भूलाई गवा गय?",
        "userlogin-helplink2": "लॉग इन करे में सहायता",
        "userlogin-loggedin": "आप {{GENDER:$1|$1}} कय रूप में पहीलवे से लॉग्ड इन होवा जात है।\nकवनो अउर सदस्य कय रूप में लॉग इन करय खरतिन निचे दिहा फ़ॉर्म कय प्रयोग करा जाय।",
+       "userlogin-reauth": "आप {{GENDER:$1|$1}} हो, इसके लिए आपको एक और बार खाते में लॉग इन करना होगा।",
        "userlogin-createanother": "एकठु अउर खाता खोला जाय",
        "createacct-emailrequired": "ई-मेल ठाँव",
        "createacct-emailoptional": "ई-मेल ठाँव (वैकल्पिक)",
        "createacct-email-ph": "आपन ई-मेल ठाँव लिखा जाय",
        "createacct-another-email-ph": "ईमेल ठाँव दिहा जाय",
        "createaccountmail": "एकठु अस्थायी मनलागा (रैंडम) गुप्त कुंजी चुना जाय अउर ओका निर्दिष्ट ई-मेल ठहर पे भेजा जाय",
+       "createaccountmail-help": "इसका उपयोग बिना पासवर्ड जाने किसी और के लिए खाता खोलने के लिए उपयोग किया जाता है।",
        "createacct-realname": "असली नावँ (वैकल्पिक)",
        "createacct-reason": "कारण",
        "createacct-reason-ph": "आप दुसर खाता काहे बनावा जात है",
+       "createacct-reason-help": "खाता निर्माण लॉग में यह सन्देश दिखाई देगा।",
        "createacct-submit": "आपन खाता बनावा जाय",
-       "createacct-another-submit": "एकठु अउर खाता खोला जाय",
+       "createacct-another-submit": "खाता बनाएँ",
+       "createacct-continue-submit": "खाता निर्माण जारी रखें",
+       "createacct-another-continue-submit": "खाता निर्माण जारी रखें",
        "createacct-benefit-heading": "{{SITENAME}} आपय जैसन मनईन बनाए हँय।",
        "createacct-benefit-body1": "{{PLURAL:$1|सम्पादन}}",
        "createacct-benefit-body2": "{{PLURAL:$1|पन्ना}}",
        "createacct-benefit-body3": "{{PLURAL:$1|योगदानकर्ता}}",
        "badretype": "आप जवन गुप्त कुंजी दिहे हव उ एक दूसरे से नाइ मिलत है। फिर से लिखा जाय।",
+       "usernameinprogress": "इस प्रयोक्ता का खाता निर्माण अभी चालू है।\nकृपया प्रतीक्षा करें।",
        "userexists": "आप कय दिहल सदस्यनाम पहिले से प्रयोग में है।\nकृपया कवनो दुसर सदस्यनाम चुना जाय।",
+       "createacct-normalization": "आपका उपयोगकर्ता नाम तकनीकी प्रतिबंधों के कारण \"$2\" में समायोजित किया जाएगा।",
        "loginerror": "लॉग इन त्रुटि",
        "createacct-error": "खाता बनावेमे त्रुटि",
        "createaccounterror": "खाता नाइ बनी पाय: $1",
        "nocookiesnew": "आप कय खाता खोल दिहा गा है, लेकिन आप लॉग नाइ करा गा है।\n{{SITENAME}} पे लॉग इन करेक लिये कुकीज़ कय प्रयोग होत है।\nआप कुकीज़ बन्द करा गा है।\nकृपया अपने ब्राउज़र में कुकीज़ सक्षम करा जाय, औ फिर आपन सदस्यनावँ अव गुप्त कुंजी से लॉग इन करा जाय।",
        "nocookieslogin": "{{SITENAME}} पे लॉग इन करेक लिये कुकीज़ कय प्रयोग होत है।\nआप कुकीज़ बन्द करा गा है।\nकृपया अपने ब्राउज़र में कुकीज़ सक्षम करा जाय, औ फिर से कोशिस करा जाय।",
        "nocookiesfornew": "स्रोत कय पुष्टि ना होइ पावे कय कारण इ खाता  नाई बनाई गा है। \nसुनिश्चित करा जाय कि आप कय कुकीज़ बन्द है कि नाईं, पन्ना कय फिरसे लोड करा जाय अव फिरसे प्रयास करा जाय।",
+       "createacct-loginerror": "खाता सफलतापूर्वक निर्मित किया गया लेकिन आप स्वतः लॉग-इन नहीं कर सके। कृपया [[Special:UserLogin|हाथ से]] लॉग-इन करें।",
        "noname": "आप सही सदस्यनाम नाइ दिहा गा है।",
        "loginsuccesstitle": "लॉग इन होइ गवा",
        "loginsuccess": "'''आप {{SITENAME}} में \"$1\" सदस्यनाम से लॉग इन होई {{GENDER:$1|चुके|चुकी|चुके}} हव।'''",
        "wrongpasswordempty": "गुप्त कुंजी खाली है।\nफिरसे लिखो।",
        "passwordtooshort": "आप कय गुप्त कुंजी  कम से कम {{PLURAL:$1|1 अक्षर|$1 अक्षरन्}} कय होएक चाहि।",
        "passwordtoolong": "गुप्त-शब्द {{PLURAL:$1|$1 अक्षर}} से ढेर लम्मा नाइ होइ सकत है।",
+       "passwordtoopopular": "आप आम पासवर्ड नहीं चुन सकते हैं। कृपया कठिन पासवर्ड चुनें।",
+       "passwordinlargeblacklist": "आपके द्वारा भरा गया पासवर्ड बहुत सामान्य रूप से प्रयोग होने वाले पासवर्डों की सूची में है। कृपया और अधिक अद्वितीय पासवर्ड चुने।",
        "password-name-match": "आप कय गुप्त कुंजी आप कय सदस्यनावँ से फरक होएक चाहि।",
        "password-login-forbidden": "इ सदस्यनाँव अउर गुप्त कुंजी कय उपयोग नाई कै सका जात अहै।",
        "mailmypassword": "गुप्त कुंजी पुनःस्थापित करा जाय",
        "eauthentsent": "दर्ज करल ई-मेल ठहर पे एकठु फुरवासाखी ई-मेल भेज दिहा गा है।\nआप का उ ई-मेल में दिहा निर्देशन् कय अनुसार ई-मेल ठहर कय सत्यापन करेक परि,ओकरे बादय ही हिँया से कवनो दूसर ई-मेल भेज जाई।",
        "throttled-mailpassword": "पिछला {{PLURAL:$1|एक घंटा|$1 घंटन्}} मे एकठु गुप्त कुंजी स्मरण-पत्र भेजी गा है।\nदुरुपयोग से बचाव कय लिए हर {{PLURAL:$1|एक घंटा|$1 घंटन्}} में एक्कय गुप्त कुंजी स्मरण-पत्र भेजी जात है।",
        "mailerror": "ई-मेल भेजय में त्रुटि: $1",
-       "acct_creation_throttle_hit": "à¤\86प à¤\95य à¤\86à¤\87॰पà¥\80 à¤ à¤¹à¤° à¤¸à¥\87 à¤\86वà¥\87 à¤µà¤¾à¤²à¥\87 à¤®à¤¨à¤\88 à¤²à¥\8bà¤\97 à¤ªà¤¿à¤\9bला à¤\9aà¥\8cबà¥\80स à¤\98à¤\82à¤\9fनà¥\8d à¤®à¥\87à¤\82 à¤\87 à¤µà¤¿à¤\95ि à¤ªà¥\87 {{PLURAL:$1|à¤\8fà¤\95 à¤\96ाता|$1 à¤\96ाता}} à¤¬à¤¨à¤¾à¤\88 à¤\9aà¥\81à¤\95ा à¤¹à¥\88à¤\82, à¤\87 à¤¸à¤®à¤¯à¤¾à¤µà¤§à¤¿ à¤®à¥\87à¤\82 à¤\88 à¤\85धिà¤\95तम à¤¸à¥\80मा à¤¹à¥\8bय।\n à¤¯à¤¹ à¤¸à¤®à¤¯ à¤\87 à¤\86à¤\87॰पà¥\80  à¤\95य à¤ªà¥\8dरयà¥\8bà¤\97 à¤\95रय à¤µà¤¾à¤²à¥\87 à¤\86à¤\97à¤\82तà¥\81à¤\95 à¤\85à¤\89र à¤\96ाता à¤¨à¤¾à¤\87 à¤\96à¥\8bल à¤¸à¤\95त à¤¹à¥\88à¤\82।",
+       "acct_creation_throttle_hit": "à¤\87स à¤µà¤¿à¤\95ि à¤\95à¥\87 à¤\86à¤\97à¤\82तà¥\81à¤\95 à¤\87स à¤\86à¤\87॰पà¥\80॰ à¤\95à¥\8b à¤\95ाम à¤®à¥\87à¤\82 à¤²à¥\87तà¥\87 à¤¹à¥\81यà¥\87 à¤ªà¤¿à¤\9bलà¥\87 $2 à¤®à¥\87à¤\82 {{PLURAL:$1|१ à¤\96ाता à¤¨à¤¿à¤°à¥\8dमित à¤\95िया|$1 à¤\96ातà¥\87 à¤¨à¤¿à¤°à¥\8dमित à¤\95र à¤\9aà¥\81à¤\95à¥\87 à¤¹à¥\88à¤\82}} à¤\9cà¥\8b à¤\95ि à¤\87स à¤¸à¤®à¤¯ à¤®à¥\87à¤\82 à¤\85धिà¤\95तम à¤\85नà¥\81मत à¤¸à¥\80मा à¤¹à¥\88।\nà¤\87सà¤\95à¥\87 à¤ªà¤°à¤¿à¤£à¤¾à¤®à¤¸à¥\8dवरà¥\82प, à¤\87स à¤\86à¤\87॰पà¥\80॰ à¤\95à¥\8b à¤ªà¥\8dरयà¥\8bà¤\97 à¤\95रनà¥\87 à¤µà¤¾à¤²à¥\87 à¤¸à¤¦à¤¸à¥\8dय à¤\87स à¤¸à¤®à¤¯ à¤\94र à¤\96ातà¥\87 à¤¨à¤¿à¤°à¥\8dमित à¤¨à¤¹à¥\80à¤\82 à¤\95र à¤¸à¤\95तà¥\87।",
        "emailauthenticated": "आप कय ई-मेल ठहर $2 कय $3 बजे सत्यापित कै गय।",
        "emailnotauthenticated": "आप कय ई-मेल ठहर कय यकिन नाइ भा है।\nनीचे दीहा कवनो भी सुविधा कय लिये आप कय ई-मेल नाई भेजी जाई।",
        "noemailprefs": "इ सुविधन् कय प्रयोग करेक खर्तिन आपन पसंद में ई-मेल ठहर दिहा जाय।",
        "createacct-another-realname-tip": "असली नाँव देब आवश्यक नाई है।\nयदि आप देवा जाई तव एकर प्रयोग सदस्यन् कय योगदान कय लिये श्रेय (attribution) देक लिये कई जाई।",
        "pt-login": "लॉग इन",
        "pt-login-button": "लॉग इन",
+       "pt-login-continue-button": "लॉग इन जारी रखें",
        "pt-createaccount": "खाता बनावा जाय",
        "pt-userlogout": "बहरे निकरा जाय",
        "php-mail-error-unknown": "PHP कय mail() फ़ंक्शन में अज्ञात त्रुटि होई गवा।",
        "resetpass_submit": "गुप्तकुंजी लिखा जाए अव लॉग इन करा जाय",
        "changepassword-success": "आप कय गुप्तकुंजी बदल़ी गय!",
        "changepassword-throttled": "आप अबहिनय में कयु दाँइ लॉग इन करेक प्रयास किहा गा है।\nफिरसे प्रयास करय से पहीले तनी $1 रुका जाय।",
+       "botpasswords": "बॉट पासवर्ड",
+       "botpasswords-summary": "<em>बॉट पासवर्ड</em> सदस्य खाते को एपीआई के द्वारा बिना मुख्य खाते के जानकारी के उपयोग करने देता है। बॉट पासवर्ड का उपयोग कर के प्रवेश करने पर यदि पाबंदी होने पर सदस्य अधिकार उपलब्ध रहेगा।\n\nयदि आपको इस बारे में कुछ नहीं पता तो इसका उपयोग न करें। कोई भी आपसे इसे निर्मित करने के लिए नहीं पूछेगा।",
+       "botpasswords-disabled": "बॉट पासवर्ड अभी निष्क्रिय है।",
+       "botpasswords-no-central-id": "बॉट पासवर्ड का उपयोग करने के लिए आपको मुख्य खाते से प्रवेश करना होगा।",
+       "botpasswords-existing": "वर्तमान बॉट पासवर्ड",
+       "botpasswords-createnew": "बॉट के लिए नया पासवर्ड बनाएँ",
+       "botpasswords-editexisting": "बॉट के वर्तमान पासवर्ड को बदलें",
+       "botpasswords-label-needsreset": "(कूटशब्द रीसेट करने की आवश्यकता है)",
+       "botpasswords-label-appid": "बोट कय नांव:",
+       "botpasswords-label-create": "बनावा",
+       "botpasswords-label-update": "अपडेट",
+       "botpasswords-label-cancel": "रद्द करा",
+       "botpasswords-label-delete": "मिटावा",
+       "botpasswords-label-resetpassword": "पासवर्ड बदला",
+       "botpasswords-label-grants": "लागू अनुदान:",
+       "botpasswords-help-grants": "अनुदान आपको अधिकारों तक पहुँचने देता है, जो आपके खाते के पास पहले से है। अनुदान को सक्रिय करने से कोई अधिकार प्राप्त नहीं होगा, जो आपके खाते में न हो। अधिक जानकारी के लिए [[Special:ListGrants|अनुदान सारणी]] देखें।",
+       "botpasswords-label-grants-column": "दिया गवा",
+       "botpasswords-bad-appid": "बॉट नाम \"$1\" मान्य नाही हय।",
+       "botpasswords-insert-failed": "बॉट नाम \"$1\" का जोड़य मा फेल होइ गा। का ई पहिले जोड़ा रहा?",
+       "botpasswords-update-failed": "बॉट नाम \"$1\" का अपडेट करय मा फेल होइ गा। का ई मिटाय दीन गवा रहा?",
+       "botpasswords-created-title": "बॉट पासवर्ड बनि गवा",
+       "botpasswords-created-body": "सदस्य \"$2\" के बॉट नाम \"$1\" के बरे पासवर्ड बनि गवा।",
+       "botpasswords-updated-title": "बॉट पासवर्ड अपडेट भवा",
+       "botpasswords-updated-body": "सदस्य \"$2\" के बॉट नाम \"$1\" का पासवर्ड सफलतापूर्वक अद्यतन हुआ।",
+       "botpasswords-deleted-title": "बॉट पासवर्ड मिटि गवा",
+       "botpasswords-deleted-body": "सदस्य \"$2\" के बॉट नाम \"$1\" का पासवर्ड हट गया।",
+       "botpasswords-newpassword": "<strong>$1</strong> के साथ लॉगिन करने के लिए आपका नया पासवर्ड <strong>$2</strong> है। <em>भविष्य के लिए इसे याद रखें</em> <br> (पुराने बॉट के लिए लॉगिन नाम और बॉट का सदस्य नाम समान चाहिए होता है, तो आप <strong>$3</strong> का उपयोग अपने सदस्य नाम के रूप में और <strong>$4</strong> का उपयोग अपने पासवर्ड के रूप में कर सकते हैं।)",
+       "botpasswords-no-provider": "BotPasswordsSessionProvider उपलब्ध नहीं है।",
+       "botpasswords-restriction-failed": "इस प्रवेश में बॉट पासवर्ड रुकावट डाल रहा है।",
+       "botpasswords-invalid-name": "जो सदस्य नाम आप बता रहे हो, उसमें बॉट पासवर्ड अलग करने वाला (\"$1\") नहीं है।",
+       "botpasswords-not-exist": "सदस्य \"$1\" के आप बॉट पासवर्ड नहीं है, जिसका नाम \"$2\" है।",
+       "botpasswords-needs-reset": "{{GENDER:$1|उपयोगकर्ता}} \"$1\" के बरे बॉट नाम \"$2\" कय बॉट पासवर्ड रीसेट होय का चाही।",
+       "botpasswords-locked": "आप बॉट पासवर्ड के साथ लॉगिन नहीं कर सकते क्योंकि आपका खाता अवरुद्ध किया गया है।",
        "resetpass_forbidden": "गुप्तकुंजी नाइ बदल़ सका जात है",
+       "resetpass_forbidden-reason": "पासवर्ड नहीं बदला : $1",
        "resetpass-no-info": "इ पन्ना कय सीधय प्रयोग करेक लिए आप कय लॉग इन करेक परि।",
        "resetpass-submit-loggedin": "गुप्तकुंजी बदला जाय",
        "resetpass-submit-cancel": "रद्द करा जाय",
        "resetpass-abort-generic": "गुप्तकुंजी में बदलाव कवनो एक्सटेंशन से रुकि गवा है।",
        "resetpass-expired": "आप कय पासवर्ड कय वैधता अवधि खतम होई चुका है। कृपया लॉग इन करेक लिए एकठु नँवा पासवर्ड सेट करा जाय।",
        "resetpass-expired-soft": "आप कय पासवर्ड कय वैधता समय होइ गवा है अव ओका रीसेट करेक ज़रूरत है। कृपया एकठु नँवा पासवर्ड चुना जाय, या बाद में रीसेट करेक लिए \"{{int:authprovider-resetpass-skip-label}}\" पे क्लिक करा जाय।",
+       "resetpass-validity": "आपकय पासवर्ड मान्य नहीं अहै: $1\n\nकृपया लॉग इन करय बरे नवा पासवर्ड सेट करा।",
        "resetpass-validity-soft": "आप कय पासवर्ड मान्य नाई है: $1 \n\nकृपया अब एक नवा पासवर्ड चुना जाय, या ओका बाद में पुनर्स्थापित करेक लिए \"{{int:authprovider-resetpass-skip-label}}\" पे क्लिक करा जाय।",
        "passwordreset": "गुप्त कुंजी पुनःस्थापित(रीसेट) करा जाय",
        "passwordreset-text-one": "आपन गुप्तकुंजी रीसेट करेक लिए ई फ़ॉर्म भरा जाय।",
        "passwordreset-emailtext-user": "{{SITENAME}} ($4) पे सदस्य $1 आपकय {{PLURAL:$3|खाता}} कय गुप्तकुंजी कय रीसेट करेक अनुरोध करे हैं। इ ई-मेल ठहर से इ {{PLURAL:$3|खाता जोडान है}}:\n\n$2\n\n{{PLURAL:$3|ई}} अस्थायी गुप्तकुंजी {{PLURAL:$5|दिन}} कय बाद काम नाइ करि।\nआप लॉग इन कइकै एकठु नँवा गुप्त कुंजी अभीन लै लेक चाहि। यदि इ अनुरोध केहु दुसर करे है, या फिर आप कय आपन गुप्त कुंजी याद आई गा है, अव आप {{PLURAL:$3|आपन}} गुप्तकुंजी नाई बदलेक चाहा जात है, आप इ संदेश कय अनदेखा कई कय आपन पुरान गुप्तकुंजी कय प्रयोग कइ सका जात है।",
        "passwordreset-emailelement": "सदस्यनाँव: \n$1\n\nअस्थायी गुप्तकुंजी: \n$2",
        "passwordreset-emailsentemail": "एक गुप्तकुंजी रीसेट ई-मेल भेज दिहा गा है।",
+       "passwordreset-emailsentusername": "यदि कोई ईमेल इस खाते से जुड़ी है तो पासवर्ड आपके ईमेल में भेज दिया जाएगा।",
+       "passwordreset-nocaller": "कॉलर प्रदान किया जाना चाहिए",
+       "passwordreset-nosuchcaller": "कॉलर मौजूद नहीं है: $1",
+       "passwordreset-ignored": "पासवर्ड रीसेट नहीं सम्हारा नहीं गा। होइ सकत है कि कउनो प्रदाता कॉन्फ़िगर न कीन गा होय?",
+       "passwordreset-invalidemail": "अमान्य ईमेल पता",
+       "passwordreset-nodata": "न तौ यूजर नाम अउर न ही ईमेल पता कय आपूर्ति कीन गय।",
        "changeemail": "ईमेल ठाँव बदला जाय",
        "changeemail-header": "अपना ई-मेल पता परिवर्तित करने के लिए इस फ़ॉर्म को पूरा करें। इस बदलाव की पुष्टि करने के लिये आपको अपना कूटशब्द पुनः लिखना पड़ेगा।",
        "changeemail-no-info": "इ पन्ना कय सीधय प्रयोग करेक लिए आप कय लॉग इन करेक परि।",
        "changeemail-oldemail": "अबहिन कय ई-मेल ठहर:",
        "changeemail-newemail": "नँवा ई-मेल ठहर:",
+       "changeemail-newemail-help": "अगर आप आपन ईमेल (इलेक्ट्रॉनिक-डाक) पता का खाली रखा चाहत है तौ आप एह जगह का छोड़ि सकत हैं। लिकिन आपन पासवर्ड भूलि गये पय ओहका ईमेल से न पाय सकब्या।",
        "changeemail-none": "(केहु नाँइ)",
        "changeemail-password": "आप कय {{SITENAME}} गुप्तकुंजी:",
        "changeemail-submit": "ई-मेल बदला जाय",
        "changeemail-throttled": "आप अबहिनय में कयु दाँइ लॉग इन करेक प्रयास किहा गा है।\nफिरसे प्रयास करय से पहीले तनी $1 रुका जाय।",
+       "changeemail-nochange": "कृपया कौनो एक अलग नवा ईमेल पता प्रविष्ट करा ।",
        "resettokens": "टोकन रीसेट करा जाय",
        "resettokens-text": "जो टोकन आपके खाते से सम्बद्ध कुछ विशिष्ट व्यक्तिगत जानकारी प्रदान करते हैं, आप उन्हें यहाँ रीसेट कर सकते हैं।\n\nयदि आपने उन्हें गलती से किसी को दिखा दिया है या फिर आपका खाता हैक हो गया है तो आपको इन्हें रीसेट कर देना चाहिए।",
        "resettokens-no-tokens": "रीसेट करेक लिए कवनो टोकन नाई है।",
        "sig_tip": "आप कय हस्ताक्षर अव समय",
        "hr_tip": "सिधा लाइन (कम इस्तेमाल करा जाई)",
        "summary": "सारांश:",
-       "subject": "विषय/शीर्षक:",
+       "subject": "विषय:",
        "minoredit": "ई छोट सम्पादन होय ।",
        "watchthis": "ई पन्ना कय ध्यानसुची मे डारा जाय",
        "savearticle": "पन्ना सहेजा जाय",
+       "savechanges": "बदलाव सहेजा जाय",
+       "publishpage": "पन्ना प्रकाशित करैं",
+       "publishchanges": "बदलाव प्रकाशित करैं",
+       "savearticle-start": "पन्ना सहेजा...",
+       "savechanges-start": "बदलाव सहेजा...",
+       "publishpage-start": "पन्ना प्रकाशित करा",
+       "publishchanges-start": "बदलाव प्रकाशित करा...",
        "preview": "झलक",
        "showpreview": "झलक देखावा जाय",
        "showdiff": "बदलाव देखावा जाय",
        "selfredirect": "<strong>चेतावनी:</strong> आप इ पन्नवा कय इहि से निर्देश करय जावा जात है.\nआप या तव गलत लक्ष्य पे पुनर्निर्देश करा गा है, या तव गलत पन्ना संपादन करा जात है ।\nअगर आप \"$1\" पे फिरसे क्लिक करा जाइ तो इ पुनर्निर्देश बनि जाइ ।",
        "missingcommenttext": "कृपया नीचे टिप्पणी दिहा जाय।",
        "missingcommentheader": "'''ध्यान दिहा जाय:''' आप इ टिप्पणी कय कवनो शिर्षक नाइ दिहा गा है।\nअगर आप दुबारा \"$1\" पे क्लिक करा जाई तव आप कय बदलाव बिना शिर्षक कय सहेज जाई।",
-       "summary-preview": "सारांश कय झलक:",
+       "summary-preview": "बदलाव à¤¸à¤¾à¤°à¤¾à¤\82श à¤\95य à¤\9dलà¤\95:",
        "subject-preview": "विषय/शीर्षक कय झलक:",
        "previewerrortext": "आपके परिवर्तनों का पूर्वावलोकन करने का प्रयास करते समय एक त्रुटि हुई।",
        "blockedtitle": "सदस्य अवरुद्ध है",
-       "blockedtext": "'''आप कय सदस्यनाँव या आइ॰पी ठहर पे रोक लाग है ।'''\n\nरोक $1 लगायँ रहें।\nरोक कय कारण ''$2'' होय \n\n* रोक कय सुरुवात भय: $8\n* रोक खतम होइ: $6\n* रोक इकाई: $7\n\nइ रोक कय बारे में चर्चा करेक लिए आप $1 या कवनो दुसर [[{{MediaWiki:Grouppage-sysop}}|प्रबन्धक]] से संपर्क कै सका जात है।\nअगर आप [[Special:Preferences|आपन पसंद]] में वैध ई-मेल पता देवा गा है तब्बै आप 'ई-मेल भेजय' वाला सुविधा कय इस्तेमाल कई सका जात है औ आप कय एकर इस्तेमाल करै कय कवनो रोक नाइ लगावा है।\nआप कय अभीन कय आइ॰पी ठहर $3 होय अव रोक क्रमांक #$5 होय।\nआपन कवनो भी प्रश्न में कृपया इ कुल जानकारी शामिल करा जाइ।",
+       "blocked-email-user": "<strong>आपकय सदस्यनाम ईमेल भेजय से प्रतिबन्धित कीन गा अहै। अब्यो आप विकि पय अन्य पृष्ठऽन् का सम्पादित कइ सकत हैं।</strong> आपका प्रतिबन्धित करय कय पूरी जानकारी [[Special:MyContributions|खाता योगदान]] पय देख सकत हैं।\n\nई प्रतिबन्ध $1 लगाइस है।\n\nएहकय कारण <em>$2</em> दीन गा।\n\n* प्रतिबन्ध आरम्भ: $8\n* प्रतिबन्ध समाप्ति: $6\n* प्रतिबन्धी प्रयोजन: $7\n* प्रतिबन्ध पता #$5",
+       "blockedtext-partial": "आपकय खाता या आईपी पता का एह पृष्ठ पय संपादन करय से रोक दीन गा अहै ।बहरहाल, आप एह विकी पय अन्य पृष्ठऽन् पय सम्पादन कइ सकत हैं।</strong> एह अवरोध से संबंधित विस्तृत जानकारी आप [[Special:MyContributions|यहाँ]] जाइके पाइ सकत हैं।\n\nई अवरोध $1 द्वारा कीन गवा रहा।\n\nजे एह अवरोध बरे ई कारण देहे अहैं: <em>$2</em>.\n\n* शुरुआत की तिथि: $8\n* समाप्ति तिथि: $6\n* अवरोधित: $7\n* अवरोध संख्या: #$5",
+       "blockedtext": "'''<strong>आप कय सदस्यनाँव या आइ॰पी ठहर पे रोक लाग है ।</strong>'''\n\nरोक $1 लगायँ रहें।\nरोक कय कारण ''<em>$2</em>'' होय \n\n* रोक कय सुरुवात भय: $8\n* रोक खतम होइ: $6\n* रोक इकाई: $7\n\nइ रोक कय बारे में चर्चा करेक लिए आप $1 या कवनो दुसर [[{{MediaWiki:Grouppage-sysop}}|प्रबन्धक]] से संपर्क कै सका जात है।\nअगर आप [[Special:Preferences|आपन पसंद]] में वैध ई-मेल पता देवा गा है तब्बै आप 'ई-मेल भेजय' वाला सुविधा कय इस्तेमाल कई सका जात है औ आप कय एकर इस्तेमाल करै कय कवनो रोक नाइ लगावा है।\nआप कय अभीन कय आइ॰पी ठहर $3 होय अव रोक क्रमांक #$5 होय।\nआपन कवनो भी प्रश्न में कृपया इ कुल जानकारी शामिल करा जाइ।",
        "autoblockedtext": "एक्ठु अउर सदस्य आपय कय आइ॰पी कय प्रयोग करत रहें औ ओन्है $1 रोक लगाए रहें। इही कय नाते आपो कय आइ॰पी ठहर स्वचालित रूप से रुक गा है।\nरोक करय कय कारण होय:\n\n:''$2''\n\n* रोक कय सुरुवात : $8\n* रोक खतम होइ: $6\n* रोकि जाय वाले सदस्य: $7\n\nरोक कय चर्चा करय कय लिए आप $1 या कवनो दुसर [[{{MediaWiki:Grouppage-sysop}}|प्रबंधक]] से संपर्क कै सका जात है।\n\nकृपया ध्यान देवा जाय कि यदि आप कय \"इ सदस्य कय ई-मेल भेजा जाय\" वाला सुविधा कय प्रयोग करय चाहा जात है तव आपकय [[Special:Preferences|पसंद]] में वैध ई-मेल ठहर होएक चाहि औ एकर प्रयोग आपकय खर्तिन खुला होएक चाही।\n\nआपकय मौजूदा आइ॰पी ठहर $3 होय औ अवरोध क्रमांक #$5 होय।\nआप कय कवनो प्रश्न में कृपया ई कुल जानकारी शामिल होएक चाही।",
        "blockednoreason": "कवनो कारण नाइ दिहा है",
        "whitelistedittext": "पन्ना संपादन करेक लिये आप कय $1 करेक परि।",
        "accmailtext": "[[User talk:$1|$1]] कय लिए एक यंत्र जनित गुप्त कुंजी $2 कय भेज दिहा गा है। लॉगिन करेक बाद एका '''[[Special:ChangePassword|गुप्त कुंजी बदला जाय]]'' वाला पन्नन् पे बदल सका जात है।",
        "newarticle": "(नँवा)",
        "newarticletext": "आप अईसन पन्ना पे आवा गा है जवन अभीन तक नाई बनावा है।\nपन्ना बनावेक लिये नीचे कय बौक्स में पाठ लिखा जाय। ढेर जानकारी कय लिये [$1 सहायता पन्ना] देखा जाय।\nअगर आप हिँया गलती से आवा गा हैं तव आपन ब्राउज़र कय बैक ('''back''') बटन पे क्लिक करा जाय।",
-       "anontalkpagetext": "----''ई बातचीत पन्ना उ बेनामी सदस्यन् कय खर्तीन होय जे या तव खाता नाई खोलें है या खाता कय प्रयोग नाइ करत हैं।\nइहिकै नाते वय लोगन कय पहिचान कय खर्तीन हम्मन कय वय लोगन कय आइ॰पी ठहर कय प्रयोग करेक परत है।\nआइ॰पी ठहर कयु सदस्यन् कय एक्कय होइ सकत है।\nयदि आप कवनो बेनामी सदस्य होआ जाय अव आप कय लागत है कि आप कय बारे में अप्रासंगिक टीका टिप्पणी कई गा है तव कृपया [[Special:CreateAccount|सदस्यता लिहा जाय]] या [[Special:UserLogin|सत्रारंभ करा जाय]] ताकि अउर बेनामी सदस्यन् में से आप कय अलग से पहिचान सका जाय।''",
-       "noarticletext": "अभीन इ पन्ना पे कवनो सामग्री नाई है।\nआप अउर पन्नन् में [[Special:Search/{{PAGENAME}}|इ शीर्षक कय खोज]] कई सका जात है,\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} सम्बन्धित लॉग खोज सका जात है],\nया इस पृष्ठ को [{{fullurl:{{FULLPAGENAME}}|action=edit}} सम्पादित] कर सकते हैं</span>।",
+       "anontalkpagetext": "----''<em>ई बातचीत पन्ना उ बेनामी सदस्यन् कय खर्तीन होय जे या तव खाता नाई खोलें है या खाता कय प्रयोग नाइ करत हैं।</em>\nइहिकै नाते वय लोगन कय पहिचान कय खर्तीन हम्मन कय वय लोगन कय आइ॰पी ठहर कय प्रयोग करेक परत है।\nआइ॰पी ठहर कयु सदस्यन् कय एक्कय होइ सकत है।\nयदि आप कवनो बेनामी सदस्य होआ जाय अव आप कय लागत है कि आप कय बारे में अप्रासंगिक टीका टिप्पणी कई गा है तव कृपया [[Special:CreateAccount|सदस्यता लिहा जाय]] या [[Special:UserLogin|सत्रारंभ करा जाय]] ताकि अउर बेनामी सदस्यन् में से आप कय अलग से पहिचान सका जाय।''",
+       "noarticletext": "अभीन इ पन्ना पे कवनो सामग्री नाई है।\nआप अउर पन्नन् में [[Special:Search/{{PAGENAME}}|इ शीर्षक कय खोज]] कई सका जात है,\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} सम्बन्धित लॉग खोज सका जात है],\nया [{{fullurl:{{FULLPAGENAME}}|action=edit}} ई पन्ना बनावा]</span>।",
        "noarticletext-nopermission": "अभीन इ पन्ना पे कवनो चिज नाई है।\nआप अउर पन्नन् में [[Special:Search/{{PAGENAME}}|इ शीर्षक कय खोज]] कई सका जात है,\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} से सम्बन्धित लॉग खोज सका जात है] </span>लेकिन आप कय इ पन्ना बनावे कय अनुमति नाई है ।",
        "missing-revision": "\"{{FULLPAGENAME}}\" पन्ना कय अवतरण #$1 नाई है।\n\nखास कइकै ई एकठु मेटावल पन्ना कय पुरान लिंक पे क्लिक करय से होत है।\nढेर जानकारी कय खर्तिन आप [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} हटावे कय लॉग] देख सका जात है।",
        "userpage-userdoesnotexist": "सदस्य खाता \"$1\" पंजीकृत नाई है।\nकृपया जाँच लिहा जाय कि आप ई पन्ना संपादन करय या बनावे चाहा जात है या नाहीं।",
        "userpage-userdoesnotexist-view": "सदस्य \"$1\" पंजीकृत नाइ है।",
        "blocked-notice-logextract": "ई सदस्य अभीन अवरोधित है।\nसदंर्भ कय लिए ताज़ातरीन अवरोध लॉग प्रविष्टि नीचा दीहा है:",
-       "clearyourcache": "'''ध्यान दिहा जाय:'''  सहेजय कय बाद बदलाव देखयक खर्तिन आप कय आपन ब्राउज़र कय कैश खाली करेक परी सकत है।\n* '''फ़ायरफ़ॉक्स / सफ़ारी:''' ''Reload'' (रीलोड) दबावत समय ''Shift'' (शिफ़्ट) दबावा जाय, या फिर ''Ctrl-F5'' (कंट्रोल-F5) या ''Ctrl-R'' (कंट्रोल-R) दबावा जाय (मैक पे ''⌘-R'')\n* '''गूगल क्रोम:''' ''Ctrl-Shift-R'' (कंट्रोल-शिफ़्ट-R) दबावा जाय (मैक पे ''⌘-Shift-R'')\n* '''इन्टर्नेट एक्सप्लोरर:''' ''Ctrl'' (कंट्रोल) दबाईकय ''Refresh'' (रिफ़्रेश) करा जाय या ''Ctrl-F5'' (कंट्रोल-F5) दबावा जाय\n* '''ऑपेरा:''' ''Tools → Preferences'' (उपकरण → पसंद) में कैश साफ़ करा जाय",
+       "clearyourcache": "<strong>Note:</strong> After saving, you may have to bypass your browser's cache to see the changes.\n* <strong>Firefox / Safari:</strong> Hold <em>Shift</em> while clicking <em>Reload</em>, or press either <em>Ctrl-F5</em> or <em>Ctrl-R</em> (<em>⌘-R</em> on a Mac)\n* <strong>Google Chrome:</strong> Press <em>Ctrl-Shift-R</em> (<em>⌘-Shift-R</em> on a Mac)\n* <strong>Internet Explorer:</strong> Hold <em>Ctrl</em> while clicking <em>Refresh</em>, or press <em>Ctrl-F5</em>\n* <strong>Opera:</strong> Go to <em>Menu → Settings</em> (<em>Opera → Preferences</em> on a Mac) and then to <em>Privacy & security → Clear browsing data → Cached images and files</em>.",
        "usercssyoucanpreview": "'''टिप''': सहेजय से पहिले आपन नँवा सी॰एस॰एस जाँचय खर्तिन \"{{int:showpreview}}\" बटन कय प्रयोग करा जाय।",
        "userjsyoucanpreview": "'''टिप''': सहेजय से पहिले आपन नँवा जावास्क्रिप्ट जाँचय खर्तिन \"{{int:showpreview}}\" बटन कय प्रयोग करा जाय।",
        "usercsspreview": "'''ध्यान दिहा जाय कि आप आपन सी॰एस॰एस कय झलक देखा जात है।'''\n'''इ अभीन तक नाई सहेजा है!'''",
        "readonlywarning": "'''सावधान: डाटाबेस कय रख-रखाव कय खत्तिर बंद कै दिहा गा है, इहि कय नाते आप कय बदलाव अभीन नाइ सहेजि सका जात है।\nअगर आप चाहा जाय तव इ चिज कय बाद कय खत्तिर कॉपी-पेस्ट कइकय कवनो टेक्स्ट फ़ाइल में रखि सका जात है।'''\n\nबंद करय वाले प्रबंधक बंद करे कय इ कारण दिहे हैं: $1",
        "protectedpagewarning": "'''चेतावनी: इ पन्ना कय सुरक्षित कई  गा है अव एका खालि प्रबंधक सम्पादित कई सकत हँय।'''\nनँवा लॉग प्रविष्टि संदर्भ कय लिये नीचे दीहा है:",
        "semiprotectedpagewarning": "<strong>नोट:</strong> ई पन्ना बचावा है इही कय नाते खालि रजिष्टर करल सदस्य एका सम्पादन कई सकत हैं ।\nसंदर्भ कय खर्तिन अन्तिम दाइ कय लाग निचे दिहा है:",
-       "cascadeprotectedwarning": "'''सावधान:''' इ पन्ना निचे दिहा सुरक्षा-सीढ़ी {{PLURAL:$1|पन्ना से|पन्नन् से}} जोडाएक नाते सुरक्षित है, अव खाली प्रबंधक एहमा बदलाव कै सकत हैं:",
+       "cascadeprotectedwarning": "<strong>सावधान:</strong> यह पृष्ठ निम्नलिखित सुरक्षा-सीढ़ी वाले {{PLURAL:$1|पृष्ठ से|पन्नों से}} जुड़ा हुआ होने के कारण सुरक्षित है, और केवल [[Special:ListGroupRights|आवश्यक अधिकार वाले]] ही इसमें बदलाव कर सकते हैं:",
        "titleprotectedwarning": "'''चेतावनी: इ पन्ना सुरक्षित है अव एका बनावेक खत्तिर [[Special:ListGroupRights|विशेष अधिकारन्]] कय आवश्यकता है।'''\nसंदर्भ कय खत्तिर नँवा लॉग प्रविष्टि नीचे दीहा है:",
        "templatesused": "ई पन्ना में इस्तेमाल करल {{PLURAL:$1|साँचा}}:",
        "templatesusedpreview": "ई झलक में इस्तेमाल करल {{PLURAL:$1|साँचा}}:",
        "postedit-confirmation-created": "पन्ना बनी गा है।",
        "postedit-confirmation-restored": "पन्ना पुरान स्थिति पे लाई गय।",
        "postedit-confirmation-saved": "आप कय सम्पादन सहेजी गय।",
+       "postedit-confirmation-published": "आपकय संपादन प्रकाशित भवा।",
        "edit-already-exists": "नवा पन्ना नाई बनाई सका जात है।\nई पन्ना पहीलवे से मौजूद है।",
        "defaultmessagetext": "सनेशा कय डिफ़ॉल्ट पाठ",
        "content-failed-to-parse": "$1 कय लिए $2 सामग्री कय पार्स करय में विफल, त्रुटि: $3",
        "invalid-content-data": "अवैध डाटा सामग्री",
-       "content-not-allowed-here": "[[:$2]] पन्ना पे \"$1\" सामग्री मिनाही है।",
+       "content-not-allowed-here": "\"$1\" सामग्री को, [[:$2]] पृष्ठ में  \"$3\" स्लॉट की अनुमति नहीं है",
        "editwarning-warning": "इ पन्ना से हटे कय बाद आप कय करल बदलाव गायब होइ जाइ।\nयदि आप लॉग इन करा गा है तव आप इ सूचना कय देखाब आपन पसंद कय \"{{int:prefs-editing}}\" भाग में बंद कई सका जात है।",
+       "editpage-invalidcontentmodel-title": "सामग्री मॉडल समर्थित नहीं बा",
+       "editpage-invalidcontentmodel-text": "सामग्री मॉडल \"$1\" समर्थित नहीं बा।",
        "editpage-notsupportedcontentformat-title": "सामग्री स्वरूप समर्थित नाई है",
        "editpage-notsupportedcontentformat-text": "$1 सामग्री स्वरूप $2 सामग्री मॉडल द्वारा समर्थित नाई है।",
+       "slot-name-main": "मुख्य",
        "content-model-wikitext": "विकिटेक्स्ट",
        "content-model-text": "सामान्य पाठ",
        "content-model-javascript": "जावास्क्रिप्ट",
        "content-json-empty-object": "खाली चिज",
        "content-json-empty-array": "खाली एरे",
+       "deprecated-self-close-category": "अमान्य खुदै-बंद HTML टैग कय उपयोग करय वाले पृष्ठ",
        "duplicate-args-category": "टेम्पलेट कॉल में डुप्लिकेट तर्क का उपयोग करते हुए पन्ने",
        "duplicate-args-category-desc": "पेज जैसे तर्कों के डुप्लिकेट का उपयोग करने वाले टेम्पलेट कॉल, जैसे <code><nowiki>{{foo|bar=1|bar=2}}</nowiki></code> और <code><nowiki>{{foo|bar|1=baz}}</nowiki></code>.",
        "expensive-parserfunction-warning": "'''चेतावनी:''' इ पन्ना पे बहुत ढेर संख्या में कीमती पार्सर फ़ंक्शनों कय प्रयोग कई गा है।\n\nएकर प्रयोग $2 से कम दाइ होएक चाहि, इ समय प्रयोग $1 दाइ कै गा {{PLURAL:$1|है}}।",
        "post-expand-template-argument-warning": "'''चेतावनी:''' इ पन्ना पे कवनो साँचा में कम-से-कम एकठु अइसन प्राचल है जवन बढ़ावे पे बहुत बड़ा होइ जाइ।\nअइसन प्राचलन् कय छोड़ दिहा गा है।",
        "post-expand-template-argument-category": "अईसन पन्ना जवनेमें प्राचल छोड़ी दिहा है",
        "parser-template-loop-warning": "साँचा चक्र मिला: [[$1]]",
+       "template-loop-category": "टेम्पलेट लूप वाले पृष्ठ",
+       "template-loop-category-desc": "पन्ना मा एक टेम्पलेट लूप होत है, मतलब  एक टेम्पलेट जौन खुद का पुनरावर्ती कहत है।",
+       "template-loop-warning": "<strong> चेतावनी: </strong>ई पन्ना [[:$1]] उनका कॉल करत है जेहके कारण टेम्पलेट लूप (एक अनंत रिकर्सिव कॉल) होत है।",
        "parser-template-recursion-depth-warning": "साँचा पुनरावर्ती गहराई सीमा पार ($1)",
        "language-converter-depth-warning": "भाषा कन्वर्टर गहीराई सीमा से बहरे गय ( $1 )",
        "node-count-exceeded-category": "पन्ना जवनन् में नोड-संख्या सीमा पार कई गा है",
        "expansion-depth-exceeded-warning": "पन्ना में विस्तार गहराई पार कई गा है",
        "parser-unstrip-loop-warning": "Unstrip लूप मिला",
        "unstrip-depth-warning": "Unstrip पुनरावर्तन सीमा पार कई गय ($1)",
+       "unstrip-depth-category": "पन्ना जिन पय गहराई कय सीमा का पार कय दीन गवा है",
+       "unstrip-size-warning": "बिना सीमा कय आकार कय सीमा पार होइ गय ($1)",
+       "unstrip-size-category": "ऊ पन्ना जहाँ अनस्ट्रिप साइज़ कय सीमा पार होइ गय अहय",
        "converter-manual-rule-error": "मैन्यूअल भाषा परिवर्तन नियम में त्रुटि",
        "undo-success": "ई संपादन पहिले जैसन रहा वईसय कई सका जात है ।\nअईसन करेक लिये कृपया निचे लिखल पाठ कय ध्यान से दखीकय बदलाव सहेजा जाय।",
        "undo-failure": "एकरे बीचे अउर बदलाव होएक कारण ई संपादन पहिले जैसन करब संभव नाई है।",
+       "undo-main-slot-only": "ई सम्पादन पहिले जइसा नहीं कीन जाय सका काहेकि एहमा मुख्य स्लॉट से बाहर सामग्रियाँ जुड़ी अहँय।",
        "undo-norev": "ई बदलाव वापिस नाई भय काहे से या तो एका पहीलवे से पलटाई गा है या फिर पन्ना हटाई दिहा है।",
        "undo-nochange": "अईसन लागत है की ई सम्पादन कय पहिलवे पहिले जैसन कई दीहा है ।",
        "undo-summary": "[[Special:Contributions/$2|$2]] ([[User talk:$2|बातचीत]]) कय करल बदलाव $1 कय पहिले जईसन कई गय",
        "histfirst": "सबसे पुरान",
        "histlast": "सबसे नँवा",
        "historysize": "($1 {{PLURAL:$1|बाइट}})",
-       "historyempty": "(खाली)",
+       "historyempty": "खाली",
        "history-feed-title": "अवतरण इतिहास",
        "history-feed-description": "विकि मे उपलब्ध इ पन्ना कय अवतरण इतिहास",
        "history-feed-item-nocomment": "$1 $3 कय $4 बजे",
        "history-feed-empty": "अनुरोधित करल पन्ना  अस्तित्व में नाई है।\nई पन्ना या तो मेटावा है या फिर एकर नाँव बदल दिहा है।\n[[Special:Search|विकि पे खोजा जाय]] कय प्रयोग करा जाय।",
+       "history-edit-tags": "चुना गवा अवतरणऽन् कय टैग सम्पादित करा।",
        "rev-deleted-comment": "(सम्पादन सारांश हटाई गय)",
        "rev-deleted-user": "(सदस्यनाँव हटाई गय)",
        "rev-deleted-event": "(लाग जानकारी हटाइ गय)",
        "revdelete-submit": "चयनित {{PLURAL:$1|अवतरण}} पे लागू करा जाय",
        "revdelete-success": "'''अवतरण दृश्यता सफलतापूर्वक अपडेट कई गय।'''",
        "revdelete-failure": "'''अवतरण दृश्यता अपडेट नाइ भय:'''\n$1",
-       "logdelete-success": "'''लॉग दृष्यता बदलि गय।'''",
+       "logdelete-success": "लॉग दृष्यता बदलि गय।",
        "logdelete-failure": "'''लॉग दृश्यता कय जमाव नाई भय:'''\n$1",
        "revdel-restore": "देखावा जाय/लुकुआवा जाय",
        "pagehist": "पन्ना कय इतिहास",
        "mergehistory-empty": "कवनो भी अवतरण नाई मिलाई सका जात अहै।",
        "mergehistory-done": "$1 {{PLURAL:$3|कय}} $3 अवतरण [[:$2]] में एकट्ठा कई {{PLURAL:$3|गय}}।",
        "mergehistory-fail": "इतिहास एकट्ठा नाई कई सका जात है, कृपया पन्ना औ समय कय फिरसे जाँच करा जाय।",
+       "mergehistory-fail-bad-timestamp": "समय संख्या अमान्य",
+       "mergehistory-fail-invalid-source": "अमान्य स्रोत पृष्ठ",
+       "mergehistory-fail-invalid-dest": "अमान्य लक्ष्य पृष्ठ",
+       "mergehistory-fail-no-change": "इतिहास विलय कौनो भी अवतरण कय विलय नहीं कइ सका। कृपया लेख अव समय का दुबारा देखैं।",
+       "mergehistory-fail-permission": "इतिहास विलय खातिर अधिकार कम अहै।",
+       "mergehistory-fail-self-merge": "स्रोत अउर लक्ष्य पन्ना एक्कै अहँय।",
+       "mergehistory-fail-timestamps-overlap": "स्रोत अवतरण भेजय वाले अवतरण के बाद आवत अहै।",
        "mergehistory-fail-toobig": "इतिहास विलय करना संभव नहीं है क्योंकि अवतरण सीमा $1 से अधिक {{PLURAL:$1|अवतरण|अवतरणों}} को स्थानांतरित करना होगा।",
        "mergehistory-no-source": "स्रोत पन्ना $1 मौजूद नाई है।",
        "mergehistory-no-destination": "लक्ष्य पन्ना $1 मौजूद नाई है।",
        "diff-multi-sameuser": "(इ सदस्य कय {{PLURAL:$1|करल बीच कय एक अवतरण नाई देखाई गय |करल बीच कय कुल $1 अवतरण नाइ देखाइ गय}})",
        "diff-multi-otherusers": "({{PLURAL:$2|एकठु दुसर सदस्य|$2 सदस्यन्}} कय {{PLURAL:$1|करल  बीच कय एकठु अवतरण नाई देखाइ गय|करल बीच कय कुल $1 अवतरण नाइ देखाइ गय}})",
        "diff-multi-manyusers": "({{PLURAL:$2|एकठु योगदानकर्ता|$2 योगदानकर्तन्}} कय {{PLURAL:$1|करल बीच कय एकठु|करल बीच कय $1}} अवतरण नाई देखाइ गय।)",
+       "diff-paragraph-moved-tonew": "पैराग्राफ का स्थानांतरित कय दीन गा रहा| नये जगह पय जाय बरे क्लिक करैं|",
+       "diff-paragraph-moved-toold": "पैराग्राफ का स्थानांतरित कय दीन गा रहा| पुरान जगह पय जाय बरे क्लिक करैं|",
        "difference-missing-revision": "इ अंतर {{PLURAL:$2|कय एकठु अवतरण|कय $2 अवतरण}} ($1) नाइ {{PLURAL:$2|मिला}}।\n\nई आम तौर पे एकठु हटावल पन्ना कय अवतरण में अंतर खोजय पे होत है।ढेर जानकारी [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} हटावे कय लॉग] में मिली।",
        "searchresults": "खोज परिणाम",
+       "search-filter-title-prefix": "पृष्ठऽन् मा केवल उहै खोजा जाइ रहे जिनकै शीर्षक \"$1\" से शुरू  होथें",
+       "search-filter-title-prefix-reset": "सगरौ पन्ना खोजा",
        "searchresults-title": "\"$1\" कय खरतीन खोज परिणाम",
        "titlematches": "पन्ना शीर्षक मिलान",
        "textmatches": "पन्ना पाठ मिलान",
        "search-category": "(श्रेणी $1)",
        "search-file-match": "(फ़ाइल सामग्री से मिलत है)",
        "search-suggest": "आप कय मतलब ई तव नाई रहा:$1",
-       "search-interwiki-caption": "दुसर परियोजना",
+       "search-rewritten": "$1 कय खोज परिणाम निम्न हैं। बजाय $2 के बरे खोजयँ।",
+       "search-interwiki-caption": "बहिन परियोजना से परिणाम",
        "search-interwiki-default": "$1 से परिणाम:",
        "search-interwiki-more": "(अउर)",
+       "search-interwiki-more-results": "जादा रिजल्ट",
        "search-relatedarticle": "सम्बंधित",
        "searchrelated": "सम्बंधित",
        "searchall": "कुल",
        "prefs-watchlist-edits": "बढ़ावल ध्यानसूची में देखावे खत्तिर अधिकतम बदलाव:",
        "prefs-watchlist-edits-max": "अधिकतम संख्या: एक हज़ार",
        "prefs-watchlist-token": "ध्यानसूची टोकन",
+       "prefs-watchlist-managetokens": "टोकन प्रबंधित करा",
        "prefs-misc": "अउर",
        "prefs-resetpass": "गुप्त कुंजी बदला जाय",
        "prefs-changeemail": "ईमेल ठाँव बदला जाय",
        "restoreprefs": "पहिलकय सेटिङ मिलावा जाय (कुल जगही में)",
        "prefs-editing": "संपादन",
        "searchresultshead": "खोजा जाय",
-       "stub-threshold": "<a href=\"#\" class=\"stub\">आधार कड़िन्</a> कय सबसे बडा आकार (बाइट):",
+       "stub-threshold": "आधार कड़ी हेतु प्रारूपण ($1):",
+       "stub-threshold-sample-link": "नमूना",
        "stub-threshold-disabled": "अक्षम करा है",
        "recentchangesdays": "नँवा बदलाव में देखावे कय दिन:",
        "recentchangesdays-max": "सबसे ढेर $1 {{PLURAL:$1|दिन}}",
        "default": "डिफ़ॉल्ट",
        "prefs-files": "फ़ाइल",
        "prefs-custom-css": "खासमखास सी॰एस॰एस",
+       "prefs-custom-json": "कस्टम JSON",
        "prefs-custom-js": "खासमखास जावास्क्रिप्ट",
        "prefs-common-config": "कुल स्किन कय लिए साझा सी॰एस॰एस/जावास्क्रिप्ट:",
        "prefs-reset-intro": "आप इ पन्ना से अपने पसंद कय, साइट कय मूल पसंद कय जइसन बनाय सका जात है।\nएकरे बाद आप वापिस पुरान जगहि पे नाइ आय पावा जाइ।",
        "youremail": "ई-मेल:",
        "username": "{{GENDER:$1|सदस्यनाँव}}:",
        "prefs-memberingroups": "{{GENDER:$2|सदस्य}} {{PLURAL:$1|समूह}}:",
+       "group-membership-link-with-expiry": "$1 ($2 तक)",
        "prefs-registration": "रजिष्ट्रेसन समय:",
        "yourrealname": "वास्तविक नाँव:",
        "yourlanguage": "भाषा",
        "prefs-dateformat": "तिथि प्रारूप",
        "prefs-timeoffset": "समयांतर",
        "prefs-advancedediting": "सामान्य विकल्प",
+       "prefs-developertools": "डेवलपर औजार",
        "prefs-editor": "सम्पादक",
        "prefs-preview": "झलक",
        "prefs-advancedrc": "उन्नत विकल्प",
        "prefs-advancedwatchlist": "उन्नत विकल्प",
        "prefs-displayrc": "प्रदर्शन विकल्प",
        "prefs-displaywatchlist": "प्रदर्शन विकल्प",
+       "prefs-changesrc": "परिवर्तन देखावा गवा",
+       "prefs-changeswatchlist": "परिवर्तन देखावा गा",
+       "prefs-pageswatchlist": "देखा जाय चुका पन्ना",
        "prefs-tokenwatchlist": "टोकन",
        "prefs-diffs": "अंतर",
        "prefs-help-prefershttps": "ई प्राथमिकता आप कय अगला लॉगिन मे प्रभावी होई।",
        "prefswarning-warning": "आप अपने पसंद मा परिवर्तन करा गा है जवन अभिन अतक नाइ सहेजि गा है ।अगर आप \"$1\" कय किल्क किहे बिना इ पन्ना छोडा जाइ तव आप कय पसंद नाइ सहेजी जाइ।",
        "prefs-tabs-navigation-hint": "सुझाव: आप टैब्स सूची में टैब्स कय बीचे आवे-जाय खत्तीर बाँवा औ दहिना तीर कुंजिन् कय उपयोग कै सका जात है।",
-       "userrights": "सदस्य अधिकार व्यवस्थापन",
-       "userrights-lookup-user": "सदसà¥\8dय à¤¸à¤®à¥\82हनà¥\8d à¤\95य à¤µà¥\8dयवसà¥\8dथापन à¤\95रा à¤\9cाय",
+       "userrights": "सदस्य अधिकार",
+       "userrights-lookup-user": "यà¤\95 à¤¸à¤¦à¤¸à¥\8dय à¤\9aà¥\81ना",
        "userrights-user-editname": "सदस्यनावँ दिहा जाय:",
-       "editusergroup": "सदसà¥\8dय à¤¸à¤®à¥\82हनà¥\8d à¤\95य à¤¸à¤\82पादन à¤\95रा à¤\9cाय",
+       "editusergroup": "सदसà¥\8dय à¤¸à¤®à¥\82हनà¥\8d à¤\95ा à¤¦à¥\87à¤\96ावा",
        "editinguser": "सदस्य '''[[User:$1|$1]]''' $2 कय अधिकार बदला जाय",
+       "viewinguserrights": "{{GENDER:$1|user}} के उपयोगकर्ता अधिकारऽन् का देखब <strong>[[User:$1|$1]]</strong> $2",
        "userrights-editusergroup": "सदस्य समूहन् कय संपादन करा जाय",
-       "saveusergroups": "सदस्य समूहन् कय व्यवस्थापन सहेजा जाय",
+       "userrights-viewusergroup": "{{GENDER:$1|सदस्य}} समूह देखयं",
+       "saveusergroups": "{{GENDER:$1|सदस्य}} समूह सहेजें",
        "userrights-groupsmember": "निचे कय {{PLURAL:$1|समूह|समूहन्}} कय सदस्य:",
        "userrights-groupsmember-auto": "निचे कय {{PLURAL:$1|समूह|समूहन्}} कय अंतर्निहित सदस्य:",
        "userrights-groups-help": "आप इ सदस्य कय समूह-सदस्यता बदलि सका जात है:\n* बक्सा पे सही कय निशान लागेक माने होय कि सदस्य उ समूह मा है।\n* बक्सा पे सही कय निशान ना लागेक माने होय कि सदस्य उ समूह में नाइ है।\n* एक * कय माने होय कि एक दाइ जोड़ेक बाद उ समूह कय नाइ हटाय सका जात है, औ हटावे कय बाद नाइ जोडि सका जात है।",
        "userrights-nodatabase": "डाटाबेस $1 या तो मौजूद नाइ है या फिर स्थानीय नाइ है।",
        "userrights-changeable-col": "गोल (ग्रुप) जवन आप बदलि सका जात है ।",
        "userrights-unchangeable-col": "गोल (ग्रुप) जवन आप नाइ बदलि सका जात है ।",
+       "userrights-expiry-current": "$1 समाप्ती",
+       "userrights-expiry-none": "समाप्त नहीं होत",
+       "userrights-expiry": "खतम:",
+       "userrights-expiry-existing": "वर्तमान समाप्ति समय: $3, $2",
+       "userrights-expiry-othertime": "कवनो अउर समय:",
+       "userrights-expiry-options": "एक दिन:1 day,एक सप्ताह:1 week,एक महीना:1 month,तीन महीना:3 months,छः महीने:6 months,एक वर्ष:1 year",
+       "userrights-invalid-expiry": "\"$1\" समूह के बरे तिथि अमान्य अहय।",
+       "userrights-expiry-in-past": "\"$1\" समूह के बरे समाप्ती काय समय पहिलेन बीत चुका।",
        "userrights-conflict": "सदस्य अधिकार बदलाव में अंतर्विरोध! कृपया आपन बदलाव जाँचा जाय और फिरसे सुनिश्चित करा जाय।",
        "group": "गोल:",
        "group-user": "सदस्य:",
        "group-autoconfirmed": "अपने आप बनल सदस्य",
        "group-bot": "बॉट",
        "group-sysop": "प्रबंधक",
+       "group-interface-admin": "अन्तरफलक प्रबंधक",
        "group-bureaucrat": "प्रशासक",
        "group-suppress": "ओवरसाईट्स",
        "group-all": "(कुल)",
        "group-autoconfirmed-member": "{{GENDER:$1|अपने आप बनल सदस्य}}",
        "group-bot-member": "{{GENDER:$1|बॉट}}",
        "group-sysop-member": "{{GENDER:$1|प्रबंधक}}",
+       "group-interface-admin-member": "{{GENDER:$1|अन्तरफलक प्रबंधक}}",
        "group-bureaucrat-member": "{{GENDER:$1|प्रशासक}}",
        "group-suppress-member": "{{GENDER:$1|ओवरसाईट}}",
        "grouppage-user": "{{ns:project}}:सदस्य",
        "grouppage-autoconfirmed": "{{ns:project}}:अपने आप बनल सदस्य",
        "grouppage-bot": "{{ns:project}}:बॉट",
        "grouppage-sysop": "{{ns:project}}:प्रबंधक",
+       "grouppage-interface-admin": "{{ns:project}}:अन्तरफलक प्रबंधक",
        "grouppage-bureaucrat": "{{ns:project}}:प्रशासक",
        "grouppage-suppress": "{{ns:project}}:कॉपीराइट",
        "right-read": "पन्ना पढा जाय",
        "right-createpage": "पन्ना बनावा जाय (जवन चर्चा पन्ना नाई होय)",
        "right-createtalk": "बातचीत पन्ना बनावा जाय",
        "right-createaccount": "नँवा सदस्य खाता बनावा जाय",
+       "right-autocreateaccount": "बाहरी खाता से खुदै प्रवेश",
        "right-minoredit": "अपने बदलाव कय छोट चिन्हित करा जाय",
        "right-move": "पन्ना घुसकावा जाय",
        "right-move-subpages": "पन्ना उपपन्नन सहित घुस्कावा जाय",
        "right-editcontentmodel": "पन्ना कय सामग्री नमुना कय बदला जाय",
        "right-editinterface": "सॉफ़्टवेयर इंटरफ़ेस सम्पादित करा जाय",
        "right-editusercss": "अउर सदस्यन् कय सी॰एस॰एस पन्ना सम्पादन करा जाय",
+       "right-edituserjson": "अन्य सदस्यों की JSON फाइलें सम्पादित करें",
        "right-edituserjs": "अउर सदस्यन् कय जावास्क्रिप्ट पन्ना कय सम्पादन करा जाय",
+       "right-editsitecss": "Sitewide CSS सम्पादित करें",
+       "right-editsitejson": "Sitewide JSON सम्पादित करें",
        "right-editmyusercss": "आपन सदस्य स्तर कय सी॰एस॰एस फ़ाइल कय सम्पादन करा जाय",
+       "right-editmyuserjson": "आपन सदस्य JSON फ़ाइल कय सम्पादन करैं",
        "right-editmyuserjs": "आपन सदस्य स्तर कय जावास्क्रिप्ट फ़ाइल सम्पादन करा जाय",
+       "right-editmyuserjsredirect": "आपन खुद कय उपयोगकर्ता जावास्क्रिप्ट फ़ाइलऽन् कय संपादित करैं जौन पुनर्निर्देशित होथीं",
        "right-viewmywatchlist": "आपन ध्यानसूची देखा जाय",
        "right-editmywatchlist": "आपन ध्यानसूची सम्पादन करा जाय। ध्यान दिहा जाय कि कुछ काम इ अधिकार कय बिनव ध्यानसूची में पन्ना जोडिहैं।",
        "right-viewmyprivateinfo": "आपन व्यक्तिगत डाटा देखा जाय (जैसय ई-मेल ठहर, असली नाँव)",
        "right-override-export-depth": "पन्ना निर्यात करा जाय, पाँच स्तर कय गहराई तक जुड़ल पन्ना लइकय",
        "right-sendemail": "अउर सदस्यन् कय ई-मेल पठवा जाय",
        "right-managechangetags": "डेटाबेस से [[Special:Tags|चिप्पियाँ]] बनायें और हटायें",
+       "grant-uploadfile": "नई फाइल अपलोड करा",
+       "grant-basic": "सामान्य अधिकार",
        "newuserlogpage": "सदस्य खाता बनावे कय लॉग",
        "newuserlogpagetext": "ई सदस्य खाता बनावे कय लॉग होय।",
        "rightslog": "सदस्य अधिकार लॉग",
        "action-writeapi": "लेखन ए॰पी॰आई कय प्रयोग करे कय",
        "action-delete": "ई पन्ना मेटावे कय",
        "action-deleterevision": "इ अवतरण कय हटावे कय",
+       "action-deletelogentry": "लॉग प्रविष्टियऽन् का हटावा",
        "action-deletedhistory": "इ पन्ना कय मेटावल इतिहास कय देखे कय",
        "action-browsearchive": "हटावल पन्ना खोजे कय",
        "action-undelete": "ई पन्ना कय पुनर्स्थापित करे कय",
        "action-editmyprivateinfo": "आपन व्यक्तिगत जानकारी बदला जाय",
        "action-editcontentmodel": "पन्ना कय सामग्री नमुना कय बदला जाय",
        "action-managechangetags": "डेटाबेस से चिप्पि बनायें और हटायें",
+       "action-editsitecss": "Sitewide CSS सम्पादित करैं",
+       "action-editsitejson": "Sitewide JSON सम्पादित करैं",
+       "action-editsitejs": "Sitewide JavaScript संपादित करैं",
+       "action-editmyusercss": "आपन सदस्य सी॰एस॰एस फ़ाइल कय सम्पादन करैं",
+       "action-editmyuserjson": "आपन सदस्य JSON फ़ाइल कय सम्पादन करैं",
+       "action-editmyuserjs": "आपन सदस्य स्तर कय Javaसcript फ़ाइल संपादित करैं",
+       "action-editmyuserjsredirect": "आपन खुद कय उपयोगकर्ता जावास्क्रिप्ट फ़ाइलऽन् कय संपादित करैं जौन पुनर्निर्देशित होथीं",
+       "action-viewsuppressed": "कौनो भी उपयोगकर्ता से लुकुवावा गवा संशोधन देखॅंय",
        "nchanges": "$1 {{PLURAL:$1|बदलाव}}",
        "enhancedrc-since-last-visit": "$1 {{PLURAL:$1|अंतिम दाइ देखय कय बाद से}}",
        "enhancedrc-history": "इतिहास",
        "filehist-comment": "टिप्पणी",
        "imagelinks": "फ़ाइल कय उपयोग",
        "linkstoimage": "निचे दिहा {{PLURAL:$1|पन्ना}} में इ फ़ाइल कय कड़ि हैं:",
-       "linkstoimage-more": "{{PLURAL:$1|$1}} से ढेर पन्ना एहमा जोडात है।\nनिम्नोक्त सूची फ़ाइल से जुड़य वाले {{PLURAL:$1|$1 पन्ना}} देखावत है।\n[[Special:WhatLinksHere/$2|पूरा सूची]] उपलब्ध है।",
+       "linkstoimage-more": "$1 {{PLURAL:$1|page uses|उपयोग भवा पन्ना}} से ढेर पन्ना एहमा जोडात है।\nनिम्नोक्त सूची फ़ाइल से जुड़य वाले  {{PLURAL:$1|first page|पहिला $1 पन्ना}} देखावत है।\n[[Special:WhatLinksHere/$2|पूरा सूची]] उपलब्ध है।",
        "nolinkstoimage": "इ फाइल से कवनो पन्ना नाइ जोडान है ।",
        "morelinkstoimage": "इ फ़ाइल कय [[Special:WhatLinksHere/$1|अउर कड़ि]] देखा जाय।",
        "linkstoimage-redirect": "$1(फ़ाइल पुनर्निर्देश) $2",
        "filerevert-legend": "फ़ाइल कय पहिले जैसन करा जाय",
        "filerevert-intro": "आप '''[[Media:$1|$1]]''' कय [$4 $2 कय $3 बजे कय अवतरण] कय पहिले जैसन करा जात है ।",
        "filerevert-comment": "कारण:",
-       "filerevert-defaultcomment": "$1 कय $2 बजे कय अवतरण कय पहिले जैसन कै गय",
+       "filerevert-defaultcomment": "$2, $1 ($3) के अवतरण को पूर्ववत किया",
        "filerevert-submit": "पहिले जैसन करा जाय",
        "filerevert-success": "'''[[Media:$1|$1]]''' कय [$4 $2 कय $3 बजे कय अवतरण] कय पहिले जैसन कै गा है।",
        "filerevert-badversion": "दिहल समय से मिलए वाला इ फ़ाइल कय कवनो पुरान अवतरण नाइ है।",
        "apisandbox-examples": "उदाहरण",
        "apisandbox-results": "परिणाम",
        "apisandbox-request-url-label": "अनुरोध URL:",
-       "apisandbox-request-time": "अनुरोध समय: $1",
+       "apisandbox-request-time": "अनुरोध समय: {{PLURAL:$1|$1 मि}}",
        "booksources": "किताबीन कय स्रोत",
        "booksources-search-legend": "किताबीन कय स्रोत खोजा जाय",
        "booksources-search": "खोजा जाय",
        "booksources-text": "निचँवा पुरान व नँवा किताब बेचय वाले वेबसाइट कय एड्रेस हैं,जवने मा आप कय खोजल किताबिन् कय बारे मे ढेर जानकारी मिलि सकत है :",
        "booksources-invalid-isbn": "इ ISBN सही नाइ लागत है ,मुल स्रोत से नकल करत कय कवनो गल्ती होइ गा होइ ,जाँचा लीन जाय ।",
        "specialloguserlabel": "करयवाला:",
-       "speciallogtitlelabel": "पà¥\8dरयà¥\8bà¤\9cन (शà¥\80रà¥\8dषà¤\95 à¤¯à¤¾ à¤¸à¤¦à¤¸à¥\8dयनाà¤\81व):",
+       "speciallogtitlelabel": "à¤\89दà¥\8dदà¥\87शà¥\8dय (शà¥\80रà¥\8dषà¤\95 à¤¯à¤¾ {{ns:सदसà¥\8dय}}:सदसà¥\8dय à¤\95à¥\87 à¤¬à¤°à¥\87 à¤¸à¤¦à¤¸à¥\8dयनाम):",
        "log": "लॉग",
        "all-logs-page": "कुल सार्वजनिक लॉग",
        "alllogstext": "{{SITENAME}} की सभी उपलब्ध लॉगों की प्रविष्टियों का मिला-जुला प्रदर्शन।\nआप और बारीकी के लिए लॉग का प्रकार, सदस्य नाम (लघु-दीर्घ-अक्षर संवेदी), या प्रभावित पृष्ठ (लघु-दीर्घ-अक्षर संवेदी) चुन सकते हैं।",
        "cachedspecial-viewing-cached-ts": "आप इ पन्ना कय कैश करल अवतरण देखा जात है ,जवन कि पुरै सही नाइ होइ सकत है ।",
        "cachedspecial-refresh-now": "हालिए कय देखा जाय ।",
        "categories": "श्रेणी",
-       "categoriespagetext": "निम्नोक्त {{PLURAL:$1|श्रेणी|श्रेणि}} मा पन्ना या मीडिया है।\nजवन श्रेणिन् कय [[Special:UnusedCategories|अप्रयुक्त श्रेणि]] यहँ नाइ देखाई गा हैं।\n[[Special:WantedCategories|वांछित श्रेणि]] भी देखा जाय।",
+       "categoriespagetext": "निम्नोक्त {{PLURAL:$1|श्रेणी|श्रेणियों}} में पृष्ठ या मीडिया है और यह अप्रयुक्त नहीं भी हो सकती है।\n[[Special:WantedCategories|वांछित श्रेणियाँ]] भी देखें।",
        "categoriesfrom": "इ अक्षर से शुरु होय वाला श्रेणी देखावा जाय:",
        "deletedcontributions": "हटावल सदस्य योगदान",
        "deletedcontributions-title": "हटावल सदस्य योगदान",
        "deletepage": "पन्ना मेटावा जाय",
        "confirm": "सुनिश्चित करा जाय",
        "excontent": "लेख रहा: '$1'",
-       "excontentauthor": "लिà¤\96ा à¤°à¤¹à¤¾: '$1' (à¤\94 à¤\96ालà¥\80 '[[Special:Contributions/$2|$2]]' à¤\95य à¤¯à¥\8bà¤\97दान à¤°à¤¹à¤¾à¥¤)",
+       "excontentauthor": "पाठ à¤¥à¤¾: '$1', à¤\94र à¤¸à¤¿à¤°à¥\8dफ '[[Special:Contributions/$2|$2]]' à¤\95ा à¤¯à¥\8bà¤\97दान à¤¥à¤¾à¥¤ ([[User talk:$2|वारà¥\8dता]])",
        "exbeforeblank": "खाली करय से पहिले पाठ रहा: '$1'",
        "delete-confirm": "\"$1\" मिटावा जाय",
        "delete-legend": "मेटावा जाय",
        "editcomment": "संपादन सारांश रहा: <em>$1</em>।",
        "revertpage": "[[Special:Contributions/$2|$2]] ([[User talk:$2|बातचीत]])से [[User:$1|$1]] कय करल पिछला संशोधन उल्टाई कय पहिले जैसन कै गय",
        "revertpage-nouser": "(सदस्य नाँव हटाइ गा है) कय संपादन कय हटाइकए {{GENDER:$1|[[User:$1|$1]]}} कय अन्तिम अवतरण कय पहिले जैसन कै गय।",
-       "rollback-success": "$1 कय संपादन हटाइ गय;\n$2 कय संपादित अन्तिम अवतरण कय पुनर्स्थापित कै गय।",
+       "rollback-success": "{{GENDER:$3|$1}} के संपादन हटाए;\n{{GENDER:$4|$2}} द्वारा संपादित अन्तिम अवतरण को पुनर्स्थापित किया।",
        "sessionfailure-title": "सत्र विफलता",
        "sessionfailure": "ऐसा प्रतीत होता है कि आपके लॉगिन सत्र के साथ कोई समस्या है।\nसत्र अपहरण से बचाने के लिए सावधानी के तौर पर आपका यह क्रियाकलाप रद्द कर दिया गया है।\nकृपया पीछे जाएँ और पृष्ठ को पुनः लोड करें, तब दुबारा कोशिश करें।",
        "protectlogpage": "सुरक्षा लॉग",
        "contributions": "{{GENDER:$1|सदस्य}} योगदान",
        "contributions-title": "$1 कय योगदान",
        "mycontris": "योगदान",
+       "anoncontribs": "योगदान",
        "contribsub2": "{{GENDER:$3|$1}} ($2) कय खर्तीन",
        "contributions-userdoesnotexist": "सदस्य \"$1\" पंजीकृत नाइ है।",
        "nocontribs": "इन कसौटियों से मिलनेवाले बदलाव मिले नहीं।",
        "sp-contributions-newbies-sub": "नँवा सदस्यन कय खर्तीन",
        "sp-contributions-newbies-title": "नँवा सदस्यन् कय योगदान",
        "sp-contributions-blocklog": "ब्लॉक सूची",
-       "sp-contributions-suppresslog": "हà¤\9fावल à¤¸à¤¦à¤¸à¥\8dय योगदान",
-       "sp-contributions-deleted": "हà¤\9fावल à¤¸à¤¦à¤¸à¥\8dय योगदान",
+       "sp-contributions-suppresslog": "à¤\9bà¥\81पाà¤\8f à¤\97à¤\8f {{GENDER:$1|सदसà¥\8dय}} à¤\95à¥\87 योगदान",
+       "sp-contributions-deleted": "हà¤\9fाà¤\8f à¤\97à¤\8f {{GENDER:$1|सदसà¥\8dय}} योगदान",
        "sp-contributions-uploads": "अपलोड",
        "sp-contributions-logs": "लॉग",
        "sp-contributions-talk": "बातचीत",
-       "sp-contributions-userrights": "सदस्य अधिकार प्रबंधन",
+       "sp-contributions-userrights": "{{GENDER:$1|सदस्य}} अधिकार प्रबंधन",
        "sp-contributions-blocked-notice": "ई सदस्य अभीन अवरोधित है।\nसदंर्भ कय लिए ताज़ातरीन अवरोध लॉग प्रविष्टि नीचे दीहा है:",
        "sp-contributions-blocked-notice-anon": "ई आईपी ठहर अभीन अवरोधित है।\nसदंर्भ कय लिए ताज़ातरीन अवरोध लॉग प्रविष्टि नीचा दीहा है:",
        "sp-contributions-search": "योगदान कय खर्तीन खोज",
        "block": "सदस्य कय अवरोधित करा जाय।",
        "unblock": "सदस्य कय अवरोध हटावा जाय।",
        "blockip": "{{GENDER:$1|सदस्य}}",
-       "blockiptext": "विशिष्ठ IP पते अथवा सदस्य नाम को लिखने के अधिकार से बाध्य करने के लिए निम्न पत्र का प्रयोग करें।\nयह सिर्फ बर्बरता को रोकने के लिए ही किया जाना चाहिए, और [[{{MediaWiki:Policy-url}}|नीति]] के अनुसार ही करना चाहिए।\nनीचे विशिष्ठ कारण भी लिखें (उदाहरण के लिए, सटीक पृष्ठों को दर्शाते हुए, जिनमें बर्बरता की गई हो)।",
+       "blockiptext": "विशिष्ठ IP पते अथवा सदस्य नाम को लिखने के अधिकार से बाध्य करने के लिए निम्न पत्र का प्रयोग करें।\nयह सिर्फ बर्बरता को रोकने के लिए ही किया जाना चाहिए, और [[{{MediaWiki:Policy-url}}|नीति]] के अनुसार ही करना चाहिए।\nनीचे विशिष्ठ कारण भी लिखें (उदाहरण के लिए, सटीक पृष्ठों को दर्शाते हुए, जिनमें बर्बरता की गई हो)।\nआप [https://en.wikipedia.org/wiki/Classless_Inter-Domain_Routing सीआईडीआर] सिंटैक्स का उपयोग करके आईपी पता श्रेणियां ब्लॉक कर सकते हैं। आईपीवी4 के लिए सबसे बड़ी स्वीकार्य सीमा /$1 है और आईपीवी6 के लिए /$2 है।",
        "ipaddressorusername": "आईपी एड्रेस या सदस्यनाँव:",
        "ipbreason": "कारण:",
        "ipbreason-dropdown": "*अवरोधित करने के साधारण कारण\n** अवैध सदस्यनाम\n** एक से अधिक खातें खोलकर उनका दुरुपयोग करना\n** गलत जानकारी भरना\n** पृष्ठों में कचरा भरना\n** पृष्ठों से सामग्री हटाना‍‍‍‍‍\n** बाहरी जालस्थलों की फ़ालतू कड़ियां देना \n** सदस्यों को तंग करना",
        "import-nonewrevisions": "कोई अवतरण आयात नहीं किये गये (या तो सभी अवतरण पहले से मौजूद हैं, या त्रुटियों के कारण छोड़े गये)।",
        "xml-error-string": "$1 पंक्ति $2 मा, कॉलम $3 (बाईट $4): $5",
        "import-upload": "XML डाटा अपलोड कीन जाय",
-       "import-token-mismatch": "सत्र सामग्री खो गई है। \nकृपया पुनः प्रयास करें।",
+       "import-token-mismatch": "सत्र सामग्री खो गई है।\n\nशायद आपने सत्रान्त कर दिया। <strong>कृपया इसकी पुष्टि करें कि आप अभी तक प्रविष्ट हैं और पुनः प्रयास करें</strong>।\nयदि अब भी समस्या हल नहीं हुई, तो [[Special:UserLogout|सत्रान्त]] करें और पुनः प्रवेश करें एवं यह जाँचें की आपका ब्राउज़र इस साइट के लिए कुकीज़ को अनुमत करता है।",
        "import-invalid-interwiki": "इ विकि से आयात नाइ होइ सकत है।",
        "import-options-wrong": "गलत {{PLURAL:$2|विकल्प}}: <nowiki>$1</nowiki>",
        "import-rootpage-invalid": "दिहल उपसर्ग पन्ना शीर्षक अमान्य है।",
        "javascripttest": "जावास्क्रिप्ट परीक्षण",
        "javascripttest-pagetext-unknownaction": "अज्ञात काम \"$1\".",
        "javascripttest-qunit-intro": "mediawiki.org पे [$1 परीक्षण कय प्रलेखन] देखा जाय।",
-       "tooltip-pt-userpage": "आप कय सदस्य पन्ना",
+       "tooltip-pt-userpage": "आप कय {{GENDER:|सदस्य पन्ना}}",
        "tooltip-pt-anonuserpage": "आप जिस आईपी से बदलाव कर रहें हैं उसका सदस्य पन्ना निचे है",
-       "tooltip-pt-mytalk": "आप कय बातचित पन्ना",
+       "tooltip-pt-mytalk": "{{GENDER:|आप कय}} बातचित पन्ना",
        "tooltip-pt-anontalk": "इस आईपी एड्रेससे हुए बदलावों के बारे में वार्ता",
-       "tooltip-pt-preferences": "आप कय पसंद",
+       "tooltip-pt-preferences": "{{GENDER:|आप कय}} पसंद",
        "tooltip-pt-watchlist": "आप कय ध्यान दिहल पन्नन कय सूची",
-       "tooltip-pt-mycontris": "आप कय योगदान कय सुची",
+       "tooltip-pt-mycontris": "{{GENDER:|आप कय}} योगदान कय सुची",
        "tooltip-pt-login": "आप कय खाता प्रवेश खत्तिर प्रोत्साहित कै जात है, लेकिन ई अनिवार्य नाई है",
        "tooltip-pt-logout": "बहरे निकरा जाय",
        "tooltip-pt-createaccount": "हमारा सुझाव है की आप खाता बनाएँ और लॉगिन करें, परन्तु यह अनिवार्य नहीं है",
        "tooltip-t-recentchangeslinked": "ई पन्ना से जोडान पन्नवन पे तुरंत करल बदलाव",
        "tooltip-feed-rss": "इ पन्ना कय आरएसएस फ़ीड",
        "tooltip-feed-atom": "ई पन्ना कय Atom फ़ीड",
-       "tooltip-t-contributions": "इ सदस्य कय योगदान कय सुची देखा जाय",
-       "tooltip-t-emailuser": "इ सदस्य कय इमेल पठवा जाय",
+       "tooltip-t-contributions": "{{GENDER:$1|इ सदस्य}} कय योगदान कय सुची देखा जाय",
+       "tooltip-t-emailuser": "{{GENDER:$1|इ सदस्य}} कय इमेल पठवा जाय",
        "tooltip-t-info": "इ पन्ना कय बारे मे ढेर जानकारी",
        "tooltip-t-upload": "फ़ाइल अपलोड करा जाय",
        "tooltip-t-specialpages": "कुल विशेष पन्नन कय सूची",
        "lastmodifiedatby": "इ पन्ना कय अन्तिम बदलाव $2, $1 पे $3 करें रहें।",
        "othercontribs": "$1 कय काम कय अनुसार।",
        "others": "अउर",
-       "siteusers": "{{SITENAME}} {{PLURAL:$2|सदस्य|सदस्य}} $1",
+       "siteusers": "{{SITENAME}} {{PLURAL:$2|{{GENDER:$1|सदस्य}}|सदस्य}} $1",
        "anonusers": "{{SITENAME}} अनाम {{PLURAL:$2|सदस्य|सदस्य}} $1",
        "creditspage": "पन्ना श्रेय नामावली",
        "nocredits": "इस पृष्ठ के लिये क्रेडिट जानकारी नहीं है।",
        "spam_reverting": "$1 को कड़ी ना होने वाले पुराने अवतरण को पुनर्स्थापित कर रहें हैं",
        "spam_blanking": "सभी अवतरणोंमें $1 को कड़ियां हैं, पूरा पाठ निकाल रहें हैं",
        "spam_deleting": "सभी अवतरणों में $1 की कड़ी थी, हटाया जा रहा है",
-       "simpleantispam-label": "ऐन्टी-स्पैम जाँच।\nइसे <strong>नहीं</strong> भरें!",
+       "simpleantispam-label": "ऐन्टी-स्पैम जाँच।\nइसे <strong>not</strong> भरें!",
        "pageinfo-title": "\"$1\" कय जानकारी",
        "pageinfo-not-current": "क्षमा करें, पुराने अवतरणों के लिए यह जानकारी प्रदान करना संभव नहीं है।",
        "pageinfo-header-basic": "मूल जानकारी",
        "autoredircomment": "[[$1]] पे अनुप्रेषित",
        "autosumm-new": "'$1' कय साथे नँवा पन्ना बनावा गय",
        "autosumm-newblank": "खाली पन्ना बनावा गय",
-       "lag-warn-normal": "पिछले $1 {{PLURAL:$1|सेकिंड|सेकिंड}} में हुए बदलाव संभवतः इस सूची में नहीं आएँगे।",
-       "lag-warn-high": "आँकड़ाकोष सेवक में अधिक देर की वजह से $1 {{PLURAL:$1|सेकिंड|सेकिंड}} से पहले तक के बदलाव ही इस सूची में निश्चित रूप से दिखेंगे।",
+       "lag-warn-normal": "पिछले $1 {{PLURAL:$1|Second|सेकिंड}} में हुए बदलाव संभवतः इस सूची में नहीं आएँगे।",
+       "lag-warn-high": "आँकड़ाकोष सेवक में अधिक देर की वजह से $1 {{PLURAL:$1|Second|सेकिंड}} से पहले तक के बदलाव ही इस सूची में निश्चित रूप से दिखेंगे।",
        "watchlistedit-normal-title": "ध्यानसूची बदला जाय",
        "watchlistedit-normal-legend": "ध्यानसूची से शीर्षक हटावा जाय",
        "watchlistedit-normal-explain": "आपकी ध्यानसूची में सूचीबद्ध पृष्ठ नीचे दिये गये हैं।\nपृष्ठ सूची से हटाने के लिये उसके आगे दिये बक्से पर क्लिक करें, और \"{{int:Watchlistedit-normal-submit}}\" पर क्लिक करें।\nआप [[Special:EditWatchlist/raw|रॉ ध्यानसूची का संपादन]] भी कर सकते हैं।",
        "version-libraries": "इन्स्टाल करल लाइब्रेरी",
        "version-libraries-library": "लाइब्रेरी",
        "version-libraries-version": "संस्करण",
-       "redirect-summary": "यह विशेष पृष्ठ फ़ाइलनाम प्रदान करने पर फ़ाइल नाम को, पृष्ठ आइ॰दी अथवा अवतरण आइ॰दी देने पर पृष्ठ को, और सदस्य आइ॰दी देने पर सदस्य पृष्ठ को पुनर्प्रेषित करता है। उदाहरण: [[{{#Special:Redirect}}/file/Example.jpg]], [[{{#Special:Redirect}}/page/64308]], [[{{#Special:Redirect}}/revision/328429]], या [[{{#Special:Redirect}}/user/101]]।",
+       "redirect": "फ़ाइल, सदस्य, पृष्ठ, अवतरण या लॉग आईडी द्वारा अनुप्रेषित",
+       "redirect-summary": "यह विशेष पृष्ठ फ़ाइलनाम प्रदान करने पर फ़ाइल नाम को, पृष्ठ आइ॰दी अथवा अवतरण आइ॰दी देने पर पृष्ठ को, और सदस्य आइ॰दी देने पर सदस्य पृष्ठ को पुनर्प्रेषित करता है। उदाहरण: [[{{#Special:Redirect}}/file/Example.jpg]], [[{{#Special:Redirect}}/page/64308]], [[{{#Special:Redirect}}/revision/328429]],[[{{#Special:Redirect}}/user/101]] या\n[[{{#Special:Redirect}}/logid/186]] ।",
        "redirect-submit": "जावा जाय",
        "redirect-lookup": "ढूँढा जाय:",
        "redirect-value": "मूल्य:",
        "htmlform-cloner-create": "अउर जोडा जाय",
        "htmlform-cloner-delete": "हटावा जाय",
        "logentry-delete-delete": "$1 ने पृष्ठ $3 {{GENDER:$2|हटा}} दिहा गय",
-       "logentry-delete-restore": "$1 ने पृष्ठ $3 कय {{GENDER:$2|पुनर्स्थापित}} कै गय",
+       "logentry-delete-restore": "$1 ने पृष्ठ $3($4) कय {{GENDER:$2|पुनर्स्थापित}} कै गय",
        "logentry-delete-event": "$1 ने $3 पृष्ठ की लॉग {{PLURAL:$5|प्रविष्टि|प्रविष्टियों}} की दृश्यता {{GENDER:$2|बदली}}: $4",
        "logentry-delete-revision": "$1 ने $3 पृष्ठ के {{PLURAL:$5|एक अवतरण|$5 अवतरणों}} की दृश्यता {{GENDER:$2|बदली}}: $4",
        "logentry-delete-event-legacy": "$1 ने $3 पृष्ठ पर लॉग क्रियाओं की दृश्यता {{GENDER:$2|बदली}}",
        "logentry-rights-rights-legacy": "$1 ने $3 के सदस्य समूह {{GENDER:$2|बदले}}",
        "logentry-rights-autopromote": "$1 के सदस्य समूह स्वतः $4 से बदलकर $5 {{GENDER:$2|किये}} गए",
        "logentry-upload-upload": "$1 {{GENDER:$2|ने}} $3 अपलोड किया",
+       "logentry-upload-overwrite": "$1 {{GENDER:$2|अपलोड कीन गा}} $3 कय एक नवा अवतरण",
        "rightsnone": "(कउनो नाहीं)",
        "feedback-adding": "पृष्ठ पे प्रतिक्रिया जोडत है ...",
        "feedback-back": "पीछे",
        "feedback-thanks": "धन्यवाद! आपकी प्रतिक्रिया पृष्ठ में नियुक्त किया गया है \"[ $2  $1 ]\"।",
        "feedback-thanks-title": "धन्यवाद!",
        "feedback-useragent": "प्रयोगकर्ता एजेन्ट:",
-       "searchsuggest-search": "खोज",
+       "searchsuggest-search": "{{SITENAME}} में खोजा जाय",
        "searchsuggest-containing": "...से युक्त",
        "api-error-badtoken": "आंतरिक त्रुटि: खराब टोकन।",
        "api-error-emptypage": "नँवा अव खाली पन्ना बनावै कय अनुमति नाइ है",
        "special-characters-title-endash": "डैश",
        "special-characters-title-emdash": "बड्का डैश",
        "special-characters-title-minus": "माइनस चिन्ह",
+       "randomrootpage": "कउनो भी मूल पन्ना",
+       "log-action-filter-upload-upload": "नवा अपलोड",
+       "log-action-filter-upload-overwrite": "फिर से अपलोड",
+       "log-action-filter-upload-revert": "पहिले जैसन करा जाय",
+       "authmanager-create-disabled": "खाता बनावै कय रोक लगाए दिहा गा हैं।",
+       "authmanager-email-label": "ईमेल",
+       "authmanager-email-help": "ईमेल पता",
+       "authmanager-realname-label": "वास्तविक नांव",
+       "authmanager-realname-help": "सदस्य कय वास्तविक नांव",
+       "authmanager-provider-password": "पासवर्ड-आधारित प्रमाणीकरण",
+       "authmanager-provider-password-domain": "पासवर्ड- अउर डोमेन-आधारित प्रमाणीकरण",
+       "authmanager-provider-temporarypassword": "अस्थाई पासवर्ड",
+       "authprovider-resetpass-skip-label": "छोड़ा",
+       "authprovider-resetpass-skip-help": "पासवर्ड का रीसेट करय का छोड़ द्या।",
+       "authform-notoken": "टोकन लापता अहय",
+       "authform-wrongtoken": "गलत टोकन",
+       "specialpage-securitylevel-not-allowed-title": "अनुमति नाइ हय",
+       "authpage-cannot-login": "लॉगिन शुरू करय मा असमर्थ।",
+       "cannotauth-not-allowed-title": "अनुमति नहीं मिली।",
+       "changecredentials": "साख बदला",
+       "changecredentials-submit": "साख बदला",
+       "changecredentials-invalidsubpage": "$1 सही परिचय कय प्रकार ना होय।",
+       "changecredentials-success": "आपकै परिचय बदला गवा।",
+       "removecredentials": "परिचय निकारा",
+       "removecredentials-submit": "परिचय निकारा",
+       "removecredentials-invalidsubpage": "$1 सही परिचय कय प्रकार ना होय।",
+       "removecredentials-success": "आपकै परिचय निकार दीन गवा।",
+       "credentialsform-provider": "परिचय प्रकार :",
+       "credentialsform-account": "खाता कय नाव:",
+       "cannotlink-no-provider-title": "जोड़य लायेक कउनो खाता नाही हय",
+       "cannotlink-no-provider": "जोड़य लायेक कउनो खाता नाही हय।",
+       "linkaccounts": "खाता जोड़ा",
+       "linkaccounts-success-text": "खाता जोड़ा गवा।",
+       "linkaccounts-submit": "खाता जोड़ा",
+       "cannotunlink-no-provider-title": "अनलिंक करय बरे कउनो जुड़ा हुआ खाता नाही हय",
+       "cannotunlink-no-provider": "अइसा कउनो भी जुड़ा हुआ खाता नाही हय जेहका अनलिंक कीन जाय सकय।",
+       "unlinkaccounts": "खाता अनलिंक करा",
+       "unlinkaccounts-success": "खाता अनलिंक भवा",
+       "specialmute": "आवाज़ बंद करा जाय",
        "userlogout-continue": "का आप लॉग आउट करा चाहत अहैं?"
 }
index b204756..bfaac9d 100644 (file)
        "loginsuccesstitle": "مان بیت اِت",
        "loginsuccess": "''''شما الان وارد {{SITENAME}} په عنوان \"$1\".'''",
        "nosuchuser": "هچ کارزورکے گۏں \"$1\"ءَ ناما نݔست اِنت.\nکارزوروکیءِ نام پہ گالءِ مزنی ءُ ھُردی‌ئا حساس اِنت.\nوتی لکتگݔں گالاں شرّ بہ چار اِت یا[[Special:CreateAccount|نۏکݔں سابے جۏڈݔن]]اِت.",
-       "nosuchusershort": "هچ کاربری گون نام  \"$1\"نیستن.\nوتی املايا کنترل کنیت",
-       "nouserspecified": "شما باید یک نام کاربری مشخص کنیت.",
+       "nosuchusershort": "ھچ کارزورۏکے گۏں ''$1''ء نام‌ئا نے",
+       "nouserspecified": "شما باید یک کارزورۏکی نامے بہ لک اݔت.",
        "login-userblocked": "ائ کابر بلاک بیتگ. لاگین مان سیستمء اجازت نه انت.",
        "wrongpassword": "گالگوَز اشی نئں واجہ میر. الکاپݔں گالگوَزا بہ لِک.",
        "wrongpasswordempty": "کلمه رمز وارد بیتگین هالیکنت. دگه سعی کن",
        "history-feed-item-nocomment": "$1 ته $2",
        "history-feed-empty": "لوٹتگین صفحه موجود نهنت.\nشاید آی چه ویکی حذف بوتت یا نامی بدل بوتت.\nآزمایش کن[[Special:Search|گردگ ته ویکی]] په مربطین نوکین صفحات.",
        "rev-deleted-comment": "(ویرایشء خلاصگ هزپ بوت)",
-       "rev-deleted-user": "(نام کاربری زورگ بیتت)",
+       "rev-deleted-user": "(کارزورۏکی نام گرگ بیتہ)",
        "rev-deleted-event": "(کار آمار زورگ بیتت)",
        "rev-deleted-user-contribs": "[یوزرنام یانکه یانکه آی پی ادرس هزپ بیتگ انت  - ویرایش چیرداتگین مان هواربیتگان]",
        "rev-deleted-text-permission": "ائ ویرایش چه ائ پیج '''هزپ بیتگ انت'''.\nبلکین اطلاعات گون آئی همگرنچء مان [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} هزپانی سیاهگ] موجوت بیت انت.",
        "prefs-tabs-navigation-hint": "بزان: شما توان ات چه چپی و راستی پیشداروکین بٹن ان  پر حرکت زبانگ انی توکا مان زبانگانی لیست کارمرز بکن ات.",
        "userrights": "مدیریت حقوق کاربر",
        "userrights-lookup-user": "مدیریت گروه کاربر",
-       "userrights-user-editname": "یک نام کاربری وارد کن",
+       "userrights-user-editname": "کارزورۏکی نامے بہ لِک اݔت",
        "editusergroup": "اصلاح گروه کاربر",
        "editinguser": "ٹگل مان ایهتیارات کاربریء کاربر '''[[User:$1|$1]]''' $2",
        "userrights-editusergroup": "اصلاح گروه کاربر",
        "sp-contributions-talk": "گپ",
        "sp-contributions-userrights": "مدیریت کاربرنی حق",
        "sp-contributions-search": "گردگ په مشارکتان",
-       "sp-contributions-username": "آدرس آی پی یا نام کاربری",
+       "sp-contributions-username": "آیپی یا کارزورۏکی نام",
        "sp-contributions-submit": "گردگ",
        "whatlinkshere": "اے لینکے کہ ادا ھہ",
        "whatlinkshere-title": "صفحاتی که لینگ بوتگنت په \"$1\"",
        "whatlinkshere-filters": "فیلتران",
        "blockip": "محدود کتن کاربر",
        "blockiptext": "چه ای فرم جهلی په نوشتن دسترسی په یک خاصین آدرس آی پی یا نام کاربری استفاده کن.\nشی فقط انجام بیت په خاطر جلوگیری چه هرابکاری  په اساس [[{{MediaWiki:Policy-url}}|سیاست]].\nیک حاصین دلیلی بنویس جهلء (مثلا، گوشگ صفخات خاصی که هراب بپتگنت).",
-       "ipaddressorusername": "آدرس آي پی یا نام کاربری:",
+       "ipaddressorusername": "آیپی یا کارزورۏکی نام:",
        "ipbreason": "دلیل:",
        "ipbreason-dropdown": "* متداولین دلایل محدودیت\n** وارد کتن غلطین اطلاحات\n** زورگ محتوا چه صفحات\n** لینکان اسپمی په دراین سایت\n**وارد کتن بی ربطین/نامفومین چیز په صفحات\n** ترسناکین رفتار/ آزار\n**سوء استفاده چه چنت حساب\n** غیر قابل قبولین نام کاربری",
        "ipbcreateaccount": "مهل حساب شرکنت",
        "block-log-flags-hiddenname": "پناهین کاربر",
        "range_block_disabled": "توانایی مدیران سیستم په شرکتن محدوده محدودیت غیر فعالنت.",
        "ipb_expiry_invalid": "وهد هلگ نامعتبر انت.",
-       "ipb_expiry_temp": "پناهین نام کاربری محدودیاتن بایدن دایمی بنت.",
+       "ipb_expiry_temp": "باید اِنت کہ اندݔمی کارزورۏکی نام مسدود بہ بیت",
        "ipb_hide_invalid": "نه تونیت ای حسابءَ بندی کن؛ بلکین بازین اصلاحی هستن.",
        "ipb_already_blocked": "\"$1\" الان محدودنت.",
        "ipb-needreblock": "دسترسی $1 چه قبل بند ات. آیا لوٹیت تنظیم‌های آن را تغییر دهیت؟",
index fd5c2a0..cedef82 100644 (file)
        "category-header-numerals": "$1–$2",
        "about": "За {{SITENAME}}",
        "article": "Страница",
-       "newwindow": "(оÑ\82ваÑ\80Ñ\8f Ñ\81е Ð² Ð½Ð¾Ð² Ð¿Ñ\80озоÑ\80еÑ\86)",
+       "newwindow": "(нов прозорец)",
        "cancel": "Отказ",
        "moredotdotdot": "Още…",
        "morenotlisted": "Възможно е този списък да е непълен.",
        "noarticletext": "Понастоящем няма текст на тази страница.\nМожете да [[Special:Search/{{PAGENAME}}|потърсите за заглавието на страницата]] в други страници, да <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} потърсите в съответните дневници] или [{{fullurl:{{FULLPAGENAME}}|action=edit}} да я създадете]</span>.",
        "noarticletext-nopermission": "Понастоящем в тази страница няма текст.\nМожете да [[Special:Search/{{PAGENAME}}|потърсите заглавието на тази страница ]] в други страници или да <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} потърсите в съответните дневници]</span>, но нямате права да създадете тази страница.",
        "missing-revision": "Версия #$1 на страницата „{{FULLPAGENAME}}“ не съществува.\n\nТова обикновено се дължи на препратка от историята на страницата, която е била изтрита.\nПодробности могат да бъдат открити в [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} дневника на изтриванията].",
-       "userpage-userdoesnotexist": "Ð\9dÑ\8fма Ñ\80егиÑ\81Ñ\82Ñ\80иÑ\80ана Ð¿Ð¾Ñ\82Ñ\80ебиÑ\82елÑ\81ка Ñ\81меÑ\82ка Ð·Ð° â\80\9e$1â\80\9c.\nÐ\9cолÑ\8f Ð¿Ð¾Ñ\82вÑ\8aÑ\80деÑ\82е, че желаете да създадете/редактирате тази страница.",
+       "userpage-userdoesnotexist": "Ð\9dÑ\8fма Ñ\80егиÑ\81Ñ\82Ñ\80иÑ\80ана Ð¿Ð¾Ñ\82Ñ\80ебиÑ\82елÑ\81ка Ñ\81меÑ\82ка Ð·Ð° â\80\9e$1â\80\9c.\nÐ\98зиÑ\81ква Ñ\81е Ð¿Ð¾Ñ\82вÑ\8aÑ\80ждение, че желаете да създадете/редактирате тази страница.",
        "userpage-userdoesnotexist-view": "Не е регистрирана потребителска сметка на име „$1“.",
        "blocked-notice-logextract": "В момента този потребител е блокиран.\nПо-долу за справка е показан последният запис от дневника на блокиранията:",
        "clearyourcache": "<strong>Забележка:</strong> За да се видят промените, необходимо е след съхраняване на страницата, кешът на браузъра да бъде изтрит.\n* <strong>Firefox / Safari:</strong> Задържа се клавиш <em>Shift</em> и се щраква върху <em>Презареждане</em> (<em>Reload</em>) или чрез клавишната комбинация <em>Ctrl-F5</em> or <em>Ctrl-R</em> (<em>⌘-R</em> за Mac);\n* <strong>Google Chrome:</strong> клавишна комбинация <em>Ctrl-Shift-R</em> (<em>⌘-Shift-R</em> за Mac)\n* <strong>Internet Explorer:</strong> Задържа се клавиш <em>Ctrl</em> и се щраква върху <em>Refresh</em> или чрез клавишната комбинация <em>Ctrl-F5</em>;\n* <strong>Opera:</strong> кешът се изчиства през менюто <em>Tools → Settings</em> (<em>Opera → Preferences</em> за Mac) след което <em>Privacy & security → Clear browsing data → Cached images and files</em>.",
        "recentchanges-page-removed-from-category": "[[:$1]] е премахната от категория",
        "recentchanges-page-removed-from-category-bundled": "[[:$1]] е премахната от категория, [[Special:WhatLinksHere/$1|тази страница е включена в други страници]]",
        "autochange-username": "Автоматична промяна на МедияУики",
-       "upload": "Ð\9aаÑ\87и файл",
+       "upload": "Ð\9aаÑ\87ване Ð½Ð° файл",
        "uploadbtn": "Качване на файл",
        "reuploaddesc": "Връщане към формуляра за качване",
        "upload-tryagain": "Съхраняване на промененото описание на файла",
        "statistics-header-edits": "Статистики за редакциите",
        "statistics-header-users": "Потребителски статистики",
        "statistics-header-hooks": "Други статистики",
-       "statistics-articles": "СÑ\8aдÑ\8aÑ\80жаÑ\82елни Ñ\81Ñ\82Ñ\80аниÑ\86и",
+       "statistics-articles": "СÑ\82Ñ\80аниÑ\86и Ñ\81Ñ\8aÑ\81 Ñ\81Ñ\8aдÑ\8aÑ\80жание",
        "statistics-pages": "Страници",
        "statistics-pages-desc": "Всички страници в уикито, включително дискусионни, пренасочващи страници и т.н.",
        "statistics-files": "Качени файлове",
        "logentry-contentmodel-change-revert": "връщане",
        "protectlogpage": "Дневник на защитата",
        "protectlogtext": "Списък на промените в защитата за страницата.\nМожете да прегледате и [[Special:ProtectedPages|списъка на текущо защитените страници]].",
-       "protectedarticle": "заÑ\89иÑ\82и „[[$1]]“",
+       "protectedarticle": "заÑ\89иÑ\82ена „[[$1]]“",
        "modifiedarticleprotection": "смени нивото на защита на „[[$1]]“",
        "unprotectedarticle": "свали защитата на „[[$1]]“",
        "movedarticleprotection": "премести настройките на защита от „[[$2]]“ на „[[$1]]“",
        "tag-list-wrapper": "[[Special:Tags|{{PLURAL:$1|Етикет|Етикети}}]]: $2",
        "tag-mw-contentmodelchange": "промяна на модела на съдържание",
        "tag-mw-new-redirect": "Ново пренасочване",
-       "tag-mw-removed-redirect": "Премахнато пренасочване",
-       "tag-mw-changed-redirect-target": "Промяна целта на пренасочване",
-       "tag-mw-changed-redirect-target-description": "Редакции, променящи целта на пренасочване",
+       "tag-mw-new-redirect-description": "Редакции, които създават ново пренасочване или променят страница на пренасочваща",
+       "tag-mw-removed-redirect": "Премахване на пренасочване",
+       "tag-mw-changed-redirect-target": "Промяна на целта на пренасочване",
+       "tag-mw-changed-redirect-target-description": "Редакции, които променят целта на пренасочване",
        "tag-mw-blank": "Изтриване на съдържанието",
-       "tag-mw-replace": "Заменено",
+       "tag-mw-blank-description": "Редакции, които изтриват съдържанието на страница",
+       "tag-mw-replace": "Заместване",
        "tag-mw-replace-description": "Редакции, премахващи над 90% от съдържанието на страница",
        "tag-mw-rollback": "Отмяна",
-       "tag-mw-undo": "Ð\9eÑ\82мÑ\8fна",
+       "tag-mw-undo": "Ð\92Ñ\80Ñ\8aÑ\89ане",
        "tags-title": "Етикети",
        "tags-intro": "Тук са изброени всички етикети, които могат да се ползват за отбелязване на редакциите, както и тяхното значение.",
        "tags-tag": "Име на етикета",
index cd0cacf..a315d3f 100644 (file)
        "systemblockedtext": "আপনার ব্যবহারকারী নাম অথবা আইপি ঠিকানাটিকে স্বয়ংক্রিয়ভাবে মিডিয়াউইকি দ্বারা বাধাদান করা হয়েছে। যে কারণটি দেওয়া হয়েছে, সেটি হল:\n\n:<em>$2</em>\n\n* বাধা শুরুর সময়: $8\n* বাধা উঠিয়ে নেয়ার সময়: $6\n* যাকে বাধাদান করা হয়েছে: $7\n\nআপনার বর্তমান আইপি ঠিকানাটি হল $3।\nদয়া করে আপনার যেকোন জিজ্ঞাসাতে উপরের সমস্ত বিবরণ অন্তর্ভুক্ত করুন।",
        "blockednoreason": "কোন কারণ দেওয়া হয়নি",
        "blockedtext-composite": "<strong>আপনার ব্যবহারকারী নাম অথবা আইপি ঠিকানাটিকে বাধা দেয়া হয়েছে।</strong>\n\nযে কারণটি দেওয়া হয়েছে, সেটি হল:\n\n:<em>$2</em>\n\n* বাধা শুরুর সময়: $8\n* বাধা উঠিয়ে নেয়ার সময়: $6\n\n* $5\n\nআপনার বর্তমান আইপি ঠিকানাটি হল $3।\nদয়া করে আপনার যেকোন জিজ্ঞাসাতে উপরের সমস্ত বিবরণ অন্তর্ভুক্ত করুন।",
+       "blockedtext-composite-ids": "প্রাসঙ্গিক বাধাদান আইডি: $1 (আপনার আইপি ঠিকানাটি কালোতালিকাভুক্তও হতে পারে)",
+       "blockedtext-composite-no-ids": "আপনার আইপি ঠিকানাটি একাধিক নিষিদ্ধ তালিকায় অন্তর্ভুক্ত",
+       "blockedtext-composite-reason": "আপনার অ্যাকাউন্ট ও/বা আইপি ঠিকানার বিরুদ্ধে একাধিক বাধা রয়েছে",
        "whitelistedittext": "পাতায় সম্পাদনা করতে অনুগ্রহ করে $1 করুন।",
        "confirmedittext": "কোন সম্পাদনা করার আগে আপনার ই-মেইল ঠিকানাটি অবশ্যই নিশ্চিত করতে হবে। দয়া করে আপনার ই-মেইল ঠিকানাটি [[Special:Preferences|ব্যবহারকারীর পছন্দতালিকায়]] ঠিকমত দিন।",
        "nosuchsectiontitle": "অনুচ্ছেদ পাওয়া যায়নি",
        "search-interwiki-more": "(আরও)",
        "search-interwiki-more-results": "আরও ফলাফল",
        "search-relatedarticle": "সম্পর্কিত",
+       "search-invalid-sort-order": "$1-এর বাছাইয়ের ক্রম অজানা, পূর্বনির্ধারিত বাছাই প্রয়োগ হবে। বৈধ বাছাইয়ের ক্রমগুলি হল: $2",
        "searchrelated": "সম্পর্কিত",
        "searchall": "সমস্ত",
        "showingresults": "নিচে '''$2''' নং থেকে শুরু করে {{PLURAL:$1|'''1''' ফলাফল|'''$1''' ফলাফলসমূহ}} দেখানো হল।",
        "blocklink": "বাধা দাও",
        "unblocklink": "বাধা তুলুন",
        "change-blocklink": "বাধা পরিবর্তন করুন",
+       "empty-username": "(কোনও ব্যবহারকারীর নাম উপলব্ধ নেই)",
        "contribslink": "অবদান",
        "emaillink": "ই-মেইল পাঠাও",
        "autoblocker": "আপনাকে স্বয়ংক্রিয়ভাবে বাধা দেওয়া হয়েছে, কারণ আপনার আইপি ঠিকানাটি সম্প্রতি \"[[User:$1|$1]]\" ব্যবহার করেছেন। $1-কে বাধাদানের কারণ \"$2\"",
        "permanentlink": "স্থায়ী সংযোগ",
        "permanentlink-revid": "সংশোধন আইডি",
        "permanentlink-submit": "এই সংশোধনে যান",
+       "newsection": "নতুন অনুচ্ছেদ",
+       "newsection-page": "লক্ষ্য পাতা",
        "dberr-problems": " দুঃখিত! এই সাইটটি বর্তমানে কারীগরী অসুবিধার মুখোমুখি হয়েছে।",
        "dberr-again": "কয়েক মিনিট পর পুনরায় পরিদর্শনের চেষ্টা করুন।",
        "dberr-info": "(ডেটাবেজ প্রবেশ করা সম্ভব হয়নি: $1)",
index 6d19937..e1f45cc 100644 (file)
        "subject-preview": "Pregled teme:",
        "previewerrortext": "Došlo je do greške pri pokušaju pregleda izmjena.",
        "blockedtitle": "Korisnik je blokiran",
-       "blockedtext": "'''Vaše korisničko ime ili IP-adresa je blokirana.'''\n\nBlokada izvršena od strane $1.\nDati razlog je sljedeći: ''$2''.\n\n*Početak blokade: $8\n*Kraj perioda blokade: $6\n*Ime blokiranog korisnika: $7\n\nMožete kontaktirati sa $1 ili nekim drugim [[{{MediaWiki:Grouppage-sysop}}|administratorom]] da biste razgovarali o blokadi.\n\nNe možete koristiti opciju ''Pošalji e-mail korisniku'' osim ako niste unijeli e-mail adresu u [[Special:Preferences|Vaše postavke]].\nVaša trenutna IP-adresa je $3, a oznaka blokade je #$5.\nMolimo Vas da navedete gornje podatke pri zahtjevu za deblokadu.",
+       "blockedtext": "<strong>Vaše korisničko ime ili IP-adresa je blokirana.</strong>\n\nBlokada izvršena od strane $1.\nDati razlog je sljedeći: <em>$2</em>.\n\n*Početak blokade: $8\n*Kraj perioda blokade: $6\n*Ime blokiranog korisnika: $7\n\nMožete kontaktirati sa $1 ili nekim drugim [[{{MediaWiki:Grouppage-sysop}}|administratorom]] da biste razgovarali o blokadi.\n\nNe možete koristiti opciju \"{{int:emailuser}}\" osim ako niste unijeli e-mail adresu u [[Special:Preferences|Vaše postavke]].\nVaša trenutna IP-adresa je $3, a oznaka blokade je #$5.\nMolimo Vas da navedete gornje podatke pri zahtjevu za deblokadu.",
        "autoblockedtext": "Vaša IP-adresa automatski je blokirana jer ju je koristio drugi korisnik, a blokirao ju je $1.\nNaveden je sljedeći razlog:\n\n:''$2''\n\n* Početak blokade: $8\n* Kraj blokade: $6\n* Blokirani korisnik: $7\n\nMožete kontaktirati sa $1 ili nekim drugim iz grupe [[{{MediaWiki:Grouppage-sysop}}|administratora]] i zahtijevati da Vas deblokira.\n\nZapamtite da ne možete koristiti opciju \"pošalji e-mail ovom korisniku\" sve dok ne unesete validnu e-mail adresu pri registraciji u Vašim [[Special:Preferences|korisničkim postavkama]] i dok niste spriječeni (blokadom) da je koristite.\n\nVaša trenutna IP-adresa je $3, a ID blokade je $5.\nMolimo da navedete sve gore navedene detalje u zahtjevu za deblokadu.",
        "systemblockedtext": "MediaWiki je automatski blokirao Vaše korisničko ime ili IP-adresu.\nDat je sljedeći razlog:\n\n:<em>$2</em>\n\n* Početak blokade: $8\n* Istek blokade: $6\n* Blokada je namijenjena za: $7\n\nVaša trenutna IP-adresa je $3.\nAko imate pitanja u vezi s blokadom, priložite sve gorenavedene pojedinosti.",
        "blockednoreason": "razlog nije naveden",
        "page_first": "prva",
        "page_last": "posljednja",
        "histlegend": "Odabir razlika: označite radio dugme verzija koje uspoređujete i pritistnite enter ili dugme na dnu. <br />\nObjašnjenje: <strong>({{int:cur}})</strong> = razlika sa trenutnom verzijom, <strong>({{int:last}})</strong> = razlika sa prethodnom verzijom, <strong>{{int:minoreditletter}}</strong> = mala izmjena.",
-       "history-fieldset-title": "Pretraga izmjena",
+       "history-fieldset-title": "Filtriraj izmjene",
        "history-show-deleted": "Samo obrisane",
        "histfirst": "najstarije",
        "histlast": "najnovije",
        "ipbreason": "Razlog:",
        "ipbreason-dropdown": "*Najčešći razlozi blokiranja\n**Netačne informacije\n**Uklanjanje sadržaja stranica\n**Postavljanje spam vanjskih linkova\n**Ubacivanje gluposti/grafita\n**Osobni napadi (ili napadačko ponašanje)\n**Čarapare (zloupotreba više korisničkih računa)\n**Neprihvatljivo korisničko ime",
        "ipb-hardblock": "Spriječi prijavljene korisnike da uređuju s ove IP-adrese",
-       "ipbcreateaccount": "Spriječi pravljenje računa",
-       "ipbemailban": "Spriječi korisnika da šalje e-poštu",
-       "ipbenableautoblock": "Automatski blokiraj posljednju IP-adresu koju je koristio ovaj korisnik i sve druge IP-adrese s kojih je pokušao uređivati",
+       "ipbcreateaccount": "Stvaranje računa",
+       "ipbemailban": "Slanje e-pošte",
+       "ipbenableautoblock": "Automatski blokiraj posljednju IP-adresu ovog korisnika i sve naredne adrese s kojih pokuša uređivati",
        "ipbsubmit": "Blokiraj ovog korisnika",
        "ipbother": "Drugo vrijeme:",
        "ipboptions": "2 sata:2 hours,1 dan:1 day,3 dana:3 days,1 sedmica:1 week,2 sedmice:2 weeks,1 mjesec:1 month,3 mjeseca:3 months,6 mjeseci:6 months,1 godine:1 year,beskonačno:infinite",
        "ipbhidename": "Sakrij korisničko ime iz uređivanja i spiskova",
        "ipbwatchuser": "Prati korisničku stranicu i stranicu za razgovor ovog korisnika",
-       "ipb-disableusertalk": "Spriječi ovog korisnika da uređuje svoju stranicu za razgovor dok je blokiran",
+       "ipb-disableusertalk": "Uređivanje vlastite stranice za razgovor",
        "ipb-change-block": "Ponovno blokiraj korisnika sa novim postavkama",
        "ipb-confirm": "Potvrdite blokiranje",
        "badipaddress": "Pogrešna IP adresa",
        "ipb-blocklist": "Vidi postojeće blokade",
        "ipb-blocklist-contribs": "Doprinosi za {{GENDER:$1|$1}}",
        "ipb-blocklist-duration-left": "još $1",
+       "block-actions": "Blokirati radnje:",
        "block-expiry": "Ističe:",
+       "block-options": "Dodatne opcije:",
+       "block-prevent-edit": "Uređivanje",
+       "block-reason": "Razlog:",
+       "block-target": "Korisničko ime ili IP-adresa:",
        "unblockip": "Odblokiraj korisnika",
        "unblockiptext": "Upotrebite donji upitnik da bi ste vratili\npravo pisanja ranije blokiranoj IP adresi\nili korisničkom imenu.",
        "ipusubmit": "Ukloni ovu blokadu",
index 839a5dc..714df0f 100644 (file)
        "specialpages-group-developer": "Eines de desenvolupador",
        "blankpage": "Pàgina en blanc",
        "intentionallyblankpage": "Pàgina intencionadament en blanc",
+       "disabledspecialpage-disabled": "Un administrador del sistema ha desactivat aquesta pàgina.",
        "external_image_whitelist": " #Deixeu aquesta línia exactament igual com està.<pre>\n#Poseu fragments d'expressions regulars (regex) (només la part entre els //) a sota.\n#Aquests fragments es correspondran amb els URL d'imatges externes.\n#Es mostraran com a imatges si coincideixen, i si no es mostraran com a enllaços.\n#Les línies que comencen amb un # es tracten com a comentaris.\n#S'hi distingeixen majúscules i minúscules.\n\n#Poseu tots els fragments regex al damunt d'aquesta línia. Deixeu aquesta línia exactament com està.</pre>",
        "tags": "Etiquetes de canvi vàlides",
        "tag-filter": "Filtre d'[[Special:Tags|etiquetes]]:",
index 7081e67..ac78987 100644 (file)
        "tooltip-t-specialpages": "Белхан агӀонанийн могӀам",
        "tooltip-t-print": "ХӀокху агӀона зорбанан верси",
        "tooltip-t-permalink": "ХӀокху агӀона версин тӀе цахийцалун хьажорг",
-       "tooltip-ca-nstab-main": "Коьрта яззаман чулацам",
+       "tooltip-ca-nstab-main": "Коьрта агӀонга хьажар",
        "tooltip-ca-nstab-user": "ХӀора декъашхочун долахь йолу агӀо ю",
        "tooltip-ca-nstab-media": "Медиа-файл",
        "tooltip-ca-nstab-special": "ХӀара белхан агӀо ю, хӀара таялуш яц",
index 4da930e..0fcfa49 100644 (file)
        "changecontentmodel": "Změnit model obsahu stránky",
        "changecontentmodel-legend": "Změnit model obsahu",
        "changecontentmodel-title-label": "Název stránky",
+       "changecontentmodel-current-label": "Současný model obsahu:",
        "changecontentmodel-model-label": "Nový model obsahu",
        "changecontentmodel-reason-label": "Důvod:",
        "changecontentmodel-submit": "Změnit",
index 55157d9..0f8fa08 100644 (file)
        "permanentlink": "Permanenter Link",
        "permanentlink-revid": "Versionskennung",
        "permanentlink-submit": "Gehe zu Version",
+       "newsection": "Neuer Abschnitt",
+       "newsection-page": "Zielseite",
+       "newsection-submit": "Gehe zur Seite",
        "dberr-problems": "Entschuldigung. Diese Seite hat momentan technische Schwierigkeiten.",
        "dberr-again": "Warte bitte einige Minuten und versuche dann, die Seite erneut zu laden.",
        "dberr-info": "(Auf die Datenbank konnte nicht zugegriffen werden: $1)",
        "specialmute-success": "Deine Stummschaltungseinstellungen wurden aktualisiert. Schau dir alle stummgeschalteten Benutzer in [[Special:Preferences|deinen Einstellungen]] an.",
        "specialmute-submit": "Bestätigen",
        "specialmute-label-mute-email": "E-Mails von diesem Benutzer stummschalten",
-       "specialmute-header": "Bitte wähle deine Stummschaltungseinstellungen für <b>{{BIDI:[[User:$1]]}}</b>.",
+       "specialmute-header": "Bitte wähle deine Stummschaltungseinstellungen für Benutzer <b>{{BIDI:[[User:$1|$1]]}}</b>.",
        "specialmute-error-invalid-user": "Der gesuchte Benutzername konnte nicht gefunden werden.",
-       "specialmute-email-footer": "Um deine E-Mail Einstellungen für {{BIDI:$2}} zu verwalten besuche bitte $1.",
+       "specialmute-email-footer": "Um deine E-Mail Einstellungen für Benutzer {{BIDI:$2}} zu verwalten besuche bitte <$1>.",
        "specialmute-login-required": "Bitte melde dich an um deine Stummschaltungseinstellungen zu ändern.",
        "revid": "Version $1",
        "pageid": "Seitenkennung $1",
index 126680d..26ba8a1 100644 (file)
@@ -85,9 +85,9 @@
        "editfont-monospace": "Terzê nusteyê sabıt mesafi",
        "editfont-sansserif": "Fontê Sans-serifi",
        "editfont-serif": "Font (çêşıdê nuştey) Serif",
-       "sunday": "Kırê",
-       "monday": "Dışeme",
-       "tuesday": "Sêşeme",
+       "sunday": "Bazar",
+       "monday": "Bahdêbazari",
+       "tuesday": "Telete",
        "wednesday": "Çarşeme",
        "thursday": "Pancşeme",
        "friday": "Êne",
        "january": "Çele",
        "february": "Gucige",
        "march": "Adar",
-       "april": "Nisane",
-       "may_long": "Gulane",
+       "april": "Nisan",
+       "may_long": "Gulan",
        "june": "Heziran",
        "july": "Temuz",
        "august": "Tebaxe",
        "september": "Keşkelun",
-       "october": "Tışrino Verên",
-       "november": "Tışrino Peyên",
-       "december": "Kanun",
+       "october": "Cıtmeng",
+       "november": "Kelverdan",
+       "december": "Gağan",
        "january-gen": "Çele",
        "february-gen": "Şıbat",
        "march-gen": "Mert",
        "july-gen": "Temuz",
        "august-gen": "Tebaxe",
        "september-gen": "Keşkelun",
-       "october-gen": "Tışrino Verên",
-       "november-gen": "Tışrino Peyên",
-       "december-gen": "Kanun",
+       "october-gen": "Cıtmeng",
+       "november-gen": "Kelverdan",
+       "december-gen": "Gağan",
        "jan": "Çel",
        "feb": "Şbt",
        "mar": "Adr",
        "january-date": "$1 Çele",
        "february-date": "$1 Şıbat",
        "march-date": "$1 Adar",
-       "april-date": "$1 Nisane",
-       "may-date": "$1 Gulane",
+       "april-date": "$1 Nisan",
+       "may-date": "$1 Gulan",
        "june-date": "$1 Heziran",
        "july-date": "$1 Temuze",
        "august-date": "$1 Tebaxe",
        "september-date": "$1 Keşkelun",
-       "october-date": "$1 Tışrino Verên",
-       "november-date": "$1 Tışrino Peyên",
-       "december-date": "$1 Kanun",
+       "october-date": "$1 Cıtmeng",
+       "november-date": "$1 Kelverdan",
+       "december-date": "$1 Gağan",
        "period-am": "VD",
        "period-pm": "BD",
-       "pagecategories": "{{PLURAL:$1|Kategoriye|Kategoriyi}}",
+       "pagecategories": "{{PLURAL:$1|Kategori|Kategoriy}}",
        "category_header": "Perrê kategoriya \"$1\"'i",
        "subcategories": "Kategoriyê bınêni",
        "category-media-header": "Dosye yê ke kategoriya \"$1\" dı",
        "category-file-count": "{{PLURAL:$2|Na kategori tenya dosya ya cêri muhtewa kena.|Na kategori de $2 ra pêro piya {{PLURAL:$1|1 dosya est a|$1 dosyey est ê}}.}}",
        "category-file-count-limited": "{{PLURAL:$1|Dosye|$1 Dosyey}} na kategori de yê.",
        "listingcontinuesabbrev": "dewam...",
-       "index-category": "Pelê rêzıni",
+       "index-category": "Perrê rêzıni",
        "noindex-category": "Perrê bêrêzıni",
        "broken-file-category": "Perri be linkanê dosya çewte",
        "categoryviewer-pagedlinks": "($1) ($2)",
        "about": "Heqa",
        "article": "Pela zerreki",
        "newwindow": "(pençerey newey de beno a)",
-       "cancel": "Bıtexelne",
+       "cancel": "İbtal",
        "moredotdotdot": "Vêşi...",
        "morenotlisted": "Na lista qay kemi ya.",
-       "mypage": "Pele",
-       "mytalk": "Werênayış",
-       "anontalk": "Werênayış",
+       "mypage": "Perr",
+       "mytalk": "Vaten",
+       "anontalk": "Vaten",
        "navigation": "Pusula",
        "and": "&#32;u",
        "faq": "PVP",
        "help-mediawiki": "Heqa MediaWiki de peşti",
        "search": "Cı geyre",
        "searchbutton": "Cı geyre",
-       "go": "Şori",
+       "go": "Şo",
        "searcharticle": "Şo",
-       "history": "Tarixê perrer",
+       "history": "Verorê perrer",
        "history_short": "Veror",
-       "history_small": "tarix",
-       "updatedmarker": "ziyaretê peyêni dıma biyo rocane",
-       "printableversion": "Versiyonê çapkerdışi",
+       "history_small": "veror",
+       "updatedmarker": "ziyaretê şımayê peyêni dıma biyo rocane",
+       "printableversion": "Versiyono nustenaye",
        "permalink": "Gıreyo daimi",
-       "print": "Bınuşne",
-       "view": "Bıvêne",
+       "print": "Bınustenê",
+       "view": "Bıvin",
        "view-foreign": "$1 de bıvin",
-       "edit": "Bıvurne",
+       "edit": "Bıvurn",
        "edit-local": "Şınasnayışê lokali bıvurne",
-       "create": "Vıraze",
+       "create": "Vıraz",
        "create-local": "Şınasnayışê lokali cı ke",
-       "delete": "Bestere",
-       "undelete_short": "{{PLURAL:$1|Yew vırnayışi|$1 Vırnayışan}} mestere",
+       "delete": "Bestern",
+       "undelete_short": "{{PLURAL:$1|nê vırnayışi|$1 vırnayışa}} peyser bıyarê",
        "viewdeleted_short": "{{PLURAL:$1|Jew vurnayış esternayi|$1 Vurnayışanê esternayan}} bımotne",
        "protect": "Bışevekne",
        "protect_change": "bıvırne",
        "unprotect": "Starnayışi bıvurne",
        "newpage": "Perra newi",
-       "talkpagelinktext": "werênayış",
+       "talkpagelinktext": "vaten",
        "specialpage": "Pela xısusiye",
        "personaltools": "Hacetê şexsiy",
-       "talk": "Werênayış",
+       "talk": "Vaten",
        "views": "Asayışi",
        "toolbox": "Haceti",
        "tool-link-userrights": "Grubanê {{GENDER:$1|karberi}} bıvırnë",
        "edithelp": "Peştdariya vurnayışi",
        "helppage-top-gethelp": "Peşti",
        "mainpage": "Perra Seri",
-       "mainpage-description": "Pela seri",
+       "mainpage-description": "Pera seri",
        "policy-url": "Project:Terzê hereketi",
        "portal": "Portalê cemati",
        "portal-url": "Project:Portalê cemati",
        "collapsible-collapse": "Teng ke",
        "collapsible-expand": "Hera kerê",
        "confirmable-confirm": "{{GENDER:$1|Şıma}} bêgumanê?",
-       "confirmable-yes": "Eya",
+       "confirmable-yes": "E",
        "confirmable-no": "Nê",
        "thisisdeleted": "Bıvêne ya zi $1 peyser biya?",
        "viewdeleted": "$1 bıvin?",
        "restorelink": "{{PLURAL:$1|jew vurnayış besteriya|$1 vurnayışi besteriyaye}}",
-       "feedlinks": "Weyiyekerdış:",
+       "feedlinks": "Resnayış:",
        "feed-invalid": "Qeydey cıresnayışê  beğşi nêvêreno.",
        "feed-unavailable": "Cıresnayışê şebekey çıniyê",
        "site-rss-feed": "$1 Cıresnayışê RSSi",
        "red-link-title": "$1 (pele çıniya)",
        "sort-descending": "Rêzkerdışo kêmbiyaye",
        "sort-ascending": "Rêzkerdışo zêdiyaye",
-       "nstab-main": "Pele",
+       "nstab-main": "Perr",
        "nstab-user": "Pera karberi",
        "nstab-media": "Pela medya",
-       "nstab-special": "Pela xısusiye",
-       "nstab-project": "Perra proji",
+       "nstab-special": "Perra bağse",
+       "nstab-project": "Perra procey",
        "nstab-image": "Dosya",
        "nstab-mediawiki": "Mesac",
        "nstab-template": "Şablon",
        "nstab-help": "Perra pasti",
-       "nstab-category": "Kategoriye",
+       "nstab-category": "Kategori",
        "mainpage-nstab": "Pera seri",
        "nosuchaction": "Fealiyeto wınasi çıniyo",
        "nosuchactiontext": "URL ra kar qebul nêbı.\nŞıma belka URL şaş nuşt, ya zi gıreyi şaş ra ameyi.\nKeyepelê {{SITENAME}} eşkeno xeta aşkera bıkero.",
        "actionthrottled": "Kerden peysnaya",
        "actionthrottledtext": "Riyê tedbirê anti-spami ra,  wextê do kılmek de şıma nê fealiyeti nêşkenê zaf zêde bıkerê, şıma ki no hedi viyarna ra.\nÇend deqey ra tepeya reyna bıcerrebnên.",
        "protectedpagetext": "Ena perre vırnayış u kerdışanê binan rê şevekniyaya.",
-       "viewsourcetext": "Şıma şenê çımey ena perre bıvênê u kopya kerê {{MediaWiki Wesiqe malumat}}",
+       "viewsourcetext": "Şıma şenê çımey ena perer bıvinê u kopya kerê",
        "viewyourtext": "Na pela '''Vurnayışê ke kerdê''' re şıma şenê kopya kerê:",
        "protectedinterface": "Na pela qandê nusnerin destegê verri dana u kes xırabin nêqero deye kerda kılit.",
        "editinginterface": "'''İqaz:''' Şıma yew perra ke softwarei rê nuştey miyan-bestoği dana cı, aye vırnenê.\nVırnayışê ena perre do eno wiki sero asayışê miyan-bestoğê karberanê binan de bıaso.\n\nTadayışi (çarnayışi) rê , yardımê [https://translatewiki.net/wiki/Main_Page?setlang=diq translatewiki.net]i ra haydarê procêdoşkerdışi de vınderê.",
        "yourdomainname": "Yewdestê şıma:",
        "password-change-forbidden": "Şıma na wiki de nêşenê parola bıvurnê.",
        "externaldberror": "Ya database de xeta esta ya zi heqê şıma çino şıma no hesab bıvurni.",
-       "login": "Cı kewe",
+       "login": "Ronıştış",
        "login-security": "Kamiya xo araşt kerê",
        "nav-login-createaccount": "Dekew de / hesab vıraze",
        "logout": "Bıveciye",
        "botpasswords-label-appid": "Nameyê boti:",
        "botpasswords-label-create": "Vıraze",
        "botpasswords-label-update": "Rocane ke",
-       "botpasswords-label-cancel": "Bıtexelne",
-       "botpasswords-label-delete": "Bestere",
+       "botpasswords-label-cancel": "İbtal",
+       "botpasswords-label-delete": "Bestern",
        "botpasswords-label-resetpassword": "Parola raçarne",
        "botpasswords-label-grants": "İmtıyazê ravêrdeyi:",
        "botpasswords-label-grants-column": "Dayen",
        "resetpass_forbidden-reason": "Parola nêvuriyena: $1",
        "resetpass-no-info": "şıma gani hesab akere u hona bıeşke bırese cı",
        "resetpass-submit-loggedin": "Parola bıvurne",
-       "resetpass-submit-cancel": "Bıtexelne",
+       "resetpass-submit-cancel": "İbtal",
        "resetpass-wrong-oldpass": "parolayo parola maqbul niyo.\nşıma ya parolaye xo vurnayo ya zi parolayo muwaqqat waşto.",
        "resetpass-recycled": "Parolaya şımaya newiye, wa paroloya şımaya verêne ra ciya bo.",
        "resetpass-temp-emailed": "E postaya rışyayê yubkoda şıma ronıştış akerdo.  Ronıştışi xo temammkerdışi rê yu parolaya newi lazım a",
-       "resetpass-temp-password": "parolayo muweqet:",
+       "resetpass-temp-password": "Parolaya idareteni",
        "resetpass-abort-generic": "Vurnayışê parola terefê yew niçıki ra texeliya.",
        "resetpass-expired": "Dema parolay da şıma qedya ya. Qandê cıkewtışi u patolaya newi vıraz",
        "resetpass-expired-soft": "Şifrey şıma nêvêreno u ganê ke reyna bıvıraziyo. Reca ma aya ke şıma xo rê şifreyê do newe weçinê, ya zi şıma \"{{int:authprovider-resetpass-skip-label}}\" bıtıknê ke dıma yew şifreyo newe vırazê.",
        "rcfilters-clear-all-filters": "Parzûnan pêro pak kerê",
        "rcfilters-show-new-changes": "$1 ra nata vurnayışanê neweyan bımocne",
        "rcfilters-search-placeholder": "Vurnayışanê peyênan parzûn kerê (menuyi bıgurenê ya zi nameyê parzûni cıgeyrê)",
+       "rcfilters-search-placeholder-mobile": "Parzûni",
        "rcfilters-invalid-filter": "Parzûno nêravêrde",
        "rcfilters-empty-filter": "Parzûnê aktifi çıniyê. İştırakê cı pêro mocniyenê.",
        "rcfilters-filterlist-title": "Parzûni",
        "changecontentmodel": "Modelê zerrekê pele bıvurne",
        "changecontentmodel-legend": "Modelê zerreki bıvurne",
        "changecontentmodel-title-label": "Sernameyê pele",
+       "changecontentmodel-current-label": "Mewcud zerrekê modeli:",
        "changecontentmodel-model-label": "Modelê zerrekiyo newe",
        "changecontentmodel-reason-label": "Sebeb:",
        "changecontentmodel-submit": "Bıvırne",
        "changecontentmodel-success-title": "Modelê zerreki vurriya",
+       "changecontentmodel-success-text": "Tewrê zerreki [[:$1]] vurneya.",
        "changecontentmodel-emptymodels-title": "Modelê zerreki mewcud niyo",
        "log-name-contentmodel": "Qeydê vurnayışanê modelê zerreki",
        "logentry-contentmodel-change-revertlink": "peyser biya",
        "sp-contributions-deleted": "iştırakê {{GENDER:$1|karberi}} esterdi",
        "sp-contributions-uploads": "Barkerdışi",
        "sp-contributions-logs": "qeydi",
-       "sp-contributions-talk": "werênayış",
+       "sp-contributions-talk": "vaten",
        "sp-contributions-userrights": "idareyê heqanê {{GENDER:$1|karberan}}",
        "sp-contributions-blocked-notice": "Eno karber/ena karbere emanet blokekerdeyo/blokekerdiya.\nCıkewtışo tewr peyêno ke bloke biyo, cêr seba referansi belikerdeyo:",
        "sp-contributions-blocked-notice-anon": "Eno adresê IPi bloke biyo.\nCıkewtışo tewr peyêno ke bloke biyo, cêr seba referansi belikerdeyo:",
        "sp-contributions-newonly": "Tenya vurnayışanê pelevıraştışi bımocne",
        "sp-contributions-hideminor": "Vurriyayışanê werdiyan bınımne",
        "sp-contributions-submit": "Cı geyre",
-       "whatlinkshere": "Linkê tedeestey",
+       "whatlinkshere": "Gırey na perer",
        "whatlinkshere-title": "Wesiqe da \"$1\" rê gıre dayen perri",
        "whatlinkshere-page": "Pele:",
        "linkshere": "Pera <strong>$2</strong> rê gıre dayen perri",
        "autoblocklist-submit": "Cı geyre",
        "autoblocklist-legend": "Lista blokanê otomatikan",
        "autoblocklist-localblocks": "{{PLURAL:$1|otoblokoyo lokal|otoblokeyê lokali}}",
+       "autoblocklist-otherblocks": "{{PLURAL:$1|otobloqeyo bin|otobloqeyê bini}}",
        "ipblocklist": "Karberê kılitbiyayey",
        "ipblocklist-legend": "Karberê kılit biyayey bıvin",
        "blocklist-userblocks": "Kılitkerdışê hesaban bınımne",
        "blocklink": "kılit ke",
        "unblocklink": "ake",
        "change-blocklink": "kılitkerdışi bıvurne",
+       "empty-username": "(bê namey karberi nêbeno)",
        "contribslink": "iştıraki",
        "emaillink": "e-poste bırışe",
        "autoblocker": "Şıma otomatikmen kılit biy, çıke adresa şımaya ''IP''y terefê \"[[User:$1|$1]]\" gureniyena.\nSebebê kılitbiyayışê $1'i \"$2\"o",
        "javascripttest-qunit-intro": "Mediawiki.org dı [dokumanê $1] bıvinê.",
        "tooltip-pt-userpage": "Pela {{GENDER:|şımaya karberi}}",
        "tooltip-pt-anonuserpage": "pelê karberê IPyi",
-       "tooltip-pt-mytalk": "Pela {{GENDER:|toya}} werênayışi",
-       "tooltip-pt-anontalk": "vurnayiş ê ke no Ipadresi ra biyo muneqeşa bıker",
+       "tooltip-pt-mytalk": "Pera {{GENDER:|şıma}}ya vaten",
+       "tooltip-pt-anontalk": "'''Ena adresa IP ra vurnayışa sero qal bıqerê'''",
        "tooltip-pt-preferences": "Tercihê {{GENDER:|şıma}}",
        "tooltip-pt-watchlist": "Listey peranê ke to gırotê seyr kerdış",
        "tooltip-pt-mycontris": "Yew lista iştırakanê {{GENDER:|şıma}}",
        "htmlform-date-placeholder": "SSSS-AA-RR",
        "htmlform-time-placeholder": "SS:DD:SS",
        "htmlform-datetime-placeholder": "SSSS-AA-RR SS:DD:SS",
+       "htmlform-title-not-exists": "$1 çıni ya.",
+       "htmlform-user-not-exists": "<strong>$1</strong> çıni ya.",
+       "htmlform-user-not-valid": "<strong>$1</strong> hewl namey karberi niyo.",
        "logentry-delete-delete": "$1 perra $3 {{GENDER:$2|esterıte}}",
+       "logentry-delete-delete_redir": "$1, hetenayışê $3 sero qandê nusnayışi {{GENDER:$2|bıesternê }}",
        "logentry-delete-restore": "$1 pela $3 ($4) {{GENDER:$2|peyser arde}}",
        "logentry-delete-restore-nocount": "$1, pela $3 {{GENDER:$2|timar kerd }}",
        "restore-count-revisions": "{{PLURAL:$1|1 çımraviyarnayış|$1 çımraviyarnayışi}}",
        "revdelete-unrestricted": "vergırewtışê ke xızmekaran rê dariyê we",
        "logentry-block-block": "$1, karber {{GENDER:$4|$3}} $5 demi rê {{GENDER:$2|kerd men}} $6",
        "logentry-block-unblock": "$1, {{GENDER:$4|$3}} {{GENDER:$2|men kerdış wedarna}}",
+       "logentry-block-reblock": "$1, bloqey karberê {{GENDER:$4|$3}} qandê $5 roca {{GENDER:$2|vurna}} $6",
        "logentry-partialblock-block-page": "{{PLURAL:$1|pele|peli}} $2",
        "logentry-partialblock-block-ns": "{{PLURAL:$1|cayê nameyi|cayê nameyan}} $2",
        "logentry-import-upload": "$1 {{GENDER:$2|zere kerdışa }} $3'i Dosya kerd bar.",
+       "logentry-merge-merge": "$1, pera $3 pera $4 ya {{GENDER:$2|kerd jew}}( hetana versiyonanê tarixê $5  )",
        "logentry-move-move": "$1, pela $3 ra {{GENDER:$2|kırışt}} pela $4",
        "logentry-move-move-noredirect": "$1, pera $3'i bêhetenayış {{GENDER:$2|kırışt}} pera $4`i",
        "logentry-move-move_redir": "$1 {{GENDER:$2|kırışna}} riperr $3 be $4 weçarnayış sera.",
        "logentry-newusers-create2": "Hesabê karberi $1 terefê $3 ra {{GENDER:$2|vıraziya}}",
        "logentry-newusers-byemail": "Karber $1 hesabe $3 {{GENDER:$2|virast}} u parola rist epostadaci",
        "logentry-newusers-autocreate": "Hesabê karberi $1 otomatikmen {{GENDER:$2|vıraşt}}",
+       "logentry-protect-move_prot": "$1, eyarê şeveknayışi pera $4 ra {{GENDER:$2|kırışt}} pera $3",
+       "logentry-protect-unprotect": "$1, şeveknayışê pera $3 {{GENDER:$2|wedarna}}",
        "logentry-protect-protect": "$1, pela $3 {{GENDER:$2|şeveknê}} $4",
        "logentry-protect-protect-cascade": "$1, pela $3 {{GENDER:$2|şeveknê}} $4 [qademeyın]",
+       "logentry-protect-modify": "$1, qandê pera $3 sewiyey şeveknayışi {{GENDER:$2|vırna}} $4",
+       "logentry-protect-modify-cascade": "$1, qandê pera $3 sewiyey şeveknayışi {{GENDER:$2|vırna}} $4 [qademeyın]",
        "logentry-rights-rights": "$1 qandê {{GENDER:$6|$3}} rê ezayiya grube $4 ra $5 {{GENDER:$2|vuriye}}",
        "logentry-rights-rights-legacy": "$1 qandê $3 rê ezayiya grube {{GENDER:$2|vuriye}}",
        "logentry-rights-autopromote": "$1 otomatikmen $4 ra $5 {{GENDER:$2|terfi bi}}",
        "pageid": "IDyê pela $1",
        "gotointerwiki": "{{SITENAME}} ra abırriyeno",
        "pagedata-title": "Dayiyê pele",
+       "pagedata-bad-title": "Sereko xırab:$1",
        "passwordpolicies": "Politikaya parola",
        "passwordpolicies-group": "Grube",
        "passwordpolicies-policies": "Politikeyi",
-       "passwordpolicies-policy-minimalpasswordlength": "Parola gani tewr senık be {{PLURAL:$1|1 karakter|$1 karakteran}} derg bo"
+       "passwordpolicies-policy-minimalpasswordlength": "Parola gani tewr senık be {{PLURAL:$1|1 karakter|$1 karakteran}} derg bo",
+       "passwordpolicies-policyflag-forcechange": "Lazımo ke cıkewtışi bıvırnê",
+       "passwordpolicies-policyflag-suggestchangeonlogin": "Vırnayışê cıkewtış bıwaz",
+       "userlogout-continue": "Şıma qayılê bıvıciyê?"
 }
index e0ae02b..7125f9c 100644 (file)
        "tag-mw-changed-redirect-target-description": "Επεξεργασίες που αλλάζουν το στόχο μιας ανακατεύθυνσης",
        "tag-mw-blank": "Άδειασμα περιεχομένου σελίδας",
        "tag-mw-blank-description": "Επεξεργασίες που σβήνουν όλο το περιεχόμενο σελίδας",
-       "tag-mw-replace": "Î\91νÏ\84ικαÏ\84αÏ\83Ï\84άθηκε",
+       "tag-mw-replace": "Î\91νÏ\84ικαÏ\84άÏ\83Ï\84αÏ\83η",
        "tag-mw-replace-description": "Επεξεργασίες που αφαιρούν πάνω από 90% του περιεχομένου της σελίδας",
        "tag-mw-rollback": "Επαναφορά",
        "tag-mw-rollback-description": "Επεξεργασίες που επαναφέρουν προηγούμενες επεξεργασίες χρησιμοποιώντας τον σύνδεσμο επαναφοράς",
-       "tag-mw-undo": "Î\91ναιÏ\81έθηκε",
+       "tag-mw-undo": "Î\91ναίÏ\81εÏ\83η",
        "tag-mw-undo-description": "Επεξεργασίες που αναιρούν προηγούμενες επεξεργασίες χρησιμοποιώντας τον σύνδεσμο αναίρεσης",
        "tags-title": "Ετικέτες",
        "tags-intro": "Η σελίδα καταγράφει τις ετικέτες, καθώς και το τι σημαίνει η κάθε μία, με τις οποίες το λογισμικό μπορεί να μαρκάρει μία επεξεργασία.",
index 1c38ef7..1861d2e 100644 (file)
        "permanentlink": "Konstanta ligilo",
        "permanentlink-revid": "Identigilo de revizio",
        "permanentlink-submit": "Iri al revizio",
+       "newsection": "Nova paragrafo",
+       "newsection-page": "Cela paĝo",
+       "newsection-submit": "Iri al paĝo",
        "dberr-problems": "Bedaŭrinde, ĉi tiu retejo suferas pro teknikaj problemoj.",
        "dberr-again": "Bonvolu atendi kelkajn minutojn kaj reŝargi.",
        "dberr-info": "(Ne eblas konekti la datumbazon: $1)",
index 9f2e475..814e6d7 100644 (file)
        "permanentlink": "Enlace permanente",
        "permanentlink-revid": "Id. de revisión",
        "permanentlink-submit": "Ir a la revisión",
+       "newsection": "Sección nueva",
+       "newsection-page": "Página de destino",
+       "newsection-submit": "Ir a la página",
        "dberr-problems": "Lo sentimos. Este sitio está experimentando dificultades técnicas.",
        "dberr-again": "Prueba a recargar dentro de unos minutos.",
        "dberr-info": "(No se puede acceder a la base de datos: $1)",
        "edit-error-short": "Error: $1",
        "edit-error-long": "Errores:\n\n$1",
        "specialmute": "Silenciar",
-       "specialmute-success": "Tus preferencias de silencio han sido actualizadas. Mira todos los usuarios silenciados en [[Especial:Preferencias|tus preferencias]].",
+       "specialmute-success": "Tus preferencias de silencio han sido actualizadas. Mira todos los usuarios silenciados en [[Special:Preferences|tus preferencias]].",
        "specialmute-submit": "Confirmar",
        "specialmute-label-mute-email": "Silenciar los correos electrónicos de este usuario",
+       "specialmute-header": "Selecciona tus preferencias de silencio para <b>{{BIDI:[[User:$1|$1]]}}</b>.",
        "specialmute-error-invalid-user": "No se encontró el nombre de usuario solicitado.",
        "specialmute-email-footer": "Para gestionar las preferencias de correo electrónico para el usuario {{BIDI:$2}} visita <$1>.",
        "revid": "revisión $1",
index 8d4fd7d..0a03da6 100644 (file)
        "undo-main-slot-only": "ویرایش را نمی‌توان انجام داد زیرا شامل محتویات خارج از شیار اصلی است.",
        "undo-norev": "این ویرایش را نمی‌توان خنثی کرد چون وجود ندارد یا حذف شده‌است.",
        "undo-nochange": "به نظر می‌رسد ویرایش از پیش خنثی‌سازی شده است.",
-       "undo-summary": "Ø®Ù\86Ø«Û\8câ\80\8cسازÛ\8c Ù\88Û\8cراÛ\8cØ´ $1 ØªÙ\88سط [[Special:Contributions/$2|$2]] ([[User talk:$2|بحث]])",
+       "undo-summary": "Ø®Ù\86Ø«Û\8câ\80\8cسازÛ\8c Ù\88Û\8cراÛ\8cØ´ $1 Ø§Ø² [[Special:Contributions/$2|$2]] ([[User talk:$2|بحث]])",
        "undo-summary-username-hidden": "خنثی‌سازی نسخهٔ $1 به دست یک کاربر پنهان‌شده",
        "cantcreateaccount-text": "امكان ساختن حساب کاربری از این این نشانی آی‌پی ('''$1''') توسط [[User:$3|$3]] سلب شده است.\n\nدلیل ارائه شده توسط $3 چنین است: $2",
        "cantcreateaccount-range-text": "ایجاد حساب از آدرس آی‌پی در مجموعه‌ی <strong>$1</strong>، که شامل آدرس آی‌پی شما (<strong>$4</strong>) است، توسط [[User:$3|$3]] متوقف شده‌است.\nدلیل ارائه شده توسط $3، $2 است.",
        "revdelete-unsuppress": "حذف محدودیت‌ها در بازبینی‌های ترمیم‌شده",
        "revdelete-log": "دلیل:",
        "revdelete-submit": "اعمال بر {{PLURAL:$1|نسخهٔ|نسخه‌های}} انتخاب شده",
-       "revdelete-success": "Ù¾Û\8cداÛ\8cÛ\8c Ù\86سخÙ\87 Ø±Ù\88زآÙ\85د شد.",
+       "revdelete-success": "Ù¾Û\8cداÛ\8cÛ\8c Ù\86سخÙ\87 Ø¨Ù\87â\80\8cرÙ\88ز شد.",
        "revdelete-failure": "'''پیدایی نسخه‌ها قابل به روز کردن نیست:'''\n$1",
        "logdelete-success": "تغییر پیدایی مورد انجام شد.",
        "logdelete-failure": "'''پیدایی سیاهه‌ها قابل تنظیم نیست:'''\n$1",
index 5ab743a..60741c0 100644 (file)
        "permanentlink": "Lien permanent",
        "permanentlink-revid": "ID de la révision",
        "permanentlink-submit": "Aller à la révision",
+       "newsection": "Nouvelle section",
+       "newsection-page": "Page cible",
+       "newsection-submit": "Aller à la page",
        "dberr-problems": "Désolé ! Ce site rencontre des difficultés techniques.",
        "dberr-again": "Essayez d'attendre quelques minutes et rechargez.",
        "dberr-info": "(Accès à la base de données impossible : $1)",
index db8f738..b836392 100644 (file)
        "extlink_sample": "http://www.example.com/ tit di yannaj",
        "extlink_tip": "Yannaj èstèrn (pa bliyé préfigs-a http://)",
        "headline_sample": "Tègs di tit",
-       "headline_tip": "Soutit nivo 2",
+       "headline_tip": "Titit nivèl 2",
        "nowiki_sample": "Rantré tègs-a ki pa fòrmaté isi",
        "nowiki_tip": "Ignoré sentags wiki-a",
        "image_tip": "Fiché enséré",
        "rollbacklinkcount": "révoké $1 {{PLURAL:$1|modifikasyon}}",
        "protectlogpage": "Journal dé protègsyon",
        "protectedarticle": "protéjé « [[$1]] »",
-       "modifiedarticleprotection": "modifyé nivo-a di protègsyon di « [[$1]] »",
+       "modifiedarticleprotection": "modifyé nivèl-a di protègsyon di « [[$1]] »",
        "protect-default": "Otorizé tout itilizatò-ya",
        "restriction-edit": "Modifyé",
        "restriction-move": "Rounonmen",
index 2fa9ca5..baf4d88 100644 (file)
        "page_first": "poilem",
        "page_last": "akhirchem",
        "histlegend": "Frk nivoddni: Jeo uzollneo tuka comparar korunk zai, tenche fudle ''radio'' butao petoi ani ''Enter'' nazalear khalcho butao dab.<br />\nVivron: <strong>({{int:cur}})</strong> = halinchi uzollnie borobor forok, <strong>({{int:last}})</strong> = adli uzollnie borobor forok, <strong>{{int:minoreditletter}}</strong> = dhaktem bodol.",
-       "history-fieldset-title": "Uzollnne khatir sod",
+       "history-fieldset-title": "Uzollnneo chall",
        "history-show-deleted": "Fokot uzollnni kadun udoilelem",
        "histfirst": "sogleavon adhlem",
        "histlast": "sogleavon novem",
        "rcfilters-savedqueries-remove": "Kadun udoi",
        "rcfilters-savedqueries-new-name-label": "Nanv",
        "rcfilters-savedqueries-cancel-label": "Rod'd kor",
-       "rcfilters-show-new-changes": "Soglleavon noveo bodol polloi",
+       "rcfilters-show-new-changes": "$1 savn noveo bodol polloi",
        "rcfilters-filter-editsbyself-label": "Tuven kel'leo bodol",
        "rcfilters-filter-editsbyself-description": "Tujeo svotacheo yogdanam.",
        "rcfilters-filter-editsbyother-label": "Dusreanim kel'le bodol",
index 6e8339a..73e6706 100644 (file)
        "changecontentmodel": "שינוי מודל התוכן של דף",
        "changecontentmodel-legend": "שינוי מודל התוכן",
        "changecontentmodel-title-label": "שם הדף",
+       "changecontentmodel-current-label": "מודל התוכן הנוכחי:",
        "changecontentmodel-model-label": "מודל התוכן החדש",
        "changecontentmodel-reason-label": "סיבה:",
        "changecontentmodel-submit": "שינוי",
        "permanentlink": "קישור קבוע",
        "permanentlink-revid": "מספר הגרסה",
        "permanentlink-submit": "מעבר לגרסה",
+       "newsection": "פסקה חדשה",
+       "newsection-page": "דף יעד",
+       "newsection-submit": "מעבר לעמוד",
        "dberr-problems": "מצטערים! קיימת בעיה טכנית באתר זה.",
        "dberr-again": "נסו להמתין מספר שניות ולהעלות מחדש את הדף.",
        "dberr-info": "(לא ניתן לגשת לבסיס הנתונים: $1)",
index fdbd336..ef3f648 100644 (file)
        "systemblockedtext": "A felhasználónevedet vagy IP-címedet automatikusan blokkolta a MediaWiki.\nA blokkolás indoka:\n\n:<em>$2</em>\n\n* A blokk kezdete: $8\n* A blokk lejárata: $6\n* Blokkolt szerkesztő: $7\n\nA jelenlegi IP-címed: $3.\nKérjük, hogy érdeklődés esetén minden fenti részletet adj meg.",
        "blockednoreason": "nem adott meg okot",
        "blockedtext-composite": "<strong>A felhasználónevedet vagy IP-címedet blokkolták.</strong>\nA blokkolás indoka:\n\n:<em>$2</em>\n\n* A blokk kezdete: $8\n* A leghoszabb blokk lejárata: $6\n\n* $5\n\nA jelenlegi IP-címed: $3.\nKérjük, hogy érdeklődés esetén minden fenti részletet adj meg.",
+       "blockedtext-composite-ids": "Releváns blokkolási azonosító: $1 (IP-címed feketelistázva is lehet)",
+       "blockedtext-composite-no-ids": "IP-címed több feketelistán is szerepel.",
        "blockedtext-composite-reason": "Fiókoddal és/vagy IP-címeddel szemben több blokk is érvényben van",
        "whitelistedittext": "Lapok szerkesztéséhez $1.",
        "confirmedittext": "Lapok szerkesztése előtt meg kell erősítened az e-mail címedet. Kérjük, hogy a [[Special:Preferences|szerkesztői beállításaidban]] add meg, majd erősítsd meg az e-mail címedet.",
        "right-editmyusercss": "Saját szerkesztői CSS-fájlok szerkesztése",
        "right-editmyuserjson": "Saját szerkesztői JSON-fájlok szerkesztése",
        "right-editmyuserjs": "saját szerkesztői JavaScript-fájlok szerkesztése",
+       "right-editmyuserjsredirect": "saját átirányító JavaScript-fájljaid szerkesztése",
        "right-viewmywatchlist": "saját figyelőlista megtekintése",
        "right-editmywatchlist": "saját figyelőlista szerkesztése; bizonyos műveletek képesek lapok figyelőlistához adására ezen jog nélkül is",
        "right-viewmyprivateinfo": "saját személyes adatok megtekintése (pl. e-mail-cím, valódi név)",
        "action-editmyusercss": "saját szerkesztői CSS-fájlok szerkesztése",
        "action-editmyuserjson": "saját szerkesztői JSON-fájlok szerkesztése",
        "action-editmyuserjs": "saját szerkesztői JavaScript-fájlok szerkesztése",
+       "action-editmyuserjsredirect": "saját átirányító JavaScript-fájljaid szerkesztése",
        "action-viewsuppressed": "minden felhasználó elől elrejtett változtatások megtekintése",
        "action-hideuser": "felhasználói név blokkolása és elrejtése a külvilág elől",
        "action-ipblock-exempt": "IP-, auto- és tartományblokkok megkerülése",
        "changecontentmodel": "A lap tartalommodelljének megváltoztatása",
        "changecontentmodel-legend": "Tartalommodell megváltoztatása",
        "changecontentmodel-title-label": "Lapcím",
+       "changecontentmodel-current-label": "Jelenlegi tartalommodell:",
        "changecontentmodel-model-label": "Új tartalommodell",
        "changecontentmodel-reason-label": "Indoklás:",
        "changecontentmodel-submit": "Változtatás",
        "permanentlink": "Állandó hivatkozás",
        "permanentlink-revid": "Változat azonosító",
        "permanentlink-submit": "Ugrás a változatra",
+       "newsection": "Új szakasz",
+       "newsection-page": "Céllap",
+       "newsection-submit": "Ugrás az oldalra",
        "dberr-problems": "Sajnáljuk, de az oldallal technikai problémák vannak.",
        "dberr-again": "Várj néhány percet, majd frissítsd az oldalt.",
        "dberr-info": "(Nem sikerült kapcsolódni az adatbázishoz: $1)",
        "logentry-delete-restore-nocount": "$1 {{GENDER:$2|helyreállította}} a következő lapot: $3",
        "restore-count-revisions": "$1 lapváltozat",
        "restore-count-files": "$1 fájl",
-       "logentry-delete-event": "$1 megváltoztatta {{PLURAL:$5|egy napló bejegyzés|$5 napló bejegyzés}} láthatóságát a(z) $3 című lapon: $4",
+       "logentry-delete-event": "$1 megváltoztatta {{PLURAL:$5|egy naplóbejegyzés|$5 naplóbejegyzés}} láthatóságát a(z) $3 című lapon: $4",
        "logentry-delete-revision": "$1 {{GENDER:$2|módosította}} a(z) $3 című lap {{PLURAL:$5|egy|$5}} lapváltozatának láthatóságát: $4",
        "logentry-delete-event-legacy": "$1 {{GENDER:$2|módosította}} a(z) $3 című lap naplóbejegyzéseinek láthatóságát",
        "logentry-delete-revision-legacy": "$1 {{GENDER:$2|módosította}} a(z) $3 című lap lapváltozatainak láthatóságát",
        "passwordpolicies-policy-passwordnotinlargeblacklist": "A jelszó nem szerepelhet a 100 000 leggyakrabban használt jelszó listáján .",
        "passwordpolicies-policyflag-forcechange": "lecserélés követelése bejelentkezéskor",
        "passwordpolicies-policyflag-suggestchangeonlogin": "lecserélés ajánlása bejelentkezéskor",
+       "mycustomjsredirectprotected": "Nincs jogod szerkeszteni ezt a JavaScript-lapot, mert a lap egy olyan átirányítás, ami nem szerkesztői oldaladra mutat.",
        "unprotected-js": "Biztonsági okokból JavaScript nem tölthető be védtelen lapokról. Kérlek egyedül a MediaWiki névtérben készíts JavaScriptet, vagy szerkesztői allapként.",
        "userlogout-continue": "Biztos ki szeretnél jelentkezni?"
 }
index 3e98fb7..8c3f51d 100644 (file)
        "pageinfo-hidden-categories": "Թաքուն {{PLURAL:$1|խմբաւորում|խմբաւորումներ}} ($1)",
        "pageinfo-templates": "Օգտագործուած {{PLURAL:$1|կաղապար|կաղապարներ}} ($1)",
        "pageinfo-toolboxlink": "‎Էջի մասին տեղեկութիւն",
-       "pageinfo-redirectsto": "Վերայղում է դեպի",
+       "pageinfo-redirectsto": "Կը վերայղուի դէպի",
        "pageinfo-contentpage": "Իբրեւ բովանդակութեան էջ հաշուըւած",
        "pageinfo-contentpage-yes": "Այո",
        "pageinfo-protect-cascading-yes": "Այո",
index 52f01ef..8b8a973 100644 (file)
        "category_header": "Artikli en la kategorio \"$1\"",
        "subcategories": "Subkategorii",
        "category-media-header": "\"Media\" en kategorio \"$1\"",
-       "category-empty": "''Nuntempe existas nula pagini en ita kategorio.''",
+       "category-empty": "''Nuntempe existas nula pagini en ca kategorio.''",
        "hidden-categories": "{{PLURAL:$1|Celita kategorio|Celita kategorii}}",
        "hidden-category-category": "Celita kategorii",
        "category-subcat-count": "Ica kategorio havas {{PLURAL:$2|nur la sequanta subkategorio.|la sequanta {{PLURAL:$1|subkategorio|$1 subkategorii}}, ek $2.}}",
        "rcfilters-filter-categorization-description": "Registri pri pagini qui adjuntesis o removesis de kategorii.",
        "rcfilters-filter-logactions-label": "Agadi enrejistrata",
        "rcfilters-filter-logactions-description": "Agadi dal administreri, kreado di konti, efaco di pagini, sendo di arkivi...",
+       "rcfilters-typeofchange-conflicts-hideminor": "Ca tipo di filtrilo pri chanjo konfliktas kun la filtrilo \"Minor edits\". Kelka tipi di chanji ne povas judikesar kom \"minora\".",
        "rcfilters-filtergroup-lastrevision": "Maxim recenta modifikuri",
        "rcfilters-filter-lastrevision-label": "Nuna versiono",
        "rcfilters-filter-lastrevision-description": "Nur la maxim recenta modifikuro di ula pagino.",
        "move": "Movar",
        "movethispage": "Rinomizar ica pagino",
        "unusedimagestext": "La sequanta arkivi existas, ma ne esas enterigita en irga pagino.\nVoluntez remarkar ke altra ret-siti povus ligesar ad arkivo per direta URL, e do ol povus esar listizita hike malgre ke on aktive uzas lo.",
+       "unusedcategoriestext": "La sequanta pagini pri kategorii ja existas, tamen nula artiklo o kategorio uzas li.",
        "notargettitle": "Ne esas vakua pagino",
        "notargettext": "Vu ne definis en qua pagino agar ica funciono.",
        "nopagetitle": "La pagino ne existas",
        "speciallogtitlelabel": "Skopo (titulo od {{ns:user}}:uzernomo por uzero):",
        "log": "Registrari",
        "logeventslist-submit": "Montrez",
+       "logeventslist-tag-log": "Protokolo di etiketi",
        "all-logs-page": "Omna publika registrari",
        "alllogstext": "Kombinata montro di omna 'log'-i di {{SITENAME}} disponebla.\nVu povas stretigar la vidado per la selekto di la tipo di protoloko (log type), l'uzantonomo (case-sensitive), o la pagino afektita (also case-sensitive).",
        "logempty": "Nula kombinuri trovesis en la protokolo.",
        "blankpage": "Pagino sen-skribura",
        "tag-filter": "[[Special:Tags|etiketo]] filtrilo:",
        "tag-filter-submit": "Filtrez",
-       "tag-list-wrapper": "[[Special:Tags|{{PLURAL:$1|Etikedo|Etikedi}}]]: $2",
+       "tag-list-wrapper": "[[Special:Tags|{{PLURAL:$1|Etiketo|Etiketi}}]]: $2",
        "tag-mw-contentmodelchange": "Modifiko di la kontenajo di ula modelo",
        "tag-mw-contentmodelchange-description": "Redakturi qui [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:ChangeContentModel modifikas la modelo di kontenajo] di ula pagino",
        "tag-mw-new-redirect": "Nova ridirekto",
index 021b59f..406238b 100644 (file)
        "delete-warning-toobig": "La cronologia di questa pagina è molto lunga (oltre $1 {{PLURAL:$1|versione|versioni}}). La sua cancellazione può creare dei problemi di funzionamento al database di {{SITENAME}}; procedere con cautela.",
        "deleteprotected": "Non puoi cancellare questa pagina perché è stata protetta.",
        "deleting-backlinks-warning": "<strong>Attenzione:</strong> [[Special:WhatLinksHere/{{FULLPAGENAME}}|altre pagine]] contengono collegamenti o inclusioni alla pagina che stai per cancellare.",
-       "deleting-subpages-warning": "<strong>Attenzione:</strong> la pagina che stai per cancellare ha [[Special:PrefixIndex/{{FULLPAGENAME}}/|{{PLURAL:$1|una sotto-pagina|$1 sotto-pagine|51=più di 50 sotto-pagine}}]].",
+       "deleting-subpages-warning": "<strong>Attenzione:</strong> la pagina che stai per cancellare ha [[Special:PrefixIndex/{{FULLPAGENAME}}/|{{PLURAL:$1|una sottopagina|$1 sottopagine|51=più di 50 sottopagine}}]].",
        "rollback": "Annulla le modifiche",
        "rollback-confirmation-confirm": "Per favore conferma:",
        "rollback-confirmation-yes": "Rollback",
index b4c04cc..0f789a0 100644 (file)
        "changecontentmodel": "문서의 콘텐츠 모델을 변경",
        "changecontentmodel-legend": "콘텐츠 모델 변경",
        "changecontentmodel-title-label": "문서 제목",
+       "changecontentmodel-current-label": "현재의 콘텐츠 모델:",
        "changecontentmodel-model-label": "새 콘텐츠 모델",
        "changecontentmodel-reason-label": "이유:",
        "changecontentmodel-submit": "바꾸기",
        "permanentlink": "고유 링크",
        "permanentlink-revid": "판 ID",
        "permanentlink-submit": "판으로 이동",
+       "newsection": "새 문단",
+       "newsection-submit": "문서로 이동",
        "dberr-problems": "죄송합니다! 이 사이트에 기술적인 문제가 발생하고 있습니다.",
        "dberr-again": "잠시 기다리고 나서 다시 불러오세요.",
        "dberr-info": "(데이터베이스 서버에 연결할 수 없습니다: $1)",
index 094b875..7d2c4bf 100644 (file)
        "june-date": "Pûşper $1",
        "july-date": "Tîrmeh $1",
        "august-date": "$1 tebax",
-       "september-date": "Rezber $1",
-       "october-date": "Kewçêr $1",
-       "november-date": "Sermawez $1",
-       "december-date": "Berfanbar $1",
+       "september-date": "Îlon $1",
+       "october-date": "Çiriya pêşîn $1",
+       "november-date": "Çiriya paşîn $1",
+       "december-date": "Kanûna pêşîn $1",
        "period-am": "Berî Nîvro",
        "period-pm": "PN",
        "pagecategories": "{{PLURAL:$1|Kategorî|Kategorî}}",
        "perfcachedts": "Ev dane hatiye veşartin û cara paşîn $1 hatiye rojanekirin. A maximum of {{PLURAL:$4|one result is|$4 results are}} available in the cache.",
        "querypage-no-updates": "Fonksiyona rojanekirinê ya vê rûpelê hatiye sekinandin. Daneyên vir nayên rojanekirin.",
        "viewsource": "Çavkaniyê bibîne",
-       "viewsource-title": "Çavkanîya $1 bibîne",
+       "viewsource-title": "Çavkaniya $1 bibîne",
        "actionthrottled": "Hejmara guherandinên hatine hesibandin",
        "actionthrottledtext": "Te ev tişt di demeke gelekî kin de kir. Ji kerema xwe çend xulekan bisekine û carekî din biceribîne.",
        "protectedpagetext": "Ev rûpel ji bo guhertin û karên din ne kirin hatiye parastin.",
        "revdelete-edit-reasonlist": "Sedemên jêbirinê biguherîne",
        "revdelete-offender": "Nivîskarê/a guhertoyê:",
        "mergehistory-box": "Guhertoyên her du rûpelan bike yek:",
-       "mergehistory-from": "Çavkanîya rûpelê:",
+       "mergehistory-from": "Çavkaniya rûpelê:",
        "mergehistory-submit": "Guhertoyan bike yek",
        "mergehistory-reason": "Sedem:",
        "mergelog": "Yekkirina gotaran",
        "deletepage": "Rûpelê jê bibe",
        "confirm": "Pesend bike",
        "excontent": "Naveroka berê: \"$1\"",
-       "excontentauthor": "Naveroka rûpelê ev bû: \"$1\", û tenê ya bikarhêner \"[[Special:Contributions/$2|$2]]\" ([[User talk:$2|talk]] bû.)",
+       "excontentauthor": "Naveroka rûpelê ev bû: \"$1\", û tenê ya bikarhêner \"[[Special:Contributions/$2|$2]]\" ([[User talk:$2|gotûbêj]] bû.)",
        "exbeforeblank": "Naverok berî betalkirinê ev bû: \"$1\"",
        "delete-confirm": "Jêbirina \"$1\"",
        "delete-legend": "Jê bibe",
        "tooltip-pt-preferences": "Tercîhên {{GENDER:|te}}",
        "tooltip-pt-watchlist": "The list of pages you",
        "tooltip-pt-mycontris": "Lîsteyekê beşdariyên {{GENDER:|te}}",
-       "tooltip-pt-login": "Têketina we tê teşwîqkirin; lêbelê, en ne elzem e",
+       "tooltip-pt-login": "Têketina we dê baş be; lê belê, lê pêwîstî tune ye.",
        "tooltip-pt-logout": "Derkeve",
        "tooltip-pt-createaccount": "Em pêşniyar dikin ku tu ji xwe re hesabek çêbikî û bi wê hesabê têkevî, lêbelê ev ne mecbûrî ye.",
        "tooltip-ca-talk": "Gotûbêj li ser rûpela naverokê",
index 85f9d18..d990768 100644 (file)
        "rcfilters-empty-filter": "Keen aktive Filter. All Kontributioune gi gewisen.",
        "rcfilters-filterlist-title": "Filteren",
        "rcfilters-filterlist-whatsthis": "Wéi geet dat?",
-       "rcfilters-filterlist-feedbacklink": "Sot eis wat Dir vun dësen Filterméiglechkeeten haalt",
+       "rcfilters-filterlist-feedbacklink": "Sot eis wat Dir vun dëse Filterméiglechkeeten haalt",
        "rcfilters-highlightbutton-title": "Resultater ervirhiewen",
        "rcfilters-highlightmenu-title": "Eng Faarf eraussichen",
        "rcfilters-highlightmenu-help": "Sicht eng Faarf eraus fir dës Eegenschaft ervirzehiewen.",
        "permanentlink": "Permanente Link",
        "permanentlink-revid": "Nummer (ID) vun der Versioun",
        "permanentlink-submit": "Op d'Versioun goen",
+       "newsection": "Neien Abschnitt",
+       "newsection-page": "Zilsäit",
+       "newsection-submit": "Op d'Säit goen",
        "dberr-problems": "Pardon! Dëse Site huet technesch Schwieregkeeten.",
        "dberr-again": "Versicht e puer Minutten ze waarden an dann nei ze lueden.",
        "dberr-info": "(D'Datebank kann net erreecht ginn: $1)",
index 4afee0e..4607790 100644 (file)
@@ -14,7 +14,8 @@
                        "Fitoschido",
                        "Matěj Suchánek",
                        "Physicsch",
-                       "FarsiNevis"
+                       "FarsiNevis",
+                       "Iriman"
                ]
        },
        "tog-underline": "خط کیشائن ژێر پیوندەل:",
        "undo-failure": "به علت تعارض با ویرایش‌های میانی، این ویرایش را نمی‌توان خنثی کرد.",
        "undo-norev": "این ویرایش را نمی‌توان خنثی کرد چون وجود ندارد یا حذف شده‌است.",
        "undo-nochange": "به نظر می‌رسد ویرایش از پیش واگردانی شده است.",
-       "undo-summary": "Ø®Ù\86Ø«Û\8câ\80\8cسازÛ\8c Ù\88Û\8cراÛ\8cØ´ $1 ØªÙ\88سط [[Special:Contributions/$2|$2]] ([[User talk:$2|بحث]])",
+       "undo-summary": "Ø®Ù\86Ø«Û\8câ\80\8cسازÛ\8c Ù\88Û\8cراÛ\8cØ´ $1 Ø§Ø²  [[Special:Contributions/$2|$2]] ([[User talk:$2|بحث]])",
        "undo-summary-username-hidden": "خنثی‌سازی نسخهٔ $1 به دست یک کاربر پنهان‌شده",
        "cantcreateaccount-text": "امكان ساختن حساب کاربری از این این نشانی آی‌پی ('''$1''') توسط [[User:$3|$3]] سلب شده است.\n\nدلیل ارائه شده توسط $3 چنین است: $2",
        "cantcreateaccount-range-text": "ایجاد حساب از آدرس آی‌پی در مجموعه‌ی <strong>$1</strong>، که شامل آدرس آی‌پی شما (<strong>$4</strong>) است، توسط [[User:$3|$3]] متوقف شده‌است.\nدلیل ارائه شده توسط $3، $2 است.",
index 7614e38..61a778f 100644 (file)
        "rcfilters-clear-all-filters": "Valyti visus filtrus",
        "rcfilters-show-new-changes": "Rodyti naujausius keitimus",
        "rcfilters-search-placeholder": "Filtruoti pakeitimus (naudokitės meniu arba ieškokite filtro pavadinimo)",
+       "rcfilters-search-placeholder-mobile": "Filtrai",
        "rcfilters-invalid-filter": "Negalimas filtras",
        "rcfilters-empty-filter": "Nėra aktyvių filtrų. Rodomi visi indėliai.",
        "rcfilters-filterlist-title": "Filtrai",
        "changecontentmodel": "Keisti puslapio turinio modelį",
        "changecontentmodel-legend": "Keisti turinio modelį",
        "changecontentmodel-title-label": "Puslapio pavadinimas",
+       "changecontentmodel-current-label": "Dabartinis turinio modelis:",
        "changecontentmodel-model-label": "Naujas turinio modelis",
        "changecontentmodel-reason-label": "Priežastis:",
        "changecontentmodel-submit": "Keisti",
        "permanentlink": "Nuolatinė nuoroda",
        "permanentlink-revid": "Versijos ID",
        "permanentlink-submit": "Peržiūrėti versiją",
+       "newsection": "Naujas skyrius",
+       "newsection-submit": "Eiti į puslapį",
        "dberr-problems": "Atsiprašome! Svetainei iškilo techninių problemų.",
        "dberr-again": "Palaukite kelias minutes ir perkraukite puslapį.",
        "dberr-info": "(Nepavyksta pasiekti duomenų bazės: $1)",
        "linkaccounts": "Susieti paskyras",
        "linkaccounts-success-text": "Paskyra buvo susieta.",
        "linkaccounts-submit": "Susieti paskyras",
+       "cannotunlink-no-provider-title": "Nėra susietų paskyrų, kurios galėtų būti atsietos.",
+       "cannotunlink-no-provider": "Nėra susietų paskyrų, kurios galėtų būti atsietos.",
        "unlinkaccounts": "Atsieti paskyras",
        "unlinkaccounts-success": "Paskyra buvo atsieta.",
        "edit-error-short": "Klaida: $1",
index a6b7a5b..de98e58 100644 (file)
@@ -31,7 +31,7 @@
        "tog-hideminor": "Скривај ги ситните уредувања во скорешните промени",
        "tog-hidepatrolled": "Скриј испатролирани уредувања во скорешните промени",
        "tog-newpageshidepatrolled": "Скриј испатролирани страници од списокот на нови страници",
-       "tog-hidecategorization": "СокÑ\80иÑ\98 Ñ\98а ÐºÐ°Ñ\82егоÑ\80изаÑ\86иÑ\98аÑ\82а Ð½Ð° Ñ\81Ñ\82Ñ\80аниÑ\86иÑ\82е",
+       "tog-hidecategorization": "Скриј ја категоризацијата на страниците",
        "tog-extendwatchlist": "Прошири го список на набљудувања за приказ на сите промени, не само скорешните",
        "tog-usenewrc": "Промени во групи по страници во списокот на скорешни промени",
        "tog-numberheadings": "Наброј ги заглавијата",
@@ -63,7 +63,7 @@
        "tog-watchlistunwatchlinks": "Додај непосредни бележници за тргање/ставање во набљудуваните ({{int:Watchlist-unwatch}}/{{int:Watchlist-unwatch-undo}}) кон набљудуваните страници со промени (префрлањето бара JavaScript)",
        "tog-watchlisthideanons": "Скриј ги уредувањата од анонимни корисници во набљудуваните",
        "tog-watchlisthidepatrolled": "Скриј испатролирани уредувања од мојот список на набљудувања",
-       "tog-watchlisthidecategorization": "СокÑ\80иÑ\98 Ñ\98а ÐºÐ°Ñ\82егоÑ\80изаÑ\86иÑ\98аÑ\82а Ð½Ð° Ñ\81Ñ\82Ñ\80аниÑ\86иÑ\82е",
+       "tog-watchlisthidecategorization": "Скриј ја категоризацијата на страниците",
        "tog-ccmeonemails": "Испраќај ми мои примероци од писмата што ги праќам на другите корисници",
        "tog-diffonly": "Не ја покажувај содржината на страницата под разликите",
        "tog-showhiddencats": "Прикажи скриени категории",
        "right-suppressionlog": "Гледање на лични дневници",
        "right-block": "Оневозможување на останати корисници да уредуваат",
        "right-blockemail": "Оневозможување корисници да праќаат е-пошта",
-       "right-hideuser": "Ð\91локиÑ\80аÑ\9aе ÐºÐ¾Ñ\80иÑ\81ниÑ\86и, Ñ\81окÑ\80иваÑ\9aе Ð¾Ð´ Ñ\98авноÑ\81Ñ\82а",
+       "right-hideuser": "Блокирање корисници, скривање од јавноста",
        "right-ipblock-exempt": "Заобиколување на IP-блокови, автоблокови и опсежни блокови",
        "right-unblockself": "Сопствено одблокирање",
        "right-protect": "Менување на степени на заштита и уредување на каскадно заштитени страници",
        "action-editmyuserjs": "уредување на сопствените кориснички податотеки со JavaScript",
        "action-editmyuserjsredirect": "уредување на сопствените кориснички JavaScript-податотеки кои се пренасочувања",
        "action-viewsuppressed": "преглед на преработки скриени од било кој корисник",
-       "action-hideuser": "блокиÑ\80аÑ\9aе ÐºÐ¾Ñ\80иÑ\81ниÑ\86и, Ñ\81окÑ\80иваÑ\9aе Ð¾Ð´ Ñ\98авноÑ\81Ñ\82а",
+       "action-hideuser": "блокирање корисници, скривање од јавноста",
        "action-ipblock-exempt": "заобиколување на IP-блокови, автоблокови и опсежни блокови",
        "action-unblockself": "блокирање на самите себеси",
        "action-noratelimit": "да не бидете засегнати од временски ограничувања на уредување",
        "rc-change-size-new": "$1 {{PLURAL:$1|бајт|бајти}} по промената",
        "newsectionsummary": "/* $1 */ ново заглавие",
        "rc-enhanced-expand": "Прикажување на подробности",
-       "rc-enhanced-hide": "СокÑ\80иваÑ\9aе Ð½Ð° Ð¿Ð¾Ð´Ñ\80обноÑ\81Ñ\82и",
+       "rc-enhanced-hide": "Скривање на подробности",
        "rc-old-title": "првично создадено како „$1“",
        "recentchangeslinked": "Поврзани промени",
        "recentchangeslinked-feed": "Поврзани промени",
        "autoblocker": "Автоматски сте блокирани бидејќи вашата IP-адреса била скоро користена од „[[User:$1|$1]]“.\nНаведената причина за блокирање на $1 гласи: „$2“",
        "blocklogpage": "Дневник на блокирања",
        "blocklog-showlog": "Овој корисник бил претходно блокиран.\nДневникот на блокирања, за ваша информација е прикажан подолу:",
-       "blocklog-showsuppresslog": "Ð\9eвоÑ\98 ÐºÐ¾Ñ\80иÑ\81ник Ð±Ð¸Ð» Ð¿Ñ\80еÑ\82Ñ\85одно Ð±Ð»Ð¾ÐºÐ¸Ñ\80ан Ð¸ Ñ\81окÑ\80иен.\nÐ\94невникоÑ\82 Ð½Ð° Ð¾Ð³Ñ\80аниÑ\87Ñ\83ваÑ\9aа, Ð·Ð° Ð²Ð°Ñ\88а Ð¸Ð½Ñ\84оÑ\80маÑ\86иÑ\98а Ðµ Ð¿Ñ\80икажан Ð¿Ð¾Ð´Ð¾Ð»Ñ\83:",
+       "blocklog-showsuppresslog": "Овој корисник бил претходно блокиран и скриен.\nДневникот на ограничувања, за ваша информација е прикажан подолу:",
        "blocklogentry": "го блокираше [[$1]] со рок на истекување до $2, $3",
        "reblock-logentry": "ги промени нагодувањата за блокирање на [[$1]] со рок на истекување од $2 $3",
        "blocklogtext": "Ова е дневник на блокирање и одблокирање на кориснци.\nАвтоматски блокираните IP-адреси не се наведени.\nТековните забрани и блокирања ќе ги најдете на [[Special:BlockList|списокот на блокирања]].",
        "block-log-flags-noemail": "блокирана е-поштенска адреса",
        "block-log-flags-nousertalk": "без можност за уредување на својата разговорна страница",
        "block-log-flags-angry-autoblock": "овозможено проширено автоблокирање",
-       "block-log-flags-hiddenname": "Ñ\81окÑ\80иено ÐºÐ¾Ñ\80иÑ\81ниÑ\87ко Ð¸Ð¼Ðµ",
+       "block-log-flags-hiddenname": "скриено корисничко име",
        "range_block_disabled": "Администраторската можност да блокираат IP групи е исклучена.",
        "ipb-prevent-user-talk-edit": "Уредувањето на сопствената разговорна страница мора да биде дозволено при делумен блок, освен ако не вклучува ограничување за разговорната страница.",
        "ipb_expiry_invalid": "Погрешен рок на истекување.",
        "sorbs_create_account_reason": "Вашата IP-адреса е наведена како отворен застапник (прокси) во DNSBL користена од {{SITENAME}}.\nНе можете да создадете корисничка сметка.",
        "softblockrangesreason": "Анонимните придонеси не се дозволени од вашата IP-адреса ($1). Најавете се.",
        "xffblockreason": "Блокирана е IP-адреса присутна во заглавието X-Forwarded-For, која е ваша или на застапничкиот опслужувач што го користите. Наведеното образложение гласи: $1",
-       "cant-see-hidden-user": "Ð\9aоÑ\80иÑ\81никоÑ\82 ÐºÐ¾Ñ\98 Ñ\81е Ð¾Ð±Ð¸Ð´Ñ\83ваÑ\82е Ð´Ð° Ð³Ð¾ Ð±Ð»Ð¾ÐºÐ¸Ñ\80аÑ\82е Ðµ Ð²ÐµÑ\9cе Ð±Ð»Ð¾ÐºÐ¸Ñ\80ан Ð¸ Ñ\81окÑ\80иен. Ð\91идеÑ\98Ñ\9cи Ð²Ð¸Ðµ Ð½ÐµÐ¼Ð°Ñ\82е Ð¿Ñ\80ава Ð·Ð° Ñ\81окривање на корисник, не можете да ги видите или уредувате корисничките блокирања.",
+       "cant-see-hidden-user": "Ð\9aоÑ\80иÑ\81никоÑ\82 ÐºÐ¾Ñ\98 Ñ\81е Ð¾Ð±Ð¸Ð´Ñ\83ваÑ\82е Ð´Ð° Ð³Ð¾ Ð±Ð»Ð¾ÐºÐ¸Ñ\80аÑ\82е Ðµ Ð²ÐµÑ\9cе Ð±Ð»Ð¾ÐºÐ¸Ñ\80ан Ð¸ Ñ\81кÑ\80иен. Ð\91идеÑ\98Ñ\9cи Ð²Ð¸Ðµ Ð½ÐµÐ¼Ð°Ñ\82е Ð¿Ñ\80ава Ð·Ð° Ñ\81кривање на корисник, не можете да ги видите или уредувате корисничките блокирања.",
        "ipbblocked": "Не можете да блокирате или одблокирате други корисници бидејќи и самите сте блокирани",
        "ipbnounblockself": "Не е дозволено да се одблокирате самите себеси",
        "lockdb": "Заклучи база на податоци",
        "newimages-user": "IP-адреса или корисничко име",
        "newimages-newbies": "Прикажи само придонеси на нови корисници",
        "newimages-showbots": "Прикажувај подигања од ботови",
-       "newimages-hidepatrolled": "СокÑ\80иÑ\98 Ð¸Ñ\81паÑ\82Ñ\80олÑ\80иани Ð¿Ð¾Ð´Ð¸Ð³Ð°Ñ\9aа",
+       "newimages-hidepatrolled": "Скриј испатролриани подигања",
        "newimages-mediatype": "Тип на медиум:",
        "noimages": "Нема ништо.",
        "gallery-slideshow-toggle": "Преод на минијатури",
        "permanentlink": "Постојана врска",
        "permanentlink-revid": "Назнака на преработката",
        "permanentlink-submit": "Оди на преработката",
+       "newsection": "Нов поднаслов",
+       "newsection-page": "Целна страница",
+       "newsection-submit": "Оди на страница",
        "dberr-problems": "Жалиме! Ова мрежно место се соочува со технички потешкотии.",
        "dberr-again": "Почекајте неколку минути и обидете се повторно.",
        "dberr-info": "(Не можам да пристапам кон базата: $1)",
index 2bbc077..59b7e93 100644 (file)
        "rcfilters-clear-all-filters": "എല്ലാ അരിപ്പകളും ഒഴിവാക്കുക",
        "rcfilters-show-new-changes": "$1 മുതലുള്ള പുതിയ മാറ്റങ്ങൾ കാണുക",
        "rcfilters-search-placeholder": "സമീപകാലമാറ്റങ്ങൾ അരിച്ചെടുക്കുക (മെനു ഉപയോഗിക്കുക അല്ലെങ്കിൽ അരിപ്പയുടെ പേരുപയോഗിച്ച് തിരയുക)",
+       "rcfilters-search-placeholder-mobile": "അരിപ്പകൾ",
        "rcfilters-invalid-filter": "അസാധുവായ അരിപ്പ",
        "rcfilters-empty-filter": "സജീവ അരിപ്പകൾ ഇല്ല. എല്ലാ സംഭാവനകളും പ്രദർശിപ്പിക്കുന്നു.",
        "rcfilters-filterlist-title": "അരിപ്പകൾ",
index 157b87c..db10fbf 100644 (file)
        "category-file-count": "{{PLURAL:$2|This category contains only the following file.|The following {{PLURAL:$1|file is|$1 files are}} in this category, out of $2 total.}}",
        "category-file-count-limited": "The following {{PLURAL:$1|file is|$1 files are}} in the current category.",
        "listingcontinuesabbrev": "ꯆꯠꯊꯕꯥ",
-       "index-category": "Indexed ꯂꯥꯃꯥꯏꯁꯤꯡ",
+       "index-category": "ꯏꯟꯗꯦꯛꯁ ꯂꯃꯥꯏꯁꯤꯡ",
        "noindex-category": "ꯏꯟꯗꯦꯛꯁ ꯌꯥꯎꯗꯕ ꯂꯃꯥꯏꯁꯤꯡ",
        "broken-file-category": " ꯀꯥꯏꯔꯕꯥ ꯐꯥꯏꯜꯒꯥ ꯂꯣꯏꯅꯕꯥ ꯂꯃꯥꯏꯁꯤꯡ",
        "about": "ꯄꯣꯠꯇꯨꯗꯤ ꯃꯔꯝꯗꯥ",
        "article": "ꯂꯃꯥꯏꯁꯤꯗꯥ ꯌꯥꯎꯕꯥ ꯄꯨꯝꯅꯃꯛ",
        "newwindow": "(ꯑꯅꯧꯕꯥ ꯊꯣꯡꯅꯥꯎꯗꯥ ꯍꯥꯡꯗꯣꯛ ꯎ)",
        "cancel": "ꯇꯣꯛꯄ",
-       "moredotdotdot": "ꯋꯥꯠꯂꯤ",
-       "morenotlisted": "ꯃꯁꯤꯒꯤ ꯄꯔꯦꯡꯁꯤ ꯃꯄꯨꯡ ꯐꯥꯗꯦ",
+       "moredotdotdot": "ꯋꯥꯠꯂꯤ....",
+       "morenotlisted": "ꯃꯁꯤꯒꯤ ꯄꯔꯦꯡꯁꯤ ꯃꯄꯨꯡ ꯐꯥꯗꯦ ꯫",
        "mypage": "ꯂꯃꯥꯏ",
        "mytalk": "ꯉꯥꯡꯐꯝ",
        "anontalk": "ꯉꯥꯡꯐꯝ",
        "otherlanguages": "ꯑꯇꯣꯞꯄꯥ ꯂꯣꯟꯁꯤꯡꯗꯥ",
        "redirectedfrom": "($1 ꯗꯒꯤ ꯔꯤꯗꯥꯏꯔꯦꯛ)",
        "redirectpagesub": "ꯑꯃꯨꯛ ꯍꯟꯂꯛꯄꯥ ꯂꯃꯥꯏ",
-       "redirectto": "Redirect to:",
+       "redirectto": "ꯃꯐꯝꯁꯤꯗ ꯍꯟꯕ:",
        "lastmodifiedat": "$1 ꯗꯥ ꯃꯁꯤꯒꯤ ꯂꯃꯥꯏꯁꯤ ꯑꯔꯣꯏꯕꯥ ꯁꯦꯝꯒꯠꯈꯤꯕꯥ, $2 ꯗꯥ",
        "viewcount": "This page has been accessed {{PLURAL:$1|once|$1 times}}?",
        "protectedpage": "ꯉꯥꯛꯊꯣꯛꯂꯕꯥ ꯂꯃꯥꯏ",
        "disclaimers": "ꯌꯥꯅꯤꯡꯗꯕꯥ ꯐꯣꯡꯗꯣꯛꯄꯁꯤꯡ",
        "disclaimerpage": "Project:ꯃꯌꯥꯝꯒꯤ ꯑꯣꯏꯅꯥ ꯌꯥꯅꯤꯡꯗꯕꯥ ꯐꯣꯡꯗꯣꯔꯛꯄꯥ",
        "edithelp": "ꯁꯦꯝꯒꯠꯅꯕꯥ ꯃꯥꯇꯦꯡ",
-       "helppage-top-gethelp": "ê¯\83ꯥê¯\87ꯦꯡ",
+       "helppage-top-gethelp": "ꯃꯇꯦꯡ",
        "mainpage": "ꯃꯔꯨꯑꯣꯏꯕ ꯂꯃꯥꯏ",
        "mainpage-description": "ꯃꯔꯨꯑꯣꯏꯕ ꯂꯃꯥꯏ",
        "policy-url": "Project:ꯈꯣꯡꯊꯥꯡ",
        "hidetoc": "ꯂꯣꯇꯄ",
        "collapsible-collapse": "ꯁꯨꯞꯆꯤꯟꯕꯥ",
        "collapsible-expand": "ꯄꯥꯛꯊꯣꯛꯄ",
-       "confirmable-confirm": "Are {{GENDER:$1|you}} sure?",
+       "confirmable-confirm": "{{GENDER:$1|ꯅꯪꯒꯤꯖꯤ}} ꯁꯣꯏꯗ꯭ꯔꯕꯣ?",
        "confirmable-yes": "ꯍꯣꯏ",
        "confirmable-no": "ꯅꯠꯇꯦ",
-       "thisisdeleted": "View or restore $1?",
+       "thisisdeleted": "$1 ꯌꯦꯡꯕ ꯅꯠꯇ꯭ꯔꯒ ꯍꯤꯡꯍꯟꯕ?",
        "viewdeleted": "$1 ꯌꯦꯡꯍꯟꯂꯨ?",
-       "restorelink": "{{PLURAL:$1|one deleted edit|$1 deleted edits}}",
+       "restorelink": "{{PLURAL:$1|ꯁꯦꯝꯒꯠꯄꯥ ꯱ ꯀꯛꯊꯠꯂꯦ|$1 ꯀꯛꯊꯠꯈꯔꯕ ꯁꯦꯝꯒꯠꯄꯁꯤꯡ}}",
        "feedlinks": "ꯐꯤꯗ:",
        "feed-invalid": "ꯌꯥꯎꯗꯕꯥ subscription feed type.",
        "feed-unavailable": "ꯐꯤꯗꯁ ꯐꯪꯗꯦ",
        "readonlytext": "The database is currently locked to new entries and other modifications, probably for routine database maintenance, after which it will be back to normal.\n\nThe system administrator who locked it offered this explanation: $1",
        "missing-article": "The database did not find the text of a page that it should have found, named \"$1\" $2.\n\nThis is usually caused by following an outdated diff or history link to a page that has been deleted.\n\nIf this is not the case, you may have found a bug in the software.\nPlease report this to an [[Special:ListUsers/sysop|administrator]], making note of the URL.",
        "missingarticle-rev": "(revision#: $1)",
-       "missingarticle-diff": "(Diff: $1, $2)",
+       "missingarticle-diff": "(ꯈꯦꯠ: $1, $2)",
        "readonly_lag": "ꯗꯇꯥꯕꯦꯁ ꯁꯤ ꯃꯁꯥ ꯃꯇꯣꯝꯇꯥ ꯊꯤꯡꯖꯤꯟꯂꯦ while the slave database servers catch up to the master",
        "nonwrite-api-promise-error": "The 'Promise-Non-Write-API-Action' HTTP header was sent but the request was to an API write module.",
        "internalerror": "ꯃꯅꯨꯡꯒꯤ ꯑꯁꯣꯏꯕꯥ",
        "nocookieslogin": "{{SITENAME}} uses cookies to log in users.\nYou have cookies disabled.\nPlease enable them and try again.",
        "loginsuccesstitle": "ꯂꯣꯒ ꯏꯟ",
        "login-userblocked": "ꯃꯁꯤꯒꯤ ꯁꯤꯖꯤꯟꯅꯔꯤꯕꯥꯁꯤ ꯊꯤꯡꯖꯤꯟꯈꯔꯦ? ꯂꯣꯒ ꯏꯟ ꯌꯥꯔꯥꯔꯣꯏ",
-       "passwordtooshort": "ê¯\84ꯥê¯\81ê¯\8bê¯\94ê¯\87 ê¯\81ꯤ ê¯\8cꯥê¯\9dê¯\97ê¯\94ê¯\95ê¯\97ꯥ ê¯\83ê¯\81ꯤ ê¯\88ê¯\94ꯥê¯\81ꯤ ê¯\8cꯥê¯\8eê¯\92ê¯\97ê¯\95ê¯\85ꯤ {{PLURAL:$1|1 character|$1 characters}}.",
+       "passwordtooshort": "ê¯\84ꯥê¯\81ê¯\8b꯭ê¯\94ꯠ ê¯\81ꯤ ê¯\8cꯥê¯\9dê¯\97ê¯\94ê¯\95ê¯\97ꯥ {{PLURAL:$1| ê¯\83ê¯\8cꯦê¯\9b ê¯±|$1 ê¯\83ê¯\8cꯦê¯\9b ê¯\88ê¯\94ꯥ}} ê¯\8cꯥê¯\8eê¯\92ê¯\97ê¯\95ê¯\85ꯤ ê¯«",
        "mailmypassword": "ꯄꯥꯁꯋ꯭ꯔꯗ ꯁꯦꯝꯗꯣꯛꯄꯥ",
        "passwordremindertitle": " {{SITENAME}} ꯁꯤꯒꯤ ꯑꯅꯧꯕꯥ ꯉꯥꯏꯍꯥꯛꯀꯤ ꯑꯣꯏꯕꯥ ꯄꯥꯁꯋꯔꯇ",
        "passwordremindertext": "Someone (from IP address $1) requested a new\npassword for {{SITENAME}} ($4). A temporary password for user\n\"$2\" has been created and was set to \"$3\". If this was your\nintent, you will need to log in and choose a new password now.\nYour temporary password will expire in {{PLURAL:$5|one day|$5 days}}.\n\nIf someone else made this request, or if you have remembered your password,\nand you no longer wish to change it, you may ignore this message and\ncontinue using your old password.",
        "accountcreated": "ꯑꯦꯀꯥꯎꯟ ꯁꯥꯈꯔꯦ",
        "loginlanguagelabel": "ꯂꯣꯟ:$1",
        "pt-login": "ꯆꯪꯁꯤꯟꯕ ꯃꯅꯨꯪꯗ",
-       "pt-login-button": "Chang Sinba",
+       "pt-login-button": "ꯃꯅꯨꯡ ꯆꯪ-ꯁꯤꯟꯕ",
        "pt-login-continue-button": "ꯂꯣꯘ ꯏꯟ ꯃꯈꯥ ꯆꯠꯊꯧ",
        "pt-createaccount": "ꯑꯩꯒꯤ ꯑꯣꯏꯕꯥ ꯑꯃꯥ ꯁꯦꯝꯕꯥ",
        "pt-userlogout": "ꯊꯣꯛꯂꯛꯄꯥ",
        "botpasswords": "ꯕꯣꯠ ꯄꯥꯁꯋ꯭ꯔꯠꯁꯤꯡ",
        "botpasswords-summary": "<em>Bot passwords</em> allow access to a user account via the API without using the account's main login credentials. The user rights available when logged in with a bot password may be restricted.\n\nIf you don't know why you might want to do this, you should probably not do it. No one should ever ask you to generate one of these and give it to them.",
        "botpasswords-disabled": "ꯕꯣꯠ ꯄꯥꯁꯋ꯭ꯔꯠꯁꯤꯡ ꯌꯥꯍꯟꯗꯕꯥ",
+       "botpasswords-createnew": "ꯑꯅꯧꯕ ꯕꯣꯠꯀꯤ ꯄꯥꯁꯋ꯭ꯔꯠ ꯁꯦꯝꯃꯨ",
+       "botpasswords-editexisting": "ꯍꯥꯟꯅꯗꯒꯤ ꯂꯩꯔꯕ ꯕꯣꯠꯀꯤ ꯄꯥꯁꯋ꯭ꯔꯠ ꯑꯗꯨ ꯁꯦꯝꯒꯠꯂꯨ",
+       "botpasswords-label-needsreset": "(ꯄꯥꯁꯋ꯭ꯔꯠ ꯅꯧꯅꯥ ꯁꯦꯝꯇꯣꯛꯇꯕ ꯌꯥꯗꯔꯦ)",
        "botpasswords-label-appid": "ꯕꯣꯠ ꯃꯃꯤꯡ:",
        "botpasswords-label-create": "ꯁꯥꯕꯥ",
        "botpasswords-label-update": "ꯅꯧꯊꯣꯛꯍꯟꯕꯥ",
        "botpasswords-label-resetpassword": "ꯄꯥꯁꯋ꯭ꯔꯠ ꯑꯃꯨꯛ ꯍꯟꯅꯥ ꯁꯦꯝꯗꯣꯛꯄꯥ",
        "botpasswords-label-grants": "ꯆꯥꯟꯅꯕꯥ ꯌꯥꯕꯥ ꯑꯌꯥꯕꯁꯤꯡ:",
        "botpasswords-help-grants": "Grants allow access to rights already held by your user account. Enabling a grant here does not provide access to any rights that your user account would not otherwise have. See the [[Special:ListGrants|table of grants]] for more information.",
+       "botpasswords-label-grants-column": "ꯑꯌꯥꯕ ꯄꯤꯔꯦ",
+       "botpasswords-bad-appid": "\"$1\" ꯀꯧꯕꯥ ꯕꯣꯠ ꯂꯩꯇꯦ ꯫",
+       "botpasswords-insert-failed": "\"$1\" ꯕꯣꯠ ꯃꯃꯤꯡꯁꯤ ꯍꯥꯞꯆꯤꯟꯕ ꯀꯥꯎꯔꯦ ꯫ ꯍꯥꯟꯅꯥ ꯍꯥꯞꯆꯤꯟꯈꯔꯕ?",
        "botpasswords-created-title": "ꯕꯣꯠ ꯄꯥꯁꯋ꯭ꯔꯠ ꯁꯥꯈꯔꯦ",
        "botpasswords-deleted-title": "ꯕꯣꯠ ꯄꯥꯁꯋ꯭ꯔꯠ ꯀꯛꯊꯠꯈꯔꯦ",
        "resetpass_forbidden": "ꯄꯥꯁꯋ꯭ꯔꯠ ꯍꯣꯡꯗꯣꯛꯄꯥ ꯌꯥꯔꯣꯏ",
        "resetpass_forbidden-reason": "$1:ꯄꯥꯁꯋ꯭ꯔꯠꯁꯤꯡ ꯍꯣꯡꯗꯣꯛꯄꯥ ꯌꯥꯔꯣꯏ",
        "resetpass-no-info": "ꯃꯁꯤꯒꯤ ꯂꯃꯥꯏꯁꯤ ꯍꯦꯛꯇꯥ ꯌꯧꯅꯕꯥ ꯅꯪ ꯁꯣꯏꯗꯅꯥ ꯂꯣꯒ ꯏꯟ ꯇꯧꯒꯗꯕꯅꯤ ꯫",
        "resetpass-submit-loggedin": "ꯄꯥꯁꯋ꯭ꯔꯠ ꯍꯣꯡꯗꯣꯛꯄꯥ",
-       "resetpass-submit-cancel": "ê¯\80ê¯\9bê¯\8aꯠê¯\84ꯥ",
+       "resetpass-submit-cancel": "ê¯\87ꯣê¯\9bê¯\84",
        "resetpass-wrong-oldpass": "ꯃꯇꯝ ꯈꯔꯥꯒꯤ ꯑꯣꯏꯅꯥ ꯀꯔꯤꯝꯇꯥ ꯌꯥꯎꯗꯦ  ꯅꯠꯇꯔꯒꯥ ꯍꯧꯖꯤꯛꯀꯤ ꯄꯥꯁꯋ꯭ꯔꯠ ꯫ ꯅꯪꯅꯥ ꯄꯥꯁꯋ꯭ꯔꯠ ꯍꯥꯟꯅꯗꯒꯤ ꯍꯣꯡꯂꯝꯂꯅꯤ ꯅꯠꯇꯔꯒꯥ ꯍꯪꯒꯠꯂꯨ ꯉꯥꯏꯍꯥꯛꯀꯤ ꯑꯣꯏꯕꯥ ꯄꯥꯁꯋ꯭ꯔꯠ ꯫",
        "resetpass-temp-password": "ꯉꯩꯍꯥꯛꯀꯤ ꯑꯣꯏꯕꯥ ꯄꯥꯁꯋ꯭ꯔꯠ:",
        "resetpass-expired": "ꯅꯪꯒꯤ ꯄꯥꯁꯋ꯭ꯔꯇ ꯁꯤ ꯌꯥꯗꯔꯦ ꯫ ꯆꯥꯟꯕꯤꯗꯨꯅ ꯑꯅꯧꯕ ꯱ ꯁꯦꯝꯃꯣ ꯂꯣꯒ ꯏꯟ ꯇꯧꯅꯕ ꯫",
        "italic_tip": "ꯋꯥꯔꯦꯡ ꯐꯩꯅꯥ ꯏꯕꯥ",
        "link_sample": "ꯑꯄꯤꯕ ꯃꯃꯤꯡ ꯁꯝꯅꯐꯝ",
        "link_tip": "ꯃꯅꯨꯡꯒꯥ ꯁꯝꯅꯐꯝ",
-       "extlink_sample": "http://www.example.com link title",
+       "extlink_sample": "http://www.example.com ꯁꯝꯅꯐꯝꯒꯤꯃꯃꯤꯡ",
        "extlink_tip": "ꯑꯇꯣꯞꯄꯥꯒꯥ ꯁꯝꯅꯐꯝ (ꯀꯥꯎꯒꯅꯨ http:// prefix)",
        "headline_sample": "ꯃꯀꯣꯛꯀꯤ ꯋꯥꯔꯦꯡ ꯄꯥꯔꯦꯡ",
        "headline_tip": "꯲ ꯁꯨꯕꯥ ꯃꯀꯣꯛꯀꯤ ꯄꯔꯦꯡ",
        "mergehistory-list": "ꯄꯎꯋꯥꯔꯤ ꯁꯦꯝꯒꯠꯄꯗꯨ ꯑꯃꯁꯨ ꯑꯃꯁꯨ ꯆꯪꯍꯟꯕ",
        "mergehistory-fail-invalid-source": "ꯂꯧꯔꯛꯐꯝ ꯂꯃꯥꯏꯁꯤ ꯂꯩꯇꯦ ꯫",
        "mergehistory-fail-invalid-dest": "ꯂꯝꯊꯨꯡꯐꯝ ꯂꯃꯥꯏꯁꯤ ꯂꯩꯇꯦ ꯫",
+       "mergehistory-autocomment": "[[:$1]] ꯁꯤ [[:$2]]ꯗꯥ ꯄꯨꯟꯁꯤꯟꯂꯨ",
        "mergehistory-reason": "ꯃꯔꯝ:",
        "mergelog": "ꯂꯣꯒ ꯄꯨꯟꯁꯤꯟꯕ",
        "history-title": "\"$1\" ꯒꯤ ꯔꯤꯚꯤꯖꯟ ꯄꯨꯋꯥꯔꯤ",
        "search-result-size": "$1 ({{PLURAL:$2|1 word|$2 words}})",
        "search-result-category-size": "{{PLURAL:$1|1 ꯈꯣꯡꯕꯨ|$1 ꯈꯣꯡꯕꯨꯁꯤꯡ}} ({{PLURAL:$2|1 ꯃꯆꯥꯈꯥꯏꯕ ꯃꯆꯥ|$2 ꯃꯆꯥꯈꯥꯏꯕ ꯃꯆꯥꯁꯤꯡ}}, {{PLURAL:$3|1 ꯐꯥꯏꯜ|$3 ꯐꯥꯏꯜꯁꯤꯡ}})",
        "search-redirect": "($1 ꯗꯒꯤ ꯔꯤꯗꯥꯏꯔꯦꯛ)",
-       "search-section": "(section $1)",
+       "search-section": "(ꯁꯔꯨꯛ $1)",
        "search-category": "(ꯃꯆꯥꯈꯥꯏꯕ $1)",
        "search-file-match": "(ꯐꯥꯏꯜ ꯒꯤ ꯌꯥꯎꯕꯁꯤ ꯆꯥꯟꯅꯔꯦ)",
        "search-suggest": "$1 ꯁꯤꯔꯥ ꯅꯪꯅꯥ ꯍꯥꯏꯅꯤꯡꯂꯤꯕꯥꯁꯤ",
index 5fa694e..3830cc2 100644 (file)
        "permanentlink": "Permanente koppeling",
        "permanentlink-revid": "Versienummer",
        "permanentlink-submit": "Naar versie gaan",
+       "newsection": "Nieuw kopje",
+       "newsection-page": "Doelpagina",
+       "newsection-submit": "Naar pagina gaan",
        "dberr-problems": "Onze excuses. Deze site ondervindt op het moment technische problemen.",
        "dberr-again": "Wacht een aantal minuten en probeer het daarna opnieuw.",
        "dberr-info": "(Kan geen toegang krijgen tot de database: $1)",
index a031259..2cadeda 100644 (file)
        "right-reupload": "ߛߋ߲߬ߠߊ߬ ߞߐߕߐ߮ ߖߏ߬ߛߌ߬",
        "right-reupload-own": "ߌ ߖߍ߬ߘߍ ߟߊ߫ ߞߐߕߐ߯ ߟߊߦߟߍ߬ߣߍ߲ ߠߎ߬ ߖߏ߰ߛߌ߬",
        "right-upload_by_url": "ߞߐߕߐ߮ ߘߏ߫ ߟߊߦߟߍ߬ ߞߊ߬ ߓߐ߫ URL ߘߐ߫",
+       "right-apihighlimits": "API ߡߊߢߌߣߌ߲ߣߍ߲ ߛߊ߲ߘߐߕߊ ߟߊߓߊ߯ߙߊ߫",
        "right-writeapi": "ߛߓߍߟߌ API ߟߊߓߊ߯ߙߊ߫",
        "right-delete": "ߞߐߜߍ ߟߎ߬ ߖߏ߰ߛߌ߬",
        "right-bigdelete": "ߞߐߜߍ߫ ߘߝߐ߬ ߓߟߋ߬ߓߟߋ߬ߡߊ ߟߎ߬ ߖߏ߰ߛߌ߬",
+       "right-deleterevision": "ߞߐߜߍ ߟߎ߬ ߟߢߊ߬ߟߌ ߘߊ߲߬ߠߊߕߍ߰ߣߍ߲ ߠߎ߬ ߖߏ߬ߛߌ߬ߟߌ ߣߌ߫ ߖߏ߬ߛߌ߬ߣߍ߲ ߓߐߟߌ.",
        "right-browsearchive": "ߞߐߜߍ߫ ߖߏ߰ߛߌ߬ߣߍ߲ ߠߎ߬ ߢߌߣߌ߲߫",
        "right-undelete": "ߞߐߜߍ ߖߏ߰ߛߌ߬ߣߍ߲ ߓߐ߫",
        "right-suppressionlog": "ߘߎ߲߬ߘߎ߬ߡߊ߬ ߘߎ߲ߛߓߍ ߟߎ߬ ߦߋ߫",
        "right-siteadmin": "ߓߟߏߡߟߊ ߝߊ߲ ߣߍ߰ ߊ߬ ߣߌ߫ ߞߵߊ߬ ߟߊߞߊ߬",
        "right-sendemail": "ߢߎߡߍߙߋ߲ ߗߋ߫ ߟߊ߬ߓߊ߰ߙߊ߬ߟߊ ߘߏ ߟߎ߬ ߡߊ߬",
        "grant-generic": "\"$1\" ߞߌߣߌ߲߫ ߝߍ߫ ߝߎߝߎ",
+       "grant-group-page-interaction": "ߞߐߜߍ ߟߎ߬ ߟߊ߫ ߞߏߢߐ߲߯ߦߊ",
        "grant-group-email": "ߢߎߡߍߙߋ߲ ߗߋ߫",
+       "grant-blockusers": "ߟߊ߬ߓߊ߰ߙߊ߬ߟߊ ߟߎ߬ ߓߊ߬ߟߌ ߣߴߊ߬ߟߎ߬ ߓߊ߬ߟߌ߬ߣߍ߲ ߓߐߟߌ",
        "grant-createaccount": "ߖߊ߬ߕߋ߬ߘߊ ߘߏ߫ ߛߌ߲ߘߌ߫",
        "grant-createeditmovepage": "ߞߐߜߍ ߛߌ߲ߘߌ߫߸ ߡߊߦߟߍ߬ߡߊ߲߫߸ ߊ߬ ߣߌ߫ ߞߵߊ߬ ߛߋ߲߬ߓߐ߫",
        "grant-editinterface": "MediaWiki ߕߐ߯ߛߓߍ ߞߣߍ ߡߊߦߟߍ߬ߡߊ߲߫ ߊ߬ ߣߌ߫ ߞߍߦߙߐ ߞߣߍ/ ߟߊ߬ߓߊ߰ߙߊ߬ߟߊ JSON",
        "grant-editpage": "ߞߐߜߍ߫ ߓߍߓߊ߮ ߡߊߦߟߍ߬ߡߊ߲߫",
        "grant-editprotected": "ߞߐߜߍ߫ ߟߊߞߊ߲ߘߊߣߍ߲ ߡߊߦߟߍ߬ߡߊ߲߫",
        "grant-highvolume": "ߢߊ߲ߞߊ߲-ߛߊ߲ߘߐߕߊ ߡߊߦߟߍߡߊ߲ ߦߴߌ ߘߐ߫",
+       "grant-patrol": "ߞߐߜߍ ߟߎ߬ ߓߍ߬ߙߍ߲߬ߓߍ߬ߙߍ߲߬ߠߌ߲ ߡߊ߬ߦߟߍ߬ߡߊ߲߬ߠߌ߲",
        "grant-privateinfo": "ߘߎ߲߬ߘߎ߬ߡߊ߬ ߞߌߓߊߙߏߦߊ ߟߊߛߐ߬ߘߐ߲߬",
        "grant-protect": "ߞߐߜߍ ߟߎ߬ ߟߊߞߊ߲ߘߊ߫ ߊ߬ ߣߌ߫ ߞߵߊ߬ߟߎ߬ ߟߊߞߊ߲ߘߊߣߍ߲ ߓߐ߫",
+       "grant-rollback": "ߟߊ߬ߞߐ߬ߛߊ߬ߦߌ߲߬ߠߌ߲ ߡߝߊ߬ߟߋ߲߬ߠߌ߲ ߠߎ߬ ߞߐߜߍ ߘߐ߫",
        "grant-sendemail": "ߢߎߡߍߙߋ߲ ߗߋ߫ ߟߊ߬ߓߊ߰ߙߊ߬ߟߊ ߘߏ ߟߎ߬ ߡߊ߬",
        "grant-uploadeditmovefile": "ߞߐߕߐ߮ ߟߊߦߟߍ߬߸ ߣߐ߬ߘߐߓߌ߬ߟߊ߬߸ ߊ߬ ߣߌ߫ ߞߵߊ߬ ߛߋ߲߬ߓߐ߫",
        "grant-uploadfile": "ߞߐߕߐ߮ ߞߎߘߊ߫ ߟߊߦߟߍ߬",
        "action-protect": "ߞߐߜߍ ߣߌ߲߬ ߟߊ߬ߞߊ߲߬ߘߊ߬ߟߌ߬ ߞߛߊߞߊ ߡߊߝߊ߬ߟߋ߲߬",
        "action-import": "ߞߐߜߍ ߟߎ߬ ߟߊߛߣߍ߫ ߞߊ߬ ߓߐ߫ ߥߞߌ ߕߐ߭ ߟߎ߬ ߘߐ߫",
        "action-importupload": "ߞߐߜߍ ߟߎ߬ ߟߊߛߣߍ߫ ߞߊ߬ ߓߐ߫ ߞߐߕߐ߯ ߟߊߦߟߍ߬ߣߍ߲ ߠߎ߬ ߘߐ߫",
+       "action-patrol": "ߟߊ߬ߓߊ߰ߙߊ߬ߟߊ ߘߏ ߟߎ߬ ߟߊ߫ ߡߊ߬ߦߟߍ߬ߡߊ߲߬ߠߌ߲ ߠߎ߬ ߣߐ߬ߣߐ߬ ߓߍ߬ߙߍ߲߬ߓߍ߬ߙߍ߲߬ߣߍ߲ ߘߌ߫",
+       "action-autopatrol": "ߌ ߟߊ߫ ߡߊ߬ߦߟߍ߬ߡߊ߲߬ߣߍ߲ ߠߎ߬ ߣߐ߬ߣߐ߬ߣߍ߲߫ ߓߍ߬ߙߍ߲߬ߓߍ߬ߙߍ߲߬ߣߍ߲ ߘߌ߫؟",
        "action-unwatchedpages": "ߞߐߜߍ߫ ߜߋ߬ߟߎ߲߬ߓߊߟߌ ߟߎ߬ ߛߙߍߘߍ ߦߋ߫",
        "action-mergehistory": "ߞߐߜߍ ߣߌ߲߬ ߠߊ߫ ߘߐ߬ߝߐ ߟߎ߬ ߞߍߢߐ߲߮ߞߊ߲߬",
        "action-userrights": "ߟߊ߬ߓߊ߰ߙߊ߬ߟߌ߬ ߤߊߞߍ ߓߍ߯ ߡߊߦߟߍ߬ߡߊ߲߫",
        "action-viewmyprivateinfo": "ߌ ߘߎ߲߬ߘߎ߬ߡߊ߬ ߞߌߓߊߙߏߦߊ ߟߎ߬ ߦߋ߫",
        "action-editmyprivateinfo": "ߌ ߘߎ߲߬ߘߎ߬ߡߊ߬ ߞߌߓߊߙߏߦߊ ߡߊߦߟߍ߬ߡߊ߲߫",
        "action-editcontentmodel": "ߞߐߜߍ ߣߌ߲߬ ߞߣߐߘߐ ߛߎ߮ߦߊ ߡߊߦߟߍ߬ߡߊ߲߫",
+       "action-managechangetags": "ߘߎ߲ߛߓߍ ߟߎ߬ ߛߌ߲ߘߟߌ ߣߴߊ߬ߟߎ߬ ߓߐߒߠߊߟߌ",
+       "action-applychangetags": "ߘߎ߲ߛߓߍ ߟߎ߬ ߟߊߓߊ߯ߙߊ߫ ߌ ߟߊ߫ ߡߝߊ߬ߟߋ߲߬ߠߌ߲ ߠߎ߬ ߞߊ߲߬",
+       "action-deletechangetags": "ߘߎ߲ߛߓߍ ߟߎ߬ ߖߏ߬ߛߌ߬ ߞߊ߬ ߓߐ߫ ߓߟߏߡߟߊ ߝߊ߲ ߞߊ߲߬",
        "action-editusercss": "ߟߊ߬ߓߊ߰ߙߊ߬ߟߊ ߘߏ ߟߎ߬ CSS ߟߊ߬ߓߊ߰ߙߊ߬ߟߌ߬ ߞߐߕߐ߮ ߡߊߦߟߍ߬ߡߊ߲߫",
        "action-edituserjson": "ߟߊ߬ߓߊ߰ߙߊ߬ߟߊ ߘߏ ߟߎ߬ ߟߊ߫ JSON ߞߐߕߐ߮ ߟߎ߬ ߡߊߦߟߍ߬ߡߊ߲߫",
        "action-edituserjs": "ߟߊ߬ߓߊ߰ߙߊ߬ߟߊ ߘߏ ߟߎ߬ ߟߊ߫ JavaScript ߞߐߕߐ߮ ߟߎ߬ ߡߊߦߟߍ߬ߡߊ߲߫",
        "rcfilters-filter-editsbyself-description": "ߌ ߖߘߍ߬ߞߊ߬ߣߌ߲߬ ߓߟߏߓߌߟߊߢߐ߲߯ߞߊ߲.",
        "rcfilters-filter-editsbyother-label": "ߘߏ ߟߎ߬ ߟߊ߫ ߡߊ߬ߦߟߍ߬ߡߊ߲߬ߠߌ߲ ߠߎ߬",
        "rcfilters-filter-editsbyother-description": "ߡߊ߬ߦߟߍ߬ߡߊ߲߬ߠߌ߲ ߓߍ߯ ߝߴߌ ߕߊ ߟߎ߬.",
+       "rcfilters-filtergroup-user-experience-level": "ߟߊ߬ߓߊ߰ߙߊ߬ߟߊ ߟߎ߬ ߕߐ߯ߛߓߍߟߌ ߣߌ߫ ߖߋ߬ߙߌ߲߬ߒ߬ߕߋ߬ߦߊ",
        "rcfilters-filter-user-experience-level-registered-label": "ߕߐ߯ߛߓߍߣߍ߲",
        "rcfilters-filter-user-experience-level-registered-description": "ߡߊ߬ߦߟߍ߬ߡߊ߲߬ߠߊ߫ ߜߊ߲߬ߞߎ߲߬ߣߍ߲ ߠߎ߬",
        "rcfilters-filter-user-experience-level-unregistered-label": "ߕߐ߯ߛߓߍߓߊߟߌ",
        "rcfilters-filter-user-experience-level-unregistered-description": "ߡߊ߬ߦߟߍ߬ߡߊ߲߬ߠߊ ߡߍ߲ ߜߊ߲߬ߞߎ߲߬ߣߍ߲߬ ߕߍ߫.",
+       "rcfilters-filter-user-experience-level-newcomer-label": "ߣߊ߬ߓߊ߰ߕߐ߬ ߞߎߘߊ ߟߎ߬",
+       "rcfilters-filter-user-experience-level-newcomer-description": "ߟߊ߬ߓߊ߰ߙߊ߬ߟߊ߫ ߕߐ߯ߛߓߍߣߍ߲ ߡߍ߲ ߠߊ߫ ߡߊ߬ߦߟߍ߬ߡߊ߲߬ߠߌ߲ ߡߊ߬ ߕߊ߬ߡߌ߲߬ ߁߀ ߞߊ߲߬ ߥߟߴߊ߬ߟߎ߬ ߟߊ߫ ߓߊ߯ߙߊ ߡߊ߫ ߕߊ߬ߡߌ߲߫ ߕߟߋ߬ ߄ ߞߊ߲߬.",
        "rcfilters-filter-user-experience-level-learner-label": "ߞߊ߬ߙߊ߲߬ߠߊ ߟߎ߬",
+       "rcfilters-filter-user-experience-level-learner-description": "ߟߊ߬ߓߊ߰ߙߊ߬ߟߊ߫ ߕߐ߯ߛߓߍߣߍ߲ ߡߍ߲ ߠߊ߫ ߖߋ߬ߙߌ߲߬ߒ߬ߕߋ߬ߦߊ ߦߋ߫ ߣߊ߬ߓߊ߰ߕߐ߬ ߞߎߘߊ ߣߌ߫ ߟߊ߬ߓߊ߰ߙߊ߬ߟߊ߫ ߖߊ߬ߙߌ߲߬ߒߕߋ ߟߎ߬ ߕߍ߫.",
        "rcfilters-filter-user-experience-level-experienced-label": "ߟߊ߬ߓߊ߰ߙߊ߬ߟߊ߫ ߖߊߙߌ߲ߒߕߋ",
        "rcfilters-filter-user-experience-level-experienced-description": "ߟߊ߬ߓߊ߰ߙߊ߬ߟߊ߬ ߕߐ߯ߛߓߍߣߍ߲ ߡߍ߲ ߠߊ߫ ߡߊ߬ߦߟߍ߬ߡߊ߲߬ߠߌ߲ ߓߘߊ߫ ߕߊ߬ߡߌ߲߬ ߅߀߀ ߞߊ߲߬ ߕߟߋ߬ ߃߀ ߓߊ߯ߙߊ߫ ߣߐ.",
        "rcfilters-filtergroup-automated": "ߞߍߒߖߘߍߦߋ߫ ߓߟߏߓߌߟߊߢߐ߲߯ߞߊ߲",
        "rcfilters-filter-humans-label": "ߡߐ߱ (ߓߏߕ  ߕߍ߫)",
        "rcfilters-filter-humans-description": "ߡߐ߱ ߡߊ߬ߦߟߍ߬ߡߊ߲߬ߠߊ ߡߊ߬ߦߟߍ߬ߡߊ߲߬ ߣߐ.",
        "rcfilters-filter-reviewstatus-unpatrolled-label": "ߓߍ߬ߙߍ߲߬ߓߍ߬ߙߍ߲߬ߓߊߟߌ",
+       "rcfilters-filter-reviewstatus-auto-label": "ߞߍߒߖߘߍߦߋ߫ ߓߍ߬ߙߍ߲߬ߓߍ߬ߙߍ߲߬ߣߍ߲",
        "rcfilters-filter-minor-label": "ߡߊ߬ߦߟߍ߬ߡߊ߲߬ߠߌ߲߬ ߘߋ߬ߣߍ߲ ߠߎ߬",
        "rcfilters-filter-major-label": "ߡߊ߬ߦߟߍ߬ߡߊ߲߬ߠߌ߲߬ ߘߋ߬ߣߍ߲ ߕߍ߫",
        "rcfilters-filter-major-description": "ߡߊ߬ߦߟߍ߬ߡߊ߲߬ߠߌ߲ ߕߍ߫ ߘߎ߲ߛߓߍߡߊ߫ ߘߋߣߍ߲ ߝߋ߲߫ ߘߌ߫.",
        "rcfilters-filter-previousrevision-description": "ߡߊ߬ߦߟߍ߬ߡߊ߲߬ߠߌ߲ ߠߎ߬ ߓߍ߯ ߡߍ߲ ߠߎ߬ ߕߍ߫ \"ߟߢߊ߬ߟߌ߬ ߞߐ߯ߟߕߊ߫\" ߘߌ߫.",
        "rcfilters-filter-excluded": "ߊ߬ ߓߘߊ߫ ߟߊߘߏ߲߬ ߊ߬ ߘߐ߫",
        "rcfilters-tag-prefix-namespace-inverted": "<strong>:ߍ߲߬ߍ߲߫</strong> $1",
+       "rcfilters-exclude-button-off": "ߤߊߟߌ߬ ߓߊߕߐ߬ߡߐ߲߬ߣߍ߲",
+       "rcfilters-exclude-button-on": "ߓߊߕߐߡߐ߲ߣߍ߲ ߠߎ߬ ߟߊߘߏ߲߬",
+       "rcfilters-view-tags": "ߞߏ߲߭ ߡߊߦߟߍ߬ߡߊ߲߬ߠߌ߲",
        "rcfilters-view-namespaces-tooltip": "ߛߍ߲ߛߍ߲ߟߊ߲ ߞߐߝߟߌ ߕߐ߯ߛߓߍ ߞߣߍ ߡߊ߬",
        "rcfilters-view-tags-tooltip": "ߛߍ߲ߛߍ߲ߟߊ߲ ߞߐߝߟߌ ߘߎ߲ߛߓߍ ߡߊߦߟߍ߬ߡߊ߲߬ߠߌ߲ ߡߊ߬",
        "rcfilters-view-return-to-default-tooltip": "ߌ ߞߐߛߊ߬ߦߌ߬ ߛߍ߲ߛߍ߲ߟߊ߲ ߓߏ߬ߟߏ߲߬ߘߊ ߢߣߊߕߊߟߌ ߡߊ߬",
        "license": "ߟߊ߬ߘߌ߬ߢߍ߬ߟߌ ߦߴߌ ߘߐ߫:",
        "license-header": "ߟߊ߬ߘߌ߬ߢߍ߬ߟߌ ߦߴߌ ߘߐ߫",
        "nolicense": "ߊ߬ ߡߊ߫ ߓߊߕߐ߬ߡߐ߲߬",
+       "upload_source_file": "(ߌ ߟߊ߫ ߞߐߕߐ߯ ߛߎߥߊ߲ߘߌߣߍ߲ ߠߎ߬ ߞߊ߬ ߝߘߊ߫ ߌ ߟߊ߫ ߕߟߋ߬ߓߊ߮ ߟߊ߫)",
        "listfiles-delete": "ߊ߬ ߖߏ߬ߛߌ߬",
+       "listfiles-summary": "ߞߐߜߍ߫ ߓߟߏߡߊߞߊ߬ߣߍ߲ ߣߌ߲߬ ߦߴߌ ߟߊ߫ ߞߐߕߐ߯ ߟߊߦߟߍ߬ߣߍ߲ ߠߎ߬ ߓߍ߯ ߟߋ߬ ߦߌ߬ߘߊ߬ ߟߊ߫",
        "listfiles_search_for": "ߡߍ߲ߕߊߦߋߕߊ ߕߐ߮ ߢߌߣߌ߲ߠߌ߲:",
        "listfiles-userdoesnotexist": "ߟߊ߬ߓߊ߰ߙߊ߬ ߖߊߕߋߘߊ \"$1\" ߟߊߞߎ߲߬ߘߎ߬ߣߍ߲߫ ߕߍ߫.",
        "imgfile": "ߞߐߕߐ߮",
        "listfiles_size": "ߢߊ߲ߞߊ߲",
        "listfiles_description": "ߞߊ߲߬ߛߓߍߟߌ",
        "listfiles_count": "ߦߌߟߡߊ",
+       "listfiles-show-all": "ߞߐߕߐ߮ ߦߌߟߡߊ߫ ߞߘߐ߬ߡߊ߲ ߠߎ߬ ߟߊߘߏ߲߬",
+       "listfiles-latestversion": "ߕߋ߲߭ߕߋ߲߭ ߦߌߟߡߊ",
        "listfiles-latestversion-yes": "ߐ߲߬ߐ߲߬ߐ߲߫",
        "listfiles-latestversion-no": "ߊ߬ߦߌ߫",
        "file-anchor-link": "ߞߐߕߐ߮",
        "linkstoimage": "ߞߐߕߐ߮ ߣߌ߲߬ {{PLURAL:$1|ߞߐߜߍ ߟߎ߬|$1 ߞߐߜߍ ߟߎ߬}}:",
        "linkstoimage-more": "ߞߐߕߐ߮ ߣߌ߲߬ $1 {{PLURAL:$1|page uses|pages use}} ߠߊߓߊ߯ߙߊߓߊ߮ ߞߊߛߌߦߊ߫.\nߛߙߍߘߍ ߢߌ߲߬ ߠߎ߬ ߦߋ߫ {{PLURAL:$1|first page|first $1 pages}} ߞߐߕߐ߮ ߣߌ߲߬ ߞߋߟߋ߲߫ ߠߊߓߊ߯ߙߊߓߊ߮ ߟߎ߬ ߛߙߍߘߍ ߟߋ߬ ߦߌ߬ߘߊ߬ ߟߊ߫.\nߛߘߌ߬ߜߋ߲߬ [[Special:WhatLinksHere/$2|full list]] ߓߟߏߡߊߞߊ߬ߣߍ߲ ߦߋ߫ ߦߋ߲߬.",
        "nolinkstoimage": " ߞߐߜߍ߫ ߛߌ߫ ߡߊ߫ ߞߐߕߐ߮ ߣߌ߲߬ ߠߊߓߊ߯ߙߊ߫ ߡߎߣߎ߲߬",
+       "morelinkstoimage": "ߞߐߕߐ߮ ߡߍ߲ ߠߎ߬ ߦߋ߫ [[Special:WhatLinksHere/$1|more links]] ߟߎ߫ ߘߐߜߍ߫",
        "linkstoimage-redirect": "$1 (ߞߐߕߐ߯ ߟߊߞߎ߲߬ߛߌ߲߬ߣߍ߲߬) $2",
+       "duplicatesoffile": "{{PLURAL: ߞߐߕߐ߮ $1|ߞߐߕߐ߮ ߓߊߟߌߣߍ߲ ߠߋ߬|ߞߐߕߐ߮ $1 ߟߎ߬ ߓߊߟߌߣߍ߲ ߠߋ߬}}  ([[Special:FileDuplicateSearch/$2|more details]]):",
+       "sharedupload": "ߞߐߕߐ߮ ߣߌ߲߬ ߝߘߊߣߍ߲߫ ߦߋ߫ $1 ߊ߬ ߣߴߊ߬ ߘߌ߫ ߛߋ߫ ߟߊߓߊ߯ߙߊ߫ ߟߊ߫ ߖߊ߬ߕߋ߬ߘߐ߬ߛߌ߰ ߜߘߍ߫ ߟߎ߫ ߘߐ߫.",
+       "sharedupload-desc-there": "ߞߐߕߐ߮ ߣߌ߲߬ ߝߘߊߣߍ߲߫ ߦߋ߫ $1 ߟߋ߬ ߟߊ߫߸ ߊ߬ ߣߴߊ߬ ߟߊߓߊ߯ߙߊߣߍ߲߫ ߘߌ߫ ߞߍ߫ ߖߊ߬ߕߋ߬ߘߐ߬ߛߌ߰ ߜߘߍ߫ ߟߎ߫ ߘߐ߫. ߖߊ߰ߣߌ߲߬ ߌ ߦߋ߫ [$2 ߞߐߕߐ߮ ߞߊ߲߬ߛߓߍߟߌ ߞߐߜߍ ߘߐߜߍ߫|ߞߌ߬ߓߊ߬ߙߏ߬ߦߊ߬ ߡߞߊ߬ߝߏ߬ߟߌ߬ ߞߏ ߘߐ߫]",
        "sharedupload-desc-here": "ߘߐ߬ߛߙߋ ߣߌ߲߬ ߦߋ߫ ߦߊ߲߬ ߠߋ߫ $1 ߖߊ߬ߕߋ߬ߘߐ߬ߛߌ߮ ߕߐ߭ ߟߎ߬ ߞߏ߬ߣߌ߲ ߘߌ߫ ߛߴߊ߬ ߟߊߓߊ߯ߙߊ߫ ߟߊ߫. ߊ߬ ߕߐ߯ ߛߓߍߟߌ ߦߙߐ [$2 ߞߐߕߐ߮ ߞߊ߲߬ߛߓߍߟߌ ߞߐߜߍ] ߟߋ߬ ߦߋ߫ ߘߎ߰ߟߊ ߘߐ߫ ߣߌ߲߬.",
        "filepage-nofile": "ߕߐ߮ ߣߌ߲߬ ߞߐߕߐ߯ ߛߎ߯ ߕߍ߫ ߦߋ߲߬",
        "uploadnewversion-linktext": "ߞߐߕߐ߮ ߣߌ߲߬ ߛߎ߯ߦߊ߫ ߞߎߘߊ߫ ߟߊߦߟߍ߬",
        "randomincategory-submit": "ߕߊ߯",
        "randomredirect": "ߓߍ߲߬ߛߋ߲߬ߡߊ߬ ߟߊߞߎ߲ߛߌ߲ߠߌ߲",
        "statistics": "ߖߊ߬ߕߋ߬ߛߎ߬ߓߐ ߟߎ߬",
+       "statistics-header-pages": "ߞߐߜߍ ߖߊ߬ߕߋ߬ߛߎ߬ߓߐ",
+       "statistics-header-edits": "ߖߊ߬ߕߋ߬ߛߎ߬ߓߐ ߡߊߦߟߍ߬ߡߊ߲߫",
+       "statistics-header-users": "ߟߊ߬ߓߊ߰ߙߊ߬ߟߊ ߟߊ߫ ߖߊ߬ߕߋ߬ߛߎ߬ߓߐ",
+       "statistics-header-hooks": "ߖߊ߬ߕߋ߬ߛߎ߬ߓߐ ߕߐ߭ ߟߎ߬",
        "statistics-articles": "ߞߣߐߘߐ߫ ߞߐߜߍ",
        "statistics-pages": "ߞߐߜߍ ߟߎ߬",
        "statistics-pages-desc": "ߞߐߜߍ ߡߍ߲ ߓߍ߯ ߦߋ߫ ߥߞߌ ߞߊ߲߬߸ ߦߏ߫ ߞߎߡߊߢߐ߲߯ߦߊ߫ ߞߐߜߍ߸ ߟߊ߬ߞߎ߲߬ߛߌ߲߬ߠߌ߲߸ ߊ߬ ߣߌ߫.",
        "statistics-files": "ߞߐߕߐ߮ ߟߊߦߟߍ߬ߣߍ߲ ߠߎ߬",
+       "statistics-edits": "ߞߐߜߍ ߡߊߦߟߍ߬ߡߊ߲ ߡߍ߲ ߞߍߣߍ߲߫ ߞߊ߬ߦߌ߯  {{SITENAME}} ߓߘߊ߫ ߢߊߓߐ߫",
        "statistics-edits-average": "ߡߊ߬ߦߟߍ߬ߡߊ߲߬ߠߌ߲ ߡߎ߰ߡߍ ߡߍ߲ ߞߍߣߍ߲߫ ߞߐߜߍ ߡߊ߬",
        "statistics-users": "ߟߊߓߊ߯ߙߊߓߊ߯ ߛߙߍߘߍߦߊߣߍ߲ ߠߎ߬",
+       "statistics-users-active": "ߟߊ߬ߓߊ߰ߙߊ߬ߟߊ ߞߎ߲߬ߞߍ߲ߘߍ",
        "statistics-users-active-desc": "ߟߊ߬ߓߊ߰ߙߊ߬ߟߊ ߡߍ߲ ߠߎ߬ ߝߊߘߌ߲ߧߊ߫ ߘߊ߫ ߞߏ߫ ߘߏ߫ ߞߍ {{PLURAL:$1|ߕߟߋ߬|$1 ߕߋ߬ߟߋ}} ߟߎ߬ ߞߘߐ߫.",
+       "pageswithprop": "ߞߐߜߍ߫ ߕߌ߯ߦߊ ߦߋ߫ ߞߐߜߍ ߡߍ߲ ߠߎ߬ ߓߟߏ߫",
+       "pageswithprop-legend": "ߞߐߜߍ ߕߌ߰ߦߊ ߦߋ߫ ߞߐߜߍ ߡߍ߲ ߠߎ߬ ߓߟߏ߫",
+       "pageswithprop-prop": "ߕߌ߰ߦߊ ߕߐ߮:",
+       "pageswithprop-reverse": "ߊ߬ ߢߣߊߕߊ߬ ߟߊ߬ߞߐ߬ߛߊ߬ߦߌ߲߬ߠߌ߲ ߖߊ߬ߡߊߙߌ ߡߊ߬",
        "pageswithprop-submit": "ߕߊ߯",
        "double-redirect-fixer": "ߟߊ߬ߞߎ߲߬ߛߌ߲߬ߠߌ߲ ߘߐߓߍ߲߬ߟߊ߲",
        "brokenredirects-edit": "ߊ߬ ߡߊߦߟߍ߬ߡߊ߲߬",
        "deadendpagestext": "ߓߌ߬ߟߊ߬ߢߐ߲߰ߡߊ߬ ߕߍ߫ ߞߐߜߍ ߢߌ߲߬ ߠߎ߬ ߣߌ߫ ߞߐߜߍ ߕߐ߭ ߟߎ߬ ߕߍ߫ {{SITENAME}} ߘߐ߫.",
        "protectedpages": "ߞߐߜߍ߫ ߟߊߞߊ߲ߘߊߣߍ߲ ߠߎ߬",
        "protectedpages-filters": "ߛߍ߲ߛߍ߲ߟߊ߲ ߠߎ߬:",
+       "protectedpages-timestamp": "ߕߎ߬ߡߊ ߓߊ߬ߘߌ߬ߟߊ߲",
        "protectedpages-page": "ߞߐߜߍ",
        "protectedpages-expiry": "ߊ߬ ߛߕߊ ߓߘߊ߫ ߝߊ߫",
        "protectedpages-performer": "ߟߊ߬ߓߊ߰ߙߊ߬ߟߊ߫ ߟߊߞߊ߲ߘߊߣߍ߲",
        "nopagetext": "ߌ ߣߊ߬ ߞߏ߲߰ ߞߐߜߍ ߡߍ߲ ߡߊߕߍ߰ ߟߊ߫ ߣߌ߲߬߸ ߊ߬ ߕߴߦߋ߲߬.",
        "pager-newer-n": "{{PLURAL:$1|ߞߎߘߡߊ1|ߞߎߘߡߊ$1}}",
        "pager-older-n": "{{PLURAL:$1|ߞߘߐ߬ߡߊ߲ ߁|ߞߘߐ߬ߡߊ߲ ߠߎ߬ $1}}",
+       "suppress": "ߖߏ߰ߛߌ߬ߟߌ",
        "apihelp": "API ߘߍ߬ߡߍ߲߬ߠߌ߲",
+       "apisandbox": "API ߕߌ߬ߢߍ߬ߞߏ߲ߘߏ",
+       "apisandbox-jsonly": "ߡߊ߬ߞߏ ߦߋ߫ JavaScript ߟߊ߫ ߞߊ߬ API ߕߌ߬ߢߍ߬ߞߏ߲ߘߏ ߟߊߓߊ߯ߙߊ߫",
+       "apisandbox-api-disabled": "API ߓߐߣߍ߲߫ ߦߋ߫ ߞߍߦߙߐ ߟߊ߫.",
        "apisandbox-submit": "ߡߊ߬ߢߌ߬ߣߌ߲߬ߞߊ߬ߟߌ ߘߏ߫ ߞߍ߫",
        "apisandbox-reset": "ߊ߬ ߖߏ߰ߛߌ߬",
        "apisandbox-retry": "ߊ߬ ߡߊߝߍߣߍ߲߫ ߕߎ߲߯",
+       "apisandbox-loading": "ߞߌ߬ߓߊ߬ߙߏ߬ߦߊ ߟߊߢߎ߲ߠߌ߲ ߦߴߌ ߘߐ߫ ߞߊ߬ API ߘߊ߲ߕߊ ߞߏ ߘߐ߫  \"$1\"...",
+       "apisandbox-load-error": "ߝߎ߬ߕߎ߲߬ߕߌ ߘߏ߫ ߓߘߊ߫ ߓߌ߬ߟߵߊ߬ ߘߐ߫ API ߘߊ߲ߕߊ  \"$1\":$2 ߟߊ߬ߢߎ߲߬ߠߌ߲ ߕߎ߬ߡߊ ߟߊ߫",
        "apisandbox-helpurls": "ߘߍ߬ߡߍ߲߬ߠߌ߲ ߛߘߌ߬ߜߋ߲ ߠߎ߬",
        "apisandbox-examples": "ߟߊߒߡߊ߫ ߘߐ߫",
        "apisandbox-dynamic-parameters": "ߟߊ߬ߓߍ߲߬ߢߐ߲߰ߡߊ ߡߞߊ߬ߝߏ߬ߟߌ߬ ߜߘߍ߫",
        "apisandbox-dynamic-parameters-add-label": "ߟߊ߬ߓߍ߲߬ߢߐ߲߰ߡߊ ߟߊߘߏ߲߬",
        "apisandbox-dynamic-parameters-add-placeholder": "ߟߊ߬ߓߍ߲߬ߢߐ߲߰ߡߊ ߕߐ߮",
        "apisandbox-dynamic-error-exists": "ߟߊ߬ߓߍ߲߬ߢߐ߲߰ߡߊ ߕߐ߮  \"$1\" ߦߋ߫ ߦߋ߲߬ ߞߘߐ߬ߡߊ߲߬.",
+       "apisandbox-templated-parameter-reason": "ߣߌ߲߬ [[Special:ApiHelp/main#main/templatedparams|templated parameter]] ߏ߬ ߟߎ߬ ߡߊߛߐ߬ߘߐ߲߬ߠߌ߲ ߓߌ߲ߓߌ߲ߣߍ߲߫ ߦߋ߫ ߦߊ߲߬ {{PLURAL:$1|ߘߙߊߖߊ|ߘߙߊߖߊ ߟߎ߬}} ߠߋ߬ ߡߊ߬ $2 ߘߐ߫.",
        "apisandbox-fetch-token": "ߖߐߟߐ߲ߞߐ ߞߍߒߖߘߍߦߋ߫ ߟߝߊߟߌ",
        "apisandbox-add-multi": "ߟߊ߬ߘߏ߲߬ߠߌ߲",
        "apisandbox-results": "ߞߐߖߋߓߌ ߟߎ߬",
        "all-logs-page": "ߝߘߏ߬ߓߊ߬ ߜߊ߲ߞߎ߲ߠߌ߲ ߠߎ߬ ߓߍ߯",
        "alllogstext": "ߓߟߏߞߘߐ߫ ߘߐߛߙߋ ߡߎ߰ߡߍ ߦߌ߬ߘߊ߬ߟߌ ߣߌ߲߬ ߞߣߐ߫ {{SITENAME}}.\nߌ ߘߌ߫ ߛߋ߫ ߛߙߍߘߍ ߘߊ߲߬ߠߊߕߍ߰ ߟߊ߫ ߓߘߍߞߍ߭ ߞߊ߬ ߢߊ߬߸ ߏ߬ ߛߋ߲߬ߝߍ߬ ߞߊ߬ ߘߐ߬ߛߙߋ ߛߎ߯ߦߊ ߡߊߡߌ߬ߘߊ߬߸ ߊ߬ ߣߌ߫ ߟߊߓߊ߯ߙߟߊ ߕߐ߮ (ߛߏ߬ߓߌ߬ߟߊ߲߬ߘߌ ߟߋ߬ ߛߓߍߘߋ߲ ߗߏ߯ߦߊ ߝߍ߬)߸ ߥߟߴߊ߬ ߥߟߏߣߍ߲߫ ߞߐߜߍ ߡߍ߲ ߞߊ߲߬ (ߛߏ߬ߓߌ߬ߟߊ߲߬ߘߌ ߟߋ߬ ߝߣߊ߫ ߛߓߍߘߋ߲ ߠߎ߬ ߗߏ߯ߦߊ ߝߍ߬).",
        "logempty": "ߞߍߞߏ ߛߌ߫ ߣߌ߫ ߘߐ߬ߛߙߋ ߡߊ ߓߍ߲߬ ߢߐ߲߮ ߡߊ߬.",
+       "log-title-wildcard": "ߞߎ߲߬ߕߐ߮ ߡߍ߲ ߠߎ߬ ߘߊߡߌ߬ߣߊ߬ߣߍ߲߫ ߛߓߍߟߌ ߣߌ߲߬ ߡߊ߬ ߏ߬ ߟߎ߬ ߢߌߣߌ߲߫",
+       "checkbox-select": "ߓߊߕߐߡߐ߲ߠߌ߲: $1",
        "checkbox-all": "ߊ߬ ߓߍ߯",
        "checkbox-none": "ߝߏߦߌ߬",
+       "checkbox-invert": "ߊ߬ ߞߕߐߡߊߛߊ߬ߦߌ߬",
        "allpages": "ߞߐߜߍ ߟߎ߬ ߓߍ߯",
        "nextpage": "ߞߐߜߍ ߟߊ߬ߕߎ߲߰ߠߊ ($1)",
        "prevpage": "ߞߐߜߍ ߟߊ߬ߕߎ߲߰ߠߊ ($1)",
+       "allpagesfrom": "ߞߐߜߍ ߟߎ߬ ߦߌ߬ߘߊ߬ߟߌ ߟߊߝߟߐ߫ ߣߌ߲߬ ߡߊ߬:",
+       "allpagesto": "ߞߐߜߍ ߟߎ߬ ߦߌ߬ߘߊ߬ߟߌ ߟߊߝߟߐ߫ ߡߍ߲ ߠߎ߬ ߦߋ߫ ߟߊߓߊ߲߫ ߠߊ߫ ߣߌ߲߬ ߡߊ߬:",
        "allarticles": "ߞߐߜߍ ߟߎ߬ ߓߍ߯",
+       "allinnamespace": "ߞߐߜߍ ߟߎ߬ ߓߍ߯ ($1 ߕߐ߯ߛߓߍ ߞߣߍ)",
        "allpagessubmit": "ߥߊ߫",
+       "allpagesprefix": "ߞߐߜߍ ߟߎ߬ ߦߌ߬ߘߊ߬ߟߌ ߟߊߝߟߐ߫ ߢߍߣߙߊߡߊ ߟߎ߬ ߡߊ߬:",
+       "allpagesbadtitle": "ߞߐߜߍ߫ ߞߎ߲߬ߕߐ߰ ߘߌ߫ ߣߍ߲ ߓߍ߲߬ߣߍ߲߬ ߕߍ߫߸ ߥߟߊ߫ ߞߊ߲ ߠߎ߬ ߣߌ߫ ߢߐ߲߯ߕߍ߫ ߤߊߡߊ߲߫ ߥߞߌ ߟߎ߬ ߕߍ߫ ߢߍߣߙߊ ߟߎ߬ ߘߌ߫ ߞߴߊ߬ ߟߊ߫.\nߛߓߍߘߋ߲߫ ߞߋߟߋ߲߫ ߥߟߊ߫ ߛߌߦߊߡߊ߲ ߠߎ߬ ߟߋ߬ ߦߋ߫ ߞߍ߫ ߟߴߊ߬ ߘߐ߫߸ ߡߍ߲ ߠߎ߬ ߕߴߛߋ߫ ߞߍ߫ ߟߊ߫ ߞߎ߲߬ߕߐ߯ ߘߌ߫.",
        "allpages-hide-redirects": "ߟߊ߬ߞߎ߲߬ߛߌ߲߬ߠߌ߲ ߢߡߊߘߏ߲߰",
        "categories": "ߦߌߟߡߊ ߟߎ߬",
        "categories-submit": "ߦߌ߬ߘߊ߬ߟߌ",
        "listusersfrom": "ߟߊ߬ߓߊ߰ߙߊ߬ߟߊ ߟߎ߬ ߦߌ߬ߘߊ߬ߟߌ ߟߊߝߟߐ߫ ߣߌ߲߬ ߡߊ߬:",
        "listusers-submit": "ߦߌ߬ߘߊ߬ߟߌ",
        "listusers-noresult": "ߟߊ߬ߓߊ߰ߙߊ߬ߟߊ ߕߴߦߋ߲߬",
+       "listusers-blocked": "(ߓߊ߬ߟߌ߬ߣߍ߲)",
+       "activeusers": "ߟߊ߬ߓߊ߰ߙߊ߬ߟߊ ߞߎ߲߬ߞߍ߲ߘߍ ߟߎ߬ ߛߙߍߘߍ",
+       "activeusers-from": "ߟߊ߬ߓߊ߰ߙߊ߬ߟߊ ߟߎ߬ ߦߌ߬ߘߊ߬ߟߌ ߟߊߝߟߐ߫ ߣߌ߲߬ ߡߊ߬:",
+       "activeusers-groups": "ߟߊ߬ߓߊ߰ߙߊ߬ߟߊ ߡߍ߲ ߠߎ߬ ߕߊ߫ ߦߋ߫ ߞߙߎ ߘߌ߫߸ ߏ߬ ߟߎ߫ ߦߌ߬ߘߊ߬:",
+       "activeusers-excludegroups": "ߟߊ߬ߓߊ߰ߙߊ߬ߟߊ ߡߍ߲ ߠߎ߬ ߦߋ߫ ߞߙߎ ߘߐ߫߸ ߏ߬ ߟߎ߫ ߟߊߓߐ߫ ߊ߬ ߘߐ߫:",
        "activeusers-noresult": "ߟߊ߬ߓߊ߰ߙߊ߬ߟߊ ߕߴߦߋ߲߬",
        "listgrouprights": "ߞߙߎ߫ ߟߊߓߊ߯ߙߕߊ ߤߊߞߍ",
        "listgrouprights-group": "ߞߙߎ:",
        "uctop": "ߞߍߛߊ߲ߞߏ",
        "month": "ߞߵߊ߬ ߕߊ߬ ߞߊߙߏ ߡߊ߬ (ߊ߬ ߣߌ߫ ߞߊߙߏ ߞߎ߲߬ߝߟߐ ߘߐ߫):",
        "year": "ߞߵߊ߬ ߕߊ߬ ߞߊߙߏ ߡߊ߬ (ߊ߬ ߣߌ߫ ߞߊߙߏ ߞߎ߲߬ߝߟߐ ߡߊ߬):",
+       "date": "ߞߵߊ߬ ߕߊ߬ ߕߎ߬ߡߊ߬ߘߊ ߡߊ߬ (ߊ߬ ߣߌ߫ ߖߏߣߊ߫)",
        "sp-contributions-newbies": "ߖߊ߬ߕߋ߬ߘߊ߬ ߞߎߘߊ ߟߎ߫ ߘߐߙߐ߲߫ ߠߊ߫ ߓߟߏߓߌߟߊߢߐ߲߯ߞߊ߲ ߦߌ߬ߘߊ߫ ߕߋ߲߬",
+       "sp-contributions-newbies-sub": "ߖߊ߬ߕߋ߬ߘߊ߬ ߞߎߘߊ ߟߎ߬ ߦߋ߫",
+       "sp-contributions-newbies-title": "ߟߊ߬ߓߊ߰ߙߊ߬ߟߊ ߟߊ߫ ߓߟߏߡߊߜߍ߲ ߖߊ߬ߕߋ߬ߘߊ߬ ߞߎߘߊ ߟߎ߬ ߦߋ߫",
        "sp-contributions-blocklog": "ߜߊ߲߬ߞߎ߲߬ߠߌ߲ ߓߊ߬ߟߊ߲߬",
+       "sp-contributions-suppresslog": "{{GENDER:$1|ߟߊ߬ߓߊ߰ߙߊ߬ߟߊ}} ߓߟߏߓߌߟߊߢߐ߲߯ߞߊ߲ ߓߘߊ߫ ߖߏ߬ߛߌ߬",
+       "sp-contributions-deleted": "{{GENDER:$1|ߟߊ߬ߓߊ߰ߙߊ߬ߟߊ}} ߟߊ߫ ߓߟߏߓߌߟߊߢߐ߲߮ߞߊ߲ ߠߎ߬ ߓߘߊ߫ ߖߏ߬ߛߌ߬",
        "sp-contributions-uploads": "ߟߊ߬ߦߟߍ߬ߟߌ ߟߎ߬",
        "sp-contributions-logs": "ߘߏ߲߬ߠߌ߲ ߠߎ߬",
        "sp-contributions-talk": "ߞߎߡߊߢߐ߲߯ߦߊ",
+       "sp-contributions-userrights": "{{GENDER:$1|ߟߊ߬ߓߊ߰ߙߊ߬ߟߊ}} ߤߊߞߍ ߘߊߘߐߓߍ߲ߠߌ߲",
        "sp-contributions-search": "ߓߟߏߓߌߟߊߢߐ߲߯ߞߊ߲ ߘߏ߫ ߢߌߣߌ߲߫",
        "sp-contributions-username": "IP ߛߊ߲߬ߓߊ߬ߕߐ߮ ߥߟߊ߫ ߟߊ߬ߓߊ߰ߙߊ߬ߕߐ߮:",
        "sp-contributions-toponly": "ߡߛߊ߬ߦߌ߲߬ߠߌ߲߬ ߠߊ߬ߓߊ߲ ߠߎ߬ ߘߐߙߐ߲߫ ߡߊ߬ߦߟߍ߬ߡߊ߲߬ߠߌ߲ ߦߌ߬ߘߊ߬",
        "sp-contributions-newonly": "ߡߊ߬ߦߟߍ߬ߡߊ߲߬ߠߌ߲ ߡߍ߲ ߣߊ߬ ߞߐߜߍ߫ ߟߊߘߊ߲ ߘߌ߫߸ ߏ߬ ߟߎ߫ ߘߐߙߐ߲߫ ߦߌ߬ߘߊ߬",
+       "sp-contributions-hideminor": "ߡߊ߬ߦߟߍ߬ߡߊ߲߬ߠߌ߲߬ ߘߋ߬ߣߍ߲ ߠߎ߬ ߢߡߊߘߏ߲߰",
        "sp-contributions-submit": "ߢߌߣߌ߲ߠߌ߲",
        "whatlinkshere": "ߛߘߌ߬ߜߋ߲ ߢߎ߬ߡߊ߲߬ ߦߋ߫ ߦߊ߲߬",
        "whatlinkshere-title": "ߞߐߜߍ ߡߍ߲ ߠߎ߫ ߛߘߌ߬ߣߍ߲߫ ߝߊ߲߭ ߣߌ߲߬ $1 ߡߊ߬",
        "whatlinkshere-hidelinks": "ߛߘߌ߬ߜߋ߲$1",
        "whatlinkshere-hideimages": "ߞߐߕߐ߮ ߛߘߌ߬ߜߋ߲$1",
        "whatlinkshere-filters": "ߢߡߊߘߏ߲߰ߣߍ߲",
+       "whatlinkshere-submit": "ߕߊ߯",
+       "autoblockid": "ߞߍߒߖߘߍߦߋ߫ ߓߊߟߌߟߌ #$1",
+       "block": "ߟߊ߬ߓߊ߰ߙߊ߬ߟߊ ߓߊ߬ߟߌ߬",
+       "unblock": "ߟߊ߬ߓߊ߰ߙߊ߬ߟߊ ߓߊ߬ߟߊ߲߬ߣߍ߲ ߓߐ߫",
+       "blockip": "{{GENDER:$1|ߟߊ߬ߓߊ߰ߙߊ߬ߟߊ}} ߓߊ߬ߟߌ߬",
+       "ipaddressorusername": "IP ߛߊ߲߬ߓߊ߬ߕߐ߮ ߥߟߊ߫ ߟߊ߬ߓߊ߰ߙߊ߬ߕߐ߮:",
+       "ipbreason": "ߊ߬ ߛߊߓߎ:",
+       "ipbcreateaccount": "ߖߊ߬ߕߋ߬ߘߊ ߛߌ߲ߘߟߌ",
+       "ipbemailban": "ߢߎߡߍߙߋ߲ ߗߋߟߌ",
+       "ipbsubmit": "ߟߊ߬ߓߊ߰ߙߊ߬ߟߊ ߣߌ߲߬ ߓߊ߬ߟߌ߬",
+       "ipbother": "ߛߋ߲߬ߧߊ߬ ߜߘߍ߫:",
        "ipboptions": "ߕߎ߬ߡߊ߬ߙߋ߲ ߂:2 hours, ߕߟߋ߬ ߁:1 day, ߕߋ߬ߟߋ ߃:3 days,ߞߎ߲߬ߢߐ߰ ߁:1 week, ߞߎ߲߬ߢߐ߮ ߂:2 weeks, ߞߊߙߏ߫ ߁:1 month, ߞߊߙߏ߫ ߃:3 months, ߞߊߙߏ߫ ߆:6 months,ߛߊ߲߬ ߁:1 year,ߤߊ߲߯ ߤߌ߲߯:infinite",
+       "ipbhidename": "ߟߊ߬ߓߊ߰ߙߊ߬ߟߊ ߢߡߊߘߏ߲߰ ߡߊ߬ߦߟߍ߬ߡߊ߲߬ߠߌ߲߬ ߣߌ߫ ߛߙߍߘߍ ߡߊ߬",
+       "ipb-disableusertalk": "ߊ߬ߟߎ߬ ߖߘߍ߬ߞߊ߬ߣߌ߲߬ ߞߎߡߊ߫ ߞߐߜߍ ߡߊߦߟߍ߬ߡߊ߲߬ߠߌ߲",
+       "ipb-change-block": "ߟߊ߬ߓߍ߲߬ߢߐ߲߰ߡߊ ߣߌ߲߬ ߦߋ߫ ߟߊ߬ߓߊ߰ߙߊ߬ߟߊ ߡߍ߲ ߠߎ߬ ߟߊ߫߸ ߏ߬ ߟߎ߫ ߓߊ߬ߟߌ߬-ߕߎ߲߯",
+       "ipb-confirm": "ߝߊ߲߬ߞߣߐ ߟߊߛߙߋߦߊ߫",
+       "ipb-sitewide": "ߞߍߦߙߐ ߞߣߍ",
+       "ipb-partial": "ߝߊ߲߬ߞߋ߬ߟߋ߲߬ߞߏ",
+       "ipb-sitewide-help": "ߞߐߜߍ ߡߍ߲ ߓߍ߯ ߦߋ߫ ߥߞߌ ߘߐ߫ ߊ߬ ߣߌ߫ ߓߟߏߓߌߟߊߢߐ߲߯ߞߊ߲ ߞߍߢߊ ߕߐ߭ ߟߎ߬.",
+       "ipb-partial-help": "ߞߐߜߍ ߘߊ߲߬ߠߊߕߍ߰ߣߍ߲ ߥߟߊ߫ ߕߐ߯ߛߓߍ ߞߣߍ",
+       "ipb-pages-label": "ߞߐߜߍ ߟߎ߬",
+       "ipb-namespaces-label": "ߕߐ߯ߛߓߍ ߞߣߍ",
+       "badipaddress": "IP ߛߊ߲߬ߓߊ߬ߕߐ߮ ߓߍ߲߬ߓߊߟߌ",
+       "blockipsuccesssub": "ߓߊ߬ߟߌ߬ߟߌ ߓߘߊ߫ ߛߎߘߊ߲߫",
+       "ipb-edit-dropdown": "ߓߊ߬ߟߌ߬ߟߌ ߞߎ߲߭ ߡߊߦߟߍ߬ߡߊ߲߫",
+       "ipb-unblock-addr": "$1 ߓߊ߬ߟߌ߬ߣߍ߲ ߓߐ߫",
+       "ipb-unblock": "ߟߊ߬ߓߊ߰ߙߊ߬ߟߊ ߘߏ߫ ߓߊ߬ߟߌ߬ߣߍ߲ ߓߐ߫ ߥߟߊ߫ IP ߛߊ߲߬ߓߊ߬ߕߐ߮",
+       "ipb-blocklist-contribs": "{{GENDER:$1|$1}} ߟߊ߫ ߓߟߏߓߌߟߊߢߐ߲߮ߞߊ߲",
+       "ipb-blocklist-duration-left": "ߞߵߊ߬ ߕߊ߬ $1",
+       "block-actions": "ߝߏ߲߬ߝߏ߲ ߓߊ߬ߟߌ߬ߕߊ:",
+       "block-expiry": "ߛߕߊ ߝߊ߫ ߕߎߡߊ:",
+       "block-options": "ߢߣߊߕߊߟߌ߫ ߡߞߊ߬ߝߏ߬ߟߌ߬ ߜߘߍ߫",
+       "block-prevent-edit": "ߡߊ߬ߦߟߍ߬ߡߊ߲߬ߠߌ߲ ߦߴߌ ߘߐ߫",
+       "block-reason": "ߊ߬ ߛߊߓߎ:",
+       "block-target": "ߟߊ߬ߓߊ߰ߙߊ߬ߟߌ߬ ߕߐ߮ ߥߟߊ߫ IP ߛߊ߲߬ߓߊ߬ߕߐ߮:",
+       "unblockip": "ߟߊ߬ߓߊ߰ߙߊ߬ߟߊ ߓߊ߬ߟߊ߲߬ߣߍ߲ ߓߐ߫",
+       "ipusubmit": "ߓߊ߬ߟߌ߬ߟߌ ߣߌ߲߬ ߓߐ߫ ߦߋ߲߬",
+       "unblocked": "[[User:$1|$1]] ߓߊ߬ߟߌ߬ߣߍ߲ ߓߘߊ߫ ߓߐ߫.",
+       "unblocked-range": "$1 ߓߊ߬ߟߌ߬ߣߍ߲ ߓߘߊ߫ ߓߐ߫.",
+       "unblocked-id": "ߓߊ߬ߟߌ߬ߟߌ $1 ߓߘߊ߫ ߓߴߊ߬ ߞߊ߲߬.",
+       "unblocked-ip": "[[Special:Contributions/$1|$1]] ߓߊ߬ߟߌ߬ߣߍ߲ ߓߘߊ߫ ߓߐ߫.",
+       "blocklist": "ߟߊ߬ߓߊ߰ߙߊ߬ߟߊ ߓߊ߬ߟߌ߬ߣߍ߲ ߠߎ߬",
+       "autoblocklist": "ߞߍߒߖߘߍߦߋ߫ ߓߊߟߌߟߌ",
+       "autoblocklist-submit": "ߊ߬ ߢߌߣߌ߲߫",
+       "autoblocklist-legend": "ߞߍߒߖߘߍߦߋ߫ ߓߊߟߌߟߌ ߟߎ߬ ߛߙߍߘߍ",
+       "ipblocklist": "ߟߊ߬ߓߊ߰ߙߊ߬ߟߊ ߓߊ߬ߟߌ߬ߣߍ߲ ߠߎ߬",
+       "ipblocklist-legend": "ߟߊ߬ߓߊ߰ߙߊ߬ߟߊ ߓߊ߬ߟߌ߬ߣߍ߲ ߠߎ߬ ߢߌߣߌ߲߫",
+       "blocklist-userblocks": "ߖߊ߬ߕߋ߬ߘߊ ߝߊ߲߬ߞߣߐ ߢߡߊߘߏ߲߰",
+       "blocklist-tempblocks": "ߝߊ߲߬ߞߣߐ ߕߎ߬ߡߊ߬ߞߎ߲߬ߡߊ ߢߡߊߘߏ߲߰",
+       "blocklist-addressblocks": "ߝߊ߲߬ߞߣߐ IP ߞߋ߬ߟߋ߲߬ߡߊ ߢߡߊߘߏ߲߰",
+       "blocklist-type": "ߛߎ߯ߦߊ:",
+       "blocklist-type-opt-all": "ߊ߬ ߓߍ߯",
+       "blocklist-type-opt-sitewide": "ߞߍߦߙߐ ߞߣߍ",
+       "blocklist-type-opt-partial": "ߝߊ߲߬ߞߋ߬ߟߋ߲߬ߞߏ",
+       "blocklist-timestamp": "ߕߎ߬ߡߊ ߓߊ߬ߘߌ߬ߟߊ߲",
+       "blocklist-target": "ߞߏ߲߭",
+       "blocklist-expiry": "ߊ߬ ߛߕߊ ߓߘߊ߫ ߝߊ߫",
+       "blocklist-reason": "ߊ߬ ߛߊߓߎ",
+       "ipblocklist-submit": "ߢߌߣߌ߲ߠߌ߲",
+       "ipblocklist-localblock": "ߕߌ߲߬ߞߎߘߎ߲ ߝߊ߲߬ߞߣߐ",
        "infiniteblock": "ߘߊ߲߬ߓߊߟߌ",
+       "expiringblock": "ߊ߬ ߛߕߊ ߝߊ߫ ߕߐ߫ $1 ߟߋ߬ ߟߊ߫ $2 ߟߊ߫",
+       "anononlyblock": "ߕߐ߯ߒߕߊ߲. ߘߐߙߐ߲߫",
+       "createaccountblock": "ߖߊ߬ߕߋ߬ߘߊ ߛߌ߲ߘߟߌ ߓߐ߫ ߣߴߊ߬ ߟߊ߫",
+       "emailblock": "ߢߎߡߍߙߋ߲ߞߏ߲ߘߏ ߕߴߊ߬ ߟߊ߫",
+       "blocklist-nousertalk": "ߌ ߕߍ߫ ߛߴߌ ߖߘߍ߬ߞߊ߬ߣߌ߲߬ ߞߎߡߊߢߐ߲߯ߦߊ߫ ߞߐߜߍ ߡߊߦߟߍ߬ߡߊ߲߬ ߠߊ߫",
+       "blocklist-editing": "ߡߊ߬ߦߟߍ߬ߡߊ߲߬ߠߌ߲ ߦߴߌ ߘߐ߫",
+       "blocklist-editing-sitewide": "(ߞߍߦߙߐ ߞߣߍ) ߡߊ߬ߦߟߍ߬ߡߊ߲߬ߠߌ߲ ߦߴߌ ߘߐ߫",
+       "blocklist-editing-page": "ߞߐߜߍ ߟߎ߬",
+       "blocklist-editing-ns": "ߕߐ߯ߛߓߍ ߞߣߍ",
+       "ipblocklist-empty": "ߝߊ߲߬ߞߣߐ ߛߙߍߘߍ ߘߐߞߏߟߏ߲ ߠߋ߬.",
        "blocklink": "ߟߊ߬ߢߊ߬ߙߊ߲߬ߠߌ",
+       "unblocklink": "ߓߊ߬ߟߌ߬ߣߍ߲ ߓߐ߫",
+       "change-blocklink": "ߝߊ߲߬ߞߣߐ ߡߊߝߊ߲߬ߟߋ߲߬",
+       "empty-username": "(ߕߐ߯ ߟߊߓߊ߯ߙߕߊ߫ ߛߌ߫ ߕߍ߫ ߦߊ߲߬)",
        "contribslink": "ߓߟߏߡߊߜߍ߲",
+       "emaillink": "ߢߎߡߍߙߋ߲ ߗߋ߫",
+       "autoblocker": "ߓߘߊ߫ ߓߊ߬ߟߌ߬ ߊ߬ ߖߍ߬ߘߍߡߊ߬ ߓߊߏ߬ ߌ ߟߊ߫ IP ߛߊ߲߬ߓߊ߬ߕߐ߮ ߟߊߓߊ߯ߙߊ߫ ߛߊ߲߯ ߠߋ߬ ߦߋ߫ \"[[User:$1|$1]]\". ߓߟߏ߫.\nߞߎ߲߭ ߡߍ߲ ߦߌ߬ߘߊ߬ ߣߍ߲߬ ߦߋ߫ $1 ߓߊ߬ߟߌ߬ߟߌ ߟߊ߫߸ ߏ߬ ߟߋ ߦߋ߫  \"$2\"",
        "blocklogpage": "ߜߊ߲߬ߞߎ߲߬ߠߌ߲ ߓߊ߬ߟߊ߲߬ߠߌ",
+       "blocklog-showlog": "ߟߊ߬ߓߊ߰ߙߊ߬ߟߊ ߣߌ߲߬ ߕߊ߬ߟߌ߬ߣߍ߲߬ ߦߋ߫ ߥߊ߯ߕߌ߫ ߞߎߘߎ߲ߣߍ߲߫ ߠߋ߬ ߞߘߐ߫.\nߓߊ߬ߟߌ߬ߟߌ ߘߊ߲ߖߐ ߡߊߛߐߣߍ߲߫ ߦߋ߫ ߘߎ߰ߟߊ ߘߐ߫ ߦߟߌߡߊߛߙߋ߫ ߞߏ ߘߐ߫:",
+       "blocklog-showsuppresslog": "ߟߊ߬ߓߊ߰ߙߊ߬ߟߊ ߣߌ߲߬ ߓߊ߬ߟߌ߬ߣߍ߲ ߠߋ߬ ߦߋ߫ ߞߏ߬ߣߵߊ߬ ߢߡߊߘߏ߲߰ߣߍ߲߬ ߡߎߣߎ߲߬.\nߖߏ߰ߛߌ߬ߟߌ ߘߊ߲ߖߐ ߡߊߛߐߣߍ߲߫ ߦߋ߫ ߘߎ߰ߟߊ ߘߐ߫ ߦߟߌߡߊߛߙߋ߫ ߞߏ ߘߐ߫:",
        "blocklogentry": "ߊ߬ ߓߊ߬ߟߊ߲߬ߣߍ߲߬ ߦߋ߫ [[$1]] ߊ߬ ߕߎ߬ߡߊ ߕߊ߬ߡߌ߲ ߠߋ߬ ߞߏߛߐ߲߬ $2 $3",
        "reblock-logentry": "ߣߌ߲߬ ߓߊ߬ߟߊ߲߬ߠߌ߲ ߟߊ߬ߓߍ߲߬ߢߐ߲߰ߡߊ ߡߊߦߟߍ߬ߡߊ߲߬  [[$1]] ߊ߬ ߕߎ߬ߡߊ ߛߕߊ ߝߊ ߕߎߡߊ ߟߊ߫ $2 $3",
+       "unblocklogentry": "$1 ߓߊ߬ߟߌ߬ߣߍ߲ ߓߘߊ߫ ߓߐ߫",
+       "block-log-flags-anononly": "ߡߊ߬ߦߟߍ߬ߡߊ߲߬ߠߊ߫ ߕߐ߯ߒߕߊ߲ ߠߎ߬ ߘߐߙߐ߲߫",
        "block-log-flags-nocreate": "ߖߊ߬ߕߋ߬ߘߊ ߛߌ߲ߘߟߌ ߟߊߕߐ߲",
+       "block-log-flags-noautoblock": "ߞߍߒߖߘߍߡߊ߫ ߓߊߟߌߟߌ ߓߘߊ߫ ߓߐ߫ ߊ߬ ߟߊ߫.",
+       "block-log-flags-noemail": "ߢߎߡߍߙߋ߲ߞߏ߲ߘߏ ߕߴߊ߬ ߟߊ߫",
+       "block-log-flags-nousertalk": "ߌ ߕߍ߫ ߛߴߌ ߖߘߍ߬ߞߊ߬ߣߌ߲߬ ߞߎߡߊߢߐ߲߯ߦߊ߫ ߞߐߜߍ ߡߊߦߟߍ߬ߡߊ߲߬ ߠߊ߫",
+       "block-log-flags-angry-autoblock": "ߞߍߒߖߘߍߡߊ߫ ߓߊߟߌߟߌ ߘߐߥߙߊ߬ߟߌ ߦߴߊ߬ ߟߊ߫.",
+       "block-log-flags-hiddenname": "ߕߐ߯ ߟߊߓߊ߯ߙߕߊ ߢߡߊߘߏ߲߰ߣߍ߲߫",
+       "ipb_expiry_invalid": "ߛߕߊ ߝߊ߫ ߕߎߡߊ ߓߍ߲߬ߓߊߟߌ",
+       "ipb_expiry_old": "ߊ߬ ߛߕߊ ߝߊ߫ ߕߎߡߊ ߓߘߊ߫ ߕߊ߬ߡߌ߲߬.",
+       "ipb_expiry_temp": "ߟߊ߬ߓߊ߰ߙߊ߬ߟߊ ߕߐ߮ ߘߊ߲ߖߐ ߢߡߊߘߏ߲߯ߠߌ߲ ߦߋ߫ ߞߍ߫ ߞߎߘߊߦߌ ߘߌ߫.",
+       "ipb_hide_invalid": "ߖߊ߬ߕߋ߬ߘߊ ߣߌ߲߬ ߖߏ߬ߛߌ߬ߟߌ ߕߍ߫ ߣߊ߬ ߓߍ߲߬ ߠߊ߫: ߊ߬ ߓߘߊ߫ {{PLURAL:$1|ߡߊ߬ߦߟߍ߬ߡߊ߲߬ߠߌ߲߬ ߞߋߟߋ߲߫|ߡߊ߬ߦߟߍ߬ߡߊ߲߬ߠߌ߲ $1 ߠߎ߬}} ߠߎ߬ ߞߍ߫.",
+       "ipb_already_blocked": "ߵߵ$1ߵߵ ߓߊ߬߬ߟߌ߬ߣߍ߲߬ ߞߘߐ ߟߋ߬ ߦߋ߫.",
+       "ipb-needreblock": "$1 ߓߊ߬ߟߌ߬ߣߍ߲߬ ߞߘߐ ߟߋ߬. ߌ ߦߴߊ߬ ߝߍ߬ ߞߊ߬ ߟߊ߬ߓߍ߲߬ߢߐ߲߰ߡߊ ߡߊߝߊ߬ߟߋ߲߫ ߓߊ߬؟",
+       "ipb-otherblocks-header": "{{PLURAL:$1|ߘߊ߲ߖߐ|ߘߊ߲ߖߐ ߟߎ߬}} ߕߐ߭ ߟߎ߬",
+       "unblock-hideuser": "ߌ ߕߍߣߊ߬ ߛߋ߫ ߟߊ߫ ߟߊ߬ߓߊ߰ߙߊ߬ߟߊ ߣߌ߲߬ ߓߊ߬ߟߌ߬ߣߍ߲ ߓߐ߫ ߟߊ߫߸ ߓߊߏ߬ ߊ߬ߟߎ߬ ߕߐ߯ ߟߊߓߊ߯ߙߕߊ ߢߡߊߘߏ߲߰ߣߍ߲߫ ߠߋ߬.",
        "proxyblocker": "ߟߐ߲߬ߞߋ߬ߟߊ ߓߊ߬ߟߊ߲߬ߟߊ߲",
+       "lockdb": "ߓߟߏߡߟߊ ߝߊ߲ ߣߍ߰",
+       "unlockdb": "ߓߟߏߡߟߊ ߝߊ߲ ߟߊߞߊ߬",
+       "lockbtn": "ߓߟߏߡߟߊ ߝߊ߲ ߣߍ߰",
+       "unlockbtn": "ߓߟߏߡߟߊ ߝߊ߲ ߟߊߞߊ߬",
+       "locknoconfirm": "ߌ ߡߊ߫ ߟߊ߬ߛߙߋ߬ߦߊ߬ߟߌ߬ ߞߏ߲ߘߏ ߡߊߝߍߣߍ߲߫.",
+       "lockdbsuccesssub": "ߓߟߏߡߟߊ ߝߊ߲ ߛߐ߰ߟߌ ߓߘߊ߫ ߛߎߘߊ߲߫",
+       "unlockdbsuccesssub": "ߛߐ߰ߟߌ ߓߘߊ߫ ߓߐ߫ ߓߟߏߡߟߊ ߝߊ߲ ߞߊ߲߬",
+       "unlockdbsuccesstext": "ߓߟߏߡߟߊ ߝߊ߲ ߓߘߊ߫ ߓߊ߲߫ ߘߊߦߟߍ߬ ߟߊ߫.",
+       "databaselocked": "ߓߟߏߡߟߊ ߝߊ߲ ߛߐ߰ߣߍ߲߬ ߞߘߐ ߟߋ߬.",
+       "databasenotlocked": "ߓߟߏߡߟߊ ߝߊ߲ ߛߐ߰ߣߍ߲߬ ߕߍ߫.",
+       "move-page": "$1 ߛߋ߲߬ߓߐ߫",
+       "move-page-legend": "ߞߐߜߍ ߛߋ߲߬ߓߐ߫",
+       "newtitle": "ߞߎ߲߬ߕߐ߰ ߞߎߘߊ:",
+       "movepagebtn": "ߞߐߜߍ ߛߋ߲߬ߓߐ߬ߟߌ",
+       "pagemovedsub": "ߛߋ߲߬ߓߐ߬ߟߌ ߓߘߊ߫ ߛߎߘߊ߲߫",
        "movelogpage": "ߜߊ߲߬ߞߎ߲ ߓߐ߫ ߊ߬ ߡߊ߬",
+       "movelogpagetext": "ߞߐߜߍ߫ ߛߋ߲߬ߓߐ߬ߣߍ߲ ߠߎ߬ ߓߍ߯ ߛߙߍߘߍ ߟߋ߬ ߦߋ߫ ߘߎ߰ߟߊߘߐ.",
+       "movesubpage": "{{PLURAL:$1|ߞߐߜߍߙߋ߲|ߞߐߜߍߙߋ߲ ߠߎ߬}}",
+       "movesubpagetext": "{{PLURAL:$1|ߞߐߜߍߙߋ߲|ߞߐߜߍߙߋ߲ ߠߎ߬}} $1 ߟߋ߬ ߦߋ߫ ߞߐߜߍ ߣߌ߲߬ ߠߊ߫߸ ߏ߬ ߟߋ ߦߌ߬ߘߊ߬ߣߍ߲߫ ߘߎ߰ߟߊ ߘߐ߫.",
+       "movenosubpage": "ߞߐߜߍߙߋ߲߫ ߕߍ߫ ߞߐߜߍ ߣߌ߲߬ ߠߊ߫.",
+       "movereason": "ߊ߬ ߛߊߓߎ:",
+       "revertmove": "ߟߊߞߐߛߊ߬ߦߌ߬",
+       "delete_and_move_confirm": "ߐ߲߬ߐ߲߬ߐ߲߫߸ ߞߐߜߍ ߖߏ߬ߛߌ߬",
+       "delete_and_move_reason": "ߊ߬ ߖߏ߰ߛߌ߬ߣߍ߲߫ ߠߋ߬ ߛߊ߫ ߛߊ߫ ߛߌߟߊ߫ ߘߌ߫ ߛߐ߬ߘߐ߲߬ ߞߵߊ߬ ߛߋ߲߬ߓߐ߫  \"[[$1]]\" ߘߐ߫",
+       "selfmove": "ߞߎ߲߬ߕߐ߮ ߦߋ߫ ߛߎ߯ ߞߋߟߋ߲ ߠߋ߬ ߘߌ߫:\nߞߐߜߍ ߕߍ߫ ߛߐ߲߬ ߟߊߦߟߍ߬ ߟߴߊ߬ ߖߍ߬ߘߍ ߞߊ߲߬.",
+       "immobile-source-namespace": "ߞߐߜߍ ߕߍ߫ ߛߐ߲߬ ߛߋ߲߬ߓߐ߬ ߟߊ߫ ߕߐ߯ߛߓߍ ߞߣߍ \"$1\" ߘߐ߫.",
+       "immobile-target-namespace": "ߞߐߜߍ ߕߍ߫ ߛߐ߲߬ ߟߊߕߊ߯ ߟߊ߫ ߕߐ߯ߛߓߍ ߞߣߍ \"$1\" ߘߐ߫.",
+       "immobile-target-namespace-iw": "ߥߞߌߣߌߢߐ߲߯ߕߍ ߛߘߌ߬ߜߋ߲ ߕߍ߫ ߞߏ߲߰ ߓߍ߲߬ߣߍ߲߬ ߘߌ߫ ߞߊ߬ ߞߐߜߍ ߟߎ߬ ߛߋ߲߬ߓߐ߫.",
+       "immobile-source-page": "ߞߐߜߍ ߕߍ߫ ߛߋ߲߬ߓߐ߬ߕߊ߫ ߘߌ߫.",
        "export": "ߞߐߜߍ ߟߎ߬ ߟߊߝߏ߬ߦߌ߬",
+       "export-submit": "ߟߊ߬ߝߏ߬ߦߌ߬ߟߌ",
+       "export-addcattext": "ߞߐߜߍ ߟߊߘߏ߲߬ ߦߌߟߡߊ ߘߐ߫:",
+       "export-addcat": "ߟߊ߬ߘߏ߲߬ߠߌ߲",
+       "export-addnstext": "ߞߐߜߍ ߟߊߘߏ߲߬ ߕߐ߯ߛߓߍ ߞߣߍ ߘߐ߫",
+       "export-addns": "ߟߊ߬ߘߏ߲߬ߠߌ߲",
+       "export-download": "ߊ߬ ߟߊߞߎ߲߬ߘߎ߬ ߞߐߕߐ߮ ߘߌ߫",
+       "export-templates": "ߊ߬ ߟߊߘߏ߲߬ ߞߙߊ߬ߞߏ ߘߐ߫",
+       "export-manual": "ߞߐߜߍ ߟߎ߬ ߟߊߘߏ߲߬ ߓߟߏߦߊߟߌ߫ ߓߟߏߡߊ߬:",
+       "allmessages": "ߞߊ߲ߞߋ ߗߋߛߓߍ ߟߎ߬",
+       "allmessagesname": "ߕߐ߮",
+       "allmessagesdefault": "ߓߐߛߎ߲ ߗߋߛߓߍ ߛߓߍߟߌ",
+       "allmessages-filter-legend": "ߛߍ߲ߛߍ߲ߟߊ߲",
+       "allmessages-filter-unmodified": "ߡߊ߬ߦߟߍ߬ߡߊ߲߬ߓߊߟߌ",
+       "allmessages-filter-all": "ߊ߬ ߓߍ߯",
+       "allmessages-filter-modified": "ߓߘߊ߫ ߡߊߦߟߍ߬ߡߊ߲߫",
+       "allmessages-prefix": "ߊ߬ ߥߣߊ߬ߙߌ߫ ߢߍߣߙߊ ߟߎ߬ ߡߊ߬",
+       "allmessages-language": "ߞߊ߲:",
+       "allmessages-filter-submit": "ߥߣߊ߬ߙߌ",
+       "allmessages-filter-translate": "ߘߟߊߡߌߘߊߟߌ",
        "thumbnail-more": "ߊ߬ ߟߊߞߎ߲߬ߓߊ߬ߦߊ߫",
+       "filemissing": "ߞߐߕߐ߯ ߞߐߢߌ߬ߣߊ߬ߣߍ߲",
+       "thumbnail_error": "ߞߝߊ߬ߟߋ߲ߛߋ߲ ߛߌ߲ߘߟߌ ߝߎ߬ߕߎ߲߬ߕߌ: $1",
+       "thumbnail_error_remote": "ߗߋߛߓߍ߫ ߝߎ߬ߕߎ߲߬ߕߌ߬ߡߊ ߞߊ߬ ߝߘߊ߫ $1: $2",
+       "import": "ߞߐߜߍ ߟߎ߬ ߟߊߛߣߍ߫",
+       "importinterwiki": "ߞߐߜߍ ߟߎ߬ ߟߊߛߣߍ߫ ߞߊ߬ ߓߐ߫ ߥߞߌ ߕߐ߭ ߟߎ߬ ߘߐ߫",
+       "import-interwiki-sourcewiki": "ߥߞߌ߫ ߓߐߛߎ߲:",
+       "import-interwiki-sourcepage": "ߓߐߛߎ߲ ߞߐߜߍ:",
+       "import-interwiki-history": "ߞߐߜߍ ߣߌ߲߬ ߟߢߊ߬ߟߌ ߘߐ߬ߝߐ ߓߍ߯ ߓߊߓߌ߬ߟߊ߬",
+       "import-interwiki-templates": "ߞߙߊ߬ߞߏ ߟߎ߬ ߓߍ߯ ߟߊߘߏ߲߬",
+       "import-interwiki-submit": "ߟߊ߬ߛߣߍ߬ߟߌ",
+       "import-mapping-default": "ߊ߬ ߟߊߛߣߍ߫ ߘߊ߲ߛߎ߲ ߘߌ߲߬ߞߌߙߊ ߘߐ߫",
+       "import-mapping-namespace": "ߊ߬ ߟߊߛߣߍ߫ ߕߐ߯ߛߓߍ ߞߣߍ ߘߏ߫ ߘߐ߫",
+       "import-upload-filename": "ߞߐߕߐ߮ ߕߐ߮:",
+       "import-upload-username-prefix": "ߥߞߌ ߣߌ߫ ߢߐ߲߯ߕߍ ߢߍߣߙߊ:",
        "importlogpage": "ߟߊ߬ߛߣߍ߬ߟߌ ߞߣߍ",
        "tooltip-pt-userpage": "{{GENDER:|ߌ ߟߊ߫ ߟߊ߬ߓߊ߰ߙߊ߬ߟߌ߬}} ߞߐߜߍ",
        "tooltip-pt-mytalk": "{{GENDER:|ߌ ߟߊ߫}} ߞߎߡߊ߫ ߞߐߜߍ߫",
        "tooltip-n-help": "ߘߍ߬ߡߍ߲߬ ߦߙߐ",
        "tooltip-t-whatlinkshere": "ߞߐߜߍ ߟߎ߫ ߛߘߌ߬ߜߋ߲ ߛߙߍߘߍ ߡߍ߲ ߠߎ߫ ߓߌ߬ߟߊ߬ߣߍ߲߫ ߦߊ߲߬ ߡߊ߬",
        "tooltip-t-recentchangeslinked": "ߡߊ߬ߦߟߍ߬ߡߊ߲߬ߠߌ߲߬ ߠߊ߬ߓߊ߲ ߡߍ߲ ߠߎ߬ ߦߋ߫ ߞߐߜߍ ߣߌ߲߬ ߛߘߌ߬ߜߋ߲ ߠߎ߬ ߘߐ߫",
+       "tooltip-feed-rss": "ߞߐߜߍ ߣߌ߲߬ RSS ߓߊߟߏ",
        "tooltip-feed-atom": "ߞߐߜߍ ߣߌ߲߬ ߝߕߌ߫ ߓߊߟߏ",
        "tooltip-t-contributions": "{{GENDER:$1|ߟߊ߬ߓߊ߰ߙߊ߬ߟߊ}} ߟߊ߫ ߓߟߏߓߌߟߊߢߐ߲߮ߞߊ߲ ߛߙߍߘߍ",
        "tooltip-t-emailuser": "ߢߎߡߍߙߋ߲ߞߏ߲ߘߏ ߟߊߕߊ߯ ߟߊߓߊ߯ߙߟߊ ߣߌ߲߬ ߡߊ߬{{GENDER:$1|ߟߊߓߊ߯ߙߟߊ}}",
index 62b7ac4..0b791d6 100644 (file)
        "permanentlink": "Link trwały do wersji",
        "permanentlink-revid": "ID wersji",
        "permanentlink-submit": "Przejdź do wersji",
+       "newsection": "Nowa sekcja",
+       "newsection-page": "Strona docelowa",
+       "newsection-submit": "Przejdź do strony",
        "dberr-problems": "Przepraszamy! Witryna ma problemy techniczne.",
        "dberr-again": "Spróbuj przeładować stronę za kilka minut.",
        "dberr-info": "(Błąd łączności z bazą danych: $1)",
index 4b45ac0..d7167ba 100644 (file)
        "permanentlink": "Ligação permanente",
        "permanentlink-revid": "ID da revisão",
        "permanentlink-submit": "Ir para revisão",
+       "newsection": "Nova seção",
+       "newsection-page": "Página de destino",
+       "newsection-submit": "Ir para página",
        "dberr-problems": "Desculpe! Este sítio está passando por dificuldades técnicas.",
        "dberr-again": "Experimente esperar alguns minutos e atualizar.",
        "dberr-info": "(Não pode acessar a base de dados: $1)",
index abe97fe..9e53809 100644 (file)
        "move-page": "Used as page title of [[Special:MovePage]] to move pages.\n\nSee example: [[Special:MovePage/Portal:En]].\n\nParameters:\n* $1 - the name of the page to be moved (without link)\n{{Identical|Move}}",
        "movepage-summary": "{{doc-specialpagesummary|movepage}}",
        "move-page-legend": "Legend of the fieldset around the input form of [[Special:MovePage/testpage]].\n\nSee also:\n* {{msg-mw|newtitle|label for new title}}\n* {{msg-mw|movereason|label for textarea}}\n* {{msg-mw|movetalk|label for checkbox}}\n* {{msg-mw|move-leave-redirect|label for checkbox}}\n* {{msg-mw|fix-double-redirects|label for checkbox}}\n* {{msg-mw|move-subpages|label for checkbox}}\n* {{msg-mw|move-talk-subpages|label for checkbox}}\n* {{msg-mw|move-watch|label for checkbox}}\n{{Identical|Move page}}",
-       "movepagetext": "Introduction shown when moving a page ([[Special:MovePage]]).\n\nSpecial pages mentioned: {{msg-mw|Doubleredirects}}, {{msg-mw|Brokenredirects}}\n\nSee also:\n* {{msg-mw|Movepagetext-noredirectfixer}}",
-       "movepagetext-noredirectfixer": "A variant of the following message ''Movepagetext'' displayed when the automatic redirect fixer is not enabled.\n\nSpecial pages mentioned: {{msg-mw|Doubleredirects}}, {{msg-mw|Brokenredirects}}\n\nSee also:\n* {{msg-mw|Movepagetext}}",
-       "movepagetext-noredirectsupport": "A variant of the following message ''Movepagetext'' displayed when the content model of the page being moved does not support redirects.\n\nSee also:\n* {{msg-mw|Movepagetext}}",
+       "movepagetext": "Introduction shown when moving a page ([[Special:MovePage]]).\n\nSpecial pages mentioned: {{msg-mw|Doubleredirects}}, {{msg-mw|Brokenredirects}}\n\nSee also:\n* {{msg-mw|Movepagetext-noredirectfixer}}\n* {{msg-mw|Movepagetext-noredirectsupport}}",
+       "movepagetext-noredirectfixer": "A variant of the following message ''Movepagetext'' displayed when the automatic redirect fixer is not enabled.\n\nSpecial pages mentioned: {{msg-mw|Doubleredirects}}, {{msg-mw|Brokenredirects}}\n\nSee also:\n* {{msg-mw|Movepagetext}}\n* {{msg-mw|Movepagetext-noredirectsupport}}",
+       "movepagetext-noredirectsupport": "A variant of the following message ''Movepagetext'' displayed when the content model of the page being moved does not support redirects.\n\nSee also:\n* {{msg-mw|Movepagetext}}\n* {{msg-mw|Movepagetext-noredirectfixer}}",
        "movepagetalktext": "Text on the special 'Move page'. This text only appears if the talk page is not empty.",
        "moveuserpage-warning": "Used as warning in [[Special:MovePage]], when moving a user page.",
        "movecategorypage-warning": "Used as warning in [[Special:MovePage]], when moving a category page.",
index d8fd29a..d3f8b0a 100644 (file)
        "permanentlink": "Постоянная ссылка",
        "permanentlink-revid": "Идентификатор правки",
        "permanentlink-submit": "Перейти к версии",
+       "newsection": "Новый раздел",
+       "newsection-page": "Целевая страница",
+       "newsection-submit": "Перейти к странице",
        "dberr-problems": "Извините! На данном сайте возникли технические трудности.",
        "dberr-again": "Попробуйте обновить страницу через несколько минут.",
        "dberr-info": "(Нет доступа к базе данных: $1)",
index e9f3a4f..7156881 100644 (file)
        "brokenredirectstext": "Custos redirects ligant cun pàginas chi no esistint.",
        "brokenredirects-edit": "càmbia",
        "brokenredirects-delete": "cantzella",
+       "withoutinterwiki": "Pàginas chene ligàmenes de sas limbas",
        "withoutinterwiki-legend": "Prefissu",
        "withoutinterwiki-submit": "Ammustra",
+       "fewestrevisions": "Pàginas cun prus pagas revisiones",
        "nbytes": "$1 {{PLURAL:$1|byte|bytes}}",
        "ncategories": "$1 {{PLURAL:$1|categoria|categorias}}",
        "ninterwikis": "$1 {{PLURAL:$1|interwiki|interwikis}}",
        "usercreated": "{{GENDER:$3|Creadu}} su $1 a is $2",
        "newpages": "Pàginas noas",
        "newpages-username": "Nùmene impitadore:",
+       "ancientpages": "Pàginas prus betzas",
        "move": "Move",
        "movethispage": "Move custa pàgina (càmbia su tìtulu)",
        "unusedimagestext": "Is documentos chi sighint sunt istados carrigados ma non sunt impreados.\nDia podent èssere immàgines impreadas dae àteros giassos cun unu ligòngiu diretu, e tando podent èssere listados inoghe comente usu ativu.",
index f5b823e..f5bbc2f 100644 (file)
        "nowiki_sample": "Dodaj neformatirani tekst ovdje",
        "nowiki_tip": "Ignoriraj wiki formatiranje",
        "image_tip": "Uklopljena datoteka/fajl",
-       "media_tip": "Putanja ka multimedijalnoj datoteci/fajlu",
+       "media_tip": "Veza do datoteke/fajla",
        "sig_tip": "Vaš potpis sa trenutnim vremenom",
        "hr_tip": "Horizontalna linija (koristite rijetko)",
        "summary": "Sažetak:",
        "permanentlink": "Trajni link",
        "permanentlink-revid": "Naznaka izmjene",
        "permanentlink-submit": "Idi na izmjenu",
+       "newsection": "Novi podnaslov",
+       "newsection-page": "Ciljna stranica",
+       "newsection-submit": "Idi na stranicu",
        "dberr-problems": "Žao nam je! Ova stranica ima tehničke poteškoće.",
        "dberr-again": "Pokušajte pričekati nekoliko minuta i ponovno učitati.",
        "dberr-info": "(Ne mogu pristupiti bazi podataka: $1)",
index e1605fa..906dfc1 100644 (file)
        "history": "História stránky",
        "history_short": "História",
        "history_small": "história",
-       "updatedmarker": "aktualizované od mojej poslednej návštevy",
+       "updatedmarker": "aktualizované od vašej poslednej návštevy",
        "printableversion": "Verzia na tlač",
        "permalink": "Trvalý odkaz",
        "print": "Tlač",
        "post-expand-template-argument-warning": "Upozornenie: Táto stránka obsahuje aspoň jeden argument šalóny, ktorý je príliš veľký.\nTieto argumenty boli vynechané.",
        "post-expand-template-argument-category": "Stránky obsahujúce vynechané argumenty šablón",
        "parser-template-loop-warning": "Zistená slučka v šablónach: [[$1]]",
+       "template-loop-category": "Stránky so slučkami šablón",
+       "template-loop-category-desc": "Stránka obsahuje slučku šablóny, t. j. šablónu, ktorá je vložená sama do seba.",
+       "template-loop-warning": "<strong>Upozornenie:</strong> Táto stránka volá [[:$1]], čo spôsobuje slučku šablóny (nekonečné rekurzívne volanie).",
        "parser-template-recursion-depth-warning": "Bol prekročený limit rekurzie šablón ($1)",
        "language-converter-depth-warning": "Bolo prekročené obmedzenie hĺbky ($1) jazykového konvertora",
        "node-count-exceeded-category": "Stránky s priveľkým počtom uzlov",
        "doubleredirects": "Dvojité presmerovania",
        "doubleredirectstext": "Táto stránka obsahuje zoznam stránok, ktoré presmerovávajú na iné presmerovacie stránky.\nKaždý riadok obsahuje odkaz na prvé a druhé presmerovanie a tiež prvý riadok z textu na ktorý odkazuje druhé presmerovanie, ktoré zvyčajne odkazuje na „skutočný“ cieľ, na ktorý má odkazovať prvé presmerovanie.\n<del>Prečiarknuté</del> položky boli vyriešené.",
        "double-redirect-fixed-move": "Stránka [[$1]] bola presunutá.\nBola automaticky aktualizovaná a teraz presmerováva na [[$2]]",
-       "double-redirect-fixed-maintenance": "V rámci úlohy údržby sa automaticky sa opravuje dvojité presmerovanie z [[$1]] na [[$2]].",
+       "double-redirect-fixed-maintenance": "V rámci úlohy údržby sa automaticky opravuje dvojité presmerovanie z [[$1]] na [[$2]]",
        "double-redirect-fixer": "Korektor presmerovaní",
        "brokenredirects": "Pokazené presmerovania",
        "brokenredirectstext": "Nasledovné presmerovania odkazujú na neexistujúce stránky:",
index 9104fc1..9d3b381 100644 (file)
        "tags-active-no": "کو",
        "tags-hitcount": "$1 {{PLURAL:$1|تبدیلی|تبدیلیاں}}",
        "diff-form": "فرق",
+       "newsection": "نواں سیکشن",
+       "newsection-submit": "ورقے تے ونڄو",
        "logentry-delete-delete": "$1 {{GENDER:$2|مٹایا ڳیا}} ورقہ $3",
        "logentry-delete-restore": "$1 {{GENDER:$2|بحال تھی ڳیوہے}} page $3 ($4)",
        "revdelete-content-hid": "مواد لکیا",
index 1ea89a1..7cfbd84 100644 (file)
        "permanentlink": "Trajna povezava",
        "permanentlink-revid": "ID redakcije",
        "permanentlink-submit": "Pojdi na redakcijo",
+       "newsection": "Nov razdelek",
+       "newsection-page": "Ciljna stran",
+       "newsection-submit": "Pojdi na stran",
        "dberr-problems": "Oprostite! Ta stran se sooča s tehničnimi težavami.",
        "dberr-again": "Poskusite počakati nekaj minut in ponovno naložite stran.",
        "dberr-info": "(Ne morem dostopati do zbirke podatkov: $1)",
index ee9fcad..702cd86 100644 (file)
        "rcfilters-clear-all-filters": "Rensa alla filter",
        "rcfilters-show-new-changes": "Visa de nyaste ändringarna sedan $1",
        "rcfilters-search-placeholder": "Filtrera senaste ändringar (använd menyn eller sök efter filternamn)",
+       "rcfilters-search-placeholder-mobile": "Filter",
        "rcfilters-invalid-filter": "Ogiltigt filter",
        "rcfilters-empty-filter": "Inga aktiva filter. Alla bidrag visas.",
        "rcfilters-filterlist-title": "Filter",
        "changecontentmodel": "Ändra innehållsmodell för en sida",
        "changecontentmodel-legend": "Ändra innehållsmodell",
        "changecontentmodel-title-label": "Sidtitel",
+       "changecontentmodel-current-label": "Nuvarande innehållsmodell:",
        "changecontentmodel-model-label": "Ny innehållsmodell",
        "changecontentmodel-reason-label": "Orsak:",
        "changecontentmodel-submit": "Ändra",
        "permanentlink": "Permanent länk",
        "permanentlink-revid": "Sidversions-ID",
        "permanentlink-submit": "Gå till sidversion",
+       "newsection": "Nytt avsnitt",
+       "newsection-page": "Målsida",
+       "newsection-submit": "Gå till sida",
        "dberr-problems": "Ursäkta! Denna sajt har just nu tekniska problem.",
        "dberr-again": "Pröva med att vänta några minuter och ladda om.",
        "dberr-info": "(Kan inte komma åt databasen: $1)",
index 41b5c2a..26fa5e9 100644 (file)
        "category-file-count-limited": "{{PLURAL:$1|парвандаи|$1 парвандаҳои}} зерин дар гурӯҳи феълӣ қарор {{PLURAL:дорад|доранд}}.",
        "listingcontinuesabbrev": "идома",
        "index-category": "Саҳифаҳои намояшуда",
-       "noindex-category": "СаҳиÑ\84аҳои Ð½Ð°Ð¼Ð¾Ð¸Ñ\8fнаÑ\88Ñ\83да",
+       "noindex-category": "СаҳиÑ\84аҳои Ð±ÐµÐ¸Ð½Ð´ÐµÐºÑ\81",
        "broken-file-category": "Саҳифаҳои дорои пайванди шикаста ба парванда",
        "about": "Дар бораи",
        "article": "Саҳифаи муҳтаво",
        "booksources-search": "Ҷустуҷӯ",
        "booksources-text": "Дер зер феҳристи пайвандҳо ба сомонаҳое, ки китобҳои нав ва кӯҳна мефурӯшанд, оварда шудааст. Мумкин аст, иттилооти бештарро дар бораи китобҳои ҷустуҷӯ кардаатон дошта бошанд:",
        "specialloguserlabel": "Иҷрокунанда:",
-       "speciallogtitlelabel": "Ҳадаф (унвон ё корбар):",
+       "speciallogtitlelabel": "Ҳадаф (унвон ё {{ns:user}}:номи корбар):",
        "log": "Гузоришҳо",
        "logeventslist-submit": "Намоиш",
        "all-logs-page": "Ҳамаи сабтҳои умумӣ",
        "emailccsubject": "Нусхаи номаи шумо ба $1: $2",
        "emailsent": "Почтаи электронӣ фиристода шуд",
        "emailsenttext": "Номаи почтаи электронии шумо фиристода шуд.",
+       "usermessage-editor": "Пайёмрасони системавӣ",
        "usermessage-template": "MediaWiki:UserMessage",
        "watchlist": "Феҳристи пайгирӣ",
        "mywatchlist": "Феҳристи пайгириҳо",
        "tooltip-pt-mycontris": "Феҳристи ҳиссагузориҳои {{GENDER:|Шумо}}",
        "tooltip-pt-login": "Тавсия мешавад ки ба система ворид шавед, лекин маҷбурӣ нест.",
        "tooltip-pt-logout": "Хуруҷ аз систем",
+       "tooltip-pt-createaccount": "Мо ба шумо пешниҳод мекунем, то ҳисоб эҷод намоед ва ба система вортд шавед, ин ҳатмӣ нест",
        "tooltip-ca-talk": "Баҳси матни таркибии ин саҳифа",
        "tooltip-ca-edit": "Вироиши ин саҳифа",
        "tooltip-ca-addsection": "Илова кардани бахши ҷадид",
        "spam_reverting": "Вогардони ба охирин нусхае, ки пайванде ба $1 надорад",
        "spam_blanking": "Ҳамаи нусхаҳои пайвандҳо $1 доштан, дар ҳоли холӣ кардан",
        "pageinfo-title": "Иттилооти \"$1\"",
+       "pageinfo-header-basic": "Иттилои одӣ",
        "pageinfo-header-edits": "Вироиши таърих",
+       "pageinfo-header-restrictions": "Ҳифозати саҳ.",
+       "pageinfo-header-properties": "Хусусиятҳои саҳ.",
        "pageinfo-display-title": "Сарлавҳаи намоишӣ",
        "pageinfo-default-sort": "Тартиб кардан ба унвони калидӣ (пешфарз)",
        "pageinfo-length": "Дарозии саҳифа (дар байт)",
        "pageinfo-firstuser": "Эчодгари саҳифа",
        "pageinfo-lastuser": "Охирин вироишгар",
        "pageinfo-lasttime": "Санаи вироиши охирин",
+       "pageinfo-edits": "Шумораи ҳамаи вироишот",
+       "pageinfo-magic-words": "{{PLURAL:$1|Калимаи|Калимаҳои}} сеҳрнок ($1)",
        "pageinfo-hidden-categories": "Пинҳон {{PLURAL:$1|гурӯҳ|гурӯҳҳо}} ($1)",
        "pageinfo-toolboxlink": "Иттилооти саҳифа",
        "pageinfo-contentpage-yes": "Бале",
        "tags-active-no": "На",
        "tags-edit": "вироиш",
        "tags-hitcount": "$1 {{PLURAL:$1|тағйир|тағйирот}}",
+       "newsection": "Ҷузъи нав",
+       "newsection-submit": "Ба саҳифа рафтан",
        "dberr-info": "(Имкони барқарори иртибот бо пойгоҳи дода вуҷуд надорад: $1)",
        "htmlform-invalid-input": "Бахши аз вуруди шумо мушкили дорад",
        "htmlform-select-badoption": "Миқдори воридшуда як гузинаи қобили қабул нест.",
index 5322a0f..b5c9119 100644 (file)
@@ -64,7 +64,8 @@
        "tog-watchlisthidebots": "Күзәтү исемлегемдә бот төзәтмәләре яшерелсен",
        "tog-watchlisthideminor": "Күзәтү исемлегемдә кече төзәтмәләр яшерелсен",
        "tog-watchlisthideliu": "Күзәтү исемлегемдә кергән кулланучыларның төзәтмәләре яшерелсен",
-       "tog-watchlistreloadautomatically": "Фильтр алмашкан очракта күзәтү исемлеген автоматик рәвештә яңартырга (JavaScript кирәк)",
+       "tog-watchlistreloadautomatically": "Сөзгеч һәр үзгәртүедән соң күзәтү исемлеген автояңартырга (JavaScript кирәк)",
+       "tog-watchlistunwatchlinks": "Үзгәрешләр белән күзәтелгән битләр өчен күзәтмәү/күзәтү ({{int:Watchlist-unwatch}}/{{int:Watchlist-unwatch-undo}}) туры тамгаларын өстәү (функцияләрен күчерү өчен JavaScript кирәк)",
        "tog-watchlisthideanons": "Күзәтү исемлегендә аноним кулланучыларның төзәтмәләре яшерелсен",
        "tog-watchlisthidepatrolled": "Күзәтү исемлегемдә тикшерелгән төзәтмәләр яшерелсен",
        "tog-watchlisthidecategorization": "Битләрне төркемләшү яшерелсен",
        "tog-norollbackdiff": "Кире кайтару ясагач юрамалар аермасы күрсәтелмәсен",
        "tog-useeditwarning": "Битне сакламыйча киткәндә мине кисәтергә",
        "tog-prefershttps": "Системага кергәндә һәрвакыт саклаулы тоташу кулланылсын",
+       "tog-showrollbackconfirmation": "Кире кайтару сылтамасына чирткәндә раслау соравын күрсәтергә",
        "underline-always": "Һәрвакыт",
        "underline-never": "Һичкайчан",
        "underline-default": "Браузер көйләнмәләре кулланылсын",
-       "editfont-style": "Үзгәртү өлкәсендәге шрифт тибы:",
-       "editfont-monospace": "Ð\9aиңÓ\99йÑ\82елгÓ\99н шрифт",
+       "editfont-style": "Үзгәртү өлкәсендәге шрифт төре:",
+       "editfont-monospace": "Тиң ÐºÐ¸Ò£Ð»ÐµÐºÐ»Ðµ шрифт",
        "editfont-sansserif": "Киртексез шрифт",
        "editfont-serif": "Киртекле шрифт",
-       "sunday": "Якшәмбе",
-       "monday": "Ð\94үшәмбе",
-       "tuesday": "Сишәмбе",
-       "wednesday": "Чәршәмбе",
-       "thursday": "Ð\9fәнҗешәмбе",
-       "friday": "Ò\96омга",
-       "saturday": "Шимбә",
+       "sunday": "якшәмбе",
+       "monday": "дүшәмбе",
+       "tuesday": "сишәмбе",
+       "wednesday": "чәршәмбе",
+       "thursday": "пәнҗешәмбе",
+       "friday": "Ò\97омга",
+       "saturday": "шимбә",
        "sun": "Якш",
        "mon": "Дүш",
        "tue": "Сиш",
        "category_header": "«$1» төркемендәге битләр",
        "subcategories": "Төркемчәләр",
        "category-media-header": "«$1» төркемендәге файллар",
-       "category-empty": "<em>Бу төркем әлегә буш.</em>",
+       "category-empty": "<em>Бу төркем хәзерге вакытта буш.</em>",
        "hidden-categories": "{{PLURAL:$1|1=Яшерен төркем|Яшерен төркемнәр}}",
        "hidden-category-category": "Яшерен төркемнәр",
-       "category-subcat-count": "{{PLURAL:$2|1=Әлеге төркем бары тик бу астөркемне генә үз өченә ала.|Әлеге төркемдә $2 астөркемдән бары тик $1 {{PLURAL:$1|астөркем}} генә күрсәтелгән.}}",
-       "category-subcat-count-limited": "Бу төркемдә {{PLURAL:$1|$1 төркемчә}}.",
-       "category-article-count": "{{PLURAL:$2|1=Әлеге төркемдә бер генә бит бар.|Әлеге төркемнең $2 {{PLURAL:$2|битеннән}} {{PLURAL:$1|$1 бит}} кенә курсәтелгән.}}",
-       "category-article-count-limited": "Бу төркемдә {{PLURAL:$1|$1 бит|1=бары тик бер бит}}.",
-       "category-file-count": "{{PLURAL:$2|1=Әлеге төркемдә бер генә файл бар.|Әлеге төркемдә $2 {{PLURAL:$2|файлдан}} {{PLURAL:$1|$1 файл}} гына курсәтелгән.}}",
-       "category-file-count-limited": "Бу төркемдә {{PLURAL:$1|$1 файл|1=бары тик бер файл}}.",
+       "category-subcat-count": "{{PLURAL:$2|Бу төркемдә тик түбәндәге төркемчә генә бар.|Бу төркемдә барлыгы $2 төркемчәдән түбәндәге {{PLURAL:$1|бер төркемчә генә|$1 төркемчә}} күрсәтелә.}}",
+       "category-subcat-count-limited": "Бу төркемдә түбәндәге {{PLURAL:$1|бер төркемчә генә|$1 төркемчә}} бар.",
+       "category-article-count": "{{PLURAL:$2|1=Бу төркемдә түбәндәге бер генә бит бар.|Бу төркемдәге барлыгы $2 биттән түбәндә {{PLURAL:$1|бер генә бит|$1 бит}} күрсәтелгән.}}",
+       "category-article-count-limited": "Бу төркемдә түбәндәге {{PLURAL:$1|1=бер генә бит|$1 бит}} бар.",
+       "category-file-count": "{{PLURAL:$2|Бу төркемдә түбәндәге бер генә файл бар.|Бу төркемдәге барлыгы $2 файлдан түбәндә  {{PLURAL:$1|бер генә файл|$1 файл}} күрсәтелгән.}}",
+       "category-file-count-limited": "Бу төркемдә түбәндәге {{PLURAL:$|1=бер генә файл|$1 файл}} бар.",
        "listingcontinuesabbrev": "дәвамы",
        "index-category": "Индексланган битләр",
-       "noindex-category": "Ð\91илгелÓ\99нмÓ\99Ò¯Ñ\87е битләр",
+       "noindex-category": "Ð\98ндекÑ\81ланмаган битләр",
        "broken-file-category": "Файлларга эшләми торган сылтамалар булган битләр",
+       "categoryviewer-pagedlinks": "($1) ($2)",
+       "category-header-numerals": "$1–$2",
        "about": "Тасвирлама",
        "article": "Мәкалә",
        "newwindow": "(яңа тәрәзәдә ачыла)",
        "history_short": "Тарих",
        "history_small": "тарих",
        "updatedmarker": "соңгы керүегездән соң яңартылган",
-       "printableversion": "Басма юрама",
+       "printableversion": "Басма версия",
        "permalink": "Даими сылтама",
        "print": "Бастыру",
        "view": "Карау",
        "ok": "Ярар",
        "pagetitle": "$1 — {{SITENAME}}",
        "pagetitle-view-mainpage": "{{SITENAME}}",
-       "retrievedfrom": "Чыганагы — \"$1\"",
+       "backlinksubtitle": "← $1",
+       "retrievedfrom": "Чыганагы — $1",
        "youhavenewmessages": "{{PLURAL:$3|Сездә}} $1 бар ($2).",
        "youhavenewmessagesfromusers": "{{PLURAL:$4|Сезгә}} {{PLURAL:$3|$3 кулланучыдан}} $1 килде ($2).",
        "youhavenewmessagesmanyusers": "Сез бик күп кулланучыдан $1 алдыгыз ($2).",
        "showtoc": "күрсәтү",
        "hidetoc": "яшерү",
        "collapsible-collapse": "төрү",
-       "collapsible-expand": "Ð\90чу",
+       "collapsible-expand": "ачу",
        "confirmable-confirm": "{{GENDER:$1|Шулаймы}}?",
        "confirmable-yes": "Әйе",
        "confirmable-no": "Юк",
        "thisisdeleted": "$1 караргамы яки торгызыргамы?",
        "viewdeleted": "$1 караргамы?",
        "restorelink": "Бетерелгән {{PLURAL:$1|1=төзәтмәне|$1 төзәтмәне}}",
-       "feedlinks": "ШÑ\83Ñ\88Ñ\8bлай:",
+       "feedlinks": "ТаÑ\81ма:",
        "feed-invalid": "Язылу каналы тибы ялгыш",
        "feed-unavailable": "Синдикация тасмасы ябык",
        "site-rss-feed": "$1 — RSS тасмасы",
        "site-atom-feed": "$1 — Atom тасмасы",
        "page-rss-feed": "«$1» — RSS тасмасы",
        "page-atom-feed": "«$1» — Atom тасмасы",
-       "feed-atom": "Atom-тасмасы",
-       "feed-rss": "RSS-тасмасы",
+       "feed-atom": "Atom",
+       "feed-rss": "RSS",
        "red-link-title": "$1 (бит барлыкта юк)",
        "sort-descending": "Кимү буенча урнаштыру",
        "sort-ascending": "Арту буенча урнаштыру",
        "nosuchspecialpage": "Шундый махсус бит юк",
        "nospecialpagetext": "<strong>Сез сорый торган махсус бит юк.</strong>\n\nМахсус битләр исемлеген карагыз: [[Special:SpecialPages|{{int:specialpages}}]].",
        "error": "Хата",
-       "databaseerror": "Мәгълүматлар базасында хата",
+       "databaseerror": "Мәгълүматлар базасы хатасы",
        "databaseerror-textcl": "Мәгълүмат базасында хата чыкты",
        "databaseerror-query": "Сорау: $1",
        "databaseerror-function": "Функция: $1",
        "directoryreadonlyerror": "«$1» каталогы уку өчен генә.",
        "directorynotreadableerror": "«$1» каталогы укылмый.",
        "filenotfound": "«$1» файлын табып булмый.",
-       "unexpected": "Көтелмәгән кыймәт: «$1»=«$2».",
-       "formerror": "Хата: форма мәгълүматларын тапшырып булмый",
+       "unexpected": "Көтелмәгән кыйммәт: «$1»=«$2».",
+       "formerror": "Хата: форма мәгълүматларын җибәреп булмый",
        "badarticleerror": "Бу биттә мондый гамәл башкарып булмый.",
        "cannotdelete": "«$1» исемле битне яки файлны бетереп булмый. Аны бүтән кулланучы бетергән булырга мөмкин.",
        "cannotdelete-title": "«$1» битен бетереп булмый",
        "perfcached": "Бу мәгълүматлар кэштан алынган, аларда соңгы үзгәртүләр булмаска мөмкин. Кэшта иң күбе {{PLURAL:$1|язма|$1 язмалар}}  саклана.",
        "perfcachedts": "Бу мәгълүматлар кэштан алынган, ул соңгы тапкыр $1 яңартылды. Кэшта иң күбе {{PLURAL:$4|язма}} саклана",
        "querypage-no-updates": "Хәзер бу битне яңартып булмый. Монда күрсәтелгән мәгълүматлар кабул ителмәячәк.",
-       "viewsource": "Ð\9aарау",
+       "viewsource": "ЧÑ\8bганакнÑ\8b Ðºарау",
        "viewsource-title": "$1 битенең чыганагын карау",
        "actionthrottled": "Тизлек киметелгән",
        "actionthrottledtext": "Спамга каршы көрәш өчен, аз вакыт эчендә бу гамәлне еш куллану тыелган һәм СЕз бирелгән вакытны бетергәнсез инде. Зинһар, соңарак кабатлагыз.",
        "editinginterface": "<strong>Игътибар:</strong> Сез программа тәэминатының интерфейс тексты булган битне үзгәртәсез. Бу башка кулланучыларга да тәэсир итәчәк.",
        "translateinterface": "Бу хәбәрнең текстын үзгәртү өчен яки өстәмәләр кертү өчен MediaWiki җирләштерү сайтын кулланыгыз [https://translatewiki.net/ translatewiki.net].",
        "cascadeprotected": "Бу бит үзгәртүдән сакланган, чөнки ул каскадлы саклау кабул ителгән {{PLURAL:$1|1=биткә|битләргә}} өстәлгән:\n$2",
-       "namespaceprotected": "'''$1''' исем киңлегендәге битләрне үзгәртү өчен сезнең рөхсәтегез юк.",
-       "customcssprotected": "Сез бу CSS-сәхифәне үзгәртә алмыйсыз, чөнки монда башка кулланучының шәхси көйләнмәләре саклана",
-       "customjsprotected": "Сез бу JavaScript-сәхифәне үзгәртә алмыйсыз, чөнк монда башка кулланучының шәхси көйләнмәләре саклана",
-       "mycustomcssprotected": "Сезнең әлеге CSS битен үзгәртергә хокукыгыз юк.",
-       "mycustomjsprotected": "Сезнең биттә JavaScript үзгәртергә хокукларыгыз юк.",
+       "namespaceprotected": "Сезнең <strong>$1</strong> исем киңлегендәге битләрне үзгәртергә хакыгыз юк.",
+       "customcssprotected": "Сезнең бу CSS битен үзгәртергә хакыгыз юк, чөнки анда башка кулланучының шәхси көйләнмәләре бар.",
+       "customjsonprotected": "Сезнең бу JSON битен үзгәртергә хакыгыз юк, чөнки анда башка кулланучының шәхси көйләнмәләре бар.",
+       "customjsprotected": "Сезнең бу JavaScript битен үзгәртергә хакыгыз юк, чөнки анда башка кулланучының шәхси көйләнмәләре бар.",
+       "sitecssprotected": "Сезнең бу CSS битен үзгәртергә хакыгыз юк, чөнки бу гамәл барлык килүчеләргә тәэсир итәргә мөмкин.",
+       "sitejsonprotected": "Сезнең бу JSON битен үзгәртергә хакыгыз юк, чөнки бу гамәл барлык килүчеләргә тәэсир итәргә мөмкин.",
+       "sitejsprotected": "Сезнең бу JavaScript битен үзгәртергә хакыгыз юк, чөнки бу гамәл барлык килүчеләргә тәэсир итәргә мөмкин.",
+       "mycustomcssprotected": "Сезнең бу CSS битен үзгәртергә хакыгыз юк.",
+       "mycustomjsonprotected": "Сезнең бу JSON битен үзгәртергә хакыгыз юк.",
+       "mycustomjsprotected": "Сезнең бу JavaScript битен үзгәртергә хакыгыз юк.",
+       "myprivateinfoprotected": "Сезнең үзегезнең шәхси мәгълүматыгызны үзгәртергә хакыгыз юк.",
+       "mypreferencesprotected": "Сезнең үзегезнең көйләнмәләрегезне үзгәртергә хакыгыз юк.",
        "ns-specialprotected": "Махсус битләрне үзгәртеп булмый.",
        "titleprotected": "Бу исем белән бит ясау [[User:$1|$1]] тарафыннан тыелган.\nУл күрсәткән сәбәп: <em>$2</em>.",
        "invalidtitle": "Ярамаган атама",
        "botpasswords-label-appid": "Бот исеме:",
        "botpasswords-label-create": "Төзү",
        "botpasswords-label-update": "Яңарту",
-       "botpasswords-label-cancel": "Ð\91аÑ\88 Ñ\82аÑ\80Ñ\82у",
+       "botpasswords-label-cancel": "Ð\9aиÑ\80е Ð°Ð»у",
        "botpasswords-label-delete": "Бетерү",
        "botpasswords-label-resetpassword": "Серсүзне ташлау",
        "botpasswords-label-grants": "Кулланылган рөхсәтләр:",
        "resetpass_forbidden-reason": "Серсүзләрне үзгәртергә мөмкин түгел: $1",
        "resetpass-no-info": "Бу битне карау өчен сез системага үз хисап язмагыз ярдәмендә керергә тиеш.",
        "resetpass-submit-loggedin": "Серсүзне үзгәртү",
-       "resetpass-submit-cancel": "Ð\9aиÑ\80е ÐºÐ°Ð³у",
+       "resetpass-submit-cancel": "Ð\9aиÑ\80е Ð°Ð»у",
        "resetpass-wrong-oldpass": "Хәзерге яисә вакытлы серсүз дөрес түгел.\nСез серсүзегезне үзгәрткән яисә яңа вакытлы серсүз сораткан булырга мөмкинсез.",
        "resetpass-temp-password": "Вакытлы серсүз:",
        "passwordreset": "Серсүзне бетерү",
        "savechanges": "Үзгәрешләрне саклау",
        "publishpage": "Бит төзү",
        "publishchanges": "Үзгәрешләр саклау",
-       "savearticle-start": "Битне саклау...",
+       "savearticle-start": "Битне саклау",
        "savechanges-start": "Үзгәрешләрне саклау…",
-       "publishpage-start": "Битне бастыру...",
+       "publishpage-start": "Бит төзү…",
        "publishchanges-start": "Төзәтмәләрне бастыру...",
        "preview": "Алдан карау",
        "showpreview": "Алдан карау",
        "template-semiprotected": "(өлешчә якланган)",
        "hiddencategories": "Бу бит $1 {{PLURAL:$1|яшерен төркемгә|$1 яшерен төркемнәргә}} керә:",
        "nocreatetext": "{{SITENAME}}: сайтта яңа битләр төзү чикләнгән.\nСез артка кайтып, төзелгән битне үзгәртә аласыз. [[Special:UserLogin|Керергә яисә теркәлергә]] тәгъдим ителә.",
-       "nocreate-loggedin": "СезгÓ\99 Ñ\8fңа Ð±Ð¸Ñ\82лÓ\99Ñ\80 Ñ\82өзү Ñ\85окÑ\83кÑ\8b Ð±Ð¸Ñ\80елмÓ\99гÓ\99н.",
+       "nocreate-loggedin": "Сезнең Ñ\8fңа Ð±Ð¸Ñ\82лÓ\99Ñ\80не Ñ\82өзеÑ\80гÓ\99 Ñ\85акÑ\8bгÑ\8bз Ñ\8eк.",
        "sectioneditnotsupported-title": "Бүлекләрне үзгәртү рөхсәт ителми.",
        "sectioneditnotsupported-text": "Бу биттә бүлекләрне үзгәртү рөхсәт ителми.",
        "permissionserrors": "Керү хатасы",
-       "permissionserrorstext": "Түбәндәге {{PLURAL:$1|1=сәбәп|сәбәпләр}} аркасында сез бу гамәлне башкара алмыйсыз:",
-       "permissionserrorstext-withaction": "$2 гамәлен башкара алмыйсыз. {{PLURAL:$1|1=Сәбәбе|Сәбәпләре}}:",
+       "permissionserrorstext": "Түбәндәге {{PLURAL:$1|1=сәбәп|сәбәпләр}} аркасында сезнең моны эшләргә хакыгыз юк:",
+       "permissionserrorstext-withaction": "Түбәндәге {{PLURAL:$1|1=сәбәп|сәбәпләр}} аркасында сезнең $2 хакыгыз юк:",
        "recreate-moveddeleted-warn": "'''Игътибар: Сез бетерелгән бит урынына яңа бит ясамакчы буласыз.'''\n\nСезгә чыннан да бу битне яңадан ясау кирәкме?\nТүбәндә битнең бетерү һәм күчерү көндәлеге китерелә:",
        "moveddeleted-notice": "Бу бит бетерелгән.\nТүбәндә бу битнең бетерелү, якланышы һәм күчерелү көндәлекләре китерелә.",
        "log-fulllog": "Көндәлекне тулысынча карау",
        "edit-gone-missing": "Битне яңартып булмый.\nУл бетерелгән булырга мөмкин.",
        "edit-conflict": "Үзгәртү конфликты.",
        "edit-no-change": "Текстта үзгәешләр ясалмау сәбәпле, сезнең үзгәртү кире кагыла.",
-       "postedit-confirmation-created": "Бит төзелде",
+       "postedit-confirmation-created": "Бит төзелде.",
+       "postedit-confirmation-restored": "Бит торгызылды.",
        "postedit-confirmation-saved": "Төзәтмәгез сакланды.",
-       "edit-already-exists": "Яңа бит төзеп булмый.\nУл инде бар.",
+       "postedit-confirmation-published": "Сезнең төзәтмәгез сакланган.",
+       "edit-already-exists": "Яңа бит төзеп булмый.\nУл бар инде.",
+       "defaultmessagetext": "Башлангыч текст",
        "invalid-content-data": "Яраксыз эчтәлек",
        "editwarning-warning": "Башка биткә күчү вакытында бу мәкаләгә керткән үзгәрешләр югалырга мөмкин.\nӘгәрдә сез теркәлгән булсагыз, бу искәрмәне сез көйләнмәләрегезнең «{{int:prefs-editing}}» бүлегендә үзгәртә аласыз.",
        "slot-name-main": "Төп",
        "revdelete-show-file-submit": "Әйе",
        "logdelete-selected": "Көндәлекнең {{PLURAL:$1|1=сайланган язмасы|сайланган язмалары}}:",
        "revdelete-legend": "Чикләүләр урнаштыр:",
-       "revdelete-hide-text": "Үзгәртү тексты",
-       "revdelete-hide-image": "Файл эчендәгеләрне качыр",
-       "revdelete-hide-name": "Ð\93амÓ\99лне Ò»Ó\99м ÐºÓ©Ð¹Ð»Ó\99Ò¯не яшерү",
+       "revdelete-hide-text": "Төзәтмә тексты",
+       "revdelete-hide-image": "Файлның эчтәлеген яшерү",
+       "revdelete-hide-name": "Ð\9cакÑ\81аÑ\82нÑ\8b Ò»Ó\99м Ñ\85аÑ\81иÑ\8fÑ\82лÓ\99Ñ\80не яшерү",
        "revdelete-hide-comment": "Үзгәрешләр аңлатмасы",
        "revdelete-hide-user": "Кулланучы исеме/IP-адрес",
        "revdelete-hide-restricted": "Мәгълүматлар идарәчеләрдән дә яшерелсен",
        "logdelete-success": "Вакыйганың күренүчәнлеге үзгәртелде.",
        "logdelete-failure": "'''Көндәлекнең күренүчәнлеге  куелмады:'''\n$1",
        "revdel-restore": "күренүчәнлекне үзгәртү",
-       "pagehist": "битнең тарихы",
+       "pagehist": "Ð\91итнең тарихы",
        "deletedhist": "Бетерүләр тарихы",
        "revdelete-otherreason": "Башка/өстәмә сәбәп:",
        "revdelete-reasonotherlist": "Башка сәбәп",
        "textmatches": "Бит эчтәлегендә тиңдәшлек",
        "notextmatches": "Тиңдәш текстлы битләр юк",
        "prevn": "алдагы {{PLURAL:$1|$1}}",
-       "nextn": "чираттагы {{PLURAL:$1|$1}}",
+       "nextn": "киләсе {{PLURAL:$1|$1}}",
        "prev-page": "алдагы бит",
        "next-page": "киләсе бит",
-       "prevn-title": "Алдагы $1  {{PLURAL:$1|язма}}",
-       "nextn-title": "{{PLURAL:$1|Киләсе $1 язма}}",
+       "prevn-title": "Алдагы $1 {{PLURAL:$1|язма}}",
+       "nextn-title": "Киләсе $1 {{PLURAL:$1|язма}}",
        "shown-title": "Сәхифәдә $1 {{PLURAL:$1|язма}} күрсәтелсен",
-       "viewprevnext": "Күрсәтелүе: ($1 {{int:pipe-separator}} $2) ($3)",
+       "viewprevnext": "($1 {{int:pipe-separator}} $2) ($3) карарга",
        "searchmenu-exists": "<strong>Бу вики-проектта «[[:$1]]» исемле бит бар инде</strong>{{PLURAL:$2|0=|Башка эзләү нәтиҗәләрен дә карап ал.}}",
        "searchmenu-new": "<strong>Әлеге вики-проектта «[[:$1]]» исемле бит ясарга!</strong>\n{{PLURAL:$2|0=|Шулай ук, эзләү ярдәмендә табылган битне карагыз.|Шулай ук, эзләү ярдәмендә табылган битләрне карагыз.}}",
        "searchprofile-articles": "Төп битләр",
        "searchprofile-advanced": "Киңәйтелгән",
        "searchprofile-articles-tooltip": "$1 дә эзләү",
        "searchprofile-images-tooltip": "Файллар эзләү",
-       "searchprofile-everything-tooltip": "Барлык битләрдән эзләү",
+       "searchprofile-everything-tooltip": "Барлык битләрдә эзләү (бәхәс битләрендә дә)",
        "searchprofile-advanced-tooltip": "Бирелгән исемнәр мәйданында эзләү",
        "search-result-size": "$1 ({{PLURAL:$2|$2 сүз}})",
        "search-result-category-size": "$1 {{PLURAL:$1|әгъза}} ($2 {{PLURAL:$2|астөркем}}, $3 {{PLURAL:$3|файл}})",
        "search-redirect": "($1 битеннән юнәлтү)",
        "search-section": "($1 бүлеге)",
-       "search-category": "($1 категориясе)",
+       "search-category": "($1 төркеме)",
        "search-file-match": "(файл эчтәлеге белән туры килә)",
        "search-suggest": "Бәлки, сез моны эзлисез: $1",
        "search-rewritten": "$1 нәтижәсе күрсәтелгән. $2 урынына эзләргә.",
        "search-relatedarticle": "Бәйле",
        "searchrelated": "бәйле",
        "searchall": "барысы",
-       "showingresults": "Аста №<strong>$2</strong> башлап {{PLURAL:$1|<strong>1</strong> нәтиҗә күрсәтелгән}}.",
-       "search-showingresults": "{{PLURAL:$4|<strong>$3</strong> нәтиҗәдән <strong>$1</strong>| <strong>$3</strong> нәтиҗәләрдән <strong>$1 — $2</strong>}}",
-       "search-nonefound": "Сорауга туры килгән нәтиҗәләр табылмады.",
-       "powersearch-legend": "Өстәмә эзләү",
-       "powersearch-ns": "исемнәрендә эзләү",
-       "powersearch-togglelabel": "Тамгалау:",
-       "powersearch-toggleall": "Барысы",
-       "powersearch-togglenone": "Берни юк",
-       "powersearch-remember": "Сайланган алдагы эзләүләр өчен истә калдырылсын",
+       "showingresults": "Түбәндә <strong>$2</strong>&nbsp;№ башлап {{PLURAL:$1|<strong>бер генә</strong> нәтиҗә|<strong>$1</strong> нәтиҗә}} күрсәтелгән.",
+       "showingresultsinrange": "Түбәндә {{PLURAL:$1|<strong>бер</strong>|<strong>$1</strong>}} нәтиҗәгә кадәр <strong>$2</strong> — <strong>$3</strong> колачында күрсәтелгән.",
+       "search-showingresults": "{{PLURAL:$4|Нәтиҗә: <strong>$3</strong> дан <strong>$1</strong>|Нәтиҗәләр: <strong>$3</strong> дан <strong>$1 — $2</strong>}}",
+       "search-nonefound": "Сорауга туры килгән нәтиҗәләр табылмаган.",
+       "search-nonefound-thiswiki": "Бу сайтта сорауга туры килгән нәтиҗәләр табылмаган.",
+       "powersearch-legend": "Киңәйтелгән эзләү",
+       "powersearch-ns": "Исемнәр киңлекләрендә эзләү:",
+       "powersearch-togglelabel": "Билгеләргә:",
+       "powersearch-toggleall": "Барысы да",
+       "powersearch-togglenone": "Берни дә",
+       "powersearch-remember": "Киләчәк эзләүләр өчен сайлауны истә калдырырга",
        "search-external": "Читтән эзләү",
        "search-error": "Эзләгән вакытта хата килеп чыкты:$1",
        "preferences": "Көйләнмәләр",
        "prefs-editwatchlist-label": "Күзәтү исемлеге язмаларын үзгәртү:",
        "prefs-editwatchlist-edit": "Күзәтү исемлегеннән исемнәрне карау һәм сөртү",
        "prefs-editwatchlist-raw": "Күзәтү исемлеген текстсыман үзгәртү",
-       "prefs-editwatchlist-clear": "Күзәтү исемлеген чистарту",
+       "prefs-editwatchlist-clear": "Күзәтү исемлеген бушату",
        "prefs-watchlist-days": "Күзәтү исемлегендә күрсәтелгән көннәр саны:",
        "prefs-watchlist-days-max": "Иң күбе $1 {{PLURAL:$1|1=көн|көн}}",
        "prefs-watchlist-edits": "Күзәтү исемлегендә күрсәтү өчен үзгәрешләрнең иң зур саны:",
        "stub-threshold": "Ясалма сылтамаларның бизәлеше буенча чикләүләр ($1):",
        "stub-threshold-sample-link": "мисал",
        "stub-threshold-disabled": "Сүнгән",
-       "recentchangesdays": "СоңгÑ\8b Ò¯Ð·Ð³Ó\99Ñ\80Ñ\82үлÓ\99Ñ\80не ÐºÒ¯Ñ\80Ñ\81Ó\99Ñ\82Ò¯Ñ\87е ÐºÓ©Ð½Ð½Ó\99Ñ\80 Ñ\81анÑ\8b:",
+       "recentchangesdays": "Ð\9dиÑ\87Ó\99 ÐºÓ©Ð½ Ñ\8dÑ\87ендÓ\99 Ñ\81оңгÑ\8b Ò¯Ð·Ð³Ó\99Ñ\80еÑ\88лÓ\99Ñ\80не ÐºÒ¯Ñ\80Ñ\81Ó\99Ñ\82еÑ\80гÓ\99:",
        "recentchangesdays-max": "(иң күбе $1 {{PLURAL:$1|көн}})",
        "recentchangescount": "Төп буларак кулланучы соңгы үзгәртүләр исемелегендә, тарихта һәм көндәлектә булган үзгәртүләр саны:",
        "prefs-help-recentchangescount": "Иң күбе: 1000",
        "email-blacklist-label": "Әлеге кулланучыларга минем электрон почтага хат җибәрүне тыярга:",
        "prefs-searchoptions": "Эзләү",
        "prefs-namespaces": "Исемнәр киңлекләре",
-       "default": "килеÑ\88Ò¯ Ð±Ñ\83енÑ\87а",
+       "default": "гадÓ\99Ñ\82Ñ\82Ó\99ге",
        "prefs-files": "Файллар",
        "prefs-custom-css": "Шәхси CSS",
-       "prefs-custom-json": "Ð\9aÑ\83лланма JSON",
+       "prefs-custom-json": "ШÓ\99Ñ\85Ñ\81и JSON",
        "prefs-custom-js": "Шәхси JS",
        "prefs-common-config": "Барлык бизәлешләр өчен гомуми CSS/JSON/JavaScript:",
        "prefs-reset-intro": "Бу бит сезнең көйләнмәләрегезне бетерү өчен кулланыла. Бу эшне башкару нәтиҗәсендә сез яңадан үз көйләнмәләрне яңадан кайтара алмыйсыз.",
        "prefs-emailconfirm-label": "E-mail раслау",
        "youremail": "Электрон почта:",
        "username": "{{GENDER:$1|Кулланучы исеме}}:",
-       "prefs-memberingroups": "{{PLURAL:$1|Төркем}} {{GENDER:$2|әгъзасы}}:",
+       "prefs-memberingroups": "{{PLURAL:$1|Төркем|Төркемнәр}} {{GENDER:$2|әгъзасы}}:",
        "prefs-memberingroups-type": "$1",
        "group-membership-link-with-expiry": "$1 ($2 кадәр)",
        "prefs-registration": "Теркәлү вакыты:",
        "yourrealname": "Чын исем:",
        "yourlanguage": "Тел:",
        "yourvariant": "Эчтәлекнең тел варианты:",
+       "prefs-help-variant": "Бу вики битләренең эчтәлеген күрсәтү өчен өстенлек бирелгән тел варианты яки орфография.",
        "yournick": "Яңа имзагыз:",
        "prefs-help-signature": "Бәхәслек битләрендә сезнең язмаларыгызны калдыру «<nowiki>~~~~</nowiki>» тамгалары куелу нәтиҗәсендә булырга тиеш.",
        "badsig": "Яраксыз имза. \nHTML-тамгалар тикшерегез.",
        "prefs-signature": "Имза",
        "prefs-dateformat": "Вакытың форматы",
        "prefs-timeoffset": "Вакыт билгеләнеше",
-       "prefs-advancedediting": "Гомуми көйләүләр",
+       "prefs-advancedediting": "Гомуми көйләнмәләр",
        "prefs-developertools": "Девелопер кораллары",
-       "prefs-editor": "Ð\9cÓ©Ñ\85Ó\99Ñ\80Ñ\80иÑ\80",
+       "prefs-editor": "ТөзÓ\99Ñ\82кеÑ\87",
        "prefs-preview": "Алдан карау",
-       "prefs-advancedrc": "Киңәйтелгән көйләүләр",
-       "prefs-advancedrendering": "Киңәйтелгән көйләүләр",
-       "prefs-advancedsearchoptions": "Киңәйтелгән көйләүләр",
-       "prefs-advancedwatchlist": "Киңәйтелгән көйләүләр",
+       "prefs-advancedrc": "Киңәйтелгән көйләнмәләр",
+       "prefs-advancedrendering": "Киңәйтелгән көйләнмәләр",
+       "prefs-advancedsearchoptions": "Киңәйтелгән көйләнмәләр",
+       "prefs-advancedwatchlist": "Киңәйтелгән көйләнмәләр",
        "prefs-displayrc": "Күрсәтү көйләнмәләре",
        "prefs-displaywatchlist": "Күрсәтү көйләнмәләре",
+       "prefs-changesrc": "Күрсәтелгән үзгәрешләр",
+       "prefs-changeswatchlist": "Күрсәтелгән үзгәрешләр",
        "prefs-pageswatchlist": "Күзәтелгән битләр",
        "prefs-tokenwatchlist": "Токен",
-       "prefs-diffs": "ЮÑ\80амалаÑ\80 Ð°ÐµÑ\80маÑ\81Ñ\8b",
+       "prefs-diffs": "Ð\90еÑ\80малÑ\8bклаÑ\80",
        "userrights": "Кулланучы хокуклары",
        "userrights-lookup-user": "Кулланучыны сайлау",
        "userrights-user-editname": "Кулланучының исемен кертегез:",
-       "editusergroup": "Кулланучының төркемнәрен кую",
+       "editusergroup": "Кулланучы төркемнәрен төяү",
        "editinguser": "{{GENDER:$1|Кулланучы}} <strong>[[User:$1|$1]]</strong> $2 хокукларын үзгәртү",
        "userrights-editusergroup": " {{GENDER:$1|Кулланучының}} төркемнәрен алмаштыру",
        "saveusergroups": "{{GENDER:$1|Кулланучы}} төркемнәрен саклау",
        "userrights-groupsmember-auto": "Билгесез әгъза:",
        "userrights-groups-help": "Сез бу кулланучының хокукларын үзгәртә алмыйсыз.\n*Әгәр дә кулланучы исеме янда тамга торса, димәк бу кулланучы бирелгән төркемнең әгъзасы.\n*Әгәр дә кулланучы исеме янда тамга тормаса, димәк бу кулланучы бирелгән төркемнең әгъзасы түгел.\n*\"*\" тамгасы торса сез бу кулланучыны бу төркемнән бетерә алмыйсыз.",
        "userrights-reason": "Сәбәп:",
-       "userrights-no-interwiki": "Сезнең башка викиларда кулланучыларның хокукларын үзгәртергә хокукларыгыз юк.",
+       "userrights-no-interwiki": "Сезнең башка викиларда кулланучы хокукларын үзгәртергә хакыгыз юк.",
        "userrights-nodatabase": "Бирелгән $1 базасы юк яисә  локаль булып тормый.",
        "userrights-changeable-col": "Сезнең тарафтан үзгәртелми торган төркемнәр",
        "userrights-unchangeable-col": "Сезнең тарафтан үзгәртелми торган төркемнәр",
        "right-managechangetags": "[[Special:Tags|Тамгалар]] төзү һәм (де)активлаштыру",
        "right-deletechangetags": "Мәгълүматлар базасыннан [[Special:Tags|тамгалар]] бетерү",
        "grant-group-email": "Хатлар җибәрү",
+       "grant-rollback": "Битләр үзгәрешләрен кире кайтару",
        "grant-uploadfile": "Яңа файллар төяү",
        "grant-basic": "Төп хокуклар",
        "newuserlogpage": "Кулланучыларны теркәү көндәлеге",
        "newuserlogpagetext": "Яңа теркәлгән кулланучылар исемлеге",
        "rightslog": "Кулланучының хокуклары көндәлеге",
        "action-read": "бу битне уку",
-       "action-edit": "бу битне үзгәртү",
+       "action-edit": "бу битне үзгәртергә",
        "action-createpage": "бу битне төзү",
        "action-createtalk": "бу бәхәс битен төзү",
        "action-createaccount": "бу кулланучы язмасын ясау",
        "rcfilters-quickfilters-placeholder-title": "Сакланган сөзгечләр юк әле",
        "rcfilters-savedqueries-defaultlabel": "Сакланган сөзгечләр",
        "rcfilters-savedqueries-rename": "Исемен үзгәртү",
-       "rcfilters-savedqueries-setdefault": "Ð\9aилеÑ\88Ò¯ Ð±Ñ\83енÑ\87а дип кую",
-       "rcfilters-savedqueries-unsetdefault": "Ð\9aилеÑ\88Ò¯ Ð±Ñ\83енÑ\87а дип куймаю",
+       "rcfilters-savedqueries-setdefault": "Ð\93адÓ\99Ñ\82Ñ\82Ó\99ге дип кую",
+       "rcfilters-savedqueries-unsetdefault": "Ð\93адÓ\99Ñ\82Ñ\82Ó\99ге дип куймаю",
        "rcfilters-savedqueries-remove": "Бетерү",
        "rcfilters-savedqueries-new-name-label": "Исем",
        "rcfilters-savedqueries-new-name-placeholder": "Сөзгечнең максатын язып бирегез",
        "rcfilters-savedqueries-apply-label": "Сөзгеч төзү",
-       "rcfilters-savedqueries-apply-and-setdefault-label": "Ð\9aилеÑ\88Ñ\83 Ð±Ñ\83енÑ\87а сөзгеч төзү",
+       "rcfilters-savedqueries-apply-and-setdefault-label": "Ð\93адÓ\99Ñ\82Ñ\82Ó\99ге сөзгеч төзү",
        "rcfilters-savedqueries-cancel-label": "Кире алу",
        "rcfilters-savedqueries-add-new-title": "Хәзерге сөзгеч көйләнмәләрен саклау",
-       "rcfilters-restore-default-filters": "Ð\9aилеÑ\88Ò¯ Ð±Ñ\83енÑ\87а сөзгечләрне торгызу",
+       "rcfilters-restore-default-filters": "Ð\93адÓ\99Ñ\82Ñ\82Ó\99ге сөзгечләрне торгызу",
        "rcfilters-clear-all-filters": "Барлык сөзгечләрне бушату",
        "rcfilters-show-new-changes": "$1 башлап яңа үзгәрешләрне карау",
        "rcfilters-search-placeholder": "Үзгәрешләрне сөзү (меню кулланыгыз яки сөзгеч аты буенча эзлигез)",
        "rcfilters-filter-major-description": "«Кече» дип билгеләнмәгән төзәтмәләр.",
        "rcfilters-filtergroup-watchlist": "Күзәтү исемлегендәге битләр",
        "rcfilters-filter-watchlist-watched-label": "Күзәтү исемлегендә",
+       "rcfilters-filter-watchlistactivity-unseen-label": "Каралмаган үзгәрешләр",
+       "rcfilters-filter-watchlistactivity-seen-label": "Каралган үзгәрешләр",
        "rcfilters-filtergroup-changetype": "Үзгәртү төре",
        "rcfilters-filter-pageedits-label": "Бит төзәтмәләре",
        "rcfilters-filter-newpages-label": "Бит төзүләре",
        "rcfilters-liveupdates-button": "Автояңарту",
        "rcfilters-watchlist-markseen-button": "Барлык үзгәрешләрне каралган дип билгеләргә",
        "rcfilters-watchlist-edit-watchlist-button": "Күзәтү исемлегегезне үзгәртү",
-       "rcfilters-watchlist-showupdated": "Сезнең соңгы төзәтмәләрдән соң үзгәргән битләр <strong>калын</strong> һәм тулы маркер белән күрсәтелгән",
+       "rcfilters-watchlist-showupdated": "Сез карап чыгудан соң үзгәртелгән битләрдәге үзгәрешләр <strong>калын</strong> хәрефләр һәм тоташ маркер белән аерып күрсәтелгән.",
        "rcfilters-preference-label": "JavaScript тан башка интерфейсын куллану",
        "rcnotefrom": "Астарак <strong>$3, $4</strong> өчен {{PLURAL:$5|үзгәрешләр күрсәтелгән}} (<strong>$1</strong> артык түгел).",
        "rclistfrom": "$3 $2 башлап яңа үзгәрешләрне күрсәтү",
        "rc-enhanced-expand": "Ваклыкларны күрсәтү",
        "rc-enhanced-hide": "Ваклыкларны яшерү",
        "rc-old-title": "башта «$1» буларак ясала",
-       "recentchangeslinked": "Бәйләнешле үзгәртүләр",
-       "recentchangeslinked-feed": "Бәйләнешле үзгәртүләр",
+       "recentchangeslinked": "Бәйләнешле үзгәрешләр",
+       "recentchangeslinked-feed": "Бәйләнешле үзгәрешләр",
        "recentchangeslinked-toolbox": "Бәйләнешле үзгәрешләр",
        "recentchangeslinked-title": "\"$1\" битенә бәйләнешле үзгәртүләр",
        "recentchangeslinked-summary": "Бу битттән яисә бу биткә сылтаган битләрдәге үзгәртмәле карау өчен битнең исемен кертегез. (Билгеле бер төркемгә караган битләрне карау өчен {{ns:category}}:Төркем исемен языгыз).[[Special:Watchlist|Күзәтү исемлегегезгә]] керә торган битләр '''калын''' итеп күрсәтелгән.",
        "recentchangeslinked-page": "Битң исеме:",
        "recentchangeslinked-to": "Моның урынына бу биткә бәйле булган битләрдәге үзгәртүләрне күрсәтү",
+       "recentchanges-page-added-to-category": "[[:$1]] төркемгә өстәлгән",
+       "recentchanges-page-removed-from-category": "[[:$1]] төркемнән алынган",
+       "autochange-username": "MediaWiki автоүзгәртү",
        "upload": "Файл төяү",
        "uploadbtn": "Файл төяү",
        "reuploaddesc": "Файл төявен кире кагу",
        "listfiles_user": "Кулланучы",
        "listfiles_size": "Зурлык",
        "listfiles_description": "Тасвир",
-       "listfiles_count": "ЮÑ\80амалар",
-       "listfiles-latestversion": "Ð\90гÑ\8bмдагÑ\8b Ñ\8eÑ\80ама",
+       "listfiles_count": "Ð\92еÑ\80Ñ\81иÑ\8fлÓ\99р",
+       "listfiles-latestversion": "Ð¥Ó\99зеÑ\80ге Ð²ÐµÑ\80Ñ\81иÑ\8f",
        "listfiles-latestversion-yes": "Әйе",
        "listfiles-latestversion-no": "Юк",
        "file-anchor-link": "Файл",
        "sharedupload-desc-here": "Бу файл $1 проектыннан һәм башка проектларда кулланырга мөмкин. \nФайл турында [$2 тулырак мәгълүмат] түбәндәрәк күрсәтелгән.",
        "filepage-nofile": "Шундый исемле файл барлыкта юк.",
        "filepage-nofile-link": "Мондый исемле файл  юк. Сез аны [$1 йөкли аласыз].",
-       "uploadnewversion-linktext": "Бу файлның яңа юрамасын йөкләү",
+       "uploadnewversion-linktext": "Бу файлның яңа версиясен төяү",
        "shared-repo-from": "$1 дән",
        "shared-repo": "гомуми саклагыч",
        "upload-disallowed-here": "Сез бу файлны яңарта алмыйсыз.",
        "statistics-header-hooks": "Башка статистика",
        "statistics-articles": "Мәкаләләр саны",
        "statistics-pages": "Битләр саны",
-       "statistics-pages-desc": "Ð\91аÑ\80лÑ\8bк Ð²Ð¸ÐºÐ¸, Ð±Ó\99Ñ\85Ó\99Ñ\81, ÐºÒ¯Ñ\87еÑ\80Ò¯ Ò»Ó\99м Ð±Ð°Ñ\88ка Ð±Ð¸Ñ\82лÓ\99Ñ\80не Ð´Ó\99 Ð¸Ñ\81Ñ\82Ó\99 Ñ\82оÑ\82Ñ\8bп.",
-       "statistics-files": "Ð\99өклÓ\99нелгән файллар",
+       "statistics-pages-desc": "Ð\92икидагÑ\8b Ð±Ð°Ñ\80лÑ\8bк Ð±Ð¸Ñ\82лÓ\99Ñ\80, Ð±Ó\99Ñ\85Ó\99Ñ\81, Ñ\8eнÓ\99лÑ\82Ò¯ Ð±Ð¸Ñ\82лÓ\99Ñ\80ен Ò»Ó\99м Ð±Ð°Ñ\88ка ÐºÐµÑ\80Ñ\82еп.",
+       "statistics-files": "ТөÑ\8fлгән файллар",
        "statistics-edits": "{{grammar:genitive|{{SITENAME}}}} проекты ачылганнан бирле булган барлык үзгәртүләр исәбе",
        "statistics-edits-average": "Бер биткә уртача үзгәртүләр исәбе",
        "statistics-users": "Теркәлгән кулланучылар",
        "apisandbox-results": "Нәтиҗәләр",
        "apisandbox-continue": "Дәвам итү",
        "apisandbox-continue-clear": "Чистарту",
+       "apisandbox-multivalue-all-namespaces": "$1 (Барлык исемнәр киңлекләре)",
+       "apisandbox-multivalue-all-values": "$1 (Барлык мәгънәләр)",
        "booksources": "Китап чыганаклары",
        "booksources-search-legend": "Китап чыганакларыны эзләү",
+       "booksources-isbn": "ISBN:",
        "booksources-search": "Эзләү",
        "booksources-text": "Әлеге биттә күрсәтелгән сылтамалар ярәмендә сезнең кызыксындырган китап буенча өстәмә мәгълүматлар табарга мөмкин. Болар интернет-кибетләр һәм китапханә җыентыгында эзләүче системалар.",
        "booksources-invalid-isbn": "Бирелгән ISBN саны бәлки хаталдыр. Зинһар, бирелгән саннарны яңадан тикшерегез.",
        "speciallogtitlelabel": "Максат (атама яки {{ns:user}}:кулланучы исеме):",
        "log": "Көндәлекләр",
        "logeventslist-submit": "Күрсәтү",
+       "logeventslist-tag-log": "Тамгалар көндәлеге",
        "all-logs-page": "Барлык көндәлекләр",
        "alllogstext": "{{SITENAME}} сәхифәсенең гомуми көндәлекләре исемлеге.\nСез нәтиҗәләрне көндәлек төре, кулланучы исеме (хәреф зурлыгын истә тотыгыз) яки куззаллаган бит (шулай ук хәреф зурлыгын истә тотыгыз) буенча тәртипкә салырга мөмкин.",
        "logempty": "Кирәкле язмалар көндәлектә юк.",
        "rollback-confirmation-yes": "Кире кайтару",
        "rollback-confirmation-no": "Кире алу",
        "rollbacklink": "кире кайтару",
-       "rollbacklinkcount": "$1 {{PLURAL:$1|төзәтмәне}} кире кагу",
+       "rollbacklinkcount": "$1 {{PLURAL:$1|төзәтмәне}} кире кайтару",
+       "rollbacklinkcount-morethan": "$1 күбрәк {{PLURAL:$1|төзәтмәне}} кире кайтару",
+       "rollbackfailed": "Кире кайтарып булмады",
        "editcomment": "Үзгәртүләр тасвирламасы: <em>$1</em>.",
        "revertpage": "[[Special:Contributions/$2|$2]] үзгәртүләре ([[User talk:$2|бәхәс]])  [[User:$1|$1]] юрамасына кадәр кире кайтарылды",
        "changecontentmodel-title-label": "Битнең исеме",
        "protect-expiring-local": "$1 тәмамлана",
        "protect-expiry-indefinite": "Вакыт чикләнмәгән",
        "protect-cascade": "Бу биткә кергән битләрне яклау (каскадлы яклау)",
-       "protect-cantedit": "Сез бу битнең яклау дәрәҗәсене үзгәрә алмыйсыз, чөнки сездә аны үзгәртергә рөхсәтегез юк.",
+       "protect-cantedit": "Сез бу битнең яклау дәрәҗәсен үзгәрә алмыйсыз, чөнки сезнең аны үзгәртергә хакыгыз юк.",
        "protect-othertime": "Башка вакыт:",
        "protect-othertime-op": "башка вакыт",
        "protect-existing-expiry": "Хәзерге тәмамлану вакыты: $2 $3",
        "whatlinkshere": "Бирегә нәрсә сылтый",
        "whatlinkshere-title": "$1 битенә сылтый торган битләр",
        "whatlinkshere-page": "Бит:",
-       "linkshere": "'''$1''' битенә чираттагы битләр сылтый:",
+       "linkshere": "<strong>$2</strong> битенә түбәндәге битләр сылтыйлар:",
        "nolinkshere": "'''$1''' битенә башка битләр сылтамыйлар.",
        "isredirect": "юнәлтү бите",
        "istemplate": "кертүләр",
        "move-page-legend": "Битне күчерү",
        "movepagetext": "Астагы форманы куллану битнең исемен алыштырып, аның барлык тарихын яңа исемле биткә күчерер.\nИске исемле бит яңа исемле биткә юнәлтү булып калыр.\nСез иске исемгә юнәлтүләрне автоматик рәвештә яңа исемгә күчерә аласыз.\nӘгәр моны эшләмәсәгез, [[Special:DoubleRedirects|икеле]] һәм [[Special:BrokenRedirects|өзелгән юнәлтүләрне]] тикшерегез.\nСез барлык сылтамаларның кирәкле җиргә сылтавына җаваплы.\n\nКүздә тотыгыз: әгәр яңа исем урынында бит булса инде, һәм ул буш яки юнәлтү түгел исә, бит <strong>күчерелмәячәк</strong>.\nБу шуны аңлата: сез ялгышып күчерсәгез, битне кайтара аласыз, әмма инде булган битне бетерә алмыйсыз.\n\n<strong>Искәрмә:</strong>\nПопуляр битләрне күчерү зур һәм көтелмәгән нәтиҗәләргә китерә ала.\nДәвам иткәнче, барлык нәтиҗәләрне аңлавыгызны тагын бер кат уйлагыз.",
        "movepagetalktext": "Бу пунктны сайлаган очракта, аның бәхәс бите дә автоматик рәвештә күчереләчәк, әгәрдә шундый исемле башка тулы бәхәс бите булмаса.\n\nБу очракларда сезгә битләрне үзегезгә күчерергә туры киләчәк.",
-       "movenotallowed": "Сездә мәкаләләрне күчерү хокуклары юк.",
+       "movenotallowed": "Сезнең мәкаләләрне күчерергә (исем алмаштырырга) хакыгыз юк.",
+       "movenotallowedfile": "Сезнең файлларны күчерергә (исем алмаштырырга) хакыгыз юк.",
+       "cant-move-user-page": "Сезнең кулланучы төп битләрен күчерергә (исем алмаштырырга) хакыгыз юк.",
+       "cant-move-to-user-page": "Сезнең битне кулланучы битенә күчерергә хакыгыз юк (кулланучы асбитенә ярый).",
+       "cant-move-category-page": "Сезнең төркем битләрен күчерергә (исем алмаштырырга) хакыгыз юк.",
+       "cant-move-to-category-page": "Сезнең битне төркем битенә күчерергә хакыгыз юк.",
+       "cant-move-subpages": "Сезнең асбитләрне күчерергә (исем алмаштырырга) хакыгыз юк.",
        "newtitle": "Яңа исем:",
        "move-watch": "Бу битне күзәтү",
        "movepagebtn": "Битне күчерү",
        "movetalk": "Бәйләнешле бәхәс битен күчерү",
        "movelogpage": "Күчерү көндәлеге",
        "movesubpage": "{{PLURAL:$1|1=Асбит|Асбитләр}}",
+       "movenosubpage": "Бу битнең асбитләре юк.",
        "movereason": "Сәбәп:",
        "revertmove": "кире кайту",
        "delete_and_move_confirm": "Әйе, битне бетерү",
        "export-download": "Файл буларак саклау",
        "allmessages": "Система хәбәрләре",
        "allmessagesname": "Исем",
-       "allmessagesdefault": "Баштан ук куелган текс",
+       "allmessagesdefault": "Башлангыч текст",
        "allmessagestext": "Бу исемлек MediaWiki исемнәр мәйданында булган система хәбәрләренең исемлеге.\nГомуми MediaWiki локализациясендә катнашырга теләсәгез, зинһар [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation MediaWiki Локализациясе] һәм [https://translatewiki.net translatewiki.net] сәхифәләрне кулланыгыз.",
        "allmessages-filter-legend": "Сөзгеч",
        "allmessages-filter-unmodified": "Үзгәртелмәгән",
        "tooltip-t-emailuser": "{{GENDER:$1|Бу кулланучыга}} хат җибәрү",
        "tooltip-t-upload": "Файллар төяү",
        "tooltip-t-specialpages": "Барлык махсус битләр исемлеге",
-       "tooltip-t-print": "Бу битнең басма юрамасы",
+       "tooltip-t-print": "Бу битнең басма версиясе",
        "tooltip-t-permalink": "Битнең бу юрамасына даими сылтама",
        "tooltip-ca-nstab-main": "Мәкаләнең эчтәлеге",
        "tooltip-ca-nstab-user": "Кулланучының шәхси бите",
        "tooltip-rollback": "\"Кире кайтару\" соңгы кулланучының бу биттә ясаган '''барлык''' үзгәртүләрен бетерә.",
        "tooltip-undo": "Бу үзгәртүне алдан карап үткәрмәү. Шулай ук үткәрмәүнең сәбәбен язып була.",
        "tooltip-preferences-save": "Көйләнмәләрегезне саклау",
-       "tooltip-summary": "Кыска исемен кертү",
+       "tooltip-summary": "Кыскача аңлатманы кертегез",
        "common.css": "/*  Монда урнаштырылган CSS башкаларында да урнашачак */",
        "anonymous": "{{grammar:genitive|{{SITENAME}}}} {{PLURAL:$1|1=Аноним кулланучысы|Аноним кулланучылары}}",
        "siteuser": "{{SITENAME}} кулланучысы $1",
        "pageinfo-header-restrictions": "Битне яклау",
        "pageinfo-header-properties": "Битнең үзенчәлекләре",
        "pageinfo-display-title": "Күренмә башлык",
-       "pageinfo-default-sort": "Гадәти сайлау ачкычы",
-       "pageinfo-length": "Бит озынлыгы (байтларда)",
+       "pageinfo-default-sort": "Гадәттәге тәртипләү ачкычы",
+       "pageinfo-length": "Бит озынлыгы (байт)",
+       "pageinfo-namespace": "Исемнәр киңлеге",
        "pageinfo-article-id": "Бит идентификаторы",
        "pageinfo-language": "Битнең теле",
        "pageinfo-language-change": "үзгәртү",
        "metadata-fields": "Бу исемлеккә кергән метабирелмәләр кырлары рәсем битендә күрсәтелер, калганнары исә килешү буенча яшерелер.\n* make\n* model\n* datetimeoriginal\n* exposuretime\n* fnumber\n* isospeedratings\n* focallength\n* artist\n* copyright\n* imagedescription\n* gpslatitude\n* gpslongitude\n* gpsaltitude",
        "namespacesall": "барысы",
        "monthsall": "барысы",
-       "recreate": "Яңадан ясау",
+       "invalidateemail": "Электрон почта адресын раслауны кире алу",
+       "recreate": "Яңадан төзү",
+       "unit-pixel": "нкт",
        "confirm_purge_button": "Ярар",
        "confirm-purge-top": "Бу битнең кэшы чистартылсынмы?",
        "confirm-purge-bottom": "Кэшны чистартудан соң аның соңгы юрамасы күрсәтеләчәк.",
        "imgmultipagenext": "киләсе бит →",
        "imgmultigo": "Күчү!",
        "imgmultigoto": "$1 битенә күчү",
+       "img-lang-default": "(гадәттәге тел)",
        "img-lang-go": "Башкару",
        "ascending_abbrev": "үсү",
        "descending_abbrev": "кимү",
        "table_pager_empty": "Нәтиҗә юк",
        "autoredircomment": "[[$1]] битенә юнәлтү",
        "autosumm-new": "Яңа бит: «$1»",
+       "size-bytes": "$1 {{PLURAL:$1|байт}}",
+       "size-kilobytes": "$1 Кб",
+       "size-megabytes": "$1 Мб",
+       "size-gigabytes": "$1 Гб",
+       "size-terabytes": "$1 Тб",
+       "size-petabytes": "$1 Пб",
+       "size-exabytes": "$1 Эб",
+       "size-zetabytes": "$1 Зб",
+       "size-yottabytes": "$1 Иб",
+       "size-pixel": "$1 {{PLURAL:$1|нокта}}",
+       "size-kilopixel": "$1 Кнкт",
+       "size-megapixel": "$1 Мнкт",
+       "size-gigapixel": "$1 Гнкт",
+       "size-terapixel": "$1 Тнкт",
+       "size-petapixel": "$1 Пнкт",
+       "size-exapixel": "$1 Энкт",
+       "size-zetapixel": "$1 Знкт",
+       "size-yottapixel": "$1 Инкт",
+       "bitrate-bits": "$1 б/с",
+       "bitrate-kilobits": "$1 Кб/с",
+       "bitrate-megabits": "$1 Мб/с",
+       "bitrate-gigabits": "$1 Гб/с",
+       "bitrate-terabits": "$1 Тб/с",
+       "bitrate-petabits": "$1 Пб/с",
+       "bitrate-exabits": "$1 Эб/с",
+       "bitrate-zetabits": "$1 Зб/с",
+       "bitrate-yottabits": "$1 Иб/с",
        "watchlistedit-raw-titles": "Язмалар:",
        "watchlistedit-raw-submit": "Исемлекне саклау",
+       "watchlistedit-clear-title": "Күзәтү исемлеген бушату",
+       "watchlistedit-clear-legend": "Күзәтү исемлеген бушату",
+       "watchlistedit-clear-explain": "Күзәтү исемлегендә барлык язмалар бетереләчәк",
        "watchlistedit-clear-titles": "Башлык:",
+       "watchlistedit-clear-submit": "Күзәтү исемлеген бушату (кире кайтарып булмый!)",
+       "watchlistedit-clear-done": "Сезнең күзәтү исемлегегез бушатылды.",
+       "watchlistedit-clear-jobqueue": "Күзәтү исемлеге бушатуы бара. Моның өчен бераз вакыт кирәк!",
+       "watchlistedit-clear-removed": "{{PLURAL:$1|Бер генә язма|$1 язма}} бетерелде:",
+       "watchlistedit-too-many": "Биредә күрсәтү өчен битләр саны артык күп.",
        "watchlisttools-clear": "Күзәтү исемлеген бушату",
-       "watchlisttools-view": "СоңгÑ\8b Ò¯Ð·Ð³Ó\99Ñ\80Ñ\82үлÓ\99Ñ\80не ÐºÒ¯Ñ\80Ñ\81Ó\99Ñ\82Ò¯",
+       "watchlisttools-view": "Ð\98Ñ\81емлекÑ\82Ó\99ге Ð±Ð¸Ñ\82лÓ\99Ñ\80ендÓ\99 Ò¯Ð·Ð³Ó\99Ñ\80еÑ\88лÓ\99Ñ\80",
        "watchlisttools-edit": "Күзәтү исемлеген карау һәм үзгәртү",
        "watchlisttools-raw": "Текст сыман үзгәртү",
+       "iranian-calendar-m1": "хәмәл",
+       "iranian-calendar-m2": "сәвер",
+       "iranian-calendar-m3": "җәүза",
+       "iranian-calendar-m4": "саратан",
+       "iranian-calendar-m5": "әсәт",
+       "iranian-calendar-m6": "сөмбелә",
+       "iranian-calendar-m7": "мизан",
+       "iranian-calendar-m8": "гакрәп",
+       "iranian-calendar-m9": "кавәс",
+       "iranian-calendar-m10": "җәди",
+       "iranian-calendar-m11": "дәлү",
+       "iranian-calendar-m12": "хут",
        "hijri-calendar-m1": "Мөхәррәм",
-       "hijri-calendar-m7": "Раҗәб",
+       "hijri-calendar-m2": "Сәфәр",
+       "hijri-calendar-m3": "Рабигыль-әүвәл",
+       "hijri-calendar-m4": "Рабигыль-ахыр",
+       "hijri-calendar-m5": "Җөмадиәл-әүвәл",
+       "hijri-calendar-m6": "Җөмадиәл-ахыр",
+       "hijri-calendar-m7": "Рәҗәп",
+       "hijri-calendar-m8": "Шәгъбан",
        "hijri-calendar-m9": "Рамазан",
+       "hijri-calendar-m10": "Шәүвәл",
+       "hijri-calendar-m11": "Зөлкагдә",
+       "hijri-calendar-m12": "Зөлхиҗҗә",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|бәхәс]])",
+       "timezone-local": "Җирле",
        "duplicate-defaultsort": "Игътибар. Уйланма куелган \"$2\" бүлгәләү ачкычы элеккеге уйланма куелган \"$1\" бүлгәләү ачкычын үзгәртә.",
-       "version": "ЮÑ\80ама",
+       "version": "Ð\92еÑ\80Ñ\81иÑ\8f",
        "version-extensions": "Куелган киңәйтүләр",
        "version-specialpages": "Махсус битләр",
+       "version-editors": "Төзәткечләр",
+       "version-antispam": "Спам кисәтү",
        "version-other": "Башка",
        "version-hook-subscribedby": "Түбәндәгеләргә язылган:",
        "version-no-ext-name": "[исемсез]",
        "version-ext-license": "Лицензия",
        "version-ext-colheader-name": "Киңәйтүләр",
        "version-skin-colheader-name": "Күренеш",
-       "version-ext-colheader-version": "ЮÑ\80ама",
+       "version-ext-colheader-version": "Ð\92еÑ\80Ñ\81иÑ\8f",
        "version-ext-colheader-license": "Лицензия",
        "version-ext-colheader-description": "Тасвирлама",
        "version-ext-colheader-credits": "Авторлар",
        "version-software-version": "Версия",
        "version-entrypoints-header-url": "URL",
        "version-libraries-library": "Китапханә",
-       "version-libraries-version": "ЮÑ\80ама",
+       "version-libraries-version": "Ð\92еÑ\80Ñ\81иÑ\8f",
        "version-libraries-license": "Лицензия",
        "version-libraries-description": "Тасвирлама",
        "version-libraries-authors": "Авторлар",
        "redirect-revision": "Бит юрамасы",
        "redirect-file": "Файл исеме",
        "fileduplicatesearch": "Бер үк файлларны эзләү",
+       "fileduplicatesearch-filename": "Файл исеме:",
        "fileduplicatesearch-submit": "Эзләү",
        "fileduplicatesearch-info": "$1 × $2 нокта<br />Файл зурлыгы: $3<br />MIME төре: $4",
        "specialpages": "Махсус битләр",
        "specialpages-group-maintenance": "Техник карау хисапнамәсе",
        "specialpages-group-other": "Башка махсус битләр",
        "specialpages-group-login": "Керү / Теркәлү",
-       "specialpages-group-changes": "Соңгы үзгәртүләр",
+       "specialpages-group-changes": "Соңгы үзгәрешләр һәм көндәлекләр",
        "specialpages-group-media": "Йөкләү һәм медиа-файллар хисапнамәсе",
        "specialpages-group-users": "Кулланучылар һәм аларның хокуклары",
        "specialpages-group-highuse": "Еш кулланылучы битләр",
        "specialpages-group-pages": "Битләр исемлеге",
        "specialpages-group-pagetools": "Бит өчен кораллар",
-       "specialpages-group-wiki": "Мәгълүмат һәм җиһазлар",
+       "specialpages-group-wiki": "Мәгълүматлар һәм кораллар",
        "specialpages-group-redirects": "Күчерелүче махсус битләр",
        "specialpages-group-spam": "Спамга каршы кораллар",
        "blankpage": "Буш бит",
        "tag-filter": "[[Special:Tags|Тамгалар]] сөзгече:",
        "tag-filter-submit": "Сөзү",
        "tag-list-wrapper": "[[Special:Tags|{{PLURAL:$1|1=Тамга|Тамгалар}}]]: $2",
+       "tag-mw-new-redirect": "яңа юнәлтү",
+       "tag-mw-removed-redirect": "юнәлтү бетерелгән",
+       "tag-mw-changed-redirect-target": "юнәлтү максаты үзгәртелгән",
+       "tag-mw-blank": "бушату",
+       "tag-mw-replace": "алмаштыру",
+       "tag-mw-rollback": "кире кайтару",
        "tags-title": "Тамгалар",
-       "tags-intro": "Әлеге сәхифәдә төзәтүләрне билгеләгән, программа тәэмин итә торган теглар исемлеге һәм шул тегларның аңламнары китерелгән.",
+       "tags-intro": "Бу биттә программа тарафыннан төзәтмәне билгеләү өчен кулланылган тамгалар һәм аларның мәгънәсе исемлеге китерелгән",
        "tags-tag": "Тамга исеме",
+       "tags-display-header": "Үзгәрешләр исемлегендә күренеше",
+       "tags-description-header": "Мәгънәсенең тулы тасвирламасы",
        "tags-source-header": "Чыганак",
+       "tags-active-header": "Кулланыштамы?",
+       "tags-hitcount-header": "Тамгаланган үзгәрешләр",
+       "tags-actions-header": "Гамәлләр",
        "tags-active-yes": "Әйе",
        "tags-active-no": "Юк",
        "tags-source-extension": "Тәэминат тарафыннан билгеләнә",
        "tags-activate": "активлаштыру",
        "tags-deactivate": "сүндерү",
        "tags-hitcount": "$1 {{PLURAL:$1|үзгәреш}}",
+       "tags-manage-no-permission": "Сезнең үзгәртү тамгаларын идарә итәргә хакыгыз юк.",
        "tags-create-heading": "Яңа тамга төзү",
        "tags-create-tag-name": "Билге исеме:",
        "tags-create-reason": "Сәбәп:",
        "tags-create-submit": "Төзү",
        "tags-delete-title": "Тамга бетерү",
        "tags-delete-reason": "Сәбәп:",
+       "tags-delete-no-permission": "Сезнең үзгәртү тамгаларын бетерергә хакыгыз юк.",
        "tags-activate-title": "Тамга активлаштыру",
        "tags-activate-reason": "Сәбәп:",
        "tags-activate-not-found": "«$1» тамгасы барлыкта юк.",
        "tags-activate-submit": "Активлаштыру",
        "tags-deactivate-reason": "Сәбәп:",
        "tags-deactivate-submit": "Өзергә",
+       "tags-apply-no-permission": "Сезнең үзегезнең үзгәрешләренә үзгәртү тамгаларын кулланырга хакыгыз юк.",
+       "tags-update-no-permission": "Сезнең аерым юрамалардан яки көндәлек язмалардан үзгәртү тамгаларын өстәргә яки бетерергә хакыгыз юк.",
        "tags-edit-title": "Тамгаларны үзгәртү",
+       "tags-edit-manage-link": "Тамгаларны идарә итү",
        "tags-edit-existing-tags": "Бар тамгалар:",
        "tags-edit-existing-tags-none": "<em>Юк</em>",
        "tags-edit-new-tags": "Яңа тамгалар:",
+       "tags-edit-add": "Бу тамгаларны өстәү:",
        "tags-edit-remove": "Бу тамгалар бетерү:",
        "tags-edit-remove-all-tags": "(бөтен тамгалар бетерү)",
        "tags-edit-reason": "Сәбәп:",
        "logentry-newusers-create": "{{GENDER:$2|Кулланучы}} $1 хисап язмасын төзеде",
        "logentry-newusers-create2": "$1 - $3 исемле хисап язмасы {{GENDER:$2|төзеде}}",
        "logentry-newusers-autocreate": "{{GENDER:$2|кулланучының}} автоматик рәвештә $1 хисап язмасы төзелде",
-       "logentry-upload-upload": "$1 {{GENDER:$2|йөкләде}} $3",
-       "logentry-upload-overwrite": "$1 $3 өчен яңа юрама {{GENDER:$2|йөкләде}}",
+       "logentry-upload-upload": "$1 {{GENDER:$2|төяде}} $3",
+       "logentry-upload-overwrite": "$1 $3 өчен яңа версия {{GENDER:$2|төяде}}",
+       "logentry-upload-revert": "$1 $3 өчен иске версияне кире {{GENDER:$2|кайтарды}}",
+       "log-name-tag": "Тамгалар көндәлеге",
        "rightsnone": "(юк)",
        "feedback-adding": "Фикерне сәхифәгә өстәү ...",
        "feedback-back": "Кирегә",
-       "feedback-bugnew": "Мин тикшердем. Яңа хата турында хәбәр итү",
+       "feedback-bugnew": "Мин тикшердем. Яңа хата турында белдерү",
        "feedback-bugornote": "Әгәр дә сез техник проблеманы җентекләп тасвирларга әзер икәнсез, зинһар өчен, [$1 хата турында хәбәр итегез].\nБашка очракта сез түбәндәге гади форманы куллана аласыз. Сезнең шәрехләмә \"[$3 $2]\" сәхифәсенә сезнең кулланучы исеме һәм сез кулланган браузер исеме белән бергә өстәләчәк.",
        "feedback-cancel": "Кире алу",
        "feedback-close": "Тәмам",
        "expand_templates_output": "Нәтиҗә",
        "expand_templates_ok": "Ярар",
        "expand_templates_preview": "Алдан карау",
+       "pagelanguage": "Бит телен үзгәртү",
        "pagelang-name": "Бит",
        "pagelang-language": "Тел",
+       "pagelang-use-default": "Гадәттәге телне кулланырга",
+       "pagelang-select-lang": "Телне сайлагыз",
+       "pagelang-reason": "Сәбәп",
+       "pagelang-submit": "Җибәрү",
+       "pagelang-nonexistent-page": "$1 бите барлыкта юк.",
+       "right-pagelang": "Бит телен үзгәртү",
+       "action-pagelang": "бит телен үзгәртергә",
        "default-skin-not-found-row-enabled": "* <code>$1</code> / $2 (ачык)",
        "default-skin-not-found-row-disabled": "* <code>$1</code> / $2 (<strong>ябык</strong>)",
-       "mediastatistics": "Медиа хисабы",
+       "mediastatistics": "Медиа статистикасы",
+       "mediastatistics-header-unknown": "Билгесез",
        "mediastatistics-header-audio": "Аудио",
        "mediastatistics-header-video": "Видео",
+       "mediastatistics-header-office": "Документлар",
+       "mediastatistics-header-executable": "Башкарылган",
        "special-characters-group-latin": "Латин",
        "special-characters-group-latinextended": "Латин (киңәйтелгән)",
        "special-characters-group-ipa": "ХФӘ (IPA)",
-       "special-characters-group-symbols": "Тамгалар",
+       "special-characters-group-symbols": "Ð\91илгелÓ\99р",
        "special-characters-group-greek": "Грек",
        "special-characters-group-greekextended": "Грек (киңәйтелгән)",
        "special-characters-group-cyrillic": "Кирилл",
        "log-action-filter-managetags-delete": "Тамга бетерү",
        "log-action-filter-managetags-activate": "Тамга активлаштыру",
        "log-action-filter-managetags-deactivate": "Тамга өзү",
+       "log-action-filter-protect-protect": "Яклау",
        "authmanager-email-label": "Электрон почта",
        "authmanager-email-help": "Электрон почта адресы",
-       "authmanager-realname-label": "Чын исеме",
+       "authmanager-realname-label": "Чын исем",
+       "authmanager-realname-help": "Кулланычының чын исеме",
+       "authprovider-confirmlink-failed-line": "$1: $2",
        "authprovider-resetpass-skip-label": "Калдыру",
        "edit-error-short": "Хата: $1",
        "edit-error-long": "Хаталар:\n\n$1",
        "specialmute": "Белдерүсез",
+       "specialmute-submit": "Раслау",
+       "mute-preferences": "Белдерүсез көйләнмәләре",
        "revid": "юрама $1",
        "pagedata-title": "Бит мәгълүматлары",
+       "pagedata-bad-title": "Яраксыз атама: $1.",
        "passwordpolicies-group": "Төркем",
        "passwordpolicies-policies": "Кагыйдәләр",
        "userlogout-continue": "Чыгасыгыз киләме?"
index 2f220ee..9fd4840 100644 (file)
        "changecontentmodel": "Змінити модель вмісту сторінки",
        "changecontentmodel-legend": "Змінити модель вмісту",
        "changecontentmodel-title-label": "Назва сторінки",
+       "changecontentmodel-current-label": "Поточна модель вмісту:",
        "changecontentmodel-model-label": "Нова модель вмісту",
        "changecontentmodel-reason-label": "Причина:",
        "changecontentmodel-submit": "Змінити",
        "permanentlink": "Постійне посилання",
        "permanentlink-revid": "Ідентифікатор версії",
        "permanentlink-submit": "Перейти до версії",
+       "newsection": "Новий розділ",
+       "newsection-page": "Цільова сторінка",
+       "newsection-submit": "Перейти до сторінки",
        "dberr-problems": "Вибачте! На цьому сайті виникли технічні труднощі.",
        "dberr-again": "Спробуйте оновити сторінку за кілька хвилин.",
        "dberr-info": "(неможливо з'єднатися з сервером баз даних: $1)",
index 4615ebb..f90ceb0 100644 (file)
@@ -87,6 +87,7 @@
        "tog-norollbackdiff": "استرجع کے بعد فرق نہ دکھائیں",
        "tog-useeditwarning": "غیر محفوظ تبدیلیاں چھوڑنے پر مجھے آگاہ کریں",
        "tog-prefershttps": "داخل رہنے کے دوران میں ہمیشہ محفوظ کنیکشن استعمال کریں",
+       "tog-showrollbackconfirmation": "استرجع کے ربط پر کلک کرنے کے بعد تصدیق کا پیغام دکھائیں",
        "underline-always": "ہمیشہ",
        "underline-never": "کبھی نہیں",
        "underline-default": "پوشاک یا براؤزر کا طے شدہ",
        "history-feed-item-nocomment": "بہ $2 $1",
        "history-feed-empty": "درخواست کردہ صفحہ موجود نہیں۔\nممکن ہے کہ اسے ویکی سے حذف کر دیا گیا ہو یا اِس کا نام تبدیل کردیا گیا ہو۔\nآپ متعلقہ نئے صفحات کو [[Special:Search|ویکی پر تلاش]] کرسکتے ہیں۔",
        "history-edit-tags": "منتخب نظرثانیوں کے ٹیگوں میں ترمیم کریں",
-       "rev-deleted-comment": "(تبصرہ حذف کی گيا ہے)",
-       "rev-deleted-user": "(صارف نام حذف کیا گيا ہے)",
+       "rev-deleted-comment": "خلاصہ ترمیم حذف کیا",
+       "rev-deleted-user": "صارف نام حذف کیا",
        "rev-deleted-event": "(نوشتہ کی تفصیلات ہٹا دی گئیں)",
        "rev-deleted-user-contribs": "[صارف نام یا آئی پی پتہ ہٹا دیا گیا - شراکتوں سے ترمیم پوشیدہ ہو گئی]",
        "rev-deleted-text-permission": "پیش نظر صفحہ کی یہ ترمیم <strong>حذف کر دی گئی ہے</strong>۔\nمزید تفصیلات [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} نوشتہ حذف شدگی] میں دیکھی جا سکتی ہیں۔",
        "revdelete-hide-text": "نظرثانی متن چھپاؤ",
        "revdelete-hide-image": "فائل کے مشمولات چھپائیں",
        "revdelete-hide-name": "ہدف اور پیرامیٹرز کو چھپائیں",
-       "revdelete-hide-comment": "ترÙ\85Û\8cÙ\85Û\8c ØªØ¨ØµØ±Û\81 Ú\86ھپاؤ",
+       "revdelete-hide-comment": "Ø®Ù\84اصÛ\81 ØªØ±Ù\85Û\8cÙ\85",
        "revdelete-hide-user": "ترمیم کنندہ کا صارف نام/آئی پی پتہ چھپائیں",
        "revdelete-hide-restricted": "منتظمین اور دیگر صارفین سے معلومات کو پوشیدہ کریں",
        "revdelete-radio-same": "(تبدیل مت کرو)",
index f98efd4..005e6ae 100644 (file)
        "sp-contributions-blocklog": "封鎖日誌",
        "sp-contributions-suppresslog": "壓制咗{{GENDER:$1|user}}嘅用戶貢獻",
        "sp-contributions-deleted": "刪除咗嘅用戶貢獻",
-       "sp-contributions-uploads": "上載",
+       "sp-contributions-uploads": "上載紀錄",
        "sp-contributions-logs": "日誌",
        "sp-contributions-talk": "傾偈",
        "sp-contributions-userrights": "用戶權限管理",
index 2e9a28f..e1e5426 100644 (file)
                        "Ps2049",
                        "Suchichi02",
                        "神樂坂秀吉",
-                       "WQL"
+                       "WQL",
+                       "Looong"
                ]
        },
        "tog-underline": "链接下划线:",
        "hidden-categories": "{{PLURAL:$1|隐藏分类}}",
        "hidden-category-category": "隐藏分类",
        "category-subcat-count": "{{PLURAL:$2|本分类只有以下子分类。|本分类有以下$1个子分类,共有$2个子分类。}}",
-       "category-subcat-count-limited": "æ\9c¬å\88\86ç±»æ\9c\89以ä¸\8b{{PLURAL:$1|å­\90å\88\86ç±»|$1个å­\90å\88\86ç±»}}。",
+       "category-subcat-count-limited": "æ­¤å\88\86ç±»æ\9c\89以ä¸\8b$1个å­\90å\88\86ç±»æ\88\96å¤\9a个$1å­\90å\88\86ç±»。",
        "category-article-count": "{{PLURAL:$2|本分类只含有以下页面。|以下{{PLURAL:$1|页面|$1个页面}}属于本分类,共$2个页面。}}",
        "category-article-count-limited": "以下{{PLURAL:$1|页面|$1个页面}}属于当前分类。",
        "category-file-count": "{{PLURAL:$2|本分类只含有以下文件。|以下{{PLURAL:$1|文件|$1个文件}}属于本分类,共$2个文件。}}",
        "redirectedfrom": "(重定向自$1)",
        "redirectpagesub": "重定向页面",
        "redirectto": "重定向至:",
-       "lastmodifiedat": "本页面最后编辑于$1 $2。",
-       "viewcount": "æ\9c¬é¡µé\9d¢å·²ç»\8f被访é\97®è¿\87{{PLURAL:$1|$1次}}。",
+       "lastmodifiedat": "在$2,此页面最后编辑于$1。",
+       "viewcount": "此页é\9d¢å·²ç»\8f被访é\97®è¿\87$1次。",
        "protectedpage": "受保护页面",
        "jumpto": "跳转至:",
        "jumptonavigation": "导航",
        "nstab-image": "文件",
        "nstab-mediawiki": "消息",
        "nstab-template": "模板",
-       "nstab-help": "帮助页面",
+       "nstab-help": "帮助",
        "nstab-category": "分类",
        "mainpage-nstab": "首页",
        "nosuchaction": "无此操作",
        "newarticle": "(新页面)",
        "newarticletext": "您点击了一个尚不存在的页面的链接。要创建该页面,请在下面的编辑框中输入内容(更多信息请见[$1 帮助页面])。如果您是错误地进入了此页面,请点击您的浏览器的<strong>返回</strong>按钮。",
        "anontalkpagetext": "----\n<em>这是一个还未建立账户的匿名用户的讨论页, 因此我们只能用IP地址来与他们联络。</em>该IP地址可能由几名用户共享。如果您是一名匿名用户并认为此页上的评语与您无关,请[[Special:CreateAccount|创建新账户]]或[[Special:UserLogin|登录]]以避免在未来与其他匿名用户混淆。",
-       "noarticletext": "æ\9c¬页面目前没有内容。您可以在其他页面中[[Special:Search/{{PAGENAME}}|搜索本页标题]]、<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} 搜索相关日志]或[{{fullurl:{{FULLPAGENAME}}|action=edit}} 创建本页面]</span>。",
-       "noarticletext-nopermission": "æ\9c¬页面目前没有内容。您可以在其他页面中[[Special:Search/{{PAGENAME}}|搜索本页标题]]或<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} 搜索相关日志]</span>,但您没有权限创建本页面。",
+       "noarticletext": "æ­¤页面目前没有内容。您可以在其他页面中[[Special:Search/{{PAGENAME}}|搜索本页标题]]、<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} 搜索相关日志]或[{{fullurl:{{FULLPAGENAME}}|action=edit}} 创建本页面]</span>。",
+       "noarticletext-nopermission": "æ­¤页面目前没有内容。您可以在其他页面中[[Special:Search/{{PAGENAME}}|搜索本页标题]]或<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} 搜索相关日志]</span>,但您没有权限创建本页面。",
        "missing-revision": "“{{FULLPAGENAME}}”的版本#$1不存在。\n\n这通常是因为进入了一个已被删除的页面的历史链接。详细信息可以在[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} 删除日志]中找到。",
        "userpage-userdoesnotexist": "用户账户“$1”没有注册。请在创建/编辑本页前检查。",
        "userpage-userdoesnotexist-view": "用户账户“$1”没有被注册。",
        "changecontentmodel": "更改一个页面的内容模型",
        "changecontentmodel-legend": "更改内容类型",
        "changecontentmodel-title-label": "页面标题",
+       "changecontentmodel-current-label": "当前的内容模型:",
        "changecontentmodel-model-label": "新的内容模型",
        "changecontentmodel-reason-label": "原因:",
        "changecontentmodel-submit": "更改",
        "movepagetext": "您可以使用下面的表单来重命名一个页面,同时将其所有版本历史移动到新页面。旧标题将会被重定向到新标题。您可以自动更新链接至原标题的重定向。如果您不选择这样做的话,请检查[[Special:DoubleRedirects|双重]]或[[Special:BrokenRedirects|损坏重定向]]链接。您有责任确保链接会被正确指向他们应该被指向的地方。\n\n注意:如果已存在使用新标题的页面,此页面将<strong>不会</strong>被移动,除非新页面是重定向,并且没有过去的编辑历史。这意味着您可在误操作后将页面移回原处,同时,您无法覆盖现有页面。\n\n<strong>注意:</strong>对这样一个经常被访问的页面而言这可能是一个重大且唐突的更改;请在行动前先了解您的修改可能带来的一切后果。",
        "movepagetext-noredirectfixer": "用下面的表单来重命名一个页面,并将其版本历史同时移动到新页面。老的页面将成为新页面的重定向页。请检查[[Special:DoubleRedirects|双重重定向]]或[[Special:BrokenRedirects|损坏重定向]]链接。您应当负责确定所有链接依然会链到指定的页面。\n\n注意如果新页面已经有内容的话,页面将<strong>不会</strong>被移动,除非新页面无内容或是重定向页,而且没有版本历史。这意味着您可在误操作后将页面移回原处,同时,您无法覆盖现有页面。\n\n<strong>注意:</strong>对一个经常被访问的页面而言这可能是一个重大且唐突的更改;请在行动前先确定您了解其所可能带来的后果。",
        "movepagetalktext": "如果您勾选此框,相关联的讨论页将被自动移动到新的标题,除非这里已经有了一个非空讨论页。\n\n在这种情况下,如有需要,您将不得不手动移动或合并页面。",
-       "moveuserpage-warning": "'''警告:'''你将移动一个用户页面。请注意,只有该页面会被移动,该用户''不''会被更名。",
+       "moveuserpage-warning": "'''警告:'''你将移动一个用户页面。请注意,只有该页面会被移动,该用户'''不会'''被更名。",
        "movecategorypage-warning": "<strong>警告:</strong>您将移动分类页面。请注意只有此页面将会移动,旧有分类的任何页面将<em>不会</em>同步移动。",
        "movenologintext": "您必须是一名登记用户并且[[Special:UserLogin|登录]]\n后才可移动一个页面。",
        "movenotallowed": "您没有权限移动页面。",
index 9613768..bd1d304 100644 (file)
                        "WQL",
                        "Tang891228",
                        "Winston Sung",
-                       "Sunny00217"
+                       "Sunny00217",
+                       "Viztor"
                ]
        },
        "tog-underline": "底線標示連結:",
        "nstab-image": "檔案",
        "nstab-mediawiki": "訊息",
        "nstab-template": "模板",
-       "nstab-help": "說明頁面",
+       "nstab-help": "說明",
        "nstab-category": "分類",
        "mainpage-nstab": "首頁",
        "nosuchaction": "無此動作",
        "search-interwiki-more": "(更多)",
        "search-interwiki-more-results": "更多結果",
        "search-relatedarticle": "相關",
+       "search-invalid-sort-order": "排序順序$1無法被識別,將使用預設排序。有效的順序為:$2",
+       "search-unknown-profile": "搜尋設定$1無法被識別,將使用預設設定。",
        "searchrelated": "相關",
        "searchall": "全部",
        "showingresults": "以下顯示從第 <strong>$2</strong> 筆開始,共 {{PLURAL:$1|<strong>1</strong> 筆結果|<strong>$1</strong> 筆結果}}:",
        "rcfilters-clear-all-filters": "清除所有篩選條件",
        "rcfilters-show-new-changes": "檢視自$1以來的新變更",
        "rcfilters-search-placeholder": "篩選變更(使用選單或搜尋篩選名稱)",
+       "rcfilters-search-placeholder-mobile": "篩選器",
        "rcfilters-invalid-filter": "無效的篩選條件",
        "rcfilters-empty-filter": "沒有使用中的過濾條件。已顯示所有的貢獻。",
        "rcfilters-filterlist-title": "篩選",
        "changecontentmodel": "變更頁面的內容模型",
        "changecontentmodel-legend": "變更內容模型",
        "changecontentmodel-title-label": "頁面標題",
+       "changecontentmodel-current-label": "目前內容模型:",
        "changecontentmodel-model-label": "新內容模型",
        "changecontentmodel-reason-label": "原因:",
        "changecontentmodel-submit": "變更",
        "sp-contributions-newbies": "僅顯示新帳號的貢獻",
        "sp-contributions-newbies-sub": "新帳號的貢獻",
        "sp-contributions-newbies-title": "新帳號的使用者貢獻",
-       "sp-contributions-blocklog": "封鎖記錄",
+       "sp-contributions-blocklog": "封鎖日誌",
        "sp-contributions-suppresslog": "已禁止顯示的{{GENDER:$1|使用者}}貢獻",
        "sp-contributions-deleted": "已刪除的{{GENDER:$1|使用者}}貢獻",
        "sp-contributions-uploads": "上傳",
-       "sp-contributions-logs": "記錄",
+       "sp-contributions-logs": "日誌",
        "sp-contributions-talk": "討論",
        "sp-contributions-userrights": "{{GENDER:$1|使用者}}權限管理",
        "sp-contributions-blocked-notice": "此使用者目前已被封鎖。\n以下為最近的封鎖紀錄以供參考:",
        "block-log-flags-angry-autoblock": "加強自動封鎖已開啟",
        "block-log-flags-hiddenname": "隱藏使用者名稱",
        "range_block_disabled": "管理員可建立範圍封鎖的權限已被關閉。",
+       "ipb-prevent-user-talk-edit": "必須允許被部分封鎖的使用者編輯他的使用者討論頁,除非該封鎖限制包含使用者討論命名空間。",
        "ipb_expiry_invalid": "無效的期限。",
        "ipb_expiry_old": "到期時間已過。",
        "ipb_expiry_temp": "隱藏使用者名稱的封鎖不可設定期限。",
        "move-page-legend": "移動頁面",
        "movepagetext": "以下表單可以用來重新命名一個頁面,並將該頁面的所有歷史記錄一併移至擁有新名稱的頁面。舊標題的頁面將會變成重新導向頁面,指向使用新標題的頁面。您可以選擇自動更新所有指向舊頁面的重新導向,讓它們改為指向新頁面。若您選擇不自動更新,請檢查有沒有[[Special:DoubleRedirects|雙重重新導向]]或[[Special:BrokenRedirects|損壞的重新導向]]需要修正。您有責任讓連結繼續指向正確的地方。\n\n請注意,若新的頁面名稱已經被使用,則此頁面將<strong>不會</strong>移動至該處,除非新名稱下是個重新導向頁面而且沒有任何編輯歷史。即是說,您可以將錯誤移動至其他名稱的頁面還原到原有名稱,但不能覆蓋任何現有的頁面。\n\n<strong>注意:</strong>這個動作對受歡迎的頁面來說可能是重大而唐突的變更;在行動前請先確認您了解移動可能帶來的後果。",
        "movepagetext-noredirectfixer": "以下表單可以用來重新命名一個頁面,並將該頁面的所有歷史記錄一併移至擁有新名稱的頁面。\n舊標題的頁面將會變成重新導向頁面,指向使用新標題的頁面。\n請檢查有沒有[[Special:DoubleRedirects|雙重重新導向]]或[[Special:BrokenRedirects|損壞的重新導向]]需要修正。\n您有責任讓連結繼續指向正確的地方。\n\n請注意,若新的頁面名稱已經被使用,則此頁面將<strong>不會</strong>移動至該處,除非新名稱下是個重新導向頁面而且沒有任何編輯歷史。\n即是說,您可以將錯誤移動至其他名稱的頁面還原到原有名稱,但不能覆蓋任何現有的頁面。\n\n<strong>注意:</strong>\n這個動作對受歡迎的頁面來說可能是重大而唐突的變更;\n在行動前請先確認您了解移動可能帶來的後果。",
+       "movepagetext-noredirectsupport": "以下表單可以用來重新命名一個頁面,並將該頁面的所有歷史記錄一併移至擁有新名稱的頁面。\n您有責任讓連結繼續指向正確的地方。\n\n請注意,若新的頁面名稱已經被使用,則此頁面將<strong>不會</strong>移動至該處。\n即是說,您可以將錯誤移動至其他名稱的頁面還原到原有名稱,但不能覆蓋任何現有的頁面。\n\n<strong>注意:</strong>\n這個動作對受歡迎的頁面來說可能是重大而唐突的變更;\n在行動前請先確認您了解移動可能帶來的後果。",
        "movepagetalktext": "若勾選此方塊,相關的討論頁面會自動與此頁面一起移動至新的位置,除非新的名稱已有一個存在的討論頁面。\n在此情況下,若有必要,您必須手動移動或合併已存在的頁面。",
-       "moveuserpage-warning": "<strong>警告:</strong>您正要移動使用者頁面,請注意只有使用者頁面會變更名稱,並<em>不會</em>重新命名使用者。",
+       "moveuserpage-warning": "<strong>警告:</strong>您正要移動使用者頁面,請注意只有使用者頁面會變更名稱,並<strong>不會</strong>重新命名使用者。",
        "movecategorypage-warning": "<strong>警告:</strong>您正要移動分類頁面。請注意此操作只會移動頁面,在舊分類中的頁面將<em>不會</em>移動到新的分類。",
        "movenologintext": "您必須是已註冊的使用者並且 [[Special:UserLogin|登入]] 才可移動頁面。",
        "movenotallowed": "您沒有權限移動頁面。",
        "permanentlink": "固定連結",
        "permanentlink-revid": "修訂版本ID",
        "permanentlink-submit": "前往修訂版本",
+       "newsection": "新章節",
+       "newsection-page": "目標頁面",
+       "newsection-submit": "前往頁面",
        "dberr-problems": "抱歉!這個網站出現了一些技術上的問題。",
        "dberr-again": "請稍後數分鐘後再試。",
        "dberr-info": "(無法存取資料庫:$1)",
        "linkaccounts": "連結帳號",
        "linkaccounts-success-text": "已連結帳號。",
        "linkaccounts-submit": "連結帳號",
+       "cannotunlink-no-provider-title": "沒有已連結的帳號可以取消連結",
+       "cannotunlink-no-provider": "沒有已連結的帳號可以取消連結。",
        "unlinkaccounts": "取消連結帳號",
        "unlinkaccounts-success": "已取消連結帳號。",
        "authenticationdatachange-ignored": "認證資料變更未被處理,可能未設定提供者?",
index d3167cc..16937d7 100644 (file)
@@ -100,6 +100,7 @@ $specialPageAliases = [
        'Mytalk'                    => [ 'Meine_Diskussionsseite' ],
        'Myuploads'                 => [ 'Meine_hochgeladenen_Dateien' ],
        'Newimages'                 => [ 'Neue_Dateien' ],
+       'NewSection'                => [ 'Neuer_Abschnitt' ],
        'Newpages'                  => [ 'Neue_Seiten' ],
        'PagesWithProp'             => [ 'Seiten_mit_Eigenschaften' ],
        'PageLanguage'              => [ 'Seitensprache' ],
@@ -302,6 +303,8 @@ $magicWords = [
        'url_query'                 => [ '0', 'ABFRAGE', 'QUERY' ],
        'defaultsort_noerror'       => [ '0', 'keinfehler', 'noerror' ],
        'defaultsort_noreplace'     => [ '0', 'keineersetzung', 'noreplace' ],
+       'displaytitle_noerror'      => [ '0', 'keinfehler', 'noerror' ],
+       'displaytitle_noreplace'    => [ '0', 'keineersetzung', 'noreplace' ],
        'pagesincategory_all'       => [ '0', 'alle', 'all' ],
        'pagesincategory_pages'     => [ '0', 'seiten', 'pages' ],
        'pagesincategory_subcats'   => [ '0', 'unterkategorien', 'unterkats', 'subcats' ],
index ddae17d..820deb6 100644 (file)
@@ -20,6 +20,7 @@
  * @file
  * @ingroup Maintenance
  */
+use Wikimedia\AtEase\AtEase;
 
 require_once __DIR__ . '/Maintenance.php';
 
@@ -34,83 +35,66 @@ class MinifyScript extends Maintenance {
        public function __construct() {
                parent::__construct();
                $this->addOption( 'outfile',
-                       'File for output. Only a single file may be specified for input.',
-                       false, true );
-               $this->addOption( 'outdir',
-                       "Directory for output. If this is not specified, and neither is --outfile, then the\n" .
-                       "output files will be sent to the same directories as the input files.",
-                       false, true );
-               $this->addDescription( "Minify a file or set of files.\n\n" .
-                       "If --outfile is not specified, then the output file names will have a .min extension\n" .
-                       "added, e.g. jquery.js -> jquery.min.js."
+                       'Write minified output to this file (instead of standard out).',
+                       false, true, 'o'
+               );
+               $this->addOption( 'type',
+                       'Override the input type (one of "js" or "css"). Defaults to file extension. ' .
+                               'Required if reading from standard input.',
+                       false, true, 'o'
+               );
+               $this->addArg( 'file', 'Input file. Use - to read from standard input.' );
+               $this->addDescription(
+                       "Minify one or more JavaScript or CSS files.\n" .
+                               "If multiple input files are given, they will be concatenated."
                );
        }
 
        public function execute() {
-               if ( !count( $this->mArgs ) ) {
-                       $this->fatalError( "minify.php: At least one input file must be specified." );
-               }
-
-               if ( $this->hasOption( 'outfile' ) ) {
-                       if ( count( $this->mArgs ) > 1 ) {
-                               $this->fatalError( '--outfile may only be used with a single input file.' );
+               $outputFile = $this->getOption( 'outfile', false );
+               if ( $outputFile === false ) {
+                       // Only output the minified result (or errors)
+                       // Avoid output() because this should not honour --quiet
+                       foreach ( $this->mArgs as $arg ) {
+                               print $this->minify( $arg ) . "\n";
                        }
-
-                       // Minify one file
-                       $this->minify( $this->getArg( 0 ), $this->getOption( 'outfile' ) );
-
-                       return;
-               }
-
-               $outDir = $this->getOption( 'outdir', false );
-
-               foreach ( $this->mArgs as $arg ) {
-                       $inPath = realpath( $arg );
-                       $inName = basename( $inPath );
-                       $inDir = dirname( $inPath );
-
-                       if ( strpos( $inName, '.min.' ) !== false ) {
-                               $this->error( "Skipping $inName\n" );
-                               continue;
+               } else {
+                       $result = '';
+                       foreach ( $this->mArgs as $arg ) {
+                               $this->output( "Minifying {$arg} ...\n" );
+                               $result .= $this->minify( $arg );
                        }
-
-                       if ( !file_exists( $inPath ) ) {
-                               $this->fatalError( "File does not exist: $arg" );
-                       }
-
-                       $extension = $this->getExtension( $inName );
-                       $outName = substr( $inName, 0, -strlen( $extension ) ) . 'min.' . $extension;
-                       if ( $outDir === false ) {
-                               $outPath = $inDir . '/' . $outName;
-                       } else {
-                               $outPath = $outDir . '/' . $outName;
-                       }
-
-                       $this->minify( $inPath, $outPath );
+                       $this->output( "Writing to {$outputFile} ...\n" );
+                       file_put_contents( $outputFile, $result );
+                       $this->output( "Done!\n" );
                }
        }
 
        public function getExtension( $fileName ) {
                $dotPos = strrpos( $fileName, '.' );
                if ( $dotPos === false ) {
-                       $this->fatalError( "No file extension, cannot determine type: $fileName" );
+                       $this->fatalError( "Unknown file type ($fileName). Use --type." );
                }
-
                return substr( $fileName, $dotPos + 1 );
        }
 
-       public function minify( $inPath, $outPath ) {
-               $extension = $this->getExtension( $inPath );
-               $this->output( basename( $inPath ) . ' -> ' . basename( $outPath ) . '...' );
-
-               $inText = file_get_contents( $inPath );
-               if ( $inText === false ) {
-                       $this->fatalError( "Unable to open file $inPath for reading." );
-               }
-               $outFile = fopen( $outPath, 'w' );
-               if ( !$outFile ) {
-                       $this->fatalError( "Unable to open file $outPath for writing." );
+       private function readFile( $fileName ) {
+               if ( $fileName === '-' ) {
+                       $inText = $this->getStdin( self::STDIN_ALL );
+               } else {
+                       AtEase::suppressWarnings();
+                       $inText = file_get_contents( $fileName );
+                       AtEase::restoreWarnings();
+                       if ( $inText === false ) {
+                               $this->fatalError( "Unable to open file $fileName for reading." );
+                       }
                }
+               return $inText;
+       }
+
+       public function minify( $inPath ) {
+               $extension = $this->getOption( 'type', null ) ?? $this->getExtension( $inPath );
+               $inText = $this->readFile( $inPath );
 
                switch ( $extension ) {
                        case 'js':
@@ -120,12 +104,10 @@ class MinifyScript extends Maintenance {
                                $outText = CSSMin::minify( $inText );
                                break;
                        default:
-                               $this->error( "No minifier defined for extension \"$extension\"" );
+                               $this->fatalError( "Unsupported file type \"$extension\"." );
                }
 
-               fwrite( $outFile, $outText );
-               fclose( $outFile );
-               $this->output( " ok\n" );
+               return $outText;
        }
 }
 
diff --git a/maintenance/mssql/archives/patch-actor-table.sql b/maintenance/mssql/archives/patch-actor-table.sql
deleted file mode 100644 (file)
index ad524a7..0000000
+++ /dev/null
@@ -1,53 +0,0 @@
---
--- patch-actor-table.sql
---
--- T167246. Add an `actor` table and various columns (and temporary tables) to reference it.
-
-CREATE TABLE /*_*/actor (
-  actor_id bigint NOT NULL CONSTRAINT PK_actor PRIMARY KEY IDENTITY(0,1),
-  actor_user int,
-  actor_name nvarchar(255) NOT NULL
-);
-CREATE UNIQUE INDEX /*i*/actor_user ON /*_*/actor (actor_user);
-CREATE UNIQUE INDEX /*i*/actor_name ON /*_*/actor (actor_name);
-
--- Dummy
-INSERT INTO /*_*/actor (actor_name) VALUES ('##Anonymous##');
-
-CREATE TABLE /*_*/revision_actor_temp (
-  revactor_rev int NOT NULL CONSTRAINT FK_revactor_rev FOREIGN KEY REFERENCES /*_*/revision(rev_id) ON DELETE CASCADE,
-  revactor_actor bigint NOT NULL,
-  revactor_timestamp varchar(14) NOT NULL CONSTRAINT DF_revactor_timestamp DEFAULT '',
-  revactor_page int NOT NULL,
-  CONSTRAINT PK_revision_actor_temp PRIMARY KEY (revactor_rev, revactor_actor)
-);
-CREATE UNIQUE INDEX /*i*/revactor_rev ON /*_*/revision_actor_temp (revactor_rev);
-CREATE INDEX /*i*/actor_timestamp ON /*_*/revision_actor_temp (revactor_actor,revactor_timestamp);
-CREATE INDEX /*i*/page_actor_timestamp ON /*_*/revision_actor_temp (revactor_page,revactor_actor,revactor_timestamp);
-
-ALTER TABLE /*_*/archive ADD CONSTRAINT DF_ar_user_text DEFAULT '' FOR ar_user_text;
-ALTER TABLE /*_*/archive ADD ar_actor bigint NOT NULL CONSTRAINT DF_ar_actor DEFAULT 0;
-CREATE INDEX /*i*/ar_actor_timestamp ON /*_*/archive (ar_actor,ar_timestamp);
-
-ALTER TABLE /*_*/ipblocks ADD ipb_by_actor bigint NOT NULL CONSTRAINT DF_ipb_by_actor DEFAULT 0;
-
-ALTER TABLE /*_*/image ADD CONSTRAINT DF_img_user_text DEFAULT '' FOR img_user_text;
-ALTER TABLE /*_*/image ADD img_actor bigint NOT NULL CONSTRAINT DF_img_actor DEFAULT 0;
-CREATE INDEX /*i*/img_actor_timestamp ON /*_*/image (img_actor, img_timestamp);
-
-ALTER TABLE /*_*/oldimage ADD CONSTRAINT DF_oi_user_text DEFAULT '' FOR oi_user_text;
-ALTER TABLE /*_*/oldimage ADD oi_actor bigint NOT NULL CONSTRAINT DF_oi_actor DEFAULT 0;
-CREATE INDEX /*i*/oi_actor_timestamp ON /*_*/oldimage (oi_actor,oi_timestamp);
-
-ALTER TABLE /*_*/filearchive ADD CONSTRAINT DF_fa_user_text DEFAULT '' FOR fa_user_text;
-ALTER TABLE /*_*/filearchive ADD fa_actor bigint NOT NULL CONSTRAINT DF_fa_actor DEFAULT 0;
-CREATE INDEX /*i*/fa_actor_timestamp ON /*_*/filearchive (fa_actor,fa_timestamp);
-
-ALTER TABLE /*_*/recentchanges ADD CONSTRAINT DF_rc_user_text DEFAULT '' FOR rc_user_text;
-ALTER TABLE /*_*/recentchanges ADD rc_actor bigint NOT NULL CONSTRAINT DF_rc_actor DEFAULT 0;
-CREATE INDEX /*i*/rc_ns_actor ON /*_*/recentchanges (rc_namespace, rc_actor);
-CREATE INDEX /*i*/rc_actor ON /*_*/recentchanges (rc_actor, rc_timestamp);
-
-ALTER TABLE /*_*/logging ADD log_actor bigint NOT NULL CONSTRAINT DF_log_actor DEFAULT 0;
-CREATE INDEX /*i*/actor_time ON /*_*/logging (log_actor, log_timestamp);
-CREATE INDEX /*i*/log_actor_type_time ON /*_*/logging (log_actor, log_type, log_timestamp);
diff --git a/maintenance/mssql/archives/patch-add-3d.sql b/maintenance/mssql/archives/patch-add-3d.sql
deleted file mode 100644 (file)
index 51d2775..0000000
+++ /dev/null
@@ -1,27 +0,0 @@
-ALTER TABLE /*$wgDBprefix*/image
-       DROP CONSTRAINT img_media_type_ckc;
-
-ALTER TABLE /*$wgDBprefix*/image
-       ADD CONSTRAINT img_media_type_ckc
-       CHECK (img_media_type IN("UNKNOWN", "BITMAP", "DRAWING", "AUDIO", "VIDEO", "MULTIMEDIA", "OFFICE", "TEXT", "EXECUTABLE", "ARCHIVE", "3D"));
-
-ALTER TABLE /*$wgDBprefix*/oldimage
-       DROP CONSTRAINT oi_media_type_ckc;
-
-ALTER TABLE /*$wgDBprefix*/oldimage
-       ADD CONSTRAINT oi_media_type_ckc
-       CHECK (oi_media_type IN("UNKNOWN", "BITMAP", "DRAWING", "AUDIO", "VIDEO", "MULTIMEDIA", "OFFICE", "TEXT", "EXECUTABLE", "ARCHIVE", "3D"));
-
-ALTER TABLE /*$wgDBprefix*/filearchive
-       DROP CONSTRAINT fa_media_type_ckc;
-
-ALTER TABLE /*$wgDBprefix*/filearchive
-       ADD CONSTRAINT fa_media_type_ckc
-       CHECK (fa_media_type IN("UNKNOWN", "BITMAP", "DRAWING", "AUDIO", "VIDEO", "MULTIMEDIA", "OFFICE", "TEXT", "EXECUTABLE", "ARCHIVE", "3D"));
-
-ALTER TABLE /*$wgDBprefix*/uploadstash
-       DROP CONSTRAINT us_media_type_ckc;
-
-ALTER TABLE /*$wgDBprefix*/uploadstash
-       ADD CONSTRAINT us_media_type_ckc
-       CHECK (us_media_type IN("UNKNOWN", "BITMAP", "DRAWING", "AUDIO", "VIDEO", "MULTIMEDIA", "OFFICE", "TEXT", "EXECUTABLE", "ARCHIVE", "3D"));
diff --git a/maintenance/mssql/archives/patch-add-cl_collation_ext_index.sql b/maintenance/mssql/archives/patch-add-cl_collation_ext_index.sql
deleted file mode 100644 (file)
index 8137dc6..0000000
+++ /dev/null
@@ -1,2 +0,0 @@
--- @since 1.27
-CREATE INDEX /*i*/cl_collation_ext ON /*_*/categorylinks (cl_collation, cl_to, cl_type, cl_from);
diff --git a/maintenance/mssql/archives/patch-alter-table-oldimage.sql b/maintenance/mssql/archives/patch-alter-table-oldimage.sql
deleted file mode 100644 (file)
index fb31d6a..0000000
+++ /dev/null
@@ -1 +0,0 @@
-DROP INDEX /*i*/oi_name_archive_name ON /*_*/oldimage;
diff --git a/maintenance/mssql/archives/patch-ar_rev_id-not-null.sql b/maintenance/mssql/archives/patch-ar_rev_id-not-null.sql
deleted file mode 100644 (file)
index d287f49..0000000
+++ /dev/null
@@ -1 +0,0 @@
-ALTER TABLE /*_*/archive ALTER COLUMN ar_rev_id INT NOT NULL;
diff --git a/maintenance/mssql/archives/patch-archive-drop-fks.sql b/maintenance/mssql/archives/patch-archive-drop-fks.sql
deleted file mode 100644 (file)
index 3055ac9..0000000
+++ /dev/null
@@ -1,59 +0,0 @@
-DECLARE @base nvarchar(max),
-       @SQL nvarchar(max),
-       @id sysname;--
-
-SET @base = 'ALTER TABLE /*_*/archive DROP CONSTRAINT ';--
-
-SELECT @id = fk.name
-FROM sys.foreign_keys fk
-JOIN sys.foreign_key_columns fkc
-       ON fkc.constraint_object_id = fk.object_id
-JOIN sys.columns c
-       ON c.column_id = fkc.parent_column_id
-       AND c.object_id = fkc.parent_object_id
-WHERE
-       fk.parent_object_id = OBJECT_ID('/*_*/archive')
-       AND fk.referenced_object_id = OBJECT_ID('/*_*/revision')
-       AND c.name = 'ar_parent_id';--
-
-SET @SQL = @base + @id;--
-
-EXEC sp_executesql @SQL;--
-
--- while we're at it, let's fix up the other foreign key constraints on archive
--- as future patches touch constraints on other tables, they'll take the time to update constraint names there as well
-SELECT @id = fk.name
-FROM sys.foreign_keys fk
-JOIN sys.foreign_key_columns fkc
-       ON fkc.constraint_object_id = fk.object_id
-JOIN sys.columns c
-       ON c.column_id = fkc.parent_column_id
-       AND c.object_id = fkc.parent_object_id
-WHERE
-       fk.parent_object_id = OBJECT_ID('/*_*/archive')
-       AND fk.referenced_object_id = OBJECT_ID('/*_*/mwuser')
-       AND c.name = 'ar_user';--
-
-SET @SQL = @base + @id;--
-
-EXEC sp_executesql @SQL;--
-
-ALTER TABLE /*_*/archive ADD CONSTRAINT ar_user__user_id__fk FOREIGN KEY (ar_user) REFERENCES /*_*/mwuser(user_id);--
-
-SELECT @id = fk.name
-FROM sys.foreign_keys fk
-JOIN sys.foreign_key_columns fkc
-       ON fkc.constraint_object_id = fk.object_id
-JOIN sys.columns c
-       ON c.column_id = fkc.parent_column_id
-       AND c.object_id = fkc.parent_object_id
-WHERE
-       fk.parent_object_id = OBJECT_ID('/*_*/archive')
-       AND fk.referenced_object_id = OBJECT_ID('/*_*/text')
-       AND c.name = 'ar_text_id';--
-
-SET @SQL = @base + @id;--
-
-EXEC sp_executesql @SQL;--
-
-ALTER TABLE /*_*/archive ADD CONSTRAINT ar_text_id__old_id__fk FOREIGN KEY (ar_text_id) REFERENCES /*_*/text(old_id) ON DELETE CASCADE;
diff --git a/maintenance/mssql/archives/patch-bot_passwords.sql b/maintenance/mssql/archives/patch-bot_passwords.sql
deleted file mode 100644 (file)
index 7718ffa..0000000
+++ /dev/null
@@ -1,13 +0,0 @@
---
--- This table contains a user's bot passwords: passwords that allow access to
--- the account via the API with limited rights.
---
-CREATE TABLE /*_*/bot_passwords (
-       bp_user int NOT NULL REFERENCES /*_*/mwuser(user_id) ON DELETE CASCADE,
-       bp_app_id nvarchar(32) NOT NULL,
-       bp_password nvarchar(255) NOT NULL,
-       bp_token nvarchar(255) NOT NULL,
-       bp_restrictions nvarchar(max) NOT NULL,
-       bp_grants nvarchar(max) NOT NULL,
-       PRIMARY KEY (bp_user, bp_app_id)
-);
diff --git a/maintenance/mssql/archives/patch-categorylinks-constraints.sql b/maintenance/mssql/archives/patch-categorylinks-constraints.sql
deleted file mode 100644 (file)
index cf9b565..0000000
+++ /dev/null
@@ -1,20 +0,0 @@
-DECLARE @baseSQL nvarchar(max),
-       @SQL nvarchar(max),
-       @id sysname;--
-
-SET @baseSQL = 'ALTER TABLE /*_*/categorylinks DROP CONSTRAINT ';--
-
-SELECT @id = cc.name
-FROM sys.check_constraints cc
-JOIN sys.columns c
-       ON c.object_id = cc.parent_object_id
-       AND c.column_id = cc.parent_column_id
-WHERE
-       cc.parent_object_id = OBJECT_ID('/*_*/categorylinks')
-       AND c.name = 'cl_type';--
-
-SET @SQL = @baseSQL + @id;--
-
-EXEC sp_executesql @SQL;--
-
-ALTER TABLE /*_*/categorylinks ADD CONSTRAINT cl_type_ckc CHECK (cl_type IN('page', 'subcat', 'file'));
diff --git a/maintenance/mssql/archives/patch-change_tag-ct_id.sql b/maintenance/mssql/archives/patch-change_tag-ct_id.sql
deleted file mode 100644 (file)
index 94cb9d1..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
--- Primary key in change_tag table
-
-ALTER TABLE /*_*/change_tag ADD ct_id INT IDENTITY;
-ALTER TABLE /*_*/change_tag ADD CONSTRAINT pk_change_tag PRIMARY KEY(ct_id)
diff --git a/maintenance/mssql/archives/patch-change_tag-tag_id.sql b/maintenance/mssql/archives/patch-change_tag-tag_id.sql
deleted file mode 100644 (file)
index 869ee11..0000000
+++ /dev/null
@@ -1,7 +0,0 @@
---
--- Add ctd_tag_id to change_tag table to normalize it
---
-ALTER TABLE /*_*/change_tag
-  ADD COLUMN ct_tag_id int NULL CONSTRAINT ctd_tag_id__fk FOREIGN KEY REFERENCES /*_*/change_tag_def(ctd_id);
-
-CREATE INDEX /*i*/change_tag_tag_id_id ON /*_*/change_tag (ct_tag_id,ct_rc_id,ct_rev_id,ct_log_id);
diff --git a/maintenance/mssql/archives/patch-change_tag_def.sql b/maintenance/mssql/archives/patch-change_tag_def.sql
deleted file mode 100644 (file)
index 1ddeb01..0000000
+++ /dev/null
@@ -1,16 +0,0 @@
--- Table defining tag names for IDs. Also stores hit counts to avoid expensive queries on change_tag
-
-CREATE TABLE /*_*/change_tag_def (
-    -- Numerical ID of the tag (ct_tag_id refers to this)
-    ctd_id int NOT NULL CONSTRAINT PK_change_tag_def PRIMARY KEY IDENTITY,
-    -- Symbolic name of the tag (what would previously be put in ct_tag)
-    ctd_name nvarchar(255) NOT NULL,
-    -- Whether this tag was defined manually by a privileged user using Special:Tags
-    ctd_user_defined tinyint NOT NULL CONSTRAINT DF_ctd_user_defined DEFAULT 0,
-    -- Number of times this tag was used
-    ctd_count int NOT NULL CONSTRAINT DF_ctd_count DEFAULT 0
-) /*$wgDBTableOptions*/;
-
-CREATE UNIQUE INDEX /*i*/ctd_name ON /*_*/change_tag_def (ctd_name);
-CREATE INDEX /*i*/ctd_count ON /*_*/change_tag_def (ctd_count);
-CREATE INDEX /*i*/ctd_user_defined ON /*_*/change_tag_def (ctd_user_defined);
diff --git a/maintenance/mssql/archives/patch-comment-table.sql b/maintenance/mssql/archives/patch-comment-table.sql
deleted file mode 100644 (file)
index c532082..0000000
+++ /dev/null
@@ -1,57 +0,0 @@
---
--- patch-comment-table.sql
---
--- T166732. Add a `comment` table and various columns (and temporary tables) to reference it.
-
-CREATE TABLE /*_*/comment (
-  comment_id bigint NOT NULL PRIMARY KEY IDENTITY(0,1),
-  comment_hash INT NOT NULL,
-  comment_text nvarchar(max) NOT NULL,
-  comment_data nvarchar(max)
-);
-CREATE INDEX /*i*/comment_hash ON /*_*/comment (comment_hash);
-
--- dummy row for FKs. Hash is intentionally wrong so CommentStore won't match it.
-INSERT INTO /*_*/comment (comment_hash, comment_text) VALUES (-1, '** dummy **');
-
-
-CREATE TABLE /*_*/revision_comment_temp (
-  revcomment_rev INT NOT NULL CONSTRAINT FK_revcomment_rev FOREIGN KEY REFERENCES /*_*/revision(rev_id) ON DELETE CASCADE,
-  revcomment_comment_id bigint NOT NULL CONSTRAINT FK_revcomment_comment_id FOREIGN KEY REFERENCES /*_*/comment(comment_id),
-  CONSTRAINT PK_revision_comment_temp PRIMARY KEY (revcomment_rev, revcomment_comment_id)
-);
-CREATE UNIQUE INDEX /*i*/revcomment_rev ON /*_*/revision_comment_temp (revcomment_rev);
-
-
-CREATE TABLE /*_*/image_comment_temp (
-  imgcomment_name nvarchar(255) NOT NULL CONSTRAINT FK_imgcomment_name FOREIGN KEY REFERENCES /*_*/image(img_name) ON DELETE CASCADE,
-  imgcomment_description_id bigint NOT NULL CONSTRAINT FK_imgcomment_description_id FOREIGN KEY REFERENCES /*_*/comment(comment_id),
-  CONSTRAINT PK_image_comment_temp PRIMARY KEY (imgcomment_name, imgcomment_description_id)
-);
-CREATE UNIQUE INDEX /*i*/imgcomment_name ON /*_*/image_comment_temp (imgcomment_name);
-
-
-ALTER TABLE /*_*/revision ADD CONSTRAINT DF_rev_comment DEFAULT '' FOR rev_comment;
-
-ALTER TABLE /*_*/archive ADD CONSTRAINT DF_ar_comment DEFAULT '' FOR ar_comment;
-ALTER TABLE /*_*/archive ADD ar_comment_id bigint NOT NULL CONSTRAINT DF_ar_comment_id DEFAULT 0 CONSTRAINT FK_ar_comment_id FOREIGN KEY REFERENCES /*_*/comment(comment_id);
-
-ALTER TABLE /*_*/ipblocks ADD CONSTRAINT DF_ipb_reason DEFAULT '' FOR ipb_reason;
-ALTER TABLE /*_*/ipblocks ADD ipb_reason_id bigint NOT NULL CONSTRAINT DF_ipb_reason_id DEFAULT 0 CONSTRAINT FK_ipb_reason_id FOREIGN KEY REFERENCES /*_*/comment(comment_id);
-
-ALTER TABLE /*_*/image ADD CONSTRAINT DF_img_description DEFAULT '' FOR img_description;
-
-ALTER TABLE /*_*/oldimage ADD CONSTRAINT DF_oi_description DEFAULT '' FOR oi_description;
-ALTER TABLE /*_*/oldimage ADD oi_description_id bigint NOT NULL CONSTRAINT DF_oi_description_id DEFAULT 0 CONSTRAINT FK_oi_description_id FOREIGN KEY REFERENCES /*_*/comment(comment_id);
-
-ALTER TABLE /*_*/filearchive ADD CONSTRAINT DF_fa_deleted_reason DEFAULT '' FOR fa_deleted_reason;
-ALTER TABLE /*_*/filearchive ADD fa_deleted_reason_id bigint NOT NULL CONSTRAINT DF_fa_deleted_reason_id DEFAULT 0 CONSTRAINT FK_fa_deleted_reason_id FOREIGN KEY REFERENCES /*_*/comment(comment_id);
-ALTER TABLE /*_*/filearchive ADD CONSTRAINT DF_fa_description DEFAULT '' FOR fa_description;
-ALTER TABLE /*_*/filearchive ADD fa_description_id bigint NOT NULL CONSTRAINT DF_fa_description_id DEFAULT 0 CONSTRAINT FK_fa_description_id FOREIGN KEY REFERENCES /*_*/comment(comment_id);
-
-ALTER TABLE /*_*/recentchanges ADD rc_comment_id bigint NOT NULL CONSTRAINT DF_rc_comment_id DEFAULT 0 CONSTRAINT FK_rc_comment_id FOREIGN KEY REFERENCES /*_*/comment(comment_id);
-
-ALTER TABLE /*_*/logging ADD log_comment_id bigint NOT NULL CONSTRAINT DF_log_comment_id DEFAULT 0 CONSTRAINT FK_log_comment_id FOREIGN KEY REFERENCES /*_*/comment(comment_id);
-
-ALTER TABLE /*_*/protected_titles ADD CONSTRAINT DF_pt_reason DEFAULT '' FOR pt_reason;
-ALTER TABLE /*_*/protected_titles ADD pt_reason_id bigint NOT NULL CONSTRAINT DF_pt_reason_id DEFAULT 0 CONSTRAINT FK_pt_reason_id FOREIGN KEY REFERENCES /*_*/comment(comment_id);
diff --git a/maintenance/mssql/archives/patch-content.sql b/maintenance/mssql/archives/patch-content.sql
deleted file mode 100644 (file)
index a899f27..0000000
+++ /dev/null
@@ -1,21 +0,0 @@
---
--- The content table represents content objects. It's primary purpose is to provide the necessary
--- meta-data for loading and interpreting a serialized data blob to create a content object.
---
-CREATE TABLE /*_*/content (
-
-  -- ID of the content object
-  content_id bigint NOT NULL CONSTRAINT PK_content PRIMARY KEY IDENTITY,
-
-  -- Nominal size of the content object (not necessarily of the serialized blob)
-  content_size int NOT NULL,
-
-  -- Nominal hash of the content object (not necessarily of the serialized blob)
-  content_sha1 varchar(32) NOT NULL,
-
-  -- reference to model_id
-  content_model smallint NOT NULL CONSTRAINT FK_content_content_models FOREIGN KEY REFERENCES /*_*/content_models(model_id),
-
-  -- URL-like address of the content blob
-  content_address nvarchar(255) NOT NULL
-);
diff --git a/maintenance/mssql/archives/patch-content_models.sql b/maintenance/mssql/archives/patch-content_models.sql
deleted file mode 100644 (file)
index b94de0b..0000000
+++ /dev/null
@@ -1,11 +0,0 @@
-
---
--- Normalization table for content model names
---
-CREATE TABLE /*_*/content_models (
-  model_id smallint NOT NULL CONSTRAINT PK_content_models PRIMARY KEY IDENTITY,
-  model_name nvarchar(64) NOT NULL
-);
-
--- Index for looking of the internal ID of for a name
-CREATE UNIQUE INDEX /*i*/model_name ON /*_*/content_models (model_name);
\ No newline at end of file
diff --git a/maintenance/mssql/archives/patch-drop-ar_text.sql b/maintenance/mssql/archives/patch-drop-ar_text.sql
deleted file mode 100644 (file)
index c9b975c..0000000
+++ /dev/null
@@ -1,21 +0,0 @@
-DECLARE @sql nvarchar(max),
-       @id sysname;--
-
-SET @sql = 'ALTER TABLE /*_*/archive DROP CONSTRAINT ';--
-
-SELECT @id = df.name
-FROM sys.default_constraints df
-JOIN sys.columns c
-       ON c.object_id = df.parent_object_id
-       AND c.column_id = df.parent_column_id
-WHERE
-       df.parent_object_id = OBJECT_ID('/*_*/archive')
-       AND ( c.name = 'ar_text' OR c.name = 'ar_flags' );--
-
-SET @sql = @sql + @id;--
-
-EXEC sp_executesql @sql;--
-
-ALTER TABLE /*_*/archive DROP COLUMN ar_text;
-ALTER TABLE /*_*/archive DROP COLUMN ar_flags;
-ALTER TABLE /*_*/archive ALTER COLUMN ar_text_id INT NOT NULL CONSTRAINT DF_ar_text_id DEFAULT 0;
diff --git a/maintenance/mssql/archives/patch-drop-comment-fields.sql b/maintenance/mssql/archives/patch-drop-comment-fields.sql
deleted file mode 100644 (file)
index bdc8c91..0000000
+++ /dev/null
@@ -1,55 +0,0 @@
---
--- patch-drop-comment-fields.sql
---
--- T166732. Drop old xx_comment fields, and defaults from xx_comment_id fields.
-
-DECLARE @sql nvarchar(max),
-       @id sysname;
-
-ALTER TABLE /*_*/archive DROP CONSTRAINT DF_ar_comment, COLUMN ar_comment;
-ALTER TABLE /*_*/archive DROP CONSTRAINT DF_ar_comment_id;
-
-ALTER TABLE /*_*/ipblocks DROP CONSTRAINT DF_ipb_reason, COLUMN ipb_reason;
-ALTER TABLE /*_*/ipblocks DROP CONSTRAINT DF_ipb_reason_id;
-
-ALTER TABLE /*_*/image DROP CONSTRAINT DF_img_description, COLUMN img_description;
-ALTER TABLE /*_*/image DROP CONSTRAINT DF_img_description_id;
-
-ALTER TABLE /*_*/oldimage DROP CONSTRAINT DF_oi_description, COLUMN oi_description;
-ALTER TABLE /*_*/oldimage DROP CONSTRAINT DF_oi_description_id;
-
-ALTER TABLE /*_*/filearchive DROP CONSTRAINT DF_fa_deleted_reason, COLUMN fa_deleted_reason;
-ALTER TABLE /*_*/filearchive DROP CONSTRAINT DF_fa_deleted_reason_id;
-ALTER TABLE /*_*/filearchive DROP CONSTRAINT DF_fa_description, COLUMN fa_description;
-ALTER TABLE /*_*/filearchive DROP CONSTRAINT DF_fa_description_id;
-
-SET @sql = 'ALTER TABLE /*_*/recentchanges DROP CONSTRAINT ';
-SELECT @id = df.name
-FROM sys.default_constraints df
-JOIN sys.columns c
-       ON c.object_id = df.parent_object_id
-       AND c.column_id = df.parent_column_id
-WHERE
-       df.parent_object_id = OBJECT_ID('/*_*/recentchanges')
-       AND c.name = 'rc_comment';
-SET @sql = @sql + @id;
-EXEC sp_executesql @sql;
-ALTER TABLE /*_*/recentchanges DROP COLUMN rc_comment;
-ALTER TABLE /*_*/recentchanges DROP CONSTRAINT DF_rc_comment_id;
-
-SET @sql = 'ALTER TABLE /*_*/logging DROP CONSTRAINT ';
-SELECT @id = df.name
-FROM sys.default_constraints df
-JOIN sys.columns c
-       ON c.object_id = df.parent_object_id
-       AND c.column_id = df.parent_column_id
-WHERE
-       df.parent_object_id = OBJECT_ID('/*_*/logging')
-       AND c.name = 'log_comment';
-SET @sql = @sql + @id;
-EXEC sp_executesql @sql;
-ALTER TABLE /*_*/logging DROP COLUMN log_comment;
-ALTER TABLE /*_*/logging DROP CONSTRAINT DF_log_comment_id;
-
-ALTER TABLE /*_*/protected_titles DROP CONSTRAINT DF_pt_reason, COLUMN pt_reason;
-ALTER TABLE /*_*/protected_titles DROP CONSTRAINT DF_pt_reason_id;
diff --git a/maintenance/mssql/archives/patch-drop-ct_tag.sql b/maintenance/mssql/archives/patch-drop-ct_tag.sql
deleted file mode 100644 (file)
index 5498a1c..0000000
+++ /dev/null
@@ -1,22 +0,0 @@
--- T185355
-ALTER TABLE /*_*/change_tag ALTER COLUMN ct_tag INTEGER NOT NULL
-
-DECLARE @sql nvarchar(max),
-       @id sysname;--
-
-SET @sql = 'ALTER TABLE /*_*/change_tag DROP CONSTRAINT ';--
-
-SELECT @id = df.name
-FROM sys.default_constraints df
-JOIN sys.columns c
-       ON c.object_id = df.parent_object_id
-       AND c.column_id = df.parent_column_id
-WHERE
-       df.parent_object_id = OBJECT_ID('/*_*/change_tag')
-       AND c.name = 'ct_tag';--
-
-SET @sql = @sql + @id;--
-
-EXEC sp_executesql @sql;--
-
-ALTER TABLE /*_*/change_tag DROP COLUMN ct_tag;
diff --git a/maintenance/mssql/archives/patch-drop-page_counter.sql b/maintenance/mssql/archives/patch-drop-page_counter.sql
deleted file mode 100644 (file)
index 54ab9f7..0000000
+++ /dev/null
@@ -1,19 +0,0 @@
-DECLARE @sql nvarchar(max),
-       @id sysname;--
-
-SET @sql = 'ALTER TABLE /*_*/page DROP CONSTRAINT ';--
-
-SELECT @id = df.name
-FROM sys.default_constraints df
-JOIN sys.columns c
-       ON c.object_id = df.parent_object_id
-       AND c.column_id = df.parent_column_id
-WHERE
-       df.parent_object_id = OBJECT_ID('/*_*/page')
-       AND c.name = 'page_counter';--
-
-SET @sql = @sql + @id;--
-
-EXEC sp_executesql @sql;--
-
-ALTER TABLE /*_*/page DROP COLUMN page_counter;
diff --git a/maintenance/mssql/archives/patch-drop-rc_cur_time.sql b/maintenance/mssql/archives/patch-drop-rc_cur_time.sql
deleted file mode 100644 (file)
index 01c46d3..0000000
+++ /dev/null
@@ -1,19 +0,0 @@
-DECLARE @sql nvarchar(max),
-       @id sysname;--
-
-SET @sql = 'ALTER TABLE /*_*/recentchanges DROP CONSTRAINT ';--
-
-SELECT @id = df.name
-FROM sys.default_constraints df
-JOIN sys.columns c
-       ON c.object_id = df.parent_object_id
-       AND c.column_id = df.parent_column_id
-WHERE
-       df.parent_object_id = OBJECT_ID('/*_*/recentchanges')
-       AND c.name = 'rc_cur_time';--
-
-SET @sql = @sql + @id;--
-
-EXEC sp_executesql @sql;--
-
-ALTER TABLE /*_*/recentchanges DROP COLUMN rc_cur_time;
diff --git a/maintenance/mssql/archives/patch-drop-ss_total_views.sql b/maintenance/mssql/archives/patch-drop-ss_total_views.sql
deleted file mode 100644 (file)
index 7525ed5..0000000
+++ /dev/null
@@ -1,19 +0,0 @@
-DECLARE @sql nvarchar(max),
-       @id sysname;--
-
-SET @sql = 'ALTER TABLE /*_*/site_stats DROP CONSTRAINT ';--
-
-SELECT @id = df.name
-FROM sys.default_constraints df
-JOIN sys.columns c
-       ON c.object_id = df.parent_object_id
-       AND c.column_id = df.parent_column_id
-WHERE
-       df.parent_object_id = OBJECT_ID('/*_*/site_stats')
-       AND c.name = 'ss_total_views';--
-
-SET @sql = @sql + @id;--
-
-EXEC sp_executesql @sql;--
-
-ALTER TABLE /*_*/site_stats DROP COLUMN ss_total_views;
diff --git a/maintenance/mssql/archives/patch-drop-user_options.sql b/maintenance/mssql/archives/patch-drop-user_options.sql
deleted file mode 100644 (file)
index ab37956..0000000
+++ /dev/null
@@ -1,19 +0,0 @@
-DECLARE @sql nvarchar(max),
-       @id sysname;--
-
-SET @sql = 'ALTER TABLE /*_*/mwuser DROP CONSTRAINT ';--
-
-SELECT @id = df.name
-FROM sys.default_constraints df
-JOIN sys.columns c
-       ON c.object_id = df.parent_object_id
-       AND c.column_id = df.parent_column_id
-WHERE
-       df.parent_object_id = OBJECT_ID('/*_*/mwuser')
-       AND c.name = 'user_options';--
-
-SET @sql = @sql + @id;--
-
-EXEC sp_executesql @sql;--
-
-ALTER TABLE /*_*/mwuser DROP COLUMN user_options;
diff --git a/maintenance/mssql/archives/patch-externallinks-el_index_60-drop-default.sql b/maintenance/mssql/archives/patch-externallinks-el_index_60-drop-default.sql
deleted file mode 100644 (file)
index 7755e66..0000000
+++ /dev/null
@@ -1,13 +0,0 @@
-DECLARE @sql nvarchar(max)
-SET @sql=''
-
-SELECT @sql= @sql + 'ALTER TABLE /*_*/externallinks DROP CONSTRAINT ' + df.name + '; '
-FROM sys.default_constraints df
-JOIN sys.columns c
-       ON c.object_id = df.parent_object_id
-       AND c.column_id = df.parent_column_id
-WHERE
-       df.parent_object_id =  OBJECT_ID('/*_*/externallinks')
-       AND c.name = 'el_index_60';--
-
-EXEC sp_executesql @sql;
diff --git a/maintenance/mssql/archives/patch-fa_major_mime-chemical.sql b/maintenance/mssql/archives/patch-fa_major_mime-chemical.sql
deleted file mode 100644 (file)
index 1836808..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-ALTER TABLE /*_*/filearchive
-DROP CONSTRAINT fa_major_mime_ckc;
-ALTER TABLE /*_*/filearchive
-WITH NOCHECK ADD CONSTRAINT fa_major_mime_ckc CHECK (fa_major_mime IN('unknown', 'application', 'audio', 'image', 'text', 'video', 'message', 'model', 'multipart', 'chemical'));
\ No newline at end of file
diff --git a/maintenance/mssql/archives/patch-filearchive-constraints.sql b/maintenance/mssql/archives/patch-filearchive-constraints.sql
deleted file mode 100644 (file)
index cefead5..0000000
+++ /dev/null
@@ -1,34 +0,0 @@
-DECLARE @baseSQL nvarchar(max),
-       @SQL nvarchar(max),
-       @id sysname;--
-
-SET @baseSQL = 'ALTER TABLE /*_*/filearchive DROP CONSTRAINT ';--
-
-SELECT @id = cc.name
-FROM sys.check_constraints cc
-JOIN sys.columns c
-       ON c.object_id = cc.parent_object_id
-       AND c.column_id = cc.parent_column_id
-WHERE
-       cc.parent_object_id = OBJECT_ID('/*_*/filearchive')
-       AND c.name = 'fa_major_mime';--
-
-SET @SQL = @baseSQL + @id;--
-
-EXEC sp_executesql @SQL;--
-
-SELECT @id = cc.name
-FROM sys.check_constraints cc
-JOIN sys.columns c
-       ON c.object_id = cc.parent_object_id
-       AND c.column_id = cc.parent_column_id
-WHERE
-       cc.parent_object_id = OBJECT_ID('/*_*/filearchive')
-       AND c.name = 'fa_media_type';--
-
-SET @SQL = @baseSQL + @id;--
-
-EXEC sp_executesql @SQL;--
-
-ALTER TABLE /*_*/filearchive ADD CONSTRAINT fa_major_mime_ckc check (fa_major_mime IN('unknown', 'application', 'audio', 'image', 'text', 'video', 'message', 'model', 'multipart'));--
-ALTER TABLE /*_*/filearchive ADD CONSTRAINT fa_media_type_ckc check (fa_media_type in('UNKNOWN', 'BITMAP', 'DRAWING', 'AUDIO', 'VIDEO', 'MULTIMEDIA', 'OFFICE', 'TEXT', 'EXECUTABLE', 'ARCHIVE'));
diff --git a/maintenance/mssql/archives/patch-filearchive-schema.sql b/maintenance/mssql/archives/patch-filearchive-schema.sql
deleted file mode 100644 (file)
index cf1c01f..0000000
+++ /dev/null
@@ -1,120 +0,0 @@
--- MediaWiki looks for lines ending with semicolons and sends them as separate queries
--- However here we *really* need this all to be sent as a single batch. As such, DO NOT
--- remove the -- from the end of each statement.
-
-DECLARE @temp table (
-       fa_id int,
-       fa_name nvarchar(255),
-       fa_archive_name nvarchar(255),
-       fa_storage_group nvarchar(16),
-       fa_storage_key nvarchar(64),
-       fa_deleted_user int,
-       fa_deleted_timestamp varchar(14),
-       fa_deleted_reason nvarchar(max),
-       fa_size int,
-       fa_width int,
-       fa_height int,
-       fa_metadata nvarchar(max),
-       fa_bits int,
-       fa_media_type varchar(16),
-       fa_major_mime varchar(16),
-       fa_minor_mime nvarchar(100),
-       fa_description nvarchar(255),
-       fa_user int,
-       fa_user_text nvarchar(255),
-       fa_timestamp varchar(14),
-       fa_deleted tinyint,
-       fa_sha1 nvarchar(32)
-);--
-
-INSERT INTO @temp
-SELECT * FROM /*_*/filearchive;--
-
-DROP TABLE /*_*/filearchive;--
-
-CREATE TABLE /*_*/filearchive (
-  fa_id int NOT NULL PRIMARY KEY IDENTITY,
-  fa_name nvarchar(255) NOT NULL default '',
-  fa_archive_name nvarchar(255) default '',
-  fa_storage_group nvarchar(16),
-  fa_storage_key nvarchar(64) default '',
-  fa_deleted_user int,
-  fa_deleted_timestamp varchar(14) default '',
-  fa_deleted_reason nvarchar(max),
-  fa_size int default 0,
-  fa_width int default 0,
-  fa_height int default 0,
-  fa_metadata varbinary(max),
-  fa_bits int default 0,
-  fa_media_type varchar(16) default null,
-  fa_major_mime varchar(16) not null default 'unknown',
-  fa_minor_mime nvarchar(100) default 'unknown',
-  fa_description nvarchar(255),
-  fa_user int default 0 REFERENCES /*_*/mwuser(user_id) ON DELETE SET NULL,
-  fa_user_text nvarchar(255),
-  fa_timestamp varchar(14) default '',
-  fa_deleted tinyint NOT NULL default 0,
-  fa_sha1 nvarchar(32) NOT NULL default '',
-  CONSTRAINT fa_major_mime_ckc check (fa_major_mime in('unknown', 'application', 'audio', 'image', 'text', 'video', 'message', 'model', 'multipart', 'chemical')),
-  CONSTRAINT fa_media_type_ckc check (fa_media_type in('UNKNOWN', 'BITMAP', 'DRAWING', 'AUDIO', 'VIDEO', 'MULTIMEDIA', 'OFFICE', 'TEXT', 'EXECUTABLE', 'ARCHIVE'))
-);--
-
-CREATE INDEX /*i*/fa_name ON /*_*/filearchive (fa_name, fa_timestamp);--
-CREATE INDEX /*i*/fa_storage_group ON /*_*/filearchive (fa_storage_group, fa_storage_key);--
-CREATE INDEX /*i*/fa_deleted_timestamp ON /*_*/filearchive (fa_deleted_timestamp);--
-CREATE INDEX /*i*/fa_user_timestamp ON /*_*/filearchive (fa_user_text,fa_timestamp);--
-CREATE INDEX /*i*/fa_sha1 ON /*_*/filearchive (fa_sha1);--
-
-SET IDENTITY_INSERT /*_*/filearchive ON;--
-
-INSERT INTO /*_*/filearchive
-(
-       fa_id,
-       fa_name,
-       fa_archive_name,
-       fa_storage_group,
-       fa_storage_key,
-       fa_deleted_user,
-       fa_deleted_timestamp,
-       fa_deleted_reason,
-       fa_size,
-       fa_width,
-       fa_height,
-       fa_metadata,
-       fa_bits,
-       fa_media_type,
-       fa_major_mime,
-       fa_minor_mime,
-       fa_description,
-       fa_user,
-       fa_user_text,
-       fa_timestamp,
-       fa_deleted,
-       fa_sha1
-)
-SELECT
-       fa_id,
-       fa_name,
-       fa_archive_name,
-       fa_storage_group,
-       fa_storage_key,
-       fa_deleted_user,
-       fa_deleted_timestamp,
-       fa_deleted_reason,
-       fa_size,
-       fa_width,
-       fa_height,
-       CONVERT(varbinary(max), fa_metadata, 0),
-       fa_bits,
-       fa_media_type,
-       fa_major_mime,
-       fa_minor_mime,
-       fa_description,
-       fa_user,
-       fa_user_text,
-       fa_timestamp,
-       fa_deleted,
-       fa_sha1
-FROM @temp t;--
-
-SET IDENTITY_INSERT /*_*/filearchive OFF;
diff --git a/maintenance/mssql/archives/patch-il_from_namespace.sql b/maintenance/mssql/archives/patch-il_from_namespace.sql
deleted file mode 100644 (file)
index e4ac98f..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-ALTER TABLE /*_*/imagelinks
-  ADD il_from_namespace int NOT NULL default 0;
-
-CREATE INDEX /*i*/il_backlinks_namespace ON /*_*/imagelinks (il_from_namespace,il_to,il_from);
\ No newline at end of file
diff --git a/maintenance/mssql/archives/patch-image-constraints.sql b/maintenance/mssql/archives/patch-image-constraints.sql
deleted file mode 100644 (file)
index 0aeb627..0000000
+++ /dev/null
@@ -1,34 +0,0 @@
-DECLARE @baseSQL nvarchar(max),
-       @SQL nvarchar(max),
-       @id sysname;--
-
-SET @baseSQL = 'ALTER TABLE /*_*/image DROP CONSTRAINT ';--
-
-SELECT @id = cc.name
-FROM sys.check_constraints cc
-JOIN sys.columns c
-       ON c.object_id = cc.parent_object_id
-       AND c.column_id = cc.parent_column_id
-WHERE
-       cc.parent_object_id = OBJECT_ID('/*_*/image')
-       AND c.name = 'img_major_mime';--
-
-SET @SQL = @baseSQL + @id;--
-
-EXEC sp_executesql @SQL;--
-
-SELECT @id = cc.name
-FROM sys.check_constraints cc
-JOIN sys.columns c
-       ON c.object_id = cc.parent_object_id
-       AND c.column_id = cc.parent_column_id
-WHERE
-       cc.parent_object_id = OBJECT_ID('/*_*/image')
-       AND c.name = 'img_media_type';--
-
-SET @SQL = @baseSQL + @id;--
-
-EXEC sp_executesql @SQL;--
-
-ALTER TABLE /*_*/image ADD CONSTRAINT img_major_mime_ckc check (img_major_mime IN('unknown', 'application', 'audio', 'image', 'text', 'video', 'message', 'model', 'multipart'));--
-ALTER TABLE /*_*/image ADD CONSTRAINT img_media_type_ckc check (img_media_type in('UNKNOWN', 'BITMAP', 'DRAWING', 'AUDIO', 'VIDEO', 'MULTIMEDIA', 'OFFICE', 'TEXT', 'EXECUTABLE', 'ARCHIVE'));
diff --git a/maintenance/mssql/archives/patch-image-img_description_id.sql b/maintenance/mssql/archives/patch-image-img_description_id.sql
deleted file mode 100644 (file)
index bc51b52..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
---
--- patch-image-img_description_id.sql
---
--- T188132. Add `img_description_id` to the `image` table.
-
-ALTER TABLE /*_*/image ADD img_description_id bigint NOT NULL CONSTRAINT DF_img_description_id DEFAULT 0 CONSTRAINT FK_img_description_id FOREIGN KEY REFERENCES /*_*/comment(comment_id);
diff --git a/maintenance/mssql/archives/patch-image-schema.sql b/maintenance/mssql/archives/patch-image-schema.sql
deleted file mode 100644 (file)
index 213b438..0000000
+++ /dev/null
@@ -1,84 +0,0 @@
--- MediaWiki looks for lines ending with semicolons and sends them as separate queries
--- However here we *really* need this all to be sent as a single batch. As such, DO NOT
--- remove the -- from the end of each statement.
-
-DECLARE @temp table (
-       img_name varbinary(255),
-       img_size int,
-       img_width int,
-       img_height int,
-       img_metadata varbinary(max),
-       img_bits int,
-       img_media_type varchar(16),
-       img_major_mime varchar(16),
-       img_minor_mime nvarchar(100),
-       img_description nvarchar(255),
-       img_user int,
-       img_user_text nvarchar(255),
-       img_timestamp nvarchar(14),
-       img_sha1 nvarchar(32)
-);--
-
-INSERT INTO @temp
-SELECT * FROM /*_*/image;--
-
-DROP TABLE /*_*/image;--
-
-CREATE TABLE /*_*/image (
-  img_name nvarchar(255) NOT NULL default '' PRIMARY KEY,
-  img_size int NOT NULL default 0,
-  img_width int NOT NULL default 0,
-  img_height int NOT NULL default 0,
-  img_metadata varbinary(max) NOT NULL,
-  img_bits int NOT NULL default 0,
-  img_media_type varchar(16) default null,
-  img_major_mime varchar(16) not null default 'unknown',
-  img_minor_mime nvarchar(100) NOT NULL default 'unknown',
-  img_description nvarchar(255) NOT NULL,
-  img_user int REFERENCES /*_*/mwuser(user_id) ON DELETE SET NULL,
-  img_user_text nvarchar(255) NOT NULL,
-  img_timestamp nvarchar(14) NOT NULL default '',
-  img_sha1 nvarchar(32) NOT NULL default '',
-  CONSTRAINT img_major_mime_ckc check (img_major_mime IN('unknown', 'application', 'audio', 'image', 'text', 'video', 'message', 'model', 'multipart', 'chemical')),
-  CONSTRAINT img_media_type_ckc check (img_media_type in('UNKNOWN', 'BITMAP', 'DRAWING', 'AUDIO', 'VIDEO', 'MULTIMEDIA', 'OFFICE', 'TEXT', 'EXECUTABLE', 'ARCHIVE'))
-);--
-
-CREATE INDEX /*i*/img_usertext_timestamp ON /*_*/image (img_user_text,img_timestamp);--
-CREATE INDEX /*i*/img_size ON /*_*/image (img_size);--
-CREATE INDEX /*i*/img_timestamp ON /*_*/image (img_timestamp);--
-CREATE INDEX /*i*/img_sha1 ON /*_*/image (img_sha1);--
-CREATE INDEX /*i*/img_media_mime ON /*_*/image (img_media_type,img_major_mime,img_minor_mime);--
-
-INSERT INTO /*_*/image
-(
-       img_name,
-       img_size,
-       img_width,
-       img_height,
-       img_metadata,
-       img_bits,
-       img_media_type,
-       img_major_mime,
-       img_minor_mime,
-       img_description,
-       img_user,
-       img_user_text,
-       img_timestamp,
-       img_sha1
-)
-SELECT
-       img_name,
-       img_size,
-       img_width,
-       img_height,
-       img_metadata,
-       img_bits,
-       img_media_type,
-       img_major_mime,
-       img_minor_mime,
-       img_description,
-       img_user,
-       img_user_text,
-       img_timestamp,
-       img_sha1
-FROM @temp t;
diff --git a/maintenance/mssql/archives/patch-img_major_mime-chemical.sql b/maintenance/mssql/archives/patch-img_major_mime-chemical.sql
deleted file mode 100644 (file)
index eed0786..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-ALTER TABLE /*_*/image
-DROP CONSTRAINT img_major_mime_ckc;
-ALTER TABLE /*_*/image
-WITH NOCHECK ADD CONSTRAINT img_major_mime_ckc CHECK (img_major_mime IN('unknown', 'application', 'audio', 'image', 'text', 'video', 'message', 'model', 'multipart', 'chemical'));
\ No newline at end of file
diff --git a/maintenance/mssql/archives/patch-interwiki-pk.sql b/maintenance/mssql/archives/patch-interwiki-pk.sql
deleted file mode 100644 (file)
index e989c44..0000000
+++ /dev/null
@@ -1,2 +0,0 @@
-DROP INDEX IF EXISTS /*i*/iw_prefix ON /*_*/interwiki;
-ALTER TABLE /*_*/interwiki ADD CONSTRAINT PK_interwiki PRIMARY KEY(iw_prefix);
\ No newline at end of file
diff --git a/maintenance/mssql/archives/patch-ipb_sitewide.sql b/maintenance/mssql/archives/patch-ipb_sitewide.sql
deleted file mode 100644 (file)
index 4f7ef8e..0000000
+++ /dev/null
@@ -1,3 +0,0 @@
--- Adding ipb_sitewide for blocks
-ALTER TABLE /*$wgDBprefix*/ipblocks
-  ADD ipb_sitewide bit NOT NULL CONSTRAINT DF_ipb_sitewide DEFAULT 1;
diff --git a/maintenance/mssql/archives/patch-ipblocks_restrictions-table.sql b/maintenance/mssql/archives/patch-ipblocks_restrictions-table.sql
deleted file mode 100644 (file)
index e3095dd..0000000
+++ /dev/null
@@ -1,11 +0,0 @@
--- For partial block restrictions --
-
-CREATE TABLE /*_*/ipblocks_restrictions (
-  ir_ipb_id int NOT NULL CONSTRAINT FK_ir_ipb_id FOREIGN KEY REFERENCES /*_*/ipblocks(ipb_id) ON DELETE CASCADE,
-  ir_type tinyint NOT NULL,
-  ir_value int NOT NULL,
-  CONSTRAINT PK_ipblocks_restrictions PRIMARY KEY (ir_ipb_id, ir_type, ir_value)
-) /*$wgDBTableOptions*/;
-
--- Index to query restrictions by the page or namespace.
-CREATE INDEX /*i*/ir_type_value ON /*_*/ipblocks_restrictions (ir_type, ir_value);
diff --git a/maintenance/mssql/archives/patch-kill-cl_collation_index.sql b/maintenance/mssql/archives/patch-kill-cl_collation_index.sql
deleted file mode 100644 (file)
index 7f75a62..0000000
+++ /dev/null
@@ -1,7 +0,0 @@
---
--- Kill cl_collation index.
--- @since 1.27
---
-
-DROP INDEX /*i*/cl_collation ON /*_*/categorylinks;
-
diff --git a/maintenance/mssql/archives/patch-logging-drop-fks.sql b/maintenance/mssql/archives/patch-logging-drop-fks.sql
deleted file mode 100644 (file)
index c9cbca3..0000000
+++ /dev/null
@@ -1,37 +0,0 @@
-DECLARE @base nvarchar(max),
-       @SQL nvarchar(max),
-       @id sysname;--
-
-SET @base = 'ALTER TABLE /*_*/logging DROP CONSTRAINT ';--
-
-SELECT @id = fk.name
-FROM sys.foreign_keys fk
-JOIN sys.foreign_key_columns fkc
-       ON fkc.constraint_object_id = fk.object_id
-JOIN sys.columns c
-       ON c.column_id = fkc.parent_column_id
-       AND c.object_id = fkc.parent_object_id
-WHERE
-       fk.parent_object_id = OBJECT_ID('/*_*/logging')
-       AND fk.referenced_object_id = OBJECT_ID('/*_*/mwuser')
-       AND c.name = 'log_user';--
-
-SET @SQL = @base + @id;--
-
-EXEC sp_executesql @SQL;--
-
-SELECT @id = fk.name
-FROM sys.foreign_keys fk
-JOIN sys.foreign_key_columns fkc
-       ON fkc.constraint_object_id = fk.object_id
-JOIN sys.columns c
-       ON c.column_id = fkc.parent_column_id
-       AND c.object_id = fkc.parent_object_id
-WHERE
-       fk.parent_object_id = OBJECT_ID('/*_*/logging')
-       AND fk.referenced_object_id = OBJECT_ID('/*_*/page')
-       AND c.name = 'log_page';--
-
-SET @SQL = @base + @id;--
-
-EXEC sp_executesql @SQL;
diff --git a/maintenance/mssql/archives/patch-oi_major_mime-chemical.sql b/maintenance/mssql/archives/patch-oi_major_mime-chemical.sql
deleted file mode 100644 (file)
index 35482ed..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-ALTER TABLE /*_*/oldimage
-DROP CONSTRAINT oi_major_mime_ckc;
-ALTER TABLE /*_*/oldimage
-WITH NOCHECK ADD CONSTRAINT oi_major_mime_ckc CHECK (oi_major_mime IN('unknown', 'application', 'audio', 'image', 'text', 'video', 'message', 'model', 'multipart', 'chemical'));
\ No newline at end of file
diff --git a/maintenance/mssql/archives/patch-oldimage-constraints.sql b/maintenance/mssql/archives/patch-oldimage-constraints.sql
deleted file mode 100644 (file)
index 69ede2c..0000000
+++ /dev/null
@@ -1,34 +0,0 @@
-DECLARE @baseSQL nvarchar(max),
-       @SQL nvarchar(max),
-       @id sysname;--
-
-SET @baseSQL = 'ALTER TABLE /*_*/oldimage DROP CONSTRAINT ';--
-
-SELECT @id = cc.name
-FROM sys.check_constraints cc
-JOIN sys.columns c
-       ON c.object_id = cc.parent_object_id
-       AND c.column_id = cc.parent_column_id
-WHERE
-       cc.parent_object_id = OBJECT_ID('/*_*/oldimage')
-       AND c.name = 'oi_major_mime';--
-
-SET @SQL = @baseSQL + @id;--
-
-EXEC sp_executesql @SQL;--
-
-SELECT @id = cc.name
-FROM sys.check_constraints cc
-JOIN sys.columns c
-       ON c.object_id = cc.parent_object_id
-       AND c.column_id = cc.parent_column_id
-WHERE
-       cc.parent_object_id = OBJECT_ID('/*_*/oldimage')
-       AND c.name = 'oi_media_type';--
-
-SET @SQL = @baseSQL + @id;--
-
-EXEC sp_executesql @SQL;--
-
-ALTER TABLE /*_*/oldimage ADD CONSTRAINT oi_major_mime_ckc check (oi_major_mime IN('unknown', 'application', 'audio', 'image', 'text', 'video', 'message', 'model', 'multipart'));--
-ALTER TABLE /*_*/oldimage ADD CONSTRAINT oi_media_type_ckc check (oi_media_type in('UNKNOWN', 'BITMAP', 'DRAWING', 'AUDIO', 'VIDEO', 'MULTIMEDIA', 'OFFICE', 'TEXT', 'EXECUTABLE', 'ARCHIVE'));
diff --git a/maintenance/mssql/archives/patch-oldimage-schema.sql b/maintenance/mssql/archives/patch-oldimage-schema.sql
deleted file mode 100644 (file)
index 3391c1b..0000000
+++ /dev/null
@@ -1,91 +0,0 @@
--- MediaWiki looks for lines ending with semicolons and sends them as separate queries
--- However here we *really* need this all to be sent as a single batch. As such, DO NOT
--- remove the -- from the end of each statement.
-
-DECLARE @temp table (
-       oi_name varbinary(255),
-       oi_archive_name varbinary(255),
-       oi_size int,
-       oi_width int,
-       oi_height int,
-       oi_bits int,
-       oi_description nvarchar(255),
-       oi_user int,
-       oi_user_text nvarchar(255),
-       oi_timestamp varchar(14),
-       oi_metadata nvarchar(max),
-       oi_media_type varchar(16),
-       oi_major_mime varchar(16),
-       oi_minor_mime nvarchar(100),
-       oi_deleted tinyint,
-       oi_sha1 nvarchar(32)
-);--
-
-INSERT INTO @temp
-SELECT * FROM /*_*/oldimage;--
-
-DROP TABLE /*_*/oldimage;--
-
-CREATE TABLE /*_*/oldimage (
-  oi_name nvarchar(255) NOT NULL default '',
-  oi_archive_name nvarchar(255) NOT NULL default '',
-  oi_size int NOT NULL default 0,
-  oi_width int NOT NULL default 0,
-  oi_height int NOT NULL default 0,
-  oi_bits int NOT NULL default 0,
-  oi_description nvarchar(255) NOT NULL,
-  oi_user int REFERENCES /*_*/mwuser(user_id),
-  oi_user_text nvarchar(255) NOT NULL,
-  oi_timestamp varchar(14) NOT NULL default '',
-  oi_metadata varbinary(max) NOT NULL,
-  oi_media_type varchar(16) default null,
-  oi_major_mime varchar(16) not null default 'unknown',
-  oi_minor_mime nvarchar(100) NOT NULL default 'unknown',
-  oi_deleted tinyint NOT NULL default 0,
-  oi_sha1 nvarchar(32) NOT NULL default '',
-  CONSTRAINT oi_major_mime_ckc check (oi_major_mime IN('unknown', 'application', 'audio', 'image', 'text', 'video', 'message', 'model', 'multipart', 'chemical')),
-  CONSTRAINT oi_media_type_ckc check (oi_media_type IN('UNKNOWN', 'BITMAP', 'DRAWING', 'AUDIO', 'VIDEO', 'MULTIMEDIA', 'OFFICE', 'TEXT', 'EXECUTABLE', 'ARCHIVE'))
-);--
-
-CREATE INDEX /*i*/oi_usertext_timestamp ON /*_*/oldimage (oi_user_text, oi_timestamp);--
-CREATE INDEX /*i*/oi_name_timestamp ON /*_*/oldimage (oi_name, oi_timestamp);--
-CREATE INDEX /*i*/oi_name_archive_name ON /*_*/oldimage (oi_name, oi_archive_name);--
-CREATE INDEX /*i*/oi_sha1 ON /*_*/oldimage (oi_sha1);--
-
-INSERT INTO /*_*/oldimage
-(
-       oi_name,
-       oi_archive_name,
-       oi_size,
-       oi_width,
-       oi_height,
-       oi_bits,
-       oi_description,
-       oi_user,
-       oi_user_text,
-       oi_timestamp,
-       oi_metadata,
-       oi_media_type,
-       oi_major_mime,
-       oi_minor_mime,
-       oi_deleted,
-       oi_sha1
-)
-SELECT
-       oi_name,
-       oi_archive_name,
-       oi_size,
-       oi_width,
-       oi_height,
-       oi_bits,
-       oi_description,
-       oi_user,
-       oi_user_text,
-       oi_timestamp,
-       CONVERT(varbinary(max), oi_metadata, 0),
-       oi_media_type,
-       oi_major_mime,
-       oi_minor_mime,
-       oi_deleted,
-       oi_sha1
-FROM @temp t;
diff --git a/maintenance/mssql/archives/patch-page_page_lang.sql b/maintenance/mssql/archives/patch-page_page_lang.sql
deleted file mode 100644 (file)
index d2f537b..0000000
+++ /dev/null
@@ -1 +0,0 @@
-ALTER TABLE /*_*/page ADD page_lang VARBINARY(35) DEFAULT NULL
diff --git a/maintenance/mssql/archives/patch-page_props-pk.sql b/maintenance/mssql/archives/patch-page_props-pk.sql
deleted file mode 100644 (file)
index 0615440..0000000
+++ /dev/null
@@ -1,2 +0,0 @@
-DROP INDEX IF EXISTS /*i*/pp_page_propname ON /*_*/page_props;
-ALTER TABLE /*_*/page_props ADD CONSTRAINT PK_page_props PRIMARY KEY(pp_page,pp_propname);
\ No newline at end of file
diff --git a/maintenance/mssql/archives/patch-pl_from_namespace.sql b/maintenance/mssql/archives/patch-pl_from_namespace.sql
deleted file mode 100644 (file)
index b3bbd78..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-ALTER TABLE /*_*/pagelinks
-       ADD pl_from_namespace int NOT NULL default 0;
-
-CREATE INDEX /*i*/pl_backlinks_namespace ON /*_*/pagelinks (pl_from_namespace,pl_namespace,pl_title,pl_from);
diff --git a/maintenance/mssql/archives/patch-pp_sortkey.sql b/maintenance/mssql/archives/patch-pp_sortkey.sql
deleted file mode 100644 (file)
index b13b605..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
--- Add a 'sortkey' field to page_props so pages can be efficiently
--- queried by the numeric value of a property.
-
-ALTER TABLE /*_*/page_props
-        ADD pp_sortkey float DEFAULT NULL;
-
-CREATE UNIQUE INDEX /*i*/pp_propname_sortkey_page
-        ON /*_*/page_props ( pp_propname, pp_sortkey, pp_page );
diff --git a/maintenance/mssql/archives/patch-protected_titles-pk.sql b/maintenance/mssql/archives/patch-protected_titles-pk.sql
deleted file mode 100644 (file)
index 17e059e..0000000
+++ /dev/null
@@ -1,2 +0,0 @@
-DROP INDEX IF EXISTS /*i*/pt_namespace_title ON /*_*/protected_titles;
-ALTER TABLE /*_*/protected_titles ADD CONSTRAINT PK_protected_titles PRIMARY KEY(pt_namespace,pt_title);
\ No newline at end of file
diff --git a/maintenance/mssql/archives/patch-rc_patrolled_type.sql b/maintenance/mssql/archives/patch-rc_patrolled_type.sql
deleted file mode 100644 (file)
index c8c7755..0000000
+++ /dev/null
@@ -1,22 +0,0 @@
-DECLARE @cname sysname;--
-
-SELECT @cname = dc.name
-FROM sys.default_constraints dc
-JOIN sys.columns c
-       ON c.object_id = dc.parent_object_id
-       AND c.column_id = dc.parent_column_id
-WHERE
-       c.name = 'rc_patrolled'
-       AND c.object_id = OBJECT_ID('/*_*/recentchanges', 'U');--
-
-IF @cname IS NOT NULL
-BEGIN;--
-       DECLARE @sql nvarchar(max);--
-       SET @sql = N'ALTER TABLE /*_*/recentchanges DROP CONSTRAINT ' + @cname;--
-       EXEC sp_executesql @sql;--
-END;--
-
-DROP INDEX /*i*/rc_name_type_patrolled_timestamp ON /*_*/recentchanges;--
-ALTER TABLE /*_*/recentchanges ALTER COLUMN rc_patrolled tinyint NOT NULL;--
-ALTER TABLE /*_*/recentchanges ADD CONSTRAINT DF_rc_patrolled DEFAULT 0 FOR rc_patrolled;--
-CREATE INDEX /*i*/rc_name_type_patrolled_timestamp ON /*_*/recentchanges (rc_namespace, rc_type, rc_patrolled, rc_timestamp);
\ No newline at end of file
diff --git a/maintenance/mssql/archives/patch-recentchanges-drop-fks.sql b/maintenance/mssql/archives/patch-recentchanges-drop-fks.sql
deleted file mode 100644 (file)
index 24f78f6..0000000
+++ /dev/null
@@ -1,76 +0,0 @@
-DECLARE @base nvarchar(max),
-       @SQL nvarchar(max),
-       @id sysname;--
-
-SET @base = 'ALTER TABLE /*_*/recentchanges DROP CONSTRAINT ';--
-
-SELECT @id = fk.name
-FROM sys.foreign_keys fk
-JOIN sys.foreign_key_columns fkc
-       ON fkc.constraint_object_id = fk.object_id
-JOIN sys.columns c
-       ON c.column_id = fkc.parent_column_id
-       AND c.object_id = fkc.parent_object_id
-WHERE
-       fk.parent_object_id = OBJECT_ID('/*_*/recentchanges')
-       AND fk.referenced_object_id = OBJECT_ID('/*_*/page')
-       AND c.name = 'rc_cur_id';--
-
-SET @SQL = @base + @id;--
-
-EXEC sp_executesql @SQL;--
-
-SELECT @id = fk.name
-FROM sys.foreign_keys fk
-JOIN sys.foreign_key_columns fkc
-       ON fkc.constraint_object_id = fk.object_id
-JOIN sys.columns c
-       ON c.column_id = fkc.parent_column_id
-       AND c.object_id = fkc.parent_object_id
-WHERE
-       fk.parent_object_id = OBJECT_ID('/*_*/recentchanges')
-       AND fk.referenced_object_id = OBJECT_ID('/*_*/revision')
-       AND c.name = 'rc_this_oldid';--
-
-SET @SQL = @base + @id;--
-
-EXEC sp_executesql @SQL;--
-
-SELECT @id = fk.name
-FROM sys.foreign_keys fk
-JOIN sys.foreign_key_columns fkc
-       ON fkc.constraint_object_id = fk.object_id
-JOIN sys.columns c
-       ON c.column_id = fkc.parent_column_id
-       AND c.object_id = fkc.parent_object_id
-WHERE
-       fk.parent_object_id = OBJECT_ID('/*_*/recentchanges')
-       AND fk.referenced_object_id = OBJECT_ID('/*_*/revision')
-       AND c.name = 'rc_last_oldid';--
-
-SET @SQL = @base + @id;--
-
-EXEC sp_executesql @SQL;--
-
--- while we're at it, let's fix up the other foreign key constraints on recentchanges
--- as future patches touch constraints on other tables, they'll take the time to update constraint names there as well
-ALTER TABLE /*_*/recentchanges DROP CONSTRAINT FK_rc_logid_log_id;--
-ALTER TABLE /*_*/recentchanges ADD CONSTRAINT rc_logid__log_id__fk FOREIGN KEY (rc_logid) REFERENCES /*_*/logging(log_id) ON DELETE CASCADE;--
-
-SELECT @id = fk.name
-FROM sys.foreign_keys fk
-JOIN sys.foreign_key_columns fkc
-       ON fkc.constraint_object_id = fk.object_id
-JOIN sys.columns c
-       ON c.column_id = fkc.parent_column_id
-       AND c.object_id = fkc.parent_object_id
-WHERE
-       fk.parent_object_id = OBJECT_ID('/*_*/recentchanges')
-       AND fk.referenced_object_id = OBJECT_ID('/*_*/mwuser')
-       AND c.name = 'rc_user';--
-
-SET @SQL = @base + @id;--
-
-EXEC sp_executesql @SQL;--
-
-ALTER TABLE /*_*/recentchanges ADD CONSTRAINT rc_user__user_id__fk FOREIGN KEY (rc_user) REFERENCES /*_*/mwuser(user_id);
diff --git a/maintenance/mssql/archives/patch-rev_text_id-default.sql b/maintenance/mssql/archives/patch-rev_text_id-default.sql
deleted file mode 100644 (file)
index 0c9d48a..0000000
+++ /dev/null
@@ -1,10 +0,0 @@
---
--- Adds a default value to the rev_text_id field in the revision table.
--- This is to allow the Multi Content Revisions migration to happen where
--- rows will have to be added to the revision table with no rev_text_id.
---
--- 2018-03-12
---
-
-ALTER TABLE /*_*/revision
-  ADD CONSTRAINT DF_rev_text_id DEFAULT 0 FOR rev_text_id;
\ No newline at end of file
diff --git a/maintenance/mssql/archives/patch-site_identifiers-pk.sql b/maintenance/mssql/archives/patch-site_identifiers-pk.sql
deleted file mode 100644 (file)
index fa12f70..0000000
+++ /dev/null
@@ -1,2 +0,0 @@
-DROP INDEX IF EXISTS /*i*/site_ids_type ON /*_*/site_identifiers;
-ALTER TABLE /*_*/site_identifiers ADD CONSTRAINT PK_site_identifiers PRIMARY KEY(si_type, si_key);
\ No newline at end of file
diff --git a/maintenance/mssql/archives/patch-site_stats-modify.sql b/maintenance/mssql/archives/patch-site_stats-modify.sql
deleted file mode 100644 (file)
index b2de948..0000000
+++ /dev/null
@@ -1,32 +0,0 @@
-/* Delete old default constraints */
-DECLARE @sql nvarchar(max)
-SET @sql=''
-
-/* IMHO: A DBMS where you have to do THIS to change a default value sucks. */
-SELECT @sql= @sql + 'ALTER TABLE site_stats DROP CONSTRAINT ' + df.name + '; '
-FROM sys.default_constraints df
-JOIN sys.columns c
-       ON c.object_id = df.parent_object_id
-       AND c.column_id = df.parent_column_id
-WHERE
-       df.parent_object_id =  OBJECT_ID('site_stats');--
-
-EXEC sp_executesql @sql;
-
-/* Change data type of ss_images from int to bigint.
- * All other fields (except ss_row_id) already are bigint.
- * This MUST happen before adding new constraints. */
-ALTER TABLE site_stats ALTER COLUMN ss_images bigint;
-
-/* Add new default constraints.
- * Don't ask me why I have to repeat ALTER TABLE site_stats
- * instead of using commas, for some reason SQL Server 2016
- * didn't accept it in any other way. Maybe I just don't know
- * enough about mssql, but this works.
- */
-ALTER TABLE site_stats ADD CONSTRAINT col_ss_total_edits DEFAULT NULL FOR ss_total_edits;
-ALTER TABLE site_stats ADD CONSTRAINT col_ss_good_article DEFAULT NULL FOR ss_good_articles;
-ALTER TABLE site_stats ADD CONSTRAINT col_ss_total_pages DEFAULT NULL FOR ss_total_pages;
-ALTER TABLE site_stats ADD CONSTRAINT col_ss_users DEFAULT NULL FOR ss_users;
-ALTER TABLE site_stats ADD CONSTRAINT col_ss_active_users DEFAULT NULL FOR ss_active_users;
-ALTER TABLE site_stats ADD CONSTRAINT col_ss_images DEFAULT NULL FOR ss_images;
diff --git a/maintenance/mssql/archives/patch-site_stats-pk.sql b/maintenance/mssql/archives/patch-site_stats-pk.sql
deleted file mode 100644 (file)
index 7533719..0000000
+++ /dev/null
@@ -1,2 +0,0 @@
-DROP INDEX ss_row_id ON site_stats;
-ALTER TABLE /*_*/site_stats ADD CONSTRAINT /*i*/ss_row_id PRIMARY KEY (ss_row_id);
diff --git a/maintenance/mssql/archives/patch-slot-origin.sql b/maintenance/mssql/archives/patch-slot-origin.sql
deleted file mode 100644 (file)
index bba3be4..0000000
+++ /dev/null
@@ -1,14 +0,0 @@
---
--- Replace slot_inherited with slot_origin.
---
--- NOTE: There is no release that has slot_inherited. This is only needed to transition between
--- snapshot versions of 1.30.
---
--- NOTE: No code that writes to the slots table was merge yet, the table is assumed to be empty.
---
-DROP INDEX /*i*/slot_role_inherited ON /*_*/slots;
-
-ALTER TABLE /*_*/slots DROP CONSTRAINT DF_slot_inherited, COLUMN slot_inherited;
-ALTER TABLE /*_*/slots ADD COLUMN slot_origin bigint NOT NULL;
-
-CREATE INDEX /*i*/slot_revision_origin_role ON /*_*/slots (slot_revision_id, slot_origin, slot_role_id);
diff --git a/maintenance/mssql/archives/patch-slot_roles.sql b/maintenance/mssql/archives/patch-slot_roles.sql
deleted file mode 100644 (file)
index 228510c..0000000
+++ /dev/null
@@ -1,10 +0,0 @@
---
--- Normalization table for role names
---
-CREATE TABLE /*_*/slot_roles (
-  role_id smallint NOT NULL CONSTRAINT PK_slot_roles PRIMARY KEY IDENTITY,
-  role_name nvarchar(64) NOT NULL
-);
-
--- Index for looking of the internal ID of for a name
-CREATE UNIQUE INDEX /*i*/role_name ON /*_*/slot_roles (role_name);
\ No newline at end of file
diff --git a/maintenance/mssql/archives/patch-slots.sql b/maintenance/mssql/archives/patch-slots.sql
deleted file mode 100644 (file)
index 2fc615e..0000000
+++ /dev/null
@@ -1,25 +0,0 @@
---
--- Slots represent an n:m relation between revisions and content objects.
--- A content object can have a specific "role" in one or more revisions.
--- Each revision can have multiple content objects, each having a different role.
---
-CREATE TABLE /*_*/slots (
-
-  -- reference to rev_id
-  slot_revision_id bigint NOT NULL,
-
-  -- reference to role_id
-  slot_role_id smallint NOT NULL CONSTRAINT FK_slots_slot_role FOREIGN KEY REFERENCES slot_roles(role_id),
-
-  -- reference to content_id
-  slot_content_id bigint NOT NULL CONSTRAINT FK_slots_content_id FOREIGN KEY REFERENCES content(content_id),
-
-  -- The revision ID of the revision that originated the slot's content.
-  -- To find revisions that changed slots, look for slot_origin = slot_revision_id.
-  slot_origin bigint NOT NULL,
-
-  CONSTRAINT PK_slots PRIMARY KEY (slot_revision_id, slot_role_id)
-);
-
--- Index for finding revisions that modified a specific slot
-CREATE INDEX /*i*/slot_revision_origin_role ON /*_*/slots (slot_revision_id, slot_origin, slot_role_id);
diff --git a/maintenance/mssql/archives/patch-tl_from_namespace.sql b/maintenance/mssql/archives/patch-tl_from_namespace.sql
deleted file mode 100644 (file)
index 9655165..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-ALTER TABLE /*_*/templatelinks
-       ADD tl_from_namespace int NOT NULL default 0;
-
-CREATE INDEX /*i*/tl_backlinks_namespace ON /*_*/templatelinks (tl_from_namespace,tl_namespace,tl_title,tl_from);
diff --git a/maintenance/mssql/archives/patch-uploadstash-constraints.sql b/maintenance/mssql/archives/patch-uploadstash-constraints.sql
deleted file mode 100644 (file)
index 1cd668c..0000000
+++ /dev/null
@@ -1,20 +0,0 @@
-DECLARE @baseSQL nvarchar(max),
-       @SQL nvarchar(max),
-       @id sysname;--
-
-SET @baseSQL = 'ALTER TABLE /*_*/uploadstash DROP CONSTRAINT ';--
-
-SELECT @id = cc.name
-FROM sys.check_constraints cc
-JOIN sys.columns c
-       ON c.object_id = cc.parent_object_id
-       AND c.column_id = cc.parent_column_id
-WHERE
-       cc.parent_object_id = OBJECT_ID('/*_*/uploadstash')
-       AND c.name = 'us_media_type';--
-
-SET @SQL = @baseSQL + @id;--
-
-EXEC sp_executesql @SQL;--
-
-ALTER TABLE /*_*/uploadstash ADD CONSTRAINT us_media_type_ckc check (us_media_type in('UNKNOWN', 'BITMAP', 'DRAWING', 'AUDIO', 'VIDEO', 'MULTIMEDIA', 'OFFICE', 'TEXT', 'EXECUTABLE', 'ARCHIVE'));
diff --git a/maintenance/mssql/archives/patch-user_groups-ug_expiry.sql b/maintenance/mssql/archives/patch-user_groups-ug_expiry.sql
deleted file mode 100644 (file)
index 4bafc8b..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
--- Primary key and expiry column in user_groups table
-
-DROP INDEX IF EXISTS /*i*/ug_user_group ON /*_*/user_groups;
-ALTER TABLE /*_*/user_groups ADD CONSTRAINT pk_user_groups PRIMARY KEY(ug_user, ug_group);
-ALTER TABLE /*_*/user_groups ADD ug_expiry varchar(14) DEFAULT NULL;
-CREATE INDEX /*i*/ug_expiry ON /*_*/user_groups(ug_expiry);
diff --git a/maintenance/mssql/archives/patch-user_password_expires.sql b/maintenance/mssql/archives/patch-user_password_expires.sql
deleted file mode 100644 (file)
index c22b10c..0000000
+++ /dev/null
@@ -1 +0,0 @@
-ALTER TABLE /*_*/mwuser ADD user_password_expires VARCHAR(14) DEFAULT NULL
\ No newline at end of file
diff --git a/maintenance/mssql/archives/patch-watchlist-wl_id.sql b/maintenance/mssql/archives/patch-watchlist-wl_id.sql
deleted file mode 100644 (file)
index b71f817..0000000
+++ /dev/null
@@ -1,2 +0,0 @@
-ALTER TABLE /*_*/watchlist ADD wl_id INT IDENTITY;
-ALTER TABLE /*_*/watchlist ADD CONSTRAINT pk_watchlist PRIMARY KEY(wl_id)
diff --git a/maintenance/mssql/patch-change_tag-change_tag_rc_tag_id.sql b/maintenance/mssql/patch-change_tag-change_tag_rc_tag_id.sql
deleted file mode 100644 (file)
index e276afd..0000000
+++ /dev/null
@@ -1,16 +0,0 @@
--- T193874: Add new indexes to change_tag table using ct_tag_id instead of ct_tag
-
-CREATE UNIQUE INDEX /*i*/change_tag_rc_tag_id ON /*_*/change_tag (ct_rc_id,ct_tag_id);
-CREATE UNIQUE INDEX /*i*/change_tag_log_tag_id ON /*_*/change_tag (ct_log_id,ct_tag_id);
-CREATE UNIQUE INDEX /*i*/change_tag_rev_tag_id ON /*_*/change_tag (ct_rev_id,ct_tag_id);
-
-CREATE INDEX /*i*/change_tag_rc_tag_nonuniq ON /*_*/change_tag (ct_rc_id,ct_tag);
-CREATE INDEX /*i*/change_tag_log_tag_nonuniq ON /*_*/change_tag (ct_log_id,ct_tag);
-CREATE INDEX /*i*/change_tag_rev_tag_nonuniq ON /*_*/change_tag (ct_rev_id,ct_tag);
-
-DROP INDEX /*i*/change_tag_rc_tag ON /*_*/change_tag;
-DROP INDEX /*i*/change_tag_log_tag ON /*_*/change_tag;
-DROP INDEX /*i*/change_tag_rev_tag ON /*_*/change_tag;
-
-ALTER TABLE /*i*/change_tag
-  ADD CONSTRAINT DF_ct_tag DEFAULT '' FOR ct_tag;
\ No newline at end of file
diff --git a/maintenance/mssql/tables.sql b/maintenance/mssql/tables.sql
deleted file mode 100644 (file)
index 72ea69d..0000000
+++ /dev/null
@@ -1,1487 +0,0 @@
--- Experimental table definitions for Microsoft SQL Server with
--- content-holding fields switched to explicit BINARY charset.
--- ------------------------------------------------------------
-
--- SQL to create the initial tables for the MediaWiki database.
--- This is read and executed by the install script; you should
--- not have to run it by itself unless doing a manual install.
-
---
--- General notes:
---
--- The comments in this and other files are
--- replaced with the defined table prefix by the installer
--- and updater scripts. If you are installing or running
--- updates manually, you will need to manually insert the
--- table prefix if any when running these scripts.
---
-
-
---
--- The user table contains basic account information,
--- authentication keys, etc.
---
--- Some multi-wiki sites may share a single central user table
--- between separate wikis using the $wgSharedDB setting.
---
--- Note that when a external authentication plugin is used,
--- user table entries still need to be created to store
--- preferences and to key tracking information in the other
--- tables.
-
--- LINE:53
-CREATE TABLE /*_*/mwuser (
-   user_id           INT           NOT NULL  PRIMARY KEY IDENTITY(0,1),
-   user_name         NVARCHAR(255)  NOT NULL UNIQUE DEFAULT '',
-   user_real_name    NVARCHAR(255)  NOT NULL DEFAULT '',
-   user_password     NVARCHAR(255)  NOT NULL DEFAULT '',
-   user_newpassword  NVARCHAR(255)  NOT NULL DEFAULT '',
-   user_newpass_time varchar(14) NULL DEFAULT NULL,
-   user_email        NVARCHAR(255)  NOT NULL DEFAULT '',
-   user_touched      varchar(14)      NOT NULL DEFAULT '',
-   user_token        NCHAR(32)      NOT NULL DEFAULT '',
-   user_email_authenticated varchar(14) DEFAULT NULL,
-   user_email_token  NCHAR(32) DEFAULT '',
-   user_email_token_expires varchar(14) DEFAULT NULL,
-   user_registration varchar(14) DEFAULT NULL,
-   user_editcount    INT NULL DEFAULT NULL,
-   user_password_expires varchar(14) DEFAULT NULL
-);
-CREATE UNIQUE INDEX /*i*/user_name ON /*_*/mwuser (user_name);
-CREATE INDEX /*i*/user_email_token ON /*_*/mwuser (user_email_token);
-CREATE INDEX /*i*/user_email ON /*_*/mwuser (user_email);
-
--- Insert a dummy user to represent anons
-INSERT INTO /*_*/mwuser (user_name) VALUES ('##Anonymous##');
-
---
--- The "actor" table associates user names or IP addresses with integers for
--- the benefit of other tables that need to refer to either logged-in or
--- logged-out users. If something can only ever be done by logged-in users, it
--- can refer to the user table directly.
---
-CREATE TABLE /*_*/actor (
-  actor_id bigint NOT NULL CONSTRAINT PK_actor PRIMARY KEY IDENTITY(0,1),
-  actor_user int,
-  actor_name nvarchar(255) NOT NULL
-);
-CREATE UNIQUE INDEX /*i*/actor_user ON /*_*/actor (actor_user);
-CREATE UNIQUE INDEX /*i*/actor_name ON /*_*/actor (actor_name);
-
--- Insert a dummy actor to represent no actor
-INSERT INTO /*_*/actor (actor_name) VALUES ('##Anonymous##');
-
---
--- User permissions have been broken out to a separate table;
--- this allows sites with a shared user table to have different
--- permissions assigned to a user in each project.
---
--- This table replaces the old user_rights field which used a
--- comma-separated nvarchar(max).
-CREATE TABLE /*_*/user_groups (
-   ug_user  INT     NOT NULL REFERENCES /*_*/mwuser(user_id) ON DELETE CASCADE,
-   ug_group NVARCHAR(255) NOT NULL DEFAULT '',
-   ug_expiry varchar(14) DEFAULT NULL,
-   PRIMARY KEY(ug_user, ug_group)
-);
-CREATE INDEX /*i*/ug_group ON /*_*/user_groups(ug_group);
-CREATE INDEX /*i*/ug_expiry ON /*_*/user_groups(ug_expiry);
-
--- Stores the groups the user has once belonged to.
--- The user may still belong to these groups (check user_groups).
--- Users are not autopromoted to groups from which they were removed.
-CREATE TABLE /*_*/user_former_groups (
-  ufg_user INT NOT NULL REFERENCES /*_*/mwuser(user_id) ON DELETE CASCADE,
-  ufg_group nvarchar(255) NOT NULL default ''
-);
-CREATE UNIQUE INDEX /*i*/ufg_user_group ON /*_*/user_former_groups (ufg_user,ufg_group);
-
--- Stores notifications of user talk page changes, for the display
--- of the "you have new messages" box
--- Changed user_id column to user_id to avoid clashing with user_id function
-CREATE TABLE /*_*/user_newtalk (
-   user_id INT         NOT NULL REFERENCES /*_*/mwuser(user_id) ON DELETE CASCADE,
-   user_ip NVARCHAR(40) NOT NULL DEFAULT '',
-   user_last_timestamp varchar(14) DEFAULT NULL,
-);
-CREATE INDEX /*i*/un_user_id ON /*_*/user_newtalk (user_id);
-CREATE INDEX /*i*/un_user_ip ON /*_*/user_newtalk (user_ip);
-
---
--- User preferences and other fun stuff
--- replaces old user.user_options nvarchar(max)
---
-CREATE TABLE /*_*/user_properties (
-       up_user INT NOT NULL REFERENCES /*_*/mwuser(user_id) ON DELETE CASCADE,
-       up_property NVARCHAR(255) NOT NULL,
-       up_value NVARCHAR(MAX),
-);
-CREATE UNIQUE CLUSTERED INDEX /*i*/user_properties_user_property ON /*_*/user_properties (up_user,up_property);
-CREATE INDEX /*i*/user_properties_property ON /*_*/user_properties (up_property);
-
---
--- This table contains a user's bot passwords: passwords that allow access to
--- the account via the API with limited rights.
---
-CREATE TABLE /*_*/bot_passwords (
-       bp_user int NOT NULL REFERENCES /*_*/mwuser(user_id) ON DELETE CASCADE,
-       bp_app_id nvarchar(32) NOT NULL,
-       bp_password nvarchar(255) NOT NULL,
-       bp_token nvarchar(255) NOT NULL,
-       bp_restrictions nvarchar(max) NOT NULL,
-       bp_grants nvarchar(max) NOT NULL,
-       PRIMARY KEY (bp_user, bp_app_id)
-);
-
-
---
--- Edits, blocks, and other actions typically have a textual comment describing
--- the action. They are stored here to reduce the size of the main tables, and
--- to allow for deduplication.
---
--- Deduplication is currently best-effort to avoid locking on inserts that
--- would be required for strict deduplication. There MAY be multiple rows with
--- the same comment_text and comment_data.
---
-CREATE TABLE /*_*/comment (
-  comment_id bigint NOT NULL PRIMARY KEY IDENTITY(0,1),
-  comment_hash INT NOT NULL,
-  comment_text nvarchar(max) NOT NULL,
-  comment_data nvarchar(max)
-);
--- Index used for deduplication.
-CREATE INDEX /*i*/comment_hash ON /*_*/comment (comment_hash);
-
--- dummy row for FKs. Hash is intentionally wrong so CommentStore won't match it.
-INSERT INTO /*_*/comment (comment_hash, comment_text) VALUES (-1, '** dummy **');
-
-
---
--- Core of the wiki: each page has an entry here which identifies
--- it by title and contains some essential metadata.
---
-CREATE TABLE /*_*/page (
-   page_id        INT          NOT NULL  PRIMARY KEY IDENTITY(0,1),
-   page_namespace INT          NOT NULL,
-   page_title     NVARCHAR(255)  NOT NULL,
-   page_restrictions NVARCHAR(255) NOT NULL,
-   page_is_redirect BIT           NOT NULL DEFAULT 0,
-   page_is_new BIT                NOT NULL DEFAULT 0,
-   page_random real     NOT NULL DEFAULT RAND(),
-   page_touched varchar(14) NOT NULL default '',
-   page_links_updated varchar(14) DEFAULT NULL,
-   page_latest INT, -- FK inserted later
-   page_len INT NOT NULL,
-   page_content_model nvarchar(32) default null,
-   page_lang VARBINARY(35) DEFAULT NULL
-);
-CREATE UNIQUE INDEX /*i*/name_title ON /*_*/page (page_namespace,page_title);
-CREATE INDEX /*i*/page_random ON /*_*/page (page_random);
-CREATE INDEX /*i*/page_len ON /*_*/page (page_len);
-CREATE INDEX /*i*/page_redirect_namespace_len ON /*_*/page (page_is_redirect, page_namespace, page_len);
-
--- insert a dummy page
-INSERT INTO /*_*/page (page_namespace, page_title, page_restrictions, page_latest, page_len) VALUES (-1,'','',0,0);
-
---
--- Every edit of a page creates also a revision row.
--- This stores metadata about the revision, and a reference
--- to the TEXT storage backend.
---
-CREATE TABLE /*_*/revision (
-   rev_id INT NOT NULL UNIQUE IDENTITY(0,1),
-   rev_page INT NOT NULL REFERENCES /*_*/page(page_id) ON DELETE CASCADE,
-   rev_text_id INT NOT NULL CONSTRAINT DF_rev_text_id DEFAULT 0, -- FK added later
-   rev_comment NVARCHAR(255) NOT NULL CONSTRAINT DF_rev_comment DEFAULT '',
-   rev_user INT REFERENCES /*_*/mwuser(user_id) ON DELETE SET NULL,
-   rev_user_text NVARCHAR(255) NOT NULL DEFAULT '',
-   rev_timestamp varchar(14) NOT NULL default '',
-   rev_minor_edit BIT NOT NULL DEFAULT 0,
-   rev_deleted TINYINT  NOT NULL DEFAULT 0,
-   rev_len INT,
-   rev_parent_id INT DEFAULT NULL REFERENCES /*_*/revision(rev_id),
-   rev_sha1 nvarchar(32) not null default '',
-   rev_content_model nvarchar(32) default null,
-   rev_content_format nvarchar(64) default null
-);
-CREATE UNIQUE CLUSTERED INDEX /*i*/rev_page_id ON /*_*/revision (rev_page, rev_id);
-CREATE INDEX /*i*/rev_timestamp ON /*_*/revision (rev_timestamp);
-CREATE INDEX /*i*/page_timestamp ON /*_*/revision (rev_page,rev_timestamp);
-CREATE INDEX /*i*/user_timestamp ON /*_*/revision (rev_user,rev_timestamp);
-CREATE INDEX /*i*/usertext_timestamp ON /*_*/revision (rev_user_text,rev_timestamp);
-CREATE INDEX /*i*/page_user_timestamp ON /*_*/revision (rev_page,rev_user,rev_timestamp);
-
--- insert a dummy revision
-INSERT INTO /*_*/revision (rev_page,rev_text_id,rev_comment,rev_user,rev_len) VALUES (0,0,'',0,0);
-
-ALTER TABLE /*_*/page ADD CONSTRAINT FK_page_latest_page_id FOREIGN KEY (page_latest) REFERENCES /*_*/revision(rev_id);
-
---
--- Temporary tables to avoid blocking on an alter of revision.
---
--- On large wikis like the English Wikipedia, altering the revision table is a
--- months-long process. This table is being created to avoid such an alter, and
--- will be merged back into revision in the future.
---
-CREATE TABLE /*_*/revision_comment_temp (
-  revcomment_rev INT NOT NULL CONSTRAINT FK_revcomment_rev FOREIGN KEY REFERENCES /*_*/revision(rev_id) ON DELETE CASCADE,
-  revcomment_comment_id bigint NOT NULL CONSTRAINT FK_revcomment_comment_id FOREIGN KEY REFERENCES /*_*/comment(comment_id),
-  CONSTRAINT PK_revision_comment_temp PRIMARY KEY (revcomment_rev, revcomment_comment_id)
-);
-CREATE UNIQUE INDEX /*i*/revcomment_rev ON /*_*/revision_comment_temp (revcomment_rev);
-
-CREATE TABLE /*_*/revision_actor_temp (
-  revactor_rev int NOT NULL CONSTRAINT FK_revactor_rev FOREIGN KEY REFERENCES /*_*/revision(rev_id) ON DELETE CASCADE,
-  revactor_actor bigint NOT NULL,
-  revactor_timestamp varchar(14) NOT NULL CONSTRAINT DF_revactor_timestamp DEFAULT '',
-  revactor_page int NOT NULL,
-  CONSTRAINT PK_revision_actor_temp PRIMARY KEY (revactor_rev, revactor_actor)
-);
-CREATE UNIQUE INDEX /*i*/revactor_rev ON /*_*/revision_actor_temp (revactor_rev);
-CREATE INDEX /*i*/actor_timestamp ON /*_*/revision_actor_temp (revactor_actor,revactor_timestamp);
-CREATE INDEX /*i*/page_actor_timestamp ON /*_*/revision_actor_temp (revactor_page,revactor_actor,revactor_timestamp);
-
---
--- Holds TEXT of individual page revisions.
---
--- Field names are a holdover from the 'old' revisions table in
--- MediaWiki 1.4 and earlier: an upgrade will transform that
--- table INTo the 'text' table to minimize unnecessary churning
--- and downtime. If upgrading, the other fields will be left unused.
-CREATE TABLE /*_*/text (
-   old_id INT NOT NULL  PRIMARY KEY IDENTITY(0,1),
-   old_text nvarchar(max) NOT NULL,
-   old_flags NVARCHAR(255) NOT NULL,
-);
-
--- insert a dummy text
-INSERT INTO /*_*/text (old_text,old_flags) VALUES ('','');
-
-ALTER TABLE /*_*/revision ADD CONSTRAINT FK_rev_text_id_old_id FOREIGN KEY (rev_text_id) REFERENCES /*_*/text(old_id) ON DELETE CASCADE;
-
---
--- Holding area for deleted articles, which may be viewed
--- or restored by admins through the Special:Undelete interface.
--- The fields generally correspond to the page, revision, and text
--- fields, with several caveats.
--- Cannot reasonably create views on this table, due to the presence of TEXT
--- columns.
-CREATE TABLE /*_*/archive (
-   ar_id int NOT NULL PRIMARY KEY IDENTITY,
-   ar_namespace SMALLINT NOT NULL DEFAULT 0,
-   ar_title NVARCHAR(255) NOT NULL DEFAULT '',
-   ar_comment_id bigint NOT NULL CONSTRAINT FK_ar_comment_id FOREIGN KEY REFERENCES /*_*/comment(comment_id),
-   ar_user INT CONSTRAINT ar_user__user_id__fk FOREIGN KEY REFERENCES /*_*/mwuser(user_id),
-   ar_user_text NVARCHAR(255) NOT NULL CONSTRAINT DF_ar_user_text DEFAULT '',
-   ar_actor bigint NOT NULL CONSTRAINT DF_ar_actor DEFAULT 0,
-   ar_timestamp varchar(14) NOT NULL default '',
-   ar_minor_edit BIT NOT NULL DEFAULT 0,
-   ar_rev_id INT NOT NULL, -- NOT a FK, the row gets deleted from revision and moved here
-   ar_text_id INT NOT NULL CONSTRAINT DF_ar_text_id DEFAULT 0 CONSTRAINT ar_text_id__old_id__fk FOREIGN KEY REFERENCES /*_*/text(old_id) ON DELETE CASCADE,
-   ar_deleted TINYINT NOT NULL DEFAULT 0,
-   ar_len INT,
-   ar_page_id INT NULL, -- NOT a FK, the row gets deleted from page and moved here
-   ar_parent_id INT NULL, -- NOT FK
-   ar_sha1 nvarchar(32) default null,
-   ar_content_model nvarchar(32) DEFAULT NULL,
-  ar_content_format nvarchar(64) DEFAULT NULL
-);
-CREATE INDEX /*i*/name_title_timestamp ON /*_*/archive (ar_namespace,ar_title,ar_timestamp);
-CREATE INDEX /*i*/ar_usertext_timestamp ON /*_*/archive (ar_user_text,ar_timestamp);
-CREATE INDEX /*i*/ar_actor_timestamp ON /*_*/archive (ar_actor,ar_timestamp);
-CREATE UNIQUE INDEX /*i*/ar_revid_uniq ON /*_*/archive (ar_rev_id);
-
-
---
--- Normalization table for role names
---
-CREATE TABLE /*_*/slot_roles (
-  role_id smallint NOT NULL CONSTRAINT PK_slot_roles PRIMARY KEY IDENTITY,
-  role_name nvarchar(64) NOT NULL
-);
-
--- Index for looking of the internal ID of for a name
-CREATE UNIQUE INDEX /*i*/role_name ON /*_*/slot_roles (role_name);
-
---
--- Normalization table for content model names
---
-CREATE TABLE /*_*/content_models (
-  model_id smallint NOT NULL CONSTRAINT PK_content_models PRIMARY KEY IDENTITY,
-  model_name nvarchar(64) NOT NULL
-);
-
--- Index for looking of the internal ID of for a name
-CREATE UNIQUE INDEX /*i*/model_name ON /*_*/content_models (model_name);
-
---
--- The content table represents content objects. It's primary purpose is to provide the necessary
--- meta-data for loading and interpreting a serialized data blob to create a content object.
---
-CREATE TABLE /*_*/content (
-
-  -- ID of the content object
-  content_id bigint NOT NULL CONSTRAINT PK_content PRIMARY KEY IDENTITY,
-
-  -- Nominal size of the content object (not necessarily of the serialized blob)
-  content_size int NOT NULL,
-
-  -- Nominal hash of the content object (not necessarily of the serialized blob)
-  content_sha1 varchar(32) NOT NULL,
-
-  -- reference to model_id
-  content_model smallint NOT NULL CONSTRAINT FK_content_content_models FOREIGN KEY REFERENCES /*_*/content_models(model_id),
-
-  -- URL-like address of the content blob
-  content_address nvarchar(255) NOT NULL
-);
-
---
--- Slots represent an n:m relation between revisions and content objects.
--- A content object can have a specific "role" in one or more revisions.
--- Each revision can have multiple content objects, each having a different role.
---
-CREATE TABLE /*_*/slots (
-
-  -- reference to rev_id
-  slot_revision_id bigint NOT NULL,
-
-  -- reference to role_id
-  slot_role_id smallint NOT NULL CONSTRAINT FK_slots_slot_role FOREIGN KEY REFERENCES slot_roles(role_id),
-
-  -- reference to content_id
-  slot_content_id bigint NOT NULL CONSTRAINT FK_slots_content_id FOREIGN KEY REFERENCES content(content_id),
-
-  -- The revision ID of the revision that originated the slot's content.
-  -- To find revisions that changed slots, look for slot_origin = slot_revision_id.
-  slot_origin bigint NOT NULL,
-
-  CONSTRAINT PK_slots PRIMARY KEY (slot_revision_id, slot_role_id)
-);
-
--- Index for finding revisions that modified a specific slot
-CREATE INDEX /*i*/slot_revision_origin_role ON /*_*/slots (slot_revision_id, slot_origin, slot_role_id);
-
-
---
--- Track page-to-page hyperlinks within the wiki.
---
-CREATE TABLE /*_*/pagelinks (
-   pl_from INT NOT NULL REFERENCES /*_*/page(page_id) ON DELETE CASCADE,
-   pl_from_namespace int NOT NULL DEFAULT 0,
-   pl_namespace INT NOT NULL DEFAULT 0,
-   pl_title NVARCHAR(255) NOT NULL DEFAULT '',
-);
-CREATE UNIQUE INDEX /*i*/pl_from ON /*_*/pagelinks (pl_from,pl_namespace,pl_title);
-CREATE UNIQUE INDEX /*i*/pl_namespace ON /*_*/pagelinks (pl_namespace,pl_title,pl_from);
-CREATE INDEX /*i*/pl_backlinks_namespace ON /*_*/pagelinks (pl_from_namespace,pl_namespace,pl_title,pl_from);
-
-
---
--- Track template inclusions.
---
-CREATE TABLE /*_*/templatelinks (
-  tl_from int NOT NULL REFERENCES /*_*/page(page_id) ON DELETE CASCADE,
-  tl_from_namespace int NOT NULL default 0,
-  tl_namespace int NOT NULL default 0,
-  tl_title nvarchar(255) NOT NULL default ''
-);
-
-CREATE UNIQUE INDEX /*i*/tl_from ON /*_*/templatelinks (tl_from,tl_namespace,tl_title);
-CREATE UNIQUE INDEX /*i*/tl_namespace ON /*_*/templatelinks (tl_namespace,tl_title,tl_from);
-CREATE INDEX /*i*/tl_backlinks_namespace ON /*_*/templatelinks (tl_from_namespace,tl_namespace,tl_title,tl_from);
-
-
---
--- Track links to images *used inline*
--- We don't distinguish live from broken links here, so
--- they do not need to be changed on upload/removal.
---
-CREATE TABLE /*_*/imagelinks (
-  -- Key to page_id of the page containing the image / media link.
-  il_from int NOT NULL REFERENCES /*_*/page(page_id) ON DELETE CASCADE,
-  il_from_namespace int NOT NULL default 0,
-
-  -- Filename of target image.
-  -- This is also the page_title of the file's description page;
-  -- all such pages are in namespace 6 (NS_FILE).
-  il_to nvarchar(255) NOT NULL default ''
-);
-
-CREATE UNIQUE INDEX /*i*/il_from ON /*_*/imagelinks (il_from,il_to);
-CREATE UNIQUE INDEX /*i*/il_to ON /*_*/imagelinks (il_to,il_from);
-CREATE INDEX /*i*/il_backlinks_namespace ON /*_*/imagelinks (il_from_namespace,il_to,il_from);
-
---
--- Track category inclusions *used inline*
--- This tracks a single level of category membership
---
-CREATE TABLE /*_*/categorylinks (
-  -- Key to page_id of the page defined as a category member.
-  cl_from int NOT NULL REFERENCES /*_*/page(page_id) ON DELETE CASCADE,
-
-  -- Name of the category.
-  -- This is also the page_title of the category's description page;
-  -- all such pages are in namespace 14 (NS_CATEGORY).
-  cl_to nvarchar(255) NOT NULL default '',
-
-  -- A binary string obtained by applying a sortkey generation algorithm
-  -- (Collation::getSortKey()) to page_title, or cl_sortkey_prefix . "\n"
-  -- . page_title if cl_sortkey_prefix is nonempty.
-  cl_sortkey varbinary(230) NOT NULL default 0x,
-
-  -- A prefix for the raw sortkey manually specified by the user, either via
-  -- [[Category:Foo|prefix]] or {{defaultsort:prefix}}.  If nonempty, it's
-  -- concatenated with a line break followed by the page title before the sortkey
-  -- conversion algorithm is run.  We store this so that we can update
-  -- collations without reparsing all pages.
-  -- Note: If you change the length of this field, you also need to change
-  -- code in LinksUpdate.php. See T27254.
-  cl_sortkey_prefix varbinary(255) NOT NULL default 0x,
-
-  -- This isn't really used at present. Provided for an optional
-  -- sorting method by approximate addition time.
-  cl_timestamp varchar(14) NOT NULL,
-
-  -- Stores $wgCategoryCollation at the time cl_sortkey was generated.  This
-  -- can be used to install new collation versions, tracking which rows are not
-  -- yet updated.  '' means no collation, this is a legacy row that needs to be
-  -- updated by updateCollation.php.  In the future, it might be possible to
-  -- specify different collations per category.
-  cl_collation nvarchar(32) NOT NULL default '',
-
-  -- Stores whether cl_from is a category, file, or other page, so we can
-  -- paginate the three categories separately.  This never has to be updated
-  -- after the page is created, since none of these page types can be moved to
-  -- any other.
-  cl_type varchar(10) NOT NULL default 'page',
-  -- SQL server doesn't have enums, so we approximate with this
-  CONSTRAINT cl_type_ckc CHECK (cl_type IN('page', 'subcat', 'file'))
-);
-
-CREATE UNIQUE INDEX /*i*/cl_from ON /*_*/categorylinks (cl_from,cl_to);
-
--- We always sort within a given category, and within a given type.  FIXME:
--- Formerly this index didn't cover cl_type (since that didn't exist), so old
--- callers won't be using an index: fix this?
-CREATE INDEX /*i*/cl_sortkey ON /*_*/categorylinks (cl_to,cl_type,cl_sortkey,cl_from);
-
--- Used by the API (and some extensions)
-CREATE INDEX /*i*/cl_timestamp ON /*_*/categorylinks (cl_to,cl_timestamp);
-
--- Used when updating collation (e.g. updateCollation.php)
-CREATE INDEX /*i*/cl_collation_ext ON /*_*/categorylinks (cl_collation, cl_to, cl_type, cl_from);
-
---
--- Track all existing categories. Something is a category if 1) it has an entry
--- somewhere in categorylinks, or 2) it has a description page. Categories
--- might not have corresponding pages, so they need to be tracked separately.
---
-CREATE TABLE /*_*/category (
-  -- Primary key
-  cat_id int NOT NULL PRIMARY KEY IDENTITY,
-
-  -- Name of the category, in the same form as page_title (with underscores).
-  -- If there is a category page corresponding to this category, by definition,
-  -- it has this name (in the Category namespace).
-  cat_title nvarchar(255) NOT NULL,
-
-  -- The numbers of member pages (including categories and media), subcatego-
-  -- ries, and Image: namespace members, respectively.  These are signed to
-  -- make underflow more obvious.  We make the first number include the second
-  -- two for better sorting: subtracting for display is easy, adding for order-
-  -- ing is not.
-  cat_pages int NOT NULL default 0,
-  cat_subcats int NOT NULL default 0,
-  cat_files int NOT NULL default 0
-);
-
-CREATE UNIQUE INDEX /*i*/cat_title ON /*_*/category (cat_title);
-
--- For Special:Mostlinkedcategories
-CREATE INDEX /*i*/cat_pages ON /*_*/category (cat_pages);
-
-
---
--- Table defining tag names for IDs. Also stores hit counts to avoid expensive queries on change_tag
---
-CREATE TABLE /*_*/change_tag_def (
-    -- Numerical ID of the tag (ct_tag_id refers to this)
-    ctd_id int NOT NULL CONSTRAINT PK_change_tag_def PRIMARY KEY IDENTITY,
-    -- Symbolic name of the tag (what would previously be put in ct_tag)
-    ctd_name nvarchar(255) NOT NULL,
-    -- Whether this tag was defined manually by a privileged user using Special:Tags
-    ctd_user_defined tinyint NOT NULL CONSTRAINT DF_ctd_user_defined DEFAULT 0,
-    -- Number of times this tag was used
-    ctd_count int NOT NULL CONSTRAINT DF_ctd_count DEFAULT 0
-) /*$wgDBTableOptions*/;
-
-CREATE UNIQUE INDEX /*i*/ctd_name ON /*_*/change_tag_def (ctd_name);
-CREATE INDEX /*i*/ctd_count ON /*_*/change_tag_def (ctd_count);
-CREATE INDEX /*i*/ctd_user_defined ON /*_*/change_tag_def (ctd_user_defined);
-
---
--- Track links to external URLs
---
-CREATE TABLE /*_*/externallinks (
-  -- Primary key
-  el_id int NOT NULL PRIMARY KEY IDENTITY,
-
-  -- page_id of the referring page
-  el_from int NOT NULL REFERENCES /*_*/page(page_id) ON DELETE CASCADE,
-
-  -- The URL
-  el_to nvarchar(max) NOT NULL,
-
-  -- In the case of HTTP URLs, this is the URL with any username or password
-  -- removed, and with the labels in the hostname reversed and converted to
-  -- lower case. An extra dot is added to allow for matching of either
-  -- example.com or *.example.com in a single scan.
-  -- Example:
-  --      http://user:password@sub.example.com/page.html
-  --   becomes
-  --      http://com.example.sub./page.html
-  -- which allows for fast searching for all pages under example.com with the
-  -- clause:
-  --      WHERE el_index LIKE 'http://com.example.%'
-  --
-  -- Note if you enable or disable PHP's intl extension, you'll need to run
-  -- maintenance/refreshExternallinksIndex.php to refresh this field.
-  el_index nvarchar(450) NOT NULL,
-
-  -- This is el_index truncated to 60 bytes to allow for sortable queries that
-  -- aren't supported by a partial index.
-  el_index_60 varbinary(60) NOT NULL
-);
-
-CREATE INDEX /*i*/el_from ON /*_*/externallinks (el_from);
-CREATE INDEX /*i*/el_index ON /*_*/externallinks (el_index);
-CREATE INDEX /*i*/el_index_60 ON /*_*/externallinks (el_index_60, el_id);
-CREATE INDEX /*i*/el_from_index_60 ON /*_*/externallinks (el_from, el_index_60, el_id);
--- el_to index intentionally not added; we cannot index nvarchar(max) columns,
--- but we also cannot restrict el_to to a smaller column size as the external
--- link may be larger.
-
---
--- Track interlanguage links
---
-CREATE TABLE /*_*/langlinks (
-  -- page_id of the referring page
-  ll_from int NOT NULL REFERENCES /*_*/page(page_id) ON DELETE CASCADE,
-
-  -- Language code of the target
-  ll_lang nvarchar(20) NOT NULL default '',
-
-  -- Title of the target, including namespace
-  ll_title nvarchar(255) NOT NULL default ''
-);
-
-CREATE UNIQUE INDEX /*i*/ll_from ON /*_*/langlinks (ll_from, ll_lang);
-CREATE INDEX /*i*/ll_lang ON /*_*/langlinks (ll_lang, ll_title);
-
-
---
--- Track inline interwiki links
---
-CREATE TABLE /*_*/iwlinks (
-  -- page_id of the referring page
-  iwl_from int NOT NULL REFERENCES /*_*/page(page_id) ON DELETE CASCADE,
-
-  -- Interwiki prefix code of the target
-  iwl_prefix nvarchar(20) NOT NULL default '',
-
-  -- Title of the target, including namespace
-  iwl_title nvarchar(255) NOT NULL default ''
-);
-
-CREATE UNIQUE INDEX /*i*/iwl_from ON /*_*/iwlinks (iwl_from, iwl_prefix, iwl_title);
-CREATE INDEX /*i*/iwl_prefix_title_from ON /*_*/iwlinks (iwl_prefix, iwl_title, iwl_from);
-CREATE INDEX /*i*/iwl_prefix_from_title ON /*_*/iwlinks (iwl_prefix, iwl_from, iwl_title);
-
-
---
--- Contains a single row with some aggregate info
--- on the state of the site.
---
-CREATE TABLE /*_*/site_stats (
-  -- The single row should contain 1 here.
-  ss_row_id int NOT NULL CONSTRAINT /*i*/ss_row_id PRIMARY KEY,
-
-  -- Total number of edits performed.
-  ss_total_edits bigint default NULL,
-
-  -- See SiteStatsInit::articles().
-  ss_good_articles bigint default NULL,
-
-  -- Total pages, theoretically equal to SELECT COUNT(*) FROM page.
-  ss_total_pages bigint default NULL,
-
-  -- Number of users, theoretically equal to SELECT COUNT(*) FROM user.
-  ss_users bigint default NULL,
-
-  -- Number of users that still edit.
-  ss_active_users bigint default NULL,
-
-  -- Number of images, equivalent to SELECT COUNT(*) FROM image.
-  ss_images bigint default NULL
-);
-
-
---
--- The internet is full of jerks, alas. Sometimes it's handy
--- to block a vandal or troll account.
---
-CREATE TABLE /*_*/ipblocks (
-  -- Primary key, introduced for privacy.
-  ipb_id int NOT NULL PRIMARY KEY IDENTITY,
-
-  -- Blocked IP address in dotted-quad form or user name.
-  ipb_address nvarchar(255) NOT NULL,
-
-  -- Blocked user ID or 0 for IP blocks.
-  ipb_user int REFERENCES /*_*/mwuser(user_id),
-
-  -- User ID who made the block.
-  ipb_by int REFERENCES /*_*/mwuser(user_id) ON DELETE CASCADE,
-
-  -- Actor ID who made the block.
-  ipb_by_actor bigint NOT NULL CONSTRAINT DF_ipb_by_actor DEFAULT 0,
-
-  -- User name of blocker
-  ipb_by_text nvarchar(255) NOT NULL default '',
-
-  -- Key to comment_id. Text comment made by blocker.
-  ipb_reason_id bigint NOT NULL CONSTRAINT FK_ipb_reason_id FOREIGN KEY REFERENCES /*_*/comment(comment_id),
-
-  -- Creation (or refresh) date in standard YMDHMS form.
-  -- IP blocks expire automatically.
-  ipb_timestamp varchar(14) NOT NULL default '',
-
-  -- Indicates that the IP address was banned because a banned
-  -- user accessed a page through it. If this is 1, ipb_address
-  -- will be hidden, and the block identified by block ID number.
-  ipb_auto bit NOT NULL default 0,
-
-  -- If set to 1, block applies only to logged-out users
-  ipb_anon_only bit NOT NULL default 0,
-
-  -- Block prevents account creation from matching IP addresses
-  ipb_create_account bit NOT NULL default 1,
-
-  -- Block triggers autoblocks
-  ipb_enable_autoblock bit NOT NULL default 1,
-
-  -- Time at which the block will expire.
-  -- May be "infinity"
-  ipb_expiry varchar(14) NOT NULL,
-
-  -- Start and end of an address range, in hexadecimal
-  -- Size chosen to allow IPv6
-  -- FIXME: these fields were originally blank for single-IP blocks,
-  -- but now they are populated. No migration was ever done. They
-  -- should be fixed to be blank again for such blocks (T51504).
-  ipb_range_start varchar(255) NOT NULL,
-  ipb_range_end varchar(255) NOT NULL,
-
-  -- Flag for entries hidden from users and Sysops
-  ipb_deleted bit NOT NULL default 0,
-
-  -- Block prevents user from accessing Special:Emailuser
-  ipb_block_email bit NOT NULL default 0,
-
-  -- Block allows user to edit their own talk page
-  ipb_allow_usertalk bit NOT NULL default 0,
-
-  -- ID of the block that caused this block to exist
-  -- Autoblocks set this to the original block
-  -- so that the original block being deleted also
-  -- deletes the autoblocks
-  ipb_parent_block_id int default NULL REFERENCES /*_*/ipblocks(ipb_id),
-
-  -- Block user from editing any page on the site (other than their own user
-  -- talk page).
-  ipb_sitewide bit NOT NULL CONSTRAINT DF_ipb_sitewide DEFAULT 1
-);
-
--- Unique index to support "user already blocked" messages
--- Any new options which prevent collisions should be included
-CREATE UNIQUE INDEX /*i*/ipb_address ON /*_*/ipblocks (ipb_address, ipb_user, ipb_auto, ipb_anon_only);
-
-CREATE INDEX /*i*/ipb_user ON /*_*/ipblocks (ipb_user);
-CREATE INDEX /*i*/ipb_range ON /*_*/ipblocks (ipb_range_start, ipb_range_end);
-CREATE INDEX /*i*/ipb_timestamp ON /*_*/ipblocks (ipb_timestamp);
-CREATE INDEX /*i*/ipb_expiry ON /*_*/ipblocks (ipb_expiry);
-CREATE INDEX /*i*/ipb_parent_block_id ON /*_*/ipblocks (ipb_parent_block_id);
-
---
--- Partial Block Restrictions
---
-CREATE TABLE /*_*/ipblocks_restrictions (
-
-  -- The ipb_id from ipblocks
-  ir_ipb_id int NOT NULL CONSTRAINT FK_ir_ipb_id FOREIGN KEY REFERENCES /*_*/ipblocks(ipb_id) ON DELETE CASCADE,
-
-  -- The restriction type id.
-  ir_type tinyint NOT NULL,
-
-  -- The restriction id that corrposponds to the type. Typically a Page ID or a
-  -- Namespace ID.
-  ir_value int NOT NULL,
-
-  CONSTRAINT PK_ipblocks_restrictions PRIMARY KEY (ir_ipb_id, ir_type, ir_value)
-) /*$wgDBTableOptions*/;
-
--- Index to query restrictions by the page or namespace.
-CREATE INDEX /*i*/ir_type_value ON /*_*/ipblocks_restrictions (ir_type, ir_value);
-
---
--- Uploaded images and other files.
---
-CREATE TABLE /*_*/image (
-  -- Filename.
-  -- This is also the title of the associated description page,
-  -- which will be in namespace 6 (NS_FILE).
-  img_name nvarchar(255) NOT NULL default '' PRIMARY KEY,
-
-  -- File size in bytes.
-  img_size int NOT NULL default 0,
-
-  -- For images, size in pixels.
-  img_width int NOT NULL default 0,
-  img_height int NOT NULL default 0,
-
-  -- Extracted Exif metadata stored as a serialized PHP array.
-  img_metadata varbinary(max) NOT NULL,
-
-  -- For images, bits per pixel if known.
-  img_bits int NOT NULL default 0,
-
-  -- Media type as defined by the MEDIATYPE_xxx constants
-  img_media_type varchar(16) default null,
-
-  -- major part of a MIME media type as defined by IANA
-  -- see https://www.iana.org/assignments/media-types/
-  img_major_mime varchar(16) not null default 'unknown',
-
-  -- minor part of a MIME media type as defined by IANA
-  -- the minor parts are not required to adher to any standard
-  -- but should be consistent throughout the database
-  -- see https://www.iana.org/assignments/media-types/
-  img_minor_mime nvarchar(100) NOT NULL default 'unknown',
-
-  -- Description field as entered by the uploader.
-  -- This is displayed in image upload history and logs.
-  img_description_id bigint NOT NULL CONSTRAINT FK_img_description_id FOREIGN KEY REFERENCES /*_*/comment(comment_id),
-
-  -- user_id and user_name of uploader.
-  img_user int REFERENCES /*_*/mwuser(user_id) ON DELETE SET NULL,
-  img_user_text nvarchar(255) NOT NULL CONSTRAINT DF_img_user_text DEFAULT '',
-  img_actor bigint NOT NULL CONSTRAINT DF_img_actor DEFAULT 0,
-
-  -- Time of the upload.
-  img_timestamp nvarchar(14) NOT NULL default '',
-
-  -- SHA-1 content hash in base-36
-  img_sha1 nvarchar(32) NOT NULL default '',
-
-  CONSTRAINT img_major_mime_ckc check (img_major_mime IN('unknown', 'application', 'audio', 'image', 'text', 'video', 'message', 'model', 'multipart', 'chemical')),
-  CONSTRAINT img_media_type_ckc check (img_media_type in('UNKNOWN', 'BITMAP', 'DRAWING', 'AUDIO', 'VIDEO', 'MULTIMEDIA', 'OFFICE', 'TEXT', 'EXECUTABLE', 'ARCHIVE','3D'))
-);
-
-CREATE INDEX /*i*/img_usertext_timestamp ON /*_*/image (img_user_text,img_timestamp);
-CREATE INDEX /*i*/img_actor_timestamp ON /*_*/image (img_actor, img_timestamp);
--- Used by Special:ListFiles for sort-by-size
-CREATE INDEX /*i*/img_size ON /*_*/image (img_size);
--- Used by Special:Newimages and Special:ListFiles
-CREATE INDEX /*i*/img_timestamp ON /*_*/image (img_timestamp);
--- Used in API and duplicate search
-CREATE INDEX /*i*/img_sha1 ON /*_*/image (img_sha1);
--- Used to get media of one type
-CREATE INDEX /*i*/img_media_mime ON /*_*/image (img_media_type,img_major_mime,img_minor_mime);
-
-
---
--- Previous revisions of uploaded files.
--- Awkwardly, image rows have to be moved into
--- this table at re-upload time.
---
-CREATE TABLE /*_*/oldimage (
-  -- Base filename: key to image.img_name
-  -- Not a FK because deleting images removes them from image
-  oi_name nvarchar(255) NOT NULL default '',
-
-  -- Filename of the archived file.
-  -- This is generally a timestamp and '!' prepended to the base name.
-  oi_archive_name nvarchar(255) NOT NULL default '',
-
-  -- Other fields as in image...
-  oi_size int NOT NULL default 0,
-  oi_width int NOT NULL default 0,
-  oi_height int NOT NULL default 0,
-  oi_bits int NOT NULL default 0,
-  oi_description_id bigint NOT NULL CONSTRAINT FK_oi_description_id FOREIGN KEY REFERENCES /*_*/comment(comment_id),
-  oi_user int REFERENCES /*_*/mwuser(user_id),
-  oi_user_text nvarchar(255) NOT NULL CONSTRAINT DF_oi_user_text DEFAULT '',
-  oi_actor bigint NOT NULL CONSTRAINT DF_oi_actor DEFAULT 0,
-  oi_timestamp varchar(14) NOT NULL default '',
-
-  oi_metadata varbinary(max) NOT NULL,
-  oi_media_type varchar(16) default null,
-  oi_major_mime varchar(16) not null default 'unknown',
-  oi_minor_mime nvarchar(100) NOT NULL default 'unknown',
-  oi_deleted tinyint NOT NULL default 0,
-  oi_sha1 nvarchar(32) NOT NULL default '',
-
-  CONSTRAINT oi_major_mime_ckc check (oi_major_mime IN('unknown', 'application', 'audio', 'image', 'text', 'video', 'message', 'model', 'multipart', 'chemical')),
-  CONSTRAINT oi_media_type_ckc check (oi_media_type IN('UNKNOWN', 'BITMAP', 'DRAWING', 'AUDIO', 'VIDEO', 'MULTIMEDIA', 'OFFICE', 'TEXT', 'EXECUTABLE', 'ARCHIVE','3D'))
-);
-
-CREATE INDEX /*i*/oi_usertext_timestamp ON /*_*/oldimage (oi_user_text,oi_timestamp);
-CREATE INDEX /*i*/oi_actor_timestamp ON /*_*/oldimage (oi_actor,oi_timestamp);
-CREATE INDEX /*i*/oi_name_timestamp ON /*_*/oldimage (oi_name,oi_timestamp);
-CREATE INDEX /*i*/oi_sha1 ON /*_*/oldimage (oi_sha1);
-
-
---
--- Record of deleted file data
---
-CREATE TABLE /*_*/filearchive (
-  -- Unique row id
-  fa_id int NOT NULL PRIMARY KEY IDENTITY,
-
-  -- Original base filename; key to image.img_name, page.page_title, etc
-  fa_name nvarchar(255) NOT NULL default '',
-
-  -- Filename of archived file, if an old revision
-  fa_archive_name nvarchar(255) default '',
-
-  -- Which storage bin (directory tree or object store) the file data
-  -- is stored in. Should be 'deleted' for files that have been deleted;
-  -- any other bin is not yet in use.
-  fa_storage_group nvarchar(16),
-
-  -- SHA-1 of the file contents plus extension, used as a key for storage.
-  -- eg 8f8a562add37052a1848ff7771a2c515db94baa9.jpg
-  --
-  -- If NULL, the file was missing at deletion time or has been purged
-  -- from the archival storage.
-  fa_storage_key nvarchar(64) default '',
-
-  -- Deletion information, if this file is deleted.
-  fa_deleted_user int,
-  fa_deleted_timestamp varchar(14) default '',
-  fa_deleted_reason_id bigint NOT NULL CONSTRAINT FK_fa_deleted_reason_id FOREIGN KEY REFERENCES /*_*/comment(comment_id),
-
-  -- Duped fields from image
-  fa_size int default 0,
-  fa_width int default 0,
-  fa_height int default 0,
-  fa_metadata varbinary(max),
-  fa_bits int default 0,
-  fa_media_type varchar(16) default null,
-  fa_major_mime varchar(16) not null default 'unknown',
-  fa_minor_mime nvarchar(100) default 'unknown',
-  fa_description_id bigint NOT NULL CONSTRAINT FK_fa_description_id FOREIGN KEY REFERENCES /*_*/comment(comment_id),
-  fa_user int default 0 REFERENCES /*_*/mwuser(user_id) ON DELETE SET NULL,
-  fa_user_text nvarchar(255) CONSTRAINT DF_fa_user_text DEFAULT '',
-  fa_actor bigint NOT NULL CONSTRAINT DF_fa_actor DEFAULT 0,
-  fa_timestamp varchar(14) default '',
-
-  -- Visibility of deleted revisions, bitfield
-  fa_deleted tinyint NOT NULL default 0,
-
-  -- sha1 hash of file content
-  fa_sha1 nvarchar(32) NOT NULL default '',
-
-  CONSTRAINT fa_major_mime_ckc check (fa_major_mime in('unknown', 'application', 'audio', 'image', 'text', 'video', 'message', 'model', 'multipart', 'chemical')),
-  CONSTRAINT fa_media_type_ckc check (fa_media_type in('UNKNOWN', 'BITMAP', 'DRAWING', 'AUDIO', 'VIDEO', 'MULTIMEDIA', 'OFFICE', 'TEXT', 'EXECUTABLE', 'ARCHIVE','3D'))
-);
-
--- pick out by image name
-CREATE INDEX /*i*/fa_name ON /*_*/filearchive (fa_name, fa_timestamp);
--- pick out dupe files
-CREATE INDEX /*i*/fa_storage_group ON /*_*/filearchive (fa_storage_group, fa_storage_key);
--- sort by deletion time
-CREATE INDEX /*i*/fa_deleted_timestamp ON /*_*/filearchive (fa_deleted_timestamp);
--- sort by uploader
-CREATE INDEX /*i*/fa_user_timestamp ON /*_*/filearchive (fa_user_text,fa_timestamp);
-CREATE INDEX /*i*/fa_actor_timestamp ON /*_*/filearchive (fa_actor,fa_timestamp);
--- find file by sha1, 10 bytes will be enough for hashes to be indexed
-CREATE INDEX /*i*/fa_sha1 ON /*_*/filearchive (fa_sha1);
-
-
---
--- Store information about newly uploaded files before they're
--- moved into the actual filestore
---
-CREATE TABLE /*_*/uploadstash (
-  us_id int NOT NULL PRIMARY KEY IDENTITY,
-
-  -- the user who uploaded the file.
-  us_user int REFERENCES /*_*/mwuser(user_id) ON DELETE SET NULL,
-
-  -- file key. this is how applications actually search for the file.
-  -- this might go away, or become the primary key.
-  us_key nvarchar(255) NOT NULL,
-
-  -- the original path
-  us_orig_path nvarchar(255) NOT NULL,
-
-  -- the temporary path at which the file is actually stored
-  us_path nvarchar(255) NOT NULL,
-
-  -- which type of upload the file came from (sometimes)
-  us_source_type nvarchar(50),
-
-  -- the date/time on which the file was added
-  us_timestamp varchar(14) NOT NULL,
-
-  us_status nvarchar(50) NOT NULL,
-
-  -- chunk counter starts at 0, current offset is stored in us_size
-  us_chunk_inx int NULL,
-
-  -- Serialized file properties from FSFile::getProps()
-  us_props nvarchar(max),
-
-  -- file size in bytes
-  us_size int NOT NULL,
-  -- this hash comes from FSFile::getSha1Base36(), and is 31 characters
-  us_sha1 nvarchar(31) NOT NULL,
-  us_mime nvarchar(255),
-  -- Media type as defined by the MEDIATYPE_xxx constants, should duplicate definition in the image table
-  us_media_type varchar(16) default null,
-  -- image-specific properties
-  us_image_width int,
-  us_image_height int,
-  us_image_bits smallint,
-
-  CONSTRAINT us_media_type_ckc check (us_media_type in('UNKNOWN', 'BITMAP', 'DRAWING', 'AUDIO', 'VIDEO', 'MULTIMEDIA', 'OFFICE', 'TEXT', 'EXECUTABLE', 'ARCHIVE', '3D'))
-);
-
--- sometimes there's a delete for all of a user's stuff.
-CREATE INDEX /*i*/us_user ON /*_*/uploadstash (us_user);
--- pick out files by key, enforce key uniqueness
-CREATE UNIQUE INDEX /*i*/us_key ON /*_*/uploadstash (us_key);
--- the abandoned upload cleanup script needs this
-CREATE INDEX /*i*/us_timestamp ON /*_*/uploadstash (us_timestamp);
-
-
---
--- Primarily a summary table for Special:Recentchanges,
--- this table contains some additional info on edits from
--- the last few days, see Article::editUpdates()
---
-CREATE TABLE /*_*/recentchanges (
-  rc_id int NOT NULL CONSTRAINT recentchanges__pk PRIMARY KEY IDENTITY,
-  rc_timestamp varchar(14) not null default '',
-
-  -- As in revision
-  rc_user int NOT NULL default 0 CONSTRAINT rc_user__user_id__fk FOREIGN KEY REFERENCES /*_*/mwuser(user_id),
-  rc_user_text nvarchar(255) NOT NULL CONSTRAINT DF_rc_user_text DEFAULT '',
-  rc_actor bigint NOT NULL CONSTRAINT DF_rc_actor DEFAULT 0,
-
-  -- When pages are renamed, their RC entries do _not_ change.
-  rc_namespace int NOT NULL default 0,
-  rc_title nvarchar(255) NOT NULL default '',
-
-  -- as in revision...
-  rc_comment_id bigint NOT NULL CONSTRAINT FK_rc_comment_id FOREIGN KEY REFERENCES /*_*/comment(comment_id),
-  rc_minor bit NOT NULL default 0,
-
-  -- Edits by user accounts with the 'bot' rights key are
-  -- marked with a 1 here, and will be hidden from the
-  -- default view.
-  rc_bot bit NOT NULL default 0,
-
-  -- Set if this change corresponds to a page creation
-  rc_new bit NOT NULL default 0,
-
-  -- Key to page_id (was cur_id prior to 1.5).
-  -- This will keep links working after moves while
-  -- retaining the at-the-time name in the changes list.
-  rc_cur_id int, -- NOT FK
-
-  -- rev_id of the given revision
-  rc_this_oldid int, -- NOT FK
-
-  -- rev_id of the prior revision, for generating diff links.
-  rc_last_oldid int, -- NOT FK
-
-  -- The type of change entry (RC_EDIT,RC_NEW,RC_LOG,RC_EXTERNAL)
-  rc_type tinyint NOT NULL default 0,
-
-  -- The source of the change entry (replaces rc_type)
-  -- default of '' is temporary, needed for initial migration
-  rc_source nvarchar(16) not null default '',
-
-  -- If the Recent Changes Patrol option is enabled,
-  -- users may mark edits as having been reviewed to
-  -- remove a warning flag on the RC list.
-  -- A value of 1 indicates the page has been reviewed manually.
-  -- A value of 2 indicates the page has been automatically reviewed.
-  rc_patrolled tinyint NOT NULL CONSTRAINT DF_rc_patrolled DEFAULT 0,
-
-  -- Recorded IP address the edit was made from, if the
-  -- $wgPutIPinRC option is enabled.
-  rc_ip nvarchar(40) NOT NULL default '',
-
-  -- Text length in characters before
-  -- and after the edit
-  rc_old_len int,
-  rc_new_len int,
-
-  -- Visibility of recent changes items, bitfield
-  rc_deleted tinyint NOT NULL default 0,
-
-  -- Value corresponding to log_id, specific log entries
-  rc_logid int, -- FK added later
-  -- Store log type info here, or null
-  rc_log_type nvarchar(255) NULL default NULL,
-  -- Store log action or null
-  rc_log_action nvarchar(255) NULL default NULL,
-  -- Log params
-  rc_params nvarchar(max) NULL
-);
-
-CREATE INDEX /*i*/rc_timestamp ON /*_*/recentchanges (rc_timestamp);
-CREATE INDEX /*i*/rc_namespace_title_timestamp ON /*_*/recentchanges (rc_namespace, rc_title, rc_timestamp);
-CREATE INDEX /*i*/rc_cur_id ON /*_*/recentchanges (rc_cur_id);
-CREATE INDEX /*i*/new_name_timestamp ON /*_*/recentchanges (rc_new,rc_namespace,rc_timestamp);
-CREATE INDEX /*i*/rc_ip ON /*_*/recentchanges (rc_ip);
-CREATE INDEX /*i*/rc_ns_usertext ON /*_*/recentchanges (rc_namespace, rc_user_text);
-CREATE INDEX /*i*/rc_user_text ON /*_*/recentchanges (rc_user_text, rc_timestamp);
-CREATE INDEX /*i*/rc_ns_actor ON /*_*/recentchanges (rc_namespace, rc_actor);
-CREATE INDEX /*i*/rc_actor ON /*_*/recentchanges (rc_actor, rc_timestamp);
-CREATE INDEX /*i*/rc_name_type_patrolled_timestamp ON /*_*/recentchanges (rc_namespace, rc_type, rc_patrolled, rc_timestamp);
-CREATE INDEX /*i*/rc_this_oldid ON /*_*/recentchanges (rc_this_oldid);
-
-
-CREATE TABLE /*_*/watchlist (
-  wl_id int NOT NULL PRIMARY KEY IDENTITY,
-  -- Key to user.user_id
-  wl_user int NOT NULL REFERENCES /*_*/mwuser(user_id) ON DELETE CASCADE,
-
-  -- Key to page_namespace/page_title
-  -- Note that users may watch pages which do not exist yet,
-  -- or existed in the past but have been deleted.
-  wl_namespace int NOT NULL default 0,
-  wl_title nvarchar(255) NOT NULL default '',
-
-  -- Timestamp used to send notification e-mails and show "updated since last visit" markers on
-  -- history and recent changes / watchlist. Set to NULL when the user visits the latest revision
-  -- of the page, which means that they should be sent an e-mail on the next change.
-  wl_notificationtimestamp varchar(14)
-
-);
-
-CREATE UNIQUE INDEX /*i*/wl_user ON /*_*/watchlist (wl_user, wl_namespace, wl_title);
-CREATE INDEX /*i*/namespace_title ON /*_*/watchlist (wl_namespace, wl_title);
-
-
---
--- Our search index for the builtin MediaWiki search
---
-CREATE TABLE /*_*/searchindex (
-  -- Key to page_id
-  si_page int NOT NULL REFERENCES /*_*/page(page_id) ON DELETE CASCADE,
-
-  -- Munged version of title
-  si_title nvarchar(255) NOT NULL default '',
-
-  -- Munged version of body text
-  si_text nvarchar(max) NOT NULL
-);
-
-CREATE UNIQUE INDEX /*i*/si_page ON /*_*/searchindex (si_page);
--- Fulltext index is defined in MssqlInstaller.php
-
---
--- Recognized interwiki link prefixes
---
-CREATE TABLE /*_*/interwiki (
-  -- The interwiki prefix, (e.g. "Meatball", or the language prefix "de")
-  iw_prefix nvarchar(32) NOT NULL CONSTRAINT PK_interwiki PRIMARY KEY,
-
-  -- The URL of the wiki, with "$1" as a placeholder for an article name.
-  -- Any spaces in the name will be transformed to underscores before
-  -- insertion.
-  iw_url nvarchar(max) NOT NULL,
-
-  -- The URL of the file api.php
-  iw_api nvarchar(max) NOT NULL,
-
-  -- The name of the database (for a connection to be established with LBFactory::getMainLB( 'wikiid' ))
-  iw_wikiid nvarchar(64) NOT NULL,
-
-  -- A boolean value indicating whether the wiki is in this project
-  -- (used, for example, to detect redirect loops)
-  iw_local bit NOT NULL,
-
-  -- Boolean value indicating whether interwiki transclusions are allowed.
-  iw_trans bit NOT NULL default 0
-);
-
---
--- Used for caching expensive grouped queries
---
-CREATE TABLE /*_*/querycache (
-  -- A key name, generally the base name of of the special page.
-  qc_type nvarchar(32) NOT NULL,
-
-  -- Some sort of stored value. Sizes, counts...
-  qc_value int NOT NULL default 0,
-
-  -- Target namespace+title
-  qc_namespace int NOT NULL default 0,
-  qc_title nvarchar(255) NOT NULL default ''
-);
-
-CREATE INDEX /*i*/qc_type ON /*_*/querycache (qc_type,qc_value);
-
-
---
--- For a few generic cache operations if not using Memcached
---
-CREATE TABLE /*_*/objectcache (
-  keyname nvarchar(255) NOT NULL default '' PRIMARY KEY,
-  value varbinary(max),
-  exptime varchar(14)
-);
-CREATE INDEX /*i*/exptime ON /*_*/objectcache (exptime);
-
-
-CREATE TABLE /*_*/logging (
-  -- Log ID, for referring to this specific log entry, probably for deletion and such.
-  log_id int NOT NULL PRIMARY KEY IDENTITY(0,1),
-
-  -- Symbolic keys for the general log type and the action type
-  -- within the log. The output format will be controlled by the
-  -- action field, but only the type controls categorization.
-  log_type nvarchar(32) NOT NULL default '',
-  log_action nvarchar(32) NOT NULL default '',
-
-  -- Timestamp. Duh.
-  log_timestamp varchar(14) NOT NULL default '',
-
-  -- The user who performed this action; key to user_id
-  log_user int, -- NOT an FK, if a user is deleted we still want to maintain a record of who did a thing
-
-  -- Name of the user who performed this action
-  log_user_text nvarchar(255) NOT NULL default '',
-
-  -- The actor who performed this action
-  log_actor bigint NOT NULL CONSTRAINT DF_log_actor DEFAULT 0,
-
-  -- Key to the page affected. Where a user is the target,
-  -- this will point to the user page.
-  log_namespace int NOT NULL default 0,
-  log_title nvarchar(255) NOT NULL default '',
-  log_page int NULL, -- NOT an FK, logging entries are inserted for deleted pages which still reference the deleted page ids
-
-  -- Key to comment_id. Comment summarizing the change.
-  log_comment_id bigint NOT NULL CONSTRAINT FK_log_comment_id FOREIGN KEY REFERENCES /*_*/comment(comment_id),
-
-  -- miscellaneous parameters:
-  -- LF separated list (old system) or serialized PHP array (new system)
-  log_params nvarchar(max) NOT NULL,
-
-  -- rev_deleted for logs
-  log_deleted tinyint NOT NULL default 0
-);
-
-CREATE INDEX /*i*/type_time ON /*_*/logging (log_type, log_timestamp);
-CREATE INDEX /*i*/user_time ON /*_*/logging (log_user, log_timestamp);
-CREATE INDEX /*i*/page_time ON /*_*/logging (log_namespace, log_title, log_timestamp);
-CREATE INDEX /*i*/times ON /*_*/logging (log_timestamp);
-CREATE INDEX /*i*/log_user_type_time ON /*_*/logging (log_user, log_type, log_timestamp);
-CREATE INDEX /*i*/log_page_id_time ON /*_*/logging (log_page,log_timestamp);
-CREATE INDEX /*i*/log_type_action ON /*_*/logging (log_type, log_action, log_timestamp);
-CREATE INDEX /*i*/log_user_text_type_time ON /*_*/logging (log_user_text, log_type, log_timestamp);
-CREATE INDEX /*i*/log_user_text_time ON /*_*/logging (log_user_text, log_timestamp);
-CREATE INDEX /*i*/actor_time ON /*_*/logging (log_actor, log_timestamp);
-CREATE INDEX /*i*/log_actor_type_time ON /*_*/logging (log_actor, log_type, log_timestamp);
-
-INSERT INTO /*_*/logging (log_user,log_page,log_params) VALUES(0,0,'');
-
-ALTER TABLE /*_*/recentchanges ADD CONSTRAINT rc_logid__log_id__fk FOREIGN KEY (rc_logid) REFERENCES /*_*/logging(log_id) ON DELETE CASCADE;
-
-CREATE TABLE /*_*/log_search (
-  -- The type of ID (rev ID, log ID, rev timestamp, username)
-  ls_field nvarchar(32) NOT NULL,
-  -- The value of the ID
-  ls_value nvarchar(255) NOT NULL,
-  -- Key to log_id
-  ls_log_id int REFERENCES /*_*/logging(log_id) ON DELETE CASCADE
-);
-CREATE UNIQUE INDEX /*i*/ls_field_val ON /*_*/log_search (ls_field,ls_value,ls_log_id);
-CREATE INDEX /*i*/ls_log_id ON /*_*/log_search (ls_log_id);
-
-
--- Jobs performed by parallel apache threads or a command-line daemon
-CREATE TABLE /*_*/job (
-  job_id int NOT NULL PRIMARY KEY IDENTITY,
-
-  -- Command name
-  -- Limited to 60 to prevent key length overflow
-  job_cmd nvarchar(60) NOT NULL default '',
-
-  -- Namespace and title to act on
-  -- Should be 0 and '' if the command does not operate on a title
-  job_namespace int NOT NULL,
-  job_title nvarchar(255) NOT NULL,
-
-  -- Timestamp of when the job was inserted
-  -- NULL for jobs added before addition of the timestamp
-  job_timestamp nvarchar(14) NULL default NULL,
-
-  -- Any other parameters to the command
-  -- Stored as a PHP serialized array, or an empty string if there are no parameters
-  job_params nvarchar(max) NOT NULL,
-
-  -- Random, non-unique, number used for job acquisition (for lock concurrency)
-  job_random int NOT NULL default 0,
-
-  -- The number of times this job has been locked
-  job_attempts int NOT NULL default 0,
-
-  -- Field that conveys process locks on rows via process UUIDs
-  job_token nvarchar(32) NOT NULL default '',
-
-  -- Timestamp when the job was locked
-  job_token_timestamp varchar(14) NULL default NULL,
-
-  -- Base 36 SHA1 of the job parameters relevant to detecting duplicates
-  job_sha1 nvarchar(32) NOT NULL default ''
-);
-
-CREATE INDEX /*i*/job_sha1 ON /*_*/job (job_sha1);
-CREATE INDEX /*i*/job_cmd_token ON /*_*/job (job_cmd,job_token,job_random);
-CREATE INDEX /*i*/job_cmd_token_id ON /*_*/job (job_cmd,job_token,job_id);
-CREATE INDEX /*i*/job_cmd ON /*_*/job (job_cmd, job_namespace, job_title);
-CREATE INDEX /*i*/job_timestamp ON /*_*/job (job_timestamp);
-
-
--- Details of updates to cached special pages
-CREATE TABLE /*_*/querycache_info (
-  -- Special page name
-  -- Corresponds to a qc_type value
-  qci_type nvarchar(32) NOT NULL default '',
-
-  -- Timestamp of last update
-  qci_timestamp varchar(14) NOT NULL default ''
-);
-
-CREATE UNIQUE INDEX /*i*/qci_type ON /*_*/querycache_info (qci_type);
-
-
--- For each redirect, this table contains exactly one row defining its target
-CREATE TABLE /*_*/redirect (
-  -- Key to the page_id of the redirect page
-  rd_from int NOT NULL REFERENCES /*_*/page(page_id) ON DELETE CASCADE,
-
-  -- Key to page_namespace/page_title of the target page.
-  -- The target page may or may not exist, and due to renames
-  -- and deletions may refer to different page records as time
-  -- goes by.
-  rd_namespace int NOT NULL default 0,
-  rd_title nvarchar(255) NOT NULL default '',
-  rd_interwiki nvarchar(32) default NULL,
-  rd_fragment nvarchar(255) default NULL
-);
-
-CREATE INDEX /*i*/rd_ns_title ON /*_*/redirect (rd_namespace,rd_title,rd_from);
-
-
--- Used for caching expensive grouped queries that need two links (for example double-redirects)
-CREATE TABLE /*_*/querycachetwo (
-  -- A key name, generally the base name of of the special page.
-  qcc_type nvarchar(32) NOT NULL,
-
-  -- Some sort of stored value. Sizes, counts...
-  qcc_value int NOT NULL default 0,
-
-  -- Target namespace+title
-  qcc_namespace int NOT NULL default 0,
-  qcc_title nvarchar(255) NOT NULL default '',
-
-  -- Target namespace+title2
-  qcc_namespacetwo int NOT NULL default 0,
-  qcc_titletwo nvarchar(255) NOT NULL default ''
-);
-
-CREATE INDEX /*i*/qcc_type ON /*_*/querycachetwo (qcc_type,qcc_value);
-CREATE INDEX /*i*/qcc_title ON /*_*/querycachetwo (qcc_type,qcc_namespace,qcc_title);
-CREATE INDEX /*i*/qcc_titletwo ON /*_*/querycachetwo (qcc_type,qcc_namespacetwo,qcc_titletwo);
-
-
--- Used for storing page restrictions (i.e. protection levels)
-CREATE TABLE /*_*/page_restrictions (
-  -- Field for an ID for this restrictions row (sort-key for Special:ProtectedPages)
-  pr_id int NOT NULL PRIMARY KEY IDENTITY,
-  -- Page to apply restrictions to (Foreign Key to page).
-  pr_page int NOT NULL REFERENCES /*_*/page(page_id) ON DELETE CASCADE,
-  -- The protection type (edit, move, etc)
-  pr_type nvarchar(60) NOT NULL,
-  -- The protection level (Sysop, autoconfirmed, etc)
-  pr_level nvarchar(60) NOT NULL,
-  -- Whether or not to cascade the protection down to pages transcluded.
-  pr_cascade bit NOT NULL,
-  -- Field for future support of per-user restriction.
-  pr_user int NULL,
-  -- Field for time-limited protection.
-  pr_expiry varchar(14) NULL
-);
-
-CREATE UNIQUE INDEX /*i*/pr_pagetype ON /*_*/page_restrictions (pr_page,pr_type);
-CREATE INDEX /*i*/pr_typelevel ON /*_*/page_restrictions (pr_type,pr_level);
-CREATE INDEX /*i*/pr_level ON /*_*/page_restrictions (pr_level);
-CREATE INDEX /*i*/pr_cascade ON /*_*/page_restrictions (pr_cascade);
-
-
--- Protected titles - nonexistent pages that have been protected
-CREATE TABLE /*_*/protected_titles (
-  pt_namespace int NOT NULL,
-  pt_title nvarchar(255) NOT NULL,
-  pt_user int REFERENCES /*_*/mwuser(user_id) ON DELETE SET NULL,
-  pt_reason_id bigint NOT NULL CONSTRAINT FK_pt_reason_id FOREIGN KEY REFERENCES /*_*/comment(comment_id),
-  pt_timestamp varchar(14) NOT NULL,
-  pt_expiry varchar(14) NOT NULL,
-  pt_create_perm nvarchar(60) NOT NULL,
-  CONSTRAINT PK_protected_titles PRIMARY KEY(pt_namespace,pt_title)
-);
-
-CREATE INDEX /*i*/pt_timestamp ON /*_*/protected_titles (pt_timestamp);
-
-
--- Name/value pairs indexed by page_id
-CREATE TABLE /*_*/page_props (
-  pp_page int NOT NULL REFERENCES /*_*/page(page_id) ON DELETE CASCADE,
-  pp_propname nvarchar(60) NOT NULL,
-  pp_value nvarchar(max) NOT NULL,
-  pp_sortkey float DEFAULT NULL,
-  CONSTRAINT PK_page_props PRIMARY KEY(pp_page,pp_propname)
-);
-
-CREATE UNIQUE INDEX /*i*/pp_propname_page ON /*_*/page_props (pp_propname,pp_page);
-CREATE UNIQUE INDEX /*i*/pp_propname_sortkey_page ON /*_*/page_props (pp_propname,pp_sortkey,pp_page);
-
-
--- A table to log updates, one text key row per update.
-CREATE TABLE /*_*/updatelog (
-  ul_key nvarchar(255) NOT NULL PRIMARY KEY,
-  ul_value nvarchar(max)
-);
-
-
--- A table to track tags for revisions, logs and recent changes.
-CREATE TABLE /*_*/change_tag (
-  ct_id int NOT NULL PRIMARY KEY IDENTITY,
-  -- RCID for the change
-  ct_rc_id int NULL REFERENCES /*_*/recentchanges(rc_id),
-  -- LOGID for the change
-  ct_log_id int NULL REFERENCES /*_*/logging(log_id),
-  -- REVID for the change
-  ct_rev_id int NULL REFERENCES /*_*/revision(rev_id),
-  -- Parameters for the tag, presently unused
-  ct_params nvarchar(max) NULL,
-  -- Foreign key to change_tag_def row
-  ct_tag_id int NOT NULL CONSTRAINT ctd_tag_id__fk FOREIGN KEY REFERENCES /*_*/change_tag_def(ctd_id)
-);
-
-CREATE UNIQUE INDEX /*i*/change_tag_rc_tag_id ON /*_*/change_tag (ct_rc_id,ct_tag_id);
-CREATE UNIQUE INDEX /*i*/change_tag_log_tag_id ON /*_*/change_tag (ct_log_id,ct_tag_id);
-CREATE UNIQUE INDEX /*i*/change_tag_rev_tag_id ON /*_*/change_tag (ct_rev_id,ct_tag_id);
-
--- Covering index, so we can pull all the info only out of the index.
-CREATE INDEX /*i*/change_tag_tag_id_id ON /*_*/change_tag (ct_tag_id,ct_rc_id,ct_rev_id,ct_log_id);
-
--- Table for storing localisation data
-CREATE TABLE /*_*/l10n_cache (
-  -- Language code
-  lc_lang nvarchar(32) NOT NULL,
-  -- Cache key
-  lc_key nvarchar(255) NOT NULL,
-  -- Value
-  lc_value varbinary(max) NOT NULL
-);
-CREATE INDEX /*i*/lc_lang_key ON /*_*/l10n_cache (lc_lang, lc_key);
-
--- Table caching which local files a module depends on that aren't
--- registered directly, used for fast retrieval of file dependency.
--- Currently only used for tracking images that CSS depends on
-CREATE TABLE /*_*/module_deps (
-  -- Module name
-  md_module nvarchar(255) NOT NULL,
-  -- Skin name
-  md_skin nvarchar(32) NOT NULL,
-  -- JSON nvarchar(max) with file dependencies
-  md_deps nvarchar(max) NOT NULL
-);
-CREATE UNIQUE INDEX /*i*/md_module_skin ON /*_*/module_deps (md_module, md_skin);
-
--- Holds all the sites known to the wiki.
-CREATE TABLE /*_*/sites (
-  -- Numeric id of the site
-  site_id                    int        NOT NULL PRIMARY KEY IDENTITY,
-
-  -- Global identifier for the site, ie 'enwiktionary'
-  site_global_key            nvarchar(32)       NOT NULL,
-
-  -- Type of the site, ie 'mediawiki'
-  site_type                  nvarchar(32)       NOT NULL,
-
-  -- Group of the site, ie 'wikipedia'
-  site_group                 nvarchar(32)       NOT NULL,
-
-  -- Source of the site data, ie 'local', 'wikidata', 'my-magical-repo'
-  site_source                nvarchar(32)       NOT NULL,
-
-  -- Language code of the sites primary language.
-  site_language              nvarchar(32)       NOT NULL,
-
-  -- Protocol of the site, ie 'http://', 'irc://', '//'
-  -- This field is an index for lookups and is build from type specific data in site_data.
-  site_protocol              nvarchar(32)       NOT NULL,
-
-  -- Domain of the site in reverse order, ie 'org.mediawiki.www.'
-  -- This field is an index for lookups and is build from type specific data in site_data.
-  site_domain                NVARCHAR(255)        NOT NULL,
-
-  -- Type dependent site data.
-  site_data                  nvarchar(max)                NOT NULL,
-
-  -- If site.tld/path/key:pageTitle should forward users to  the page on
-  -- the actual site, where "key" is the local identifier.
-  site_forward              bit                NOT NULL,
-
-  -- Type dependent site config.
-  -- For instance if template transclusion should be allowed if it's a MediaWiki.
-  site_config               nvarchar(max)                NOT NULL
-);
-
-CREATE UNIQUE INDEX /*i*/sites_global_key ON /*_*/sites (site_global_key);
-CREATE INDEX /*i*/sites_type ON /*_*/sites (site_type);
-CREATE INDEX /*i*/sites_group ON /*_*/sites (site_group);
-CREATE INDEX /*i*/sites_source ON /*_*/sites (site_source);
-CREATE INDEX /*i*/sites_language ON /*_*/sites (site_language);
-CREATE INDEX /*i*/sites_protocol ON /*_*/sites (site_protocol);
-CREATE INDEX /*i*/sites_domain ON /*_*/sites (site_domain);
-CREATE INDEX /*i*/sites_forward ON /*_*/sites (site_forward);
-
--- Links local site identifiers to their corresponding site.
-CREATE TABLE /*_*/site_identifiers (
-  -- Key on site.site_id
-  si_site                    int        NOT NULL REFERENCES /*_*/sites(site_id) ON DELETE CASCADE,
-
-  -- local key type, ie 'interwiki' or 'langlink'
-  si_type                    nvarchar(32)       NOT NULL,
-
-  -- local key value, ie 'en' or 'wiktionary'
-  si_key                     nvarchar(32)       NOT NULL,
-
-  CONSTRAINT PK_site_identifiers PRIMARY KEY(si_type, si_key)
-);
-
-CREATE INDEX /*i*/site_ids_site ON /*_*/site_identifiers (si_site);
-CREATE INDEX /*i*/site_ids_key ON /*_*/site_identifiers (si_key);
diff --git a/maintenance/mssql/update-keys.sql b/maintenance/mssql/update-keys.sql
deleted file mode 100644 (file)
index 4d2c1c1..0000000
+++ /dev/null
@@ -1,31 +0,0 @@
--- Update keys for Microsoft SQL Server
--- SQL to insert update keys into the initial tables after a
--- fresh installation of MediaWiki's database.
--- This is read and executed by the install script; you should
--- not have to run it by itself unless doing a manual install.
--- Insert keys here if either the unnecessary would cause heavy
--- processing or could potentially cause trouble by lowering field
--- sizes, adding constraints, etc.
--- When adjusting field sizes, it is recommended removing old
--- patches but to play safe, update keys should also inserted here.
-
---
--- The /*_*/ comments in this and other files are
--- replaced with the defined table prefix by the installer
--- and updater scripts. If you are installing or running
--- updates manually, you will need to manually insert the
--- table prefix if any when running these scripts.
---
-
-INSERT INTO /*_*/updatelog
-       SELECT 'filearchive-fa_major_mime-patch-fa_major_mime-chemical.sql' AS ul_key, null as ul_value
-       UNION SELECT 'image-img_major_mime-patch-img_major_mime-chemical.sql', null
-       UNION SELECT 'oldimage-oi_major_mime-patch-oi_major_mime-chemical.sql', null
-       UNION SELECT 'cl_type-category_types-ck', null
-       UNION SELECT 'fa_major_mime-major_mime-ck', null
-       UNION SELECT 'fa_media_type-media_type-ck', null
-       UNION SELECT 'img_major_mime-major_mime-ck', null
-       UNION SELECT 'img_media_type-media_type-ck', null
-       UNION SELECT 'oi_major_mime-major_mime-ck', null
-       UNION SELECT 'oi_media_type-media_type-ck', null
-       UNION SELECT 'us_media_type-media_type-ck', null;
\ No newline at end of file
diff --git a/maintenance/oracle/alterSharedConstraints.php b/maintenance/oracle/alterSharedConstraints.php
deleted file mode 100644 (file)
index 7f997cb..0000000
+++ /dev/null
@@ -1,97 +0,0 @@
-<?php
-/**
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- * @ingroup Maintenance
- */
-
-use Wikimedia\Rdbms\DBQueryError;
-
-/**
- * When using shared tables that are referenced by foreign keys on local
- * tables you have to change the constraints on local tables.
- *
- * The shared tables have to have GRANT REFERENCE on shared tables to local schema
- * i.e.: GRANT REFERENCES (user_id) ON mwuser TO hubclient;
- */
-
-require_once __DIR__ . '/../Maintenance.php';
-
-class AlterSharedConstraints extends Maintenance {
-       public function __construct() {
-               parent::__construct();
-               $this->addDescription( 'Alter foreign key to reference master tables in shared database setup.' );
-       }
-
-       public function getDbType() {
-               return Maintenance::DB_ADMIN;
-       }
-
-       public function execute() {
-               global $wgSharedDB, $wgSharedTables, $wgSharedPrefix, $wgDBprefix;
-
-               if ( $wgSharedDB == null ) {
-                       $this->output( "Database sharing is not enabled\n" );
-
-                       return;
-               }
-
-               $dbw = $this->getDB( DB_MASTER );
-               foreach ( $wgSharedTables as $table ) {
-                       $stable = $dbw->tableNameInternal( $table );
-                       if ( $wgSharedPrefix != null ) {
-                               $ltable = preg_replace( "/^$wgSharedPrefix(.*)/i", "$wgDBprefix\\1", $stable );
-                       } else {
-                               $ltable = "{$wgDBprefix}{$stable}";
-                       }
-
-                       $result = $dbw->query( "SELECT uc.constraint_name, uc.table_name, ucc.column_name,
-                                               uccpk.table_name pk_table_name, uccpk.column_name pk_column_name,
-                                               uc.delete_rule, uc.deferrable, uc.deferred
-                                       FROM user_constraints uc, user_cons_columns ucc, user_cons_columns uccpk
-                                       WHERE uc.constraint_type = 'R'
-                                               AND ucc.constraint_name = uc.constraint_name
-                                               AND uccpk.constraint_name = uc.r_constraint_name
-                                               AND uccpk.table_name = '$ltable'" );
-
-                       while ( ( $row = $result->fetchRow() ) !== false ) {
-                               $this->output( "Altering {$row['constraint_name']} ..." );
-
-                               try {
-                                       $dbw->query( "ALTER TABLE {$row['table_name']}
-                                                       DROP CONSTRAINT {$wgDBprefix}{$row['constraint_name']}" );
-                               } catch ( DBQueryError $exdb ) {
-                                       if ( $exdb->errno != 2443 ) {
-                                               throw $exdb;
-                                       }
-                               }
-
-                               $deleteRule = $row['delete_rule'] == 'NO ACTION' ? '' : "ON DELETE {$row['delete_rule']}";
-                               $dbw->query( "ALTER TABLE {$row['table_name']}
-                                               ADD CONSTRAINT {$wgDBprefix}{$row['constraint_name']}
-                                               FOREIGN KEY ({$row['column_name']})
-                                               REFERENCES {$wgSharedDB}.$stable({$row['pk_column_name']})
-                                               {$deleteRule} {$row['deferrable']} INITIALLY {$row['deferred']}" );
-
-                               $this->output( "DONE\n" );
-                       }
-               }
-       }
-}
-
-$maintClass = AlterSharedConstraints::class;
-require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/oracle/archives/patch-actor-table.sql b/maintenance/oracle/archives/patch-actor-table.sql
deleted file mode 100644 (file)
index 8a33888..0000000
+++ /dev/null
@@ -1,64 +0,0 @@
---
--- patch-actor-table.sql
---
--- T167246. Add an `actor` table and various columns (and temporary tables) to reference it.
-
-define mw_prefix='{$wgDBprefix}';
-
-CREATE SEQUENCE actor_actor_id_seq;
-CREATE TABLE &mw_prefix.actor (
-  actor_id NUMBER NOT NULL,
-  actor_user NUMBER,
-  actor_name VARCHAR2(255) NOT NULL
-);
-
-ALTER TABLE &mw_prefix.actor ADD CONSTRAINT &mw_prefix.actor_pk PRIMARY KEY (actor_id);
-
-/*$mw$*/
-CREATE TRIGGER &mw_prefix.actor_seq_trg BEFORE INSERT ON &mw_prefix.actor
-       FOR EACH ROW WHEN (new.actor_id IS NULL)
-BEGIN
-       &mw_prefix.lastval_pkg.setLastval(actor_actor_id_seq.nextval, :new.actor_id);
-END;
-/*$mw$*/
-
--- Create a dummy actor to satisfy fk contraints
-INSERT INTO &mw_prefix.actor (actor_id, actor_name) VALUES (0,'##Anonymous##');
-
-CREATE TABLE &mw_prefix.revision_actor_temp (
-  revactor_rev NUMBER NOT NULL,
-  revactor_actor NUMBER NOT NULL,
-  revactor_timestamp TIMESTAMP(6) WITH TIME ZONE NOT NULL,
-  revactor_page NUMBER NOT NULL
-);
-ALTER TABLE &mw_prefix.revision_actor_temp ADD CONSTRAINT &mw_prefix.revision_actor_temp_pk PRIMARY KEY (revactor_rev, revactor_actor);
-CREATE UNIQUE INDEX &mw_prefix.revactor_rev ON &mw_prefix.revision_actor_temp (revactor_rev);
-CREATE INDEX &mw_prefix.actor_timestamp ON &mw_prefix.revision_actor_temp (revactor_actor,revactor_timestamp);
-CREATE INDEX &mw_prefix.page_actor_timestamp ON &mw_prefix.revision_actor_temp (revactor_page,revactor_actor,revactor_timestamp);
-
-ALTER TABLE &mw_prefix.archive MODIFY ( ar_user_text NULL );
-ALTER TABLE &mw_prefix.archive ADD ( ar_actor NUMBER DEFAULT 0 NOT NULL );
-CREATE INDEX &mw_prefix.ar_actor_timestamp ON &mw_prefix.archive (ar_actor,ar_timestamp);
-
-ALTER TABLE &mw_prefix.ipblocks ADD ( ipb_by_actor NUMBER DEFAULT 0 NOT NULL );
-
-ALTER TABLE &mw_prefix.image MODIFY ( img_user_text NULL );
-ALTER TABLE &mw_prefix.image ADD ( img_actor NUMBER DEFAULT 0 NOT NULL );
-CREATE INDEX &mw_prefix.img_actor_timestamp ON &mw_prefix.image (img_actor, img_timestamp);
-
-ALTER TABLE &mw_prefix.oldimage MODIFY ( oi_user_text NULL );
-ALTER TABLE &mw_prefix.oldimage ADD ( oi_actor NUMBER DEFAULT 0 NOT NULL );
-CREATE INDEX &mw_prefix.oi_actor_timestamp ON &mw_prefix.oldimage (oi_actor,oi_timestamp);
-
-ALTER TABLE &mw_prefix.filearchive MODIFY ( fa_user_text NULL );
-ALTER TABLE &mw_prefix.filearchive ADD ( fa_actor NUMBER DEFAULT 0 NOT NULL );
-CREATE INDEX &mw_prefix.fa_actor_timestamp ON &mw_prefix.filearchive (fa_actor,fa_timestamp);
-
-ALTER TABLE &mw_prefix.recentchanges MODIFY ( rc_user_text NULL );
-ALTER TABLE &mw_prefix.recentchanges ADD ( rc_actor NUMBER DEFAULT 0 NOT NULL );
-CREATE INDEX &mw_prefix.rc_ns_actor ON &mw_prefix.recentchanges (rc_namespace, rc_actor);
-CREATE INDEX &mw_prefix.rc_actor ON &mw_prefix.recentchanges (rc_actor, rc_timestamp);
-
-ALTER TABLE &mw_prefix.logging ADD ( log_actor NUMBER DEFAULT 0 NOT NULL );
-CREATE INDEX &mw_prefix.actor_time ON &mw_prefix.logging (log_actor, log_timestamp);
-CREATE INDEX &mw_prefix.log_actor_type_time ON &mw_prefix.logging (log_actor, log_type, log_timestamp);
diff --git a/maintenance/oracle/archives/patch-add-rc_name_type_patrolled_timestamp_index.sql b/maintenance/oracle/archives/patch-add-rc_name_type_patrolled_timestamp_index.sql
deleted file mode 100644 (file)
index cd0d396..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-define mw_prefix='{$wgDBprefix}';
-
-CREATE INDEX &mw_prefix.recentchanges_i08 ON &mw_prefix.recentchanges (rc_namespace, rc_type, rc_patrolled, rc_timestamp);
-
diff --git a/maintenance/oracle/archives/patch-ar_rev_id-not-null.sql b/maintenance/oracle/archives/patch-ar_rev_id-not-null.sql
deleted file mode 100644 (file)
index 56f1598..0000000
+++ /dev/null
@@ -1,5 +0,0 @@
--- T182678: Make ar_rev_id not nullable
-
-define mw_prefix='{$wgDBprefix}';
-
-ALTER TABLE &mw_prefix.archive MODIFY ar_rev_id NUMBER NOT NULL;
diff --git a/maintenance/oracle/archives/patch-ar_sha1_field.sql b/maintenance/oracle/archives/patch-ar_sha1_field.sql
deleted file mode 100644 (file)
index de723ce..0000000
+++ /dev/null
@@ -1,3 +0,0 @@
-define mw_prefix='{$wgDBprefix}';
-
-ALTER TABLE &mw_prefix.archive ADD ar_sha1               VARCHAR2(32);
diff --git a/maintenance/oracle/archives/patch-archive-ar_content_format.sql b/maintenance/oracle/archives/patch-archive-ar_content_format.sql
deleted file mode 100644 (file)
index 0c0c0d9..0000000
+++ /dev/null
@@ -1,3 +0,0 @@
-define mw_prefix='{$wgDBprefix}';
-
-ALTER TABLE &mw_prefix.archive ADD ar_content_format VARCHAR2(64);
diff --git a/maintenance/oracle/archives/patch-archive-ar_content_model.sql b/maintenance/oracle/archives/patch-archive-ar_content_model.sql
deleted file mode 100644 (file)
index d18fc9e..0000000
+++ /dev/null
@@ -1,3 +0,0 @@
-define mw_prefix='{$wgDBprefix}';
-
-ALTER TABLE &mw_prefix.archive ADD ar_content_model VARCHAR2(32);
diff --git a/maintenance/oracle/archives/patch-archive-ar_id.sql b/maintenance/oracle/archives/patch-archive-ar_id.sql
deleted file mode 100644 (file)
index a43f760..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-define mw_prefix='{$wgDBprefix}';
-
-ALTER TABLE &mw_prefix.archive ADD (
-ar_id NUMBER NOT NULL,
-);
-ALTER TABLE &mw_prefix.archive ADD CONSTRAINT &mw_prefix.archive_pk PRIMARY KEY (ar_id);
diff --git a/maintenance/oracle/archives/patch-archive-ar_rev_id-unique.sql b/maintenance/oracle/archives/patch-archive-ar_rev_id-unique.sql
deleted file mode 100644 (file)
index c1cccc2..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
--- T193180: ar_rev_id should be unique
-
-define mw_prefix='{$wgDBprefix}';
-
-CREATE UNIQUE INDEX &mw_prefix.archive_i04 ON &mw_prefix.archive (ar_rev_id);
-DROP INDEX &mw_prefix.archive_i03;
diff --git a/maintenance/oracle/archives/patch-auto_increment_triggers.sql b/maintenance/oracle/archives/patch-auto_increment_triggers.sql
deleted file mode 100644 (file)
index 62a2f4f..0000000
+++ /dev/null
@@ -1,144 +0,0 @@
-define mw_prefix='{$wgDBprefix}';
-
--- Package to help with making Oracle more like other DBs with respect to
--- auto-incrementing columns.
-/*$mw$*/
-CREATE PACKAGE &mw_prefix.lastval_pkg IS
-  lastval NUMBER;
-  PROCEDURE setLastval(val IN NUMBER, field OUT NUMBER);
-  FUNCTION getLastval RETURN NUMBER;
-END;
-/*$mw$*/
-
-/*$mw$*/
-CREATE PACKAGE BODY &mw_prefix.lastval_pkg IS
-  PROCEDURE setLastval(val IN NUMBER, field OUT NUMBER) IS BEGIN
-    lastval := val;
-    field := val;
-  END;
-
-  FUNCTION getLastval RETURN NUMBER IS BEGIN
-    RETURN lastval;
-  END;
-END;
-/*$mw$*/
-
-/*$mw$*/
-CREATE TRIGGER &mw_prefix.mwuser_seq_trg BEFORE INSERT ON &mw_prefix.mwuser
-       FOR EACH ROW WHEN (new.user_id IS NULL)
-BEGIN
-       &mw_prefix.lastval_pkg.setLastval(user_user_id_seq.nextval, :new.user_id);
-END;
-/*$mw$*/
-
-/*$mw$*/
-CREATE TRIGGER &mw_prefix.page_seq_trg BEFORE INSERT ON &mw_prefix.page
-       FOR EACH ROW WHEN (new.page_id IS NULL)
-BEGIN
-       &mw_prefix.lastval_pkg.setLastval(page_page_id_seq.nextval, :new.page_id);
-END;
-/*$mw$*/
-
-/*$mw$*/
-CREATE TRIGGER &mw_prefix.revision_seq_trg BEFORE INSERT ON &mw_prefix.revision
-       FOR EACH ROW WHEN (new.rev_id IS NULL)
-BEGIN
-       &mw_prefix.lastval_pkg.setLastval(revision_rev_id_seq.nextval, :new.rev_id);
-END;
-/*$mw$*/
-
-/*$mw$*/
-CREATE TRIGGER &mw_prefix.pagecontent_seq_trg BEFORE INSERT ON &mw_prefix.pagecontent
-       FOR EACH ROW WHEN (new.old_id IS NULL)
-BEGIN
-       &mw_prefix.lastval_pkg.setLastval(text_old_id_seq.nextval, :new.old_id);
-END;
-/*$mw$*/
-
-/*$mw$*/
-CREATE TRIGGER &mw_prefix.archive_seq_trg BEFORE INSERT ON &mw_prefix.archive
-       FOR EACH ROW WHEN (new.ar_id IS NULL)
-BEGIN
-       &mw_prefix.lastval_pkg.setLastval(archive_ar_id_seq.nextval, :new.ar_id);
-END;
-/*$mw$*/
-
-/*$mw$*/
-CREATE TRIGGER &mw_prefix.category_seq_trg BEFORE INSERT ON &mw_prefix.category
-       FOR EACH ROW WHEN (new.cat_id IS NULL)
-BEGIN
-       &mw_prefix.lastval_pkg.setLastval(category_cat_id_seq.nextval, :new.cat_id);
-END;
-/*$mw$*/
-
-/*$mw$*/
-CREATE TRIGGER &mw_prefix.externallinks_seq_trg BEFORE INSERT ON &mw_prefix.externallinks
-       FOR EACH ROW WHEN (new.el_id IS NULL)
-BEGIN
-       &mw_prefix.lastval_pkg.setLastval(externallinks_el_id_seq.nextval, :new.el_id);
-END;
-/*$mw$*/
-
-/*$mw$*/
-CREATE TRIGGER &mw_prefix.ipblocks_seq_trg BEFORE INSERT ON &mw_prefix.ipblocks
-       FOR EACH ROW WHEN (new.ipb_id IS NULL)
-BEGIN
-       &mw_prefix.lastval_pkg.setLastval(ipblocks_ipb_id_seq.nextval, :new.ipb_id);
-END;
-/*$mw$*/
-
-/*$mw$*/
-CREATE TRIGGER &mw_prefix.filearchive_seq_trg BEFORE INSERT ON &mw_prefix.filearchive
-       FOR EACH ROW WHEN (new.fa_id IS NULL)
-BEGIN
-       &mw_prefix.lastval_pkg.setLastval(filearchive_fa_id_seq.nextval, :new.fa_id);
-END;
-/*$mw$*/
-
-/*$mw$*/
-CREATE TRIGGER &mw_prefix.uploadstash_seq_trg BEFORE INSERT ON &mw_prefix.uploadstash
-       FOR EACH ROW WHEN (new.us_id IS NULL)
-BEGIN
-       &mw_prefix.lastval_pkg.setLastval(uploadstash_us_id_seq.nextval, :new.us_id);
-END;
-/*$mw$*/
-
-/*$mw$*/
-CREATE TRIGGER &mw_prefix.recentchanges_seq_trg BEFORE INSERT ON &mw_prefix.recentchanges
-       FOR EACH ROW WHEN (new.rc_id IS NULL)
-BEGIN
-       &mw_prefix.lastval_pkg.setLastval(recentchanges_rc_id_seq.nextval, :new.rc_id);
-END;
-/*$mw$*/
-
-/*$mw$*/
-CREATE TRIGGER &mw_prefix.logging_seq_trg BEFORE INSERT ON &mw_prefix.logging
-       FOR EACH ROW WHEN (new.log_id IS NULL)
-BEGIN
-       &mw_prefix.lastval_pkg.setLastval(logging_log_id_seq.nextval, :new.log_id);
-END;
-/*$mw$*/
-
-/*$mw$*/
-CREATE TRIGGER &mw_prefix.job_seq_trg BEFORE INSERT ON &mw_prefix.job
-       FOR EACH ROW WHEN (new.job_id IS NULL)
-BEGIN
-       &mw_prefix.lastval_pkg.setLastval(job_job_id_seq.nextval, :new.job_id);
-END;
-/*$mw$*/
-
-/*$mw$*/
-CREATE TRIGGER &mw_prefix.page_restrictions_seq_trg BEFORE INSERT ON &mw_prefix.page_restrictions
-       FOR EACH ROW WHEN (new.pr_id IS NULL)
-BEGIN
-       &mw_prefix.lastval_pkg.setLastval(page_restrictions_pr_id_seq.nextval, :new.pr_id);
-END;
-/*$mw$*/
-
-/*$mw$*/
-CREATE TRIGGER &mw_prefix.sites_seq_trg BEFORE INSERT ON &mw_prefix.sites
-       FOR EACH ROW WHEN (new.site_id IS NULL)
-BEGIN
-       &mw_prefix.lastval_pkg.setLastval(sites_site_id_seq.nextval, :new.site_id);
-END;
-/*$mw$*/
diff --git a/maintenance/oracle/archives/patch-cat_hidden.sql b/maintenance/oracle/archives/patch-cat_hidden.sql
deleted file mode 100644 (file)
index d1649c7..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-define mw_prefix='{$wgDBprefix}';
-
-ALTER TABLE &mw_prefix.category DROP COLUMN cat_hidden;
-
diff --git a/maintenance/oracle/archives/patch-change_tag-change_tag_rc_tag_id.sql b/maintenance/oracle/archives/patch-change_tag-change_tag_rc_tag_id.sql
deleted file mode 100644 (file)
index 65d5b35..0000000
+++ /dev/null
@@ -1,18 +0,0 @@
--- T193874: Add new indexes to change_tag table using ct_tag_id instead of ct_tag
-
-define mw_prefix='{$wgDBprefix}';
-
-CREATE UNIQUE INDEX &mw_prefix.change_tag_u04 ON &mw_prefix.change_tag (ct_rc_id,ct_tag_id);
-CREATE UNIQUE INDEX &mw_prefix.change_tag_u05 ON &mw_prefix.change_tag (ct_log_id,ct_tag_id);
-CREATE UNIQUE INDEX &mw_prefix.change_tag_u06 ON &mw_prefix.change_tag (ct_rev_id,ct_tag_id);
-
-CREATE INDEX &mw_prefix.change_tag_i03 ON &mw_prefix.change_tag (ct_rc_id,ct_tag);
-CREATE INDEX &mw_prefix.change_tag_i04 ON &mw_prefix.change_tag (ct_log_id,ct_tag);
-CREATE INDEX &mw_prefix.change_tag_i05 ON &mw_prefix.change_tag (ct_rev_id,ct_tag);
-
-DROP INDEX &mw_prefix.change_tag_u01;
-DROP INDEX &mw_prefix.change_tag_u02;
-DROP INDEX &mw_prefix.change_tag_u03;
-
-ALTER TABLE &mw_prefix.change_tag
-       MODIFY ct_tag DEFAULT '///invalid///';
\ No newline at end of file
diff --git a/maintenance/oracle/archives/patch-change_tag-ct_id.sql b/maintenance/oracle/archives/patch-change_tag-ct_id.sql
deleted file mode 100644 (file)
index 6672872..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-define mw_prefix='{$wgDBprefix}';
-
-ALTER TABLE &mw_prefix.change_tag ADD (
-ct_id NUMBER NOT NULL,
-);
-ALTER TABLE &mw_prefix.change_tag ADD CONSTRAINT &mw_prefix.change_tag_pk PRIMARY KEY (ct_id);
diff --git a/maintenance/oracle/archives/patch-change_tag-tag_id.sql b/maintenance/oracle/archives/patch-change_tag-tag_id.sql
deleted file mode 100644 (file)
index 1f4067c..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
---
--- Add ctd_tag_id to change_tag table to normalize it
---
-ALTER TABLE &mw_prefix.change_tag ADD ( ct_tag_id NUMBER DEFAULT NULL );
-
-CREATE INDEX &mw_prefix.change_tag_i02 ON &mw_prefix.change_tag (ct_tag_id,ct_rc_id,ct_rev_id,ct_log_id);
diff --git a/maintenance/oracle/archives/patch-change_tag_def.sql b/maintenance/oracle/archives/patch-change_tag_def.sql
deleted file mode 100644 (file)
index 6bf7772..0000000
+++ /dev/null
@@ -1,25 +0,0 @@
--- Table defining tag names for IDs. Also stores hit counts to avoid expensive queries on change_tag
-CREATE SEQUENCE change_tag_def_ctd_id_seq;
-CREATE TABLE &mw_prefix.change_tag_def (
-    -- Numerical ID of the tag (ct_tag_id refers to this)
-    ctd_id NUMBER  NOT NULL,
-    -- Symbolic name of the tag (what would previously be put in ct_tag)
-    ctd_name VARCHAR2(255) NOT NULL,
-    -- Whether this tag was defined manually by a privileged user using Special:Tags
-    ctd_user_defined CHAR(1) DEFAULT '0' NOT NULL,
-    -- Number of times this tag was used
-    ctd_count NUMBER NOT NULL DEFAULT 0
-);
-
-ALTER TABLE &mw_prefix.change_tag_def ADD CONSTRAINT &mw_prefix.change_tag_def_pk PRIMARY KEY (ctd_id);
-CREATE UNIQUE INDEX &mw_prefix.ctd_name ON &mw_prefix.change_tag_def (ctd_name);
-CREATE INDEX &mw_prefix.ctd_count ON &mw_prefix.change_tag_def (ctd_count);
-CREATE INDEX &mw_prefix.ctd_user_defined ON &mw_prefix.change_tag_def (ctd_user_defined);
-
-/*$mw$*/
-CREATE TRIGGER &mw_prefix.change_tag_def_seq_trg BEFORE INSERT ON &mw_prefix.change_tag_def
-    FOR EACH ROW WHEN (new.ctd_id IS NULL)
-BEGIN
-    &mw_prefix.lastval_pkg.setLastval(change_tag_def_ctd_id_seq.nextval, :new.ctd_id);
-END;
-/*$mw$*/
\ No newline at end of file
diff --git a/maintenance/oracle/archives/patch-comment-table.sql b/maintenance/oracle/archives/patch-comment-table.sql
deleted file mode 100644 (file)
index cdab291..0000000
+++ /dev/null
@@ -1,68 +0,0 @@
---
--- patch-comment-table.sql
---
--- T166732. Add a `comment` table and various columns (and temporary tables) to reference it.
-
-CREATE SEQUENCE comment_comment_id_seq;
-CREATE TABLE &mw_prefix."COMMENT" (
-  comment_id NUMBER NOT NULL,
-  comment_hash NUMBER NOT NULL,
-  comment_text CLOB,
-  comment_data CLOB
-);
-CREATE INDEX &mw_prefix.comment_hash ON &mw_prefix."COMMENT" (comment_hash);
-/*$mw$*/
-CREATE TRIGGER &mw_prefix.comment_seq_trg BEFORE INSERT ON &mw_prefix."COMMENT"
-       FOR EACH ROW WHEN (new.comment_id IS NULL)
-BEGIN
-       &mw_prefix.lastval_pkg.setLastval(comment_comment_id_seq.nextval, :new.comment_id);
-END;
-/*$mw$*/
-
--- dummy row for FKs. Hash is intentionally wrong so CommentStore won't match it.
-INSERT INTO &mw_prefix."COMMENT" (comment_hash, comment_text) VALUES (-1, '** dummy **');
-
-
-CREATE TABLE &mw_prefix.revision_comment_temp (
-  revcomment_rev NUMBER NOT NULL,
-  revcomment_comment_id NUMBER NOT NULL
-);
-ALTER TABLE &mw_prefix.revision_comment_temp ADD CONSTRAINT &mw_prefix.revision_comment_temp_pk PRIMARY KEY (revcomment_rev, revcomment_comment_id);
-ALTER TABLE &mw_prefix.revision_comment_temp ADD CONSTRAINT &mw_prefix.revision_comment_temp_fk1 FOREIGN KEY (revcomment_rev) REFERENCES &mw_prefix.revision(rev_id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED;
-ALTER TABLE &mw_prefix.revision_comment_temp ADD CONSTRAINT &mw_prefix.revision_comment_temp_fk2 FOREIGN KEY (revcomment_comment_id) REFERENCES &mw_prefix."COMMENT"(comment_id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED;
-CREATE UNIQUE INDEX &mw_prefix.revcomment_rev ON &mw_prefix.revision_comment_temp (revcomment_rev);
-
-
-CREATE TABLE &mw_prefix.image_comment_temp (
-  imgcomment_name VARCHAR2(255) NOT NULL,
-  imgcomment_description_id NUMBER NOT NULL
-);
-ALTER TABLE &mw_prefix.image_comment_temp ADD CONSTRAINT &mw_prefix.image_comment_temp_pk PRIMARY KEY (imgcomment_name, imgcomment_description_id);
-ALTER TABLE &mw_prefix.image_comment_temp ADD CONSTRAINT &mw_prefix.image_comment_temp_fk1 FOREIGN KEY (imgcomment_name) REFERENCES &mw_prefix.image(img_name) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED;
-ALTER TABLE &mw_prefix.image_comment_temp ADD CONSTRAINT &mw_prefix.image_comment_temp_fk2 FOREIGN KEY (imgcomment_description_id) REFERENCES &mw_prefix."COMMENT"(comment_id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED;
-CREATE UNIQUE INDEX &mw_prefix.imgcomment_name ON &mw_prefix.image_comment_temp (imgcomment_name);
-
-
-ALTER TABLE &mw_prefix.archive ADD ( ar_comment_id NUMBER DEFAULT 0 NOT NULL );
-ALTER TABLE &mw_prefix.archive ADD CONSTRAINT &mw_prefix.archive_fk2 FOREIGN KEY (ar_comment_id) REFERENCES &mw_prefix."COMMENT"(comment_id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED;
-
-ALTER TABLE &mw_prefix.ipblocks MODIFY ( ipb_reason NULL );
-ALTER TABLE &mw_prefix.ipblocks ADD ( ipb_reason_id NUMBER DEFAULT 0 NOT NULL );
-ALTER TABLE &mw_prefix.ipblocks ADD CONSTRAINT &mw_prefix.ipblocks_fk3 FOREIGN KEY (ipb_reason_id) REFERENCES &mw_prefix."COMMENT"(comment_id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED;
-
-ALTER TABLE &mw_prefix.oldimage ADD ( oi_description_id NUMBER DEFAULT 0 NOT NULL );
-ALTER TABLE &mw_prefix.oldimage ADD CONSTRAINT &mw_prefix.oldimage_fk3 FOREIGN KEY (oi_description_id) REFERENCES &mw_prefix."COMMENT"(comment_id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED;
-
-ALTER TABLE &mw_prefix.filearchive ADD ( fa_deleted_reason_id NUMBER DEFAULT 0 NOT NULL );
-ALTER TABLE &mw_prefix.filearchive ADD ( fa_description_id NUMBER DEFAULT 0 NOT NULL );
-ALTER TABLE &mw_prefix.filearchive ADD CONSTRAINT &mw_prefix.filearchive_fk3 FOREIGN KEY (fa_deleted_reason_id) REFERENCES &mw_prefix."COMMENT"(comment_id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED;
-ALTER TABLE &mw_prefix.filearchive ADD CONSTRAINT &mw_prefix.filearchive_fk4 FOREIGN KEY (fa_description_id) REFERENCES &mw_prefix."COMMENT"(comment_id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED;
-
-ALTER TABLE &mw_prefix.recentchanges ADD ( rc_comment_id NUMBER DEFAULT 0 NOT NULL );
-ALTER TABLE &mw_prefix.recentchanges ADD CONSTRAINT &mw_prefix.recentchanges_fk3 FOREIGN KEY (rc_comment_id) REFERENCES &mw_prefix."COMMENT"(comment_id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED;
-
-ALTER TABLE &mw_prefix.logging ADD ( log_comment_id NUMBER DEFAULT 0 NOT NULL );
-ALTER TABLE &mw_prefix.logging ADD CONSTRAINT &mw_prefix.logging_fk2 FOREIGN KEY (log_comment_id) REFERENCES &mw_prefix."COMMENT"(comment_id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED;
-
-ALTER TABLE &mw_prefix.protected_titles ADD ( pt_reason_id NUMBER DEFAULT 0 NOT NULL );
-ALTER TABLE &mw_prefix.protected_titles ADD CONSTRAINT &mw_prefix.protected_titles_fk1 FOREIGN KEY (pt_reason_id) REFERENCES &mw_prefix."COMMENT"(comment_id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED;
diff --git a/maintenance/oracle/archives/patch-content.sql b/maintenance/oracle/archives/patch-content.sql
deleted file mode 100644 (file)
index 17d76ae..0000000
+++ /dev/null
@@ -1,18 +0,0 @@
-CREATE SEQUENCE content_content_id_seq;
-CREATE TABLE &mw_prefix.content (
-  content_id NUMBER NOT NULL,
-  content_size NUMBER NOT NULL,
-  content_sha1 VARCHAR2(32) NOT NULL,
-  content_model NUMBER NOT NULL,
-  content_address VARCHAR2(255) NOT NULL
-);
-
-ALTER TABLE &mw_prefix.content ADD CONSTRAINT &mw_prefix.content_pk PRIMARY KEY (content_id);
-
-/*$mw$*/
-CREATE TRIGGER &mw_prefix.content_seq_trg BEFORE INSERT ON &mw_prefix.content
-       FOR EACH ROW WHEN (new.content_id IS NULL)
-BEGIN
-       &mw_prefix.lastval_pkg.setLastval(content_content_id_seq.nextval, :new.content_id);
-END;
-/*$mw$*/
\ No newline at end of file
diff --git a/maintenance/oracle/archives/patch-content_models.sql b/maintenance/oracle/archives/patch-content_models.sql
deleted file mode 100644 (file)
index 49b9127..0000000
+++ /dev/null
@@ -1,18 +0,0 @@
-CREATE SEQUENCE content_models_model_id_seq;
-CREATE TABLE &mw_prefix.content_models (
-  model_id NUMBER NOT NULL,
-  model_name VARCHAR2(64) NOT NULL
-);
-
-
-ALTER TABLE &mw_prefix.content_models ADD CONSTRAINT &mw_prefix.content_models_pk PRIMARY KEY (model_id);
-
-CREATE UNIQUE INDEX &mw_prefix.model_name_u01 ON &mw_prefix.content_models (model_name);
-
-/*$mw$*/
-CREATE TRIGGER &mw_prefix.content_models_seq_trg BEFORE INSERT ON &mw_prefix.content_models
-       FOR EACH ROW WHEN (new.model_id IS NULL)
-BEGIN
-       &mw_prefix.lastval_pkg.setLastval(content_models_model_id_seq.nextval, :new.model_id);
-END;
-/*$mw$*/
\ No newline at end of file
diff --git a/maintenance/oracle/archives/patch-drop-ar_text.sql b/maintenance/oracle/archives/patch-drop-ar_text.sql
deleted file mode 100644 (file)
index 40b0478..0000000
+++ /dev/null
@@ -1,7 +0,0 @@
--- T33223: Remove obsolete ar_text and ar_flags columns
--- (and make ar_text_id not nullable and default 0)
-
-define mw_prefix='{$wgDBprefix}';
-
-ALTER TABLE &mw_prefix.archive DROP (ar_text, ar_flags);
-ALTER TABLE &mw_prefix.archive MODIFY ar_text_id NUMBER DEFAULT 0 NOT NULL;
diff --git a/maintenance/oracle/archives/patch-drop-comment-fields.sql b/maintenance/oracle/archives/patch-drop-comment-fields.sql
deleted file mode 100644 (file)
index ea3c641..0000000
+++ /dev/null
@@ -1,30 +0,0 @@
---
--- patch-drop-comment-fields.sql
---
--- T166732. Drop old xx_comment fields, and defaults from xx_comment_id fields.
-
-ALTER TABLE &mw_prefix.archive DROP COLUMN ar_comment;
-ALTER TABLE &mw_prefix.archive MODIFY ar_comment_id DEFAULT NULL;
-
-ALTER TABLE &mw_prefix.ipblocks DROP COLUMN ipb_reason;
-ALTER TABLE &mw_prefix.ipblocks MODIFY ipb_reason_id DEFAULT NULL;
-
-ALTER TABLE &mw_prefix.image DROP COLUMN img_description;
-ALTER TABLE &mw_prefix.image MODIFY img_description_id DEFAULT NULL;
-
-ALTER TABLE &mw_prefix.oldimage DROP COLUMN oi_description;
-ALTER TABLE &mw_prefix.oldimage MODIFY oi_description_id DEFAULT NULL;
-
-ALTER TABLE &mw_prefix.filearchive DROP COLUMN fa_deleted_reason;
-ALTER TABLE &mw_prefix.filearchive MODIFY fa_deleted_reason_id DEFAULT NULL,
-ALTER TABLE &mw_prefix.filearchive DROP COLUMN fa_description;
-ALTER TABLE &mw_prefix.filearchive MODIFY fa_description_id DEFAULT NULL;
-
-ALTER TABLE &mw_prefix.recentchanges DROP COLUMN rc_comment;
-ALTER TABLE &mw_prefix.recentchanges MODIFY rc_comment_id DEFAULT NULL;
-
-ALTER TABLE &mw_prefix.logging DROP COLUMN log_comment;
-ALTER TABLE &mw_prefix.logging MODIFY log_comment_id DEFAULT NULL;
-
-ALTER TABLE &mw_prefix.protected_titles DROP COLUMN pt_reason;
-ALTER TABLE &mw_prefix.protected_titles MODIFY pt_reason_id DEFAULT NULL;
diff --git a/maintenance/oracle/archives/patch-drop-ct_tag.sql b/maintenance/oracle/archives/patch-drop-ct_tag.sql
deleted file mode 100644 (file)
index 4c5d128..0000000
+++ /dev/null
@@ -1,9 +0,0 @@
--- T185355
-ALTER TABLE &mw_prefix.change_tag MODIFY &mw_prefix.ct_tag_id NUMBER NOT NULL;
-
-DROP INDEX &mw_prefix.change_tag_i03;
-DROP INDEX &mw_prefix.change_tag_i04;
-DROP INDEX &mw_prefix.change_tag_i05;
-DROP INDEX &mw_prefix.change_tag_i01;
-
-ALTER TABLE &mw_prefix.change_tag DROP COLUMN &mw_prefix.ct_tag;
diff --git a/maintenance/oracle/archives/patch-externallinks-el_id.sql b/maintenance/oracle/archives/patch-externallinks-el_id.sql
deleted file mode 100644 (file)
index a8c443f..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-define mw_prefix='{$wgDBprefix}';
-
-ALTER TABLE &mw_prefix.externallinks ADD el_id NUMBER NOT NULL;
-ALTER TABLE &mw_prefix.externallinks ADD CONSTRAINT &mw_prefix.externallinks_pk PRIMARY KEY (el_id);
\ No newline at end of file
diff --git a/maintenance/oracle/archives/patch-externallinks-el_index_60.sql b/maintenance/oracle/archives/patch-externallinks-el_index_60.sql
deleted file mode 100644 (file)
index 39680ef..0000000
+++ /dev/null
@@ -1,5 +0,0 @@
-define mw_prefix='{$wgDBprefix}';
-
-ALTER TABLE &mw_prefix.externallinks ADD el_index_60 VARCHAR2(60);
-CREATE INDEX &mw_prefix.externallinks_i04 ON &mw_prefix.externallinks (el_index_60, el_id);
-CREATE INDEX &mw_prefix.externallinks_i05 ON &mw_prefix.externallinks (el_from, el_index_60, el_id);
diff --git a/maintenance/oracle/archives/patch-fa_sha1.sql b/maintenance/oracle/archives/patch-fa_sha1.sql
deleted file mode 100644 (file)
index 70c9e60..0000000
+++ /dev/null
@@ -1,5 +0,0 @@
-define mw_prefix='{$wgDBprefix}';
-
-ALTER TABLE &mw_prefix.filearchive ADD fa_sha1 VARCHAR2(32);
-CREATE INDEX &mw_prefix.filearchive_i05 ON &mw_prefix.filearchive (fa_sha1);
-
diff --git a/maintenance/oracle/archives/patch-image-img_description_id.sql b/maintenance/oracle/archives/patch-image-img_description_id.sql
deleted file mode 100644 (file)
index 5995b24..0000000
+++ /dev/null
@@ -1,7 +0,0 @@
---
--- patch-image-img_description_id.sql
---
--- T188132. Add `img_description_id` to the `image` table.
-
-ALTER TABLE &mw_prefix.image ADD ( img_description_id NUMBER DEFAULT 0 NOT NULL );
-ALTER TABLE &mw_prefix.image ADD CONSTRAINT &mw_prefix.oldimage_fk2 FOREIGN KEY (img_description_id) REFERENCES &mw_prefix."COMMENT"(comment_id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED;
diff --git a/maintenance/oracle/archives/patch-ipb_sitewide.sql b/maintenance/oracle/archives/patch-ipb_sitewide.sql
deleted file mode 100644 (file)
index e9affb9..0000000
+++ /dev/null
@@ -1,3 +0,0 @@
--- Adding ipb_sitewide for blocks
-ALTER TABLE &mw_prefix.ipblocks
-  ADD ipb_sitewide CHAR(1) DEFAULT '1' NOT NULL;
diff --git a/maintenance/oracle/archives/patch-ipblocks_i05_index.sql b/maintenance/oracle/archives/patch-ipblocks_i05_index.sql
deleted file mode 100644 (file)
index 1427538..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-define mw_prefix='{$wgDBprefix}';
-
-CREATE INDEX &mw_prefix.ipblocks_i05 ON &mw_prefix.ipblocks (ipb_parent_block_id);
-
diff --git a/maintenance/oracle/archives/patch-ipblocks_restrictions-table.sql b/maintenance/oracle/archives/patch-ipblocks_restrictions-table.sql
deleted file mode 100644 (file)
index d44417c..0000000
+++ /dev/null
@@ -1,12 +0,0 @@
--- For partial block restrictions --
-
-CREATE TABLE &mw_prefix.ipblocks_restrictions (
-  ir_ipb_id NUMBER NOT NULL,
-  ir_type NUMBER NOT NULL,
-  ir_value NUMBER NOT NULL
-);
-
-ALTER TABLE &mw_prefix.ipblocks_restrictions ADD CONSTRAINT ipblocks_restrictions_pk PRIMARY KEY (ir_ipb_id, ir_type, ir_value);
-
--- Index to query restrictions by the page or namespace.
-CREATE INDEX &mw_prefix.ir_type_value ON &mw_prefix.ipblocks_restrictions (ir_type, ir_value);
diff --git a/maintenance/oracle/archives/patch-job_attempts.sql b/maintenance/oracle/archives/patch-job_attempts.sql
deleted file mode 100644 (file)
index b05c877..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-define mw_prefix='{$wgDBprefix}';
-
-ALTER TABLE &mw_prefix.job ADD   job_attempts NUMBER DEFAULT 0 NOT NULL;
-CREATE INDEX &mw_prefix.job_i05 ON &mw_prefix.job (job_attempts);
diff --git a/maintenance/oracle/archives/patch-job_timestamp_field.sql b/maintenance/oracle/archives/patch-job_timestamp_field.sql
deleted file mode 100644 (file)
index 4901c87..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-define mw_prefix='{$wgDBprefix}';
-
-ALTER TABLE &mw_prefix.job ADD job_timestamp            TIMESTAMP(6) WITH TIME ZONE NULL;
-
diff --git a/maintenance/oracle/archives/patch-job_timestamp_index.sql b/maintenance/oracle/archives/patch-job_timestamp_index.sql
deleted file mode 100644 (file)
index 6db4304..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-define mw_prefix='{$wgDBprefix}';
-
-CREATE INDEX &mw_prefix.job_i02 ON &mw_prefix.job (job_timestamp);
-
diff --git a/maintenance/oracle/archives/patch-job_token.sql b/maintenance/oracle/archives/patch-job_token.sql
deleted file mode 100644 (file)
index 1a730e9..0000000
+++ /dev/null
@@ -1,12 +0,0 @@
-define mw_prefix='{$wgDBprefix}';
-
-ALTER TABLE &mw_prefix.job ADD (
-       job_random NUMBER DEFAULT 0 NOT NULL,
-       job_token VARCHAR2(32),
-       job_token_timestamp TIMESTAMP(6) WITH TIME ZONE,
-       job_sha1 VARCHAR2(32)
-);
-
-CREATE INDEX &mw_prefix.job_i03 ON &mw_prefix.job (job_sha1);
-CREATE INDEX &mw_prefix.job_i04 ON &mw_prefix.job (job_cmd,job_token,job_random);
-
diff --git a/maintenance/oracle/archives/patch-logging_type_action_index.sql b/maintenance/oracle/archives/patch-logging_type_action_index.sql
deleted file mode 100644 (file)
index d30e0cf..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-define mw_prefix='{$wgDBprefix}';
-
-CREATE INDEX &mw_prefix.logging_i05 ON &mw_prefix.logging (log_type, log_action, log_timestamp);
-
diff --git a/maintenance/oracle/archives/patch-logging_user_text_time_index.sql b/maintenance/oracle/archives/patch-logging_user_text_time_index.sql
deleted file mode 100644 (file)
index e04abf5..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-define mw_prefix='{$wgDBprefix}';
-
-CREATE INDEX &mw_prefix.logging_i07 ON &mw_prefix.logging (log_user_text, log_timestamp);
-
diff --git a/maintenance/oracle/archives/patch-logging_user_text_type_time_index.sql b/maintenance/oracle/archives/patch-logging_user_text_type_time_index.sql
deleted file mode 100644 (file)
index c1c0d4f..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-define mw_prefix='{$wgDBprefix}';
-
-CREATE INDEX &mw_prefix.logging_i06 ON &mw_prefix.logging (log_user_text, log_type, log_timestamp);
-
diff --git a/maintenance/oracle/archives/patch-page-page_content_model.sql b/maintenance/oracle/archives/patch-page-page_content_model.sql
deleted file mode 100644 (file)
index e5839d9..0000000
+++ /dev/null
@@ -1,3 +0,0 @@
-define mw_prefix='{$wgDBprefix}';
-
-ALTER TABLE &mw_prefix.page ADD page_content_model VARCHAR2(32);
diff --git a/maintenance/oracle/archives/patch-page-page_lang.sql b/maintenance/oracle/archives/patch-page-page_lang.sql
deleted file mode 100644 (file)
index cae7cf9..0000000
+++ /dev/null
@@ -1,3 +0,0 @@
-define mw_prefix='{$wgDBprefix}';
-
-ALTER TABLE &mw_prefix.page ADD page_lang VARCHAR2(35);
diff --git a/maintenance/oracle/archives/patch-page_links_updated.sql b/maintenance/oracle/archives/patch-page_links_updated.sql
deleted file mode 100644 (file)
index 5360329..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-define mw_prefix='{$wgDBprefix}';
-
-ALTER TABLE &mw_prefix.page ADD page_links_updated TIMESTAMP(6) WITH TIME ZONE;
-
diff --git a/maintenance/oracle/archives/patch-page_redirect_namespace_len.sql b/maintenance/oracle/archives/patch-page_redirect_namespace_len.sql
deleted file mode 100644 (file)
index 1f8b9d9..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-define mw_prefix='{$wgDBprefix}';
-
-CREATE INDEX &mw_prefix.page_i03 ON &mw_prefix.page (page_is_redirect, page_namespace, page_len);
-
diff --git a/maintenance/oracle/archives/patch-page_restrictions_pkuk_fix.sql b/maintenance/oracle/archives/patch-page_restrictions_pkuk_fix.sql
deleted file mode 100644 (file)
index 56c392c..0000000
+++ /dev/null
@@ -1,7 +0,0 @@
-define mw_prefix='{$wgDBprefix}';
-
-ALTER TABLE &mw_prefix.page_restrictions DROP CONSTRAINT &mw_prefix.page_restrictions_pk;
-
-ALTER TABLE &mw_prefix.page_restrictions ADD CONSTRAINT &mw_prefix.page_restrictions_pk PRIMARY KEY (pr_id);
-
-CREATE UNIQUE INDEX &mw_prefix.page_restrictions_u01 ON &mw_prefix.page_restrictions (pr_page,pr_type);
diff --git a/maintenance/oracle/archives/patch-rc_moved.sql b/maintenance/oracle/archives/patch-rc_moved.sql
deleted file mode 100644 (file)
index 2a71315..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-define mw_prefix='{$wgDBprefix}';
-
-ALTER TABLE &mw_prefix.recentchanges DROP ( rc_moved_to_ns, rc_moved_to_title );
-
diff --git a/maintenance/oracle/archives/patch-rc_source.sql b/maintenance/oracle/archives/patch-rc_source.sql
deleted file mode 100644 (file)
index 0c80afa..0000000
+++ /dev/null
@@ -1,3 +0,0 @@
-define mw_prefix='{$wgDBprefix}';
-
-ALTER TABLE &mw_prefix.recentchanges ADD rc_source VARCHAR2(16);
diff --git a/maintenance/oracle/archives/patch-recentchanges-nttindex.sql b/maintenance/oracle/archives/patch-recentchanges-nttindex.sql
deleted file mode 100644 (file)
index e24082b..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-define mw_prefix='{$wgDBprefix}';
-
-DROP INDEX IF EXISTS &mw_prefix.recentchanges_i02;
-CREATE INDEX &mw_prefix.recentchanges_i09 ON &mw_prefix.recentchanges (rc_namespace, rc_title, rc_timestamp);
diff --git a/maintenance/oracle/archives/patch-rev_sha1_field.sql b/maintenance/oracle/archives/patch-rev_sha1_field.sql
deleted file mode 100644 (file)
index 80544e8..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-define mw_prefix='{$wgDBprefix}';
-
-ALTER TABLE &mw_prefix.revision ADD rev_sha1             VARCHAR2(32);
-
diff --git a/maintenance/oracle/archives/patch-revision-rev_content_format.sql b/maintenance/oracle/archives/patch-revision-rev_content_format.sql
deleted file mode 100644 (file)
index ebde71c..0000000
+++ /dev/null
@@ -1,3 +0,0 @@
-define mw_prefix='{$wgDBprefix}';
-
-ALTER TABLE &mw_prefix.revision ADD rev_content_format VARCHAR2(64);
diff --git a/maintenance/oracle/archives/patch-revision-rev_content_model.sql b/maintenance/oracle/archives/patch-revision-rev_content_model.sql
deleted file mode 100644 (file)
index dd22642..0000000
+++ /dev/null
@@ -1,3 +0,0 @@
-define mw_prefix='{$wgDBprefix}';
-
-ALTER TABLE &mw_prefix.revision ADD rev_content_model VARCHAR2(32);
diff --git a/maintenance/oracle/archives/patch-revision_i05_index.sql b/maintenance/oracle/archives/patch-revision_i05_index.sql
deleted file mode 100644 (file)
index 929c7b3..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-define mw_prefix='{$wgDBprefix}';
-
-CREATE INDEX &mw_prefix.revision_i05 ON &mw_prefix.revision (rev_page,rev_user,rev_timestamp);
-
diff --git a/maintenance/oracle/archives/patch-site_stats-modify.sql b/maintenance/oracle/archives/patch-site_stats-modify.sql
deleted file mode 100644 (file)
index 1c784d9..0000000
+++ /dev/null
@@ -1,7 +0,0 @@
-ALTER TABLE /*_*/site_stats
-       ALTER ss_total_edits SET DEFAULT NULL,
-       ALTER ss_good_articles SET DEFAULT NULL,
-       ALTER ss_total_pages SET DEFAULT NULL,
-       ALTER ss_users SET DEFAULT NULL,
-       ALTER ss_active_users SET DEFAULT NULL,
-       ALTER ss_images SET DEFAULT NULL;
diff --git a/maintenance/oracle/archives/patch-site_stats-pk.sql b/maintenance/oracle/archives/patch-site_stats-pk.sql
deleted file mode 100644 (file)
index a288c08..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-define mw_prefix='{$wgDBprefix}';
-
-ALTER TABLE &mw_prefix.site_stats DROP CONSTRAINT &mw_prefix.site_stats_u01;
-ALTER TABLE &mw_prefix.site_stats ADD CONSTRAINT &mw_prefix.site_stats_pk PRIMARY KEY(ss_row_id);
diff --git a/maintenance/oracle/archives/patch-sites.sql b/maintenance/oracle/archives/patch-sites.sql
deleted file mode 100644 (file)
index 868b210..0000000
+++ /dev/null
@@ -1,34 +0,0 @@
-define mw_prefix='{$wgDBprefix}';
-
-CREATE SEQUENCE sites_site_id_seq MINVALUE 0 START WITH 0;
-CREATE TABLE &mw_prefix.sites (
-  site_id NUMBER NOT NULL,
-  site_global_key VARCHAR2(32) NOT NULL,
-  site_type VARCHAR2(32) NOT NULL,
-  site_group VARCHAR2(32) NOT NULL,
-  site_source VARCHAR2(32) NOT NULL,
-  site_language VARCHAR2(32) NOT NULL,
-  site_protocol VARCHAR2(32) NOT NULL,
-  site_domain VARCHAR2(255) NOT NULL,
-  site_data BLOB NOT NULL,
-  site_forward NUMBER(1) NOT NULL,
-  site_config BLOB NOT NULL
-);
-ALTER TABLE &mw_prefix.sites ADD CONSTRAINT &mw_prefix.sites_pk PRIMARY KEY (site_id);
-CREATE UNIQUE INDEX &mw_prefix.sites_u01 ON &mw_prefix.sites (site_global_key);
-CREATE INDEX &mw_prefix.sites_i01 ON &mw_prefix.sites (site_type);
-CREATE INDEX &mw_prefix.sites_i02 ON &mw_prefix.sites (site_group);
-CREATE INDEX &mw_prefix.sites_i03 ON &mw_prefix.sites (site_source);
-CREATE INDEX &mw_prefix.sites_i04 ON &mw_prefix.sites (site_language);
-CREATE INDEX &mw_prefix.sites_i05 ON &mw_prefix.sites (site_protocol);
-CREATE INDEX &mw_prefix.sites_i06 ON &mw_prefix.sites (site_domain);
-CREATE INDEX &mw_prefix.sites_i07 ON &mw_prefix.sites (site_forward);
-
-CREATE TABLE &mw_prefix.site_identifiers (
-  si_site NUMBER NOT NULL,
-  si_type VARCHAR2(32) NOT NULL,
-  si_key VARCHAR2(32) NOT NULL
-);
-CREATE UNIQUE INDEX &mw_prefix.site_identifiers_u01 ON &mw_prefix.site_identifiers (si_type, si_key);
-CREATE INDEX &mw_prefix.site_identifiers_i01 ON &mw_prefix.site_identifiers (si_site);
-CREATE INDEX &mw_prefix.site_identifiers_i02 ON &mw_prefix.site_identifiers (si_key);
diff --git a/maintenance/oracle/archives/patch-slot-origin.sql b/maintenance/oracle/archives/patch-slot-origin.sql
deleted file mode 100644 (file)
index 1b398cd..0000000
+++ /dev/null
@@ -1,14 +0,0 @@
---
--- Replace slot_inherited with slot_origin.
---
--- NOTE: There is no release that has slot_inherited. This is only needed to transition between
--- snapshot versions of 1.30.
---
--- NOTE: No code that writes to the slots table was merge yet, the table is assumed to be empty.
---
-DROP INDEX &mw_prefix.slot_role_inherited;
-
-ALTER TABLE &mw_prefix.slots DROP COLUMN slot_inherited;
-ALTER TABLE &mw_prefix.slots ADD ( slot_origin NUMBER NOT NULL );
-
-CREATE INDEX &mw_prefix.slot_revision_origin_role ON &mw_prefix.slots (slot_revision_id, slot_origin, slot_role_id);
diff --git a/maintenance/oracle/archives/patch-slot_roles.sql b/maintenance/oracle/archives/patch-slot_roles.sql
deleted file mode 100644 (file)
index 960cfbf..0000000
+++ /dev/null
@@ -1,17 +0,0 @@
-CREATE SEQUENCE slot_roles_role_id_seq;
-CREATE TABLE &mw_prefix.slot_roles (
-  role_id NUMBER NOT NULL,
-  role_name VARCHAR2(64) NOT NULL
-);
-
-ALTER TABLE &mw_prefix.slot_roles ADD CONSTRAINT &mw_prefix.slot_roles_pk PRIMARY KEY (role_id);
-
-CREATE UNIQUE INDEX &mw_prefix.role_name_u01 ON &mw_prefix.slot_roles (role_name);
-
-/*$mw$*/
-CREATE TRIGGER &mw_prefix.slot_roles_seq_trg BEFORE INSERT ON &mw_prefix.slot_roles
-       FOR EACH ROW WHEN (new.role_id IS NULL)
-BEGIN
-       &mw_prefix.lastval_pkg.setLastval(slot_roles_role_id_seq.nextval, :new.role_id);
-END;
-/*$mw$*/
\ No newline at end of file
diff --git a/maintenance/oracle/archives/patch-slots.sql b/maintenance/oracle/archives/patch-slots.sql
deleted file mode 100644 (file)
index fde35d5..0000000
+++ /dev/null
@@ -1,10 +0,0 @@
-CREATE TABLE &mw_prefix.slots (
-  slot_revision_id NUMBER NOT NULL,
-  slot_role_id NUMBER NOT NULL,
-  slot_content_id NUMBER NOT NULL,
-  slot_origin NUMBER NOT NULL
-);
-
-ALTER TABLE &mw_prefix.slots ADD CONSTRAINT &mw_prefix.slots_pk PRIMARY KEY (slot_revision_id, slot_role_id);
-
-CREATE INDEX &mw_prefix.slot_revision_origin_role ON &mw_prefix.slots (slot_revision_id, slot_origin, slot_role_id);
diff --git a/maintenance/oracle/archives/patch-ss_admins.sql b/maintenance/oracle/archives/patch-ss_admins.sql
deleted file mode 100644 (file)
index c2e9242..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-define mw_prefix='{$wgDBprefix}';
-
-ALTER TABLE &mw_prefix.site_stats DROP COLUMN ss_admins;
-
diff --git a/maintenance/oracle/archives/patch-testrun.sql b/maintenance/oracle/archives/patch-testrun.sql
deleted file mode 100644 (file)
index 84facab..0000000
+++ /dev/null
@@ -1,37 +0,0 @@
---
--- Optional tables for parserTests recording mode
--- With --record option, success data will be saved to these tables,
--- and comparisons of what's changed from the previous run will be
--- displayed at the end of each run.
---
--- defines must comply with ^define\s*([^\s=]*)\s*=\s?'\{\$([^\}]*)\}';
-define mw_prefix='{$wgDBprefix}';
-
-DROP TABLE &mw_prefix.testitem CASCADE CONSTRAINTS;
-DROP TABLE &mw_prefix.testrun CASCADE CONSTRAINTS;
-
-CREATE SEQUENCE testrun_tr_id_seq;
-CREATE TABLE &mw_prefix.testrun (
-  tr_id NUMBER NOT NULL,
-  tr_date DATE,
-  tr_mw_version BLOB,
-  tr_php_version BLOB,
-  tr_db_version BLOB,
-  tr_uname BLOB,
-);
-ALTER TABLE &mw_prefix.testrun ADD CONSTRAINT &mw_prefix.testrun_pk PRIMARY KEY (tr_id);
-CREATE OR REPLACE TRIGGER &mw_prefix.testrun_bir
-BEFORE UPDATE FOR EACH ROW
-ON &mw_prefix.testrun
-BEGIN
-  SELECT testrun_tr_id_seq.NEXTVAL into :NEW.tr_id FROM dual;
-END;
-
-CREATE TABLE /*$wgDBprefix*/testitem (
-  ti_run NUMBER NOT NULL REFERENCES &mw_prefix.testrun (tr_id) ON DELETE CASCADE,
-  ti_name VARCHAR22(255),
-  ti_success NUMBER(1)
-);
-CREATE UNIQUE INDEX &mw_prefix.testitem_u01 ON &mw_prefix.testitem (ti_run, ti_name);
-CREATE UNIQUE INDEX &mw_prefix.testitem_u01 ON &mw_prefix.testitem (ti_run, ti_success);
-
diff --git a/maintenance/oracle/archives/patch-ufg_group-length-increase-255.sql b/maintenance/oracle/archives/patch-ufg_group-length-increase-255.sql
deleted file mode 100644 (file)
index 6a4a751..0000000
+++ /dev/null
@@ -1,9 +0,0 @@
-define mw_prefix='{$wgDBprefix}';
-
-/*$mw$*/
-BEGIN
-       EXECUTE IMMEDIATE 'ALTER TABLE &mw_prefix.user_former_groups MODIFY ufg_group VARCHAR2(255) NOT NULL';
-EXCEPTION WHEN OTHERS THEN
-       IF (SQLCODE = -01442) THEN NULL; ELSE RAISE; END IF;
-END;
-/*$mw$*/
diff --git a/maintenance/oracle/archives/patch-ug_group-length-increase-255.sql b/maintenance/oracle/archives/patch-ug_group-length-increase-255.sql
deleted file mode 100644 (file)
index 00a5e7b..0000000
+++ /dev/null
@@ -1,9 +0,0 @@
-define mw_prefix='{$wgDBprefix}';
-
-/*$mw$*/
-BEGIN
-       EXECUTE IMMEDIATE 'ALTER TABLE &mw_prefix.user_groups MODIFY ug_group VARCHAR2(255) NOT NULL';
-EXCEPTION WHEN OTHERS THEN
-       IF (SQLCODE = -01442) THEN NULL; ELSE RAISE; END IF;
-END;
-/*$mw$*/
diff --git a/maintenance/oracle/archives/patch-up_property.sql b/maintenance/oracle/archives/patch-up_property.sql
deleted file mode 100644 (file)
index c8e2dd9..0000000
+++ /dev/null
@@ -1,3 +0,0 @@
-define mw_prefix='{$wgDBprefix}';
-
-ALTER TABLE &mw_prefix.user_properties MODIFY up_property varchar2(255);
diff --git a/maintenance/oracle/archives/patch-uploadstash-us_props.sql b/maintenance/oracle/archives/patch-uploadstash-us_props.sql
deleted file mode 100644 (file)
index 8962dc7..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-define mw_prefix='{$wgDBprefix}';
-
-ALTER TABLE &mw_prefix.uploadstash ADD us_props BLOB;
-
diff --git a/maintenance/oracle/archives/patch-uploadstash.sql b/maintenance/oracle/archives/patch-uploadstash.sql
deleted file mode 100644 (file)
index 3e37cef..0000000
+++ /dev/null
@@ -1,25 +0,0 @@
-define mw_prefix='{$wgDBprefix}';
-
-CREATE SEQUENCE uploadstash_us_id_seq;
-CREATE TABLE &mw_prefix.uploadstash (
-       us_id                 NUMBER       NOT NULL,
-  us_user               NUMBER          DEFAULT 0 NOT NULL,
-       us_key                                                          VARCHAR2(255) NOT NULL,
-       us_orig_path                                    VARCHAR2(255) NOT NULL,
-       us_path                                                         VARCHAR2(255) NOT NULL,
-       us_source_type                          VARCHAR2(50),
-  us_timestamp          TIMESTAMP(6) WITH TIME ZONE,
-       us_status                                                       VARCHAR2(50) NOT NULL,
-       us_size                                                         NUMBER NOT NULL,
-       us_sha1                                                         VARCHAR2(32) NOT NULL,
-       us_mime                                                         VARCHAR2(255),
-  us_media_type         VARCHAR2(32) DEFAULT NULL,
-       us_image_width                          NUMBER,
-       us_image_height                         NUMBER,
-       us_image_bits                                   NUMBER
-);
-ALTER TABLE &mw_prefix.uploadstash ADD CONSTRAINT &mw_prefix.uploadstash_pk PRIMARY KEY (us_id);
-ALTER TABLE &mw_prefix.uploadstash ADD CONSTRAINT &mw_prefix.uploadstash_fk1 FOREIGN KEY (us_user) REFERENCES &mw_prefix.mwuser(user_id) ON DELETE SET NULL DEFERRABLE INITIALLY DEFERRED;
-CREATE INDEX &mw_prefix.uploadstash_i01 ON &mw_prefix.uploadstash (us_user);
-CREATE INDEX &mw_prefix.uploadstash_i02 ON &mw_prefix.uploadstash (us_timestamp);
-CREATE UNIQUE INDEX &mw_prefix.uploadstash_u01 ON &mw_prefix.uploadstash (us_key);
diff --git a/maintenance/oracle/archives/patch-us_chunk_inx_field.sql b/maintenance/oracle/archives/patch-us_chunk_inx_field.sql
deleted file mode 100644 (file)
index 43ee16e..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-define mw_prefix='{$wgDBprefix}';
-
-ALTER TABLE &mw_prefix.uploadstash ADD us_chunk_inx              NUMBER;
-
diff --git a/maintenance/oracle/archives/patch-user_email_index.sql b/maintenance/oracle/archives/patch-user_email_index.sql
deleted file mode 100644 (file)
index e34d865..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-define mw_prefix='{$wgDBprefix}';
-
-CREATE INDEX &mw_prefix.mwuser_i02 ON &mw_prefix.mwuser (user_email);
-
diff --git a/maintenance/oracle/archives/patch-user_former_groups.sql b/maintenance/oracle/archives/patch-user_former_groups.sql
deleted file mode 100644 (file)
index c14824e..0000000
+++ /dev/null
@@ -1,9 +0,0 @@
-define mw_prefix='{$wgDBprefix}';
-
-CREATE TABLE &mw_prefix.user_former_groups (
-  ufg_user   NUMBER      DEFAULT 0 NOT NULL,
-  ufg_group  VARCHAR2(255)     NOT NULL
-);
-ALTER TABLE &mw_prefix.user_former_groups ADD CONSTRAINT &mw_prefix.user_former_groups_fk1 FOREIGN KEY (ufg_user) REFERENCES &mw_prefix.mwuser(user_id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED;
-CREATE UNIQUE INDEX &mw_prefix.user_former_groups_u01 ON &mw_prefix.user_former_groups (ufg_user,ufg_group);
-
diff --git a/maintenance/oracle/archives/patch-user_groups-ug_expiry.sql b/maintenance/oracle/archives/patch-user_groups-ug_expiry.sql
deleted file mode 100644 (file)
index d5376a3..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-define mw_prefix='{$wgDBprefix}';
-
-ALTER TABLE &mw_prefix.user_groups ADD (
-ug_expiry TIMESTAMP(6) WITH TIME ZONE  NULL
-);
-DROP INDEX IF EXISTS &mw_prefix.user_groups_u01;
-ALTER TABLE &mw_prefix.user_groups ADD CONSTRAINT &mw_prefix.user_groups_pk PRIMARY KEY (ug_user,ug_group);
-CREATE INDEX &mw_prefix.user_groups_i02 ON &mw_prefix.user_groups (ug_expiry);
diff --git a/maintenance/oracle/archives/patch-user_password_expire.sql b/maintenance/oracle/archives/patch-user_password_expire.sql
deleted file mode 100644 (file)
index 824cc82..0000000
+++ /dev/null
@@ -1,3 +0,0 @@
-define mw_prefix='{$wgDBprefix}';
-
-ALTER TABLE &mw_prefix.mwuser ADD user_password_expires TIMESTAMP(6) WITH TIME ZONE;
diff --git a/maintenance/oracle/archives/patch-watchlist-wl_id.sql b/maintenance/oracle/archives/patch-watchlist-wl_id.sql
deleted file mode 100644 (file)
index 4f7180d..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-define mw_prefix='{$wgDBprefix}';
-
-ALTER TABLE &mw_prefix.watchlist ADD (
-wl_id NUMBER NOT NULL,
-);
-ALTER TABLE &mw_prefix.watchlist ADD CONSTRAINT &mw_prefix.watchlist_pk PRIMARY KEY (wl_id);
diff --git a/maintenance/oracle/archives/patch_16_17_schema_changes.sql b/maintenance/oracle/archives/patch_16_17_schema_changes.sql
deleted file mode 100644 (file)
index dfaaf5c..0000000
+++ /dev/null
@@ -1,84 +0,0 @@
-define mw_prefix='{$wgDBprefix}';
-
-ALTER TABLE &mw_prefix.archive MODIFY ar_user DEFAULT 0 NOT NULL;
-ALTER TABLE &mw_prefix.archive MODIFY ar_deleted CHAR(1);
-CREATE INDEX &mw_prefix.archive_i03 ON &mw_prefix.archive (ar_rev_id);
-
-ALTER TABLE &mw_prefix.page MODIFY page_is_redirect default '0';
-ALTER TABLE &mw_prefix.page MODIFY page_is_new default '0';
-ALTER TABLE &mw_prefix.page MODIFY page_latest default 0;
-ALTER TABLE &mw_prefix.page MODIFY page_len default 0;
-
-ALTER TABLE &mw_prefix.categorylinks MODIFY cl_sortkey VARCHAR2(230);
-ALTER TABLE &mw_prefix.categorylinks ADD cl_sortkey_prefix VARCHAR2(255) DEFAULT '' NOT NULL;
-ALTER TABLE &mw_prefix.categorylinks ADD cl_collation VARCHAR2(32) DEFAULT '' NOT NULL;
-ALTER TABLE &mw_prefix.categorylinks ADD cl_type VARCHAR2(6) DEFAULT 'page' NOT NULL;
-DROP INDEX &mw_prefix.categorylinks_i01;
-CREATE INDEX &mw_prefix.categorylinks_i01 ON &mw_prefix.categorylinks (cl_to,cl_type,cl_sortkey,cl_from);
-CREATE INDEX &mw_prefix.categorylinks_i03 ON &mw_prefix.categorylinks (cl_collation);
-
-ALTER TABLE &mw_prefix.filearchive MODIFY fa_deleted_user DEFAULT 0 NOT NULL;
-ALTER TABLE &mw_prefix.filearchive MODIFY fa_size DEFAULT 0;
-ALTER TABLE &mw_prefix.filearchive MODIFY fa_width DEFAULT 0;
-ALTER TABLE &mw_prefix.filearchive MODIFY fa_height DEFAULT 0;
-ALTER TABLE &mw_prefix.filearchive MODIFY fa_bits DEFAULT 0 NOT NULL;
-ALTER TABLE &mw_prefix.filearchive MODIFY fa_user DEFAULT 0 NOT NULL;
-ALTER TABLE &mw_prefix.filearchive MODIFY fa_deleted DEFAULT 0;
-
-ALTER TABLE &mw_prefix.image MODIFY img_size DEFAULT 0;
-ALTER TABLE &mw_prefix.image MODIFY img_width DEFAULT 0;
-ALTER TABLE &mw_prefix.image MODIFY img_height DEFAULT 0;
-ALTER TABLE &mw_prefix.image MODIFY img_bits DEFAULT 0 NOT NULL;
-ALTER TABLE &mw_prefix.image MODIFY img_user DEFAULT 0 NOT NULL;
-
-ALTER TABLE &mw_prefix.interwiki ADD iw_api BLOB DEFAULT EMPTY_BLOB();
-ALTER TABLE &mw_prefix.interwiki MODIFY iw_api DEFAULT NULL NOT NULL;
-ALTER TABLE &mw_prefix.interwiki ADD iw_wikiid VARCHAR2(64);
-
-ALTER TABLE &mw_prefix.ipblocks MODIFY ipb_user DEFAULT 0 NOT NULL;
-ALTER TABLE &mw_prefix.ipblocks MODIFY ipb_by DEFAULT 0;
-
-CREATE TABLE &mw_prefix.iwlinks (
-  iwl_from NUMBER DEFAULT 0 NOT NULL,
-  iwl_prefix VARCHAR2(20) DEFAULT '' NOT NULL,
-  iwl_title VARCHAR2(255) DEFAULT '' NOT NULL
-);
-CREATE UNIQUE INDEX &mw_prefix.iwlinks_ui01 ON &mw_prefix.iwlinks (iwl_from, iwl_prefix, iwl_title);
-CREATE UNIQUE INDEX &mw_prefix.iwlinks_ui02 ON &mw_prefix.iwlinks (iwl_prefix, iwl_title, iwl_from);
-
-ALTER TABLE &mw_prefix.logging MODIFY log_user DEFAULT 0 NOT NULL;
-ALTER TABLE &mw_prefix.logging MODIFY log_deleted CHAR(1);
-
-CREATE TABLE &mw_prefix.module_deps (
-  md_module VARCHAR2(255) NOT NULL,
-  md_skin VARCHAR2(32) NOT NULL,
-  md_deps BLOB NOT NULL
-);
-CREATE UNIQUE INDEX &mw_prefix.module_deps_u01 ON &mw_prefix.module_deps (md_module, md_skin);
-
-ALTER TABLE &mw_prefix.oldimage MODIFY oi_name DEFAULT 0;
-ALTER TABLE &mw_prefix.oldimage MODIFY oi_size DEFAULT 0;
-ALTER TABLE &mw_prefix.oldimage MODIFY oi_width DEFAULT 0;
-ALTER TABLE &mw_prefix.oldimage MODIFY oi_height DEFAULT 0;
-ALTER TABLE &mw_prefix.oldimage MODIFY oi_bits DEFAULT 0;
-ALTER TABLE &mw_prefix.oldimage MODIFY oi_user DEFAULT 0 NOT NULL;
-
-ALTER TABLE &mw_prefix.querycache MODIFY qc_value DEFAULT 0;
-
-ALTER TABLE &mw_prefix.recentchanges MODIFY rc_user DEFAULT 0 NOT NULL;
-ALTER TABLE &mw_prefix.recentchanges MODIFY rc_cur_id DEFAULT 0 NOT NULL;
-ALTER TABLE &mw_prefix.recentchanges MODIFY rc_this_oldid DEFAULT 0;
-ALTER TABLE &mw_prefix.recentchanges MODIFY rc_last_oldid DEFAULT 0;
-ALTER TABLE &mw_prefix.recentchanges MODIFY rc_moved_to_ns DEFAULT 0 NOT NULL;
-ALTER TABLE &mw_prefix.recentchanges MODIFY rc_deleted CHAR(1);
-ALTER TABLE &mw_prefix.recentchanges MODIFY rc_logid DEFAULT 0;
-
-ALTER TABLE &mw_prefix.revision MODIFY rev_page NOT NULL;
-ALTER TABLE &mw_prefix.revision MODIFY rev_user DEFAULT 0;
-
-ALTER TABLE &mw_prefix.updatelog ADD ul_value BLOB;
-
-ALTER TABLE &mw_prefix.user_groups MODIFY ug_user DEFAULT 0 NOT NULL;
-
-ALTER TABLE &mw_prefix.user_newtalk MODIFY user_id DEFAULT 0;
-
diff --git a/maintenance/oracle/archives/patch_create_17_functions.sql b/maintenance/oracle/archives/patch_create_17_functions.sql
deleted file mode 100644 (file)
index 6c9c954..0000000
+++ /dev/null
@@ -1,125 +0,0 @@
-define mw_prefix='{$wgDBprefix}';
-
-/*$mw$*/
-CREATE OR REPLACE PROCEDURE duplicate_table(p_tabname   IN VARCHAR2,
-                                            p_oldprefix IN VARCHAR2,
-                                            p_newprefix IN VARCHAR2,
-                                            p_temporary IN BOOLEAN) IS
-  e_table_not_exist EXCEPTION;
-  PRAGMA EXCEPTION_INIT(e_table_not_exist, -00942);
-  l_temp_ei_sql VARCHAR2(2000);
-BEGIN
-  BEGIN
-    EXECUTE IMMEDIATE 'DROP TABLE ' || p_newprefix || p_tabname ||
-                      ' CASCADE CONSTRAINTS';
-  EXCEPTION
-    WHEN e_table_not_exist THEN
-      NULL;
-  END;
-  IF (p_temporary) THEN
-    EXECUTE IMMEDIATE 'CREATE GLOBAL TEMPORARY TABLE ' || p_newprefix ||
-                      p_tabname || ' AS SELECT * FROM ' || p_oldprefix ||
-                      p_tabname || ' WHERE ROWNUM = 0';
-  ELSE
-    EXECUTE IMMEDIATE 'CREATE TABLE ' || p_newprefix || p_tabname ||
-                      ' AS SELECT * FROM ' || p_oldprefix || p_tabname ||
-                      ' WHERE ROWNUM = 0';
-  END IF;
-  FOR rc IN (SELECT column_name, data_default
-               FROM user_tab_columns
-              WHERE table_name = p_oldprefix || p_tabname
-                AND data_default IS NOT NULL) LOOP
-    EXECUTE IMMEDIATE 'ALTER TABLE ' || p_newprefix || p_tabname ||
-                      ' MODIFY ' || rc.column_name || ' DEFAULT ' ||
-                      SUBSTR(rc.data_default, 1, 2000);
-  END LOOP;
-  FOR rc IN (SELECT REPLACE(REPLACE(DBMS_LOB.SUBSTR(DBMS_METADATA.get_ddl('CONSTRAINT',
-                                                                          constraint_name),
-                                                    32767,
-                                                    1),
-                                    USER || '"."' || p_oldprefix,
-                                    USER || '"."' || p_newprefix),
-                            '"' || constraint_name || '"',
-                            '"' || p_newprefix || constraint_name || '"') DDLVC2,
-                    constraint_name
-               FROM user_constraints uc
-              WHERE table_name = p_oldprefix || p_tabname
-                AND constraint_type = 'P') LOOP
-    l_temp_ei_sql := SUBSTR(rc.ddlvc2, 1, INSTR(rc.ddlvc2, 'PCTFREE') - 1);
-    l_temp_ei_sql := SUBSTR(l_temp_ei_sql, 1, INSTR(l_temp_ei_sql, ')', INSTR(l_temp_ei_sql, 'PRIMARY KEY')+1)+1);
-    EXECUTE IMMEDIATE l_temp_ei_sql;
-  END LOOP;
-  IF (NOT p_temporary) THEN
-  FOR rc IN (SELECT REPLACE(DBMS_LOB.SUBSTR(DBMS_METADATA.get_ddl('REF_CONSTRAINT',
-                                                                  constraint_name),
-                                            32767,
-                                            1),
-                            USER || '"."' || p_oldprefix,
-                            USER || '"."' || p_newprefix) DDLVC2,
-                    constraint_name
-               FROM user_constraints uc
-              WHERE table_name = p_oldprefix || p_tabname
-                AND constraint_type = 'R') LOOP
-    EXECUTE IMMEDIATE rc.ddlvc2;
-  END LOOP;
-  END IF;
-  FOR rc IN (SELECT REPLACE(REPLACE(DBMS_LOB.SUBSTR(DBMS_METADATA.get_ddl('INDEX',
-                                                                          index_name),
-                                                    32767,
-                                                    1),
-                                    USER || '"."' || p_oldprefix,
-                                    USER || '"."' || p_newprefix),
-                            '"' || index_name || '"',
-                            '"' || p_newprefix || index_name || '"') DDLVC2,
-                    index_name,
-                    index_type
-               FROM user_indexes ui
-              WHERE table_name = p_oldprefix || p_tabname
-                AND index_type NOT IN ('LOB', 'DOMAIN')
-                AND NOT EXISTS
-              (SELECT NULL
-                       FROM user_constraints
-                      WHERE table_name = ui.table_name
-                        AND constraint_name = ui.index_name)) LOOP
-    l_temp_ei_sql := SUBSTR(rc.ddlvc2, 1, INSTR(rc.ddlvc2, 'PCTFREE') - 1);
-    l_temp_ei_sql := SUBSTR(l_temp_ei_sql, 1, INSTR(l_temp_ei_sql, ')', INSTR(l_temp_ei_sql, '"' || USER || '"."' || p_newprefix || '"')+1)+1);
-    EXECUTE IMMEDIATE l_temp_ei_sql;
-  END LOOP;
-  FOR rc IN (SELECT REPLACE(REPLACE(UPPER(DBMS_LOB.SUBSTR(DBMS_METADATA.get_ddl('TRIGGER',
-                                                                                trigger_name),
-                                                          32767,
-                                                          1)),
-                                    USER || '"."' || p_oldprefix,
-                                    USER || '"."' || p_newprefix),
-                            ' ON ' || p_oldprefix || p_tabname,
-                            ' ON ' || p_newprefix || p_tabname) DDLVC2,
-                    trigger_name
-               FROM user_triggers
-              WHERE table_name = p_oldprefix || p_tabname) LOOP
-    l_temp_ei_sql := SUBSTR(rc.ddlvc2, 1, INSTR(rc.ddlvc2, 'ALTER ') - 1);
-    dbms_output.put_line(l_temp_ei_sql);
-    EXECUTE IMMEDIATE l_temp_ei_sql;
-  END LOOP;
-END;
-/*$mw$*/
-
-CREATE OR REPLACE TYPE GET_OUTPUT_TYPE IS TABLE OF VARCHAR2(255);
-
-/*$mw$*/
-CREATE OR REPLACE FUNCTION GET_OUTPUT_LINES RETURN GET_OUTPUT_TYPE PIPELINED AS
-  v_line VARCHAR2(255);
-  v_status INTEGER := 0;
-BEGIN
-
-  LOOP
-    DBMS_OUTPUT.GET_LINE(v_line, v_status);
-    IF (v_status = 0) THEN RETURN; END IF;
-    PIPE ROW (v_line);
-  END LOOP;
-  RETURN;
-EXCEPTION
-  WHEN OTHERS THEN
-    RETURN;
-END;
-/*$mw$*/
-
diff --git a/maintenance/oracle/archives/patch_fk_rename_deferred.sql b/maintenance/oracle/archives/patch_fk_rename_deferred.sql
deleted file mode 100644 (file)
index ca9c997..0000000
+++ /dev/null
@@ -1,40 +0,0 @@
-define mw_prefix='{$wgDBprefix}';
-
-/*$mw$*/
-BEGIN
--- drop all, recreate manual in case anyone was missing
-  FOR cc1 IN (SELECT uc.table_name,
-                     uc.constraint_name
-                FROM user_constraints  uc
-               WHERE uc.constraint_type = 'R') LOOP
-    EXECUTE IMMEDIATE 'ALTER TABLE &mw_prefix.' || cc1.table_name ||
-                      ' DROP CONSTRAINT ' || cc1.constraint_name;
-  END LOOP;
-END;
-/*$mw$*/
-
-ALTER TABLE &mw_prefix.user_groups ADD CONSTRAINT &mw_prefix.user_groups_fk1 FOREIGN KEY (ug_user) REFERENCES &mw_prefix.mwuser(user_id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED;
-ALTER TABLE &mw_prefix.user_newtalk ADD CONSTRAINT &mw_prefix.user_newtalk_fk1 FOREIGN KEY (user_id) REFERENCES &mw_prefix.mwuser(user_id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED;
-ALTER TABLE &mw_prefix.revision ADD CONSTRAINT &mw_prefix.revision_fk1 FOREIGN KEY (rev_page) REFERENCES &mw_prefix.page(page_id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED;
-ALTER TABLE &mw_prefix.revision ADD CONSTRAINT &mw_prefix.revision_fk2 FOREIGN KEY (rev_user) REFERENCES &mw_prefix.mwuser(user_id) DEFERRABLE INITIALLY DEFERRED;
-ALTER TABLE &mw_prefix.archive ADD CONSTRAINT &mw_prefix.archive_fk1 FOREIGN KEY (ar_user) REFERENCES &mw_prefix.mwuser(user_id) ON DELETE SET NULL DEFERRABLE INITIALLY DEFERRED;
-ALTER TABLE &mw_prefix.pagelinks ADD CONSTRAINT &mw_prefix.pagelinks_fk1 FOREIGN KEY (pl_from) REFERENCES &mw_prefix.page(page_id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED;
-ALTER TABLE &mw_prefix.templatelinks ADD CONSTRAINT &mw_prefix.templatelinks_fk1 FOREIGN KEY (tl_from) REFERENCES &mw_prefix.page(page_id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED;
-ALTER TABLE &mw_prefix.imagelinks ADD CONSTRAINT &mw_prefix.imagelinks_fk1 FOREIGN KEY (il_from) REFERENCES &mw_prefix.page(page_id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED;
-ALTER TABLE &mw_prefix.categorylinks ADD CONSTRAINT &mw_prefix.categorylinks_fk1 FOREIGN KEY (cl_from) REFERENCES &mw_prefix.page(page_id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED;
-ALTER TABLE &mw_prefix.externallinks ADD CONSTRAINT &mw_prefix.externallinks_fk1 FOREIGN KEY (el_from) REFERENCES &mw_prefix.page(page_id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED;
-ALTER TABLE &mw_prefix.langlinks ADD CONSTRAINT &mw_prefix.langlinks_fk1 FOREIGN KEY (ll_from) REFERENCES &mw_prefix.page(page_id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED;
-ALTER TABLE &mw_prefix.ipblocks ADD CONSTRAINT &mw_prefix.ipblocks_fk1 FOREIGN KEY (ipb_user) REFERENCES &mw_prefix.mwuser(user_id) ON DELETE SET NULL DEFERRABLE INITIALLY DEFERRED;
-ALTER TABLE &mw_prefix.ipblocks ADD CONSTRAINT &mw_prefix.ipblocks_fk2 FOREIGN KEY (ipb_by) REFERENCES &mw_prefix.mwuser(user_id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED;
-ALTER TABLE &mw_prefix.image ADD CONSTRAINT &mw_prefix.image_fk1 FOREIGN KEY (img_user) REFERENCES &mw_prefix.mwuser(user_id) ON DELETE SET NULL DEFERRABLE INITIALLY DEFERRED;
-ALTER TABLE &mw_prefix.oldimage ADD CONSTRAINT &mw_prefix.oldimage_fk1 FOREIGN KEY (oi_name) REFERENCES &mw_prefix.image(img_name) ON DELETE SET NULL DEFERRABLE INITIALLY DEFERRED;
-ALTER TABLE &mw_prefix.oldimage ADD CONSTRAINT &mw_prefix.oldimage_fk2 FOREIGN KEY (oi_user) REFERENCES &mw_prefix.mwuser(user_id) ON DELETE SET NULL DEFERRABLE INITIALLY DEFERRED;
-ALTER TABLE &mw_prefix.filearchive ADD CONSTRAINT &mw_prefix.filearchive_fk1 FOREIGN KEY (fa_deleted_user) REFERENCES &mw_prefix.mwuser(user_id) ON DELETE SET NULL DEFERRABLE INITIALLY DEFERRED;
-ALTER TABLE &mw_prefix.filearchive ADD CONSTRAINT &mw_prefix.filearchive_fk2 FOREIGN KEY (fa_user) REFERENCES &mw_prefix.mwuser(user_id) ON DELETE SET NULL DEFERRABLE INITIALLY DEFERRED;
-ALTER TABLE &mw_prefix.recentchanges ADD CONSTRAINT &mw_prefix.recentchanges_fk1 FOREIGN KEY (rc_user) REFERENCES &mw_prefix.mwuser(user_id) ON DELETE SET NULL DEFERRABLE INITIALLY DEFERRED;
-ALTER TABLE &mw_prefix.recentchanges ADD CONSTRAINT &mw_prefix.recentchanges_fk2 FOREIGN KEY (rc_cur_id) REFERENCES &mw_prefix.page(page_id) ON DELETE SET NULL DEFERRABLE INITIALLY DEFERRED;
-ALTER TABLE &mw_prefix.watchlist ADD CONSTRAINT &mw_prefix.watchlist_fk1 FOREIGN KEY (wl_user) REFERENCES &mw_prefix.mwuser(user_id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED;
-ALTER TABLE &mw_prefix.logging ADD CONSTRAINT &mw_prefix.logging_fk1 FOREIGN KEY (log_user) REFERENCES &mw_prefix.mwuser(user_id) ON DELETE SET NULL DEFERRABLE INITIALLY DEFERRED;
-ALTER TABLE &mw_prefix.redirect ADD CONSTRAINT &mw_prefix.redirect_fk1 FOREIGN KEY (rd_from) REFERENCES &mw_prefix.page(page_id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED;
-ALTER TABLE &mw_prefix.page_restrictions ADD CONSTRAINT &mw_prefix.page_restrictions_fk1 FOREIGN KEY (pr_page) REFERENCES &mw_prefix.page(page_id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED;
-
diff --git a/maintenance/oracle/archives/patch_namespace_defaults.sql b/maintenance/oracle/archives/patch_namespace_defaults.sql
deleted file mode 100644 (file)
index 24c9564..0000000
+++ /dev/null
@@ -1,17 +0,0 @@
-define mw_prefix='{$wgDBprefix}';
-
-ALTER TABLE &mw_prefix.page MODIFY page_namespace DEFAULT 0;
-ALTER TABLE &mw_prefix.archive MODIFY ar_namespace DEFAULT 0;
-ALTER TABLE &mw_prefix.pagelinks MODIFY pl_namespace DEFAULT 0;
-ALTER TABLE &mw_prefix.templatelinks MODIFY tl_namespace DEFAULT 0;
-ALTER TABLE &mw_prefix.recentchanges MODIFY rc_namespace DEFAULT 0;
-ALTER TABLE &mw_prefix.querycache MODIFY qc_namespace DEFAULT 0;
-ALTER TABLE &mw_prefix.logging MODIFY log_namespace DEFAULT 0;
-ALTER TABLE &mw_prefix.job MODIFY job_namespace DEFAULT 0;
-ALTER TABLE &mw_prefix.redirect MODIFY rd_namespace DEFAULT 0;
-ALTER TABLE &mw_prefix.protected_titles MODIFY pt_namespace DEFAULT 0;
-ALTER TABLE &mw_prefix.archive MODIFY ar_namespace DEFAULT 0;
-ALTER TABLE &mw_prefix.archive MODIFY ar_namespace DEFAULT 0;
-ALTER TABLE &mw_prefix.archive MODIFY ar_namespace DEFAULT 0;
-ALTER TABLE &mw_prefix.archive MODIFY ar_namespace DEFAULT 0;
-
diff --git a/maintenance/oracle/archives/patch_rebuild_dupfunc.sql b/maintenance/oracle/archives/patch_rebuild_dupfunc.sql
deleted file mode 100644 (file)
index 56ee5b3..0000000
+++ /dev/null
@@ -1,149 +0,0 @@
-/*$mw$*/
-CREATE OR REPLACE PROCEDURE duplicate_table(p_tabname   IN VARCHAR2,
-                                            p_oldprefix IN VARCHAR2,
-                                            p_newprefix IN VARCHAR2,
-                                            p_temporary IN BOOLEAN) IS
-  e_table_not_exist EXCEPTION;
-  PRAGMA EXCEPTION_INIT(e_table_not_exist, -00942);
-  l_temp_ei_sql VARCHAR2(2000);
-  l_temporary   BOOLEAN := p_temporary;
-BEGIN
-  BEGIN
-    EXECUTE IMMEDIATE 'DROP TABLE ' || p_newprefix || p_tabname ||
-                      ' CASCADE CONSTRAINTS PURGE';
-  EXCEPTION
-    WHEN e_table_not_exist THEN
-      NULL;
-  END;
-  IF (p_tabname = 'SEARCHINDEX') THEN
-    l_temporary := FALSE;
-  END IF;
-  IF (l_temporary) THEN
-    EXECUTE IMMEDIATE 'CREATE GLOBAL TEMPORARY TABLE ' || p_newprefix ||
-                      p_tabname ||
-                      ' ON COMMIT PRESERVE ROWS AS SELECT * FROM ' ||
-                      p_oldprefix || p_tabname || ' WHERE ROWNUM = 0';
-  ELSE
-    EXECUTE IMMEDIATE 'CREATE TABLE ' || p_newprefix || p_tabname ||
-                      ' AS SELECT * FROM ' || p_oldprefix || p_tabname ||
-                      ' WHERE ROWNUM = 0';
-  END IF;
-  FOR rc IN (SELECT column_name, data_default
-               FROM user_tab_columns
-              WHERE table_name = p_oldprefix || p_tabname
-                AND data_default IS NOT NULL) LOOP
-    EXECUTE IMMEDIATE 'ALTER TABLE ' || p_newprefix || p_tabname ||
-                      ' MODIFY ' || rc.column_name || ' DEFAULT ' ||
-                      SUBSTR(rc.data_default, 1, 2000);
-  END LOOP;
-  FOR rc IN (SELECT REPLACE(REPLACE(DBMS_LOB.SUBSTR(DBMS_METADATA.get_ddl('CONSTRAINT',
-                                                                          constraint_name),
-                                                    32767,
-                                                    1),
-                                    USER || '"."' || p_oldprefix,
-                                    USER || '"."' || p_newprefix),
-                            '"' || constraint_name || '"',
-                            '"' || p_newprefix || constraint_name || '"') DDLVC2,
-                    constraint_name
-               FROM user_constraints uc
-              WHERE table_name = p_oldprefix || p_tabname
-                AND constraint_type = 'P') LOOP
-    l_temp_ei_sql := SUBSTR(rc.ddlvc2, 1, INSTR(rc.ddlvc2, 'PCTFREE') - 1);
-    l_temp_ei_sql := SUBSTR(l_temp_ei_sql,
-                            1,
-                            INSTR(l_temp_ei_sql,
-                                  ')',
-                                  INSTR(l_temp_ei_sql, 'PRIMARY KEY') + 1) + 1);
-    IF nvl(length(l_temp_ei_sql), 0) > 0 THEN
-      EXECUTE IMMEDIATE l_temp_ei_sql;
-    END IF;
-  END LOOP;
-  IF (NOT l_temporary) THEN
-    FOR rc IN (SELECT REPLACE(DBMS_LOB.SUBSTR(DBMS_METADATA.get_ddl('REF_CONSTRAINT',
-                                                                    constraint_name),
-                                              32767,
-                                              1),
-                              USER || '"."' || p_oldprefix,
-                              USER || '"."' || p_newprefix) DDLVC2,
-                      constraint_name
-                 FROM user_constraints uc
-                WHERE table_name = p_oldprefix || p_tabname
-                  AND constraint_type = 'R') LOOP
-      IF nvl(length(l_temp_ei_sql), 0) > 0 AND
-         INSTR(l_temp_ei_sql, 'PRIMARY KEY') = 0 THEN
-        EXECUTE IMMEDIATE l_temp_ei_sql;
-      END IF;
-    END LOOP;
-  END IF;
-  FOR rc IN (SELECT REPLACE(REPLACE(DBMS_LOB.SUBSTR(DBMS_METADATA.get_ddl('INDEX',
-                                                                          index_name),
-                                                    32767,
-                                                    1),
-                                    USER || '"."' || p_oldprefix,
-                                    USER || '"."' || p_newprefix),
-                            '"' || index_name || '"',
-                            '"' || p_newprefix || index_name || '"') DDLVC2,
-                    index_name,
-                    index_type
-               FROM user_indexes ui
-              WHERE table_name = p_oldprefix || p_tabname
-                AND index_type NOT IN ('LOB', 'DOMAIN')
-                AND NOT EXISTS
-              (SELECT NULL
-                       FROM user_constraints
-                      WHERE table_name = ui.table_name
-                        AND constraint_name = ui.index_name)) LOOP
-    l_temp_ei_sql := SUBSTR(rc.ddlvc2, 1, INSTR(rc.ddlvc2, 'PCTFREE') - 1);
-    l_temp_ei_sql := SUBSTR(l_temp_ei_sql,
-                            1,
-                            INSTR(l_temp_ei_sql,
-                                  ')',
-                                  INSTR(l_temp_ei_sql,
-                                        '"' || USER || '"."' || p_newprefix || '"') + 1) + 1);
-    IF nvl(length(l_temp_ei_sql), 0) > 0 THEN
-      EXECUTE IMMEDIATE l_temp_ei_sql;
-    END IF;
-  END LOOP;
-  FOR rc IN (SELECT REPLACE(REPLACE(DBMS_LOB.SUBSTR(DBMS_METADATA.get_ddl('INDEX',
-                                                                          index_name),
-                                                    32767,
-                                                    1),
-                                    USER || '"."' || p_oldprefix,
-                                    USER || '"."' || p_newprefix),
-                            '"' || index_name || '"',
-                            '"' || p_newprefix || index_name || '"') DDLVC2,
-                    index_name,
-                    index_type
-               FROM user_indexes ui
-              WHERE table_name = p_oldprefix || p_tabname
-                AND index_type = 'DOMAIN'
-                AND NOT EXISTS
-              (SELECT NULL
-                       FROM user_constraints
-                      WHERE table_name = ui.table_name
-                        AND constraint_name = ui.index_name)) LOOP
-    l_temp_ei_sql := rc.ddlvc2;
-    IF nvl(length(l_temp_ei_sql), 0) > 0 THEN
-      EXECUTE IMMEDIATE l_temp_ei_sql;
-    END IF;
-  END LOOP;
-  FOR rc IN (SELECT REPLACE(REPLACE(UPPER(DBMS_LOB.SUBSTR(DBMS_METADATA.get_ddl('TRIGGER',
-                                                                                trigger_name),
-                                                          32767,
-                                                          1)),
-                                    USER || '"."' || p_oldprefix,
-                                    USER || '"."' || p_newprefix),
-                            ' ON ' || p_oldprefix || p_tabname,
-                            ' ON ' || p_newprefix || p_tabname) DDLVC2,
-                    trigger_name
-               FROM user_triggers
-              WHERE table_name = p_oldprefix || p_tabname) LOOP
-    l_temp_ei_sql := SUBSTR(rc.ddlvc2, 1, INSTR(rc.ddlvc2, 'ALTER ') - 1);
-    IF nvl(length(l_temp_ei_sql), 0) > 0 THEN
-      EXECUTE IMMEDIATE l_temp_ei_sql;
-    END IF;
-  END LOOP;
-END;
-
-/*$mw$*/
-
diff --git a/maintenance/oracle/archives/patch_recentchanges_fk2_cascade.sql b/maintenance/oracle/archives/patch_recentchanges_fk2_cascade.sql
deleted file mode 100644 (file)
index 4550951..0000000
+++ /dev/null
@@ -1,5 +0,0 @@
-define mw_prefix='{$wgDBprefix}';
-
-ALTER TABLE &mw_prefix.recentchanges DROP CONSTRAINT &mw_prefix.recentchanges_fk2;
-ALTER TABLE &mw_prefix.recentchanges ADD CONSTRAINT &mw_prefix.recentchanges_fk2 FOREIGN KEY (rc_cur_id) REFERENCES &mw_prefix.page(page_id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED;
-
diff --git a/maintenance/oracle/archives/patch_remove_not_null_empty_defs.sql b/maintenance/oracle/archives/patch_remove_not_null_empty_defs.sql
deleted file mode 100644 (file)
index 76e50a0..0000000
+++ /dev/null
@@ -1,9 +0,0 @@
-define mw_prefix='{$wgDBprefix}';
-
-ALTER TABLE &mw_prefix.categorylinks MODIFY cl_sortkey_prefix DEFAULT NULL NULL;
-ALTER TABLE &mw_prefix.categorylinks MODIFY cl_collation DEFAULT NULL NULL;
-ALTER TABLE &mw_prefix.iwlinks MODIFY iwl_prefix DEFAULT NULL NULL;
-ALTER TABLE &mw_prefix.iwlinks MODIFY iwl_title DEFAULT NULL NULL;
-ALTER TABLE &mw_prefix.searchindex MODIFY si_title DEFAULT NULL NULL;
-ALTER TABLE &mw_prefix.querycachetwo MODIFY qcc_title DEFAULT NULL NULL;
-ALTER TABLE &mw_prefix.querycachetwo MODIFY qcc_titletwo DEFAULT NULL NULL;
diff --git a/maintenance/oracle/archives/patch_remove_not_null_empty_defs2.sql b/maintenance/oracle/archives/patch_remove_not_null_empty_defs2.sql
deleted file mode 100644 (file)
index f7a38a0..0000000
+++ /dev/null
@@ -1,3 +0,0 @@
-define mw_prefix='{$wgDBprefix}';
-
-ALTER TABLE &mw_prefix.ipblocks MODIFY ipb_by_text DEFAULT NULL NULL;
diff --git a/maintenance/oracle/patch_seq_names_pre1.16.sql b/maintenance/oracle/patch_seq_names_pre1.16.sql
deleted file mode 100644 (file)
index 5346b14..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
--- script for renameing sequence names to conform with <table>_<field>_seq format
-RENAME rev_rev_id_val TO revision_rev_id_seq;
-RENAME text_old_id_val TO text_old_id_seq;
-RENAME category_id_seq TO category_cat_id_seq;
-RENAME ipblocks_ipb_id_val TO ipblocks_ipb_id_seq;
-RENAME rc_rc_id_seq TO recentchanges_rc_id_seq;
-RENAME log_log_id_seq TO logging_log_id_seq;
-RENAME pr_id_val TO page_restrictions_pr_id_seq;
\ No newline at end of file
diff --git a/maintenance/oracle/tables.sql b/maintenance/oracle/tables.sql
deleted file mode 100644 (file)
index 7a8160f..0000000
+++ /dev/null
@@ -1,1262 +0,0 @@
--- defines must comply with ^define\s*([^\s=]*)\s*=\s?'\{\$([^\}]*)\}';
-define mw_prefix='{$wgDBprefix}';
-
--- Package to help with making Oracle more like other DBs with respect to
--- auto-incrementing columns.
-/*$mw$*/
-CREATE PACKAGE &mw_prefix.lastval_pkg IS
-  lastval NUMBER;
-  PROCEDURE setLastval(val IN NUMBER, field OUT NUMBER);
-  FUNCTION getLastval RETURN NUMBER;
-END;
-/*$mw$*/
-
-/*$mw$*/
-CREATE PACKAGE BODY &mw_prefix.lastval_pkg IS
-  PROCEDURE setLastval(val IN NUMBER, field OUT NUMBER) IS BEGIN
-    lastval := val;
-    field := val;
-  END;
-
-  FUNCTION getLastval RETURN NUMBER IS BEGIN
-    RETURN lastval;
-  END;
-END;
-/*$mw$*/
-
-CREATE SEQUENCE user_user_id_seq;
-CREATE TABLE &mw_prefix.mwuser ( -- replace reserved word 'user'
-  user_id                   NUMBER  NOT NULL,
-  user_name                 VARCHAR2(255)     NOT NULL,
-  user_real_name            VARCHAR2(512),
-  user_password             VARCHAR2(255),
-  user_newpassword          VARCHAR2(255),
-  user_newpass_time         TIMESTAMP(6) WITH TIME ZONE,
-  user_token                VARCHAR2(32),
-  user_email                VARCHAR2(255),
-  user_email_token          VARCHAR2(32),
-  user_email_token_expires  TIMESTAMP(6) WITH TIME ZONE,
-  user_email_authenticated  TIMESTAMP(6) WITH TIME ZONE,
-  user_options              CLOB,
-  user_touched              TIMESTAMP(6) WITH TIME ZONE,
-  user_registration         TIMESTAMP(6) WITH TIME ZONE,
-  user_editcount            NUMBER,
-  user_password_expires     TIMESTAMP(6) WITH TIME ZONE
-);
-ALTER TABLE &mw_prefix.mwuser ADD CONSTRAINT &mw_prefix.mwuser_pk PRIMARY KEY (user_id);
-CREATE UNIQUE INDEX &mw_prefix.mwuser_u01 ON &mw_prefix.mwuser (user_name);
-CREATE INDEX &mw_prefix.mwuser_i01 ON &mw_prefix.mwuser (user_email_token);
-CREATE INDEX &mw_prefix.mwuser_i02 ON &mw_prefix.mwuser (user_email, user_name);
-/*$mw$*/
-CREATE TRIGGER &mw_prefix.mwuser_seq_trg BEFORE INSERT ON &mw_prefix.mwuser
-       FOR EACH ROW WHEN (new.user_id IS NULL)
-BEGIN
-       &mw_prefix.lastval_pkg.setLastval(user_user_id_seq.nextval, :new.user_id);
-END;
-/*$mw$*/
-
--- Create a dummy user to satisfy fk contraints especially with revisions
-INSERT INTO &mw_prefix.mwuser
-  (user_id, user_name, user_options, user_touched, user_registration, user_editcount)
-  VALUES (0,'Anonymous','', current_timestamp, current_timestamp,0);
-
-CREATE SEQUENCE actor_actor_id_seq;
-CREATE TABLE &mw_prefix.actor (
-  actor_id NUMBER NOT NULL,
-  actor_user NUMBER,
-  actor_name VARCHAR2(255) NOT NULL
-);
-
-ALTER TABLE &mw_prefix.actor ADD CONSTRAINT &mw_prefix.actor_pk PRIMARY KEY (actor_id);
-
-/*$mw$*/
-CREATE TRIGGER &mw_prefix.actor_seq_trg BEFORE INSERT ON &mw_prefix.actor
-       FOR EACH ROW WHEN (new.actor_id IS NULL)
-BEGIN
-       &mw_prefix.lastval_pkg.setLastval(actor_actor_id_seq.nextval, :new.actor_id);
-END;
-/*$mw$*/
-
--- Create a dummy actor to satisfy fk contraints
-INSERT INTO &mw_prefix.actor (actor_id, actor_name) VALUES (0,'##Anonymous##');
-
-CREATE TABLE &mw_prefix.user_groups (
-  ug_user   NUMBER      DEFAULT 0 NOT NULL,
-  ug_group  VARCHAR2(255)     NOT NULL,
-  ug_expiry TIMESTAMP(6) WITH TIME ZONE NULL
-);
-ALTER TABLE &mw_prefix.user_groups ADD CONSTRAINT &mw_prefix.user_groups_pk PRIMARY KEY (ug_user,ug_group);
-ALTER TABLE &mw_prefix.user_groups ADD CONSTRAINT &mw_prefix.user_groups_fk1 FOREIGN KEY (ug_user) REFERENCES &mw_prefix.mwuser(user_id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED;
-CREATE INDEX &mw_prefix.user_groups_i01 ON &mw_prefix.user_groups (ug_group);
-CREATE INDEX &mw_prefix.user_groups_i02 ON &mw_prefix.user_groups (ug_expiry);
-
-CREATE TABLE &mw_prefix.user_former_groups (
-  ufg_user   NUMBER      DEFAULT 0 NOT NULL,
-  ufg_group  VARCHAR2(255)     NOT NULL
-);
-ALTER TABLE &mw_prefix.user_former_groups ADD CONSTRAINT &mw_prefix.user_former_groups_fk1 FOREIGN KEY (ufg_user) REFERENCES &mw_prefix.mwuser(user_id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED;
-CREATE UNIQUE INDEX &mw_prefix.user_former_groups_u01 ON &mw_prefix.user_former_groups (ufg_user,ufg_group);
-
-CREATE TABLE &mw_prefix.user_newtalk (
-  user_id  NUMBER DEFAULT 0 NOT NULL,
-  user_ip  VARCHAR2(40)        NULL,
-  user_last_timestamp         TIMESTAMP(6) WITH TIME ZONE
-);
-ALTER TABLE &mw_prefix.user_newtalk ADD CONSTRAINT &mw_prefix.user_newtalk_fk1 FOREIGN KEY (user_id) REFERENCES &mw_prefix.mwuser(user_id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED;
-CREATE INDEX &mw_prefix.user_newtalk_i01 ON &mw_prefix.user_newtalk (user_id);
-CREATE INDEX &mw_prefix.user_newtalk_i02 ON &mw_prefix.user_newtalk (user_ip);
-
-CREATE TABLE &mw_prefix.user_properties (
-  up_user NUMBER NOT NULL,
-  up_property VARCHAR2(255) NOT NULL,
-  up_value CLOB
-);
-CREATE UNIQUE INDEX &mw_prefix.user_properties_u01 on &mw_prefix.user_properties (up_user,up_property);
-CREATE INDEX &mw_prefix.user_properties_i01 on &mw_prefix.user_properties (up_property);
-
-CREATE SEQUENCE page_page_id_seq;
-CREATE TABLE &mw_prefix.page (
-  page_id            NUMBER        NOT NULL,
-  page_namespace     NUMBER       DEFAULT 0 NOT NULL,
-  page_title         VARCHAR2(255)           NOT NULL,
-  page_restrictions  VARCHAR2(255),
-  page_is_redirect   CHAR(1)           DEFAULT '0' NOT NULL,
-  page_is_new        CHAR(1)           DEFAULT '0' NOT NULL,
-  page_random        NUMBER(15,14) NOT NULL,
-  page_touched       TIMESTAMP(6) WITH TIME ZONE,
-  page_links_updated TIMESTAMP(6) WITH TIME ZONE,
-  page_latest        NUMBER        DEFAULT 0 NOT NULL, -- FK?
-  page_len           NUMBER        DEFAULT 0 NOT NULL,
-  page_content_model VARCHAR2(32),
-  page_lang VARCHAR2(35) DEFAULT NULL
-);
-ALTER TABLE &mw_prefix.page ADD CONSTRAINT &mw_prefix.page_pk PRIMARY KEY (page_id);
-CREATE UNIQUE INDEX &mw_prefix.page_u01 ON &mw_prefix.page (page_namespace,page_title);
-CREATE INDEX &mw_prefix.page_i01 ON &mw_prefix.page (page_random);
-CREATE INDEX &mw_prefix.page_i02 ON &mw_prefix.page (page_len);
-CREATE INDEX &mw_prefix.page_i03 ON &mw_prefix.page (page_is_redirect, page_namespace, page_len);
-/*$mw$*/
-CREATE TRIGGER &mw_prefix.page_seq_trg BEFORE INSERT ON &mw_prefix.page
-       FOR EACH ROW WHEN (new.page_id IS NULL)
-BEGIN
-       &mw_prefix.lastval_pkg.setLastval(page_page_id_seq.nextval, :new.page_id);
-END;
-/*$mw$*/
-
--- Create a dummy page to satisfy fk contraints especially with revisions
-INSERT INTO &mw_prefix.page
-  VALUES (0, 0, ' ', NULL, 0, 0, 0, current_timestamp, NULL, 0, 0, NULL, NULL);
-
-/*$mw$*/
-CREATE TRIGGER &mw_prefix.page_set_random BEFORE INSERT ON &mw_prefix.page
-       FOR EACH ROW WHEN (new.page_random IS NULL)
-BEGIN
-       SELECT dbms_random.value INTO :NEW.page_random FROM dual;
-END;
-/*$mw$*/
-
-CREATE SEQUENCE comment_comment_id_seq;
-CREATE TABLE &mw_prefix."COMMENT" (
-  comment_id NUMBER NOT NULL,
-  comment_hash NUMBER NOT NULL,
-  comment_text CLOB,
-  comment_data CLOB
-);
-CREATE INDEX &mw_prefix.comment_hash ON &mw_prefix."COMMENT" (comment_hash);
-/*$mw$*/
-CREATE TRIGGER &mw_prefix.comment_seq_trg BEFORE INSERT ON &mw_prefix."COMMENT"
-       FOR EACH ROW WHEN (new.comment_id IS NULL)
-BEGIN
-       &mw_prefix.lastval_pkg.setLastval(comment_comment_id_seq.nextval, :new.comment_id);
-END;
-/*$mw$*/
-
--- dummy row for FKs. Hash is intentionally wrong so CommentStore won't match it.
-INSERT INTO &mw_prefix."COMMENT" (comment_hash, comment_text) VALUES (-1, '** dummy **');
-
-CREATE SEQUENCE revision_rev_id_seq;
-CREATE TABLE &mw_prefix.revision (
-  rev_id          NUMBER      NOT NULL,
-  rev_page        NUMBER      NOT NULL,
-  rev_text_id     NUMBER          NULL,
-  rev_comment     VARCHAR2(255),
-  rev_user        NUMBER      DEFAULT 0 NOT NULL,
-  rev_user_text   VARCHAR2(255)         NOT NULL,
-  rev_timestamp   TIMESTAMP(6) WITH TIME ZONE  NOT NULL,
-  rev_minor_edit  CHAR(1)         DEFAULT '0' NOT NULL,
-  rev_deleted     CHAR(1)         DEFAULT '0' NOT NULL,
-  rev_len         NUMBER          NULL,
-  rev_parent_id   NUMBER          DEFAULT NULL,
-  rev_sha1               VARCHAR2(32)    NULL,
-  rev_content_model VARCHAR2(32),
-  rev_content_format VARCHAR2(64)
-);
-ALTER TABLE &mw_prefix.revision ADD CONSTRAINT &mw_prefix.revision_pk PRIMARY KEY (rev_id);
-ALTER TABLE &mw_prefix.revision ADD CONSTRAINT &mw_prefix.revision_fk1 FOREIGN KEY (rev_page) REFERENCES &mw_prefix.page(page_id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED;
-ALTER TABLE &mw_prefix.revision ADD CONSTRAINT &mw_prefix.revision_fk2 FOREIGN KEY (rev_user) REFERENCES &mw_prefix.mwuser(user_id) DEFERRABLE INITIALLY DEFERRED;
-CREATE UNIQUE INDEX &mw_prefix.revision_u01 ON &mw_prefix.revision (rev_page, rev_id);
-CREATE INDEX &mw_prefix.revision_i01 ON &mw_prefix.revision (rev_timestamp);
-CREATE INDEX &mw_prefix.revision_i02 ON &mw_prefix.revision (rev_page,rev_timestamp);
-CREATE INDEX &mw_prefix.revision_i03 ON &mw_prefix.revision (rev_user,rev_timestamp);
-CREATE INDEX &mw_prefix.revision_i04 ON &mw_prefix.revision (rev_user_text,rev_timestamp);
-CREATE INDEX &mw_prefix.revision_i05 ON &mw_prefix.revision (rev_page,rev_user,rev_timestamp);
-/*$mw$*/
-CREATE TRIGGER &mw_prefix.revision_seq_trg BEFORE INSERT ON &mw_prefix.revision
-       FOR EACH ROW WHEN (new.rev_id IS NULL)
-BEGIN
-       &mw_prefix.lastval_pkg.setLastval(revision_rev_id_seq.nextval, :new.rev_id);
-END;
-/*$mw$*/
-
-CREATE TABLE &mw_prefix.revision_comment_temp (
-  revcomment_rev NUMBER NOT NULL,
-  revcomment_comment_id NUMBER NOT NULL
-);
-ALTER TABLE &mw_prefix.revision_comment_temp ADD CONSTRAINT &mw_prefix.revision_comment_temp_pk PRIMARY KEY (revcomment_rev, revcomment_comment_id);
-ALTER TABLE &mw_prefix.revision_comment_temp ADD CONSTRAINT &mw_prefix.revision_comment_temp_fk1 FOREIGN KEY (revcomment_rev) REFERENCES &mw_prefix.revision(rev_id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED;
-ALTER TABLE &mw_prefix.revision_comment_temp ADD CONSTRAINT &mw_prefix.revision_comment_temp_fk2 FOREIGN KEY (revcomment_comment_id) REFERENCES &mw_prefix."COMMENT"(comment_id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED;
-CREATE UNIQUE INDEX &mw_prefix.revcomment_rev ON &mw_prefix.revision_comment_temp (revcomment_rev);
-
-CREATE TABLE &mw_prefix.revision_actor_temp (
-  revactor_rev NUMBER NOT NULL,
-  revactor_actor NUMBER NOT NULL,
-  revactor_timestamp TIMESTAMP(6) WITH TIME ZONE NOT NULL,
-  revactor_page NUMBER NOT NULL
-);
-ALTER TABLE &mw_prefix.revision_actor_temp ADD CONSTRAINT &mw_prefix.revision_actor_temp_pk PRIMARY KEY (revactor_rev, revactor_actor);
-CREATE UNIQUE INDEX &mw_prefix.revactor_rev ON &mw_prefix.revision_actor_temp (revactor_rev);
-CREATE INDEX &mw_prefix.actor_timestamp ON &mw_prefix.revision_actor_temp (revactor_actor,revactor_timestamp);
-CREATE INDEX &mw_prefix.page_actor_timestamp ON &mw_prefix.revision_actor_temp (revactor_page,revactor_actor,revactor_timestamp);
-
-CREATE SEQUENCE text_old_id_seq;
-CREATE TABLE &mw_prefix.pagecontent ( -- replaces reserved word 'text'
-  old_id     NUMBER  NOT NULL,
-  old_text   CLOB,
-  old_flags  VARCHAR2(255)
-);
-ALTER TABLE &mw_prefix.pagecontent ADD CONSTRAINT &mw_prefix.pagecontent_pk PRIMARY KEY (old_id);
-/*$mw$*/
-CREATE TRIGGER &mw_prefix.pagecontent_seq_trg BEFORE INSERT ON &mw_prefix.pagecontent
-       FOR EACH ROW WHEN (new.old_id IS NULL)
-BEGIN
-       &mw_prefix.lastval_pkg.setLastval(text_old_id_seq.nextval, :new.old_id);
-END;
-/*$mw$*/
-
-CREATE SEQUENCE archive_ar_id_seq;
-CREATE TABLE &mw_prefix.archive (
-  ar_id          NUMBER NOT NULL,
-  ar_namespace   NUMBER    DEFAULT 0 NOT NULL,
-  ar_title       VARCHAR2(255)         NOT NULL,
-  ar_comment_id  NUMBER NOT NULL,
-  ar_user        NUMBER          DEFAULT 0 NOT NULL,
-  ar_user_text   VARCHAR2(255)         NULL,
-  ar_actor       NUMBER          DEFAULT 0 NOT NULL,
-  ar_timestamp   TIMESTAMP(6) WITH TIME ZONE  NOT NULL,
-  ar_minor_edit  CHAR(1)         DEFAULT '0' NOT NULL,
-  ar_rev_id      NUMBER NOT NULL,
-  ar_text_id     NUMBER DEFAULT 0 NOT NULL,
-  ar_deleted     CHAR(1)      DEFAULT '0' NOT NULL,
-  ar_len         NUMBER,
-  ar_page_id     NUMBER,
-  ar_parent_id   NUMBER,
-  ar_sha1                VARCHAR2(32),
-  ar_content_model VARCHAR2(32),
-  ar_content_format VARCHAR2(64)
-);
-ALTER TABLE &mw_prefix.archive ADD CONSTRAINT &mw_prefix.archive_pk PRIMARY KEY (ar_id);
-ALTER TABLE &mw_prefix.archive ADD CONSTRAINT &mw_prefix.archive_fk1 FOREIGN KEY (ar_user) REFERENCES &mw_prefix.mwuser(user_id) ON DELETE SET NULL DEFERRABLE INITIALLY DEFERRED;
-ALTER TABLE &mw_prefix.archive ADD CONSTRAINT &mw_prefix.archive_fk2 FOREIGN KEY (ar_comment_id) REFERENCES &mw_prefix."COMMENT"(comment_id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED;
-CREATE INDEX &mw_prefix.archive_i01 ON &mw_prefix.archive (ar_namespace,ar_title,ar_timestamp);
-CREATE INDEX &mw_prefix.archive_i02 ON &mw_prefix.archive (ar_user_text,ar_timestamp);
-CREATE INDEX &mw_prefix.ar_actor_timestamp ON &mw_prefix.archive (ar_actor,ar_timestamp);
-CREATE UNIQUE INDEX &mw_prefix.archive_i04 ON &mw_prefix.archive (ar_rev_id);
-/*$mw$*/
-CREATE TRIGGER &mw_prefix.archive_seq_trg BEFORE INSERT ON &mw_prefix.archive
-       FOR EACH ROW WHEN (new.ar_id IS NULL)
-BEGIN
-       &mw_prefix.lastval_pkg.setLastval(archive_ar_id_seq.nextval, :new.ar_id);
-END;
-/*$mw$*/
-
-
-CREATE TABLE &mw_prefix.slots (
-  slot_revision_id NUMBER NOT NULL,
-  slot_role_id NUMBER NOT NULL,
-  slot_content_id NUMBER NOT NULL,
-  slot_origin NUMBER NOT NULL
-);
-
-ALTER TABLE &mw_prefix.slots ADD CONSTRAINT &mw_prefix.slots_pk PRIMARY KEY (slot_revision_id, slot_role_id);
-
-CREATE INDEX &mw_prefix.slot_revision_origin_role ON &mw_prefix.slots (slot_revision_id, slot_origin, slot_role_id);
-
-
-CREATE SEQUENCE content_content_id_seq;
-CREATE TABLE &mw_prefix.content (
-  content_id NUMBER NOT NULL,
-  content_size NUMBER NOT NULL,
-  content_sha1 VARCHAR2(32) NOT NULL,
-  content_model NUMBER NOT NULL,
-  content_address VARCHAR2(255) NOT NULL
-);
-
-ALTER TABLE &mw_prefix.content ADD CONSTRAINT &mw_prefix.content_pk PRIMARY KEY (content_id);
-
-/*$mw$*/
-CREATE TRIGGER &mw_prefix.content_seq_trg BEFORE INSERT ON &mw_prefix.content
-       FOR EACH ROW WHEN (new.content_id IS NULL)
-BEGIN
-       &mw_prefix.lastval_pkg.setLastval(content_content_id_seq.nextval, :new.content_id);
-END;
-/*$mw$*/
-
-
-CREATE SEQUENCE slot_roles_role_id_seq;
-CREATE TABLE &mw_prefix.slot_roles (
-  role_id NUMBER NOT NULL,
-  role_name VARCHAR2(64) NOT NULL
-);
-
-ALTER TABLE &mw_prefix.slot_roles ADD CONSTRAINT &mw_prefix.slot_roles_pk PRIMARY KEY (role_id);
-
-CREATE UNIQUE INDEX &mw_prefix.role_name_u01 ON &mw_prefix.slot_roles (role_name);
-
-/*$mw$*/
-CREATE TRIGGER &mw_prefix.slot_roles_seq_trg BEFORE INSERT ON &mw_prefix.slot_roles
-       FOR EACH ROW WHEN (new.role_id IS NULL)
-BEGIN
-       &mw_prefix.lastval_pkg.setLastval(slot_roles_role_id_seq.nextval, :new.role_id);
-END;
-/*$mw$*/
-
-
-CREATE SEQUENCE content_models_model_id_seq;
-CREATE TABLE &mw_prefix.content_models (
-  model_id NUMBER NOT NULL,
-  model_name VARCHAR2(64) NOT NULL
-);
-
-
-ALTER TABLE &mw_prefix.content_models ADD CONSTRAINT &mw_prefix.content_models_pk PRIMARY KEY (model_id);
-
-CREATE UNIQUE INDEX &mw_prefix.model_name_u01 ON &mw_prefix.content_models (model_name);
-
-/*$mw$*/
-CREATE TRIGGER &mw_prefix.content_models_seq_trg BEFORE INSERT ON &mw_prefix.content_models
-       FOR EACH ROW WHEN (new.model_id IS NULL)
-BEGIN
-       &mw_prefix.lastval_pkg.setLastval(content_models_model_id_seq.nextval, :new.model_id);
-END;
-/*$mw$*/
-
-
-CREATE TABLE &mw_prefix.pagelinks (
-  pl_from       NUMBER   NOT NULL,
-  pl_namespace  NUMBER  DEFAULT 0 NOT NULL,
-  pl_title      VARCHAR2(255)      NOT NULL
-);
-ALTER TABLE &mw_prefix.pagelinks ADD CONSTRAINT &mw_prefix.pagelinks_fk1 FOREIGN KEY (pl_from) REFERENCES &mw_prefix.page(page_id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED;
-CREATE UNIQUE INDEX &mw_prefix.pagelinks_u01 ON &mw_prefix.pagelinks (pl_from,pl_namespace,pl_title);
-CREATE UNIQUE INDEX &mw_prefix.pagelinks_u02 ON &mw_prefix.pagelinks (pl_namespace,pl_title,pl_from);
-
-CREATE TABLE &mw_prefix.templatelinks (
-  tl_from       NUMBER  NOT NULL,
-  tl_namespace  NUMBER     DEFAULT 0 NOT NULL,
-  tl_title      VARCHAR2(255)     NOT NULL
-);
-ALTER TABLE &mw_prefix.templatelinks ADD CONSTRAINT &mw_prefix.templatelinks_fk1 FOREIGN KEY (tl_from) REFERENCES &mw_prefix.page(page_id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED;
-CREATE UNIQUE INDEX &mw_prefix.templatelinks_u01 ON &mw_prefix.templatelinks (tl_from,tl_namespace,tl_title);
-CREATE UNIQUE INDEX &mw_prefix.templatelinks_u02 ON &mw_prefix.templatelinks (tl_namespace,tl_title,tl_from);
-
-CREATE TABLE &mw_prefix.imagelinks (
-  il_from  NUMBER  NOT NULL,
-  il_to    VARCHAR2(255)     NOT NULL
-);
-ALTER TABLE &mw_prefix.imagelinks ADD CONSTRAINT &mw_prefix.imagelinks_fk1 FOREIGN KEY (il_from) REFERENCES &mw_prefix.page(page_id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED;
-CREATE UNIQUE INDEX &mw_prefix.imagelinks_u01 ON &mw_prefix.imagelinks (il_from,il_to);
-CREATE UNIQUE INDEX &mw_prefix.imagelinks_u02 ON &mw_prefix.imagelinks (il_to,il_from);
-
-
-CREATE TABLE &mw_prefix.categorylinks (
-  cl_from       NUMBER      NOT NULL,
-  cl_to         VARCHAR2(255)         NOT NULL,
-  cl_sortkey    VARCHAR2(230),
-  cl_sortkey_prefix VARCHAR2(255),
-  cl_timestamp  TIMESTAMP(6) WITH TIME ZONE  NOT NULL,
-  cl_collation VARCHAR2(32),
-  cl_type              VARCHAR2(6) DEFAULT 'page' NOT NULL
-);
-ALTER TABLE &mw_prefix.categorylinks ADD CONSTRAINT &mw_prefix.categorylinks_fk1 FOREIGN KEY (cl_from) REFERENCES &mw_prefix.page(page_id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED;
-CREATE UNIQUE INDEX &mw_prefix.categorylinks_u01 ON &mw_prefix.categorylinks (cl_from,cl_to);
-CREATE INDEX &mw_prefix.categorylinks_i01 ON &mw_prefix.categorylinks (cl_to,cl_type,cl_sortkey,cl_from);
-CREATE INDEX &mw_prefix.categorylinks_i02 ON &mw_prefix.categorylinks (cl_to,cl_timestamp);
-CREATE INDEX &mw_prefix.categorylinks_i03 ON &mw_prefix.categorylinks (cl_collation);
-
-CREATE SEQUENCE category_cat_id_seq;
-CREATE TABLE &mw_prefix.category (
-  cat_id NUMBER NOT NULL,
-  cat_title VARCHAR2(255) NOT NULL,
-  cat_pages NUMBER DEFAULT 0 NOT NULL,
-  cat_subcats NUMBER DEFAULT 0 NOT NULL,
-  cat_files NUMBER DEFAULT 0 NOT NULL
-);
-ALTER TABLE &mw_prefix.category ADD CONSTRAINT &mw_prefix.category_pk PRIMARY KEY (cat_id);
-CREATE UNIQUE INDEX &mw_prefix.category_u01 ON &mw_prefix.category (cat_title);
-CREATE INDEX &mw_prefix.category_i01 ON &mw_prefix.category (cat_pages);
-/*$mw$*/
-CREATE TRIGGER &mw_prefix.category_seq_trg BEFORE INSERT ON &mw_prefix.category
-       FOR EACH ROW WHEN (new.cat_id IS NULL)
-BEGIN
-       &mw_prefix.lastval_pkg.setLastval(category_cat_id_seq.nextval, :new.cat_id);
-END;
-/*$mw$*/
-
-CREATE SEQUENCE externallinks_el_id_seq;
-CREATE TABLE &mw_prefix.externallinks (
-  el_id     NUMBER  NOT NULL,
-  el_from   NUMBER  NOT NULL,
-  el_to     VARCHAR2(2048) NOT NULL,
-  el_index  VARCHAR2(2048) NOT NULL,
-  el_index_60  VARCHAR2(60)
-);
-ALTER TABLE &mw_prefix.externallinks ADD CONSTRAINT &mw_prefix.externallinks_pk PRIMARY KEY (el_id);
-ALTER TABLE &mw_prefix.externallinks ADD CONSTRAINT &mw_prefix.externallinks_fk1 FOREIGN KEY (el_from) REFERENCES &mw_prefix.page(page_id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED;
-CREATE INDEX &mw_prefix.externallinks_i01 ON &mw_prefix.externallinks (el_from, el_to);
-CREATE INDEX &mw_prefix.externallinks_i02 ON &mw_prefix.externallinks (el_to, el_from);
-CREATE INDEX &mw_prefix.externallinks_i03 ON &mw_prefix.externallinks (el_index);
-CREATE INDEX &mw_prefix.externallinks_i04 ON &mw_prefix.externallinks (el_index_60, el_id);
-CREATE INDEX &mw_prefix.externallinks_i05 ON &mw_prefix.externallinks (el_from, el_index_60, el_id);
-/*$mw$*/
-CREATE TRIGGER &mw_prefix.externallinks_seq_trg BEFORE INSERT ON &mw_prefix.externallinks
-       FOR EACH ROW WHEN (new.el_id IS NULL)
-BEGIN
-       &mw_prefix.lastval_pkg.setLastval(externallinks_el_id_seq.nextval, :new.el_id);
-END;
-/*$mw$*/
-
--- Table defining tag names for IDs. Also stores hit counts to avoid expensive queries on change_tag
-CREATE SEQUENCE change_tag_def_ctd_id_seq;
-CREATE TABLE &mw_prefix.change_tag_def (
-    -- Numerical ID of the tag (ct_tag_id refers to this)
-    ctd_id NUMBER  NOT NULL,
-    -- Symbolic name of the tag (what would previously be put in ct_tag)
-    ctd_name VARCHAR2(255) NOT NULL,
-    -- Whether this tag was defined manually by a privileged user using Special:Tags
-    ctd_user_defined CHAR(1) DEFAULT '0' NOT NULL,
-    -- Number of times this tag was used
-    ctd_count NUMBER NOT NULL DEFAULT 0
-);
-
-ALTER TABLE &mw_prefix.change_tag_def ADD CONSTRAINT &mw_prefix.change_tag_def_pk PRIMARY KEY (ctd_id);
-CREATE UNIQUE INDEX &mw_prefix.ctd_name ON &mw_prefix.change_tag_def (ctd_name);
-CREATE INDEX &mw_prefix.ctd_count ON &mw_prefix.change_tag_def (ctd_count);
-CREATE INDEX &mw_prefix.ctd_user_defined ON &mw_prefix.change_tag_def (ctd_user_defined);
-
-/*$mw$*/
-CREATE TRIGGER &mw_prefix.change_tag_def_seq_trg BEFORE INSERT ON &mw_prefix.change_tag_def
-    FOR EACH ROW WHEN (new.ctd_id IS NULL)
-BEGIN
-    &mw_prefix.lastval_pkg.setLastval(change_tag_def_ctd_id_seq.nextval, :new.ctd_id);
-END;
-/*$mw$*/
-
-CREATE TABLE &mw_prefix.langlinks (
-  ll_from    NUMBER  NOT NULL,
-  ll_lang    VARCHAR2(20),
-  ll_title   VARCHAR2(255)
-);
-ALTER TABLE &mw_prefix.langlinks ADD CONSTRAINT &mw_prefix.langlinks_fk1 FOREIGN KEY (ll_from) REFERENCES &mw_prefix.page(page_id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED;
-CREATE UNIQUE INDEX &mw_prefix.langlinks_u01 ON &mw_prefix.langlinks (ll_from, ll_lang);
-CREATE INDEX &mw_prefix.langlinks_i01 ON &mw_prefix.langlinks (ll_lang, ll_title);
-
-CREATE TABLE &mw_prefix.iwlinks (
-  iwl_from NUMBER DEFAULT 0 NOT NULL,
-  iwl_prefix VARCHAR2(20),
-  iwl_title VARCHAR2(255)
-);
-CREATE UNIQUE INDEX &mw_prefix.iwlinks_ui01 ON &mw_prefix.iwlinks (iwl_from, iwl_prefix, iwl_title);
-CREATE UNIQUE INDEX &mw_prefix.iwlinks_ui02 ON &mw_prefix.iwlinks (iwl_prefix, iwl_title, iwl_from);
-
-CREATE TABLE &mw_prefix.site_stats (
-  ss_row_id         NUMBER  NOT NULL PRIMARY KEY,
-  ss_total_edits    NUMBER            DEFAULT NULL,
-  ss_good_articles  NUMBER            DEFAULT NULL,
-  ss_total_pages    NUMBER            DEFAULT NULL,
-  ss_users          NUMBER            DEFAULT NULL,
-  ss_active_users   NUMBER            DEFAULT NULL,
-  ss_images         NUMBER            DEFAULT NULL
-);
-
-CREATE SEQUENCE ipblocks_ipb_id_seq;
-CREATE TABLE &mw_prefix.ipblocks (
-  ipb_id                NUMBER      NOT NULL,
-  ipb_address           VARCHAR2(255)     NULL,
-  ipb_user              NUMBER      DEFAULT 0 NOT  NULL,
-  ipb_by                NUMBER      DEFAULT 0 NOT NULL,
-  ipb_by_text           VARCHAR2(255)      NULL,
-  ipb_by_actor          NUMBER      DEFAULT 0 NOT NULL,
-  ipb_reason_id         NUMBER NOT NULL,
-  ipb_timestamp         TIMESTAMP(6) WITH TIME ZONE  NOT NULL,
-  ipb_auto              CHAR(1)         DEFAULT '0' NOT NULL,
-  ipb_anon_only         CHAR(1)         DEFAULT '0' NOT NULL,
-  ipb_create_account    CHAR(1)         DEFAULT '1' NOT NULL,
-  ipb_enable_autoblock  CHAR(1)         DEFAULT '1' NOT NULL,
-  ipb_expiry            TIMESTAMP(6) WITH TIME ZONE  NOT NULL,
-  ipb_range_start       VARCHAR2(255),
-  ipb_range_end         VARCHAR2(255),
-  ipb_deleted           CHAR(1)      DEFAULT '0' NOT NULL,
-  ipb_block_email       CHAR(1)      DEFAULT '0' NOT NULL,
-  ipb_allow_usertalk    CHAR(1)      DEFAULT '0' NOT NULL,
-  ipb_parent_block_id   NUMBER       DEFAULT NULL,
-  ipb_sitewide          CHAR(1)      DEFAULT '1' NOT NULL
-);
-ALTER TABLE &mw_prefix.ipblocks ADD CONSTRAINT &mw_prefix.ipblocks_pk PRIMARY KEY (ipb_id);
-ALTER TABLE &mw_prefix.ipblocks ADD CONSTRAINT &mw_prefix.ipblocks_fk1 FOREIGN KEY (ipb_user) REFERENCES &mw_prefix.mwuser(user_id) ON DELETE SET NULL DEFERRABLE INITIALLY DEFERRED;
-ALTER TABLE &mw_prefix.ipblocks ADD CONSTRAINT &mw_prefix.ipblocks_fk2 FOREIGN KEY (ipb_by) REFERENCES &mw_prefix.mwuser(user_id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED;
-ALTER TABLE &mw_prefix.ipblocks ADD CONSTRAINT &mw_prefix.ipblocks_fk3 FOREIGN KEY (ipb_reason_id) REFERENCES &mw_prefix."COMMENT"(comment_id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED;
-CREATE UNIQUE INDEX &mw_prefix.ipblocks_u01 ON &mw_prefix.ipblocks (ipb_address, ipb_user, ipb_auto, ipb_anon_only);
-CREATE INDEX &mw_prefix.ipblocks_i01 ON &mw_prefix.ipblocks (ipb_user);
-CREATE INDEX &mw_prefix.ipblocks_i02 ON &mw_prefix.ipblocks (ipb_range_start, ipb_range_end);
-CREATE INDEX &mw_prefix.ipblocks_i03 ON &mw_prefix.ipblocks (ipb_timestamp);
-CREATE INDEX &mw_prefix.ipblocks_i04 ON &mw_prefix.ipblocks (ipb_expiry);
-CREATE INDEX &mw_prefix.ipblocks_i05 ON &mw_prefix.ipblocks (ipb_parent_block_id);
-/*$mw$*/
-CREATE TRIGGER &mw_prefix.ipblocks_seq_trg BEFORE INSERT ON &mw_prefix.ipblocks
-       FOR EACH ROW WHEN (new.ipb_id IS NULL)
-BEGIN
-       &mw_prefix.lastval_pkg.setLastval(ipblocks_ipb_id_seq.nextval, :new.ipb_id);
-END;
-/*$mw$*/
-
-CREATE TABLE &mw_prefix.ipblocks_restrictions (
-  ir_ipb_id NUMBER NOT NULL,
-  ir_type NUMBER NOT NULL,
-  ir_value NUMBER NOT NULL
-);
-ALTER TABLE &mw_prefix.ipblocks_restrictions ADD CONSTRAINT ipblocks_restrictions_pk PRIMARY KEY (ir_ipb_id, ir_type, ir_value);
-CREATE INDEX &mw_prefix.ir_type_value ON &mw_prefix.ipblocks_restrictions (ir_type, ir_value);
-
-CREATE TABLE &mw_prefix.image (
-  img_name         VARCHAR2(255)      NOT NULL,
-  img_size         NUMBER   DEFAULT 0 NOT NULL,
-  img_width        NUMBER   DEFAULT 0 NOT NULL,
-  img_height       NUMBER   DEFAULT 0 NOT NULL,
-  img_metadata     CLOB,
-  img_bits         NUMBER   DEFAULT 0 NOT NULL,
-  img_media_type   VARCHAR2(32),
-  img_major_mime   VARCHAR2(32) DEFAULT 'unknown',
-  img_minor_mime   VARCHAR2(100) DEFAULT 'unknown',
-  img_description_id  NUMBER NOT NULL,
-  img_user         NUMBER       DEFAULT 0 NOT NULL,
-  img_user_text    VARCHAR2(255)      NULL,
-  img_actor        NUMBER       DEFAULT 0 NOT NULL,
-  img_timestamp    TIMESTAMP(6) WITH TIME ZONE,
-  img_sha1         VARCHAR2(32)
-);
-ALTER TABLE &mw_prefix.image ADD CONSTRAINT &mw_prefix.image_pk PRIMARY KEY (img_name);
-ALTER TABLE &mw_prefix.image ADD CONSTRAINT &mw_prefix.image_fk1 FOREIGN KEY (img_user) REFERENCES &mw_prefix.mwuser(user_id) ON DELETE SET NULL DEFERRABLE INITIALLY DEFERRED;
-ALTER TABLE &mw_prefix.image ADD CONSTRAINT &mw_prefix.image_fk2 FOREIGN KEY (img_description_id) REFERENCES &mw_prefix."COMMENT"(comment_id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED;
-CREATE INDEX &mw_prefix.image_i01 ON &mw_prefix.image (img_user_text,img_timestamp);
-CREATE INDEX &mw_prefix.image_i02 ON &mw_prefix.image (img_size);
-CREATE INDEX &mw_prefix.image_i03 ON &mw_prefix.image (img_timestamp);
-CREATE INDEX &mw_prefix.image_i04 ON &mw_prefix.image (img_sha1);
-CREATE INDEX &mw_prefix.img_actor_timestamp ON &mw_prefix.image (img_actor, img_timestamp);
-
-
-CREATE TABLE &mw_prefix.oldimage (
-  oi_name          VARCHAR2(255)         DEFAULT 0 NOT NULL,
-  oi_archive_name  VARCHAR2(255),
-  oi_size          NUMBER      DEFAULT 0 NOT NULL,
-  oi_width         NUMBER      DEFAULT 0 NOT NULL,
-  oi_height        NUMBER      DEFAULT 0 NOT NULL,
-  oi_bits          NUMBER      DEFAULT 0 NOT NULL,
-  oi_description_id  NUMBER NOT NULL,
-  oi_user          NUMBER          DEFAULT 0 NOT NULL,
-  oi_user_text     VARCHAR2(255)         NULL,
-  oi_actor         NUMBER          DEFAULT 0 NOT NULL,
-  oi_timestamp     TIMESTAMP(6) WITH TIME ZONE  NOT NULL,
-  oi_metadata      CLOB,
-  oi_media_type    VARCHAR2(32) DEFAULT NULL,
-  oi_major_mime    VARCHAR2(32) DEFAULT 'unknown',
-  oi_minor_mime    VARCHAR2(100) DEFAULT 'unknown',
-  oi_deleted       NUMBER DEFAULT 0 NOT NULL,
-  oi_sha1          VARCHAR2(32)
-);
-ALTER TABLE &mw_prefix.oldimage ADD CONSTRAINT &mw_prefix.oldimage_fk1 FOREIGN KEY (oi_name) REFERENCES &mw_prefix.image(img_name) ON DELETE SET NULL DEFERRABLE INITIALLY DEFERRED;
-ALTER TABLE &mw_prefix.oldimage ADD CONSTRAINT &mw_prefix.oldimage_fk2 FOREIGN KEY (oi_user) REFERENCES &mw_prefix.mwuser(user_id) ON DELETE SET NULL DEFERRABLE INITIALLY DEFERRED;
-ALTER TABLE &mw_prefix.oldimage ADD CONSTRAINT &mw_prefix.oldimage_fk3 FOREIGN KEY (oi_description_id) REFERENCES &mw_prefix."COMMENT"(comment_id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED;
-CREATE INDEX &mw_prefix.oldimage_i01 ON &mw_prefix.oldimage (oi_user_text,oi_timestamp);
-CREATE INDEX &mw_prefix.oi_actor_timestamp ON &mw_prefix.oldimage (oi_actor,oi_timestamp);
-CREATE INDEX &mw_prefix.oldimage_i02 ON &mw_prefix.oldimage (oi_name,oi_timestamp);
-CREATE INDEX &mw_prefix.oldimage_i03 ON &mw_prefix.oldimage (oi_name,oi_archive_name);
-CREATE INDEX &mw_prefix.oldimage_i04 ON &mw_prefix.oldimage (oi_sha1);
-
-
-CREATE SEQUENCE filearchive_fa_id_seq;
-CREATE TABLE &mw_prefix.filearchive (
-  fa_id                 NUMBER       NOT NULL,
-  fa_name               VARCHAR2(255)         NOT NULL,
-  fa_archive_name       VARCHAR2(255),
-  fa_storage_group      VARCHAR2(16),
-  fa_storage_key        VARCHAR2(64),
-  fa_deleted_user       NUMBER          DEFAULT 0 NOT NULL,
-  fa_deleted_timestamp  TIMESTAMP(6) WITH TIME ZONE  NOT NULL,
-  fa_deleted_reason_id  NUMBER NOT NULL,
-  fa_size               NUMBER     DEFAULT 0 NOT NULL,
-  fa_width              NUMBER     DEFAULT 0 NOT NULL,
-  fa_height             NUMBER     DEFAULT 0 NOT NULL,
-  fa_metadata           CLOB,
-  fa_bits               NUMBER     DEFAULT 0 NOT NULL,
-  fa_media_type         VARCHAR2(32) DEFAULT NULL,
-  fa_major_mime         VARCHAR2(32) DEFAULT 'unknown',
-  fa_minor_mime         VARCHAR2(100) DEFAULT 'unknown',
-  fa_description_id     NUMBER NOT NULL,
-  fa_user               NUMBER          DEFAULT 0 NOT NULL,
-  fa_user_text          VARCHAR2(255)         NULL,
-  fa_actor              NUMBER          DEFAULT 0 NOT NULL,
-  fa_timestamp          TIMESTAMP(6) WITH TIME ZONE,
-  fa_deleted            NUMBER      DEFAULT 0 NOT NULL,
-  fa_sha1              VARCHAR2(32)
-);
-ALTER TABLE &mw_prefix.filearchive ADD CONSTRAINT &mw_prefix.filearchive_pk PRIMARY KEY (fa_id);
-ALTER TABLE &mw_prefix.filearchive ADD CONSTRAINT &mw_prefix.filearchive_fk1 FOREIGN KEY (fa_deleted_user) REFERENCES &mw_prefix.mwuser(user_id) ON DELETE SET NULL DEFERRABLE INITIALLY DEFERRED;
-ALTER TABLE &mw_prefix.filearchive ADD CONSTRAINT &mw_prefix.filearchive_fk2 FOREIGN KEY (fa_user) REFERENCES &mw_prefix.mwuser(user_id) ON DELETE SET NULL DEFERRABLE INITIALLY DEFERRED;
-ALTER TABLE &mw_prefix.filearchive ADD CONSTRAINT &mw_prefix.filearchive_fk3 FOREIGN KEY (fa_deleted_reason_id) REFERENCES &mw_prefix."COMMENT"(comment_id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED;
-ALTER TABLE &mw_prefix.filearchive ADD CONSTRAINT &mw_prefix.filearchive_fk4 FOREIGN KEY (fa_description_id) REFERENCES &mw_prefix."COMMENT"(comment_id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED;
-CREATE INDEX &mw_prefix.filearchive_i01 ON &mw_prefix.filearchive (fa_name, fa_timestamp);
-CREATE INDEX &mw_prefix.filearchive_i02 ON &mw_prefix.filearchive (fa_storage_group, fa_storage_key);
-CREATE INDEX &mw_prefix.filearchive_i03 ON &mw_prefix.filearchive (fa_deleted_timestamp);
-CREATE INDEX &mw_prefix.filearchive_i04 ON &mw_prefix.filearchive (fa_user_text,fa_timestamp);
-CREATE INDEX &mw_prefix.fa_actor_timestamp ON &mw_prefix.filearchive (fa_actor,fa_timestamp);
-CREATE INDEX &mw_prefix.filearchive_i05 ON &mw_prefix.filearchive (fa_sha1);
-/*$mw$*/
-CREATE TRIGGER &mw_prefix.filearchive_seq_trg BEFORE INSERT ON &mw_prefix.filearchive
-       FOR EACH ROW WHEN (new.fa_id IS NULL)
-BEGIN
-       &mw_prefix.lastval_pkg.setLastval(filearchive_fa_id_seq.nextval, :new.fa_id);
-END;
-/*$mw$*/
-
-CREATE SEQUENCE uploadstash_us_id_seq;
-CREATE TABLE &mw_prefix.uploadstash (
-       us_id                 NUMBER       NOT NULL,
-  us_user               NUMBER          DEFAULT 0 NOT NULL,
-       us_key                                                          VARCHAR2(255) NOT NULL,
-       us_orig_path                                    VARCHAR2(255) NOT NULL,
-       us_path                                                         VARCHAR2(255) NOT NULL,
-       us_source_type                          VARCHAR2(50),
-  us_timestamp          TIMESTAMP(6) WITH TIME ZONE,
-       us_status                                                       VARCHAR2(50) NOT NULL,
-       us_chunk_inx                                            NUMBER,
-       us_size                                                         NUMBER NOT NULL,
-       us_sha1                                                         VARCHAR2(32) NOT NULL,
-       us_mime                                                         VARCHAR2(255),
-  us_media_type         VARCHAR2(32) DEFAULT NULL,
-       us_image_width                          NUMBER,
-       us_image_height                         NUMBER,
-       us_image_bits                                   NUMBER,
-  us_props BLOB
-);
-ALTER TABLE &mw_prefix.uploadstash ADD CONSTRAINT &mw_prefix.uploadstash_pk PRIMARY KEY (us_id);
-ALTER TABLE &mw_prefix.uploadstash ADD CONSTRAINT &mw_prefix.uploadstash_fk1 FOREIGN KEY (us_user) REFERENCES &mw_prefix.mwuser(user_id) ON DELETE SET NULL DEFERRABLE INITIALLY DEFERRED;
-CREATE INDEX &mw_prefix.uploadstash_i01 ON &mw_prefix.uploadstash (us_user);
-CREATE INDEX &mw_prefix.uploadstash_i02 ON &mw_prefix.uploadstash (us_timestamp);
-CREATE UNIQUE INDEX &mw_prefix.uploadstash_u01 ON &mw_prefix.uploadstash (us_key);
-/*$mw$*/
-CREATE TRIGGER &mw_prefix.uploadstash_seq_trg BEFORE INSERT ON &mw_prefix.uploadstash
-       FOR EACH ROW WHEN (new.us_id IS NULL)
-BEGIN
-       &mw_prefix.lastval_pkg.setLastval(uploadstash_us_id_seq.nextval, :new.us_id);
-END;
-/*$mw$*/
-
-CREATE SEQUENCE recentchanges_rc_id_seq;
-CREATE TABLE &mw_prefix.recentchanges (
-  rc_id              NUMBER      NOT NULL,
-  rc_timestamp       TIMESTAMP(6) WITH TIME ZONE  NOT NULL,
-  rc_cur_time        TIMESTAMP(6) WITH TIME ZONE,
-  rc_user            NUMBER          DEFAULT 0 NOT NULL,
-  rc_user_text       VARCHAR2(255)         NULL,
-  rc_actor           NUMBER          DEFAULT 0 NOT NULL,
-  rc_namespace       NUMBER     DEFAULT 0 NOT NULL,
-  rc_title           VARCHAR2(255)         NOT NULL,
-  rc_comment_id      NUMBER NOT NULL,
-  rc_minor           CHAR(1)         DEFAULT '0' NOT NULL,
-  rc_bot             CHAR(1)         DEFAULT '0' NOT NULL,
-  rc_new             CHAR(1)         DEFAULT '0' NOT NULL,
-  rc_cur_id          NUMBER          DEFAULT 0 NOT NULL,
-  rc_this_oldid      NUMBER      DEFAULT 0 NOT NULL,
-  rc_last_oldid      NUMBER      DEFAULT 0 NOT NULL,
-  rc_type            CHAR(1)         DEFAULT '0' NOT NULL,
-  rc_source                                     VARCHAR2(16),
-  rc_patrolled       CHAR(1)         DEFAULT '0' NOT NULL,
-  rc_ip              VARCHAR2(15),
-  rc_old_len         NUMBER,
-  rc_new_len         NUMBER,
-  rc_deleted         CHAR(1)      DEFAULT '0' NOT NULL,
-  rc_logid           NUMBER      DEFAULT 0 NOT NULL,
-  rc_log_type        VARCHAR2(255),
-  rc_log_action      VARCHAR2(255),
-  rc_params          CLOB
-);
-ALTER TABLE &mw_prefix.recentchanges ADD CONSTRAINT &mw_prefix.recentchanges_pk PRIMARY KEY (rc_id);
-ALTER TABLE &mw_prefix.recentchanges ADD CONSTRAINT &mw_prefix.recentchanges_fk1 FOREIGN KEY (rc_user) REFERENCES &mw_prefix.mwuser(user_id) ON DELETE SET NULL DEFERRABLE INITIALLY DEFERRED;
-ALTER TABLE &mw_prefix.recentchanges ADD CONSTRAINT &mw_prefix.recentchanges_fk2 FOREIGN KEY (rc_cur_id) REFERENCES &mw_prefix.page(page_id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED;
-ALTER TABLE &mw_prefix.recentchanges ADD CONSTRAINT &mw_prefix.recentchanges_fk3 FOREIGN KEY (rc_comment_id) REFERENCES &mw_prefix."COMMENT"(comment_id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED;
-CREATE INDEX &mw_prefix.recentchanges_i01 ON &mw_prefix.recentchanges (rc_timestamp);
-CREATE INDEX &mw_prefix.recentchanges_i09 ON &mw_prefix.recentchanges (rc_namespace, rc_title, rc_timestamp);
-CREATE INDEX &mw_prefix.recentchanges_i03 ON &mw_prefix.recentchanges (rc_cur_id);
-CREATE INDEX &mw_prefix.recentchanges_i04 ON &mw_prefix.recentchanges (rc_new,rc_namespace,rc_timestamp);
-CREATE INDEX &mw_prefix.recentchanges_i05 ON &mw_prefix.recentchanges (rc_ip);
-CREATE INDEX &mw_prefix.recentchanges_i06 ON &mw_prefix.recentchanges (rc_namespace, rc_user_text);
-CREATE INDEX &mw_prefix.recentchanges_i07 ON &mw_prefix.recentchanges (rc_user_text, rc_timestamp);
-CREATE INDEX &mw_prefix.rc_ns_actor ON &mw_prefix.recentchanges (rc_namespace, rc_actor);
-CREATE INDEX &mw_prefix.rc_actor ON &mw_prefix.recentchanges (rc_actor, rc_timestamp);
-CREATE INDEX &mw_prefix.recentchanges_i08 ON &mw_prefix.recentchanges (rc_namespace, rc_type, rc_patrolled, rc_timestamp);
-CREATE INDEX &mw_prefix.recentchanges_i10 ON &mw_prefix.recentchanges (rc_this_oldid);
-/*$mw$*/
-CREATE TRIGGER &mw_prefix.recentchanges_seq_trg BEFORE INSERT ON &mw_prefix.recentchanges
-       FOR EACH ROW WHEN (new.rc_id IS NULL)
-BEGIN
-       &mw_prefix.lastval_pkg.setLastval(recentchanges_rc_id_seq.nextval, :new.rc_id);
-END;
-/*$mw$*/
-
-CREATE TABLE &mw_prefix.watchlist (
-  wl_id                     NUMBER     NOT NULL,
-  wl_user                   NUMBER     NOT NULL,
-  wl_namespace              NUMBER    DEFAULT 0 NOT NULL,
-  wl_title                  VARCHAR2(255)        NOT NULL,
-  wl_notificationtimestamp  TIMESTAMP(6) WITH TIME ZONE
-);
-ALTER TABLE &mw_prefix.watchlist ADD CONSTRAINT &mw_prefix.watchlist_pk PRIMARY KEY (wl_id);
-ALTER TABLE &mw_prefix.watchlist ADD CONSTRAINT &mw_prefix.watchlist_fk1 FOREIGN KEY (wl_user) REFERENCES &mw_prefix.mwuser(user_id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED;
-CREATE UNIQUE INDEX &mw_prefix.watchlist_u01 ON &mw_prefix.watchlist (wl_user, wl_namespace, wl_title);
-CREATE INDEX &mw_prefix.watchlist_i01 ON &mw_prefix.watchlist (wl_namespace, wl_title);
-
-
-CREATE TABLE &mw_prefix.searchindex (
-  si_page      NUMBER NOT NULL,
-  si_title     VARCHAR2(255),
-  si_text      CLOB NOT NULL
-);
-CREATE UNIQUE INDEX &mw_prefix.searchindex_u01 ON &mw_prefix.searchindex (si_page);
-
-CREATE TABLE &mw_prefix.interwiki (
-  iw_prefix  VARCHAR2(32)   NOT NULL,
-  iw_url     VARCHAR2(127)  NOT NULL,
-  iw_api       BLOB NOT NULL,
-  iw_wikiid VARCHAR2(64),
-  iw_local   CHAR(1)  NOT NULL,
-  iw_trans   CHAR(1)  DEFAULT '0' NOT NULL
-);
-CREATE UNIQUE INDEX &mw_prefix.interwiki_u01 ON &mw_prefix.interwiki (iw_prefix);
-
-CREATE TABLE &mw_prefix.querycache (
-  qc_type       VARCHAR2(32)      NOT NULL,
-  qc_value      NUMBER  DEFAULT 0 NOT NULL,
-  qc_namespace  NUMBER  DEFAULT 0 NOT NULL,
-  qc_title      VARCHAR2(255)      NOT NULL
-);
-CREATE INDEX &mw_prefix.querycache_u01 ON &mw_prefix.querycache (qc_type,qc_value);
-
-CREATE TABLE &mw_prefix.objectcache (
-  keyname  VARCHAR2(255)              ,
-  value    BLOB,
-  exptime  TIMESTAMP(6) WITH TIME ZONE  NOT NULL
-);
-CREATE INDEX &mw_prefix.objectcache_i01 ON &mw_prefix.objectcache (exptime);
-
-
-CREATE SEQUENCE logging_log_id_seq;
-CREATE TABLE &mw_prefix.logging (
-  log_id          NUMBER      NOT NULL,
-  log_type        VARCHAR2(10)         NOT NULL,
-  log_action      VARCHAR2(10)         NOT NULL,
-  log_timestamp   TIMESTAMP(6) WITH TIME ZONE  NOT NULL,
-  log_user        NUMBER                DEFAULT 0 NOT NULL,
-  log_user_text        VARCHAR2(255),
-  log_actor       NUMBER                DEFAULT 0 NOT NULL,
-  log_namespace   NUMBER     DEFAULT 0 NOT NULL,
-  log_title       VARCHAR2(255)         NOT NULL,
-  log_page                             NUMBER,
-  log_comment_id  NUMBER NOT NULL,
-  log_params      CLOB,
-  log_deleted     CHAR(1)      DEFAULT '0' NOT NULL
-);
-ALTER TABLE &mw_prefix.logging ADD CONSTRAINT &mw_prefix.logging_pk PRIMARY KEY (log_id);
-ALTER TABLE &mw_prefix.logging ADD CONSTRAINT &mw_prefix.logging_fk1 FOREIGN KEY (log_user) REFERENCES &mw_prefix.mwuser(user_id) ON DELETE SET NULL DEFERRABLE INITIALLY DEFERRED;
-ALTER TABLE &mw_prefix.logging ADD CONSTRAINT &mw_prefix.logging_fk2 FOREIGN KEY (log_comment_id) REFERENCES &mw_prefix."COMMENT"(comment_id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED;
-CREATE INDEX &mw_prefix.logging_i01 ON &mw_prefix.logging (log_type, log_timestamp);
-CREATE INDEX &mw_prefix.logging_i02 ON &mw_prefix.logging (log_user, log_timestamp);
-CREATE INDEX &mw_prefix.logging_i03 ON &mw_prefix.logging (log_namespace, log_title, log_timestamp);
-CREATE INDEX &mw_prefix.logging_i04 ON &mw_prefix.logging (log_timestamp);
-CREATE INDEX &mw_prefix.logging_i05 ON &mw_prefix.logging (log_type, log_action, log_timestamp);
-CREATE INDEX &mw_prefix.logging_i06 ON &mw_prefix.logging (log_user_text, log_type, log_timestamp);
-CREATE INDEX &mw_prefix.logging_i07 ON &mw_prefix.logging (log_user_text, log_timestamp);
-CREATE INDEX &mw_prefix.actor_time ON &mw_prefix.logging (log_actor, log_timestamp);
-CREATE INDEX &mw_prefix.log_actor_type_time ON &mw_prefix.logging (log_actor, log_type, log_timestamp);
-/*$mw$*/
-CREATE TRIGGER &mw_prefix.logging_seq_trg BEFORE INSERT ON &mw_prefix.logging
-       FOR EACH ROW WHEN (new.log_id IS NULL)
-BEGIN
-       &mw_prefix.lastval_pkg.setLastval(logging_log_id_seq.nextval, :new.log_id);
-END;
-/*$mw$*/
-
-CREATE TABLE &mw_prefix.log_search (
-  ls_field VARCHAR2(32) NOT NULL,
-  ls_value VARCHAR2(255) NOT NULL,
-  ls_log_id NuMBER DEFAULT 0 NOT NULL
-);
-ALTER TABLE &mw_prefix.log_search ADD CONSTRAINT log_search_pk PRIMARY KEY (ls_field,ls_value,ls_log_id);
-CREATE INDEX &mw_prefix.log_search_i01 ON &mw_prefix.log_search (ls_log_id);
-
-
-CREATE SEQUENCE job_job_id_seq;
-CREATE TABLE &mw_prefix.job (
-  job_id         NUMBER   NOT NULL,
-  job_cmd        VARCHAR2(60)      NOT NULL,
-  job_namespace  NUMBER  DEFAULT 0 NOT NULL,
-  job_title      VARCHAR2(255)      NOT NULL,
-  job_timestamp         TIMESTAMP(6) WITH TIME ZONE NULL,
-  job_params     CLOB      NOT NULL,
-  job_random NUMBER DEFAULT 0 NOT NULL,
-  job_token VARCHAR2(32),
-  job_token_timestamp TIMESTAMP(6) WITH TIME ZONE,
-  job_sha1 VARCHAR2(32),
-  job_attempts NUMBER DEFAULT 0 NOT NULL
-);
-ALTER TABLE &mw_prefix.job ADD CONSTRAINT &mw_prefix.job_pk PRIMARY KEY (job_id);
-CREATE INDEX &mw_prefix.job_i01 ON &mw_prefix.job (job_cmd, job_namespace, job_title);
-CREATE INDEX &mw_prefix.job_i02 ON &mw_prefix.job (job_timestamp);
-CREATE INDEX &mw_prefix.job_i03 ON &mw_prefix.job (job_sha1);
-CREATE INDEX &mw_prefix.job_i04 ON &mw_prefix.job (job_cmd,job_token,job_random);
-CREATE INDEX &mw_prefix.job_i05 ON &mw_prefix.job (job_attempts);
-/*$mw$*/
-CREATE TRIGGER &mw_prefix.job_seq_trg BEFORE INSERT ON &mw_prefix.job
-       FOR EACH ROW WHEN (new.job_id IS NULL)
-BEGIN
-       &mw_prefix.lastval_pkg.setLastval(job_job_id_seq.nextval, :new.job_id);
-END;
-/*$mw$*/
-
-CREATE TABLE &mw_prefix.querycache_info (
-  qci_type       VARCHAR2(32) NOT NULL,
-  qci_timestamp  TIMESTAMP(6) WITH TIME ZONE NULL
-);
-CREATE UNIQUE INDEX &mw_prefix.querycache_info_u01 ON &mw_prefix.querycache_info (qci_type);
-
-CREATE TABLE &mw_prefix.redirect (
-  rd_from       NUMBER  NOT NULL,
-  rd_namespace  NUMBER DEFAULT 0 NOT NULL,
-  rd_title      VARCHAR2(255)     NOT NULL,
-  rd_interwiki  VARCHAR2(32),
-  rd_fragment   VARCHAR2(255)
-);
-ALTER TABLE &mw_prefix.redirect ADD CONSTRAINT &mw_prefix.redirect_fk1 FOREIGN KEY (rd_from) REFERENCES &mw_prefix.page(page_id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED;
-CREATE INDEX &mw_prefix.redirect_i01 ON &mw_prefix.redirect (rd_namespace,rd_title,rd_from);
-
-CREATE TABLE &mw_prefix.querycachetwo (
-  qcc_type          VARCHAR2(32)     NOT NULL,
-  qcc_value         NUMBER  DEFAULT 0 NOT NULL,
-  qcc_namespace     NUMBER  DEFAULT 0 NOT NULL,
-  qcc_title         VARCHAR2(255),
-  qcc_namespacetwo  NUMBER  DEFAULT 0 NOT NULL,
-  qcc_titletwo      VARCHAR2(255)
-);
-CREATE INDEX &mw_prefix.querycachetwo_i01 ON &mw_prefix.querycachetwo (qcc_type,qcc_value);
-CREATE INDEX &mw_prefix.querycachetwo_i02 ON &mw_prefix.querycachetwo (qcc_type,qcc_namespace,qcc_title);
-CREATE INDEX &mw_prefix.querycachetwo_i03 ON &mw_prefix.querycachetwo (qcc_type,qcc_namespacetwo,qcc_titletwo);
-
-CREATE SEQUENCE page_restrictions_pr_id_seq;
-CREATE TABLE &mw_prefix.page_restrictions (
-  pr_id      NUMBER      NOT NULL,
-  pr_page    NUMBER      NOT NULL,
-  pr_type    VARCHAR2(255)         NOT NULL,
-  pr_level   VARCHAR2(255)         NOT NULL,
-  pr_cascade NUMBER     NOT NULL,
-  pr_user    NUMBER          NULL,
-  pr_expiry  TIMESTAMP(6) WITH TIME ZONE      NULL
-);
-ALTER TABLE &mw_prefix.page_restrictions ADD CONSTRAINT &mw_prefix.page_restrictions_pk PRIMARY KEY (pr_id);
-ALTER TABLE &mw_prefix.page_restrictions ADD CONSTRAINT &mw_prefix.page_restrictions_fk1 FOREIGN KEY (pr_page) REFERENCES &mw_prefix.page(page_id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED;
-CREATE UNIQUE INDEX &mw_prefix.page_restrictions_u01 ON &mw_prefix.page_restrictions (pr_page,pr_type);
-CREATE INDEX &mw_prefix.page_restrictions_i01 ON &mw_prefix.page_restrictions (pr_type,pr_level);
-CREATE INDEX &mw_prefix.page_restrictions_i02 ON &mw_prefix.page_restrictions (pr_level);
-CREATE INDEX &mw_prefix.page_restrictions_i03 ON &mw_prefix.page_restrictions (pr_cascade);
-/*$mw$*/
-CREATE TRIGGER &mw_prefix.page_restrictions_seq_trg BEFORE INSERT ON &mw_prefix.page_restrictions
-       FOR EACH ROW WHEN (new.pr_id IS NULL)
-BEGIN
-       &mw_prefix.lastval_pkg.setLastval(page_restrictions_pr_id_seq.nextval, :new.pr_id);
-END;
-/*$mw$*/
-
-CREATE TABLE &mw_prefix.protected_titles (
-  pt_namespace   NUMBER           DEFAULT 0 NOT NULL,
-  pt_title       VARCHAR2(255)    NOT NULL,
-  pt_user        NUMBER                  NOT NULL,
-  pt_reason_id   NUMBER NOT NULL,
-  pt_timestamp   TIMESTAMP(6) WITH TIME ZONE  NOT NULL,
-  pt_expiry      VARCHAR2(14) NOT NULL,
-  pt_create_perm VARCHAR2(60) NOT NULL
-);
-ALTER TABLE &mw_prefix.protected_titles ADD CONSTRAINT &mw_prefix.protected_titles_fk1 FOREIGN KEY (pt_reason_id) REFERENCES &mw_prefix."COMMENT"(comment_id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED;
-CREATE UNIQUE INDEX &mw_prefix.protected_titles_u01 ON &mw_prefix.protected_titles (pt_namespace,pt_title);
-CREATE INDEX &mw_prefix.protected_titles_i01 ON &mw_prefix.protected_titles (pt_timestamp);
-
-CREATE TABLE &mw_prefix.page_props (
-  pp_page NUMBER NOT NULL,
-  pp_propname VARCHAR2(60) NOT NULL,
-  pp_value BLOB NOT NULL
-);
-CREATE UNIQUE INDEX &mw_prefix.page_props_u01 ON &mw_prefix.page_props (pp_page,pp_propname);
-
-
-CREATE TABLE &mw_prefix.updatelog (
-  ul_key VARCHAR2(255) NOT NULL,
-  ul_value BLOB
-);
-ALTER TABLE &mw_prefix.updatelog ADD CONSTRAINT &mw_prefix.updatelog_pk PRIMARY KEY (ul_key);
-
-CREATE TABLE &mw_prefix.change_tag (
-  ct_id NUMBER NOT NULL,
-  ct_rc_id NUMBER NULL,
-  ct_log_id NUMBER NULL,
-  ct_rev_id NUMBER NULL,
-  ct_params BLOB NULL,
-  ct_tag_id NUMBER NOT NULL
-);
-ALTER TABLE &mw_prefix.change_tag ADD CONSTRAINT &mw_prefix.change_tag_pk PRIMARY KEY (ct_id);
-
-CREATE UNIQUE INDEX &mw_prefix.change_tag_u04 ON &mw_prefix.change_tag (ct_rc_id,ct_tag_id);
-CREATE UNIQUE INDEX &mw_prefix.change_tag_u05 ON &mw_prefix.change_tag (ct_log_id,ct_tag_id);
-CREATE UNIQUE INDEX &mw_prefix.change_tag_u06 ON &mw_prefix.change_tag (ct_rev_id,ct_tag_id);
-
-CREATE INDEX &mw_prefix.change_tag_i02 ON &mw_prefix.change_tag (ct_tag_id,ct_rc_id,ct_rev_id,ct_log_id);
-
--- This table is not used unless profiling is turned on
---CREATE TABLE &mw_prefix.profiling (
---  pf_count   NUMBER          DEFAULT 0 NOT NULL,
---  pf_time    NUMBER(18,10)   DEFAULT 0 NOT NULL,
---  pf_memory  NUMBER(18,10)   DEFAULT 0 NOT NULL,
---  pf_name    VARCHAR2(255),
---  pf_server  VARCHAR2(30)
---);
---CREATE UNIQUE INDEX &mw_prefix.profiling_u01 ON &mw_prefix.profiling (pf_name, pf_server);
-
-CREATE INDEX &mw_prefix.si_title_idx ON &mw_prefix.searchindex(si_title) INDEXTYPE IS ctxsys.context;
-CREATE INDEX &mw_prefix.si_text_idx ON &mw_prefix.searchindex(si_text) INDEXTYPE IS ctxsys.context;
-
-CREATE TABLE &mw_prefix.l10n_cache (
-  lc_lang varchar2(32) NOT NULL,
-  lc_key varchar2(255) NOT NULL,
-  lc_value clob NOT NULL
-);
-CREATE INDEX &mw_prefix.l10n_cache_u01 ON &mw_prefix.l10n_cache (lc_lang, lc_key);
-
-CREATE TABLE &mw_prefix.module_deps (
-  md_module VARCHAR2(255) NOT NULL,
-  md_skin VARCHAR2(32) NOT NULL,
-  md_deps BLOB NOT NULL
-);
-CREATE UNIQUE INDEX &mw_prefix.module_deps_u01 ON &mw_prefix.module_deps (md_module, md_skin);
-
-CREATE SEQUENCE sites_site_id_seq MINVALUE 0 START WITH 0;
-CREATE TABLE &mw_prefix.sites (
-  site_id NUMBER NOT NULL,
-  site_global_key VARCHAR2(32) NOT NULL,
-  site_type VARCHAR2(32) NOT NULL,
-  site_group VARCHAR2(32) NOT NULL,
-  site_source VARCHAR2(32) NOT NULL,
-  site_language VARCHAR2(32) NOT NULL,
-  site_protocol VARCHAR2(32) NOT NULL,
-  site_domain VARCHAR2(255) NOT NULL,
-  site_data BLOB NOT NULL,
-  site_forward NUMBER(1) NOT NULL,
-  site_config BLOB NOT NULL
-);
-ALTER TABLE &mw_prefix.sites ADD CONSTRAINT &mw_prefix.sites_pk PRIMARY KEY (site_id);
-CREATE UNIQUE INDEX &mw_prefix.sites_u01 ON &mw_prefix.sites (site_global_key);
-CREATE INDEX &mw_prefix.sites_i01 ON &mw_prefix.sites (site_type);
-CREATE INDEX &mw_prefix.sites_i02 ON &mw_prefix.sites (site_group);
-CREATE INDEX &mw_prefix.sites_i03 ON &mw_prefix.sites (site_source);
-CREATE INDEX &mw_prefix.sites_i04 ON &mw_prefix.sites (site_language);
-CREATE INDEX &mw_prefix.sites_i05 ON &mw_prefix.sites (site_protocol);
-CREATE INDEX &mw_prefix.sites_i06 ON &mw_prefix.sites (site_domain);
-CREATE INDEX &mw_prefix.sites_i07 ON &mw_prefix.sites (site_forward);
-/*$mw$*/
-CREATE TRIGGER &mw_prefix.sites_seq_trg BEFORE INSERT ON &mw_prefix.sites
-       FOR EACH ROW WHEN (new.site_id IS NULL)
-BEGIN
-       &mw_prefix.lastval_pkg.setLastval(sites_site_id_seq.nextval, :new.site_id);
-END;
-/*$mw$*/
-
-CREATE TABLE &mw_prefix.site_identifiers (
-  si_site NUMBER NOT NULL,
-  si_type VARCHAR2(32) NOT NULL,
-  si_key VARCHAR2(32) NOT NULL
-);
-CREATE UNIQUE INDEX &mw_prefix.site_identifiers_u01 ON &mw_prefix.site_identifiers (si_type, si_key);
-CREATE INDEX &mw_prefix.site_identifiers_i01 ON &mw_prefix.site_identifiers (si_site);
-CREATE INDEX &mw_prefix.site_identifiers_i02 ON &mw_prefix.site_identifiers (si_key);
-
--- do not prefix this table as it breaks parserTests
-CREATE TABLE wiki_field_info_full (
-table_name VARCHAR2(35) NOT NULL,
-column_name VARCHAR2(35) NOT NULL,
-data_default VARCHAR2(4000),
-data_length NUMBER NOT NULL,
-data_type VARCHAR2(106),
-not_null CHAR(1) NOT NULL,
-prim NUMBER(1),
-uniq NUMBER(1),
-nonuniq NUMBER(1)
-);
-ALTER TABLE wiki_field_info_full ADD CONSTRAINT wiki_field_info_full_pk PRIMARY KEY (table_name, column_name);
-
-/*$mw$*/
-CREATE PROCEDURE fill_wiki_info IS
-       BEGIN
-               DELETE      wiki_field_info_full;
-
-               FOR x_rec IN (SELECT t.table_name table_name, t.column_name,
-                                                                                               t.data_default, t.data_length, t.data_type,
-                                                                                               DECODE (t.nullable, 'Y', '1', 'N', '0') not_null,
-                                                                                               (SELECT 1
-                                                                                                               FROM user_cons_columns ucc,
-                                                                                                                               user_constraints uc
-                                                                                                       WHERE ucc.table_name = t.table_name
-                                                                                                               AND ucc.column_name = t.column_name
-                                                                                                               AND uc.constraint_name = ucc.constraint_name
-                                                                                                               AND uc.constraint_type = 'P'
-                                                                                                               AND ROWNUM < 2) prim,
-                                                                                               (SELECT 1
-                                                                                                               FROM user_ind_columns uic,
-                                                                                                                               user_indexes ui
-                                                                                                       WHERE uic.table_name = t.table_name
-                                                                                                               AND uic.column_name = t.column_name
-                                                                                                               AND ui.index_name = uic.index_name
-                                                                                                               AND ui.uniqueness = 'UNIQUE'
-                                                                                                               AND ROWNUM < 2) uniq,
-                                                                                               (SELECT 1
-                                                                                                               FROM user_ind_columns uic,
-                                                                                                                               user_indexes ui
-                                                                                                       WHERE uic.table_name = t.table_name
-                                                                                                               AND uic.column_name = t.column_name
-                                                                                                               AND ui.index_name = uic.index_name
-                                                                                                               AND ui.uniqueness = 'NONUNIQUE'
-                                                                                                               AND ROWNUM < 2) nonuniq
-                                                                               FROM user_tab_columns t, user_tables ut
-                                                                       WHERE ut.table_name = t.table_name)
-               LOOP
-                       INSERT INTO wiki_field_info_full
-                                                                       (table_name, column_name,
-                                                                               data_default, data_length,
-                                                                               data_type, not_null, prim,
-                                                                               uniq, nonuniq
-                                                                       )
-                                               VALUES (x_rec.table_name, x_rec.column_name,
-                                                                               x_rec.data_default, x_rec.data_length,
-                                                                               x_rec.data_type, x_rec.not_null, x_rec.prim,
-                                                                               x_rec.uniq, x_rec.nonuniq
-                                                                       );
-               END LOOP;
-               COMMIT;
-END;
-/*$mw$*/
-
-/*$mw$*/
-CREATE OR REPLACE PROCEDURE duplicate_table(p_tabname   IN VARCHAR2,
-                                            p_oldprefix IN VARCHAR2,
-                                            p_newprefix IN VARCHAR2,
-                                            p_temporary IN BOOLEAN) IS
-  e_table_not_exist EXCEPTION;
-  PRAGMA EXCEPTION_INIT(e_table_not_exist, -00942);
-  l_temp_ei_sql VARCHAR2(2000);
-  l_temporary   BOOLEAN := p_temporary;
-BEGIN
-  BEGIN
-    EXECUTE IMMEDIATE 'DROP TABLE ' || p_newprefix || p_tabname ||
-                      ' CASCADE CONSTRAINTS PURGE';
-  EXCEPTION
-    WHEN e_table_not_exist THEN
-      NULL;
-  END;
-  IF (p_tabname = 'SEARCHINDEX') THEN
-    l_temporary := FALSE;
-  END IF;
-  IF (l_temporary) THEN
-    EXECUTE IMMEDIATE 'CREATE GLOBAL TEMPORARY TABLE ' || p_newprefix ||
-                      p_tabname ||
-                      ' ON COMMIT PRESERVE ROWS AS SELECT * FROM ' ||
-                      p_oldprefix || p_tabname || ' WHERE ROWNUM = 0';
-  ELSE
-    EXECUTE IMMEDIATE 'CREATE TABLE ' || p_newprefix || p_tabname ||
-                      ' AS SELECT * FROM ' || p_oldprefix || p_tabname ||
-                      ' WHERE ROWNUM = 0';
-  END IF;
-  FOR rc IN (SELECT column_name, data_default
-               FROM user_tab_columns
-              WHERE table_name = p_oldprefix || p_tabname
-                AND data_default IS NOT NULL) LOOP
-    EXECUTE IMMEDIATE 'ALTER TABLE ' || p_newprefix || p_tabname ||
-                      ' MODIFY ' || rc.column_name || ' DEFAULT ' ||
-                      SUBSTR(rc.data_default, 1, 2000);
-  END LOOP;
-  FOR rc IN (SELECT REPLACE(REPLACE(DBMS_LOB.SUBSTR(DBMS_METADATA.get_ddl('CONSTRAINT',
-                                                                          constraint_name),
-                                                    32767,
-                                                    1),
-                                    USER || '"."' || p_oldprefix,
-                                    USER || '"."' || p_newprefix),
-                            '"' || constraint_name || '"',
-                            '"' || p_newprefix || constraint_name || '"') DDLVC2,
-                    constraint_name
-               FROM user_constraints uc
-              WHERE table_name = p_oldprefix || p_tabname
-                AND constraint_type = 'P') LOOP
-    l_temp_ei_sql := SUBSTR(rc.ddlvc2, 1, INSTR(rc.ddlvc2, 'PCTFREE') - 1);
-    l_temp_ei_sql := SUBSTR(l_temp_ei_sql,
-                            1,
-                            INSTR(l_temp_ei_sql,
-                                  ')',
-                                  INSTR(l_temp_ei_sql, 'PRIMARY KEY') + 1) + 1);
-    IF nvl(length(l_temp_ei_sql), 0) > 0 THEN
-      EXECUTE IMMEDIATE l_temp_ei_sql;
-    END IF;
-  END LOOP;
-  IF (NOT l_temporary) THEN
-    FOR rc IN (SELECT REPLACE(DBMS_LOB.SUBSTR(DBMS_METADATA.get_ddl('REF_CONSTRAINT',
-                                                                    constraint_name),
-                                              32767,
-                                              1),
-                              USER || '"."' || p_oldprefix,
-                              USER || '"."' || p_newprefix) DDLVC2,
-                      constraint_name
-                 FROM user_constraints uc
-                WHERE table_name = p_oldprefix || p_tabname
-                  AND constraint_type = 'R') LOOP
-      IF nvl(length(l_temp_ei_sql), 0) > 0 AND
-         INSTR(l_temp_ei_sql, 'PRIMARY KEY') = 0 THEN
-        EXECUTE IMMEDIATE l_temp_ei_sql;
-      END IF;
-    END LOOP;
-  END IF;
-  FOR rc IN (SELECT REPLACE(REPLACE(DBMS_LOB.SUBSTR(DBMS_METADATA.get_ddl('INDEX',
-                                                                          index_name),
-                                                    32767,
-                                                    1),
-                                    USER || '"."' || p_oldprefix,
-                                    USER || '"."' || p_newprefix),
-                            '"' || index_name || '"',
-                            '"' || p_newprefix || index_name || '"') DDLVC2,
-                    index_name,
-                    index_type
-               FROM user_indexes ui
-              WHERE table_name = p_oldprefix || p_tabname
-                AND index_type NOT IN ('LOB', 'DOMAIN')
-                AND NOT EXISTS
-              (SELECT NULL
-                       FROM user_constraints
-                      WHERE table_name = ui.table_name
-                        AND constraint_name = ui.index_name)) LOOP
-    l_temp_ei_sql := SUBSTR(rc.ddlvc2, 1, INSTR(rc.ddlvc2, 'PCTFREE') - 1);
-    l_temp_ei_sql := SUBSTR(l_temp_ei_sql,
-                            1,
-                            INSTR(l_temp_ei_sql,
-                                  ')',
-                                  INSTR(l_temp_ei_sql,
-                                        '"' || USER || '"."' || p_newprefix || '"') + 1) + 1);
-    IF nvl(length(l_temp_ei_sql), 0) > 0 THEN
-      EXECUTE IMMEDIATE l_temp_ei_sql;
-    END IF;
-  END LOOP;
-  FOR rc IN (SELECT REPLACE(REPLACE(DBMS_LOB.SUBSTR(DBMS_METADATA.get_ddl('INDEX',
-                                                                          index_name),
-                                                    32767,
-                                                    1),
-                                    USER || '"."' || p_oldprefix,
-                                    USER || '"."' || p_newprefix),
-                            '"' || index_name || '"',
-                            '"' || p_newprefix || index_name || '"') DDLVC2,
-                    index_name,
-                    index_type
-               FROM user_indexes ui
-              WHERE table_name = p_oldprefix || p_tabname
-                AND index_type = 'DOMAIN'
-                AND NOT EXISTS
-              (SELECT NULL
-                       FROM user_constraints
-                      WHERE table_name = ui.table_name
-                        AND constraint_name = ui.index_name)) LOOP
-    l_temp_ei_sql := rc.ddlvc2;
-    IF nvl(length(l_temp_ei_sql), 0) > 0 THEN
-      EXECUTE IMMEDIATE l_temp_ei_sql;
-    END IF;
-  END LOOP;
-  FOR rc IN (SELECT REPLACE(REPLACE(UPPER(DBMS_LOB.SUBSTR(DBMS_METADATA.get_ddl('TRIGGER',
-                                                                                trigger_name),
-                                                          32767,
-                                                          1)),
-                                    USER || '"."' || p_oldprefix,
-                                    USER || '"."' || p_newprefix),
-                            ' ON ' || p_oldprefix || p_tabname,
-                            ' ON ' || p_newprefix || p_tabname) DDLVC2,
-                    trigger_name
-               FROM user_triggers
-              WHERE table_name = p_oldprefix || p_tabname) LOOP
-    l_temp_ei_sql := SUBSTR(rc.ddlvc2, 1, INSTR(rc.ddlvc2, 'ALTER ') - 1);
-    IF nvl(length(l_temp_ei_sql), 0) > 0 THEN
-      EXECUTE IMMEDIATE l_temp_ei_sql;
-    END IF;
-  END LOOP;
-END;
-
-/*$mw$*/
-
-/*$mw$*/
-CREATE OR REPLACE FUNCTION BITOR (x IN NUMBER, y IN NUMBER) RETURN NUMBER AS
-BEGIN
-  RETURN (x + y - BITAND(x, y));
-END;
-/*$mw$*/
-
-/*$mw$*/
-CREATE OR REPLACE FUNCTION BITNOT (x IN NUMBER) RETURN NUMBER AS
-BEGIN
-  RETURN (4294967295 - x);
-END;
-/*$mw$*/
-
-CREATE OR REPLACE TYPE GET_OUTPUT_TYPE IS TABLE OF VARCHAR2(255);
-
-/*$mw$*/
-CREATE OR REPLACE FUNCTION GET_OUTPUT_LINES RETURN GET_OUTPUT_TYPE PIPELINED AS
-  v_line VARCHAR2(255);
-  v_status INTEGER := 0;
-BEGIN
-
-  LOOP
-    DBMS_OUTPUT.GET_LINE(v_line, v_status);
-    IF (v_status = 0) THEN RETURN; END IF;
-    PIPE ROW (v_line);
-  END LOOP;
-  RETURN;
-EXCEPTION
-  WHEN OTHERS THEN
-    RETURN;
-END;
-/*$mw$*/
-
-/*$mw$*/
-CREATE OR REPLACE FUNCTION GET_SEQUENCE_VALUE(seq IN VARCHAR2) RETURN NUMBER AS
-       v_value NUMBER;
-BEGIN
-       EXECUTE IMMEDIATE 'SELECT '||seq||'.NEXTVAL INTO :outVar FROM DUAL' INTO v_value;
-       RETURN v_value;
-END;
-/*$mw$*/
diff --git a/maintenance/oracle/update-keys.sql b/maintenance/oracle/update-keys.sql
deleted file mode 100644 (file)
index 7761d0c..0000000
+++ /dev/null
@@ -1,29 +0,0 @@
--- SQL to insert update keys into the initial tables after a
--- fresh installation of MediaWiki's database.
--- This is read and executed by the install script; you should
--- not have to run it by itself unless doing a manual install.
--- Insert keys here if either the unnecessary would cause heavy
--- processing or could potentially cause trouble by lowering field
--- sizes, adding constraints, etc.
--- When adjusting field sizes, it is recommended removing old
--- patches but to play safe, update keys should also inserted here.
-
--- The /*_*/ comments in this and other files are
--- replaced with the defined table prefix by the installer
--- and updater scripts. If you are installing or running
--- updates manually, you will need to manually insert the
--- table prefix if any when running these scripts.
---
-
-INSERT INTO /*_*/updatelog (ul_key, ul_value)
-       VALUES( 'filearchive-fa_major_mime-patch-fa_major_mime-chemical.sql', null );
-INSERT INTO /*_*/updatelog (ul_key, ul_value)
-       VALUES( 'image-img_major_mime-patch-img_major_mime-chemical.sql', null );
-INSERT INTO /*_*/updatelog (ul_key, ul_value)
-       VALUES( 'oldimage-oi_major_mime-patch-oi_major_mime-chemical.sql', null );
-INSERT INTO /*_*/updatelog (ul_key, ul_value)
-       VALUES( 'user_groups-ug_group-patch-ug_group-length-increase-255.sql', null );
-INSERT INTO /*_*/updatelog (ul_key, ul_value)
-       VALUES( 'user_former_groups-ufg_group-patch-ufg_group-length-increase-255.sql', null );
-INSERT INTO /*_*/updatelog (ul_key, ul_value)
-       VALUES( 'user_properties-up_property-patch-up_property.sql', null );
diff --git a/maintenance/oracle/user.sql b/maintenance/oracle/user.sql
deleted file mode 100644 (file)
index 0a36ac4..0000000
+++ /dev/null
@@ -1,18 +0,0 @@
--- defines must comply with ^define\s*([^\s=]*)\s*=\s?'\{\$([^\}]*)\}';
-define wiki_user='{$wgDBuser}';
-define wiki_pass='{$wgDBpassword}';
-define def_ts='{$_OracleDefTS}';
-define temp_ts='{$_OracleTempTS}';
-
-create user &wiki_user. identified by &wiki_pass. default tablespace &def_ts. temporary tablespace &temp_ts. quota unlimited on &def_ts.;
-grant connect, resource to &wiki_user.;
-grant alter session to &wiki_user.;
-grant ctxapp to &wiki_user.;
-grant execute on ctx_ddl to &wiki_user.;
-grant create view to &wiki_user.;
-grant create synonym to &wiki_user.;
-grant create table to &wiki_user.;
-grant create sequence to &wiki_user.;
-grant create trigger to &wiki_user.;
-grant create type to &wiki_user.;
-grant create procedure to &wiki_user.;
index 6c46597..2be690b 100644 (file)
@@ -74,12 +74,15 @@ class PopulateChangeTagDef extends LoggedUpdateMaintenance {
        private function setUserDefinedTags() {
                $dbr = $this->lbFactory->getMainLB()->getConnection( DB_REPLICA );
 
-               $userTags = $dbr->selectFieldValues(
-                       'valid_tag',
-                       'vt_tag',
-                       [],
-                       __METHOD__
-               );
+               $userTags = null;
+               if ( $dbr->tableExists( 'valid_tag' ) ) {
+                       $userTags = $dbr->selectFieldValues(
+                               'valid_tag',
+                               'vt_tag',
+                               [],
+                               __METHOD__
+                       );
+               }
 
                if ( empty( $userTags ) ) {
                        $this->output( "No user defined tags to set, moving on...\n" );
index e3c20a2..2945308 100644 (file)
@@ -1265,7 +1265,7 @@ class ParserTestRunner {
                        $tables[] = 'revision_actor_temp';
                }
 
-               if ( in_array( $this->db->getType(), [ 'mysql', 'sqlite', 'oracle' ] ) ) {
+               if ( in_array( $this->db->getType(), [ 'mysql', 'sqlite' ] ) ) {
                        array_push( $tables, 'searchindex' );
                }
 
@@ -1305,11 +1305,7 @@ class ParserTestRunner {
                $this->db = MediaWikiServices::getInstance()->getDBLoadBalancer()->getConnection( DB_MASTER );
                $dbType = $this->db->getType();
 
-               if ( $dbType == 'oracle' ) {
-                       $suspiciousPrefixes = [ 'pt_', MediaWikiTestCase::ORA_DB_PREFIX ];
-               } else {
-                       $suspiciousPrefixes = [ 'parsertest_', MediaWikiTestCase::DB_PREFIX ];
-               }
+               $suspiciousPrefixes = [ 'parsertest_', MediaWikiTestCase::DB_PREFIX ];
                if ( in_array( $wgDBprefix, $suspiciousPrefixes ) ) {
                        throw new MWException( "\$wgDBprefix=$wgDBprefix suggests DB setup is already done" );
                }
@@ -1324,23 +1320,13 @@ class ParserTestRunner {
                }
 
                $temporary = $this->useTemporaryTables || $dbType == 'postgres';
-               $prefix = $dbType != 'oracle' ? 'parsertest_' : 'pt_';
+               $prefix = 'parsertest_';
 
                $this->dbClone = new CloneDatabase( $this->db, $this->listTables(), $prefix );
                $this->dbClone->useTemporaryTables( $temporary );
                $this->dbClone->cloneTableStructure();
                CloneDatabase::changePrefix( $prefix );
 
-               if ( $dbType == 'oracle' ) {
-                       $this->db->query( 'BEGIN FILL_WIKI_INFO; END;' );
-                       # Insert 0 user to prevent FK violations
-
-                       # Anonymous user
-                       $this->db->insert( 'user', [
-                               'user_id' => 0,
-                               'user_name' => 'Anonymous' ] );
-               }
-
                $teardown[] = function () {
                        $this->teardownDatabase();
                };
@@ -1542,15 +1528,7 @@ class ParserTestRunner {
                $tables = $this->listTables();
 
                foreach ( $tables as $table ) {
-                       if ( $this->db->getType() == 'oracle' ) {
-                               $this->db->query( "DROP TABLE pt_$table DROP CONSTRAINTS" );
-                       } else {
-                               $this->db->query( "DROP TABLE `parsertest_$table`" );
-                       }
-               }
-
-               if ( $this->db->getType() == 'oracle' ) {
-                       $this->db->query( 'BEGIN FILL_WIKI_INFO; END;' );
+                       $this->db->query( "DROP TABLE `parsertest_$table`" );
                }
        }
 
index 7046a7f..6599041 100644 (file)
@@ -15817,7 +15817,7 @@ parsoid=wt2html,wt2wt,html2html
 ###################
 
 !! test
-Link to image page- image page normally doesn't exists, hence edit link
+Link to image page- image page normally doesn't exist, hence edit link
 Add test with existing image page
 #<p><a href="/wiki/File:Test" title="Image:Test">Image:test</a>
 !! wikitext
index 07d135d..2f00132 100644 (file)
@@ -136,10 +136,9 @@ abstract class MediaWikiIntegrationTestCase extends PHPUnit\Framework\TestCase {
        private $overriddenServices = [];
 
        /**
-        * Table name prefixes. Oracle likes it shorter.
+        * Table name prefix.
         */
        const DB_PREFIX = 'unittest_';
-       const ORA_DB_PREFIX = 'ut_';
 
        /**
         * @var array
@@ -149,7 +148,6 @@ abstract class MediaWikiIntegrationTestCase extends PHPUnit\Framework\TestCase {
                'mysql',
                'sqlite',
                'postgres',
-               'oracle'
        ];
 
        public function __construct( $name = null, array $data = [], $dataName = '' ) {
@@ -635,6 +633,9 @@ abstract class MediaWikiIntegrationTestCase extends PHPUnit\Framework\TestCase {
                        }
                }
 
+               // Clear any cached test users so they don't retain references to old services
+               TestUserRegistry::clear();
+
                // Re-enable any disabled deprecation warnings
                MWDebug::clearLog();
                // Restore mw globals
@@ -1318,7 +1319,7 @@ abstract class MediaWikiIntegrationTestCase extends PHPUnit\Framework\TestCase {
         * @since 1.32
         */
        public static function getTestPrefixFor( IDatabase $db ) {
-               return $db->getType() == 'oracle' ? self::ORA_DB_PREFIX : self::DB_PREFIX;
+               return self::DB_PREFIX;
        }
 
        /**
@@ -1411,32 +1412,6 @@ abstract class MediaWikiIntegrationTestCase extends PHPUnit\Framework\TestCase {
         * @since 1.32
         */
        protected function addCoreDBData() {
-               if ( $this->db->getType() == 'oracle' ) {
-                       # Insert 0 user to prevent FK violations
-                       # Anonymous user
-                       if ( !$this->db->selectField( 'user', '1', [ 'user_id' => 0 ] ) ) {
-                               $this->db->insert( 'user', [
-                                       'user_id' => 0,
-                                       'user_name' => 'Anonymous' ], __METHOD__, [ 'IGNORE' ] );
-                       }
-
-                       # Insert 0 page to prevent FK violations
-                       # Blank page
-                       if ( !$this->db->selectField( 'page', '1', [ 'page_id' => 0 ] ) ) {
-                               $this->db->insert( 'page', [
-                                       'page_id' => 0,
-                                       'page_namespace' => 0,
-                                       'page_title' => ' ',
-                                       'page_restrictions' => null,
-                                       'page_is_redirect' => 0,
-                                       'page_is_new' => 0,
-                                       'page_random' => 0,
-                                       'page_touched' => $this->db->timestamp(),
-                                       'page_latest' => 0,
-                                       'page_len' => 0 ], __METHOD__, [ 'IGNORE' ] );
-                       }
-               }
-
                SiteStatsInit::doPlaceholderInit();
 
                User::resetIdByNameCache();
@@ -1520,7 +1495,7 @@ abstract class MediaWikiIntegrationTestCase extends PHPUnit\Framework\TestCase {
                        $prefix = self::getTestPrefixFor( $db );
                }
 
-               if ( ( $db->getType() == 'oracle' || !self::$useTemporaryTables ) && self::$reuseDB ) {
+               if ( !self::$useTemporaryTables && self::$reuseDB ) {
                        $db->tablePrefix( $prefix );
                        return false;
                }
@@ -1609,12 +1584,6 @@ abstract class MediaWikiIntegrationTestCase extends PHPUnit\Framework\TestCase {
                        return;
                }
 
-               // Assuming this isn't needed for External Store database, and not sure if the procedure
-               // would be available there.
-               if ( $db->getType() == 'oracle' ) {
-                       $db->query( 'BEGIN FILL_WIKI_INFO; END;', __METHOD__ );
-               }
-
                Hooks::run( 'UnitTestsAfterDatabaseSetup', [ $db, $prefix ] );
        }
 
@@ -1928,7 +1897,7 @@ abstract class MediaWikiIntegrationTestCase extends PHPUnit\Framework\TestCase {
                                $tablesUsed = array_unique( array_merge( $tablesUsed, $pageTables ) );
                        }
 
-                       // Postgres, Oracle, and MSSQL all use mwuser/pagecontent
+                       // Postgres uses mwuser/pagecontent
                        // instead of user/text. But Postgres does not remap the
                        // table name in tableExists(), so we mark the real table
                        // names as being used.
@@ -1971,7 +1940,7 @@ abstract class MediaWikiIntegrationTestCase extends PHPUnit\Framework\TestCase {
                        return;
                }
 
-               $truncate = in_array( $db->getType(), [ 'oracle', 'mysql' ] );
+               $truncate = in_array( $db->getType(), [ 'mysql' ] );
 
                if ( $truncate ) {
                        $db->query( 'TRUNCATE TABLE ' . $db->tableName( $tableName ), __METHOD__ );
index 4400475..f227ae1 100644 (file)
@@ -49,10 +49,9 @@ function wfRequireOnceInGlobalScope( $fileName ) {
 define( 'MEDIAWIKI', true );
 define( 'MW_PHPUNIT_TEST', true );
 
-// We don't use a settings file here but some code still assumes that one exists
-define( 'MW_CONFIG_FILE', 'LocalSettings.php' );
-
 $IP = realpath( __DIR__ . '/../../' );
+// We don't use a settings file here but some code still assumes that one exists
+define( 'MW_CONFIG_FILE', "$IP/LocalSettings.php" );
 
 // these variables must be defined before setup runs
 $GLOBALS['IP'] = $IP;
index 4544e9b..f546dc2 100644 (file)
@@ -27,7 +27,6 @@ class MergeHistoryTest extends MediaWikiTestCase {
         * @param string|bool $error Expected error for test (or true for no error)
         */
        public function testIsValidMerge( $source, $dest, $timestamp, $error ) {
-               $this->setMwGlobals( 'wgContentHandlerUseDB', false );
                if ( $timestamp === true ) {
                        // Although this timestamp is after the latest timestamp of both pages,
                        // MergeHistory should select the latest source timestamp up to this which should
index 9166666..31a0e79 100644 (file)
@@ -18,7 +18,11 @@ class MovePageTest extends MediaWikiTestCase {
         * @covers MovePage::isValidFileMove
         */
        public function testIsValidMove( $old, $new, $error ) {
-               $this->setMwGlobals( 'wgContentHandlerUseDB', false );
+               global $wgMultiContentRevisionSchemaMigrationStage;
+               if ( $wgMultiContentRevisionSchemaMigrationStage === SCHEMA_COMPAT_OLD ) {
+                       // We can only set this to false with the old schema
+                       $this->setMwGlobals( 'wgContentHandlerUseDB', false );
+               }
                $mp = new MovePage(
                        Title::newFromText( $old ),
                        Title::newFromText( $new )
@@ -35,16 +39,23 @@ class MovePageTest extends MediaWikiTestCase {
         * This should be kept in sync with TitleTest::provideTestIsValidMoveOperation
         */
        public static function provideIsValidMove() {
-               return [
+               global $wgMultiContentRevisionSchemaMigrationStage;
+               $ret = [
                        // for MovePage::isValidMove
                        [ 'Test', 'Test', 'selfmove' ],
                        [ 'Special:FooBar', 'Test', 'immobile-source-namespace' ],
                        [ 'Test', 'Special:FooBar', 'immobile-target-namespace' ],
-                       [ 'MediaWiki:Common.js', 'Help:Some wikitext page', 'bad-target-model' ],
                        [ 'Page', 'File:Test.jpg', 'nonfile-cannot-move-to-file' ],
                        // for MovePage::isValidFileMove
                        [ 'File:Test.jpg', 'Page', 'imagenocrossnamespace' ],
                ];
+               if ( $wgMultiContentRevisionSchemaMigrationStage === SCHEMA_COMPAT_OLD ) {
+                       // The error can only occur if $wgContentHandlerUseDB is false, which doesn't work with
+                       // the new schema, so omit the test in that case
+                       array_push( $ret,
+                               [ 'MediaWiki:Common.js', 'Help:Some wikitext page', 'bad-target-model' ] );
+               }
+               return $ret;
        }
 
        /**
index 913f56d..e8f0873 100644 (file)
@@ -296,9 +296,15 @@ class TitleTest extends MediaWikiTestCase {
         * @covers Title::isValidMoveOperation
         */
        public function testIsValidMoveOperation( $source, $target, $expected ) {
+               global $wgMultiContentRevisionSchemaMigrationStage;
+
                $this->hideDeprecated( 'Title::isValidMoveOperation' );
 
-               $this->setMwGlobals( 'wgContentHandlerUseDB', false );
+               if ( $wgMultiContentRevisionSchemaMigrationStage === SCHEMA_COMPAT_OLD ) {
+                       // We can only set this to false with the old schema
+                       $this->setMwGlobals( 'wgContentHandlerUseDB', false );
+               }
+
                $title = Title::newFromText( $source );
                $nt = Title::newFromText( $target );
                $errors = $title->isValidMoveOperation( $nt, false );
@@ -313,16 +319,24 @@ class TitleTest extends MediaWikiTestCase {
        }
 
        public static function provideTestIsValidMoveOperation() {
-               return [
+               global $wgMultiContentRevisionSchemaMigrationStage;
+               $ret = [
                        // for Title::isValidMoveOperation
                        [ 'Some page', '', 'badtitletext' ],
                        [ 'Test', 'Test', 'selfmove' ],
                        [ 'Special:FooBar', 'Test', 'immobile-source-namespace' ],
                        [ 'Test', 'Special:FooBar', 'immobile-target-namespace' ],
-                       [ 'MediaWiki:Common.js', 'Help:Some wikitext page', 'bad-target-model' ],
                        [ 'Page', 'File:Test.jpg', 'nonfile-cannot-move-to-file' ],
                        [ 'File:Test.jpg', 'Page', 'imagenocrossnamespace' ],
                ];
+               if ( $wgMultiContentRevisionSchemaMigrationStage === SCHEMA_COMPAT_OLD ) {
+                       // The error can only occur if $wgContentHandlerUseDB is false, which doesn't work with
+                       // the new schema, so omit the test in that case
+                       array_push( $ret,
+                               [ 'MediaWiki:Common.js', 'Help:Some wikitext page', 'bad-target-model' ]
+                       );
+               }
+               return $ret;
        }
 
        /**
@@ -810,7 +824,7 @@ class TitleTest extends MediaWikiTestCase {
                // Tell Title it doesn't know whether it exists
                $title->mArticleID = -1;
 
-               // Tell the link cache it doesn't exists when it really does
+               // Tell the link cache it doesn't exist when it really does
                $linkCache->clearLink( $title );
                $linkCache->addBadLinkObj( $title );
 
diff --git a/tests/phpunit/includes/api/ApiFeedContributionsTest.php b/tests/phpunit/includes/api/ApiFeedContributionsTest.php
new file mode 100644 (file)
index 0000000..f3ec565
--- /dev/null
@@ -0,0 +1,19 @@
+<?php
+
+/**
+ * @group API
+ * @group medium
+ *
+ * @covers ApiFeedContributions
+ */
+class ApiFeedContributionsTest extends ApiTestCase {
+
+       public function testInvalidExternalUser() {
+               $this->setExpectedException( ApiUsageException::class,
+                       'Invalid value ">" for user parameter "user"' );
+               $this->doApiRequest( [
+                       'action' => 'feedcontributions',
+                       'user' => '>'
+               ] );
+       }
+}
index 1595cd2..1016f28 100644 (file)
@@ -451,8 +451,6 @@ class LBFactoryTest extends MediaWikiTestCase {
         * @covers \Wikimedia\Rdbms\LoadBalancer::getConnection
         * @covers \Wikimedia\Rdbms\DatabaseMysqlBase::doSelectDomain
         * @covers \Wikimedia\Rdbms\DatabaseMysqlBase::selectDB
-        * @covers \Wikimedia\Rdbms\DatabaseMssql::selectDB
-        * @covers DatabaseOracle::selectDB
         */
        public function testNiceDomains() {
                global $wgDBname;
@@ -538,8 +536,6 @@ class LBFactoryTest extends MediaWikiTestCase {
         * @covers \Wikimedia\Rdbms\LoadBalancer::getConnection
         * @covers \Wikimedia\Rdbms\DatabaseMysqlBase::doSelectDomain
         * @covers \Wikimedia\Rdbms\DatabaseMysqlBase::selectDB
-        * @covers \Wikimedia\Rdbms\DatabaseMssql::selectDB
-        * @covers DatabaseOracle::selectDB
         */
        public function testTrickyDomain() {
                global $wgDBname;
@@ -611,8 +607,6 @@ class LBFactoryTest extends MediaWikiTestCase {
         * @covers \Wikimedia\Rdbms\LoadBalancer::getConnection
         * @covers \Wikimedia\Rdbms\DatabaseMysqlBase::doSelectDomain
         * @covers \Wikimedia\Rdbms\DatabaseMysqlBase::selectDB
-        * @covers \Wikimedia\Rdbms\DatabaseMssql::selectDB
-        * @covers DatabaseOracle::selectDB
         */
        public function testInvalidSelectDB() {
                if ( wfGetDB( DB_MASTER )->databasesAreIndependent() ) {
@@ -692,8 +686,6 @@ class LBFactoryTest extends MediaWikiTestCase {
         * @covers \Wikimedia\Rdbms\LoadBalancer::getConnection
         * @covers \Wikimedia\Rdbms\LoadBalancer::redefineLocalDomain
         * @covers \Wikimedia\Rdbms\DatabaseMysqlBase::selectDB
-        * @covers \Wikimedia\Rdbms\DatabaseMssql::selectDB
-        * @covers DatabaseOracle::selectDB
         */
        public function testRedefineLocalDomain() {
                global $wgDBname;
index bf5326a..981b4ad 100644 (file)
@@ -341,9 +341,9 @@ class LoadBalancerTest extends MediaWikiTestCase {
        private function assertWriteAllowed( Database $db ) {
                $table = $db->tableName( 'some_table' );
                // Trigger a transaction so that rollback() will remove all the tables.
-               // Don't do this for MySQL/Oracle as they auto-commit transactions for DDL
+               // Don't do this for MySQL as it auto-commits transactions for DDL
                // statements such as CREATE TABLE.
-               $useAtomicSection = in_array( $db->getType(), [ 'sqlite', 'postgres', 'mssql' ], true );
+               $useAtomicSection = in_array( $db->getType(), [ 'sqlite', 'postgres' ], true );
                try {
                        $db->dropTable( 'some_table' ); // clear for sanity
                        $this->assertNotEquals( $db::STATUS_TRX_ERROR, $db->trxStatus() );
index aeb0a70..9ec86bc 100644 (file)
@@ -112,21 +112,48 @@ class BagOStuffTest extends MediaWikiTestCase {
        /**
         * @covers MediumSpecificBagOStuff::changeTTL
         */
-       public function testChangeTTL() {
-               $now = 1563892142;
+       public function testChangeTTLRenew() {
+               $now = microtime( true ); // need real time
                $this->cache->setMockTime( $now );
 
                $key = $this->cache->makeKey( self::TEST_KEY );
                $value = 'meow';
 
-               $this->cache->add( $key, $value, 5 );
+               $this->cache->add( $key, $value, 60 );
                $this->assertEquals( $value, $this->cache->get( $key ) );
-               $this->assertTrue( $this->cache->changeTTL( $key, 10 ) );
-               $this->assertTrue( $this->cache->changeTTL( $key, 10 ) );
+               $this->assertTrue( $this->cache->changeTTL( $key, 120 ) );
+               $this->assertTrue( $this->cache->changeTTL( $key, 120 ) );
                $this->assertTrue( $this->cache->changeTTL( $key, 0 ) );
                $this->assertEquals( $this->cache->get( $key ), $value );
+
                $this->cache->delete( $key );
                $this->assertFalse( $this->cache->changeTTL( $key, 15 ) );
+       }
+
+       /**
+        * @covers MediumSpecificBagOStuff::changeTTL
+        */
+       public function testChangeTTLExpireRel() {
+               $now = microtime( true ); // need real time
+               $this->cache->setMockTime( $now );
+
+               $key = $this->cache->makeKey( self::TEST_KEY );
+               $value = 'meow';
+
+               $this->cache->add( $key, $value, 5 );
+               $this->assertTrue( $this->cache->changeTTL( $key, -3600 ) );
+               $this->assertFalse( $this->cache->get( $key ) );
+       }
+
+       /**
+        * @covers MediumSpecificBagOStuff::changeTTL
+        */
+       public function testChangeTTLExpireAbs() {
+               $now = microtime( true ); // need real time
+               $this->cache->setMockTime( $now );
+
+               $key = $this->cache->makeKey( self::TEST_KEY );
+               $value = 'meow';
 
                $this->cache->add( $key, $value, 5 );
                $this->assertTrue( $this->cache->changeTTL( $key, $now - 3600 ) );
diff --git a/tests/phpunit/includes/libs/rdbms/database/DatabaseMssqlTest.php b/tests/phpunit/includes/libs/rdbms/database/DatabaseMssqlTest.php
deleted file mode 100644 (file)
index 414042d..0000000
+++ /dev/null
@@ -1,62 +0,0 @@
-<?php
-
-use Wikimedia\Rdbms\Database;
-use Wikimedia\Rdbms\DatabaseMssql;
-
-class DatabaseMssqlTest extends PHPUnit\Framework\TestCase {
-
-       use MediaWikiCoversValidator;
-       use PHPUnit4And6Compat;
-
-       /**
-        * @return PHPUnit_Framework_MockObject_MockObject|DatabaseMssql
-        */
-       private function getMockDb() {
-               return $this->getMockBuilder( DatabaseMssql::class )
-                       ->disableOriginalConstructor()
-                       ->setMethods( null )
-                       ->getMock();
-       }
-
-       public function provideBuildSubstring() {
-               yield [ 'someField', 1, 2, 'SUBSTRING(someField,1,2)' ];
-               yield [ 'someField', 1, null, 'SUBSTRING(someField,1,2147483647)' ];
-               yield [ 'someField', 1, 3333333333, 'SUBSTRING(someField,1,3333333333)' ];
-       }
-
-       /**
-        * @covers Wikimedia\Rdbms\DatabaseMssql::buildSubstring
-        * @dataProvider provideBuildSubstring
-        */
-       public function testBuildSubstring( $input, $start, $length, $expected ) {
-               $mockDb = $this->getMockDb();
-               $output = $mockDb->buildSubstring( $input, $start, $length );
-               $this->assertSame( $expected, $output );
-       }
-
-       public function provideBuildSubstring_invalidParams() {
-               yield [ -1, 1 ];
-               yield [ 1, -1 ];
-               yield [ 1, 'foo' ];
-               yield [ 'foo', 1 ];
-               yield [ null, 1 ];
-               yield [ 0, 1 ];
-       }
-
-       /**
-        * @covers Wikimedia\Rdbms\DatabaseMssql::buildSubstring
-        * @dataProvider provideBuildSubstring_invalidParams
-        */
-       public function testBuildSubstring_invalidParams( $start, $length ) {
-               $mockDb = $this->getMockDb();
-               $this->setExpectedException( InvalidArgumentException::class );
-               $mockDb->buildSubstring( 'foo', $start, $length );
-       }
-
-       /**
-        * @covers \Wikimedia\Rdbms\DatabaseMssql::getAttributes
-        */
-       public function testAttributes() {
-               $this->assertTrue( DatabaseMssql::getAttributes()[Database::ATTR_SCHEMAS_AS_TABLE_GROUPS] );
-       }
-}
index a775dd7..93b1bf8 100644 (file)
@@ -9,7 +9,6 @@ use Wikimedia\Rdbms\TransactionProfiler;
 use Wikimedia\TestingAccessWrapper;
 use Wikimedia\Rdbms\DatabaseSqlite;
 use Wikimedia\Rdbms\DatabasePostgres;
-use Wikimedia\Rdbms\DatabaseMssql;
 use Wikimedia\Rdbms\DBUnexpectedError;
 
 class DatabaseTest extends PHPUnit\Framework\TestCase {
@@ -37,7 +36,6 @@ class DatabaseTest extends PHPUnit\Framework\TestCase {
                $this->assertInstanceOf( DatabasePostgres::class, Database::factory( 'Postgres', $p, $m ) );
 
                $x = $p + [ 'port' => 10000, 'UseWindowsAuth' => false ];
-               $this->assertInstanceOf( DatabaseMssql::class, Database::factory( 'mssql', $x, $m ) );
 
                $x = $p + [ 'dbFilePath' => 'some/file.sqlite' ];
                $this->assertInstanceOf( DatabaseSqlite::class, Database::factory( 'sqlite', $x, $m ) );
index 871ea91..59fe401 100644 (file)
@@ -17,7 +17,7 @@ class RCFeedIntegrationTest extends MediaWikiTestCase {
                        'wgServerName' => 'example.org',
                        'wgScriptPath' => '/w',
                        'wgDBname' => 'example',
-                       'wgDBprefix' => '',
+                       'wgDBprefix' => $this->dbPrefix(),
                        'wgRCFeeds' => [],
                        'wgRCEngines' => [],
                ] );
@@ -57,7 +57,7 @@ class RCFeedIntegrationTest extends MediaWikiTestCase {
                                                'server_url' => 'https://example.org',
                                                'server_name' => 'example.org',
                                                'server_script_path' => '/w',
-                                               'wiki' => 'example',
+                                               'wiki' => 'example-' . $this->dbPrefix(),
                                        ] ),
                                        $line
                                );
index f318df1..0e8b775 100644 (file)
@@ -141,8 +141,7 @@ class ParserTestTopLevelSuite extends PHPUnit_Framework_TestSuite {
                $lb = MediaWikiServices::getInstance()->getDBLoadBalancer();
                $db = $lb->getConnection( DB_MASTER );
                $type = $db->getType();
-               $prefix = $type === 'oracle' ?
-                       MediaWikiTestCase::ORA_DB_PREFIX : MediaWikiTestCase::DB_PREFIX;
+               $prefix = MediaWikiTestCase::DB_PREFIX;
                $this->oldTablePrefix = $db->tablePrefix();
                MediaWikiTestCase::setupTestDB( $db, $prefix );
                CloneDatabase::changePrefix( $prefix );
diff --git a/tests/phpunit/unit/includes/db/DatabaseOracleTest.php b/tests/phpunit/unit/includes/db/DatabaseOracleTest.php
deleted file mode 100644 (file)
index ff1c3ca..0000000
+++ /dev/null
@@ -1,49 +0,0 @@
-<?php
-
-class DatabaseOracleTest extends MediaWikiUnitTestCase {
-
-       /**
-        * @return PHPUnit_Framework_MockObject_MockObject|DatabaseOracle
-        */
-       private function getMockDb() {
-               return $this->getMockBuilder( DatabaseOracle::class )
-                       ->disableOriginalConstructor()
-                       ->setMethods( null )
-                       ->getMock();
-       }
-
-       public function provideBuildSubstring() {
-               yield [ 'someField', 1, 2, 'SUBSTR(someField,1,2)' ];
-               yield [ 'someField', 1, null, 'SUBSTR(someField,1)' ];
-       }
-
-       /**
-        * @covers DatabaseOracle::buildSubstring
-        * @dataProvider provideBuildSubstring
-        */
-       public function testBuildSubstring( $input, $start, $length, $expected ) {
-               $mockDb = $this->getMockDb();
-               $output = $mockDb->buildSubstring( $input, $start, $length );
-               $this->assertSame( $expected, $output );
-       }
-
-       public function provideBuildSubstring_invalidParams() {
-               yield [ -1, 1 ];
-               yield [ 1, -1 ];
-               yield [ 1, 'foo' ];
-               yield [ 'foo', 1 ];
-               yield [ null, 1 ];
-               yield [ 0, 1 ];
-       }
-
-       /**
-        * @covers DatabaseOracle::buildSubstring
-        * @dataProvider provideBuildSubstring_invalidParams
-        */
-       public function testBuildSubstring_invalidParams( $start, $length ) {
-               $mockDb = $this->getMockDb();
-               $this->setExpectedException( InvalidArgumentException::class );
-               $mockDb->buildSubstring( 'foo', $start, $length );
-       }
-
-}
diff --git a/tests/phpunit/unit/includes/installer/OracleInstallerTest.php b/tests/phpunit/unit/includes/installer/OracleInstallerTest.php
deleted file mode 100644 (file)
index 69b5552..0000000
+++ /dev/null
@@ -1,48 +0,0 @@
-<?php
-
-/**
- * @group Installer
- */
-class OracleInstallerTest extends \MediaWikiUnitTestCase {
-
-       /**
-        * @dataProvider provideOracleConnectStrings
-        * @covers OracleInstaller::checkConnectStringFormat
-        */
-       public function testCheckConnectStringFormat( $expected, $connectString, $msg = '' ) {
-               $validity = $expected ? 'should be valid' : 'should NOT be valid';
-               $msg = "'$connectString' ($msg) $validity.";
-               $this->assertEquals( $expected,
-                       OracleInstaller::checkConnectStringFormat( $connectString ),
-                       $msg
-               );
-       }
-
-       /**
-        * Provider to test OracleInstaller::checkConnectStringFormat()
-        */
-       function provideOracleConnectStrings() {
-               // expected result, connectString[, message]
-               return [
-                       [ true, 'simple_01', 'Simple TNS name' ],
-                       [ true, 'simple_01.world', 'TNS name with domain' ],
-                       [ true, 'simple_01.domain.net', 'TNS name with domain' ],
-                       [ true, 'host123', 'Host only' ],
-                       [ true, 'host123.domain.net', 'FQDN only' ],
-                       [ true, '//host123.domain.net', 'FQDN URL only' ],
-                       [ true, '123.223.213.132', 'Host IP only' ],
-                       [ true, 'host:1521', 'Host and port' ],
-                       [ true, 'host:1521/service', 'Host, port and service' ],
-                       [ true, 'host:1521/service:shared', 'Host, port, service and shared server type' ],
-                       [ true, 'host:1521/service:dedicated', 'Host, port, service and dedicated server type' ],
-                       [ true, 'host:1521/service:pooled', 'Host, port, service and pooled server type' ],
-                       [
-                               true,
-                               'host:1521/service:shared/instance1',
-                               'Host, port, service, server type and instance'
-                       ],
-                       [ true, 'host:1521//instance1', 'Host, port and instance' ],
-               ];
-       }
-
-}
index cd67a93..b95efdf 100644 (file)
@@ -31,6 +31,8 @@ class TitleValueTest extends \MediaWikiUnitTestCase {
                        [ NS_MAIN, '', 'fragment', '', true, false ],
                        [ NS_USER, 'TestThis', 'stuff', '', true, false ],
                        [ NS_USER, 'TestThis', '', 'baz', false, true ],
+                       [ NS_MAIN, 'foo bar', '', '', false, false ],
+                       [ NS_MAIN, 'foo_bar', '', '', false, false ],
                ];
        }
 
@@ -44,7 +46,8 @@ class TitleValueTest extends \MediaWikiUnitTestCase {
 
                $this->assertEquals( $ns, $title->getNamespace() );
                $this->assertTrue( $title->inNamespace( $ns ) );
-               $this->assertEquals( $text, $title->getText() );
+               $this->assertEquals( strtr( $text, ' ', '_' ), $title->getDbKey() );
+               $this->assertEquals( strtr( $text, '_', ' ' ), $title->getText() );
                $this->assertEquals( $fragment, $title->getFragment() );
                $this->assertEquals( $hasFragment, $title->hasFragment() );
                $this->assertEquals( $interwiki, $title->getInterwiki() );
@@ -60,7 +63,6 @@ class TitleValueTest extends \MediaWikiUnitTestCase {
                        [ NS_MAIN, 5, 'fragment', '' ],
                        [ NS_MAIN, null, 'fragment', '' ],
                        [ NS_USER, '', 'fragment', '' ],
-                       [ NS_MAIN, 'foo bar', '', '' ],
                        [ NS_MAIN, 'bar_', '', '' ],
                        [ NS_MAIN, '_foo', '', '' ],
                        [ NS_MAIN, ' eek ', '', '' ],