"apihelp-options-description": "Zmienia preferencje bieżącego użytkownika.\n\nMożna ustawiać tylko opcje zarejestrowane w rdzeniu, w zainstalowanych rozszerzeniach lub z kluczami o prefiksie <code>userjs-</code> (do wykorzystywania przez skrypty użytkowników).",
"apihelp-options-param-reset": "Resetuj preferencje do domyślnych.",
"apihelp-options-param-resetkinds": "Lista typów opcji do zresetowania, jeżeli ustawiono opcję <var>$1reset</var>.",
- "apihelp-options-param-change": "Lista zmian, w formacie nazwa=wartość (np. skin=vector). Wartość nie może zawierać znaku pionowej kreski. Jeżeli nie zostanie podana wartość (a nawet znak równości), np., optionname|otheroption|..., to opcja zostanie zresetowana do jej wartości domyślnej.",
+ "apihelp-options-param-change": "Lista zmian, w formacie nazwa=wartość (np. skin=vector). Jeżeli nie zostanie podana wartość (nawet znak równości), np., optionname|otheroption|..., to opcja zostanie zresetowana do jej wartości domyślnej. Jeżeli jakakolwiek podawana wartość zawiera znak pionowej kreski (<kbd>|</kbd>), użyj [[Special:ApiHelp/main#main/datatypes|alternatywnego separatora wielu wartości]] aby operacja się powiodła.",
"apihelp-options-param-optionname": "Nazwa opcji, która powinna być ustawiona na wartość <var>$1optionvalue</var>.",
"apihelp-options-param-optionvalue": "Wartość opcji, określona w <var>$1optionname</var>.",
"apihelp-options-example-reset": "Resetuj wszystkie preferencje.",
"apihelp-checktoken-param-token": "Chave a testar.",
"apihelp-checktoken-param-maxtokenage": "Validade máxima da chave, em segundos.",
"apihelp-checktoken-example-simple": "Testar a validade de uma chave <kbd>csrf</kbd>.",
+ "apihelp-clearhasmsg-description": "Limpa a indicação <code>hasmsg</code> do utilizador atual.",
"apihelp-compare-param-fromtitle": "Primeiro título a comparar.",
"apihelp-compare-param-fromid": "Primeiro identificador de página a comparar.",
"apihelp-compare-param-fromrev": "Primeira revisão a comparar.",
"apihelp-query+filearchive-example-simple": "Mostrar lista de todos os ficheiros eliminados",
"apihelp-query+filerepoinfo-param-prop": "Propriedades do repositório a obter (em algumas wikis poderão haver mais disponíveis):\n;apiurl:URL para a API do repositório - útil para obter informação de imagens do servidor.\n;name:A chave para o repositório - usada, por exemplo, em <var>[[mw:Manual:$wgForeignFileRepos|$wgForeignFileRepos]]</var> e nos valores de retorno de [[Special:ApiHelp/query+imageinfo|imageinfo]].\n;displayname:O nome legível da wiki repositório.\n;rooturl:URL de raiz para endereços de imagens.\n;local:Se o repositório é o local ou não.",
"apihelp-query+fileusage-param-prop": "Que propriedades obter:",
+ "apihelp-query+fileusage-paramvalue-prop-redirect": "Indicar se a página é um redirecionamento.",
"apihelp-query+imageinfo-paramvalue-prop-url": "Devolve URL para o ficheiro e página de descrição.",
"apihelp-query+imageinfo-paramvalue-prop-thumbmime": "Adiciona o tipo MIME da miniatura (requer URL e o parâmetro $1urlwidth).",
"apihelp-query+imageinfo-param-urlwidth": "Se $2prop=url está definido, será devolvido um URL para uma imagem redimensionada com este comprimento.\nPor razões de desempenho, se esta opção for usada não serão devolvidas mais de $1 imagens redimensionadas.",
"api-help-param-integer-minmax": "{{PLURAL:$1|值}}必须介于$2和$3之间。",
"api-help-param-upload": "必须被公布为使用multipart/form-data的一次文件上传。",
"api-help-param-multi-separate": "通过<kbd>|</kbd>或[[Special:ApiHelp/main#main/datatypes|替代物]]隔开各值。",
- "api-help-param-multi-max": "值的最高数字是{{PLURAL:$1|$1}}(对于机器人则是{{PLURAL:$2|$2}})。",
+ "api-help-param-multi-max": "值的最大数量是{{PLURAL:$1|$1}}(对于机器人则是{{PLURAL:$2|$2}})。",
"api-help-param-default": "默认:$1",
"api-help-param-default-empty": "默认:<span class=\"apihelp-empty\">(空)</span>",
"api-help-param-token": "从[[Special:ApiHelp/query+tokens|action=query&meta=tokens]]取回的“$1”令牌",
"config-header-oracle": "Oracle设置",
"config-header-mssql": "Microsoft SQL Server设置",
"config-invalid-db-type": "无效的数据库类型",
- "config-missing-db-name": "您必须为“{{int:config-db-name}}”输入内容。",
- "config-missing-db-host": "您必须为“{{int:config-db-host}}”输入内容。",
- "config-missing-db-server-oracle": "您必须为“{{int:config-db-host-oracle}}”输入内容。",
+ "config-missing-db-name": "您必须为“{{int:config-db-name}}”输入一个值。",
+ "config-missing-db-host": "您必须为“{{int:config-db-host}}”输入一个值。",
+ "config-missing-db-server-oracle": "您必须为“{{int:config-db-host-oracle}}”输入一个值。",
"config-invalid-db-server-oracle": "无效的数据库TNS“$1”。请使用“TNS 名称”或者一个“轻松连接”字符串([http://docs.oracle.com/cd/E11882_01/network.112/e10836/naming.htm Oracle 命名方法])",
"config-invalid-db-name": "无效的数据库名称“$1”。请只使用ASCII字母(a-z、A-Z)、数字(0-9)、下划线(_)和连字号(-)。",
"config-invalid-db-prefix": "无效的数据库前缀“$1”。请只使用ASCII字母(a-z、A-Z)、数字(0-9)、下划线(_)和连字号(-)。",
"config-mysql-utf8": "UTF-8",
"config-mysql-charset-help": "在<strong>二进制模式</strong>下,MediaWiki会将UTF-8编码的文本存于数据库的二进制字段中。相对于MySQL的UTF-8模式,这种方法效率更高,并允许您使用全范围的Unicode字符。\n\n在<strong>UTF-8模式</strong>下,MySQL将知道您数据使用的字符集,并能适当地提供和转换内容。但这样做您将无法在数据库中存储[https://zh.wikipedia.org/wiki/基本多文种平面 基本多文种平面]以外的字符。",
"config-mssql-auth": "身份验证类型:",
- "config-mssql-install-auth": "选择安装过程中链接数据库时将采用的身份验证方式。\n如果您选择“{{int:config-mssql-windowsauth}}”,将使用运行服务器的用户的身份凭据。",
- "config-mssql-web-auth": "选择Web服务器在通常wiki操作期间用来连接数据库服务器的身份验证方式。\n如果您选择“{{int:config-mssql-windowsauth}}”,将使用运行Web服务器的用户的凭据。",
+ "config-mssql-install-auth": "选择安装过程中链接数据库时将采用的身份验证方式。如果您选择“{{int:config-mssql-windowsauth}}”,将使用运行服务器的用户的身份凭据。",
+ "config-mssql-web-auth": "选择Web服务器在通常wiki操作期间用来连接数据库服务器的身份验证方式。如果您选择“{{int:config-mssql-windowsauth}}”,将使用运行Web服务器的用户的凭据。",
"config-mssql-sqlauth": "SQL Server 身份验证",
"config-mssql-windowsauth": "Windows 身份验证",
"config-site-name": "wiki的名称:",
"config-license-gfdl": "GNU自由文档许可证1.3或更高版本",
"config-license-pd": "公有领域",
"config-license-cc-choose": "选择自定义的知识共享许可证",
- "config-license-help": "许多公共wiki将所有用户贡献置于[http://freedomdefined.org/Definition 自由许可证]之下。这有助于构建社区的主人翁意识,并鼓励长期贡献。对于非公共wiki或公司wiki,这并非必要条件。\n\n如果您希望使用来自维基百科的内容,并希望维基百科能接受复制自您的wiki的内容,您应当选择<strong>{{int:config-license-cc-by-sa}}</strong>\n\nGNU自由文档许可证是维基百科曾经使用过的许可证,并迄今有效。然而,该许可证难以理解,并会增加重用内容的难度。",
+ "config-license-help": "许多公共wiki将所有用户贡献置于[http://freedomdefined.org/Definition 自由许可证]之下。这有助于构建社区的主人翁意识,并鼓励长期贡献。对于非公共wiki或公司wiki,这并非必要条件。\n\n如果您希望使用来自维基百科的内容,并希望维基百科能接受复制自您的wiki的内容,您应当选择<strong>{{int:config-license-cc-by-sa}}</strong>。\n\nGNU自由文档许可证是维基百科曾经使用过的许可证,并迄今有效。然而,该许可证难以理解,并会增加重用内容的难度。",
"config-email-settings": "电子邮件设置",
"config-enable-email": "启用出站电子邮件",
"config-enable-email-help": "如果您希望使用电子邮件功能,请正确配置[http://www.php.net/manual/en/mail.configuration.php PHP的邮件设定]。如果您不需要任何电子邮件功能,请在此处禁用它。",
parent::__construct( $params );
}
- function getType() {
+ public function getType() {
return 'postgres';
}
- function implicitGroupby() {
+ public function implicitGroupby() {
return false;
}
- function implicitOrderby() {
+ public function implicitOrderby() {
return false;
}
- function hasConstraint( $name ) {
+ public function hasConstraint( $name ) {
$conn = $this->getBindingHandle();
$sql = "SELECT 1 FROM pg_catalog.pg_constraint c, pg_catalog.pg_namespace n " .
return $this->numRows( $res );
}
- /**
- * Usually aborts on failure
- * @param string $server
- * @param string $user
- * @param string $password
- * @param string $dbName
- * @throws DBConnectionError|Exception
- * @return resource|bool|null
- */
- function open( $server, $user, $password, $dbName ) {
+ public function open( $server, $user, $password, $dbName ) {
# Test for Postgres support, to avoid suppressed fatal error
if ( !function_exists( 'pg_connect' ) ) {
throw new DBConnectionError(
$this->determineCoreSchema( $this->mSchema );
// The schema to be used is now in the search path; no need for explicit qualification
- $this->mSchema = null;
+ $this->mSchema = '';
return $this->mConn;
}
* @param string $db
* @return bool
*/
- function selectDB( $db ) {
+ public function selectDB( $db ) {
if ( $this->mDBname !== $db ) {
return (bool)$this->open( $this->mServer, $this->mUser, $this->mPassword, $db );
} else {
}
}
- function makeConnectionString( $vars ) {
+ /**
+ * @param string[] $vars
+ * @return string
+ */
+ private function makeConnectionString( $vars ) {
$s = '';
foreach ( $vars as $name => $value ) {
$s .= "$name='" . str_replace( "'", "\\'", $value ) . "' ";
return $s;
}
- /**
- * Closes a database connection, if it is open
- * Returns success, true if already closed
- * @return bool
- */
protected function closeConnection() {
return $this->mConn ? pg_close( $this->mConn ) : true;
}
}
}
- function reportQueryError( $error, $errno, $sql, $fname, $tempIgnore = false ) {
+ public function reportQueryError( $error, $errno, $sql, $fname, $tempIgnore = false ) {
if ( $tempIgnore ) {
/* Check for constraint violation */
if ( $errno === '23505' ) {
parent::reportQueryError( $error, $errno, $sql, $fname, false );
}
- function queryIgnore( $sql, $fname = __METHOD__ ) {
- return $this->query( $sql, $fname, true );
- }
-
- /**
- * @param stdClass|ResultWrapper $res
- * @throws DBUnexpectedError
- */
- function freeResult( $res ) {
+ public function freeResult( $res ) {
if ( $res instanceof ResultWrapper ) {
$res = $res->result;
}
}
}
- /**
- * @param ResultWrapper|stdClass $res
- * @return stdClass
- * @throws DBUnexpectedError
- */
- function fetchObject( $res ) {
+ public function fetchObject( $res ) {
if ( $res instanceof ResultWrapper ) {
$res = $res->result;
}
return $row;
}
- function fetchRow( $res ) {
+ public function fetchRow( $res ) {
if ( $res instanceof ResultWrapper ) {
$res = $res->result;
}
return $row;
}
- function numRows( $res ) {
+ public function numRows( $res ) {
if ( $res instanceof ResultWrapper ) {
$res = $res->result;
}
return $n;
}
- function numFields( $res ) {
+ public function numFields( $res ) {
if ( $res instanceof ResultWrapper ) {
$res = $res->result;
}
return pg_num_fields( $res );
}
- function fieldName( $res, $n ) {
+ public function fieldName( $res, $n ) {
if ( $res instanceof ResultWrapper ) {
$res = $res->result;
}
*
* @return int|null
*/
- function insertId() {
+ public function insertId() {
return $this->mInsertId;
}
- /**
- * @param mixed $res
- * @param int $row
- * @return bool
- */
- function dataSeek( $res, $row ) {
+ public function dataSeek( $res, $row ) {
if ( $res instanceof ResultWrapper ) {
$res = $res->result;
}
return pg_result_seek( $res, $row );
}
- function lastError() {
+ public function lastError() {
if ( $this->mConn ) {
if ( $this->mLastResult ) {
return pg_result_error( $this->mLastResult );
return $this->getLastPHPError() ?: 'No database connection';
}
- function lastErrno() {
+ public function lastErrno() {
if ( $this->mLastResult ) {
return pg_result_error_field( $this->mLastResult, PGSQL_DIAG_SQLSTATE );
} else {
}
}
- function affectedRows() {
+ public function affectedRows() {
if ( !is_null( $this->mAffectedRows ) ) {
// Forced result for simulated queries
return $this->mAffectedRows;
* @param array $options
* @return int
*/
- function estimateRowCount( $table, $vars = '*', $conds = '',
+ public function estimateRowCount( $table, $vars = '*', $conds = '',
$fname = __METHOD__, $options = []
) {
$options['EXPLAIN'] = true;
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 bool|null
- */
- function indexInfo( $table, $index, $fname = __METHOD__ ) {
+ public function indexInfo( $table, $index, $fname = __METHOD__ ) {
$sql = "SELECT indexname FROM pg_indexes WHERE tablename='$table'";
$res = $this->query( $sql, $fname );
if ( !$res ) {
return false;
}
- /**
- * Returns is of attributes used in index
- *
- * @since 1.19
- * @param string $index
- * @param bool|string $schema
- * @return array
- */
- function indexAttributes( $index, $schema = false ) {
+ public function indexAttributes( $index, $schema = false ) {
if ( $schema === false ) {
$schema = $this->getCoreSchema();
}
return $a;
}
- function indexUnique( $table, $index, $fname = __METHOD__ ) {
+ public function indexUnique( $table, $index, $fname = __METHOD__ ) {
$sql = "SELECT indexname FROM pg_indexes WHERE tablename='{$table}'" .
" AND indexdef LIKE 'CREATE UNIQUE%(" .
$this->strencode( $this->indexName( $index ) ) .
return $res->numRows() > 0;
}
- function selectSQLText(
+ public function selectSQLText(
$table, $vars, $conds = '', $fname = __METHOD__, $options = [], $join_conds = []
) {
// Change the FOR UPDATE option as necessary based on the join conditions. Then pass
* @param array|string $options String or array. Valid options: IGNORE
* @return bool Success of insert operation. IGNORE always returns true.
*/
- function insert( $table, $args, $fname = __METHOD__, $options = [] ) {
+ public function insert( $table, $args, $fname = __METHOD__, $options = [] ) {
if ( !count( $args ) ) {
return true;
}
* @param array $selectOptions
* @return bool
*/
- function nativeInsertSelect( $destTable, $srcTable, $varMap, $conds, $fname = __METHOD__,
- $insertOptions = [], $selectOptions = [] ) {
+ public function nativeInsertSelect(
+ $destTable, $srcTable, $varMap, $conds, $fname = __METHOD__,
+ $insertOptions = [], $selectOptions = []
+ ) {
$destTable = $this->tableName( $destTable );
if ( !is_array( $insertOptions ) ) {
return $res;
}
- function tableName( $name, $format = 'quoted' ) {
+ public function tableName( $name, $format = 'quoted' ) {
// Replace reserved words with better ones
$name = $this->remappedTableName( $name );
return parent::tableName( $name, $format );
}
- /**
- * Return the next in a sequence, save the value for retrieval via insertId()
- *
- * @param string $seqName
- * @return int|null
- */
- function nextSequenceValue( $seqName ) {
+ public function nextSequenceValue( $seqName ) {
$safeseq = str_replace( "'", "''", $seqName );
$res = $this->query( "SELECT nextval('$safeseq')" );
$row = $this->fetchRow( $res );
* @param string $seqName
* @return int
*/
- function currentSequenceValue( $seqName ) {
+ public function currentSequenceValue( $seqName ) {
$safeseq = str_replace( "'", "''", $seqName );
$res = $this->query( "SELECT currval('$safeseq')" );
$row = $this->fetchRow( $res );
return $currval;
}
- # Returns the size of a text field, or -1 for "unlimited"
- function textFieldSize( $table, $field ) {
+ public function textFieldSize( $table, $field ) {
$table = $this->tableName( $table );
$sql = "SELECT t.typname as ftype,a.atttypmod as size
FROM pg_class c, pg_attribute a, pg_type t
return $size;
}
- function limitResult( $sql, $limit, $offset = false ) {
+ public function limitResult( $sql, $limit, $offset = false ) {
return "$sql LIMIT $limit " . ( is_numeric( $offset ) ? " OFFSET {$offset} " : '' );
}
- function wasDeadlock() {
+ public function wasDeadlock() {
return $this->lastErrno() == '40P01';
}
- function duplicateTableStructure(
+ public function duplicateTableStructure(
$oldName, $newName, $temporary = false, $fname = __METHOD__
) {
$newName = $this->addIdentifierQuotes( $newName );
"(LIKE $oldName INCLUDING DEFAULTS)", $fname );
}
- function listTables( $prefix = null, $fname = __METHOD__ ) {
+ public function listTables( $prefix = null, $fname = __METHOD__ ) {
$eschema = $this->addQuotes( $this->getCoreSchema() );
$result = $this->query(
"SELECT tablename FROM pg_tables WHERE schemaname = $eschema", $fname );
return $endArray;
}
- function timestamp( $ts = 0 ) {
+ public function timestamp( $ts = 0 ) {
$ct = new ConvertibleTimestamp( $ts );
return $ct->getTimestamp( TS_POSTGRES );
* @param int $offset
* @return string
*/
- function pg_array_parse( $text, &$output, $limit = false, $offset = 1 ) {
+ private function pg_array_parse( $text, &$output, $limit = false, $offset = 1 ) {
if ( false === $limit ) {
$limit = strlen( $text ) - 1;
$output = [];
return $output;
}
- /**
- * Return aggregated value function call
- * @param array $valuedata
- * @param string $valuename
- * @return array
- */
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-postgres-url}} PostgreSQL]';
}
* @since 1.19
* @return string Default schema for the current session
*/
- function getCurrentSchema() {
+ public function getCurrentSchema() {
$res = $this->query( "SELECT current_schema()", __METHOD__ );
$row = $this->fetchRow( $res );
* @since 1.19
* @return array List of actual schemas for the current sesson
*/
- function getSchemas() {
+ public function getSchemas() {
$res = $this->query( "SELECT current_schemas(false)", __METHOD__ );
$row = $this->fetchRow( $res );
$schemas = [];
* @since 1.19
* @return array How to search for table names schemas for the current user
*/
- function getSearchPath() {
+ public function getSearchPath() {
$res = $this->query( "SHOW search_path", __METHOD__ );
$row = $this->fetchRow( $res );
*
* @param array $search_path List of schemas to be searched by default
*/
- function setSearchPath( $search_path ) {
+ private function setSearchPath( $search_path ) {
$this->query( "SET search_path = " . implode( ", ", $search_path ) );
}
*
* @param string $desiredSchema
*/
- function determineCoreSchema( $desiredSchema ) {
+ private function determineCoreSchema( $desiredSchema ) {
$this->begin( __METHOD__, self::TRANSACTION_INTERNAL );
if ( $this->schemaExists( $desiredSchema ) ) {
if ( in_array( $desiredSchema, $this->getSchemas() ) ) {
* @since 1.19
* @return string Core schema name
*/
- function getCoreSchema() {
+ public function getCoreSchema() {
return $this->mCoreSchema;
}
- /**
- * @return string Version information from the database
- */
- function getServerVersion() {
+ public function getServerVersion() {
if ( !isset( $this->numericVersion ) ) {
$conn = $this->getBindingHandle();
$versionInfo = pg_version( $conn );
* @param bool|string $schema
* @return bool
*/
- function relationExists( $table, $types, $schema = false ) {
+ private function relationExists( $table, $types, $schema = false ) {
if ( !is_array( $types ) ) {
$types = [ $types ];
}
}
/**
- * For backward compatibility, this function checks both tables and
- * views.
+ * For backward compatibility, this function checks both tables and views.
* @param string $table
* @param string $fname
* @param bool|string $schema
* @return bool
*/
- function tableExists( $table, $fname = __METHOD__, $schema = false ) {
+ public function tableExists( $table, $fname = __METHOD__, $schema = false ) {
return $this->relationExists( $table, [ 'r', 'v' ], $schema );
}
- function sequenceExists( $sequence, $schema = false ) {
+ public function sequenceExists( $sequence, $schema = false ) {
return $this->relationExists( $sequence, 'S', $schema );
}
- function triggerExists( $table, $trigger ) {
+ public function triggerExists( $table, $trigger ) {
$q = <<<SQL
SELECT 1 FROM pg_class, pg_namespace, pg_trigger
WHERE relnamespace=pg_namespace.oid AND relkind='r'
return $rows;
}
- function ruleExists( $table, $rule ) {
+ public function ruleExists( $table, $rule ) {
$exists = $this->selectField( 'pg_rules', 'rulename',
[
'rulename' => $rule,
return $exists === $rule;
}
- function constraintExists( $table, $constraint ) {
+ public function constraintExists( $table, $constraint ) {
$sql = sprintf( "SELECT 1 FROM information_schema.table_constraints " .
"WHERE constraint_schema = %s AND table_name = %s AND constraint_name = %s",
$this->addQuotes( $this->getCoreSchema() ),
* @param string $schema
* @return bool
*/
- function schemaExists( $schema ) {
+ public function schemaExists( $schema ) {
if ( !strlen( $schema ) ) {
return false; // short-circuit
}
* @param string $roleName
* @return bool
*/
- function roleExists( $roleName ) {
+ public function roleExists( $roleName ) {
$exists = $this->selectField( '"pg_catalog"."pg_roles"', 1,
[ 'rolname' => $roleName ], __METHOD__ );
* @var string $field
* @return PostgresField|null
*/
- function fieldInfo( $table, $field ) {
+ public function fieldInfo( $table, $field ) {
return PostgresField::fromText( $this, $table, $field );
}
* @param int $index Field number, starting from 0
* @return string
*/
- function fieldType( $res, $index ) {
+ public function fieldType( $res, $index ) {
if ( $res instanceof ResultWrapper ) {
$res = $res->result;
}
return pg_field_type( $res, $index );
}
- /**
- * @param string $b
- * @return Blob
- */
- function encodeBlob( $b ) {
+ public function encodeBlob( $b ) {
return new PostgresBlob( pg_escape_bytea( $b ) );
}
- function decodeBlob( $b ) {
+ public function decodeBlob( $b ) {
if ( $b instanceof PostgresBlob ) {
$b = $b->fetch();
} elseif ( $b instanceof Blob ) {
return pg_unescape_bytea( $b );
}
- function strencode( $s ) {
+ public function strencode( $s ) {
// Should not be called by us
return pg_escape_string( $this->getBindingHandle(), $s );
}
- /**
- * @param string|int|null|bool|Blob $s
- * @return string|int
- */
- function addQuotes( $s ) {
+ public function addQuotes( $s ) {
$conn = $this->getBindingHandle();
if ( is_null( $s ) ) {
return $ins;
}
- /**
- * Various select options
- *
- * @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 ) {
+ public function makeSelectOptions( $options ) {
$preLimitTail = $postLimitTail = '';
$startOpts = $useIndex = $ignoreIndex = '';
return [ $startOpts, $useIndex, $preLimitTail, $postLimitTail, $ignoreIndex ];
}
- function getDBname() {
+ public function getDBname() {
return $this->mDBname;
}
- function getServer() {
+ public function getServer() {
return $this->mServer;
}
- function buildConcat( $stringList ) {
+ public function buildConcat( $stringList ) {
return implode( ' || ', $stringList );
}
return '(' . $this->selectSQLText( $table, $fld, $conds, null, [], $join_conds ) . ')';
}
- /**
- * @param string $field Field or column to cast
- * @return string
- * @since 1.28
- */
public function buildStringCast( $field ) {
return $field . '::text';
}
return parent::streamStatementEnd( $sql, $newLine );
}
- /**
- * Check to see if a named lock is available. This is non-blocking.
- * See http://www.postgresql.org/docs/8.2/static/functions-admin.html#FUNCTIONS-ADVISORY-LOCKS
- *
- * @param string $lockName Name of lock to poll
- * @param string $method Name of method calling us
- * @return bool
- * @since 1.20
- */
public function lockIsFree( $lockName, $method ) {
+ // http://www.postgresql.org/docs/8.2/static/functions-admin.html#FUNCTIONS-ADVISORY-LOCKS
$key = $this->addQuotes( $this->bigintFromLockName( $lockName ) );
$result = $this->query( "SELECT (CASE(pg_try_advisory_lock($key))
WHEN 'f' THEN 'f' ELSE pg_advisory_unlock($key) END) AS lockstatus", $method );
return ( $row->lockstatus === 't' );
}
- /**
- * See http://www.postgresql.org/docs/8.2/static/functions-admin.html#FUNCTIONS-ADVISORY-LOCKS
- * @param string $lockName
- * @param string $method
- * @param int $timeout
- * @return bool
- */
public function lock( $lockName, $method, $timeout = 5 ) {
+ // http://www.postgresql.org/docs/8.2/static/functions-admin.html#FUNCTIONS-ADVISORY-LOCKS
$key = $this->addQuotes( $this->bigintFromLockName( $lockName ) );
$loop = new WaitConditionLoop(
function () use ( $lockName, $key, $timeout, $method ) {
return ( $loop->invoke() === $loop::CONDITION_REACHED );
}
- /**
- * See http://www.postgresql.org/docs/8.2/static/functions-admin.html#FUNCTIONS-ADVISORY-LOCKSFROM
- * PG DOCS: http://www.postgresql.org/docs/8.2/static/functions-admin.html#FUNCTIONS-ADVISORY-LOCKS
- * @param string $lockName
- * @param string $method
- * @return bool
- */
public function unlock( $lockName, $method ) {
+ // http://www.postgresql.org/docs/8.2/static/functions-admin.html#FUNCTIONS-ADVISORY-LOCKS
$key = $this->addQuotes( $this->bigintFromLockName( $lockName ) );
$result = $this->query( "SELECT pg_advisory_unlock($key) as lockstatus", $method );
$row = $this->fetchObject( $result );
return false;
}
+ public function selectDB( $db ) {
+ return false; // doesn't make sense
+ }
+
/**
* @return string SQLite DB file path
* @since 1.25
* IDatabase::insert().
*
* @param string $b
- * @return string
+ * @return string|Blob
*/
public function encodeBlob( $b );
"filehist-filesize": "Veličina datoteke",
"filehist-comment": "Komentar",
"imagelinks": "Upotreba datoteke",
- "linkstoimage": "{{PLURAL:$1|Slijedeća stranica koristi|Slijedećih $1 stranica koriste}} ovu sliku:",
+ "linkstoimage": "{{PLURAL:$1|Sljedeća stranica koristi|Sljedeće $1 stranice koriste|Sljedećih $1 stranica koristi}} ovu datoteku:",
"linkstoimage-more": "Više od $1 {{PLURAL:$1|datoteke|datoteka}} povezano je s ovom datotekom.\nSljedeći spisak pokazuje samo {{PLURAL:$1|prvu stranicu povezanu|prve $1 stranice povezane|prvih $1 stranica povezanih}} s ovom datotekom.\nOvdje je dostupan [[Special:WhatLinksHere/$2|potpuni spisak]].",
"nolinkstoimage": "Nema stranica koje koriste ovu datoteku.",
"morelinkstoimage": "Vidi [[Special:WhatLinksHere/$1|ostale linkove]] prema ovoj datoteci.",
"logentry-contentmodel-change": "$1 {{GENDER:$2|promijenio|promijenila}} je model sadržaja stranice $3 iz \"$4\" u \"$5\"",
"logentry-contentmodel-change-revertlink": "vrati",
"logentry-contentmodel-change-revert": "vrati",
- "protectlogpage": "Zapisnik zaključavanja",
+ "protectlogpage": "Zapisnik zaštite",
"protectlogtext": "Ispod je spisak promjena zaštićenja stranice.\nPogledajte [[Special:ProtectedPages|spisak zaštićenih stranica]] za pregled trenutno zaštićenih stranica.",
"protectedarticle": "{{GENDER:|zaštitio|zaštitila}} je stranicu \"[[$1]]\"",
"modifiedarticleprotection": "{{GENDER:|promijenio|promijenila}} je stepen zaštite stranice \"[[$1]]\"",
"tooltip-ca-move": "Premjesti ovu stranicu",
"tooltip-ca-watch": "Dodajte stranicu u listu praćnih članaka",
"tooltip-ca-unwatch": "Ukloni ovu stranicu sa spiska praćenih članaka",
- "tooltip-search": "Pretraži projekat {{SITENAME}}",
+ "tooltip-search": "Pretraži {{GRAMMAR:akuzativ|{{SITENAME}}}}",
"tooltip-search-go": "Idi na stranicu s tačno ovim imenom ako postoji",
"tooltip-search-fulltext": "Pretražite stranice s ovim tekstom",
"tooltip-p-logo": "Glavna stranica",
"mw-widgets-titleinput-description-redirect": "preusmjerava na $1",
"randomrootpage": "Slučajna root stranica",
"log-action-filter-block": "Vrsta blokiranja:",
+ "log-action-filter-contentmodel": "Vrsta izmjene modela sadržaja:",
"log-action-filter-delete": "Vrsta brisanja:",
+ "log-action-filter-import": "Vrsta uvoza:",
+ "log-action-filter-managetags": "Vrsta uređivanja oznaka:",
+ "log-action-filter-move": "Vrsta premještanja:",
+ "log-action-filter-newusers": "Način stvaranja računa:",
+ "log-action-filter-patrol": "Vrsta patroliranja:",
+ "log-action-filter-protect": "Vrsta zaštite:",
+ "log-action-filter-rights": "Vrsta izmjene korisničkih prava:",
+ "log-action-filter-upload": "Vrsta postavljanja:",
"log-action-filter-all": "Sve",
"log-action-filter-block-block": "Blokiranje",
"log-action-filter-block-reblock": "Izmjena blokiranja",
"log-action-filter-block-unblock": "Deblokiranje",
+ "log-action-filter-contentmodel-change": "Izmjena modela sadržaja",
+ "log-action-filter-contentmodel-new": "Nova stranica s nestandardnim modelom sadržaja",
"log-action-filter-delete-delete": "Brisanje stranice",
"log-action-filter-delete-restore": "Vraćanje obrisane stranice",
"log-action-filter-delete-event": "Brisanje unosa u zapisniku",
- "log-action-filter-delete-revision": "Brisanje izmjene"
+ "log-action-filter-delete-revision": "Brisanje izmjene",
+ "log-action-filter-import-interwiki": "Uvoz između wikija",
+ "log-action-filter-import-upload": "Uvoz postavljanjem XML-a",
+ "log-action-filter-managetags-create": "Nova oznaka",
+ "log-action-filter-managetags-delete": "Brisanje oznake",
+ "log-action-filter-managetags-activate": "Aktiviranje oznake",
+ "log-action-filter-managetags-deactivate": "Deaktiviranje oznake",
+ "log-action-filter-move-move": "Premještanje bez presnimavanja preusmjerenja",
+ "log-action-filter-move-move_redir": "Premještanje s presnimavanjem preusmjerenja",
+ "log-action-filter-newusers-create": "Stvorio anonimni korisnik",
+ "log-action-filter-newusers-create2": "Stvorio registrirani korisnik",
+ "log-action-filter-newusers-autocreate": "Automatski stvoren",
+ "log-action-filter-newusers-byemail": "Stvoren lozinkom poslanom na adresu e-pošte",
+ "log-action-filter-patrol-patrol": "Ručno patrolirano",
+ "log-action-filter-patrol-autopatrol": "Automatski patrolirano",
+ "log-action-filter-protect-protect": "Dodavanje zaštite",
+ "log-action-filter-protect-modify": "Izmjena zaštite",
+ "log-action-filter-protect-unprotect": "Uklanjanje zaštite",
+ "log-action-filter-protect-move_prot": "Premještanje zaštite",
+ "log-action-filter-rights-rights": "Ručna izmjena",
+ "log-action-filter-rights-autopromote": "Automatska izmjena",
+ "log-action-filter-upload-upload": "Nova datoteka",
+ "log-action-filter-upload-overwrite": "Izmjena postojeće datoteke"
}
"tog-enotifminoredits": "Send mig også en e-mail ved mindre ændringer af sider og filer på min overvågningsliste",
"tog-enotifrevealaddr": "Vis min e-mailadresse i e-mails med besked om ændringer",
"tog-shownumberswatching": "Vis antal brugere, der overvåger",
- "tog-oldsig": "Nuværende signatur:",
+ "tog-oldsig": "Din nuværende signatur:",
"tog-fancysig": "Behandl signatur som wikitekst uden automatisk henvisning",
"tog-uselivepreview": "Benyt løbende forhåndsvisning",
"tog-forceeditsummary": "Advar mig hvis jeg ikke udfylder beskrivelsesfeltet",
"newwindow": "(åbner i et nyt vindue)",
"cancel": "Afbryd",
"moredotdotdot": "Mere...",
- "morenotlisted": "Denne liste er ikke komplet.",
+ "morenotlisted": "Denne liste er måske ikke fuldstændig.",
"mypage": "Side",
"mytalk": "Diskussion",
"anontalk": "Diskussion",
"searchprofile-advanced-tooltip": "Søg i bestemte navnerum",
"search-result-size": "$1 ({{PLURAL:$2|et ord|$2 ord}})",
"search-result-category-size": "{{PLURAL:$1|1 medlem|$1 medlemmer}} ({{PLURAL:$2|1 underkategori|$2 underkategorier}}, {{PLURAL:$3|1 fil|$3 filer}})",
- "search-redirect": "(omdirigering $1)",
+ "search-redirect": "(omdirigering fra $1)",
"search-section": "(afsnit $1)",
"search-category": "(kategorien $1)",
"search-file-match": "(svarer til filens indhold)",
"upload-copy-upload-invalid-domain": "Uploads af kopier er ikke tilgængelig fra dette domæne.",
"upload-dialog-title": "Læg en fil op",
"upload-dialog-button-cancel": "Annuller",
+ "upload-dialog-button-back": "Tilbage",
"upload-dialog-button-done": "Færdig",
"upload-dialog-button-save": "Gem",
"upload-dialog-button-upload": "Læg op",
"upload-form-label-infoform-description": "Beskrivelse",
"upload-form-label-usage-title": "Anvendelse",
"upload-form-label-usage-filename": "Filnavn",
+ "upload-form-label-own-work": "Dette er mit eget værk",
"upload-form-label-infoform-categories": "Kategorier",
"upload-form-label-infoform-date": "Dato",
"upload-form-label-own-work-message-generic-local": "Jeg bekræfter at jeg uploader filen i overenstemmelse med betingelser for brug og licenseringspoltikken på {{SITENAME}}.",
"export-download": "Tilbyd at gemme som en fil",
"export-templates": "Medtag skabeloner",
"export-pagelinks": "Inkluder henviste sider til en dybde på:",
+ "export-manual": "Tilføj sider manuelt:",
"allmessages": "Alle beskeder",
"allmessagesname": "Navn",
"allmessagesdefault": "Standardtekst",
"confirm-watch-top": "Tilføj denne side til din overvågningsliste?",
"confirm-unwatch-button": "OK",
"confirm-unwatch-top": "Fjern denne side fra din overvågningsliste?",
+ "confirm-rollback-button": "OK",
"quotation-marks": "\"$1\"",
"imgmultipageprev": "← forrige side",
"imgmultipagenext": "næste side →",
"htmlform-cloner-create": "Tilføj flere",
"htmlform-cloner-delete": "Fjern",
"htmlform-cloner-required": "Der kræves mindst en værdi.",
+ "htmlform-date-placeholder": "ÅÅÅÅ-MM-DD",
"logentry-delete-delete": "$1 {{GENDER:$2|slettede}} siden $3",
"logentry-delete-restore": "$1 {{GENDER:$2|gendannede}} siden $3",
"logentry-delete-event": "$1 {{GENDER:$2|ændrede}} synligheden af {{PLURAL:$5|en loghændelse|$5 loghændelser}} for siden $3: $4",
"feedback-cancel": "Afbryd",
"feedback-close": "Færdig",
"feedback-dialog-title": "Indsend feedback",
- "feedback-error-title": "Fejl",
"feedback-error1": "Fejl: Ukendt resultat fra API",
"feedback-error2": "Fejl: Redigering mislykkedes",
"feedback-error3": "Fejl: Intet svar fra API",
"feedback-submit": "Send",
"feedback-thanks": "Tak! Dine tilbagemeldinger er blevet noteret på siden \"[$2 $1]\".",
"feedback-thanks-title": "Tak!",
- "searchsuggest-search": "Søg",
+ "searchsuggest-search": "Søg på {{SITENAME}}",
"searchsuggest-containing": "indeholder...",
"api-error-badaccess-groups": "Du har ikke tilladelse til at overføre filer til denne wiki.",
"api-error-badtoken": "Intern fejl: ugyldigt mærke.",
"special-characters-group-ipa": "IPA",
"special-characters-group-symbols": "Symboler",
"special-characters-group-greek": "Græsk",
+ "special-characters-group-greekextended": "Udvidet græsk",
"special-characters-group-cyrillic": "Kyrillisk",
"special-characters-group-arabic": "Arabisk",
"special-characters-group-arabicextended": "Udvidet arabisk",
"log-action-filter-protect-protect": "Beskyttelse",
"log-action-filter-protect-modify": "Ændring af beskyttelse",
"log-action-filter-protect-unprotect": "Fjernede beskyttelse",
- "log-action-filter-protect-move_prot": "Flyttede beskyttelse"
+ "log-action-filter-protect-move_prot": "Flyttede beskyttelse",
+ "authmanager-provider-temporarypassword": "Midlertidig adgangskode",
+ "edit-error-short": "Fejl: $1"
}
"semiprotectedpagewarning": "'''Diqet: No pel pawyeno, teyna serkari eşkeni bıvurni.'''\nWexta ke şıma no pel vurneni diqet bıkeri, log bivini:",
"cascadeprotectedwarning": "'''Diqet:''' Na pele kılit biya, tenya karberê idarekeri şenê ke naye bıvurnê, çıke na zerrey {{PLURAL:$1|na pela şipa-kılitkerdiye|nê pelanê şipanê-kılitkerdiyan}} dera:",
"titleprotectedwarning": "'''Diqet: Na pele kılit biya, [[Special:ListGroupRights|heqê xususiy]] lazımê ke naye vırazê.'''\nLoge peniye cor de este:",
- "templatesused": "{{PLURAL:$1|Şablon|Şabloni}} ke na pela de xebtênê:",
+ "templatesused": "{{PLURAL:$1|Şablon|Şabloni}} ke ena perrer de karneyayê:",
"templatesusedpreview": "{{PLURAL:$1|Sablon|Sabloni}} ke na verqayt de xebetnayê:",
"templatesusedsection": "{{PLURAL:$1|Template|Templateyan}} ke na qısım de xebetniyenê:",
"template-protected": "(kılit biyo)",
"previewnote": "'''Lembre que esta é só unha vista previa e que aínda non gardou os seus cambios!'''",
"continue-editing": "Ir ata a caixa de edición",
"previewconflict": "Esta vista previa mostra o texto na área superior tal e como aparecerá se escolle gardar.",
- "session_fail_preview": "Sentímolo! Non podemos procesar a súa edición porque se perderon os datos de inicio da sesión.\n\nA súa sesión pode que fose pechada. <strong> Por favor, verifique se aínda está conectado e probe de novo</strong>. En caso de que siga sen funcionar, intente [[Special:UserLogout|saír]] e volver a entrar na súa conta, e verifique que o seu navegador permite o uso de \"cookies\" neste sitio.",
+ "session_fail_preview": "Sentímolo! Non puidemos procesar a súa edición porque se perderon os datos de inicio da sesión.\n\nPoida que se pechase a súa sesión. <strong>Por favor, verifique que ten a sesión aberta e probe de novo.</strong>\nEn caso de que siga sen funcionar, intente [[Special:UserLogout|saír]] e volver entrar na súa conta e verifique que o seu navegador permite o uso de cookies neste sitio.",
"session_fail_preview_html": "Sentímolo! Non foi posible procesar a edición debido á pérdida de datos da súa sesión.\n\n<em>Como a wiki {{SITENAME}} posibilita o uso de HTML puro, a vista previa está oculta por precaución contra ataques con JavaScript.</em>\n\n<strong>Se este é un intento lexítimo de edición probe de novo, por favor</strong>. \nEn caso de que continúe sen funcionar, intente [[Special:UserLogout|saír]] e volver a entrar na súa conta, e verifique se o seu navegador permite o uso de ''cookies'' deste sitio.",
"token_suffix_mismatch": "'''Rexeitouse a súa edición porque o seu cliente confundiu os signos de puntuación na edición.'''\nRexeitouse a edición para evitar que se corrompa o texto do artigo.\nIsto pode acontecer porque estea a empregar un servizo de proxy anónimo defectuoso baseado na web.",
"edit_form_incomplete": "'''Algunhas partes do formulario de edición non chegaron ao servidor; comprobe que a súa modificación está intacta e inténteo de novo.'''",
"Nemo bis",
"Mbrt",
"Beeyan",
- "Bonaditya"
+ "Bonaditya",
+ "Irus"
]
},
"tog-underline": "Garis bawahi pranala:",
"category-file-count-limited": "Kategori ini memiliki {{PLURAL:$1|$1 berkas}} berikut.",
"listingcontinuesabbrev": "samb.",
"index-category": "Halaman yang diindeks",
- "noindex-category": "Halaman yang tidak diindeks",
+ "noindex-category": "Halaman yang diindeks",
"broken-file-category": "Halaman dengan gambar rusak",
"categoryviewer-pagedlinks": "($1) ($2)",
"about": "Tentang",
"talk": "Pembicaraan",
"views": "Tampilan",
"toolbox": "Perkakas",
+ "tool-link-userrights": "Simpan kelompok {{GENDER:$1|pengguna}}",
+ "tool-link-emailuser": "Kirim surel ke {{GENDER:$1|pengguna}} ini",
"userpage": "Lihat halaman pengguna",
"projectpage": "Lihat halaman proyek",
"imagepage": "Lihat halaman berkas",
"createacct-yourpasswordagain-ph": "Masukkan lagi kata sandi",
"userlogin-remembermypassword": "Biarkan saya tetap masuk",
"userlogin-signwithsecure": "Gunakan server aman",
+ "cannotlogin-title": "Tidak dapat masuk",
+ "cannotlogin-text": "Login ini tidak mungkin.",
"cannotloginnow-title": "Tidak dapat masuk log saat ini",
"cannotloginnow-text": "Masuk log tidak memungkinkan ketika menggunakan $1.",
+ "cannotcreateaccount-title": "Akun tak dapat dibuat",
+ "cannotcreateaccount-text": "Menetapkan account langsung tidak diaktifkan pada wiki ini.",
"yourdomainname": "Domain Anda:",
"password-change-forbidden": "Anda tidak dapat mengubah kata sandi pada wiki ini.",
"externaldberror": "Telah terjadi kesalahan otentikasi basis data eksternal atau Anda tidak diizinkan melakukan kemaskini terhadap akun eksternal Anda.",
"searchprofile-advanced-tooltip": "Pencarian di ruang nama tertentu",
"search-result-size": "$1 ({{PLURAL:$2|$2 kata}})",
"search-result-category-size": "{{PLURAL:$1|1 anggota|$1 anggota}} ({{PLURAL:$2|1 subkategori|$2 subkategori}}, {{PLURAL:$3|1 berkas|$3 berkas}})",
- "search-redirect": "(pengalihan $1)",
+ "search-redirect": "(Dialihkan dari $1)",
"search-section": "(bagian $1)",
"search-category": "(kategori $1)",
"search-file-match": "(cocok dengan isi berkas)",
"rightslogtext": "Di bawah ini adalah log perubahan terhadap hak-hak pengguna.",
"action-read": "membaca halaman ini",
"action-edit": "menyunting halaman ini",
- "action-createpage": "membuat halaman baru",
- "action-createtalk": "membuat halaman pembicaraan baru",
+ "action-createpage": "Membuat halaman ini",
+ "action-createtalk": "Membuat halaman diskusi ini",
"action-createaccount": "membuat akun pengguna ini",
"action-autocreateaccount": "buat otomatis akun pengguna luar",
"action-history": "lihat riwayat halaman ini",
"upload-http-error": "Kesalahan HTTP terjadi: $1",
"upload-copy-upload-invalid-domain": "Unggahan salinan tidak tersedia dari domain ini.",
"upload-foreign-cant-upload": "Wiki ini tidak diatur untuk mengunggah berkas ke gudang penyimpangan asing.",
+ "upload-dialog-disabled": "Upload file menggunakan dialog ini dinonaktifkan pada wiki ini.",
"upload-dialog-title": "Unggah berkas",
"upload-dialog-button-cancel": "Batalkan",
"upload-dialog-button-done": "Selesai",
"Сай",
"Санюн Вадик",
"아라",
- "Sergey Ivanov"
+ "Sergey Ivanov",
+ "Irus"
]
},
"tog-underline": "Кузе кылвер-влакым ӱлычын удыралаш?",
"specialpages-group-pagetools": "Лаштык ӱзгар-влак",
"specialpages-group-redirects": "Вес вере колтышо спецлаштык-влак",
"external_image_whitelist": " #Оставьте эту строчку такой, как она есть<pre>\n#Разместите здесь фрагменты регулярных выражений (ту часть, что находится между //)\n#они будут соотнесены с URL внешних изображений.\n#Подходящие будут показаны как изображения, остальные будут показаны как ссылки на изображения.\n#Строки, начинающиеся с # считаются комментариями.\n#Строки не чувствительны к регистру\n\n#Размещайте фрагменты регулярных выражений над этой строчкой. Оставьте эту строчку такой, как она есть.</pre>",
+ "logentry-delete-delete": "$1 {{GENDER:$2|лыктын|лыктын}} странице $3",
"revdelete-summary": "тӧрлатымаш-влакым возен ончыктымаш",
"searchsuggest-search": "Кычалаш",
"expand_templates_ok": "Йӧра",
"version": "Pán-pún",
"specialpages": "Te̍k-sû-ia̍h",
"tag-filter": "[[Special:Tags|Piau-chhiam]] chhoē mi̍h:",
- "tag-list-wrapper": "([[Special:Tags|$1 ê piau-chhiam]]: $2)",
+ "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|piau-chhiam}}]]: $2)",
"logentry-move-move": "$1 {{GENDER:$2|sóa}} $3 chit ia̍h khì $4",
"logentry-newusers-create": "已經{{GENDER:$2|開好}}用者口座 $1",
"searchsuggest-search": "Chhoē {{SITENAME}}",
"Nirjal stha",
"राम प्रसाद जोशी",
"Matma Rex",
- "जनक राज भट्ट"
+ "जनक राज भट्ट",
+ "Suniltheblue"
]
},
"tog-underline": "रेखाङ्कित लिङ्क:",
"feedback-thanks": "धन्यवाद! तपाईंको प्रतिक्रिया पृष्ठमा नियुक्त गरिएको छ \"[ $2 $1 ]\"।",
"feedback-thanks-title": "धन्यवाद!",
"feedback-useragent": "प्रयोगकर्ता एजेन्ट:",
- "searchsuggest-search": "खोज",
+ "searchsuggest-search": "{{SITENAME}} मा खोज्नुहोस्",
"searchsuggest-containing": "समावेश भएको...",
"api-error-badaccess-groups": "यस विकिमा तपाईंलाई फाइल अपलोड गर्ने अनुमति छैन।",
"api-error-badtoken": "आन्तरिक समस्याः खराब टोकन ।",
"nocookiesnew": "A conta de utilizador foi criada, mas neste momento não tem sessão iniciada.\nA {{SITENAME}} utiliza ''cookies'' para autenticar os utilizadores.\nOs ''cookies'' estão desativados no seu navegador.\nAtive-os e inicie sessão com o seu nome de utilizador e a sua palavra-passe, por favor.",
"nocookieslogin": "A {{SITENAME}} utiliza ''cookies'' para autenticar os utilizadores.\nOs ''cookies'' estão desativados no seu navegador.\nAtive-os e tente novamente, por favor.",
"nocookiesfornew": "A conta de utilizador não foi criada, porque não foi possível confirmar a sua origem.\nCertifique-se de que tem os ''cookies'' ativados, recarregue esta página e tente novamente.",
- "createacct-loginerror": "A conta foi criada com êxito, mas não pôde ser autenticado automaticamente. Por favor, faça o [[Special:UserLogin|início de sessão manualmente]].",
+ "createacct-loginerror": "A conta foi criada, mas não foi possível iniciar a sessão automaticamente. Por favor, [[Special:UserLogin|inície a sessão manualmente]].",
"noname": "Não especificou um nome de utilizador válido.",
"loginsuccesstitle": "Autenticação bem sucedida",
"loginsuccess": "'''Encontra-se agora ligado à {{SITENAME}} como \"$1\"'''.",
"version-entrypoints": "URL de ponto de entrada",
"version-entrypoints-header-entrypoint": "Ponto de entrada",
"version-entrypoints-header-url": "URL",
+ "version-entrypoints-articlepath": "[https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgArticlePath Caminho dos artigos]",
+ "version-entrypoints-scriptpath": "[https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgScriptPath Caminho dos <i>scripts</i>]",
"version-libraries": "Bibliotecas instaladas",
"version-libraries-library": "Biblioteca",
"version-libraries-version": "Versão",
"api-error-stashedfilenotfound": "O ficheiro escondido não foi encontrado ao tentar carregá-lo.",
"api-error-stashpathinvalid": "O caminho no qual o ficheiro escondido deveria ter sido encontrado era inválido.",
"api-error-stashfilestorage": "Ocorreu um erro no carregamento do ficheiro escondido.",
- "api-error-stashzerolength": "O servidor não pôde esconder o ficheiro, porque ele tinha de comprimento zero.",
+ "api-error-stashzerolength": "Não foi possível o servidor esconder o ficheiro, porque este tinha comprimento zero.",
"api-error-stashnotloggedin": "Tem de ter uma sessão iniciada para gravar ficheiros na área de ficheiros escondidos.",
"api-error-stashwrongowner": "O ficheiro a que estava a tentar aceder na área de ficheiros escondidos não lhe pertence.",
"api-error-stashnosuchfilekey": "O chave do ficheiro a que estava a tentar aceder na área de ficheiros escondidos não existe.",
"authform-notoken": "Chave em falta",
"authform-wrongtoken": "Chave errada",
"specialpage-securitylevel-not-allowed-title": "Não permitido",
- "specialpage-securitylevel-not-allowed": "Desculpe, não tem permissão para utilizar esta página porque a sua identidade não pôde ser verificada.",
+ "specialpage-securitylevel-not-allowed": "Desculpe, não tem permissão para utilizar esta página porque não foi possível verificar a sua identidade.",
"authpage-cannot-login": "Não é possível iniciar sessão.",
"authpage-cannot-login-continue": "Não é possível continuar a iniciar sessão. A sua sessão pode ter expirado.",
"authpage-cannot-create": "Não é possível iniciar a criação da conta.",
"Jdforrester",
"Jack who built the house",
"Cat1987",
- "SergeyButkov"
+ "SergeyButkov",
+ "Irus"
]
},
"tog-underline": "Подчёркивание ссылок:",
"undo-failure": "Правка не может быть отменена из-за несовместимости промежуточных изменений.",
"undo-norev": "Правка не может быть отменена, так как её не существует или она была удалена.",
"undo-nochange": "Правка, похоже, уже была отменена.",
- "undo-summary": "Отмена правки $1, сделанной {{GENDER:$2|участником|участницей}} [[Special:Contribs/$2|$2]] ([[User talk:$2|обс.]])",
+ "undo-summary": "Отмена правки $1, сделанной {{GENDER:$2|участником|участницей}} [[Special:Contributions/$2|$2]] ([[User talk:$2|обс.]])",
"undo-summary-username-hidden": "Отмена правки $1, сделанной участником, чьё имя скрыто",
"cantcreateaccount-text": "Создание учётных записей с этого IP-адреса ('''$1''') было заблокировано {{GENDER:$3|участником|участницей|}} [[User:$3|$3]].\n\n$3 {{GENDER:$3|указал|указала}} следующую причину: ''$2''.",
"cantcreateaccount-range-text": "{{GENDER:$3|Участник|Участница}} [[User:$3|$3]] {{GENDER:$3|установил|установила}} запрет на создание учётных записей из диапазона IP-адресов <strong>$1</strong>, включающего ваш IP-адрес (<strong>$4</strong>). \n\nБыла указана следующая причина: $2.",
"variants": "Вариантъёс",
"navigation-heading": "Навигация",
"errorpagetitle": "Янгыш",
+ "returnto": "Берыктон борды бам $1.",
"tagline": "{{SITENAME}}-ысь материал",
"help": "Валэктонъёс",
"search": "Утчан",
"welcomecreation-msg": "Тӥляд гожъямъёсты учётной кылдытэмын вал.\nТӥ быгатӥськоды воштэ {{SITENAME}} [[Special:Preferences|параметръёсты]] ке потэ тӥледлы.",
"yourname": "Пырон ним:",
"userlogin-yourname": "Пырон ним:",
+ "createacct-another-username-ph": "Учётной книга нимъёс пыртэмын",
"yourpassword": "Лушкемкыл:",
"userlogin-yourpassword": "Лушкемкыл",
+ "createacct-yourpasswordagain": "Пароль юнматэ",
"cannotcreateaccount-title": "Уг быгатиськы гожъян кылдӥз учётной",
"yourdomainname": "Тӥ доменэн:",
"login": "Пырыны",
"userlogin-resetpassword-link": "Тӥлесьтыд парольдэс куштыны?",
"userlogin-helplink2": "Пыронъя юрттэт",
"createacct-emailrequired": "Электронной почталэн адресэз",
+ "createacct-emailoptional": "Электронной почтаезлэн адресэз (необязательное)",
+ "createaccountmail": "Адрес электронной почта огдырлы кутӥ вылын возьматэм образъёсыныз но соослэн случайной сгенерировать пароль ыстыны",
"createacct-submit": "Выль вики-авторлэн регистрациез",
"createacct-another-submit": "Выль вики-авторлэн регистрациез",
"loginerror": "Янгышъёс пырон",
"autoblockedtext": "Тон IP-адрес, герӟет автоматически заблокирован а со, мар солэн кутыны луоно азьвыл кин ке но пырисьёс пӧлысь, заблокирован {{GENDER:$4|участник|куакеч}} $1. \nБлокировка возьмано луоз вуоно мугез:\n\n: \"$2\" - лы.\n\n* Кутскон блокировка: $8\n* Блокировка ортчиз: $6\n* Блокировка меретъёсыз: $7\n\nБыгатӥськод-а тон герӟаськемын $1 яке мукет котькудӥныз [[{{MediaWiki:Grouppage-sysop}}|администраторъёс]], блокировка мед эскерозы.\n\nУчком, мар кутыны уг быгато функцизэс \"гожтэт\", ас ке [[Special:Preferences|настройка персональной]] зуркатӥсь яке электронной почтаезлэн адресэз эн чуртна уг корректный, яке гожтӥськод ке, гожтэт ыстон укшась блокировка алон.\n\nТон IP-адрес — $3, блокировка идентификаторлэн — #$5.\nПожалуйста, аслэсьтым тодон-та вазиськонэз котьку возьмано.",
"blockednoreason": "мугезлы эн возьмалэ",
"loginreqlink": "пырыны",
+ "newarticletext": "Тон бам ссылкаос вылэ выжыса, со кема уз улы.\nСоос мед кылдозы, текст бичась укноос, улазы интыяськемын (умой-умой см. [$1 бам справочной]).\nЯнгыш-а тон татын луысалыд ке, кнопказэ зӥбиз гинэ <strong>берлань</strong> асьтэлэсь браузеръёстэс.",
"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> Тӥ дорын сётӥське юаськыны кылдӥз бам ӧвӧл.",
"blocked-notice-logextract": "Пользователь заблокирован сётӥз та учырлы.\nСправка понна радъяськылӥсь журнал блокировка лапег берпуметӥ гожтэт:",
"continue-editing": "Тупатъянэз азьланьтоно",
"editing": "Тупатон: $1",
"template-semiprotected": "(полузащищенный)",
"nocreate-loggedin": "Тон доразы юаськыны кылдӥз выль бам ӧвӧл.",
"permissionserrors": "Янгышъёс юаське",
+ "permissionserrorstext": "Тон дорын разрешенизы ӧвӧлэн, тазэ лэсьтом шуыса, со понна вуоно {{PLURAL:$1|мугез}}:",
+ "permissionserrorstext-withaction": "Правоез ӧвӧл, тон дорын $2 тӥ {{PLURAL:$1/1=мугез вуоно|мугез вуоно}}:",
"content-model-wikitext": "викитекст",
- "cantcreateaccount-text": "Та книгаез кылдытонлы учётной IP-адрес (<кужмо>$1</кужмо>) заблокировать луизы [[User:$3|$3]].\n\nМугез, вайиз $3 возьматэ <em>$2</сиоз>",
- "cantcreateaccount-range-text": "Учётной кылдытон - гожъян IP-адрес диапазонын <кужмо>$1</strong>, Тон пыриське со IP-адрес (<кужмо>$4</кужмо>), заблокировать луизы [[User:$3|$3]].\n\nМугез, вайиз $3 возьматэ <em>$2</сиоз>",
+ "undo-summary": "Шонертон вошъян $1, лэсьтӥзы {{GENDER:$2|участник|куакеч}} [[Special:Contributions/$2|$2]] ([[User talk:$2|обс.]])",
+ "cantcreateaccount-text": "Та книгаез кылдытонлы учётной IP-адрес (<кужмо>$1</кужмо>) заблокировать луизы [[User:$3|$3]].\n\nМугез, вайиз $3 возьматэ <em>$2</em>",
+ "cantcreateaccount-range-text": "Учётной кылдытон - гожъян IP-адрес диапазонын <кужмо>$1</strong>, Тон пыриське со IP-адрес (<кужмо>$4</кужмо>), заблокировать луизы [[User:$3|$3]].\n\nМугез, вайиз $3 возьматэ <em>$2</em>",
"viewpagelogs": "Та бамлы журналъёсыз возьматыны",
"revisionasof": "Версия $1",
"previousrevision": "← Вужгем",
"prefs-editing": "Тупатон",
"yourlanguage": "Интерфейслэн кылыз:",
"prefs-preview": "Бамез эскерон",
+ "group-autoconfirmed": "Автоподтвержденный пыриськисьёс",
+ "group-bot": "Боты",
"group-sysop": "Администраторъёс",
"group-all": "(ваньзэ)",
+ "right-read": "лыдӟыны бам",
+ "right-edit": "правка бам",
+ "right-createpage": "бам кылдытон-а, уг-возьматэмзэ эскерон",
+ "right-createtalk": "создание бамлэн обсуждениосаз",
+ "right-createaccount": "выль книга кылдытон пыриськизы учётной",
+ "right-writeapi": "гожтэтъёсты кутон понна API",
"newuserlogpage": "Викиавторъёсыз регистрациосын журнал",
+ "action-edit": "та бамез редактировать",
"enhancedrc-history": "история",
"recentchanges": "Выль тупатонъёс",
"recentchanges-label-newpage": "Та тупатонэн выль бам кылдӥз",
"sp-deletedcontributions-contribs": "тупатонъёсыз",
"listusers-submit": "Возьматыны",
"listusers-blocked": "(заблокировать{{GENDER:$1||а}})",
+ "listgrouprights": "Право группае пыриськисьёс",
+ "listgrouprights-summary": "Та группае пырисьёс возьматыны кулэ вики список улӥзы, право соответствующийгес солы возьматоно кариськиз. Оло, ас кожазы ватсаса ивортодэт улыны эрикрадэз сярысь.",
+ "listgrouprights-members": "(список пыриськисьёс)",
"emailuser": "Викиавторлы гожтэт",
"emailmessage": "Ивортон:",
"watchlist": "Чаклан список",
"watchlist-options": "Чаклан списокез тупатыны",
"enotif_reset": "Вань бамъёсыз лыдӟем пусйыны",
"historyaction-submit": "Возьматыны",
+ "deletionlog": "палэнэ журнал",
"rollbacklink": "ӝог берыктыны",
"restriction-edit": "Тупатон",
+ "undeletehistory": "Выльысь ке тон бамъёстэ, выльысь историяз луэм воштӥськонъёс вань.\nБӧрысь кылдӥзы выль бамъёс палэнэ кошконо луэ ке, сыӵе ик нимыз, историяз вошъяськонъёс предшествующий выльысь кылдозы.",
+ "undeletehistorynoadmin": "Статьяос палэнтэмын вал. Мугез но палэнэ список пыриды, со статьяе редактировать-озь палэнэгес, зӧк возьматэ. Текст статьяез удаленный администраторъёс гинэ учкыны быгатод.",
"blanknamespace": "(Валтӥсез)",
"contributions": "{{GENDER:$1|Викиавтор}} гожтэмъёсы",
"contributions-title": "$1 викиавтор гожтэмъёсы",
"mycontris": "Гожтэмъёс",
+ "nocontribs": "Критерии нокыӵе воштӥськонъёс та соответствующий шедьтыны уг луы.",
+ "sp-contributions-blocklog": "блокировка",
+ "sp-contributions-deleted": "шонертон палэнтыны {{GENDER:$1|участник|куакеч}}",
"whatlinkshere": "Татчы чӧлсконъёс",
"block": "Блокировка пыриськисьёс",
"blockip": "Заблокировать пыриськисьёс",
+ "ipbreason-dropdown": "* Блокировка мугез кабес\n** Полы информациез оскизы\n** Вордскем палэнэ бам\n** Спам-сайтъя педпал чӧлскон\n** Текстлэсь визьем ватсан/жуг-жаг\n** Кышкытлыклэсь, пыриськыны уйиськон\n** Злоупотребление кӧня ке книга учётной\n** Пыриськисьёслэн нимъёссы пыриськисьёс",
+ "ipboptions": "2 час:2 hours,1 нуналлы:1 day,3 нуналлы:3 days,1 арняезлы:1 week,2 арняяз:2 weeks,1 толэзь:1 month,3 толэзь:3 months,6 толэзь:6 months,1 арлэн:1 year,бессрочно:infinite",
"unblocked": "$1 разблокировать",
"unblocked-id": "Блокировка $1 басьтоно луиз",
"blocklist-target": "Ужпумъёс",
"blocklist-reason": "Мугез",
+ "infiniteblock": "бессрочно",
+ "expiringblock": "йылпумъяськиз $1-ысь $2",
+ "anononlyblock": "аноним гинэ",
+ "noautoblockblock": "disconnect автоблокировка",
+ "createaccountblock": "гожъямъёстэс лэзьыны кылдытон учётной",
+ "emailblock": "лэзьымтэ гожтэт ыстон",
+ "blocklist-nousertalk": "тупатъяны ачиз уггес быгаты бамлэн обсуждениосаз",
"blocklink": "блокировать карыны",
+ "unblocklink": "разблокировать",
+ "change-blocklink": "блокировка воштыны",
"contribslink": "тупатонъёсыз",
+ "autoblocker": "Автоблокировка-со понна, мае тӥ IP-адрес кутыны али \"[[User:$1|$1]]\". \nБлокировка мугез $1: \"$2\"",
"blocklogentry": "заблокировать [[$1]] дыр $2 $3",
"reblock-logentry": "блокировка воштӥз [[$1]] дыр $2 $3",
- "blocklogtext": "Блокировка но та журналлэн ужезлы разблокирование пользователь.\nЗаблокировать Автоматически IP-адрес уг возьма.\nПроизведениосыз печатласько эстониын [[нимысьтыз:сьӧд списокын|сьӧд списокын]], бан список блокъёс лэсьтыны.",
+ "blocklogtext": "Блокировка но та журналлэн ужезлы разблокирование пользователь.\nЗаблокировать Автоматически IP-адрес уг возьма.\nПроизведениосыз печатласько эстониын [[Special:BlockList|сьӧд списокын]], бан список блокъёс лэсьтыны.",
"unblocklogentry": "разблокировать $1",
+ "block-log-flags-anononly": "пользователь гинэ нимтултэм",
+ "block-log-flags-nousertalk": "тупатъяны ачиз уггес быгаты бамлэн обсуждениосаз",
"range_block_disabled": "Администратор диапазонэз блокировать али.",
"move-watch": "Чаклан списоке пыртоно инъет но валтӥсь бамъёсыз",
"allmessagesname": "Ивортон",
"exif-disclaimer": "Кыл кутыны пумит луон",
"namespacesall": "ваньзэ",
"monthsall": "ваньзэ",
+ "confirmrecreate-noreason": "{{GENDER:$1|Участник|Куакеч|}} [[User:$1|$1]] ([[User talk:$1|обс]]) {{GENDER:$1|палэнтыны|палэнтыны}} таиз бере бам, кызьы тон сое редактировать карыны кутскиз. Пожалуйста, подтвердите, мар тон малпаськод та бамез зэм но выльысь кылдозы.",
"confirm-watch-top": "Та бамез чаклан списокады пыртоно?",
"autosumm-new": "Выль бам: «$1»",
+ "version": "Версия",
"specialpages": "Ваньмыз панельёс",
+ "specialpages-group-login": "Тусбуяськыны / Гожтӥськоно",
+ "specialpages-group-users": "Пыриськисьёслэсь правооссэс но",
"tag-filter": "[[Special:Tags|Тэгъёсыз]] фильтр:",
"tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|1=Метка|Меткаос}}]]: $2)",
"tags-title": "Меткаос",
+ "logentry-delete-delete": "$1 {{GENDER:$2|палэнтыны|палэнтыны}} бам $3",
"logentry-newusers-create": "$1 нимо учётной запись {{GENDER:$2|кылдытэмын}} вал",
"searchsuggest-search": "Утчано {{SITENAME}}",
"searchsuggest-containing": "кудъёсаз вань...",
"viewdeletedpage": "查看被删页面",
"undeletepagetext": "以下{{PLURAL:$1|页面|$1个页面}}已被删除,但依然在归档中并可以被恢复。归档可能会被定时清理。",
"undelete-fieldset-title": "还原版本",
- "undeleteextrahelp": "要恢复该页面的整个历史记录时,不选中任何复选框直接点击'''''{{int:undeletebtn}}'''''。要选择性地恢复部分版本时,请选中相应版本前的复选框再点击'''''{{int:undeletebtn}}'''''。",
+ "undeleteextrahelp": "要恢复该页面的整个历史记录时,不选中任何复选框直接点击<strong><em>{{int:undeletebtn}}</em></strong>。要选择性地恢复部分版本时,请选中相应版本前的复选框再点击<strong><em>{{int:undeletebtn}}</em></strong>。",
"undeleterevisions": "$1个{{PLURAL:$1|修订版本}}已删除",
"undeletehistory": "如果您恢复了该页面,所有版本都会被恢复到版本历史中。如果本页删除后有一个同名的新页面建立,被恢复的版本将会出现在先前的历史中。",
"undeleterevdel": "如果把最新版本部分删除,反删除将会无法进行。如果遇到这种情况,您必须反选或反隐藏最新已删除的版本。",
"htmlform-select-badoption": "您指定的值不是有效选项。",
"htmlform-int-invalid": "您指定的值不是整数。",
"htmlform-float-invalid": "您指定的值不是数字。",
- "htmlform-int-toolow": "您指定的值小于最小值$1",
+ "htmlform-int-toolow": "您指定的值小于最小值$1。",
"htmlform-int-toohigh": "您指定的值大于最大值$1",
"htmlform-required": "本值必填",
"htmlform-submit": "提交",
"grant-basic": "基本權限",
"grant-viewdeleted": "檢視已刪除的檔案及頁面",
"grant-viewmywatchlist": "檢視您的監視清單",
+ "grant-viewrestrictedlogs": "檢視已限制的日誌項目",
"newuserlogpage": "建立使用者日誌",
"newuserlogpagetext": "此為建立使用者的日誌。",
"rightslog": "使用者權限日誌",
"version-poweredby-translators": " translatewiki.net 翻譯人員",
"version-credits-summary": "我們感謝以下人士為 [[Special:Version|MediaWiki]] 作出的貢獻。",
"version-license-info": "MediaWiki 為自由軟體;您可依據自由軟體基金會所發表的 GNU 通用公共授權條款規定,將本程式重新發佈與/或修改;無論您依據的是本授權條款的第二版或 (您可自行選擇) 之後的任何版本。\n\n本程式發佈的目的是希望可以提供幫助,但不負任何擔保責任;亦無隱含對適售性或 特定用途的適用性的情形擔保。詳情請參照 GNU 通用公共授權。\n\n您應已隨本程式收到 [{{SERVER}}{{SCRIPTPATH}}/COPYING GNU 通用公共授權條款的副本];如果沒有,請寄信通知自由軟體基金會,51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA,或 [//www.gnu.org/licenses/old-licenses/gpl-2.0.html 線上閱讀]。",
- "version-software": "已經安裝的軟體",
+ "version-software": "已安裝的軟體",
"version-software-product": "產品",
"version-software-version": "版本",
"version-entrypoints": "入口 URL",
}
public function testLBFactorySimpleServer() {
- global $wgDBserver, $wgDBname, $wgDBuser, $wgDBpassword, $wgDBtype;
+ global $wgDBserver, $wgDBname, $wgDBuser, $wgDBpassword, $wgDBtype, $wgSQLiteDataDir;
$servers = [
[
- 'host' => $wgDBserver,
- 'dbname' => $wgDBname,
- 'user' => $wgDBuser,
- 'password' => $wgDBpassword,
- 'type' => $wgDBtype,
- 'load' => 0,
- 'flags' => DBO_TRX // REPEATABLE-READ for consistency
+ 'host' => $wgDBserver,
+ 'dbname' => $wgDBname,
+ 'user' => $wgDBuser,
+ 'password' => $wgDBpassword,
+ 'type' => $wgDBtype,
+ 'dbDirectory' => $wgSQLiteDataDir,
+ 'load' => 0,
+ 'flags' => DBO_TRX // REPEATABLE-READ for consistency
],
];
}
public function testLBFactorySimpleServers() {
- global $wgDBserver, $wgDBname, $wgDBuser, $wgDBpassword, $wgDBtype;
+ global $wgDBserver, $wgDBname, $wgDBuser, $wgDBpassword, $wgDBtype, $wgSQLiteDataDir;
$servers = [
[ // master
- 'host' => $wgDBserver,
- 'dbname' => $wgDBname,
- 'user' => $wgDBuser,
- 'password' => $wgDBpassword,
- 'type' => $wgDBtype,
- 'load' => 0,
- 'flags' => DBO_TRX // REPEATABLE-READ for consistency
+ 'host' => $wgDBserver,
+ 'dbname' => $wgDBname,
+ 'user' => $wgDBuser,
+ 'password' => $wgDBpassword,
+ 'type' => $wgDBtype,
+ 'dbDirectory' => $wgSQLiteDataDir,
+ 'load' => 0,
+ 'flags' => DBO_TRX // REPEATABLE-READ for consistency
],
[ // emulated slave
- 'host' => $wgDBserver,
- 'dbname' => $wgDBname,
- 'user' => $wgDBuser,
- 'password' => $wgDBpassword,
- 'type' => $wgDBtype,
- 'load' => 100,
- 'flags' => DBO_TRX // REPEATABLE-READ for consistency
+ 'host' => $wgDBserver,
+ 'dbname' => $wgDBname,
+ 'user' => $wgDBuser,
+ 'password' => $wgDBpassword,
+ 'type' => $wgDBtype,
+ 'dbDirectory' => $wgSQLiteDataDir,
+ 'load' => 100,
+ 'flags' => DBO_TRX // REPEATABLE-READ for consistency
]
];
$dbw = $lb->getConnection( DB_MASTER );
$this->assertTrue( $dbw->getLBInfo( 'master' ), 'master shows as master' );
$this->assertEquals(
- $wgDBserver, $dbw->getLBInfo( 'clusterMasterHost' ), 'cluster master set' );
+ ( $wgDBserver != '' ) ? $wgDBserver : 'localhost',
+ $dbw->getLBInfo( 'clusterMasterHost' ),
+ 'cluster master set' );
$dbr = $lb->getConnection( DB_SLAVE );
$this->assertTrue( $dbr->getLBInfo( 'replica' ), 'slave shows as slave' );
$this->assertEquals(
- $wgDBserver, $dbr->getLBInfo( 'clusterMasterHost' ), 'cluster master set' );
+ ( $wgDBserver != '' ) ? $wgDBserver : 'localhost',
+ $dbr->getLBInfo( 'clusterMasterHost' ),
+ 'cluster master set' );
$factory->shutdown();
$lb->closeAll();
}
public function testLBFactoryMulti() {
- global $wgDBserver, $wgDBname, $wgDBuser, $wgDBpassword, $wgDBtype;
+ global $wgDBserver, $wgDBname, $wgDBuser, $wgDBpassword, $wgDBtype, $wgSQLiteDataDir;
$factory = new LBFactoryMulti( [
'sectionsByDB' => [],
'user' => $wgDBuser,
'password' => $wgDBpassword,
'type' => $wgDBtype,
+ 'dbDirectory' => $wgSQLiteDataDir,
'flags' => DBO_DEFAULT
],
'hostsByName' => [
}
private function newLBFactoryMulti( array $baseOverride = [], array $serverOverride = [] ) {
- global $wgDBserver, $wgDBuser, $wgDBpassword, $wgDBname, $wgDBtype;
+ global $wgDBserver, $wgDBuser, $wgDBpassword, $wgDBname, $wgDBtype, $wgSQLiteDataDir;
return new LBFactoryMulti( $baseOverride + [
'sectionsByDB' => [],
'user' => $wgDBuser,
'password' => $wgDBpassword,
'type' => $wgDBtype,
+ 'dbDirectory' => $wgSQLiteDataDir,
'flags' => DBO_DEFAULT
],
'hostsByName' => [
}
public function testNiceDomains() {
- global $wgDBname;
+ global $wgDBname, $wgDBtype;
+
+ if ( $wgDBtype === 'sqlite' ) {
+ $tmpDir = $this->getNewTempDirectory();
+ $dbPath = "$tmpDir/unit_test_db.sqlite";
+ file_put_contents( $dbPath, '' );
+ $tempFsFile = new TempFSFile( $dbPath );
+ $tempFsFile->autocollect();
+ } else {
+ $dbPath = null;
+ }
- $factory = $this->newLBFactoryMulti();
+ $factory = $this->newLBFactoryMulti(
+ [],
+ [ 'dbFilePath' => $dbPath ]
+ );
$lb = $factory->getMainLB();
- $db = $lb->getConnectionRef( DB_MASTER );
- $this->assertEquals(
- $wgDBname,
- $db->getDomainID()
- );
- unset( $db );
+ if ( $wgDBtype !== 'sqlite' ) {
+ $db = $lb->getConnectionRef( DB_MASTER );
+ $this->assertEquals(
+ $wgDBname,
+ $db->getDomainID()
+ );
+ unset( $db );
+ }
/** @var Database $db */
$db = $lb->getConnection( DB_MASTER, [], '' );
);
$this->assertEquals(
- $db->addIdentifierQuotes( 'page' ),
+ $this->quoteTable( $db, 'page' ),
$db->tableName( 'page' ),
"Correct full table name"
);
$this->assertEquals(
- $db->addIdentifierQuotes( $wgDBname ) . '.' . $db->addIdentifierQuotes( 'page' ),
+ $this->quoteTable( $db, $wgDBname ) . '.' . $this->quoteTable( $db, 'page' ),
$db->tableName( "$wgDBname.page" ),
"Correct full table name"
);
$this->assertEquals(
- $db->addIdentifierQuotes( 'nice_db' ) . '.' . $db->addIdentifierQuotes( 'page' ),
+ $this->quoteTable( $db, 'nice_db' ) . '.' . $this->quoteTable( $db, 'page' ),
$db->tableName( 'nice_db.page' ),
"Correct full table name"
);
$db->getDomainID()
);
$this->assertEquals(
- $db->addIdentifierQuotes( 'my_page' ),
+ $this->quoteTable( $db, 'my_page' ),
$db->tableName( 'page' ),
"Correct full table name"
);
$this->assertEquals(
- $db->addIdentifierQuotes( 'other_nice_db' ) . '.' . $db->addIdentifierQuotes( 'page' ),
+ $this->quoteTable( $db, 'other_nice_db' ) . '.' . $this->quoteTable( $db, 'page' ),
$db->tableName( 'other_nice_db.page' ),
"Correct full table name"
);
}
public function testTrickyDomain() {
+ global $wgDBtype;
+
+ if ( $wgDBtype === 'sqlite' ) {
+ $tmpDir = $this->getNewTempDirectory();
+ $dbPath = "$tmpDir/unit_test_db.sqlite";
+ file_put_contents( $dbPath, '' );
+ $tempFsFile = new TempFSFile( $dbPath );
+ $tempFsFile->autocollect();
+ } else {
+ $dbPath = null;
+ }
+
$dbname = 'unittest-domain';
$factory = $this->newLBFactoryMulti(
- [ 'localDomain' => $dbname ], [ 'dbname' => $dbname ] );
+ [ 'localDomain' => $dbname ],
+ [ 'dbname' => $dbname, 'dbFilePath' => $dbPath ]
+ );
$lb = $factory->getMainLB();
/** @var Database $db */
$db = $lb->getConnection( DB_MASTER, [], '' );
);
$this->assertEquals(
- $db->addIdentifierQuotes( 'page' ),
+ $this->quoteTable( $db, 'page' ),
$db->tableName( 'page' ),
"Correct full table name"
);
$this->assertEquals(
- $db->addIdentifierQuotes( $dbname ) . '.' . $db->addIdentifierQuotes( 'page' ),
+ $this->quoteTable( $db, $dbname ) . '.' . $this->quoteTable( $db, 'page' ),
$db->tableName( "$dbname.page" ),
"Correct full table name"
);
$this->assertEquals(
- $db->addIdentifierQuotes( 'nice_db' ) . '.' . $db->addIdentifierQuotes( 'page' ),
+ $this->quoteTable( $db, 'nice_db' ) . '.' . $this->quoteTable( $db, 'page' ),
$db->tableName( 'nice_db.page' ),
"Correct full table name"
);
$factory->setDomainPrefix( 'my_' );
$this->assertEquals(
- $db->addIdentifierQuotes( 'my_page' ),
+ $this->quoteTable( $db, 'my_page' ),
$db->tableName( 'page' ),
"Correct full table name"
);
$this->assertEquals(
- $db->addIdentifierQuotes( 'other_nice_db' ) . '.' . $db->addIdentifierQuotes( 'page' ),
+ $this->quoteTable( $db, 'other_nice_db' ) . '.' . $this->quoteTable( $db, 'page' ),
$db->tableName( 'other_nice_db.page' ),
"Correct full table name"
);
\MediaWiki\restoreWarnings();
$this->assertEquals(
- $db->addIdentifierQuotes( 'garbage-db' ) . '.' . $db->addIdentifierQuotes( 'page' ),
+ $this->quoteTable( $db, 'garbage-db' ) . '.' . $this->quoteTable( $db, 'page' ),
$db->tableName( 'garbage-db.page' ),
"Correct full table name"
);
$factory->closeAll();
$factory->destroy();
}
+
+ private function quoteTable( Database $db, $table ) {
+ if ( $db->getType() === 'sqlite' ) {
+ return $table;
+ } else {
+ return $db->addIdentifierQuotes( $table );
+ }
+ }
}