diff --git a/.github/workflows/push-pot.yml b/.github/workflows/push-pot.yml index 92fb40d4c5..1787996ee1 100644 --- a/.github/workflows/push-pot.yml +++ b/.github/workflows/push-pot.yml @@ -3,6 +3,7 @@ on: push: branches: - '3.0' + - 'lastochka42/update-po' permissions: contents: write jobs: @@ -15,7 +16,7 @@ jobs: - name: Generate Portable Object Templates run: | cmake . - make update-pot + make update-po - name: Commit generated pots run: | @@ -28,7 +29,7 @@ jobs: exit 0 fi - git add locale/en - git commit -m "updated pot" - git push origin 3.0 + git add locale/ + git commit -m "updated locale" + git push origin lastochka42/update-po diff --git a/locale/en/book/connectors/community.pot b/locale/en/book/connectors/community.pot index 94a09964cb..2f4f787dbc 100644 --- a/locale/en/book/connectors/community.pot +++ b/locale/en/book/connectors/community.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: Tarantool 3.0\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-11-17 14:22+0000\n" +"POT-Creation-Date: 2023-12-20 12:25+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -16,6 +16,10 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" +#: ../../doc/book/connectors/community.rst:9 +msgid "C++" +msgstr "" + #: ../../doc/book/connectors/community.rst:4 msgid "Community-supported connectors" msgstr "" diff --git a/locale/en/book/connectors/cxx/tntcxx_api.pot b/locale/en/book/connectors/cxx/tntcxx_api.pot new file mode 100644 index 0000000000..87a465aac9 --- /dev/null +++ b/locale/en/book/connectors/cxx/tntcxx_api.pot @@ -0,0 +1,833 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) +# This file is distributed under the same license as the Tarantool package. +# FIRST AUTHOR , YEAR. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Tarantool 3.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2023-12-20 12:25+0000\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:4 +msgid "C++ connector API" +msgstr "" + +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:6 +msgid "The official C++ connector for Tarantool is located in the `tanartool/tntcxx `_ repository." +msgstr "" + +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:9 +msgid "It is not supplied as part of the Tarantool repository and requires additional actions for usage. The connector itself is a header-only library and, as such, doesn't require installation and building. All you need is to clone the connector source code and embed it in your C++ project. See the :doc:`C++ connector Getting started ` document for details and examples." +msgstr "" + +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:16 +msgid "Below is the description of the connector public API." +msgstr "" + +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:25 +msgid "Connector class" +msgstr "" + +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:30 +msgid "The ``Connector`` class is a template class that defines a connector client which can handle many connections to Tarantool instances asynchronously." +msgstr "" + +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:33 +msgid "To instantiate a client, you should specify the buffer and the network provider implementations as template parameters. You can either implement your own buffer or network provider or use the default ones." +msgstr "" + +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:37 +msgid "The default connector instantiation looks as follows:" +msgstr "" + +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:39 +msgid "using Buf_t = tnt::Buffer<16 * 1024>;\n" +"using Net_t = EpollNetProvider;\n" +"Connector client;" +msgstr "" + +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:47 +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:298 +msgid "Public methods" +msgstr "" + +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:49 +msgid ":ref:`connect() `" +msgstr "" + +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:50 +msgid ":ref:`wait() `" +msgstr "" + +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:51 +msgid ":ref:`waitAll() `" +msgstr "" + +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:52 +msgid ":ref:`waitAny() `" +msgstr "" + +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:53 +msgid ":ref:`close() `" +msgstr "" + +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:59 +msgid "Connects to a Tarantool instance that is listening on ``addr:port``. On successful connection, the method returns ``0``. If the host doesn't reply within the timeout period or another error occurs, it returns ``-1``. Then, :ref:`Connection.getError() ` gives the error message." +msgstr "" + +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:0 +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:0 +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:0 +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:0 +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:0 +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:0 +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:0 +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:0 +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:0 +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:0 +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:0 +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:0 +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:0 +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:0 +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:0 +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:0 +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:0 +msgid "Parameters" +msgstr "" + +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:65 +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:116 +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:155 +msgid "object of the :ref:`Connection ` class." +msgstr "" + +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:67 +msgid "address of the host where a Tarantool instance is running." +msgstr "" + +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:69 +msgid "port that a Tarantool instance is listening on." +msgstr "" + +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:70 +msgid "connection timeout, seconds. Optional. Defaults to ``2``." +msgstr "" + +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:0 +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:0 +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:0 +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:0 +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:0 +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:0 +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:0 +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:0 +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:0 +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:0 +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:0 +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:0 +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:0 +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:0 +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:0 +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:0 +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:0 +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:0 +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:0 +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:0 +msgid "Returns" +msgstr "" + +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:72 +msgid "``0`` on success, or ``-1`` otherwise." +msgstr "" + +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:0 +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:0 +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:0 +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:0 +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:0 +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:0 +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:0 +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:0 +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:0 +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:0 +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:0 +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:0 +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:0 +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:0 +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:0 +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:0 +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:0 +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:0 +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:0 +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:0 +msgid "rtype" +msgstr "" + +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:73 +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:125 +msgid "int" +msgstr "" + +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:75 +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:127 +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:167 +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:206 +msgid "**Possible errors:**" +msgstr "" + +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:77 +msgid "connection timeout" +msgstr "" + +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:78 +msgid "refused to connect (due to incorrect address or/and port)" +msgstr "" + +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:79 +msgid "system errors: a socket can't be created; failure of any of the system calls (``fcntl``, ``select``, ``send``, ``receive``)." +msgstr "" + +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:82 +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:137 +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:177 +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:216 +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:245 +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:324 +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:362 +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:396 +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:416 +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:440 +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:470 +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:541 +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:568 +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:593 +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:630 +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:669 +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:698 +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:762 +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:799 +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:828 +msgid "**Example:**" +msgstr "" + +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:84 +msgid "using Buf_t = tnt::Buffer<16 * 1024>;\n" +"using Net_t = EpollNetProvider;\n" +"\n" +"Connector client;\n" +"Connection conn(client);\n" +"\n" +"int rc = client.connect(conn, \"127.0.0.1\", 3301);" +msgstr "" + +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:98 +msgid "The main method responsible for sending a request and checking the response readiness." +msgstr "" + +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:101 +msgid "You should prepare a request beforehand by using the necessary method of the :ref:`Connection ` class, such as :ref:`ping() ` and so on, which encodes the request in the `MessagePack `_ format and saves it in the output connection buffer." +msgstr "" + +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:108 +msgid "``wait()`` sends the request and is polling the ``future`` for the response readiness. Once the response is ready, ``wait()`` returns ``0``. If at ``timeout`` the response isn't ready or another error occurs, it returns ``-1``. Then, :ref:`Connection.getError() ` gives the error message. ``timeout = 0`` means the method is polling the ``future`` until the response is ready." +msgstr "" + +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:118 +msgid "request ID returned by a request method of the :ref:`Connection ` class, such as, :ref:`ping() ` and so on." +msgstr "" + +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:122 +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:162 +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:200 +msgid "waiting timeout, milliseconds. Optional. Defaults to ``0``." +msgstr "" + +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:124 +msgid "``0`` on receiving a response, or ``-1`` otherwise." +msgstr "" + +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:129 +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:169 +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:208 +msgid "timeout exceeded" +msgstr "" + +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:130 +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:170 +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:209 +msgid "other possible errors depend on a network provider used. If the ``EpollNetProvider`` is used, failing of the ``poll``, ``read``, and ``write`` system calls leads to system errors, such as, ``EBADF``, ``ENOTSOCK``, ``EFAULT``, ``EINVAL``, ``EPIPE``, and ``ENOTCONN`` (``EWOULDBLOCK`` and ``EAGAIN`` don't occur in this case)." +msgstr "" + +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:139 +msgid "client.wait(conn, ping, WAIT_TIMEOUT)" +msgstr "" + +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:147 +msgid "Similar to :ref:`wait() `, the method sends the requests prepared and checks the response readiness, but can send several different requests stored in the ``futures`` array. Exceeding the timeout leads to an error; :ref:`Connection.getError() ` gives the error message. ``timeout = 0`` means the method is polling the ``futures`` until all the responses are ready." +msgstr "" + +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:157 +msgid "array with the request IDs returned by request methods of the :ref:`Connection ` class, such as, :ref:`ping() ` and so on." +msgstr "" + +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:161 +msgid "size of the ``futures`` array." +msgstr "" + +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:164 +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:165 +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:240 +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:241 +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:435 +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:436 +msgid "none" +msgstr "" + +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:179 +msgid "rid_t futures[2];\n" +"futures[0] = replace;\n" +"futures[1] = select;\n" +"\n" +"client.waitAll(conn, (rid_t *) &futures, 2);" +msgstr "" + +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:191 +msgid "Sends all requests that are prepared at the moment and is waiting for any first response to be ready. Upon the response readiness, ``waitAny()`` returns the corresponding connection object. If at ``timeout`` no response is ready or another error occurs, it returns ``nullptr``. Then, :ref:`Connection.getError() ` gives the error message. ``timeout = 0`` means no time limitation while waiting for the response readiness." +msgstr "" + +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:202 +msgid "object of the :ref:`Connection ` class on success, or ``nullptr`` on error." +msgstr "" + +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:204 +msgid "Connection*" +msgstr "" + +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:218 +msgid "rid_t f1 = conn.ping();\n" +"rid_t f2 = another_conn.ping();\n" +"\n" +"Connection *first = client.waitAny(WAIT_TIMEOUT);\n" +"if (first == &conn) {\n" +" assert(conn.futureIsReady(f1));\n" +"} else {\n" +" assert(another_conn.futureIsReady(f2));\n" +"}" +msgstr "" + +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:234 +msgid "Closes the connection established earlier by the :ref:`connect() ` method." +msgstr "" + +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:237 +msgid "connection object of the :ref:`Connection ` class." +msgstr "" + +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:243 +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:322 +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:360 +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:394 +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:414 +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:438 +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:468 +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:539 +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:566 +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:591 +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:628 +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:667 +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:696 +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:760 +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:797 +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:826 +msgid "**Possible errors:** none." +msgstr "" + +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:247 +msgid "client.close(conn);" +msgstr "" + +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:254 +msgid "Connection class" +msgstr "" + +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:259 +msgid "The ``Connection`` class is a template class that defines a connection objects which is required to interact with a Tarantool instance. Each connection object is bound to a single socket." +msgstr "" + +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:263 +msgid "Similar to a :ref:`connector client `, a connection object also takes the buffer and the network provider as template parameters, and they must be the same as ones of the client. For example:" +msgstr "" + +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:267 +msgid "//Instantiating a connector client\n" +"using Buf_t = tnt::Buffer<16 * 1024>;\n" +"using Net_t = EpollNetProvider;\n" +"Connector client;\n" +"\n" +"//Instantiating connection objects\n" +"Connection conn01(client);\n" +"Connection conn02(client);" +msgstr "" + +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:278 +msgid "The ``Connection`` class has two nested classes, namely, :ref:`Space ` and :ref:`Index ` that implement the data-manipulation methods like ``select()``, ``replace()``, and so on." +msgstr "" + +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:288 +msgid "Public types" +msgstr "" + +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:294 +msgid "The alias of the built-in ``size_t`` type. ``rid_t`` is used for entities that return or contain a request ID." +msgstr "" + +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:300 +msgid ":ref:`call() `" +msgstr "" + +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:301 +msgid ":ref:`futureIsReady() `" +msgstr "" + +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:302 +msgid ":ref:`getResponse() `" +msgstr "" + +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:303 +msgid ":ref:`getError() `" +msgstr "" + +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:304 +msgid ":ref:`reset() `" +msgstr "" + +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:305 +msgid ":ref:`ping() `" +msgstr "" + +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:312 +msgid "Executes a call of a remote stored-procedure similar to :ref:`conn:call() `. The method returns the request ID that is used to get the response by :ref:`getResponse() `." +msgstr "" + +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:316 +msgid "a remote stored-procedure name." +msgstr "" + +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:317 +msgid "procedure's arguments." +msgstr "" + +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:319 +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:389 +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:465 +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:536 +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:563 +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:588 +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:625 +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:664 +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:693 +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:757 +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:794 +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:823 +msgid "a request ID" +msgstr "" + +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:320 +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:466 +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:537 +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:564 +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:589 +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:626 +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:665 +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:694 +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:758 +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:795 +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:824 +msgid "rid_t" +msgstr "" + +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:326 +msgid "The following function is defined on the Tarantool instance you are connected to:" +msgstr "" + +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:329 +msgid "box.execute(\"DROP TABLE IF EXISTS t;\")\n" +"box.execute(\"CREATE TABLE t(id INT PRIMARY KEY, a TEXT, b DOUBLE);\")\n" +"\n" +"function remote_replace(arg1, arg2, arg3)\n" +" return box.space.T:replace({arg1, arg2, arg3})\n" +"end" +msgstr "" + +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:338 +msgid "The function call can look as follows:" +msgstr "" + +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:340 +msgid "rid_t f1 = conn.call(\"remote_replace\", std::make_tuple(5, \"some_sring\", 5.55));" +msgstr "" + +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:348 +msgid "Checks availability of a request ID (``future``) returned by any of the request methods, such as, :ref:`ping() ` and so on." +msgstr "" + +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:352 +msgid "``futureIsReady()`` returns ``true`` if the ``future`` is available or ``false`` otherwise." +msgstr "" + +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:355 +msgid "a request ID." +msgstr "" + +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:357 +msgid "``true`` or ``false``" +msgstr "" + +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:358 +msgid "bool" +msgstr "" + +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:364 +msgid "rid_t ping = conn.ping();\n" +"conn.futureIsReady(ping);" +msgstr "" + +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:373 +msgid "The method takes a request ID (``future``) as an argument and returns an optional object containing a response. If the response is not ready, the method returns ``std::nullopt``. Note that for each ``future`` the method can be called only once because it erases the request ID from the internal map as soon as the response is returned to a user." +msgstr "" + +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:380 +msgid "A response consists of a header (``response.header``) and a body (``response.body``). Depending on success of the request execution on the server side, body may contain either runtime errors accessible by ``response.body.error_stack`` or data (tuples) accessible by ``response.body.data``. Data is a vector of tuples. However, tuples are not decoded and come in the form of pointers to the start and the end of MessagePacks. For details on decoding the data received, refer to :ref:`\"Decoding and reading the data\" `." +msgstr "" + +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:391 +msgid "a response object or ``std::nullopt``" +msgstr "" + +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:392 +msgid "std::optional>" +msgstr "" + +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:398 +msgid "rid_t ping = conn.ping();\n" +"std::optional> response = conn.getResponse(ping);" +msgstr "" + +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:407 +msgid "Returns an error message for the last error occured during the execution of methods of the :ref:`Connector ` and :ref:`Connection ` classes." +msgstr "" + +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:411 +msgid "an error message" +msgstr "" + +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:412 +msgid "std::string&" +msgstr "" + +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:418 +msgid "int rc = client.connect(conn, address, port);\n" +"\n" +"if (rc != 0) {\n" +" assert(conn.status.is_failed);\n" +" std::cerr << conn.getError() << std::endl;\n" +" return -1;\n" +"}" +msgstr "" + +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:432 +msgid "Resets a connection after errors, that is, cleans up the error message and the connection status." +msgstr "" + +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:442 +msgid "if (client.wait(conn, ping, WAIT_TIMEOUT) != 0) {\n" +" assert(conn.status.is_failed);\n" +" std::cerr << conn.getError() << std::endl;\n" +" conn.reset();\n" +"}" +msgstr "" + +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:454 +msgid "Prepares a request to ping a Tarantool instance." +msgstr "" + +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:456 +msgid "The method encodes the request in the `MessagePack `_ format and queues it in the output connection buffer to be sent later by one of :ref:`Connector's ` methods, namely, :ref:`wait() `, :ref:`waitAll() `, or :ref:`waitAny() `." +msgstr "" + +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:462 +msgid "Returns the request ID that is used to get the response by the :ref:`getResponce() ` method." +msgstr "" + +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:472 +msgid "rid_t ping = conn.ping();" +msgstr "" + +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:477 +msgid "Nested classes and their methods" +msgstr "" + +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:479 +msgid ":ref:`Space `" +msgstr "" + +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:480 +msgid ":ref:`Index `" +msgstr "" + +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:485 +msgid "Space class" +msgstr "" + +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:489 +msgid "``Space`` is a nested class of the :ref:`Connection ` class. It is a public wrapper to access the data-manipulation methods in the way similar to the Tarantool submodule :doc:`box.space`, like, ``space[space_id].select()``, ``space[space_id].replace()``, and so on." +msgstr "" + +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:494 +msgid "All the ``Space`` class methods listed below work in the following way:" +msgstr "" + +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:496 +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:721 +msgid "A method encodes the corresponding request in the `MessagePack `_ format and queues it in the output connection buffer to be sent later by one of :ref:`Connector's ` methods, namely, :ref:`wait() `, :ref:`waitAll() `, or :ref:`waitAny() `." +msgstr "" + +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:502 +msgid "A method returns the request ID. To get and read the actual data requested, first you need to get the response object by using the :ref:`getResponce() ` method and then :ref:`decode ` the data." +msgstr "" + +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:507 +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:733 +msgid "**Public methods**:" +msgstr "" + +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:509 +msgid ":ref:`select() `" +msgstr "" + +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:510 +msgid ":ref:`replace() `" +msgstr "" + +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:511 +msgid ":ref:`insert() `" +msgstr "" + +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:512 +msgid ":ref:`update() `" +msgstr "" + +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:513 +msgid ":ref:`upsert() `" +msgstr "" + +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:514 +msgid ":ref:`delete_() `" +msgstr "" + +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:521 +msgid "Searches for a tuple or a set of tuples in the given space. The method works similar to :doc:`/reference/reference_lua/box_space/select` and performs the search against the primary index (``index_id = 0``) by default. In other words, ``space[space_id].select()`` equals to ``space[space_id].index[0].select()``." +msgstr "" + +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:527 +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:620 +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:690 +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:749 +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:790 +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:821 +msgid "value to be matched against the index key." +msgstr "" + +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:528 +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:623 +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:691 +msgid "index ID. Optional. Defaults to ``0``." +msgstr "" + +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:529 +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:750 +msgid "maximum number of tuples to select. Optional. Defaults to ``UINT32_MAX``." +msgstr "" + +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:531 +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:752 +msgid "number of tuples to skip. Optional. Defaults to ``0``." +msgstr "" + +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:533 +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:754 +msgid "the type of iterator. Optional. Defaults to ``EQ``." +msgstr "" + +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:543 +msgid "/* Equals to space_object:select({key_value}, {limit = 1}) in Tarantool*/\n" +"uint32_t space_id = 512;\n" +"int key_value = 5;\n" +"uint32_t limit = 1;\n" +"auto i = conn.space[space_id];\n" +"rid_t select = i.select(std::make_tuple(key_value), index_id, limit, offset, iter);" +msgstr "" + +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:557 +msgid "Inserts a tuple into the given space. If a tuple with the same primary key already exists, ``replace()`` replaces the existing tuple with a new one. The method works similar to :doc:`/reference/reference_lua/box_space/replace`." +msgstr "" + +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:561 +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:586 +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:658 +msgid "a tuple to insert." +msgstr "" + +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:570 +msgid "/* Equals to space_object:replace(key_value, \"111\", 1.01) in Tarantool*/\n" +"uint32_t space_id = 512;\n" +"int key_value = 5;\n" +"std::tuple data = std::make_tuple(key_value, \"111\", 1.01);\n" +"rid_t replace = conn.space[space_id].replace(data);" +msgstr "" + +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:583 +msgid "Inserts a tuple into the given space. The method works similar to :doc:`/reference/reference_lua/box_space/insert`." +msgstr "" + +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:595 +msgid "/* Equals to space_object:insert(key_value, \"112\", 2.22) in Tarantool*/\n" +"uint32_t space_id = 512;\n" +"int key_value = 6;\n" +"std::tuple data = std::make_tuple(key_value, \"112\", 2.22);\n" +"rid_t insert = conn.space[space_id].insert(data);" +msgstr "" + +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:608 +msgid "Updates a tuple in the given space. The method works similar to :doc:`/reference/reference_lua/box_space/update` and searches for the tuple to update against the primary index (``index_id = 0``) by default. In other words, ``space[space_id].update()`` equals to ``space[space_id].index[0].update()``." +msgstr "" + +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:614 +msgid "The ``tuple`` parameter specifies an update operation, an identifier of the field to update, and a new field value. The set of available operations and the format of specifying an operation and a field identifier is the same as in Tarantool. Refer to the description of :doc:` ` and example below for details." +msgstr "" + +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:621 +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:659 +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:791 +msgid "parameters for the update operation, namely, ``operator, field_identifier, value``." +msgstr "" + +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:632 +msgid "/* Equals to space_object:update(key, {{'=', 1, 'update' }, {'+', 2, 12}}) in Tarantool*/\n" +"uint32_t space_id = 512;\n" +"std::tuple key = std::make_tuple(5);\n" +"std::tuple op1 = std::make_tuple(\"=\", 1, \"update\");\n" +"std::tuple op2 = std::make_tuple(\"+\", 2, 12);\n" +"rid_t f1 = conn.space[space_id].update(key, std::make_tuple(op1, op2));" +msgstr "" + +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:646 +msgid "Updates or inserts a tuple in the given space. The method works similar to :doc:`/reference/reference_lua/box_space/upsert`." +msgstr "" + +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:649 +msgid "If there is an existing tuple that matches the key fields of ``tuple``, the request has the same effect as :ref:`update() ` and the ``ops`` parameter is used. If there is no existing tuple that matches the key fields of ``tuple``, the request has the same effect as :ref:`insert() ` and the ``tuple`` parameter is used." +msgstr "" + +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:661 +msgid "starting number to count fields in a tuple: ``0`` or ``1``. Optional. Defaults to ``0``." +msgstr "" + +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:671 +msgid "/* Equals to space_object:upsert({333, \"upsert-insert\", 0.0}, {{'=', 1, 'upsert-update'}}) in Tarantool*/\n" +"uint32_t space_id = 512;\n" +"std::tuple tuple = std::make_tuple(333, \"upsert-insert\", 0.0);\n" +"std::tuple op1 = std::make_tuple(\"=\", 1, \"upsert-update\");\n" +"rid_t f1 = conn.space[space_id].upsert(tuple, std::make_tuple(op1));" +msgstr "" + +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:684 +msgid "Deletes a tuple in the given space. The method works similar to :doc:`/reference/reference_lua/box_space/delete` and searches for the tuple to delete against the primary index (``index_id = 0``) by default. In other words, ``space[space_id].delete_()`` equals to ``space[space_id].index[0].delete_()``." +msgstr "" + +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:700 +msgid "/* Equals to space_object:delete(123) in Tarantool*/\n" +"uint32_t space_id = 512;\n" +"std::tuple key = std::make_tuple(123);\n" +"rid_t f1 = conn.space[space_id].delete_(key);" +msgstr "" + +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:710 +msgid "Index class" +msgstr "" + +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:714 +msgid "``Index`` is a nested class of the :ref:`Space ` class. It is a public wrapper to access the data-manipulation methods in the way similar to the Tarantool submodule :doc:`box.index `, like, ``space[space_id].index[index_id].select()`` and so on." +msgstr "" + +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:719 +msgid "All the ``Index`` class methods listed below work in the following way:" +msgstr "" + +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:727 +msgid "A method returns the request ID that is used to get the response by the :ref:`getResponce() ` method. Refer to the :ref:`getResponce() ` description to understand the response structure and how to read the requested data." +msgstr "" + +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:735 +msgid ":ref:`select() `" +msgstr "" + +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:736 +msgid ":ref:`update() `" +msgstr "" + +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:737 +msgid ":ref:`delete_() `" +msgstr "" + +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:744 +msgid "This is an alternative to :ref:`space.select() `. The method searches for a tuple or a set of tuples in the given space against a particular index and works similar to :doc:`/reference/reference_lua/box_index/select`." +msgstr "" + +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:764 +msgid "/* Equals to index_object:select({key}, {limit = 1}) in Tarantool*/\n" +"uint32_t space_id = 512;\n" +"uint32_t index_id = 1;\n" +"int key = 10;\n" +"uint32_t limit = 1;\n" +"auto i = conn.space[space_id].index[index_id];\n" +"rid_t select = i.select(std::make_tuple(key), limit, offset, iter);" +msgstr "" + +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:779 +msgid "This is an alternative to :ref:`space.update() `. The method updates a tuple in the given space but searches for the tuple against a particular index. The method works similar to :doc:`/reference/reference_lua/box_index/update`." +msgstr "" + +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:784 +msgid "The ``tuple`` parameter specifies an update operation, an identifier of the field to update, and a new field value. The set of available operations and the format of specifying an operation and a field identifier is the same as in Tarantool. Refer to the description of :doc:` ` and example below for details." +msgstr "" + +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:801 +msgid "/* Equals to index_object:update(key, {{'=', 1, 'update' }, {'+', 2, 12}}) in Tarantool*/\n" +"uint32_t space_id = 512;\n" +"uint32_t index_id = 1;\n" +"std::tuple key = std::make_tuple(10);\n" +"std::tuple op1 = std::make_tuple(\"=\", 1, \"update\");\n" +"std::tuple op2 = std::make_tuple(\"+\", 2, 12);\n" +"rid_t f1 = conn.space[space_id].index[index_id].update(key, std::make_tuple(op1, op2));" +msgstr "" + +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:816 +msgid "This is an alternative to :ref:`space.delete_() `. The method deletes a tuple in the given space but searches for the tuple against a particular index. The method works similar to :doc:`/reference/reference_lua/box_index/delete`." +msgstr "" + +#: ../../doc/book/connectors/cxx/tntcxx_api.rst:830 +msgid "/* Equals to index_object:delete(123) in Tarantool*/\n" +"uint32_t space_id = 512;\n" +"uint32_t index_id = 1;\n" +"std::tuple key = std::make_tuple(123);\n" +"rid_t f1 = conn.space[space_id].index[index_id].delete_(key);" +msgstr "" diff --git a/locale/en/contributing/docs/build.pot b/locale/en/contributing/docs/build.pot index da676125aa..02faa91570 100644 --- a/locale/en/contributing/docs/build.pot +++ b/locale/en/contributing/docs/build.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: Tarantool 3.0\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-11-17 14:22+0000\n" +"POT-Creation-Date: 2023-12-20 12:25+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -19,3 +19,259 @@ msgstr "" #: ../../doc/contributing/docs/build.rst:2 msgid "Building Tarantool Docs" msgstr "" + +#: ../../doc/contributing/docs/_includes/README.rst:2 +msgid "How to build Tarantool documentation using Docker" +msgstr "" + +#: ../../doc/contributing/docs/_includes/README.rst:4 +msgid "See `Docker `_" +msgstr "" + +#: ../../doc/contributing/docs/_includes/README.rst:7 +msgid "Prepare for work" +msgstr "" + +#: ../../doc/contributing/docs/_includes/README.rst:9 +msgid "First of all, pull the image for building the docs." +msgstr "" + +#: ../../doc/contributing/docs/_includes/README.rst:11 +msgid "docker pull tarantool/doc-builder:fat-4.3" +msgstr "" + +#: ../../doc/contributing/docs/_includes/README.rst:15 +msgid "Next, initialize a Makefile for your OS:" +msgstr "" + +#: ../../doc/contributing/docs/_includes/README.rst:17 +msgid "docker run --rm -it -v $(pwd):/doc tarantool/doc-builder:fat-4.3 sh -c \"cmake .\"" +msgstr "" + +#: ../../doc/contributing/docs/_includes/README.rst:22 +msgid "Update submodules and generate documentation sources from code" +msgstr "" + +#: ../../doc/contributing/docs/_includes/README.rst:24 +msgid "A big part of documentation sources comes from several other projects, connected as Git submodules. To include their latest contents in the docs, run these two steps." +msgstr "" + +#: ../../doc/contributing/docs/_includes/README.rst:28 +msgid "Update the submodules:" +msgstr "" + +#: ../../doc/contributing/docs/_includes/README.rst:30 +msgid "git submodule update --init\n" +"git fetch --recurse-submodules\n" +"git submodule update --remote --checkout" +msgstr "" + +#: ../../doc/contributing/docs/_includes/README.rst:36 +msgid "This will initialize Git submodules and update them to the top of the stable branch in each repository." +msgstr "" + +#: ../../doc/contributing/docs/_includes/README.rst:39 +msgid "``git submodule update`` can sometimes fail, for example, when you have changes in submodules' files. You can reinitialize submodules to fix the problem." +msgstr "" + +#: ../../doc/contributing/docs/_includes/README.rst:43 +msgid "**Caution:** all untracked changes in submodules will be lost!" +msgstr "" + +#: ../../doc/contributing/docs/_includes/README.rst:45 +msgid "git submodule deinit -f .\n" +"git submodule update --init" +msgstr "" + +#: ../../doc/contributing/docs/_includes/README.rst:51 +msgid "Note that there's an option to update submodule repositories with a ``make`` command. However, it's intended for use in a CI environment and not on a local machine." +msgstr "" + +#: ../../doc/contributing/docs/_includes/README.rst:54 +msgid "docker run --rm -it -v $(pwd):/doc tarantool/doc-builder:fat-4.3 sh -c \"make pull-modules\"" +msgstr "" + +#: ../../doc/contributing/docs/_includes/README.rst:58 +msgid "Build the submodules content:" +msgstr "" + +#: ../../doc/contributing/docs/_includes/README.rst:60 +msgid "docker run --rm -it -v $(pwd):/doc tarantool/doc-builder:fat-4.3 sh -c \"make build-modules\"" +msgstr "" + +#: ../../doc/contributing/docs/_includes/README.rst:64 +msgid "This command will do two things:" +msgstr "" + +#: ../../doc/contributing/docs/_includes/README.rst:66 +msgid "Generate documentation source files from the source code" +msgstr "" + +#: ../../doc/contributing/docs/_includes/README.rst:67 +msgid "Copy these files to the right places under the ``./doc/`` directory." +msgstr "" + +#: ../../doc/contributing/docs/_includes/README.rst:69 +msgid "If you're editing submodules locally, repeat this step to view the updated results." +msgstr "" + +#: ../../doc/contributing/docs/_includes/README.rst:72 +msgid "Now you're ready to build and preview the documentation locally." +msgstr "" + +#: ../../doc/contributing/docs/_includes/README.rst:75 +msgid "Build and run the documentation on your machine" +msgstr "" + +#: ../../doc/contributing/docs/_includes/README.rst:77 +msgid "When editing the documentation, you can set up a live-reload server. It will build your documentation and serve it on `127.0.0.1:8000 `_. Every time you make changes in the source files, it will rebuild the docs and refresh the browser page." +msgstr "" + +#: ../../doc/contributing/docs/_includes/README.rst:82 +msgid "docker run --rm -it -p 8000:8000 -v $(pwd):/doc tarantool/doc-builder:fat-4.3 sh -c \"make autobuild\"" +msgstr "" + +#: ../../doc/contributing/docs/_includes/README.rst:86 +msgid "First build will take some time. When it's done, open `127.0.0.1:8000 `_ in the browser. Now when you make changes, they will be rebuilt in a few seconds, and the browser tab with preview will reload automatically." +msgstr "" + +#: ../../doc/contributing/docs/_includes/README.rst:91 +msgid "You can also build the docs manually with ``make html``, and then serve them using python3 built-in server:" +msgstr "" + +#: ../../doc/contributing/docs/_includes/README.rst:94 +msgid "docker run --rm -it -v $(pwd):/doc tarantool/doc-builder:fat-4.3 sh -c \"make html\"\n" +"docker run --rm -it -v $(pwd):/doc tarantool/doc-builder:fat-4.3 sh -c \"make html-ru\"\n" +"python3 -m http.server --directory output/html" +msgstr "" + +#: ../../doc/contributing/docs/_includes/README.rst:100 +msgid "or python2 built-in server:" +msgstr "" + +#: ../../doc/contributing/docs/_includes/README.rst:102 +msgid "cd output/html\n" +"python -m SimpleHTTPServer" +msgstr "" + +#: ../../doc/contributing/docs/_includes/README.rst:107 +msgid "then go to `localhost:8000 `_ in your browser." +msgstr "" + +#: ../../doc/contributing/docs/_includes/README.rst:109 +msgid "There are other commands which can run in the ``tarantool/doc-builder`` container:" +msgstr "" + +#: ../../doc/contributing/docs/_includes/README.rst:112 +msgid "docker run --rm -it -v $(pwd):/doc tarantool/doc-builder:fat-4.3 sh -c \"make html\"\n" +"docker run --rm -it -v $(pwd):/doc tarantool/doc-builder:fat-4.3 sh -c \"make html-ru\"\n" +"docker run --rm -it -v $(pwd):/doc tarantool/doc-builder:fat-4.3 sh -c \"make singlehtml\"\n" +"docker run --rm -it -v $(pwd):/doc tarantool/doc-builder:fat-4.3 sh -c \"make singlehtml-ru\"\n" +"docker run --rm -it -v $(pwd):/doc tarantool/doc-builder:fat-4.3 sh -c \"make pdf\"\n" +"docker run --rm -it -v $(pwd):/doc tarantool/doc-builder:fat-4.3 sh -c \"make pdf-ru\"\n" +"docker run --rm -it -v $(pwd):/doc tarantool/doc-builder:fat-4.3 sh -c \"make json\"\n" +"docker run --rm -it -v $(pwd):/doc tarantool/doc-builder:fat-4.3 sh -c \"make json-ru\"\n" +"docker run --rm -it -v $(pwd):/doc tarantool/doc-builder:fat-4.3 sh -c \"make epub\"\n" +"docker run --rm -it -v $(pwd):/doc tarantool/doc-builder:fat-4.3 sh -c \"make epub-ru\"\n" +"docker run --rm -it -v $(pwd):/doc tarantool/doc-builder:fat-4.3 sh -c \"make update-po\"" +msgstr "" + +#: ../../doc/contributing/docs/_includes/README.rst:127 +msgid "Linkcheck" +msgstr "" + +#: ../../doc/contributing/docs/_includes/README.rst:129 +msgid "There's a specific build mode which checks internal and external links instead of producing a document." +msgstr "" + +#: ../../doc/contributing/docs/_includes/README.rst:131 +msgid "docker run --rm -it -v $(pwd):/doc tarantool/doc-builder:fat-4.3 sh -c \"make linkcheck\"" +msgstr "" + +#: ../../doc/contributing/docs/_includes/README.rst:135 +msgid "If you need to save the linkcheck's report in a file, you can use the following trick:" +msgstr "" + +#: ../../doc/contributing/docs/_includes/README.rst:137 +msgid "docker run --rm -it -v $(pwd):/doc tarantool/doc-builder:fat-4.3 sh -c \"make linkcheck\" 2>&1 | tee linkcheck.log" +msgstr "" + +#: ../../doc/contributing/docs/_includes/README.rst:141 +msgid "Here ``2>&1`` redirects the ``stderr`` output to ``stdout``, and then ``tee`` both shows in on screen and writes to a file." +msgstr "" + +#: ../../doc/contributing/docs/_includes/README.rst:146 +msgid "Vale" +msgstr "" + +#: ../../doc/contributing/docs/_includes/README.rst:148 +msgid "Tarantool documentation uses the Vale linter for checking grammar, style, and word usage. Its configuration is placed in the ``vale.ini`` file located in the root project directory." +msgstr "" + +#: ../../doc/contributing/docs/_includes/README.rst:151 +msgid "To enable RST support in Vale, you need to install Sphinx. Then, you can enable Vale integration in your IDE, for example:" +msgstr "" + +#: ../../doc/contributing/docs/_includes/README.rst:154 +msgid "`VS Code `_" +msgstr "" + +#: ../../doc/contributing/docs/_includes/README.rst:155 +msgid "`IntelliJ-based IDEs `_" +msgstr "" + +#: ../../doc/contributing/docs/_includes/README.rst:159 +msgid "Localization" +msgstr "" + +#: ../../doc/contributing/docs/_includes/README.rst:161 +msgid "Terms:" +msgstr "" + +#: ../../doc/contributing/docs/_includes/README.rst:163 +msgid "**translation unit** (TU) is an atomic piece of text which can be translated. A paragraph, a list item, a heading, image's alt-text and so on." +msgstr "" + +#: ../../doc/contributing/docs/_includes/README.rst:166 +msgid "**translation source files** are the files with translation units in English only. They're located in ``locale/en``." +msgstr "" + +#: ../../doc/contributing/docs/_includes/README.rst:169 +msgid "**translation files** are the files which match original text to translated text. They're located in ``locale/ru``." +msgstr "" + +#: ../../doc/contributing/docs/_includes/README.rst:172 +msgid "To update the translation files, run the `make update-po` task:" +msgstr "" + +#: ../../doc/contributing/docs/_includes/README.rst:174 +msgid "docker run --rm -it -v $(pwd):/doc tarantool/doc-builder:fat-4.3 sh -c \"make update-po\"" +msgstr "" + +#: ../../doc/contributing/docs/_includes/README.rst:178 +msgid "Translate the strings in the updated files and then commit the changes." +msgstr "" + +#: ../../doc/contributing/docs/_includes/README.rst:181 +msgid "How to contribute" +msgstr "" + +#: ../../doc/contributing/docs/_includes/README.rst:183 +msgid "To contribute to documentation, use the `REST `_ format for drafting and submit your updates as a `pull request `_ via GitHub." +msgstr "" + +#: ../../doc/contributing/docs/_includes/README.rst:189 +msgid "To comply with the writing and formatting style, use the `guidelines `_ provided in the documentation, common sense and existing documents." +msgstr "" + +#: ../../doc/contributing/docs/_includes/README.rst:193 +msgid "Notes:" +msgstr "" + +#: ../../doc/contributing/docs/_includes/README.rst:195 +msgid "If you suggest creating a new documentation section (a whole new page), it has to be saved to the relevant section at GitHub." +msgstr "" + +#: ../../doc/contributing/docs/_includes/README.rst:198 +msgid "If you want to contribute to localizing this documentation (for example, into Russian), add your translation strings to ``.po`` files stored in the corresponding locale directory (for example, ``/locale/ru/LC_MESSAGES/`` for Russian). See more about localizing with Sphinx at http://www.sphinx-doc.org/en/stable/intl.html." +msgstr "" diff --git a/locale/en/how-to/getting_started_cxx.pot b/locale/en/how-to/getting_started_cxx.pot new file mode 100644 index 0000000000..6c80121f01 --- /dev/null +++ b/locale/en/how-to/getting_started_cxx.pot @@ -0,0 +1,724 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) +# This file is distributed under the same license as the Tarantool package. +# FIRST AUTHOR , YEAR. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Tarantool 3.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2023-12-20 12:25+0000\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: ../../doc/how-to/getting_started_cxx.rst:3 +msgid "Connecting to Tarantool from C++" +msgstr "" + +#: ../../doc/how-to/getting_started_cxx.rst:5 +msgid "To simplify the start of your working with the Tarantool C++ connector, we will use the `example application `_ from the connector repository. We will go step by step through the application code and explain what each part does." +msgstr "" + +#: ../../doc/how-to/getting_started_cxx.rst:10 +msgid "The following main topics are discussed in this manual:" +msgstr "" + +#: ../../doc/how-to/getting_started_cxx.rst:19 +msgid "Pre-requisites" +msgstr "" + +#: ../../doc/how-to/getting_started_cxx.rst:21 +msgid "To go through this Getting Started exercise, you need the following pre-requisites to be done:" +msgstr "" + +#: ../../doc/how-to/getting_started_cxx.rst:24 +msgid ":ref:`clone the connector source code and ensure having Tarantool and third-party software `" +msgstr "" + +#: ../../doc/how-to/getting_started_cxx.rst:25 +msgid ":ref:`start Tarantool and create a database `" +msgstr "" + +#: ../../doc/how-to/getting_started_cxx.rst:26 +msgid ":ref:`set up access rights `." +msgstr "" + +#: ../../doc/how-to/getting_started_cxx.rst:31 +msgid "Installation" +msgstr "" + +#: ../../doc/how-to/getting_started_cxx.rst:33 +msgid "The Tarantool C++ connector is currently supported for Linux only." +msgstr "" + +#: ../../doc/how-to/getting_started_cxx.rst:35 +msgid "The connector itself is a header-only library, so, it doesn't require installation and building as such. All you need is to clone the connector source code and :ref:`embed ` it in your C++ project." +msgstr "" + +#: ../../doc/how-to/getting_started_cxx.rst:39 +msgid "Also, make sure you have other necessary software and Tarantool installed." +msgstr "" + +#: ../../doc/how-to/getting_started_cxx.rst:43 +msgid "Make sure you have the following third-party software. If you miss some of the items, install them:" +msgstr "" + +#: ../../doc/how-to/getting_started_cxx.rst:46 +msgid "`Git `_, a version control system" +msgstr "" + +#: ../../doc/how-to/getting_started_cxx.rst:47 +msgid "`unzip utility `_" +msgstr "" + +#: ../../doc/how-to/getting_started_cxx.rst:48 +msgid "`gcc compiler `_ complied with the `C++17 standard `_" +msgstr "" + +#: ../../doc/how-to/getting_started_cxx.rst:49 +msgid "`cmake and make tools `_." +msgstr "" + +#: ../../doc/how-to/getting_started_cxx.rst:51 +msgid "If you don't have Tarantool on your OS, install it in one of the ways:" +msgstr "" + +#: ../../doc/how-to/getting_started_cxx.rst:53 +msgid "from a package--refer to `OS-specific instructions `_" +msgstr "" + +#: ../../doc/how-to/getting_started_cxx.rst:54 +msgid "from the `source `_." +msgstr "" + +#: ../../doc/how-to/getting_started_cxx.rst:56 +msgid "Clone the Tarantool C++ connector repository." +msgstr "" + +#: ../../doc/how-to/getting_started_cxx.rst:58 +msgid "git clone git@github.com:tarantool/tntcxx.git" +msgstr "" + +#: ../../doc/how-to/getting_started_cxx.rst:65 +msgid "Starting Tarantool and creating a database" +msgstr "" + +#: ../../doc/how-to/getting_started_cxx.rst:67 +msgid "Start Tarantool :ref:`locally ` or :ref:`in Docker ` and create a space with the following schema and index:" +msgstr "" + +#: ../../doc/how-to/getting_started_cxx.rst:71 +msgid "box.cfg{listen = 3301}\n" +"t = box.schema.space.create('t')\n" +"t:format({\n" +" {name = 'id', type = 'unsigned'},\n" +" {name = 'a', type = 'string'},\n" +" {name = 'b', type = 'number'}\n" +" })\n" +"t:create_index('primary', {\n" +" type = 'hash',\n" +" parts = {'id'}\n" +" })" +msgstr "" + +#: ../../doc/how-to/getting_started_cxx.rst:87 +msgid "Do not close the terminal window where Tarantool is running. You will need it later to connect to Tarantool from your C++ application." +msgstr "" + +#: ../../doc/how-to/getting_started_cxx.rst:93 +msgid "Setting up access rights" +msgstr "" + +#: ../../doc/how-to/getting_started_cxx.rst:95 +msgid "To be able to execute the necessary operations in Tarantool, you need to grant the ``guest`` user with the read-write rights. The simplest way is to grant the user with the :ref:`super role `:" +msgstr "" + +#: ../../doc/how-to/getting_started_cxx.rst:99 +msgid "box.schema.user.grant('guest', 'super')" +msgstr "" + +#: ../../doc/how-to/getting_started_cxx.rst:106 +msgid "Connecting to Tarantool" +msgstr "" + +#: ../../doc/how-to/getting_started_cxx.rst:108 +msgid "There are three main parts of the C++ connector: the IO-zero-copy buffer, the msgpack encoder/decoder, and the client that handles requests." +msgstr "" + +#: ../../doc/how-to/getting_started_cxx.rst:111 +msgid "To set up connection to a Tarantool instance from a C++ application, you need to do the following:" +msgstr "" + +#: ../../doc/how-to/getting_started_cxx.rst:114 +msgid ":ref:`embed the connector into the application `" +msgstr "" + +#: ../../doc/how-to/getting_started_cxx.rst:115 +msgid ":ref:`instantiate a connector client and a connection object `" +msgstr "" + +#: ../../doc/how-to/getting_started_cxx.rst:116 +msgid ":ref:`define connection parameters and invoke the method to connect `" +msgstr "" + +#: ../../doc/how-to/getting_started_cxx.rst:117 +msgid ":ref:`define error handling behavior `." +msgstr "" + +#: ../../doc/how-to/getting_started_cxx.rst:122 +msgid "Embedding connector" +msgstr "" + +#: ../../doc/how-to/getting_started_cxx.rst:124 +msgid "Embed the connector in your C++ application by including the main header:" +msgstr "" + +#: ../../doc/how-to/getting_started_cxx.rst:126 +msgid "#include \"../src/Client/Connector.hpp\"\n" +"" +msgstr "" + +#: ../../doc/how-to/getting_started_cxx.rst:134 +msgid "Instantiating objects" +msgstr "" + +#: ../../doc/how-to/getting_started_cxx.rst:136 +msgid "First, we should create a connector client. It can handle many connections to Tarantool instances asynchronously. To instantiate a client, you should specify the buffer and the network provider implementations as template parameters. The connector's main class has the following signature:" +msgstr "" + +#: ../../doc/how-to/getting_started_cxx.rst:141 +msgid "template>\n" +"class Connector;" +msgstr "" + +#: ../../doc/how-to/getting_started_cxx.rst:146 +msgid "The buffer is parametrized by allocator. It means that users can choose which allocator will be used to provide memory for the buffer's blocks. Data is organized into a linked list of blocks of fixed size that is specified as the template parameter of the buffer." +msgstr "" + +#: ../../doc/how-to/getting_started_cxx.rst:151 +msgid "You can either implement your own buffer or network provider or use the default ones as we do in our example. So, the default connector instantiation looks as follows:" +msgstr "" + +#: ../../doc/how-to/getting_started_cxx.rst:155 +msgid "using Buf_t = tnt::Buffer<16 * 1024>;\n" +"#include \"../src/Client/LibevNetProvider.hpp\"\n" +"using Net_t = LibevNetProvider;\n" +"" +msgstr "" + +#: ../../doc/how-to/getting_started_cxx.rst:160 +msgid "Connector client;\n" +"" +msgstr "" + +#: ../../doc/how-to/getting_started_cxx.rst:166 +msgid "To use the ``BUFFER`` class, the buffer header should also be included:" +msgstr "" + +#: ../../doc/how-to/getting_started_cxx.rst:168 +msgid "#include \"../src/Buffer/Buffer.hpp\"\n" +"" +msgstr "" + +#: ../../doc/how-to/getting_started_cxx.rst:173 +msgid "A client itself is not enough to work with Tarantool instances--we also need to create connection objects. A connection also takes the buffer and the network provider as template parameters. Note that they must be the same as ones of the client:" +msgstr "" + +#: ../../doc/how-to/getting_started_cxx.rst:178 +msgid "Connection conn(client);\n" +"" +msgstr "" + +#: ../../doc/how-to/getting_started_cxx.rst:187 +msgid "Connecting" +msgstr "" + +#: ../../doc/how-to/getting_started_cxx.rst:189 +msgid "Our :ref:`Tarantool instance ` is listening to the ``3301`` port on ``localhost``. Let's define the corresponding variables as well as the ``WAIT_TIMEOUT`` variable for connection timeout." +msgstr "" + +#: ../../doc/how-to/getting_started_cxx.rst:194 +msgid "const char *address = \"127.0.0.1\";\n" +"int port = 3301;\n" +"int WAIT_TIMEOUT = 1000; //milliseconds\n" +"" +msgstr "" + +#: ../../doc/how-to/getting_started_cxx.rst:199 +msgid "To connect to the Tarantool instance, we should invoke the ``Connector::connect()`` method of the client object and pass three arguments: connection instance, address, and port." +msgstr "" + +#: ../../doc/how-to/getting_started_cxx.rst:203 +msgid "int rc = client.connect(conn, {.address = address,\n" +" .service = std::to_string(port),\n" +" /*.user = ...,*/\n" +" /*.passwd = ...,*/\n" +" /* .transport = STREAM_SSL, */});\n" +"" +msgstr "" + +#: ../../doc/how-to/getting_started_cxx.rst:212 +msgid "Error handling" +msgstr "" + +#: ../../doc/how-to/getting_started_cxx.rst:214 +msgid "Implementation of the connector is exception free, so we rely on the return codes: in case of fail, the ``connect()`` method returns ``rc < 0``. To get the error message corresponding to the last error occured during communication with the instance, we can invoke the ``Connection::getError()`` method." +msgstr "" + +#: ../../doc/how-to/getting_started_cxx.rst:220 +msgid "if (rc != 0) {\n" +" //assert(conn.getError().saved_errno != 0);\n" +" std::cerr << conn.getError().msg << std::endl;\n" +" return -1;\n" +"}\n" +"" +msgstr "" + +#: ../../doc/how-to/getting_started_cxx.rst:226 +msgid "To reset connection after errors, that is, to clean up the error message and connection status, the ``Connection::reset()`` method is used." +msgstr "" + +#: ../../doc/how-to/getting_started_cxx.rst:234 +msgid "Working with requests" +msgstr "" + +#: ../../doc/how-to/getting_started_cxx.rst:236 +msgid "In this section, we will show how to:" +msgstr "" + +#: ../../doc/how-to/getting_started_cxx.rst:238 +msgid ":ref:`prepare different types of requests `" +msgstr "" + +#: ../../doc/how-to/getting_started_cxx.rst:239 +msgid ":ref:`send the requests `" +msgstr "" + +#: ../../doc/how-to/getting_started_cxx.rst:240 +msgid ":ref:`receive and handle responses `." +msgstr "" + +#: ../../doc/how-to/getting_started_cxx.rst:242 +msgid "We will also go through the :ref:`case of having several connections ` and executing a number of requests from different connections simultaneously." +msgstr "" + +#: ../../doc/how-to/getting_started_cxx.rst:245 +msgid "In our example C++ application, we execute the following types of requests:" +msgstr "" + +#: ../../doc/how-to/getting_started_cxx.rst:247 +msgid "``ping``" +msgstr "" + +#: ../../doc/how-to/getting_started_cxx.rst:248 +msgid "``replace``" +msgstr "" + +#: ../../doc/how-to/getting_started_cxx.rst:249 +msgid "``select``." +msgstr "" + +#: ../../doc/how-to/getting_started_cxx.rst:253 +msgid "Examples on other request types, namely, ``insert``, ``delete``, ``upsert``, and ``update``, will be added to this manual later." +msgstr "" + +#: ../../doc/how-to/getting_started_cxx.rst:256 +msgid "Each request method returns a request ID that is a sort of `future `_. This ID can be used to get the response message when it is ready. Requests are queued in the output buffer of connection until the ``Connector::wait()`` method is called." +msgstr "" + +#: ../../doc/how-to/getting_started_cxx.rst:264 +msgid "Preparing requests" +msgstr "" + +#: ../../doc/how-to/getting_started_cxx.rst:266 +msgid "At this step, requests are encoded in the `MessagePack `_ format and saved in the output connection buffer. They are ready to be sent but the network communication itself will be done later." +msgstr "" + +#: ../../doc/how-to/getting_started_cxx.rst:271 +msgid "Let's remind that for the requests manipulating with data we are dealing with the Tarantool space ``t`` :ref:`created earlier `, and the space has the following format:" +msgstr "" + +#: ../../doc/how-to/getting_started_cxx.rst:275 +msgid "t:format({\n" +" {name = 'id', type = 'unsigned'},\n" +" {name = 'a', type = 'string'},\n" +" {name = 'b', type = 'number'}\n" +" })" +msgstr "" + +#: ../../doc/how-to/getting_started_cxx.rst:283 +msgid "**ping**" +msgstr "" + +#: ../../doc/how-to/getting_started_cxx.rst:285 +msgid "rid_t ping = conn.ping();\n" +"" +msgstr "" + +#: ../../doc/how-to/getting_started_cxx.rst:291 +msgid "**replace**" +msgstr "" + +#: ../../doc/how-to/getting_started_cxx.rst:293 +msgid "Equals to Lua request ``:replace(pk_value, \"111\", 1)``." +msgstr "" + +#: ../../doc/how-to/getting_started_cxx.rst:295 +msgid "uint32_t space_id = 512;\n" +"int pk_value = 666;\n" +"std::tuple data = std::make_tuple(pk_value /* field 1*/, \"111\" /* field 2*/, 1.01 /* field 3*/);\n" +"rid_t replace = conn.space[space_id].replace(data);\n" +"" +msgstr "" + +#: ../../doc/how-to/getting_started_cxx.rst:301 +msgid "**select**" +msgstr "" + +#: ../../doc/how-to/getting_started_cxx.rst:303 +msgid "Equals to Lua request ``.index[0]:select({pk_value}, {limit = 1})``." +msgstr "" + +#: ../../doc/how-to/getting_started_cxx.rst:305 +msgid "uint32_t index_id = 0;\n" +"uint32_t limit = 1;\n" +"uint32_t offset = 0;\n" +"IteratorType iter = IteratorType::EQ;\n" +"auto i = conn.space[space_id].index[index_id];\n" +"rid_t select = i.select(std::make_tuple(pk_value), limit, offset, iter);\n" +"" +msgstr "" + +#: ../../doc/how-to/getting_started_cxx.rst:314 +msgid "Sending requests" +msgstr "" + +#: ../../doc/how-to/getting_started_cxx.rst:316 +msgid "To send requests to the server side, invoke the ``client.wait()`` method." +msgstr "" + +#: ../../doc/how-to/getting_started_cxx.rst:319 +msgid "client.wait(conn, ping, WAIT_TIMEOUT);" +msgstr "" + +#: ../../doc/how-to/getting_started_cxx.rst:323 +msgid "The ``wait()`` method takes the connection to poll, the request ID, and, optionally, the timeout as parameters. Once a response for the specified request is ready, ``wait()`` terminates. It also provides a negative return code in case of system related fails, for example, a broken or timeouted connection. If ``wait()`` returns ``0``, then a response has been received and expected to be parsed." +msgstr "" + +#: ../../doc/how-to/getting_started_cxx.rst:330 +msgid "Now let's send our requests to the Tarantool instance. The ``futureIsReady()`` function checks availability of a future and returns ``true`` or ``false``." +msgstr "" + +#: ../../doc/how-to/getting_started_cxx.rst:334 +msgid "while (! conn.futureIsReady(ping)) {\n" +" /*\n" +" * wait() is the main function responsible for sending/receiving\n" +" * requests and implements event-loop under the hood. It may\n" +" * fail due to several reasons:\n" +" * - connection is timed out;\n" +" * - connection is broken (e.g. closed);\n" +" * - epoll is failed.\n" +" */\n" +" if (client.wait(conn, ping, WAIT_TIMEOUT) != 0) {\n" +" std::cerr << conn.getError().msg << std::endl;\n" +" conn.reset();\n" +" }\n" +"}\n" +"" +msgstr "" + +#: ../../doc/how-to/getting_started_cxx.rst:345 +msgid "Receiving responses" +msgstr "" + +#: ../../doc/how-to/getting_started_cxx.rst:347 +msgid "To get the response when it is ready, use the ``Connection::getResponse()`` method. It takes the request ID and returns an optional object containing the response. If the response is not ready yet, the method returns ``std::nullopt``. Note that on each future, ``getResponse()`` can be called only once: it erases the request ID from the internal map once it is returned to a user." +msgstr "" + +#: ../../doc/how-to/getting_started_cxx.rst:354 +msgid "A response consists of a header and a body (``response.header`` and ``response.body``). Depending on success of the request execution on the server side, body may contain either runtime error(s) accessible by ``response.body.error_stack`` or data (tuples)--``response.body.data``. In turn, data is a vector of tuples. However, tuples are not decoded and come in the form of pointers to the start and the end of msgpacks. See the :ref:`\"Decoding and reading the data\" ` section to understand how to decode tuples." +msgstr "" + +#: ../../doc/how-to/getting_started_cxx.rst:363 +msgid "There are two options for single connection it regards to receiving responses: we can either wait for one specific future or for all of them at once. We'll try both options in our example. For the ``ping`` request, let's use the first option." +msgstr "" + +#: ../../doc/how-to/getting_started_cxx.rst:368 +msgid "std::optional> response = conn.getResponse(ping);\n" +"/*\n" +" * Since conn.futureIsReady(ping) returned , then response\n" +" * must be ready.\n" +" */\n" +"assert(response != std::nullopt);\n" +"/*\n" +" * If request is successfully executed on server side, response\n" +" * will contain data (i.e. tuple being replaced in case of :replace()\n" +" * request or tuples satisfying search conditions in case of :select();\n" +" * responses for pings contain nothing - empty map).\n" +" * To tell responses containing data from error responses, one can\n" +" * rely on response code storing in the header or check\n" +" * Response->body.data and Response->body.error_stack members.\n" +" */\n" +"printResponse(conn, *response);\n" +"" +msgstr "" + +#: ../../doc/how-to/getting_started_cxx.rst:374 +msgid "For the ``replace`` and ``select`` requests, let's examine the option of waiting for both futures at once." +msgstr "" + +#: ../../doc/how-to/getting_started_cxx.rst:377 +msgid "/* Let's wait for both futures at once. */\n" +"std::vector futures;\n" +"futures[0] = replace;\n" +"futures[1] = select;\n" +"/* No specified timeout means that we poll futures until they are ready.*/\n" +"client.waitAll(conn, futures);\n" +"for (size_t i = 0; i < futures.size(); ++i) {\n" +" assert(conn.futureIsReady(futures[i]));\n" +" response = conn.getResponse(futures[i]);\n" +" assert(response != std::nullopt);\n" +" printResponse(conn, *response);\n" +"}\n" +"" +msgstr "" + +#: ../../doc/how-to/getting_started_cxx.rst:388 +msgid "Several connections at once" +msgstr "" + +#: ../../doc/how-to/getting_started_cxx.rst:390 +msgid "Now, let's have a look at the case when we establish two connections to Tarantool instance simultaneously." +msgstr "" + +#: ../../doc/how-to/getting_started_cxx.rst:393 +msgid "/* Let's create another connection. */\n" +"Connection another(client);\n" +"if (client.connect(another, {.address = address,\n" +" .service = std::to_string(port),\n" +" /* .transport = STREAM_SSL, */}) != 0) {\n" +" std::cerr << conn.getError().msg << std::endl;\n" +" return -1;\n" +"}\n" +"/* Simultaneously execute two requests from different connections. */\n" +"rid_t f1 = conn.ping();\n" +"rid_t f2 = another.ping();\n" +"/*\n" +" * waitAny() returns the first connection received response.\n" +" * All connections registered via :connect() call are participating.\n" +" */\n" +"std::optional> conn_opt = client.waitAny(WAIT_TIMEOUT);\n" +"Connection first = *conn_opt;\n" +"if (first == conn) {\n" +" assert(conn.futureIsReady(f1));\n" +" (void) f1;\n" +"} else {\n" +" assert(another.futureIsReady(f2));\n" +" (void) f2;\n" +"}\n" +"" +msgstr "" + +#: ../../doc/how-to/getting_started_cxx.rst:404 +msgid "Closing connections" +msgstr "" + +#: ../../doc/how-to/getting_started_cxx.rst:406 +msgid "Finally, a user is responsible for closing connections." +msgstr "" + +#: ../../doc/how-to/getting_started_cxx.rst:408 +msgid "client.close(conn);\n" +"client.close(another);\n" +"" +msgstr "" + +#: ../../doc/how-to/getting_started_cxx.rst:417 +msgid "Building and launching C++ application" +msgstr "" + +#: ../../doc/how-to/getting_started_cxx.rst:419 +msgid "Now, we are going to build our example C++ application, launch it to connect to the Tarantool instance and execute all the requests defined." +msgstr "" + +#: ../../doc/how-to/getting_started_cxx.rst:422 +msgid "Make sure you are in the root directory of the cloned C++ connector repository. To build the example application:" +msgstr "" + +#: ../../doc/how-to/getting_started_cxx.rst:425 +msgid "cd examples\n" +"cmake .\n" +"make" +msgstr "" + +#: ../../doc/how-to/getting_started_cxx.rst:431 +msgid "Make sure the :ref:`Tarantool session ` you started earlier is running. Launch the application:" +msgstr "" + +#: ../../doc/how-to/getting_started_cxx.rst:434 +msgid "./Simple" +msgstr "" + +#: ../../doc/how-to/getting_started_cxx.rst:438 +msgid "As you can see from the execution log, all the connections to Tarantool defined in our application have been established and all the requests have been executed successfully." +msgstr "" + +#: ../../doc/how-to/getting_started_cxx.rst:447 +msgid "Decoding and reading the data" +msgstr "" + +#: ../../doc/how-to/getting_started_cxx.rst:449 +msgid "Responses from a Tarantool instance contain raw data, that is, the data encoded into the `MessagePack `_ tuples. To decode client's data, the user has to write their own decoders (readers) based on the database schema and include them in one's application:" +msgstr "" + +#: ../../doc/how-to/getting_started_cxx.rst:455 +msgid "\n" +"#include \"Reader.hpp\"\n" +"" +msgstr "" + +#: ../../doc/how-to/getting_started_cxx.rst:460 +msgid "To show the logic of decoding a response, we will use `the reader from our example `_." +msgstr "" + +#: ../../doc/how-to/getting_started_cxx.rst:463 +msgid "First, the structure corresponding our :ref:`example space format ` is defined:" +msgstr "" + +#: ../../doc/how-to/getting_started_cxx.rst:466 +msgid "/**\n" +" * Corresponds to tuples stored in user's space:\n" +" * box.execute(\"CREATE TABLE t (id UNSIGNED PRIMARY KEY, a TEXT, d DOUBLE);\")\n" +" */\n" +"struct UserTuple {\n" +" uint64_t field1;\n" +" std::string field2;\n" +" double field3;\n" +"};\n" +"" +msgstr "" + +#: ../../doc/how-to/getting_started_cxx.rst:474 +msgid "Base reader prototype" +msgstr "" + +#: ../../doc/how-to/getting_started_cxx.rst:476 +msgid "Prototype of the base reader is given in ``src/mpp/Dec.hpp``:" +msgstr "" + +#: ../../doc/how-to/getting_started_cxx.rst:478 +msgid "template \n" +"struct SimpleReaderBase : DefaultErrorHandler {\n" +" using BufferIterator_t = typename BUFFER::iterator;\n" +" /* Allowed type of values to be parsed. */\n" +" static constexpr Type VALID_TYPES = TYPE;\n" +" BufferIterator_t* StoreEndIterator() { return nullptr; }\n" +"};" +msgstr "" + +#: ../../doc/how-to/getting_started_cxx.rst:488 +msgid "Every new reader should inherit from it or directly from the ``DefaultErrorHandler``." +msgstr "" + +#: ../../doc/how-to/getting_started_cxx.rst:494 +msgid "Parsing values" +msgstr "" + +#: ../../doc/how-to/getting_started_cxx.rst:496 +msgid "To parse a particular value, we should define the ``Value()`` method. First two arguments of the method are common and unused as a rule, but the third one defines the parsed value. In case of `POD (Plain Old Data) `_ structures, it's enough to provide a byte-to-byte copy. Since there are fields of three different types in our schema, let's define the corresponding ``Value()`` functions:" +msgstr "" + +#: ../../doc/how-to/getting_started_cxx.rst:503 +msgid "struct UserTupleValueReader : mpp::DefaultErrorHandler {\n" +" explicit UserTupleValueReader(UserTuple& t) : tuple(t) {}\n" +" static constexpr mpp::Family VALID_TYPES = mpp::MP_UINT | mpp::MP_STR | mpp::MP_DBL;\n" +" template \n" +" void Value(BufIter_t&, mpp::compact::Family, T v)\n" +" {\n" +" using A = UserTuple;\n" +" static constexpr std::tuple map(&A::field1, &A::field3);\n" +" auto ptr = std::get A::*>(map);\n" +" tuple.*ptr = v;\n" +" }\n" +" void Value(BufIter_t& itr, mpp::compact::Family, mpp::StrValue v)\n" +" {\n" +" BufIter_t tmp = itr;\n" +" tmp += v.offset;\n" +" std::string &dst = tuple.field2;\n" +" while (v.size) {\n" +" dst.push_back(*tmp);\n" +" ++tmp;\n" +" --v.size;\n" +" }\n" +" }\n" +" void WrongType(mpp::Family expected, mpp::Family got)\n" +" {\n" +" std::cout << \"expected type is \" << expected <<\n" +" \" but got \" << got << std::endl;\n" +" }\n" +"\n" +" BufIter_t* StoreEndIterator() { return nullptr; }\n" +" UserTuple& tuple;\n" +"};\n" +"" +msgstr "" + +#: ../../doc/how-to/getting_started_cxx.rst:511 +msgid "Parsing array" +msgstr "" + +#: ../../doc/how-to/getting_started_cxx.rst:513 +msgid "It's also important to understand that a tuple itself is wrapped in an array, so, in fact, we should parse the array first. Let's define another reader for that purpose." +msgstr "" + +#: ../../doc/how-to/getting_started_cxx.rst:517 +msgid "template \n" +"struct UserTupleReader : mpp::SimpleReaderBase {\n" +"\n" +" UserTupleReader(mpp::Dec& d, UserTuple& t) : dec(d), tuple(t) {}\n" +"\n" +" void Value(const iterator_t&, mpp::compact::Family, mpp::ArrValue u)\n" +" {\n" +" assert(u.size == 3);\n" +" (void) u;\n" +" dec.SetReader(false, UserTupleValueReader{tuple});\n" +" }\n" +" mpp::Dec& dec;\n" +" UserTuple& tuple;\n" +"};\n" +"" +msgstr "" + +#: ../../doc/how-to/getting_started_cxx.rst:525 +msgid "Setting reader" +msgstr "" + +#: ../../doc/how-to/getting_started_cxx.rst:527 +msgid "The ``SetReader()`` method sets the reader that is invoked while each of the array's entries is parsed. To make two readers defined above work, we should create a decoder, set its iterator to the position of the encoded tuple, and invoke the ``Read()`` method (the code block below is from the `example application `_)." +msgstr "" + +#: ../../doc/how-to/getting_started_cxx.rst:533 +msgid "template \n" +"std::vector\n" +"decodeUserTuple(BUFFER &buf, Data &data)\n" +"{\n" +" std::vector results;\n" +" for(auto& t: data.tuples) {\n" +" UserTuple tuple;\n" +" mpp::Dec dec(buf);\n" +" dec.SetPosition(t.begin);\n" +" dec.SetReader(false, UserTupleReader{dec, tuple});\n" +" mpp::ReadResult_t res = dec.Read();\n" +" assert(res == mpp::READ_SUCCESS);\n" +" (void) res;\n" +" results.push_back(tuple);\n" +" }\n" +" return results;\n" +"}\n" +"" +msgstr "" diff --git a/locale/en/reference/reference_rock/index.pot b/locale/en/reference/reference_rock/index.pot index 038c68311a..eecea9b58f 100644 --- a/locale/en/reference/reference_rock/index.pot +++ b/locale/en/reference/reference_rock/index.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: Tarantool 3.0\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-11-17 14:22+0000\n" +"POT-Creation-Date: 2023-12-20 12:25+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -16,6 +16,10 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" +#: ../../doc/reference/reference_rock/index.rst:9 +msgid "Module metrics" +msgstr "" + #: ../../doc/reference/reference_rock/index.rst:9 msgid "Module luatest" msgstr "" diff --git a/locale/en/reference/reference_rock/luatest/luatest_overview.pot b/locale/en/reference/reference_rock/luatest/luatest_overview.pot index 4596504bb2..82a555ed64 100644 --- a/locale/en/reference/reference_rock/luatest/luatest_overview.pot +++ b/locale/en/reference/reference_rock/luatest/luatest_overview.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: Tarantool 3.0\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-11-17 14:22+0000\n" +"POT-Creation-Date: 2023-12-20 12:25+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -23,3 +23,786 @@ msgstr "" #: ../../doc/reference/reference_rock/luatest/luatest_overview.rst:5 msgid "More about Luatest API see :ref:`below `." msgstr "" + +#: ../../doc/reference/reference_rock/luatest/README.rst:3 +msgid "Overview" +msgstr "" + +#: ../../doc/reference/reference_rock/luatest/README.rst:5 +msgid "Tool for testing tarantool applications." +msgstr "" + +#: ../../doc/reference/reference_rock/luatest/README.rst:7 +msgid "Highlights:" +msgstr "" + +#: ../../doc/reference/reference_rock/luatest/README.rst:9 +msgid "executable to run tests in directory or specific files," +msgstr "" + +#: ../../doc/reference/reference_rock/luatest/README.rst:10 +msgid "before/after suite hooks," +msgstr "" + +#: ../../doc/reference/reference_rock/luatest/README.rst:11 +msgid "before/after test group hooks," +msgstr "" + +#: ../../doc/reference/reference_rock/luatest/README.rst:12 +msgid "`output capturing `_," +msgstr "" + +#: ../../doc/reference/reference_rock/luatest/README.rst:13 +msgid "`helpers `_ for testing tarantool applications," +msgstr "" + +#: ../../doc/reference/reference_rock/luatest/README.rst:14 +msgid "`luacov integration `_." +msgstr "" + +#: ../../doc/reference/reference_rock/luatest/README.rst:18 +msgid "Requirements" +msgstr "" + +#: ../../doc/reference/reference_rock/luatest/README.rst:20 +msgid "Tarantool (it requires tarantool-specific ``fio`` module and ``ffi`` from LuaJIT)." +msgstr "" + +#: ../../doc/reference/reference_rock/luatest/README.rst:24 +msgid "Installation" +msgstr "" + +#: ../../doc/reference/reference_rock/luatest/README.rst:26 +msgid "tarantoolctl rocks install luatest\n" +".rocks/bin/luatest --help # list available options" +msgstr "" + +#: ../../doc/reference/reference_rock/luatest/README.rst:33 +msgid "Usage" +msgstr "" + +#: ../../doc/reference/reference_rock/luatest/README.rst:35 +msgid "Define tests." +msgstr "" + +#: ../../doc/reference/reference_rock/luatest/README.rst:37 +msgid "-- test/feature_test.lua\n" +"local t = require('luatest')\n" +"local g = t.group('feature')\n" +"-- Default name is inferred from caller filename when possible.\n" +"-- For `test/a/b/c_d_test.lua` it will be `a.b.c_d`.\n" +"-- So `local g = t.group()` works the same way.\n" +"\n" +"-- Tests. All properties with name staring with `test` are treated as test cases.\n" +"g.test_example_1 = function() ... end\n" +"g.test_example_n = function() ... end\n" +"\n" +"-- Define suite hooks\n" +"t.before_suite(function() ... end)\n" +"t.before_suite(function() ... end)\n" +"\n" +"-- Hooks to run once for tests group\n" +"g.before_all(function() ... end)\n" +"g.after_all(function() ... end)\n" +"\n" +"-- Hooks to run for each test in group\n" +"g.before_each(function() ... end)\n" +"g.after_each(function() ... end)\n" +"\n" +"-- Hooks to run for a specified test in group\n" +"g.before_test('test_example_1', function() ... end)\n" +"g.after_test('test_example_2', function() ... end)\n" +"-- before_test runs after before_each\n" +"-- after_test runs before after_each\n" +"\n" +"-- test/other_test.lua\n" +"local t = require('luatest')\n" +"local g = t.group('other')\n" +"-- ...\n" +"g.test_example_2 = function() ... end\n" +"g.test_example_m = function() ... end\n" +"\n" +"-- Define parametrized groups\n" +"local pg = t.group('pgroup', {{engine = 'memtx'}, {engine = 'vinyl'}})\n" +"pg.test_example_3 = function(cg)\n" +" -- Use cg.params here\n" +" box.schema.space.create('test', {\n" +" engine = cg.params.engine,\n" +" })\n" +"end\n" +"\n" +"-- Hooks can be specified for one parameter\n" +"pg.before_all({engine = 'memtx'}, function() ... end)\n" +"pg.before_each({engine = 'memtx'}, function() ... end)\n" +"pg.before_test('test_example_3', {engine = 'vinyl'}, function() ... end)" +msgstr "" + +#: ../../doc/reference/reference_rock/luatest/README.rst:89 +msgid "Run tests from a path." +msgstr "" + +#: ../../doc/reference/reference_rock/luatest/README.rst:91 +msgid "luatest # run all tests from the ./test directory\n" +"luatest test/integration # run all tests from the specified directory\n" +"luatest test/feature_test.lua # run all tests from the specified file" +msgstr "" + +#: ../../doc/reference/reference_rock/luatest/README.rst:97 +msgid "Run tests from a group." +msgstr "" + +#: ../../doc/reference/reference_rock/luatest/README.rst:99 +msgid "luatest feature # run all tests from the specified group\n" +"luatest other.test_example_2 # run one test from the specified group\n" +"luatest feature other.test_example_2 # run tests by group and test name" +msgstr "" + +#: ../../doc/reference/reference_rock/luatest/README.rst:105 +msgid "Note that luatest recognizes an input parameter as a path only if it contains ``/``, otherwise, it will be considered as a group name." +msgstr "" + +#: ../../doc/reference/reference_rock/luatest/README.rst:108 +msgid "luatest feature # considered as a group name\n" +"luatest ./feature # considered as a path\n" +"luatest feature/ # considered as a path" +msgstr "" + +#: ../../doc/reference/reference_rock/luatest/README.rst:114 +msgid "You can also use ``-p`` option in combination with the examples above for running tests matching to some name pattern." +msgstr "" + +#: ../../doc/reference/reference_rock/luatest/README.rst:116 +msgid "luatest feature -p test_example # run all tests from the specified group matching to the specified pattern" +msgstr "" + +#: ../../doc/reference/reference_rock/luatest/README.rst:120 +msgid "Luatest automatically requires ``test/helper.lua`` file if it's present. You can configure luatest or run any bootstrap code there." +msgstr "" + +#: ../../doc/reference/reference_rock/luatest/README.rst:123 +msgid "See the `getting-started example `_ in cartridge-cli repo." +msgstr "" + +#: ../../doc/reference/reference_rock/luatest/README.rst:128 +msgid "Tests order" +msgstr "" + +#: ../../doc/reference/reference_rock/luatest/README.rst:130 +msgid "Use the ``--shuffle`` option to tell luatest how to order the tests. The available ordering schemes are ``group``, ``all`` and ``none``." +msgstr "" + +#: ../../doc/reference/reference_rock/luatest/README.rst:133 +msgid "``group`` shuffles tests within the groups." +msgstr "" + +#: ../../doc/reference/reference_rock/luatest/README.rst:135 +msgid "``all`` randomizes execution order across all available tests. Be careful: ``before_all/after_all`` hooks run always when test group is changed, so it may run multiple time." +msgstr "" + +#: ../../doc/reference/reference_rock/luatest/README.rst:139 +msgid "``none`` is the default, which executes examples within the group in the order they are defined (eventually they are ordered by functions line numbers)." +msgstr "" + +#: ../../doc/reference/reference_rock/luatest/README.rst:142 +msgid "With ``group`` and ``all`` you can also specify a ``seed`` to reproduce specific order." +msgstr "" + +#: ../../doc/reference/reference_rock/luatest/README.rst:144 +msgid "--shuffle none\n" +"--shuffle group\n" +"--shuffle all --seed 123\n" +"--shuffle all:123 # same as above" +msgstr "" + +#: ../../doc/reference/reference_rock/luatest/README.rst:151 +msgid "To change default order use:" +msgstr "" + +#: ../../doc/reference/reference_rock/luatest/README.rst:153 +msgid "-- test/helper.lua\n" +"local t = require('luatest')\n" +"t.configure({shuffle = 'group'})" +msgstr "" + +#: ../../doc/reference/reference_rock/luatest/README.rst:162 +msgid "List of luatest functions" +msgstr "" + +#: ../../doc/reference/reference_rock/luatest/README.rst:165 +msgid "**Assertions**" +msgstr "" + +#: ../../doc/reference/reference_rock/luatest/README.rst:167 +msgid "``assert (value[, message])``" +msgstr "" + +#: ../../doc/reference/reference_rock/luatest/README.rst:167 +msgid "Check that value is truthy." +msgstr "" + +#: ../../doc/reference/reference_rock/luatest/README.rst:169 +msgid "``assert_almost_equals (actual, expected, margin[, message])``" +msgstr "" + +#: ../../doc/reference/reference_rock/luatest/README.rst:169 +msgid "Check that two floats are close by margin." +msgstr "" + +#: ../../doc/reference/reference_rock/luatest/README.rst:171 +msgid "``assert_covers (actual, expected[, message])``" +msgstr "" + +#: ../../doc/reference/reference_rock/luatest/README.rst:171 +msgid "Checks that actual map includes expected one." +msgstr "" + +#: ../../doc/reference/reference_rock/luatest/README.rst:173 +msgid "``assert_lt (left, right[, message])``" +msgstr "" + +#: ../../doc/reference/reference_rock/luatest/README.rst:173 +msgid "Compare numbers." +msgstr "" + +#: ../../doc/reference/reference_rock/luatest/README.rst:175 +msgid "``assert_le (left, right[, message])``" +msgstr "" + +#: ../../doc/reference/reference_rock/luatest/README.rst:177 +msgid "``assert_gt (left, right[, message])``" +msgstr "" + +#: ../../doc/reference/reference_rock/luatest/README.rst:179 +msgid "``assert_ge (left, right[, message])``" +msgstr "" + +#: ../../doc/reference/reference_rock/luatest/README.rst:181 +msgid "``assert_equals (actual, expected[, message[, deep_analysis]])``" +msgstr "" + +#: ../../doc/reference/reference_rock/luatest/README.rst:181 +msgid "Check that two values are equal." +msgstr "" + +#: ../../doc/reference/reference_rock/luatest/README.rst:183 +msgid "``assert_error (fn, ...)``" +msgstr "" + +#: ../../doc/reference/reference_rock/luatest/README.rst:183 +msgid "Check that calling fn raises an error." +msgstr "" + +#: ../../doc/reference/reference_rock/luatest/README.rst:185 +msgid "``assert_error_msg_contains (expected_partial, fn, ...)``" +msgstr "" + +#: ../../doc/reference/reference_rock/luatest/README.rst:187 +msgid "``assert_error_msg_content_equals (expected, fn, ...)``" +msgstr "" + +#: ../../doc/reference/reference_rock/luatest/README.rst:187 +msgid "Strips location info from message text." +msgstr "" + +#: ../../doc/reference/reference_rock/luatest/README.rst:189 +msgid "``assert_error_msg_equals (expected, fn, ...)``" +msgstr "" + +#: ../../doc/reference/reference_rock/luatest/README.rst:189 +msgid "Checks full error: location and text." +msgstr "" + +#: ../../doc/reference/reference_rock/luatest/README.rst:191 +msgid "``assert_error_msg_matches (pattern, fn, ...)``" +msgstr "" + +#: ../../doc/reference/reference_rock/luatest/README.rst:193 +msgid "``assert_eval_to_false (value[, message])``" +msgstr "" + +#: ../../doc/reference/reference_rock/luatest/README.rst:193 +msgid "Alias for assert_not." +msgstr "" + +#: ../../doc/reference/reference_rock/luatest/README.rst:195 +msgid "``assert_eval_to_true (value[, message])``" +msgstr "" + +#: ../../doc/reference/reference_rock/luatest/README.rst:195 +msgid "Alias for assert." +msgstr "" + +#: ../../doc/reference/reference_rock/luatest/README.rst:197 +msgid "``assert_items_include (actual, expected[, message])``" +msgstr "" + +#: ../../doc/reference/reference_rock/luatest/README.rst:197 +msgid "Checks that one table includes all items of another, irrespective of their keys." +msgstr "" + +#: ../../doc/reference/reference_rock/luatest/README.rst:200 +msgid "``assert_is (actual, expected[, message])``" +msgstr "" + +#: ../../doc/reference/reference_rock/luatest/README.rst:200 +msgid "Check that values are the same." +msgstr "" + +#: ../../doc/reference/reference_rock/luatest/README.rst:202 +msgid "``assert_is_not (actual, expected[, message])``" +msgstr "" + +#: ../../doc/reference/reference_rock/luatest/README.rst:202 +msgid "Check that values are not the same." +msgstr "" + +#: ../../doc/reference/reference_rock/luatest/README.rst:204 +msgid "``assert_items_equals (actual, expected[, message])``" +msgstr "" + +#: ../../doc/reference/reference_rock/luatest/README.rst:204 +msgid "Checks that two tables contain the same items, irrespective of their keys." +msgstr "" + +#: ../../doc/reference/reference_rock/luatest/README.rst:207 +msgid "``assert_nan (value[, message])``" +msgstr "" + +#: ../../doc/reference/reference_rock/luatest/README.rst:209 +msgid "``assert_not (value[, message])``" +msgstr "" + +#: ../../doc/reference/reference_rock/luatest/README.rst:209 +msgid "Check that value is falsy." +msgstr "" + +#: ../../doc/reference/reference_rock/luatest/README.rst:211 +msgid "``assert_not_almost_equals (actual, expected, margin[, message])``" +msgstr "" + +#: ../../doc/reference/reference_rock/luatest/README.rst:211 +msgid "Check that two floats are not close by margin" +msgstr "" + +#: ../../doc/reference/reference_rock/luatest/README.rst:213 +msgid "``assert_not_covers (actual, expected[, message])``" +msgstr "" + +#: ../../doc/reference/reference_rock/luatest/README.rst:213 +msgid "Checks that map does not contain the other one." +msgstr "" + +#: ../../doc/reference/reference_rock/luatest/README.rst:216 +msgid "``assert_not_equals (actual, expected[, message])``" +msgstr "" + +#: ../../doc/reference/reference_rock/luatest/README.rst:216 +msgid "Check that two values are not equal." +msgstr "" + +#: ../../doc/reference/reference_rock/luatest/README.rst:218 +msgid "``assert_not_nan (value[, message])``" +msgstr "" + +#: ../../doc/reference/reference_rock/luatest/README.rst:220 +msgid "``assert_not_str_contains (actual, expected[, is_pattern[, message]])``" +msgstr "" + +#: ../../doc/reference/reference_rock/luatest/README.rst:220 +#: ../../doc/reference/reference_rock/luatest/README.rst:225 +msgid "Case-sensitive strings comparison." +msgstr "" + +#: ../../doc/reference/reference_rock/luatest/README.rst:223 +msgid "``assert_not_str_icontains (value, expected[, message])``" +msgstr "" + +#: ../../doc/reference/reference_rock/luatest/README.rst:223 +#: ../../doc/reference/reference_rock/luatest/README.rst:227 +msgid "Case-insensitive strings comparison." +msgstr "" + +#: ../../doc/reference/reference_rock/luatest/README.rst:225 +msgid "``assert_str_contains (value, expected[, is_pattern[, message]])``" +msgstr "" + +#: ../../doc/reference/reference_rock/luatest/README.rst:227 +msgid "``assert_str_icontains (value, expected[, message])``" +msgstr "" + +#: ../../doc/reference/reference_rock/luatest/README.rst:229 +msgid "``assert_str_matches (value, pattern[, start=1[, final=value:len() [, message]]])``" +msgstr "" + +#: ../../doc/reference/reference_rock/luatest/README.rst:229 +msgid "Verify a full match for the string." +msgstr "" + +#: ../../doc/reference/reference_rock/luatest/README.rst:232 +msgid "``assert_type (value, expected_type[, message])``" +msgstr "" + +#: ../../doc/reference/reference_rock/luatest/README.rst:232 +msgid "Check value's type." +msgstr "" + +#: ../../doc/reference/reference_rock/luatest/README.rst:234 +msgid "**Flow control**" +msgstr "" + +#: ../../doc/reference/reference_rock/luatest/README.rst:236 +msgid "``fail (message)``" +msgstr "" + +#: ../../doc/reference/reference_rock/luatest/README.rst:236 +msgid "Stops a test due to a failure." +msgstr "" + +#: ../../doc/reference/reference_rock/luatest/README.rst:238 +msgid "``fail_if (condition, message)``" +msgstr "" + +#: ../../doc/reference/reference_rock/luatest/README.rst:238 +msgid "Stops a test due to a failure if condition is met." +msgstr "" + +#: ../../doc/reference/reference_rock/luatest/README.rst:241 +msgid "``xfail (message)``" +msgstr "" + +#: ../../doc/reference/reference_rock/luatest/README.rst:241 +msgid "Mark test as xfail." +msgstr "" + +#: ../../doc/reference/reference_rock/luatest/README.rst:243 +msgid "``xfail_if (condition, message)``" +msgstr "" + +#: ../../doc/reference/reference_rock/luatest/README.rst:243 +msgid "Mark test as xfail if condition is met." +msgstr "" + +#: ../../doc/reference/reference_rock/luatest/README.rst:245 +msgid "``skip (message)``" +msgstr "" + +#: ../../doc/reference/reference_rock/luatest/README.rst:245 +msgid "Skip a running test." +msgstr "" + +#: ../../doc/reference/reference_rock/luatest/README.rst:247 +msgid "``skip_if (condition, message)``" +msgstr "" + +#: ../../doc/reference/reference_rock/luatest/README.rst:247 +msgid "Skip a running test if condition is met." +msgstr "" + +#: ../../doc/reference/reference_rock/luatest/README.rst:249 +msgid "``success ()``" +msgstr "" + +#: ../../doc/reference/reference_rock/luatest/README.rst:249 +msgid "Stops a test with a success." +msgstr "" + +#: ../../doc/reference/reference_rock/luatest/README.rst:251 +msgid "``success_if (condition)``" +msgstr "" + +#: ../../doc/reference/reference_rock/luatest/README.rst:251 +msgid "Stops a test with a success if condition is met." +msgstr "" + +#: ../../doc/reference/reference_rock/luatest/README.rst:254 +msgid "**Suite and groups**" +msgstr "" + +#: ../../doc/reference/reference_rock/luatest/README.rst:256 +msgid "``after_suite (fn)``" +msgstr "" + +#: ../../doc/reference/reference_rock/luatest/README.rst:256 +msgid "Add after suite hook." +msgstr "" + +#: ../../doc/reference/reference_rock/luatest/README.rst:258 +msgid "``before_suite (fn)``" +msgstr "" + +#: ../../doc/reference/reference_rock/luatest/README.rst:258 +msgid "Add before suite hook." +msgstr "" + +#: ../../doc/reference/reference_rock/luatest/README.rst:260 +msgid "``group (name)``" +msgstr "" + +#: ../../doc/reference/reference_rock/luatest/README.rst:260 +msgid "Create group of tests." +msgstr "" + +#: ../../doc/reference/reference_rock/luatest/README.rst:267 +msgid "XFail" +msgstr "" + +#: ../../doc/reference/reference_rock/luatest/README.rst:269 +msgid "The ``xfail`` mark makes test results to be interpreted vice versa: it's threated as passed when an assertion fails, and it fails if no errors are raised. It allows one to mark a test as temporarily broken due to a bug in some other component which can't be fixed immediately. It's also a good practice to keep xfail tests in sync with an issue tracker." +msgstr "" + +#: ../../doc/reference/reference_rock/luatest/README.rst:275 +msgid "local g = t.group()\n" +"g.test_fail = function()\n" +" t.xfail('Must fail no matter what')\n" +" t.assert_equals(3, 4)\n" +"end" +msgstr "" + +#: ../../doc/reference/reference_rock/luatest/README.rst:283 +msgid "XFail only applies to the errors raised by the luatest assertions. Regular Lua errors still cause the test failure." +msgstr "" + +#: ../../doc/reference/reference_rock/luatest/README.rst:290 +msgid "Capturing output" +msgstr "" + +#: ../../doc/reference/reference_rock/luatest/README.rst:292 +msgid "By default runner captures all stdout/stderr output and shows it only for failed tests. Capturing can be disabled with ``-c`` flag." +msgstr "" + +#: ../../doc/reference/reference_rock/luatest/README.rst:299 +msgid "Tests repeating" +msgstr "" + +#: ../../doc/reference/reference_rock/luatest/README.rst:301 +msgid "Runners can repeat tests with flags ``-r`` / ``--repeat`` (to repeat all the tests) or ``-R`` / ``--repeat-group`` (to repeat all the tests within the group)." +msgstr "" + +#: ../../doc/reference/reference_rock/luatest/README.rst:308 +msgid "Parametrization" +msgstr "" + +#: ../../doc/reference/reference_rock/luatest/README.rst:310 +msgid "Test group can be parametrized." +msgstr "" + +#: ../../doc/reference/reference_rock/luatest/README.rst:312 +msgid "local g = t.group('pgroup', {{a = 1, b = 4}, {a = 2, b = 3}})\n" +"\n" +"g.test_params = function(cg)\n" +" ...\n" +" log.info('a = %s', cg.params.a)\n" +" log.info('b = %s', cg.params.b)\n" +" ...\n" +"end" +msgstr "" + +#: ../../doc/reference/reference_rock/luatest/README.rst:323 +msgid "Group can be parametrized with a matrix of parameters using `luatest.helpers`:" +msgstr "" + +#: ../../doc/reference/reference_rock/luatest/README.rst:325 +msgid "local g = t.group('pgroup', t.helpers.matrix({a = {1, 2}, b = {3, 4}}))\n" +"-- Will run:\n" +"-- * a = 1, b = 3\n" +"-- * a = 1, b = 4\n" +"-- * a = 2, b = 3\n" +"-- * a = 2, b = 4" +msgstr "" + +#: ../../doc/reference/reference_rock/luatest/README.rst:334 +msgid "Each test will be performed for every params combination. Hooks will work as usual unless there are specified params. The order of execution in the hook group is determined by the order of declaration." +msgstr "" + +#: ../../doc/reference/reference_rock/luatest/README.rst:338 +msgid "-- called before every test\n" +"g.before_each(function(cg) ... end)\n" +"\n" +"-- called before tests when a == 1\n" +"g.before_each({a = 1}, function(cg) ... end)\n" +"\n" +"-- called only before the test when a == 1 and b == 3\n" +"g.before_each({a = 1, b = 3}, function(cg) ... end)\n" +"\n" +"-- called before test named 'test_something' when a == 1\n" +"g.before_test('test_something', {a = 1}, function(cg) ... end)\n" +"\n" +"--etc" +msgstr "" + +#: ../../doc/reference/reference_rock/luatest/README.rst:354 +msgid "Test from a parameterized group can be called from the command line in such a way:" +msgstr "" + +#: ../../doc/reference/reference_rock/luatest/README.rst:356 +msgid "luatest pgroup.a:1.b:4.test_params\n" +"luatest pgroup.a:2.b:3.test_params" +msgstr "" + +#: ../../doc/reference/reference_rock/luatest/README.rst:361 +msgid "Note that values for ``a`` and ``b`` have to match to defined group params. The command below will give you an error because such params are not defined for the group." +msgstr "" + +#: ../../doc/reference/reference_rock/luatest/README.rst:364 +msgid "luatest pgroup.a:2.b:2.test_params # will raise an error" +msgstr "" + +#: ../../doc/reference/reference_rock/luatest/README.rst:372 +msgid "Test helpers" +msgstr "" + +#: ../../doc/reference/reference_rock/luatest/README.rst:374 +msgid "There are helpers to run tarantool applications and perform basic interaction with it. If application follows configuration conventions it is possible to use options to configure server instance and helpers at the same time. For example ``http_port`` is used to perform http request in tests and passed in ``TARANTOOL_HTTP_PORT`` to server process." +msgstr "" + +#: ../../doc/reference/reference_rock/luatest/README.rst:380 +msgid "local server = luatest.Server:new({\n" +" command = '/path/to/executable.lua',\n" +" -- arguments for process\n" +" args = {'--no-bugs', '--fast'},\n" +" -- additional envars to pass to process\n" +" env = {SOME_FIELD = 'value'},\n" +" -- passed as TARANTOOL_WORKDIR\n" +" workdir = '/path/to/test/workdir',\n" +" -- passed as TARANTOOL_HTTP_PORT, used in http_request\n" +" http_port = 8080,\n" +" -- passed as TARANTOOL_LISTEN, used in connect_net_box\n" +" net_box_port = 3030,\n" +" -- passed to net_box.connect in connect_net_box\n" +" net_box_credentials = {user = 'username', password = 'secret'},\n" +"})\n" +"server:start()\n" +"-- Wait until server is ready to accept connections.\n" +"-- This may vary from app to app: for one server:connect_net_box() is enough,\n" +"-- for another more complex checks are required.\n" +"luatest.helpers.retrying({}, function() server:http_request('get', '/ping') end)\n" +"\n" +"-- http requests\n" +"server:http_request('get', '/path')\n" +"server:http_request('post', '/path', {body = 'text'})\n" +"server:http_request('post', '/path', {json = {field = value}, http = {\n" +" -- http client options\n" +" headers = {Authorization = 'Basic ' .. credentials},\n" +" timeout = 1,\n" +"}})\n" +"\n" +"-- This method throws error when response status is outside of then range 200..299.\n" +"-- To change this behaviour, path `raise = false`:\n" +"t.assert_equals(server:http_request('get', '/not_found', {raise = false}).status, 404)\n" +"t.assert_error(function() server:http_request('get', '/not_found') end)\n" +"\n" +"-- using net_box\n" +"server:connect_net_box()\n" +"server:eval('return do_something(...)', {arg1, arg2})\n" +"server:call('function_name', {arg1, arg2})\n" +"server:exec(function() return box.info() end)\n" +"server:stop()" +msgstr "" + +#: ../../doc/reference/reference_rock/luatest/README.rst:424 +msgid "``luatest.Process:start(path, args, env)`` provides low-level interface to run any other application." +msgstr "" + +#: ../../doc/reference/reference_rock/luatest/README.rst:426 +msgid "There are several small helpers for common actions:" +msgstr "" + +#: ../../doc/reference/reference_rock/luatest/README.rst:428 +msgid "luatest.helpers.uuid('ab', 2, 1) == 'abababab-0002-0000-0000-000000000001'\n" +"\n" +"luatest.helpers.retrying({timeout = 1, delay = 0.1}, failing_function, arg1, arg2)\n" +"-- wait until server is up\n" +"luatest.helpers.retrying({}, function() server:http_request('get', '/status') end)" +msgstr "" + +#: ../../doc/reference/reference_rock/luatest/README.rst:440 +msgid "luacov integration" +msgstr "" + +#: ../../doc/reference/reference_rock/luatest/README.rst:442 +msgid "Install `luacov `_ with ``tarantoolctl rocks install luacov``" +msgstr "" + +#: ../../doc/reference/reference_rock/luatest/README.rst:443 +msgid "Configure it with ``.luacov`` file" +msgstr "" + +#: ../../doc/reference/reference_rock/luatest/README.rst:444 +msgid "Clean old reports ``rm -f luacov.*.out*``" +msgstr "" + +#: ../../doc/reference/reference_rock/luatest/README.rst:445 +msgid "Run luatest with ``--coverage`` option" +msgstr "" + +#: ../../doc/reference/reference_rock/luatest/README.rst:446 +msgid "Generate report with ``.rocks/bin/luacov .``" +msgstr "" + +#: ../../doc/reference/reference_rock/luatest/README.rst:447 +msgid "Show summary with ``grep -A999 '^Summary' luacov.report.out``" +msgstr "" + +#: ../../doc/reference/reference_rock/luatest/README.rst:449 +msgid "When running integration tests with coverage collector enabled, luatest automatically starts new tarantool instances with luacov enabled. So coverage is collected from all the instances. However this has some limitations:" +msgstr "" + +#: ../../doc/reference/reference_rock/luatest/README.rst:454 +msgid "It works only for instances started with ``Server`` helper." +msgstr "" + +#: ../../doc/reference/reference_rock/luatest/README.rst:455 +msgid "Process command should be executable lua file or tarantool with script argument." +msgstr "" + +#: ../../doc/reference/reference_rock/luatest/README.rst:456 +msgid "Instance must be stopped with ``server:stop()``, because this is the point where stats are saved." +msgstr "" + +#: ../../doc/reference/reference_rock/luatest/README.rst:457 +msgid "Don't save stats concurrently to prevent corruption." +msgstr "" + +#: ../../doc/reference/reference_rock/luatest/README.rst:461 +msgid "Development" +msgstr "" + +#: ../../doc/reference/reference_rock/luatest/README.rst:463 +msgid "Check out the repo." +msgstr "" + +#: ../../doc/reference/reference_rock/luatest/README.rst:464 +msgid "Prepare makefile with ``cmake .``." +msgstr "" + +#: ../../doc/reference/reference_rock/luatest/README.rst:465 +msgid "Install dependencies with ``make bootstrap``." +msgstr "" + +#: ../../doc/reference/reference_rock/luatest/README.rst:466 +msgid "Run it with ``make lint`` before committing changes." +msgstr "" + +#: ../../doc/reference/reference_rock/luatest/README.rst:467 +msgid "Run tests with ``bin/luatest``." +msgstr "" + +#: ../../doc/reference/reference_rock/luatest/README.rst:471 +msgid "Contributing" +msgstr "" + +#: ../../doc/reference/reference_rock/luatest/README.rst:473 +msgid "Bug reports and pull requests are welcome on at https://github.com/tarantool/luatest." +msgstr "" + +#: ../../doc/reference/reference_rock/luatest/README.rst:478 +msgid "License" +msgstr "" + +#: ../../doc/reference/reference_rock/luatest/README.rst:480 +msgid "MIT" +msgstr "" + +#: ../../doc/reference/reference_rock/luatest/_includes/index.rst:3 +msgid "API" +msgstr "" diff --git a/locale/ru/LC_MESSAGES/alternate_build_master.po b/locale/ru/LC_MESSAGES/alternate_build_master.po new file mode 100644 index 0000000000..e7f773351d --- /dev/null +++ b/locale/ru/LC_MESSAGES/alternate_build_master.po @@ -0,0 +1,3 @@ + +msgid "CRUD operations" +msgstr "" diff --git a/locale/ru/LC_MESSAGES/archive/intro.po b/locale/ru/LC_MESSAGES/archive/intro.po index 4319b50c37..793e9a148f 100644 --- a/locale/ru/LC_MESSAGES/archive/intro.po +++ b/locale/ru/LC_MESSAGES/archive/intro.po @@ -23,8 +23,8 @@ msgstr "" "несколько потоков для обработки ввода-вывода данных и фоновых задач. " "Tarantool включает в себя LuaJIT (Just In Time) - Lua-компилятор, Lua-" "библиотеки для наиболее распространенных приложений, а также сервер базы " -"данных Tarantool, который представляет собой широко признанную СУБД NoSQL." -" Таким образом, Tarantool используется для всех тех целей, которые принесли " +"данных Tarantool, который представляет собой широко признанную СУБД NoSQL. " +"Таким образом, Tarantool используется для всех тех целей, которые принесли " "популярность node.js и Twisted, и более того - поддерживает персистентность " "данных." @@ -77,8 +77,8 @@ msgid "" "built on top of the **cooperative multitasking** environment that Tarantool " "itself uses." msgstr "" -"Пользователи Tarantool могут создавать, изменять и удалять **Lua-функции**" -" прямо во время исполнения кода. Также они могут указывать **Lua-" +"Пользователи Tarantool могут создавать, изменять и удалять **Lua-функции** " +"прямо во время исполнения кода. Также они могут указывать **Lua-" "программы**, которые будут загружаться во время запуска Tarantool. Такие " "программы могут служить триггерами, выполнять фоновые задачи и " "взаимодействовать с другими узлами по сети. В отличие от многих популярных " @@ -99,9 +99,9 @@ msgstr "" " некоторые разработчики рассматривают Tarantool как СУБД с популярным языком" " для написания хранимых процедур, другие рассматривают его как Lua-" "интерпретатор, а третьи -- как вариант замены сразу нескольких компонентов в" -" многозвенных веб-приложениях. Производительность Tarantool может " -"достигать сотен тысяч транзакций в секунду на ноутбуке, и ее можно " -"наращивать \"вверх\" или \"вширь\" за счет новых серверных ферм." +" многозвенных веб-приложениях. Производительность Tarantool может достигать " +"сотен тысяч транзакций в секунду на ноутбуке, и ее можно наращивать " +"\"вверх\" или \"вширь\" за счет новых серверных ферм." msgid "Database features" msgstr "Возможности СУБД" @@ -141,8 +141,8 @@ msgid "" msgstr "" "В архитектуре серверной части СУБД Tarantool реализована концепция " "\"движков\" базы данных (storage engines), где в разных ситуациях " -"используются разные наборы алгоритмов и структуры данных. В Tarantool есть" -" два встроенных движка: in-memory движок, который держит все данные и " +"используются разные наборы алгоритмов и структуры данных. В Tarantool есть " +"два встроенных движка: in-memory движок, который держит все данные и " "индексы в оперативной памяти, и двухуровневый движок для B-деревьев, который" " обрабатывает данные размером в 10-1000 раз больше того, что может " "поместиться в оперативной памяти. Все движки в Tarantool поддерживают " @@ -185,11 +185,11 @@ msgstr "" "В штатных ситуациях **in-memory движок работает без блокировок**. Вместо " "многопоточных примитивов, которые предлагает операционная система (таких как" " mutex'ы), Tarantool использует кооперативную многозадачность для работы с " -"тысячами соединений одновременно. В Tarantool есть фиксированное " -"количество независимых потоков управления (thread), и у них нет общего " -"состояния. Для обмена данными между потоками используются очереди сообщений " -"с малой перегрузкой. Хотя такой подход накладывает ограничение на количество" -" процессорных ядер, которые может использовать экземпляр, в то же время он " +"тысячами соединений одновременно. В Tarantool есть фиксированное количество " +"независимых потоков управления (thread), и у них нет общего состояния. Для " +"обмена данными между потоками используются очереди сообщений с малой " +"перегрузкой. Хотя такой подход накладывает ограничение на количество " +"процессорных ядер, которые может использовать экземпляр, в то же время он " "позволяет избежать борьбы за шину памяти, а также дает запас " "масштабируемости по скорости доступа к памяти и производительности сети. В " "результате даже при большой нагрузке экземпляр Tarantool в среднем " diff --git a/locale/ru/LC_MESSAGES/archive/shard.po b/locale/ru/LC_MESSAGES/archive/shard.po index e7231476dc..71105547cd 100644 --- a/locale/ru/LC_MESSAGES/archive/shard.po +++ b/locale/ru/LC_MESSAGES/archive/shard.po @@ -19,9 +19,9 @@ msgid "" "analogues for the data-manipulation functions of the box library (select, " "insert, replace, update, delete)." msgstr "" -"Модуль Tarantool `shard` позволяет создавать шарды, а также аналоги " -"функций по управлению данными из библиотеки box (select, insert, replace, " -"update, delete)." +"Модуль Tarantool `shard` позволяет создавать шарды, а также аналоги функций " +"по управлению данными из библиотеки box (select, insert, replace, update, " +"delete)." msgid "First some terminology:" msgstr "Для начала введем терминологию:" diff --git a/locale/ru/LC_MESSAGES/book/admin/access_control.po b/locale/ru/LC_MESSAGES/book/admin/access_control.po index b9ed740711..9c3eff650e 100644 --- a/locale/ru/LC_MESSAGES/book/admin/access_control.po +++ b/locale/ru/LC_MESSAGES/book/admin/access_control.po @@ -3,13 +3,11 @@ msgid "Access control" msgstr "Управление доступом" msgid "" -"This section explains " -"how Tarantool makes it possible for administrators to prevent unauthorized " -"access to the database and to certain functions." +"This section explains how Tarantool makes it possible for administrators to " +"prevent unauthorized access to the database and to certain functions." msgstr "" -"В этом разделе объясняется, " -"как Tarantool позволяет администраторам не допустить " -"неавторизованный доступ к базе данных и некоторым функциям." +"В этом разделе объясняется, как Tarantool позволяет администраторам не " +"допустить неавторизованный доступ к базе данных и некоторым функциям." msgid "Briefly:" msgstr "Вкратце:" @@ -116,21 +114,17 @@ msgstr "" "У каждого пользователя (за исключением гостя 'guest') может быть **пароль**." " Паролем является любая буквенно-цифровая строка." +#, fuzzy, python-format msgid "" "Tarantool passwords are stored in the :ref:`_user ` system " "space with a `cryptographic hash function " "`_ so that, if " "the password is ‘x’, the stored hash-password is a long string like " -"‘lL3OvhkIPOKh+Vn9Avlkx69M/Ck=‘. When a client connects to a Tarantool " -"instance, the instance sends a random `salt value " -"`_ which the client " -"must mix with the hashed-password before sending to the instance. Thus the " -"original value ‘x’ is never stored anywhere except in the user’s head, and " -"the hashed value is never passed down a network wire except when mixed with " -"a random salt." -msgstr "" -"Пароли Tarantool хранятся в системном спейсе :ref:`_user `" -" с `криптографической хеш-функцией " +"‘lL3OvhkIPOKh+Vn9Avlkx69M/Ck=‘. Tarantool supports two protocols for " +"authenticating users:" +msgstr "" +"Пароли Tarantool хранятся в системном спейсе :ref:`_user ` с" +" `криптографической хеш-функцией " "`_," " так что если паролем является ‘x’, хранится хеш-пароль в виде длинной " "строки, например ‘lL3OvhkIPOKh+Vn9Avlkx69M/Ck=‘. Когда клиент подключается к" @@ -142,47 +136,48 @@ msgstr "" "никогда не передается по сети, кроме как в смешанном с солью виде." msgid "" -"For more details of the password hashing algorithm (e.g. for the purpose of " -"writing a new client application), read the `scramble.h " -"`_ header " -"file." -msgstr "" -"Для получения дополнительной информации об алгоритме хеширования паролей " -"(например, для написания нового клиентского приложения), прочтите файл " -"заголовка `scramble.h `_." - -msgid "" -"This system prevents malicious onlookers from finding passwords by snooping " -"in the log files or snooping on the wire. It is the same system as in `MySQL " -"`_, which has " -"proved adequate for medium-security installations. Nevertheless, " -"administrators should warn users that no system is foolproof against " -"determined long-term attacks, so passwords should be guarded and changed " -"occasionally. Administrators should also advise users to choose long " -"unobvious passwords, but it is ultimately up to the users to choose or " -"change their own passwords." -msgstr "" -"Система не дает злоумышленнику определить пароли путем просмотра файлов " -"журнала или слежения за активностью. Это та же система, что и " -"`в MySQL `_. Её оказалось достаточно для объектов со средней " -"степенью безопасности. Тем не менее, администраторы должны предупреждать " -"пользователей, что никакая система не защищена полностью от постоянных " -"длительных атак, поэтому пароли следует охранять и периодически изменять. " -"Администраторы также должны рекомендовать пользователям выбирать длинные " -"неочевидные пароли, но сами пользователи выбирают свои пароли и изменяют их." - -msgid "" -"There are two functions for managing passwords in Tarantool: " -":doc:`/reference/reference_lua/box_schema/user_passwd` for changing a user's" -" password and :doc:`/reference/reference_lua/box_schema/user_password` for " -"getting a hash of a user's password." -msgstr "" -"Для управления паролями в Tarantool есть две функции: " -":doc:`/reference/reference_lua/box_schema/user_passwd` для изменения пароля " -"пользователя и :doc:`/reference/reference_lua/box_schema/user_password` для " -"получения хеша пароля пользователя." +"`CHAP `_ with ``SHA-1`` hashing" +msgstr "" + +msgid "" +"In this case, password hashes are stored in the ``_user`` space `unsalted " +"`_. If an attacker gains " +"access to the database, they may crack a password using, for example, a " +"`rainbow table `_." +msgstr "" + +msgid "" +"`PAP `_ with" +" ``SHA256`` hashing (Enterprise Edition)" +msgstr "" + +msgid "" +"For PAP, a password is salted with a user-unique salt before saving it in " +"the ``_user`` space. This keeps the database protected from cracking using a" +" rainbow table. Note that PAP sends a password as plain text, so you need to" +" configure SSL/TLS for a connection." +msgstr "" + +msgid "There are two functions for managing passwords in Tarantool:" +msgstr "" + +msgid "" +":doc:`/reference/reference_lua/box_schema/user_passwd` allows you to change " +"a user's password." +msgstr "" + +msgid "" +":doc:`/reference/reference_lua/box_schema/user_password` returns a hash of a" +" user's password." +msgstr "" + +msgid "" +"Tarantool Enterprise Edition also allows you to improve database security by" +" enforcing the use of strong passwords, setting up a maximum password age, " +"and so on. Learn more from the :ref:`Access control ` section." +msgstr "" msgid "Owners and privileges" msgstr "Владельцы и права" @@ -746,3 +741,46 @@ msgid "" msgstr "" "Чтобы отследить все подключения и отключения, можно использовать " ":ref:`триггеры соединений и аутентификации `." + +#~ msgid "" +#~ "For more details of the password hashing algorithm (e.g. for the purpose of " +#~ "writing a new client application), read the `scramble.h " +#~ "`_ header" +#~ " file." +#~ msgstr "" +#~ "Для получения дополнительной информации об алгоритме хеширования паролей " +#~ "(например, для написания нового клиентского приложения), прочтите файл " +#~ "заголовка `scramble.h `_." + +#~ msgid "" +#~ "This system prevents malicious onlookers from finding passwords by snooping " +#~ "in the log files or snooping on the wire. It is the same system as in `MySQL" +#~ " `_, which has" +#~ " proved adequate for medium-security installations. Nevertheless, " +#~ "administrators should warn users that no system is foolproof against " +#~ "determined long-term attacks, so passwords should be guarded and changed " +#~ "occasionally. Administrators should also advise users to choose long " +#~ "unobvious passwords, but it is ultimately up to the users to choose or " +#~ "change their own passwords." +#~ msgstr "" +#~ "Система не дает злоумышленнику определить пароли путем просмотра файлов " +#~ "журнала или слежения за активностью. Это та же система, что и `в MySQL " +#~ "`_. Её " +#~ "оказалось достаточно для объектов со средней степенью безопасности. Тем не " +#~ "менее, администраторы должны предупреждать пользователей, что никакая " +#~ "система не защищена полностью от постоянных длительных атак, поэтому пароли " +#~ "следует охранять и периодически изменять. Администраторы также должны " +#~ "рекомендовать пользователям выбирать длинные неочевидные пароли, но сами " +#~ "пользователи выбирают свои пароли и изменяют их." + +#~ msgid "" +#~ "There are two functions for managing passwords in Tarantool: " +#~ ":doc:`/reference/reference_lua/box_schema/user_passwd` for changing a user's" +#~ " password and :doc:`/reference/reference_lua/box_schema/user_password` for " +#~ "getting a hash of a user's password." +#~ msgstr "" +#~ "Для управления паролями в Tarantool есть две функции: " +#~ ":doc:`/reference/reference_lua/box_schema/user_passwd` для изменения пароля " +#~ "пользователя и :doc:`/reference/reference_lua/box_schema/user_password` для " +#~ "получения хеша пароля пользователя." diff --git a/locale/ru/LC_MESSAGES/book/admin/backups.po b/locale/ru/LC_MESSAGES/book/admin/backups.po index fe5e87e16a..42cab9fbd7 100644 --- a/locale/ru/LC_MESSAGES/book/admin/backups.po +++ b/locale/ru/LC_MESSAGES/book/admin/backups.po @@ -57,8 +57,8 @@ msgstr "" "Последний созданный Tarantool :ref:`файл-снимок ` " "является резервной копией всей базы данных; а :ref:`WAL-файлы `, созданные следом за последним файлом-снимком, являются инкрементными " -"копиями. Поэтому процедура резервного копирования сводится к копированию последнего " -"файла-снимка и следующих за ним WAL-файлов." +"копиями. Поэтому процедура резервного копирования сводится к копированию " +"последнего файла-снимка и следующих за ним WAL-файлов." msgid "" "Use ``tar`` to make a (possibly compressed) copy of the latest .snap and " @@ -109,8 +109,8 @@ msgid "" msgstr "" "Выполните команду :doc:`/reference/reference_lua/box_backup/start` в " ":ref:`административной консоли `. Эта команда покажет список" -" файлов для резервного копирования и приостановит сборку мусора до следующего вызова" -" ``box.backup.stop()``." +" файлов для резервного копирования и приостановит сборку мусора до " +"следующего вызова ``box.backup.stop()``." msgid "" "Copy the files from the list to a safe location. This will include memtx " @@ -135,8 +135,8 @@ msgid "" "The :ref:`replication ` feature is useful for backup as well as" " for load balancing." msgstr "" -":ref:`Репликация ` обеспечивает резервное копирование " -"и помогает балансировать нагрузку." +":ref:`Репликация ` обеспечивает резервное копирование и " +"помогает балансировать нагрузку." msgid "" "Therefore taking a backup is a matter of ensuring that any given replica is " @@ -146,11 +146,11 @@ msgid "" "Tarantool fiber." msgstr "" "Поэтому процесс создания резервной копии сводится к обновлению (при " -"необходимости) одной из реплик с последующим холодным резервным копированием. Так " -"как все остальные реплики продолжают функционировать, с точки зрения " -"конечного пользователя, этот процесс не является холодным резервным копированием. " -"Такое копирование можно выполнять регулярно с помощью планировщика " -"``cron`` или файбера Tarantool." +"необходимости) одной из реплик с последующим холодным резервным " +"копированием. Так как все остальные реплики продолжают функционировать, с " +"точки зрения конечного пользователя, этот процесс не является холодным " +"резервным копированием. Такое копирование можно выполнять регулярно с " +"помощью планировщика ``cron`` или файбера Tarantool." msgid "Continuous backup (memtx)" msgstr "Непрерывное резервное копирование" diff --git a/locale/ru/LC_MESSAGES/book/admin/daemon_supervision.po b/locale/ru/LC_MESSAGES/book/admin/daemon_supervision.po index e15dc5a6ae..58d69e4bfe 100644 --- a/locale/ru/LC_MESSAGES/book/admin/daemon_supervision.po +++ b/locale/ru/LC_MESSAGES/book/admin/daemon_supervision.po @@ -84,21 +84,12 @@ msgstr "" msgid "" "$ systemctl status tarantool@my_app|grep PID\n" "Main PID: 5885 (tarantool)\n" -"$ tarantoolctl enter my_app\n" -"/bin/tarantoolctl: Found my_app.lua in /etc/tarantool/instances.available\n" -"/bin/tarantoolctl: Connecting to /var/run/tarantool/my_app.control\n" -"/bin/tarantoolctl: connected to unix/:/var/run/tarantool/my_app.control\n" -"unix/:/var/run/tarantool/my_app.control> os.exit(-1)\n" -"/bin/tarantoolctl: unix/:/var/run/tarantool/my_app.control: Remote host closed connection" +"$ tt connect my_app\n" +" • Connecting to the instance...\n" +" • Connected to /var/run/tarantool/my_app.control\n" +"/var/run/tarantool/my_app.control> os.exit(-1)\n" +" ⨯ Connection was closed. Probably instance process isn't running anymore" msgstr "" -"$ systemctl status tarantool@my_app|grep PID\n" -"Main PID: 5885 (tarantool)\n" -"$ tarantoolctl enter my_app\n" -"/bin/tarantoolctl: Found my_app.lua in /etc/tarantool/instances.available\n" -"/bin/tarantoolctl: Connecting to /var/run/tarantool/my_app.control\n" -"/bin/tarantoolctl: connected to unix/:/var/run/tarantool/my_app.control\n" -"unix/:/var/run/tarantool/my_app.control> os.exit(-1)\n" -"/bin/tarantoolctl: unix/:/var/run/tarantool/my_app.control: Remote host closed connection" msgid "Now let’s make sure that ``systemd`` has restarted the instance:" msgstr "А теперь убедимся, что ``systemd`` перезапустила его:" @@ -110,31 +101,13 @@ msgstr "" "$ systemctl status tarantool@my_app|grep PID\n" "Main PID: 5914 (tarantool)" -msgid "Finally, let’s check the boot logs:" -msgstr "И под конец проверим содержимое журнала загрузки:" - msgid "" -"$ journalctl -u tarantool@my_app -n 8\n" -"-- Logs begin at Fri 2016-01-08 12:21:53 MSK, end at Thu 2016-01-21 21:09:45 MSK. --\n" -"Jan 21 21:09:45 localhost.localdomain systemd[1]: tarantool@my_app.service: Unit entered failed state.\n" -"Jan 21 21:09:45 localhost.localdomain systemd[1]: tarantool@my_app.service: Failed with result 'exit-code'.\n" -"Jan 21 21:09:45 localhost.localdomain systemd[1]: tarantool@my_app.service: Service hold-off time over, scheduling restart.\n" -"Jan 21 21:09:45 localhost.localdomain systemd[1]: Stopped Tarantool Database Server.\n" -"Jan 21 21:09:45 localhost.localdomain systemd[1]: Starting Tarantool Database Server...\n" -"Jan 21 21:09:45 localhost.localdomain tarantoolctl[5910]: /usr/bin/tarantoolctl: Found my_app.lua in /etc/tarantool/instances.available\n" -"Jan 21 21:09:45 localhost.localdomain tarantoolctl[5910]: /usr/bin/tarantoolctl: Starting instance...\n" -"Jan 21 21:09:45 localhost.localdomain systemd[1]: Started Tarantool Database Server." +"Additionally, you can find the information about the instance restart in the" +" boot logs:" +msgstr "" + +msgid "$ journalctl -u tarantool@my_app -n 8" msgstr "" -"$ journalctl -u tarantool@my_app -n 8\n" -"-- Записи начинаются в пятницу 08.01.2016 12:21:53 MSK, заканчиваются в четверг 21.01.2016 2016-01-21 21:09:45 MSK. --\n" -"Jan 21 21:09:45 localhost.localdomain systemd[1]: tarantool@my_app.service: Unit entered failed state.\n" -"Jan 21 21:09:45 localhost.localdomain systemd[1]: tarantool@my_app.service: Failed with result 'exit-code'.\n" -"Jan 21 21:09:45 localhost.localdomain systemd[1]: tarantool@my_app.service: Service hold-off time over, scheduling restart.\n" -"Jan 21 21:09:45 localhost.localdomain systemd[1]: Stopped Tarantool Database Server.\n" -"Jan 21 21:09:45 localhost.localdomain systemd[1]: Starting Tarantool Database Server...\n" -"Jan 21 21:09:45 localhost.localdomain tarantoolctl[5910]: /usr/bin/tarantoolctl: Found my_app.lua in /etc/tarantool/instances.available\n" -"Jan 21 21:09:45 localhost.localdomain tarantoolctl[5910]: /usr/bin/tarantoolctl: Starting instance...\n" -"Jan 21 21:09:45 localhost.localdomain systemd[1]: Started Tarantool Database Server." msgid "Core dumps" msgstr "Создание дампов памяти" @@ -197,14 +170,12 @@ msgstr "" msgid "" "$ # !!! please never do this on a production system !!!\n" -"$ tarantoolctl enter my_app\n" -"unix/:/var/run/tarantool/my_app.control> require('ffi').cast('char *', 0)[0] = 48\n" -"/bin/tarantoolctl: unix/:/var/run/tarantool/my_app.control: Remote host closed connection" +"$ tt connect my_app\n" +" • Connecting to the instance...\n" +" • Connected to /var/run/tarantool/my_app.control\n" +"/var/run/tarantool/my_app.control> require('ffi').cast('char *', 0)[0] = 48\n" +" ⨯ Connection was closed. Probably instance process isn't running anymore" msgstr "" -"$ # !!! пожалуйста, никогда не делайте этого на боевом сервере !!!\n" -"$ tarantoolctl enter my_app\n" -"unix/:/var/run/tarantool/my_app.control> require('ffi').cast('char *', 0)[0] = 48\n" -"/bin/tarantoolctl: unix/:/var/run/tarantool/my_app.control: Remote host closed connection" msgid "" "Alternatively, if you know the process ID of the instance (here we refer to " @@ -440,3 +411,59 @@ msgid "" msgstr "" "В трассировке стека присутствуют символические имена, даже если у вас не " "установлен пакет ``tarantool-debuginfo``." + +#~ msgid "" +#~ "$ systemctl status tarantool@my_app|grep PID\n" +#~ "Main PID: 5885 (tarantool)\n" +#~ "$ tarantoolctl enter my_app\n" +#~ "/bin/tarantoolctl: Found my_app.lua in /etc/tarantool/instances.available\n" +#~ "/bin/tarantoolctl: Connecting to /var/run/tarantool/my_app.control\n" +#~ "/bin/tarantoolctl: connected to unix/:/var/run/tarantool/my_app.control\n" +#~ "unix/:/var/run/tarantool/my_app.control> os.exit(-1)\n" +#~ "/bin/tarantoolctl: unix/:/var/run/tarantool/my_app.control: Remote host closed connection" +#~ msgstr "" +#~ "$ systemctl status tarantool@my_app|grep PID\n" +#~ "Main PID: 5885 (tarantool)\n" +#~ "$ tarantoolctl enter my_app\n" +#~ "/bin/tarantoolctl: Found my_app.lua in /etc/tarantool/instances.available\n" +#~ "/bin/tarantoolctl: Connecting to /var/run/tarantool/my_app.control\n" +#~ "/bin/tarantoolctl: connected to unix/:/var/run/tarantool/my_app.control\n" +#~ "unix/:/var/run/tarantool/my_app.control> os.exit(-1)\n" +#~ "/bin/tarantoolctl: unix/:/var/run/tarantool/my_app.control: Remote host closed connection" + +#~ msgid "Finally, let’s check the boot logs:" +#~ msgstr "И под конец проверим содержимое журнала загрузки:" + +#~ msgid "" +#~ "$ journalctl -u tarantool@my_app -n 8\n" +#~ "-- Logs begin at Fri 2016-01-08 12:21:53 MSK, end at Thu 2016-01-21 21:09:45 MSK. --\n" +#~ "Jan 21 21:09:45 localhost.localdomain systemd[1]: tarantool@my_app.service: Unit entered failed state.\n" +#~ "Jan 21 21:09:45 localhost.localdomain systemd[1]: tarantool@my_app.service: Failed with result 'exit-code'.\n" +#~ "Jan 21 21:09:45 localhost.localdomain systemd[1]: tarantool@my_app.service: Service hold-off time over, scheduling restart.\n" +#~ "Jan 21 21:09:45 localhost.localdomain systemd[1]: Stopped Tarantool Database Server.\n" +#~ "Jan 21 21:09:45 localhost.localdomain systemd[1]: Starting Tarantool Database Server...\n" +#~ "Jan 21 21:09:45 localhost.localdomain tarantoolctl[5910]: /usr/bin/tarantoolctl: Found my_app.lua in /etc/tarantool/instances.available\n" +#~ "Jan 21 21:09:45 localhost.localdomain tarantoolctl[5910]: /usr/bin/tarantoolctl: Starting instance...\n" +#~ "Jan 21 21:09:45 localhost.localdomain systemd[1]: Started Tarantool Database Server." +#~ msgstr "" +#~ "$ journalctl -u tarantool@my_app -n 8\n" +#~ "-- Записи начинаются в пятницу 08.01.2016 12:21:53 MSK, заканчиваются в четверг 21.01.2016 2016-01-21 21:09:45 MSK. --\n" +#~ "Jan 21 21:09:45 localhost.localdomain systemd[1]: tarantool@my_app.service: Unit entered failed state.\n" +#~ "Jan 21 21:09:45 localhost.localdomain systemd[1]: tarantool@my_app.service: Failed with result 'exit-code'.\n" +#~ "Jan 21 21:09:45 localhost.localdomain systemd[1]: tarantool@my_app.service: Service hold-off time over, scheduling restart.\n" +#~ "Jan 21 21:09:45 localhost.localdomain systemd[1]: Stopped Tarantool Database Server.\n" +#~ "Jan 21 21:09:45 localhost.localdomain systemd[1]: Starting Tarantool Database Server...\n" +#~ "Jan 21 21:09:45 localhost.localdomain tarantoolctl[5910]: /usr/bin/tarantoolctl: Found my_app.lua in /etc/tarantool/instances.available\n" +#~ "Jan 21 21:09:45 localhost.localdomain tarantoolctl[5910]: /usr/bin/tarantoolctl: Starting instance...\n" +#~ "Jan 21 21:09:45 localhost.localdomain systemd[1]: Started Tarantool Database Server." + +#~ msgid "" +#~ "$ # !!! please never do this on a production system !!!\n" +#~ "$ tarantoolctl enter my_app\n" +#~ "unix/:/var/run/tarantool/my_app.control> require('ffi').cast('char *', 0)[0] = 48\n" +#~ "/bin/tarantoolctl: unix/:/var/run/tarantool/my_app.control: Remote host closed connection" +#~ msgstr "" +#~ "$ # !!! пожалуйста, никогда не делайте этого на боевом сервере !!!\n" +#~ "$ tarantoolctl enter my_app\n" +#~ "unix/:/var/run/tarantool/my_app.control> require('ffi').cast('char *', 0)[0] = 48\n" +#~ "/bin/tarantoolctl: unix/:/var/run/tarantool/my_app.control: Remote host closed connection" diff --git a/locale/ru/LC_MESSAGES/book/admin/disaster_recovery.po b/locale/ru/LC_MESSAGES/book/admin/disaster_recovery.po index 4acaf00de6..f8c5578635 100644 --- a/locale/ru/LC_MESSAGES/book/admin/disaster_recovery.po +++ b/locale/ru/LC_MESSAGES/book/admin/disaster_recovery.po @@ -137,8 +137,8 @@ msgstr "" msgid "Play the records to the new master:" msgstr "Запишите транзакции в новый мастер:" -msgid "" -"$ tarantoolctl play --from 23425 --replica 1" +#, fuzzy +msgid "$ tt play --from 23425 --replica 1" msgstr "" "$ tarantoolctl play --from 23425 --replica " "1" @@ -198,18 +198,19 @@ msgstr "" "будет вызвана функция :ref:`box.backup.stop() `." +#, fuzzy msgid "" -"Get the latest valid :ref:`.snap file ` and use " -"``tarantoolctl cat`` command to calculate at which lsn the data loss " -"occurred." +"Get the latest valid :ref:`.snap file ` and use ``tt " +"cat`` command to calculate at which lsn the data loss occurred." msgstr "" "Возьмите последний корректный :ref:`.snap-файл ` и, " "используя команду ``tarantoolctl cat``, выясните, на каком именно lsn " "произошла потеря данных." +#, fuzzy msgid "" -"Start a new instance (instance#1) and use ``tarantoolctl play`` command to " -"play to it the contents of .snap/.xlog files up to the calculated lsn." +"Start a new instance (instance#1) and use ``tt play`` command to play to it " +"the contents of .snap/.xlog files up to the calculated lsn." msgstr "" "Запустите новый экземпляр (экземпляр #1) и с помощью команды ``tarantoolctl " "play`` скопируйте в него содержимое .snap/.xlog-файлов вплоть до " diff --git a/locale/ru/LC_MESSAGES/book/admin/index.po b/locale/ru/LC_MESSAGES/book/admin/index.po index 876ed0d0d7..be7b95b2e3 100644 --- a/locale/ru/LC_MESSAGES/book/admin/index.po +++ b/locale/ru/LC_MESSAGES/book/admin/index.po @@ -19,11 +19,9 @@ msgid "``systemd`` native utilities, or" msgstr "встроенные утилиты ``systemd`` или" msgid "" -":ref:`tarantoolctl `, an administrative utility shipped and " -"installed as part of Tarantool distribution." +":ref:`tt `, a command-line utility for managing Tarantool-based " +"applications." msgstr "" -":ref:`tarantoolctl `, утилита для администраторов, " -"поставляемая и устанавливаемая вместе с дистрибутивом Tarantool." msgid "Unlike the rest of this manual, here we use system-wide paths." msgstr "" @@ -35,3 +33,10 @@ msgstr "Здесь мы приводим примеры консольного msgid "This chapter includes the following sections:" msgstr "Эта глава включает в себя следующие разделы:" + +#~ msgid "" +#~ ":ref:`tarantoolctl `, an administrative utility shipped and " +#~ "installed as part of Tarantool distribution." +#~ msgstr "" +#~ ":ref:`tarantoolctl `, утилита для администраторов, " +#~ "поставляемая и устанавливаемая вместе с дистрибутивом Tarantool." diff --git a/locale/ru/LC_MESSAGES/book/admin/instance_config.po b/locale/ru/LC_MESSAGES/book/admin/instance_config.po index 2b1d3a16b9..b83171ff38 100644 --- a/locale/ru/LC_MESSAGES/book/admin/instance_config.po +++ b/locale/ru/LC_MESSAGES/book/admin/instance_config.po @@ -1,326 +1,584 @@ -msgid "Instance configuration" -msgstr "Настройка экземпляров Tarantool" - -msgid "For each Tarantool instance, you need two files:" -msgstr "Для каждого экземпляра Tarantool понадобится два файла:" +msgid "Application environment" +msgstr "" msgid "" -"[Optional] An :ref:`application file ` with " -"instance-specific logic. Put this file into the ``/usr/share/tarantool/`` " -"directory." +"This section provides a high-level overview on how to prepare a Tarantool " +"application for deployment and how the application's environment and layout " +"might look. This information is helpful for understanding how to administer " +"Tarantool instances using :ref:`tt CLI ` in both development and " +"production environments." msgstr "" -"[Необязательный] :ref:`Файл приложения `, " -"содержащий логику данного экземпляра. Поместите его в папку " -"``/usr/share/tarantool/``." msgid "" -"For example, ``/usr/share/tarantool/my_app.lua`` (here we implement it as a " -":ref:`Lua module ` that bootstraps the database and " -"exports ``start()`` function for API calls):" +"The main steps of creating and preparing the application for deployment are:" +msgstr "" + +msgid ":ref:`admin-instance_config-init-environment`." +msgstr "" + +msgid ":ref:`admin-instance_config-develop-app`." +msgstr "" + +msgid ":ref:`admin-instance_config-package-app`." msgstr "" -"Например, ``/usr/share/tarantool/my_app.lua`` (здесь мы реализуем его как " -":ref:`Lua-модуль `, который запускает базу данных и " -"экспортирует функцию ``start()`` для API -вызовов):" msgid "" -"local function start()\n" -" box.schema.space.create(\"somedata\")\n" -" box.space.somedata:create_index(\"primary\")\n" -" <...>\n" -"end\n" -"\n" -"return {\n" -" start = start;\n" -"}" -msgstr "" -"local function start()\n" -" box.schema.space.create(\"somedata\")\n" -" box.space.somedata:create_index(\"primary\")\n" -" <...>\n" -"end\n" -"\n" -"return {\n" -" start = start;\n" -"}" +"In this section, a `sharded_cluster " +"`_" +" application is used as an example. This cluster includes 5 instances: one " +"router and 4 storages, which constitute two replica sets." +msgstr "" + +msgid "Cluster topology" +msgstr "" + +msgid "Initializing a local environment" +msgstr "" msgid "" -"An :ref:`instance file ` with instance-specific " -"initialization logic and parameters. Put this file, or a symlink to it, into" -" the **instance directory** (see :ref:`instance_dir ` " -"parameter in ``tarantoolctl`` configuration file)." +"Before creating an application, you need to set up a local environment for " +"``tt``:" +msgstr "" + +msgid "Create a home directory for the environment." +msgstr "" + +msgid "Run ``tt init`` in this directory:" msgstr "" -":ref:`Файл экземпляра `, содержащий логику и параметры " -"инициализации данного экземпляра. Поместите этот файл или символьную ссылку " -"на него в **директорию экземпляра** (см. параметр :ref:`instance_dir ` в конфигурационном файле ``tarantoolctl``)." msgid "" -"For example, ``/etc/tarantool/instances.enabled/my_app.lua`` (here we load " -"``my_app.lua`` module and make a call to ``start()`` function from that " -"module):" +"~/myapp$ tt init\n" +" • Environment config is written to 'tt.yaml'" msgstr "" -"Например, ``/etc/tarantool/instances.enabled/my_app.lua`` (здесь мы " -"загружаем модуль ``my_app.lua`` и вызываем из него функцию ``start()``):" msgid "" -"#!/usr/bin/env tarantool\n" -"\n" -"box.cfg {\n" -" listen = 3301;\n" -"}\n" -"\n" -"-- load my_app module and call start() function\n" -"-- with some app options controlled by sysadmins\n" -"local m = require('my_app').start({...})" -msgstr "" -"#!/usr/bin/env tarantool\n" -"\n" -"box.cfg {\n" -" listen = 3301;\n" -"}\n" -"\n" -"-- загрузить модуль my_app и вызвать функцию start()\n" -"-- некоторые опции приложения под контролем сисадминов\n" -"local m = require('my_app').start({...})" - -msgid "Instance file" -msgstr "Файл экземпляра" +"This command creates a default ``tt`` configuration file ``tt.yaml`` for a " +"local environment and the directories for applications, control sockets, " +"logs, and other artifacts:" +msgstr "" msgid "" -"After this short introduction, you may wonder what an instance file is, what" -" it is for, and how ``tarantoolctl`` uses it. After all, Tarantool is an " -"application server, so why not start the application stored in " -"``/usr/share/tarantool`` directly?" +"~/myapp$ ls\n" +"bin distfiles include instances.enabled modules templates tt.yaml" msgstr "" -"После столь краткого предисловия может возникнуть вопрос: что из себя " -"представляет файл экземпляра, для чего он нужен и как ``tarantoolctl`` " -"использует его? Если Tarantool -- это сервер приложений, так почему бы не " -"запускать хранящееся в ``/usr/share/tarantool`` приложение напрямую?" msgid "" -"A typical Tarantool application is not a script, but a daemon running in " -"background mode and processing requests, usually sent to it over a TCP/IP " -"socket. This daemon needs to be started automatically when the operating " -"system starts, and managed with the operating system standard tools for " -"service management -- such as ``systemd`` or ``init.d``. To serve this very " -"purpose, we created **instance files**." -msgstr "" -"Типичное приложение для Tarantool -- это не скрипт, а демон, запущенный в " -"фоновом режиме и обрабатывающий запросы, которые, как правило, посылаются " -"через TCP/IP-сокет. Необходимо запускать этот демон со стартом операционной " -"системы и управлять им с помощью стандартных средств операционной системы " -"для управления сервисами -- таких как ``systemd`` или ``init.d``. С этой " -"целью и были созданы **файлы экземпляра**." +"Find detailed information about the ``tt`` configuration parameters and " +"launch modes on the :ref:`tt configuration page `." +msgstr "" + +msgid "Creating and developing an application" +msgstr "" + +msgid "You can create an application in two ways:" +msgstr "" msgid "" -"You can have more than one instance file. For example, a single application " -"in ``/usr/share/tarantool`` can run in multiple instances, each of them " -"having its own instance file. Or you can have multiple applications in " -"``/usr/share/tarantool`` -- again, each of them having its own instance " -"file." -msgstr "" -"Файлов экземпляра может быть больше одного. Например, одно и то же " -"приложение в ``/usr/share/tarantool`` может быть запущено на нескольких " -"экземплярах Tarantool, у каждого из которых есть свой файл экземпляра. Или в" -" ``/usr/share/tarantool`` может быть несколько приложений, и на каждое из " -"них будет опять же приходиться свой файл экземпляра." +"Manually by preparing its layout in a directory inside " +"``instances_enabled``. The directory name is used as the application " +"identifier." +msgstr "" + +msgid "From a template by using the :ref:`tt create ` command." +msgstr "" msgid "" -"An instance file is typically created by a system administrator. An " -"application file is often provided by a developer, in a Lua rock or an " -"rpm/deb package." +"In this example, the application's layout is prepared manually and looks as " +"follows." msgstr "" -"Обычно файл экземпляра создает системный администратор, а файл приложения " -"предоставляет разработчик в Lua-модуле или rpm/deb-пакете." msgid "" -"An instance file is designed to not differ in any way from a Lua " -"application. It must, however, configure the database, i.e. contain a call " -"to :doc:`box.cfg{} ` somewhere in it, " -"because it’s the only way to turn a Tarantool script into a background " -"process, and ``tarantoolctl`` is a tool to manage background processes. " -"Other than that, an instance file may contain arbitrary Lua code, and, in " -"theory, even include the entire application business logic in it. We, " -"however, do not recommend this, since it clutters the instance file and " -"leads to unnecessary copy-paste when you need to run multiple instances of " -"an application." -msgstr "" -"По своему устройству файл экземпляра ничем не отличается от Lua-приложения. " -"Однако с его помощью должна настраиваться база данных, поэтому в нем должен " -"содержаться вызов :doc:`box.cfg{} `, " -"потому что это единственный способ превратить Tarantool-скрипт в фоновый " -"процесс, а ``tarantoolctl`` -- это инструмент для управления фоновыми " -"процессами. За исключением этого вызова, файл экземпляра может содержать " -"произвольный код на Lua и, теоретически, даже всю бизнес-логику приложения. " -"Однако мы не рекомендуем хранить весь код в файле экземпляра, потому что " -"это приводит как к замусориванию самого файла, так и к ненужному копированию" -" кода при необходимости запустить несколько экземпляров приложения." - -msgid "tarantoolctl configuration file" -msgstr "Конфигурационный файл tarantoolctl" +"~/myapp$ tree\n" +".\n" +"├── bin\n" +"├── distfiles\n" +"├── include\n" +"├── instances.enabled\n" +"│ └── sharded_cluster\n" +"│ ├── config.yaml\n" +"│ ├── instances.yaml\n" +"│ ├── router.lua\n" +"│ ├── sharded_cluster-scm-1.rockspec\n" +"│ └── storage.lua\n" +"├── modules\n" +"├── templates\n" +"└── tt.yaml" +msgstr "" + +msgid "The ``sharded_cluster`` directory contains the following files:" +msgstr "" msgid "" -"While instance files contain instance configuration, the ``tarantoolctl`` " -"configuration file contains the configuration that ``tarantoolctl`` uses to " -"override instance configuration. In other words, it contains system-wide " -"configuration defaults. If ``tarantoolctl`` fails to find this file with the" -" method described in section :ref:`Starting/stopping an instance `, it uses default settings." -msgstr "" -"Файлы экземпляра содержат конфигурацию экземпляра, тогда как " -"конфигурационный файл ``tarantoolctl`` содержит конфигурацию, которую " -"``tarantoolctl`` использует, чтобы переопределять конфигурацию экземпляров. " -"Другими словами, он содержит общесистемную конфигурацию по умолчанию. Если " -"``tarantoolctl`` не сможет обнаружить этот файл, используя метод, описанный " -"в разделе :ref:`Запуск/остановка экземпляра `, " -"будут использованы настройки по умолчанию." +"``config.yaml``: contains the :ref:`configuration ` of the " +"cluster. This file might include the entire cluster topology or provide " +"connection settings to a centralized configuration storage." +msgstr "" msgid "" -"Most of the parameters are similar to those used by :doc:`box.cfg{} " -"`. Here are the default settings (possibly" -" installed in ``/etc/default/tarantool`` or ``/etc/sysconfig/tarantool`` as " -"part of Tarantool distribution -- see OS-specific default paths in " -":ref:`Notes for operating systems `):" -msgstr "" -"Большинство параметров схожи с теми, которые используются в :doc:`box.cfg{} " -"`. Ниже даны настройки по умолчанию (могут" -" быть установлены в ``/etc/default/tarantool`` или " -"``/etc/sysconfig/tarantool`` как часть дистрибутива Tarantool -- см. пути по" -" умолчанию для разных ОС в :ref:`Замечаниях по поводу некоторых операционных" -" систем `):" +"``instances.yml``: specifies instances to run in the current environment. " +"For example, on the developer’s machine, this file might include all the " +"instances defined in the cluster configuration. In the production " +"environment, this file includes :ref:`instances to run on the specific " +"machine `." +msgstr "" msgid "" -"default_cfg = {\n" -" pid_file = \"/var/run/tarantool\",\n" -" wal_dir = \"/var/lib/tarantool\",\n" -" memtx_dir = \"/var/lib/tarantool\",\n" -" vinyl_dir = \"/var/lib/tarantool\",\n" -" log = \"/var/log/tarantool\",\n" -" username = \"tarantool\",\n" -" language = \"Lua\",\n" -"}\n" -"instance_dir = \"/etc/tarantool/instances.enabled\"" -msgstr "" -"default_cfg = {\n" -" pid_file = \"/var/run/tarantool\",\n" -" wal_dir = \"/var/lib/tarantool\",\n" -" memtx_dir = \"/var/lib/tarantool\",\n" -" vinyl_dir = \"/var/lib/tarantool\",\n" -" log = \"/var/log/tarantool\",\n" -" username = \"tarantool\",\n" -" language = \"Lua\",\n" -"}\n" -"instance_dir = \"/etc/tarantool/instances.enabled\"" - -msgid "where:" -msgstr "где:" - -msgid "``pid_file``" -msgstr "``pid_file``" +"``router.lua``: includes code specific for a :ref:`router `." +msgstr "" msgid "" -"Directory for the pid file and control-socket file; ``tarantoolctl`` will " -"add “/instance_name” to the directory name." +"``sharded_cluster-scm-1.rockspec``: specifies the required external " +"dependencies (for example, ``vshard``)." msgstr "" -"Директория, где хранятся pid-файл и socket-файл; ``tarantoolctl`` добавляет " -"“/имя_экземпляра” к имени директории." -msgid "``wal_dir``" -msgstr "``wal_dir``" +msgid "" +"``storage.lua``: includes code specific for :ref:`storages `." +msgstr "" msgid "" -"Directory for write-ahead .xlog files; ``tarantoolctl`` will add " -"\"/instance_name\" to the directory name." +"You can find the full example here: `sharded_cluster " +"`_." msgstr "" -"Директория, где хранятся .xlog-файлы; ``tarantoolctl`` добавляет " -"“/имя_экземпляра” к имени директории." -msgid "``memtx_dir``" -msgstr "``memtx_dir``" +msgid "Packaging the application" +msgstr "" msgid "" -"Directory for snapshot .snap files; ``tarantoolctl`` will add " -"\"/instance_name\" to the directory name." +"To package the ready application, use the :ref:`tt pack ` command. " +"This command can create an installable DEB/RPM package or generate ``.tgz`` " +"archive." msgstr "" -"Директория, где хранятся .snap-файлы; ``tarantoolctl`` добавляет " -"“/имя_экземпляра” к имени директории." -msgid "``vinyl_dir``" -msgstr "``vinyl_dir``" +msgid "" +"The structure below reflects the content of the packed ``.tgz`` archive for " +"the `sharded_cluster " +"`_" +" application:" +msgstr "" msgid "" -"Directory for vinyl files; ``tarantoolctl`` will add \"/instance_name\" to " -"the directory name." +"~/myapp$ tree -a\n" +".\n" +"├── bin\n" +"│ ├── tarantool\n" +"│ └── tt\n" +"├── include\n" +"├── instances.enabled\n" +"│ └── sharded_cluster -> ../sharded_cluster\n" +"├── modules\n" +"├── sharded_cluster\n" +"│ ├── .rocks\n" +"│ │ └── share\n" +"│ │ └── ...\n" +"│ ├── config.yaml\n" +"│ ├── instances.yaml\n" +"│ ├── router.lua\n" +"│ ├── sharded_cluster-scm-1.rockspec\n" +"│ └── storage.lua\n" +"└── tt.yaml" msgstr "" -"Директория, где хранятся vinyl-файлы; ``tarantoolctl`` добавляет " -"“/имя_экземпляра” к имени директории." -msgid "``log``" -msgstr "``log``" +msgid "" +"The application's layout looks similar to the one defined when " +":ref:`developing the application ` with " +"some differences:" +msgstr "" msgid "" -"The place where the application log will go; ``tarantoolctl`` will add " -"\"/instance_name.log\" to the name." +"``bin``: contains the ``tarantool`` and ``tt`` binaries packed with the " +"application bundle." msgstr "" -"Директория, где хранятся файлы журнала с сообщениями от Tarantool-" -"приложения; ``tarantoolctl`` добавляет “/имя_экземпляра” к имени директории." -msgid "``username``" -msgstr "``username``" +msgid "" +"``instances.enabled``: contains a symlink to the packed ``sharded_cluster`` " +"application." +msgstr "" msgid "" -"The user that runs the Tarantool instance. This is the operating-system user" -" name rather than the Tarantool-client user name. Tarantool will change its " -"effective user to this user after becoming a daemon." +"``sharded_cluster``: a packed application. In addition to files created " +"during the application development, includes the ``.rocks`` directory " +"containing application dependencies (for example, ``vshard``)." msgstr "" -"Пользователь, запускающий экземпляр Tarantool. Это пользователь операционной" -" системы, а не Tarantool-клиента. Став демоном, Tarantool сменит своего " -"пользователя на указанного." -msgid "``language``" -msgstr "``language``" +#, fuzzy +msgid "``tt.yaml``: a ``tt`` configuration file." +msgstr "Конфигурационный файл tarantoolctl" + +#, fuzzy +msgid "Instances to run" +msgstr "Файл экземпляра" msgid "" -"The :ref:`interactive console ` language. Can be either" -" ``Lua`` or ``SQL``." +"One more difference for a deployed application is the content of the " +"``instances.yaml`` file that specifies instances to run in the current " +"environment." msgstr "" -"Язык :ref:`интерактивной консоли `: ``Lua`` либо " -"``SQL``." -msgid "``instance_dir``" +msgid "" +"On the developer's machine, this file might include all the instances " +"defined in the cluster configuration." +msgstr "" + +#, fuzzy +msgid "``instances.yaml``:" msgstr "``instance_dir``" msgid "" -"The directory where all instance files for this host are stored. Put " -"instance files in this directory, or create symbolic links." +"storage-a-001:\n" +"storage-a-002:\n" +"storage-b-001:\n" +"storage-b-002:\n" +"router-a-001:" msgstr "" -"Директория, где хранятся все файлы экземпляра для данного компьютера. " -"Поместите сюда файлы экземпляра или создайте символьные ссылки на них." msgid "" -"The default instance directory depends on Tarantool's ``WITH_SYSVINIT`` " -"build option: when ON, it is ``/etc/tarantool/instances.enabled``, otherwise" -" (OFF or not set) it is ``/etc/tarantool/instances.available``. The latter " -"case is typical for Tarantool builds for Linux distros with ``systemd``." +"In the production environment, this file includes instances to run on the " +"specific machine." +msgstr "" + +msgid "``instances.yaml`` (Server-001):" +msgstr "" + +msgid "router-a-001:" msgstr "" -"Директория с экземплярами, которая используется по умолчанию, зависит от " -"параметра сборки Tarantool ``WITH_SYSVINIT``: когда его значение \"ON\", то " -"``/etc/tarantool/instances.enabled``, в противном случае (\"OFF\" или " -"значение не установлено) ``/etc/tarantool/instances.available``. Последний " -"случай характерен для сборок Tarantool для дистрибутивов Linux с " -"``systemd``." -msgid "To check the build options, say ``tarantool --version``." +msgid "``instances.yaml`` (Server-002):" msgstr "" -"Для проверки параметров сборки выполните команду ``tarantool --version``." msgid "" -"As a full-featured example, you can take `example.lua " -"`_ " -"script that ships with Tarantool and defines all configuration options." -msgstr "" -"В качестве полноценного примера можно использовать скрипт `example.lua " -"`_," -" который поставляется вместе с Tarantool и задает все конфигурационные " -"параметры." +"storage-a-001:\n" +"storage-b-001:" +msgstr "" + +msgid "``instances.yaml`` (Server-003):" +msgstr "" + +msgid "" +"storage-a-002:\n" +"storage-b-002:" +msgstr "" + +msgid "" +"The :ref:`Starting and stopping instances ` " +"section describes how to start and stop Tarantool instances." +msgstr "" + +#~ msgid "Instance configuration" +#~ msgstr "Настройка экземпляров Tarantool" + +#~ msgid "For each Tarantool instance, you need two files:" +#~ msgstr "Для каждого экземпляра Tarantool понадобится два файла:" + +#~ msgid "" +#~ "[Optional] An :ref:`application file ` with " +#~ "instance-specific logic. Put this file into the ``/usr/share/tarantool/`` " +#~ "directory." +#~ msgstr "" +#~ "[Необязательный] :ref:`Файл приложения `, " +#~ "содержащий логику данного экземпляра. Поместите его в папку " +#~ "``/usr/share/tarantool/``." + +#~ msgid "" +#~ "For example, ``/usr/share/tarantool/my_app.lua`` (here we implement it as a " +#~ ":ref:`Lua module ` that bootstraps the database and " +#~ "exports ``start()`` function for API calls):" +#~ msgstr "" +#~ "Например, ``/usr/share/tarantool/my_app.lua`` (здесь мы реализуем его как " +#~ ":ref:`Lua-модуль `, который запускает базу данных и " +#~ "экспортирует функцию ``start()`` для API -вызовов):" + +#~ msgid "" +#~ "local function start()\n" +#~ " box.schema.space.create(\"somedata\")\n" +#~ " box.space.somedata:create_index(\"primary\")\n" +#~ " <...>\n" +#~ "end\n" +#~ "\n" +#~ "return {\n" +#~ " start = start;\n" +#~ "}" +#~ msgstr "" +#~ "local function start()\n" +#~ " box.schema.space.create(\"somedata\")\n" +#~ " box.space.somedata:create_index(\"primary\")\n" +#~ " <...>\n" +#~ "end\n" +#~ "\n" +#~ "return {\n" +#~ " start = start;\n" +#~ "}" + +#~ msgid "" +#~ "An :ref:`instance file ` with instance-specific " +#~ "initialization logic and parameters. Put this file, or a symlink to it, into" +#~ " the **instance directory** (see :ref:`instance_dir ` " +#~ "parameter in ``tarantoolctl`` configuration file)." +#~ msgstr "" +#~ ":ref:`Файл экземпляра `, содержащий логику и параметры " +#~ "инициализации данного экземпляра. Поместите этот файл или символьную ссылку " +#~ "на него в **директорию экземпляра** (см. параметр :ref:`instance_dir ` в конфигурационном файле ``tarantoolctl``)." + +#~ msgid "" +#~ "For example, ``/etc/tarantool/instances.enabled/my_app.lua`` (here we load " +#~ "``my_app.lua`` module and make a call to ``start()`` function from that " +#~ "module):" +#~ msgstr "" +#~ "Например, ``/etc/tarantool/instances.enabled/my_app.lua`` (здесь мы " +#~ "загружаем модуль ``my_app.lua`` и вызываем из него функцию ``start()``):" + +#~ msgid "" +#~ "#!/usr/bin/env tarantool\n" +#~ "\n" +#~ "box.cfg {\n" +#~ " listen = 3301;\n" +#~ "}\n" +#~ "\n" +#~ "-- load my_app module and call start() function\n" +#~ "-- with some app options controlled by sysadmins\n" +#~ "local m = require('my_app').start({...})" +#~ msgstr "" +#~ "#!/usr/bin/env tarantool\n" +#~ "\n" +#~ "box.cfg {\n" +#~ " listen = 3301;\n" +#~ "}\n" +#~ "\n" +#~ "-- загрузить модуль my_app и вызвать функцию start()\n" +#~ "-- некоторые опции приложения под контролем сисадминов\n" +#~ "local m = require('my_app').start({...})" + +#~ msgid "" +#~ "After this short introduction, you may wonder what an instance file is, what" +#~ " it is for, and how ``tarantoolctl`` uses it. After all, Tarantool is an " +#~ "application server, so why not start the application stored in " +#~ "``/usr/share/tarantool`` directly?" +#~ msgstr "" +#~ "После столь краткого предисловия может возникнуть вопрос: что из себя " +#~ "представляет файл экземпляра, для чего он нужен и как ``tarantoolctl`` " +#~ "использует его? Если Tarantool -- это сервер приложений, так почему бы не " +#~ "запускать хранящееся в ``/usr/share/tarantool`` приложение напрямую?" + +#~ msgid "" +#~ "A typical Tarantool application is not a script, but a daemon running in " +#~ "background mode and processing requests, usually sent to it over a TCP/IP " +#~ "socket. This daemon needs to be started automatically when the operating " +#~ "system starts, and managed with the operating system standard tools for " +#~ "service management -- such as ``systemd`` or ``init.d``. To serve this very " +#~ "purpose, we created **instance files**." +#~ msgstr "" +#~ "Типичное приложение для Tarantool -- это не скрипт, а демон, запущенный в " +#~ "фоновом режиме и обрабатывающий запросы, которые, как правило, посылаются " +#~ "через TCP/IP-сокет. Необходимо запускать этот демон со стартом операционной " +#~ "системы и управлять им с помощью стандартных средств операционной системы " +#~ "для управления сервисами -- таких как ``systemd`` или ``init.d``. С этой " +#~ "целью и были созданы **файлы экземпляра**." + +#~ msgid "" +#~ "You can have more than one instance file. For example, a single application " +#~ "in ``/usr/share/tarantool`` can run in multiple instances, each of them " +#~ "having its own instance file. Or you can have multiple applications in " +#~ "``/usr/share/tarantool`` -- again, each of them having its own instance " +#~ "file." +#~ msgstr "" +#~ "Файлов экземпляра может быть больше одного. Например, одно и то же " +#~ "приложение в ``/usr/share/tarantool`` может быть запущено на нескольких " +#~ "экземплярах Tarantool, у каждого из которых есть свой файл экземпляра. Или в" +#~ " ``/usr/share/tarantool`` может быть несколько приложений, и на каждое из " +#~ "них будет опять же приходиться свой файл экземпляра." + +#~ msgid "" +#~ "An instance file is typically created by a system administrator. An " +#~ "application file is often provided by a developer, in a Lua rock or an " +#~ "rpm/deb package." +#~ msgstr "" +#~ "Обычно файл экземпляра создает системный администратор, а файл приложения " +#~ "предоставляет разработчик в Lua-модуле или rpm/deb-пакете." + +#~ msgid "" +#~ "An instance file is designed to not differ in any way from a Lua " +#~ "application. It must, however, configure the database, i.e. contain a call " +#~ "to :doc:`box.cfg{} ` somewhere in it, " +#~ "because it’s the only way to turn a Tarantool script into a background " +#~ "process, and ``tarantoolctl`` is a tool to manage background processes. " +#~ "Other than that, an instance file may contain arbitrary Lua code, and, in " +#~ "theory, even include the entire application business logic in it. We, " +#~ "however, do not recommend this, since it clutters the instance file and " +#~ "leads to unnecessary copy-paste when you need to run multiple instances of " +#~ "an application." +#~ msgstr "" +#~ "По своему устройству файл экземпляра ничем не отличается от Lua-приложения. " +#~ "Однако с его помощью должна настраиваться база данных, поэтому в нем должен " +#~ "содержаться вызов :doc:`box.cfg{} `, " +#~ "потому что это единственный способ превратить Tarantool-скрипт в фоновый " +#~ "процесс, а ``tarantoolctl`` -- это инструмент для управления фоновыми " +#~ "процессами. За исключением этого вызова, файл экземпляра может содержать " +#~ "произвольный код на Lua и, теоретически, даже всю бизнес-логику приложения. " +#~ "Однако мы не рекомендуем хранить весь код в файле экземпляра, потому что " +#~ "это приводит как к замусориванию самого файла, так и к ненужному копированию" +#~ " кода при необходимости запустить несколько экземпляров приложения." + +#~ msgid "" +#~ "While instance files contain instance configuration, the ``tarantoolctl`` " +#~ "configuration file contains the configuration that ``tarantoolctl`` uses to " +#~ "override instance configuration. In other words, it contains system-wide " +#~ "configuration defaults. If ``tarantoolctl`` fails to find this file with the" +#~ " method described in section :ref:`Starting/stopping an instance `, it uses default settings." +#~ msgstr "" +#~ "Файлы экземпляра содержат конфигурацию экземпляра, тогда как " +#~ "конфигурационный файл ``tarantoolctl`` содержит конфигурацию, которую " +#~ "``tarantoolctl`` использует, чтобы переопределять конфигурацию экземпляров. " +#~ "Другими словами, он содержит общесистемную конфигурацию по умолчанию. Если " +#~ "``tarantoolctl`` не сможет обнаружить этот файл, используя метод, описанный " +#~ "в разделе :ref:`Запуск/остановка экземпляра `, " +#~ "будут использованы настройки по умолчанию." + +#~ msgid "" +#~ "Most of the parameters are similar to those used by :doc:`box.cfg{} " +#~ "`. Here are the default settings (possibly" +#~ " installed in ``/etc/default/tarantool`` or ``/etc/sysconfig/tarantool`` as " +#~ "part of Tarantool distribution -- see OS-specific default paths in " +#~ ":ref:`Notes for operating systems `):" +#~ msgstr "" +#~ "Большинство параметров схожи с теми, которые используются в :doc:`box.cfg{} " +#~ "`. Ниже даны настройки по умолчанию (могут" +#~ " быть установлены в ``/etc/default/tarantool`` или " +#~ "``/etc/sysconfig/tarantool`` как часть дистрибутива Tarantool -- см. пути по" +#~ " умолчанию для разных ОС в :ref:`Замечаниях по поводу некоторых операционных" +#~ " систем `):" + +#~ msgid "" +#~ "default_cfg = {\n" +#~ " pid_file = \"/var/run/tarantool\",\n" +#~ " wal_dir = \"/var/lib/tarantool\",\n" +#~ " memtx_dir = \"/var/lib/tarantool\",\n" +#~ " vinyl_dir = \"/var/lib/tarantool\",\n" +#~ " log = \"/var/log/tarantool\",\n" +#~ " username = \"tarantool\",\n" +#~ " language = \"Lua\",\n" +#~ "}\n" +#~ "instance_dir = \"/etc/tarantool/instances.enabled\"" +#~ msgstr "" +#~ "default_cfg = {\n" +#~ " pid_file = \"/var/run/tarantool\",\n" +#~ " wal_dir = \"/var/lib/tarantool\",\n" +#~ " memtx_dir = \"/var/lib/tarantool\",\n" +#~ " vinyl_dir = \"/var/lib/tarantool\",\n" +#~ " log = \"/var/log/tarantool\",\n" +#~ " username = \"tarantool\",\n" +#~ " language = \"Lua\",\n" +#~ "}\n" +#~ "instance_dir = \"/etc/tarantool/instances.enabled\"" + +#~ msgid "where:" +#~ msgstr "где:" + +#~ msgid "``pid_file``" +#~ msgstr "``pid_file``" + +#~ msgid "" +#~ "Directory for the pid file and control-socket file; ``tarantoolctl`` will " +#~ "add “/instance_name” to the directory name." +#~ msgstr "" +#~ "Директория, где хранятся pid-файл и socket-файл; ``tarantoolctl`` добавляет " +#~ "“/имя_экземпляра” к имени директории." + +#~ msgid "``wal_dir``" +#~ msgstr "``wal_dir``" + +#~ msgid "" +#~ "Directory for write-ahead .xlog files; ``tarantoolctl`` will add " +#~ "\"/instance_name\" to the directory name." +#~ msgstr "" +#~ "Директория, где хранятся .xlog-файлы; ``tarantoolctl`` добавляет " +#~ "“/имя_экземпляра” к имени директории." + +#~ msgid "``memtx_dir``" +#~ msgstr "``memtx_dir``" + +#~ msgid "" +#~ "Directory for snapshot .snap files; ``tarantoolctl`` will add " +#~ "\"/instance_name\" to the directory name." +#~ msgstr "" +#~ "Директория, где хранятся .snap-файлы; ``tarantoolctl`` добавляет " +#~ "“/имя_экземпляра” к имени директории." + +#~ msgid "``vinyl_dir``" +#~ msgstr "``vinyl_dir``" + +#~ msgid "" +#~ "Directory for vinyl files; ``tarantoolctl`` will add \"/instance_name\" to " +#~ "the directory name." +#~ msgstr "" +#~ "Директория, где хранятся vinyl-файлы; ``tarantoolctl`` добавляет " +#~ "“/имя_экземпляра” к имени директории." + +#~ msgid "``log``" +#~ msgstr "``log``" + +#~ msgid "" +#~ "The place where the application log will go; ``tarantoolctl`` will add " +#~ "\"/instance_name.log\" to the name." +#~ msgstr "" +#~ "Директория, где хранятся файлы журнала с сообщениями от Tarantool-" +#~ "приложения; ``tarantoolctl`` добавляет “/имя_экземпляра” к имени директории." + +#~ msgid "``username``" +#~ msgstr "``username``" + +#~ msgid "" +#~ "The user that runs the Tarantool instance. This is the operating-system user" +#~ " name rather than the Tarantool-client user name. Tarantool will change its " +#~ "effective user to this user after becoming a daemon." +#~ msgstr "" +#~ "Пользователь, запускающий экземпляр Tarantool. Это пользователь операционной" +#~ " системы, а не Tarantool-клиента. Став демоном, Tarantool сменит своего " +#~ "пользователя на указанного." + +#~ msgid "``language``" +#~ msgstr "``language``" + +#~ msgid "" +#~ "The :ref:`interactive console ` language. Can be either" +#~ " ``Lua`` or ``SQL``." +#~ msgstr "" +#~ "Язык :ref:`интерактивной консоли `: ``Lua`` либо " +#~ "``SQL``." + +#~ msgid "" +#~ "The directory where all instance files for this host are stored. Put " +#~ "instance files in this directory, or create symbolic links." +#~ msgstr "" +#~ "Директория, где хранятся все файлы экземпляра для данного компьютера. " +#~ "Поместите сюда файлы экземпляра или создайте символьные ссылки на них." + +#~ msgid "" +#~ "The default instance directory depends on Tarantool's ``WITH_SYSVINIT`` " +#~ "build option: when ON, it is ``/etc/tarantool/instances.enabled``, otherwise" +#~ " (OFF or not set) it is ``/etc/tarantool/instances.available``. The latter " +#~ "case is typical for Tarantool builds for Linux distros with ``systemd``." +#~ msgstr "" +#~ "Директория с экземплярами, которая используется по умолчанию, зависит от " +#~ "параметра сборки Tarantool ``WITH_SYSVINIT``: когда его значение \"ON\", то " +#~ "``/etc/tarantool/instances.enabled``, в противном случае (\"OFF\" или " +#~ "значение не установлено) ``/etc/tarantool/instances.available``. Последний " +#~ "случай характерен для сборок Tarantool для дистрибутивов Linux с " +#~ "``systemd``." + +#~ msgid "To check the build options, say ``tarantool --version``." +#~ msgstr "" +#~ "Для проверки параметров сборки выполните команду ``tarantool --version``." + +#~ msgid "" +#~ "As a full-featured example, you can take `example.lua " +#~ "`_ " +#~ "script that ships with Tarantool and defines all configuration options." +#~ msgstr "" +#~ "В качестве полноценного примера можно использовать скрипт `example.lua " +#~ "`_," +#~ " который поставляется вместе с Tarantool и задает все конфигурационные " +#~ "параметры." diff --git a/locale/ru/LC_MESSAGES/book/admin/logs.po b/locale/ru/LC_MESSAGES/book/admin/logs.po index c0259cc3db..03b24f345f 100644 --- a/locale/ru/LC_MESSAGES/book/admin/logs.po +++ b/locale/ru/LC_MESSAGES/book/admin/logs.po @@ -3,25 +3,28 @@ msgid "Logs" msgstr "Журналирование" msgid "" -"Tarantool logs important events to a file, e.g. " -"``/var/log/tarantool/my_app.log``. To build the log file path, " -"``tarantoolctl`` takes the instance name, prepends the instance directory " -"and appends “.log” extension." +"Each Tarantool instance logs important events to its own log file " +"``.log``. For instances started with :ref:`tt `, the " +"log location is defined by the ``log_dir`` parameter in the :ref:`tt " +"configuration `. By default, it's ``/var/log/tarantool`` in the " +"``tt`` :ref:`system mode `, and the ``var/log/`` " +"subdirectory of the ``tt`` working directory in the :ref:`local mode `. In the specified location, ``tt`` creates separate " +"directories for each instance's logs." msgstr "" -"Все важные события Tarantool записывает в файл журнала -- например, в " -"``/var/log/tarantool/my_app.log``. ``tarantoolctl`` строит путь до файла " -"журнала следующим образом: \"путь до директории с экземплярами\" + \"имя " -"экземпляра\" + \".lua\"." -msgid "Let’s write something to the log file:" -msgstr "Запишем что-нибудь в файл журнала:" +msgid "" +"To check how logging works, write something to the log using the :ref:`log " +"` module:" +msgstr "" +#, fuzzy msgid "" -"$ tarantoolctl enter my_app\n" -"/bin/tarantoolctl: connected to unix/:/var/run/tarantool/my_app.control\n" -"unix/:/var/run/tarantool/my_app.control> require('log').info(\"Hello for the manual readers\")\n" -"---\n" -"..." +"$ tt connect my_app\n" +" • Connecting to the instance...\n" +" • Connected to /var/run/tarantool/my_app.control\n" +"\n" +"/var/run/tarantool/my_app.control> require('log').info(\"Hello for the manual readers\")" msgstr "" "$ tarantoolctl enter my_app\n" "/bin/tarantoolctl: connected to unix/:/var/run/tarantool/my_app.control\n" @@ -34,112 +37,198 @@ msgstr "Затем проверим содержимое журнала:" msgid "" "$ tail /var/log/tarantool/my_app.log\n" -"2017-04-04 15:54:04.977 [29255] main/101/tarantoolctl C> version 1.7.3-382-g68ef3f6a9\n" -"2017-04-04 15:54:04.977 [29255] main/101/tarantoolctl C> log level 5\n" -"2017-04-04 15:54:04.978 [29255] main/101/tarantoolctl I> mapping 134217728 bytes for tuple arena...\n" -"2017-04-04 15:54:04.985 [29255] iproto/101/main I> binary: bound to [::1]:3301\n" -"2017-04-04 15:54:04.986 [29255] main/101/tarantoolctl I> recovery start\n" -"2017-04-04 15:54:04.986 [29255] main/101/tarantoolctl I> recovering from `/var/lib/tarantool/my_app/00000000000000000000.snap'\n" -"2017-04-04 15:54:04.988 [29255] main/101/tarantoolctl I> ready to accept requests\n" -"2017-04-04 15:54:04.988 [29255] main/101/tarantoolctl I> set 'checkpoint_interval' configuration option to 3600\n" -"2017-04-04 15:54:04.988 [29255] main/101/my_app I> Run console at unix/:/var/run/tarantool/my_app.control\n" -"2017-04-04 15:54:04.989 [29255] main/106/console/unix/:/var/ I> started\n" -"2017-04-04 15:54:04.989 [29255] main C> entering the event loop\n" -"2017-04-04 15:54:47.147 [29255] main/107/console/unix/: I> Hello for the manual readers" +"2023-09-12 18:13:00.396 [67173] main/111/guard of feedback_daemon/box.feedback_daemon V> metrics_collector restarted\n" +"2023-09-12 18:13:00.396 [67173] main/103/-/box.feedback_daemon V> feedback_daemon started\n" +"2023-09-12 18:13:00.396 [67173] main/103/- D> memtx_tuple_new_raw_impl(14) = 0x1090077b4\n" +"2023-09-12 18:13:00.396 [67173] main/103/- D> memtx_tuple_new_raw_impl(26) = 0x1090077ec\n" +"2023-09-12 18:13:00.396 [67173] main/103/- D> memtx_tuple_new_raw_impl(39) = 0x109007824\n" +"2023-09-12 18:13:00.396 [67173] main/103/- D> memtx_tuple_new_raw_impl(24) = 0x10900785c\n" +"2023-09-12 18:13:00.396 [67173] main/103/- D> memtx_tuple_new_raw_impl(39) = 0x109007894\n" +"2023-09-12 18:13:00.396 [67173] main/106/checkpoint_daemon I> scheduled next checkpoint for Tue Sep 12 19:44:34 2023\n" +"2023-09-12 18:13:00.396 [67173] main I> entering the event loop\n" +"2023-09-12 18:13:11.656 [67173] main/114/console/unix/:/tarantool I> Hello for the manual readers" +msgstr "" + +msgid "Log rotation" msgstr "" -"$ tail /var/log/tarantool/my_app.log\n" -"2017-04-04 15:54:04.977 [29255] main/101/tarantoolctl C> version 1.7.3-382-g68ef3f6a9\n" -"2017-04-04 15:54:04.977 [29255] main/101/tarantoolctl C> log level 5\n" -"2017-04-04 15:54:04.978 [29255] main/101/tarantoolctl I> mapping 134217728 bytes for tuple arena...\n" -"2017-04-04 15:54:04.985 [29255] iproto/101/main I> binary: bound to [::1]:3301\n" -"2017-04-04 15:54:04.986 [29255] main/101/tarantoolctl I> recovery start\n" -"2017-04-04 15:54:04.986 [29255] main/101/tarantoolctl I> recovering from `/var/lib/tarantool/my_app/00000000000000000000.snap'\n" -"2017-04-04 15:54:04.988 [29255] main/101/tarantoolctl I> ready to accept requests\n" -"2017-04-04 15:54:04.988 [29255] main/101/tarantoolctl I> set 'checkpoint_interval' configuration option to 3600\n" -"2017-04-04 15:54:04.988 [29255] main/101/my_app I> Run console at unix/:/var/run/tarantool/my_app.control\n" -"2017-04-04 15:54:04.989 [29255] main/106/console/unix/:/var/ I> started\n" -"2017-04-04 15:54:04.989 [29255] main C> entering the event loop\n" -"2017-04-04 15:54:47.147 [29255] main/107/console/unix/: I> Hello for the manual readers" msgid "" -"When logging to a file, the system administrator must ensure logs are " -"rotated timely and do not take up all the available disk space. With " -"``tarantoolctl``, log rotation is pre-configured to use ``logrotate`` " -"program, which you must have installed." +"When :ref:`logging to a file `, the system administrator " +"must ensure logs are rotated timely and do not take up all the available " +"disk space. To prevent log files from growing infinitely, ``tt`` " +"automatically rotates instance logs. The following ``tt`` configuration " +"parameters define the log rotation: ``log_maxsize`` (in megabytes) and " +"``log_maxage`` (in days). When any of these limits is reached, the log is " +"rotated. Additionally, there is the ``log_maxbackups`` parameter (the number" +" of stored log files for an instance), which enables automatic removal of " +"old log files." msgstr "" -"При включенном журналировании системный администратор должен обеспечивать " -"своевременную ротацию журналов, чтобы избежать переполнения дискового " -"пространства. Ротация журналов в ``tarantoolctl`` производится с помощью " -"программы ``logrotate``, которую необходимо установить заранее." msgid "" -"File ``/etc/logrotate.d/tarantool`` is part of the standard Tarantool " -"distribution, and you can modify it to change the default behavior. This is " -"what this file is usually like:" +"# tt.yaml\n" +"tt:\n" +" app:\n" +" log_maxsize: 100\n" +" log_maxage: 3\n" +" log_maxbackups: 50\n" +" # ..." msgstr "" -"Файл ``/etc/logrotate.d/tarantool`` поставляется со стандартным " -"дистрибутивом Tarantool. Его можно редактировать для изменения поведения по " -"умолчанию. Содержимое файла обычно выглядит так:" msgid "" -"/var/log/tarantool/*.log {\n" -" daily\n" -" size 512k\n" -" missingok\n" -" rotate 10\n" -" compress\n" -" delaycompress\n" -" create 0640 tarantool adm\n" -" postrotate\n" -" /usr/bin/tarantoolctl logrotate `basename ${1%%.*}`\n" -" endscript\n" -"}" +"There is also the :ref:`tt logrotate ` command that performs " +"log rotation on demand." +msgstr "" + +msgid "tt logrotate my_app" msgstr "" -"/var/log/tarantool/*.log {\n" -" daily\n" -" size 512k\n" -" missingok\n" -" rotate 10\n" -" compress\n" -" delaycompress\n" -" create 0640 tarantool adm\n" -" postrotate\n" -" /usr/bin/tarantoolctl logrotate `basename ${1%%.*}`\n" -" endscript\n" -"}" msgid "" -"If you use a different log rotation program, you can invoke ``tarantoolctl " -"logrotate`` command to request instances to reopen their log files after " -"they were moved by the program of your choice." +"To learn about log rotation in the deprecated ``tarantoolctl`` utility, " +"check its :ref:`documentation `." +msgstr "" + +msgid "Log formats" msgstr "" -"Если вы используете другую программу для ротации журналов, можно вызвать " -"команду ``tarantoolctl logrotate``, чтобы экземпляры переоткрыли свои файлы " -"журнала после того, как выбранная вами программа переместила их." +#, fuzzy msgid "" -"Tarantool can write its logs to a log file, ``syslog`` or a program " -"specified in the configuration file (see :ref:`log ` " -"parameter)." +"Tarantool can write its logs to a log file, to ``syslog``, or to a specified" +" program through a pipe." msgstr "" "Tarantool может писать события в файл журнала, ``syslog`` или программу, " "указанную в конфигурационном файле (см. параметр :ref:`log `)." msgid "" -"By default, logs are written to a file as defined in ``tarantoolctl`` " -"defaults. ``tarantoolctl`` automatically detects if an instance is using " -"``syslog`` or an external program for logging, and does not override the log" -" destination in this case. In such configurations, log rotation is usually " -"handled by the external program used for logging. So, ``tarantoolctl " -"logrotate`` command works only if logging-into-file is enabled in the " -"instance file." +"File is the default log format for ``tt``. To send logs to a pipe or " +"``syslog``, specify the :ref:`box.cfg.log ` parameter, for " +"example:" msgstr "" -"По умолчанию запись производится в файл журнала, как указано в исходных " -"настройках ``tarantoolctl``. Скрипт ``tarantoolctl`` автоматически " -"определяет, когда экземпляр использует для журналирования ``syslog`` или " -"внешнюю программу, и не изменяет то, куда ведется запись. В таких случаях " -"ротацию журналов обычно выполняет та же программа, которая используется для " -"журналирования. Именно поэтому команда ``tarantoolctl logrotate`` сработает " -"только в том случае, если в файле экземпляра включена возможность вести " -"запись в файл." + +msgid "" +"box.cfg{log = '| cronolog tarantool.log'}\n" +"-- or\n" +"box.cfg{log = 'syslog:identity=tarantool,facility=user'}" +msgstr "" + +msgid "" +"In such configurations, log rotation is usually handled by the external " +"program used for logging." +msgstr "" + +#~ msgid "" +#~ "Tarantool logs important events to a file, e.g. " +#~ "``/var/log/tarantool/my_app.log``. To build the log file path, " +#~ "``tarantoolctl`` takes the instance name, prepends the instance directory " +#~ "and appends “.log” extension." +#~ msgstr "" +#~ "Все важные события Tarantool записывает в файл журнала -- например, в " +#~ "``/var/log/tarantool/my_app.log``. ``tarantoolctl`` строит путь до файла " +#~ "журнала следующим образом: \"путь до директории с экземплярами\" + \"имя " +#~ "экземпляра\" + \".lua\"." + +#~ msgid "Let’s write something to the log file:" +#~ msgstr "Запишем что-нибудь в файл журнала:" + +#~ msgid "" +#~ "$ tail /var/log/tarantool/my_app.log\n" +#~ "2017-04-04 15:54:04.977 [29255] main/101/tarantoolctl C> version 1.7.3-382-g68ef3f6a9\n" +#~ "2017-04-04 15:54:04.977 [29255] main/101/tarantoolctl C> log level 5\n" +#~ "2017-04-04 15:54:04.978 [29255] main/101/tarantoolctl I> mapping 134217728 bytes for tuple arena...\n" +#~ "2017-04-04 15:54:04.985 [29255] iproto/101/main I> binary: bound to [::1]:3301\n" +#~ "2017-04-04 15:54:04.986 [29255] main/101/tarantoolctl I> recovery start\n" +#~ "2017-04-04 15:54:04.986 [29255] main/101/tarantoolctl I> recovering from `/var/lib/tarantool/my_app/00000000000000000000.snap'\n" +#~ "2017-04-04 15:54:04.988 [29255] main/101/tarantoolctl I> ready to accept requests\n" +#~ "2017-04-04 15:54:04.988 [29255] main/101/tarantoolctl I> set 'checkpoint_interval' configuration option to 3600\n" +#~ "2017-04-04 15:54:04.988 [29255] main/101/my_app I> Run console at unix/:/var/run/tarantool/my_app.control\n" +#~ "2017-04-04 15:54:04.989 [29255] main/106/console/unix/:/var/ I> started\n" +#~ "2017-04-04 15:54:04.989 [29255] main C> entering the event loop\n" +#~ "2017-04-04 15:54:47.147 [29255] main/107/console/unix/: I> Hello for the manual readers" +#~ msgstr "" +#~ "$ tail /var/log/tarantool/my_app.log\n" +#~ "2017-04-04 15:54:04.977 [29255] main/101/tarantoolctl C> version 1.7.3-382-g68ef3f6a9\n" +#~ "2017-04-04 15:54:04.977 [29255] main/101/tarantoolctl C> log level 5\n" +#~ "2017-04-04 15:54:04.978 [29255] main/101/tarantoolctl I> mapping 134217728 bytes for tuple arena...\n" +#~ "2017-04-04 15:54:04.985 [29255] iproto/101/main I> binary: bound to [::1]:3301\n" +#~ "2017-04-04 15:54:04.986 [29255] main/101/tarantoolctl I> recovery start\n" +#~ "2017-04-04 15:54:04.986 [29255] main/101/tarantoolctl I> recovering from `/var/lib/tarantool/my_app/00000000000000000000.snap'\n" +#~ "2017-04-04 15:54:04.988 [29255] main/101/tarantoolctl I> ready to accept requests\n" +#~ "2017-04-04 15:54:04.988 [29255] main/101/tarantoolctl I> set 'checkpoint_interval' configuration option to 3600\n" +#~ "2017-04-04 15:54:04.988 [29255] main/101/my_app I> Run console at unix/:/var/run/tarantool/my_app.control\n" +#~ "2017-04-04 15:54:04.989 [29255] main/106/console/unix/:/var/ I> started\n" +#~ "2017-04-04 15:54:04.989 [29255] main C> entering the event loop\n" +#~ "2017-04-04 15:54:47.147 [29255] main/107/console/unix/: I> Hello for the manual readers" + +#~ msgid "" +#~ "When logging to a file, the system administrator must ensure logs are " +#~ "rotated timely and do not take up all the available disk space. With " +#~ "``tarantoolctl``, log rotation is pre-configured to use ``logrotate`` " +#~ "program, which you must have installed." +#~ msgstr "" +#~ "При включенном журналировании системный администратор должен обеспечивать " +#~ "своевременную ротацию журналов, чтобы избежать переполнения дискового " +#~ "пространства. Ротация журналов в ``tarantoolctl`` производится с помощью " +#~ "программы ``logrotate``, которую необходимо установить заранее." + +#~ msgid "" +#~ "File ``/etc/logrotate.d/tarantool`` is part of the standard Tarantool " +#~ "distribution, and you can modify it to change the default behavior. This is " +#~ "what this file is usually like:" +#~ msgstr "" +#~ "Файл ``/etc/logrotate.d/tarantool`` поставляется со стандартным " +#~ "дистрибутивом Tarantool. Его можно редактировать для изменения поведения по " +#~ "умолчанию. Содержимое файла обычно выглядит так:" + +#~ msgid "" +#~ "/var/log/tarantool/*.log {\n" +#~ " daily\n" +#~ " size 512k\n" +#~ " missingok\n" +#~ " rotate 10\n" +#~ " compress\n" +#~ " delaycompress\n" +#~ " create 0640 tarantool adm\n" +#~ " postrotate\n" +#~ " /usr/bin/tarantoolctl logrotate `basename ${1%%.*}`\n" +#~ " endscript\n" +#~ "}" +#~ msgstr "" +#~ "/var/log/tarantool/*.log {\n" +#~ " daily\n" +#~ " size 512k\n" +#~ " missingok\n" +#~ " rotate 10\n" +#~ " compress\n" +#~ " delaycompress\n" +#~ " create 0640 tarantool adm\n" +#~ " postrotate\n" +#~ " /usr/bin/tarantoolctl logrotate `basename ${1%%.*}`\n" +#~ " endscript\n" +#~ "}" + +#~ msgid "" +#~ "If you use a different log rotation program, you can invoke ``tarantoolctl " +#~ "logrotate`` command to request instances to reopen their log files after " +#~ "they were moved by the program of your choice." +#~ msgstr "" +#~ "Если вы используете другую программу для ротации журналов, можно вызвать " +#~ "команду ``tarantoolctl logrotate``, чтобы экземпляры переоткрыли свои файлы " +#~ "журнала после того, как выбранная вами программа переместила их." + +#~ msgid "" +#~ "By default, logs are written to a file as defined in ``tarantoolctl`` " +#~ "defaults. ``tarantoolctl`` automatically detects if an instance is using " +#~ "``syslog`` or an external program for logging, and does not override the log" +#~ " destination in this case. In such configurations, log rotation is usually " +#~ "handled by the external program used for logging. So, ``tarantoolctl " +#~ "logrotate`` command works only if logging-into-file is enabled in the " +#~ "instance file." +#~ msgstr "" +#~ "По умолчанию запись производится в файл журнала, как указано в исходных " +#~ "настройках ``tarantoolctl``. Скрипт ``tarantoolctl`` автоматически " +#~ "определяет, когда экземпляр использует для журналирования ``syslog`` или " +#~ "внешнюю программу, и не изменяет то, куда ведется запись. В таких случаях " +#~ "ротацию журналов обычно выполняет та же программа, которая используется для " +#~ "журналирования. Именно поэтому команда ``tarantoolctl logrotate`` сработает " +#~ "только в том случае, если в файле экземпляра включена возможность вести " +#~ "запись в файл." diff --git a/locale/ru/LC_MESSAGES/book/admin/modules.po b/locale/ru/LC_MESSAGES/book/admin/modules.po index 03712dae71..382ffdeb4d 100644 --- a/locale/ru/LC_MESSAGES/book/admin/modules.po +++ b/locale/ru/LC_MESSAGES/book/admin/modules.po @@ -1,4 +1,14 @@ +#, fuzzy +msgid "Managing modules" +msgstr "Установка модуля" + +msgid "" +"This section covers the installation and reloading of Tarantool modules. To " +"learn about writing your own module and contributing it, check the " +":ref:`Contributing a module ` section." +msgstr "" + msgid "Installing a module" msgstr "Установка модуля" @@ -47,9 +57,10 @@ msgstr "" "Установите Tarantool в соответствии с рекомендациями на `странице загрузки " "`_." +#, fuzzy msgid "" "Install the module you need. Look up the module's name on `Tarantool rocks " -"page `_ and put the prefix \"tarantool-\" " +"page `_ and put the prefix \"tarantool-\" " "before the module name to avoid ambiguity:" msgstr "" "Установите необходимый модуль. Найдите имя модуля на `странице со сторонними" @@ -141,14 +152,13 @@ msgstr "" "Знаки вопроса стоят вместо имени модуля, которое было указано ранее при " "вызове ``require('module-name')``." - msgid "Reloading a module" msgstr "Перезагрузка модуля" msgid "You can reload any Tarantool application or module with zero downtime." msgstr "" -"Любое приложение или модуль Tarantool можно перезагрузить с нулевым " -"временем простоя." +"Любое приложение или модуль Tarantool можно перезагрузить с нулевым временем" +" простоя." msgid "Reloading a module in Lua" msgstr "Перезагрузка модуля на Lua" @@ -160,10 +170,11 @@ msgstr "" "Ниже представлен пример, который иллюстрирует наиболее типичный случай -- " "\"обновление и перезагрузка\"." +#, fuzzy msgid "" "In this example, we use recommended :ref:`administration practices ` " -"based on :ref:`instance files ` and :ref:`tarantoolctl " -"` utility." +"based on :ref:`instance files ` and :ref:`tt ` " +"utility." msgstr "" "В этом примере используются рекомендованные :ref:`методики администрирования" " ` на основании :ref:`файлов экземпляров ` и " @@ -317,10 +328,12 @@ msgstr "Самое главное -- правильно разгрузить п msgid "Manually reload the application file." msgstr "Вручную перезагрузите файл приложения." -msgid "For example, using ``tarantoolctl``:" +#, fuzzy +msgid "For example, using ``tt``:" msgstr "Например, используя ``tarantoolctl``:" -msgid "$ tarantoolctl eval my_app /etc/tarantool/instances.enabled/my_app.lua" +#, fuzzy +msgid "$ tt connect my_app -f /etc/tarantool/instances.enabled/my_app.lua" msgstr "" "$ tarantoolctl eval my_app /etc/tarantool/instances.enabled/my_app.lua" @@ -337,4 +350,3 @@ msgstr "" "``*.so``), вызовите функцию :doc:`box.schema.func.reload('module-name') " "` из Lua-скрипта для " "перезагрузки модуля." - diff --git a/locale/ru/LC_MESSAGES/book/admin/os_notes.po b/locale/ru/LC_MESSAGES/book/admin/os_notes.po index c14eca8581..bfe60d6321 100644 --- a/locale/ru/LC_MESSAGES/book/admin/os_notes.po +++ b/locale/ru/LC_MESSAGES/book/admin/os_notes.po @@ -2,76 +2,15 @@ msgid "Notes for operating systems" msgstr "Замечания по поводу некоторых операционных систем" -msgid "Mac OS" +#, fuzzy +msgid "macOS" msgstr "Mac OS" msgid "" -"On Mac OS, you can administer Tarantool instances only with " -"``tarantoolctl``. No native system tools are supported." +"On macOS, no native system tools for administering Tarantool are supported. " +"The recommended way to administer Tarantool instances is using :ref:`tt CLI " +"`." msgstr "" -"Администрирование экземпляров Tarantool на Mac OS возможно только с " -"помощью ``tarantoolctl``. Встроенные системные инструменты не " -"поддерживаются." - -msgid "FreeBSD" -msgstr "FreeBSD" - -msgid "" -"To make ``tarantoolctl`` work along with ``init.d`` utilities on FreeBSD, " -"use paths other than those suggested in :ref:`Instance configuration `. Instead of ``/usr/share/tarantool/`` directory, use " -"``/usr/local/etc/tarantool/`` and create the following subdirectories:" -msgstr "" -"Чтобы ``tarantoolctl`` и утилиты ``init.d`` работали на FreeBSD, используйте" -" пути, отличные от предложенных в разделе :ref:`Настройка экземпляров " -"Tarantool’а `. Используйте " -"``/usr/local/etc/tarantool/`` вместо ``/usr/share/tarantool/`` и создайте " -"следующие поддиректории:" - -msgid "``default`` for ``tarantoolctl`` defaults (see example below)," -msgstr "" -"``default`` для хранения настроек ``tarantoolctl`` по умолчанию (см. пример " -"ниже)," - -msgid "``instances.available`` for all available instance files, and" -msgstr "" -"``instances.available`` для хранения всех доступных файлов экземпляра, и" - -msgid "" -"``instances.enabled`` for instance files to be auto-started by sysvinit." -msgstr "" -"``instances.enabled`` для хранения файлов экземпляра, которые необходимо " -"запускать автоматически с помощью sysvinit." - -msgid "Here is an example of ``tarantoolctl`` defaults on FreeBSD:" -msgstr "Так выглядят настройки ``tarantoolctl`` по умолчанию на FreeBSD:" - -msgid "" -"default_cfg = {\n" -" pid_file = \"/var/run/tarantool\", -- /var/run/tarantool/${INSTANCE}.pid\n" -" wal_dir = \"/var/db/tarantool\", -- /var/db/tarantool/${INSTANCE}/\n" -" snap_dir = \"/var/db/tarantool\", -- /var/db/tarantool/${INSTANCE}\n" -" vinyl_dir = \"/var/db/tarantool\", -- /var/db/tarantool/${INSTANCE}\n" -" logger = \"/var/log/tarantool\", -- /var/log/tarantool/${INSTANCE}.log\n" -" username = \"admin\"\n" -"}\n" -"\n" -"-- instances.available - all available instances\n" -"-- instances.enabled - instances to autostart by sysvinit\n" -"instance_dir = \"/usr/local/etc/tarantool/instances.available\"" -msgstr "" -"default_cfg = {\n" -" pid_file = \"/var/run/tarantool\", -- /var/run/tarantool/${INSTANCE}.pid\n" -" wal_dir = \"/var/db/tarantool\", -- /var/db/tarantool/${INSTANCE}/\n" -" snap_dir = \"/var/db/tarantool\", -- /var/db/tarantool/${INSTANCE}\n" -" vinyl_dir = \"/var/db/tarantool\", -- /var/db/tarantool/${INSTANCE}\n" -" logger = \"/var/log/tarantool\", -- /var/log/tarantool/${INSTANCE}.log\n" -" username = \"admin\"\n" -"}\n" -"\n" -"-- instances.available - все доступные экземпляры\n" -"-- instances.enabled - экземпляры для автоматического запуска через sysvinit\n" -"instance_dir = \"/usr/local/etc/tarantool/instances.available\"" msgid "Gentoo Linux" msgstr "Gentoo Linux" @@ -117,3 +56,75 @@ msgid "" msgstr "" "$ /etc/init.d/your_service_name start\n" "$ tail -f -n 100 /var/log/tarantool/your_service_name.log" + +msgid "FreeBSD" +msgstr "FreeBSD" + +msgid "" +"To learn about specifics of using the deprecated ``tarantoolctl`` utility on" +" FreeBSD, check its :ref:`documentation `." +msgstr "" + +#~ msgid "" +#~ "On Mac OS, you can administer Tarantool instances only with " +#~ "``tarantoolctl``. No native system tools are supported." +#~ msgstr "" +#~ "Администрирование экземпляров Tarantool на Mac OS возможно только с помощью " +#~ "``tarantoolctl``. Встроенные системные инструменты не поддерживаются." + +#~ msgid "" +#~ "To make ``tarantoolctl`` work along with ``init.d`` utilities on FreeBSD, " +#~ "use paths other than those suggested in :ref:`Instance configuration `. Instead of ``/usr/share/tarantool/`` directory, use " +#~ "``/usr/local/etc/tarantool/`` and create the following subdirectories:" +#~ msgstr "" +#~ "Чтобы ``tarantoolctl`` и утилиты ``init.d`` работали на FreeBSD, используйте" +#~ " пути, отличные от предложенных в разделе :ref:`Настройка экземпляров " +#~ "Tarantool’а `. Используйте " +#~ "``/usr/local/etc/tarantool/`` вместо ``/usr/share/tarantool/`` и создайте " +#~ "следующие поддиректории:" + +#~ msgid "``default`` for ``tarantoolctl`` defaults (see example below)," +#~ msgstr "" +#~ "``default`` для хранения настроек ``tarantoolctl`` по умолчанию (см. пример " +#~ "ниже)," + +#~ msgid "``instances.available`` for all available instance files, and" +#~ msgstr "" +#~ "``instances.available`` для хранения всех доступных файлов экземпляра, и" + +#~ msgid "" +#~ "``instances.enabled`` for instance files to be auto-started by sysvinit." +#~ msgstr "" +#~ "``instances.enabled`` для хранения файлов экземпляра, которые необходимо " +#~ "запускать автоматически с помощью sysvinit." + +#~ msgid "Here is an example of ``tarantoolctl`` defaults on FreeBSD:" +#~ msgstr "Так выглядят настройки ``tarantoolctl`` по умолчанию на FreeBSD:" + +#~ msgid "" +#~ "default_cfg = {\n" +#~ " pid_file = \"/var/run/tarantool\", -- /var/run/tarantool/${INSTANCE}.pid\n" +#~ " wal_dir = \"/var/db/tarantool\", -- /var/db/tarantool/${INSTANCE}/\n" +#~ " snap_dir = \"/var/db/tarantool\", -- /var/db/tarantool/${INSTANCE}\n" +#~ " vinyl_dir = \"/var/db/tarantool\", -- /var/db/tarantool/${INSTANCE}\n" +#~ " logger = \"/var/log/tarantool\", -- /var/log/tarantool/${INSTANCE}.log\n" +#~ " username = \"admin\"\n" +#~ "}\n" +#~ "\n" +#~ "-- instances.available - all available instances\n" +#~ "-- instances.enabled - instances to autostart by sysvinit\n" +#~ "instance_dir = \"/usr/local/etc/tarantool/instances.available\"" +#~ msgstr "" +#~ "default_cfg = {\n" +#~ " pid_file = \"/var/run/tarantool\", -- /var/run/tarantool/${INSTANCE}.pid\n" +#~ " wal_dir = \"/var/db/tarantool\", -- /var/db/tarantool/${INSTANCE}/\n" +#~ " snap_dir = \"/var/db/tarantool\", -- /var/db/tarantool/${INSTANCE}\n" +#~ " vinyl_dir = \"/var/db/tarantool\", -- /var/db/tarantool/${INSTANCE}\n" +#~ " logger = \"/var/log/tarantool\", -- /var/log/tarantool/${INSTANCE}.log\n" +#~ " username = \"admin\"\n" +#~ "}\n" +#~ "\n" +#~ "-- instances.available - все доступные экземпляры\n" +#~ "-- instances.enabled - экземпляры для автоматического запуска через sysvinit\n" +#~ "instance_dir = \"/usr/local/etc/tarantool/instances.available\"" diff --git a/locale/ru/LC_MESSAGES/book/admin/replication/index.po b/locale/ru/LC_MESSAGES/book/admin/replication/index.po new file mode 100644 index 0000000000..f96d14fc3e --- /dev/null +++ b/locale/ru/LC_MESSAGES/book/admin/replication/index.po @@ -0,0 +1,3 @@ + +msgid "Replication administration" +msgstr "" diff --git a/locale/ru/LC_MESSAGES/book/admin/replication/repl_monitoring.po b/locale/ru/LC_MESSAGES/book/admin/replication/repl_monitoring.po index 2c53adabe8..56121d232c 100644 --- a/locale/ru/LC_MESSAGES/book/admin/replication/repl_monitoring.po +++ b/locale/ru/LC_MESSAGES/book/admin/replication/repl_monitoring.po @@ -2,9 +2,10 @@ msgid "Monitoring a replica set" msgstr "Мониторинг набора реплик" +#, fuzzy msgid "" -"To learn what instances belong in the replica set, and obtain statistics for" -" all these instances, issue a " +"To learn what instances belong to the replica set and obtain statistics for " +"all these instances, issue a " ":doc:`/reference/reference_lua/box_info/replication` request:" msgstr "" "Чтобы узнать, какие экземпляры входят в набор реплик и получить статистику " @@ -92,8 +93,9 @@ msgstr "" msgid "The primary indicators of replication health are:" msgstr "Основные индикаторы работоспособности репликации:" +#, fuzzy msgid "" -":ref:`idle `, the time (in seconds) " +":ref:`idle `: the time (in seconds) " "since the instance received the last event from a master." msgstr "" ":ref:`бездействие `, время (в секундах) " @@ -124,8 +126,9 @@ msgstr "" "репликация сильно отстает, поскольку мастер опережает реплику, либо " "отсутствует сетевое подключение между экземплярами." +#, fuzzy msgid "" -":ref:`lag `, the time difference between " +":ref:`lag `: the time difference between " "the local time at the instance, recorded when the event was received, and " "the local time at another master recorded when the event was written to the " ":ref:`write ahead log ` on that master." @@ -148,3 +151,9 @@ msgstr "" msgid "For multi-master configurations, ``lag`` is the maximal lag." msgstr "Для многомастерной конфигурации это максимально возможное отставание." + +msgid "" +"For better understanding, see the following diagram illustrating the " +"``upstream`` and ``downstream`` connections within the replica set of three " +"instances:" +msgstr "" diff --git a/locale/ru/LC_MESSAGES/book/admin/replication/repl_recover.po b/locale/ru/LC_MESSAGES/book/admin/replication/repl_recover.po index 6ba3cc6e9a..f814233ca4 100644 --- a/locale/ru/LC_MESSAGES/book/admin/replication/repl_recover.po +++ b/locale/ru/LC_MESSAGES/book/admin/replication/repl_recover.po @@ -173,11 +173,12 @@ msgstr "" "Выполните ``box.cfg{read_only=false, listen=URI}`` на реплике и " "``box.cfg{replication=URI}`` на других репликах в наборе." +#, fuzzy msgid "" "If there are updates on the old master that were not propagated before the " "old master went down, :ref:`re-apply them manually ` to the new master using ``tarantoolctl cat`` and " -"``tarantoolctl play`` commands." +"master_replica>` to the new master using ``tt cat`` and ``tt play`` " +"commands." msgstr "" "Если на старом мастере есть обновления, не переданные до выхода старого " "мастера из строя, :ref:`примените их вручную ` function from ``console`` " "module, you can set up a port which can be used to open an administrative " "console to the server. This is for administrators to connect to a running " -"instance and make requests. ``tarantoolctl`` invokes ``console.listen()`` to" -" create a control socket for each started instance." +"instance and make requests. ``tt`` invokes ``console.listen()`` to create a " +"control socket for each started instance." msgstr "" "Используя функцию :ref:`console.listen() ` из модуля " "``console``, можно настроить порт для подключения к серверной " @@ -67,12 +68,12 @@ msgstr "а типичный :ref:`URI ` для соединения msgid "/var/lib/tarantool/socket_name.sock" msgstr "/var/lib/tarantool/socket_name.sock" +#, fuzzy msgid "" "if the listener has the privilege to write on ``/var/lib/tarantool`` and the" " connector has the privilege to read on ``/var/lib/tarantool``. " "Alternatively, to connect to an admin console of an instance started with " -"``tarantoolctl``, use :ref:`tarantoolctl enter `." +"``tt``, use :ref:`tt connect `." msgstr "" "если у приемника событий есть права на запись в ``/var/lib/tarantool`` и у " "коннектора есть права на чтение из ``/var/lib/tarantool``. Еще один способ " @@ -128,13 +129,13 @@ msgstr "" msgid "To change the user, it’s necessary to authenticate." msgstr "Для смены пользователя необходимо пройти аутентификацию." +#, fuzzy msgid "" -"For ease of use, ``tarantoolctl connect`` command automatically detects the " -"type of connection during handshake and uses :ref:`EVAL `" -" binary protocol command when it’s necessary to execute Lua commands over a " -"binary connection. To execute EVAL, the authenticated user must have global " -"\"EXECUTE\" privilege. The ``tarantoolctl connect`` command is for " -"administrators." +"For ease of use, ``tt connect`` command automatically detects the type of " +"connection during handshake and uses :ref:`EVAL ` binary " +"protocol command when it’s necessary to execute Lua commands over a binary " +"connection. To execute EVAL, the authenticated user must have global " +"\"EXECUTE\" privilege." msgstr "" "Для удобства использования команда ``tarantoolctl connect`` автоматически " "определяет тип подключения при установке соединения и использует команду " diff --git a/locale/ru/LC_MESSAGES/book/admin/server_introspection.po b/locale/ru/LC_MESSAGES/book/admin/server_introspection.po index 33d8e62b57..789d4609e1 100644 --- a/locale/ru/LC_MESSAGES/book/admin/server_introspection.po +++ b/locale/ru/LC_MESSAGES/book/admin/server_introspection.po @@ -29,9 +29,10 @@ msgstr "" " может выступать клиентом для удаленного сервера, см. простые примеры в " ":ref:`Руководстве для начинающих `." +#, fuzzy msgid "" -"The interactive mode is used by ``tarantoolctl`` to implement \"enter\" and " -"\"connect\" commands." +"The interactive mode is used in the ``tt`` utility's :ref:`connect ` command." msgstr "" "Скрипт ``tarantoolctl`` использует интерактивный режим для реализации команд" " \"enter\" и \"connect\"." @@ -39,27 +40,29 @@ msgstr "" msgid "Executing code on an instance" msgstr "Выполнение кода на экземпляре Tarantool" +#, fuzzy msgid "" "You can attach to an instance's :ref:`admin console ` and " -"execute some Lua code using ``tarantoolctl``:" +"execute some Lua code using ``tt``:" msgstr "" "Можно подключиться к :ref:`административной консоли ` " "экземпляра и выполнить некий Lua-код с помощью утилиты ``tarantoolctl``:" +#, fuzzy msgid "" "$ # for local instances:\n" -"$ tarantoolctl enter my_app\n" -"/bin/tarantoolctl: Found my_app.lua in /etc/tarantool/instances.available\n" -"/bin/tarantoolctl: Connecting to /var/run/tarantool/my_app.control\n" -"/bin/tarantoolctl: connected to unix/:/var/run/tarantool/my_app.control\n" -"unix/:/var/run/tarantool/my_app.control> 1 + 1\n" +"$ tt connect my_app\n" +" • Connecting to the instance...\n" +" • Connected to /var/run/tarantool/example.control\n" +"\n" +"/var/run/tarantool/my_app.control> 1 + 1\n" "---\n" "- 2\n" "...\n" -"unix/:/var/run/tarantool/my_app.control>\n" +"/var/run/tarantool/my_app.control>\n" "\n" "$ # for local and remote instances:\n" -"$ tarantoolctl connect username:password@127.0.0.1:3306" +"$ tt connect username:password@127.0.0.1:3306" msgstr "" "$ # для локальных экземпляров:\n" "$ tarantoolctl enter my_app\n" @@ -75,23 +78,25 @@ msgstr "" "$ # для локальных и удаленных экземпляров:\n" "$ tarantoolctl connect username:password@127.0.0.1:3306" +#, fuzzy msgid "" -"You can also use ``tarantoolctl`` to execute Lua code on an instance without" -" attaching to its admin console. For example:" +"You can also use ``tt`` to execute Lua code on an instance without attaching" +" to its admin console. For example:" msgstr "" "Можно также использовать ``tarantoolctl`` для выполнения Lua-кода на " "запущенном экземпляре Tarantool-сервера, не подключаясь к его " "административной консоли. Например:" +#, fuzzy msgid "" "$ # executing commands directly from the command line\n" -"$ | tarantoolctl eval my_app\n" +"$ | tt connect my_app -f -\n" "<...>\n" "\n" "$ # - OR -\n" "\n" "$ # executing commands from a script file\n" -"$ tarantoolctl eval my_app script.lua\n" +"$ tt connect my_app -f script.lua\n" "<...>" msgstr "" "$ # выполнение команд напрямую из командной строки\n" @@ -104,14 +109,14 @@ msgstr "" "$ tarantoolctl eval my_app script.lua\n" "<...>" +#, fuzzy msgid "" "Alternatively, you can use the :ref:`console ` module or the" " :ref:`net.box ` module from a Tarantool server. Also, you " "can write your client programs with any of the :ref:`connectors `. However, most of the examples in this manual illustrate " -"usage with either ``tarantoolctl connect`` (for administrative purposes) or " -":ref:`using the Tarantool server as a client `." +"usage with either ``tt connect`` or :ref:`using the Tarantool server as a " +"client `." msgstr "" "Еще можно использовать модули :ref:`console ` и " ":ref:`net.box ` из Tarantool-сервера. Также вы можете писать" @@ -124,68 +129,34 @@ msgstr "" msgid "Health checks" msgstr "Проверка состояния экземпляра" -msgid "To check the instance status, say:" +#, fuzzy +msgid "To check the instance status, run:" msgstr "" "Чтобы проверить статус экземпляра Tarantool-сервера, выполните команду:" msgid "" -"$ tarantoolctl status my_app\n" -"my_app is running (pid: /var/run/tarantool/my_app.pid)\n" +"$ tt status my_app\n" +"INSTANCE STATUS PID\n" +"my_app RUNNING 67172\n" "\n" "$ # - OR -\n" "\n" -"$ systemctl status tarantool@my_app\n" -"tarantool@my_app.service - Tarantool Database Server\n" -"Loaded: loaded (/etc/systemd/system/tarantool@.service; disabled; vendor preset: disabled)\n" -"Active: active (running)\n" -"Docs: man:tarantool(1)\n" -"Process: 5346 ExecStart=/usr/bin/tarantoolctl start %I (code=exited, status=0/SUCCESS)\n" -"Main PID: 5350 (tarantool)\n" -"Tasks: 11 (limit: 512)\n" -"CGroup: /system.slice/system-tarantool.slice/tarantool@my_app.service\n" -"+ 5350 tarantool my_app.lua " -msgstr "" -"$ tarantoolctl status my_app\n" -"my_app is running (pid: /var/run/tarantool/my_app.pid)\n" -"\n" -"$ # - ИЛИ -\n" -"\n" -"$ systemctl status tarantool@my_app\n" -"tarantool@my_app.service - Tarantool Database Server\n" -"Loaded: loaded (/etc/systemd/system/tarantool@.service; disabled; vendor preset: disabled)\n" -"Active: active (running)\n" -"Docs: man:tarantool(1)\n" -"Process: 5346 ExecStart=/usr/bin/tarantoolctl start %I (code=exited, status=0/SUCCESS)\n" -"Main PID: 5350 (tarantool)\n" -"Tasks: 11 (limit: 512)\n" -"CGroup: /system.slice/system-tarantool.slice/tarantool@my_app.service\n" -"+ 5350 tarantool my_app.lua " - -msgid "To check the boot log, on systems with ``systemd``, say:" +"$ systemctl status tarantool@my_app" +msgstr "" + +#, fuzzy +msgid "To check the boot log, on systems with ``systemd``, run:" msgstr "" "Если вы используете систему, на которой доступна утилита ``systemd``, " "выполните следующую команду для проверки содержимого журнала загрузки:" -msgid "" -"$ journalctl -u tarantool@my_app -n 5\n" -"-- Logs begin at Fri 2016-01-08 12:21:53 MSK, end at Thu 2016-01-21 21:17:47 MSK. --\n" -"Jan 21 21:17:47 localhost.localdomain systemd[1]: Stopped Tarantool Database Server.\n" -"Jan 21 21:17:47 localhost.localdomain systemd[1]: Starting Tarantool Database Server...\n" -"Jan 21 21:17:47 localhost.localdomain tarantoolctl[5969]: /usr/bin/tarantoolctl: Found my_app.lua in /etc/tarantool/instances.available\n" -"Jan 21 21:17:47 localhost.localdomain tarantoolctl[5969]: /usr/bin/tarantoolctl: Starting instance...\n" -"Jan 21 21:17:47 localhost.localdomain systemd[1]: Started Tarantool Database Server" +msgid "$ journalctl -u tarantool@my_app -n 5" msgstr "" -"$ journalctl -u tarantool@my_app -n 5\n" -"-- Logs begin at Fri 2016-01-08 12:21:53 MSK, end at Thu 2016-01-21 21:17:47 MSK. --\n" -"Jan 21 21:17:47 localhost.localdomain systemd[1]: Stopped Tarantool Database Server.\n" -"Jan 21 21:17:47 localhost.localdomain systemd[1]: Starting Tarantool Database Server...\n" -"Jan 21 21:17:47 localhost.localdomain tarantoolctl[5969]: /usr/bin/tarantoolctl: Found my_app.lua in /etc/tarantool/instances.available\n" -"Jan 21 21:17:47 localhost.localdomain tarantoolctl[5969]: /usr/bin/tarantoolctl: Starting instance...\n" -"Jan 21 21:17:47 localhost.localdomain systemd[1]: Started Tarantool Database Server" +#, fuzzy msgid "" -"For more details, use the reports provided by functions in the following " -"submodules:" +"For more specific checks, use the reports provided by functions in the " +"following submodules:" msgstr "" "Более подробная информация содержится в отчетах, которые можно получить с " "помощью функций из следующих подмодулей:" @@ -215,15 +186,16 @@ msgid "" ":doc:`/reference/reference_lua/box_stat` (introspect Tarantool request and " "network statistics)" msgstr "" -":doc:`/reference/reference_lua/box_stat` -- просмотр статистики Tarantool " -"по запросам и использованию сети," +":doc:`/reference/reference_lua/box_stat` -- просмотр статистики Tarantool по" +" запросам и использованию сети," +#, fuzzy msgid "" -"You can also try `prometheus " -"`_," -" a plugin that makes it easy to collect metrics (e.g. memory usage or number" -" of requests) from Tarantool applications and databases and expose them via " -"the Prometheus protocol." +"Finally, there is the `metrics `_ " +"library, which enables collecting metrics (such as memory usage or number of" +" requests) from Tarantool applications and expose them via various " +"protocols, including Prometheus. Check :ref:`Monitoring ` for " +"more details." msgstr "" "Можно также воспользоваться плагином `prometheus " "`_," @@ -305,6 +277,61 @@ msgstr "" "`, остановить экземпляр и " "перезапустить его." +msgid "Inspect traffic" +msgstr "" + +msgid "" +"Inspecting binary traffic is a boring task. We offer a `Wireshark plugin " +"`_ to simplify the " +"analysis of Tarantool's traffic." +msgstr "" + +msgid "To enable the plugin, follow the steps below." +msgstr "" + +msgid "Clone the tarantool-dissector repository:" +msgstr "" + +msgid "git clone https://github.com/tarantool/tarantool-dissector.git" +msgstr "" + +msgid "Copy or symlink the plugin files into the Wireshark plugin directory:" +msgstr "" + +msgid "" +"mkdir -p ~/.local/lib/wireshark/plugins\n" +"cd ~/.local/lib/wireshark/plugins\n" +"ln -s /path/to/tarantool-dissector/MessagePack.lua ./\n" +"ln -s /path/to/tarantool-dissector/tarantool.dissector.lua ./" +msgstr "" + +msgid "" +"(For the location of the plugin directory on macOS and Windows, please refer" +" to the `Plugin folders " +"`_ " +"chapter in the Wireshark documentation.)" +msgstr "" + +msgid "Run the Wireshark GUI and ensure that the plugins are loaded:" +msgstr "" + +msgid "" +"Open :guilabel:`Help` > :guilabel:`About Wireshark` > :guilabel:`Plugins`." +msgstr "" + +msgid "Find ``MessagePack.lua`` and ``tarantool.dissector.lua`` in the list." +msgstr "" + +msgid "" +"Now you can inspect incoming and outgoing Tarantool packets with user-" +"friendly annotations." +msgstr "" + +msgid "" +"Visit the project page for details: `https://github.com/tarantool/tarantool-" +"dissector `_." +msgstr "" + msgid "Profiling performance issues" msgstr "Профилирование производительности" @@ -354,8 +381,8 @@ msgstr "" "Сначала войдите в интерактивную административную консоль вашего экземпляра " "Tarantool’а:" -msgid "$ tarantoolctl enter NAME" -msgstr "$ tarantoolctl enter NAME" +msgid "$ tt connect NAME|URI" +msgstr "" msgid "Once there, load the ``fiber`` module:" msgstr "После этого загрузите модуль ``fiber``:" @@ -558,9 +585,10 @@ msgstr "" "``NAME``, выполняет команду ``fiber.info()`` и записывает ее выход в файл " "``fiber-info.txt``:" +#, fuzzy msgid "" "$ rm -f fiber.info.txt\n" -"$ watch -n 0.5 \"echo 'require(\\\"fiber\\\").info()' | tarantoolctl enter NAME | tee -a fiber-info.txt\"" +"$ watch -n 0.5 \"echo 'require(\\\"fiber\\\").info()' | tt connect NAME -f - | tee -a fiber-info.txt\"" msgstr "" "$ rm -f fiber.info.txt\n" "$ watch -n 0.5 \"echo 'require(\\\"fiber\\\").info()' | tarantoolctl enter NAME | tee -a fiber-info.txt\"" @@ -833,7 +861,8 @@ msgstr "$ yum install gperftools-libs" msgid "Once you do this, install Lua bindings:" msgstr "После этого установите привязки для Lua:" -msgid "$ tarantoolctl rocks install gperftools" +#, fuzzy +msgid "$ tt rocks install gperftools" msgstr "$ tarantoolctl rocks install gperftools" msgid "" @@ -892,6 +921,7 @@ msgstr "" msgid "Your output should look similar to this:" msgstr "В консоль должно выводиться приблизительно следующее:" +#, python-format msgid "" "Total: 598 samples\n" " 83 13.9% 13.9% 83 13.9% epoll_wait\n" @@ -998,6 +1028,7 @@ msgstr "" msgid "The resulting output should look similar to this:" msgstr "Получившийся отчет выглядит следующим образом:" +#, python-format msgid "" "# Samples: 14K of event 'cycles'\n" "# Event count (approx.): 9927346847\n" @@ -1174,3 +1205,56 @@ msgstr "" "Как правило, результат покажет, что выборка многократно осуществлялась в " "рамках f1(), а также в рамках внутренних функций Tarantool, имена которых " "могут изменяться с каждой новой версией." + +#~ msgid "" +#~ "$ tarantoolctl status my_app\n" +#~ "my_app is running (pid: /var/run/tarantool/my_app.pid)\n" +#~ "\n" +#~ "$ # - OR -\n" +#~ "\n" +#~ "$ systemctl status tarantool@my_app\n" +#~ "tarantool@my_app.service - Tarantool Database Server\n" +#~ "Loaded: loaded (/etc/systemd/system/tarantool@.service; disabled; vendor preset: disabled)\n" +#~ "Active: active (running)\n" +#~ "Docs: man:tarantool(1)\n" +#~ "Process: 5346 ExecStart=/usr/bin/tarantoolctl start %I (code=exited, status=0/SUCCESS)\n" +#~ "Main PID: 5350 (tarantool)\n" +#~ "Tasks: 11 (limit: 512)\n" +#~ "CGroup: /system.slice/system-tarantool.slice/tarantool@my_app.service\n" +#~ "+ 5350 tarantool my_app.lua " +#~ msgstr "" +#~ "$ tarantoolctl status my_app\n" +#~ "my_app is running (pid: /var/run/tarantool/my_app.pid)\n" +#~ "\n" +#~ "$ # - ИЛИ -\n" +#~ "\n" +#~ "$ systemctl status tarantool@my_app\n" +#~ "tarantool@my_app.service - Tarantool Database Server\n" +#~ "Loaded: loaded (/etc/systemd/system/tarantool@.service; disabled; vendor preset: disabled)\n" +#~ "Active: active (running)\n" +#~ "Docs: man:tarantool(1)\n" +#~ "Process: 5346 ExecStart=/usr/bin/tarantoolctl start %I (code=exited, status=0/SUCCESS)\n" +#~ "Main PID: 5350 (tarantool)\n" +#~ "Tasks: 11 (limit: 512)\n" +#~ "CGroup: /system.slice/system-tarantool.slice/tarantool@my_app.service\n" +#~ "+ 5350 tarantool my_app.lua " + +#~ msgid "" +#~ "$ journalctl -u tarantool@my_app -n 5\n" +#~ "-- Logs begin at Fri 2016-01-08 12:21:53 MSK, end at Thu 2016-01-21 21:17:47 MSK. --\n" +#~ "Jan 21 21:17:47 localhost.localdomain systemd[1]: Stopped Tarantool Database Server.\n" +#~ "Jan 21 21:17:47 localhost.localdomain systemd[1]: Starting Tarantool Database Server...\n" +#~ "Jan 21 21:17:47 localhost.localdomain tarantoolctl[5969]: /usr/bin/tarantoolctl: Found my_app.lua in /etc/tarantool/instances.available\n" +#~ "Jan 21 21:17:47 localhost.localdomain tarantoolctl[5969]: /usr/bin/tarantoolctl: Starting instance...\n" +#~ "Jan 21 21:17:47 localhost.localdomain systemd[1]: Started Tarantool Database Server" +#~ msgstr "" +#~ "$ journalctl -u tarantool@my_app -n 5\n" +#~ "-- Logs begin at Fri 2016-01-08 12:21:53 MSK, end at Thu 2016-01-21 21:17:47 MSK. --\n" +#~ "Jan 21 21:17:47 localhost.localdomain systemd[1]: Stopped Tarantool Database Server.\n" +#~ "Jan 21 21:17:47 localhost.localdomain systemd[1]: Starting Tarantool Database Server...\n" +#~ "Jan 21 21:17:47 localhost.localdomain tarantoolctl[5969]: /usr/bin/tarantoolctl: Found my_app.lua in /etc/tarantool/instances.available\n" +#~ "Jan 21 21:17:47 localhost.localdomain tarantoolctl[5969]: /usr/bin/tarantoolctl: Starting instance...\n" +#~ "Jan 21 21:17:47 localhost.localdomain systemd[1]: Started Tarantool Database Server" + +#~ msgid "$ tarantoolctl enter NAME" +#~ msgstr "$ tarantoolctl enter NAME" diff --git a/locale/ru/LC_MESSAGES/book/admin/start_stop_instance.po b/locale/ru/LC_MESSAGES/book/admin/start_stop_instance.po index 8f5610852a..37541f175e 100644 --- a/locale/ru/LC_MESSAGES/book/admin/start_stop_instance.po +++ b/locale/ru/LC_MESSAGES/book/admin/start_stop_instance.po @@ -1,364 +1,783 @@ -msgid "Starting/stopping an instance" +#, fuzzy +msgid "Starting and stopping instances" msgstr "Запуск/остановка экземпляра" msgid "" -"While a Lua application is executed by Tarantool, an instance file is " -"executed by ``tarantoolctl`` which is a Tarantool script." +"This section describes how to manage instances in a Tarantool cluster using " +"the :ref:`tt ` utility. A cluster can include multiple instances " +"that run different code. A typical example is a cluster application that " +"includes router and storage instances. Particularly, you can perform the " +"following actions:" msgstr "" -"Lua-приложение выполняется Tarantool, тогда как файл экземпляра " -"выполняется Tarantool-скриптом ``tarantoolctl``." -msgid "Here is what ``tarantoolctl`` does when you issue the command:" -msgstr "Вот что делает ``tarantoolctl`` при вводе следующей команды:" +msgid "start all instances in a cluster or only specific ones" +msgstr "" + +msgid "check the status of instances" +msgstr "" + +msgid "connect to a specific instance" +msgstr "" + +msgid "stop all instances or only specific ones" +msgstr "" + +msgid "" +"To get more context on how the application's environment might look, refer " +"to :ref:`Application environment `." +msgstr "" + +msgid "" +"In this section, a `sharded_cluster " +"`_" +" application is used to demonstrate how to start, stop, and manage instances" +" in a cluster." +msgstr "" + +#, fuzzy +msgid "Starting Tarantool instances" +msgstr "Запуск/остановка экземпляра" + +msgid "Starting instances using the tt utility" +msgstr "" + +msgid "" +"The :ref:`tt ` utility is the recommended way to start Tarantool " +"instances." +msgstr "" + +msgid "" +"$ tt start sharded_cluster\n" +" • Starting an instance [sharded_cluster:storage-a-001]...\n" +" • Starting an instance [sharded_cluster:storage-a-002]...\n" +" • Starting an instance [sharded_cluster:storage-b-001]...\n" +" • Starting an instance [sharded_cluster:storage-b-002]...\n" +" • Starting an instance [sharded_cluster:router-a-001]..." +msgstr "" + +msgid "" +"After the cluster has started and worked for some time, you can find its " +"artifacts in the directories specified in the ``tt`` configuration. These " +"are the default locations in the local :ref:`launch mode `:" +msgstr "" + +msgid "" +"``sharded_cluster/var/log//`` -- instance :ref:`logs `." +msgstr "" + +msgid "" +"``sharded_cluster/var/lib//`` -- :ref:`snapshots and write-" +"ahead logs `." +msgstr "" + +msgid "" +"``sharded_cluster/var/run//`` -- control sockets and PID " +"files." +msgstr "" + +msgid "In the system launch mode, artifacts are created in these locations:" +msgstr "" -msgid "$ tarantoolctl start " +#, fuzzy +msgid "``/var/log/tarantool//``" msgstr "$ tarantoolctl start <имя_экземпляра>" +#, fuzzy +msgid "``/var/lib/tarantool//``" +msgstr "$ tarantoolctl start <имя_экземпляра>" + +#, fuzzy +msgid "``/var/run/tarantool//``" +msgstr "$ tarantoolctl start <имя_экземпляра>" + +msgid "Starting an instance using the tarantool command" +msgstr "" + msgid "" -"Read and parse the command line arguments. The last argument, in our case, " -"contains an instance name." +"The ``tarantool`` command provides additional :ref:`options " +"` that might be helpful for development " +"purposes. Below is the syntax for starting a Tarantool instance configured " +"in a file:" msgstr "" -"Считывает и разбирает аргументы командной строки. В нашем случае последний " -"аргумент содержит имя экземпляра." msgid "" -"Read and parse its own configuration file. This file contains " -"``tarantoolctl`` defaults, like the path to the directory where instances " -"should be searched for." +"$ tarantool [OPTION ...] --name INSTANCE_NAME --config CONFIG_FILE_PATH" msgstr "" -"Считывает и разбирает собственный конфигурационный файл. Этот файл содержит " -"параметры ``tarantoolctl`` по умолчанию -- такие как путь до директории, в " -"которой располагаются экземпляры." msgid "" -"When ``tarantool`` is invoked by root, it looks for a configuration file in " -"``/etc/default/tarantool``. When ``tarantool`` is invoked by a local (non-" -"root) user, it looks for a configuration file first in the current directory" -" (``$PWD/.tarantoolctl``), and then in the current user's home directory " -"(``$HOME/.config/tarantool/tarantool``). If no configuration file is found " -"there, or in the ``/usr/local/etc/default/tarantool`` file, then " -"``tarantoolctl`` falls back to :ref:`built-in defaults `." +"The command below starts ``router-a-001`` configured in the ``config.yaml`` " +"file:" +msgstr "" + +msgid "$ tarantool --name router-a-001 --config config.yaml" +msgstr "" + +msgid "Basic instance management" msgstr "" -"Когда ``tarantoolctl`` вызывается с root-правами, он ищет конфигурационный " -"файл в ``/etc/default/tarantool``. Если вызов ``tarantool`` производит " -"локальный пользователь, сначала он ищет конфигурационный файл в текущей " -"директории (``$PWD/.tarantoolctl``), а затем в домашней директории текущего " -"пользователя (``$HOME/.config/tarantool/tarantool``). Если конфигурационный " -"файл не найден, ``tarantoolctl`` принимает :ref:`встроенные параметры по " -"умолчанию `." msgid "" -"Look up the instance file in the instance directory, for example " -"``/etc/tarantool/instances.enabled``. To build the instance file path, " -"``tarantoolctl`` takes the instance name, prepends the instance directory " -"and appends \".lua\" extension to the instance file." +"Most of the commands described in this section can be called with or without" +" an instance name. Without the instance name, they are executed for all " +"instances defined in ``instances.yaml``." +msgstr "" + +msgid "Checking an instance's status" msgstr "" -"Ищет файл экземпляра в директории, где располагаются экземпляры, например, в" -" ``/etc/tarantool/instances.enabled``. ``tarantoolctl`` строит путь до файла" -" экземпляра следующим образом: \"путь до директории с экземплярами\" + \"имя" -" экземпляра\" + \".lua\"." msgid "" -"Override :doc:`box.cfg{} ` function to " -"pre-process its parameters and ensure that instance paths are pointing to " -"the paths defined in the ``tarantoolctl`` configuration file. For example, " -"if the configuration file specifies that instance work directory must be in " -"``/var/tarantool``, then the new implementation of ``box.cfg{}`` ensures " -"that :ref:`work_dir ` parameter in ``box.cfg{}`` is set " -"to ``/var/tarantool/``, regardless of what the path is set to" -" in the instance file itself." +"To check the status of instances, execute :ref:`tt status `:" msgstr "" -"Переопределяет функцию :doc:`box.cfg{} `, " -"чтобы предобработать ее параметры и сделать так, чтобы пути к экземплярам " -"указывали на пути, прописанные в конфигурационном файле ``tarantoolctl``. " -"Например, если в конфигурационном файле указано, что рабочей директорией " -"экземпляра является ``/var/tarantool``, то новая реализация ``box.cfg{}`` " -"сделает так, чтобы параметр :ref:`work_dir ` в " -"``box.cfg{}`` имел значение ``/var/tarantool/<имя_экземпляра>``, независимо " -"от того, какой путь указан в самом файле экземпляра." msgid "" -"Create a so-called \"instance control file\". This is a Unix socket with Lua" -" console attached to it. This file is used later by ``tarantoolctl`` to " -"query the instance state, send commands to the instance and so on." +"$ tt status sharded_cluster\n" +"INSTANCE STATUS PID\n" +"sharded_cluster:storage-a-001 RUNNING 2023\n" +"sharded_cluster:storage-a-002 RUNNING 2026\n" +"sharded_cluster:storage-b-001 RUNNING 2020\n" +"sharded_cluster:storage-b-002 RUNNING 2021\n" +"sharded_cluster:router-a-001 RUNNING 2022" msgstr "" -"Создает так называемый \"файл для управления экземпляром\". Это Unix-сокет с" -" прикрепленной к нему Lua-консолью. В дальнейшем ``tarantoolctl`` использует" -" этот файл для получения состояния экземпляра, отправки команд и т.д." msgid "" -"Set the TARANTOOLCTL environment variable to 'true'. This allows the user to" -" know that the instance was started by ``tarantoolctl``." +"To check the status of a specific instance, you need to specify its name:" msgstr "" -"Задает значение переменной окружения TARANTOOLCTL = 'true'. Это позволит " -"пользователю понять, что экземпляр был запущен ``tarantoolctl``." -msgid "Finally, use Lua ``dofile`` command to execute the instance file." +msgid "" +"$ tt status sharded_cluster:storage-a-001\n" +"INSTANCE STATUS PID\n" +"sharded_cluster:storage-a-001 RUNNING 2023" msgstr "" -"Наконец, использует Lua-команду ``dofile`` для выполнения файла экземпляра." + +#, fuzzy +msgid "Connecting to an instance" +msgstr "Запуск/остановка экземпляра" msgid "" -"If you start an instance using ``systemd`` tools, like this (the instance " -"name is ``my_app``):" +"To connect to the instance, use the :ref:`tt connect ` command:" msgstr "" -"При запуске экземпляра с помощью инструментария ``systemd`` указанным ниже " -"способом (имя экземпляра -- ``my_app``):" msgid "" -"$ systemctl start tarantool@my_app\n" -"$ ps axuf|grep my_app\n" -"taranto+ 5350 1.3 0.3 1448872 7736 ? Ssl 20:05 0:28 tarantool my_app.lua " +"$ tt connect sharded_cluster:storage-a-001\n" +" • Connecting to the instance...\n" +" • Connected to sharded_cluster:storage-a-001\n" +"\n" +"sharded_cluster:storage-a-001>" msgstr "" -"$ systemctl start tarantool@my_app\n" -"$ ps axuf|grep my_app\n" -"taranto+ 5350 1.3 0.3 1448872 7736 ? Ssl 20:05 0:28 tarantool my_app.lua " msgid "" -"... this actually calls ``tarantoolctl`` like in case of ``tarantoolctl " -"start my_app``." +"In the instance's console, you can execute commands provided by the " +":ref:`box ` module. For example, :ref:`box.info " +"` can be used to get various information about a" +" running instance:" msgstr "" -"...на самом деле вызывается ``tarantoolctl`` -- так же, как и в случае " -"``tarantoolctl start my_app``." msgid "" -"To check the instance file for syntax errors prior to starting ``my_app`` " -"instance, say:" +"sharded_cluster:storage-a-001> box.info.ro\n" +"---\n" +"- false\n" +"..." msgstr "" -"Для проверки файла экземпляра на наличие синтаксических ошибок перед " -"запуском экземпляра ``my_app`` используйте команду:" -msgid "$ tarantoolctl check my_app" -msgstr "$ tarantoolctl check my_app" +#, fuzzy +msgid "Restarting instances" +msgstr "Запуск/остановка экземпляра" + +msgid "To restart an instance, use :ref:`tt restart `:" +msgstr "" + +msgid "$ tt restart sharded_cluster:storage-a-002" +msgstr "" + +msgid "After executing ``tt restart``, you need to confirm this operation:" +msgstr "" msgid "" -"To enable ``my_app`` instance for auto-load during system startup, say:" +"Confirm restart of 'sharded_cluster:storage-a-002' [y/n]: y\n" +" • The Instance sharded_cluster:storage-a-002 (PID = 2026) has been terminated.\n" +" • Starting an instance [sharded_cluster:storage-a-002]..." +msgstr "" + +#, fuzzy +msgid "Stopping instances" +msgstr "Запуск/остановка экземпляра" + +msgid "" +"To stop the specific instance, use :ref:`tt stop ` as follows:" +msgstr "" + +msgid "$ tt stop sharded_cluster:storage-a-002" msgstr "" -"Для включения автоматической загрузки экземпляра ``my_app`` при запуске всей" -" системы используйте команду:" -msgid "$ systemctl enable tarantool@my_app" -msgstr "$ systemctl enable tarantool@my_app" +msgid "You can also stop all the instances at once as follows:" +msgstr "" -msgid "To stop a running ``my_app`` instance, say:" -msgstr "Для остановки работающего экземпляра ``my_app`` используйте команду:" +msgid "" +"$ tt stop sharded_cluster\n" +" • The Instance sharded_cluster:storage-b-001 (PID = 2020) has been terminated.\n" +" • The Instance sharded_cluster:storage-b-002 (PID = 2021) has been terminated.\n" +" • The Instance sharded_cluster:router-a-001 (PID = 2022) has been terminated.\n" +" • The Instance sharded_cluster:storage-a-001 (PID = 2023) has been terminated.\n" +" • can't \"stat\" the PID file. Error: \"stat /home/testuser/myapp/instances.enabled/sharded_cluster/var/run/storage-a-002/tt.pid: no such file or directory\"" +msgstr "" msgid "" -"$ tarantoolctl stop my_app\n" -"$ # - OR -\n" -"$ systemctl stop tarantool@my_app" +"The error message indicates that ``storage-a-002`` is already not running." msgstr "" -"$ tarantoolctl stop my_app\n" -"$ # - ИЛИ -\n" -"$ systemctl stop tarantool@my_app" -msgid "To restart (i.e. stop and start) a running ``my_app`` instance, say:" +msgid "Removing instance artifacts" msgstr "" -"Для перезапуска (т.е. остановки и запуска) работающего экземпляра ``my_app``" -" используйте команду:" msgid "" -"$ tarantoolctl restart my_app\n" -"$ # - OR -\n" -"$ systemctl restart tarantool@my_app" +"The :ref:`tt clean ` command removes instance artifacts (such as " +"logs or snapshots):" msgstr "" -"$ tarantoolctl restart my_app\n" -"$ # - ИЛИ -\n" -"$ systemctl restart tarantool@my_app" -msgid "Running Tarantool locally" -msgstr "Локальный запуск Tarantool" +msgid "" +"$ tt clean sharded_cluster\n" +" • List of files to delete:\n" +"\n" +" • /home/testuser/myapp/instances.enabled/sharded_cluster/var/log/storage-a-001/tt.log\n" +" • /home/testuser/myapp/instances.enabled/sharded_cluster/var/lib/storage-a-001/00000000000000001062.snap\n" +" • /home/testuser/myapp/instances.enabled/sharded_cluster/var/lib/storage-a-001/00000000000000001062.xlog\n" +" • ...\n" +"\n" +"Confirm [y/n]:" +msgstr "" msgid "" -"Sometimes you may need to run a Tarantool instance locally, e.g. for test " -"purposes. Let's configure a local instance, then start and monitor it with " -"``tarantoolctl``." +"Enter ``y`` and press ``Enter`` to confirm removing of artifacts for each " +"instance." msgstr "" -"Иногда бывает необходимо запустить Tarantool локально -- например, для " -"тестирования. Давайте настроим локальный экземпляр, запустим его и будем " -"мониторить с помощью ``tarantoolctl``." -msgid "First, we create a sandbox directory on the user's path:" -msgstr "Сперва создадим директорию-песочницу по следующему пути:" +msgid "" +"The ``-f`` option of the ``tt clean`` command can be used to remove the " +"files without confirmation." +msgstr "" -msgid "$ mkdir ~/tarantool_test" -msgstr "$ mkdir ~/tarantool_test" +msgid "Preloading Lua scripts and modules" +msgstr "" msgid "" -"... and set default ``tarantoolctl`` configuration in " -"``$HOME/.config/tarantool/tarantool``. Let the file contents be:" +"Tarantool supports loading and running chunks of Lua code before starting " +"instances. To load or run Lua code immediately upon Tarantool startup, " +"specify the ``TT_PRELOAD`` environment variable. Its value can be either a " +"path to a Lua script or a Lua module name:" msgstr "" -"...и поместим конфигурационный файл с параметрами ``tarantoolctl`` по " -"умолчанию в ``$HOME/.config/tarantool/tarantool``. Содержимое файла будет " -"таким:" msgid "" -"default_cfg = {\n" -" pid_file = \"/home/user/tarantool_test/my_app.pid\",\n" -" wal_dir = \"/home/user/tarantool_test\",\n" -" snap_dir = \"/home/user/tarantool_test\",\n" -" vinyl_dir = \"/home/user/tarantool_test\",\n" -" log = \"/home/user/tarantool_test/log\",\n" -"}\n" -"instance_dir = \"/home/user/tarantool_test\"" +"To run the Lua script ``preload_script.lua`` from the ``sharded_cluster`` " +"directory, set ``TT_PRELOAD`` as follows:" msgstr "" -"default_cfg = {\n" -" pid_file = \"/home/user/tarantool_test/my_app.pid\",\n" -" wal_dir = \"/home/user/tarantool_test\",\n" -" snap_dir = \"/home/user/tarantool_test\",\n" -" vinyl_dir = \"/home/user/tarantool_test\",\n" -" log = \"/home/user/tarantool_test/log\",\n" -"}\n" -"instance_dir = \"/home/user/tarantool_test\"" -msgid "Specify a full path to the user's home directory instead of \"~/\"." -msgstr "Указывайте полный путь к домашней директории пользователя вместо \"~/\"." +msgid "$ TT_PRELOAD=preload_script.lua tt start sharded_cluster" +msgstr "" msgid "" -"Omit ``username`` parameter. ``tarantoolctl`` normally doesn't have " -"permissions to switch current user when invoked by a local user. The " -"instance will be running under 'admin'." +"Tarantool runs the ``preload_script.lua`` code, waits for it to complete, " +"and then starts instances." msgstr "" -"Опустите параметр ``username``. Обычно, когда запуск производит локальный " -"пользователь, у ``tarantoolctl`` нет разрешения на смену текущего " -"пользователя. Экземпляр будет работать с пользователем 'admin'." msgid "" -"Next, we create the instance file ``~/tarantool_test/my_app.lua``. Let the " -"file contents be:" +"To load the ``preload_module`` from the ``sharded_cluster`` directory, set " +"``TT_PRELOAD`` as follows:" +msgstr "" + +msgid "$ TT_PRELOAD=preload_module tt start sharded_cluster" msgstr "" -"Далее создадим файл экземпляра ``~/tarantool_test/my_app.lua``. Содержимое " -"файла будет таким:" msgid "" -"box.cfg{listen = 3301}\n" -"box.schema.user.passwd('Gx5!')\n" -"box.schema.user.grant('guest','read,write,execute','universe')\n" -"fiber = require('fiber')\n" -"box.schema.space.create('tester')\n" -"box.space.tester:create_index('primary',{})\n" -"i = 0\n" -"while 0 == 0 do\n" -" fiber.sleep(5)\n" -" i = i + 1\n" -" print('insert ' .. i)\n" -" box.space.tester:insert{i, 'my_app tuple'}\n" -"end" +"``TT_PRELOAD`` values that end with ``.lua`` are considered scripts, so " +"avoid module names with this ending." msgstr "" -"box.cfg{listen = 3301}\n" -"box.schema.user.passwd('Gx5!')\n" -"box.schema.user.grant('guest','read,write,execute','universe')\n" -"fiber = require('fiber')\n" -"box.schema.space.create('tester')\n" -"box.space.tester:create_index('primary',{})\n" -"i = 0\n" -"while 0 == 0 do\n" -" fiber.sleep(5)\n" -" i = i + 1\n" -" print('insert ' .. i)\n" -" box.space.tester:insert{i, 'my_app tuple'}\n" -"end" msgid "" -"Let’s verify our instance file by starting it without ``tarantoolctl`` " -"first:" +"To load several scripts or modules, pass them in a single quoted string, " +"separated by semicolons:" msgstr "" -"Проверим наш файл экземпляра, сперва запустив его без ``tarantoolctl``:" msgid "" -"$ cd ~/tarantool_test\n" -"$ tarantool my_app.lua\n" -"2017-04-06 10:42:15.762 [54085] main/101/my_app.lua C> version 1.7.3-489-gd86e36d5b\n" -"2017-04-06 10:42:15.763 [54085] main/101/my_app.lua C> log level 5\n" -"2017-04-06 10:42:15.764 [54085] main/101/my_app.lua I> mapping 268435456 bytes for tuple arena...\n" -"2017-04-06 10:42:15.774 [54085] iproto/101/main I> binary: bound to [::]:3301\n" -"2017-04-06 10:42:15.774 [54085] main/101/my_app.lua I> initializing an empty data directory\n" -"2017-04-06 10:42:15.789 [54085] snapshot/101/main I> saving snapshot `./00000000000000000000.snap.inprogress'\n" -"2017-04-06 10:42:15.790 [54085] snapshot/101/main I> done\n" -"2017-04-06 10:42:15.791 [54085] main/101/my_app.lua I> vinyl checkpoint done\n" -"2017-04-06 10:42:15.791 [54085] main/101/my_app.lua I> ready to accept requests\n" -"insert 1\n" -"insert 2\n" -"insert 3\n" -"<...>" -msgstr "" -"$ cd ~/tarantool_test\n" -"$ tarantool my_app.lua\n" -"2017-04-06 10:42:15.762 [54085] main/101/my_app.lua C> version 1.7.3-489-gd86e36d5b\n" -"2017-04-06 10:42:15.763 [54085] main/101/my_app.lua C> log level 5\n" -"2017-04-06 10:42:15.764 [54085] main/101/my_app.lua I> mapping 268435456 bytes for tuple arena...\n" -"2017-04-06 10:42:15.774 [54085] iproto/101/main I> binary: bound to [::]:3301\n" -"2017-04-06 10:42:15.774 [54085] main/101/my_app.lua I> initializing an empty data directory\n" -"2017-04-06 10:42:15.789 [54085] snapshot/101/main I> saving snapshot `./00000000000000000000.snap.inprogress'\n" -"2017-04-06 10:42:15.790 [54085] snapshot/101/main I> done\n" -"2017-04-06 10:42:15.791 [54085] main/101/my_app.lua I> vinyl checkpoint done\n" -"2017-04-06 10:42:15.791 [54085] main/101/my_app.lua I> ready to accept requests\n" -"insert 1\n" -"insert 2\n" -"insert 3\n" -"<...>" - -msgid "Now we tell ``tarantoolctl`` to start the Tarantool instance:" -msgstr "Запустим экземпляр Tarantool с помощью ``tarantoolctl``:" - -msgid "$ tarantoolctl start my_app" -msgstr "$ tarantoolctl start my_app" - -msgid "Expect to see messages indicating that the instance has started. Then:" -msgstr "" -"В консоли должны появиться сообщения о том, что экземпляр запущен. Затем " -"выполним следующую команду:" +"$ TT_PRELOAD=\"preload_script.lua;preload_module\" tt start sharded_cluster" +msgstr "" -msgid "$ ls -l ~/tarantool_test/my_app" -msgstr "$ ls -l ~/tarantool_test/my_app" +msgid "" +"If an error happens during the execution of the preload script or module, " +"Tarantool reports the problem and exits." +msgstr "" -msgid "Expect to see the .snap file and the .xlog file. Then:" +msgid "tarantool command-line options" msgstr "" -"В консоли должны появиться .snap-файл и .xlog-файл. Затем выполним следующую" -" команду:" - -msgid "$ less ~/tarantool_test/log/my_app.log" -msgstr "$ less ~/tarantool_test/log/my_app.log" - -msgid "" -"Expect to see the contents of ``my_app``‘s log, including error messages, if" -" any. Then:" -msgstr "" -"В консоли должно отобразиться содержимое файла журнала для приложения " -"``my_app``, в том числе сообщения об ошибках, если они были. Затем выполним " -"серию команд:" - -msgid "" -"$ tarantoolctl enter my_app\n" -"tarantool> box.cfg{}\n" -"tarantool> console = require('console')\n" -"tarantool> console.connect('localhost:3301')\n" -"tarantool> box.space.tester:select({0}, {iterator = 'GE'})" -msgstr "" -"$ tarantoolctl enter my_app\n" -"tarantool> box.cfg{}\n" -"tarantool> console = require('console')\n" -"tarantool> console.connect('localhost:3301')\n" -"tarantool> box.space.tester:select({0}, {iterator = 'GE'})" - -msgid "Expect to see several tuples that ``my_app`` has created." -msgstr "" -"В консоли должны появиться несколько кортежей, которые создало приложение " -"``my_app``." - -msgid "" -"Stop now. A polite way to stop ``my_app`` is with ``tarantoolctl``, thus we " -"say:" + +msgid "" +"Options that can be passed when :ref:`starting a Tarantool instance " +"`:" msgstr "" -"Теперь остановим приложение ``my_app``. Корректный способ остановки -- это " -"использовать``tarantoolctl``:" -msgid "$ tarantoolctl stop my_app" -msgstr "$ tarantoolctl stop my_app" +msgid "Print an annotated list of all available options and exit." +msgstr "" -msgid "Finally, we make a cleanup." -msgstr "Последний шаг -- удаление тестовых данных." +msgid "**Since:** :doc:`3.0.0 `." +msgstr "" -msgid "$ rm -R tarantool_test" +msgid "" +"Show a list of :ref:`environment variables " +"` that can be used to configure " +"Tarantool." +msgstr "" + +msgid "Print the product name and version." +msgstr "" + +msgid "**Example**" +msgstr "" + +msgid "" +"$ tarantool --version\n" +"Tarantool Enterprise 3.0.0-beta1-2-gcbb569b4c-r607-gc64\n" +"Target: Linux-x86_64-RelWithDebInfo\n" +"..." +msgstr "" + +msgid "In this example:" +msgstr "" + +msgid "" +"``3.0.0`` is a Tarantool version. Tarantool follows semantic versioning, " +"which is described in the :ref:`Tarantool release policy ` " +"section." +msgstr "" + +msgid "" +"``Target`` is the platform Tarantool is built on. Platform-specific details " +"may follow this line." +msgstr "" + +msgid "" +"Set a path to a :ref:`YAML configuration file `. You can" +" also configure this value using the ``TT_CONFIG`` environment variable." +msgstr "" + +msgid "" +"See also: :ref:`Starting an instance using the tarantool command " +"`" +msgstr "" + +msgid "" +"Set the name of an instance to run. You can also configure this value using " +"the ``TT_INSTANCE_NAME`` environment variable." +msgstr "" + +msgid "Enter an :ref:`interactive mode `." +msgstr "" + +#, fuzzy +msgid "$ tarantool -i" msgstr "$ rm -R tarantool_test" + +msgid "" +"Execute the 'EXPR' string. See also: `lua man page " +"`_." +msgstr "" + +msgid "" +"$ tarantool -e 'print(\"Hello, world!\")'\n" +"Hello, world!" +msgstr "" + +msgid "" +"Require the 'NAME' library. See also: `lua man page " +"`_." +msgstr "" + +msgid "$ tarantool -l luatest.coverage script.lua" +msgstr "" + +msgid "" +"Perform a LuaJIT control command. See also: `Command Line Options " +"`_." +msgstr "" + +#, fuzzy +msgid "$ tarantool -j off app.lua" +msgstr "$ tarantoolctl stop my_app" + +msgid "" +"Save or list bytecode. See also: `Command Line Options " +"`_." +msgstr "" + +msgid "$ tarantool -b test.lua test.out" +msgstr "" + +msgid "" +"Activate a debugging session for 'SCRIPT'. See also: `luadebug.lua " +"`_." +msgstr "" + +#, fuzzy +msgid "$ tarantool -d app.lua" +msgstr "$ tarantoolctl stop my_app" + +msgid "" +"Stop handling options. See also: `lua man page " +"`_." +msgstr "" + +msgid "" +"Stop handling options and execute the standard input as a file. See also: " +"`lua man page `_." +msgstr "" + +#~ msgid "" +#~ "While a Lua application is executed by Tarantool, an instance file is " +#~ "executed by ``tarantoolctl`` which is a Tarantool script." +#~ msgstr "" +#~ "Lua-приложение выполняется Tarantool, тогда как файл экземпляра выполняется " +#~ "Tarantool-скриптом ``tarantoolctl``." + +#~ msgid "Here is what ``tarantoolctl`` does when you issue the command:" +#~ msgstr "Вот что делает ``tarantoolctl`` при вводе следующей команды:" + +#~ msgid "" +#~ "Read and parse the command line arguments. The last argument, in our case, " +#~ "contains an instance name." +#~ msgstr "" +#~ "Считывает и разбирает аргументы командной строки. В нашем случае последний " +#~ "аргумент содержит имя экземпляра." + +#~ msgid "" +#~ "Read and parse its own configuration file. This file contains " +#~ "``tarantoolctl`` defaults, like the path to the directory where instances " +#~ "should be searched for." +#~ msgstr "" +#~ "Считывает и разбирает собственный конфигурационный файл. Этот файл содержит " +#~ "параметры ``tarantoolctl`` по умолчанию -- такие как путь до директории, в " +#~ "которой располагаются экземпляры." + +#~ msgid "" +#~ "When ``tarantool`` is invoked by root, it looks for a configuration file in " +#~ "``/etc/default/tarantool``. When ``tarantool`` is invoked by a local (non-" +#~ "root) user, it looks for a configuration file first in the current directory" +#~ " (``$PWD/.tarantoolctl``), and then in the current user's home directory " +#~ "(``$HOME/.config/tarantool/tarantool``). If no configuration file is found " +#~ "there, or in the ``/usr/local/etc/default/tarantool`` file, then " +#~ "``tarantoolctl`` falls back to :ref:`built-in defaults `." +#~ msgstr "" +#~ "Когда ``tarantoolctl`` вызывается с root-правами, он ищет конфигурационный " +#~ "файл в ``/etc/default/tarantool``. Если вызов ``tarantool`` производит " +#~ "локальный пользователь, сначала он ищет конфигурационный файл в текущей " +#~ "директории (``$PWD/.tarantoolctl``), а затем в домашней директории текущего " +#~ "пользователя (``$HOME/.config/tarantool/tarantool``). Если конфигурационный " +#~ "файл не найден, ``tarantoolctl`` принимает :ref:`встроенные параметры по " +#~ "умолчанию `." + +#~ msgid "" +#~ "Look up the instance file in the instance directory, for example " +#~ "``/etc/tarantool/instances.enabled``. To build the instance file path, " +#~ "``tarantoolctl`` takes the instance name, prepends the instance directory " +#~ "and appends \".lua\" extension to the instance file." +#~ msgstr "" +#~ "Ищет файл экземпляра в директории, где располагаются экземпляры, например, в" +#~ " ``/etc/tarantool/instances.enabled``. ``tarantoolctl`` строит путь до файла" +#~ " экземпляра следующим образом: \"путь до директории с экземплярами\" + \"имя" +#~ " экземпляра\" + \".lua\"." + +#~ msgid "" +#~ "Override :doc:`box.cfg{} ` function to " +#~ "pre-process its parameters and ensure that instance paths are pointing to " +#~ "the paths defined in the ``tarantoolctl`` configuration file. For example, " +#~ "if the configuration file specifies that instance work directory must be in " +#~ "``/var/tarantool``, then the new implementation of ``box.cfg{}`` ensures " +#~ "that :ref:`work_dir ` parameter in ``box.cfg{}`` is set " +#~ "to ``/var/tarantool/``, regardless of what the path is set to" +#~ " in the instance file itself." +#~ msgstr "" +#~ "Переопределяет функцию :doc:`box.cfg{} `, " +#~ "чтобы предобработать ее параметры и сделать так, чтобы пути к экземплярам " +#~ "указывали на пути, прописанные в конфигурационном файле ``tarantoolctl``. " +#~ "Например, если в конфигурационном файле указано, что рабочей директорией " +#~ "экземпляра является ``/var/tarantool``, то новая реализация ``box.cfg{}`` " +#~ "сделает так, чтобы параметр :ref:`work_dir ` в " +#~ "``box.cfg{}`` имел значение ``/var/tarantool/<имя_экземпляра>``, независимо " +#~ "от того, какой путь указан в самом файле экземпляра." + +#~ msgid "" +#~ "Create a so-called \"instance control file\". This is a Unix socket with Lua" +#~ " console attached to it. This file is used later by ``tarantoolctl`` to " +#~ "query the instance state, send commands to the instance and so on." +#~ msgstr "" +#~ "Создает так называемый \"файл для управления экземпляром\". Это Unix-сокет с" +#~ " прикрепленной к нему Lua-консолью. В дальнейшем ``tarantoolctl`` использует" +#~ " этот файл для получения состояния экземпляра, отправки команд и т.д." + +#~ msgid "" +#~ "Set the TARANTOOLCTL environment variable to 'true'. This allows the user to" +#~ " know that the instance was started by ``tarantoolctl``." +#~ msgstr "" +#~ "Задает значение переменной окружения TARANTOOLCTL = 'true'. Это позволит " +#~ "пользователю понять, что экземпляр был запущен ``tarantoolctl``." + +#~ msgid "Finally, use Lua ``dofile`` command to execute the instance file." +#~ msgstr "" +#~ "Наконец, использует Lua-команду ``dofile`` для выполнения файла экземпляра." + +#~ msgid "" +#~ "If you start an instance using ``systemd`` tools, like this (the instance " +#~ "name is ``my_app``):" +#~ msgstr "" +#~ "При запуске экземпляра с помощью инструментария ``systemd`` указанным ниже " +#~ "способом (имя экземпляра -- ``my_app``):" + +#~ msgid "" +#~ "$ systemctl start tarantool@my_app\n" +#~ "$ ps axuf|grep my_app\n" +#~ "taranto+ 5350 1.3 0.3 1448872 7736 ? Ssl 20:05 0:28 tarantool my_app.lua " +#~ msgstr "" +#~ "$ systemctl start tarantool@my_app\n" +#~ "$ ps axuf|grep my_app\n" +#~ "taranto+ 5350 1.3 0.3 1448872 7736 ? Ssl 20:05 0:28 tarantool my_app.lua " + +#~ msgid "" +#~ "... this actually calls ``tarantoolctl`` like in case of ``tarantoolctl " +#~ "start my_app``." +#~ msgstr "" +#~ "...на самом деле вызывается ``tarantoolctl`` -- так же, как и в случае " +#~ "``tarantoolctl start my_app``." + +#~ msgid "" +#~ "To check the instance file for syntax errors prior to starting ``my_app`` " +#~ "instance, say:" +#~ msgstr "" +#~ "Для проверки файла экземпляра на наличие синтаксических ошибок перед " +#~ "запуском экземпляра ``my_app`` используйте команду:" + +#~ msgid "$ tarantoolctl check my_app" +#~ msgstr "$ tarantoolctl check my_app" + +#~ msgid "" +#~ "To enable ``my_app`` instance for auto-load during system startup, say:" +#~ msgstr "" +#~ "Для включения автоматической загрузки экземпляра ``my_app`` при запуске всей" +#~ " системы используйте команду:" + +#~ msgid "$ systemctl enable tarantool@my_app" +#~ msgstr "$ systemctl enable tarantool@my_app" + +#~ msgid "To stop a running ``my_app`` instance, say:" +#~ msgstr "Для остановки работающего экземпляра ``my_app`` используйте команду:" + +#~ msgid "" +#~ "$ tarantoolctl stop my_app\n" +#~ "$ # - OR -\n" +#~ "$ systemctl stop tarantool@my_app" +#~ msgstr "" +#~ "$ tarantoolctl stop my_app\n" +#~ "$ # - ИЛИ -\n" +#~ "$ systemctl stop tarantool@my_app" + +#~ msgid "To restart (i.e. stop and start) a running ``my_app`` instance, say:" +#~ msgstr "" +#~ "Для перезапуска (т.е. остановки и запуска) работающего экземпляра ``my_app``" +#~ " используйте команду:" + +#~ msgid "" +#~ "$ tarantoolctl restart my_app\n" +#~ "$ # - OR -\n" +#~ "$ systemctl restart tarantool@my_app" +#~ msgstr "" +#~ "$ tarantoolctl restart my_app\n" +#~ "$ # - ИЛИ -\n" +#~ "$ systemctl restart tarantool@my_app" + +#~ msgid "Running Tarantool locally" +#~ msgstr "Локальный запуск Tarantool" + +#~ msgid "" +#~ "Sometimes you may need to run a Tarantool instance locally, e.g. for test " +#~ "purposes. Let's configure a local instance, then start and monitor it with " +#~ "``tarantoolctl``." +#~ msgstr "" +#~ "Иногда бывает необходимо запустить Tarantool локально -- например, для " +#~ "тестирования. Давайте настроим локальный экземпляр, запустим его и будем " +#~ "мониторить с помощью ``tarantoolctl``." + +#~ msgid "First, we create a sandbox directory on the user's path:" +#~ msgstr "Сперва создадим директорию-песочницу по следующему пути:" + +#~ msgid "$ mkdir ~/tarantool_test" +#~ msgstr "$ mkdir ~/tarantool_test" + +#~ msgid "" +#~ "... and set default ``tarantoolctl`` configuration in " +#~ "``$HOME/.config/tarantool/tarantool``. Let the file contents be:" +#~ msgstr "" +#~ "...и поместим конфигурационный файл с параметрами ``tarantoolctl`` по " +#~ "умолчанию в ``$HOME/.config/tarantool/tarantool``. Содержимое файла будет " +#~ "таким:" + +#~ msgid "" +#~ "default_cfg = {\n" +#~ " pid_file = \"/home/user/tarantool_test/my_app.pid\",\n" +#~ " wal_dir = \"/home/user/tarantool_test\",\n" +#~ " snap_dir = \"/home/user/tarantool_test\",\n" +#~ " vinyl_dir = \"/home/user/tarantool_test\",\n" +#~ " log = \"/home/user/tarantool_test/log\",\n" +#~ "}\n" +#~ "instance_dir = \"/home/user/tarantool_test\"" +#~ msgstr "" +#~ "default_cfg = {\n" +#~ " pid_file = \"/home/user/tarantool_test/my_app.pid\",\n" +#~ " wal_dir = \"/home/user/tarantool_test\",\n" +#~ " snap_dir = \"/home/user/tarantool_test\",\n" +#~ " vinyl_dir = \"/home/user/tarantool_test\",\n" +#~ " log = \"/home/user/tarantool_test/log\",\n" +#~ "}\n" +#~ "instance_dir = \"/home/user/tarantool_test\"" + +#~ msgid "Specify a full path to the user's home directory instead of \"~/\"." +#~ msgstr "Указывайте полный путь к домашней директории пользователя вместо \"~/\"." + +#~ msgid "" +#~ "Omit ``username`` parameter. ``tarantoolctl`` normally doesn't have " +#~ "permissions to switch current user when invoked by a local user. The " +#~ "instance will be running under 'admin'." +#~ msgstr "" +#~ "Опустите параметр ``username``. Обычно, когда запуск производит локальный " +#~ "пользователь, у ``tarantoolctl`` нет разрешения на смену текущего " +#~ "пользователя. Экземпляр будет работать с пользователем 'admin'." + +#~ msgid "" +#~ "Next, we create the instance file ``~/tarantool_test/my_app.lua``. Let the " +#~ "file contents be:" +#~ msgstr "" +#~ "Далее создадим файл экземпляра ``~/tarantool_test/my_app.lua``. Содержимое " +#~ "файла будет таким:" + +#~ msgid "" +#~ "box.cfg{listen = 3301}\n" +#~ "box.schema.user.passwd('Gx5!')\n" +#~ "box.schema.user.grant('guest','read,write,execute','universe')\n" +#~ "fiber = require('fiber')\n" +#~ "box.schema.space.create('tester')\n" +#~ "box.space.tester:create_index('primary',{})\n" +#~ "i = 0\n" +#~ "while 0 == 0 do\n" +#~ " fiber.sleep(5)\n" +#~ " i = i + 1\n" +#~ " print('insert ' .. i)\n" +#~ " box.space.tester:insert{i, 'my_app tuple'}\n" +#~ "end" +#~ msgstr "" +#~ "box.cfg{listen = 3301}\n" +#~ "box.schema.user.passwd('Gx5!')\n" +#~ "box.schema.user.grant('guest','read,write,execute','universe')\n" +#~ "fiber = require('fiber')\n" +#~ "box.schema.space.create('tester')\n" +#~ "box.space.tester:create_index('primary',{})\n" +#~ "i = 0\n" +#~ "while 0 == 0 do\n" +#~ " fiber.sleep(5)\n" +#~ " i = i + 1\n" +#~ " print('insert ' .. i)\n" +#~ " box.space.tester:insert{i, 'my_app tuple'}\n" +#~ "end" + +#~ msgid "" +#~ "Let’s verify our instance file by starting it without ``tarantoolctl`` " +#~ "first:" +#~ msgstr "" +#~ "Проверим наш файл экземпляра, сперва запустив его без ``tarantoolctl``:" + +#~ msgid "" +#~ "$ cd ~/tarantool_test\n" +#~ "$ tarantool my_app.lua\n" +#~ "2017-04-06 10:42:15.762 [54085] main/101/my_app.lua C> version 1.7.3-489-gd86e36d5b\n" +#~ "2017-04-06 10:42:15.763 [54085] main/101/my_app.lua C> log level 5\n" +#~ "2017-04-06 10:42:15.764 [54085] main/101/my_app.lua I> mapping 268435456 bytes for tuple arena...\n" +#~ "2017-04-06 10:42:15.774 [54085] iproto/101/main I> binary: bound to [::]:3301\n" +#~ "2017-04-06 10:42:15.774 [54085] main/101/my_app.lua I> initializing an empty data directory\n" +#~ "2017-04-06 10:42:15.789 [54085] snapshot/101/main I> saving snapshot `./00000000000000000000.snap.inprogress'\n" +#~ "2017-04-06 10:42:15.790 [54085] snapshot/101/main I> done\n" +#~ "2017-04-06 10:42:15.791 [54085] main/101/my_app.lua I> vinyl checkpoint done\n" +#~ "2017-04-06 10:42:15.791 [54085] main/101/my_app.lua I> ready to accept requests\n" +#~ "insert 1\n" +#~ "insert 2\n" +#~ "insert 3\n" +#~ "<...>" +#~ msgstr "" +#~ "$ cd ~/tarantool_test\n" +#~ "$ tarantool my_app.lua\n" +#~ "2017-04-06 10:42:15.762 [54085] main/101/my_app.lua C> version 1.7.3-489-gd86e36d5b\n" +#~ "2017-04-06 10:42:15.763 [54085] main/101/my_app.lua C> log level 5\n" +#~ "2017-04-06 10:42:15.764 [54085] main/101/my_app.lua I> mapping 268435456 bytes for tuple arena...\n" +#~ "2017-04-06 10:42:15.774 [54085] iproto/101/main I> binary: bound to [::]:3301\n" +#~ "2017-04-06 10:42:15.774 [54085] main/101/my_app.lua I> initializing an empty data directory\n" +#~ "2017-04-06 10:42:15.789 [54085] snapshot/101/main I> saving snapshot `./00000000000000000000.snap.inprogress'\n" +#~ "2017-04-06 10:42:15.790 [54085] snapshot/101/main I> done\n" +#~ "2017-04-06 10:42:15.791 [54085] main/101/my_app.lua I> vinyl checkpoint done\n" +#~ "2017-04-06 10:42:15.791 [54085] main/101/my_app.lua I> ready to accept requests\n" +#~ "insert 1\n" +#~ "insert 2\n" +#~ "insert 3\n" +#~ "<...>" + +#~ msgid "Now we tell ``tarantoolctl`` to start the Tarantool instance:" +#~ msgstr "Запустим экземпляр Tarantool с помощью ``tarantoolctl``:" + +#~ msgid "$ tarantoolctl start my_app" +#~ msgstr "$ tarantoolctl start my_app" + +#~ msgid "Expect to see messages indicating that the instance has started. Then:" +#~ msgstr "" +#~ "В консоли должны появиться сообщения о том, что экземпляр запущен. Затем " +#~ "выполним следующую команду:" + +#~ msgid "$ ls -l ~/tarantool_test/my_app" +#~ msgstr "$ ls -l ~/tarantool_test/my_app" + +#~ msgid "Expect to see the .snap file and the .xlog file. Then:" +#~ msgstr "" +#~ "В консоли должны появиться .snap-файл и .xlog-файл. Затем выполним следующую" +#~ " команду:" + +#~ msgid "$ less ~/tarantool_test/log/my_app.log" +#~ msgstr "$ less ~/tarantool_test/log/my_app.log" + +#~ msgid "" +#~ "Expect to see the contents of ``my_app``‘s log, including error messages, if" +#~ " any. Then:" +#~ msgstr "" +#~ "В консоли должно отобразиться содержимое файла журнала для приложения " +#~ "``my_app``, в том числе сообщения об ошибках, если они были. Затем выполним " +#~ "серию команд:" + +#~ msgid "" +#~ "$ tarantoolctl enter my_app\n" +#~ "tarantool> box.cfg{}\n" +#~ "tarantool> console = require('console')\n" +#~ "tarantool> console.connect('localhost:3301')\n" +#~ "tarantool> box.space.tester:select({0}, {iterator = 'GE'})" +#~ msgstr "" +#~ "$ tarantoolctl enter my_app\n" +#~ "tarantool> box.cfg{}\n" +#~ "tarantool> console = require('console')\n" +#~ "tarantool> console.connect('localhost:3301')\n" +#~ "tarantool> box.space.tester:select({0}, {iterator = 'GE'})" + +#~ msgid "Expect to see several tuples that ``my_app`` has created." +#~ msgstr "" +#~ "В консоли должны появиться несколько кортежей, которые создало приложение " +#~ "``my_app``." + +#~ msgid "" +#~ "Stop now. A polite way to stop ``my_app`` is with ``tarantoolctl``, thus we " +#~ "say:" +#~ msgstr "" +#~ "Теперь остановим приложение ``my_app``. Корректный способ остановки -- это " +#~ "использовать``tarantoolctl``:" + +#~ msgid "Finally, we make a cleanup." +#~ msgstr "Последний шаг -- удаление тестовых данных." diff --git a/locale/ru/LC_MESSAGES/book/admin/troubleshoot.po b/locale/ru/LC_MESSAGES/book/admin/troubleshoot.po index 384b943f27..bb270fa934 100644 --- a/locale/ru/LC_MESSAGES/book/admin/troubleshoot.po +++ b/locale/ru/LC_MESSAGES/book/admin/troubleshoot.po @@ -24,11 +24,10 @@ msgstr "" "Чтобы проверить значения данных параметров, выполните соответствующие " "команды:" +#, fuzzy msgid "" "$ # attaching to a Tarantool instance\n" -"$ tarantoolctl enter \n" -"$ # -- OR --\n" -"$ tarantoolctl connect " +"$ tt connect " msgstr "" "$ # подключаемся к админ-консоли нужного экземпляра\n" "$ tarantoolctl enter \n" @@ -63,6 +62,7 @@ msgstr "" "увеличить значение параметра :ref:`box.cfg{memtx_memory} ` (при наличии свободных ресурсов)." +#, python-format msgid "" "In versions of Tarantool before 1.10, the server needs to be restarted to " "change this parameter. The Tarantool server will be unavailable while " @@ -108,16 +108,18 @@ msgstr "" msgid "Problem: Tarantool generates too heavy CPU load" msgstr "Проблема: Tarantool создает большую нагрузку на CPU" +#, fuzzy msgid "" -"The :ref:`transaction processor thread ` " -"consumes over 60% CPU." +"The :ref:`transaction processor thread ` consumes over 60% " +"CPU." msgstr "" ":ref:`Поток обработки транзакций ` нагружает " "ЦП более чем на 60%." +#, fuzzy msgid "" -"Attach to the Tarantool instance with :ref:`tarantoolctl ` " -"utility, analyze the query statistics with :doc:`box.stat() " +"Attach to the Tarantool instance with :ref:`tt ` utility, analyze " +"the query statistics with :doc:`box.stat() " "` and spot the CPU consumption leader. " "The following commands can help:" msgstr "" @@ -194,11 +196,11 @@ msgstr "" "Увеличить размер readahead-буфера (:ref:`box.cfg{readahead} `)." +#, fuzzy msgid "" "This parameter can be changed on the fly, so you don't need to restart " -"Tarantool. Attach to the Tarantool instance with :ref:`tarantoolctl " -"` utility and call ``box.cfg{}`` with a new ``readahead`` " -"value:" +"Tarantool. Attach to the Tarantool instance with :ref:`tt ` utility " +"and call ``box.cfg{}`` with a new ``readahead`` value:" msgstr "" "Перезапускать Tarantool при этом не требуется. Для обновления конфигурации " "необходимо подключиться к Tarantool с помощью утилиты :ref:`tarantoolctl " @@ -508,6 +510,7 @@ msgstr "" "Реализация подходящего финализатора для определенного типа FFI " "(``custom_t``)." +#, python-format msgid "" "local ffi = require('ffi')\n" "local fiber = require('fiber')\n" @@ -559,6 +562,7 @@ msgstr "" msgid "``custom.c``" msgstr "``custom.c``" +#, python-format msgid "" "#include \n" "#include \n" @@ -782,6 +786,7 @@ msgstr "" msgid "``init.lua``" msgstr "" +#, python-format msgid "" "local ffi = require('ffi')\n" "local fiber = require('fiber')\n" diff --git a/locale/ru/LC_MESSAGES/book/admin/upgrades.po b/locale/ru/LC_MESSAGES/book/admin/upgrades.po index dbd7f3c699..c25004c661 100644 --- a/locale/ru/LC_MESSAGES/book/admin/upgrades.po +++ b/locale/ru/LC_MESSAGES/book/admin/upgrades.po @@ -2,230 +2,263 @@ msgid "Upgrades" msgstr "Обновление" -msgid "Upgrading a Tarantool database" -msgstr "Обновление базы данных Tarantool" - -msgid "" -"If you created a database with an older Tarantool version and have now " -"installed a newer version, make the request ``box.schema.upgrade()``. This " -"updates Tarantool system spaces to match the currently installed version of " -"Tarantool." -msgstr "" -"Если вы создали базу данных в старой версии Tarantool, а потом обновили " -"Tarantool до более свежей версии, вызовите команду ``box.schema.upgrade()``." -" Она обновляет системные спейсы Tarantool так, чтобы они совпадали с " -"текущей установленной версией Tarantool." - -msgid "" -"For example, here is what happens when you run ``box.schema.upgrade()`` with" -" a database created with Tarantool version 1.6.4 to version 1.7.2 (only a " -"small part of the output is shown):" -msgstr "" -"Например, вот что происходит, если выполнить команду " -"``box.schema.upgrade()`` для базы данных, созданной в Tarantool версии 1.6.4" -" (показана лишь малая часть выводимых сообщений):" - msgid "" -"tarantool> box.schema.upgrade()\n" -"alter index primary on _space set options to {\"unique\":true}, parts to [[0,\"unsigned\"]]\n" -"alter space _schema set options to {}\n" -"create view _vindex...\n" -"grant read access to 'public' role for _vindex view\n" -"set schema version to 1.7.0\n" -"---\n" -"..." +"This section describes the general upgrade process for Tarantool. There are " +"two main upgrade scenarios for different use cases:" msgstr "" -"tarantool> box.schema.upgrade()\n" -"alter index primary on _space set options to {\"unique\":true}, parts to [[0,\"unsigned\"]]\n" -"alter space _schema set options to {}\n" -"create view _vindex...\n" -"grant read access to 'public' role for _vindex view\n" -"set schema version to 1.7.0\n" -"---\n" -"..." - -msgid "Upgrading Tarantool on a single instance" -msgstr "Обновление одиночного экземпляра Tarantool" msgid "" -"Tarantool is backward compatible between two adjacent versions. For example," -" you should have no or little trouble when upgrading from Tarantool 1.6 to " -"1.7, or from Tarantool 1.7 to 2.x. Meanwhile Tarantool 2.x may have " -"incompatible changes when migrating from Tarantool 1.6. to 2.x directly." +":doc:`Live upgrade ` (without downtime) for " +"replication clusters." msgstr "" -"Tarantool поддерживает обратную совместимость между двумя последовательными " -"версиями. Например, обновление Tarantool 1.6 до 1.7 или Tarantool 1.7 до " -"2.x не должно вызвать затруднений, тогда как миграции с Tarantool 1.6 сразу" -" на 2.x могут препятствовать несовместимые изменения." - -msgid "How to upgrade from Tarantool 1.7 to 2.x" -msgstr "Как обновить Tarantool 1.7 до 2.x" - -msgid "Stop the Tarantool server." -msgstr "Остановите Tarantool-сервер." msgid "" -"Make a copy of all data (see an appropriate hot backup procedure in " -":ref:`Backups `) and the package from which the current (old)" -" version was installed (for rollback purposes)." +":doc:`Upgrade with downtime ` for standalone " +"instances." msgstr "" -"Создайте копию всех данных (см. подразделы про горячее резервное копирование" -" в разделе :ref:`Резервное копирование `) и пакета, из " -"которого была установлена текущая (старая) версия (на случай отката)." msgid "" -"Update the Tarantool server. See installation instructions at Tarantool " -"`download page `_." +"You can also downgrade to an earlier version using a similar procedure." msgstr "" -"Обновите Tarantool-сервер. Инструкции по установке доступны на `странице " -"загрузок Tarantool `_." msgid "" -"Launch the updated Tarantool server using ``tarantoolctl``, ``tt``, or ``systemctl``." +"For information about backwards compatibility, see the :ref:`compatibility " +"guarantees ` description." msgstr "" -"Запустите обновленный Tarantool-сервер с помощью ``tarantoolctl``, ``tt`` или " -"``systemctl``." - -msgid "How to upgrade from Tarantool 1.6 to 2.x" -msgstr "Как обновить Tarantool 1.6 до 2.x" msgid "" -"The procedure is fully analogous to :ref:`upgrading from 1.7 to 2.x `." +"Upgrading from or to certain versions can involve specific steps or slightly" +" differ from the general upgrade procedure. Such version-specific cases are " +"described on the dedicated pages inside this section." msgstr "" -"Обновление выполняется аналогично :ref:`обновлению с 1.7 на 2.x `." - -msgid "How to upgrade from Tarantool 1.6 to 1.7" -msgstr "Как обновить Tarantool 1.6 до 1.7" -msgid "" -"This procedure is for upgrading a standalone Tarantool instance in " -"production from 1.6.x to 1.7.x. Notice that this will **always imply a " -"downtime**. To upgrade **without downtime**, you need several Tarantool " -"servers running in a replication cluster (see :ref:`below `)." +msgid "This section includes the following topics:" msgstr "" -"Этот процесс предназначен для обновления индивидуальных экземпляров " -"Tarantool с 1.6.х до 1.7.х на боевом сервере. Обратите внимание, что это " -"**всегда приводит к некоторому простою**. Для обновления **без простоев** " -"необходимо, чтобы несколько работающих Tarantool-серверов были объединены в " -"репликационный кластер (см. :ref:`ниже `)." - -msgid "" -"Tarantool 1.7 has an incompatible :ref:`.snap ` and " -":ref:`.xlog ` file format: 1.6 files are supported during " -"upgrade, but you won’t be able to return to 1.6 after running under 1.7 for " -"a while. It also renames a few configuration parameters, but old parameters " -"are supported. The full list of breaking changes is available in `release " -"notes for Tarantool 1.7 `_." -msgstr "" -"Tarantool 1.7 работает с несовместимыми форматами файлов -- :ref:`.snap " -"` и :ref:`.xlog `. Файлы Tarantool 1.6 " -"поддерживаются при обновлении, но после непродолжительного использования " -"Tarantool 1.7 вернуться к 1.6 уже нельзя. Также были переименованы " -"некоторые конфигурационные параметры, но старые параметры еще " -"поддерживаются. Список критических изменений доступен в `Примечаниях к " -"версиям Tarantool 1.7 `_." - -msgid "" -"Check with application developers whether application files need to be " -"updated due to incompatible changes (see `1.7 release notes " -"`_). If yes, back up the " -"old application files." -msgstr "" -"Уточните у разработчиков, необходимо ли обновлять файлы приложения из-за " -"наличия несовместимых изменений (см. `Примечания к версии Tarantool 1.7 " -"`_). Если да, то создайте " -"резервные копии старых файлов приложения." - -msgid "" -"You can also put the request ``box.schema.upgrade()`` " -"inside a :doc:`box.once() ` function in " -"your Tarantool :ref:`initialization file `. On startup, " -"this will create new system spaces, update data type names (e.g. num -> " -"unsigned, str -> string) and options in Tarantool system spaces." -msgstr "" -"Выполнить команду ``box.schema.upgrade()`` также можно, " -"поместив ее внутрь функции :doc:`box.once() " -"` в :ref:`файле инициализации ` Tarantool. В результате на этапе запуска Tarantool создаст " -"новые системные спейсы, обновит названия типов данных (например, ``num`` -> " -"``unsigned``, ``str`` -> ``string``) и список доступных типов данных в системных " -"спейсах." - -msgid "Update your application files, if needed." -msgstr "При необходимости обновите файлы приложения." - -msgid "Upgrading Tarantool in a replication cluster" -msgstr "Обновление Tarantool в репликационном кластере" -msgid "" -"Tarantool 1.7 can work as a :ref:`replica ` for " -"Tarantool 1.6 and vice versa. Replicas perform capability negotiation on " -"handshake, and new 1.7 replication features are not used with 1.6 replicas. " -"This allows upgrading clustered configurations." -msgstr "" -"Tarantool 1.7 может служить :ref:`репликой ` для " -"Tarantool 1.6 -- и наоборот. При установке соединения происходит " -"обсуждение возможностей, и новые для 1.7 репликационные функции не " -"используются при работе с репликами версии 1.6. Такой подход позволяет " -"обновлять кластерные конфигурации." - -msgid "" -"This procedure allows for a rolling upgrade **without downtime** and works " -"for any cluster configuration: master-master or master-replica." -msgstr "" -"Этот процесс позволяет осуществить последовательное обновление **без " -"простоев** и подходит для любой конфигурации кластера: master-master или " -"мастер-реплика." - -msgid "" -"Upgrade Tarantool at all replicas (or at any master in a master-master " -"cluster). See details in :ref:`Upgrading a Tarantool instance `." -msgstr "" -"Обновите Tarantool на всех репликах (или на любом мастере в кластере мастер-" -"мастер). Подробные инструкции доступны в подразделе :ref:`Обновление " -"экземпляра Tarantool `." - -msgid "Verify installation on the replicas:" -msgstr "Проверьте работу реплик:" - -msgid "Start Tarantool." -msgstr "Запустите Tarantool." - -msgid "Attach to the master and start working as before." -msgstr "Присоединитесь к мастеру и начните работать, как раньше." - -msgid "" -"The master runs the old Tarantool version, which is always compatible with " -"the next major version." -msgstr "" -"На мастере установлена старая версия Tarantool, которая всегда совместима " -"со следующей мажорной версией." - -msgid "Upgrade the master. The procedure is similar to upgrading a replica." -msgstr "Обновите мастер. Процесс такой же, как и при обновлении реплики." - -msgid "Verify master installation:" -msgstr "Проверьте работу мастера:" - -msgid "Start Tarantool with replica configuration to catch up." -msgstr "" -"Запустите Tarantool в режиме реплики для получения последней версии данных." - -msgid "Switch to master mode." -msgstr "Переключитесь в режим мастера." - -msgid "" -"Upgrade the database on any master node in the cluster. Make the request " -"``box.schema.upgrade()``. This updates Tarantool system spaces to match the " -"currently installed version of Tarantool. Changes are propagated to other " -"nodes via the regular replication mechanism." -msgstr "" -"Обновите базу данных на любом мастере в кластере. Выполните команду " -"``box.schema.upgrade()``. Это обновит системные спейсы Tarantool так, " -"чтобы они совпадали с текущей установленной версией Tarantool. Изменения " -"распространятся на другие узлы кластера через обычный механизм репликации." +#~ msgid "Upgrading a Tarantool database" +#~ msgstr "Обновление базы данных Tarantool" + +#~ msgid "" +#~ "If you created a database with an older Tarantool version and have now " +#~ "installed a newer version, make the request ``box.schema.upgrade()``. This " +#~ "updates Tarantool system spaces to match the currently installed version of " +#~ "Tarantool." +#~ msgstr "" +#~ "Если вы создали базу данных в старой версии Tarantool, а потом обновили " +#~ "Tarantool до более свежей версии, вызовите команду ``box.schema.upgrade()``." +#~ " Она обновляет системные спейсы Tarantool так, чтобы они совпадали с " +#~ "текущей установленной версией Tarantool." + +#~ msgid "" +#~ "For example, here is what happens when you run ``box.schema.upgrade()`` with" +#~ " a database created with Tarantool version 1.6.4 to version 1.7.2 (only a " +#~ "small part of the output is shown):" +#~ msgstr "" +#~ "Например, вот что происходит, если выполнить команду " +#~ "``box.schema.upgrade()`` для базы данных, созданной в Tarantool версии 1.6.4" +#~ " (показана лишь малая часть выводимых сообщений):" + +#~ msgid "" +#~ "tarantool> box.schema.upgrade()\n" +#~ "alter index primary on _space set options to {\"unique\":true}, parts to [[0,\"unsigned\"]]\n" +#~ "alter space _schema set options to {}\n" +#~ "create view _vindex...\n" +#~ "grant read access to 'public' role for _vindex view\n" +#~ "set schema version to 1.7.0\n" +#~ "---\n" +#~ "..." +#~ msgstr "" +#~ "tarantool> box.schema.upgrade()\n" +#~ "alter index primary on _space set options to {\"unique\":true}, parts to [[0,\"unsigned\"]]\n" +#~ "alter space _schema set options to {}\n" +#~ "create view _vindex...\n" +#~ "grant read access to 'public' role for _vindex view\n" +#~ "set schema version to 1.7.0\n" +#~ "---\n" +#~ "..." + +#~ msgid "Upgrading Tarantool on a single instance" +#~ msgstr "Обновление одиночного экземпляра Tarantool" + +#~ msgid "" +#~ "Tarantool is backward compatible between two adjacent versions. For example," +#~ " you should have no or little trouble when upgrading from Tarantool 1.6 to " +#~ "1.7, or from Tarantool 1.7 to 2.x. Meanwhile Tarantool 2.x may have " +#~ "incompatible changes when migrating from Tarantool 1.6. to 2.x directly." +#~ msgstr "" +#~ "Tarantool поддерживает обратную совместимость между двумя последовательными " +#~ "версиями. Например, обновление Tarantool 1.6 до 1.7 или Tarantool 1.7 до " +#~ "2.x не должно вызвать затруднений, тогда как миграции с Tarantool 1.6 сразу" +#~ " на 2.x могут препятствовать несовместимые изменения." + +#~ msgid "How to upgrade from Tarantool 1.7 to 2.x" +#~ msgstr "Как обновить Tarantool 1.7 до 2.x" + +#~ msgid "Stop the Tarantool server." +#~ msgstr "Остановите Tarantool-сервер." + +#~ msgid "" +#~ "Make a copy of all data (see an appropriate hot backup procedure in " +#~ ":ref:`Backups `) and the package from which the current (old)" +#~ " version was installed (for rollback purposes)." +#~ msgstr "" +#~ "Создайте копию всех данных (см. подразделы про горячее резервное копирование" +#~ " в разделе :ref:`Резервное копирование `) и пакета, из " +#~ "которого была установлена текущая (старая) версия (на случай отката)." + +#~ msgid "" +#~ "Update the Tarantool server. See installation instructions at Tarantool " +#~ "`download page `_." +#~ msgstr "" +#~ "Обновите Tarantool-сервер. Инструкции по установке доступны на `странице " +#~ "загрузок Tarantool `_." + +#~ msgid "" +#~ "Launch the updated Tarantool server using ``tarantoolctl``, ``tt``, or " +#~ "``systemctl``." +#~ msgstr "" +#~ "Запустите обновленный Tarantool-сервер с помощью ``tarantoolctl``, ``tt`` " +#~ "или ``systemctl``." + +#~ msgid "How to upgrade from Tarantool 1.6 to 2.x" +#~ msgstr "Как обновить Tarantool 1.6 до 2.x" + +#~ msgid "" +#~ "The procedure is fully analogous to :ref:`upgrading from 1.7 to 2.x `." +#~ msgstr "" +#~ "Обновление выполняется аналогично :ref:`обновлению с 1.7 на 2.x `." + +#~ msgid "How to upgrade from Tarantool 1.6 to 1.7" +#~ msgstr "Как обновить Tarantool 1.6 до 1.7" + +#~ msgid "" +#~ "This procedure is for upgrading a standalone Tarantool instance in " +#~ "production from 1.6.x to 1.7.x. Notice that this will **always imply a " +#~ "downtime**. To upgrade **without downtime**, you need several Tarantool " +#~ "servers running in a replication cluster (see :ref:`below `)." +#~ msgstr "" +#~ "Этот процесс предназначен для обновления индивидуальных экземпляров " +#~ "Tarantool с 1.6.х до 1.7.х на боевом сервере. Обратите внимание, что это " +#~ "**всегда приводит к некоторому простою**. Для обновления **без простоев** " +#~ "необходимо, чтобы несколько работающих Tarantool-серверов были объединены в " +#~ "репликационный кластер (см. :ref:`ниже `)." + +#~ msgid "" +#~ "Tarantool 1.7 has an incompatible :ref:`.snap ` and " +#~ ":ref:`.xlog ` file format: 1.6 files are supported during " +#~ "upgrade, but you won’t be able to return to 1.6 after running under 1.7 for " +#~ "a while. It also renames a few configuration parameters, but old parameters " +#~ "are supported. The full list of breaking changes is available in `release " +#~ "notes for Tarantool 1.7 `_." +#~ msgstr "" +#~ "Tarantool 1.7 работает с несовместимыми форматами файлов -- :ref:`.snap " +#~ "` и :ref:`.xlog `. Файлы Tarantool 1.6 " +#~ "поддерживаются при обновлении, но после непродолжительного использования " +#~ "Tarantool 1.7 вернуться к 1.6 уже нельзя. Также были переименованы некоторые" +#~ " конфигурационные параметры, но старые параметры еще поддерживаются. Список " +#~ "критических изменений доступен в `Примечаниях к версиям Tarantool 1.7 " +#~ "`_." + +#~ msgid "" +#~ "Check with application developers whether application files need to be " +#~ "updated due to incompatible changes (see `1.7 release notes " +#~ "`_). If yes, back up the " +#~ "old application files." +#~ msgstr "" +#~ "Уточните у разработчиков, необходимо ли обновлять файлы приложения из-за " +#~ "наличия несовместимых изменений (см. `Примечания к версии Tarantool 1.7 " +#~ "`_). Если да, то создайте " +#~ "резервные копии старых файлов приложения." + +#~ msgid "" +#~ "You can also put the request ``box.schema.upgrade()`` inside a " +#~ ":doc:`box.once() ` function in your " +#~ "Tarantool :ref:`initialization file `. On startup, this " +#~ "will create new system spaces, update data type names (e.g. num -> unsigned," +#~ " str -> string) and options in Tarantool system spaces." +#~ msgstr "" +#~ "Выполнить команду ``box.schema.upgrade()`` также можно, поместив ее внутрь " +#~ "функции :doc:`box.once() ` в :ref:`файле " +#~ "инициализации ` Tarantool. В результате на этапе запуска " +#~ "Tarantool создаст новые системные спейсы, обновит названия типов данных " +#~ "(например, ``num`` -> ``unsigned``, ``str`` -> ``string``) и список " +#~ "доступных типов данных в системных спейсах." + +#~ msgid "Update your application files, if needed." +#~ msgstr "При необходимости обновите файлы приложения." + +#~ msgid "Upgrading Tarantool in a replication cluster" +#~ msgstr "Обновление Tarantool в репликационном кластере" + +#~ msgid "" +#~ "Tarantool 1.7 can work as a :ref:`replica ` for " +#~ "Tarantool 1.6 and vice versa. Replicas perform capability negotiation on " +#~ "handshake, and new 1.7 replication features are not used with 1.6 replicas. " +#~ "This allows upgrading clustered configurations." +#~ msgstr "" +#~ "Tarantool 1.7 может служить :ref:`репликой ` для " +#~ "Tarantool 1.6 -- и наоборот. При установке соединения происходит обсуждение " +#~ "возможностей, и новые для 1.7 репликационные функции не используются при " +#~ "работе с репликами версии 1.6. Такой подход позволяет обновлять кластерные " +#~ "конфигурации." + +#~ msgid "" +#~ "This procedure allows for a rolling upgrade **without downtime** and works " +#~ "for any cluster configuration: master-master or master-replica." +#~ msgstr "" +#~ "Этот процесс позволяет осуществить последовательное обновление **без " +#~ "простоев** и подходит для любой конфигурации кластера: master-master или " +#~ "мастер-реплика." + +#~ msgid "" +#~ "Upgrade Tarantool at all replicas (or at any master in a master-master " +#~ "cluster). See details in :ref:`Upgrading a Tarantool instance `." +#~ msgstr "" +#~ "Обновите Tarantool на всех репликах (или на любом мастере в кластере мастер-" +#~ "мастер). Подробные инструкции доступны в подразделе :ref:`Обновление " +#~ "экземпляра Tarantool `." + +#~ msgid "Verify installation on the replicas:" +#~ msgstr "Проверьте работу реплик:" + +#~ msgid "Start Tarantool." +#~ msgstr "Запустите Tarantool." + +#~ msgid "Attach to the master and start working as before." +#~ msgstr "Присоединитесь к мастеру и начните работать, как раньше." + +#~ msgid "" +#~ "The master runs the old Tarantool version, which is always compatible with " +#~ "the next major version." +#~ msgstr "" +#~ "На мастере установлена старая версия Tarantool, которая всегда совместима со" +#~ " следующей мажорной версией." + +#~ msgid "Upgrade the master. The procedure is similar to upgrading a replica." +#~ msgstr "Обновите мастер. Процесс такой же, как и при обновлении реплики." + +#~ msgid "Verify master installation:" +#~ msgstr "Проверьте работу мастера:" + +#~ msgid "Start Tarantool with replica configuration to catch up." +#~ msgstr "" +#~ "Запустите Tarantool в режиме реплики для получения последней версии данных." + +#~ msgid "Switch to master mode." +#~ msgstr "Переключитесь в режим мастера." + +#~ msgid "" +#~ "Upgrade the database on any master node in the cluster. Make the request " +#~ "``box.schema.upgrade()``. This updates Tarantool system spaces to match the " +#~ "currently installed version of Tarantool. Changes are propagated to other " +#~ "nodes via the regular replication mechanism." +#~ msgstr "" +#~ "Обновите базу данных на любом мастере в кластере. Выполните команду " +#~ "``box.schema.upgrade()``. Это обновит системные спейсы Tarantool так, чтобы " +#~ "они совпадали с текущей установленной версией Tarantool. Изменения " +#~ "распространятся на другие узлы кластера через обычный механизм репликации." diff --git a/locale/ru/LC_MESSAGES/book/admin/upgrades/1.6-1.10.po b/locale/ru/LC_MESSAGES/book/admin/upgrades/1.6-1.10.po new file mode 100644 index 0000000000..1cc454618b --- /dev/null +++ b/locale/ru/LC_MESSAGES/book/admin/upgrades/1.6-1.10.po @@ -0,0 +1,143 @@ + +msgid "Live upgrade from Tarantool 1.6 to 1.10" +msgstr "" + +msgid "" +"This page includes explanations and solutions to some common issues when " +"upgrading a replica set from Tarantool 1.6 to 1.10." +msgstr "" + +msgid "" +"Versions later that 1.6 have incompatible :ref:`.snap ` " +"and :ref:`.xlog ` file formats: 1.6 files are supported " +"during upgrade, but you won’t be able to return to 1.6 after running under " +"1.10 or 2.x for a while. A few configuration parameters are also renamed." +msgstr "" + +msgid "" +"To perform a **live** upgrade from Tarantool 1.6 to a more recent version, " +"like :doc:`2.8.4 `, :doc:`2.10.1 ` and " +"such, it is necessary to take an intermediate step by upgrading 1.6 -> " +"**1.10** -> 2.x. This is the only way to perform the upgrade **without " +"downtime**." +msgstr "" + +msgid "" +"However, a direct upgrade of a replica set from 1.6 to 2.x is also possible," +" but only **with downtime**." +msgstr "" + +msgid "" +"The procedure of live upgrade from 1.6 to 1.10 is similar to the general " +":ref:`cluster upgrade procedure `, but " +"with slight differences in the :ref:`Upgrading storages ` step. Find below the general storage upgrade procedure " +"and the 1.6-specific notes for its steps." +msgstr "" + +msgid "General storage upgrade" +msgstr "" + +msgid "" +"Upgrade storage instances by performing the following steps for each replica" +" set:" +msgstr "" + +msgid "" +"To detect possible upgrade issues early, we recommend that you perform a " +":ref:`replication check ` on all instances" +" of the replica set **after each step**." +msgstr "" + +msgid "" +"Pick a replica (a **read-only** instance) from the replica set. Stop this " +"replica and start it again on the target Tarantool version. Wait until it " +"reaches the ``running`` status (``box.info.status == running``)." +msgstr "" + +msgid "" +"Restart all other **read-only** instances of the replica set on the target " +"version one by one." +msgstr "" + +msgid "" +"Make one of the updated replicas the new master using the applicable " +"instruction from :ref:`Switching the master `." +msgstr "" + +msgid "" +"Restart the last instance of the replica set (the former master, now a " +"replica) on the target version." +msgstr "" + +msgid "" +"Run :ref:`box.schema.upgrade() ` on the new master. This" +" will update the Tarantool system spaces to match the currently installed " +"version of Tarantool. The changes will be propagated to other nodes via the " +"replication mechanism later." +msgstr "" + +msgid "" +"Run ``box.snapshot()`` on every node in the replica set to make sure that " +"the replicas immediately see the upgraded database state in case of restart." +msgstr "" + +msgid "1.6 storage upgrade specifics" +msgstr "" + +msgid "" +"**Replication check:** New Tarantool nodes follow 1.6 nodes just fine, but " +"some 1.6 nodes might disconnect from new nodes with an ER_LOADING error. " +"This is not critical, the error goes away when replication on 1.6 is " +"restarted:" +msgstr "" + +msgid "" +"old_repl = box.cfg.replication\n" +"box.cfg{replication = \"\"}\n" +"box.cfg{replication = old_repl}" +msgstr "" + +msgid "" +"**Point of no return:** When upgrading from Tarantool 1.6, the step 3 " +"(switching the master) is the point of no return. Оnce you complete it, " +"**the schema is no longer compatible with the initial version**." +msgstr "" + +msgid "" +"**Restarting on the target version (steps 1, 2, and 4):** Tarantool 1.10+ " +"fails to recover from 1.6 xlogs, unless ``box.cfg{force_recovery = true}`` " +"is set. There is a slight difference between 1.6 and 1.10 xlogs, which makes" +" 1.6 xlogs appear erroneous to 1.10+ instances. In order to work around " +"this, start the instance in ``force_recovery`` mode. To do so, add the line " +"``force_recovery = true`` to the file where the instance is initialized -- " +"for example, to ``init.lua``." +msgstr "" + +msgid "" +"**Running box.schema.upgrade() (step 5):** There was a breaking change " +"between 1.6 and 1.10 -- in 1.6, the field type ``num`` was an alias to " +"``number``, and in 1.10, ``num`` is converted to ``unsigned``. This means " +"that after ``box.schema.upgrade()`` is performed on the master, the user " +"might have some spaces with ``unsigned`` fields containing non-unsigned " +"values: ``double``, ``int``, and so on. This will make the snapshot " +"inconsistent, unless an extra action is performed after " +"``box.schema.upgrade()``. Run this code in the Tarantool console on the new " +"master:" +msgstr "" + +msgid "" +"-- First find all spaces containing unsigned fields with non-unsigned values in them.\n" +"-- Say, we have one such space denoted problematic_space and the problem is in field problematic_field_no.\n" +"a = box.space.problematic_space:format()\n" +"a[problematic_field_no].type = 'number'\n" +"box.space.problematic_space:format(a)" +msgstr "" + +msgid "" +"**Taking snapshots (step 6):** The user might be concerned with snapshot " +"size in 1.10 -- it's drastically smaller than the one created by 1.6 (for " +"example, ~300 Mb vs. 6 Gb in some corner cases). There is nothing to worry " +"about. Tarantool 1.6 didn't compress snapshots, while Tarantool 1.10 and " +"above does that." +msgstr "" diff --git a/locale/ru/LC_MESSAGES/book/admin/upgrades/1.6-2.0-downtime.po b/locale/ru/LC_MESSAGES/book/admin/upgrades/1.6-2.0-downtime.po new file mode 100644 index 0000000000..56b23d681f --- /dev/null +++ b/locale/ru/LC_MESSAGES/book/admin/upgrades/1.6-2.0-downtime.po @@ -0,0 +1,46 @@ + +msgid "Upgrade from 1.6 directly to 2.x with downtime" +msgstr "" + +msgid "" +"Versions later that 1.6 have incompatible :ref:`.snap ` " +"and :ref:`.xlog ` file formats: 1.6 files are supported " +"during upgrade, but you won’t be able to return to 1.6 after running under " +"1.10 or 2.x for a while. A few configuration parameters are also renamed." +msgstr "" + +msgid "" +"To perform a **live** upgrade from Tarantool 1.6 to a more recent version, " +"like :doc:`2.8.4 `, :doc:`2.10.1 ` and " +"such, it is necessary to take an intermediate step by upgrading 1.6 -> " +"**1.10** -> 2.x. This is the only way to perform the upgrade **without " +"downtime**." +msgstr "" + +msgid "" +"However, a direct upgrade of a replica set from 1.6 to 2.x is also possible," +" but only **with downtime**." +msgstr "" + +msgid "Here is how to upgrade from Tarantool 1.6 directly to 2.x:" +msgstr "" + +msgid "Stop all instances in the replica set." +msgstr "" + +msgid "" +":ref:`Upgrade ` Tarantool version to 2.x on every " +"instance." +msgstr "" + +msgid "Upgrade the corresponding instance files and applications, if needed." +msgstr "" + +msgid "Start all the instances with Tarantool 2.x." +msgstr "" + +msgid "Execute ``box.schema.upgrade()`` on the master." +msgstr "" + +msgid "Execute ``box.snapshot()`` on every node in the replica set." +msgstr "" diff --git a/locale/ru/LC_MESSAGES/book/admin/upgrades/2.10.1.po b/locale/ru/LC_MESSAGES/book/admin/upgrades/2.10.1.po new file mode 100644 index 0000000000..170dc7bd2f --- /dev/null +++ b/locale/ru/LC_MESSAGES/book/admin/upgrades/2.10.1.po @@ -0,0 +1,167 @@ + +msgid "Fix decimal values in vinyl spaces when upgrading to 2.10.1" +msgstr "" + +msgid "" +"This is an upgrade guide for fixing one specific problem which could happen " +"with decimal values in vinyl spaces. It's only relevant when you're " +"upgrading from Tarantool version <= 2.10.0 to anything >= 2.10.1." +msgstr "" + +msgid "" +"Before :tarantool-issue:`6377` was fixed, ``decimal`` and ``double`` values " +"in a ``scalar`` or ``number`` index could end up in the wrong order after " +"the update. If such an index has been built for a space that uses the " +"``vinyl`` storage engine, the index is persisted and is not rebuilt even " +"after the upgrade. If this is the case, the user has to rebuild the affected" +" indexes manually." +msgstr "" + +msgid "" +"Here are the rules to determine whether your installation was affected. If " +"all of the statements listed below are true, you have to rebuild indexes for" +" the affected ``vinyl`` spaces manually." +msgstr "" + +msgid "You were running Tarantool version 2.10.0 and below." +msgstr "" + +msgid "You have spaces with the ``vinyl`` storage engine." +msgstr "" + +msgid "The ``vinyl`` spaces have ``number`` or ``scalar`` indexes." +msgstr "" + +msgid "" +"The tuples in these spaces may contain both ``decimal`` and ``double`` " +"``Inf`` or ``NaN`` values." +msgstr "" + +msgid "" +"If this is the case for you, you can run the following script, which will " +"find all the affected indices:" +msgstr "" + +msgid "" +"local fiber = require('fiber')\n" +"local decimal = require('decimal')\n" +"\n" +"local function isnan(val)\n" +" return type(val) == 'number' and val ~= val\n" +"end\n" +"\n" +"local function isinf(val)\n" +" return val == math.huge or val == -math.huge\n" +"end\n" +"\n" +"local function vinyl(id)\n" +" return box.space[id].engine == 'vinyl'\n" +"end\n" +"\n" +"require_rebuild = {}\n" +"local iters = 0\n" +"for _, v in box.space._index:pairs({512, 0}, {iterator='GE'}) do\n" +" local id = v[1]\n" +" iters = iters + 1\n" +" if iters % 1000 == 0 then\n" +" fiber.yield()\n" +" end\n" +" if vinyl(id) then\n" +" local format = v[6]\n" +" local check_fields = {}\n" +" for _, fmt in pairs(v[6]) do\n" +" if fmt[2] == 'number' or fmt[2] == 'scalar' then\n" +" table.insert(check_fields, fmt[1] + 1)\n" +" end\n" +" end\n" +" local have_decimal = {}\n" +" local have_nan = {}\n" +" if #check_fields > 0 then\n" +" for k, tuple in box.space[id]:pairs() do\n" +" for _, i in pairs(check_fields) do\n" +" iters = iters + 1\n" +" if iters % 1000 == 0 then\n" +" fiber.yield()\n" +" end\n" +" have_decimal[i] = have_decimal[i] or\n" +" decimal.is_decimal(tuple[i])\n" +" have_nan[i] = have_nan[i] or isnan(tuple[i]) or\n" +" isinf(tuple[i])\n" +" if have_decimal[i] and have_nan[i] then\n" +" table.insert(require_rebuild, v)\n" +" goto out\n" +" end\n" +" end\n" +" end\n" +" end\n" +" end\n" +" ::out::\n" +"end\n" +msgstr "" + +msgid "" +"The indices requiring a rebuild will be stored in the ``require_rebuild`` " +"table. If the table is empty, you're safe and can continue using Tarantool " +"as before." +msgstr "" + +msgid "" +"If the ``require_rebuild`` table contains some entries, you can rebuild the " +"affected indices with the following script." +msgstr "" + +msgid "" +"Please run the script below only on the master node and only after all the " +"nodes are upgraded to the new Tarantool version." +msgstr "" + +#, python-format +msgid "" +"local log = require('log')\n" +"\n" +"local function rebuild_index(idx)\n" +" local index_name = idx[3]\n" +" local space_name = box.space[idx[1]].name\n" +" log.info(\"Rebuilding index %s on space %s\", index_name, space_name)\n" +" if (idx[2] == 0) then\n" +" log.error(\"Cannot rebuild primary index %s on space %s. Please, \"..\n" +" \"recreate the space manually\", index_name, space_name)\n" +" return\n" +" end\n" +" log.info(\"Deleting index %s on space %s\", index_name, space_name)\n" +" local v = box.space._index:delete{idx[1], idx[2]}\n" +" if v == nil then\n" +" log.error(\"Couldn't find index %s on space %s\", index_name, space_name)\n" +" return\n" +" end\n" +" log.info(\"Done\")\n" +" log.info(\"Creating index %s on space %s\", index_name, space_name)\n" +" box.space._index:insert(v)\n" +"end\n" +"\n" +"for _, idx in pairs(require_rebuild) do\n" +" rebuild_index(idx)\n" +"end\n" +msgstr "" + +msgid "" +"The script might fail on some of the indices with the following error: " +"\"Cannot rebuild primary index index_name on space space_name. Please, " +"recreate the space manually\". If this happens, automatic index rebuild is " +"impossible, and you have to manually re-create the space to ensure data " +"integrity:" +msgstr "" + +msgid "Create a new space with the same format as the existing one." +msgstr "" + +msgid "Define the same indices on the freshly created space." +msgstr "" + +msgid "" +"Iterate over the old space's primary key and insert all the data into the " +"new space." +msgstr "" + +msgid "Drop the old space." +msgstr "" diff --git a/locale/ru/LC_MESSAGES/book/admin/upgrades/2.10.4.po b/locale/ru/LC_MESSAGES/book/admin/upgrades/2.10.4.po new file mode 100644 index 0000000000..47c632bcab --- /dev/null +++ b/locale/ru/LC_MESSAGES/book/admin/upgrades/2.10.4.po @@ -0,0 +1,200 @@ + +msgid "Fix illegal type names when upgrading to 2.10.4" +msgstr "" + +msgid "" +"This is an upgrade guide for fixing one specific problem which could happen " +"with field type names. It's only relevant when you're upgrading from a " +"Tarantool version <=2.10.3 to >=2.10.4." +msgstr "" + +msgid "" +"Before :tarantool-issue:`5940` was fixed, the empty string, ``n``, ``nu``, " +"``s``, and ``st`` (that is, leading parts of ``num`` and ``str``) were " +"accepted as valid field types. Since 2.10.4, Tarantool doesn't accept these " +"strings and they must be replaced with correct values ``num`` and ``str``." +msgstr "" + +msgid "" +"This instruction is also available on `GitHub " +"`__." +msgstr "" + +msgid "Check if your snapshots contain illegal type names" +msgstr "" + +msgid "" +"A snapshot can be validated against the issue using the following script:" +msgstr "" + +#, python-format +msgid "" +"#!/usr/bin/env tarantool\n" +"\n" +"local xlog = require('xlog')\n" +"local json = require('json')\n" +"\n" +"if arg[1] == nil then\n" +" print(('Usage: %s xxxxxxxxxxxxxxxxxxxx.snap'):format(arg[0]))\n" +" os.exit(1)\n" +"end\n" +"\n" +"local illegal_types = {\n" +" [''] = true,\n" +" ['n'] = true,\n" +" ['nu'] = true,\n" +" ['s'] = true,\n" +" ['st'] = true,\n" +"}\n" +"\n" +"local function report_field_def(name, field_def)\n" +" local msg = 'A field def in a _space entry %q contains an illegal type: %s'\n" +" print(msg:format(name, json.encode(field_def)))\n" +"end\n" +"\n" +"local has_broken_format = false\n" +"\n" +"for _, record in xlog.pairs(arg[1]) do\n" +" -- Filter inserts.\n" +" if record.HEADER == nil or record.HEADER.type ~= 'INSERT' then\n" +" goto continue\n" +" end\n" +" -- Filter _space records.\n" +" if record.BODY == nil or record.BODY.space_id ~= 280 then\n" +" goto continue\n" +" end\n" +"\n" +" local tuple = record.BODY.tuple\n" +" local name = tuple[3]\n" +" local format = tuple[7]\n" +"\n" +" local is_format_broken = false\n" +" for _, field_def in ipairs(format) do\n" +" if illegal_types[field_def.type] ~= nil then\n" +" report_field_def(name, field_def)\n" +" is_format_broken = true\n" +" end\n" +"\n" +" if illegal_types[field_def[2]] ~= nil then\n" +" report_field_def(name, field_def)\n" +" is_format_broken = true\n" +" end\n" +"\n" +" end\n" +"\n" +" if is_format_broken then\n" +" has_broken_format = true\n" +" local msg = 'The following _space entry contains illegal type(s): %s'\n" +" print(msg:format(json.encode(record)))\n" +" end\n" +" ::continue::\n" +"end\n" +"\n" +"if has_broken_format then\n" +" print('')\n" +" print(('%s has an illegal type in a space format'):format(arg[1]))\n" +" print('It is recommended to proceed with the upgrade instruction:')\n" +" print('https://github.com/tarantool/tarantool/wiki/Fix-illegal-field-type-in-a-space-format-when-upgrading-to-2.10.4')\n" +"else\n" +" print('Everything looks nice!')\n" +"end\n" +"\n" +"os.exit(has_broken_format and 2 or 0)" +msgstr "" + +msgid "" +"If the snapshot contains the values that aren't valid in 2.10.4, you'll get " +"an output like the following:" +msgstr "" + +msgid "Fix an application file" +msgstr "" + +msgid "" +"To fix the application file that contains illegal type names, add the " +"following code in it **before** the " +"``box.cfg()``/``vshard.cfg()``/``cartridge.cfg()`` call." +msgstr "" + +msgid "In Cartridge applications, the instance file is called ``init.lua``." +msgstr "" + +#, python-format +msgid "" +"-- Convert illegal type names in a space format that were\n" +"-- allowed before tarantool 2.10.4.\n" +"\n" +"local log = require('log')\n" +"local json = require('json')\n" +"\n" +"local transforms = {\n" +" [''] = 'num',\n" +" ['n'] = 'num',\n" +" ['nu'] = 'num',\n" +" ['s'] = 'str',\n" +" ['st'] = 'str',\n" +"}\n" +"\n" +"-- The helper for before_replace().\n" +"local function transform_field_def(name, field_def, field, new_type)\n" +" local field_def_old_str = json.encode(field_def)\n" +" field_def[field] = new_type\n" +" local field_def_new_str = json.encode(field_def)\n" +"\n" +" local msg = 'Transform a field def in a _space entry %q: %s -> %s'\n" +" log.info(msg:format(name, field_def_old_str, field_def_new_str))\n" +"end\n" +"\n" +"-- _space trigger.\n" +"local function before_replace(_, tuple)\n" +" if tuple == nil then return tuple end\n" +"\n" +" local name = tuple[3]\n" +" local format = tuple[7]\n" +"\n" +" -- Update format if necessary.\n" +" local is_format_changed = false\n" +" for i, field_def in ipairs(format) do\n" +" local new_type = transforms[field_def.type]\n" +" if new_type ~= nil then\n" +" transform_field_def(name, field_def, 'type', new_type)\n" +" is_format_changed = true\n" +" end\n" +"\n" +" local new_type = transforms[field_def[2]]\n" +" if new_type ~= nil then\n" +" transform_field_def(name, field_def, 2, new_type)\n" +" is_format_changed = true\n" +" end\n" +" end\n" +"\n" +" -- No changed: skip.\n" +" if not is_format_changed then return tuple end\n" +"\n" +" -- Rebuild the tuple.\n" +" local new_tuple = tuple:transform(7, 1, format)\n" +" log.info(('Transformed _space entry %s to %s'):format(\n" +" json.encode(tuple), json.encode(new_tuple)))\n" +" return new_tuple\n" +"end\n" +"\n" +"-- on_schema_init trigger to set before_replace().\n" +"local function on_schema_init()\n" +" box.space._space:before_replace(before_replace)\n" +"end\n" +"\n" +"-- Set the trigger on _space.\n" +"box.ctl.on_schema_init(on_schema_init)" +msgstr "" + +msgid "" +"You can delete these triggers **after** the " +"``box.cfg()``/``vshard.cfg()``/``cartridge.cfg()`` call." +msgstr "" + +msgid "An example for a Cartridge application:" +msgstr "" + +msgid "The triggers will report the changes the make in the following form:" +msgstr "" diff --git a/locale/ru/LC_MESSAGES/book/admin/upgrades/2.11.0.po b/locale/ru/LC_MESSAGES/book/admin/upgrades/2.11.0.po new file mode 100644 index 0000000000..1459abd3d6 --- /dev/null +++ b/locale/ru/LC_MESSAGES/book/admin/upgrades/2.11.0.po @@ -0,0 +1,56 @@ + +msgid "Recover from WALs with mixed transactions when upgrading to 2.11.0" +msgstr "" + +msgid "" +"This is a guide on fixing a specific problem that could happen when " +"upgrading from a Tarantool version between 2.1.2 and 2.2.0 to 2.8.1 or " +"later. The described solution is applicable since version 2.11.0." +msgstr "" + +msgid "" +"The problem is described in the issue :tarantool-issue:`7932`. If two or " +"more transactions happened simultaneously in Tarantool 2.1.2-2.2.0, their " +"operations could be written to the write-ahead log mixed with each other. " +"Starting from version 2.8.1, Tarantool recovers transactions atomically and " +"expects all WAL entries between a transaction's ``begin`` and ``commit`` " +"operations to belong to one transaction. If there is an operation belonging " +"to another transaction, Tarantool fails to recover from such a WAL." +msgstr "" + +msgid "" +"Starting from version :doc:`2.11.0 `, Tarantool can recover" +" from WALs with mixed transactions in the ``force_recovery`` mode." +msgstr "" + +msgid "Instances fail to start" +msgstr "" + +msgid "" +"If all instances or some of them fail to start after upgrading to 2.11 or a " +"newer version due to a recovery error:" +msgstr "" + +msgid "" +"Start these instances with the :ref:`force_recovery " +"` option to ``true``." +msgstr "" + +msgid "" +"Make new snapshots on the instances so that the old WALs with mixed " +"transactions aren't used for recovery anymore. To do this, call " +":ref:`box.snapshot() `." +msgstr "" + +msgid "Set ``force_recovery`` back to ``false``." +msgstr "" + +msgid "Replication doesn't work" +msgstr "" + +msgid "" +"After all the instances start successfully, WALs with mixed transactions may" +" still lead to replication issues. Some instances may fail to replicate from" +" other instances because they are sending incorrect WALs. To fix the " +"replication issues, rebootstrap the instances that fail to replicate." +msgstr "" diff --git a/locale/ru/LC_MESSAGES/book/admin/upgrades/upgrade_cluster.po b/locale/ru/LC_MESSAGES/book/admin/upgrades/upgrade_cluster.po new file mode 100644 index 0000000000..b2ff5186be --- /dev/null +++ b/locale/ru/LC_MESSAGES/book/admin/upgrades/upgrade_cluster.po @@ -0,0 +1,547 @@ + +msgid "Replication cluster upgrade" +msgstr "" + +msgid "" +"Below are the general instructions for upgrading a Tarantool cluster with " +"replication. Upgrading from some versions can involve certain specifics. To " +"find out if it is your case, check the version-specific topics of the " +":ref:`Upgrades ` section." +msgstr "" + +msgid "" +"A replication cluster can be upgraded without downtime due to its " +"redundancy. When you disconnect a single instance for an upgrade, there is " +"always another instance that takes over its functionality: being a master " +"storage for the same data buckets or working as a router. This way, you can " +"upgrade all the instances one by one." +msgstr "" + +msgid "The high-level steps of cluster upgrade are the following:" +msgstr "" + +msgid "" +":ref:`Ensure the application compatibility ` with the target Tarantool version." +msgstr "" + +msgid ":ref:`Check the cluster health `." +msgstr "" + +msgid "" +":ref:`Install the target Tarantool version `" +" on the cluster nodes." +msgstr "" + +msgid "" +":ref:`Upgrade router ` nodes one by one." +msgstr "" + +msgid "" +":ref:`Upgrade storage replica sets ` one by" +" one." +msgstr "" + +msgid "" +"The only way to upgrade Tarantool from version 1.6, 1.7, or 1.9 to 2.x " +"**without downtime** is to take an intermediate step by upgrading to 1.10 " +"and then to 2.x." +msgstr "" + +msgid "" +"Before upgrading Tarantool from 1.6 to 2.x, please read about the associated" +" :ref:`caveats `." +msgstr "" + +msgid "" +"Some upgrade steps are moved to the separate section :ref:`Procedures and " +"checks ` to avoid overloading the general" +" instruction with details. Typically, these are checks you should repeat " +"during the upgrade to ensure it goes well." +msgstr "" + +msgid "" +"If you experience issues during upgrade, you can roll back to the original " +"version. The rollback instructions are provided in the :ref:`Rollback " +"` section." +msgstr "" + +msgid "Checking your application" +msgstr "" + +msgid "" +"Before upgrading, make sure your application is compatible with the target " +"Tarantool version:" +msgstr "" + +msgid "" +"Set up a development environment with the target Tarantool version " +"installed. See the installation instructions at the Tarantool `download page" +" `_ and in the :ref:`tt install " +"reference `." +msgstr "" + +msgid "" +"Deploy the application in this environment and check how it works. In case " +"of any issues, adjust the application code to ensure compatibility with the " +"target version." +msgstr "" + +msgid "" +"When your application is ready to run on the target Tarantool version, you " +"can start upgrading the production environment." +msgstr "" + +msgid "Pre-upgrade checks" +msgstr "" + +msgid "" +"Perform these steps before the upgrade to ensure that your cluster is " +"working correctly:" +msgstr "" + +msgid "" +"On each ``router`` instance, perform the :ref:`vshard.router check `:" +msgstr "" + +msgid "" +"tarantool> vshard.router.info()\n" +"-- no issues in the output\n" +"-- sum of 'bucket.available_rw' == total number of buckets" +msgstr "" + +msgid "" +"On each ``storage`` instance, perform the :ref:`replication check `:" +msgstr "" + +msgid "" +"tarantool> box.info\n" +"-- box.info.status == 'running'\n" +"-- box.info.ro == 'false' on one instance in each replica set.\n" +"-- box.info.replication[*].upstream.status == 'follow'\n" +"-- box.info.replication[*].downstream.status == 'follow'\n" +"-- box.info.replication[*].upstream.lag <= box.cfg.replication_timeout\n" +"-- can also be moderately larger under a write load" +msgstr "" + +msgid "" +"On each ``storage`` instance, perform the :ref:`vshard.storage check `:" +msgstr "" + +msgid "" +"tarantool> vshard.storage.info()\n" +"-- no issues in the output\n" +"-- replication.status == 'follow'" +msgstr "" + +msgid "Check all instances' :ref:`logs ` for application errors." +msgstr "" + +msgid "" +"If you're running Cartridge, you can check the health of the cluster " +"instances on the **Cluster** tab of its web interface." +msgstr "" + +msgid "" +"In case of any issues, make sure to fix them before starting the upgrade " +"procedure." +msgstr "" + +msgid "Installing the target version" +msgstr "" + +msgid "" +"Install the target Tarantool version on all hosts of the cluster. You can do" +" this using a package manager or the :ref:`tt utility `. See the " +"installation instructions at the Tarantool `download page " +"`_ and in the :ref:`tt install reference" +" `." +msgstr "" + +msgid "" +"Check that the target Tarantool version is installed by running ``tarantool " +"-v`` on all hosts." +msgstr "" + +msgid "Upgrading a Tarantool cluster with no downtime" +msgstr "" + +msgid "Upgrading routers" +msgstr "" + +msgid "Upgrade **router** instances one by one:" +msgstr "" + +msgid "Stop one ``router`` instance." +msgstr "" + +msgid "Start this instance on the target Tarantool version." +msgstr "" + +msgid "Repeat the previous steps for each ``router`` instance." +msgstr "" + +msgid "" +"After completing the router instances upgrade, perform the " +":ref:`vshard.router check ` on each of them." +msgstr "" + +msgid "Upgrading storages" +msgstr "" + +msgid "Before upgrading **storage** instances:" +msgstr "" + +msgid "Disable Cartridge failover: run" +msgstr "" + +msgid "tt cartridge failover disable" +msgstr "" + +msgid "" +"or use the Cartridge web interface (**Cluster** tab, **Failover: ** " +"button)." +msgstr "" + +msgid "Disable the :ref:`rebalancer `: run" +msgstr "" + +msgid "tarantool> vshard.storage.rebalancer_disable()" +msgstr "" + +msgid "Make sure that the Cartridge ``upgrade_schema`` option is ``false``." +msgstr "" + +msgid "" +"Upgrade storage instances by performing the following steps for each replica" +" set:" +msgstr "" + +msgid "" +"To detect possible upgrade issues early, we recommend that you perform a " +":ref:`replication check ` on all instances" +" of the replica set **after each step**." +msgstr "" + +msgid "" +"Pick a replica (a **read-only** instance) from the replica set. Stop this " +"replica and start it again on the target Tarantool version. Wait until it " +"reaches the ``running`` status (``box.info.status == running``)." +msgstr "" + +msgid "" +"Restart all other **read-only** instances of the replica set on the target " +"version one by one." +msgstr "" + +msgid "" +"Make one of the updated replicas the new master using the applicable " +"instruction from :ref:`Switching the master `." +msgstr "" + +msgid "" +"Restart the last instance of the replica set (the former master, now a " +"replica) on the target version." +msgstr "" + +msgid "" +"Run :ref:`box.schema.upgrade() ` on the new master. This" +" will update the Tarantool system spaces to match the currently installed " +"version of Tarantool. The changes will be propagated to other nodes via the " +"replication mechanism later." +msgstr "" + +msgid "" +"This is the point of no return for upgrading from versions earlier than " +"2.8.2: once you complete it, the schema is no longer compatible with the " +"initial version." +msgstr "" + +msgid "" +"When upgrading from version 2.8.2 or newer, you can undo the schema upgrade " +"using :ref:`box.schema.downgrade() `." +msgstr "" + +msgid "" +"Run ``box.snapshot()`` on every node in the replica set to make sure that " +"the replicas immediately see the upgraded database state in case of restart." +msgstr "" + +msgid "Once you complete the steps, enable failover or rebalancer back:" +msgstr "" + +msgid "Enable Cartridge failover: run" +msgstr "" + +msgid "tt cartridge failover set [mode]" +msgstr "" + +msgid "" +"or use the Cartridge web interface (**Cluster** tab, **Failover: Disabled** " +"button)." +msgstr "" + +msgid "Enable the :ref:`rebalancer `: run" +msgstr "" + +msgid "tarantool> vshard.storage.rebalancer_enable()" +msgstr "" + +msgid "Post-upgrade checks" +msgstr "" + +msgid "" +"Perform these steps after the upgrade to ensure that your cluster is working" +" correctly:" +msgstr "" + +msgid "Rollback" +msgstr "" + +msgid "Rollback before the point of no return" +msgstr "" + +msgid "" +"If you decide to roll back before reaching the :ref:`point of no return " +"`, your data is fully compatible with the version " +"you had before the upgrade. In this case, you can roll back the same way: " +"restart the nodes you've already upgraded on the original version." +msgstr "" + +msgid "Rollback after the point of no return" +msgstr "" + +msgid "" +"If you've passed the :ref:`point of no return ` " +"(that is, executed ``box.schema.upgrade()``) during the upgrade, then a " +"rollback requires downgrading the schema to the original version." +msgstr "" + +msgid "" +"To check if an automatic downgrade is available for your original version, " +"use ``box.schema.downgrade_versions()``. If the version you need is on the " +"list, execute the following steps on **each upgraded replica set** to roll " +"back:" +msgstr "" + +msgid "" +"Run ``box.schema.downgrade()`` on master specifying the original " +"version." +msgstr "" + +msgid "" +"Run ``box.snapshot()`` on every instance in the replica set to make sure " +"that the replicas immediately see the downgraded database state after " +"restart." +msgstr "" + +msgid "" +"Restart all **read-only** instances of the replica set on the initial " +"version one by one." +msgstr "" + +msgid "" +"Restart the last instance of the replica set (the former master, now a " +"replica) on the original version." +msgstr "" + +msgid "" +"Then enable failover or rebalancer back as described in the :ref:`Upgrading " +"storages `." +msgstr "" + +msgid "Recovering from a failed upgrade" +msgstr "" + +msgid "" +"This section applies to cases when the upgrade procedure has failed and the " +"cluster is not functioning properly anymore. Thus, it implies a downtime and" +" a full cluster restart." +msgstr "" + +msgid "" +"In case of an upgrade failure after passing the :ref:`point of no return " +"`, follow these steps to roll back to the original" +" version:" +msgstr "" + +msgid "Stop all cluster instances." +msgstr "" + +msgid "" +"Save snapshot and ``xlog`` files from all instances whose data was modified " +"after the last backup procedure. These files will help apply these " +"modifications later." +msgstr "" + +msgid "Save the latest backups from all instances." +msgstr "" + +msgid "Restore the original Tarantool version on all hosts of the cluster." +msgstr "" + +msgid "Launch the cluster on the original Tarantool version." +msgstr "" + +msgid "" +"At this point, the application becomes fully functional and contains data " +"from the backups. However, the data modifications made after the backups " +"were taken must be restored manually." +msgstr "" + +msgid "" +"Manually apply the latest data modifications from ``xlog`` files you saved " +"on step 2 using the :ref:`xlog ` module. On instances where such " +"changes happened, do the following:" +msgstr "" + +msgid "Find out the vclock value of the latest operation in the original WAL." +msgstr "" + +msgid "" +"Play the operations from the newer xlog starting from this vclock on the " +"instance." +msgstr "" + +msgid "" +"If the upgrade has failed after calling ``box.schema.upgrade()``, **don't " +"apply** the modifications of system spaces done by this call. This can make " +"the schema incompatible with the original Tarantool version." +msgstr "" + +msgid "" +"Find more information about the Tarantool recovery in :ref:`Disaster " +"recovery `." +msgstr "" + +msgid "Procedures and checks" +msgstr "" + +msgid "Replication check" +msgstr "" + +msgid "Run ``box.info``:" +msgstr "" + +msgid "tarantool> box.info" +msgstr "" + +msgid "Check that the following conditions are satisfied:" +msgstr "" + +msgid "``box.info.status`` is ``running``" +msgstr "" + +msgid "" +"``box.info.replication[*].upstream.status`` and " +"``box.info.replication[*].downstream.status`` are ``follow``" +msgstr "" + +msgid "" +"``box.info.replication[*].upstream.lag`` is less or equal than " +"``box.cfg.replication_timeout``, but it can also be moderately larger under " +"a write load." +msgstr "" + +msgid "" +"``box.info.ro`` is ``false`` at least on one instance in **each** replica " +"set. If all instances have ``box.info.ro = true``, this means there are no " +"writable nodes. On Tarantool :doc:`v. 2.10.0 ` or later, " +"you can find out why this happened by running ``box.info.ro_reason``. If " +"``box.info.ro_reason`` or ``box.info.status`` has the value ``orphan``, the " +"instance doesn't see the rest of the replica set." +msgstr "" + +msgid "" +"Then run ``box.info`` once more and check that " +"``box.info.replication[*].upstream.lag`` values are updated." +msgstr "" + +msgid "vshard.storage check" +msgstr "" + +msgid "Run ``vshard.storage.info()``:" +msgstr "" + +msgid "tarantool> vshard.storage.info()" +msgstr "" + +msgid "there are no issues or alerts" +msgstr "" + +msgid "``replication.status`` is ``follow``" +msgstr "" + +msgid "vshard.router check" +msgstr "" + +msgid "Run ``vshard.router.info()``:" +msgstr "" + +msgid "tarantool> vshard.router.info()" +msgstr "" + +msgid "" +"all buckets are available (the sum of ``bucket.available_rw`` on all replica" +" sets equals the total number of buckets)" +msgstr "" + +msgid "Switching the master" +msgstr "" + +msgid "" +"**Cartridge**. If your cluster runs on Cartridge, you can switch the master " +"in the web interface. To do this, go to the **Cluster** tab, click **Edit " +"replica set**, and drag an instance to the top of **Failover priority** list" +" to make it the master." +msgstr "" + +msgid "" +"**Raft**. If your cluster uses :ref:`automated leader election " +"`, switch the master by following these steps:" +msgstr "" + +msgid "Pick a *candidate* -- a read-only instance to become the new master." +msgstr "" + +msgid "" +"Run ``box.ctl.promote()`` on the candidate. The operation will start and " +"wait for the election to happen." +msgstr "" + +msgid "Run `box.cfg{ election_mode = \"voter\" }` on the current master." +msgstr "" + +msgid "" +"Check that the candidate became the new master: its ``box.info.ro`` must be " +"``false``." +msgstr "" + +msgid "" +"**Legacy**. If your cluster neither works on Cartridge nor has automated " +"leader election, switch the master by following these steps:" +msgstr "" + +msgid "Run `box.cfg{ read_only = true }` on the current master." +msgstr "" + +msgid "" +"Check that the candidate's vclock value matches the master's: The value of " +"``box.info.vclock[]`` on the candidate must be equal to " +"``box.info.lsn`` on the master. ```` here is the value of " +"``box.info.id`` on the master." +msgstr "" + +msgid "" +"If the vclock values don't match, stop the switch procedure and restore the " +"replica set state by calling ``box.cfg{ read_only == false }`` on the " +"master. Then pick another candidate and restart the procedure." +msgstr "" + +msgid "" +"After switching the master, perform the :ref:`replication check ` on each instance of the replica set." +msgstr "" diff --git a/locale/ru/LC_MESSAGES/book/admin/upgrades/upgrade_standalone.po b/locale/ru/LC_MESSAGES/book/admin/upgrades/upgrade_standalone.po new file mode 100644 index 0000000000..be54d9821f --- /dev/null +++ b/locale/ru/LC_MESSAGES/book/admin/upgrades/upgrade_standalone.po @@ -0,0 +1,87 @@ + +msgid "Standalone instance upgrade" +msgstr "" + +msgid "" +"This page describes the process of upgrading a standalone Tarantool instance" +" in production. Note that this **always implies a downtime** because the " +"application needs to be stopped and restarted on the target version." +msgstr "" + +msgid "" +"To upgrade **without downtime**, you need multiple Tarantool servers running" +" in a replication cluster. Find detailed instructions in :ref:`Replication " +"cluster upgrade `." +msgstr "" + +msgid "Checking your application" +msgstr "" + +msgid "" +"Before upgrading, make sure your application is compatible with the target " +"Tarantool version:" +msgstr "" + +msgid "" +"Set up a development environment with the target Tarantool version " +"installed. See the installation instructions at the Tarantool `download page" +" `_ and in the :ref:`tt install " +"reference `." +msgstr "" + +msgid "" +"Deploy the application in this environment and check how it works. In case " +"of any issues, adjust the application code to ensure compatibility with the " +"target version." +msgstr "" + +msgid "" +"When your application is ready to run on the target Tarantool version, you " +"can start upgrading the production environment." +msgstr "" + +msgid "Upgrading a standalone instance" +msgstr "" + +msgid "Stop the Tarantool instance." +msgstr "" + +msgid "" +"Make a copy of all data and the package from which the current (old) version" +" was installed. You may need it for rollback purposes. Find the backup " +"instruction in the appropriate hot backup procedure in :ref:`Backups `." +msgstr "" + +msgid "" +"Install the target Tarantool version on the host. You can do this using a " +"package manager or the :ref:`tt utility `. See the installation " +"instructions at Tarantool `download page " +"`_ and in the :ref:`tt install reference" +" `. To check that the target Tarantool version is installed, run" +" ``tarantool -v``." +msgstr "" + +msgid "Start your application on the target version." +msgstr "" + +msgid "" +"Run :ref:`box.schema.upgrade() `. This will update the " +"Tarantool system spaces to match the currently installed version of " +"Tarantool." +msgstr "" + +msgid "" +"To undo schema upgrade in a case of failed upgrade, you can use " +":ref:`box.schema.downgrade() `." +msgstr "" + +msgid "Rollback" +msgstr "" + +msgid "" +"The rollback procedure for a standalone instance is almost the same as the " +"upgrade. The only difference is in the last step: you should call " +":ref:`box.schema.downgrade() ` to return the schema to" +" the original version." +msgstr "" diff --git a/locale/ru/LC_MESSAGES/book/admin/vshard_admin.po b/locale/ru/LC_MESSAGES/book/admin/vshard_admin.po index 3ab375e2cd..4097305512 100644 --- a/locale/ru/LC_MESSAGES/book/admin/vshard_admin.po +++ b/locale/ru/LC_MESSAGES/book/admin/vshard_admin.po @@ -3,11 +3,11 @@ msgid "Sharding with vshard" msgstr "Шардирование с vshard" msgid "" -"Sharding in Tarantool is implemented in the ``vshard`` module. " -"For a quick start with ``vshard``, refer to the :ref:`guide `." +"Sharding in Tarantool is implemented in the ``vshard`` module. For a quick " +"start with ``vshard``, refer to the :ref:`guide `." msgstr "" -"Шардирование БД в Tarantool реализует модуль ``vshard``. " -"Вы можете обратиться к :ref:`руководству по быстрому запуску ` " +"Шардирование БД в Tarantool реализует модуль ``vshard``. Вы можете " +"обратиться к :ref:`руководству по быстрому запуску ` " "этого модуля." msgid "Installation" @@ -20,7 +20,8 @@ msgstr "" "Модуль ``vshard`` не входит в основной дистрибутив Tarantool. Чтобы " "установить модуль, выполните команду:" -msgid "$ tarantoolctl rocks install vshard" +#, fuzzy +msgid "$ tt rocks install vshard" msgstr "$ tarantoolctl rocks install vshard" msgid "" @@ -38,14 +39,16 @@ msgstr "Настройка" msgid "Any viable sharded cluster consists of:" msgstr "Любой рабочий сегментированный кластер состоит из:" +#, fuzzy msgid "" "one or more replica sets, each containing two or more :ref:`storage ` instances," +"architecture-storage>` instances," msgstr "" "одного или нескольких наборов реплик с двумя или несколькими " ":ref:`хранилищами ` в каждом," -msgid "one or more :ref:`router ` instances." +#, fuzzy +msgid "one or more :ref:`router ` instances." msgstr "одного или нескольких :ref:`роутеров `." msgid "" @@ -91,14 +94,6 @@ msgstr "" "Все хранилища можно развернуть, используя один набор файлов экземпляра " "(конфигурационных файлов)." -msgid "Self-identification is currently performed using ``tarantoolctl``:" -msgstr "" -"Самоопределение в настоящий момент осуществляется с помощью " -"``tarantoolctl``:" - -msgid "$ tarantoolctl instance_name" -msgstr "$ tarantoolctl имя_экземпляра" - msgid "" "All ``router`` instances can also be deployed using identical instance " "(configuration) files." @@ -504,6 +499,7 @@ msgstr "" msgid "**Example #2:**" msgstr "**Пример №2:**" +#, python-format msgid "" "You have 100000 buckets and each bucket stores ~0.001% of your data. The " "cluster has 10 replica sets. And you never can afford > 0.1% of data locked " @@ -1196,3 +1192,11 @@ msgstr "" "мастер набора реплик становится недоступным, файбер перенаправляет запросы " "на чтение к репликам. Запросы на запись отклоняются с ошибкой до тех пор, " "пока мастер не будет доступен." + +#~ msgid "Self-identification is currently performed using ``tarantoolctl``:" +#~ msgstr "" +#~ "Самоопределение в настоящий момент осуществляется с помощью " +#~ "``tarantoolctl``:" + +#~ msgid "$ tarantoolctl instance_name" +#~ msgstr "$ tarantoolctl имя_экземпляра" diff --git a/locale/ru/LC_MESSAGES/book/app_server/index.po b/locale/ru/LC_MESSAGES/book/app_server/index.po index 458d61ad0f..5dd528069b 100644 --- a/locale/ru/LC_MESSAGES/book/app_server/index.po +++ b/locale/ru/LC_MESSAGES/book/app_server/index.po @@ -6,8 +6,8 @@ msgid "" "Here we introduce the basics of working with Tarantool as a Lua application " "server." msgstr "" -"В данной главе мы рассмотрим основы работы с Tarantool в качестве сервера" -" приложений на языке Lua." +"В данной главе мы рассмотрим основы работы с Tarantool в качестве сервера " +"приложений на языке Lua." msgid "This chapter contains the following sections:" msgstr "Эта глава состоит из следующих разделов:" diff --git a/locale/ru/LC_MESSAGES/book/app_server/launching_app.po b/locale/ru/LC_MESSAGES/book/app_server/launching_app.po index 6fb3c8c8a4..6228275510 100644 --- a/locale/ru/LC_MESSAGES/book/app_server/launching_app.po +++ b/locale/ru/LC_MESSAGES/book/app_server/launching_app.po @@ -72,8 +72,7 @@ msgstr "" "директории." msgid "Now let's discuss how we can launch our application with Tarantool." -msgstr "" -"Теперь рассмотрим, как можно запустить наше приложение с Tarantool." +msgstr "Теперь рассмотрим, как можно запустить наше приложение с Tarantool." msgid "Launching in Docker" msgstr "Запуск в Docker" @@ -128,8 +127,8 @@ msgid "" "``/var/lib/tarantool``." msgstr "" "Традиционно в контейнере директория ``/opt/tarantool`` используется для кода" -" приложения Tarantool, а директория ``/var/lib/tarantool`` используется " -"для данных." +" приложения Tarantool, а директория ``/var/lib/tarantool`` используется для" +" данных." msgid "Launching a binary program" msgstr "Запуск бинарной программы" @@ -288,8 +287,8 @@ msgid "" " can launch it in the **daemon mode**. To do so, we add some parameters to " "``box.cfg{}``:" msgstr "" -"Однако экземпляр Tarantool завершит работу, если мы закроем окно командной" -" строки. Чтобы отделить Tarantool и приложение от окна командной строки, " +"Однако экземпляр Tarantool завершит работу, если мы закроем окно командной " +"строки. Чтобы отделить Tarantool и приложение от окна командной строки, " "можно запустить **режим демона**. Для этого добавим некоторые параметры в " "``box.cfg{}``:" @@ -306,8 +305,8 @@ msgid "" "Tarantool :ref:`log ` module), and" msgstr "" ":ref:`log ` = ``'dir-name'``, который укажет, где демон " -"Tarantool будет сохранять файл журнала (другие настройки журнала находятся" -" в модуле Tarantool :ref:`log ` module), а также" +"Tarantool будет сохранять файл журнала (другие настройки журнала находятся в" +" модуле Tarantool :ref:`log ` module), а также" msgid "" ":ref:`pid_file ` = ``'file-name'`` that tells the " diff --git a/locale/ru/LC_MESSAGES/book/box/limitations.po b/locale/ru/LC_MESSAGES/book/box/limitations.po index 8b21dd9409..f6d59ce062 100644 --- a/locale/ru/LC_MESSAGES/book/box/limitations.po +++ b/locale/ru/LC_MESSAGES/book/box/limitations.po @@ -71,19 +71,25 @@ msgstr "" "такими факторами, как :ref:`количество байтов в кортеже " "`, а не параметрами индекса." -msgid "**Number of elements in array fields in a space with a multikey index**" -msgstr "**Количество элементов в полях-массивах, входящих в индекс по массиву (multikey)**" +msgid "" +"**Number of elements in array fields in a space with a multikey index**" +msgstr "" +"**Количество элементов в полях-массивах, входящих в индекс по массиву " +"(multikey)**" +#, fuzzy msgid "" -"In a Tarantool space that has :ref:`multikey indexes `, " -"any tuple cannot contain more than ~8,000 elements in a field indexed with that multikey index. " -"This is because every element has 4 bytes of metadata, and the tuple's metadata, " -which includes multikey metadata, cannot exceed 2^16 bytes." +"In a Tarantool space that has :ref:`multikey indexes `, any tuple cannot contain more than ~8,000 elements in a " +"field indexed with that multikey index. This is because every element has 4 " +"bytes of metadata, and the tuple's metadata, which includes multikey " +"metadata, cannot exceed 2^16 bytes." msgstr "" -"В спейсе, где определен один или несколько :ref:`индексов по массивам ` " -"(multikey), кортеж может содержать не более ~8000 элементов в каждом поле-массиве. " -"Это связано с тем, что метаданные каждого элемента занимают 4 байта, а объем метаданных кортежа, " -"включая метаданные индекса, не может превышать 2^16 байтов." +"В спейсе, где определен один или несколько :ref:`индексов по массивам " +"` (multikey), кортеж может содержать не более ~8000" +" элементов в каждом поле-массиве. Это связано с тем, что метаданные каждого " +"элемента занимают 4 байта, а объем метаданных кортежа, включая метаданные " +"индекса, не может превышать 2^16 байтов." msgid "**Number of spaces**" msgstr "**Количество спейсов**" diff --git a/locale/ru/LC_MESSAGES/book/box/stream.po b/locale/ru/LC_MESSAGES/book/box/stream.po index 36c9d2c294..93c56049a3 100644 --- a/locale/ru/LC_MESSAGES/book/box/stream.po +++ b/locale/ru/LC_MESSAGES/book/box/stream.po @@ -6,11 +6,11 @@ msgid "Overview" msgstr "Общие сведения" msgid "" -"Since :tarantool-release:`2.10.0`, iproto implements streams and " -"interactive transactions." +"Since :tarantool-release:`2.10.0`, iproto implements streams and interactive" +" transactions." msgstr "" -"Начиная с версии :tarantool-release:`2.10.0`, в iproto реализованы " -"стримы и интерактивные транзакции." +"Начиная с версии :tarantool-release:`2.10.0`, в iproto реализованы стримы и " +"интерактивные транзакции." msgid "Stream" msgstr "Стрим" diff --git a/locale/ru/LC_MESSAGES/book/connectors.po b/locale/ru/LC_MESSAGES/book/connectors.po index 6a2e4f6cf0..e96f29609d 100644 --- a/locale/ru/LC_MESSAGES/book/connectors.po +++ b/locale/ru/LC_MESSAGES/book/connectors.po @@ -3,60 +3,37 @@ msgid "Connectors" msgstr "Коннекторы" msgid "" -"Connectors are APIs that allow using Tarantool with various programming languages." -msgstr "Коннекторы --- это API, позволяющие использовать Tarantool с различными языками программирования." - -msgid "" -"Connectors can be divided into two groups -- those maintained by the Tarantool team " -"and those supported by the community. " -"The Tarantool team maintains the :ref:`high-level C API `, the :ref:`Go ` " -"and :ref:`Java ` connectors, and a synchronous :ref:`Python ` connector. " -"All other connectors are community-supported, which means that support for new Tarantool features may be delayed. " -"Besides, the Tarantool support team cannot prioritize issues that arise while working through these connectors." -msgstr "" -"Команда Tarantool разрабатывает и поддерживает высокоуровневое :ref:`API для языка C `, " -"коннекторы для :ref:`Go ` и :ref:`Java `, " -"а также синхронный коннектор для :ref:`Python `. " -"Все остальные коннекторы разрабатываются сообществом и не всегда поддерживают функциональные возможности " -"новых версий Tarantool. Кроме того, команда технической поддержки Tarantool не может уделять " -"первоочередное внимание проблемам, возникающим при работе с такими коннекторами." - -msgid "This chapter documents the following connectors:" +"Connectors are APIs that allow using Tarantool with various programming " +"languages." +msgstr "" +"Коннекторы --- это API, позволяющие использовать Tarantool с различными " +"языками программирования." + +#, fuzzy +msgid "" +"Connectors can be divided into two groups -- those maintained by the " +"Tarantool team and those supported by the community. The Tarantool team " +"maintains the :ref:`high-level C API `, the :ref:`Go " +"` and :ref:`Java ` connectors, and" +" a synchronous :ref:`Python ` connector. All other " +"connectors are :ref:`community-supported `, " +"which means that support for new Tarantool features may be delayed. Besides," +" the Tarantool support team cannot prioritize issues that arise while " +"working through these connectors." +msgstr "" +"Команда Tarantool разрабатывает и поддерживает высокоуровневое :ref:`API для" +" языка C `, коннекторы для :ref:`Go `" +" и :ref:`Java `, а также синхронный коннектор для " +":ref:`Python `. Все остальные коннекторы разрабатываются" +" сообществом и не всегда поддерживают функциональные возможности новых " +"версий Tarantool. Кроме того, команда технической поддержки Tarantool не " +"может уделять первоочередное внимание проблемам, возникающим при работе с " +"такими коннекторами." + +#, fuzzy +msgid "This chapter documents APIs for various programming languages:" msgstr "В главе описаны следующие коннекторы:" -msgid ":doc:`C++ `" -msgstr ":doc:`C++ `" - -msgid ":ref:`Java `" -msgstr ":ref:`Java `" - -msgid ":ref:`Go `" -msgstr ":ref:`Go `" - -msgid ":ref:`R `" -msgstr ":ref:`R `" - -msgid ":ref:`Erlang `" -msgstr ":ref:`Erlang `" - -msgid ":ref:`Perl `" -msgstr ":ref:`Perl `" - -msgid ":ref:`PHP `" -msgstr ":ref:`PHP `" - -msgid ":ref:`Python `" -msgstr ":ref:`Python `" - -msgid ":ref:`Node.js `" -msgstr ":ref:`Node.js `" - -msgid ":ref:`C# `" -msgstr ":ref:`C# `" - -msgid ":ref:`C `" -msgstr ":ref:`C `" - msgid "Protocol" msgstr "Протокол" @@ -259,2035 +236,2069 @@ msgstr "" "box.schema.user.grant('guest','read,write','space','examples')\n" "box.schema.user.grant('guest','read','space','_space')" -msgid "Java" -msgstr "Java" - -msgid "There are two Java connectors available:" -msgstr "В Tarantool доступны два Java-коннектора:" - -msgid "" -"`cartridge-java `__ supports " -"both single Tarantool nodes and clusters, as well as applications built " -"using the :doc:`Cartridge framework ` and its " -"modules. The Tarantool team actively updates this module with the newest " -"Tarantool features." -msgstr "" -"`cartridge-java `__ " -"поддерживает как отдельные узлы и кластеры Tarantool, так и приложения, " -"созданные с использованием :doc:`фреймворка Cartridge " -"` и его модулей. Команда Tarantool активно добавляет " -"в этот модуль новейшие функциональные возможности платформы." - -msgid "" -"`tarantool-java `__ works with " -"early Tarantool versions (1.6 and later) and offers JDBC interface support " -"for single Tarantool nodes. This module *isn't currently maintained* and " -"does not support the newest 2.x Tarantool features or Tarantool clusters." -msgstr "" -"`tarantool-java `__ " -"предназначен для ранних версий Tarantool (1.6 и выше) и предоставляет " -"поддержку интерфейса JDBC для одиночных узлов Tarantool. Этот модуль *в " -"настоящее время не поддерживается* и не работает ни с новейшими " -"функциональными возможностями Tarantool 2.x, ни с кластерами Tarantool." - -msgid "The following modules support Java libraries and frameworks:" -msgstr "" -"Для работы с библиотеками и фреймворками Java в Tarantool есть следующие " -"модули:" - -msgid "" -"`TestContainers Tarantool module `__ adds support for the popular `TestСontainers " -"framework `__ used for integration testing " -"of Java applications." -msgstr "" -"Модуль Tarantool `TestContainers `__ добавляет поддержку популярного `фреймворка " -"TestСontainers `__, который используется " -"для интеграционного тестирования приложений Java." - -msgid "" -"`Spring Data Tarantool module `__ adds support for the `Spring framework " -"`__." -msgstr "" -"`Модуль Tarantool Spring Data `__ добавляет поддержку `фреймворка Spring " -"`__." - -msgid "" -"Check out the `Spring Pet Clinic project " -"`__ to get familiar" -" with using this module in real applications." -msgstr "" -"Чтобы узнать, как использовать этот модуль в реальных приложениях, " -"ознакомьтесь с `проектом Spring Pet Clinic " -"`__." - -msgid "Go" -msgstr "Go" - -msgid "The following connectors are available:" -msgstr "В Tarantool доступны следующие коннекторы для Go:" +msgid "Interpreting function return values" +msgstr "Интерпретация возвращаемых значений" msgid "" -"Tarantool-supported `go-tarantool `__" +"For all connectors, calling a function via Tarantool causes a return in the " +"MsgPack format. If the function is called using the connector's API, some " +"conversions may occur. All scalar values are returned as tuples (with a " +"MsgPack type-identifier followed by a value); all non-scalar values are " +"returned as a group of tuples (with a MsgPack array-identifier followed by " +"the scalar values). If the function is called via the binary protocol " +"command layer -- \"eval\" -- rather than via the connector's API, no " +"conversions occur." msgstr "" -"`go-tarantool `__, поддерживаемый" -" командой Tarantool." +"При работе с любым Tarantool-коннектором функции, вызванные Tarantool, " +"возвращают значения в формате MsgPack. Для функций, вызываемых через API " +"коннектора, формат возвращаемых значений следующий: скалярные значения " +"возвращаются в виде кортежей (идентификатор типа в формате MsgPack, затем " +"значение); все прочие (не скалярные) значения возвращаются в виде групп " +"кортежей (идентификатор массива в формате MsgPack, затем скалярные " +"значения). Если функция вызывается в рамках бинарного протокола (с помощью " +"команды ``eval``), а не через API коннектора, формат возвращаемых ею " +"значений не меняется." msgid "" -"Community-supported `viciious/go-tarantool `_" +"In the following example, a Lua function will be created. Since it will be " +"accessed externally by a :ref:`'guest' user`, a :doc:`grant " +"` of an execute privilege " +"will be necessary. The function returns an empty array, a scalar string, two" +" booleans, and a short integer. The values are the ones described in the " +"table :ref:`Common Types and MsgPack Encodings `." msgstr "" -"`viciious/go-tarantool `_, " -"поддерживаемый сообществом разработчиков." +"В примере ниже создается Lua-функция. Поскольку эту функцию будет вызывать " +"внешний пользователь :ref:`'guest' user`, необходимо с " +"помощью :doc:`grant ` " +"настроить права на исполнение. Функция возвращает пустой массив, строку-" +"скаляр, два логических значения и короткое целое число. Значения " +"соответствуют приведенным в таблице :ref:`стандартных типов в MsgPack-" +"кодировке `." msgid "" -"Community-supported `FZambia/tarantool " -"`_." +"tarantool> box.cfg{listen=3301}\n" +"2016-03-03 18:45:52.802 [27381] main/101/interactive I> ready to accept requests\n" +"---\n" +"...\n" +"tarantool> function f() return {},'a',false,true,127; end\n" +"---\n" +"...\n" +"tarantool> box.schema.func.create('f')\n" +"---\n" +"...\n" +"tarantool> box.schema.user.grant('guest','execute','function','f')\n" +"---\n" +"..." msgstr "" -"`FZambia/tarantool `_, поддерживаемый " -"сообществом разработчиков." - -msgid "Feature comparison" -msgstr "Сравнение функций" - -msgid "Last update: January 2022" -msgstr "Последнее обновление: январь 2022" - -msgid "`tarantool/go-tarantool `_" -msgstr "`tarantool/go-tarantool `_" - -msgid "`viciious/go-tarantool `_" -msgstr "`viciious/go-tarantool `_" - -msgid "`FZambia/tarantool `_" -msgstr "`FZambia/tarantool `_" - -msgid "License" -msgstr "Лицензия" - -msgid "BSD 2-Clause" -msgstr "BSD 2-Clause" - -msgid "MIT" -msgstr "MIT" - -msgid "Last update" -msgstr "Последнее обновление" - -msgid "2022" -msgstr "2022" - -msgid "2021" -msgstr "2021" - -msgid "Documentation" -msgstr "Документация" - -msgid "README with examples and up-to-date GoDoc" -msgstr "README с примерами и актуальный GoDoc" - -msgid "README with examples, code comments" -msgstr "README с примерами, комментарии к коду" - -msgid "README with examples" -msgstr "README с примерами" - -msgid "Testing / CI / CD" -msgstr "Тестирование / CI / CD" - -msgid "GitHub Actions" -msgstr "GitHub Actions" - -msgid "Travis CI" -msgstr "Travis CI" - -msgid "GitHub Stars" -msgstr "GitHub-звезды" - -msgid "127" -msgstr "127" - -msgid "43" -msgstr "43" - -msgid "12" -msgstr "12" - -msgid "Static analysis" -msgstr "Статический анализ" - -msgid "No" -msgstr "Нет" - -msgid "golint" -msgstr "golint" - -msgid "golangci-lint" -msgstr "golangci-lint" - -msgid "Packaging" -msgstr "Способ упаковки" - -msgid "go get" -msgstr "go get" - -msgid "Code coverage" -msgstr "Покрытие кода" - -msgid "msgpack driver" -msgstr "Драйвер msgpack" +"tarantool> box.cfg{listen=3301}\n" +"2016-03-03 18:45:52.802 [27381] main/101/interactive I> ready to accept requests\n" +"---\n" +"...\n" +"tarantool> function f() return {},'a',false,true,127; end\n" +"---\n" +"...\n" +"tarantool> box.schema.func.create('f')\n" +"---\n" +"...\n" +"tarantool> box.schema.user.grant('guest','execute','function','f')\n" +"---\n" +"..." msgid "" -"`vmihailenco/msgpack/v2 `_ " -"(`#124 `_)" +"Here is a C program which calls the function. Although C is being used for " +"the example, the result would be precisely the same if the calling program " +"was written in Perl, PHP, Python, Go, or Java." msgstr "" -"`vmihailenco/msgpack/v2 `_ " -"(`#124 `_)" - -msgid "`tinylib/msgp `_" -msgstr "`tinylib/msgp `_" +"Следующая программа на C вызывает эту функцию. Хотя в примере приводится код" +" на C, результат будет одинаковым, на каком бы языке ни была написана " +"программа: Perl, PHP, Python, Go или Java." +#, python-format msgid "" -"`vmihailenco/msgpack/v5 `_" -msgstr "" -"`vmihailenco/msgpack/v5 `_" - -msgid "Async work" -msgstr "Асинхронная работа" - -msgid "Yes" -msgstr "Да" - -msgid "Schema reload" -msgstr "Обновление схемы" - -msgid "Yes (manual pull)" -msgstr "Есть (запускается вручную)" - -msgid "Space / index names" -msgstr "Имена спейсов/индексов" - -msgid "Tuples as structures" -msgstr "Кортежи как структуры" - -msgid "Yes (structure and marshall functions must be predefined in Go code)" +"#include \n" +"#include \n" +"#include \n" +"#include \n" +"#include \n" +"void main() {\n" +" struct tnt_stream *tnt = tnt_net(NULL); /* SETUP */\n" +" tnt_set(tnt, TNT_OPT_URI, \"localhost:3301\");\n" +" if (tnt_connect(tnt) < 0) { /* CONNECT */\n" +" printf(\"Connection refused\\n\");\n" +" exit(-1);\n" +" }\n" +" struct tnt_stream *arg; arg = tnt_object(NULL); /* MAKE REQUEST */\n" +" tnt_object_add_array(arg, 0);\n" +" struct tnt_request *req1 = tnt_request_call(NULL); /* CALL function f() */\n" +" tnt_request_set_funcz(req1, \"f\");\n" +" uint64_t sync1 = tnt_request_compile(tnt, req1);\n" +" tnt_flush(tnt); /* SEND REQUEST */\n" +" struct tnt_reply reply; tnt_reply_init(&reply); /* GET REPLY */\n" +" tnt->read_reply(tnt, &reply);\n" +" if (reply.code != 0) {\n" +" printf(\"Call failed %lu.\\n\", reply.code);\n" +" exit(-1);\n" +" }\n" +" const unsigned char *p= (unsigned char*)reply.data; /* PRINT REPLY */\n" +" while (p < (unsigned char *) reply.data_end)\n" +" {\n" +" printf(\"%x \", *p);\n" +" ++p;\n" +" }\n" +" printf(\"\\n\");\n" +" tnt_close(tnt); /* TEARDOWN */\n" +" tnt_stream_free(arg);\n" +" tnt_stream_free(tnt);\n" +"}" msgstr "" -"Есть (структура и функции маршалинга должны быть предопределены в коде Go)" +"#include \n" +"#include \n" +"#include \n" +"#include \n" +"#include \n" +"void main() {\n" +" struct tnt_stream *tnt = tnt_net(NULL); /* Настройка */\n" +" tnt_set(tnt, TNT_OPT_URI, \"localhost:3301\");\n" +" if (tnt_connect(tnt) < 0) { /* Соединение */\n" +" printf(\"Connection refused\\n\");\n" +" exit(-1);\n" +" }\n" +" struct tnt_stream *arg; arg = tnt_object(NULL); /* Формирование запроса */\n" +" tnt_object_add_array(arg, 0);\n" +" struct tnt_request *req1 = tnt_request_call(NULL); /* Вызов функции f() */\n" +" tnt_request_set_funcz(req1, \"f\");\n" +" uint64_t sync1 = tnt_request_compile(tnt, req1);\n" +" tnt_flush(tnt); /* Отправка запроса */\n" +" struct tnt_reply reply; tnt_reply_init(&reply); /* Получение ответа */\n" +" tnt->read_reply(tnt, &reply);\n" +" if (reply.code != 0) {\n" +" printf(\"Call failed %lu.\\n\", reply.code);\n" +" exit(-1);\n" +" }\n" +" const unsigned char *p= (unsigned char*)reply.data; /* Вывод ответа */\n" +" while (p < (unsigned char *) reply.data_end)\n" +" {\n" +" printf(\"%x \", *p);\n" +" ++p;\n" +" }\n" +" printf(\"\\n\");\n" +" tnt_close(tnt); /* Завершение */\n" +" tnt_stream_free(arg);\n" +" tnt_stream_free(tnt);\n" +"}" -msgid "Access tuple fields by names" -msgstr "Доступ к полям кортежей по именам" +msgid "When this program is executed, it will print:" +msgstr "По завершении программа выведет на экран следующие значения:" -msgid "Only if marshalled to structure" -msgstr "Только при маршалинге в структуру" +msgid "dd 0 0 0 5 90 91 a1 61 91 c2 91 c3 91 7f" +msgstr "dd 0 0 0 5 90 91 a1 61 91 c2 91 c3 91 7f" msgid "" -"`SQL `_ " -"support" +"The first five bytes -- ``dd 0 0 0 5`` -- are the MsgPack encoding for " +"\"32-bit array header with value 5\" (see `MsgPack specification " +"`__). The rest are as" +" described in the table :ref:`Common Types and MsgPack Encodings `." msgstr "" -"Поддержка `SQL " -"`_" +"Первые пять байт, ``dd 0 0 0 5``, представляют собой фрагмент данных в " +"формате MsgPack и обозначают 32-битный заголовок массива со значением 5 (см." +" `спецификацию формата MsgPack " +"`_). Остальные " +"значения описаны в таблице :ref:`стандартных типов в MsgPack-кодировке " +"`." -msgid "No (`#62 `_)" -msgstr "Нет (`#62 `_)" +#~ msgid ":doc:`C++ `" +#~ msgstr ":doc:`C++ `" + +#~ msgid ":ref:`Java `" +#~ msgstr ":ref:`Java `" + +#~ msgid ":ref:`Go `" +#~ msgstr ":ref:`Go `" + +#~ msgid ":ref:`R `" +#~ msgstr ":ref:`R `" + +#~ msgid ":ref:`Erlang `" +#~ msgstr ":ref:`Erlang `" + +#~ msgid ":ref:`Perl `" +#~ msgstr ":ref:`Perl `" + +#~ msgid ":ref:`PHP `" +#~ msgstr ":ref:`PHP `" + +#~ msgid ":ref:`Python `" +#~ msgstr ":ref:`Python `" + +#~ msgid ":ref:`Node.js `" +#~ msgstr ":ref:`Node.js `" + +#~ msgid ":ref:`C# `" +#~ msgstr ":ref:`C# `" + +#~ msgid ":ref:`C `" +#~ msgstr ":ref:`C `" + +#~ msgid "Java" +#~ msgstr "Java" + +#~ msgid "There are two Java connectors available:" +#~ msgstr "В Tarantool доступны два Java-коннектора:" + +#~ msgid "" +#~ "`cartridge-java `__ supports " +#~ "both single Tarantool nodes and clusters, as well as applications built " +#~ "using the :doc:`Cartridge framework ` and its " +#~ "modules. The Tarantool team actively updates this module with the newest " +#~ "Tarantool features." +#~ msgstr "" +#~ "`cartridge-java `__ " +#~ "поддерживает как отдельные узлы и кластеры Tarantool, так и приложения, " +#~ "созданные с использованием :doc:`фреймворка Cartridge " +#~ "` и его модулей. Команда Tarantool активно добавляет " +#~ "в этот модуль новейшие функциональные возможности платформы." + +#~ msgid "" +#~ "`tarantool-java `__ works with " +#~ "early Tarantool versions (1.6 and later) and offers JDBC interface support " +#~ "for single Tarantool nodes. This module *isn't currently maintained* and " +#~ "does not support the newest 2.x Tarantool features or Tarantool clusters." +#~ msgstr "" +#~ "`tarantool-java `__ " +#~ "предназначен для ранних версий Tarantool (1.6 и выше) и предоставляет " +#~ "поддержку интерфейса JDBC для одиночных узлов Tarantool. Этот модуль *в " +#~ "настоящее время не поддерживается* и не работает ни с новейшими " +#~ "функциональными возможностями Tarantool 2.x, ни с кластерами Tarantool." + +#~ msgid "The following modules support Java libraries and frameworks:" +#~ msgstr "" +#~ "Для работы с библиотеками и фреймворками Java в Tarantool есть следующие " +#~ "модули:" + +#~ msgid "" +#~ "`TestContainers Tarantool module `__ adds support for the popular `TestСontainers " +#~ "framework `__ used for integration testing " +#~ "of Java applications." +#~ msgstr "" +#~ "Модуль Tarantool `TestContainers `__ добавляет поддержку популярного `фреймворка " +#~ "TestСontainers `__, который используется " +#~ "для интеграционного тестирования приложений Java." + +#~ msgid "" +#~ "`Spring Data Tarantool module `__ adds support for the `Spring framework " +#~ "`__." +#~ msgstr "" +#~ "`Модуль Tarantool Spring Data `__ добавляет поддержку `фреймворка Spring " +#~ "`__." + +#~ msgid "" +#~ "Check out the `Spring Pet Clinic project " +#~ "`__ to get familiar" +#~ " with using this module in real applications." +#~ msgstr "" +#~ "Чтобы узнать, как использовать этот модуль в реальных приложениях, " +#~ "ознакомьтесь с `проектом Spring Pet Clinic " +#~ "`__." -msgid "" -"No (`#18 `_, closed)" -msgstr "" -"Нет (`#18 `_, тикет " -"закрыт)" +#~ msgid "Go" +#~ msgstr "Go" + +#~ msgid "The following connectors are available:" +#~ msgstr "В Tarantool доступны следующие коннекторы для Go:" + +#~ msgid "" +#~ "Tarantool-supported `go-tarantool `__" +#~ msgstr "" +#~ "`go-tarantool `__, поддерживаемый" +#~ " командой Tarantool." + +#~ msgid "" +#~ "Community-supported `viciious/go-tarantool `_" +#~ msgstr "" +#~ "`viciious/go-tarantool `_, " +#~ "поддерживаемый сообществом разработчиков." + +#~ msgid "" +#~ "Community-supported `FZambia/tarantool " +#~ "`_." +#~ msgstr "" +#~ "`FZambia/tarantool `_, поддерживаемый " +#~ "сообществом разработчиков." + +#~ msgid "Feature comparison" +#~ msgstr "Сравнение функций" + +#~ msgid "Last update: January 2022" +#~ msgstr "Последнее обновление: январь 2022" + +#~ msgid "`tarantool/go-tarantool `_" +#~ msgstr "`tarantool/go-tarantool `_" + +#~ msgid "`viciious/go-tarantool `_" +#~ msgstr "`viciious/go-tarantool `_" + +#~ msgid "`FZambia/tarantool `_" +#~ msgstr "`FZambia/tarantool `_" + +#~ msgid "License" +#~ msgstr "Лицензия" + +#~ msgid "BSD 2-Clause" +#~ msgstr "BSD 2-Clause" + +#~ msgid "MIT" +#~ msgstr "MIT" -msgid "" -"`Interactive transactions " -"`_" -msgstr "" -"`Интерактивные транзакции " -"`_" +#~ msgid "Last update" +#~ msgstr "Последнее обновление" -msgid "No (`#101 `_)" -msgstr "Нет (`#101 `_)" +#~ msgid "2022" +#~ msgstr "2022" -msgid "" -"`Varbinary `_ " -"support" -msgstr "" -"Поддержка `varbinary " -"`_" +#~ msgid "2021" +#~ msgstr "2021" -msgid "Yes (with in-built language tools)" -msgstr "Есть (встроенными инструментами языка)" +#~ msgid "Documentation" +#~ msgstr "Документация" -msgid "" -"Yes (decodes to string by default, see `#6 " -"`_)" -msgstr "" -"Есть (декодирование в строку по умолчанию, см. `#6 " -"`_)" +#~ msgid "README with examples and up-to-date GoDoc" +#~ msgstr "README с примерами и актуальный GoDoc" -msgid "" -"`UUID `_ " -"support" -msgstr "" -"Поддержка `UUID " -"`_" +#~ msgid "README with examples, code comments" +#~ msgstr "README с примерами, комментарии к коду" -msgid "Decimal support" -msgstr "Поддержка decimal" +#~ msgid "README with examples" +#~ msgstr "README с примерами" -msgid "No (`#96 `_)" -msgstr "Нет (`#96 `_)" +#~ msgid "Testing / CI / CD" +#~ msgstr "Тестирование / CI / CD" -msgid "" -"`EXT_ERROR " -"`_ support" -msgstr "" -"Поддержка `EXT_ERROR " -"`_" +#~ msgid "GitHub Actions" +#~ msgstr "GitHub Actions" -msgid "" -"`Datetime `_ " -"support" -msgstr "" -"Поддержка `datetime " -"`_" +#~ msgid "Travis CI" +#~ msgstr "Travis CI" -msgid "No (`#118 `_)" -msgstr "Нет (`#118 `_)" +#~ msgid "GitHub Stars" +#~ msgstr "GitHub-звезды" -msgid "" -"`box.session.push() responses " -"`_" -msgstr "" -"`Возвращаемые значения box.session.push() " -"`_" +#~ msgid "127" +#~ msgstr "127" -msgid "No (`#67 `_)" -msgstr "Нет (`#67 `_)" +#~ msgid "43" +#~ msgstr "43" -msgid "No (`#21 `_)" -msgstr "Нет (`#21 `_)" +#~ msgid "12" +#~ msgstr "12" -msgid "" -"`Session settings " -"`_" -msgstr "" -"`Настройки сессии " -"`_" +#~ msgid "Static analysis" +#~ msgstr "Статический анализ" -msgid "" -"`Graceful shutdown `_" -msgstr "" -"`Мягкое завершение `_" +#~ msgid "No" +#~ msgstr "Нет" -msgid "" -"`IPROTO_ID (feature discovering) " -"`_" -msgstr "" -"`IPROTO_ID (обнаружение поддерживаемых функций) " -"`_" +#~ msgid "golint" +#~ msgstr "golint" -msgid "`tarantool/crud `_ support" -msgstr "Поддержка `tarantool/crud `_" +#~ msgid "golangci-lint" +#~ msgstr "golangci-lint" -msgid "Connection pool" -msgstr "Пул соединений" +#~ msgid "Packaging" +#~ msgstr "Способ упаковки" -msgid "" -"Yes (round-robin failover, no balancing, master discovering planned in `#113" -" `_)" -msgstr "" -"Есть (циклическое восстановление после сбоев; без балансировки; обнаружение " -"мастера планируется в `#113 `_)" +#~ msgid "go get" +#~ msgstr "go get" -msgid "Transparent reconnecting" -msgstr "Прозрачное переподключение" +#~ msgid "Code coverage" +#~ msgstr "Покрытие кода" -msgid "" -"Yes (see comments in `#129 `_)" -msgstr "" -"Есть (см. комментарии к `#129 `_)" +#~ msgid "msgpack driver" +#~ msgstr "Драйвер msgpack" -msgid "" -"No (handle reconnects explicitly, refer to `#11 " -"`_)" -msgstr "" -"Нет (дескриптор переподключается явно, см. `#11 " -"`_)" +#~ msgid "" +#~ "`vmihailenco/msgpack/v2 `_ " +#~ "(`#124 `_)" +#~ msgstr "" +#~ "`vmihailenco/msgpack/v2 `_ " +#~ "(`#124 `_)" -msgid "" -"Yes (see comments in `#7 `_)" -msgstr "" -"Есть (см. комментарии к `#7 " -"`_)" +#~ msgid "`tinylib/msgp `_" +#~ msgstr "`tinylib/msgp `_" -msgid "Transparent request retrying" -msgstr "Прозрачная переотправка запроса" +#~ msgid "" +#~ "`vmihailenco/msgpack/v5 `_" +#~ msgstr "" +#~ "`vmihailenco/msgpack/v5 `_" -msgid "`Watchers `_" -msgstr "" -"`Наблюдатели (watchers) `_" +#~ msgid "Async work" +#~ msgstr "Асинхронная работа" -msgid "Language features" -msgstr "Возможности языка" +#~ msgid "Yes" +#~ msgstr "Да" -msgid "No (`#48 `_)" -msgstr "Нет (`#48 `_)" +#~ msgid "Schema reload" +#~ msgstr "Обновление схемы" -msgid "context" -msgstr "context" +#~ msgid "Yes (manual pull)" +#~ msgstr "Есть (запускается вручную)" -msgid "Miscellaneous" -msgstr "Прочее" +#~ msgid "Space / index names" +#~ msgstr "Имена спейсов/индексов" -msgid "Supports `tarantool/queue `_ API" -msgstr "Поддержка API `tarantool/queue `_" +#~ msgid "Tuples as structures" +#~ msgstr "Кортежи как структуры" -msgid "" -"Can mimic a Tarantool instance (also as replica). Provides instrumentation " -"for reading snapshot and xlog files via `snapio module " -"`_. Implements " -"unpacking of query structs if you want to implement your own iproto proxy" -msgstr "" -"Может имитировать экземпляр Tarantool (в том числе реплику). Предоставляет " -"инструментарий для чтения снимков данных и файлов xlog с помощью `модуля " -"snapio `_. " -"Реализует распаковку структур запросов, если нужно реализовать свой " -"собственный прокси iproto" +#~ msgid "Yes (structure and marshall functions must be predefined in Go code)" +#~ msgstr "" +#~ "Есть (структура и функции маршалинга должны быть предопределены в коде Go)" -msgid "API is experimental and breaking changes may happen" -msgstr "API коннектора экспериментальный и может значительно измениться" +#~ msgid "Access tuple fields by names" +#~ msgstr "Доступ к полям кортежей по именам" -msgid "R" -msgstr "R" +#~ msgid "Only if marshalled to structure" +#~ msgstr "Только при маршалинге в структуру" -msgid "" -"Use the `tarantoolr `__ connector." -msgstr "" -"Используйте коннектор `tarantoolr `__." - -msgid "Erlang" -msgstr "Erlang" - -msgid "Use the `Erlang tarantool driver `__." -msgstr "" -"Используйте `драйвер Tarantool на Erlang " -"`__." - -msgid "Perl" -msgstr "Perl" - -msgid "" -"The most commonly used Perl driver is `tarantool-perl " -"`__. It is not supplied as part" -" of the Tarantool repository; it must be installed separately. The most " -"common way to install it is by cloning from GitHub." -msgstr "" -"Самый распространенный драйвер для Perl --- `tarantool-perl " -"`_. Он не входит в репозиторий " -"Tarantool, его необходимо устанавливать отдельно. Проще всего установить " -"его, склонировав с GitHub." - -msgid "" -"To avoid minor warnings that may appear the first time ``tarantool-perl`` is" -" installed, start with installing some other modules that ``tarantool-perl``" -" uses, with `CPAN, the Comprehensive Perl Archive Network " -"`__:" -msgstr "" -"Чтобы избежать нескольких незначительных предупреждений, которые может " -"выдать система после первой установки ``tarantool-perl``, начните установку " -"с модуля `CPAN (Comprehensive Perl Archive Network, Всеобъемлющая сеть " -"архивов Perl) `__. Этот модуль необходим" -" для работы ``tarantool-perl``:" - -msgid "" -"$ sudo cpan install AnyEvent\n" -"$ sudo cpan install Devel::GlobalDestruction" -msgstr "" -"$ sudo cpan install AnyEvent\n" -"$ sudo cpan install Devel::GlobalDestruction" - -msgid "Then, to install ``tarantool-perl`` itself, say:" -msgstr "Затем установите ``tarantool-perl``:" - -msgid "" -"$ git clone https://github.com/tarantool/tarantool-perl.git tarantool-perl\n" -"$ cd tarantool-perl\n" -"$ git submodule init\n" -"$ git submodule update --recursive\n" -"$ perl Makefile.PL\n" -"$ make\n" -"$ sudo make install" -msgstr "" -"$ git clone https://github.com/tarantool/tarantool-perl.git tarantool-perl\n" -"$ cd tarantool-perl\n" -"$ git submodule init\n" -"$ git submodule update --recursive\n" -"$ perl Makefile.PL\n" -"$ make\n" -"$ sudo make install" - -msgid "" -"Here is a complete Perl program that inserts ``[99999,'BB']`` into " -"``space[999]`` via the Perl API. Before trying to run, check that the server" -" instance is listening at ``localhost:3301`` and that the space ``examples``" -" exists, as :ref:`described earlier `. To run, " -"paste the code into a file named :file:`example.pl` and say :samp:`perl " -"example.pl`. The program will connect using an application-specific " -"definition of the space. The program will open a socket connection with the " -"Tarantool instance at ``localhost:3301``, then send an " -":ref:`space_object:INSERT ` request, then — if all is well" -" — end without displaying any messages. If Tarantool is not running on " -"``localhost`` with :ref:`listen ` port = 3301, the program" -" will print “Connection refused”." -msgstr "" -"В следующем примере приводится полноценная программа на Perl, которая " -"осуществляет вставку кортежа ``[99999,'BB']`` в спейс ``space[999]`` с " -"помощью API для языка Perl. Перед запуском проверьте, что экземпляр " -"прослушивает порт ``localhost:3301``, а в базе создан спейс ``examples``, " -"как :ref:`предложено выше `. Чтобы запустить " -"программу, сохраните код в файл :file:`example.pl` и выполните команду " -":samp:`perl example.pl`. Программа установит соединение, используя " -"определение спейса. Затем она откроет сокет для соединения с экземпляром по " -"адресу ``localhost:3301`` и отправит запрос " -":ref:`space_object:INSERT`. Если запрос будет выполнен " -"успешно, программа после этого закончит работу, не выводя никаких сообщений." -" Если Tarantool не запущен по адресу ``localhost`` и порт 3301 не " -":ref:`прослушивается `, то программа выведет сообщение об " -"ошибке \"Connection refused\"." - -msgid "" -"#!/usr/bin/perl\n" -"use DR::Tarantool ':constant', 'tarantool';\n" -"use DR::Tarantool ':all';\n" -"use DR::Tarantool::MsgPack::SyncClient;\n" -"\n" -"my $tnt = DR::Tarantool::MsgPack::SyncClient->connect(\n" -" host => '127.0.0.1', # look for tarantool on localhost\n" -" port => 3301, # on port 3301\n" -" user => 'guest', # username. for 'guest' we do not also say 'password=>...'\n" -"\n" -" spaces => {\n" -" 999 => { # definition of space[999] ...\n" -" name => 'examples', # space[999] name = 'examples'\n" -" default_type => 'STR', # space[999] field type is 'STR' if undefined\n" -" fields => [ { # definition of space[999].fields ...\n" -" name => 'field1', type => 'NUM' } ], # space[999].field[1] name='field1',type='NUM'\n" -" indexes => { # definition of space[999] indexes ...\n" -" 0 => {\n" -" name => 'primary', fields => [ 'field1' ] } } } } );\n" -"\n" -"$tnt->insert('examples' => [ 99999, 'BB' ]);" -msgstr "" -"#!/usr/bin/perl\n" -"use DR::Tarantool ':constant', 'tarantool';\n" -"use DR::Tarantool ':all';\n" -"use DR::Tarantool::MsgPack::SyncClient;\n" -"\n" -"my $tnt = DR::Tarantool::MsgPack::SyncClient->connect(\n" -" host => '127.0.0.1', # поиск сервера Tarantool по адресу localhost\n" -" port => 3301, # на порту 3301\n" -" user => 'guest', # имя пользователя; здесь же можно задать пароль через 'password=>...'\n" -" # для пользователя 'guest' пароль не задается\n" -" spaces => {\n" -" 999 => { # определение спейса 'space[999]' ...\n" -" name => 'examples', # имя спейса 'space[999]' = 'examples'\n" -" default_type => 'STR', # если тип поля в 'space[999]' не задан, то = 'STR'\n" -" fields => [ { # определение полей в спейсе 'space[999]' ...\n" -" name => 'field1', type => 'NUM' } ], # имя поля space[999].field[1]='field1', тип ='NUM'\n" -" indexes => { # определение индексов спейса 'space[999]' ...\n" -" 0 => {\n" -" name => 'primary', fields => [ 'field1' ] } } } } );\n" -"\n" -"$tnt->insert('examples' => [ 99999, 'BB' ]);" - -msgid "" -"The example program uses field type names 'STR' and 'NUM' instead of " -":ref:`'string' and 'unsigned' `, due to a temporary " -"Perl limitation." -msgstr "" -"Из-за временных ограничений языка Perl вместо полей типа :ref:`'string' и " -"'unsigned' ` в тестовой программе используются поля " -"типа 'STR' и 'NUM'." - -msgid "" -"The example program only shows one request and does not show all that's " -"necessary for good practice. For that, please see the `tarantool-perl " -"repository `__." -msgstr "" -"Эта программа --- пример отправки единственного запроса. Чтобы узнать больше" -" о том, как работать с Tarantool, пользуясь языком Perl, обратитесь к " -"документации в `репозитории tarantool-perl " -"`__." - -msgid "PHP" -msgstr "PHP" - -msgid "" -"`tarantool-php `__ is the " -"official PHP connector for Tarantool. It is not supplied as part of the " -"Tarantool repository and must be installed separately (see `installation " -"instructions `__ in the connector's ``README`` file)." -msgstr "" -"`tarantool-php `_ --- " -"официальный PHP-коннектор для Tarantool. Он не входит в репозиторий " -"Tarantool, так что его необходимо устанавливать отдельно. Прочитайте " -"`инструкции по установке `_ в файле коннектора :file:`README`." - -msgid "" -"Here is a complete PHP program that inserts ``[99999,'BB']`` into a space " -"named ``examples`` via the PHP API." -msgstr "" -"В следующем примере приводится полноценная программа на языке PHP, которая " -"осуществляет вставку кортежа ``[99999,'BB']`` в спейс ``examples`` с помощью" -" API для языка PHP." - -msgid "" -"Before trying to run, check that the server instance is :ref:`listening " -"` at ``localhost:3301`` and that the space ``examples`` " -"exists, as :ref:`described earlier `." -msgstr "" -"Перед запуском проверьте, что экземпляр :ref:`прослушивает ` порт ``localhost:3301``, а в базе создан спейс ``examples``, как " -":ref:`предложено выше `." - -msgid "To run, paste the code into a file named :file:`example.php` and say:" -msgstr "" -"Чтобы запустить программу, сохраните код в файл :file:`example.php` и " -"выполните следующую команду:" - -msgid "$ php -d extension=~/tarantool-php/modules/tarantool.so example.php" -msgstr "$ php -d extension=~/tarantool-php/modules/tarantool.so example.php" - -msgid "" -"The program will open a socket connection with the Tarantool instance at " -"``localhost:3301``, then send an :ref:`INSERT ` request, " -"then -- if all is well -- print \"Insert succeeded\"." -msgstr "" -"Программа откроет сокет для соединения с экземпляром по адресу " -"``localhost:3301`` и отправит :ref:`INSERT-запрос `. При " -"успешном выполнении запроса программа выведет сообщение \"Insert " -"succeeded\"." - -msgid "" -"If the tuple already exists, the program will print \"Duplicate key exists " -"in unique index 'primary' in space 'examples'\"." -msgstr "" -"Если такой кортеж уже существует, то программа выведет сообщение об ошибке: " -"“Duplicate key exists in unique index 'primary' in space 'examples'”." - -msgid "" -"insert('examples', [99999, 'BB']);\n" -" echo \"Insert succeeded\\n\";\n" -"} catch (Exception $e) {\n" -" echo $e->getMessage(), \"\\n\";\n" -"}" -msgstr "" -"insert('examples', [99999, 'BB']);\n" -" echo \"Insert succeeded\\n\";\n" -"} catch (Exception $e) {\n" -" echo $e->getMessage(), \"\\n\";\n" -"}" - -msgid "" -"The example program only shows one request and does not show all that's " -"necessary for good practice. For that, please see `tarantool/tarantool-php " -"`__ project at GitHub." -msgstr "" -"Эта программа --- пример отправки единственного запроса. Чтобы узнать больше" -" о том, как работать с Tarantool, пользуясь языком PHP, обратитесь к " -"документации `проекта tarantool-php на GitHub " -"`_." - -msgid "" -"Besides, there is another community-driven `tarantool-php GitHub project " -"`__ which includes an `alternative " -"connector `__ written in pure PHP, " -"an `object mapper `__, a `queue " -"`__ and other packages." -msgstr "" -"Кроме того, сообщество разработчиков поддерживает несколько проектов на " -"GitHub. Среди них --- `проект tarantool-php `_, который включает в себя `вариант коннектора " -"`_, написанный на чистом PHP, " -"`модуль сопоставления объектов `_, " -"`администратор очередей `_ и другие " -"пакеты." - -msgid "Python" -msgstr "Python" - -msgid "" -"`tarantool-python `__ is the " -"official Python connector for Tarantool. It is not supplied as part of the " -"Tarantool repository and must be installed separately (see below for " -"details)." -msgstr "" -"`tarantool-python `_ --- " -"официальный Python-коннектор для Tarantool. Он не входит в репозиторий " -"Tarantool, так что его необходимо устанавливать отдельно (см. подробную " -"информацию ниже)." - -msgid "" -"Here is a complete Python program that inserts ``[99999,'Value','Value']`` " -"into space ``examples`` via the high-level Python API." -msgstr "" -"В следующем примере приводится полноценная программа на языке Python, " -"которая осуществляет вставку кортежа ``[99999,'Value','Value']`` в спейс " -"``examples`` с помощью высокоуровневого API для языка Python." - -msgid "" -"#!/usr/bin/python\n" -"from tarantool import Connection\n" -"\n" -"c = Connection(\"127.0.0.1\", 3301)\n" -"result = c.insert(\"examples\",(99999,'Value', 'Value'))\n" -"print result" -msgstr "" -"#!/usr/bin/python\n" -"from tarantool import Connection\n" -"\n" -"c = Connection(\"127.0.0.1\", 3301)\n" -"result = c.insert(\"examples\",(99999,'Value', 'Value'))\n" -"print result" - -msgid "" -"To prepare, paste the code into a file named :file:`example.py` and install " -"the ``tarantool-python`` connector with either :samp:`pip install " -"tarantool\\>0.4` to install in :file:`/usr` (requires **root** privilege) or" -" :samp:`pip install tarantool\\>0.4 --user` to install in :file:`~` i.e. " -"user's default directory." -msgstr "" -"Перед запуском тестовой программы сохраните ее код в файл :file:`example.py`" -" и установите коннектор ``tarantool-python``. Чтобы установить его в " -"директорию :file:`/usr`, используйте команду :samp:`pip install " -"tarantool\\>0.4`. Для этого требуются права уровня **root**. Вместо этого вы" -" можете установить коннектор в директорию :file:`~`, т.е. в используемую по " -"умолчанию директорию текущего пользователя. Для этого выполните команду " -":samp:`pip install tarantool\\>0.4 --user`." - -msgid "" -"Before trying to run, check that the server instance is :ref:`listening " -"` at ``localhost:3301`` and that the space ``examples`` " -"exists, as :ref:`described earlier `. To run the " -"program, say :samp:`python example.py`. The program will connect to the " -"Tarantool server, will send the :ref:`INSERT ` request, " -"and will not throw any exception if all went well. If the tuple already " -"exists, the program will throw ``tarantool.error.DatabaseError: (3, " -"\"Duplicate key exists in unique index 'primary' in space 'examples'\")``." -msgstr "" -"Перед запуском проверьте, что экземпляр прослушивает порт " -"``localhost:3301``, а в базе создан спейс ``examples``, как :ref:`предложено" -" выше `. Чтобы запустить тестовую программу, " -"выполните команду :samp:`python example.py`. Программа установит соединение " -"с сервером Tarantool и отправит запрос :ref:`INSERT`. Если" -" запрос будет выполнен успешно, программа не сгенерирует исключений. Если " -"окажется, что такой кортеж уже существует, то программа сгенерирует " -"исключение `tarantool.error.DatabaseError: (3, \"Duplicate key exists in " -"unique index 'primary' in space 'examples'\")`." - -msgid "" -"The example program only shows one request and does not show all that's " -"necessary for good practice. For that, please see `tarantool-python " -"`__ project at GitHub. For an " -"example of using Python API with `queue managers for Tarantool " -"`__, see `queue-python " -"`__ project at GitHub." -msgstr "" -"Эта программа --- пример отправки единственного запроса. Чтобы узнать больше" -" о том, как работать с Tarantool, пользуясь языком Python, обратитесь к " -"документации `проекта tarantool-python на GitHub " -"`_. А на странице `проекта " -"queue-python на GitHub `_ вы " -"найдете примеры использования Python API для работы с `очередями сообщений в" -" Tarantool `_." - -msgid "Also there are several community-driven Python connectors:" -msgstr "" -"Кроме того, сообщество разработчиков поддерживает следующие Python-" -"коннекторы:" - -msgid "" -"`asynctnt `__ with asyncio support" -msgstr "" -"`asynctnt `_ с поддержкой asyncio" - -msgid "" -"`aiotarantool `__ also with " -"asyncio support" -msgstr "" -"`aiotarantool `_, также с " -"поддержкой asyncio" - -msgid "" -"`gtarantool `__ with gevent " -"support, **no active maintenance**" -msgstr "" -"`gtarantool `__ с поддержкой " -"gevent, **не обновляется**" - -msgid "" -"The table below contains a feature comparison for asynctnt, gtarantool and " -"tarantool-python. aiotarantool is absent there because it is quite outdated " -"and unmaintained." -msgstr "" -"В этой таблице сравниваются функции коннекторов asynctnt, gtarantool и " -"tarantool-python. aiotarantool здесь отсутствует, так как он устарел и " -"больше не поддерживается." - -msgid "Last update: May 2022" -msgstr "Последнее обновление: май 2022" - -msgid "Parameter" -msgstr "Параметры" - -msgid "`igorcoding/asynctnt `__" -msgstr "`igorcoding/asynctnt `__" - -msgid "`shveenkov/gtarantool `__" -msgstr "`shveenkov/gtarantool `__" - -msgid "" -"`tarantool/tarantool-python `__" -msgstr "" -"`tarantool/tarantool-python `__" - -msgid "Apache License 2.0" -msgstr "Apache License 2.0" - -msgid "LGPL" -msgstr "LGPL" - -msgid "BSD-2" -msgstr "BSD-2" - -msgid "Is maintained" -msgstr "Поддерживается" - -msgid "No (last updated in 2018)" -msgstr "Нет (последнее обновление в 2018)" - -msgid "Known Issues" -msgstr "Известные проблемы" - -msgid "" -"`issue #18 `__ (no running" -" event loop)" -msgstr "" -"`тикет #18 `__ (нет " -"событийного цикла)" - -msgid "None" -msgstr "Нет" - -msgid "" -"`issue #105 `__ " -"(unpack of binary data)" -msgstr "" -"`тикет #105 `__ " -"(распаковка бинарных данных)" - -msgid "Yes (`github.io `__)" -msgstr "Есть (`github.io `__)" - -msgid "" -"Yes (`tarantool.io " -"`__" -" and `readthedocs `__ (`obsolete `__))" -msgstr "" -"Есть (`tarantool.io " -"`__" -" и `readthedocs `__ (`неактуальна `__))" - -msgid "No (tests exist)" -msgstr "Нет (есть тесты)" - -msgid "AppVeyor (only Windows)" -msgstr "AppVeyor (только на Windows)" - -msgid "51" -msgstr "51" - -msgid "17" -msgstr "17" - -msgid "78" -msgstr "78" - -msgid "Static Analysis" -msgstr "Статический анализ" - -msgid "Yes (Flake8)" -msgstr "Есть (Flake8)" - -msgid "`pip `__" -msgstr "`pip `__" - -msgid "`pip `__" -msgstr "`pip `__" - -msgid "" -"`deb, rpm, pip `__" -msgstr "" -"`deb, rpm, pip `__" - -msgid "Support asynchronous mode" -msgstr "Поддержка асинхронного режима" - -msgid "Yes, `asyncio `__" -msgstr "Есть, `asyncio `__" - -msgid "" -"Yes (`gevent " -"`__, " -"example: `test_gevent.py " -"`__)" -msgstr "" -"Есть, `gevent " -"`__ " -"(пример: `test_gevent.py " -"`__)" - -msgid "Batching support" -msgstr "Поддержка пакетной обработки" - -msgid "" -"No (`issue #55 `__)" -msgstr "" -"Нет (`тикет #55 `__)" - -msgid "" -"Yes (automatically, see `auto_refetch_schema " -"`__)" -msgstr "" -"Автоматическое (см. `auto_refetch_schema " -"`__)" - -msgid "Yes (automatically)" -msgstr "Автоматическое" - -msgid "" -"`SQL support " -"`__" -msgstr "" -"`Поддержка SQL " -"`__" - -msgid "Yes (tests/test_op_sql.py)" -msgstr "Есть (tests/test_op_sql.py)" - -msgid "Yes (tarantool/connection.py)" -msgstr "Есть (tarantool/connection.py)" - -msgid "" -"`Interactive transactions " -"`__" -msgstr "" -"`Интерактивные транзакции " -"`__" - -msgid "" -"No (`issue #163 `__)" -msgstr "" -"Нет (`тикет #163 `__)" - -msgid "" -"`Varbinary support " -"`__" -msgstr "" -"`Поддержка varbinary " -"`__" - -msgid "" -"Yes (`issue #105 `__)" -msgstr "" -"Есть (`тикет #105 `__)" - -msgid "" -"`UUID support " -"`__" -msgstr "" -"`Поддержка UUID " -"`__" - -msgid "" -"`Decimal support " -"`__" -msgstr "" -"`Поддержка decimal " -"`__" - -msgid "Almost (v2 branch)" -msgstr "Частично (в ветке v2)" - -msgid "" -"`EXT_ERROR support " -"`__" -msgstr "" -"`Поддержка EXT_ERROR " -"`__" - -msgid "" -"`Datetime support " -"`__" -msgstr "" -"`Поддержка datetime " -"`__" - -msgid "" -"`box.session.push() responses " -"`__" -msgstr "" -"`Возвращаемые значения box.session.push() " -"`__" - -msgid "Yes (see push_subscribe option and docs/pushes.rst)" -msgstr "Есть (см. push_subscribe option и docs/pushes.rst)" - -msgid "" -"`Session settings " -"`__" -msgstr "" -"`Настройки сессии " -"`__" - -msgid "" -"`Graceful shutdown `__" -msgstr "" -"`Мягкое завершение `__" - -msgid "" -"`IPROTO_ID (feature discovering) " -"`__" -msgstr "" -"`IPROTO_ID (обнаружение поддерживаемых функций) " -"`__" - -msgid "Support `CRUD `__" -msgstr "Поддержка `CRUD `__" - -msgid "Autoreconnect" -msgstr "Автоматическое переподключение" - -msgid "Yes (reconnect_max_attempts, reconnect_delay)" -msgstr "Есть (reconnect_max_attempts, reconnect_delay)" - -msgid "" -"Yes (reconnect_max_attempts, reconnect_delay), checking of connection " -"liveness" -msgstr "" -"Есть (reconnect_max_attempts, reconnect_delay), проверка состояния " -"соединения" - -msgid "Yes (with master discovery)" -msgstr "Есть (с обнаружением мастера)" - -msgid "" -"Support of `PEP 249 -- Python Database API Specification v2.0 " -"`__" -msgstr "" -"Поддержка `PEP 249 --- Python Database API Specification v2.0 " -"`__" - -msgid "" -"`Yes `__" -msgstr "" -"`Есть `__" - -msgid "Node.js" -msgstr "Node.js" - -msgid "" -"The most commonly used node.js driver is the `Node Tarantool driver " -"`_. It is not supplied as " -"part of the Tarantool repository; it must be installed separately. The most " -"common way to install it is with `npm `_. For example, on Ubuntu, the installation " -"could look like this after npm has been installed:" -msgstr "" -"Самый распространенный драйвер для Node.js --- `Node Tarantool driver " -"`_. Он не входит в " -"репозиторий Tarantool, так что его необходимо устанавливать отдельно. Проще " -"всего установить его с помощью `npm `_. Например, на Ubuntu установка драйвера будет" -" выглядеть следующим образом (в этом примере менеджер пакетов npm уже " -"установлен):" - -msgid "$ npm install tarantool-driver --global" -msgstr "$ npm install tarantool-driver --global" - -msgid "" -"Here is a complete node.js program that inserts ``[99999,'BB']`` into " -"``space[999]`` via the node.js API. Before trying to run, check that the " -"server instance is :ref:`listening ` at ``localhost:3301``" -" and that the space ``examples`` exists, as :ref:`described earlier `. To run, paste the code into a file named " -":file:`example.rs` and say ``node example.rs``. The program will connect " -"using an application-specific definition of the space. The program will open" -" a socket connection with the Tarantool instance at ``localhost:3301``, then" -" send an :ref:`INSERT ` request, then — if all is well — " -"end after saying \"Insert succeeded\". If Tarantool is not running on " -"``localhost`` with listen port = 3301, the program will print “Connect " -"failed”. If :ref:`the 'guest' user ` does not have " -"authorization to connect, the program will print \"Auth failed\". If the " -"insert request fails for any reason, for example because the tuple already " -"exists, the program will print \"Insert failed\"." -msgstr "" -"В следующем примере приводится полноценная программа, написанная с " -"использованием Node.js. Эта программа осуществляет вставку кортежа " -"``[99999,'BB']`` в спейс ``space[999]`` с помощью API для Node.js. Перед " -"запуском проверьте, что экземпляр :ref:`прослушивает ` " -"порт ``localhost:3301``, а в базе создан спейс ``examples``, как " -":ref:`предложено выше `. Чтобы запустить программу," -" сохраните код в файл :file:`example.rs` и выполните команду ``node " -"example.rs``. Программа установит соединение, используя определение спейса. " -"Затем она откроет сокет для соединения с экземпляром по адресу " -"``localhost:3301`` и отправит :ref:`INSERT-запрос `. Если " -"запрос будет выполнен успешно, программа выведет сообщение \"Insert " -"succeeded\". Если Tarantool не запущен по адресу ``localhost`` и порт 3301 " -"не прослушивается, то программа выведет сообщение об ошибке “Connect " -"failed”. Если у :ref:`пользователя 'guest' ` нет прав на " -"установку соединения, программа выведет сообщение об ошибке \"Auth failed\"." -" Если запрос на вставку по какой-либо причине не сработает (например, такой " -"кортеж уже существует), то программа выведет сообщение об ошибке \"Insert " -"failed\"." - -msgid "" -"var TarantoolConnection = require('tarantool-driver');\n" -"var conn = new TarantoolConnection({port: 3301});\n" -"var insertTuple = [99999, \"BB\"];\n" -"conn.connect().then(function() {\n" -" conn.auth(\"guest\", \"\").then(function() {\n" -" conn.insert(999, insertTuple).then(function() {\n" -" console.log(\"Insert succeeded\");\n" -" process.exit(0);\n" -" }, function(e) { console.log(\"Insert failed\"); process.exit(1); });\n" -" }, function(e) { console.log(\"Auth failed\"); process.exit(1); });\n" -" }, function(e) { console.log(\"Connect failed\"); process.exit(1); });" -msgstr "" -"var TarantoolConnection = require('tarantool-driver');\n" -"var conn = new TarantoolConnection({port: 3301});\n" -"var insertTuple = [99999, \"BB\"];\n" -"conn.connect().then(function() {\n" -" conn.auth(\"guest\", \"\").then(function() {\n" -" conn.insert(999, insertTuple).then(function() {\n" -" console.log(\"Insert succeeded\");\n" -" process.exit(0);\n" -" }, function(e) { console.log(\"Insert failed\"); process.exit(1); });\n" -" }, function(e) { console.log(\"Auth failed\"); process.exit(1); });\n" -" }, function(e) { console.log(\"Connect failed\"); process.exit(1); });" - -msgid "" -"The example program only shows one request and does not show all that's " -"necessary for good practice. For that, please see `The node.js driver " -"repository `_." -msgstr "" -"Эта программа --- пример отправки единственного запроса. Чтобы узнать больше" -" о том, как работать с Tarantool, пользуясь Node.js, обратитесь к " -"документации в `репозитории драйвера для Node.js " -"`_." - -msgid "C#" -msgstr "C#" - -msgid "" -"The most commonly used C# driver is `progaudi.tarantool " -"`__, previously named " -"``tarantool-csharp``. It is not supplied as part of the Tarantool " -"repository; it must be installed separately. The makers recommend `cross-" -"platform installation using Nuget " -"`__." -msgstr "" -"Самый распространенный драйвер для C# --- `progaudi.tarantool " -"`_, который раньше назывался" -" ``tarantool-csharp``. Он не входит в репозиторий Tarantool, так что его " -"необходимо устанавливать отдельно. Создатели драйвера рекомендуют " -"`кроссплатформенную установку с помощью Nuget " -"`__." - -msgid "" -"To be consistent with the other instructions in this chapter, here is a way " -"to install the driver directly on Ubuntu 16.04." -msgstr "" -"По аналогии с остальными инструкциями в главе приводится способ установки " -"драйвера напрямую на Ubuntu 16.04." - -msgid "" -"Install .net core from Microsoft. Follow `.net core installation " -"instructions `__." -msgstr "" -"Установите среду .NET Core от Microsoft. Следуйте `инструкциям по установке " -".NET Core `__." - -msgid "" -"Mono will not work, nor will .Net from xbuild. Only .net core supported on " -"Linux and Mac." -msgstr "" -"Так как на Linux и macOS поддерживается только .NET Core, установить " -"коннектор с помощью Mono или .NET от xbuild невозможно." - -msgid "" -"Read the Microsoft End User License Agreement first, because it is not an " -"ordinary open-source agreement and there will be a message during " -"installation saying \"This software may collect information about you and " -"your use of the software, and send that to Microsoft.\" Still you can `set " -"environment variables `__ to opt out from telemetry." -msgstr "" -"Прочитайте Условия лицензионного соглашения Microsoft, поскольку оно не " -"похоже на обычные соглашения для ПО с открытым кодом. Во время установки " -"появится сообщение, что ПО может собирать информацию о вас и о том, как вы " -"используете программу: \"This software may collect information about you and" -" your use of the software, and send that to Microsoft\". Тем не менее вы " -"можете `задать переменные окружения `_, чтобы не участвовать в сборе " -"телеметрических данных." - -msgid "Create a new console project." -msgstr "Создайте новый проект консольного приложения:" - -msgid "" -"$ cd ~\n" -"$ mkdir progaudi.tarantool.test\n" -"$ cd progaudi.tarantool.test\n" -"$ dotnet new console" -msgstr "" -"$ cd ~\n" -"$ mkdir progaudi.tarantool.test\n" -"$ cd progaudi.tarantool.test\n" -"$ dotnet new console" - -msgid "Add ``progaudi.tarantool`` reference." -msgstr "Добавьте пакет ``progaudi.tarantool``:" - -msgid "$ dotnet add package progaudi.tarantool" -msgstr "$ dotnet add package progaudi.tarantool" - -msgid "Change code in ``Program.cs``." -msgstr "Замените код в ``Program.cs`` на следующий:" - -msgid "" -"$ cat < Program.cs\n" -"using System;\n" -"using System.Threading.Tasks;\n" -"using ProGaudi.Tarantool.Client;\n" -"\n" -"public class HelloWorld\n" -"{\n" -" static public void Main ()\n" -" {\n" -" Test().GetAwaiter().GetResult();\n" -" }\n" -" static async Task Test()\n" -" {\n" -" var box = await Box.Connect(\"127.0.0.1:3301\");\n" -" var schema = box.GetSchema();\n" -" var space = await schema.GetSpace(\"examples\");\n" -" await space.Insert((99999, \"BB\"));\n" -" }\n" -"}\n" -"EOT" -msgstr "" -"$ cat < Program.cs\n" -"using System;\n" -"using System.Threading.Tasks;\n" -"using ProGaudi.Tarantool.Client;\n" -"\n" -"public class HelloWorld\n" -"{\n" -" static public void Main ()\n" -" {\n" -" Test().GetAwaiter().GetResult();\n" -" }\n" -" static async Task Test()\n" -" {\n" -" var box = await Box.Connect(\"127.0.0.1:3301\");\n" -" var schema = box.GetSchema();\n" -" var space = await schema.GetSpace(\"examples\");\n" -" await space.Insert((99999, \"BB\"));\n" -" }\n" -"}\n" -"EOT" - -msgid "Build and run your application." -msgstr "Соберите и запустите приложение." - -msgid "" -"Before trying to run, check that the server is listening at " -"``localhost:3301`` and that the space ``examples`` exists, as " -":ref:`described earlier `." -msgstr "" -"Перед запуском проверьте, что экземпляр прослушивает порт " -"``localhost:3301``, а в базе создан спейс ``examples``, как :ref:`предложено" -" выше `." - -msgid "" -"$ dotnet restore\n" -"$ dotnet run" -msgstr "" -"$ dotnet restore\n" -"$ dotnet run" - -msgid "The program will:" -msgstr "Программа выполнит следующие действия:" - -msgid "connect using an application-specific definition of the space," -msgstr "Установит соединение, используя определение спейса." - -msgid "" -"open a socket connection with the Tarantool server at ``localhost:3301``," -msgstr "" -"Откроет сокет для соединения с сервером Tarantool по адресу " -"``localhost:3301``." - -msgid "" -"send an INSERT request, and — if all is well — end without saying anything." -msgstr "" -"Отправит INSERT-запрос. Если он будет выполнен успешно, программа закончит " -"работу, не выводя сообщений." - -msgid "" -"If Tarantool is not running on localhost with listen port = 3301, or if user" -" 'guest' does not have authorization to connect, or if the INSERT request " -"fails for any reason, the program will print an error message, among other " -"things (stacktrace, etc)." -msgstr "" -"Если Tarantool не запущен по адресу ``localhost``, порт 3301 не " -"прослушивается, у пользователя 'guest' нет прав на установку соединения или " -"запрос на вставку по какой-либо причине не сработал, то программа выведет " -"сообщение об ошибке и сопутствующую информацию (в частности, трассировку " -"стека)." - -msgid "" -"The example program only shows one request and does not show all that’s " -"necessary for good practice. For that, please see the `progaudi.tarantool " -"driver repository `__." -msgstr "" -"Эта программа --- пример отправки единственного запроса. Чтобы узнать больше" -" о том, как работать с Tarantool, пользуясь PHP API, обратитесь к " -"документации `проекта tarantool-php на GitHub " -"`__." - -msgid "Here follow two examples of using Tarantool's high-level C API." -msgstr "" -"В этом разделе приведены два примера использования высокоуровневого API " -"Tarantool для языка C." - -msgid "Example 1" -msgstr "Пример 1" - -msgid "" -"Here is a complete C program that inserts :code:`[99999,'B']` into space " -":code:`examples` via the high-level C API." -msgstr "" -"В следующем примере приводится полноценная программа на языке C, которая " -"осуществляет вставку кортежа :code:``[99999,'B']`` в спейс :code:`examples` " -"с помощью высокоуровневого API для языка C." - -msgid "" -"#include \n" -"#include \n" -"\n" -"#include \n" -"#include \n" -"#include \n" -"\n" -"void main() {\n" -" struct tnt_stream *tnt = tnt_net(NULL); /* See note = SETUP */\n" -" tnt_set(tnt, TNT_OPT_URI, \"localhost:3301\");\n" -" if (tnt_connect(tnt) < 0) { /* See note = CONNECT */\n" -" printf(\"Connection refused\\n\");\n" -" exit(-1);\n" -" }\n" -" struct tnt_stream *tuple = tnt_object(NULL); /* See note = MAKE REQUEST */\n" -" tnt_object_format(tuple, \"[%d%s]\", 99999, \"B\");\n" -" tnt_insert(tnt, 999, tuple); /* See note = SEND REQUEST */\n" -" tnt_flush(tnt);\n" -" struct tnt_reply reply; tnt_reply_init(&reply); /* See note = GET REPLY */\n" -" tnt->read_reply(tnt, &reply);\n" -" if (reply.code != 0) {\n" -" printf(\"Insert failed %lu.\\n\", reply.code);\n" -" }\n" -" tnt_close(tnt); /* See below = TEARDOWN */\n" -" tnt_stream_free(tuple);\n" -" tnt_stream_free(tnt);\n" -"}" -msgstr "" -"#include \n" -"#include \n" -"\n" -"#include \n" -"#include \n" -"#include \n" -"\n" -"void main() {\n" -" struct tnt_stream *tnt = tnt_net(NULL); /* См. раздел \"Настройка\" ниже */\n" -" tnt_set(tnt, TNT_OPT_URI, \"localhost:3301\");\n" -" if (tnt_connect(tnt) < 0) { /* См. раздел \"Соединение\" ниже */\n" -" printf(\"Connection refused\\n\");\n" -" exit(-1);\n" -" }\n" -" struct tnt_stream *tuple = tnt_object(NULL); /* См. раздел \"Формирование запроса\" ниже */\n" -" tnt_object_format(tuple, \"[%d%s]\", 99999, \"B\");\n" -" tnt_insert(tnt, 999, tuple); /* См. раздел \"Отправка запроса\" ниже */\n" -" tnt_flush(tnt);\n" -" struct tnt_reply reply; tnt_reply_init(&reply); /* См. раздел \"Получение ответа\" ниже */\n" -" tnt->read_reply(tnt, &reply);\n" -" if (reply.code != 0) {\n" -" printf(\"Insert failed %lu.\\n\", reply.code);\n" -" }\n" -" tnt_close(tnt); /* См. раздел \"Завершение\" ниже */\n" -" tnt_stream_free(tuple);\n" -" tnt_stream_free(tnt);\n" -"}" - -msgid "" -"Paste the code into a file named :file:`example.c` and install " -"``tarantool-c``. One way to install ``tarantool-c`` (using Ubuntu) is:" -msgstr "" -"Скопируйте код программы в файл :file:`example.c` и установите коннектор " -"``tarantool-c``. Вот один из способов установки ``tarantool-c`` (на Ubuntu):" - -msgid "" -"$ git clone git://github.com/tarantool/tarantool-c.git ~/tarantool-c\n" -"$ cd ~/tarantool-c\n" -"$ git submodule init\n" -"$ git submodule update\n" -"$ cmake .\n" -"$ make\n" -"$ make install" -msgstr "" -"$ git clone git://github.com/tarantool/tarantool-c.git ~/tarantool-c\n" -"$ cd ~/tarantool-c\n" -"$ git submodule init\n" -"$ git submodule update\n" -"$ cmake .\n" -"$ make\n" -"$ make install" - -msgid "To compile and link the program, run:" -msgstr "" -"Чтобы скомпилировать и слинковать программу, выполните следующую команду:" - -msgid "" -"$ # sometimes this is necessary:\n" -"$ export LD_LIBRARY_PATH=/usr/local/lib\n" -"$ gcc -o example example.c -ltarantool" -msgstr "" -"$ # иногда это необходимо:\n" -"$ export LD_LIBRARY_PATH=/usr/local/lib\n" -"$ gcc -o example example.c -ltarantool" - -msgid "" -"Before trying to run, check that a server instance is listening at " -"``localhost:3301`` and that the space ``examples`` exists, as " -":ref:`described earlier `. To run the program, say " -":samp:`./example`. The program will connect to the Tarantool instance, and " -"will send the request. If Tarantool is not running on localhost with listen " -"address = 3301, the program will print “Connection refused”. If the insert " -"fails, the program will print \"Insert failed\" and an error number (see all" -" error codes in the source file `/src/box/errcode.h " -"`__)." -msgstr "" -"Перед запуском проверьте, что экземпляр прослушивает порт " -"``localhost:3301``, а в базе создан спейс ``examples``, как :ref:`предложено" -" выше `. Чтобы запустить программу, выполните " -"команду :samp:`./example`. Программа установит соединение с экземпляром " -"Tarantool и отправит запрос. Если Tarantool не запущен по адресу " -"``localhost`` и порт 3301 не прослушивается, то программа выведет сообщение " -"об ошибке “Connection refused”. Если запрос на вставку не будет выполнен, " -"программа выведет сообщение \"Insert failed\" и код ошибки. Все коды ошибок " -"можно найти в исходном файле `/src/box/errcode.h " -"`__." - -msgid "Here are notes corresponding to comments in the example program." -msgstr "Ниже вы найдете подробные комментарии к коду тестовой программы." - -msgid "SETUP" -msgstr "**Настройка**" - -msgid "The setup begins by creating a stream." -msgstr "Настройка начинается с создания потока." - -msgid "" -"struct tnt_stream *tnt = tnt_net(NULL);\n" -"tnt_set(tnt, TNT_OPT_URI, \"localhost:3301\");" -msgstr "" -"struct tnt_stream *tnt = tnt_net(NULL);\n" -"tnt_set(tnt, TNT_OPT_URI, \"localhost:3301\");" - -msgid "" -"In this program, the stream will be named ``tnt``. Before connecting on the " -"``tnt`` stream, some options may have to be set. The most important option " -"is TNT_OPT_URI. In this program, the :ref:`URI ` is " -"``localhost:3301``, since that is where the Tarantool instance is supposed " -"to be listening." -msgstr "" -"В нашей программе поток назван ``tnt``. Перед установкой соединения с " -"потоком ``tnt`` нужно задать ряд опций. Самая важная из них --- TNT_OPT_URI." -" Для этой опции указан :ref:`URI ` ``localhost:3301``: по этому " -"адресу должно быть настроено прослушивание на стороне экземпляра Tarantool." - -msgid "Function description:" -msgstr "Описание функции:" - -msgid "" -"struct tnt_stream *tnt_net(struct tnt_stream *s)\n" -"int tnt_set(struct tnt_stream *s, int option, variant option-value)" -msgstr "" -"struct tnt_stream *tnt_net(struct tnt_stream *s)\n" -"int tnt_set(struct tnt_stream *s, int option, variant option-value)" - -msgid "CONNECT" -msgstr "**Соединение**" - -msgid "" -"Now that the stream named ``tnt`` exists and is associated with a URI, this " -"example program can connect to a server instance." -msgstr "" -"Теперь, когда мы создали поток ``tnt`` и связали его с конкретным URI, наша " -"программа может установить соединение с экземпляром." - -msgid "" -"if (tnt_connect(tnt) < 0)\n" -" { printf(\"Connection refused\\n\"); exit(-1); }" -msgstr "" -"if (tnt_connect(tnt) < 0)\n" -" { printf(\"Connection refused\\n\"); exit(-1); }" - -msgid "int tnt_connect(struct tnt_stream *s)" -msgstr "int tnt_connect(struct tnt_stream *s)" - -msgid "" -"The connection might fail for a variety of reasons, such as: the server is " -"not running, or the URI contains an invalid :ref:`password`. If the connection fails, the return value will be -1." -msgstr "" -"Попытка соединения может оказаться неудачной по разным причинам, например " -"если Tarantool-сервер не запущен или в строке URI указан неверный " -":ref:`пароль `. В случае неудачи функция вернет " -"-1." - -msgid "MAKE REQUEST" -msgstr "**Создание запроса**" - -msgid "" -"Most requests require passing a structured value, such as the contents of a " -"tuple." -msgstr "" -"В большинстве запросов требуется передавать структурированные данные, " -"например содержимое кортежа." - -msgid "" -"struct tnt_stream *tuple = tnt_object(NULL);\n" -"tnt_object_format(tuple, \"[%d%s]\", 99999, \"B\");" -msgstr "" -"struct tnt_stream *tuple = tnt_object(NULL);\n" -"tnt_object_format(tuple, \"[%d%s]\", 99999, \"B\");" - -msgid "" -"In this program, the request will be an :ref:`INSERT`, and" -" the tuple contents will be an integer and a string. This is a simple serial" -" set of values, that is, there are no sub-structures or arrays. Therefore it" -" is easy in this case to format what will be passed using the same sort of " -"arguments that one would use with a C ``printf()`` function: ``%d`` for the " -"integer, ``%s`` for the string, then the integer value, then a pointer to " -"the string value." -msgstr "" -"В этом примере программы формируется запрос :ref:`INSERT`," -" а кортеж содержит целое число и строку. Это простой набор значений без " -"каких-либо вложенных структур или массивов. Так что передаваемые значения " -"можно указать самым простым образом --- аналогично тому, как это сделано в " -"стандартной C-функции ``printf()``: целое число ``%d``, строка ``%s``, " -"числовое значение, указатель на строковое значение." - -msgid "ssize_t tnt_object_format(struct tnt_stream *s, const char *fmt, ...)" -msgstr "ssize_t tnt_object_format(struct tnt_stream *s, const char *fmt, ...)" - -msgid "SEND REQUEST" -msgstr "**Отправка запроса**" - -msgid "" -"The database-manipulation requests are analogous to the requests in the box " -"library." -msgstr "" -"Отправка запросов на изменение данных в базе выполняется аналогично тому, " -"как это реализовано в библиотеке Tarantool ``box``." - -msgid "" -"tnt_insert(tnt, 999, tuple);\n" -"tnt_flush(tnt);" -msgstr "" -"tnt_insert(tnt, 999, tuple);\n" -"tnt_flush(tnt);" - -msgid "" -"In this program, the choice is to do an INSERT request, so the program " -"passes the ``tnt_stream`` that was used for connection (``tnt``) and the " -"``tnt_stream`` that was set up with :c:func:`tarantoolc:tnt_object_format` " -"(``tuple``)." -msgstr "" -"В этом примере выполняется INSERT-запрос. Передается поток ``tnt``, который " -"использовался для установки соединения, и поток ``tuple``, ранее настроенный" -" с помощью функции :c:func:`tarantoolc:tnt_object_format`." - -msgid "" -"ssize_t tnt_insert(struct tnt_stream *s, uint32_t space, struct tnt_stream *tuple)\n" -"ssize_t tnt_replace(struct tnt_stream *s, uint32_t space, struct tnt_stream *tuple)\n" -"ssize_t tnt_select(struct tnt_stream *s, uint32_t space, uint32_t index,\n" -" uint32_t limit, uint32_t offset, uint8_t iterator,\n" -" struct tnt_stream *key)\n" -"ssize_t tnt_update(struct tnt_stream *s, uint32_t space, uint32_t index,\n" -" struct tnt_stream *key, struct tnt_stream *ops)" -msgstr "" -"ssize_t tnt_insert(struct tnt_stream *s, uint32_t space, struct tnt_stream *tuple)\n" -"ssize_t tnt_replace(struct tnt_stream *s, uint32_t space, struct tnt_stream *tuple)\n" -"ssize_t tnt_select(struct tnt_stream *s, uint32_t space, uint32_t index,\n" -" uint32_t limit, uint32_t offset, uint8_t iterator,\n" -" struct tnt_stream *key)\n" -"ssize_t tnt_update(struct tnt_stream *s, uint32_t space, uint32_t index,\n" -" struct tnt_stream *key, struct tnt_stream *ops)" - -msgid "GET REPLY" -msgstr "**Получение ответа**" - -msgid "" -"For most requests, the client will receive a reply containing some " -"indication whether the result was successful, and a set of tuples." -msgstr "" -"В большинстве случаев ответ клиенту содержит информацию о том, был ли запрос" -" выполнен успешно, а также набор кортежей." - -msgid "" -"struct tnt_reply reply; tnt_reply_init(&reply);\n" -"tnt->read_reply(tnt, &reply);\n" -"if (reply.code != 0)\n" -" { printf(\"Insert failed %lu.\\n\", reply.code); }" -msgstr "" -"struct tnt_reply reply; tnt_reply_init(&reply);\n" -"tnt->read_reply(tnt, &reply);\n" -"if (reply.code != 0)\n" -" { printf(\"Insert failed %lu.\\n\", reply.code); }" - -msgid "" -"This program checks for success but does not decode the rest of the reply." -msgstr "" -"Эта программа проверяет, был ли запрос выполнен успешно, но никак не " -"интерпретирует оставшуюся часть ответа." - -msgid "" -"struct tnt_reply *tnt_reply_init(struct tnt_reply *r)\n" -"tnt->read_reply(struct tnt_stream *s, struct tnt_reply *r)\n" -"void tnt_reply_free(struct tnt_reply *r)" -msgstr "" -"struct tnt_reply *tnt_reply_init(struct tnt_reply *r)\n" -"tnt->read_reply(struct tnt_stream *s, struct tnt_reply *r)\n" -"void tnt_reply_free(struct tnt_reply *r)" - -msgid "TEARDOWN" -msgstr "**Завершение**" - -msgid "" -"When a session ends, the connection that was made with " -":c:func:`tarantoolc:tnt_connect` should be closed, and the objects that were" -" made in the setup should be destroyed." -msgstr "" -"По окончании сессии необходимо завершить соединение, созданное с помощью " -"функции :c:func:`tarantoolc:tnt_connect()`, и удалить объекты, созданные на " -"этапе настройки." - -msgid "" -"tnt_close(tnt);\n" -"tnt_stream_free(tuple);\n" -"tnt_stream_free(tnt);" -msgstr "" -"tnt_close(tnt);\n" -"tnt_stream_free(tuple);\n" -"tnt_stream_free(tnt);" - -msgid "" -"void tnt_close(struct tnt_stream *s)\n" -"void tnt_stream_free(struct tnt_stream *s)" -msgstr "" -"void tnt_close(struct tnt_stream *s)\n" -"void tnt_stream_free(struct tnt_stream *s)" - -msgid "Example 2" -msgstr "Пример 2" - -msgid "" -"Here is a complete C program that selects, using index key ``[99999]``, from" -" space ``examples`` via the high-level C API. To display the results, the " -"program uses functions in the `MsgPuck " -"`__ library which allow decoding of " -"`MessagePack `__ arrays." -msgstr "" -"В следующем примере приводится полноценная программа на языке C, которая " -"осуществляет выборку по индекс-ключу ``[99999]`` из спейса ``examples`` с " -"помощью высокоуровневого API для языка C. Результаты выводятся с помощью " -"функций из библиотеки `MsgPuck `__, " -"позволяющих декодировать массивы значений в формате `MessagePack " -"`__." - -msgid "" -"#include \n" -"#include \n" -"#include \n" -"#include \n" -"#include \n" -"\n" -"#define MP_SOURCE 1\n" -"#include \n" -"\n" -"void main() {\n" -" struct tnt_stream *tnt = tnt_net(NULL);\n" -" tnt_set(tnt, TNT_OPT_URI, \"localhost:3301\");\n" -" if (tnt_connect(tnt) < 0) {\n" -" printf(\"Connection refused\\n\");\n" -" exit(1);\n" -" }\n" -" struct tnt_stream *tuple = tnt_object(NULL);\n" -" tnt_object_format(tuple, \"[%d]\", 99999); /* tuple = search key */\n" -" tnt_select(tnt, 999, 0, (2^32) - 1, 0, 0, tuple);\n" -" tnt_flush(tnt);\n" -" struct tnt_reply reply; tnt_reply_init(&reply);\n" -" tnt->read_reply(tnt, &reply);\n" -" if (reply.code != 0) {\n" -" printf(\"Select failed.\\n\");\n" -" exit(1);\n" -" }\n" -" char field_type;\n" -" field_type = mp_typeof(*reply.data);\n" -" if (field_type != MP_ARRAY) {\n" -" printf(\"no tuple array\\n\");\n" -" exit(1);\n" -" }\n" -" long unsigned int row_count;\n" -" uint32_t tuple_count = mp_decode_array(&reply.data);\n" -" printf(\"tuple count=%u\\n\", tuple_count);\n" -" unsigned int i, j;\n" -" for (i = 0; i < tuple_count; ++i) {\n" -" field_type = mp_typeof(*reply.data);\n" -" if (field_type != MP_ARRAY) {\n" -" printf(\"no field array\\n\");\n" -" exit(1);\n" -" }\n" -" uint32_t field_count = mp_decode_array(&reply.data);\n" -" printf(\" field count=%u\\n\", field_count);\n" -" for (j = 0; j < field_count; ++j) {\n" -" field_type = mp_typeof(*reply.data);\n" -" if (field_type == MP_UINT) {\n" -" uint64_t num_value = mp_decode_uint(&reply.data);\n" -" printf(\" value=%lu.\\n\", num_value);\n" -" } else if (field_type == MP_STR) {\n" -" const char *str_value;\n" -" uint32_t str_value_length;\n" -" str_value = mp_decode_str(&reply.data, &str_value_length);\n" -" printf(\" value=%.*s.\\n\", str_value_length, str_value);\n" -" } else {\n" -" printf(\"wrong field type\\n\");\n" -" exit(1);\n" -" }\n" -" }\n" -" }\n" -" tnt_close(tnt);\n" -" tnt_stream_free(tuple);\n" -" tnt_stream_free(tnt);\n" -"}" -msgstr "" -"#include \n" -"#include \n" -"#include \n" -"#include \n" -"#include \n" -"\n" -"#define MP_SOURCE 1\n" -"#include \n" -"\n" -"void main() {\n" -" struct tnt_stream *tnt = tnt_net(NULL);\n" -" tnt_set(tnt, TNT_OPT_URI, \"localhost:3301\");\n" -" if (tnt_connect(tnt) < 0) {\n" -" printf(\"Connection refused\\n\");\n" -" exit(1);\n" -" }\n" -" struct tnt_stream *tuple = tnt_object(NULL);\n" -" tnt_object_format(tuple, \"[%d]\", 99999); /* кортеж tuple = ключ для поиска */\n" -" tnt_select(tnt, 999, 0, (2^32) - 1, 0, 0, tuple);\n" -" tnt_flush(tnt);\n" -" struct tnt_reply reply; tnt_reply_init(&reply);\n" -" tnt->read_reply(tnt, &reply);\n" -" if (reply.code != 0) {\n" -" printf(\"Select failed.\\n\");\n" -" exit(1);\n" -" }\n" -" char field_type;\n" -" field_type = mp_typeof(*reply.data);\n" -" if (field_type != MP_ARRAY) {\n" -" printf(\"no tuple array\\n\");\n" -" exit(1);\n" -" }\n" -" long unsigned int row_count;\n" -" uint32_t tuple_count = mp_decode_array(&reply.data);\n" -" printf(\"tuple count=%u\\n\", tuple_count);\n" -" unsigned int i, j;\n" -" for (i = 0; i < tuple_count; ++i) {\n" -" field_type = mp_typeof(*reply.data);\n" -" if (field_type != MP_ARRAY) {\n" -" printf(\"no field array\\n\");\n" -" exit(1);\n" -" }\n" -" uint32_t field_count = mp_decode_array(&reply.data);\n" -" printf(\" field count=%u\\n\", field_count);\n" -" for (j = 0; j < field_count; ++j) {\n" -" field_type = mp_typeof(*reply.data);\n" -" if (field_type == MP_UINT) {\n" -" uint64_t num_value = mp_decode_uint(&reply.data);\n" -" printf(\" value=%lu.\\n\", num_value);\n" -" } else if (field_type == MP_STR) {\n" -" const char *str_value;\n" -" uint32_t str_value_length;\n" -" str_value = mp_decode_str(&reply.data, &str_value_length);\n" -" printf(\" value=%.*s.\\n\", str_value_length, str_value);\n" -" } else {\n" -" printf(\"wrong field type\\n\");\n" -" exit(1);\n" -" }\n" -" }\n" -" }\n" -" tnt_close(tnt);\n" -" tnt_stream_free(tuple);\n" -" tnt_stream_free(tnt);\n" -"}" - -msgid "" -"Similarly to the first example, paste the code into a file named " -":file:`example2.c`." -msgstr "" -"Как и в первом примере, сохраните исходный код программы в файле " -":file:`example2.c`." - -msgid "To compile and link the program, say:" -msgstr "" -"Чтобы скомпилировать и слинковать программу, выполните следующую команду:" - -msgid "$ gcc -o example2 example2.c -ltarantool" -msgstr "$ gcc -o example2 example2.c -ltarantool" - -msgid "To run the program, say :samp:`./example2`." -msgstr "Чтобы запустить программу, выполните команду :samp:`./example2`." - -msgid "" -"The two example programs only show a few requests and do not show all that's" -" necessary for good practice. See more in the `tarantool-c documentation at " -"GitHub `__." -msgstr "" -"Эти две программы представляют собой примеры отправки двух запросов. Чтобы " -"узнать больше о том, как работать с Tarantool, пользуясь API для языка C, " -"обратитесь к документации `проекта tarantool-c на GitHub " -"`__." - -msgid "Interpreting function return values" -msgstr "Интерпретация возвращаемых значений" - -msgid "" -"For all connectors, calling a function via Tarantool causes a return in the " -"MsgPack format. If the function is called using the connector's API, some " -"conversions may occur. All scalar values are returned as tuples (with a " -"MsgPack type-identifier followed by a value); all non-scalar values are " -"returned as a group of tuples (with a MsgPack array-identifier followed by " -"the scalar values). If the function is called via the binary protocol " -"command layer -- \"eval\" -- rather than via the connector's API, no " -"conversions occur." -msgstr "" -"При работе с любым Tarantool-коннектором функции, вызванные Tarantool, " -"возвращают значения в формате MsgPack. Для функций, вызываемых через API " -"коннектора, формат возвращаемых значений следующий: скалярные значения " -"возвращаются в виде кортежей (идентификатор типа в формате MsgPack, затем " -"значение); все прочие (не скалярные) значения возвращаются в виде групп " -"кортежей (идентификатор массива в формате MsgPack, затем скалярные " -"значения). Если функция вызывается в рамках бинарного протокола (с помощью " -"команды ``eval``), а не через API коннектора, формат возвращаемых ею " -"значений не меняется." - -msgid "" -"In the following example, a Lua function will be created. Since it will be " -"accessed externally by a :ref:`'guest' user`, a :doc:`grant " -"` of an execute privilege " -"will be necessary. The function returns an empty array, a scalar string, two" -" booleans, and a short integer. The values are the ones described in the " -"table :ref:`Common Types and MsgPack Encodings `." -msgstr "" -"В примере ниже создается Lua-функция. Поскольку эту функцию будет вызывать " -"внешний пользователь :ref:`'guest' user`, необходимо с " -"помощью :doc:`grant ` " -"настроить права на исполнение. Функция возвращает пустой массив, строку-" -"скаляр, два логических значения и короткое целое число. Значения " -"соответствуют приведенным в таблице :ref:`стандартных типов в MsgPack-" -"кодировке `." - -msgid "" -"tarantool> box.cfg{listen=3301}\n" -"2016-03-03 18:45:52.802 [27381] main/101/interactive I> ready to accept requests\n" -"---\n" -"...\n" -"tarantool> function f() return {},'a',false,true,127; end\n" -"---\n" -"...\n" -"tarantool> box.schema.func.create('f')\n" -"---\n" -"...\n" -"tarantool> box.schema.user.grant('guest','execute','function','f')\n" -"---\n" -"..." -msgstr "" -"tarantool> box.cfg{listen=3301}\n" -"2016-03-03 18:45:52.802 [27381] main/101/interactive I> ready to accept requests\n" -"---\n" -"...\n" -"tarantool> function f() return {},'a',false,true,127; end\n" -"---\n" -"...\n" -"tarantool> box.schema.func.create('f')\n" -"---\n" -"...\n" -"tarantool> box.schema.user.grant('guest','execute','function','f')\n" -"---\n" -"..." - -msgid "" -"Here is a C program which calls the function. Although C is being used for " -"the example, the result would be precisely the same if the calling program " -"was written in Perl, PHP, Python, Go, or Java." -msgstr "" -"Следующая программа на C вызывает эту функцию. Хотя в примере приводится код" -" на C, результат будет одинаковым, на каком бы языке ни была написана " -"программа: Perl, PHP, Python, Go или Java." - -msgid "" -"#include \n" -"#include \n" -"#include \n" -"#include \n" -"#include \n" -"void main() {\n" -" struct tnt_stream *tnt = tnt_net(NULL); /* SETUP */\n" -" tnt_set(tnt, TNT_OPT_URI, \"localhost:3301\");\n" -" if (tnt_connect(tnt) < 0) { /* CONNECT */\n" -" printf(\"Connection refused\\n\");\n" -" exit(-1);\n" -" }\n" -" struct tnt_stream *arg; arg = tnt_object(NULL); /* MAKE REQUEST */\n" -" tnt_object_add_array(arg, 0);\n" -" struct tnt_request *req1 = tnt_request_call(NULL); /* CALL function f() */\n" -" tnt_request_set_funcz(req1, \"f\");\n" -" uint64_t sync1 = tnt_request_compile(tnt, req1);\n" -" tnt_flush(tnt); /* SEND REQUEST */\n" -" struct tnt_reply reply; tnt_reply_init(&reply); /* GET REPLY */\n" -" tnt->read_reply(tnt, &reply);\n" -" if (reply.code != 0) {\n" -" printf(\"Call failed %lu.\\n\", reply.code);\n" -" exit(-1);\n" -" }\n" -" const unsigned char *p= (unsigned char*)reply.data; /* PRINT REPLY */\n" -" while (p < (unsigned char *) reply.data_end)\n" -" {\n" -" printf(\"%x \", *p);\n" -" ++p;\n" -" }\n" -" printf(\"\\n\");\n" -" tnt_close(tnt); /* TEARDOWN */\n" -" tnt_stream_free(arg);\n" -" tnt_stream_free(tnt);\n" -"}" -msgstr "" -"#include \n" -"#include \n" -"#include \n" -"#include \n" -"#include \n" -"void main() {\n" -" struct tnt_stream *tnt = tnt_net(NULL); /* Настройка */\n" -" tnt_set(tnt, TNT_OPT_URI, \"localhost:3301\");\n" -" if (tnt_connect(tnt) < 0) { /* Соединение */\n" -" printf(\"Connection refused\\n\");\n" -" exit(-1);\n" -" }\n" -" struct tnt_stream *arg; arg = tnt_object(NULL); /* Формирование запроса */\n" -" tnt_object_add_array(arg, 0);\n" -" struct tnt_request *req1 = tnt_request_call(NULL); /* Вызов функции f() */\n" -" tnt_request_set_funcz(req1, \"f\");\n" -" uint64_t sync1 = tnt_request_compile(tnt, req1);\n" -" tnt_flush(tnt); /* Отправка запроса */\n" -" struct tnt_reply reply; tnt_reply_init(&reply); /* Получение ответа */\n" -" tnt->read_reply(tnt, &reply);\n" -" if (reply.code != 0) {\n" -" printf(\"Call failed %lu.\\n\", reply.code);\n" -" exit(-1);\n" -" }\n" -" const unsigned char *p= (unsigned char*)reply.data; /* Вывод ответа */\n" -" while (p < (unsigned char *) reply.data_end)\n" -" {\n" -" printf(\"%x \", *p);\n" -" ++p;\n" -" }\n" -" printf(\"\\n\");\n" -" tnt_close(tnt); /* Завершение */\n" -" tnt_stream_free(arg);\n" -" tnt_stream_free(tnt);\n" -"}" - -msgid "When this program is executed, it will print:" -msgstr "По завершении программа выведет на экран следующие значения:" - -msgid "dd 0 0 0 5 90 91 a1 61 91 c2 91 c3 91 7f" -msgstr "dd 0 0 0 5 90 91 a1 61 91 c2 91 c3 91 7f" - -msgid "" -"The first five bytes -- ``dd 0 0 0 5`` -- are the MsgPack encoding for " -"\"32-bit array header with value 5\" (see `MsgPack specification " -"`__). The rest are as" -" described in the table :ref:`Common Types and MsgPack Encodings `." -msgstr "" -"Первые пять байт, ``dd 0 0 0 5``, представляют собой фрагмент данных в " -"формате MsgPack и обозначают 32-битный заголовок массива со значением 5 (см." -" `спецификацию формата MsgPack " -"`_). Остальные " -"значения описаны в таблице :ref:`стандартных типов в MsgPack-кодировке " -"`." +#~ msgid "" +#~ "`SQL `_ " +#~ "support" +#~ msgstr "" +#~ "Поддержка `SQL " +#~ "`_" + +#~ msgid "No (`#62 `_)" +#~ msgstr "Нет (`#62 `_)" + +#~ msgid "" +#~ "No (`#18 `_, closed)" +#~ msgstr "" +#~ "Нет (`#18 `_, тикет " +#~ "закрыт)" + +#~ msgid "" +#~ "`Interactive transactions " +#~ "`_" +#~ msgstr "" +#~ "`Интерактивные транзакции " +#~ "`_" + +#~ msgid "No (`#101 `_)" +#~ msgstr "Нет (`#101 `_)" + +#~ msgid "" +#~ "`Varbinary `_ " +#~ "support" +#~ msgstr "" +#~ "Поддержка `varbinary " +#~ "`_" + +#~ msgid "Yes (with in-built language tools)" +#~ msgstr "Есть (встроенными инструментами языка)" + +#~ msgid "" +#~ "Yes (decodes to string by default, see `#6 " +#~ "`_)" +#~ msgstr "" +#~ "Есть (декодирование в строку по умолчанию, см. `#6 " +#~ "`_)" + +#~ msgid "" +#~ "`UUID `_ " +#~ "support" +#~ msgstr "" +#~ "Поддержка `UUID " +#~ "`_" + +#~ msgid "Decimal support" +#~ msgstr "Поддержка decimal" + +#~ msgid "No (`#96 `_)" +#~ msgstr "Нет (`#96 `_)" + +#~ msgid "" +#~ "`EXT_ERROR " +#~ "`_ support" +#~ msgstr "" +#~ "Поддержка `EXT_ERROR " +#~ "`_" + +#~ msgid "" +#~ "`Datetime `_ " +#~ "support" +#~ msgstr "" +#~ "Поддержка `datetime " +#~ "`_" + +#~ msgid "No (`#118 `_)" +#~ msgstr "Нет (`#118 `_)" + +#~ msgid "" +#~ "`box.session.push() responses " +#~ "`_" +#~ msgstr "" +#~ "`Возвращаемые значения box.session.push() " +#~ "`_" + +#~ msgid "No (`#67 `_)" +#~ msgstr "Нет (`#67 `_)" + +#~ msgid "No (`#21 `_)" +#~ msgstr "Нет (`#21 `_)" + +#~ msgid "" +#~ "`Session settings " +#~ "`_" +#~ msgstr "" +#~ "`Настройки сессии " +#~ "`_" + +#~ msgid "" +#~ "`Graceful shutdown `_" +#~ msgstr "" +#~ "`Мягкое завершение `_" + +#~ msgid "" +#~ "`IPROTO_ID (feature discovering) " +#~ "`_" +#~ msgstr "" +#~ "`IPROTO_ID (обнаружение поддерживаемых функций) " +#~ "`_" + +#~ msgid "`tarantool/crud `_ support" +#~ msgstr "Поддержка `tarantool/crud `_" + +#~ msgid "Connection pool" +#~ msgstr "Пул соединений" + +#~ msgid "" +#~ "Yes (round-robin failover, no balancing, master discovering planned in `#113" +#~ " `_)" +#~ msgstr "" +#~ "Есть (циклическое восстановление после сбоев; без балансировки; обнаружение " +#~ "мастера планируется в `#113 `_)" + +#~ msgid "Transparent reconnecting" +#~ msgstr "Прозрачное переподключение" + +#~ msgid "" +#~ "Yes (see comments in `#129 `_)" +#~ msgstr "" +#~ "Есть (см. комментарии к `#129 `_)" + +#~ msgid "" +#~ "No (handle reconnects explicitly, refer to `#11 " +#~ "`_)" +#~ msgstr "" +#~ "Нет (дескриптор переподключается явно, см. `#11 " +#~ "`_)" + +#~ msgid "" +#~ "Yes (see comments in `#7 `_)" +#~ msgstr "" +#~ "Есть (см. комментарии к `#7 " +#~ "`_)" + +#~ msgid "Transparent request retrying" +#~ msgstr "Прозрачная переотправка запроса" + +#~ msgid "`Watchers `_" +#~ msgstr "" +#~ "`Наблюдатели (watchers) `_" + +#~ msgid "Language features" +#~ msgstr "Возможности языка" + +#~ msgid "No (`#48 `_)" +#~ msgstr "Нет (`#48 `_)" + +#~ msgid "context" +#~ msgstr "context" + +#~ msgid "Miscellaneous" +#~ msgstr "Прочее" + +#~ msgid "Supports `tarantool/queue `_ API" +#~ msgstr "Поддержка API `tarantool/queue `_" + +#~ msgid "" +#~ "Can mimic a Tarantool instance (also as replica). Provides instrumentation " +#~ "for reading snapshot and xlog files via `snapio module " +#~ "`_. Implements " +#~ "unpacking of query structs if you want to implement your own iproto proxy" +#~ msgstr "" +#~ "Может имитировать экземпляр Tarantool (в том числе реплику). Предоставляет " +#~ "инструментарий для чтения снимков данных и файлов xlog с помощью `модуля " +#~ "snapio `_. " +#~ "Реализует распаковку структур запросов, если нужно реализовать свой " +#~ "собственный прокси iproto" + +#~ msgid "API is experimental and breaking changes may happen" +#~ msgstr "API коннектора экспериментальный и может значительно измениться" + +#~ msgid "R" +#~ msgstr "R" + +#~ msgid "" +#~ "Use the `tarantoolr `__ connector." +#~ msgstr "" +#~ "Используйте коннектор `tarantoolr `__." + +#~ msgid "Erlang" +#~ msgstr "Erlang" + +#~ msgid "Use the `Erlang tarantool driver `__." +#~ msgstr "" +#~ "Используйте `драйвер Tarantool на Erlang " +#~ "`__." + +#~ msgid "Perl" +#~ msgstr "Perl" + +#~ msgid "" +#~ "The most commonly used Perl driver is `tarantool-perl " +#~ "`__. It is not supplied as part" +#~ " of the Tarantool repository; it must be installed separately. The most " +#~ "common way to install it is by cloning from GitHub." +#~ msgstr "" +#~ "Самый распространенный драйвер для Perl --- `tarantool-perl " +#~ "`_. Он не входит в репозиторий " +#~ "Tarantool, его необходимо устанавливать отдельно. Проще всего установить " +#~ "его, склонировав с GitHub." + +#~ msgid "" +#~ "To avoid minor warnings that may appear the first time ``tarantool-perl`` is" +#~ " installed, start with installing some other modules that ``tarantool-perl``" +#~ " uses, with `CPAN, the Comprehensive Perl Archive Network " +#~ "`__:" +#~ msgstr "" +#~ "Чтобы избежать нескольких незначительных предупреждений, которые может " +#~ "выдать система после первой установки ``tarantool-perl``, начните установку " +#~ "с модуля `CPAN (Comprehensive Perl Archive Network, Всеобъемлющая сеть " +#~ "архивов Perl) `__. Этот модуль необходим" +#~ " для работы ``tarantool-perl``:" + +#~ msgid "" +#~ "$ sudo cpan install AnyEvent\n" +#~ "$ sudo cpan install Devel::GlobalDestruction" +#~ msgstr "" +#~ "$ sudo cpan install AnyEvent\n" +#~ "$ sudo cpan install Devel::GlobalDestruction" + +#~ msgid "Then, to install ``tarantool-perl`` itself, say:" +#~ msgstr "Затем установите ``tarantool-perl``:" + +#~ msgid "" +#~ "$ git clone https://github.com/tarantool/tarantool-perl.git tarantool-perl\n" +#~ "$ cd tarantool-perl\n" +#~ "$ git submodule init\n" +#~ "$ git submodule update --recursive\n" +#~ "$ perl Makefile.PL\n" +#~ "$ make\n" +#~ "$ sudo make install" +#~ msgstr "" +#~ "$ git clone https://github.com/tarantool/tarantool-perl.git tarantool-perl\n" +#~ "$ cd tarantool-perl\n" +#~ "$ git submodule init\n" +#~ "$ git submodule update --recursive\n" +#~ "$ perl Makefile.PL\n" +#~ "$ make\n" +#~ "$ sudo make install" + +#~ msgid "" +#~ "Here is a complete Perl program that inserts ``[99999,'BB']`` into " +#~ "``space[999]`` via the Perl API. Before trying to run, check that the server" +#~ " instance is listening at ``localhost:3301`` and that the space ``examples``" +#~ " exists, as :ref:`described earlier `. To run, " +#~ "paste the code into a file named :file:`example.pl` and say :samp:`perl " +#~ "example.pl`. The program will connect using an application-specific " +#~ "definition of the space. The program will open a socket connection with the " +#~ "Tarantool instance at ``localhost:3301``, then send an " +#~ ":ref:`space_object:INSERT ` request, then — if all is well" +#~ " — end without displaying any messages. If Tarantool is not running on " +#~ "``localhost`` with :ref:`listen ` port = 3301, the program" +#~ " will print “Connection refused”." +#~ msgstr "" +#~ "В следующем примере приводится полноценная программа на Perl, которая " +#~ "осуществляет вставку кортежа ``[99999,'BB']`` в спейс ``space[999]`` с " +#~ "помощью API для языка Perl. Перед запуском проверьте, что экземпляр " +#~ "прослушивает порт ``localhost:3301``, а в базе создан спейс ``examples``, " +#~ "как :ref:`предложено выше `. Чтобы запустить " +#~ "программу, сохраните код в файл :file:`example.pl` и выполните команду " +#~ ":samp:`perl example.pl`. Программа установит соединение, используя " +#~ "определение спейса. Затем она откроет сокет для соединения с экземпляром по " +#~ "адресу ``localhost:3301`` и отправит запрос " +#~ ":ref:`space_object:INSERT`. Если запрос будет выполнен " +#~ "успешно, программа после этого закончит работу, не выводя никаких сообщений." +#~ " Если Tarantool не запущен по адресу ``localhost`` и порт 3301 не " +#~ ":ref:`прослушивается `, то программа выведет сообщение об " +#~ "ошибке \"Connection refused\"." + +#~ msgid "" +#~ "#!/usr/bin/perl\n" +#~ "use DR::Tarantool ':constant', 'tarantool';\n" +#~ "use DR::Tarantool ':all';\n" +#~ "use DR::Tarantool::MsgPack::SyncClient;\n" +#~ "\n" +#~ "my $tnt = DR::Tarantool::MsgPack::SyncClient->connect(\n" +#~ " host => '127.0.0.1', # look for tarantool on localhost\n" +#~ " port => 3301, # on port 3301\n" +#~ " user => 'guest', # username. for 'guest' we do not also say 'password=>...'\n" +#~ "\n" +#~ " spaces => {\n" +#~ " 999 => { # definition of space[999] ...\n" +#~ " name => 'examples', # space[999] name = 'examples'\n" +#~ " default_type => 'STR', # space[999] field type is 'STR' if undefined\n" +#~ " fields => [ { # definition of space[999].fields ...\n" +#~ " name => 'field1', type => 'NUM' } ], # space[999].field[1] name='field1',type='NUM'\n" +#~ " indexes => { # definition of space[999] indexes ...\n" +#~ " 0 => {\n" +#~ " name => 'primary', fields => [ 'field1' ] } } } } );\n" +#~ "\n" +#~ "$tnt->insert('examples' => [ 99999, 'BB' ]);" +#~ msgstr "" +#~ "#!/usr/bin/perl\n" +#~ "use DR::Tarantool ':constant', 'tarantool';\n" +#~ "use DR::Tarantool ':all';\n" +#~ "use DR::Tarantool::MsgPack::SyncClient;\n" +#~ "\n" +#~ "my $tnt = DR::Tarantool::MsgPack::SyncClient->connect(\n" +#~ " host => '127.0.0.1', # поиск сервера Tarantool по адресу localhost\n" +#~ " port => 3301, # на порту 3301\n" +#~ " user => 'guest', # имя пользователя; здесь же можно задать пароль через 'password=>...'\n" +#~ " # для пользователя 'guest' пароль не задается\n" +#~ " spaces => {\n" +#~ " 999 => { # определение спейса 'space[999]' ...\n" +#~ " name => 'examples', # имя спейса 'space[999]' = 'examples'\n" +#~ " default_type => 'STR', # если тип поля в 'space[999]' не задан, то = 'STR'\n" +#~ " fields => [ { # определение полей в спейсе 'space[999]' ...\n" +#~ " name => 'field1', type => 'NUM' } ], # имя поля space[999].field[1]='field1', тип ='NUM'\n" +#~ " indexes => { # определение индексов спейса 'space[999]' ...\n" +#~ " 0 => {\n" +#~ " name => 'primary', fields => [ 'field1' ] } } } } );\n" +#~ "\n" +#~ "$tnt->insert('examples' => [ 99999, 'BB' ]);" + +#~ msgid "" +#~ "The example program uses field type names 'STR' and 'NUM' instead of " +#~ ":ref:`'string' and 'unsigned' `, due to a temporary " +#~ "Perl limitation." +#~ msgstr "" +#~ "Из-за временных ограничений языка Perl вместо полей типа :ref:`'string' и " +#~ "'unsigned' ` в тестовой программе используются поля " +#~ "типа 'STR' и 'NUM'." + +#~ msgid "" +#~ "The example program only shows one request and does not show all that's " +#~ "necessary for good practice. For that, please see the `tarantool-perl " +#~ "repository `__." +#~ msgstr "" +#~ "Эта программа --- пример отправки единственного запроса. Чтобы узнать больше" +#~ " о том, как работать с Tarantool, пользуясь языком Perl, обратитесь к " +#~ "документации в `репозитории tarantool-perl " +#~ "`__." + +#~ msgid "PHP" +#~ msgstr "PHP" + +#~ msgid "" +#~ "`tarantool-php `__ is the " +#~ "official PHP connector for Tarantool. It is not supplied as part of the " +#~ "Tarantool repository and must be installed separately (see `installation " +#~ "instructions `__ in the connector's ``README`` file)." +#~ msgstr "" +#~ "`tarantool-php `_ --- " +#~ "официальный PHP-коннектор для Tarantool. Он не входит в репозиторий " +#~ "Tarantool, так что его необходимо устанавливать отдельно. Прочитайте " +#~ "`инструкции по установке `_ в файле коннектора :file:`README`." + +#~ msgid "" +#~ "Here is a complete PHP program that inserts ``[99999,'BB']`` into a space " +#~ "named ``examples`` via the PHP API." +#~ msgstr "" +#~ "В следующем примере приводится полноценная программа на языке PHP, которая " +#~ "осуществляет вставку кортежа ``[99999,'BB']`` в спейс ``examples`` с помощью" +#~ " API для языка PHP." + +#~ msgid "" +#~ "Before trying to run, check that the server instance is :ref:`listening " +#~ "` at ``localhost:3301`` and that the space ``examples`` " +#~ "exists, as :ref:`described earlier `." +#~ msgstr "" +#~ "Перед запуском проверьте, что экземпляр :ref:`прослушивает ` порт ``localhost:3301``, а в базе создан спейс ``examples``, как " +#~ ":ref:`предложено выше `." + +#~ msgid "To run, paste the code into a file named :file:`example.php` and say:" +#~ msgstr "" +#~ "Чтобы запустить программу, сохраните код в файл :file:`example.php` и " +#~ "выполните следующую команду:" + +#~ msgid "$ php -d extension=~/tarantool-php/modules/tarantool.so example.php" +#~ msgstr "$ php -d extension=~/tarantool-php/modules/tarantool.so example.php" + +#~ msgid "" +#~ "The program will open a socket connection with the Tarantool instance at " +#~ "``localhost:3301``, then send an :ref:`INSERT ` request, " +#~ "then -- if all is well -- print \"Insert succeeded\"." +#~ msgstr "" +#~ "Программа откроет сокет для соединения с экземпляром по адресу " +#~ "``localhost:3301`` и отправит :ref:`INSERT-запрос `. При " +#~ "успешном выполнении запроса программа выведет сообщение \"Insert " +#~ "succeeded\"." + +#~ msgid "" +#~ "If the tuple already exists, the program will print \"Duplicate key exists " +#~ "in unique index 'primary' in space 'examples'\"." +#~ msgstr "" +#~ "Если такой кортеж уже существует, то программа выведет сообщение об ошибке: " +#~ "“Duplicate key exists in unique index 'primary' in space 'examples'”." + +#~ msgid "" +#~ "insert('examples', [99999, 'BB']);\n" +#~ " echo \"Insert succeeded\\n\";\n" +#~ "} catch (Exception $e) {\n" +#~ " echo $e->getMessage(), \"\\n\";\n" +#~ "}" +#~ msgstr "" +#~ "insert('examples', [99999, 'BB']);\n" +#~ " echo \"Insert succeeded\\n\";\n" +#~ "} catch (Exception $e) {\n" +#~ " echo $e->getMessage(), \"\\n\";\n" +#~ "}" + +#~ msgid "" +#~ "The example program only shows one request and does not show all that's " +#~ "necessary for good practice. For that, please see `tarantool/tarantool-php " +#~ "`__ project at GitHub." +#~ msgstr "" +#~ "Эта программа --- пример отправки единственного запроса. Чтобы узнать больше" +#~ " о том, как работать с Tarantool, пользуясь языком PHP, обратитесь к " +#~ "документации `проекта tarantool-php на GitHub " +#~ "`_." + +#~ msgid "" +#~ "Besides, there is another community-driven `tarantool-php GitHub project " +#~ "`__ which includes an `alternative " +#~ "connector `__ written in pure PHP, " +#~ "an `object mapper `__, a `queue " +#~ "`__ and other packages." +#~ msgstr "" +#~ "Кроме того, сообщество разработчиков поддерживает несколько проектов на " +#~ "GitHub. Среди них --- `проект tarantool-php `_, который включает в себя `вариант коннектора " +#~ "`_, написанный на чистом PHP, " +#~ "`модуль сопоставления объектов `_, " +#~ "`администратор очередей `_ и другие " +#~ "пакеты." + +#~ msgid "Python" +#~ msgstr "Python" + +#~ msgid "" +#~ "`tarantool-python `__ is the " +#~ "official Python connector for Tarantool. It is not supplied as part of the " +#~ "Tarantool repository and must be installed separately (see below for " +#~ "details)." +#~ msgstr "" +#~ "`tarantool-python `_ --- " +#~ "официальный Python-коннектор для Tarantool. Он не входит в репозиторий " +#~ "Tarantool, так что его необходимо устанавливать отдельно (см. подробную " +#~ "информацию ниже)." + +#~ msgid "" +#~ "Here is a complete Python program that inserts ``[99999,'Value','Value']`` " +#~ "into space ``examples`` via the high-level Python API." +#~ msgstr "" +#~ "В следующем примере приводится полноценная программа на языке Python, " +#~ "которая осуществляет вставку кортежа ``[99999,'Value','Value']`` в спейс " +#~ "``examples`` с помощью высокоуровневого API для языка Python." + +#~ msgid "" +#~ "#!/usr/bin/python\n" +#~ "from tarantool import Connection\n" +#~ "\n" +#~ "c = Connection(\"127.0.0.1\", 3301)\n" +#~ "result = c.insert(\"examples\",(99999,'Value', 'Value'))\n" +#~ "print result" +#~ msgstr "" +#~ "#!/usr/bin/python\n" +#~ "from tarantool import Connection\n" +#~ "\n" +#~ "c = Connection(\"127.0.0.1\", 3301)\n" +#~ "result = c.insert(\"examples\",(99999,'Value', 'Value'))\n" +#~ "print result" + +#~ msgid "" +#~ "To prepare, paste the code into a file named :file:`example.py` and install " +#~ "the ``tarantool-python`` connector with either :samp:`pip install " +#~ "tarantool\\>0.4` to install in :file:`/usr` (requires **root** privilege) or" +#~ " :samp:`pip install tarantool\\>0.4 --user` to install in :file:`~` i.e. " +#~ "user's default directory." +#~ msgstr "" +#~ "Перед запуском тестовой программы сохраните ее код в файл :file:`example.py`" +#~ " и установите коннектор ``tarantool-python``. Чтобы установить его в " +#~ "директорию :file:`/usr`, используйте команду :samp:`pip install " +#~ "tarantool\\>0.4`. Для этого требуются права уровня **root**. Вместо этого вы" +#~ " можете установить коннектор в директорию :file:`~`, т.е. в используемую по " +#~ "умолчанию директорию текущего пользователя. Для этого выполните команду " +#~ ":samp:`pip install tarantool\\>0.4 --user`." + +#~ msgid "" +#~ "Before trying to run, check that the server instance is :ref:`listening " +#~ "` at ``localhost:3301`` and that the space ``examples`` " +#~ "exists, as :ref:`described earlier `. To run the " +#~ "program, say :samp:`python example.py`. The program will connect to the " +#~ "Tarantool server, will send the :ref:`INSERT ` request, " +#~ "and will not throw any exception if all went well. If the tuple already " +#~ "exists, the program will throw ``tarantool.error.DatabaseError: (3, " +#~ "\"Duplicate key exists in unique index 'primary' in space 'examples'\")``." +#~ msgstr "" +#~ "Перед запуском проверьте, что экземпляр прослушивает порт " +#~ "``localhost:3301``, а в базе создан спейс ``examples``, как :ref:`предложено" +#~ " выше `. Чтобы запустить тестовую программу, " +#~ "выполните команду :samp:`python example.py`. Программа установит соединение " +#~ "с сервером Tarantool и отправит запрос :ref:`INSERT`. Если" +#~ " запрос будет выполнен успешно, программа не сгенерирует исключений. Если " +#~ "окажется, что такой кортеж уже существует, то программа сгенерирует " +#~ "исключение `tarantool.error.DatabaseError: (3, \"Duplicate key exists in " +#~ "unique index 'primary' in space 'examples'\")`." + +#~ msgid "" +#~ "The example program only shows one request and does not show all that's " +#~ "necessary for good practice. For that, please see `tarantool-python " +#~ "`__ project at GitHub. For an " +#~ "example of using Python API with `queue managers for Tarantool " +#~ "`__, see `queue-python " +#~ "`__ project at GitHub." +#~ msgstr "" +#~ "Эта программа --- пример отправки единственного запроса. Чтобы узнать больше" +#~ " о том, как работать с Tarantool, пользуясь языком Python, обратитесь к " +#~ "документации `проекта tarantool-python на GitHub " +#~ "`_. А на странице `проекта " +#~ "queue-python на GitHub `_ вы " +#~ "найдете примеры использования Python API для работы с `очередями сообщений в" +#~ " Tarantool `_." + +#~ msgid "Also there are several community-driven Python connectors:" +#~ msgstr "" +#~ "Кроме того, сообщество разработчиков поддерживает следующие Python-" +#~ "коннекторы:" + +#~ msgid "" +#~ "`asynctnt `__ with asyncio support" +#~ msgstr "" +#~ "`asynctnt `_ с поддержкой asyncio" + +#~ msgid "" +#~ "`aiotarantool `__ also with " +#~ "asyncio support" +#~ msgstr "" +#~ "`aiotarantool `_, также с " +#~ "поддержкой asyncio" + +#~ msgid "" +#~ "`gtarantool `__ with gevent " +#~ "support, **no active maintenance**" +#~ msgstr "" +#~ "`gtarantool `__ с поддержкой " +#~ "gevent, **не обновляется**" + +#~ msgid "" +#~ "The table below contains a feature comparison for asynctnt, gtarantool and " +#~ "tarantool-python. aiotarantool is absent there because it is quite outdated " +#~ "and unmaintained." +#~ msgstr "" +#~ "В этой таблице сравниваются функции коннекторов asynctnt, gtarantool и " +#~ "tarantool-python. aiotarantool здесь отсутствует, так как он устарел и " +#~ "больше не поддерживается." + +#~ msgid "Last update: May 2022" +#~ msgstr "Последнее обновление: май 2022" + +#~ msgid "Parameter" +#~ msgstr "Параметры" + +#~ msgid "`igorcoding/asynctnt `__" +#~ msgstr "`igorcoding/asynctnt `__" + +#~ msgid "`shveenkov/gtarantool `__" +#~ msgstr "`shveenkov/gtarantool `__" + +#~ msgid "" +#~ "`tarantool/tarantool-python `__" +#~ msgstr "" +#~ "`tarantool/tarantool-python `__" + +#~ msgid "Apache License 2.0" +#~ msgstr "Apache License 2.0" + +#~ msgid "LGPL" +#~ msgstr "LGPL" + +#~ msgid "BSD-2" +#~ msgstr "BSD-2" + +#~ msgid "Is maintained" +#~ msgstr "Поддерживается" + +#~ msgid "No (last updated in 2018)" +#~ msgstr "Нет (последнее обновление в 2018)" + +#~ msgid "Known Issues" +#~ msgstr "Известные проблемы" + +#~ msgid "" +#~ "`issue #18 `__ (no running" +#~ " event loop)" +#~ msgstr "" +#~ "`тикет #18 `__ (нет " +#~ "событийного цикла)" + +#~ msgid "None" +#~ msgstr "Нет" + +#~ msgid "" +#~ "`issue #105 `__ " +#~ "(unpack of binary data)" +#~ msgstr "" +#~ "`тикет #105 `__ " +#~ "(распаковка бинарных данных)" + +#~ msgid "Yes (`github.io `__)" +#~ msgstr "Есть (`github.io `__)" + +#~ msgid "" +#~ "Yes (`tarantool.io " +#~ "`__" +#~ " and `readthedocs `__ (`obsolete `__))" +#~ msgstr "" +#~ "Есть (`tarantool.io " +#~ "`__" +#~ " и `readthedocs `__ (`неактуальна `__))" + +#~ msgid "No (tests exist)" +#~ msgstr "Нет (есть тесты)" + +#~ msgid "AppVeyor (only Windows)" +#~ msgstr "AppVeyor (только на Windows)" + +#~ msgid "51" +#~ msgstr "51" + +#~ msgid "17" +#~ msgstr "17" + +#~ msgid "78" +#~ msgstr "78" + +#~ msgid "Static Analysis" +#~ msgstr "Статический анализ" + +#~ msgid "Yes (Flake8)" +#~ msgstr "Есть (Flake8)" + +#~ msgid "`pip `__" +#~ msgstr "`pip `__" + +#~ msgid "`pip `__" +#~ msgstr "`pip `__" + +#~ msgid "" +#~ "`deb, rpm, pip `__" +#~ msgstr "" +#~ "`deb, rpm, pip `__" + +#~ msgid "Support asynchronous mode" +#~ msgstr "Поддержка асинхронного режима" + +#~ msgid "Yes, `asyncio `__" +#~ msgstr "Есть, `asyncio `__" + +#~ msgid "" +#~ "Yes (`gevent " +#~ "`__, " +#~ "example: `test_gevent.py " +#~ "`__)" +#~ msgstr "" +#~ "Есть, `gevent " +#~ "`__ " +#~ "(пример: `test_gevent.py " +#~ "`__)" + +#~ msgid "Batching support" +#~ msgstr "Поддержка пакетной обработки" + +#~ msgid "" +#~ "No (`issue #55 `__)" +#~ msgstr "" +#~ "Нет (`тикет #55 `__)" + +#~ msgid "" +#~ "Yes (automatically, see `auto_refetch_schema " +#~ "`__)" +#~ msgstr "" +#~ "Автоматическое (см. `auto_refetch_schema " +#~ "`__)" + +#~ msgid "Yes (automatically)" +#~ msgstr "Автоматическое" + +#~ msgid "" +#~ "`SQL support " +#~ "`__" +#~ msgstr "" +#~ "`Поддержка SQL " +#~ "`__" + +#~ msgid "Yes (tests/test_op_sql.py)" +#~ msgstr "Есть (tests/test_op_sql.py)" + +#~ msgid "Yes (tarantool/connection.py)" +#~ msgstr "Есть (tarantool/connection.py)" + +#~ msgid "" +#~ "`Interactive transactions " +#~ "`__" +#~ msgstr "" +#~ "`Интерактивные транзакции " +#~ "`__" + +#~ msgid "" +#~ "No (`issue #163 `__)" +#~ msgstr "" +#~ "Нет (`тикет #163 `__)" + +#~ msgid "" +#~ "`Varbinary support " +#~ "`__" +#~ msgstr "" +#~ "`Поддержка varbinary " +#~ "`__" + +#~ msgid "" +#~ "Yes (`issue #105 `__)" +#~ msgstr "" +#~ "Есть (`тикет #105 `__)" + +#~ msgid "" +#~ "`UUID support " +#~ "`__" +#~ msgstr "" +#~ "`Поддержка UUID " +#~ "`__" + +#~ msgid "" +#~ "`Decimal support " +#~ "`__" +#~ msgstr "" +#~ "`Поддержка decimal " +#~ "`__" + +#~ msgid "Almost (v2 branch)" +#~ msgstr "Частично (в ветке v2)" + +#~ msgid "" +#~ "`EXT_ERROR support " +#~ "`__" +#~ msgstr "" +#~ "`Поддержка EXT_ERROR " +#~ "`__" + +#~ msgid "" +#~ "`Datetime support " +#~ "`__" +#~ msgstr "" +#~ "`Поддержка datetime " +#~ "`__" + +#~ msgid "" +#~ "`box.session.push() responses " +#~ "`__" +#~ msgstr "" +#~ "`Возвращаемые значения box.session.push() " +#~ "`__" + +#~ msgid "Yes (see push_subscribe option and docs/pushes.rst)" +#~ msgstr "Есть (см. push_subscribe option и docs/pushes.rst)" + +#~ msgid "" +#~ "`Session settings " +#~ "`__" +#~ msgstr "" +#~ "`Настройки сессии " +#~ "`__" + +#~ msgid "" +#~ "`Graceful shutdown `__" +#~ msgstr "" +#~ "`Мягкое завершение `__" + +#~ msgid "" +#~ "`IPROTO_ID (feature discovering) " +#~ "`__" +#~ msgstr "" +#~ "`IPROTO_ID (обнаружение поддерживаемых функций) " +#~ "`__" + +#~ msgid "Support `CRUD `__" +#~ msgstr "Поддержка `CRUD `__" + +#~ msgid "Autoreconnect" +#~ msgstr "Автоматическое переподключение" + +#~ msgid "Yes (reconnect_max_attempts, reconnect_delay)" +#~ msgstr "Есть (reconnect_max_attempts, reconnect_delay)" + +#~ msgid "" +#~ "Yes (reconnect_max_attempts, reconnect_delay), checking of connection " +#~ "liveness" +#~ msgstr "" +#~ "Есть (reconnect_max_attempts, reconnect_delay), проверка состояния " +#~ "соединения" + +#~ msgid "Yes (with master discovery)" +#~ msgstr "Есть (с обнаружением мастера)" + +#~ msgid "" +#~ "Support of `PEP 249 -- Python Database API Specification v2.0 " +#~ "`__" +#~ msgstr "" +#~ "Поддержка `PEP 249 --- Python Database API Specification v2.0 " +#~ "`__" + +#~ msgid "" +#~ "`Yes `__" +#~ msgstr "" +#~ "`Есть `__" + +#~ msgid "Node.js" +#~ msgstr "Node.js" + +#~ msgid "" +#~ "The most commonly used node.js driver is the `Node Tarantool driver " +#~ "`_. It is not supplied as " +#~ "part of the Tarantool repository; it must be installed separately. The most " +#~ "common way to install it is with `npm `_. For example, on Ubuntu, the installation " +#~ "could look like this after npm has been installed:" +#~ msgstr "" +#~ "Самый распространенный драйвер для Node.js --- `Node Tarantool driver " +#~ "`_. Он не входит в " +#~ "репозиторий Tarantool, так что его необходимо устанавливать отдельно. Проще " +#~ "всего установить его с помощью `npm `_. Например, на Ubuntu установка драйвера будет" +#~ " выглядеть следующим образом (в этом примере менеджер пакетов npm уже " +#~ "установлен):" + +#~ msgid "$ npm install tarantool-driver --global" +#~ msgstr "$ npm install tarantool-driver --global" + +#~ msgid "" +#~ "Here is a complete node.js program that inserts ``[99999,'BB']`` into " +#~ "``space[999]`` via the node.js API. Before trying to run, check that the " +#~ "server instance is :ref:`listening ` at ``localhost:3301``" +#~ " and that the space ``examples`` exists, as :ref:`described earlier `. To run, paste the code into a file named " +#~ ":file:`example.rs` and say ``node example.rs``. The program will connect " +#~ "using an application-specific definition of the space. The program will open" +#~ " a socket connection with the Tarantool instance at ``localhost:3301``, then" +#~ " send an :ref:`INSERT ` request, then — if all is well — " +#~ "end after saying \"Insert succeeded\". If Tarantool is not running on " +#~ "``localhost`` with listen port = 3301, the program will print “Connect " +#~ "failed”. If :ref:`the 'guest' user ` does not have " +#~ "authorization to connect, the program will print \"Auth failed\". If the " +#~ "insert request fails for any reason, for example because the tuple already " +#~ "exists, the program will print \"Insert failed\"." +#~ msgstr "" +#~ "В следующем примере приводится полноценная программа, написанная с " +#~ "использованием Node.js. Эта программа осуществляет вставку кортежа " +#~ "``[99999,'BB']`` в спейс ``space[999]`` с помощью API для Node.js. Перед " +#~ "запуском проверьте, что экземпляр :ref:`прослушивает ` " +#~ "порт ``localhost:3301``, а в базе создан спейс ``examples``, как " +#~ ":ref:`предложено выше `. Чтобы запустить программу," +#~ " сохраните код в файл :file:`example.rs` и выполните команду ``node " +#~ "example.rs``. Программа установит соединение, используя определение спейса. " +#~ "Затем она откроет сокет для соединения с экземпляром по адресу " +#~ "``localhost:3301`` и отправит :ref:`INSERT-запрос `. Если " +#~ "запрос будет выполнен успешно, программа выведет сообщение \"Insert " +#~ "succeeded\". Если Tarantool не запущен по адресу ``localhost`` и порт 3301 " +#~ "не прослушивается, то программа выведет сообщение об ошибке “Connect " +#~ "failed”. Если у :ref:`пользователя 'guest' ` нет прав на " +#~ "установку соединения, программа выведет сообщение об ошибке \"Auth failed\"." +#~ " Если запрос на вставку по какой-либо причине не сработает (например, такой " +#~ "кортеж уже существует), то программа выведет сообщение об ошибке \"Insert " +#~ "failed\"." + +#~ msgid "" +#~ "var TarantoolConnection = require('tarantool-driver');\n" +#~ "var conn = new TarantoolConnection({port: 3301});\n" +#~ "var insertTuple = [99999, \"BB\"];\n" +#~ "conn.connect().then(function() {\n" +#~ " conn.auth(\"guest\", \"\").then(function() {\n" +#~ " conn.insert(999, insertTuple).then(function() {\n" +#~ " console.log(\"Insert succeeded\");\n" +#~ " process.exit(0);\n" +#~ " }, function(e) { console.log(\"Insert failed\"); process.exit(1); });\n" +#~ " }, function(e) { console.log(\"Auth failed\"); process.exit(1); });\n" +#~ " }, function(e) { console.log(\"Connect failed\"); process.exit(1); });" +#~ msgstr "" +#~ "var TarantoolConnection = require('tarantool-driver');\n" +#~ "var conn = new TarantoolConnection({port: 3301});\n" +#~ "var insertTuple = [99999, \"BB\"];\n" +#~ "conn.connect().then(function() {\n" +#~ " conn.auth(\"guest\", \"\").then(function() {\n" +#~ " conn.insert(999, insertTuple).then(function() {\n" +#~ " console.log(\"Insert succeeded\");\n" +#~ " process.exit(0);\n" +#~ " }, function(e) { console.log(\"Insert failed\"); process.exit(1); });\n" +#~ " }, function(e) { console.log(\"Auth failed\"); process.exit(1); });\n" +#~ " }, function(e) { console.log(\"Connect failed\"); process.exit(1); });" + +#~ msgid "" +#~ "The example program only shows one request and does not show all that's " +#~ "necessary for good practice. For that, please see `The node.js driver " +#~ "repository `_." +#~ msgstr "" +#~ "Эта программа --- пример отправки единственного запроса. Чтобы узнать больше" +#~ " о том, как работать с Tarantool, пользуясь Node.js, обратитесь к " +#~ "документации в `репозитории драйвера для Node.js " +#~ "`_." + +#~ msgid "C#" +#~ msgstr "C#" + +#~ msgid "" +#~ "The most commonly used C# driver is `progaudi.tarantool " +#~ "`__, previously named " +#~ "``tarantool-csharp``. It is not supplied as part of the Tarantool " +#~ "repository; it must be installed separately. The makers recommend `cross-" +#~ "platform installation using Nuget " +#~ "`__." +#~ msgstr "" +#~ "Самый распространенный драйвер для C# --- `progaudi.tarantool " +#~ "`_, который раньше назывался" +#~ " ``tarantool-csharp``. Он не входит в репозиторий Tarantool, так что его " +#~ "необходимо устанавливать отдельно. Создатели драйвера рекомендуют " +#~ "`кроссплатформенную установку с помощью Nuget " +#~ "`__." + +#~ msgid "" +#~ "To be consistent with the other instructions in this chapter, here is a way " +#~ "to install the driver directly on Ubuntu 16.04." +#~ msgstr "" +#~ "По аналогии с остальными инструкциями в главе приводится способ установки " +#~ "драйвера напрямую на Ubuntu 16.04." + +#~ msgid "" +#~ "Install .net core from Microsoft. Follow `.net core installation " +#~ "instructions `__." +#~ msgstr "" +#~ "Установите среду .NET Core от Microsoft. Следуйте `инструкциям по установке " +#~ ".NET Core `__." + +#~ msgid "" +#~ "Mono will not work, nor will .Net from xbuild. Only .net core supported on " +#~ "Linux and Mac." +#~ msgstr "" +#~ "Так как на Linux и macOS поддерживается только .NET Core, установить " +#~ "коннектор с помощью Mono или .NET от xbuild невозможно." + +#~ msgid "" +#~ "Read the Microsoft End User License Agreement first, because it is not an " +#~ "ordinary open-source agreement and there will be a message during " +#~ "installation saying \"This software may collect information about you and " +#~ "your use of the software, and send that to Microsoft.\" Still you can `set " +#~ "environment variables `__ to opt out from telemetry." +#~ msgstr "" +#~ "Прочитайте Условия лицензионного соглашения Microsoft, поскольку оно не " +#~ "похоже на обычные соглашения для ПО с открытым кодом. Во время установки " +#~ "появится сообщение, что ПО может собирать информацию о вас и о том, как вы " +#~ "используете программу: \"This software may collect information about you and" +#~ " your use of the software, and send that to Microsoft\". Тем не менее вы " +#~ "можете `задать переменные окружения `_, чтобы не участвовать в сборе " +#~ "телеметрических данных." + +#~ msgid "Create a new console project." +#~ msgstr "Создайте новый проект консольного приложения:" + +#~ msgid "" +#~ "$ cd ~\n" +#~ "$ mkdir progaudi.tarantool.test\n" +#~ "$ cd progaudi.tarantool.test\n" +#~ "$ dotnet new console" +#~ msgstr "" +#~ "$ cd ~\n" +#~ "$ mkdir progaudi.tarantool.test\n" +#~ "$ cd progaudi.tarantool.test\n" +#~ "$ dotnet new console" + +#~ msgid "Add ``progaudi.tarantool`` reference." +#~ msgstr "Добавьте пакет ``progaudi.tarantool``:" + +#~ msgid "$ dotnet add package progaudi.tarantool" +#~ msgstr "$ dotnet add package progaudi.tarantool" + +#~ msgid "Change code in ``Program.cs``." +#~ msgstr "Замените код в ``Program.cs`` на следующий:" + +#~ msgid "" +#~ "$ cat < Program.cs\n" +#~ "using System;\n" +#~ "using System.Threading.Tasks;\n" +#~ "using ProGaudi.Tarantool.Client;\n" +#~ "\n" +#~ "public class HelloWorld\n" +#~ "{\n" +#~ " static public void Main ()\n" +#~ " {\n" +#~ " Test().GetAwaiter().GetResult();\n" +#~ " }\n" +#~ " static async Task Test()\n" +#~ " {\n" +#~ " var box = await Box.Connect(\"127.0.0.1:3301\");\n" +#~ " var schema = box.GetSchema();\n" +#~ " var space = await schema.GetSpace(\"examples\");\n" +#~ " await space.Insert((99999, \"BB\"));\n" +#~ " }\n" +#~ "}\n" +#~ "EOT" +#~ msgstr "" +#~ "$ cat < Program.cs\n" +#~ "using System;\n" +#~ "using System.Threading.Tasks;\n" +#~ "using ProGaudi.Tarantool.Client;\n" +#~ "\n" +#~ "public class HelloWorld\n" +#~ "{\n" +#~ " static public void Main ()\n" +#~ " {\n" +#~ " Test().GetAwaiter().GetResult();\n" +#~ " }\n" +#~ " static async Task Test()\n" +#~ " {\n" +#~ " var box = await Box.Connect(\"127.0.0.1:3301\");\n" +#~ " var schema = box.GetSchema();\n" +#~ " var space = await schema.GetSpace(\"examples\");\n" +#~ " await space.Insert((99999, \"BB\"));\n" +#~ " }\n" +#~ "}\n" +#~ "EOT" + +#~ msgid "Build and run your application." +#~ msgstr "Соберите и запустите приложение." + +#~ msgid "" +#~ "Before trying to run, check that the server is listening at " +#~ "``localhost:3301`` and that the space ``examples`` exists, as " +#~ ":ref:`described earlier `." +#~ msgstr "" +#~ "Перед запуском проверьте, что экземпляр прослушивает порт " +#~ "``localhost:3301``, а в базе создан спейс ``examples``, как :ref:`предложено" +#~ " выше `." + +#~ msgid "" +#~ "$ dotnet restore\n" +#~ "$ dotnet run" +#~ msgstr "" +#~ "$ dotnet restore\n" +#~ "$ dotnet run" + +#~ msgid "The program will:" +#~ msgstr "Программа выполнит следующие действия:" + +#~ msgid "connect using an application-specific definition of the space," +#~ msgstr "Установит соединение, используя определение спейса." + +#~ msgid "" +#~ "open a socket connection with the Tarantool server at ``localhost:3301``," +#~ msgstr "" +#~ "Откроет сокет для соединения с сервером Tarantool по адресу " +#~ "``localhost:3301``." + +#~ msgid "" +#~ "send an INSERT request, and — if all is well — end without saying anything." +#~ msgstr "" +#~ "Отправит INSERT-запрос. Если он будет выполнен успешно, программа закончит " +#~ "работу, не выводя сообщений." + +#~ msgid "" +#~ "If Tarantool is not running on localhost with listen port = 3301, or if user" +#~ " 'guest' does not have authorization to connect, or if the INSERT request " +#~ "fails for any reason, the program will print an error message, among other " +#~ "things (stacktrace, etc)." +#~ msgstr "" +#~ "Если Tarantool не запущен по адресу ``localhost``, порт 3301 не " +#~ "прослушивается, у пользователя 'guest' нет прав на установку соединения или " +#~ "запрос на вставку по какой-либо причине не сработал, то программа выведет " +#~ "сообщение об ошибке и сопутствующую информацию (в частности, трассировку " +#~ "стека)." + +#~ msgid "" +#~ "The example program only shows one request and does not show all that’s " +#~ "necessary for good practice. For that, please see the `progaudi.tarantool " +#~ "driver repository `__." +#~ msgstr "" +#~ "Эта программа --- пример отправки единственного запроса. Чтобы узнать больше" +#~ " о том, как работать с Tarantool, пользуясь PHP API, обратитесь к " +#~ "документации `проекта tarantool-php на GitHub " +#~ "`__." + +#~ msgid "Here follow two examples of using Tarantool's high-level C API." +#~ msgstr "" +#~ "В этом разделе приведены два примера использования высокоуровневого API " +#~ "Tarantool для языка C." + +#~ msgid "Example 1" +#~ msgstr "Пример 1" + +#~ msgid "" +#~ "Here is a complete C program that inserts :code:`[99999,'B']` into space " +#~ ":code:`examples` via the high-level C API." +#~ msgstr "" +#~ "В следующем примере приводится полноценная программа на языке C, которая " +#~ "осуществляет вставку кортежа :code:``[99999,'B']`` в спейс :code:`examples` " +#~ "с помощью высокоуровневого API для языка C." + +#~ msgid "" +#~ "#include \n" +#~ "#include \n" +#~ "\n" +#~ "#include \n" +#~ "#include \n" +#~ "#include \n" +#~ "\n" +#~ "void main() {\n" +#~ " struct tnt_stream *tnt = tnt_net(NULL); /* See note = SETUP */\n" +#~ " tnt_set(tnt, TNT_OPT_URI, \"localhost:3301\");\n" +#~ " if (tnt_connect(tnt) < 0) { /* See note = CONNECT */\n" +#~ " printf(\"Connection refused\\n\");\n" +#~ " exit(-1);\n" +#~ " }\n" +#~ " struct tnt_stream *tuple = tnt_object(NULL); /* See note = MAKE REQUEST */\n" +#~ " tnt_object_format(tuple, \"[%d%s]\", 99999, \"B\");\n" +#~ " tnt_insert(tnt, 999, tuple); /* See note = SEND REQUEST */\n" +#~ " tnt_flush(tnt);\n" +#~ " struct tnt_reply reply; tnt_reply_init(&reply); /* See note = GET REPLY */\n" +#~ " tnt->read_reply(tnt, &reply);\n" +#~ " if (reply.code != 0) {\n" +#~ " printf(\"Insert failed %lu.\\n\", reply.code);\n" +#~ " }\n" +#~ " tnt_close(tnt); /* See below = TEARDOWN */\n" +#~ " tnt_stream_free(tuple);\n" +#~ " tnt_stream_free(tnt);\n" +#~ "}" +#~ msgstr "" +#~ "#include \n" +#~ "#include \n" +#~ "\n" +#~ "#include \n" +#~ "#include \n" +#~ "#include \n" +#~ "\n" +#~ "void main() {\n" +#~ " struct tnt_stream *tnt = tnt_net(NULL); /* См. раздел \"Настройка\" ниже */\n" +#~ " tnt_set(tnt, TNT_OPT_URI, \"localhost:3301\");\n" +#~ " if (tnt_connect(tnt) < 0) { /* См. раздел \"Соединение\" ниже */\n" +#~ " printf(\"Connection refused\\n\");\n" +#~ " exit(-1);\n" +#~ " }\n" +#~ " struct tnt_stream *tuple = tnt_object(NULL); /* См. раздел \"Формирование запроса\" ниже */\n" +#~ " tnt_object_format(tuple, \"[%d%s]\", 99999, \"B\");\n" +#~ " tnt_insert(tnt, 999, tuple); /* См. раздел \"Отправка запроса\" ниже */\n" +#~ " tnt_flush(tnt);\n" +#~ " struct tnt_reply reply; tnt_reply_init(&reply); /* См. раздел \"Получение ответа\" ниже */\n" +#~ " tnt->read_reply(tnt, &reply);\n" +#~ " if (reply.code != 0) {\n" +#~ " printf(\"Insert failed %lu.\\n\", reply.code);\n" +#~ " }\n" +#~ " tnt_close(tnt); /* См. раздел \"Завершение\" ниже */\n" +#~ " tnt_stream_free(tuple);\n" +#~ " tnt_stream_free(tnt);\n" +#~ "}" + +#~ msgid "" +#~ "Paste the code into a file named :file:`example.c` and install " +#~ "``tarantool-c``. One way to install ``tarantool-c`` (using Ubuntu) is:" +#~ msgstr "" +#~ "Скопируйте код программы в файл :file:`example.c` и установите коннектор " +#~ "``tarantool-c``. Вот один из способов установки ``tarantool-c`` (на Ubuntu):" + +#~ msgid "" +#~ "$ git clone git://github.com/tarantool/tarantool-c.git ~/tarantool-c\n" +#~ "$ cd ~/tarantool-c\n" +#~ "$ git submodule init\n" +#~ "$ git submodule update\n" +#~ "$ cmake .\n" +#~ "$ make\n" +#~ "$ make install" +#~ msgstr "" +#~ "$ git clone git://github.com/tarantool/tarantool-c.git ~/tarantool-c\n" +#~ "$ cd ~/tarantool-c\n" +#~ "$ git submodule init\n" +#~ "$ git submodule update\n" +#~ "$ cmake .\n" +#~ "$ make\n" +#~ "$ make install" + +#~ msgid "To compile and link the program, run:" +#~ msgstr "" +#~ "Чтобы скомпилировать и слинковать программу, выполните следующую команду:" + +#~ msgid "" +#~ "$ # sometimes this is necessary:\n" +#~ "$ export LD_LIBRARY_PATH=/usr/local/lib\n" +#~ "$ gcc -o example example.c -ltarantool" +#~ msgstr "" +#~ "$ # иногда это необходимо:\n" +#~ "$ export LD_LIBRARY_PATH=/usr/local/lib\n" +#~ "$ gcc -o example example.c -ltarantool" + +#~ msgid "" +#~ "Before trying to run, check that a server instance is listening at " +#~ "``localhost:3301`` and that the space ``examples`` exists, as " +#~ ":ref:`described earlier `. To run the program, say " +#~ ":samp:`./example`. The program will connect to the Tarantool instance, and " +#~ "will send the request. If Tarantool is not running on localhost with listen " +#~ "address = 3301, the program will print “Connection refused”. If the insert " +#~ "fails, the program will print \"Insert failed\" and an error number (see all" +#~ " error codes in the source file `/src/box/errcode.h " +#~ "`__)." +#~ msgstr "" +#~ "Перед запуском проверьте, что экземпляр прослушивает порт " +#~ "``localhost:3301``, а в базе создан спейс ``examples``, как :ref:`предложено" +#~ " выше `. Чтобы запустить программу, выполните " +#~ "команду :samp:`./example`. Программа установит соединение с экземпляром " +#~ "Tarantool и отправит запрос. Если Tarantool не запущен по адресу " +#~ "``localhost`` и порт 3301 не прослушивается, то программа выведет сообщение " +#~ "об ошибке “Connection refused”. Если запрос на вставку не будет выполнен, " +#~ "программа выведет сообщение \"Insert failed\" и код ошибки. Все коды ошибок " +#~ "можно найти в исходном файле `/src/box/errcode.h " +#~ "`__." + +#~ msgid "Here are notes corresponding to comments in the example program." +#~ msgstr "Ниже вы найдете подробные комментарии к коду тестовой программы." + +#~ msgid "SETUP" +#~ msgstr "**Настройка**" + +#~ msgid "The setup begins by creating a stream." +#~ msgstr "Настройка начинается с создания потока." + +#~ msgid "" +#~ "struct tnt_stream *tnt = tnt_net(NULL);\n" +#~ "tnt_set(tnt, TNT_OPT_URI, \"localhost:3301\");" +#~ msgstr "" +#~ "struct tnt_stream *tnt = tnt_net(NULL);\n" +#~ "tnt_set(tnt, TNT_OPT_URI, \"localhost:3301\");" + +#~ msgid "" +#~ "In this program, the stream will be named ``tnt``. Before connecting on the " +#~ "``tnt`` stream, some options may have to be set. The most important option " +#~ "is TNT_OPT_URI. In this program, the :ref:`URI ` is " +#~ "``localhost:3301``, since that is where the Tarantool instance is supposed " +#~ "to be listening." +#~ msgstr "" +#~ "В нашей программе поток назван ``tnt``. Перед установкой соединения с " +#~ "потоком ``tnt`` нужно задать ряд опций. Самая важная из них --- TNT_OPT_URI." +#~ " Для этой опции указан :ref:`URI ` ``localhost:3301``: по этому " +#~ "адресу должно быть настроено прослушивание на стороне экземпляра Tarantool." + +#~ msgid "Function description:" +#~ msgstr "Описание функции:" + +#~ msgid "" +#~ "struct tnt_stream *tnt_net(struct tnt_stream *s)\n" +#~ "int tnt_set(struct tnt_stream *s, int option, variant option-value)" +#~ msgstr "" +#~ "struct tnt_stream *tnt_net(struct tnt_stream *s)\n" +#~ "int tnt_set(struct tnt_stream *s, int option, variant option-value)" + +#~ msgid "CONNECT" +#~ msgstr "**Соединение**" + +#~ msgid "" +#~ "Now that the stream named ``tnt`` exists and is associated with a URI, this " +#~ "example program can connect to a server instance." +#~ msgstr "" +#~ "Теперь, когда мы создали поток ``tnt`` и связали его с конкретным URI, наша " +#~ "программа может установить соединение с экземпляром." + +#~ msgid "" +#~ "if (tnt_connect(tnt) < 0)\n" +#~ " { printf(\"Connection refused\\n\"); exit(-1); }" +#~ msgstr "" +#~ "if (tnt_connect(tnt) < 0)\n" +#~ " { printf(\"Connection refused\\n\"); exit(-1); }" + +#~ msgid "int tnt_connect(struct tnt_stream *s)" +#~ msgstr "int tnt_connect(struct tnt_stream *s)" + +#~ msgid "" +#~ "The connection might fail for a variety of reasons, such as: the server is " +#~ "not running, or the URI contains an invalid :ref:`password`. If the connection fails, the return value will be -1." +#~ msgstr "" +#~ "Попытка соединения может оказаться неудачной по разным причинам, например " +#~ "если Tarantool-сервер не запущен или в строке URI указан неверный " +#~ ":ref:`пароль `. В случае неудачи функция вернет " +#~ "-1." + +#~ msgid "MAKE REQUEST" +#~ msgstr "**Создание запроса**" + +#~ msgid "" +#~ "Most requests require passing a structured value, such as the contents of a " +#~ "tuple." +#~ msgstr "" +#~ "В большинстве запросов требуется передавать структурированные данные, " +#~ "например содержимое кортежа." + +#~ msgid "" +#~ "struct tnt_stream *tuple = tnt_object(NULL);\n" +#~ "tnt_object_format(tuple, \"[%d%s]\", 99999, \"B\");" +#~ msgstr "" +#~ "struct tnt_stream *tuple = tnt_object(NULL);\n" +#~ "tnt_object_format(tuple, \"[%d%s]\", 99999, \"B\");" + +#~ msgid "" +#~ "In this program, the request will be an :ref:`INSERT`, and" +#~ " the tuple contents will be an integer and a string. This is a simple serial" +#~ " set of values, that is, there are no sub-structures or arrays. Therefore it" +#~ " is easy in this case to format what will be passed using the same sort of " +#~ "arguments that one would use with a C ``printf()`` function: ``%d`` for the " +#~ "integer, ``%s`` for the string, then the integer value, then a pointer to " +#~ "the string value." +#~ msgstr "" +#~ "В этом примере программы формируется запрос :ref:`INSERT`," +#~ " а кортеж содержит целое число и строку. Это простой набор значений без " +#~ "каких-либо вложенных структур или массивов. Так что передаваемые значения " +#~ "можно указать самым простым образом --- аналогично тому, как это сделано в " +#~ "стандартной C-функции ``printf()``: целое число ``%d``, строка ``%s``, " +#~ "числовое значение, указатель на строковое значение." + +#~ msgid "ssize_t tnt_object_format(struct tnt_stream *s, const char *fmt, ...)" +#~ msgstr "ssize_t tnt_object_format(struct tnt_stream *s, const char *fmt, ...)" + +#~ msgid "SEND REQUEST" +#~ msgstr "**Отправка запроса**" + +#~ msgid "" +#~ "The database-manipulation requests are analogous to the requests in the box " +#~ "library." +#~ msgstr "" +#~ "Отправка запросов на изменение данных в базе выполняется аналогично тому, " +#~ "как это реализовано в библиотеке Tarantool ``box``." + +#~ msgid "" +#~ "tnt_insert(tnt, 999, tuple);\n" +#~ "tnt_flush(tnt);" +#~ msgstr "" +#~ "tnt_insert(tnt, 999, tuple);\n" +#~ "tnt_flush(tnt);" + +#~ msgid "" +#~ "In this program, the choice is to do an INSERT request, so the program " +#~ "passes the ``tnt_stream`` that was used for connection (``tnt``) and the " +#~ "``tnt_stream`` that was set up with :c:func:`tarantoolc:tnt_object_format` " +#~ "(``tuple``)." +#~ msgstr "" +#~ "В этом примере выполняется INSERT-запрос. Передается поток ``tnt``, который " +#~ "использовался для установки соединения, и поток ``tuple``, ранее настроенный" +#~ " с помощью функции :c:func:`tarantoolc:tnt_object_format`." + +#~ msgid "" +#~ "ssize_t tnt_insert(struct tnt_stream *s, uint32_t space, struct tnt_stream *tuple)\n" +#~ "ssize_t tnt_replace(struct tnt_stream *s, uint32_t space, struct tnt_stream *tuple)\n" +#~ "ssize_t tnt_select(struct tnt_stream *s, uint32_t space, uint32_t index,\n" +#~ " uint32_t limit, uint32_t offset, uint8_t iterator,\n" +#~ " struct tnt_stream *key)\n" +#~ "ssize_t tnt_update(struct tnt_stream *s, uint32_t space, uint32_t index,\n" +#~ " struct tnt_stream *key, struct tnt_stream *ops)" +#~ msgstr "" +#~ "ssize_t tnt_insert(struct tnt_stream *s, uint32_t space, struct tnt_stream *tuple)\n" +#~ "ssize_t tnt_replace(struct tnt_stream *s, uint32_t space, struct tnt_stream *tuple)\n" +#~ "ssize_t tnt_select(struct tnt_stream *s, uint32_t space, uint32_t index,\n" +#~ " uint32_t limit, uint32_t offset, uint8_t iterator,\n" +#~ " struct tnt_stream *key)\n" +#~ "ssize_t tnt_update(struct tnt_stream *s, uint32_t space, uint32_t index,\n" +#~ " struct tnt_stream *key, struct tnt_stream *ops)" + +#~ msgid "GET REPLY" +#~ msgstr "**Получение ответа**" + +#~ msgid "" +#~ "For most requests, the client will receive a reply containing some " +#~ "indication whether the result was successful, and a set of tuples." +#~ msgstr "" +#~ "В большинстве случаев ответ клиенту содержит информацию о том, был ли запрос" +#~ " выполнен успешно, а также набор кортежей." + +#~ msgid "" +#~ "struct tnt_reply reply; tnt_reply_init(&reply);\n" +#~ "tnt->read_reply(tnt, &reply);\n" +#~ "if (reply.code != 0)\n" +#~ " { printf(\"Insert failed %lu.\\n\", reply.code); }" +#~ msgstr "" +#~ "struct tnt_reply reply; tnt_reply_init(&reply);\n" +#~ "tnt->read_reply(tnt, &reply);\n" +#~ "if (reply.code != 0)\n" +#~ " { printf(\"Insert failed %lu.\\n\", reply.code); }" + +#~ msgid "" +#~ "This program checks for success but does not decode the rest of the reply." +#~ msgstr "" +#~ "Эта программа проверяет, был ли запрос выполнен успешно, но никак не " +#~ "интерпретирует оставшуюся часть ответа." + +#~ msgid "" +#~ "struct tnt_reply *tnt_reply_init(struct tnt_reply *r)\n" +#~ "tnt->read_reply(struct tnt_stream *s, struct tnt_reply *r)\n" +#~ "void tnt_reply_free(struct tnt_reply *r)" +#~ msgstr "" +#~ "struct tnt_reply *tnt_reply_init(struct tnt_reply *r)\n" +#~ "tnt->read_reply(struct tnt_stream *s, struct tnt_reply *r)\n" +#~ "void tnt_reply_free(struct tnt_reply *r)" + +#~ msgid "TEARDOWN" +#~ msgstr "**Завершение**" + +#~ msgid "" +#~ "When a session ends, the connection that was made with " +#~ ":c:func:`tarantoolc:tnt_connect` should be closed, and the objects that were" +#~ " made in the setup should be destroyed." +#~ msgstr "" +#~ "По окончании сессии необходимо завершить соединение, созданное с помощью " +#~ "функции :c:func:`tarantoolc:tnt_connect()`, и удалить объекты, созданные на " +#~ "этапе настройки." + +#~ msgid "" +#~ "tnt_close(tnt);\n" +#~ "tnt_stream_free(tuple);\n" +#~ "tnt_stream_free(tnt);" +#~ msgstr "" +#~ "tnt_close(tnt);\n" +#~ "tnt_stream_free(tuple);\n" +#~ "tnt_stream_free(tnt);" + +#~ msgid "" +#~ "void tnt_close(struct tnt_stream *s)\n" +#~ "void tnt_stream_free(struct tnt_stream *s)" +#~ msgstr "" +#~ "void tnt_close(struct tnt_stream *s)\n" +#~ "void tnt_stream_free(struct tnt_stream *s)" + +#~ msgid "Example 2" +#~ msgstr "Пример 2" + +#~ msgid "" +#~ "Here is a complete C program that selects, using index key ``[99999]``, from" +#~ " space ``examples`` via the high-level C API. To display the results, the " +#~ "program uses functions in the `MsgPuck " +#~ "`__ library which allow decoding of " +#~ "`MessagePack `__ arrays." +#~ msgstr "" +#~ "В следующем примере приводится полноценная программа на языке C, которая " +#~ "осуществляет выборку по индекс-ключу ``[99999]`` из спейса ``examples`` с " +#~ "помощью высокоуровневого API для языка C. Результаты выводятся с помощью " +#~ "функций из библиотеки `MsgPuck `__, " +#~ "позволяющих декодировать массивы значений в формате `MessagePack " +#~ "`__." + +#~ msgid "" +#~ "#include \n" +#~ "#include \n" +#~ "#include \n" +#~ "#include \n" +#~ "#include \n" +#~ "\n" +#~ "#define MP_SOURCE 1\n" +#~ "#include \n" +#~ "\n" +#~ "void main() {\n" +#~ " struct tnt_stream *tnt = tnt_net(NULL);\n" +#~ " tnt_set(tnt, TNT_OPT_URI, \"localhost:3301\");\n" +#~ " if (tnt_connect(tnt) < 0) {\n" +#~ " printf(\"Connection refused\\n\");\n" +#~ " exit(1);\n" +#~ " }\n" +#~ " struct tnt_stream *tuple = tnt_object(NULL);\n" +#~ " tnt_object_format(tuple, \"[%d]\", 99999); /* tuple = search key */\n" +#~ " tnt_select(tnt, 999, 0, (2^32) - 1, 0, 0, tuple);\n" +#~ " tnt_flush(tnt);\n" +#~ " struct tnt_reply reply; tnt_reply_init(&reply);\n" +#~ " tnt->read_reply(tnt, &reply);\n" +#~ " if (reply.code != 0) {\n" +#~ " printf(\"Select failed.\\n\");\n" +#~ " exit(1);\n" +#~ " }\n" +#~ " char field_type;\n" +#~ " field_type = mp_typeof(*reply.data);\n" +#~ " if (field_type != MP_ARRAY) {\n" +#~ " printf(\"no tuple array\\n\");\n" +#~ " exit(1);\n" +#~ " }\n" +#~ " long unsigned int row_count;\n" +#~ " uint32_t tuple_count = mp_decode_array(&reply.data);\n" +#~ " printf(\"tuple count=%u\\n\", tuple_count);\n" +#~ " unsigned int i, j;\n" +#~ " for (i = 0; i < tuple_count; ++i) {\n" +#~ " field_type = mp_typeof(*reply.data);\n" +#~ " if (field_type != MP_ARRAY) {\n" +#~ " printf(\"no field array\\n\");\n" +#~ " exit(1);\n" +#~ " }\n" +#~ " uint32_t field_count = mp_decode_array(&reply.data);\n" +#~ " printf(\" field count=%u\\n\", field_count);\n" +#~ " for (j = 0; j < field_count; ++j) {\n" +#~ " field_type = mp_typeof(*reply.data);\n" +#~ " if (field_type == MP_UINT) {\n" +#~ " uint64_t num_value = mp_decode_uint(&reply.data);\n" +#~ " printf(\" value=%lu.\\n\", num_value);\n" +#~ " } else if (field_type == MP_STR) {\n" +#~ " const char *str_value;\n" +#~ " uint32_t str_value_length;\n" +#~ " str_value = mp_decode_str(&reply.data, &str_value_length);\n" +#~ " printf(\" value=%.*s.\\n\", str_value_length, str_value);\n" +#~ " } else {\n" +#~ " printf(\"wrong field type\\n\");\n" +#~ " exit(1);\n" +#~ " }\n" +#~ " }\n" +#~ " }\n" +#~ " tnt_close(tnt);\n" +#~ " tnt_stream_free(tuple);\n" +#~ " tnt_stream_free(tnt);\n" +#~ "}" +#~ msgstr "" +#~ "#include \n" +#~ "#include \n" +#~ "#include \n" +#~ "#include \n" +#~ "#include \n" +#~ "\n" +#~ "#define MP_SOURCE 1\n" +#~ "#include \n" +#~ "\n" +#~ "void main() {\n" +#~ " struct tnt_stream *tnt = tnt_net(NULL);\n" +#~ " tnt_set(tnt, TNT_OPT_URI, \"localhost:3301\");\n" +#~ " if (tnt_connect(tnt) < 0) {\n" +#~ " printf(\"Connection refused\\n\");\n" +#~ " exit(1);\n" +#~ " }\n" +#~ " struct tnt_stream *tuple = tnt_object(NULL);\n" +#~ " tnt_object_format(tuple, \"[%d]\", 99999); /* кортеж tuple = ключ для поиска */\n" +#~ " tnt_select(tnt, 999, 0, (2^32) - 1, 0, 0, tuple);\n" +#~ " tnt_flush(tnt);\n" +#~ " struct tnt_reply reply; tnt_reply_init(&reply);\n" +#~ " tnt->read_reply(tnt, &reply);\n" +#~ " if (reply.code != 0) {\n" +#~ " printf(\"Select failed.\\n\");\n" +#~ " exit(1);\n" +#~ " }\n" +#~ " char field_type;\n" +#~ " field_type = mp_typeof(*reply.data);\n" +#~ " if (field_type != MP_ARRAY) {\n" +#~ " printf(\"no tuple array\\n\");\n" +#~ " exit(1);\n" +#~ " }\n" +#~ " long unsigned int row_count;\n" +#~ " uint32_t tuple_count = mp_decode_array(&reply.data);\n" +#~ " printf(\"tuple count=%u\\n\", tuple_count);\n" +#~ " unsigned int i, j;\n" +#~ " for (i = 0; i < tuple_count; ++i) {\n" +#~ " field_type = mp_typeof(*reply.data);\n" +#~ " if (field_type != MP_ARRAY) {\n" +#~ " printf(\"no field array\\n\");\n" +#~ " exit(1);\n" +#~ " }\n" +#~ " uint32_t field_count = mp_decode_array(&reply.data);\n" +#~ " printf(\" field count=%u\\n\", field_count);\n" +#~ " for (j = 0; j < field_count; ++j) {\n" +#~ " field_type = mp_typeof(*reply.data);\n" +#~ " if (field_type == MP_UINT) {\n" +#~ " uint64_t num_value = mp_decode_uint(&reply.data);\n" +#~ " printf(\" value=%lu.\\n\", num_value);\n" +#~ " } else if (field_type == MP_STR) {\n" +#~ " const char *str_value;\n" +#~ " uint32_t str_value_length;\n" +#~ " str_value = mp_decode_str(&reply.data, &str_value_length);\n" +#~ " printf(\" value=%.*s.\\n\", str_value_length, str_value);\n" +#~ " } else {\n" +#~ " printf(\"wrong field type\\n\");\n" +#~ " exit(1);\n" +#~ " }\n" +#~ " }\n" +#~ " }\n" +#~ " tnt_close(tnt);\n" +#~ " tnt_stream_free(tuple);\n" +#~ " tnt_stream_free(tnt);\n" +#~ "}" + +#~ msgid "" +#~ "Similarly to the first example, paste the code into a file named " +#~ ":file:`example2.c`." +#~ msgstr "" +#~ "Как и в первом примере, сохраните исходный код программы в файле " +#~ ":file:`example2.c`." + +#~ msgid "To compile and link the program, say:" +#~ msgstr "" +#~ "Чтобы скомпилировать и слинковать программу, выполните следующую команду:" + +#~ msgid "$ gcc -o example2 example2.c -ltarantool" +#~ msgstr "$ gcc -o example2 example2.c -ltarantool" + +#~ msgid "To run the program, say :samp:`./example2`." +#~ msgstr "Чтобы запустить программу, выполните команду :samp:`./example2`." + +#~ msgid "" +#~ "The two example programs only show a few requests and do not show all that's" +#~ " necessary for good practice. See more in the `tarantool-c documentation at " +#~ "GitHub `__." +#~ msgstr "" +#~ "Эти две программы представляют собой примеры отправки двух запросов. Чтобы " +#~ "узнать больше о том, как работать с Tarantool, пользуясь API для языка C, " +#~ "обратитесь к документации `проекта tarantool-c на GitHub " +#~ "`__." diff --git a/locale/ru/LC_MESSAGES/book/connectors/c.po b/locale/ru/LC_MESSAGES/book/connectors/c.po index d6b3189438..ef8597a8eb 100644 --- a/locale/ru/LC_MESSAGES/book/connectors/c.po +++ b/locale/ru/LC_MESSAGES/book/connectors/c.po @@ -18,6 +18,7 @@ msgstr "" "осуществляет вставку кортежа ``[99999,'B']`` в спейс :code:`examples` с " "помощью высокоуровневого API для языка C." +#, python-format msgid "" "#include \n" "#include \n" @@ -100,7 +101,8 @@ msgstr "" "$ make\n" "$ make install" -msgid "To compile and link the program, say:" +#, fuzzy +msgid "To compile and link the program, run:" msgstr "" "Чтобы скомпилировать и слинковать тестовую программу, выполните следующую " "команду:" @@ -114,6 +116,7 @@ msgstr "" "$ export LD_LIBRARY_PATH=/usr/local/lib\n" "$ gcc -o example example.c -ltarantool" +#, fuzzy msgid "" "Before trying to run, check that a server instance is listening at " "``localhost:3301`` and that the space ``examples`` exists, as " @@ -123,7 +126,7 @@ msgid "" "address = 3301, the program will print “Connection refused”. If the insert " "fails, the program will print \"Insert failed\" and an error number (see all" " error codes in the source file `/src/box/errcode.h " -"`_)." +"`__)." msgstr "" "Перед запуском проверьте, что у экземпляра задан порт для прослушивания " "на``localhost:3301``, и в базе создан спейс ``examples``, как :ref:`описано " @@ -141,7 +144,11 @@ msgstr "" "Далее следуют примечания, на которые мы ссылались в комментариях к исходному" " коду тестовой программы." -msgid "**SETUP:** The setup begins by creating a stream." +msgid "SETUP" +msgstr "" + +#, fuzzy +msgid "The setup begins by creating a stream." msgstr "" "**НАСТРОЙКА:** Настройка начинается с создания потока (``tnt_stream``)." @@ -175,9 +182,13 @@ msgstr "" "struct tnt_stream *tnt_net(struct tnt_stream *s)\n" "int tnt_set(struct tnt_stream *s, int option, variant option-value)" +msgid "CONNECT" +msgstr "" + +#, fuzzy msgid "" -"**CONNECT:** Now that the stream named ``tnt`` exists and is associated with" -" a URI, this example program can connect to a server instance." +"Now that the stream named ``tnt`` exists and is associated with a URI, this " +"example program can connect to a server instance." msgstr "" "**СОЕДИНЕНИЕ:** Теперь когда мы создали поток с именем ``tnt`` и связали его" " с конкретным URI, наша программа может устанавливать соединение с " @@ -202,13 +213,18 @@ msgstr "" "Tarantool-сервер не запущен или в URI-строке указан неверный :ref:`пароль " "`. В случае неудачи функция вернет -1." +msgid "MAKE REQUEST" +msgstr "" + +#, fuzzy msgid "" -"**MAKE REQUEST:** Most requests require passing a structured value, such as " -"the contents of a tuple." +"Most requests require passing a structured value, such as the contents of a " +"tuple." msgstr "" "**СОЗДАНИЕ ЗАПРОСА:** В большинстве запросов требуется передавать " "структурированные данные, например содержимое кортежа." +#, python-format msgid "" "struct tnt_stream *tuple = tnt_object(NULL);\n" "tnt_object_format(tuple, \"[%d%s]\", 99999, \"B\");" @@ -216,6 +232,7 @@ msgstr "" "struct tnt_stream *tuple = tnt_object(NULL);\n" "tnt_object_format(tuple, \"[%d%s]\", 99999, \"B\");" +#, python-format msgid "" "In this program, the request will be an :ref:`INSERT`, and" " the tuple contents will be an integer and a string. This is a simple serial" @@ -236,9 +253,13 @@ msgstr "" msgid "ssize_t tnt_object_format(struct tnt_stream *s, const char *fmt, ...)" msgstr "ssize_t tnt_object_format(struct tnt_stream *s, const char *fmt, ...)" +msgid "SEND REQUEST" +msgstr "" + +#, fuzzy msgid "" -"**SEND REQUEST:** The database-manipulation requests are analogous to the " -"requests in the box library." +"The database-manipulation requests are analogous to the requests in the box " +"library." msgstr "" "**ОТПРАВКА ЗАПРОСА:** Отправка запросов на изменение данных в базе делается " "аналогично тому, как это делается в Tarantool-библиотеке ``box``." @@ -278,14 +299,19 @@ msgstr "" "ssize_t tnt_update(struct tnt_stream *s, uint32_t space, uint32_t index,\n" " struct tnt_stream *key, struct tnt_stream *ops)" +msgid "GET REPLY" +msgstr "" + +#, fuzzy msgid "" -"**GET REPLY:** For most requests, the client will receive a reply containing" -" some indication whether the result was successful, and a set of tuples." +"For most requests, the client will receive a reply containing some " +"indication whether the result was successful, and a set of tuples." msgstr "" "**ПОЛУЧЕНИЕ ОТВЕТА:** На большинство запросов клиент получает ответ, который" " содержит информацию о том, был ли данный запрос успешно выполнен, а также " "содержит набор кортежей." +#, python-format msgid "" "struct tnt_reply reply; tnt_reply_init(&reply);\n" "tnt->read_reply(tnt, &reply);\n" @@ -312,10 +338,14 @@ msgstr "" "tnt->read_reply(struct tnt_stream *s, struct tnt_reply *r)\n" "void tnt_reply_free(struct tnt_reply *r)" +msgid "TEARDOWN" +msgstr "" + +#, fuzzy msgid "" -"**TEARDOWN:** When a session ends, the connection that was made with " -":c:func:`tarantoolc:tnt_connect()` should be closed, and the objects that " -"were made in the setup should be destroyed." +"When a session ends, the connection that was made with " +":c:func:`tarantoolc:tnt_connect` should be closed, and the objects that were" +" made in the setup should be destroyed." msgstr "" "**ЗАВЕРШЕНИЕ:** По окончании сессии нам нужно закрыть соединение, созданное " "с помощью функции :c:func:`tarantoolc:tnt_connect()`, и удалить объекты, " @@ -340,12 +370,13 @@ msgstr "" msgid "Example 2" msgstr "Пример 2" +#, fuzzy msgid "" "Here is a complete C program that selects, using index key ``[99999]``, from" " space ``examples`` via the high-level C API. To display the results, the " "program uses functions in the `MsgPuck " -"`_ library which allow decoding of " -"`MessagePack `_ arrays." +"`__ library which allow decoding of " +"`MessagePack `__ arrays." msgstr "" "Далее приводится пример полноценной программы на языке C, которая " "осуществляет выборку по индекс-ключу ``[99999]`` из спейса ``examples`` с " @@ -355,6 +386,7 @@ msgstr "" "массивов значений в формате `MessagePack " "`_." +#, python-format msgid "" "#include \n" "#include \n" @@ -493,18 +525,24 @@ msgstr "" "Аналогично первому примеру, сохраните исходный код программы в файле с " "именем :file:`example2.c`." +msgid "To compile and link the program, say:" +msgstr "" +"Чтобы скомпилировать и слинковать тестовую программу, выполните следующую " +"команду:" + msgid "$ gcc -o example2 example2.c -ltarantool" msgstr "$ gcc -o example2 example2.c -ltarantool" msgid "To run the program, say :samp:`./example2`." msgstr "Для запуска программы выполните команду :samp:`./example2`." +#, fuzzy msgid "" "The two example programs only show a few requests and do not show all that's" " necessary for good practice. See more in the `tarantool-c documentation at " -"GitHub `_." +"GitHub `__." msgstr "" "В этих двух программах мы привели пример использования лишь двух запросов. " -"Для полноценной работы с Tarantool с помощью C API, пожалуйста, " -"обратитесь к документации из `проекта tarantool-c на GitHub " +"Для полноценной работы с Tarantool с помощью C API, пожалуйста, обратитесь к" +" документации из `проекта tarantool-c на GitHub " "`_." diff --git a/locale/ru/LC_MESSAGES/book/connectors/community.po b/locale/ru/LC_MESSAGES/book/connectors/community.po new file mode 100644 index 0000000000..a493113015 --- /dev/null +++ b/locale/ru/LC_MESSAGES/book/connectors/community.po @@ -0,0 +1,22 @@ + +msgid "C++" +msgstr "" + +msgid "Community-supported connectors" +msgstr "" + +msgid "" +"This section provides information on several `community-supported connectors" +" `_. Note that they may " +"have limited support for new Tarantool features." +msgstr "" + +msgid "" +"For Erlang, use the `Erlang tarantool driver " +"`__." +msgstr "" + +msgid "" +"For R, use the `tarantoolr `__ " +"connector." +msgstr "" diff --git a/locale/ru/LC_MESSAGES/book/connectors/csharp.po b/locale/ru/LC_MESSAGES/book/connectors/csharp.po index d6f06a8e94..d424d4f4bb 100644 --- a/locale/ru/LC_MESSAGES/book/connectors/csharp.po +++ b/locale/ru/LC_MESSAGES/book/connectors/csharp.po @@ -2,19 +2,20 @@ msgid "C#" msgstr "C#" +#, fuzzy msgid "" "The most commonly used C# driver is `progaudi.tarantool " -"`_, previously named " +"`__, previously named " "``tarantool-csharp``. It is not supplied as part of the Tarantool " "repository; it must be installed separately. The makers recommend `cross-" "platform installation using Nuget " -"`_." +"`__." msgstr "" "Самый используемый драйвер для C# -- `progaudi.tarantool " "`_, который раньше назывался" -" ``tarantool-csharp``. Он не входит в репозиторий Tarantool, его " -"необходимо устанавливать отдельно. Создатели драйвера рекомендуют " -"`кроссплатформенную установку с помощью Nuget " +" ``tarantool-csharp``. Он не входит в репозиторий Tarantool, его необходимо " +"устанавливать отдельно. Создатели драйвера рекомендуют `кроссплатформенную " +"установку с помощью Nuget " "`_." msgid "" @@ -24,9 +25,10 @@ msgstr "" "Чтобы придерживаться метода оформления других инструкций в данной главе, " "дадим описание способа установки драйвера напрямую на 16.04." +#, fuzzy msgid "" "Install .net core from Microsoft. Follow `.net core installation " -"instructions `_." +"instructions `__." msgstr "" "Установите среду .NET Core от Microsoft. Следуйте `инструкциям по установке " ".NET Core `_." @@ -38,13 +40,14 @@ msgstr "" "Mono не сработает, как не сработает и .Net от xbuild. Только .NET Core " "поддерживается на Linux и Mac." +#, fuzzy msgid "" "Read the Microsoft End User License Agreement first, because it is not an " "ordinary open-source agreement and there will be a message during " "installation saying \"This software may collect information about you and " "your use of the software, and send that to Microsoft.\" Still you can `set " "environment variables `_ to opt out from telemetry." +"us/dotnet/core/tools/telemetry>`__ to opt out from telemetry." msgstr "" "Сначала прочитайте Условия лицензионного соглашения с Microsoft, поскольку " "оно не похоже на обычные соглашения для ПО с открытым кодом, и во время " @@ -146,8 +149,9 @@ msgstr "Программа:" msgid "connect using an application-specific definition of the space," msgstr "установит соединение, используя определение спейса для этой цели," +#, fuzzy msgid "" -"open a socket connection with the Tarantool server at `localhost:3301`," +"open a socket connection with the Tarantool server at ``localhost:3301``," msgstr "откроет сокет для соединения с экземпляром по ``localhost:3301``," msgid "" @@ -167,12 +171,13 @@ msgstr "" "какой-либо причине не сработает, то программа выдаст сообщение об ошибке и " "другую информацию (трассировку стека и т.д.)." +#, fuzzy msgid "" "The example program only shows one request and does not show all that’s " "necessary for good practice. For that, please see the `progaudi.tarantool " -"driver repository `_." +"driver repository `__." msgstr "" "В этой программе мы привели пример использования лишь одного запроса. Для " -"полноценной работы с Tarantool с помощью PHP API, пожалуйста, обратитесь " -"к документации из `проекта tarantool-php на GitHub " +"полноценной работы с Tarantool с помощью PHP API, пожалуйста, обратитесь к " +"документации из `проекта tarantool-php на GitHub " "`_." diff --git a/locale/ru/LC_MESSAGES/book/connectors/cxx/tntcxx_api.po b/locale/ru/LC_MESSAGES/book/connectors/cxx/tntcxx_api.po new file mode 100644 index 0000000000..715fd55e04 --- /dev/null +++ b/locale/ru/LC_MESSAGES/book/connectors/cxx/tntcxx_api.po @@ -0,0 +1,740 @@ + +msgid "C++ connector API" +msgstr "" + +msgid "" +"The official C++ connector for Tarantool is located in the `tanartool/tntcxx" +" `_ repository." +msgstr "" + +msgid "" +"It is not supplied as part of the Tarantool repository and requires " +"additional actions for usage. The connector itself is a header-only library " +"and, as such, doesn't require installation and building. All you need is to " +"clone the connector source code and embed it in your C++ project. See the " +":doc:`C++ connector Getting started ` " +"document for details and examples." +msgstr "" + +msgid "Below is the description of the connector public API." +msgstr "" + +msgid "Connector class" +msgstr "" + +msgid "" +"The ``Connector`` class is a template class that defines a connector client " +"which can handle many connections to Tarantool instances asynchronously." +msgstr "" + +msgid "" +"To instantiate a client, you should specify the buffer and the network " +"provider implementations as template parameters. You can either implement " +"your own buffer or network provider or use the default ones." +msgstr "" + +msgid "The default connector instantiation looks as follows:" +msgstr "" + +msgid "" +"using Buf_t = tnt::Buffer<16 * 1024>;\n" +"using Net_t = EpollNetProvider;\n" +"Connector client;" +msgstr "" + +msgid "Public methods" +msgstr "" + +msgid ":ref:`connect() `" +msgstr "" + +msgid ":ref:`wait() `" +msgstr "" + +msgid ":ref:`waitAll() `" +msgstr "" + +msgid ":ref:`waitAny() `" +msgstr "" + +msgid ":ref:`close() `" +msgstr "" + +msgid "" +"Connects to a Tarantool instance that is listening on ``addr:port``. On " +"successful connection, the method returns ``0``. If the host doesn't reply " +"within the timeout period or another error occurs, it returns ``-1``. Then, " +":ref:`Connection.getError() ` gives the " +"error message." +msgstr "" + +msgid "Parameters" +msgstr "" + +msgid "object of the :ref:`Connection ` class." +msgstr "" + +msgid "address of the host where a Tarantool instance is running." +msgstr "" + +msgid "port that a Tarantool instance is listening on." +msgstr "" + +msgid "connection timeout, seconds. Optional. Defaults to ``2``." +msgstr "" + +msgid "Returns" +msgstr "" + +msgid "``0`` on success, or ``-1`` otherwise." +msgstr "" + +msgid "rtype" +msgstr "" + +msgid "int" +msgstr "" + +msgid "**Possible errors:**" +msgstr "" + +msgid "connection timeout" +msgstr "" + +msgid "refused to connect (due to incorrect address or/and port)" +msgstr "" + +msgid "" +"system errors: a socket can't be created; failure of any of the system calls" +" (``fcntl``, ``select``, ``send``, ``receive``)." +msgstr "" + +msgid "**Example:**" +msgstr "" + +msgid "" +"using Buf_t = tnt::Buffer<16 * 1024>;\n" +"using Net_t = EpollNetProvider;\n" +"\n" +"Connector client;\n" +"Connection conn(client);\n" +"\n" +"int rc = client.connect(conn, \"127.0.0.1\", 3301);" +msgstr "" + +msgid "" +"The main method responsible for sending a request and checking the response " +"readiness." +msgstr "" + +msgid "" +"You should prepare a request beforehand by using the necessary method of the" +" :ref:`Connection ` class, such as :ref:`ping() " +"` and so on, which encodes the request in the " +"`MessagePack `_ format and saves it in the output " +"connection buffer." +msgstr "" + +msgid "" +"``wait()`` sends the request and is polling the ``future`` for the response " +"readiness. Once the response is ready, ``wait()`` returns ``0``. If at " +"``timeout`` the response isn't ready or another error occurs, it returns " +"``-1``. Then, :ref:`Connection.getError() ` " +"gives the error message. ``timeout = 0`` means the method is polling the " +"``future`` until the response is ready." +msgstr "" + +msgid "" +"request ID returned by a request method of the :ref:`Connection " +"` class, such as, :ref:`ping() " +"` and so on." +msgstr "" + +msgid "waiting timeout, milliseconds. Optional. Defaults to ``0``." +msgstr "" + +msgid "``0`` on receiving a response, or ``-1`` otherwise." +msgstr "" + +msgid "timeout exceeded" +msgstr "" + +msgid "" +"other possible errors depend on a network provider used. If the " +"``EpollNetProvider`` is used, failing of the ``poll``, ``read``, and " +"``write`` system calls leads to system errors, such as, ``EBADF``, " +"``ENOTSOCK``, ``EFAULT``, ``EINVAL``, ``EPIPE``, and ``ENOTCONN`` " +"(``EWOULDBLOCK`` and ``EAGAIN`` don't occur in this case)." +msgstr "" + +msgid "client.wait(conn, ping, WAIT_TIMEOUT)" +msgstr "" + +msgid "" +"Similar to :ref:`wait() `, the method sends the " +"requests prepared and checks the response readiness, but can send several " +"different requests stored in the ``futures`` array. Exceeding the timeout " +"leads to an error; :ref:`Connection.getError() " +"` gives the error message. ``timeout = 0`` " +"means the method is polling the ``futures`` until all the responses are " +"ready." +msgstr "" + +msgid "" +"array with the request IDs returned by request methods of the " +":ref:`Connection ` class, such as, :ref:`ping() " +"` and so on." +msgstr "" + +msgid "size of the ``futures`` array." +msgstr "" + +msgid "none" +msgstr "" + +msgid "" +"rid_t futures[2];\n" +"futures[0] = replace;\n" +"futures[1] = select;\n" +"\n" +"client.waitAll(conn, (rid_t *) &futures, 2);" +msgstr "" + +msgid "" +"Sends all requests that are prepared at the moment and is waiting for any " +"first response to be ready. Upon the response readiness, ``waitAny()`` " +"returns the corresponding connection object. If at ``timeout`` no response " +"is ready or another error occurs, it returns ``nullptr``. Then, " +":ref:`Connection.getError() ` gives the " +"error message. ``timeout = 0`` means no time limitation while waiting for " +"the response readiness." +msgstr "" + +msgid "" +"object of the :ref:`Connection ` class on success, or" +" ``nullptr`` on error." +msgstr "" + +msgid "Connection*" +msgstr "" + +msgid "" +"rid_t f1 = conn.ping();\n" +"rid_t f2 = another_conn.ping();\n" +"\n" +"Connection *first = client.waitAny(WAIT_TIMEOUT);\n" +"if (first == &conn) {\n" +" assert(conn.futureIsReady(f1));\n" +"} else {\n" +" assert(another_conn.futureIsReady(f2));\n" +"}" +msgstr "" + +msgid "" +"Closes the connection established earlier by the :ref:`connect() " +"` method." +msgstr "" + +msgid "" +"connection object of the :ref:`Connection ` class." +msgstr "" + +msgid "**Possible errors:** none." +msgstr "" + +msgid "client.close(conn);" +msgstr "" + +msgid "Connection class" +msgstr "" + +msgid "" +"The ``Connection`` class is a template class that defines a connection " +"objects which is required to interact with a Tarantool instance. Each " +"connection object is bound to a single socket." +msgstr "" + +msgid "" +"Similar to a :ref:`connector client `, a connection " +"object also takes the buffer and the network provider as template " +"parameters, and they must be the same as ones of the client. For example:" +msgstr "" + +msgid "" +"//Instantiating a connector client\n" +"using Buf_t = tnt::Buffer<16 * 1024>;\n" +"using Net_t = EpollNetProvider;\n" +"Connector client;\n" +"\n" +"//Instantiating connection objects\n" +"Connection conn01(client);\n" +"Connection conn02(client);" +msgstr "" + +msgid "" +"The ``Connection`` class has two nested classes, namely, :ref:`Space " +"` and :ref:`Index " +"` that implement the data-manipulation methods " +"like ``select()``, ``replace()``, and so on." +msgstr "" + +msgid "Public types" +msgstr "" + +msgid "" +"The alias of the built-in ``size_t`` type. ``rid_t`` is used for entities " +"that return or contain a request ID." +msgstr "" + +msgid ":ref:`call() `" +msgstr "" + +msgid ":ref:`futureIsReady() `" +msgstr "" + +msgid ":ref:`getResponse() `" +msgstr "" + +msgid ":ref:`getError() `" +msgstr "" + +msgid ":ref:`reset() `" +msgstr "" + +msgid ":ref:`ping() `" +msgstr "" + +msgid "" +"Executes a call of a remote stored-procedure similar to :ref:`conn:call() " +"`. The method returns the request ID that is used to get the " +"response by :ref:`getResponse() `." +msgstr "" + +msgid "a remote stored-procedure name." +msgstr "" + +msgid "procedure's arguments." +msgstr "" + +msgid "a request ID" +msgstr "" + +msgid "rid_t" +msgstr "" + +msgid "" +"The following function is defined on the Tarantool instance you are " +"connected to:" +msgstr "" + +msgid "" +"box.execute(\"DROP TABLE IF EXISTS t;\")\n" +"box.execute(\"CREATE TABLE t(id INT PRIMARY KEY, a TEXT, b DOUBLE);\")\n" +"\n" +"function remote_replace(arg1, arg2, arg3)\n" +" return box.space.T:replace({arg1, arg2, arg3})\n" +"end" +msgstr "" + +msgid "The function call can look as follows:" +msgstr "" + +msgid "" +"rid_t f1 = conn.call(\"remote_replace\", std::make_tuple(5, \"some_sring\", " +"5.55));" +msgstr "" + +msgid "" +"Checks availability of a request ID (``future``) returned by any of the " +"request methods, such as, :ref:`ping() ` and so " +"on." +msgstr "" + +msgid "" +"``futureIsReady()`` returns ``true`` if the ``future`` is available or " +"``false`` otherwise." +msgstr "" + +msgid "a request ID." +msgstr "" + +msgid "``true`` or ``false``" +msgstr "" + +msgid "bool" +msgstr "" + +msgid "" +"rid_t ping = conn.ping();\n" +"conn.futureIsReady(ping);" +msgstr "" + +msgid "" +"The method takes a request ID (``future``) as an argument and returns an " +"optional object containing a response. If the response is not ready, the " +"method returns ``std::nullopt``. Note that for each ``future`` the method " +"can be called only once because it erases the request ID from the internal " +"map as soon as the response is returned to a user." +msgstr "" + +msgid "" +"A response consists of a header (``response.header``) and a body " +"(``response.body``). Depending on success of the request execution on the " +"server side, body may contain either runtime errors accessible by " +"``response.body.error_stack`` or data (tuples) accessible by " +"``response.body.data``. Data is a vector of tuples. However, tuples are not " +"decoded and come in the form of pointers to the start and the end of " +"MessagePacks. For details on decoding the data received, refer to " +":ref:`\"Decoding and reading the data\" `." +msgstr "" + +msgid "a response object or ``std::nullopt``" +msgstr "" + +msgid "std::optional>" +msgstr "" + +msgid "" +"rid_t ping = conn.ping();\n" +"std::optional> response = conn.getResponse(ping);" +msgstr "" + +msgid "" +"Returns an error message for the last error occured during the execution of " +"methods of the :ref:`Connector ` and :ref:`Connection " +"` classes." +msgstr "" + +msgid "an error message" +msgstr "" + +msgid "std::string&" +msgstr "" + +msgid "" +"int rc = client.connect(conn, address, port);\n" +"\n" +"if (rc != 0) {\n" +" assert(conn.status.is_failed);\n" +" std::cerr << conn.getError() << std::endl;\n" +" return -1;\n" +"}" +msgstr "" + +msgid "" +"Resets a connection after errors, that is, cleans up the error message and " +"the connection status." +msgstr "" + +msgid "" +"if (client.wait(conn, ping, WAIT_TIMEOUT) != 0) {\n" +" assert(conn.status.is_failed);\n" +" std::cerr << conn.getError() << std::endl;\n" +" conn.reset();\n" +"}" +msgstr "" + +msgid "Prepares a request to ping a Tarantool instance." +msgstr "" + +msgid "" +"The method encodes the request in the `MessagePack `_ " +"format and queues it in the output connection buffer to be sent later by one" +" of :ref:`Connector's ` methods, namely, :ref:`wait() " +"`, :ref:`waitAll() " +"`, or :ref:`waitAny() " +"`." +msgstr "" + +msgid "" +"Returns the request ID that is used to get the response by the " +":ref:`getResponce() ` method." +msgstr "" + +msgid "rid_t ping = conn.ping();" +msgstr "" + +msgid "Nested classes and their methods" +msgstr "" + +msgid ":ref:`Space `" +msgstr "" + +msgid ":ref:`Index `" +msgstr "" + +msgid "Space class" +msgstr "" + +msgid "" +"``Space`` is a nested class of the :ref:`Connection `" +" class. It is a public wrapper to access the data-manipulation methods in " +"the way similar to the Tarantool submodule " +":doc:`box.space`, like, " +"``space[space_id].select()``, ``space[space_id].replace()``, and so on." +msgstr "" + +msgid "" +"All the ``Space`` class methods listed below work in the following way:" +msgstr "" + +msgid "" +"A method encodes the corresponding request in the `MessagePack " +"`_ format and queues it in the output connection " +"buffer to be sent later by one of :ref:`Connector's ` " +"methods, namely, :ref:`wait() `, :ref:`waitAll() " +"`, or :ref:`waitAny() " +"`." +msgstr "" + +msgid "" +"A method returns the request ID. To get and read the actual data requested, " +"first you need to get the response object by using the :ref:`getResponce() " +"` method and then :ref:`decode " +"` the data." +msgstr "" + +msgid "**Public methods**:" +msgstr "" + +msgid ":ref:`select() `" +msgstr "" + +msgid ":ref:`replace() `" +msgstr "" + +msgid ":ref:`insert() `" +msgstr "" + +msgid ":ref:`update() `" +msgstr "" + +msgid ":ref:`upsert() `" +msgstr "" + +msgid ":ref:`delete_() `" +msgstr "" + +msgid "" +"Searches for a tuple or a set of tuples in the given space. The method works" +" similar to :doc:`/reference/reference_lua/box_space/select` and performs " +"the search against the primary index (``index_id = 0``) by default. In other" +" words, ``space[space_id].select()`` equals to " +"``space[space_id].index[0].select()``." +msgstr "" + +msgid "value to be matched against the index key." +msgstr "" + +msgid "index ID. Optional. Defaults to ``0``." +msgstr "" + +msgid "" +"maximum number of tuples to select. Optional. Defaults to ``UINT32_MAX``." +msgstr "" + +msgid "number of tuples to skip. Optional. Defaults to ``0``." +msgstr "" + +msgid "the type of iterator. Optional. Defaults to ``EQ``." +msgstr "" + +msgid "" +"/* Equals to space_object:select({key_value}, {limit = 1}) in Tarantool*/\n" +"uint32_t space_id = 512;\n" +"int key_value = 5;\n" +"uint32_t limit = 1;\n" +"auto i = conn.space[space_id];\n" +"rid_t select = i.select(std::make_tuple(key_value), index_id, limit, offset, iter);" +msgstr "" + +msgid "" +"Inserts a tuple into the given space. If a tuple with the same primary key " +"already exists, ``replace()`` replaces the existing tuple with a new one. " +"The method works similar to " +":doc:`/reference/reference_lua/box_space/replace`." +msgstr "" + +msgid "a tuple to insert." +msgstr "" + +msgid "" +"/* Equals to space_object:replace(key_value, \"111\", 1.01) in Tarantool*/\n" +"uint32_t space_id = 512;\n" +"int key_value = 5;\n" +"std::tuple data = std::make_tuple(key_value, \"111\", 1.01);\n" +"rid_t replace = conn.space[space_id].replace(data);" +msgstr "" + +msgid "" +"Inserts a tuple into the given space. The method works similar to " +":doc:`/reference/reference_lua/box_space/insert`." +msgstr "" + +msgid "" +"/* Equals to space_object:insert(key_value, \"112\", 2.22) in Tarantool*/\n" +"uint32_t space_id = 512;\n" +"int key_value = 6;\n" +"std::tuple data = std::make_tuple(key_value, \"112\", 2.22);\n" +"rid_t insert = conn.space[space_id].insert(data);" +msgstr "" + +msgid "" +"Updates a tuple in the given space. The method works similar to " +":doc:`/reference/reference_lua/box_space/update` and searches for the tuple " +"to update against the primary index (``index_id = 0``) by default. In other " +"words, ``space[space_id].update()`` equals to " +"``space[space_id].index[0].update()``." +msgstr "" + +msgid "" +"The ``tuple`` parameter specifies an update operation, an identifier of the " +"field to update, and a new field value. The set of available operations and " +"the format of specifying an operation and a field identifier is the same as " +"in Tarantool. Refer to the description of :doc:` " +"` and example below for details." +msgstr "" + +msgid "" +"parameters for the update operation, namely, ``operator, field_identifier, " +"value``." +msgstr "" + +msgid "" +"/* Equals to space_object:update(key, {{'=', 1, 'update' }, {'+', 2, 12}}) in Tarantool*/\n" +"uint32_t space_id = 512;\n" +"std::tuple key = std::make_tuple(5);\n" +"std::tuple op1 = std::make_tuple(\"=\", 1, \"update\");\n" +"std::tuple op2 = std::make_tuple(\"+\", 2, 12);\n" +"rid_t f1 = conn.space[space_id].update(key, std::make_tuple(op1, op2));" +msgstr "" + +msgid "" +"Updates or inserts a tuple in the given space. The method works similar to " +":doc:`/reference/reference_lua/box_space/upsert`." +msgstr "" + +msgid "" +"If there is an existing tuple that matches the key fields of ``tuple``, the " +"request has the same effect as :ref:`update() " +"` and the ``ops`` parameter is used. If there " +"is no existing tuple that matches the key fields of ``tuple``, the request " +"has the same effect as :ref:`insert() ` and " +"the ``tuple`` parameter is used." +msgstr "" + +msgid "" +"starting number to count fields in a tuple: ``0`` or ``1``. Optional. " +"Defaults to ``0``." +msgstr "" + +msgid "" +"/* Equals to space_object:upsert({333, \"upsert-insert\", 0.0}, {{'=', 1, 'upsert-update'}}) in Tarantool*/\n" +"uint32_t space_id = 512;\n" +"std::tuple tuple = std::make_tuple(333, \"upsert-insert\", 0.0);\n" +"std::tuple op1 = std::make_tuple(\"=\", 1, \"upsert-update\");\n" +"rid_t f1 = conn.space[space_id].upsert(tuple, std::make_tuple(op1));" +msgstr "" + +msgid "" +"Deletes a tuple in the given space. The method works similar to " +":doc:`/reference/reference_lua/box_space/delete` and searches for the tuple " +"to delete against the primary index (``index_id = 0``) by default. In other " +"words, ``space[space_id].delete_()`` equals to " +"``space[space_id].index[0].delete_()``." +msgstr "" + +msgid "" +"/* Equals to space_object:delete(123) in Tarantool*/\n" +"uint32_t space_id = 512;\n" +"std::tuple key = std::make_tuple(123);\n" +"rid_t f1 = conn.space[space_id].delete_(key);" +msgstr "" + +msgid "Index class" +msgstr "" + +msgid "" +"``Index`` is a nested class of the :ref:`Space " +"` class. It is a public wrapper to access the " +"data-manipulation methods in the way similar to the Tarantool submodule " +":doc:`box.index `, like, " +"``space[space_id].index[index_id].select()`` and so on." +msgstr "" + +msgid "" +"All the ``Index`` class methods listed below work in the following way:" +msgstr "" + +msgid "" +"A method returns the request ID that is used to get the response by the " +":ref:`getResponce() ` method. Refer to " +"the :ref:`getResponce() ` description to " +"understand the response structure and how to read the requested data." +msgstr "" + +msgid ":ref:`select() `" +msgstr "" + +msgid ":ref:`update() `" +msgstr "" + +msgid ":ref:`delete_() `" +msgstr "" + +msgid "" +"This is an alternative to :ref:`space.select() " +"`. The method searches for a tuple or a set of" +" tuples in the given space against a particular index and works similar to " +":doc:`/reference/reference_lua/box_index/select`." +msgstr "" + +msgid "" +"/* Equals to index_object:select({key}, {limit = 1}) in Tarantool*/\n" +"uint32_t space_id = 512;\n" +"uint32_t index_id = 1;\n" +"int key = 10;\n" +"uint32_t limit = 1;\n" +"auto i = conn.space[space_id].index[index_id];\n" +"rid_t select = i.select(std::make_tuple(key), limit, offset, iter);" +msgstr "" + +msgid "" +"This is an alternative to :ref:`space.update() " +"`. The method updates a tuple in the given " +"space but searches for the tuple against a particular index. The method " +"works similar to :doc:`/reference/reference_lua/box_index/update`." +msgstr "" + +msgid "" +"The ``tuple`` parameter specifies an update operation, an identifier of the " +"field to update, and a new field value. The set of available operations and " +"the format of specifying an operation and a field identifier is the same as " +"in Tarantool. Refer to the description of :doc:` " +"` and example below for details." +msgstr "" + +msgid "" +"/* Equals to index_object:update(key, {{'=', 1, 'update' }, {'+', 2, 12}}) in Tarantool*/\n" +"uint32_t space_id = 512;\n" +"uint32_t index_id = 1;\n" +"std::tuple key = std::make_tuple(10);\n" +"std::tuple op1 = std::make_tuple(\"=\", 1, \"update\");\n" +"std::tuple op2 = std::make_tuple(\"+\", 2, 12);\n" +"rid_t f1 = conn.space[space_id].index[index_id].update(key, std::make_tuple(op1, op2));" +msgstr "" + +msgid "" +"This is an alternative to :ref:`space.delete_() " +"`. The method deletes a tuple in the given " +"space but searches for the tuple against a particular index. The method " +"works similar to :doc:`/reference/reference_lua/box_index/delete`." +msgstr "" + +msgid "" +"/* Equals to index_object:delete(123) in Tarantool*/\n" +"uint32_t space_id = 512;\n" +"uint32_t index_id = 1;\n" +"std::tuple key = std::make_tuple(123);\n" +"rid_t f1 = conn.space[space_id].index[index_id].delete_(key);" +msgstr "" diff --git a/locale/ru/LC_MESSAGES/book/connectors/go.po b/locale/ru/LC_MESSAGES/book/connectors/go.po new file mode 100644 index 0000000000..f134ec76b0 --- /dev/null +++ b/locale/ru/LC_MESSAGES/book/connectors/go.po @@ -0,0 +1,279 @@ + +msgid "Go" +msgstr "" + +msgid "The following connectors are available:" +msgstr "" + +msgid "" +"Tarantool-supported `go-tarantool `__" +msgstr "" + +msgid "" +"Community-supported `viciious/go-tarantool `_" +msgstr "" + +msgid "" +"Community-supported `FZambia/tarantool " +"`_." +msgstr "" + +msgid "Feature comparison" +msgstr "" + +msgid "Last update: January 2023" +msgstr "" + +msgid "`tarantool/go-tarantool `_" +msgstr "" + +msgid "`viciious/go-tarantool `_" +msgstr "" + +msgid "`FZambia/tarantool `_" +msgstr "" + +msgid "License" +msgstr "" + +msgid "BSD 2-Clause" +msgstr "" + +msgid "MIT" +msgstr "" + +msgid "Last update" +msgstr "" + +msgid "2023" +msgstr "" + +msgid "2022" +msgstr "" + +msgid "Documentation" +msgstr "" + +msgid "README with examples and up-to-date GoDoc" +msgstr "" + +msgid "README with examples, code comments" +msgstr "" + +msgid "README with examples" +msgstr "" + +msgid "Testing / CI / CD" +msgstr "" + +msgid "GitHub Actions" +msgstr "" + +msgid "Travis CI" +msgstr "" + +msgid "GitHub Stars" +msgstr "" + +msgid "147" +msgstr "" + +msgid "45" +msgstr "" + +msgid "14" +msgstr "" + +msgid "Static analysis" +msgstr "" + +msgid "golangci-lint, luacheck" +msgstr "" + +msgid "golint" +msgstr "" + +msgid "golangci-lint" +msgstr "" + +msgid "Packaging" +msgstr "" + +msgid "go get" +msgstr "" + +msgid "Code coverage" +msgstr "" + +msgid "Yes" +msgstr "" + +msgid "No" +msgstr "" + +msgid "msgpack driver" +msgstr "" + +msgid "" +"`vmihailenco/msgpack/v2 `_ " +"or `vmihailenco/msgpack/v5 " +"`_" +msgstr "" + +msgid "`tinylib/msgp `_" +msgstr "" + +msgid "" +"`vmihailenco/msgpack/v5 `_" +msgstr "" + +msgid "Async work" +msgstr "" + +msgid "Schema reload" +msgstr "" + +msgid "Yes (manual pull)" +msgstr "" + +msgid "Space / index names" +msgstr "" + +msgid "Tuples as structures" +msgstr "" + +msgid "Yes (structure and marshall functions must be predefined in Go code)" +msgstr "" + +msgid "Access tuple fields by names" +msgstr "" + +msgid "Only if marshalled to structure" +msgstr "" + +msgid "" +"`SQL `_ " +"support" +msgstr "" + +msgid "" +"No (`#18 `_, closed)" +msgstr "" + +msgid "" +"`Interactive transactions " +"`_" +msgstr "" + +msgid "" +"`Varbinary `_ " +"support" +msgstr "" + +msgid "Yes (with in-built language tools)" +msgstr "" + +msgid "" +"Yes (decodes to string by default, see `#6 " +"`_)" +msgstr "" + +msgid "" +"`UUID `_ " +"support" +msgstr "" + +msgid "Decimal support" +msgstr "" + +msgid "" +"`EXT_ERROR " +"`_ support" +msgstr "" + +msgid "" +"`Datetime `_ " +"support" +msgstr "" + +msgid "" +"`box.session.push() responses " +"`_" +msgstr "" + +msgid "No (`#21 `_)" +msgstr "" + +msgid "" +"`Session settings " +"`_" +msgstr "" + +msgid "" +"`Graceful shutdown `_" +msgstr "" + +msgid "" +"`IPROTO_ID (feature discovering) " +"`_" +msgstr "" + +msgid "`tarantool/crud `_ support" +msgstr "" + +msgid "Connection pool" +msgstr "" + +msgid "Yes (round-robin failover, no balancing)" +msgstr "" + +msgid "Transparent reconnecting" +msgstr "" + +msgid "" +"Yes (see comments in `#129 `_)" +msgstr "" + +msgid "" +"No (handle reconnects explicitly, refer to `#11 " +"`_)" +msgstr "" + +msgid "" +"Yes (see comments in `#7 `_)" +msgstr "" + +msgid "Transparent request retrying" +msgstr "" + +msgid "`Watchers `_" +msgstr "" + +msgid "`Pagination `_" +msgstr "" + +msgid "Language features" +msgstr "" + +msgid "context" +msgstr "" + +msgid "Miscellaneous" +msgstr "" + +msgid "Supports `tarantool/queue `_ API" +msgstr "" + +msgid "" +"Can mimic a Tarantool instance (also as replica). Provides instrumentation " +"for reading snapshot and xlog files via `snapio module " +"`_. Implements " +"unpacking of query structs if you want to implement your own iproto proxy" +msgstr "" + +msgid "API is experimental and breaking changes may happen" +msgstr "" diff --git a/locale/ru/LC_MESSAGES/book/connectors/index.po b/locale/ru/LC_MESSAGES/book/connectors/index.po index 1c94d5d7e5..2b90a969bc 100644 --- a/locale/ru/LC_MESSAGES/book/connectors/index.po +++ b/locale/ru/LC_MESSAGES/book/connectors/index.po @@ -177,14 +177,13 @@ msgid "" "\"A\", \"B\");``. And that is why APIs exist for drivers for Perl, Python, " "PHP, and so on." msgstr "" -"Теперь получившийся пакет можно послать в адрес экземпляра Tarantool и " -"затем расшифровать ответ (описания формата пакета ответов и вопросов вы " -"найдете на той же странице о :ref:`бинарном протоколе в Tarantool " -"`). Но более простым и верным способом будет " -"вызвать процедуру, которая сформирует готовый пакет с заданными параметрами." -" Что-то вроде ``response = tarantool_routine(\"insert\", 513, \"A\", " -"\"B\");``. Для этого и существуют API для драйверов для Perl, Python, PHP и " -"т.д." +"Теперь получившийся пакет можно послать в адрес экземпляра Tarantool и затем" +" расшифровать ответ (описания формата пакета ответов и вопросов вы найдете " +"на той же странице о :ref:`бинарном протоколе в Tarantool `). Но более простым и верным способом будет вызвать " +"процедуру, которая сформирует готовый пакет с заданными параметрами. Что-то " +"вроде ``response = tarantool_routine(\"insert\", 513, \"A\", \"B\");``. Для " +"этого и существуют API для драйверов для Perl, Python, PHP и т.д." msgid "Setting up the server for connector examples" msgstr "Настройка окружения для примеров работы с коннекторами" @@ -260,15 +259,15 @@ msgid "" "conversions occur." msgstr "" "При работе с любым Tarantool-коннектором функции, вызванные с помощью " -"Tarantool, возвращают значения в формате MsgPack. Если функция была " -"вызвана через API коннектора, то формат возвращаемых значений будет " -"следующим: скалярные значения возвращаются в виде кортежей (сначала идет " -"идентификатор типа из формата MsgPack, а затем идет значение); все прочие " -"(не скалярные) значения возвращаются в виде групп кортежей (сначала идет " -"идентификатор массива в формате MsgPack, а затем идут скалярные значения). " -"Но если функция была вызвана в рамках бинарного протокола (с помощью команды" -" ``eval``), а не через API коннектора, то подобных изменений формата " -"возвращаемых значений не происходит." +"Tarantool, возвращают значения в формате MsgPack. Если функция была вызвана " +"через API коннектора, то формат возвращаемых значений будет следующим: " +"скалярные значения возвращаются в виде кортежей (сначала идет идентификатор " +"типа из формата MsgPack, а затем идет значение); все прочие (не скалярные) " +"значения возвращаются в виде групп кортежей (сначала идет идентификатор " +"массива в формате MsgPack, а затем идут скалярные значения). Но если функция" +" была вызвана в рамках бинарного протокола (с помощью команды ``eval``), а " +"не через API коннектора, то подобных изменений формата возвращаемых значений" +" не происходит." msgid "" "In the following example, a Lua function will be created. Since it will be " diff --git a/locale/ru/LC_MESSAGES/book/connectors/java.po b/locale/ru/LC_MESSAGES/book/connectors/java.po index 1c1888a952..fe20176918 100644 --- a/locale/ru/LC_MESSAGES/book/connectors/java.po +++ b/locale/ru/LC_MESSAGES/book/connectors/java.po @@ -5,12 +5,13 @@ msgstr "Java" msgid "There are two Java connectors available:" msgstr "Доступны два Java-коннектора:" +#, fuzzy msgid "" "`cartridge-java `__ supports " "both single Tarantool nodes and clusters, as well as applications built " -"using the :doc:`Cartridge framework ` and its modules. The " -"Tarantool team actively updates this module with the newest Tarantool " -"features." +"using the `Cartridge framework `__ " +"and its modules. The Tarantool team actively updates this module with the " +"newest Tarantool features." msgstr "" "`cartridge-java `__ " "поддерживает как отдельные узлы и кластеры Tarantool, так и приложения, " diff --git a/locale/ru/LC_MESSAGES/book/connectors/perl.po b/locale/ru/LC_MESSAGES/book/connectors/perl.po index 8101fcf62d..a049569fca 100644 --- a/locale/ru/LC_MESSAGES/book/connectors/perl.po +++ b/locale/ru/LC_MESSAGES/book/connectors/perl.po @@ -1,25 +1,25 @@ - - msgid "Perl" msgstr "Perl" +#, fuzzy msgid "" "The most commonly used Perl driver is `tarantool-perl " -"`_. It is not supplied as part " -"of the Tarantool repository; it must be installed separately. The most " +"`__. It is not supplied as part" +" of the Tarantool repository; it must be installed separately. The most " "common way to install it is by cloning from GitHub." msgstr "" "Самый используемый драйвер для Perl -- `tarantool-perl " "`_. Он не входит в репозиторий " -"Tarantool, его необходимо устанавливать отдельно. Проще всего установить " -"его путем клонирования с GitHub." +"Tarantool, его необходимо устанавливать отдельно. Проще всего установить его" +" путем клонирования с GitHub." +#, fuzzy msgid "" "To avoid minor warnings that may appear the first time ``tarantool-perl`` is" " installed, start with installing some other modules that ``tarantool-perl``" " uses, with `CPAN, the Comprehensive Perl Archive Network " -"`_:" +"`__:" msgstr "" "Во избежание незначительных предупреждений, которые может выдать система " "после первой установки ``tarantool-perl``, начните установку с некоторых " @@ -54,6 +54,7 @@ msgstr "" "$ make\n" "$ sudo make install" +#, fuzzy msgid "" "Here is a complete Perl program that inserts ``[99999,'BB']`` into " "``space[999]`` via the Perl API. Before trying to run, check that the server" @@ -63,10 +64,10 @@ msgid "" "example.pl`. The program will connect using an application-specific " "definition of the space. The program will open a socket connection with the " "Tarantool instance at ``localhost:3301``, then send an " -":ref:`space_object:INSERT` request, then — if all is well " -"— end without displaying any messages. If Tarantool is not running on " -"``localhost`` with :ref:`listen` port = 3301, the program " -"will print “Connection refused”." +":ref:`space_object:INSERT ` request, then — if all is well" +" — end without displaying any messages. If Tarantool is not running on " +"``localhost`` with :ref:`listen ` port = 3301, the program" +" will print “Connection refused”." msgstr "" "Далее приводится пример полноценной программы на языке Perl, которая " "осуществляет вставку кортежа ``[99999,'BB']`` в спейс ``space[999]`` с " @@ -127,19 +128,21 @@ msgstr "" "\n" "$tnt->insert('examples' => [ 99999, 'BB' ]);" +#, fuzzy msgid "" "The example program uses field type names 'STR' and 'NUM' instead of " -":ref:`'string' and 'unsigned'`, due to a temporary " +":ref:`'string' and 'unsigned' `, due to a temporary " "Perl limitation." msgstr "" "Из-за временных ограничений в языке Perl, вместо полей типа :ref:`'string' и" " 'unsigned'` в тестовой программе указаны поля типа " "'STR' и 'NUM'." +#, fuzzy msgid "" "The example program only shows one request and does not show all that's " "necessary for good practice. For that, please see the `tarantool-perl " -"repository `_." +"repository `__." msgstr "" "В этой программе мы привели пример использования лишь одного запроса. Для " "полноценной работы с Tarantool обратитесь к документации из `репозитория " diff --git a/locale/ru/LC_MESSAGES/book/connectors/php.po b/locale/ru/LC_MESSAGES/book/connectors/php.po index a39283e131..2a224639b3 100644 --- a/locale/ru/LC_MESSAGES/book/connectors/php.po +++ b/locale/ru/LC_MESSAGES/book/connectors/php.po @@ -2,18 +2,19 @@ msgid "PHP" msgstr "PHP" +#, fuzzy msgid "" -"`tarantool-php `_ is the " +"`tarantool-php `__ is the " "official PHP connector for Tarantool. It is not supplied as part of the " "Tarantool repository and must be installed separately (see `installation " "instructions `_ in the connector's ``README`` file)." +"building>`__ in the connector's ``README`` file)." msgstr "" "`tarantool-php `_ -- это " "официальный PHP-коннектор для Tarantool. Он не входит в репозиторий " -"Tarantool, его необходимо устанавливать отдельно (`инструкции по установке" -" `_ см." -" в файле коннектора :file:`README`)." +"Tarantool, его необходимо устанавливать отдельно (`инструкции по установке " +"`_ см. " +"в файле коннектора :file:`README`)." msgid "" "Here is a complete PHP program that inserts ``[99999,'BB']`` into a space " @@ -78,21 +79,23 @@ msgstr "" " echo $e->getMessage(), \"\\n\";\n" "}" +#, fuzzy msgid "" "The example program only shows one request and does not show all that's " "necessary for good practice. For that, please see `tarantool/tarantool-php " -"`_ project at GitHub." +"`__ project at GitHub." msgstr "" "В этой программе мы привели пример использования лишь одного запроса. Для " "полноценной работы с Tarantool обратитесь к документации из `проекта " "tarantool-php на GitHub `_." +#, fuzzy msgid "" -"Besides, there is another community-driven `GitHub project " -"`_ which includes an `alternative " -"connector `_ written in pure PHP, " -"an `object mapper `_, a `queue " -"`_ and other packages." +"Besides, there is another community-driven `tarantool-php GitHub project " +"`__ which includes an `alternative " +"connector `__ written in pure PHP, " +"an `object mapper `__, a `queue " +"`__ and other packages." msgstr "" "Кроме того, сообщество разработчиков поддерживает `проект на GitHub " "`_, который включает в себя `вариант " diff --git a/locale/ru/LC_MESSAGES/book/connectors/python.po b/locale/ru/LC_MESSAGES/book/connectors/python.po index 49b9f7038e..984a0a69ab 100644 --- a/locale/ru/LC_MESSAGES/book/connectors/python.po +++ b/locale/ru/LC_MESSAGES/book/connectors/python.po @@ -2,8 +2,9 @@ msgid "Python" msgstr "Python" +#, fuzzy msgid "" -"`tarantool-python `_ is the " +"`tarantool-python `__ is the " "official Python connector for Tarantool. It is not supplied as part of the " "Tarantool repository and must be installed separately (see below for " "details)." @@ -51,15 +52,16 @@ msgstr "" "--user` (для установки в директорию :file:`~`, т.е. в используемую по " "умолчанию директорию текущего пользователя)." +#, fuzzy msgid "" "Before trying to run, check that the server instance is :ref:`listening " "` at ``localhost:3301`` and that the space ``examples`` " "exists, as :ref:`described earlier `. To run the " "program, say :samp:`python example.py`. The program will connect to the " -"Tarantool server, will send the :ref:`INSERT` request, and" -" will not throw any exception if all went well. If the tuple already exists," -" the program will throw ``tarantool.error.DatabaseError: (3, \"Duplicate key" -" exists in unique index 'primary' in space 'examples'\")``." +"Tarantool server, will send the :ref:`INSERT ` request, " +"and will not throw any exception if all went well. If the tuple already " +"exists, the program will throw ``tarantool.error.DatabaseError: (3, " +"\"Duplicate key exists in unique index 'primary' in space 'examples'\")``." msgstr "" "Перед запуском данной программы проверьте, что у Tarantool-сервера задан " "порт ``localhost:3301`` для :ref:`прослушивания ` и в базе" @@ -72,13 +74,11 @@ msgstr "" "`tarantool.error.DatabaseError: (3, \"Duplicate key exists in unique index " "'primary' in space 'examples'\")`." +#, fuzzy msgid "" "The example program only shows one request and does not show all that's " "necessary for good practice. For that, please see `tarantool-python " -"`_ project at GitHub. For an " -"example of using Python API with `queue managers for Tarantool " -"`_, see `queue-python " -"`_ project at GitHub." +"`__ project at GitHub." msgstr "" "В этой программе мы привели пример использования лишь одного запроса. Для " "полноценной работы с Tarantool обратитесь к документации из `проекта " @@ -92,21 +92,254 @@ msgid "Also there are several community-driven Python connectors:" msgstr "" "Кроме того, сообщество разработчиков поддерживает другие Python-коннекторы:" +#, fuzzy msgid "" -"`asynctnt `_ with asyncio support" +"`asynctnt `__ with asyncio support" msgstr "" "`asynctnt `_ с поддержкой asyncio" +#, fuzzy msgid "" -"`aiotarantool `_ also with " -"asyncio support" +"`aiotarantool `__ also with " +"asyncio support, **no active maintenance**" msgstr "" -"`aiotarantool `_ также с " -"поддержкой asyncio" +"`gtarantool `_ с поддержкой gevent " +"**не обновляется**" +#, fuzzy msgid "" -"`gtarantool `_ with gevent support " -"**no active maintenance**" +"`gtarantool `__ with gevent " +"support, **no active maintenance**" msgstr "" "`gtarantool `_ с поддержкой gevent " "**не обновляется**" + +msgid "" +"The table below contains a feature comparison for asynctnt and tarantool-" +"python. aiotarantool and gtarantool are absent there because they are quite " +"outdated and unmaintained." +msgstr "" + +msgid "Feature comparison" +msgstr "" + +msgid "Last update: September 2023" +msgstr "" + +msgid "Parameter" +msgstr "" + +#, fuzzy +msgid "`igorcoding/asynctnt `__" +msgstr "" +"`asynctnt `_ с поддержкой asyncio" + +msgid "" +"`tarantool/tarantool-python `__" +msgstr "" + +msgid "License" +msgstr "" + +msgid "Apache License 2.0" +msgstr "" + +msgid "BSD-2" +msgstr "" + +msgid "Is maintained" +msgstr "" + +msgid "Yes" +msgstr "" + +msgid "Known Issues" +msgstr "" + +msgid "None" +msgstr "" + +msgid "Documentation" +msgstr "" + +msgid "Yes (`github.io `__)" +msgstr "" + +msgid "" +"Yes (`readthedocs `__ and :ref:`tarantool.io `)" +msgstr "" + +msgid "Testing / CI / CD" +msgstr "" + +msgid "GitHub Actions" +msgstr "" + +msgid "GitHub Stars" +msgstr "" + +msgid "73" +msgstr "" + +msgid "92" +msgstr "" + +msgid "Static Analysis" +msgstr "" + +msgid "Yes (Flake8)" +msgstr "" + +msgid "Yes (Flake8, Pylint)" +msgstr "" + +msgid "Packaging" +msgstr "" + +msgid "`pip `__" +msgstr "" + +msgid "" +"`pip, deb, rpm `__" +msgstr "" + +msgid "Code coverage" +msgstr "" + +msgid "Support asynchronous mode" +msgstr "" + +msgid "Yes, `asyncio `__" +msgstr "" + +msgid "No" +msgstr "" + +msgid "Batching support" +msgstr "" + +msgid "Yes (with CRUD API)" +msgstr "" + +msgid "Schema reload" +msgstr "" + +msgid "" +"Yes (automatically, see `auto_refetch_schema " +"`__)" +msgstr "" + +msgid "Yes (automatically)" +msgstr "" + +msgid "Space / index names" +msgstr "" + +msgid "Access tuple fields by names" +msgstr "" + +msgid ":ref:`SQL support `" +msgstr "" + +msgid "" +":ref:`Interactive transactions `" +msgstr "" + +msgid "" +"No (`issue #163 `__)" +msgstr "" + +msgid ":ref:`Varbinary support `" +msgstr "" + +msgid "Yes (in ``MP_BIN`` fields)" +msgstr "" + +msgid ":ref:`Decimal support `" +msgstr "" + +msgid ":ref:`UUID support `" +msgstr "" + +msgid ":ref:`EXT_ERROR support `" +msgstr "" + +msgid ":ref:`Datetime support `" +msgstr "" + +msgid ":ref:`Interval support `" +msgstr "" + +#, fuzzy +msgid "No (`issue #30 `__)" +msgstr "" +"`asynctnt `_ с поддержкой asyncio" + +msgid ":ref:`box.session.push() responses `" +msgstr "" + +msgid ":ref:`Session settings `" +msgstr "" + +msgid "" +"`Graceful shutdown `__" +msgstr "" + +msgid "" +"`IPROTO_ID (feature discovery) " +"`__" +msgstr "" + +msgid "`CRUD support `__" +msgstr "" + +msgid "Transparent request retrying" +msgstr "" + +msgid "Transparent reconnecting" +msgstr "" + +msgid "Autoreconnect" +msgstr "" + +msgid "" +"Yes (reconnect_max_attempts, reconnect_delay), checking of connection " +"liveness" +msgstr "" + +msgid "Connection pool" +msgstr "" + +msgid "Yes (with master discovery)" +msgstr "" + +msgid "" +"Support of `PEP 249 -- Python Database API Specification v2.0 " +"`__" +msgstr "" + +msgid "" +"`Yes `__" +msgstr "" + +msgid "" +":ref:`Encrypted connection (Enterprise Edition) `" +msgstr "" + +#, fuzzy +msgid "No (`issue #22 `__)" +msgstr "" +"`asynctnt `_ с поддержкой asyncio" + +#~ msgid "" +#~ "`aiotarantool `_ also with " +#~ "asyncio support" +#~ msgstr "" +#~ "`aiotarantool `_ также с " +#~ "поддержкой asyncio" diff --git a/locale/ru/LC_MESSAGES/book/faq.po b/locale/ru/LC_MESSAGES/book/faq.po index 97d84d2e5a..7728e95190 100644 --- a/locale/ru/LC_MESSAGES/book/faq.po +++ b/locale/ru/LC_MESSAGES/book/faq.po @@ -34,8 +34,8 @@ msgstr "" "Lua -- это легкий, быстрый и расширяемый язык, позволяющий использовать " "различные парадигмы программирования. Lua также легко встраивается в " "различные приложения. Сопрограммы (coroutines) в Lua близко соотносятся с " -"файберами (fibers) в Tarantool, а вся Lua-архитектура гладко ложится на " -"его внутреннюю реализацию. Lua -- это первый язык, на котором можно писать " +"файберами (fibers) в Tarantool, а вся Lua-архитектура гладко ложится на его " +"внутреннюю реализацию. Lua -- это первый язык, на котором можно писать " "хранимые процедуры для Tarantool. В будущем список поддерживаемых языков " "планируется расширить." @@ -101,15 +101,15 @@ msgid "" msgstr "" "Основной движок баз данных в Tarantool работает с оперативной памятью, но " "при этом он гарантирует сохранность данных благодаря механизму WAL (write " -"ahead log), т.е. журналу упреждающей записи. Также в Tarantool " -"используются технологии сжатия и распределения данных, которые позволяют " -"использовать все виды памяти наиболее эффективно. Если Tarantool " -"сталкивается с нехваткой оперативной памяти, то он приостанавливает прием " -"запросов на изменение данных до тех пор, пока не появится свободная память, " -"но при этом с успехом продолжает обработку запросов на чтение и удаление " -"данных. А для больших баз, где объем данных значительно превосходит " -"имеющийся объем оперативной памяти, у Tarantool есть второй движок, чьи " -"возможности ограничены лишь размером жесткого диска." +"ahead log), т.е. журналу упреждающей записи. Также в Tarantool используются " +"технологии сжатия и распределения данных, которые позволяют использовать все" +" виды памяти наиболее эффективно. Если Tarantool сталкивается с нехваткой " +"оперативной памяти, то он приостанавливает прием запросов на изменение " +"данных до тех пор, пока не появится свободная память, но при этом с успехом " +"продолжает обработку запросов на чтение и удаление данных. А для больших " +"баз, где объем данных значительно превосходит имеющийся объем оперативной " +"памяти, у Tarantool есть второй движок, чьи возможности ограничены лишь " +"размером жесткого диска." msgid "Can I store (large) BLOBs in Tarantool?" msgstr "Можно ли хранить (большие) объекты BLOB в Tarantool?" diff --git a/locale/ru/LC_MESSAGES/book/intro.po b/locale/ru/LC_MESSAGES/book/intro.po index 8bdb292f62..0e32bf8978 100644 --- a/locale/ru/LC_MESSAGES/book/intro.po +++ b/locale/ru/LC_MESSAGES/book/intro.po @@ -15,6 +15,7 @@ msgstr "" msgid "How to read the documentation" msgstr "Как пользоваться документацией" +#, fuzzy msgid "" "To get started, you can install and launch Tarantool using :ref:`a Docker " "container `, :ref:`a package manager " @@ -22,13 +23,13 @@ msgid "" "http://try.tarantool.org. Either way, as the first tryout, you can follow " "the introductory exercises from :ref:`Chapter 2 \"Getting started\" " "`. If you want more hands-on experience, proceed to " -":ref:`Tutorials ` after you are through with Chapter 2." +":ref:`How-to guides ` after you are through with Chapter 2." msgstr "" "Для начала можно установить и запустить Tarantool, используя :ref:`Docker-" "контейнер `, :ref:`менеджер " -"пакетов` или онлайн-сервер " -"Tarantool http://try.tarantool.org. В любом случае для пробы можно сделать" -" вводные упражнения из :ref:`главы 2 \"Руководство для начинающих\" " +"пакетов` или онлайн-сервер Tarantool " +"http://try.tarantool.org. В любом случае для пробы можно сделать вводные " +"упражнения из :ref:`главы 2 \"Руководство для начинающих\" " "`. Если хотите получить практический опыт, переходите к " ":ref:`Практическим заданиям ` после работы с главой 2." diff --git a/locale/ru/LC_MESSAGES/code_snippets/README.po b/locale/ru/LC_MESSAGES/code_snippets/README.po new file mode 100644 index 0000000000..55209d6c0c --- /dev/null +++ b/locale/ru/LC_MESSAGES/code_snippets/README.po @@ -0,0 +1,126 @@ + +msgid "Tarantool code examples" +msgstr "" + +msgid "" +"The `doc/code_snippets` folder of a Tarantool documentation repository " +"contains runnable code examples that show how to work with Tarantool:" +msgstr "" + +msgid "" +"The [snippets](snippets) folder contains sample applications that " +"demonstrate how to configure a Tarantool cluster." +msgstr "" + +msgid "" +"The [test](test) folder contains testable Lua examples that show how to work" +" with various Tarantool modules." +msgstr "" + +msgid "" +"Code from these examples is [referenced](#referencing-code-snippets) in " +"corresponding documentation sections." +msgstr "" + +msgid "Prerequisites" +msgstr "" + +msgid "" +"Install the [tt CLI " +"utility](https://www.tarantool.io/en/doc/latest/reference/tooling/tt_cli/)." +msgstr "" + +msgid "" +"To be able to run tests for samples from [test](test), go to the " +"`doc/code_snippets` folder and install the following libraries:" +msgstr "" + +msgid "[luatest](https://github.com/tarantool/luatest):" +msgstr "" + +msgid "tt rocks install luatest\n" +msgstr "" + +msgid "[luarapidxml](https://github.com/tarantool/luarapidxml):" +msgstr "" + +msgid "tt rocks install luarapidxml\n" +msgstr "" + +msgid "Running" +msgstr "" + +msgid "Running applications from 'snippets'" +msgstr "" + +msgid "" +"To run applications placed in [snippets](snippets), follow these steps:" +msgstr "" + +msgid "" +"Go to the directory containing samples for a specific feature, for example, " +"[snippets/replication](snippets/replication)." +msgstr "" + +msgid "" +"To run applications placed in [instances.enabled](instances.enabled), " +"execute the `tt start` command, for example:" +msgstr "" + +msgid "$ tt start auto_leader\n" +msgstr "" + +msgid "Running and testing examples from 'test'" +msgstr "" + +msgid "" +"To test all the examples, go to the `doc/code_snippets` folder and execute " +"the `luatest` command:" +msgstr "" + +msgid ".rocks/bin/luatest\n" +msgstr "" + +msgid "" +"To test the examples from the specified directory, pass its relative path to" +" the `luatest` command:" +msgstr "" + +msgid ".rocks/bin/luatest test/transactions\n" +msgstr "" + +msgid "" +"To test a specific example with the `stdout` output enabled, use the " +"`luatest` command with the `-c` option, for example:" +msgstr "" + +msgid ".rocks/bin/luatest -c test/http_client/get_test.lua\n" +msgstr "" + +msgid "" +"Note that the HTTP client samples (placed in `test/http_client`) use the " +"`httpbin` service. You can run `httpbin` locally using Docker to stabilize " +"test results:" +msgstr "" + +msgid "docker run -p 80:80 kennethreitz/httpbin\n" +msgstr "" + +msgid "" +"In this case, you need to replace `https://httpbin.org` links with " +"`http://127.0.0.1`." +msgstr "" + +msgid "Referencing code snippets" +msgstr "" + +msgid "" +"To display a specific source file in a topic, use the `literalinclude` " +"directive as follows:" +msgstr "" + +msgid "" +".. literalinclude:: /code_snippets/test/http_client/post_json_test.lua\n" +" :language: lua\n" +" :lines: 1-6\n" +msgstr "" diff --git a/locale/ru/LC_MESSAGES/code_snippets/snippets/config/README.po b/locale/ru/LC_MESSAGES/code_snippets/snippets/config/README.po new file mode 100644 index 0000000000..23af274554 --- /dev/null +++ b/locale/ru/LC_MESSAGES/code_snippets/snippets/config/README.po @@ -0,0 +1,20 @@ + +msgid "Configuration" +msgstr "" + +msgid "" +"A sample application demonstrating various features related to Tarantool " +"[configuration](https://www.tarantool.io/en/doc/latest/concepts/configuration/)." +msgstr "" + +msgid "Running" +msgstr "" + +msgid "" +"To run applications placed in [instances.enabled](instances.enabled), go to " +"the `config` directory in the terminal and execute the `tt start` command, " +"for example:" +msgstr "" + +msgid "$ tt start application\n" +msgstr "" diff --git a/locale/ru/LC_MESSAGES/code_snippets/snippets/replication/README.po b/locale/ru/LC_MESSAGES/code_snippets/snippets/replication/README.po new file mode 100644 index 0000000000..57a83b5552 --- /dev/null +++ b/locale/ru/LC_MESSAGES/code_snippets/snippets/replication/README.po @@ -0,0 +1,18 @@ + +msgid "Replication" +msgstr "" + +msgid "A sample application demonstrating various replication features." +msgstr "" + +msgid "Running" +msgstr "" + +msgid "" +"To run applications placed in [instances.enabled](instances.enabled), go to " +"the `replication` directory in the terminal and execute the `tt start` " +"command, for example:" +msgstr "" + +msgid "$ tt start auto_leader\n" +msgstr "" diff --git a/locale/ru/LC_MESSAGES/code_snippets/snippets/replication/instances.enabled/auto_leader/README.po b/locale/ru/LC_MESSAGES/code_snippets/snippets/replication/instances.enabled/auto_leader/README.po new file mode 100644 index 0000000000..5e031ab189 --- /dev/null +++ b/locale/ru/LC_MESSAGES/code_snippets/snippets/replication/instances.enabled/auto_leader/README.po @@ -0,0 +1,20 @@ + +msgid "Master-replica: automated failover" +msgstr "" + +msgid "" +"A sample application demonstrating how to bootstrap a replica set with " +"[automated failover](https://www.tarantool.io/en/doc/latest/how-" +"to/replication/repl_bootstrap_auto/)." +msgstr "" + +msgid "Running" +msgstr "" + +msgid "" +"To start all instances, execute the following command in the " +"[replication](../../../replication) directory:" +msgstr "" + +msgid "$ tt start auto_leader\n" +msgstr "" diff --git a/locale/ru/LC_MESSAGES/code_snippets/snippets/replication/instances.enabled/bootstrap_strategy/README.po b/locale/ru/LC_MESSAGES/code_snippets/snippets/replication/instances.enabled/bootstrap_strategy/README.po new file mode 100644 index 0000000000..6b98052cb1 --- /dev/null +++ b/locale/ru/LC_MESSAGES/code_snippets/snippets/replication/instances.enabled/bootstrap_strategy/README.po @@ -0,0 +1,19 @@ + +msgid "replication.bootstrap_strategy" +msgstr "" + +msgid "" +"A sample application demonstrating how to use the specified instance to " +"bootstrap a replica set." +msgstr "" + +msgid "Running" +msgstr "" + +msgid "" +"To start all instances, execute the following command in the " +"[replication](../../../replication) directory:" +msgstr "" + +msgid "$ tt start bootstrap_strategy\n" +msgstr "" diff --git a/locale/ru/LC_MESSAGES/code_snippets/snippets/replication/instances.enabled/manual_leader/README.po b/locale/ru/LC_MESSAGES/code_snippets/snippets/replication/instances.enabled/manual_leader/README.po new file mode 100644 index 0000000000..9fe8444650 --- /dev/null +++ b/locale/ru/LC_MESSAGES/code_snippets/snippets/replication/instances.enabled/manual_leader/README.po @@ -0,0 +1,20 @@ + +msgid "Master-replica: manual failover" +msgstr "" + +msgid "" +"A sample application demonstrating how to bootstrap a replica set with " +"[manual failover](https://www.tarantool.io/en/doc/latest/how-" +"to/replication/repl_bootstrap/)." +msgstr "" + +msgid "Running" +msgstr "" + +msgid "" +"To start all instances, execute the following command in the " +"[replication](../../../replication) directory:" +msgstr "" + +msgid "$ tt start manual_leader\n" +msgstr "" diff --git a/locale/ru/LC_MESSAGES/code_snippets/snippets/replication/instances.enabled/master_master/README.po b/locale/ru/LC_MESSAGES/code_snippets/snippets/replication/instances.enabled/master_master/README.po new file mode 100644 index 0000000000..a4c051f3dd --- /dev/null +++ b/locale/ru/LC_MESSAGES/code_snippets/snippets/replication/instances.enabled/master_master/README.po @@ -0,0 +1,20 @@ + +msgid "Master-master" +msgstr "" + +msgid "" +"A sample application demonstrating how to bootstrap a [master-" +"master](https://www.tarantool.io/en/doc/latest/how-" +"to/replication/repl_bootstrap_master_master/) replica set." +msgstr "" + +msgid "Running" +msgstr "" + +msgid "" +"To start all instances, execute the following command in the " +"[replication](../../../replication) directory:" +msgstr "" + +msgid "$ tt start master_master\n" +msgstr "" diff --git a/locale/ru/LC_MESSAGES/code_snippets/snippets/sharding/README.po b/locale/ru/LC_MESSAGES/code_snippets/snippets/sharding/README.po new file mode 100644 index 0000000000..6faecbd75c --- /dev/null +++ b/locale/ru/LC_MESSAGES/code_snippets/snippets/sharding/README.po @@ -0,0 +1,77 @@ + +msgid "Sharded cluster" +msgstr "" + +msgid "" +"A sample application demonstrating how to configure a " +"[sharded](https://www.tarantool.io/en/doc/latest/concepts/sharding/) " +"cluster." +msgstr "" + +msgid "Running" +msgstr "" + +msgid "" +"To run the cluster, go to the `sharding` directory in the terminal and " +"perform the following steps:" +msgstr "" + +msgid "Install `vshard`:" +msgstr "" + +msgid "$ tt rocks install vshard\n" +msgstr "" + +msgid "Run the cluster:" +msgstr "" + +msgid "$ tt start sharded_cluster\n" +msgstr "" + +msgid "Connect to the router:" +msgstr "" + +msgid "$ tt connect sharded_cluster:router-a-001\n" +msgstr "" + +msgid "Insert test data:" +msgstr "" + +msgid "" +"sharded_cluster:router-a-001> insert_data()\n" +"---\n" +"...\n" +msgstr "" + +msgid "" +"Connect to storages in different replica sets to see how data is distributed" +" across nodes:" +msgstr "" + +msgid "a. `storage-a-001`:" +msgstr "" + +msgid "" +"sharded_cluster:storage-a-001> box.space.bands:select()\n" +"---\n" +"- - [1, 614, 'Roxette', 1986]\n" +" - [2, 986, 'Scorpions', 1965]\n" +" - [5, 755, 'Pink Floyd', 1965]\n" +" - [7, 998, 'The Doors', 1965]\n" +" - [8, 762, 'Nirvana', 1987]\n" +"...\n" +msgstr "" + +msgid "b. `storage-b-001`:" +msgstr "" + +msgid "" +"sharded_cluster:storage-b-001> box.space.bands:select()\n" +"---\n" +"- - [3, 11, 'Ace of Base', 1987]\n" +" - [4, 42, 'The Beatles', 1960]\n" +" - [6, 55, 'The Rolling Stones', 1962]\n" +" - [9, 299, 'Led Zeppelin', 1968]\n" +" - [10, 167, 'Queen', 1970]\n" +"...\n" +msgstr "" diff --git a/locale/ru/LC_MESSAGES/code_snippets/snippets/sharding/instances.enabled/sharded_cluster/README.po b/locale/ru/LC_MESSAGES/code_snippets/snippets/sharding/instances.enabled/sharded_cluster/README.po new file mode 100644 index 0000000000..cdaa5b1f93 --- /dev/null +++ b/locale/ru/LC_MESSAGES/code_snippets/snippets/sharding/instances.enabled/sharded_cluster/README.po @@ -0,0 +1,92 @@ + +msgid "Sharded cluster" +msgstr "" + +msgid "" +"A sample application demonstrating how to configure a " +"[sharded](https://www.tarantool.io/en/doc/latest/concepts/sharding/) " +"cluster." +msgstr "" + +msgid "Running" +msgstr "" + +msgid "" +"To run the cluster, go to the `sharding` directory in the terminal and " +"perform the following steps:" +msgstr "" + +msgid "Install `vshard`:" +msgstr "" + +msgid "$ tt rocks install vshard\n" +msgstr "" + +msgid "Run the cluster:" +msgstr "" + +msgid "$ tt start sharded_cluster\n" +msgstr "" + +msgid "Connect to the router:" +msgstr "" + +msgid "$ tt connect sharded_cluster:router-a-001\n" +msgstr "" + +msgid "Insert test data:" +msgstr "" + +msgid "" +"sharded_cluster:router-a-001> insert_data()\n" +"---\n" +"...\n" +msgstr "" + +msgid "" +"Connect to storages in different replica sets to see how data is distributed" +" across nodes:" +msgstr "" + +msgid "a. `storage-a-001`:" +msgstr "" + +msgid "" +"sharded_cluster:storage-a-001> box.space.bands:select()\n" +"---\n" +"- - [1, 614, 'Roxette', 1986]\n" +" - [2, 986, 'Scorpions', 1965]\n" +" - [5, 755, 'Pink Floyd', 1965]\n" +" - [7, 998, 'The Doors', 1965]\n" +" - [8, 762, 'Nirvana', 1987]\n" +"...\n" +msgstr "" + +msgid "b. `storage-b-001`:" +msgstr "" + +msgid "" +"sharded_cluster:storage-b-001> box.space.bands:select()\n" +"---\n" +"- - [3, 11, 'Ace of Base', 1987]\n" +" - [4, 42, 'The Beatles', 1960]\n" +" - [6, 55, 'The Rolling Stones', 1962]\n" +" - [9, 299, 'Led Zeppelin', 1968]\n" +" - [10, 167, 'Queen', 1970]\n" +"...\n" +msgstr "" + +msgid "Packaging" +msgstr "" + +msgid "" +"To package an application into a `.tgz` archive, use the `tt pack` command:" +msgstr "" + +msgid "$ tt pack tgz --app-list sharded_cluster\n" +msgstr "" + +msgid "" +"Note that the necessary `vshard` dependency is specified in the " +"[sharded_cluster-scm-1.rockspec](sharded_cluster-scm-1.rockspec) file." +msgstr "" diff --git a/locale/ru/LC_MESSAGES/concepts/atomic.po b/locale/ru/LC_MESSAGES/concepts/atomic.po index 2177410d9a..88090e7a75 100644 --- a/locale/ru/LC_MESSAGES/concepts/atomic.po +++ b/locale/ru/LC_MESSAGES/concepts/atomic.po @@ -2,563 +2,571 @@ msgid "Transactions" msgstr "Транзакции" -msgid "" -"Transactions in Tarantool occur in **fibers** on a single **thread**. That " -"is why Tarantool has a guarantee of execution atomicity. That requires " -"emphasis." -msgstr "" -"Транзакции в Tarantool выполняются в **файберах** в одном **потоке**. Вот " -"почему Tarantool дает гарантию атомарности выполнения. На это следует " -"обратить внимание." - -msgid "" -"Since :tarantool-release:`2.10.0-beta1`, Tarantool supports streams and " -"interactive transactions over them. See :ref:`Streams `." -msgstr "" -"Начиная с версии :tarantool-release:`2.10.0-beta1`, Tarantool поддерживает " -"стримы и интерактивные транзакции. Больше информации можно найти здесь: " -":ref:`Стримы `." - -msgid "Threads, fibers and yields" -msgstr "Потоки, файберы и передача управления" - -msgid "" -"How does Tarantool process a basic operation? As an example, let's take this" -" query:" -msgstr "" -"Как Tarantool выполняет основные операции? Для примера возьмем такой запрос:" - -msgid "" -"tarantool> box.space.tester:update({3}, {{'=', 2, 'size'}, {'=', 3, 0}})" -msgstr "" -"tarantool> box.space.tester:update({3}, {{'=', 2, 'size'}, {'=', 3, 0}})" - -msgid "" -"This is equivalent to the following SQL statement for a table that stores " -"primary keys in ``field[1]``:" -msgstr "" -"Это соответствует следующему SQL-выражению для таблицы, где первичные ключи " -"— поле ``field[1]``:" - -msgid "UPDATE tester SET \"field[2]\" = 'size', \"field[3]\" = 0 WHERE \"field[1]\" = 3" -msgstr "UPDATE tester SET \"field[2]\" = 'size', \"field[3]\" = 0 WHERE \"field[1]\" = 3" - -msgid "" -"Assuming this query is received by Tarantool via network, it will be " -"processed with three operating system **threads**:" -msgstr "" -"Предположим, что этот запрос Tarantool получил по сети, — тогда три " -"**потока** операционной системы будут обрабатывать этот запрос:" - -msgid "" -"The **network thread** on the server side receives the query, parses the " -"statement, checks if it's correct, and then transforms it into a special " -"structure--a message containing an executable statement and its options." -msgstr "" -"**Сетевой поток** на стороне сервера получает запрос, разбирает выражение, " -"проверяет его на правильность и преобразует его в специальную структуру — " -"сообщение, которое содержит готовый для исполнения запрос и его опции." - -msgid "" -"The network thread ships this message to the instance's **transaction " -"processor thread** using a lock-free message bus. Lua programs execute " -"directly in the transaction processor thread, and do not require parsing and" -" preparation." -msgstr "" -"Сетевой поток отправляет это сообщение в **поток обработки транзакций** с " -"помощью шины передачи сообщений без блокировок. Lua-программы выполняются " -"непосредственно в потоке обработки транзакций и не требуют разбора и " -"подготовки." - -msgid "" -"The instance's transaction processor thread uses the primary-key index on " -"field[1] to find the location of the tuple. It determines that the tuple can" -" be updated (not much can go wrong when you're merely changing an unindexed " -"field value)." -msgstr "" -"Чтобы найти нужный кортеж, поток обработки транзакций использует индекс на " -"поле первичного ключа field[1]. Он проверяет, что этот кортеж можно обновить" -" (вряд ли что-то пойдет не так, если мы всего лишь меняем значение не " -"индексированного поля)." - -msgid "" -"The transaction processor thread sends a message to the :ref:`write-ahead " -"logging (WAL) thread ` to commit the transaction. When done, " -"the WAL thread replies with a COMMIT or ROLLBACK result to the transaction " -"processor which gives it back to the network thread, and the network thread " -"returns the result to the client." -msgstr "" -"Поток обработки транзакций отправляет сообщение в :ref:`поток упреждающей " -"записи в журнал (WAL) ` для коммита транзакции. По завершении" -" поток WAL отправляет результат транзакции — COMMIT или ROLLBACK — в поток " -"обработки транзакций, который передает его сетевому потоку, а тот возвращает" -" результат клиенту." - -msgid "" -"Notice that there is only one transaction processor thread in Tarantool. " -"Some people are used to the idea that there can be multiple threads " -"operating on the database, with (say) thread #1 reading row #x, while thread" -" #2 writes row #y. With Tarantool, no such thing ever happens. Only the " -"transaction processor thread can access the database, and there is only one " -"transaction processor thread for each Tarantool instance." -msgstr "" -"Обратите внимание, что в Tarantool есть только один поток обработки " -"транзакций. Некоторые уже привыкли к мысли, что в базе данных может быть " -"множество потоков для обработки данных (например, один поток читает данные " -"из строки x, а другой в это время записывает данные в столбец y). В " -"Tarantool такого нет. Только у потока обработки транзакций есть доступ к " -"базе, и на каждый экземпляр Tarantool есть только один такой поток." - -msgid "" -"Like any other Tarantool thread, the transaction processor thread can handle" -" many :ref:`fibers `. A fiber is a set of computer " -"instructions that may contain \"**yield**\" signals. The transaction " -"processor thread will execute all computer instructions until a yield, then " -"switch to execute the instructions of a different fiber. Thus (say) the " -"thread reads row #x for the sake of fiber #1, then writes row #y for the " -"sake of fiber #2." -msgstr "" -"Как и любой другой поток Tarantool, поток обработки транзакций может " -"управлять множеством :ref:`файберов `. Файбер — это набор " -"команд, среди которых могут быть и сигналы \"**передачи управления**\". " -"Поток обработки транзакций выполняет все команды, пока не увидит такой " -"сигнал, и тогда он переключается на выполнение команд из другого файбера. " -"Например, таким образом поток обработки транзакций сначала выполняет чтение " -"данных из строки x для файбера №1, а затем выполняет запись в строку y для " -"файбера №2." - -msgid "" -"Yields must happen, otherwise the transaction processor thread would stick " -"permanently on the same fiber. There are two types of yields:" -msgstr "" -"Без передачи управления поток обработки транзакции застрянет на одном " -"файбере. Есть два типа передачи управления:" - -msgid "" -":ref:`implicit yields `: every data-change operation" -" or network-access causes an implicit yield, and every statement that goes " -"through the Tarantool client causes an implicit yield." -msgstr "" -":ref:`неявная передача управления `: любое изменение" -" данных или доступ к сети вызывает неявную передачу управления; любая " -"команда, которая проходит через клиент Tarantool, вызывает неявную передачу " -"управления." - -msgid "" -"explicit yields: in a Lua function, you can (and should) add :ref:`\"yield\"" -" ` statements to prevent hogging. This is called **cooperative " -"multitasking**." -msgstr "" -"явная передача управления: в Lua-функции можно (и нужно) добавлять операторы" -" :ref:`\"передачи управления\" `, чтобы не дать им захватить " -"процессорное время. Это называется **кооперативной многозадачностью**." - -msgid "Cooperative multitasking" -msgstr "Кооперативная многозадачность" - -msgid "" -"Cooperative multitasking means: unless a running fiber deliberately yields " -"control, it is not preempted by some other fiber. But a running fiber will " -"deliberately yield when it encounters a “yield point”: a transaction commit," -" an operating system call, or an explicit :ref:`\"yield\" ` " -"request. Any system call which can block will be performed asynchronously, " -"and any running fiber which must wait for a system call will be preempted, " -"so that another ready-to-run fiber takes its place and becomes the new " -"running fiber." -msgstr "" -"Кооперативная многозадачность означает, что пока запущенный файбер не " -"передает управление явно, его не вытесняет какой-либо другой файбер. Однако " -"запущенный файбер явно передаст управление, если обнаружит “точку передачи " -"управления”: коммит транзакции, системный вызов или запрос на явную " -":ref:`\"передачу управления\" `. Любой системный вызов, который" -" может блокировать файбер, будет асинхронным. Запущенный файбер, который " -"должен ждать системный вызов, будет вытеснен: другой готовый к работе файбер" -" занимает его место и становится запущенным файбером." - -msgid "" -"This model makes all programmatic locks unnecessary: cooperative " -"multitasking ensures that there will be no concurrency around a resource, no" -" race conditions, and no memory consistency issues. The way to achieve this " -"is quite simple: in critical sections, don't use yields, explicit or " -"implicit, and no one can interfere into the code execution." -msgstr "" -"Такая модель позволяет отказаться от программных блокировок, поскольку " -"кооперативная многозадачность обеспечивает отсутствие борьбы за ресурс, " -"гонки потоков и проблем с согласованностью данных. Добиться этого довольно " -"просто: не использовать явную или неявную передачу управления в критических " -"секциях, и никто не сможет вмешаться в выполнение кода." - -msgid "" -"When requests are small, for example simple UPDATE or INSERT or DELETE or " -"SELECT, fiber scheduling is fair: it takes only a little time to process the" -" request, schedule a disk write, and yield to a fiber serving the next " -"client." -msgstr "" -"При небольших запросах, таких как простые UPDATE, INSERT, DELETE или SELECT," -" планирование файберов будет справедливым: мало времени требуется на " -"обработку запроса, планирование записи на диск и передачу управления на " -"файбер, обслуживающий следующего клиента." - -msgid "" -"However, a function might perform complex computations or might be written " -"in such a way that yields do not occur for a long time. This can lead to " -"unfair scheduling, when a single client throttles the rest of the system, or" -" to apparent stalls in request processing. Avoiding this situation is the " -"responsibility of the function’s author." -msgstr "" -"Однако функция может выполнять сложные расчеты или может быть написана так," -" что управление не передается в течение длительного времени. Это может " -"привести к несправедливому планированию, когда отдельный клиент перекрывает " -"работу остальной системы, или к явным задержкам в обработке запросов. Автору" -" функции следует не допускать таких ситуаций." - -msgid "" -"In the absence of transactions, any function that contains yield points may " -"see changes in the database state caused by fibers that preempt. Multi-" -"statement transactions exist to provide **isolation**: each transaction sees" -" a consistent database state and commits all its changes atomically. At " -":doc:`commit ` time, a " -"yield happens and all transaction changes are written to the :ref:`write " -"ahead log ` in a single batch. Or, if needed, transaction " -"changes can be rolled back -- :doc:`completely " -"` or to a specific " -":doc:`savepoint " -"`." -msgstr "" -"В отсутствие транзакций любая функция, в которой есть точки передачи " -"управления, может видеть изменения в состоянии базы данных, вызванные " -"вытесняющими файберами. Составные транзакции предназначены для **изоляции**:" -" каждая транзакция видит постоянное состояние базы данных и делает атомарные" -" коммиты изменений. Во время :doc:`коммита " -"` происходит передача " -"управления, а все транзакционные изменения записываются в :ref:`журнал " -"упреждающей записи ` в отдельный пакет. Или, при " -"необходимости, можно откатить изменения -- :doc:`полностью " -"` или на определенную " -":doc:`точку сохранения " -"`." - -msgid "" -"In Tarantool, `transaction isolation level " -"`_" -" is *serializable* with the clause \"if no failure during writing to WAL\". " -"In case of such a failure that can happen, for example, if the disk space is" -" over, the transaction isolation level becomes *read uncommitted*." -msgstr "" -"В Tarantool `транзакции изолированы " -"`_" -" полностью — на уровне *serializable* (упорядочиваемость) с оговоркой: " -"\"если нет сбоев при записи в WAL\". В случае такого сбоя, например при " -"переполнении дискового пространства, транзакции изолированы на уровне *read " -"uncommitted* (чтение незафиксированных данных)." - -msgid "" -"In :ref:`vinyl `, to implement isolation Tarantool uses a " -"simple optimistic scheduler: the first transaction to commit wins. If a " -"concurrent active transaction has read a value modified by a committed " -"transaction, it is aborted." -msgstr "" -"В :ref:`vinyl ` Tarantool для изоляции использует простой " -"планировщик с оптимистичными блокировками: проходит та транзакция, которая " -"совершит коммит первой. Если параллельно другая активная транзакция " -"прочитала значение, измененное первой транзакцией, то она прерывается." - -msgid "" -"The cooperative scheduler ensures that, in absence of yields, a multi-" -"statement transaction is not preempted and hence is never aborted. " -"Therefore, understanding yields is essential to writing abort-free code." -msgstr "" -"Кооперативный планировщик обеспечивает, что в отсутствие передачи управления" -" многооператорная транзакция не вытесняется, поэтому никогда не прерывается." -" Таким образом, чтобы писать код без прерываний, надо понимать принципы " -"передачи управления." - -msgid "" -"Sometimes while testing the transaction mechanism in Tarantool you can " -"notice that yielding after ``box.begin()`` but before any read/write " -"operation does not cause an abort as it should according to the description." -" This happens because actually ``box.begin()`` does not start a transaction." -" It is a mark telling Tarantool to start a transaction after some database " -"request that follows." -msgstr "" -"При тестировании механизма транзакций в Tarantool иногда можно заметить, что" -" передача управления после ``box.begin()``, но перед любой операцией " -"чтения/записи не приводит к прерыванию, как это должно происходить согласно " -"описанию. Причина в том, что на самом деле ``box.begin()`` не запускает " -"транзакцию: это просто метка, которая показывает Tarantool, что надо " -"запустить транзакцию после некоторого последующего запроса к базе данных." - -msgid "" -"In memtx, if an instruction that implies yields, explicit or implicit, is " -"executed during a transaction, the transaction is fully rolled back. In " -"vinyl, we use more complex transactional manager that allows yields." -msgstr "" -"Если в memtx команда предполагает передачу управления (явную или неявную) и " -"выполняется в рамках транзакции, то транзакция откатывается полностью. В " -"vinyl мы используем более сложный менеджер транзакций, который позволяет " -"передавать управление в рамках транзакции." - -msgid "You can’t mix storage engines in a transaction today." -msgstr "" -"На сегодняшний день нельзя использовать разные движки базы данных в одной " -"транзакции." - -msgid "Implicit yields" -msgstr "Правила неявной передачи управления" - -msgid "" -"The only explicit yield requests in Tarantool are :ref:`fiber.sleep() " -"` and :ref:`fiber.yield() `, but many other " -"requests \"imply\" yields because Tarantool is designed to avoid blocking." -msgstr "" -"Единственные запросы явной передачи данных в Tarantool отправляют " -":ref:`fiber.sleep() ` и :ref:`fiber.yield() `, но " -"многие другие запросы \"неявно\" подразумевают передачу управления, " -"поскольку цель Tarantool -- избежать блокировок." - -msgid "" -"Database requests imply yields if and only if there is disk I/O. For memtx, " -"since all data is in memory, there is no disk I/O during a read request. For" -" vinyl, since some data may not be in memory, there may be disk I/O for a " -"read (to fetch data from disk) or for a write (because a stall may occur " -"while waiting for memory to be free). For both memtx and vinyl, since data-" -"change requests must be recorded in the WAL, there is normally a commit. A " -"commit happens automatically after every request in default \"autocommit\" " -"mode, or a commit happens at the end of a transaction in \"transaction\" " -"mode, when a user deliberately commits by calling " -":doc:`/reference/reference_lua/box_txn_management/commit`. Therefore for " -"both memtx and vinyl, because there can be disk I/O, some database " -"operations may imply yields." -msgstr "" -"Запросы к базе данных подразумевают передачу управления тогда и только " -"тогда, когда происходят дисковые операции ввода-вывода. Так как все данные в" -" memtx находятся в оперативной памяти, во время запроса на чтение дискового " -"ввода-вывода не происходит. В vinyl некоторые данные могут находиться не в " -"оперативной памяти, поэтому возможны дисковые операции при чтении (для " -"получения данных с диска) или при записи (потому что может произойти сбой в " -"ожидании освобождения памяти). Запросы на изменение данных и в memtx, и в " -"vinyl должны записываться в WAL, и обычно происходит коммит. Коммит " -"происходит автоматически после каждого запроса в режиме \"автоматических " -"коммитов\" (autocommit) по умолчанию или в конце транзакции в режиме " -"\"транзакция\" (transaction), когда пользователь вручную производит коммит, " -"вызывая :doc:`/reference/reference_lua/box_txn_management/commit`. Поэтому и" -" для memtx, и для vinyl некоторые операции с БД могут подразумевать передачу" -" управления при наличии дискового ввода-вывода." - -msgid "" -"Many functions in modules :ref:`fio `, :ref:`net_box `, :ref:`console ` and :ref:`socket ` " -"(the \"os\" and \"network\" requests) yield." -msgstr "" -"Многие функции в модулях :ref:`fio `, :ref:`net_box `, :ref:`console ` и :ref:`socket ` " -"(запросы \"ОС\" и \"сети\") передают управление." - -msgid "" -"That is why executing separate commands such as ``select()``, ``insert()``, " -"``update()`` in the console inside a transaction will cause an abort. This " -"is due to implicit yield happening after each chunk of code is executed in " -"the console." -msgstr "" -"Поэтому выполнение отдельных команд, таких как ``select()``, ``insert()``, " -"``update()`` в консоли внутри транзакции, приведет к прерыванию транзакции. " -"Это связано с тем, что после выполнения каждого фрагмента кода в консоли " -"происходит неявная передача управления (yield)." - -msgid "**Example #1**" -msgstr "**Пример №1**" - -msgid "" -"*Engine = memtx* |br| The sequence ``select() insert()`` has one yield, at " -"the end of insertion, caused by implicit commit; ``select()`` has nothing to" -" write to the WAL and so does not yield." -msgstr "" -"*Когда движок базы данных - memtx* |br| В последовательности ``select() " -"insert()`` управление передается один раз в конце вставки, что вызвано " -"неявным коммитом; ``select()`` ничего не записывает в WAL, поэтому не " -"передает управление." - -msgid "" -"*Engine = vinyl* |br| The sequence ``select() insert()`` has one to three " -"yields, since ``select()`` may yield if the data is not in cache, " -"``insert()`` may yield waiting for available memory, and there is an " -"implicit yield at commit." -msgstr "" -"*Когда движок базы данных - vinyl* |br| В последовательности ``select() " -"insert()`` управление передается от одного до трех раз: ``select()`` может " -"передавать управление, если данных нет в кэше; ``insert()`` может передавать" -" управление, пока ожидает доступную память; и при коммите будет неявная " -"передача управления." - -msgid "" -"The sequence ``begin() insert() insert() commit()`` yields only at commit if" -" the engine is memtx, and can yield up to 3 times if the engine is vinyl." -msgstr "" -"Последовательность ``begin() insert() insert() commit()`` передает " -"управление только при коммите, если движок = memtx, и может передавать " -"управление до 3 раз, если движок = vinyl." - -msgid "**Example #2**" -msgstr "**Пример №2**" - -msgid "" -"Assume that in the memtx space ‘tester’ there are tuples in which the third " -"field represents a positive dollar amount. Let's start a transaction, " -"withdraw from tuple#1, deposit in tuple#2, and end the transaction, making " -"its effects permanent." -msgstr "" -"Предположим, что в спейсе ‘tester’ в memtx есть кортежи, в которых третье " -"поле представляет собой положительную сумму в долларах. Начнем транзакцию, " -"снимем со счета из кортежа №1, пополним счет в кортеж №2 и закончим " -"транзакцию, подтвердив изменения." - -msgid "" -"tarantool> function txn_example(from, to, amount_of_money)\n" -" > box.begin()\n" -" > box.space.tester:update(from, {{'-', 3, amount_of_money}})\n" -" > box.space.tester:update(to, {{'+', 3, amount_of_money}})\n" -" > box.commit()\n" -" > return \"ok\"\n" -" > end\n" -"---\n" -"...\n" -"tarantool> txn_example({999}, {1000}, 1.00)\n" -"---\n" -"- \"ok\"\n" -"..." -msgstr "" -"tarantool> function txn_example(from, to, amount_of_money)\n" -" > box.begin()\n" -" > box.space.tester:update(from, {{'-', 3, amount_of_money}})\n" -" > box.space.tester:update(to, {{'+', 3, amount_of_money}})\n" -" > box.commit()\n" -" > return \"ok\"\n" -" > end\n" -"---\n" -"...\n" -"tarantool> txn_example({999}, {1000}, 1.00)\n" -"---\n" -"- \"ok\"\n" -"..." - -msgid "" -"If :ref:`wal_mode ` = ‘none’, then " -"implicit yielding at commit time does not take place, because there are no " -"writes to the WAL." -msgstr "" -"Если :ref:`wal_mode ` = ‘none’, то " -"при коммите управление не передается неявно, потому что не идет запись в " -"WAL-файл." - -msgid "" -"If a task is interactive -- sending requests to the server and receiving " -"responses -- then it involves network I/O, and therefore there is an " -"implicit yield, even if the request that is sent to the server is not itself" -" an implicit yield request. Therefore, the following sequence" -msgstr "" -"Если задача интерактивная — отправка запросов к серверу и получение ответов " -"— то она подразумевает сетевой ввод-вывод и неявную передачу управления, " -"даже если запрос, который отправляется на сервер, сам по себе не будет " -"запросом на неявную передачу управления. Поэтому такая последовательность" - -msgid "" -"conn.space.test:select{1}\n" -"conn.space.test:select{2}\n" -"conn.space.test:select{3}" -msgstr "" -"conn.space.test:select{1}\n" -"conn.space.test:select{2}\n" -"conn.space.test:select{3}" - -msgid "" -"causes yields three times sequentially when sending requests to the network " -"and awaiting the results. On the server side, the same requests are executed" -" in common order possibly mixing with other requests from the network and " -"local fibers. Something similar happens when using clients that operate via " -"telnet, via one of the connectors, or via the :ref:`MySQL and PostgreSQL " -"rocks `, or via the interactive mode when :ref:`using " -"Tarantool as a client `." -msgstr "" -"вызывает передачу управления три раза при отправке запросов в сеть и " -"ожидании результатов. На стороне сервера те же самые запросы выполняются в " -"общем порядке, возможно, смешиваясь с другими запросами из сети и локальных " -"файберов. Что-то подобное происходит, если использовать клиент, который " -"работает через telnet, с помощью одного из коннекторов или сторонних модулей" -" :ref:`MySQL и PostgreSQL ` или в интерактивном режиме, когда " -":ref:`Tarantool используется в качестве клиента `." - -msgid "" -"After a fiber has yielded and then has regained control, it immediately " -"issues :ref:`testcancel `." -msgstr "" -"После того, как файбер передал управление, а затем вернул его, он " -"незамедлительно вызывает :ref:`testcancel `." - -msgid "Transactional manager" -msgstr "Менеджер транзакций" - -msgid "" -"Since version :doc:`2.6.1 `, Tarantool has another option " -"for transaction behavior that allows yielding inside a memtx transaction. " -"This is controled by the *transactional manager*." -msgstr "" -"В версии :doc:`2.6.1 ` в Tarantool появился еще один вариант" -" поведения транзакции, который позволяет передать управление в пределах " -"memtx-транзакции. Этим занимается *менеджер транзакций*." - -msgid "" -"The transactional manager is designed for isolation of concurrent " -"transactions and provides *serializable* `transaction isolation level " -"`_." -" It consists of two parts:" -msgstr "" -"Менеджер транзакций изолирует параллельные транзакции, обеспечивая их " -"упорядочиваемость (`уровень изоляции транзакций " -"`_" -" — *serializable*). Менеджер транзакций состоит из двух частей:" - -msgid "*MVCC engine*" -msgstr "*MVCC-менеджер*" - -msgid "*conflict manager*." -msgstr "*менеджер конфликтов*" - -msgid "" -"The MVCC engine provides personal read views for transactions if necessary. " -"The conflict manager tracks transactions' changes and determines their " -"correctness in serialization order. Of course, once yielded, a transaction " -"could interfere with other transactions and could be aborted due to " -"conflict." -msgstr "" -"MVCC-менеджер обеспечивает многоверсионность данных для управления " -"параллельными транзакциями — при необходимости создает для транзакции ее " -"видение состояния базы данных (read view). Менеджер конфликтов отслеживает, " -"какие данные изменила транзакция, и определяет правильность изменений в " -"порядке сериализации. Конечно, если после передачи управления одна " -"транзакция конфликтует с другими, ее можно прервать." - -msgid "" -"Another important thing to mention is that the transaction manager provides " -"non-classic snapshot isolation level. It means that a transaction can get a " -"consistent snapshot of the database (that is common) but this snapshot is " -"not necessarily bound to the moment of the beginning of the transaction " -"(that is not common). The conflict manager makes decisions on whether and " -"when each transaction gets which snapshot. That allows to avoid some " -"conflicts comparing with classical snapshot isolation approach." -msgstr "" -"Еще стоит отметить, что менеджер транзакций обеспечивает нестандартный " -"уровень изоляции с помощью снимков. Это означает, что транзакция может " -"видеть снимок состояния базы данных (в этом нет ничего необычного), но этот " -"снимок не обязательно привязан к моменту начала транзакции (вот это уже " -"необычно). Менеджер конфликтов принимает решение о том, видит ли транзакция " -"снимок, какой именно и когда. Это позволяет избежать некоторых конфликтов в " -"сравнении с классическим подходом к изоляции с помощью снимков." - -msgid "" -"The transactional manager can be switched on and off by the ``box.cfg`` " -"option :ref:`memtx_use_mvcc_engine `." -msgstr "" -"Менеджер транзакций можно включать и отключать с помощью параметра " -":ref:`memtx_use_mvcc_engine ` в " -"``box.cfg``." +msgid "Transactions allow users to perform multiple operations atomically." +msgstr "" + +msgid "" +"For more information on how transactions work in Tarantool, see the " +"following sections:" +msgstr "" + +#~ msgid "" +#~ "Transactions in Tarantool occur in **fibers** on a single **thread**. That " +#~ "is why Tarantool has a guarantee of execution atomicity. That requires " +#~ "emphasis." +#~ msgstr "" +#~ "Транзакции в Tarantool выполняются в **файберах** в одном **потоке**. Вот " +#~ "почему Tarantool дает гарантию атомарности выполнения. На это следует " +#~ "обратить внимание." + +#~ msgid "" +#~ "Since :tarantool-release:`2.10.0-beta1`, Tarantool supports streams and " +#~ "interactive transactions over them. See :ref:`Streams `." +#~ msgstr "" +#~ "Начиная с версии :tarantool-release:`2.10.0-beta1`, Tarantool поддерживает " +#~ "стримы и интерактивные транзакции. Больше информации можно найти здесь: " +#~ ":ref:`Стримы `." + +#~ msgid "Threads, fibers and yields" +#~ msgstr "Потоки, файберы и передача управления" + +#~ msgid "" +#~ "How does Tarantool process a basic operation? As an example, let's take this" +#~ " query:" +#~ msgstr "" +#~ "Как Tarantool выполняет основные операции? Для примера возьмем такой запрос:" + +#~ msgid "" +#~ "tarantool> box.space.tester:update({3}, {{'=', 2, 'size'}, {'=', 3, 0}})" +#~ msgstr "" +#~ "tarantool> box.space.tester:update({3}, {{'=', 2, 'size'}, {'=', 3, 0}})" + +#~ msgid "" +#~ "This is equivalent to the following SQL statement for a table that stores " +#~ "primary keys in ``field[1]``:" +#~ msgstr "" +#~ "Это соответствует следующему SQL-выражению для таблицы, где первичные ключи " +#~ "— поле ``field[1]``:" + +#~ msgid "UPDATE tester SET \"field[2]\" = 'size', \"field[3]\" = 0 WHERE \"field[1]\" = 3" +#~ msgstr "UPDATE tester SET \"field[2]\" = 'size', \"field[3]\" = 0 WHERE \"field[1]\" = 3" + +#~ msgid "" +#~ "Assuming this query is received by Tarantool via network, it will be " +#~ "processed with three operating system **threads**:" +#~ msgstr "" +#~ "Предположим, что этот запрос Tarantool получил по сети, — тогда три " +#~ "**потока** операционной системы будут обрабатывать этот запрос:" + +#~ msgid "" +#~ "The **network thread** on the server side receives the query, parses the " +#~ "statement, checks if it's correct, and then transforms it into a special " +#~ "structure--a message containing an executable statement and its options." +#~ msgstr "" +#~ "**Сетевой поток** на стороне сервера получает запрос, разбирает выражение, " +#~ "проверяет его на правильность и преобразует его в специальную структуру — " +#~ "сообщение, которое содержит готовый для исполнения запрос и его опции." + +#~ msgid "" +#~ "The network thread ships this message to the instance's **transaction " +#~ "processor thread** using a lock-free message bus. Lua programs execute " +#~ "directly in the transaction processor thread, and do not require parsing and" +#~ " preparation." +#~ msgstr "" +#~ "Сетевой поток отправляет это сообщение в **поток обработки транзакций** с " +#~ "помощью шины передачи сообщений без блокировок. Lua-программы выполняются " +#~ "непосредственно в потоке обработки транзакций и не требуют разбора и " +#~ "подготовки." + +#~ msgid "" +#~ "The instance's transaction processor thread uses the primary-key index on " +#~ "field[1] to find the location of the tuple. It determines that the tuple can" +#~ " be updated (not much can go wrong when you're merely changing an unindexed " +#~ "field value)." +#~ msgstr "" +#~ "Чтобы найти нужный кортеж, поток обработки транзакций использует индекс на " +#~ "поле первичного ключа field[1]. Он проверяет, что этот кортеж можно обновить" +#~ " (вряд ли что-то пойдет не так, если мы всего лишь меняем значение не " +#~ "индексированного поля)." + +#~ msgid "" +#~ "The transaction processor thread sends a message to the :ref:`write-ahead " +#~ "logging (WAL) thread ` to commit the transaction. When done, " +#~ "the WAL thread replies with a COMMIT or ROLLBACK result to the transaction " +#~ "processor which gives it back to the network thread, and the network thread " +#~ "returns the result to the client." +#~ msgstr "" +#~ "Поток обработки транзакций отправляет сообщение в :ref:`поток упреждающей " +#~ "записи в журнал (WAL) ` для коммита транзакции. По завершении" +#~ " поток WAL отправляет результат транзакции — COMMIT или ROLLBACK — в поток " +#~ "обработки транзакций, который передает его сетевому потоку, а тот возвращает" +#~ " результат клиенту." + +#~ msgid "" +#~ "Notice that there is only one transaction processor thread in Tarantool. " +#~ "Some people are used to the idea that there can be multiple threads " +#~ "operating on the database, with (say) thread #1 reading row #x, while thread" +#~ " #2 writes row #y. With Tarantool, no such thing ever happens. Only the " +#~ "transaction processor thread can access the database, and there is only one " +#~ "transaction processor thread for each Tarantool instance." +#~ msgstr "" +#~ "Обратите внимание, что в Tarantool есть только один поток обработки " +#~ "транзакций. Некоторые уже привыкли к мысли, что в базе данных может быть " +#~ "множество потоков для обработки данных (например, один поток читает данные " +#~ "из строки x, а другой в это время записывает данные в столбец y). В " +#~ "Tarantool такого нет. Только у потока обработки транзакций есть доступ к " +#~ "базе, и на каждый экземпляр Tarantool есть только один такой поток." + +#~ msgid "" +#~ "Like any other Tarantool thread, the transaction processor thread can handle" +#~ " many :ref:`fibers `. A fiber is a set of computer " +#~ "instructions that may contain \"**yield**\" signals. The transaction " +#~ "processor thread will execute all computer instructions until a yield, then " +#~ "switch to execute the instructions of a different fiber. Thus (say) the " +#~ "thread reads row #x for the sake of fiber #1, then writes row #y for the " +#~ "sake of fiber #2." +#~ msgstr "" +#~ "Как и любой другой поток Tarantool, поток обработки транзакций может " +#~ "управлять множеством :ref:`файберов `. Файбер — это набор " +#~ "команд, среди которых могут быть и сигналы \"**передачи управления**\". " +#~ "Поток обработки транзакций выполняет все команды, пока не увидит такой " +#~ "сигнал, и тогда он переключается на выполнение команд из другого файбера. " +#~ "Например, таким образом поток обработки транзакций сначала выполняет чтение " +#~ "данных из строки x для файбера №1, а затем выполняет запись в строку y для " +#~ "файбера №2." + +#~ msgid "" +#~ "Yields must happen, otherwise the transaction processor thread would stick " +#~ "permanently on the same fiber. There are two types of yields:" +#~ msgstr "" +#~ "Без передачи управления поток обработки транзакции застрянет на одном " +#~ "файбере. Есть два типа передачи управления:" + +#~ msgid "" +#~ ":ref:`implicit yields `: every data-change operation" +#~ " or network-access causes an implicit yield, and every statement that goes " +#~ "through the Tarantool client causes an implicit yield." +#~ msgstr "" +#~ ":ref:`неявная передача управления `: любое изменение" +#~ " данных или доступ к сети вызывает неявную передачу управления; любая " +#~ "команда, которая проходит через клиент Tarantool, вызывает неявную передачу " +#~ "управления." + +#~ msgid "" +#~ "explicit yields: in a Lua function, you can (and should) add :ref:`\"yield\"" +#~ " ` statements to prevent hogging. This is called **cooperative " +#~ "multitasking**." +#~ msgstr "" +#~ "явная передача управления: в Lua-функции можно (и нужно) добавлять операторы" +#~ " :ref:`\"передачи управления\" `, чтобы не дать им захватить " +#~ "процессорное время. Это называется **кооперативной многозадачностью**." + +#~ msgid "Cooperative multitasking" +#~ msgstr "Кооперативная многозадачность" + +#~ msgid "" +#~ "Cooperative multitasking means: unless a running fiber deliberately yields " +#~ "control, it is not preempted by some other fiber. But a running fiber will " +#~ "deliberately yield when it encounters a “yield point”: a transaction commit," +#~ " an operating system call, or an explicit :ref:`\"yield\" ` " +#~ "request. Any system call which can block will be performed asynchronously, " +#~ "and any running fiber which must wait for a system call will be preempted, " +#~ "so that another ready-to-run fiber takes its place and becomes the new " +#~ "running fiber." +#~ msgstr "" +#~ "Кооперативная многозадачность означает, что пока запущенный файбер не " +#~ "передает управление явно, его не вытесняет какой-либо другой файбер. Однако " +#~ "запущенный файбер явно передаст управление, если обнаружит “точку передачи " +#~ "управления”: коммит транзакции, системный вызов или запрос на явную " +#~ ":ref:`\"передачу управления\" `. Любой системный вызов, который" +#~ " может блокировать файбер, будет асинхронным. Запущенный файбер, который " +#~ "должен ждать системный вызов, будет вытеснен: другой готовый к работе файбер" +#~ " занимает его место и становится запущенным файбером." + +#~ msgid "" +#~ "This model makes all programmatic locks unnecessary: cooperative " +#~ "multitasking ensures that there will be no concurrency around a resource, no" +#~ " race conditions, and no memory consistency issues. The way to achieve this " +#~ "is quite simple: in critical sections, don't use yields, explicit or " +#~ "implicit, and no one can interfere into the code execution." +#~ msgstr "" +#~ "Такая модель позволяет отказаться от программных блокировок, поскольку " +#~ "кооперативная многозадачность обеспечивает отсутствие борьбы за ресурс, " +#~ "гонки потоков и проблем с согласованностью данных. Добиться этого довольно " +#~ "просто: не использовать явную или неявную передачу управления в критических " +#~ "секциях, и никто не сможет вмешаться в выполнение кода." + +#~ msgid "" +#~ "When requests are small, for example simple UPDATE or INSERT or DELETE or " +#~ "SELECT, fiber scheduling is fair: it takes only a little time to process the" +#~ " request, schedule a disk write, and yield to a fiber serving the next " +#~ "client." +#~ msgstr "" +#~ "При небольших запросах, таких как простые UPDATE, INSERT, DELETE или SELECT," +#~ " планирование файберов будет справедливым: мало времени требуется на " +#~ "обработку запроса, планирование записи на диск и передачу управления на " +#~ "файбер, обслуживающий следующего клиента." + +#~ msgid "" +#~ "However, a function might perform complex computations or might be written " +#~ "in such a way that yields do not occur for a long time. This can lead to " +#~ "unfair scheduling, when a single client throttles the rest of the system, or" +#~ " to apparent stalls in request processing. Avoiding this situation is the " +#~ "responsibility of the function’s author." +#~ msgstr "" +#~ "Однако функция может выполнять сложные расчеты или может быть написана так," +#~ " что управление не передается в течение длительного времени. Это может " +#~ "привести к несправедливому планированию, когда отдельный клиент перекрывает " +#~ "работу остальной системы, или к явным задержкам в обработке запросов. Автору" +#~ " функции следует не допускать таких ситуаций." + +#~ msgid "" +#~ "In the absence of transactions, any function that contains yield points may " +#~ "see changes in the database state caused by fibers that preempt. Multi-" +#~ "statement transactions exist to provide **isolation**: each transaction sees" +#~ " a consistent database state and commits all its changes atomically. At " +#~ ":doc:`commit ` time, a " +#~ "yield happens and all transaction changes are written to the :ref:`write " +#~ "ahead log ` in a single batch. Or, if needed, transaction " +#~ "changes can be rolled back -- :doc:`completely " +#~ "` or to a specific " +#~ ":doc:`savepoint " +#~ "`." +#~ msgstr "" +#~ "В отсутствие транзакций любая функция, в которой есть точки передачи " +#~ "управления, может видеть изменения в состоянии базы данных, вызванные " +#~ "вытесняющими файберами. Составные транзакции предназначены для **изоляции**:" +#~ " каждая транзакция видит постоянное состояние базы данных и делает атомарные" +#~ " коммиты изменений. Во время :doc:`коммита " +#~ "` происходит передача " +#~ "управления, а все транзакционные изменения записываются в :ref:`журнал " +#~ "упреждающей записи ` в отдельный пакет. Или, при " +#~ "необходимости, можно откатить изменения -- :doc:`полностью " +#~ "` или на определенную " +#~ ":doc:`точку сохранения " +#~ "`." + +#~ msgid "" +#~ "In Tarantool, `transaction isolation level " +#~ "`_" +#~ " is *serializable* with the clause \"if no failure during writing to WAL\". " +#~ "In case of such a failure that can happen, for example, if the disk space is" +#~ " over, the transaction isolation level becomes *read uncommitted*." +#~ msgstr "" +#~ "В Tarantool `транзакции изолированы " +#~ "`_" +#~ " полностью — на уровне *serializable* (упорядочиваемость) с оговоркой: " +#~ "\"если нет сбоев при записи в WAL\". В случае такого сбоя, например при " +#~ "переполнении дискового пространства, транзакции изолированы на уровне *read " +#~ "uncommitted* (чтение незафиксированных данных)." + +#~ msgid "" +#~ "In :ref:`vinyl `, to implement isolation Tarantool uses a " +#~ "simple optimistic scheduler: the first transaction to commit wins. If a " +#~ "concurrent active transaction has read a value modified by a committed " +#~ "transaction, it is aborted." +#~ msgstr "" +#~ "В :ref:`vinyl ` Tarantool для изоляции использует простой " +#~ "планировщик с оптимистичными блокировками: проходит та транзакция, которая " +#~ "совершит коммит первой. Если параллельно другая активная транзакция " +#~ "прочитала значение, измененное первой транзакцией, то она прерывается." + +#~ msgid "" +#~ "The cooperative scheduler ensures that, in absence of yields, a multi-" +#~ "statement transaction is not preempted and hence is never aborted. " +#~ "Therefore, understanding yields is essential to writing abort-free code." +#~ msgstr "" +#~ "Кооперативный планировщик обеспечивает, что в отсутствие передачи управления" +#~ " многооператорная транзакция не вытесняется, поэтому никогда не прерывается." +#~ " Таким образом, чтобы писать код без прерываний, надо понимать принципы " +#~ "передачи управления." + +#~ msgid "" +#~ "Sometimes while testing the transaction mechanism in Tarantool you can " +#~ "notice that yielding after ``box.begin()`` but before any read/write " +#~ "operation does not cause an abort as it should according to the description." +#~ " This happens because actually ``box.begin()`` does not start a transaction." +#~ " It is a mark telling Tarantool to start a transaction after some database " +#~ "request that follows." +#~ msgstr "" +#~ "При тестировании механизма транзакций в Tarantool иногда можно заметить, что" +#~ " передача управления после ``box.begin()``, но перед любой операцией " +#~ "чтения/записи не приводит к прерыванию, как это должно происходить согласно " +#~ "описанию. Причина в том, что на самом деле ``box.begin()`` не запускает " +#~ "транзакцию: это просто метка, которая показывает Tarantool, что надо " +#~ "запустить транзакцию после некоторого последующего запроса к базе данных." + +#~ msgid "" +#~ "In memtx, if an instruction that implies yields, explicit or implicit, is " +#~ "executed during a transaction, the transaction is fully rolled back. In " +#~ "vinyl, we use more complex transactional manager that allows yields." +#~ msgstr "" +#~ "Если в memtx команда предполагает передачу управления (явную или неявную) и " +#~ "выполняется в рамках транзакции, то транзакция откатывается полностью. В " +#~ "vinyl мы используем более сложный менеджер транзакций, который позволяет " +#~ "передавать управление в рамках транзакции." + +#~ msgid "You can’t mix storage engines in a transaction today." +#~ msgstr "" +#~ "На сегодняшний день нельзя использовать разные движки базы данных в одной " +#~ "транзакции." + +#~ msgid "Implicit yields" +#~ msgstr "Правила неявной передачи управления" + +#~ msgid "" +#~ "The only explicit yield requests in Tarantool are :ref:`fiber.sleep() " +#~ "` and :ref:`fiber.yield() `, but many other " +#~ "requests \"imply\" yields because Tarantool is designed to avoid blocking." +#~ msgstr "" +#~ "Единственные запросы явной передачи данных в Tarantool отправляют " +#~ ":ref:`fiber.sleep() ` и :ref:`fiber.yield() `, но " +#~ "многие другие запросы \"неявно\" подразумевают передачу управления, " +#~ "поскольку цель Tarantool -- избежать блокировок." + +#~ msgid "" +#~ "Database requests imply yields if and only if there is disk I/O. For memtx, " +#~ "since all data is in memory, there is no disk I/O during a read request. For" +#~ " vinyl, since some data may not be in memory, there may be disk I/O for a " +#~ "read (to fetch data from disk) or for a write (because a stall may occur " +#~ "while waiting for memory to be free). For both memtx and vinyl, since data-" +#~ "change requests must be recorded in the WAL, there is normally a commit. A " +#~ "commit happens automatically after every request in default \"autocommit\" " +#~ "mode, or a commit happens at the end of a transaction in \"transaction\" " +#~ "mode, when a user deliberately commits by calling " +#~ ":doc:`/reference/reference_lua/box_txn_management/commit`. Therefore for " +#~ "both memtx and vinyl, because there can be disk I/O, some database " +#~ "operations may imply yields." +#~ msgstr "" +#~ "Запросы к базе данных подразумевают передачу управления тогда и только " +#~ "тогда, когда происходят дисковые операции ввода-вывода. Так как все данные в" +#~ " memtx находятся в оперативной памяти, во время запроса на чтение дискового " +#~ "ввода-вывода не происходит. В vinyl некоторые данные могут находиться не в " +#~ "оперативной памяти, поэтому возможны дисковые операции при чтении (для " +#~ "получения данных с диска) или при записи (потому что может произойти сбой в " +#~ "ожидании освобождения памяти). Запросы на изменение данных и в memtx, и в " +#~ "vinyl должны записываться в WAL, и обычно происходит коммит. Коммит " +#~ "происходит автоматически после каждого запроса в режиме \"автоматических " +#~ "коммитов\" (autocommit) по умолчанию или в конце транзакции в режиме " +#~ "\"транзакция\" (transaction), когда пользователь вручную производит коммит, " +#~ "вызывая :doc:`/reference/reference_lua/box_txn_management/commit`. Поэтому и" +#~ " для memtx, и для vinyl некоторые операции с БД могут подразумевать передачу" +#~ " управления при наличии дискового ввода-вывода." + +#~ msgid "" +#~ "Many functions in modules :ref:`fio `, :ref:`net_box `, :ref:`console ` and :ref:`socket ` " +#~ "(the \"os\" and \"network\" requests) yield." +#~ msgstr "" +#~ "Многие функции в модулях :ref:`fio `, :ref:`net_box `, :ref:`console ` и :ref:`socket ` " +#~ "(запросы \"ОС\" и \"сети\") передают управление." + +#~ msgid "" +#~ "That is why executing separate commands such as ``select()``, ``insert()``, " +#~ "``update()`` in the console inside a transaction will cause an abort. This " +#~ "is due to implicit yield happening after each chunk of code is executed in " +#~ "the console." +#~ msgstr "" +#~ "Поэтому выполнение отдельных команд, таких как ``select()``, ``insert()``, " +#~ "``update()`` в консоли внутри транзакции, приведет к прерыванию транзакции. " +#~ "Это связано с тем, что после выполнения каждого фрагмента кода в консоли " +#~ "происходит неявная передача управления (yield)." + +#~ msgid "**Example #1**" +#~ msgstr "**Пример №1**" + +#~ msgid "" +#~ "*Engine = memtx* |br| The sequence ``select() insert()`` has one yield, at " +#~ "the end of insertion, caused by implicit commit; ``select()`` has nothing to" +#~ " write to the WAL and so does not yield." +#~ msgstr "" +#~ "*Когда движок базы данных - memtx* |br| В последовательности ``select() " +#~ "insert()`` управление передается один раз в конце вставки, что вызвано " +#~ "неявным коммитом; ``select()`` ничего не записывает в WAL, поэтому не " +#~ "передает управление." + +#~ msgid "" +#~ "*Engine = vinyl* |br| The sequence ``select() insert()`` has one to three " +#~ "yields, since ``select()`` may yield if the data is not in cache, " +#~ "``insert()`` may yield waiting for available memory, and there is an " +#~ "implicit yield at commit." +#~ msgstr "" +#~ "*Когда движок базы данных - vinyl* |br| В последовательности ``select() " +#~ "insert()`` управление передается от одного до трех раз: ``select()`` может " +#~ "передавать управление, если данных нет в кэше; ``insert()`` может передавать" +#~ " управление, пока ожидает доступную память; и при коммите будет неявная " +#~ "передача управления." + +#~ msgid "" +#~ "The sequence ``begin() insert() insert() commit()`` yields only at commit if" +#~ " the engine is memtx, and can yield up to 3 times if the engine is vinyl." +#~ msgstr "" +#~ "Последовательность ``begin() insert() insert() commit()`` передает " +#~ "управление только при коммите, если движок = memtx, и может передавать " +#~ "управление до 3 раз, если движок = vinyl." + +#~ msgid "**Example #2**" +#~ msgstr "**Пример №2**" + +#~ msgid "" +#~ "Assume that in the memtx space ‘tester’ there are tuples in which the third " +#~ "field represents a positive dollar amount. Let's start a transaction, " +#~ "withdraw from tuple#1, deposit in tuple#2, and end the transaction, making " +#~ "its effects permanent." +#~ msgstr "" +#~ "Предположим, что в спейсе ‘tester’ в memtx есть кортежи, в которых третье " +#~ "поле представляет собой положительную сумму в долларах. Начнем транзакцию, " +#~ "снимем со счета из кортежа №1, пополним счет в кортеж №2 и закончим " +#~ "транзакцию, подтвердив изменения." + +#~ msgid "" +#~ "tarantool> function txn_example(from, to, amount_of_money)\n" +#~ " > box.begin()\n" +#~ " > box.space.tester:update(from, {{'-', 3, amount_of_money}})\n" +#~ " > box.space.tester:update(to, {{'+', 3, amount_of_money}})\n" +#~ " > box.commit()\n" +#~ " > return \"ok\"\n" +#~ " > end\n" +#~ "---\n" +#~ "...\n" +#~ "tarantool> txn_example({999}, {1000}, 1.00)\n" +#~ "---\n" +#~ "- \"ok\"\n" +#~ "..." +#~ msgstr "" +#~ "tarantool> function txn_example(from, to, amount_of_money)\n" +#~ " > box.begin()\n" +#~ " > box.space.tester:update(from, {{'-', 3, amount_of_money}})\n" +#~ " > box.space.tester:update(to, {{'+', 3, amount_of_money}})\n" +#~ " > box.commit()\n" +#~ " > return \"ok\"\n" +#~ " > end\n" +#~ "---\n" +#~ "...\n" +#~ "tarantool> txn_example({999}, {1000}, 1.00)\n" +#~ "---\n" +#~ "- \"ok\"\n" +#~ "..." + +#~ msgid "" +#~ "If :ref:`wal_mode ` = ‘none’, then " +#~ "implicit yielding at commit time does not take place, because there are no " +#~ "writes to the WAL." +#~ msgstr "" +#~ "Если :ref:`wal_mode ` = ‘none’, то " +#~ "при коммите управление не передается неявно, потому что не идет запись в " +#~ "WAL-файл." + +#~ msgid "" +#~ "If a task is interactive -- sending requests to the server and receiving " +#~ "responses -- then it involves network I/O, and therefore there is an " +#~ "implicit yield, even if the request that is sent to the server is not itself" +#~ " an implicit yield request. Therefore, the following sequence" +#~ msgstr "" +#~ "Если задача интерактивная — отправка запросов к серверу и получение ответов " +#~ "— то она подразумевает сетевой ввод-вывод и неявную передачу управления, " +#~ "даже если запрос, который отправляется на сервер, сам по себе не будет " +#~ "запросом на неявную передачу управления. Поэтому такая последовательность" + +#~ msgid "" +#~ "conn.space.test:select{1}\n" +#~ "conn.space.test:select{2}\n" +#~ "conn.space.test:select{3}" +#~ msgstr "" +#~ "conn.space.test:select{1}\n" +#~ "conn.space.test:select{2}\n" +#~ "conn.space.test:select{3}" + +#~ msgid "" +#~ "causes yields three times sequentially when sending requests to the network " +#~ "and awaiting the results. On the server side, the same requests are executed" +#~ " in common order possibly mixing with other requests from the network and " +#~ "local fibers. Something similar happens when using clients that operate via " +#~ "telnet, via one of the connectors, or via the :ref:`MySQL and PostgreSQL " +#~ "rocks `, or via the interactive mode when :ref:`using " +#~ "Tarantool as a client `." +#~ msgstr "" +#~ "вызывает передачу управления три раза при отправке запросов в сеть и " +#~ "ожидании результатов. На стороне сервера те же самые запросы выполняются в " +#~ "общем порядке, возможно, смешиваясь с другими запросами из сети и локальных " +#~ "файберов. Что-то подобное происходит, если использовать клиент, который " +#~ "работает через telnet, с помощью одного из коннекторов или сторонних модулей" +#~ " :ref:`MySQL и PostgreSQL ` или в интерактивном режиме, когда " +#~ ":ref:`Tarantool используется в качестве клиента `." + +#~ msgid "" +#~ "After a fiber has yielded and then has regained control, it immediately " +#~ "issues :ref:`testcancel `." +#~ msgstr "" +#~ "После того, как файбер передал управление, а затем вернул его, он " +#~ "незамедлительно вызывает :ref:`testcancel `." + +#~ msgid "Transactional manager" +#~ msgstr "Менеджер транзакций" + +#~ msgid "" +#~ "Since version :doc:`2.6.1 `, Tarantool has another option " +#~ "for transaction behavior that allows yielding inside a memtx transaction. " +#~ "This is controled by the *transactional manager*." +#~ msgstr "" +#~ "В версии :doc:`2.6.1 ` в Tarantool появился еще один вариант" +#~ " поведения транзакции, который позволяет передать управление в пределах " +#~ "memtx-транзакции. Этим занимается *менеджер транзакций*." + +#~ msgid "" +#~ "The transactional manager is designed for isolation of concurrent " +#~ "transactions and provides *serializable* `transaction isolation level " +#~ "`_." +#~ " It consists of two parts:" +#~ msgstr "" +#~ "Менеджер транзакций изолирует параллельные транзакции, обеспечивая их " +#~ "упорядочиваемость (`уровень изоляции транзакций " +#~ "`_" +#~ " — *serializable*). Менеджер транзакций состоит из двух частей:" + +#~ msgid "*MVCC engine*" +#~ msgstr "*MVCC-менеджер*" + +#~ msgid "*conflict manager*." +#~ msgstr "*менеджер конфликтов*" + +#~ msgid "" +#~ "The MVCC engine provides personal read views for transactions if necessary. " +#~ "The conflict manager tracks transactions' changes and determines their " +#~ "correctness in serialization order. Of course, once yielded, a transaction " +#~ "could interfere with other transactions and could be aborted due to " +#~ "conflict." +#~ msgstr "" +#~ "MVCC-менеджер обеспечивает многоверсионность данных для управления " +#~ "параллельными транзакциями — при необходимости создает для транзакции ее " +#~ "видение состояния базы данных (read view). Менеджер конфликтов отслеживает, " +#~ "какие данные изменила транзакция, и определяет правильность изменений в " +#~ "порядке сериализации. Конечно, если после передачи управления одна " +#~ "транзакция конфликтует с другими, ее можно прервать." + +#~ msgid "" +#~ "Another important thing to mention is that the transaction manager provides " +#~ "non-classic snapshot isolation level. It means that a transaction can get a " +#~ "consistent snapshot of the database (that is common) but this snapshot is " +#~ "not necessarily bound to the moment of the beginning of the transaction " +#~ "(that is not common). The conflict manager makes decisions on whether and " +#~ "when each transaction gets which snapshot. That allows to avoid some " +#~ "conflicts comparing with classical snapshot isolation approach." +#~ msgstr "" +#~ "Еще стоит отметить, что менеджер транзакций обеспечивает нестандартный " +#~ "уровень изоляции с помощью снимков. Это означает, что транзакция может " +#~ "видеть снимок состояния базы данных (в этом нет ничего необычного), но этот " +#~ "снимок не обязательно привязан к моменту начала транзакции (вот это уже " +#~ "необычно). Менеджер конфликтов принимает решение о том, видит ли транзакция " +#~ "снимок, какой именно и когда. Это позволяет избежать некоторых конфликтов в " +#~ "сравнении с классическим подходом к изоляции с помощью снимков." + +#~ msgid "" +#~ "The transactional manager can be switched on and off by the ``box.cfg`` " +#~ "option :ref:`memtx_use_mvcc_engine `." +#~ msgstr "" +#~ "Менеджер транзакций можно включать и отключать с помощью параметра " +#~ ":ref:`memtx_use_mvcc_engine ` в " +#~ "``box.cfg``." diff --git a/locale/ru/LC_MESSAGES/concepts/atomic/thread_model.po b/locale/ru/LC_MESSAGES/concepts/atomic/thread_model.po new file mode 100644 index 0000000000..ebecc2d1ee --- /dev/null +++ b/locale/ru/LC_MESSAGES/concepts/atomic/thread_model.po @@ -0,0 +1,105 @@ + +msgid "Thread model" +msgstr "" + +msgid "Main threads" +msgstr "" + +msgid "" +"The thread model assumes that a :ref:`query ` received" +" by Tarantool via network is processed with three operating system " +"**threads**:" +msgstr "" + +msgid "" +"The **network thread** (or :ref:`threads `) " +"on the server side receives the query, parses the statement, checks if it is" +" correct, and then transforms it into a special structure -- a message " +"containing an executable statement and its options." +msgstr "" + +msgid "" +"The network thread sends this message to the instance's **transaction " +"processor thread** (*TX thread*) via a lock-free message bus. Lua programs " +"are executed directly in the transaction processor thread, and do not need " +"to be parsed and prepared." +msgstr "" + +msgid "" +"The TX thread either uses a space index to find and update the tuple, or " +"executes a stored function that performs a data operation." +msgstr "" + +msgid "" +"The execution of the operation results in a message to the :ref:`write-ahead" +" logging (WAL) ` thread used to commit the transaction and " +"the fiber executing the transaction is suspended. When the transaction " +"results in a COMMIT or ROLLBACK, the following actions are taken:" +msgstr "" + +msgid "The WAL thread responds with a message to the TX thread." +msgstr "" + +msgid "" +"The fiber executing the transaction is resumed to process the result of the " +"transaction." +msgstr "" + +msgid "" +"The result of the fiber execution is passed to the network thread, and the " +"network thread returns the result to the client." +msgstr "" + +msgid "" +"There is only one TX thread in Tarantool. Some users are used to the idea " +"that there can be multiple threads working on the database. For example, " +"thread #1 reads a row #x while thread #2 writes a row #y. With Tarantool " +"this does not happen. Only the TX thread can access the database, and there " +"is only one TX thread for each Tarantool instance." +msgstr "" + +msgid "" +"The TX thread can handle many :ref:`fibers ` -- a set of " +"computer instructions that can contain \"**yield**\" signals. The TX thread " +"executes all computer instructions up to a yield signal, and then switches " +"to execute the instructions of another fiber." +msgstr "" + +msgid "" +":ref:`Yields ` must happen, otherwise the TX thread would be " +"permanently stuck on the same fiber." +msgstr "" + +msgid "Supplementary threads" +msgstr "" + +msgid "" +"There are also several supplementary threads that serve additional " +"capabilities:" +msgstr "" + +msgid "" +"For :ref:`replication `, Tarantool creates a " +"separate thread for each connected replica. This thread reads a write-ahead " +"log and sends it to the replica, following its position in the log. Separate" +" threads are required because each replica can point to a different position" +" in the log and can run at different speeds." +msgstr "" + +msgid "" +"There is a thread pool for ad hoc asynchronous tasks, such as a DNS resolver" +" or :ref:`fsync `." +msgstr "" + +msgid "" +"There are OpenMP threads used to parallelize sorting (hence, to parallelize " +"building :ref:`indexes `). For example, this is" +" applicable when Tarantool is restoring from a :ref:`snapshot ` with a large amount of data and needs to sort a secondary index " +"if it is ordered by something other than the primary order." +msgstr "" + +msgid "" +"The maximum number of OpenMP threads can be controlled by the " +"``OMP_NUM_THREADS`` environment variable." +msgstr "" diff --git a/locale/ru/LC_MESSAGES/concepts/atomic/transaction_model.po b/locale/ru/LC_MESSAGES/concepts/atomic/transaction_model.po new file mode 100644 index 0000000000..f63d9885fa --- /dev/null +++ b/locale/ru/LC_MESSAGES/concepts/atomic/transaction_model.po @@ -0,0 +1,196 @@ + +msgid "Transaction model" +msgstr "" + +msgid "Overview" +msgstr "" + +msgid "" +"The transaction model of Tarantool corresponds to the properties ACID " +"(atomicity, consistency, isolation, durability)." +msgstr "" + +msgid "Tarantool has two modes of transaction behavior:" +msgstr "" + +msgid "" +":ref:`Default ` -- suitable for fast monopolistic atomic " +"transactions" +msgstr "" + +msgid "" +":ref:`MVCC ` -- designed for long-running " +"concurrent transactions" +msgstr "" + +msgid "" +"Each transaction in Tarantool is executed in a single fiber on a single " +"thread, sees a consistent database state and commits all changes atomically." +msgstr "" + +msgid "" +"All transaction changes are written to the WAL (:ref:`Write Ahead Log " +"`) in a single batch in a specific order at the time of the " +":doc:`commit `. If " +"needed, transaction changes can also be rolled back -- :doc:`completely " +"` or to a specified " +":doc:`savepoint " +"`." +msgstr "" + +msgid "" +"Therefore, every transaction in Tarantool has the highest `transaction " +"isolation level " +"`_" +" -- *serializable*." +msgstr "" + +msgid "Isolation level" +msgstr "" + +msgid "" +"By :ref:`default `, the isolation level of Tarantool is " +"*serializable*. The exception is a failure during writing to the WAL, which " +"can occur, for example, when the disk space is over. In this case, the " +"isolation level of the concurrent read transaction would be ``read-" +"committed``." +msgstr "" + +msgid "" +"The :ref:`MVСС mode ` provides several options" +" that enable you to tune the visibility behavior during transaction " +"execution." +msgstr "" + +msgid "Read-committed" +msgstr "" + +msgid "" +"The ``read-committed`` isolation level makes visible all transactions that " +"started commit (:ref:`box.commit() ` was called)." +msgstr "" + +msgid "*Write transactions with reads*" +msgstr "" + +msgid "" +"Manual usage of ``read-committed`` for write transactions with reads is " +"completely safe, as this transaction will eventually result in a commit. If " +"a previous transactions fails, this transaction will inevitably fail as well" +" due to the *serializable* isolation level." +msgstr "" + +msgid "*Read transactions*" +msgstr "" + +msgid "" +"Manual usage of ``read-committed`` for read transactions may be unsafe, as " +"it may lead to phantom reads." +msgstr "" + +msgid "Read-confirmed" +msgstr "" + +msgid "" +"The ``read-confirmed`` isolation level makes visible all transactions that " +"finished the commit (:ref:`box.commit() ` was returned). This " +"means that new data is already on disk or even on other replicas." +msgstr "" + +msgid "" +"The use of ``read-confirmed`` is safe for read transactions given that data " +"is on disk (for asynchronous replication) or even in other replicas (for " +"synchronous replication)." +msgstr "" + +msgid "*Write transactions*" +msgstr "" + +msgid "" +"To achieve *serializable*, any write transaction should read all data that " +"has already been committed. Otherwise, it may conflict when it reaches its " +"commit." +msgstr "" + +msgid "Linearizable read" +msgstr "" + +msgid "" +"Linearizability of read operations implies that if a response for a write " +"request arrived earlier than a read request was made, this read request " +"should return the results of the write request. When called with " +"``linearizable``, :ref:`box.begin() ` yields until the instance " +"receives enough data from remote peers to be sure that the transaction is " +"linearizable." +msgstr "" + +msgid "" +"Linearizable transactions may only perform requests to the following memtx " +"space types:" +msgstr "" + +msgid ":ref:`synchronous `" +msgstr "" + +msgid "" +"local (:doc:`created ` " +"with ``is_local = true``)" +msgstr "" + +msgid "" +"temporary (:doc:`created `" +" with ``temporary = true``)" +msgstr "" + +msgid "" +"A linearizable transaction can fail with an error in the following cases:" +msgstr "" + +msgid "" +"If the node can't contact enough remote peers to determine which data is " +"committed." +msgstr "" + +msgid "" +"If the data isn't received during the ``timeout`` specified in " +"``box.begin()``." +msgstr "" + +msgid "" +"To start a linearizable transaction, the node should be the replication " +"source for at least ``N - Q + 1`` remote replicas. Here ``N`` is the count " +"of registered nodes in the cluster and ``Q`` is " +":ref:`replication_synchro_quorum `. So, for example, you can't perform a " +"linearizable transaction on anonymous replicas because they can't be the " +"source of replication for other nodes." +msgstr "" + +msgid "Best-effort (default)" +msgstr "" + +msgid "" +"To minimize the possibility of conflicts, MVCC uses what is called ``best-" +"effort`` visibility:" +msgstr "" + +msgid "" +"for write transactions, MVCC chooses :ref:`read-committed " +"`" +msgstr "" + +msgid "" +"for read transactions, MVCC chooses :ref:`read-confirmed " +"`" +msgstr "" + +msgid "" +"This inevitably leads to the *serializable* isolation level. Since there is " +"no option for MVCC to analyze the whole transaction to make a decision, it " +"makes the choice on the first operation." +msgstr "" + +msgid "" +"If the *serializable* isolation level becomes unreachable, the transaction " +"is marked as \"conflicted\" and rolled back." +msgstr "" diff --git a/locale/ru/LC_MESSAGES/concepts/atomic/txn_mode_default.po b/locale/ru/LC_MESSAGES/concepts/atomic/txn_mode_default.po new file mode 100644 index 0000000000..f5bbfa4b56 --- /dev/null +++ b/locale/ru/LC_MESSAGES/concepts/atomic/txn_mode_default.po @@ -0,0 +1,35 @@ + +msgid "Transaction mode: default" +msgstr "" + +msgid "" +"By default, Tarantool does not allow :ref:`\"yielding\" ` inside" +" a :ref:`memtx ` transaction and the :ref:`transaction " +"manager ` is disabled. This allows fast atomic " +"transactions without conflicts, but brings some limitations:" +msgstr "" + +msgid "" +"You cannot use :ref:`interactive transactions " +"`." +msgstr "" + +msgid "Any fiber yield leads to the abort of a transaction." +msgstr "" + +msgid "" +"All changes are made immediately, but in the event of a yield or error, the " +"transaction is rolled back, including the return of the previous data." +msgstr "" + +msgid "" +"To learn how to enable yielding inside a :ref:`memtx ` " +"transaction, see :ref:`Transaction mode: MVCC `." +msgstr "" + +msgid "To switch back to the default mode, disable the transaction manager:" +msgstr "" + +msgid "box.cfg { memtx_use_mvcc_engine = false }" +msgstr "" diff --git a/locale/ru/LC_MESSAGES/concepts/atomic/txn_mode_mvcc.po b/locale/ru/LC_MESSAGES/concepts/atomic/txn_mode_mvcc.po new file mode 100644 index 0000000000..0e29cb5434 --- /dev/null +++ b/locale/ru/LC_MESSAGES/concepts/atomic/txn_mode_mvcc.po @@ -0,0 +1,349 @@ + +msgid "Transaction mode: MVCC" +msgstr "" + +msgid "" +"Since version :doc:`2.6.1 `, Tarantool has another " +"transaction behavior mode that allows :ref:`\"yielding\" ` " +"inside a :ref:`memtx ` transaction. This is controlled by " +"the *transaction manager*." +msgstr "" + +msgid "" +"This mode allows concurrent transactions but may cause conflicts. You can " +"use this mode on the :ref:`memtx ` storage engine. The " +":ref:`vinyl ` storage engine also supports MVCC mode, but " +"has a different implementation." +msgstr "" + +msgid "" +"Currently, you cannot use several different storage engines within one " +"transaction." +msgstr "" + +msgid "Transaction manager" +msgstr "" + +msgid "" +"The transaction manager is designed to isolate concurrent transactions and " +"provides a *serializable* `transaction isolation level " +"`_." +" It consists of two parts:" +msgstr "" + +msgid "" +"*MVCC* -- multi version concurrency control engine, which stores all change " +"actions of all transactions. It also creates the transaction view of the " +"database state and a read view (a fixed state of the database that is never " +"changed by other transactions) when necessary." +msgstr "" + +msgid "" +"*Conflict manager* -- a manager that tracks changes to transactions and " +"determines their correctness in the serialization order. The conflict " +"manager declares transactions to be in conflict or sends transactions to " +"read views when necessary." +msgstr "" + +msgid "" +"Since version :doc:`2.10.1 `, the conflict manager detects " +"conflicts right after the first one of several conflicting transactions is " +"committed. After this moment, any CRUD operations in the conflicted " +"transaction will result in errors until the transaction is rolled back." +msgstr "" + +msgid "" +"The transaction manager also provides a non-classical *snapshot* isolation " +"level -- this snapshot is not necessarily tied to the start time of the " +"transaction, like the classical snapshot where a transaction can get a " +"consistent snapshot of the database. The conflict manager decides if and " +"when each transaction gets which snapshot. This avoids some conflicts " +"compared to the classic snapshot isolation approach." +msgstr "" + +msgid "" +"Currently, the :ref:`isolation level ` of BITSET " +"and RTREE indexes in MVCC transaction mode is *read-committed* (not " +"*serializable*, as stated). If a transaction uses these indexes, it can read" +" committed or confirmed data (depending on the isolation level). However, " +"the indexes are subject to different anomalies that can make them " +"unserializable." +msgstr "" + +msgid "Enabling the transaction manager" +msgstr "" + +msgid "" +"By default, the transaction manager is disabled. Use the " +":ref:`memtx_use_mvcc_engine ` option to " +"enable it via ``box.cfg``." +msgstr "" + +msgid "box.cfg{memtx_use_mvcc_engine = true}" +msgstr "" + +msgid "Setting the transaction isolation level" +msgstr "" + +msgid "" +"The transaction manager has the following options for the :ref:`transaction " +"isolation level `:" +msgstr "" + +msgid "``best-effort`` (default)" +msgstr "" + +msgid "``read-committed``" +msgstr "" + +msgid "``read-confirmed``" +msgstr "" + +msgid "``linearizable`` (only for a specific transaction)" +msgstr "" + +msgid "" +"Using ``best-effort`` as the default option allows MVCC to consider the " +"actions of transactions independently and determine the best :ref:`isolation" +" level ` for them. It increases the probability of" +" successful completion of the transaction and helps to avoid possible " +"conflicts." +msgstr "" + +msgid "" +"To set another default isolation level, for example, ``read-committed``, use" +" the following command:" +msgstr "" + +msgid "box.cfg { txn_isolation = 'read-committed' }" +msgstr "" + +msgid "" +"Note that the ``linearizable`` isolation level can't be set as default and " +"can be used for a specific transaction only. You can set an isolation level " +"for a specific transaction in its ``box.begin()`` call:" +msgstr "" + +msgid "box.begin({ tnx_isolation = 'best-effort' })" +msgstr "" + +msgid "" +"In this case, you can also use the ``default`` option. It sets the " +"transaction's isolation level to the one set in ``box.cfg``." +msgstr "" + +msgid "" +"For autocommit transactions (actions with a statement without explicit " +"``box.begin/box.commit`` calls) there is a rule:" +msgstr "" + +msgid "" +"Read-only transactions (for example, ``select``) are performed with ``read-" +"confirmed``." +msgstr "" + +msgid "" +"All other transactions (for example, ``replace``) are performed with ``read-" +"committed``." +msgstr "" + +msgid "" +"You can also set the isolation level in the net.box :ref:`stream:begin() " +"` method and :ref:`IPROTO_BEGIN ` " +"binary protocol request." +msgstr "" + +msgid "" +"Choosing the better option depends on whether you have conflicts or not. If " +"you have many conflicts, you should set a different option or use the " +":ref:`default transaction mode `." +msgstr "" + +msgid "Examples with MVCC enabled and disabled" +msgstr "" + +msgid "Create a file ``init.lua``, containing the following:" +msgstr "" + +msgid "" +"fiber = require 'fiber'\n" +"\n" +"box.cfg{ listen = '127.0.0.1:3301', memtx_use_mvcc_engine = false }\n" +"box.schema.user.grant('guest', 'super', nil, nil, {if_not_exists = true})\n" +"\n" +"tickets = box.schema.create_space('tickets', { if_not_exists = true })\n" +"tickets:format({\n" +" { name = \"id\", type = \"number\" },\n" +" { name = \"place\", type = \"number\" },\n" +"})\n" +"tickets:create_index('primary', {\n" +" parts = { 'id' },\n" +" if_not_exists = true\n" +"})" +msgstr "" + +msgid "" +"Connect to the instance using the :ref:`tt connect ` command:" +msgstr "" + +msgid "tt connect 127.0.0.1:3301" +msgstr "" + +msgid "Then try to execute the transaction with yield inside:" +msgstr "" + +msgid "" +"box.atomic(function() tickets:replace{1, 429} fiber.yield() " +"tickets:replace{2, 429} end)" +msgstr "" + +msgid "You will receive an error message:" +msgstr "" + +msgid "" +"---\n" +"- error: Transaction has been aborted by a fiber yield\n" +"..." +msgstr "" + +msgid "" +"Also, if you leave a transaction open while returning from a request, you " +"will get an error message:" +msgstr "" + +msgid "" +"127.0.0.1:3301> box.begin()\n" +" ⨯ Failed to execute command: Transaction is active at return from function" +msgstr "" + +msgid "" +"Change ``memtx_use_mvcc_engine`` to ``true``, restart Tarantool, and try " +"again:" +msgstr "" + +msgid "" +"127.0.0.1:3301> box.atomic(function() tickets:replace{1, 429} fiber.yield() tickets:replace{2, 429} end)\n" +"---\n" +"..." +msgstr "" + +msgid "Now check if this transaction was successful:" +msgstr "" + +msgid "" +"127.0.0.1:3301> box.space.tickets:select({}, {limit = 10})\n" +"---\n" +"- - [1, 429]\n" +" - [2, 429]\n" +"..." +msgstr "" + +msgid "Streams and interactive transactions" +msgstr "" + +msgid "" +"Since :tarantool-release:`2.10.0`, IPROTO implements streams and interactive" +" transactions that can be used when :ref:`memtx_use_mvcc_engine ` is enabled on the server." +msgstr "" + +msgid "Stream" +msgstr "" + +msgid "" +"A *stream* supports multiplexing several transactions over one connection. " +"Each stream has its own identifier, which is unique within the connection. " +"All requests with the same non-zero stream ID belong to the same stream. All" +" requests in a stream are executed strictly sequentially. This allows the " +"implementation of :ref:`interactive transactions " +"`. If the stream ID of a request is ``0``," +" it does not belong to any stream and is processed in the old way." +msgstr "" + +msgid "" +"In :doc:`net.box `, a stream is an object " +"above the connection that has the same methods but allows sequential " +"execution of requests. The ID is automatically generated on the client side." +" If a user writes their own connector and wants to use streams, they must " +"transmit the ``stream_id`` over the :ref:`IPROTO protocol `." +msgstr "" + +msgid "" +"Unlike a thread, which involves multitasking and execution within a program," +" a stream transfers data via the protocol between a client and a server." +msgstr "" + +msgid "Interactive transaction" +msgstr "" + +msgid "" +"An *interactive transaction* is one that does not need to be sent in a " +"single request. There are multiple ways to begin, commit, and roll back a " +"transaction, and they can be mixed. You can use :ref:`stream:begin() " +"`, :ref:`stream:commit() `, " +":ref:`stream:rollback() ` or the appropriate stream" +" methods -- ``call``, ``eval``, or ``execute`` -- using the SQL transaction " +"syntax." +msgstr "" + +msgid "Let’s create a Lua client (``client.lua``) and run it with Tarantool:" +msgstr "" + +msgid "" +"local net_box = require 'net.box'\n" +"local conn = net_box.connect('127.0.0.1:3301')\n" +"local conn_tickets = conn.space.tickets\n" +"local yaml = require 'yaml'\n" +"\n" +"local stream = conn:new_stream()\n" +"local stream_tickets = stream.space.tickets\n" +"\n" +"-- Begin transaction over an iproto stream:\n" +"stream:begin()\n" +"print(\"Replaced in a stream\\n\".. yaml.encode( stream_tickets:replace({1, 768}) ))\n" +"\n" +"-- Empty select, the transaction was not committed.\n" +"-- You can't see it from the requests that do not belong to the\n" +"-- transaction.\n" +"print(\"Selected from outside of transaction\\n\".. yaml.encode(conn_tickets:select({}, {limit = 10}) ))\n" +"\n" +"-- Select returns the previously inserted tuple\n" +"-- because this select belongs to the transaction:\n" +"print(\"Selected from within transaction\\n\".. yaml.encode(stream_tickets:select({}, {limit = 10}) ))\n" +"\n" +"-- Commit transaction:\n" +"stream:commit()\n" +"\n" +"-- Now this select also returns the tuple because the transaction has been committed:\n" +"print(\"Selected again from outside of transaction\\n\".. yaml.encode(conn_tickets:select({}, {limit = 10}) ))\n" +"\n" +"os.exit()" +msgstr "" + +msgid "Then call it and see the following output:" +msgstr "" + +msgid "" +"Replaced in a stream\n" +"--- [1, 768]\n" +"...\n" +"\n" +"Selected from outside of transaction\n" +"---\n" +"- [1, 429]\n" +"- [2, 429]\n" +"...\n" +"\n" +"Selected from within transaction\n" +"---\n" +"- [1, 768]\n" +"- [2, 429]\n" +"...\n" +"\n" +"Selected again from outside of transaction\n" +"---\n" +"- [1, 768]\n" +"- [2, 429]\n" +"...```" +msgstr "" diff --git a/locale/ru/LC_MESSAGES/concepts/configuration.po b/locale/ru/LC_MESSAGES/concepts/configuration.po new file mode 100644 index 0000000000..641071992f --- /dev/null +++ b/locale/ru/LC_MESSAGES/concepts/configuration.po @@ -0,0 +1,721 @@ + +msgid "Configuration" +msgstr "" + +msgid "" +"Tarantool provides the ability to configure the full topology of a cluster " +"and set parameters specific for concrete instances, such as connection " +"settings, memory used to store data, logging, and snapshot settings. Each " +"instance uses this configuration during :ref:`startup " +"` to organize the cluster." +msgstr "" + +msgid "There are two approaches to configuring Tarantool:" +msgstr "" + +msgid "*Since version 3.0*: In the YAML format." +msgstr "" + +msgid "" +"YAML configuration allows you to provide the full cluster topology and " +"specify all configuration options. You can use local configuration in a YAML" +" file for each instance or store configuration data in one reliable place " +"using :ref:`etcd `." +msgstr "" + +msgid "" +"*In version 2.11 and earlier*: :ref:`In code ` using the" +" ``box.cfg`` API." +msgstr "" + +msgid "" +"In this case, configuration is provided in a Lua initialization script." +msgstr "" + +msgid "" +"Starting with the 3.0 version, configuring Tarantool in code is considered a" +" legacy approach." +msgstr "" + +msgid "Configuration overview" +msgstr "" + +msgid "" +"YAML configuration describes the full topology of a Tarantool cluster. A " +"cluster's topology includes the following elements, starting from the lower " +"level:" +msgstr "" + +msgid "" +"groups:\n" +" group001:\n" +" replicasets:\n" +" replicaset001:\n" +" instances:\n" +" instance001:\n" +" # ...\n" +" instance002:\n" +" # ..." +msgstr "" + +msgid "``instances``" +msgstr "" + +msgid "" +"An *instance* represents a single running Tarantool instance. It stores data" +" or might act as a router for handling CRUD requests in a :ref:`sharded " +"` cluster." +msgstr "" + +msgid "``replicasets``" +msgstr "" + +msgid "" +"A *replica set* is a pack of instances that operate on same data sets. " +":ref:`Replication ` provides redundancy and increases data " +"availability." +msgstr "" + +msgid "``groups``" +msgstr "" + +msgid "" +"A *group* provides the ability to organize replica sets. For example, in a " +"sharded cluster, one group can contain :ref:`storage ` instances and another group can contain :ref:`routers ` used to handle CRUD requests." +msgstr "" + +msgid "" +"You can flexibly configure a cluster's settings on different levels: from " +"global settings applied to all groups to parameters specific for concrete " +"instances." +msgstr "" + +msgid "Configuration in a file" +msgstr "" + +msgid "" +"This section provides an overview on how to configure Tarantool in a YAML " +"file." +msgstr "" + +msgid "Basic instance configuration" +msgstr "" + +msgid "" +"The example below shows a sample configuration of a single Tarantool " +"instance:" +msgstr "" + +msgid "" +"groups:\n" +" group001:\n" +" replicasets:\n" +" replicaset001:\n" +" instances:\n" +" instance001:\n" +" iproto:\n" +" listen: \"3301\"" +msgstr "" + +msgid "" +"The ``instances`` section includes only one instance named *instance001*. " +"The ``iproto.listen`` option sets a port used to listen for incoming " +"requests." +msgstr "" + +msgid "" +"The ``replicasets`` section contains one replica set named *replicaset001*." +msgstr "" + +msgid "The ``groups`` section contains one group named *group001*." +msgstr "" + +msgid "Configuration scopes" +msgstr "" + +msgid "" +"This section shows how to control a scope the specified configuration option" +" is applied to. Most of the configuration options can be applied to a " +"specific instance, replica set, group, or to all instances globally." +msgstr "" + +msgid "*Instance*" +msgstr "" + +msgid "" +"To apply specific configuration options to a concrete instance, specify such" +" options for this instance only. In the example below, ``iproto.listen`` is " +"applied to *instance001* only." +msgstr "" + +msgid "*Replica set*" +msgstr "" + +msgid "" +"In this example, ``iproto.listen`` is in effect for all instances in " +"*replicaset001*." +msgstr "" + +msgid "" +"groups:\n" +" group001:\n" +" replicasets:\n" +" replicaset001:\n" +" iproto:\n" +" listen: \"3301\"\n" +" instances:\n" +" instance001: {}" +msgstr "" + +msgid "*Group*" +msgstr "" + +msgid "" +"In this example, ``iproto.listen`` is in effect for all instances in " +"*group001*." +msgstr "" + +msgid "" +"groups:\n" +" group001:\n" +" iproto:\n" +" listen: \"3301\"\n" +" replicasets:\n" +" replicaset001:\n" +" instances:\n" +" instance001: {}" +msgstr "" + +msgid "*Global*" +msgstr "" + +msgid "" +"In this example, ``iproto.listen`` is applied to all instances of the " +"cluster." +msgstr "" + +msgid "" +"iproto:\n" +" listen: \"3301\"\n" +"\n" +"groups:\n" +" group001:\n" +" replicasets:\n" +" replicaset001:\n" +" instances:\n" +" instance001: {}" +msgstr "" + +msgid "" +"The :ref:`Configuration reference ` contains " +"information about scopes to which each configuration option can be applied." +msgstr "" + +msgid "Configuration scopes: Replica set example" +msgstr "" + +msgid "" +"The example below shows how specific configuration options work in different" +" configuration scopes for a replica set with a manual failover. You can " +"learn more about configuring replication from :ref:`Replication tutorials " +"`." +msgstr "" + +msgid "" +"credentials:\n" +" users:\n" +" replicator:\n" +" password: 'topsecret'\n" +" roles: [replication]\n" +"\n" +"iproto:\n" +" advertise:\n" +" peer: replicator@\n" +"\n" +"replication:\n" +" failover: manual\n" +"\n" +"groups:\n" +" group001:\n" +" replicasets:\n" +" replicaset001:\n" +" leader: instance001\n" +" instances:\n" +" instance001:\n" +" iproto:\n" +" listen: 127.0.0.1:3301\n" +" instance002:\n" +" iproto:\n" +" listen: 127.0.0.1:3302\n" +" instance003:\n" +" iproto:\n" +" listen: 127.0.0.1:3303\n" +"\n" +msgstr "" + +msgid "``credentials`` (*global*)" +msgstr "" + +msgid "" +"This section is used to create the *replicator* user and assign it the " +"specified role. These options are applied globally to all instances." +msgstr "" + +msgid "``iproto`` (*global*, *instance*)" +msgstr "" + +msgid "" +"The ``iproto`` section is specified on both global and instance levels. The " +"``iproto.advertise.peer`` option specifies a URI used by an instance to " +"connect to another instance as a replica. In the example above, the URI " +"includes a user name only. A host value is taken from ``iproto.listen`` that" +" is set on the instance level." +msgstr "" + +msgid "``replication``: (*global*)" +msgstr "" + +msgid "" +"The ``replication.failover`` global option sets a manual failover for all " +"replica sets." +msgstr "" + +msgid "``leader``: (*replica set*)" +msgstr "" + +msgid "" +"The ``.leader`` option sets a :ref:`master ` instance for *replicaset001*." +msgstr "" + +msgid "Loading an application" +msgstr "" + +msgid "" +"Using Tarantool as an application server, you can run your own Lua " +"applications. In the ``app`` section, you can load the application and " +"provide a custom application configuration in the ``cfg`` section." +msgstr "" + +msgid "" +"In the example below, the application is loaded from the ``myapp.lua`` file " +"placed next to the YAML configuration file:" +msgstr "" + +msgid "" +"app:\n" +" file: 'myapp.lua'\n" +" cfg:\n" +" greeting: 'Hello'\n" +"\n" +"groups:\n" +" group001:\n" +" replicasets:\n" +" replicaset001:\n" +" instances:\n" +" instance001:\n" +" iproto:\n" +" listen: \"3301\"" +msgstr "" + +msgid "" +"To get a value of the custom ``greeting`` property in the application code, " +"use the ``config:get()`` function provided by the :ref:`config ` module." +msgstr "" + +#, python-format +msgid "" +"-- myapp.lua --\n" +"local log = require('log').new(\"myapp\")\n" +"local config = require('config')\n" +"log.info(\"%s from app, %s!\", config:get('app.cfg.greeting'), box.info.name)\n" +msgstr "" + +msgid "" +"As a result of :ref:`starting ` the " +"*instance001*, a log should contain the following line:" +msgstr "" + +msgid "main/103/interactive/myapp I> Hello from app, instance001!" +msgstr "" + +msgid "" +"The ``app`` section can be placed in any :ref:`configuration scope " +"`. As an example use case, you can provide different " +"applications for storages and routers in a sharded cluster:" +msgstr "" + +msgid "" +"groups:\n" +" storages:\n" +" app:\n" +" module: storage\n" +" # ...\n" +" routers:\n" +" app:\n" +" module: router\n" +" # ..." +msgstr "" + +msgid "" +"Learn more about using Tarantool as the application server from " +":ref:`Developing applications with Tarantool `." +msgstr "" + +msgid "Predefined variables" +msgstr "" + +msgid "" +"In a configuration file, you can use the following predefined variables that" +" are replaced with actual values at runtime:" +msgstr "" + +msgid "``instance_name``" +msgstr "" + +msgid "``replicaset_name``" +msgstr "" + +msgid "``group_name``" +msgstr "" + +msgid "" +"To reference these variables in a configuration file, enclose them in double" +" curly braces with whitespaces. In the example below, ``{{ instance_name " +"}}`` is replaced with *instance001*." +msgstr "" + +msgid "" +"groups:\n" +" group001:\n" +" replicasets:\n" +" replicaset001:\n" +" instances:\n" +" instance001:\n" +" snapshot:\n" +" dir: ./var/{{ instance_name }}/snapshots\n" +" wal:\n" +" dir: ./var/{{ instance_name }}/wals" +msgstr "" + +msgid "" +"As a result, the :ref:`paths to snapshots and write-ahead logs " +"` differ for different instances." +msgstr "" + +msgid "Environment variables" +msgstr "" + +msgid "" +"For each configuration parameter, Tarantool provides two sets of predefined " +"environment variables:" +msgstr "" + +msgid "" +"``TT_``. These variables are used to substitute parameters" +" specified in a configuration file. This means that these variables have a " +"higher :ref:`priority ` than the options specified" +" in a configuration file." +msgstr "" + +msgid "" +"``TT__DEFAULT``. These variables are used to specify " +"default values for parameters missing in a configuration file. These " +"variables have a lower :ref:`priority ` than the " +"options specified in a configuration file." +msgstr "" + +msgid "" +"For example, ``TT_IPROTO_LISTEN`` and ``TT_IPROTO_LISTEN_DEFAULT`` " +"correspond to the ``iproto.listen`` option. ``TT_SNAPSHOT_DIR`` and " +"``TT_SNAPSHOT_DIR_DEFAULT`` correspond to the ``snapshot.dir`` option. To " +"see all the supported environment variables, execute the ``tarantool`` " +"command with the ``--help-env-list`` :ref:`option " +"`." +msgstr "" + +msgid "$ tarantool --help-env-list" +msgstr "" + +msgid "" +"Below are a few examples that show how to set environment variables of " +"different types, like *string*, *number*, *array*, or *map*:" +msgstr "" + +msgid "" +"String. In the example below, ``TT_IPROTO_LISTEN`` is used to specify a " +":ref:`listening host and port ` values:" +msgstr "" + +msgid "$ export TT_IPROTO_LISTEN='127.0.0.1:3311'" +msgstr "" + +msgid "" +"To specify several listening addresses, separate them by a comma without " +"space:" +msgstr "" + +msgid "$ export TT_IPROTO_LISTEN='127.0.0.1:3311,127.0.0.1:3312'" +msgstr "" + +msgid "" +"Number. In this example, ``TT_LOG_LEVEL`` is used to set a logging level to " +"3 (``CRITICAL``):" +msgstr "" + +msgid "$ export TT_LOG_LEVEL=3" +msgstr "" + +msgid "" +"Array. The examples below show how to set the ``TT_SHARDING_ROLES`` variable" +" that accepts an array value. Arrays can be passed in two ways: using a " +"*simple* ..." +msgstr "" + +msgid "$ export TT_SHARDING_ROLES=router,storage" +msgstr "" + +msgid "... or *JSON* format:" +msgstr "" + +msgid "$ export TT_SHARDING_ROLES='[\"router\", \"storage\"]'" +msgstr "" + +msgid "" +"The *simple* format is applicable only to arrays containing scalar values." +msgstr "" + +msgid "" +"Map. To assign map values to environment variables, you can also use " +"*simple* or *JSON* formats. In the example below, ``TT_LOG_MODULES`` sets " +"different logging levels for different modules using a *simple* format:" +msgstr "" + +msgid "$ export TT_LOG_MODULES=module1=info,module2=error" +msgstr "" + +msgid "" +"In the next example, ``TT_APP_CFG`` is used to specify the value of a custom" +" configuration property for a :ref:`loaded application " +"` using a *JSON* format:" +msgstr "" + +msgid "$ export TT_APP_CFG='{\"greeting\":\"Hi\"}'" +msgstr "" + +msgid "" +"The *simple* format is applicable only to maps containing scalar values." +msgstr "" + +msgid "" +"There are also special ``TT_INSTANCE_NAME`` and ``TT_CONFIG`` environment " +"variables that can be used to :ref:`start " +"` the specified Tarantool instance " +"with configuration from the given file." +msgstr "" + +msgid "Configuration in etcd" +msgstr "" + +msgid "Enterprise Edition" +msgstr "" + +msgid "" +"Storing configuration in etcd is supported by the `Enterprise Edition " +"`_ only." +msgstr "" + +msgid "" +"Tarantool enables you to store configuration data in one reliable place " +"using `etcd `_. To achieve this, you need to:" +msgstr "" + +msgid "" +"Provide a local YAML configuration with an etcd endpoint address and key " +"prefix in the ``config`` section:" +msgstr "" + +msgid "" +"config:\n" +" etcd:\n" +" endpoints:\n" +" - http://localhost:2379\n" +" prefix: /example" +msgstr "" + +msgid "Publish a cluster's configuration to an etcd server." +msgstr "" + +msgid "" +"Learn more from the following guide: :ref:`Storing configuration in etcd " +"`." +msgstr "" + +msgid "Configuration precedence" +msgstr "" + +msgid "" +"Tarantool configuration options are applied from multiple sources with the " +"following precedence, from highest to lowest:" +msgstr "" + +msgid "" +"`TT_*` :ref:`environment variables `." +msgstr "" + +msgid "Configuration from a :ref:`local YAML file `." +msgstr "" + +msgid "" +":ref:`Centralized configuration ` stored in " +"etcd." +msgstr "" + +msgid "" +"`TT_*_DEFAULT` :ref:`environment variables " +"`." +msgstr "" + +msgid "" +"If the same option is defined in two or more locations, the option with the " +"highest precedence is applied." +msgstr "" + +msgid "Configuration options overview" +msgstr "" + +msgid "" +"This section gives an overview of some useful configuration options. All the" +" available options are documented in the :ref:`Configuration reference " +"`." +msgstr "" + +msgid "Connection settings" +msgstr "" + +msgid "" +"To configure an address used to listen for incoming requests, use the " +"``iproto.listen`` option. Below are a few examples on how to do this:" +msgstr "" + +msgid "Set a listening port to ``3301``:" +msgstr "" + +msgid "" +"iproto:\n" +" listen: \"3301\"" +msgstr "" + +msgid "Set a listening address to ``127.0.0.1:3301``:" +msgstr "" + +msgid "" +"iproto:\n" +" listen: \"127.0.0.1:3301\"" +msgstr "" + +msgid "Configure several listening addresses:" +msgstr "" + +msgid "" +"iproto:\n" +" listen: \"127.0.0.1:3301,127.0.0.1:3303\"" +msgstr "" + +msgid "" +"Enables :ref:`traffic encryption ` for a " +"connection using corresponding URI parameters:" +msgstr "" + +msgid "" +"iproto:\n" +" listen: \"127.0.0.1:3301?transport=ssl&ssl_key_file=localhost.key&ssl_cert_file=localhost.crt&ssl_ca_file=ca.crt\"" +msgstr "" + +msgid "" +"Note that traffic encryption is supported by the `Enterprise Edition " +"`_ only." +msgstr "" + +msgid "Use a Unix domain socket:" +msgstr "" + +msgid "" +"iproto:\n" +" listen: \"unix/:./var/run/{{ instance_name }}/tarantool.iproto\"" +msgstr "" + +msgid "Access control" +msgstr "" + +msgid "" +"The ``credentials`` section allows you to create users and grant them the " +"specified privileges. In the example below, there are two users:" +msgstr "" + +msgid "" +"The *replicator* user is used for replication and has a corresponding role." +msgstr "" + +msgid "" +"The *storage* user has the ``super`` role and can perform any action on " +"Tarantool instances." +msgstr "" + +msgid "" +"credentials:\n" +" users:\n" +" replicator:\n" +" password: 'topsecret'\n" +" roles: [replication]\n" +" storage:\n" +" password: 'secret'\n" +" roles: [super]\n" +msgstr "" + +msgid "To learn more, see the :ref:`Access control ` section." +msgstr "" + +msgid "Memory" +msgstr "" + +msgid "" +"The ``memtx.memory`` option specifies how much :ref:`memory `" +" Tarantool allocates to actually store data." +msgstr "" + +msgid "" +"memtx:\n" +" memory: 100000000" +msgstr "" + +msgid "" +"When the limit is reached, ``INSERT`` or ``UPDATE`` requests fail with " +":ref:`ER_MEMORY_ISSUE `." +msgstr "" + +msgid "Snapshots and write-ahead logs" +msgstr "" + +msgid "" +"The ``snapshot.dir`` and ``wal.dir`` options can be used to configure " +"directories for storing snapshots and write-ahead logs. For example, you can" +" place snapshots and write-ahead logs on different hard drives for better " +"reliability." +msgstr "" + +msgid "" +"instance001:\n" +" snapshot:\n" +" dir: '/media/drive1/snapshots'\n" +" wal:\n" +" dir: '/media/drive2/wals'" +msgstr "" + +msgid "" +"To learn more about the persistence mechanism in Tarantool, see the " +":ref:`Persistence ` section." +msgstr "" diff --git a/locale/ru/LC_MESSAGES/concepts/configuration/configuration_code.po b/locale/ru/LC_MESSAGES/concepts/configuration/configuration_code.po new file mode 100644 index 0000000000..7a0605ce4e --- /dev/null +++ b/locale/ru/LC_MESSAGES/concepts/configuration/configuration_code.po @@ -0,0 +1,409 @@ + +msgid "Configuration in code" +msgstr "" + +msgid "" +"Starting with the 3.0 version, the recommended way of configuring Tarantool " +"is using a :ref:`configuration file `. Configuring " +"Tarantool in code is considered a legacy approach." +msgstr "" + +msgid "" +"This topic covers the specifics of configuring Tarantool in code using the " +"``box.cfg`` API. In this case, a configuration is stored in an " +":ref:`initialization file ` - a Lua script with the " +"specified configuration options. You can find all the available options in " +"the :ref:`Configuration reference `." +msgstr "" + +msgid "Initialization file" +msgstr "" + +msgid "" +"If the command to :ref:`start Tarantool " +"` includes an instance file, then" +" Tarantool begins by invoking the Lua program in the file, which may have " +"the name ``init.lua``. The Lua program may get further arguments from the " +"command line or may use operating-system functions, such as ``getenv()``. " +"The Lua program almost always begins by invoking ``box.cfg()``, if the " +"database server will be used or if ports need to be opened. For example, " +"suppose ``init.lua`` contains the lines" +msgstr "" + +msgid "" +"#!/usr/bin/env tarantool\n" +"box.cfg{\n" +" listen = os.getenv(\"LISTEN_URI\"),\n" +" memtx_memory = 33554432,\n" +" pid_file = \"tarantool.pid\",\n" +" wal_max_size = 2500\n" +"}\n" +"print('Starting ', arg[1])" +msgstr "" + +msgid "" +"and suppose the environment variable ``LISTEN_URI`` contains 3301, and " +"suppose the command line is ``tarantool init.lua ARG``. Then the screen " +"might look like this:" +msgstr "" + +msgid "" +"$ export LISTEN_URI=3301\n" +"$ tarantool init.lua ARG\n" +"... main/101/init.lua C> Tarantool 2.8.3-0-g01023dbc2\n" +"... main/101/init.lua C> log level 5\n" +"... main/101/init.lua I> mapping 33554432 bytes for memtx tuple arena...\n" +"... main/101/init.lua I> recovery start\n" +"... main/101/init.lua I> recovering from './00000000000000000000.snap'\n" +"... main/101/init.lua I> set 'listen' configuration option to \"3301\"\n" +"... main/102/leave_local_hot_standby I> ready to accept requests\n" +"Starting ARG\n" +"... main C> entering the event loop" +msgstr "" + +msgid "" +"If you wish to start an interactive session on the same terminal after " +"initialization is complete, you can pass the ``-i`` :ref:`command-line " +"option `." +msgstr "" + +msgid "Environment variables" +msgstr "" + +msgid "" +"Starting from version :doc:`2.8.1 `, you can specify " +"configuration parameters via special environment variables. The name of a " +"variable should have the following pattern: ``TT_``, where ```` " +"is the uppercase name of the corresponding :ref:`box.cfg parameter `." +msgstr "" + +msgid "For example:" +msgstr "" + +msgid "" +"``TT_LISTEN`` -- corresponds to the :ref:`box.cfg.listen `" +" option." +msgstr "" + +msgid "" +"``TT_MEMTX_DIR`` -- corresponds to the :ref:`box.cfg.memtx_dir ` option." +msgstr "" + +msgid "" +"In case of an array value, separate the array elements by a comma without " +"space:" +msgstr "" + +msgid "export TT_REPLICATION=\"localhost:3301,localhost:3302\"" +msgstr "" + +msgid "" +"If you need to pass :ref:`additional parameters for URI `, use the ``?`` and ``&`` delimiters:" +msgstr "" + +msgid "export TT_LISTEN=\"localhost:3301?param1=value1¶m2=value2\"" +msgstr "" + +msgid "" +"An empty variable (``TT_LISTEN=``) has the same effect as an unset one, " +"meaning that the corresponding configuration parameter won't be set when " +"calling ``box.cfg{}``." +msgstr "" + +msgid "Configuration parameters" +msgstr "" + +msgid "Configuration parameters have the form:" +msgstr "" + +msgid "" +":extsamp:`{**{box.cfg}**}{[{*{key = value}*} [, {*{key = value ...}*}]]}`" +msgstr "" + +msgid "" +"Configuration parameters can be set in a Lua :ref:`initialization file " +"`, which is specified on the Tarantool command line." +msgstr "" + +msgid "" +"Most configuration parameters are for allocating resources, opening ports, " +"and specifying database behavior. All parameters are optional. Most of the " +"parameters are dynamic, that is, they can be changed at runtime by calling " +"``box.cfg{}`` a second time. For example, the command below sets the " +":ref:`listen port ` to ``3301``." +msgstr "" + +msgid "" +"tarantool> box.cfg{ listen = 3301 }\n" +"2023-05-10 13:28:54.667 [31326] main/103/interactive I> tx_binary: stopped\n" +"2023-05-10 13:28:54.667 [31326] main/103/interactive I> tx_binary: bound to [::]:3301\n" +"2023-05-10 13:28:54.667 [31326] main/103/interactive/box.load_cfg I> set 'listen' configuration option to 3301\n" +"---\n" +"..." +msgstr "" + +msgid "" +"To see all the non-null parameters, execute ``box.cfg`` (no parentheses)." +msgstr "" + +msgid "" +"tarantool> box.cfg\n" +"---\n" +"- replication_skip_conflict: false\n" +" wal_queue_max_size: 16777216\n" +" feedback_host: https://feedback.tarantool.io\n" +" memtx_dir: .\n" +" memtx_min_tuple_size: 16\n" +" -- other parameters --\n" +"..." +msgstr "" + +msgid "" +"To see a particular parameter value, call a corresponding ``box.cfg`` " +"option. For example, ``box.cfg.listen`` shows the specified :ref:`listen " +"address `." +msgstr "" + +msgid "" +"tarantool> box.cfg.listen\n" +"---\n" +"- 3301\n" +"..." +msgstr "" + +msgid "Listen URI" +msgstr "" + +msgid "" +"Some configuration parameters and some functions depend on a URI (Universal " +"Resource Identifier). The URI string format is similar to the `generic " +"syntax for a URI schema " +"`_. It may contain (in " +"order):" +msgstr "" + +msgid "user name for login" +msgstr "" + +msgid "password" +msgstr "" + +msgid "host name or host IP address" +msgstr "" + +msgid "port number" +msgstr "" + +msgid "query parameters" +msgstr "" + +msgid "" +"Only a port number is always mandatory. A password is mandatory if a user " +"name is specified unless the user name is 'guest'." +msgstr "" + +msgid "" +"Formally, the URI syntax is ``[host:]port`` or " +"``[username:password@]host:port``. If a host is omitted, then \"0.0.0.0\" or" +" \"[::]\" is assumed, meaning respectively any IPv4 address or any IPv6 " +"address on the local machine. If ``username:password`` is omitted, then the " +"\"guest\" user is assumed. Some examples:" +msgstr "" + +msgid "URI fragment" +msgstr "" + +msgid "Example" +msgstr "" + +msgid "port" +msgstr "" + +msgid "3301" +msgstr "" + +msgid "host:port" +msgstr "" + +msgid "127.0.0.1:3301" +msgstr "" + +msgid "username:password@host:port" +msgstr "" + +msgid "notguest:sesame@mail.ru:3301" +msgstr "" + +msgid "" +"In code, the URI value can be passed as a number (if only a port is " +"specified) or a string:" +msgstr "" + +msgid "" +"box.cfg { listen = 3301 }\n" +"\n" +"box.cfg { listen = \"127.0.0.1:3301\" }" +msgstr "" + +msgid "" +"In certain circumstances, a Unix domain socket may be used where a URI is " +"expected, for example, ``unix/:/tmp/unix_domain_socket.sock`` or simply " +"``/tmp/unix_domain_socket.sock``." +msgstr "" + +msgid "" +"The :ref:`uri ` module provides functions that convert URI " +"strings into their components or turn components into URI strings." +msgstr "" + +msgid "Specifying several URIs" +msgstr "" + +msgid "" +"Starting from version 2.10.0, a user can open several listening iproto " +"sockets on a Tarantool instance and, consequently, can specify several URIs " +"in the configuration parameters such as :ref:`box.cfg.listen ` and :ref:`box.cfg.replication `." +msgstr "" + +msgid "URI values can be set in a number of ways:" +msgstr "" + +msgid "As a string with URI values separated by commas." +msgstr "" + +msgid "box.cfg { listen = \"127.0.0.1:3301, /unix.sock, 3302\" }" +msgstr "" + +msgid "As a table that contains URIs in the string format." +msgstr "" + +msgid "box.cfg { listen = {\"127.0.0.1:3301\", \"/unix.sock\", \"3302\"} }" +msgstr "" + +msgid "As an array of tables with the ``uri`` field." +msgstr "" + +msgid "" +"box.cfg { listen = {\n" +" {uri = \"127.0.0.1:3301\"},\n" +" {uri = \"/unix.sock\"},\n" +" {uri = 3302}\n" +" }\n" +"}" +msgstr "" + +msgid "" +"In a combined way -- an array that contains URIs in both the string and the " +"table formats." +msgstr "" + +msgid "" +"box.cfg { listen = {\n" +" \"127.0.0.1:3301\",\n" +" { uri = \"/unix.sock\" },\n" +" { uri = 3302 }\n" +" }\n" +"}" +msgstr "" + +msgid "" +"Also, starting from version 2.10.0, it is possible to specify additional " +"parameters for URIs. You can do this in different ways:" +msgstr "" + +msgid "Using the ``?`` delimiter when URIs are specified in a string format." +msgstr "" + +msgid "" +"box.cfg { listen = \"127.0.0.1:3301?p1=value1&p2=value2, " +"/unix.sock?p3=value3\" }" +msgstr "" + +msgid "" +"Using the ``params`` table: a URI is passed in a table with additional " +"parameters in the \"params\" table. Parameters in the \"params\" table " +"overwrite the ones from a URI string (\"value2\" overwrites \"value1\" for " +"``p1`` in the example below)." +msgstr "" + +msgid "" +"box.cfg { listen = {\n" +" \"127.0.0.1:3301?p1=value1\",\n" +" params = {p1 = \"value2\", p2 = \"value3\"}\n" +" }\n" +"}" +msgstr "" + +msgid "" +"Using the ``default_params`` table for specifying default parameter values." +msgstr "" + +msgid "" +"In the example below, two URIs are passed in a table. The default value for " +"the ``p3`` parameter is defined in the ``default_params`` table and used if " +"this parameter is not specified in URIs. Parameters in the " +"``default_params`` table are applicable to all the URIs passed in a table." +msgstr "" + +msgid "" +"box.cfg { listen = {\n" +" \"127.0.0.1:3301?p1=value1\",\n" +" { uri = \"/unix.sock\", params = { p2 = \"value2\" } },\n" +" default_params = { p3 = \"value3\" }\n" +" }\n" +"}" +msgstr "" + +msgid "" +"The recommended way for specifying URI with additional parameters is the " +"following:" +msgstr "" + +msgid "" +"box.cfg { listen = {\n" +" {uri = \"127.0.0.1:3301\", params = {p1 = \"value1\"}},\n" +" {uri = \"/unix.sock\", params = {p2 = \"value2\"}},\n" +" {uri = 3302, params = {p3 = \"value3\"}}\n" +" }\n" +"}" +msgstr "" + +msgid "In case of a single URI, the following syntax also works:" +msgstr "" + +msgid "" +"box.cfg { listen = {\n" +" uri = \"127.0.0.1:3301\",\n" +" params = { p1 = \"value1\", p2 = \"value2\" }\n" +" }\n" +"}" +msgstr "" + +msgid "Starting a Tarantool instance" +msgstr "" + +msgid "" +"Below is the syntax for starting a Tarantool instance configured in a Lua " +"initialization script:" +msgstr "" + +msgid "$ tarantool LUA_INITIALIZATION_FILE [OPTION ...]" +msgstr "" + +msgid "" +"The ``tarantool`` command also provides a set of :ref:`options " +"` that might be helpful for development " +"purposes." +msgstr "" + +msgid "" +"The command below starts a Tarantool instance configured in the ``init.lua``" +" file:" +msgstr "" + +msgid "$ tarantool init.lua" +msgstr "" diff --git a/locale/ru/LC_MESSAGES/concepts/configuration/configuration_etcd.po b/locale/ru/LC_MESSAGES/concepts/configuration/configuration_etcd.po new file mode 100644 index 0000000000..0987e10fea --- /dev/null +++ b/locale/ru/LC_MESSAGES/concepts/configuration/configuration_etcd.po @@ -0,0 +1,222 @@ + +msgid "Storing configuration in etcd" +msgstr "" + +msgid "Enterprise Edition" +msgstr "" + +msgid "" +"Storing configuration in etcd is supported by the `Enterprise Edition " +"`_ only." +msgstr "" + +msgid "" +"Tarantool enables you to store configuration data in one place using `etcd " +"`_. To achieve this, you need to define how to access etcd" +" and publish a cluster's :ref:`YAML configuration ` to " +"an etcd server." +msgstr "" + +msgid "Local etcd configuration" +msgstr "" + +msgid "" +"To store a cluster's configuration in etcd, you need to provide etcd " +"connection settings in a local configuration file. These settings are used " +"to :ref:`publish ` a cluster's configuration " +"and :ref:`show ` it." +msgstr "" + +msgid "" +"Connection options for etcd should be specified in the ``config.etcd`` " +"section of the configuration file. At least, the following options should be" +" specified:" +msgstr "" + +msgid "" +"config:\n" +" etcd:\n" +" endpoints:\n" +" - http://localhost:2379\n" +" prefix: /example" +msgstr "" + +msgid "" +":ref:`config.etcd.endpoints ` specifies the list of " +"etcd endpoints." +msgstr "" + +msgid "" +":ref:`config.etcd.prefix ` sets a key prefix used to " +"search a configuration. Tarantool searches keys by the following path: " +"``/config/*``. Note that ```` should start with a slash " +"(``/``)." +msgstr "" + +msgid "" +"You can also provide additional etcd connection options. In the example " +"below, the following options are configured in addition to an endpoint and " +"key prefix:" +msgstr "" + +msgid "" +"config:\n" +" etcd:\n" +" endpoints:\n" +" - http://localhost:2379\n" +" prefix: /example\n" +" username: testuser\n" +" password: foobar\n" +" ssl:\n" +" ca_file: ca.crt\n" +" http:\n" +" request:\n" +" timeout: 3" +msgstr "" + +msgid "" +":ref:`config.etcd.username ` and " +":ref:`config.etcd.password ` specify credentials used " +"for authentication." +msgstr "" + +msgid "" +":ref:`config.etcd.ssl.ca_file ` specifies a path to" +" a trusted certificate authorities (CA) file." +msgstr "" + +msgid "" +":ref:`config.etcd.http.request.timeout ` " +"configures a request timeout for an etcd server." +msgstr "" + +msgid "" +"You can find all the available configuration options in the :ref:`etcd " +"` section." +msgstr "" + +msgid "Publishing a cluster's configuration to etcd" +msgstr "" + +msgid "Publishing configuration using the tt utility" +msgstr "" + +msgid "" +"The tt utility provides the :ref:`tt cluster ` command for " +"managing a cluster's configuration. The ``tt cluster publish`` command can " +"be used to publish a cluster's configuration to etcd." +msgstr "" + +msgid "" +"The example below shows how a :ref:`layout ` of the application called ``app`` might look:" +msgstr "" + +msgid "" +"├── tt.yaml\n" +"└── instances.enabled\n" +" └── app\n" +" ├── config.yaml\n" +" ├── cluster.yaml\n" +" └── instances.yml" +msgstr "" + +msgid "" +"``config.yaml`` contains a :ref:`local configuration " +"` used to connect to etcd." +msgstr "" + +msgid "``cluster.yaml`` contains a cluster's configuration to be published." +msgstr "" + +msgid "" +"``instances.yml`` specifies :ref:`instances ` to run in the current environment. ``tt cluster publish`` " +"ignores the configured instances." +msgstr "" + +msgid "" +"To publish a cluster's configuration (``cluster.yaml``) to an etcd server, " +"execute ``tt cluster publish`` as follows:" +msgstr "" + +msgid "" +"$ tt cluster publish \"http://localhost:2379/example\" " +"instances.enabled/app/cluster.yaml" +msgstr "" + +msgid "" +"You can see a cluster's configuration using the :ref:`tt cluster show ` command." +msgstr "" + +msgid "Publishing configuration using etcdctl" +msgstr "" + +msgid "" +"To publish a cluster's configuration using the ``etcdctl`` utility, use the " +"``put`` command:" +msgstr "" + +msgid "$ etcdctl put /example/config/all < cluster.yaml" +msgstr "" + +msgid "" +"For etcd versions earlier than 3.4, you need to set the ``ETCDCTL_API`` " +"environment variable to ``3``." +msgstr "" + +msgid "Starting Tarantool instances" +msgstr "" + +msgid "" +"The :ref:`tt ` utility is the recommended way to start Tarantool " +"instances. You can learn how to do this from the :ref:`Starting and stopping" +" instances ` section." +msgstr "" + +msgid "" +"You can also use the ``tarantool`` command to :ref:`start a Tarantool " +"instance `. In this case, you can " +"eliminate creating a :ref:`local etcd configuration " +"` and provide etcd connection settings using the " +"``TT_CONFIG_ETCD_ENDPOINTS`` and ``TT_CONFIG_ETCD_PREFIX`` :ref:`environment" +" variables `." +msgstr "" + +msgid "" +"$ export TT_CONFIG_ETCD_ENDPOINTS=http://localhost:2379\n" +"$ export TT_CONFIG_ETCD_PREFIX=/example\n" +"\n" +"$ tarantool --name instance001\n" +"$ tarantool --name instance002\n" +"$ tarantool --name instance003" +msgstr "" + +msgid "Reloading configuration" +msgstr "" + +msgid "" +"By default, Tarantool watches etcd keys with the :ref:`specified prefix " +"` for changes in a cluster's configuration and " +"reloads a changed configuration automatically. If necessary, you can set the" +" :ref:`config.reload ` option to " +"``manual`` to turn off configuration reloading:" +msgstr "" + +msgid "" +"config:\n" +" reload: 'manual'\n" +" etcd:\n" +" # ..." +msgstr "" + +msgid "" +"In this case, you can reload a configuration in an :ref:`admin console " +"` or :ref:`application code ` " +"using the ``reload()`` function provided by the :ref:`config ` module:" +msgstr "" + +msgid "require('config'):reload()" +msgstr "" diff --git a/locale/ru/LC_MESSAGES/concepts/configuration/configuration_migrating.po b/locale/ru/LC_MESSAGES/concepts/configuration/configuration_migrating.po new file mode 100644 index 0000000000..71df464b8e --- /dev/null +++ b/locale/ru/LC_MESSAGES/concepts/configuration/configuration_migrating.po @@ -0,0 +1,3 @@ + +msgid "Migrating to declarative configuration" +msgstr "" diff --git a/locale/ru/LC_MESSAGES/concepts/coop_multitasking.po b/locale/ru/LC_MESSAGES/concepts/coop_multitasking.po new file mode 100644 index 0000000000..31448d65b4 --- /dev/null +++ b/locale/ru/LC_MESSAGES/concepts/coop_multitasking.po @@ -0,0 +1,391 @@ + +msgid "Fibers, yields, and cooperative multitasking" +msgstr "" + +msgid "" +"Creating a fiber is the Tarantool way of making application logic work in " +"the background at all times. A **fiber** is a set of instructions that are " +"executed with :ref:`cooperative multitasking `: the instructions contain :ref:`yield ` signals, upon which control is passed to another fiber." +msgstr "" + +msgid "Fibers" +msgstr "" + +msgid "" +"Fibers are similar to threads of execution in computing. The key difference " +"is that threads use preemptive multitasking, while fibers use cooperative " +"multitasking (see :ref:`below `). This gives " +"fibers the following two advantages over threads:" +msgstr "" + +msgid "" +"Better controllability. Threads often depend on the kernel's thread " +"scheduler to preempt a busy thread and resume another thread, so preemption " +"may occur unpredictably. Fibers :ref:`yield ` themselves to run " +"another fiber while executing, so yields are controlled by application " +"logic." +msgstr "" + +msgid "" +"Higher performance. Threads require more resources to preempt as they need " +"to address the system kernel. Fibers are lighter and faster as they don't " +"need to address the kernel to yield." +msgstr "" + +msgid "" +"Yet fibers have some limitations as compared with threads, the main " +"limitation being no multi-core mode. All fibers in an application belong to " +"a single thread, so they all use the same CPU core as the parent thread. " +"Meanwhile, this limitation is not really serious for Tarantool applications," +" because a typical bottleneck for Tarantool is the HDD, not the CPU." +msgstr "" + +msgid "" +"A fiber has all the features of a Lua `coroutine " +"`_ and all programming concepts that" +" apply for Lua coroutines will apply for fibers as well. However, Tarantool " +"has made some enhancements for fibers and has used fibers internally. So, " +"although the use of coroutines is possible and supported, the use of fibers " +"is recommended." +msgstr "" + +msgid "" +"Any live fiber can be in one of three states: ``running``, ``suspended``, " +"and ``ready``. After a fiber dies, the ``dead`` status returns." +msgstr "" + +msgid "" +"To learn more about fibers, go to the :ref:`fiber ` module " +"documentation." +msgstr "" + +msgid "Yields" +msgstr "" + +msgid "" +"Yield is an action that occurs in a :ref:`cooperative ` environment that transfers control of the thread " +"from the current fiber to another fiber that is ready to execute." +msgstr "" + +msgid "" +"Any live fiber can be in one of three states: ``running``, ``suspended``, " +"and ``ready``. After a fiber dies, the ``dead`` status is returned. By " +"observing fibers from the outside, you can only see ``running`` (for the " +"current fiber) and ``suspended`` for any other fiber waiting for an event " +"from the event loop (``ev``) for execution." +msgstr "" + +msgid "" +"After a yield has occurred, the next ``ready`` fiber is taken from the queue" +" and executed. When there are no more ``ready`` fibers, execution is " +"transferred to the event loop." +msgstr "" + +msgid "" +"After a fiber has yielded and regained control, it immediately issues " +":ref:`testcancel `." +msgstr "" + +msgid "" +"Yields can be :ref:`explicit ` or :ref:`implicit `." +msgstr "" + +msgid "Explicit yields" +msgstr "" + +msgid "" +"**Explicit yields** are clearly visible from the invoking code. There are " +"only two explicit yields: :ref:`fiber.yield() ` and " +":ref:`fiber.sleep(t) `." +msgstr "" + +msgid "" +":ref:`fiber.yield() ` yields execution to another ``ready`` " +"fiber while putting itself in the ``ready`` state, meaning that it will be " +"executed again as soon as possible while being polite to other fibers " +"waiting for execution." +msgstr "" + +msgid "" +":ref:`fiber.sleep(t) ` yields execution to another ``ready`` " +"fiber and puts itself in the ``suspended`` state for time ``t`` until time " +"passes and the event loop wakes up this fiber to the ``ready`` state." +msgstr "" + +msgid "" +"In general, it is good behavior for long-running cpu-intensive tasks to " +"yield periodically to be :ref:`cooperative ` " +"to other waiting fibers." +msgstr "" + +msgid "Implicit yields" +msgstr "" + +msgid "" +"On the other hand, there are many operations, such as operations with " +"sockets, file system, and disk I/O, which imply some waiting for the current" +" fiber while others can be executed. When such an operation occurs, a " +"possible blocking operation would be passed into the event loop and the " +"fiber would be suspended until the resource is ready to continue fiber " +"execution." +msgstr "" + +msgid "Here is the list of implicitly yielding operations:" +msgstr "" + +msgid "Connection establishment (:ref:`socket `)." +msgstr "" + +msgid "Socket read and write (:ref:`socket `)." +msgstr "" + +msgid "Filesystem operations (from :ref:`fio `)." +msgstr "" + +msgid "Channel data transfer (:ref:`fiber.channel `)." +msgstr "" + +msgid "File input/output (from :ref:`fio `)." +msgstr "" + +msgid "Console operations (since console is a socket)." +msgstr "" + +msgid "HTTP requests (since HTTP is a socket operation)." +msgstr "" + +msgid "Database modifications (if they imply a disk write)." +msgstr "" + +msgid "Database reading for the :ref:`vinyl ` engine." +msgstr "" + +msgid "Invocation of another process (:ref:`popen `)." +msgstr "" + +msgid "" +"Please note that all operations of the ``os`` module are non-cooperative and" +" exclusively block the whole tx thread." +msgstr "" + +msgid "" +"For :ref:`memtx `, since all data is in memory, there is no" +" yielding for a read request (like ``:select``, ``:pairs``, ``:get``)." +msgstr "" + +msgid "" +"For :ref:`vinyl `, since some data may not be in memory, " +"there may be disk I/O for a read (to fetch data from disk) or write (because" +" a stall may occur while waiting for memory to be freed)." +msgstr "" + +msgid "" +"For both :ref:`memtx ` and :ref:`vinyl `, " +"since data change requests must be recorded in the :ref:`WAL `, there is normally a " +":doc:`/reference/reference_lua/box_txn_management/commit`." +msgstr "" + +msgid "" +"With the default ``autocommit`` mode the following operations are yielding:" +msgstr "" + +msgid ":ref:`space:alter `." +msgstr "" + +msgid ":ref:`space:drop `." +msgstr "" + +msgid ":ref:`space:create_index `." +msgstr "" + +msgid ":ref:`space:truncate `." +msgstr "" + +msgid ":ref:`space:insert `." +msgstr "" + +msgid ":ref:`space:replace `." +msgstr "" + +msgid ":ref:`space:update `." +msgstr "" + +msgid ":ref:`space:upserts `." +msgstr "" + +msgid ":ref:`space:delete `." +msgstr "" + +msgid ":ref:`index:update `." +msgstr "" + +msgid ":ref:`index:delete `." +msgstr "" + +msgid ":ref:`index:alter `." +msgstr "" + +msgid ":ref:`index:drop `." +msgstr "" + +msgid ":ref:`index:rename `." +msgstr "" + +msgid "" +":ref:`box.commit ` (*if there were some modifications within the" +" transaction*)." +msgstr "" + +msgid "" +"To provide atomicity for transactions in transaction mode, some changes are " +"applied to the modification operations for the :ref:`memtx ` engine. After executing :ref:`box.begin ` or within a " +":ref:`box.atomic ` call, any modification operation will not " +"yield, and yield will occur only on :ref:`box.commit ` or upon " +"return from :ref:`box.atomic `. Meanwhile, :ref:`box.rollback " +"` does not yield." +msgstr "" + +msgid "" +"That is why executing separate commands like ``select()``, ``insert()``, " +"``update()`` in the console inside a transaction without MVCC will cause it " +"to an abort. This is due to implicit yield after each chunk of code is " +"executed in the console." +msgstr "" + +msgid "Example #1" +msgstr "" + +msgid "Engine = memtx." +msgstr "" + +msgid "" +"space:get()\n" +"space:insert()" +msgstr "" + +msgid "" +"The sequence has one yield, at the end of the insert, caused by implicit " +"commit; ``get()`` has nothing to write to the :ref:`WAL ` and" +" so does not yield." +msgstr "" + +msgid "" +"box.begin()\n" +"space1:get()\n" +"space1:insert()\n" +"space2:get()\n" +"space2:insert()\n" +"box.commit()" +msgstr "" + +msgid "" +"The sequence has one yield, at the end of the ``box.commit``, none of the " +"inserts are yielding." +msgstr "" + +msgid "Engine = vinyl." +msgstr "" + +msgid "" +"The sequence has one to three yields, since ``get()`` may yield if the data " +"is not in the cache, ``insert()`` may yield if it waits for available " +"memory, and there is an implicit yield at commit." +msgstr "" + +msgid "The sequence may yield from 1 to 5 times." +msgstr "" + +msgid "Example #2" +msgstr "" + +msgid "" +"Assume that there are tuples in the :ref:`memtx ` space " +"``tester`` where the third field represents a positive dollar amount." +msgstr "" + +msgid "" +"Let's start a transaction, withdraw from tuple#1, deposit in tuple#2, and " +"end the transaction, making its effects permanent." +msgstr "" + +msgid "" +"tarantool> function txn_example(from, to, amount_of_money)\n" +" > box.atomic(function()\n" +" > box.space.tester:update(from, {{'-', 3, amount_of_money}})\n" +" > box.space.tester:update(to, {{'+', 3, amount_of_money}})\n" +" > end)\n" +" > return \"ok\"\n" +" > end\n" +"\n" +"Result:\n" +"---\n" +"...\n" +"tarantool> txn_example({999}, {1000}, 1.00)\n" +"---\n" +"- \"ok\"\n" +"..." +msgstr "" + +msgid "" +"If :ref:`wal_mode ` = ``none``, then " +"there is no implicit yielding at the commit time because there are no writes" +" to the :ref:`WAL `." +msgstr "" + +msgid "" +"If a request if performed via network connector such as :ref:`net.box " +"` and implies sending requests to the server and receiving " +"responses, then it involves network I/O and thus implicit yielding. Even if " +"the request that is sent to the server has no implicit yield. Therefore, the" +" following sequence causes yields three times sequentially when sending " +"requests to the network and awaiting the results." +msgstr "" + +msgid "" +"conn.space.test:get{1}\n" +"conn.space.test:get{2}\n" +"conn.space.test:get{3}" +msgstr "" + +msgid "Cooperative multitasking" +msgstr "" + +msgid "" +"Cooperative multitasking means that unless a running fiber deliberately " +":ref:`yields ` control, it is not preempted by some other fiber." +" But a running fiber will deliberately yield when it encounters a \"yield " +"point\": a transaction commit, an operating system call, or an explicit " +"\"yield\" request. Any system call which can block will be performed " +"asynchronously, and any running fiber which must wait for a system call will" +" be preempted, so that another ready-to-run fiber takes its place and " +"becomes the new running fiber." +msgstr "" + +msgid "" +"This model makes all programmatic locks unnecessary: cooperative " +"multitasking ensures that there will be no concurrency around a resource, no" +" race conditions, and no memory consistency issues. The way to achieve this " +"is simple: Use no yields, explicit or implicit in critical sections, and no " +"one can interfere with code execution." +msgstr "" + +msgid "" +"For small requests, such as simple UPDATE or INSERT or DELETE or SELECT, " +"fiber scheduling is fair: it takes little time to process the request, " +"schedule a disk write, and yield to a fiber serving the next client." +msgstr "" + +msgid "" +"However, a function may perform complex calculations or be written in such a" +" way that yields take a long time to occur. This can lead to unfair " +"scheduling when a single client throttles the rest of the system, or to " +"apparent stalls in processing requests. It is the responsibility of the " +"function author to avoid this situation. As a protective mechanism, a " +":ref:`fiber slice ` can be used." +msgstr "" diff --git a/locale/ru/LC_MESSAGES/concepts/data_model/index.po b/locale/ru/LC_MESSAGES/concepts/data_model/index.po index e5f625bae9..1b99066990 100644 --- a/locale/ru/LC_MESSAGES/concepts/data_model/index.po +++ b/locale/ru/LC_MESSAGES/concepts/data_model/index.po @@ -3,10 +3,49 @@ msgid "Data model" msgstr "Модель данных" msgid "" -"If you tried to create a database as suggested in our :ref:`basic " -"tutorial `, then your test database now looks" -" like this:" +"If you tried to create a database as suggested in our :ref:`basic tutorial " +"`, then your test database now looks like this:" msgstr "" "Если вы пробовали создать базу данных, как предлагается в упражнениях в " -":ref:`базовом практическом руководстве `, то ваша тестовая" -" база данных выглядит следующим образом:" +":ref:`базовом практическом руководстве `, то ваша " +"тестовая база данных выглядит следующим образом:" + +msgid "" +"Tarantool stores data in :ref:`spaces `, which can be " +"thought of as tables in a relational database. Every record or row in a " +"space is called a :ref:`tuple `. A tuple may have any " +"number of fields, and the fields may be of different :ref:`types `." +msgstr "" + +msgid "" +"String data in fields are compared based on the specified :ref:`collation " +"` rules. The user can provide hard limits for data values " +"through :ref:`constraints ` and link related spaces with " +":ref:`foreign keys `." +msgstr "" + +msgid "" +"Tarantool supports highly customizable :ref:`indexes ` of " +"various types. In particular, indexes can be defined with generators like " +":ref:`sequences `." +msgstr "" + +msgid "" +"There are six basic :ref:`data operations ` in " +"Tarantool: SELECT, INSERT, UPDATE, UPSERT, REPLACE, and DELETE. A number of " +":ref:`complexity factors ` affects the " +"resource usage of each function." +msgstr "" + +msgid "" +"Tarantool allows :ref:`describing the data schema ` but does not require it. The user can " +":ref:`migrate a schema ` without migrating the data." +msgstr "" + +msgid "" +"To ensure :ref:`data persistence ` and recover " +"quickly in case of failure, Tarantool uses mechanisms like the write-ahead " +"log (WAL) and snapshots." +msgstr "" diff --git a/locale/ru/LC_MESSAGES/concepts/data_model/indexes.po b/locale/ru/LC_MESSAGES/concepts/data_model/indexes.po index 7a923d7112..d1ec802cbe 100644 --- a/locale/ru/LC_MESSAGES/concepts/data_model/indexes.po +++ b/locale/ru/LC_MESSAGES/concepts/data_model/indexes.po @@ -2,12 +2,8 @@ msgid "Indexes" msgstr "Индексы" -msgid "" -"Read the full information about indexes on page :doc:`Indexes " -"`." +msgid "Basics" msgstr "" -"Всю информацию про индексы можно найти на странице :doc:`Индексы " -"`." msgid "" "An **index** is a special data structure that stores a group of key values " @@ -72,15 +68,24 @@ msgstr "" "На индексы распространяются определенные ограничения. Более подробную " "информацию см. на странице :doc:`Ограничения `." +msgid "" +"To create a generator for indexes, you can use a sequence object. Learn how " +"to do it in the :ref:`tutorial `." +msgstr "" +"Можно создать генератор индексов, используя последовательность (sequence). " +"Чтобы узнать подробности, обратитесь к :ref:`практическому руководству " +"`." + msgid "Indexed field types" msgstr "Типы индексированных полей" msgid "" -"Not to be confused with :ref:`index types ` -- the types of the data structure that is an index. " -"See more about index types :ref:`below `." +"Not to be confused with :ref:`index types ` -- the types of the" +" data structure that is an index. See more about index types :ref:`below " +"`." msgstr "" -"Типы полей не следует путать с :ref:`типами индексов ` как структур данных. " -"О типах индексов можно прочитать :ref:`ниже `." +"Типы полей не следует путать с :ref:`типами индексов ` как " +"структур данных. О типах индексов можно прочитать :ref:`ниже `." msgid "" "Indexes restrict values that Tarantool can store with MsgPack. This is why, " @@ -96,29 +101,32 @@ msgstr "" "только *неотрицательные* целочисленные значения, а индекс типа ``'integer'``" " содержит *любые* целочисленные значения." +#, fuzzy msgid "" -"The default field type is ``'unsigned'`` and the default index type is TREE. " -"Although ``'nil'`` is not a legal indexed field type, indexes may contain " -"`nil` :ref:`as a non-default option `." +"The default field type is ``'unsigned'`` and the default index type is TREE." +" Although ``'nil'`` is not a legal indexed field type, indexes may contain " +"`nil` :ref:`as a non-default option `." msgstr "" -"По умолчанию тип поля — ``'unsigned'``, тип индекса — TREE. " -"Хотя в качестве типа индексированого поля ``'nil'`` использовать нельзя, " -"индексы могут содержать `nil` как :ref:`опцию, которая не используется по " -"умолчанию `." +"По умолчанию тип поля — ``'unsigned'``, тип индекса — TREE. Хотя в качестве " +"типа индексированого поля ``'nil'`` использовать нельзя, индексы могут " +"содержать `nil` как :ref:`опцию, которая не используется по умолчанию " +"`." +#, fuzzy msgid "" -"To learn more about field types, check the " -":ref:`Field type details ` section and the more elaborate" -" :ref:`Details about index field types ` in the reference." +"To learn more about field types, check the :ref:`Field type details " +"` section." msgstr "" -"Подробную информацию см. на странице :ref:`Описание типов полей `, " -"а также в более развернутом :ref:`Описании типов индексированных полей " -"` в справочнике." +"Подробную информацию см. на странице :ref:`Описание типов полей " +"`, а также в более развернутом :ref:`Описании " +"типов индексированных полей ` в " +"справочнике." msgid "Field type name string" msgstr "Имя типа поля" -msgid "Field type |br|" +#, fuzzy +msgid "Field type" msgstr "Тип поля |br|" msgid "Index type" @@ -130,10 +138,8 @@ msgstr "``'boolean'``" msgid ":ref:`boolean `" msgstr ":ref:`boolean `" -msgid ":ref:`TREE or HASH `" -msgstr ":ref:`TREE или HASH `" - -msgid "``'integer'`` (may also be called ``‘int’``)" +#, fuzzy +msgid "``'integer'`` (may also be called ``'int'``)" msgstr "``'integer'`` (также может называться ``‘int’``)" msgid ":ref:`integer `, which may include unsigned values" @@ -168,10 +174,12 @@ msgstr "``'number'``" msgid "" ":ref:`number `, which may include :ref:`integer `, :ref:`double `, or :ref:`decimal ` values" +"box_integer>`, :ref:`double `, or :ref:`decimal ` values" msgstr "" ":ref:`number `, может включать в себя значения типа " -":ref:`integer `, :ref:`double ` или :ref:`decimal `" +":ref:`integer `, :ref:`double ` или " +":ref:`decimal `" msgid "``'decimal'``" msgstr "``'decimal'``" @@ -191,7 +199,8 @@ msgstr "``'varbinary'``" msgid ":ref:`varbinary `" msgstr ":ref:`varbinary `" -msgid "TREE, HASH, or BITSET (since version 2.7)" +#, fuzzy +msgid "TREE, HASH, or BITSET (since version :doc:`2.7.1 `)" msgstr "TREE, HASH или BITSET (с версии 2.7)" msgid "``'uuid'``" @@ -200,6 +209,17 @@ msgstr "``'uuid'``" msgid ":ref:`uuid `" msgstr ":ref:`uuid `" +#, fuzzy +msgid "``datetime``" +msgstr "``'decimal'``" + +#, fuzzy +msgid ":ref:`datetime `" +msgstr ":ref:`decimal `" + +msgid "TREE" +msgstr "TREE" + msgid "``'array'``" msgstr "``'array'``" @@ -212,12 +232,16 @@ msgstr ":ref:`RTREE `" msgid "``'scalar'``" msgstr "``'scalar'``" +#, fuzzy msgid "" "may include :ref:`nil `, :ref:`boolean `, " ":ref:`integer `, :ref:`unsigned `, " ":ref:`number `, :ref:`decimal `, " ":ref:`string `, :ref:`varbinary `, or " -":ref:`uuid ` values" +":ref:`uuid ` values | " +"|br| When a scalar field contains values of different underlying types, the " +"key order is: nils, then booleans, then numbers, then strings, then " +"varbinaries, then uuids." msgstr "" "может содержать значения :ref:`nil `, :ref:`boolean `, :ref:`integer `, :ref:`unsigned `, :ref:`string ` или :ref:`varbinary `" -msgid "" -"When a scalar field contains values of different underlying types, the key " -"order is: nils, then booleans, then numbers, then strings, then varbinaries," -" then uuids." -msgstr "" -"Когда поле типа scalar содержит значения различных базовых типов, то порядок" -" ключей следующий: nil, затем boolean, затем number, затем string, затем " -"varbinary, затем uuid." - -msgid "" -"To create a generator for indexes, you can use a sequence object. " -"Learn how to do it in the :ref:`tutorial `." -msgstr "" -"Можно создать генератор индексов, используя последовательность (sequence). " -"Чтобы узнать подробности, обратитесь к :ref:`практическому руководству `." - - msgid "Index types" msgstr "Типы индексов" @@ -258,9 +265,6 @@ msgstr "Обзор характеристик индексов приведен msgid "Feature" msgstr "Характеристика" -msgid "TREE" -msgstr "TREE" - msgid "HASH" msgstr "HASH" @@ -282,7 +286,8 @@ msgstr "\\-" msgid "non-unique" msgstr "неуникальный" -msgid ":ref:`is_nullable `" +#, fuzzy +msgid ":ref:`is_nullable `" msgstr ":ref:`is_nullable `" msgid "can be multi-part" @@ -300,13 +305,17 @@ msgstr "может быть по первичному ключу" msgid "``exclude_null`` (version 2.8+)" msgstr "``exclude_null`` (версии 2.8+)" +msgid "Pagination (the :ref:`after ` option)" +msgstr "" + msgid ":doc:`iterator types `" msgstr ":doc:`типы итераторов `" msgid "ALL, EQ, REQ, GT, GE, LT, LE" msgstr "ALL, EQ, REQ, GT, GE, LT, LE" -msgid "ALL, EQ, GT" +#, fuzzy +msgid "ALL, EQ" msgstr "ALL, EQ, GT" msgid "ALL, EQ, GT, GE, LT, LE, OVERLAPS, NEIGHBOR" @@ -315,6 +324,11 @@ msgstr "ALL, EQ, GT, GE, LT, LE, OVERLAPS, NEIGHBOR" msgid "ALL, EQ, BITS_ALL_SET, BITS_ANY_SET, BITS_ALL_NOT_SET" msgstr "ALL, EQ, BITS_ALL_SET, BITS_ANY_SET, BITS_ALL_NOT_SET" +msgid "" +"In :doc:`2.11.0 `, the ``GT`` index type is deprecated for " +"HASH indexes." +msgstr "" + msgid "TREE indexes" msgstr "TREE-индексы" @@ -420,6 +434,15 @@ msgstr "" "функции расстояния ``distance``: ``euclid``, то есть Евклидова метрика, или " "``manhattan``, то есть расстояние городских кварталов." +msgid "" +"Currently, the :ref:`isolation level ` of RTREE " +"indexes in :ref:`MVCC transaction mode ` is " +"*read-committed* (not *serializable*, as stated). If a transaction uses " +"these indexes, it can read committed or confirmed data (depending on the " +"isolation level). However, the indexes are subject to different anomalies " +"that can make them unserializable." +msgstr "" + msgid "**Example 1:**" msgstr "**Пример 1:**" @@ -714,9 +737,12 @@ msgid "" "Keep in mind that select NEIGHBOR iterator with unset limits extracts the " "entire space in order of increasing distance. And there can be tons of data," " and this can affect the performance." -msgstr "Не рекомендуется использовать с операцией select итератор NEIGHBOR без указанного значения ``limit``. " -"В этом случае будет получен спейс целиком, упорядоченный по возрастанию расстояния. " -"Это может отразиться на производительности, поскольку в спейсе может храниться огромное количество данных." +msgstr "" +"Не рекомендуется использовать с операцией select итератор NEIGHBOR без " +"указанного значения ``limit``. В этом случае будет получен спейс целиком, " +"упорядоченный по возрастанию расстояния. Это может отразиться на " +"производительности, поскольку в спейсе может храниться огромное количество " +"данных." msgid "" "And another frequent mistake is to specify iterator type without quotes, in " @@ -725,9 +751,9 @@ msgid "" "so iterator is unset and default used." msgstr "" "Другая типичная ошибка --- указать тип итератора без кавычек следующим " -"образом: ``rtree_index:select(rect, {iterator = LE})``. В этом случае " -"``LE`` представляет собой неопределенную переменную и обрабатывается как " -"nil, поэтому итератор считается незаданным, и будет использован итератор по " +"образом: ``rtree_index:select(rect, {iterator = LE})``. В этом случае ``LE``" +" представляет собой неопределенную переменную и обрабатывается как nil, " +"поэтому итератор считается незаданным, и будет использован итератор по " "умолчанию EQ." msgid "BITSET indexes" @@ -742,6 +768,15 @@ msgstr "" "битовым маскам. Это может быть, например, сохранение вектора атрибутов и " "поиск по этим атрибутам." +msgid "" +"Currently, the :ref:`isolation level ` of BITSET " +"indexes in :ref:`MVCC transaction mode ` is " +"*read-committed* (not *serializable*, as stated). If a transaction uses " +"these indexes, it can read committed or confirmed data (depending on the " +"isolation level). However, the indexes are subject to different anomalies " +"that can make them unserializable." +msgstr "" + msgid "" "The following script shows creating and searching with a BITSET index. " "Notice that BITSET cannot be unique, so first a primary-key index is " @@ -888,3 +923,22 @@ msgstr "" "типа индекса. Например, их можно использовать для оценки логических " "выражений при обходе BITSET-индексов или при обходе TREE-индексов в порядке " "по убыванию." + +#~ msgid "" +#~ "Read the full information about indexes on page :doc:`Indexes " +#~ "`." +#~ msgstr "" +#~ "Всю информацию про индексы можно найти на странице :doc:`Индексы " +#~ "`." + +#~ msgid ":ref:`TREE or HASH `" +#~ msgstr ":ref:`TREE или HASH `" + +#~ msgid "" +#~ "When a scalar field contains values of different underlying types, the key " +#~ "order is: nils, then booleans, then numbers, then strings, then varbinaries," +#~ " then uuids." +#~ msgstr "" +#~ "Когда поле типа scalar содержит значения различных базовых типов, то порядок" +#~ " ключей следующий: nil, затем boolean, затем number, затем string, затем " +#~ "varbinary, затем uuid." diff --git a/locale/ru/LC_MESSAGES/concepts/data_model/migrations.po b/locale/ru/LC_MESSAGES/concepts/data_model/migrations.po index 16f539fa94..3d9f2549f9 100644 --- a/locale/ru/LC_MESSAGES/concepts/data_model/migrations.po +++ b/locale/ru/LC_MESSAGES/concepts/data_model/migrations.po @@ -22,6 +22,12 @@ msgstr "добавление поля в конец спейса" msgid "creating an index" msgstr "добавление индекса" +msgid "" +"Check the :ref:`Upgrading space schema ` section. " +"With the help of ``space:upgrade()``, you can enable compression and " +"migrate, including already created tuples." +msgstr "" + msgid "Adding a field to the end of a space" msgstr "Добавление поля в конец спейса" @@ -193,17 +199,18 @@ msgstr "" "Есть также два способа, которые мы **не рекомендуем использовать**, но вы " "можете найти их полезными по тем или иным причинам." -msgid "**Method 3**: the ``tarantoolctl`` utility" +#, fuzzy +msgid "**Method 3**: the :ref:`tt ` utility" msgstr "**Cпособ 3**: утилита ``tarantoolctl``" -msgid "" -"The ``tarantoolctl`` utility ships with Tarantool. Connect to the necessary " -"instance using ``tarantoolctl connect``." +#, fuzzy +msgid "Connect to the necessary instance using ``tt connect``." msgstr "" "Утилита ``tarantoolctl`` поставляется вместе с Tarantool. Подключитесь к " "нужному инстансу через команду ``tarantoolctl connect``." -msgid "$ tarantoolctl connect admin:password@localhost:3301" +#, fuzzy +msgid "$ tt connect admin:password@localhost:3301" msgstr "$ tarantoolctl connect admin:password@localhost:3301" msgid "" @@ -230,6 +237,15 @@ msgstr "" "(или) можно скопировать код скрипта миграции, вставить его в консоль и " "применить." +msgid "" +"You can also connect to the instance and execute the migration script in a " +"single call:" +msgstr "" + +#, fuzzy +msgid "$ tt connect admin:password@localhost:3301 -f 0001-delete-space.lua" +msgstr "$ tarantoolctl connect admin:password@localhost:3301" + msgid "**Method 4**: applying migration with Ansible" msgstr "**Способ 4**: применение миграции с помощью Ansible" diff --git a/locale/ru/LC_MESSAGES/concepts/data_model/operations.po b/locale/ru/LC_MESSAGES/concepts/data_model/operations.po index 1a5a70431c..600def178e 100644 --- a/locale/ru/LC_MESSAGES/concepts/data_model/operations.po +++ b/locale/ru/LC_MESSAGES/concepts/data_model/operations.po @@ -227,6 +227,10 @@ msgstr "" "больше нужно оперативной памяти, но количество низкоуровневых шагов остается" " примерно тем же." +#, fuzzy +msgid "Index type" +msgstr "Размер индекса" + msgid "" "Typically, a HASH index is faster than a TREE index if the number of tuples " "in the space is greater than one." @@ -237,16 +241,11 @@ msgstr "" msgid "Number of indexes accessed" msgstr "Количество обращений к индексам" +#, fuzzy msgid "" "Ordinarily, only one index is accessed to retrieve one tuple. But to update " -"the tuple, there must be N accesses if the space has N different indexes." -msgstr "" -"Обычно для выборки значений одного кортежа используется только один индекс. " -"Но при обновлении значений в кортеже требуется N обращений, если в спейсе N " -"индексов." - -msgid "" -"Note regarding storage engine: Vinyl optimizes away such accesses if " +"the tuple, there must be N accesses if the space has N different indexes. " +"|br| Note regarding storage engine: Vinyl optimizes away such accesses if " "secondary index fields are unchanged by the update. So, this complexity " "factor applies only to memtx, since it always makes a full-tuple copy on " "every update." @@ -282,3 +281,11 @@ msgstr "" "WAL производится при каждом запросе на изменение данных, то при каждом таком" " запросе приходится ждать, пока отработает обращение к более медленному " "диску, и данный фактор становится важнее всех остальных." + +#~ msgid "" +#~ "Ordinarily, only one index is accessed to retrieve one tuple. But to update " +#~ "the tuple, there must be N accesses if the space has N different indexes." +#~ msgstr "" +#~ "Обычно для выборки значений одного кортежа используется только один индекс. " +#~ "Но при обновлении значений в кортеже требуется N обращений, если в спейсе N " +#~ "индексов." diff --git a/locale/ru/LC_MESSAGES/concepts/data_model/schema_desc.po b/locale/ru/LC_MESSAGES/concepts/data_model/schema_desc.po index a72f9c0e3f..009542a037 100644 --- a/locale/ru/LC_MESSAGES/concepts/data_model/schema_desc.po +++ b/locale/ru/LC_MESSAGES/concepts/data_model/schema_desc.po @@ -115,20 +115,28 @@ msgstr "" msgid "The schema would look something like this:" msgstr "Схема будет выглядеть примерно вот так:" +#, fuzzy msgid "" "spaces:\n" -" users:\n" -" engine: memtx\n" -" is_local: false\n" -" temporary: false\n" -" format:\n" -" - {name: user_id, type: uuid, is_nullable: false}\n" -" - {name: fullname, type: string, is_nullable: false}\n" -" indexes:\n" -" - name: user_id\n" -" unique: true\n" -" parts: [{path: user_id, type: uuid, is_nullable: false}]\n" -" type: HASH" +" users:\n" +" engine: memtx\n" +" is_local: false\n" +" temporary: false\n" +" format:\n" +" - {name: user_id, type: uuid, is_nullable: false}\n" +" - {name: fullname, type: string, is_nullable: false}\n" +" - {name: bucket_id, type: unsigned, is_nullable: false}\n" +" indexes:\n" +" - name: user_id\n" +" unique: true\n" +" parts: [{path: user_id, type: uuid, is_nullable: false}]\n" +" type: HASH\n" +" - name: bucket_id\n" +" unique: false\n" +" parts: [{path: bucket_id, type: unsigned, is_nullable: false}]\n" +" type: TREE\n" +" sharding_key: [user_id]\n" +" sharding_func: test_module.sharding_func" msgstr "" "spaces:\n" " users:\n" @@ -151,20 +159,10 @@ msgstr "" "Этот вариант проще для старта: его проще использовать и не нужно вникать в " "язык Lua." +#, fuzzy msgid "" -"``DDL`` is a built-in :doc:`Cartridge ` module. " -"Cartridge is a cluster solution for Tarantool. In its WebUI, there is a " -"separate tab called \"Schema\". On this tab, you can define the schema, " -"check its correctness, and apply it to the whole cluster." -msgstr "" -"Модуль ``DDL`` встроен по умолчанию в :doc:`Cartridge `.\n" -"Cartridge — это кластерное решение для Tarantool. В его веб-интерфейсе есть\n" -"отдельная вкладка \"Schema\". Там можно написать схему, проверить ее корректность и применить на всем кластере." - -msgid "" -"If you do not use Cartridge, you can still use the DDL module: put the " -"following Lua code into the file that you use to run Tarantool. This file is" -" usually called ``init.lua``." +"To use the DDL module, put the following Lua code into the file that you use" +" to run Tarantool. This file is usually called ``init.lua``." msgstr "" "Если вы не используете Cartridge, то чтобы использовать модуль DDL, нужно " "вставить нижеприведенный код на Lua в файл, с которым вы запускаете " @@ -207,7 +205,18 @@ msgstr "" msgid "" "It is forbidden to modify the data schema in DDL after it has been applied. " -"For migration, there are different scenarios described in the :ref:`Migrations ` section." +"For migration, there are different scenarios described in the " +":ref:`Migrations ` section." msgstr "" "Менять схему в самом DDL после ее применения нельзя. Для миграций есть " "несколько подходов — они описаны в разделе :ref:`Миграции `." + +#~ msgid "" +#~ "``DDL`` is a built-in :doc:`Cartridge ` module. " +#~ "Cartridge is a cluster solution for Tarantool. In its WebUI, there is a " +#~ "separate tab called \"Schema\". On this tab, you can define the schema, " +#~ "check its correctness, and apply it to the whole cluster." +#~ msgstr "" +#~ "Модуль ``DDL`` встроен по умолчанию в :doc:`Cartridge `.\n" +#~ "Cartridge — это кластерное решение для Tarantool. В его веб-интерфейсе есть\n" +#~ "отдельная вкладка \"Schema\". Там можно написать схему, проверить ее корректность и применить на всем кластере." diff --git a/locale/ru/LC_MESSAGES/concepts/data_model/value_store.po b/locale/ru/LC_MESSAGES/concepts/data_model/value_store.po index 9c6569083e..d1821a9b0a 100644 --- a/locale/ru/LC_MESSAGES/concepts/data_model/value_store.po +++ b/locale/ru/LC_MESSAGES/concepts/data_model/value_store.po @@ -1,3 +1,4 @@ + msgid "Data storage" msgstr "Хранение данных" @@ -76,9 +77,7 @@ msgstr "" msgid "Spaces" msgstr "Спейсы" -msgid "" -"Tarantool stores tuples in containers called spaces. In the example above, " -"there's a space called ``tester``." +msgid "Tarantool stores tuples in containers called spaces." msgstr "" "Tarantool хранит кортежи в контейнерах, называемых спейсами (space). Спейс в" " примере выше называется ``tester``." @@ -89,8 +88,8 @@ msgstr "спейс" msgid "" "In Tarantool, a space is a primary container that stores data. It is " "analogous to tables in relational databases. Spaces contain :term:`tuples " -"` -- the Tarantool name for database records. The number of tuples " -"in a space is unlimited." +"` -- the Tarantool name for database records. The number of tuples in" +" a space is unlimited." msgstr "" "В Tarantool спейс — это первичный контейнер, хранящий данные. Он похож на " "таблицы в реляционных базах данных. Спейсы содержат :term:`кортежи ` " @@ -149,7 +148,7 @@ msgstr "Lua в сравнении с MsgPack" msgid "Scalar / compound" msgstr "Скалярный / составной" -msgid "MsgPack |nbsp| type" +msgid "MsgPack type" msgstr "MsgPack-тип |nbsp|" msgid "Lua type" @@ -164,16 +163,16 @@ msgstr "скалярный" msgid "nil" msgstr "nil" -msgid "\"`nil`_\"" -msgstr "\"`nil`_\"" +msgid "`cdata`_" +msgstr "\"`cdata`_\"" -msgid "``nil``" -msgstr "``nil``" +msgid ":ref:`box.NULL `" +msgstr "" msgid "boolean" msgstr "boolean" -msgid "\"`boolean`_\"" +msgid "`boolean`_" msgstr "\"`boolean`_\" (логическое значение)" msgid "``true``" @@ -182,7 +181,7 @@ msgstr "``true``" msgid "string" msgstr "string" -msgid "\"`string`_\"" +msgid "`string`_" msgstr "\"`string`_\"" msgid "``'A B C'``" @@ -191,37 +190,46 @@ msgstr "``'A B C'``" msgid "integer" msgstr "integer" -msgid "\"`number`_\"" +msgid "`number`_" msgstr "\"`number`_\"" msgid "``12345``" msgstr "``12345``" -msgid "float 64 (double)" +msgid "float64 (double)" msgstr "float 64 (double)" msgid "``1.2345``" msgstr "``1.2345``" -msgid "\"`cdata`_\"" -msgstr "\"`cdata`_\"" - msgid "binary" msgstr "binary" msgid "``[!!binary 3t7e]``" msgstr "``[!!binary 3t7e]``" -msgid "ext (for Tarantool decimal)" +msgid "ext (for Tarantool ``decimal``)" msgstr "ext (для decimal в Tarantool)" msgid "``1.2``" msgstr "``1.2``" -msgid "ext (for Tarantool uuid)" +msgid "ext (for Tarantool ``datetime``)" +msgstr "ext (для decimal в Tarantool)" + +msgid "``'2021-08-20T16:21:25.122999906 Europe/Berlin'``" +msgstr "" + +msgid "ext (for Tarantool ``interval``)" +msgstr "ext (для decimal в Tarantool)" + +msgid "``+1 months, 1 days``" +msgstr "" + +msgid "ext (for Tarantool ``uuid``)" msgstr "ext (для uuid в Tarantool)" -msgid "``12a34b5c-de67-8f90-`` |br| ``123g-h4567ab8901``" +msgid "``12a34b5c-de67-8f90-123g-h4567ab8901``" msgstr "``12a34b5c-de67-8f90-`` |br| ``123g-h4567ab8901``" msgid "compound" @@ -230,7 +238,7 @@ msgstr "составной" msgid "map" msgstr "map (ассоциативный массив)" -msgid "\"`table`_\" (with string keys)" +msgid "`table`_ (with string keys)" msgstr "\"`table`_\" (таблица со строковыми ключами)" msgid "``{'a': 5, 'b': 6}``" @@ -239,13 +247,13 @@ msgstr "``{'a': 5, 'b': 6}``" msgid "array" msgstr "array (массив)" -msgid "\"`table`_\" (with integer keys)" +msgid "`table`_ (with integer keys)" msgstr "\"`table`_\" (таблица с целочисленными ключами)" msgid "``[1, 2, 3, 4, 5]``" msgstr "``[1, 2, 3, 4, 5]``" -msgid "tuple (\"`cdata`_\")" +msgid "tuple (`cdata`_)" msgstr "tuple (\"`cdata`_\") (кортеж)" msgid "``[12345, 'A B C']``" @@ -259,17 +267,22 @@ msgstr "" "наименьшего значения number потребуется только один байт, a для наибольшего " "потребуется девять байтов." +msgid "" +"The Lua `nil `_ type is encoded as MsgPack " +"``nil`` but decoded as :ref:`msgpack.NULL `." +msgstr "" + msgid "Field type details" msgstr "Описание типов полей" msgid "" -"**nil**. In Lua, the nil type has only one possible value, also called " -"``nil``. Tarantool displays it as ``null`` when using the default :ref:`YAML" -" ` format. Nil may be compared to values of any types " +"In Lua, the nil type has only one possible value, also called ``nil``. " +"Tarantool displays it as ``null`` when using the default :ref:`YAML " +"` format. Nil may be compared to values of any types " "with == (is-equal) or ~= (is-not-equal), but other comparison operations " "will not work. Nil may not be used in Lua tables; the workaround is to use " -":ref:`box.NULL ` because ``nil == box.NULL`` is true. Example: " -"``nil``." +":ref:`box.NULL ` because ``nil == box.NULL`` is true. **Example:**" +" ``nil``." msgstr "" "**nil**. В языке Lua у типа nil есть только одно значение, также называемое " "``nil``. Tarantool отображает его как ``null`` при использовании формата по " @@ -280,39 +293,51 @@ msgstr "" "вместо nil в таком случае можно указать :ref:`box.NULL `, " "поскольку условие ``nil == box.NULL`` является истинным. Пример: ``nil``." -msgid "" -"**boolean**. A boolean is either ``true`` or ``false``. Example: ``true``." +msgid "A boolean is either ``true`` or ``false``." msgstr "" "**boolean**. Логический тип данных boolean принимает значения ``true`` или " "``false``. Пример: ``true``." +msgid "**Example:** ``true``." +msgstr "" + msgid "" -"**integer**. The Tarantool integer type is for integers between " -"-9223372036854775808 and 18446744073709551615, which is about 18 " -"quintillion. This type corresponds to the number type in Lua and to the " -"integer type in MsgPack. Example: ``-2^63``." +"The Tarantool integer type is for integers between -9223372036854775808 and " +"18446744073709551615, which is about 18 quintillion. This type corresponds " +"to the number type in Lua and to the integer type in MsgPack." msgstr "" "**integer**. В Tarantool тип полей integer используется для целых чисел от " "−9 223 372 036 854 775 808 до 18 446 744 073 709 551 615, то есть до " "примерно 18 квинтиллионов. Такой тип данных соответствует типам number в Lua" " и integer в MsgPack. Пример: ``-2^63``." +msgid "**Example:** ``-2^63``." +msgstr "" + +msgid "unsigned" +msgstr "" + msgid "" -"**unsigned**. The Tarantool unsigned type is for integers between 0 and " -"18446744073709551615. So it is a subset of integer. Example: ``123456``." +"The Tarantool unsigned type is for integers between 0 and " +"18446744073709551615. So it is a subset of integer." msgstr "" "**unsigned**. Тип unsigned в Tarantool используется для целых чисел от 0 до " "18 446 744 073 709 551 615. Он представляет собой подмножество типа integer." " Пример: ``123456``." +msgid "**Example:** ``123456``." +msgstr "" + +msgid "double" +msgstr "" + msgid "" -"**double**. The double field type exists mainly to be equivalent to " -"Tarantool/SQL's :ref:`DOUBLE data type `. In " -"`msgpuck.h `_ (Tarantool's interface to " -"MsgPack), the storage type is ``MP_DOUBLE`` and the size of the encoded " -"value is always 9 bytes. In Lua, fields of the double type can only contain " -"non-integer numeric values and cdata values with double floating-point " -"numbers. Examples: ``1.234``, ``-44``, ``1.447e+44``." +"The double field type exists mainly to be equivalent to Tarantool/SQL's " +":ref:`DOUBLE data type `. In `msgpuck.h " +"`_ (Tarantool's interface to MsgPack), " +"the storage type is ``MP_DOUBLE`` and the size of the encoded value is " +"always 9 bytes. In Lua, fields of the double type can only contain non-" +"integer numeric values and cdata values with double floating-point numbers." msgstr "" "**double**. Поле типа double существует главным образом для соответствия " "типу :ref:`DOUBLE data type ` в Tarantool/SQL . В " @@ -322,13 +347,15 @@ msgstr "" " целые числовые значения и значения cdata с числами с плавающей точкой " "двойной точности (double). Примеры: ``1.234``, ``-44``, ``1.447e+44``." +msgid "**Examples:** ``1.234``, ``-44``, ``1.447e+44``." +msgstr "" + msgid "" "To avoid using the wrong kind of values inadvertently, use ``ffi.cast()`` " "when searching or changing ``double`` fields. For example, instead of " ":samp:`{space_object}:insert`:code:`{`:samp:`{value}`:code:`}` use ``ffi = " "require('ffi') ...`` " ":samp:`{space_object}:insert`:code:`({ffi.cast('double',`:samp:`{value}`:code:`)})`." -" Example:" msgstr "" "Чтобы избежать случайного использования неправильного типа значений, " "используйте явное преобразование типа ``ffi.cast()``, когда вы ищете или " @@ -338,6 +365,9 @@ msgstr "" ":samp:`{space_object}:insert`:code:`({ffi.cast('double',`:samp:`{value}`:code:`)})`." " Пример:" +msgid "**Example:**" +msgstr "" + msgid "" "s = box.schema.space.create('s', {format = {{'d', 'double'}}})\n" "s:create_index('ii')\n" @@ -368,10 +398,12 @@ msgstr "" "Tarantool/SQL, так как Tarantool/SQL применяет :ref:`неявное приведение " "типов `." +msgid "number" +msgstr "\"`number`_\"" + msgid "" -"**number**. The Tarantool number field may have both integer and floating-" -"point values, although in Lua a ``number`` is a double-precision floating-" -"point." +"The Tarantool number field may have both integer and floating-point values, " +"although in Lua a ``number`` is a double-precision floating-point." msgstr "" "**number**. Поле number в Tarantool может содержать значения как целые, так " "и с плавающей точкой, хотя в Lua тип ``number`` означает число с плавающей " @@ -400,11 +432,18 @@ msgstr "" "``tonumber64('18446744073709551615')``." msgid "" -"**decimal**. The Tarantool decimal type is stored as a MsgPack ext " -"(Extension). Values with the decimal type are not floating-point values " -"although they may contain decimal points. They are exact with up to 38 " -"digits of precision. Example: a value returned by a function in the " -":ref:`decimal ` module." +"You can also use the ``ffi`` module to specify a C type to cast the number " +"to. In this case, the number will be stored as `cdata`_." +msgstr "" + +msgid "decimal" +msgstr "" + +msgid "" +"The Tarantool decimal type is stored as a :ref:`MsgPack ext ` (Extension). Values with the decimal type are not floating-point " +"values although they may contain decimal points. They are exact with up to " +"38 digits of precision." msgstr "" "**decimal**. Тип данных decimal в Tarantool хранится в формате MsgPack ext " "(Extension). Значения с типом decimal не являются числами с плавающей " @@ -413,16 +452,52 @@ msgstr "" " в модуле :ref:`decimal `." msgid "" -"**string**. A string is a variable-length sequence of bytes, usually " -"represented with alphanumeric characters inside single quotes. In both Lua " -"and MsgPack, strings are treated as binary data, with no attempts to " -"determine a string's character set or to perform any string conversion -- " -"unless there is an optional :ref:`collation `. So, usually," -" string sorting and comparison are done byte-by-byte, without any special " -"collation rules applied. For example, numbers are ordered by their point on " -"the number line, so 2345 is greater than 500; meanwhile, strings are ordered" -" by the encoding of the first byte, then the encoding of the second byte, " -"and so on, so ``'2345'`` is less than ``'500'``. Example: ``'A, B, C'``." +"**Example:** a value returned by a function in the :ref:`decimal ` " +"module." +msgstr "" + +msgid "datetime" +msgstr "" + +msgid "" +"Introduced in :tarantool-release:`2.10.0`. The Tarantool ``datetime`` type " +"facilitates operations with date and time, accounting for leap years or the " +"varying number of days in a month. It is stored as a :ref:`MsgPack ext " +"` (Extension). Operations with this data type use code" +" from `c-dt `_, a third-party library." +msgstr "" + +msgid "" +"For more information, see :doc:`Module datetime " +"`." +msgstr "" + +msgid "interval" +msgstr "integer" + +msgid "**Since:** :tarantool-release:`2.10.0`" +msgstr "" + +msgid "" +"The Tarantool ``interval`` type represents periods of time. They can be " +"added to or subtracted from ``datetime`` values or each other. Operations " +"with this data type use code from `c-dt " +"`_, a third-party library. The type is " +"stored as a :ref:`MsgPack ext ` (Extension). For more " +"information, see :doc:`Module datetime `." +msgstr "" + +msgid "" +"A string is a variable-length sequence of bytes, usually represented with " +"alphanumeric characters inside single quotes. In both Lua and MsgPack, " +"strings are treated as binary data, with no attempts to determine a string's" +" character set or to perform any string conversion -- unless there is an " +"optional :ref:`collation `. So, usually, string sorting and" +" comparison are done byte-by-byte, without any special collation rules " +"applied. For example, numbers are ordered by their point on the number line," +" so 2345 is greater than 500; meanwhile, strings are ordered by the encoding" +" of the first byte, then the encoding of the second byte, and so on, so " +"``'2345'`` is less than ``'500'``." msgstr "" "**string**. Строка (string) представляет собой последовательность байтов " "переменной длины. Обычно она записывается буквенно-цифровыми символами в " @@ -436,12 +511,18 @@ msgstr "" "первого байта, затем по кодировке второго байта и так далее, так что " "``'2345'`` меньше ``'500'``. Пример: ``'A, B, C'``." +msgid "**Example:** ``'A, B, C'``." +msgstr "" + +msgid "bin" +msgstr "binary" + msgid "" -"**bin**. A bin (binary) value is not directly supported by Lua but there is " -"a Tarantool type ``varbinary`` which is encoded as MsgPack binary. For an " +"A bin (binary) value is not directly supported by Lua but there is a " +"Tarantool type ``varbinary`` which is encoded as MsgPack binary. For an " "(advanced) example showing how to insert varbinary into a database, see the " "Cookbook Recipe for :ref:`ffi_varbinary_insert `. Example: ``\"\\65 \\66 \\67\"``." +"ffi_varbinary_insert>`." msgstr "" "**bin**. Значения типа bin (двоичные значения) не поддерживаются " "непосредственно в Lua, но в Tarantool есть тип ``varbinary``, который " @@ -450,34 +531,40 @@ msgstr "" "ffi_varbinary_insert>` (продвинутого уровня). Пример: ``\"\\65 \\66 " "\\67\"``." +msgid "**Example:** ``\"\\65 \\66 \\67\"``." +msgstr "" + +msgid "uuid" +msgstr "" + msgid "" -"**uuid**. The Tarantool uuid type is used for :ref:`Universally Unique " -"Identifiers `. Since version :doc:`2.4.1 ` " -"Tarantool stores ``uuid`` values as a :ref:`MsgPack ext ` (Extension)." +"The Tarantool uuid type is used for :ref:`Universally Unique Identifiers " +"`. Since version :doc:`2.4.1 ` Tarantool stores" +" ``uuid`` values as a :ref:`MsgPack ext ` (Extension)." msgstr "" "**uuid**. Тип uuid в Tarantool используется для :ref:`универсальных " "уникальных идентификаторов (UUID) `. Начиная с версии " ":doc:`2.4.1 `, Tarantool хранит значения ``uuid`` в формате " ":ref:`MsgPack ext ` (Extension)." -msgid "Example: ``64d22e4d-ac92-4a23-899a-e5934af5479``." +msgid "**Example:** ``64d22e4d-ac92-4a23-899a-e5934af5479``." msgstr "Пример: ``64d22e4d-ac92-4a23-899a-e5934af5479``." msgid "" -"**array**. An array is represented in Lua with ``{...}`` (`braces " -"`_). Examples: lists of numbers " -"representing points in geometric figures: ``{10, 11}``, ``{3, 5, 9, 10}``." +"An array is represented in Lua with ``{...}`` (`braces " +"`_)." msgstr "" "**array**. В Lua массив (array) обозначается ``{...}`` (`фигурными скобками " "`_). Примеры: списки чисел, которые " "обозначают точки геометрической фигуры: ``{10, 11}``, ``{3, 5, 9, 10}``." +msgid "table" +msgstr "кортеж" + msgid "" -"**table**. Lua tables with string keys are stored as MsgPack maps; Lua " -"tables with integer keys starting with 1 are stored as MsgPack arrays. Nils " -"may not be used in Lua tables; the workaround is to use :ref:`box.NULL `. Example: a ``box.space.tester:select()`` request will return a Lua " -"table." +"Lua tables with string keys are stored as MsgPack maps; Lua tables with " +"integer keys starting with 1 are stored as MsgPack arrays. Nils may not be " +"used in Lua tables; the workaround is to use :ref:`box.NULL `." msgstr "" "**table**. Lua-таблицы со строковыми ключами хранятся в виде ассоциативных " "массивов MsgPack map. Lua-таблицы с целочисленными ключами, начиная с 1, " @@ -486,10 +573,15 @@ msgstr "" "запрос ``box.space.tester:select()`` вернет Lua-таблицу." msgid "" -"**tuple**. A tuple is a light reference to a MsgPack array stored in the " -"database. It is a special type (cdata) to avoid conversion to a Lua table on" -" retrieval. A few functions may return tables with multiple tuples. For " -"tuple examples, see :ref:`box.tuple `." +"**Example:** a ``box.space.tester:select()`` request will return a Lua " +"table." +msgstr "" + +msgid "" +"A tuple is a light reference to a MsgPack array stored in the database. It " +"is a special type (cdata) to avoid conversion to a Lua table on retrieval. A" +" few functions may return tables with multiple tuples. For tuple examples, " +"see :ref:`box.tuple `." msgstr "" "**tuple**. Кортеж (tuple) представляет собой легкую ссылку на массив типа " "MsgPack array, который хранится в базе данных. Это особый тип (cdata), " @@ -498,23 +590,33 @@ msgstr "" "кортежами см. в разделе :ref:`box.tuple `." msgid "" -"**scalar**. Values in a scalar field can be boolean, integer, unsigned, " -"double, number, decimal, string, uuid, or varbinary; but not array, map, or " -"tuple. Examples: ``true``, ``1``, ``'xxx'``." +"Values in a scalar field can be boolean, integer, unsigned, double, number, " +"decimal, string, uuid, or varbinary; but not array, map, or tuple." msgstr "" "**scalar**. Значения в поле типа scalar могут быть следующих типов: boolean," " integer, unsigned, double, number, decimal, string, uuid, varbinary. Они не" " могут иметь тип array, map или tuple. Примеры: ``true``, ``1``, ``'xxx'``." +msgid "**Examples:** ``true``, ``1``, ``'xxx'``." +msgstr "" + +msgid "any" +msgstr "" + msgid "" -"**any**. Values in a field of this type can be boolean, integer, unsigned, " -"double, number, decimal, string, uuid, varbinary, array, map, or tuple. " -"Examples: ``true``, ``1``, ``'xxx'``, ``{box.NULL, 0}``." +"Values in a field of this type can be boolean, integer, unsigned, double, " +"number, decimal, string, uuid, varbinary, array, map, or tuple." msgstr "" "**any**. Значения в поле типа any могут быть следующих типов: boolean, " "integer, unsigned, double, number, decimal, string, uuid, varbinary, array, " "map, tuple. Примеры: ``true``, ``1``, ``'xxx'``, ``{box.NULL, 0}``." +msgid "**Examples:** ``true``, ``1``, ``'xxx'``, ``{box.NULL, 0}``." +msgstr "" + +msgid "Examples" +msgstr "Пример значения" + msgid "Examples of insert requests with different field types:" msgstr "Примеры запросов вставки с разными типами полей:" @@ -552,8 +654,8 @@ msgid "" "To learn more about what values can be stored in indexed fields, read the " ":ref:`Indexes ` section." msgstr "" -"О том, какие значения можно хранить в индексированных полях, читайте " -"в разделе :ref:`об индексах `". +"О том, какие значения можно хранить в индексированных полях, читайте в " +"разделе :ref:`об индексах `\"" msgid "Collations" msgstr "Сортировка" @@ -796,3 +898,306 @@ msgstr "" " Схемы, в деталях объясняющие отличия от упорядочения по DUCET, можно найти " "в `Общем репозитории языковых данных (Common Language Data Repository) " "`_." + +msgid "Constraints" +msgstr "" + +msgid "" +"For better control over stored data, Tarantool supports **constraints** – " +"user-defined limitations on the values of certain fields or entire tuples. " +"Together with data types, constraints allow limiting the ranges of available" +" field values both syntactically and semantically." +msgstr "" + +msgid "" +"For example, the field ``age`` typically has the ``number`` type, so it " +"cannot store strings or boolean values. However, it can still have values " +"that don't make sense, such as negative numbers. This is where constraints " +"come to help." +msgstr "" + +msgid "Constraint types" +msgstr "Типы данных" + +msgid "There are two types of constraints in Tarantool:" +msgstr "" + +msgid "" +"*Field constraints* check that the value being assigned to a field satisfies" +" a given condition. For example, ``age`` must be non-negative." +msgstr "" + +msgid "" +"*Tuple constraints* check complex conditions that can involve all fields of " +"a tuple. For example, a tuple contains a date in three fields: ``year``, " +"``month``, and ``day``. You can validate ``day`` values based on the " +"``month`` value (and even ``year`` if you consider leap years)." +msgstr "" + +msgid "" +"Field constraints work faster, while tuple constraints allow implementing a " +"wider range of limitations." +msgstr "" + +msgid "Constraint functions" +msgstr "" + +msgid "" +"Constraints use stored Lua functions or :ref:`SQL expressions " +"`, which must return ``true`` when the constraint is " +"satisfied. Other return values (including ``nil``) and exceptions make the " +"check fail and prevent tuple insertion or modification." +msgstr "" + +msgid "" +"To create a constraint function, call :ref:`box.schema.func.create() " +"` with the function definition specified in the " +"``body`` attribute." +msgstr "" + +msgid "Constraint functions take two parameters:" +msgstr "" + +msgid "The tuple and the constraint name for tuple constraints." +msgstr "" + +msgid "" +"-- Define a tuple constraint function --\n" +"box.schema.func.create('check_person', {\n" +" language = 'LUA',\n" +" is_deterministic = true,\n" +" body = 'function(t, c) return (t.age >= 0 and #(t.name) > 3) end'\n" +"})\n" +msgstr "" + +msgid "" +"Tarantool doesn't check field names used in tuple constraint functions. If a" +" field referenced in a tuple constraint gets renamed, this constraint will " +"break and prevent further insertions and modifications in the space." +msgstr "" + +msgid "The field value and the constraint name for field constraints." +msgstr "" + +msgid "" +"-- Define a field constraint function --\n" +"box.schema.func.create('check_age', {\n" +" language = 'LUA',\n" +" is_deterministic = true,\n" +" body = 'function(f, c) return (f >= 0 and f < 150) end'\n" +"})\n" +msgstr "" + +msgid "Creating constraints" +msgstr "" + +msgid "" +"To create a constraint in a space, specify the corresponding function's name" +" in the ``constraint`` parameter:" +msgstr "" + +msgid "Tuple constraints: when creating or altering a space." +msgstr "" + +msgid "" +"-- Create a space with a tuple constraint --\n" +"customers = box.schema.space.create('customers', {constraint = 'check_person'})\n" +msgstr "" + +msgid "Field constraints: when setting up the space format." +msgstr "" + +msgid "" +"-- Specify format with a field constraint --\n" +"box.space.customers:format({\n" +" {name = 'id', type = 'number'},\n" +" {name = 'name', type = 'string'},\n" +" {name = 'age', type = 'number', constraint = 'check_age'},\n" +"})\n" +msgstr "" + +msgid "" +"In both cases, ``constraint`` can contain multiple function names passed as " +"a tuple. Each constraint can have an optional name:" +msgstr "" + +msgid "" +"-- Create one more tuple constraint --\n" +"box.schema.func.create('another_constraint',\n" +" {language = 'LUA', is_deterministic = true, body = 'function(t, c) return true end'})\n" +"\n" +"-- Set two constraints with optional names --\n" +"box.space.customers:alter{\n" +" constraint = { check1 = 'check_person', check2 = 'another_constraint'}\n" +"}\n" +msgstr "" + +msgid "" +"When adding a constraint to an existing space with data, Tarantool checks it" +" against the stored data. If there are fields or tuples that don't satisfy " +"the constraint, it won't be applied to the space." +msgstr "" + +msgid "Foreign keys" +msgstr "" + +msgid "" +"**Foreign keys** provide links between related fields, therefore maintaining" +" the `referential integrity " +"`_ of the database." +msgstr "" + +msgid "" +"Fields can contain values that exist only in other fields. For example, a " +"shop order always belongs to a customer. Hence, all values of the " +"``customer`` field of the ``orders`` space must also exist in the ``id`` " +"field of the ``customers`` space. In this case, ``customers`` is a **parent " +"space** for ``orders`` (its **child space**). When two spaces are linked " +"with a foreign key, each time a tuple is inserted or modified in the child " +"space, Tarantool checks that a corresponding value is present in the parent " +"space." +msgstr "" + +msgid "" +"A foreign key can link a field to another field in the same space. In this " +"case, the child field must be nullable. Otherwise, it is impossible to " +"insert the first tuple in such a space because there is no parent tuple to " +"which it can link." +msgstr "" + +msgid "Foreign key types" +msgstr "" + +msgid "There are two types of foreign keys in Tarantool:" +msgstr "" + +msgid "" +"*Field foreign keys* check that the value being assigned to a field is " +"present in a particular field of another space. For example, the " +"``customer`` value in a tuple from the ``orders`` space must match an ``id``" +" stored in the ``customers`` space." +msgstr "" + +msgid "" +"*Tuple foreign keys* check that multiple fields of a tuple have a match in " +"another space. For example, if the ``orders`` space has fields " +"``customer_id`` and ``customer_name``, a tuple foreign key can check that " +"the ``customers`` space contains a tuple with both these values in the " +"corresponding fields." +msgstr "" + +msgid "" +"Field foreign keys work faster while tuple foreign keys allow implementing " +"more strict references." +msgstr "" + +msgid "Creating foreign keys" +msgstr "" + +msgid "" +"For each foreign key, there must exist a parent space index that includes " +"all its fields." +msgstr "" + +msgid "" +"To create a foreign key in a space, specify the parent space and linked " +"fields in the ``foreign_key`` parameter. Parent spaces can be referenced by " +"name or by id. When linking to the same space, the space can be omitted. " +"Fields can be referenced by name or by number:" +msgstr "" + +msgid "Field foreign keys: when setting up the space format." +msgstr "" + +msgid "" +"-- Create a space with a field foreign key --\n" +"box.schema.space.create('orders')\n" +"\n" +"box.space.orders:format({\n" +" {name = 'id', type = 'number'},\n" +" {name = 'customer_id', foreign_key = {space = 'customers', field = 'id'}},\n" +" {name = 'price_total', type = 'number'},\n" +"})\n" +msgstr "" + +msgid "" +"Tuple foreign keys: when creating or altering a space. Note that for foreign" +" keys with multiple fields there must exist an index that includes all these" +" fields." +msgstr "" + +msgid "" +"-- Create a space with a tuple foreign key --\n" +"box.schema.space.create(\"orders\", {\n" +" foreign_key = {\n" +" space = 'customers',\n" +" field = {customer_id = 'id', customer_name = 'name'}\n" +" }\n" +"})\n" +"\n" +"box.space.orders:format({\n" +" {name = \"id\", type = \"number\"},\n" +" {name = \"customer_id\" },\n" +" {name = \"customer_name\"},\n" +" {name = \"price_total\", type = \"number\"},\n" +"})\n" +msgstr "" + +msgid "" +"Type can be omitted for foreign key fields because it's defined in the " +"parent space." +msgstr "" + +msgid "Foreign keys can have an optional name." +msgstr "" + +msgid "" +"-- Set a foreign key with an optional name --\n" +"box.space.orders:alter{\n" +" foreign_key = {\n" +" customer = {\n" +" space = 'customers',\n" +" field = { customer_id = 'id', customer_name = 'name'}\n" +" }\n" +" }\n" +"}\n" +msgstr "" + +msgid "" +"A space can have multiple tuple foreign keys. In this case, they all must " +"have names." +msgstr "" + +msgid "" +"-- Set two foreign keys: names are mandatory --\n" +"box.space.orders:alter{\n" +" foreign_key = {\n" +" customer = {\n" +" space = 'customers',\n" +" field = {customer_id = 'id', customer_name = 'name'}\n" +" },\n" +" item = {\n" +" space = 'items',\n" +" field = {item_id = 'id'}\n" +" }\n" +" }\n" +"}\n" +msgstr "" + +msgid "" +"Tarantool performs integrity checks upon data modifications in parent " +"spaces. If you try to remove a tuple referenced by a foreign key or an " +"entire parent space, you will get an error." +msgstr "" + +msgid "" +"Renaming parent spaces or referenced fields may break the corresponding " +"foreign keys and prevent further insertions or modifications in the child " +"spaces." +msgstr "" + +#~ msgid "\"`nil`_\"" +#~ msgstr "\"`nil`_\"" + +#~ msgid "``nil``" +#~ msgstr "``nil``" diff --git a/locale/ru/LC_MESSAGES/concepts/engines/index.po b/locale/ru/LC_MESSAGES/concepts/engines/index.po index 59f4fc1f1b..1960280dfc 100644 --- a/locale/ru/LC_MESSAGES/concepts/engines/index.po +++ b/locale/ru/LC_MESSAGES/concepts/engines/index.po @@ -19,9 +19,7 @@ msgstr "" msgid ":doc:`vinyl ` is the on-disk storage engine." msgstr ":doc:`vinyl ` — дисковый движок базы данных." -msgid "" -"All the details on" -" the engines you can find in the dedicated sections:" +msgid "All the details on the engines you can find in the dedicated sections:" msgstr "" -"Все подробности о " -"том, как работают движки, вы можете найти в следующих разделах:" +"Все подробности о том, как работают движки, вы можете найти в следующих " +"разделах:" diff --git a/locale/ru/LC_MESSAGES/concepts/engines/memtx.po b/locale/ru/LC_MESSAGES/concepts/engines/memtx.po index 4b3b29451c..fd2bbe0df7 100644 --- a/locale/ru/LC_MESSAGES/concepts/engines/memtx.po +++ b/locale/ru/LC_MESSAGES/concepts/engines/memtx.po @@ -46,13 +46,13 @@ msgstr "" msgid "Memory model" msgstr "Модель памяти" +#, fuzzy msgid "" -"There is a fixed number of independent :ref:`execution threads `. The threads don't share state. Instead they " -"exchange data using low-overhead message queues. While this approach limits " -"the number of cores that the instance uses, it removes competition for the " -"memory bus and ensures peak scalability of memory access and network " -"throughput." +"There is a fixed number of independent :ref:`execution threads " +"`. The threads don't share state. Instead they exchange data " +"using low-overhead message queues. While this approach limits the number of " +"cores that the instance uses, it removes competition for the memory bus and " +"ensures peak scalability of memory access and network throughput." msgstr "" "Есть фиксированное количество независимых :ref:`потоков выполнения `. У этих потоков нет общего состояния. Вместо этого " @@ -62,6 +62,7 @@ msgstr "" "обеспечивает максимальную масштабируемость доступа к памяти и пропускной " "способности сети." +#, fuzzy msgid "" "Only one thread, namely, the **transaction processor thread** (further, **TX" " thread**) can access the database, and there is only one TX thread for each" @@ -71,8 +72,8 @@ msgid "" "changes atomically. At commit time, a yield happens and all transaction " "changes are written to :ref:`WAL ` in a single batch. In case" " of errors during transaction execution, a transaction is rolled-back " -"completely. Read more in the following sections: :ref:`atomic-transactions`," -" :ref:`atomic-transactional-manager`." +"completely. Read more in the following sections: :ref:`transaction_model`, " +":ref:`txn_mode_transaction-manager`." msgstr "" "Обращаться к базе данных может только **поток обработчика транзакций** " "(далее — **поток TX**). В каждом экземпляре Tarantool есть только один такой" @@ -96,7 +97,8 @@ msgstr "" msgid "" "Data is stored in :term:`spaces `. Spaces contain database " "records—:term:`tuples `. To access and manipulate the data stored in " -"spaces and tuples, Tarantool builds :doc:`indexes `." +"spaces and tuples, Tarantool builds :doc:`indexes " +"`." msgstr "" "Данные хранятся в :term:`спейсах `. Спейсы содержат записи базы " "данных — :term:`кортежи `. Чтобы обращаться к данным, хранящимся в " @@ -121,15 +123,15 @@ msgstr "" ":doc:`руководстве ` по модулю " "``box.slab``." +#, fuzzy msgid "" "Also inside the TX thread, there is an event loop. Within the event loop, " "there are a number of :ref:`fibers `. Fibers are cooperative " -"primitives that allows interaction with spaces, that is, reading and " -"writting the data. Fibers can interact with the event loop and between each " -"other directly or by using special primitives called channels. Due to the " -"usage of fibers and :ref:`cooperative multitasking `, the ``memtx`` engine is lock-free in typical " -"situations." +"primitives that allow interaction with spaces, that is, reading and writing " +"the data. Fibers can interact with the event loop and between each other " +"directly or by using special primitives called channels. Due to the usage of" +" fibers and :ref:`cooperative multitasking `, " +"the ``memtx`` engine is lock-free in typical situations." msgstr "" "Внутри потока TX также есть цикл событий. Этот цикл содержит несколько " ":ref:`файберов ` — кооперативных примитивов, позволяющих " @@ -140,13 +142,14 @@ msgstr "" "cooperative_multitasking>` движок ``memtx``, как правило, свободен от " "блокировок." +#, fuzzy msgid "" "To interact with external users, there is a separate :ref:`network thread " -"` also called the **iproto thread**. The " -"iproto thread receives a request from the network, parses and checks the " -"statement, and transforms it into a special structure—a message containing " -"an executable statement and its options. Then the iproto thread ships this " -"message to the TX thread and runs the user's request in a separate fiber." +"` also called the **iproto thread**. The iproto thread " +"receives a request from the network, parses and checks the statement, and " +"transforms it into a special structure—a message containing an executable " +"statement and its options. Then the iproto thread ships this message to the " +"TX thread and runs the user's request in a separate fiber." msgstr "" "Чтобы взаимодействовать с внешними пользователями, используется отдельный " ":ref:`сетевой поток `, называемый также " @@ -281,7 +284,8 @@ msgid "" "For detailed information about indexes, refer to the " ":doc:`/concepts/data_model/indexes` page." msgstr "" -"Подробности про индексы можно найти на странице :doc:`/concepts/data_model/indexes`." +"Подробности про индексы можно найти на странице " +":doc:`/concepts/data_model/indexes`." msgid "Replicating data" msgstr "Репликация данных" diff --git a/locale/ru/LC_MESSAGES/concepts/engines/vinyl.po b/locale/ru/LC_MESSAGES/concepts/engines/vinyl.po index ec9ed68c0c..e2fb60a0b0 100644 --- a/locale/ru/LC_MESSAGES/concepts/engines/vinyl.po +++ b/locale/ru/LC_MESSAGES/concepts/engines/vinyl.po @@ -2,6 +2,7 @@ msgid "Storing data with vinyl" msgstr "Хранение данных с помощью vinyl" +#, python-format msgid "" "Tarantool is a transactional and persistent DBMS that maintains 100% of its " "data in RAM. The greatest advantages of in-memory databases are their speed " @@ -44,6 +45,7 @@ msgstr "" "популярных. Есть также несколько менее известных библиотек: WiredTiger, " "ForestDB, NestDB, LMDB." +#, python-format msgid "" "Nevertheless, after studying the source code of existing libraries and " "considering the pros and cons, we opted for our own storage engine. One " @@ -265,17 +267,13 @@ msgstr "DELETE" msgid "UPSERT" msgstr "UPSERT" -msgid "" -"Every statement is marked by LSN" -msgstr "" -"Для каждого оператора назначается LSN" +msgid "Every statement is marked by LSN" +msgstr "Для каждого оператора назначается LSN" -msgid "" -"Append-only files, garbage is collected " -"after a checkpoint" -msgstr "Обновление файлов происходит только " -"путем присоединения новых записей, сборка мусора проводится после " -"контрольной точки" +msgid "Append-only files, garbage is collected after a checkpoint" +msgstr "" +"Обновление файлов происходит только путем присоединения новых записей, " +"сборка мусора проводится после контрольной точки" msgid "Transactional log of all filesystem changes: vylog" msgstr "Журнал транзакций при любых изменениях в системе: vylog" @@ -781,6 +779,7 @@ msgstr "" "зарезервировать около 26 MБ доступной оперативной памяти, сократив реальный " "полезный размер L0 до 230 MБ." +#, fuzzy msgid "" "Tarantool does all of these calculations automatically, constantly updating " "the rolling average of the DBMS workload and the histogram of the disk " @@ -789,7 +788,7 @@ msgid "" "time is still possible. That’s why we also introduced an insertion timeout " "(the ``vinyl_timeout`` parameter), which is set to 60 seconds by default. " "The write operation itself is executed in dedicated threads. The number of " -"these threads (2 by default) is controlled by the ``vinyl_write_threads`` " +"these threads (4 by default) is controlled by the ``vinyl_write_threads`` " "parameter. The default value of 2 allows doing dumps and compactions in " "parallel, which is also necessary for ensuring system predictability." msgstr "" @@ -1037,6 +1036,7 @@ msgstr "" "вероятность того, что во всех битовых массивах одновременно произойдет " "коллизия, очень мала." +#, python-format msgid "" "The key advantage of Bloom filters in Tarantool is that they’re easily " "configurable. The only parameter that can be specified separately for each " @@ -1385,12 +1385,13 @@ msgstr "" "либо обновляют текущее время, редкие операции чтения. Нагрузочные тесты " "показали отличные результаты." +#, python-format msgid "" "Nevertheless, after a couple of days, the Tarantool process started eating " "up 100% of our CPU, and the system performance dropped close to zero." msgstr "" -"Тем не менее, после пары дней работы процесс Tarantool начал потреблять " -"100 % CPU, а производительность системы упала практически до нуля." +"Тем не менее, после пары дней работы процесс Tarantool начал потреблять 100 " +"% CPU, а производительность системы упала практически до нуля." msgid "" "We started digging into the issue and found out that the distribution of " @@ -1442,6 +1443,7 @@ msgstr "" "старое значение: его нужно независимо удалить из вторичных индексов, а " "вставка нового элемента может этого не сделать, оставив в индексе мусор." +#, python-format msgid "" "If secondary indexes are not unique, then collecting \"garbage\" from them " "can be put off until a compaction, which is what we do in Tarantool. The " diff --git a/locale/ru/LC_MESSAGES/concepts/index.po b/locale/ru/LC_MESSAGES/concepts/index.po index dcc4782aa8..8355838901 100644 --- a/locale/ru/LC_MESSAGES/concepts/index.po +++ b/locale/ru/LC_MESSAGES/concepts/index.po @@ -1,13 +1,183 @@ -msgid "Database" -msgstr "Функциональность СУБД" +msgid "Concepts" +msgstr "" + +msgid "Data model" +msgstr "" + +msgid "" +"Tarantool is a NoSQL database. It stores data in :ref:`spaces `, which can be thought of as tables in a relational database, and" +" :ref:`tuples `, which are analogous to rows. There are six" +" basic :ref:`data operations ` in Tarantool." +msgstr "" + +msgid "" +"The platform allows :ref:`describing the data schema ` but does not require it." +msgstr "" + +msgid "" +"Tarantool supports highly customizable :ref:`indexes ` of " +"various types." +msgstr "" + +msgid "" +"To ensure :ref:`data persistence ` and recover " +"quickly in case of failure, Tarantool uses mechanisms like the write-ahead " +"log (WAL) and snapshots." +msgstr "" + +msgid "For details, check the :ref:`Data model ` page." +msgstr "" + +msgid "Fibers and cooperative multitasking" +msgstr "" + +msgid "" +"Tarantool executes code in :ref:`fibers ` that " +"are managed via :ref:`cooperative multitasking `. Learn more about Tarantool's :ref:`thread model " +"`." +msgstr "" + +msgid "" +"For details, check the page :ref:`Fibers, yields, and cooperative " +"multitasking `." +msgstr "" + +msgid "Transactions" +msgstr "" + +msgid "" +"Tarantool's ACID-compliant :ref:`transaction model ` lets the user choose between two modes of transactions." +msgstr "" + +msgid "" +"The :ref:`default mode ` allows for fast monopolistic " +"atomic transactions. It doesn't support interactive transactions, and in " +"case of an error, all transaction changes are rolled back." +msgstr "" msgid "" -"In this chapter, we introduce the basic concepts of working with Tarantool " -"as a database manager." +"The :ref:`MVCC mode ` relies on a multi-" +"version concurrency control engine that allows yielding within a longer " +"transaction. This mode only works with the default in-memory :ref:`memtx " +"` storage engine." msgstr "" -"В данной главе мы рассмотрим основные понятия при работе с Tarantool в " -"качестве системы управления базой данных." -msgid "This chapter contains the following sections:" -msgstr "Эта глава состоит из следующих разделов:" +msgid "" +"For details, check the :ref:`Transactions ` page." +msgstr "" + +msgid "Application server" +msgstr "" + +msgid "" +"Using Tarantool as an application server, you can write applications in Lua," +" C, or C++. You can also create reusable :ref:`modules `." +msgstr "" + +msgid "" +"To increase the speed of code execution, Tarantool has a Lua Just-In-Time " +"compiler (LuaJIT) on board. LuaJIT compiles hot paths in the code -- paths " +"that are used many times -- thus making the application work faster. To " +"enable developers to work with LuaJIT, Tarantool provides tools like the " +":ref:`memory profiler ` and the :ref:`getmetrics " +"` module." +msgstr "" + +msgid "" +"For details on Tarantool's modular structure, check the :ref:`Modules " +"` page." +msgstr "" + +msgid "" +"To learn how to use Tarantool as an application server, refer to the " +":ref:`guides ` in the How-to section." +msgstr "" + +msgid "Sharding" +msgstr "" + +msgid "" +"Tarantool implements database sharding via the ``vshard`` module. For " +"details, go to the :ref:`Sharding ` page." +msgstr "" + +msgid "Triggers" +msgstr "" + +msgid "" +"Tarantool allows specifying callback functions that run upon certain " +"database events. They can be useful for resolving replication conflicts. For" +" details, go to the :ref:`Triggers ` page." +msgstr "" + +msgid "Replication" +msgstr "" + +msgid "" +"Replication allows keeping the data in copies of the same database for " +"better reliability." +msgstr "" + +msgid "" +"Several Tarantool instances can be organized in a replica set. They " +"communicate and transfer data via the :ref:`iproto ` binary protocol. Learn more about Tarantool's " +":ref:`replication architecture `." +msgstr "" + +msgid "" +"By default, replication in Tarantool is asynchronous. A transaction " +"committed locally on the master node may not get replicated onto other " +"instances before the client receives a success response. Thus, if the master" +" reports success and then dies, the client might not see the result of the " +"transaction." +msgstr "" + +msgid "" +"With :ref:`synchronous replication `, transactions on the master " +"node are not considered committed or successful before they are replicated " +"onto a number of instances. This is slower, but more reliable. Synchronous " +"replication in Tarantool is based on an :ref:`implementation of the RAFT " +"algorithm `." +msgstr "" + +msgid "For details, check the :ref:`Replication ` section." +msgstr "" + +msgid "Storage engines" +msgstr "" + +msgid "" +"A storage engine is a set of low-level routines that store and retrieve " +"values. Tarantool offers a choice of two storage engines:" +msgstr "" + +msgid "" +":ref:`memtx ` is the in-memory storage engine used by " +"default." +msgstr "" + +msgid ":ref:`vinyl ` is the on-disk storage engine." +msgstr "" + +msgid "" +"For details, check the :ref:`Storage engines ` section." +msgstr "" + +#~ msgid "Database" +#~ msgstr "Функциональность СУБД" + +#~ msgid "" +#~ "In this chapter, we introduce the basic concepts of working with Tarantool " +#~ "as a database manager." +#~ msgstr "" +#~ "В данной главе мы рассмотрим основные понятия при работе с Tarantool в " +#~ "качестве системы управления базой данных." + +#~ msgid "This chapter contains the following sections:" +#~ msgstr "Эта глава состоит из следующих разделов:" diff --git a/locale/ru/LC_MESSAGES/concepts/modules.po b/locale/ru/LC_MESSAGES/concepts/modules.po new file mode 100644 index 0000000000..e0690ef366 --- /dev/null +++ b/locale/ru/LC_MESSAGES/concepts/modules.po @@ -0,0 +1,65 @@ + +msgid "Modules" +msgstr "" + +msgid "" +"Any logic that is used in Tarantool can be packaged as an application or a " +"reusable **module**. A module is an optional library that extends Tarantool " +"functionality. It can be used by Tarantool applications or other modules. " +"Modules allow for easier code management and hot code reload without " +"restarting the Tarantool instance. Like applications, modules in Tarantool " +"can be written in Lua, C, or C++. Lua modules are also referred to as " +"\"rocks\"." +msgstr "" + +msgid "" +"For example, here is a Lua module named ``mymodule.lua`` that exports one " +"function named ``myfun``:" +msgstr "" + +msgid "" +"local exports = {}\n" +"exports.myfun = function(input_string)\n" +" print('Hello', input_string)\n" +"end\n" +"return exports" +msgstr "" + +msgid "" +"To launch the function ``myfun()`` -- from another module, from a Lua " +"application, or from Tarantool itself, -- save this module as a file, then " +"load this module with the ``require()`` directive and call the exported " +"function." +msgstr "" + +msgid "" +"For example, here's a Lua application that uses ``myfun()`` from " +"``mymodule.lua``:" +msgstr "" + +msgid "" +"-- loading the module\n" +"local mymodule = require('mymodule')\n" +"\n" +"-- calling myfun() from within test()\n" +"local test = function()\n" +" mymodule.myfun()\n" +"end" +msgstr "" + +msgid "" +"Tarantool provides an `extensive library " +"`_ of compatible modules. " +"Install them using Tarantool's CLI utility :ref:`tt `. Some modules " +"are also included in the Tarantool repository and can be installed via your " +"operating system's package manager." +msgstr "" + +msgid "Learn how to:" +msgstr "" + +msgid ":ref:`install a module `" +msgstr "" + +msgid ":ref:`contribute a module `" +msgstr "" diff --git a/locale/ru/LC_MESSAGES/concepts/replication/index.po b/locale/ru/LC_MESSAGES/concepts/replication/index.po index dd7025d1a7..08e03fa2ea 100644 --- a/locale/ru/LC_MESSAGES/concepts/replication/index.po +++ b/locale/ru/LC_MESSAGES/concepts/replication/index.po @@ -1,5 +1,6 @@ -msgid "Replication tutorials" +#, fuzzy +msgid "Replication" msgstr "Руководство по репликации" msgid "" @@ -7,10 +8,17 @@ msgid "" "same databases. The databases are kept in sync because each instance can " "communicate its changes to all the other instances." msgstr "" -"Механизм репликации позволяет сразу многим экземплярам Tarantool работать " -"с копиями одних и тех же баз данных. При этом все базы остаются в " +"Механизм репликации позволяет сразу многим экземплярам Tarantool работать с " +"копиями одних и тех же баз данных. При этом все базы остаются в " "синхронизированном состоянии благодаря тому, что каждый экземпляр может " "сообщать другим экземплярам о совершенных им изменениях." -msgid "This chapter includes the following sections:" +#, fuzzy +msgid "This section includes the following topics:" msgstr "Эта глава включает в себя следующие разделы:" + +msgid "" +"For practical guides to replication, see :ref:`Replication tutorials `. You can learn about bootstrapping a replica set, adding " +"instances to the replica set, or removing them." +msgstr "" diff --git a/locale/ru/LC_MESSAGES/concepts/replication/repl_architecture.po b/locale/ru/LC_MESSAGES/concepts/replication/repl_architecture.po index 7617489e78..3623559841 100644 --- a/locale/ru/LC_MESSAGES/concepts/replication/repl_architecture.po +++ b/locale/ru/LC_MESSAGES/concepts/replication/repl_architecture.po @@ -5,27 +5,32 @@ msgstr "Архитектура механизма репликации" msgid "Replication mechanism" msgstr "Механизм репликации" +msgid "Overview" +msgstr "" + +#, fuzzy msgid "" -"A pack of instances which operate on copies of the same databases make up a " -"**replica set**. Each instance in a replica set has a role, **master** or " +"A pack of instances that operate on copies of the same databases makes up a " +"**replica set**. Each instance in a replica set has a role: **master** or " "**replica**." msgstr "" "**Набор реплик** (replica set) -- это совокупность экземпляров, которые " "работают на копиях одной базы данных. У каждого экземпляра в наборе реплик " "есть роль: **мастер** или **реплика**." +#, fuzzy msgid "" "A replica gets all updates from the master by continuously fetching and " -"applying its :ref:`write ahead log (WAL) `. Each record in the" -" WAL represents a single Tarantool data-change request such as " -":ref:`INSERT `, :ref:`UPDATE ` or " -":ref:`DELETE `, and is assigned a monotonically growing log" -" sequence number (**LSN**). In essence, Tarantool replication is **row-" +"applying its :ref:`write-ahead log (WAL) `. Each record in " +"the WAL represents a single Tarantool data-change request such as " +":ref:`INSERT `, :ref:`UPDATE `, or " +":ref:`DELETE `, and is assigned a monotonically growing " +"log sequence number (**LSN**). In essence, Tarantool replication is **row-" "based**: each data-change request is fully deterministic and operates on a " -"single :ref:`tuple`. However, unlike a classical row-based " -"log, which contains entire copies of the changed rows, Tarantool's WAL " +"single :ref:`tuple `. However, unlike a classical row-based" +" log, which contains entire copies of the changed rows, Tarantool's WAL " "contains copies of the requests. For example, for UPDATE requests, Tarantool" -" only stores the primary key of the row and the update operations, to save " +" only stores the primary key of the row and the update operations to save " "space." msgstr "" "Реплика получает все обновления от мастера, постоянно запрашивая и применяя " @@ -38,15 +43,28 @@ msgstr "" " является **построчной**: каждая команда на изменение данных полностью " "детерминирована и относится к отдельному :ref:`кортежу`. " "Однако в отличие от типичного построчного журнала, который содержит копии " -"измененных строк полностью, WAL в Tarantool включает в себя копии " -"запросов. Например, для запросов типа UPDATE (обновление) Tarantool сохранит" -" только первичный ключ строки и операции обновления для экономии места." +"измененных строк полностью, WAL в Tarantool включает в себя копии запросов. " +"Например, для запросов типа UPDATE (обновление) Tarantool сохранит только " +"первичный ключ строки и операции обновления для экономии места." + +msgid "" +":ref:`WAL extensions ` available in Tarantool Enterprise " +"Edition enable you to add auxiliary information to each write-ahead log " +"record. This information might be helpful for implementing a CDC (Change " +"Data Capture) utility that transforms a data replication stream." +msgstr "" +msgid "" +"The following are specifics of adding different types of information to the " +"WAL:" +msgstr "" + +#, fuzzy msgid "" "Invocations of **stored programs** are not written to the WAL. Instead, " "records of the actual **data-change requests, performed by the Lua code**, " -"are written to the WAL. This ensures that possible non-determinism of Lua " -"does not cause replication to go out of sync." +"are written to the WAL. This ensures that the possible non-determinism of " +"Lua does not cause replication to go out of sync." msgstr "" "Вызовы **хранимых процедур** не регистрируются в журнале упреждающей записи." " Между тем, события по запросам **изменения фактических данных, которые " @@ -54,13 +72,14 @@ msgstr "" "недетерминированное выполнение Lua гарантированно не приведет к " "рассинхронизации." +#, fuzzy msgid "" -"Data definition operations on **temporary spaces**, such as " -"creating/dropping, adding indexes, truncating, etc., are written to the WAL," -" since information about temporary spaces is stored in non-temporary system " -"spaces, such as :ref:`box.space._space `. Data change " -"operations on temporary spaces are not written to the WAL and are not " -"replicated." +"Data definition operations on **temporary spaces** (:doc:`created " +"` with ``temporary = " +"true``), such as creating/dropping, adding indexes, and truncating, are " +"written to the WAL, since information about temporary spaces is stored in " +"non-temporary system spaces, such as :ref:`box.space._space `." msgstr "" "Операции по определению данных во **временных спейсах**, такие как " "создание/удаление, добавление индексов, усечение и т.д., регистрируются в " @@ -70,8 +89,14 @@ msgstr "" "журнале и не реплицируются." msgid "" -"Data change operations on **replication-local** spaces (spaces :doc:`created" -" ` with ``is_local = " +"Data change operations on temporary spaces are not written to the WAL and " +"are not replicated." +msgstr "" + +#, fuzzy +msgid "" +"Data change operations on **replication-local** spaces (:doc:`created " +"` with ``is_local = " "true``) are written to the WAL but are not replicated." msgstr "" "Операции по изменению данных в спейсах с **локальной репликацией** (спейсах," @@ -79,13 +104,24 @@ msgstr "" "параметром ``is_local = true``) не регистрируются в журнале и не " "реплицируются." +#, fuzzy +msgid "" +"To learn how to enable replication, check the :ref:`Bootstrapping a replica " +"set ` guide." +msgstr "" +"Чтобы узнать, как включить репликацию, перейдите на страницу " +":ref:`практическое руководство `." + +#, fuzzy +msgid "Replication stages" +msgstr "Механизм репликации" + +#, fuzzy msgid "" "To create a valid initial state, to which WAL changes can be applied, every " "instance of a replica set requires a start set of :ref:`checkpoint files " -"`, such as .snap files for memtx and .run files for " -"vinyl. A replica joining an existing replica set, chooses an existing master" -" and automatically downloads the initial state from it. This is called an " -"**initial join**." +"`, such as ``.snap`` files for memtx and ``.run`` " +"files for vinyl. A replica goes through the following stages:" msgstr "" "Чтобы создать подходящее начальное состояние, к которому можно применить " "изменения из WAL-файла, для каждого экземпляра из набора реплик должен быть " @@ -95,12 +131,16 @@ msgstr "" "автоматически загружает с него начальное состояние. Это называется " "**начальным включением**." +msgid "**Bootstrap** (optional)" +msgstr "" + +#, fuzzy msgid "" "When an entire replica set is bootstrapped for the first time, there is no " -"master which could provide the initial checkpoint. In such a case, replicas " -"connect to each other and elect a master, which then creates the starting " -"set of checkpoint files, and distributes it to all the other replicas. This " -"is called an **automatic bootstrap** of a replica set." +"master that could provide the initial checkpoint. In such a case, replicas " +"connect to each other and elect a master. The master creates the starting " +"set of checkpoint files and distributes them to all the other replicas. This" +" is called an **automatic bootstrap** of a replica set." msgstr "" "При первой настройке целого набора реплик нет мастера, который предоставил " "бы начальную контрольную точку. В таком случае реплики подключаются друг к " @@ -108,24 +148,45 @@ msgstr "" "контрольной точки и отправляет его всем репликам. Это называется " "**самонастройкой** набора реплик." +msgid "**Join**" +msgstr "" + +msgid "" +"At this stage, a replica downloads the initial state from the master. The " +"master register this replica in the :ref:`box.space._cluster ` space. If join fails with a non-critical :ref:`error " +"`, for example, ``ER_READONLY``, ``ER_ACCESS_DENIED``, or a " +"network-related issue, an instance tries to find a new master to join." +msgstr "" + +msgid "" +"On subsequent connections, a replica downloads all changes happened after " +"the latest local LSN (there can be many LSNs – each master has its own LSN)." +msgstr "" + +msgid "**Follow**" +msgstr "" + msgid "" -"When a replica contacts a master (there can be many masters) for the first " -"time, it becomes part of a replica set. On subsequent occasions, it should " -"always contact a master in the same replica set. Once connected to the " -"master, the replica requests all changes that happened after the latest " -"local LSN (there can be many LSNs -- each master has its own LSN)." +"At this stage, a replica fetches and applies updates from the master's " +"write-ahead log." msgstr "" -"Когда реплика впервые подключается к мастеру (может быть много мастеров), " -"она становится частью набора реплик. В последующих случаях она всегда должна" -" подключаться к мастеру в этом наборе реплик. После подключения к мастеру " -"реплика запрашивает все изменения, произошедшие с момента последнего " -"локального LSN (может быть много LSN -- у каждого мастера свой LSN)." +msgid "" +"You can use the :ref:`box.info.replication[n].upstream.status " +"` property to monitor the status of a replica." +msgstr "" + +msgid "Replica set and instance UUIDs" +msgstr "" + +#, fuzzy msgid "" "Each replica set is identified by a globally unique identifier, called the " -"**replica set UUID**. The identifier is created by the master which creates " -"the very first checkpoint, and is part of the checkpoint file. It is stored " -"in system space :ref:`box.space._schema `. For example:" +"**replica set UUID**. The identifier is created by the master, which creates" +" the very first checkpoint and is part of the checkpoint file. It is stored " +"in the :ref:`box.space._schema ` system space, for " +"example:" msgstr "" "Каждый набор реплик можно определить по глобально-уникальному " "идентификатору, который называется **UUID набора реплик**. Идентификатор " @@ -144,6 +205,7 @@ msgstr "" "- - ['cluster', '6308acb9-9788-42fa-8101-2e0cb9d3c9a0']\n" "..." +#, fuzzy msgid "" "Additionally, each instance in a replica set is assigned its own UUID, when " "it joins the replica set. It is called an **instance UUID** and is a " @@ -151,14 +213,14 @@ msgid "" "instances do not join a different replica set, e.g. because of a " "configuration error. A unique instance identifier is also necessary to apply" " rows originating from different masters only once, that is, to implement " -"multi-master replication. This is why each row in the write ahead log, in " +"multi-master replication. This is why each row in the write-ahead log, in " "addition to its log sequence number, stores the instance identifier of the " "instance on which it was created. But using a UUID as such an identifier " -"would take too much space in the write ahead log, thus a shorter integer " +"would take too much space in the write-ahead log, thus a shorter integer " "number is assigned to the instance when it joins a replica set. This number " -"is then used to refer to the instance in the write ahead log. It is called " -"**instance id**. All identifiers are stored in system space " -":ref:`box.space._cluster `. For example:" +"is then used to refer to the instance in the write-ahead log. It is called " +"**instance ID**. All identifiers are stored in the system space " +":ref:`box.space._cluster `, for example:" msgstr "" "Кроме того, каждому экземпляру в наборе реплик присваивается свой UUID, " "когда он включается в набор реплик. Такой глобально-уникальный идентификатор" @@ -216,28 +278,26 @@ msgstr "" "- {1: 827, 2: 584}\n" "..." +#, fuzzy msgid "" "Here ``vclock`` contains log sequence numbers (827 and 584) for instances " -"with instance IDs 1 and 2." +"with instance IDs ``1`` and ``2``." msgstr "" "Здесь ``vclock`` содержит номера записей в журнале (827 и 584) для " "экземпляров с идентификаторами экземпляра 1 и 2." +#, fuzzy msgid "" -"Starting in Tarantool 1.7.7, it is possible for administrators to assign the" -" instance UUID and the replica set UUID values, rather than let the system " -"generate them -- see the description of the :ref:`replicaset_uuid " -"` configuration parameter." +"If required, you can explicitly specify the instance and the replica set " +"UUID values rather than letting Tarantool generate them. To learn more, see " +"the :ref:`replicaset_uuid ` configuration " +"parameter description." msgstr "" "Начиная с Tarantool 1.7.7, появилась возможность для администраторов " "назначать UUID экземпляра и UUID набора реплик вместо сгенерированных " "системой значений -- см. описание конфигурационного параметра " ":ref:`replicaset_uuid `." -msgid "To learn how to enable replication, check the :ref:`how-to guide `." -msgstr "Чтобы узнать, как включить репликацию, перейдите на страницу " -":ref:`практическое руководство `." - msgid "Replication roles: master and replica" msgstr "Роли в репликации: мастер и реплика" @@ -265,8 +325,9 @@ msgstr "" " и расположен на одной машине, а другой -- реплика -- расположен на другой " "машине, дает два преимущества:" +#, fuzzy msgid "" -"**failover**, because if the master goes down then the replica can take " +"**failover**, because if the master goes down, then the replica can take " "over, and" msgstr "" "**восстановление после отказа**, поскольку в случае отказа мастера реплика " @@ -328,10 +389,11 @@ msgstr "" "репликах не играет важной роли (например, DELETE используется для отсечения " "устаревших данных), то конфигурация мастер-мастер также безопасна." +#, fuzzy msgid "" "UPDATE operations, however, can easily go out of sync. For example, " -"assignment and increment are not commutative, and may yield different " -"results if applied in different order on different instances." +"assignment and increment are not commutative and may yield different results" +" if applied in a different order on different instances." msgstr "" "Однако операции обновления UPDATE могут с легкостью привести к " "рассинхронизации. Например, операции присваивания и увеличения не обладают " @@ -345,29 +407,32 @@ msgid "" "about conflict-free replicated data types `here " "`_." msgstr "" -"В общем смысле, безопасно использовать репликацию мастер-мастер в " -"Tarantool, если все изменения в базе данных являются **коммутативными**: " -"конечный результат не зависит от порядка, в котором применяются изменения. " +"В общем смысле, безопасно использовать репликацию мастер-мастер в Tarantool," +" если все изменения в базе данных являются **коммутативными**: конечный " +"результат не зависит от порядка, в котором применяются изменения. " "Дополнительную информацию о бесконфликтных типах реплицируемых данных можно " "получить `здесь `_." -msgid "Replication topologies: cascade, ring and full mesh" +#, fuzzy +msgid "Replication topologies: cascade, ring, and full mesh" msgstr "Топологии репликации: каскадная, кольцевая и полная ячеистая" +#, fuzzy msgid "" "Replication topology is set by the :ref:`replication ` configuration parameter. The recommended topology is a **full " -"mesh**, because it makes potential failover easy." +"mesh** because it makes potential failover easy." msgstr "" "Топология репликации определяется в конфигурационном параметре " ":ref:`replication `. Рекомендована **полная " "ячеистая** конфигурация, поскольку она облегчает возможное восстановление " "после сбоя." +#, fuzzy msgid "" "Some database products offer **cascading replication** topologies: creating " -"a replica on a replica. Tarantool does not recommend such setup." +"a replica on a replica. Tarantool does not recommend such a setup." msgstr "" "Некоторые СУБД предлагают топологии **каскадной репликации**: создание " "реплики на реплике. Tarantool не рекомендует такие настройки." @@ -389,19 +454,21 @@ msgstr "" "мастер отклоняет подключения от таких экземпляров при изменении топологии " "репликации. Вот как это может произойти:" +#, fuzzy msgid "" "We have a chain of three instances. Instance #1 contains entries for " "instances #1 and #2 in its ``_cluster`` space. Instances #2 and #3 contain " -"entries for instances #1, #2 and #3 in their ``_cluster`` spaces." +"entries for instances #1, #2, and #3 in their ``_cluster`` spaces." msgstr "" "У нас есть цепочка из трех экземпляров. Экземпляр №1 содержит записи для " "экземпляров №1 и №2 в спейсе ``_cluster``. Экземпляры №2 и №3 содержат " "записи для экземпляров №1, №2 и №3 в своих спейсах ``_cluster``." +#, fuzzy msgid "" "Now instance #2 is faulty. Instance #3 tries connecting to instance #1 as " -"its new master, but the master refuses the connection since it has no entry " -"for instance #3." +"its new master, but the master refuses the connection since it has no entry," +" for example, #3." msgstr "" "Теперь экземпляр №2 неисправен. Экземпляр №3 пытается подключиться к " "экземпляру №1, как к новому мастеру, но мастер отклоняет подключение, " @@ -454,17 +521,30 @@ msgstr "Максимальное количество реплик в ячейк msgid "Orphan status" msgstr "Статус orphan (одиночный)" -msgid "" -"During ``box.cfg()``, an instance will try" -" to join all masters listed in :ref:`box.cfg.replication `. If the instance does not succeed with at least the number of " -"masters specified in :ref:`replication_connect_quorum `, then it will switch to " -":ref:`orphan status `." -msgstr "" -"Во время ``box.cfg()`` экземпляр пытается подключиться " -"ко всем мастерам, указанным в :ref:`box.cfg.replication `. Если не было успешно выполнено подключение к количеству " -"мастеров, указанному в :ref:`replication_connect_quorum `, " -"экземпляр переходит в :ref:`статус orphan (одиночный) `." +#, fuzzy +msgid "" +"During ``box.cfg()``, an instance tries to join all nodes listed in " +":ref:`box.cfg.replication `. If the instance " +"does not succeed in connecting to the required number of nodes (see " +":ref:`bootstrap_strategy `), it switches" +" to the :ref:`orphan status `." +msgstr "" +"Во время ``box.cfg()`` экземпляр пытается подключиться ко всем мастерам, " +"указанным в :ref:`box.cfg.replication `. Если " +"не было успешно выполнено подключение к количеству мастеров, указанному в " +":ref:`replication_connect_quorum `, экземпляр переходит в :ref:`статус orphan " +"(одиночный) `." + +#~ msgid "" +#~ "When a replica contacts a master (there can be many masters) for the first " +#~ "time, it becomes part of a replica set. On subsequent occasions, it should " +#~ "always contact a master in the same replica set. Once connected to the " +#~ "master, the replica requests all changes that happened after the latest " +#~ "local LSN (there can be many LSNs -- each master has its own LSN)." +#~ msgstr "" +#~ "Когда реплика впервые подключается к мастеру (может быть много мастеров), " +#~ "она становится частью набора реплик. В последующих случаях она всегда должна" +#~ " подключаться к мастеру в этом наборе реплик. После подключения к мастеру " +#~ "реплика запрашивает все изменения, произошедшие с момента последнего " +#~ "локального LSN (может быть много LSN -- у каждого мастера свой LSN)." diff --git a/locale/ru/LC_MESSAGES/concepts/replication/repl_leader_elect.po b/locale/ru/LC_MESSAGES/concepts/replication/repl_leader_elect.po index 82dc75c394..135962844d 100644 --- a/locale/ru/LC_MESSAGES/concepts/replication/repl_leader_elect.po +++ b/locale/ru/LC_MESSAGES/concepts/replication/repl_leader_elect.po @@ -15,9 +15,10 @@ msgstr "" "функциональность повышает отказоустойчивость систем на базе Tarantool и " "снижает зависимость от внешних инструментов для управления набором реплик." +#, fuzzy msgid "" -"To learn how to configure and monitor automated leader elections, " -"check the :ref:`how-to guide `." +"To learn how to configure and monitor automated leader elections, check " +":ref:`Managing leader elections `." msgstr "" "Чтобы узнать, как настраивать и отслеживать автоматические выборы лидера, " "прочитайте :ref:`практическое руководство `." @@ -59,6 +60,32 @@ msgstr "" " :ref:`этот раздел документации `. Процесс выборов лидера описан " "ниже." +msgid "" +"The system behavior can be specified exactly according to the Raft " +"algorithm. To do this:" +msgstr "" + +msgid "Ensure that the user has only synchronous spaces." +msgstr "" + +msgid "" +"Set the :ref:`replication.synchro_quorum " +"` option to ``N / 2 + " +"1``." +msgstr "" + +msgid "" +"Set the :ref:`replication.synchro_timeout " +"` option to infinity." +msgstr "" + +msgid "" +"In the :ref:`replication.election_fencing_mode " +"` option, select " +"either the ``soft`` mode (the default) or the ``strict`` mode, which is more" +" restrictive." +msgstr "" + msgid "Leader election process" msgstr "Процесс выборов лидера" @@ -88,8 +115,8 @@ msgstr "" "своего терма и начинает новый тур выборов." msgid "" -"Leader election happens via votes. The node that started the election votes" -" for itself and sends vote requests to other nodes. Upon receiving vote " +"Leader election happens via votes. The node that started the election votes " +"for itself and sends vote requests to other nodes. Upon receiving vote " "requests, a node votes for the first of them, and then cannot do anything in" " the same term but wait for a leader to be elected." msgstr "" @@ -98,27 +125,34 @@ msgstr "" "голосует за первый узел, от которого пришел такой запрос, и далее в течение " "всего терма ожидает избрания лидера, не выполняя никаких действий." +#, fuzzy msgid "" "The node that collected a quorum of votes defined by the " -":ref:`replication_synchro_quorum ` parameter " -"becomes the leader and notifies other nodes about that. Also, a split vote " -"can happen when no nodes received a quorum of votes. In this case, after a " -":ref:`random timeout `, each node increases its " -"term and starts a new election round if no new vote request with a greater " -"term arrives during this time. Eventually, a leader is elected." -msgstr "" -"Узел, собравший кворум голосов " -":ref:`replication_synchro_quorum `, становится" -" лидером и оповещает об этом другие узлы. Голоса могут разделиться, если ни " -"один узел не получит кворума. В этом случае спустя :ref:`случайное время " -"` происходят перевыборы: каждый узел увеличивает " -"значение терма и начинает новый тур, если за период ожидания не получил " -"запроса на голос от узла, чей терм больше. В итоге определяется лидер " -"кластера." +":ref:`replication.synchro_quorum " +"` parameter becomes the " +"leader and notifies other nodes about that. Also, a split vote can happen " +"when no nodes received a quorum of votes. In this case, after a random " +"timeout, each node increases its term and starts a new election round if no " +"new vote request with a greater term arrives during this time. Eventually, a" +" leader is elected." +msgstr "" +"Узел, собравший кворум голосов :ref:`replication_synchro_quorum " +"`, становится лидером и оповещает об этом другие " +"узлы. Голоса могут разделиться, если ни один узел не получит кворума. В этом" +" случае спустя :ref:`случайное время ` происходят " +"перевыборы: каждый узел увеличивает значение терма и начинает новый тур, " +"если за период ожидания не получил запроса на голос от узла, чей терм " +"больше. В итоге определяется лидер кластера." + +msgid "" +"If any unfinalized synchronous transactions are left from the previous " +"leader, the new leader finalizes them automatically." +msgstr "" +#, fuzzy msgid "" "All the non-leader nodes are called *followers*. The nodes that start a new " -"election round are alled *candidates*. The elected leader sends heartbeats " +"election round are called *candidates*. The elected leader sends heartbeats " "to the non-leader nodes to let them know it is alive." msgstr "" "Узлы, не являющиеся лидерами, называются *последователями* (followers). " @@ -126,14 +160,34 @@ msgstr "" "(candidates). Избранный лидер отправляет остальным узлам контрольные сигналы" " (heartbeats), оповещая о том, что он работает (alive)." +#, fuzzy msgid "" -"In case there are no heartbeats for the period of " -":ref:`replication_timeout ` * 4, " -"a non-leader node starts a new election if the following conditions are met: " +"In case there are no heartbeats for the period of :ref:`replication.timeout " +"` * 4, a non-leader node starts" +" a new election if the following conditions are met:" msgstr "" "Если контрольные сигналы не приходят в течение периода времени " ":ref:`replication_timeout ` * 4, узел, " -"не являющийся лидером, начинает новые выборы при соблюдении следующих условий: " +"не являющийся лидером, начинает новые выборы при соблюдении следующих " +"условий: " + +msgid "The node has a quorum of connections to other cluster members." +msgstr "" + +msgid "None of these cluster members can see the leader node." +msgstr "" + +msgid "" +"A cluster member considers the leader node to be alive if the member " +"received heartbeats from the leader at least once during the " +"``replication.timeout * 4``, and there are no replication errors (the " +"connection is not broken due to timeout or due to an error)." +msgstr "" + +msgid "" +"Terms and votes are persisted by each instance to preserve certain Raft " +"guarantees." +msgstr "" msgid "" "During the election, the nodes prefer to vote for those ones that have the " @@ -144,11 +198,12 @@ msgstr "" "новые данные. Поэтому, если прежний лидер перед тем, как стать недоступным, " "отправит кворуму реплик какую-либо информацию, она не будет потеряна." +#, fuzzy msgid "" -"When :ref:`election is enabled `, there must be " -"connections between each node pair so as it would be the full mesh topology." -" This is needed because election messages for voting and other internal " -"things need a direct connection between the nodes." +"When election is enabled, there must be connections between each node pair " +"so as it would be the full mesh topology. This is needed because election " +"messages for voting and other internal things need a direct connection " +"between the nodes." msgstr "" "Необходимо, чтобы все узлы, :ref:`включенные в процесс выборов " "`, были соединены попарно и образовывали полную " @@ -157,10 +212,80 @@ msgstr "" "узлами." msgid "" -"Also, if election is enabled on the node, it doesn't replicate from any nodes " -"except the newest leader. This is done to avoid the issue when a new leader " -"is elected, but the old leader has somehow survived and tries to send more " -"changes to the other nodes." +"In the classic Raft algorithm, a leader doesn't track its connectivity to " +"the rest of the cluster. Once the leader is elected, it considers itself in " +"the leader position until receiving a new term from another cluster node. " +"This can lead to a split situation if the other nodes elect a new leader " +"upon losing the connectivity to the previous one." +msgstr "" + +msgid "" +"The issue is resolved in Tarantool version :doc:`2.10.0 ` " +"by introducing the leader *fencing* mode. The mode can be switched by the " +":ref:`replication.election_fencing_mode " +"` configuration " +"parameter. When the fencing is set to ``soft`` or ``strict``, the leader " +"resigns its leadership if it has less than :ref:`replication.synchro_quorum " +"` of alive connections " +"to the cluster nodes. The resigning leader receives the status of a follower" +" in the current election term and becomes read-only. Leader *fencing* can be" +" turned off by setting the :ref:`replication.election_fencing_mode " +"` configuration " +"parameter to ``off``." +msgstr "" + +msgid "" +"In ``soft`` mode, a connection is considered dead if there are no responses " +"for :ref:`4 * replication.timeout " +"` seconds both on the current " +"leader and the followers." +msgstr "" + +msgid "" +"In ``strict`` mode, a connection is considered dead if there are no " +"responses for :ref:`2 * replication.timeout " +"` seconds on the current leader" +" and for :ref:`4 * replication.timeout " +"` seconds on the followers. " +"This improves chances that there is only one leader at any time." +msgstr "" + +msgid "" +"Fencing applies to the instances that have the " +":ref:`replication.election_mode " +"` set to \"candidate\" or" +" \"manual\"." +msgstr "" + +msgid "" +"There can still be a situation when a replica set has two leaders working " +"independently (so-called *split-brain*). It can happen, for example, if a " +"user mistakenly lowered the :ref:`replication.synchro_quorum " +"` below ``N / 2 + 1``. " +"In this situation, to preserve the data integrity, if an instance detects " +"the split-brain anomaly in the incoming replication data, it breaks the " +"connection with the instance sending the data and writes the " +"``ER_SPLIT_BRAIN`` error in the log." +msgstr "" + +msgid "" +"Eventually, there will be two sets of nodes with the diverged data, and any " +"node from one set is disconnected from any node from the other set with the " +"``ER_SPLIT_BRAIN`` error." +msgstr "" + +msgid "" +"Once noticing the error, a user can choose any representative from each of " +"the sets and inspect the data on them. To correlate the data, the user " +"should remove it from the nodes of one set, and reconnect them to the nodes " +"from the other set that have the correct data." +msgstr "" + +msgid "" +"Also, if election is enabled on the node, it doesn't replicate from any " +"nodes except the newest leader. This is done to avoid the issue when a new " +"leader is elected, but the old leader has somehow survived and tries to send" +" more changes to the other nodes." msgstr "" "Любой узел, участвующий в процессе выборов, реплицирует данные только с " "последнего избранного лидера. Это позволяет избежать ситуации, в которой " @@ -168,12 +293,144 @@ msgstr "" "реплики." msgid "" -"Term numbers also work as a kind of filter. For example, " -"if election is enabled on two nodes and ``node1`` has the term number " -"less than ``node2``, then ``node2`` doesn't accept any transactions from " -"``node1``." +"Term numbers also work as a kind of filter. For example, if election is " +"enabled on two nodes and ``node1`` has the term number less than ``node2``, " +"then ``node2`` doesn't accept any transactions from ``node1``." msgstr "" "Числовые значения термов также выполняют функцию своеобразного фильтра. " "Например, если на двух узлах включена функция выборов и значение терма " "``node1`` меньше значения терма ``node2``, то узел ``node2`` не будет " "принимать транзакций от узла ``node1``." + +#, fuzzy +msgid "Managing leader elections" +msgstr "Автоматические выборы лидера" + +msgid "Configuration" +msgstr "" + +msgid "" +"replication:\n" +" election_mode: \n" +" election_fencing_mode: \n" +" election_timeout: \n" +" timeout: \n" +" synchro_quorum: " +msgstr "" + +msgid "" +":ref:`replication.election_mode " +"` -- specifies the role " +"of a node in the leader election process." +msgstr "" + +msgid "" +":ref:`replication.election_fencing_mode " +"` -- specifies " +"the :ref:`leader fencing mode `." +msgstr "" + +msgid "" +":ref:`replication.election_timeout " +"` -- specifies the " +"timeout between election rounds if the previous round ended up with a split " +"vote." +msgstr "" + +msgid "" +":ref:`replication.timeout ` -- " +"a time interval (in seconds) used by a master to send heartbeat requests to " +"a replica when there are no updates to send to this replica." +msgstr "" + +msgid "" +":ref:`replication.synchro_quorum " +"` -- a number of " +"replicas that should confirm the receipt of a :ref:`synchronous `" +" transaction before it can finish its commit." +msgstr "" + +msgid "" +"It is important to know that being a leader is not the only requirement for " +"a node to be writable. The leader should also satisfy the following " +"requirements:" +msgstr "" + +msgid "" +"The :ref:`database.mode ` option is " +"set to ``rw``." +msgstr "" + +msgid "The leader shouldn't be in the orphan state." +msgstr "" + +msgid "" +"Nothing prevents you from setting the ``database.mode`` option to ``ro``, " +"but the leader won't be writable then. The option doesn't affect the " +"election process itself, so a read-only instance can still vote and become a" +" leader." +msgstr "" + +msgid "Monitoring" +msgstr "" + +msgid "" +"To monitor the current state of a node regarding the leader election, use " +"the :doc:`box.info.election ` " +"function." +msgstr "" + +msgid "**Example:**" +msgstr "" + +msgid "" +"tarantool> box.info.election\n" +"---\n" +"- state: follower\n" +" vote: 0\n" +" leader: 0\n" +" term: 1\n" +"..." +msgstr "" + +msgid "" +"The Raft-based election implementation logs all its actions with the " +"``RAFT:`` prefix. The actions are new Raft message handling, node state " +"changing, voting, and term bumping." +msgstr "" + +msgid "Important notes" +msgstr "" + +msgid "" +"Leader election doesn't work correctly if the election quorum is set to less" +" or equal than `` / 2``. In that case, a split vote can lead " +"to a state when two leaders are elected at once." +msgstr "" + +msgid "" +"For example, suppose there are five nodes. When the quorum is set to ``2``, " +"``node1`` and ``node2`` can both vote for ``node1``. ``node3`` and ``node4``" +" can both vote for ``node5``. In this case, ``node1`` and ``node5`` both win" +" the election. When the quorum is set to the cluster majority, that is " +"``( / 2) + 1`` or greater, the split vote is impossible." +msgstr "" + +msgid "" +"That should be considered when adding new nodes. If the majority value is " +"changing, it's better to update the quorum on all the existing nodes before " +"adding a new one." +msgstr "" + +msgid "" +"Also, the automated leader election doesn't bring many benefits in terms of " +"data safety when used *without* :ref:`synchronous replication `. " +"If the replication is asynchronous and a new leader gets elected, the old " +"leader is still active and considers itself the leader. In such case, " +"nothing stops it from accepting requests from clients and making " +"transactions. Non-synchronous transactions are successfully committed " +"because they are not checked against the quorum of replicas. Synchronous " +"transactions fail because they are not able to collect the quorum -- most of" +" the replicas reject these old leader's transactions since it is not a " +"leader anymore." +msgstr "" diff --git a/locale/ru/LC_MESSAGES/concepts/replication/repl_sync.po b/locale/ru/LC_MESSAGES/concepts/replication/repl_sync.po index 3940ed0ff9..53ff88a6bb 100644 --- a/locale/ru/LC_MESSAGES/concepts/replication/repl_sync.po +++ b/locale/ru/LC_MESSAGES/concepts/replication/repl_sync.po @@ -28,11 +28,9 @@ msgstr "" " только тогда клиенту приходит ответ о завершении транзакции." msgid "" -"To learn how to enable and use synchronous replication, " -"check the :ref:`guide `." +"To enable synchronous replication, use the :ref:`space_opts.is_sync " +"` option when creating or altering a space." msgstr "" -"Подробная информация о включении и настройке синхронной репликации " -"приведена в :ref:`соответствующем руководстве `." msgid "Synchronous and asynchronous transactions" msgstr "Синхронные и асинхронные транзакции" @@ -53,26 +51,26 @@ msgid "" "be blocked by the existing synchronous transactions. This behavior is very " "similar to a regular queue of asynchronous transactions because all the " "transactions are committed in the same order as they make the " -":ref:`box.commit() ` call. So, here comes **the commit rule**: transactions are " -"committed in the same order as they make the ``box.commit()`` " -"call -- regardless of being synchronous or asynchronous." +":ref:`box.commit() ` call. So, here comes **the commit rule**: " +"transactions are committed in the same order as they make the " +"``box.commit()`` call -- regardless of being synchronous or asynchronous." msgstr "" "Если наряду с несколькими синхронными транзакциями, ожидающими репликации, " "совершается асинхронная транзакция, она блокируется синхронными. Коммиты при" " этом выполняются в той последовательности, в которой для каждой из " -"транзакций вызывается метод :ref:`box.commit() `. Похожим образом работает " -"обычная очередь асинхронных транзакций. Можно сформулировать **правило " -"коммитов**: порядок коммитов соответствует порядку вызова ``box.commit()`` " -"для каждой из транзакций, независимо от того, синхронные транзакции или " -"асинхронные." +"транзакций вызывается метод :ref:`box.commit() `. Похожим " +"образом работает обычная очередь асинхронных транзакций. Можно " +"сформулировать **правило коммитов**: порядок коммитов соответствует порядку " +"вызова ``box.commit()`` для каждой из транзакций, независимо от того, " +"синхронные транзакции или асинхронные." msgid "" "If one of the waiting synchronous transactions times out and is rolled back," " it will first roll back all the newer pending transactions. Again, just " "like how asynchronous transactions are rolled back when WAL write fails. So," " here comes **the rollback rule:** transactions are always rolled back in " -"the order reversed from the one they make the ``box.commit()`` " -"call -- regardless of being synchronous or asynchronous." +"the order reversed from the one they make the ``box.commit()`` call -- " +"regardless of being synchronous or asynchronous." msgstr "" "Если для одной из синхронных транзакций истечет время ожидания, эта " "транзакция будет отменена, а вместе с ней и все последующие транзакции в " @@ -85,8 +83,8 @@ msgid "" "One more important thing is that if an asynchronous transaction is blocked " "by a synchronous transaction, it does not become synchronous as well. This " "just means it will wait for the synchronous transaction to be committed. But" -" once it is done, the asynchronous transaction will be committed " -"immediately -- it won't wait for being replicated itself." +" once it is done, the asynchronous transaction will be committed immediately" +" -- it won't wait for being replicated itself." msgstr "" "Асинхронная транзакция, заблокированная синхронной, не становится сама " "синхронной, а просто ожидает коммита синхронной транзакции. Как только это " @@ -96,32 +94,33 @@ msgstr "" msgid "" "Be careful when using synchronous and asynchronous transactions together. " "Asynchronous transactions are considered committed even if there is no " -"connection to other nodes. Therefore, an old leader node " -"(:ref:`synchronous transaction queue owner `) might have " -"some committed asynchronous transactions that no other replica set member has." +"connection to other nodes. Therefore, an old leader node (:ref:`synchronous " +"transaction queue owner `) might have some committed " +"asynchronous transactions that no other replica set member has." msgstr "" -"Будьте осторожны при одновременном использовании синхронных и асинхронных транзакций. " -"Для асинхронных транзакций коммит засчитывается успешным даже в том случае, если нет " -"соединения с другими узлами. Поэтому на старом ``leader``-узле " -"(:ref:`владельце очереди синхронных транзакций `) могут быть " -"асинхронные транзакции, которые прошли коммит, но отсутствуют на других узлах набора реплик." +"Будьте осторожны при одновременном использовании синхронных и асинхронных " +"транзакций. Для асинхронных транзакций коммит засчитывается успешным даже в " +"том случае, если нет соединения с другими узлами. Поэтому на старом " +"``leader``-узле (:ref:`владельце очереди синхронных транзакций " +"`) могут быть асинхронные транзакции, которые прошли " +"коммит, но отсутствуют на других узлах набора реплик." msgid "" -"When the connection to such an old (previous) leader node is restored, " -"it starts receiving data from the new leader. At the same time, " -"other replica set members receive the data from the previous leader that they don't have yet. " -"The data from the previous leader contains some committed asynchronous transactions. " -"At this time, the integrity protection " -"will throw the :ref:`ER_SPLIT_BRAIN ` error, " -"which will force the user to rebootstrap the previous leader." +"When the connection to such an old (previous) leader node is restored, it " +"starts receiving data from the new leader. At the same time, other replica " +"set members receive the data from the previous leader that they don't have " +"yet. The data from the previous leader contains some committed asynchronous " +"transactions. At this time, the integrity protection will throw the " +":ref:`ER_SPLIT_BRAIN ` error, which will force" +" the user to rebootstrap the previous leader." msgstr "" -"Когда предыдущий лидер снова становится доступен в наборе реплик, " -"он начинает получать данные с нового лидера. В это же время " -"остальные узлы в наборе реплик начинают получать данные со старого лидера, которых у них еще нет. " -"Эти данные содержат и асинхронные транзакции, прошедшие коммит. " -"В этот момент система выдаст ошибку " -":ref:`ER_SPLIT_BRAIN `, заставляя " -"пользователя провести повторную настройку (rebootstrap) предыдущего лидера." +"Когда предыдущий лидер снова становится доступен в наборе реплик, он " +"начинает получать данные с нового лидера. В это же время остальные узлы в " +"наборе реплик начинают получать данные со старого лидера, которых у них еще " +"нет. Эти данные содержат и асинхронные транзакции, прошедшие коммит. В этот " +"момент система выдаст ошибку :ref:`ER_SPLIT_BRAIN " +"`, заставляя пользователя провести повторную " +"настройку (rebootstrap) предыдущего лидера." msgid "Limitations and known problems" msgstr "Ограничения и известные проблемы" @@ -146,10 +145,11 @@ msgstr "" "синхронные транзакции должен совершать только один узел." msgid "" -"Since Tarantool :doc:`2.10.0 `, anonymous replicas " -"do not participate in the quorum." +"Since Tarantool :doc:`2.10.0 `, anonymous replicas do not " +"participate in the quorum." msgstr "" -"Начиная с версии Tarantool :doc:`2.10.0 `, анонимные реплики не участвуют в кворуме." +"Начиная с версии Tarantool :doc:`2.10.0 `, анонимные " +"реплики не участвуют в кворуме." msgid "Leader election" msgstr "Выборы лидера" @@ -164,3 +164,10 @@ msgstr "" " функциональность для управления автоматическими выборами лидера (automated " "leader election) в наборе реплик. Подробности можно найти в " ":ref:`соответствующей главе `." + +#~ msgid "" +#~ "To learn how to enable and use synchronous replication, check the " +#~ ":ref:`guide `." +#~ msgstr "" +#~ "Подробная информация о включении и настройке синхронной репликации приведена" +#~ " в :ref:`соответствующем руководстве `." diff --git a/locale/ru/LC_MESSAGES/concepts/sharding/index.po b/locale/ru/LC_MESSAGES/concepts/sharding/index.po index 461f137557..fd2c3b74b9 100644 --- a/locale/ru/LC_MESSAGES/concepts/sharding/index.po +++ b/locale/ru/LC_MESSAGES/concepts/sharding/index.po @@ -1,4 +1,7 @@ +msgid "Sharding" +msgstr "" + msgid "" "Scaling databases in a growing project is often considered one of the most " "challenging issues. Once a single server cannot withstand the load, scaling " @@ -14,10 +17,11 @@ msgid "" " which implies that a dataset is partitioned and distributed over multiple " "servers." msgstr "" -"**Шардирование** -- это архитектурый принцип баз данных, который позволяет их `горизонтально масштабировать " +"**Шардирование** -- это архитектурый принцип баз данных, который позволяет " +"их `горизонтально масштабировать " "`_," -" что означает разбиение набора даных на части и распределение их по нескольким " -"серверам." +" что означает разбиение набора даных на части и распределение их по " +"нескольким серверам." msgid "" "With Tarantool's `vshard `_ module, the" @@ -78,15 +82,18 @@ msgstr "" "хранилища для приложений с поддержкой шардинга." msgid "" -"Check out the :ref:`quick start guide ` or " -"learn more about :ref:`how sharding works ` in Tarantool:" +"Check out the :ref:`quick start guide ` or learn more " +"about :ref:`how sharding works ` in Tarantool:" msgstr "" -"Начните с :ref:`руководства по быстрому запуску ` " -"или узнайте подробности об :ref:`архитектуре шардирования ` в Tarantool:" +"Начните с :ref:`руководства по быстрому запуску ` или " +"узнайте подробности об :ref:`архитектуре шардирования `" +" в Tarantool:" msgid "" -"You can also find out more about :ref:`sharding administration ` " -"or dive into the ``vshard`` configuration and API :ref:`reference `." +"You can also find out more about :ref:`sharding administration ` or dive into the ``vshard`` configuration and API :ref:`reference " +"`." msgstr "" -"Ознакомьтесь с :ref:`руководством администратора ` по шардированию " -"или перейдите к :ref:`справочнику ` по конфигурации и API модуля ``vshard``." +"Ознакомьтесь с :ref:`руководством администратора ` по " +"шардированию или перейдите к :ref:`справочнику ` по конфигурации и " +"API модуля ``vshard``." diff --git a/locale/ru/LC_MESSAGES/concepts/sharding/vshard_architecture.po b/locale/ru/LC_MESSAGES/concepts/sharding/vshard_architecture.po index bfa5e6e727..2d6aad93fa 100644 --- a/locale/ru/LC_MESSAGES/concepts/sharding/vshard_architecture.po +++ b/locale/ru/LC_MESSAGES/concepts/sharding/vshard_architecture.po @@ -114,9 +114,8 @@ msgid "" "total number of buckets." msgstr "" "Секционирование набора данных происходит с помощью сегментного ключа (или " -"**идентификатора сегмента** (bucket id) в терминах Tarantool). " -"Идентификатор сегмента -- это число от 1 до N, где N -- это общее количество" -" сегментов." +"**идентификатора сегмента** (bucket id) в терминах Tarantool). Идентификатор" +" сегмента -- это число от 1 до N, где N -- это общее количество сегментов." msgid "" "Each replica set stores a unique subset of buckets. One bucket cannot belong" @@ -381,10 +380,11 @@ msgstr "" "обеспечивает равномерное распределение сегментов по шардам. Во время " "балансировки происходит миграция сегментов по наборам реплик." +#, fuzzy msgid "" "The rebalancer \"wakes up\" periodically and redistributes data from the " "most loaded nodes to less loaded nodes. Rebalancing starts if the " -"**disbalance threshold** of a replica set exceeds a disbalance threshold " +"**replicaset disbalance** of a replica set exceeds a disbalance threshold " "specified in the configuration." msgstr "" "Балансировщик периодически \"просыпается\" и перераспределяет данные из " @@ -392,7 +392,8 @@ msgstr "" "начинается, когда **предел дисбаланса** в наборе реплик превышает предел " "дисбаланса, указанный в конфигурации." -msgid "The disbalance threshold is calculated as follows:" +#, fuzzy +msgid "The replicaset disbalance is calculated as follows:" msgstr "Предел дисбаланса рассчитывается следующим образом:" msgid "" diff --git a/locale/ru/LC_MESSAGES/concepts/triggers.po b/locale/ru/LC_MESSAGES/concepts/triggers.po index 0054e22c57..f7cfb2a291 100644 --- a/locale/ru/LC_MESSAGES/concepts/triggers.po +++ b/locale/ru/LC_MESSAGES/concepts/triggers.po @@ -14,8 +14,8 @@ msgid "" "To associate an event with a callback, pass the callback to the " "corresponding :samp:`on_{event}` function:" msgstr "" -"Чтобы связать событие с колбэк-функцией, передайте её в " -"соответствующую функцию обработки событий :samp:`on_{event}`:" +"Чтобы связать событие с колбэк-функцией, передайте её в соответствующую " +"функцию обработки событий :samp:`on_{event}`:" msgid "" ":doc:`/reference/reference_lua/box_session/on_connect` or " @@ -87,8 +87,8 @@ msgid "" "permanent, put function definitions and trigger settings into Tarantool's " ":ref:`initialization script `." msgstr "" -"Триггеры хранятся в памяти экземпляра Tarantool, а не в базе данных. " -"Поэтому триггеры пропадают, когда экземпляр отключают. Чтобы сохранить их, " +"Триггеры хранятся в памяти экземпляра Tarantool, а не в базе данных. Поэтому" +" триггеры пропадают, когда экземпляр отключают. Чтобы сохранить их, " "поместите определения функции и настройки триггера в :ref:`скрипт " "инициализации ` Tarantool." @@ -110,20 +110,21 @@ msgstr "" "определили." msgid "" -"Triggers must work within the event context, that is, operate variables passed " -"as the trigger function arguments. Triggers should not affect the global state " -"of the program or change things unrelated to the event. If a trigger performs " -"such calls as, for example, `os.exit() `_ " -"or :doc:`/reference/reference_lua/box_txn_management/rollback`, the result of " +"Triggers must work within the event context, that is, operate variables " +"passed as the trigger function arguments. Triggers should not affect the " +"global state of the program or change things unrelated to the event. If a " +"trigger performs such calls as, for example, `os.exit() " +"`_ or " +":doc:`/reference/reference_lua/box_txn_management/rollback`, the result of " "its execution is undefined." msgstr "" -"Триггеры должны работать в контексте события, то есть оперировать переменными, " -"которые переданы как аргументы его функции. Триггеры не должны влиять на " -"глобальное состояние программы или менять параметры, не связанные с событием. " -"Если триггер выполняет такие вызовы, как, например, " -"`os.exit() `_ " -"или :doc:`/reference/reference_lua/box_txn_management/rollback`, " -"результат его выполнения не определен." +"Триггеры должны работать в контексте события, то есть оперировать " +"переменными, которые переданы как аргументы его функции. Триггеры не должны " +"влиять на глобальное состояние программы или менять параметры, не связанные " +"с событием. Если триггер выполняет такие вызовы, как, например, `os.exit() " +"`_ или " +":doc:`/reference/reference_lua/box_txn_management/rollback`, результат его " +"выполнения не определен." msgid "" "Triggers are replaceable. The request to \"redefine a trigger\" implies " diff --git a/locale/ru/LC_MESSAGES/contributing/contributing.po b/locale/ru/LC_MESSAGES/contributing/contributing.po index 56f5963ed3..12f5c05a7d 100644 --- a/locale/ru/LC_MESSAGES/contributing/contributing.po +++ b/locale/ru/LC_MESSAGES/contributing/contributing.po @@ -142,6 +142,7 @@ msgid "" " that will help you get comfortable with the tool." msgstr "" +#, python-format msgid "" "See the `list of tasks " "`_ for " @@ -190,11 +191,11 @@ msgid "" msgstr "" msgid "" -"Some projects, like `Tarantool Cartridge " -"`_, have their documentation in the" -" code repository. This is done on purpose, so the developers themselves can " -"update it faster. You can find instructions for building such documentation " -"in the code repository." +"Some Tarantool projects have their documentation in the code repository. " +"This is typical for modules, for example, `metrics " +"`_. This is done on purpose, so the " +"developers themselves can update it faster. You can find instructions for " +"building such documentation in the code repository." msgstr "" msgid "" @@ -238,11 +239,6 @@ msgid "" " collecting metrics." msgstr "" -msgid "" -"`cartridge `_: Framework for writing" -" distributed applications." -msgstr "" - msgid "Official modules are provided in our organization on GitHub." msgstr "" @@ -267,6 +263,7 @@ msgid "" " of your interest." msgstr "" +#, python-format msgid "" "Check the `currently open tasks " "`_" @@ -336,21 +333,12 @@ msgid "" "coding-points-to-check>`_ before making your first commit." msgstr "" -msgid "Here are two ways to suggest a patch:" -msgstr "" - -msgid "" -"(preferred) Using the fork and pull mechanism on GitHub: Make changes to " -"your copy of the repository and submit it to us for review. Check the " -"`GitHub documentation `__ to learn " -"how to do it." -msgstr "" - msgid "" -"Suggest a patch via the mailing list. This is where our developers discuss " -"most features. Learn more in :ref:`the article on submitting patches " -"`." +"You can suggest a patch using the fork and pull mechanism on GitHub: Make " +"changes to your copy of the repository and submit it to us for review. Check" +" the `GitHub documentation `__ to " +"learn how to do it." msgstr "" msgid "How to write tests" @@ -460,14 +448,8 @@ msgid "Here are some of the tools created by the Tarantool team:" msgstr "" msgid "" -"`ansible-cartridge `_: an " -"Ansible role to deploy Cartridge applications." -msgstr "" - -msgid "" -"`cartridge-cli `_: a CLI utility" -" for creating applications, launching clusters locally on Cartridge, and " -"solving operation problems." +"`tt `_: a CLI utility for creating and " +"managing Tarantool applications." msgstr "" msgid "" @@ -519,3 +501,44 @@ msgid "" " application in 1 day and either give you the rights or tell you what else " "needs to be done." msgstr "" + +#~ msgid "" +#~ "Some projects, like `Tarantool Cartridge " +#~ "`_, have their documentation in the" +#~ " code repository. This is done on purpose, so the developers themselves can " +#~ "update it faster. You can find instructions for building such documentation " +#~ "in the code repository." +#~ msgstr "" + +#~ msgid "" +#~ "`cartridge `_: Framework for writing" +#~ " distributed applications." +#~ msgstr "" + +#~ msgid "Here are two ways to suggest a patch:" +#~ msgstr "" + +#~ msgid "" +#~ "(preferred) Using the fork and pull mechanism on GitHub: Make changes to " +#~ "your copy of the repository and submit it to us for review. Check the " +#~ "`GitHub documentation `__ to learn " +#~ "how to do it." +#~ msgstr "" + +#~ msgid "" +#~ "Suggest a patch via the mailing list. This is where our developers discuss " +#~ "most features. Learn more in :ref:`the article on submitting patches " +#~ "`." +#~ msgstr "" + +#~ msgid "" +#~ "`ansible-cartridge `_: an " +#~ "Ansible role to deploy Cartridge applications." +#~ msgstr "" + +#~ msgid "" +#~ "`cartridge-cli `_: a CLI utility" +#~ " for creating applications, launching clusters locally on Cartridge, and " +#~ "solving operation problems." +#~ msgstr "" diff --git a/locale/ru/LC_MESSAGES/contributing/docs/api.po b/locale/ru/LC_MESSAGES/contributing/docs/api.po new file mode 100644 index 0000000000..02603268c2 --- /dev/null +++ b/locale/ru/LC_MESSAGES/contributing/docs/api.po @@ -0,0 +1,447 @@ + +msgid "Documenting the API" +msgstr "" + +msgid "" +"This document contains general guidelines for describing the Tarantool API, " +"as well as examples and templates." +msgstr "" + +msgid "Style" +msgstr "" + +msgid "" +"Please write as simply as possible. Describe functionality using short " +"sentences in the present simple tense. A short sentence consists of no more " +"than two clauses. Consider using `LanguageTool `_" +" or `Grammarly `_ to check your English. For " +"more style-related specifics, consult the :doc:`Language and style " +"` section." +msgstr "" + +msgid "Indicating the version" +msgstr "" + +msgid "" +"For every new module, function, or method, specify the version it first " +"appears in." +msgstr "" + +msgid "" +"For a new parameter, specify the version it first appears in if this " +"parameter is a \"feature\" and the version it's been introduced in differs " +"from the version introducing the function/method and all other parameters." +msgstr "" + +msgid "To specify the version, use the following Sphinx directive:" +msgstr "" + +msgid "" +"Since :doc:`2.10.0 `.\n" +"This is a link to the release notes on the Tarantool documentation website." +msgstr "" + +msgid "The result looks like this:" +msgstr "" + +msgid "" +"Since Tarantool :doc:`2.10.0 `. This is a link to the " +"release notes on the Tarantool documentation website." +msgstr "" + +msgid "Language of the general description" +msgstr "" + +msgid "Use one of the two options:" +msgstr "" + +msgid "Start with a verb in the imperative mood. Example: *Create a fiber.*" +msgstr "" + +msgid "" +"Start with a noun. Example: *The directory where memtx stores snapshot " +"files.*" +msgstr "" + +msgid "Checklist" +msgstr "" + +msgid "" +"Each list item is a characteristic to be described. Some items can be " +"optional." +msgstr "" + +msgid "Function or method" +msgstr "" + +msgid ":ref:`Since which Tarantool version `" +msgstr "" + +msgid ":ref:`General description `" +msgstr "" + +msgid ":ref:`Parameters `" +msgstr "" + +msgid "What this function returns (if nothing, write 'none')" +msgstr "" + +msgid "Return type (if exists)" +msgstr "" + +msgid ":ref:`Possible errors ` (if exist)" +msgstr "" + +msgid "" +":ref:`Complexity factors ` (for :doc:`CRUD " +"operations ` and :doc:`index access " +"functions `)" +msgstr "" + +msgid "Usage with memtx and vinyl (if differs)" +msgstr "" + +msgid "Example(s)" +msgstr "" + +msgid "Extra information (if needed)" +msgstr "" + +msgid "" +"See :ref:`module function example `," +" :ref:`class method example `." +msgstr "" + +msgid "Data" +msgstr "" + +msgid "Return type" +msgstr "" + +msgid "Example" +msgstr "" + +msgid "See :ref:`class data example `." +msgstr "" + +msgid "Function and method parameters" +msgstr "" + +msgid "" +":ref:`Since which Tarantool version ` (if " +"added later)" +msgstr "" + +msgid "Type" +msgstr "" + +msgid "Default value (if optional), possible values" +msgstr "" + +msgid "" +"If the parameter is optional, make sure it is enclosed in square brackets in" +" the function declaration (in the \"heading\"). Do not mark parameters " +"additionaly as \"optional\" or \"required\":" +msgstr "" + +msgid "" +".. function:: format(URI-components-table[, include-password])\n" +"\n" +" Construct a URI from components.\n" +"\n" +" :param URI-components-table: a series of ``name:value`` pairs, one for each component\n" +" :param include-password: boolean. If this is supplied and is ``true``, then\n" +" the password component is rendered in clear text,\n" +" otherwise it is omitted." +msgstr "" + +msgid "Configuration parameters" +msgstr "" + +msgid "" +"Configuration parameters are not to be confused with class and method " +"parameters. Configuration parameters are passed to Tarantool via the command" +" line or in an initialization file. You can find a list of Tarantool " +"configuration parameters in the :doc:`configuration reference " +"`." +msgstr "" + +msgid "Corresponding environment variable (if applicable)" +msgstr "" + +msgid "Default value" +msgstr "" + +msgid "" +"Possible values (can be included in the general description, for example, as" +" a list)" +msgstr "" + +msgid "Dynamic (yes or no)" +msgstr "" + +msgid "" +"See :ref:`configuration parameter example `." +msgstr "" + +msgid "Documenting possible errors" +msgstr "" + +msgid "" +"In the \"Possible errors\" section of a function or class method, consider " +"explaining what happens if any parameter hasn't been defined or has the " +"wrong value." +msgstr "" + +msgid "Examples and templates" +msgstr "" + +msgid "Module functions" +msgstr "" + +msgid "" +"We use the Sphinx directives ``.. module::`` and ``.. function::`` to " +"describe functions of Tarantool modules:" +msgstr "" + +msgid "" +".. module:: fiber\n" +"\n" +".. function:: create(function [, function-arguments])\n" +"\n" +" Create and start a fiber. The fiber is created and begins to run immediately.\n" +"\n" +" :param function: the function to be associated with the fiber\n" +" :param function-arguments: what will be passed to function.\n" +"\n" +" :return: created fiber object\n" +" :rtype: userdata\n" +"\n" +" **Example:**\n" +"\n" +" .. code-block:: tarantoolsession\n" +"\n" +" tarantool> fiber = require('fiber')\n" +" ---\n" +" ...\n" +" tarantool> function function_name()\n" +" > print(\"I'm a fiber\")\n" +" > end\n" +" ---\n" +" ...\n" +" tarantool> fiber_object = fiber.create(function_name); print(\"Fiber started\")\n" +" I'm a fiber\n" +" Fiber started\n" +" ---\n" +" ...\n" +msgstr "" + +msgid "The resulting output looks like this:" +msgstr "" + +msgid "" +"Create and start a fiber. The fiber is created and begins to run " +"immediately." +msgstr "" + +msgid "Parameters" +msgstr "" + +msgid "the function to be associated with the fiber" +msgstr "" + +msgid "what will be passed to function." +msgstr "" + +msgid "return" +msgstr "" + +msgid "created fiber object" +msgstr "" + +msgid "rtype" +msgstr "" + +msgid "userdata" +msgstr "" + +msgid "**Example:**" +msgstr "" + +msgid "" +"tarantool> fiber = require('fiber')\n" +"---\n" +"...\n" +"tarantool> function function_name()\n" +" > print(\"I'm a fiber\")\n" +" > end\n" +"---\n" +"...\n" +"tarantool> fiber_object = fiber.create(function_name); print(\"Fiber started\")\n" +"I'm a fiber\n" +"Fiber started\n" +"---\n" +"..." +msgstr "" + +msgid "Class methods and data" +msgstr "" + +msgid "" +"Methods are described similarly to functions, but the ``.. class::`` " +"directive, unlike ``.. module::``, requires nesting." +msgstr "" + +msgid "" +"As for data, it's enough to write the description, the return type, and an " +"example." +msgstr "" + +msgid "" +"Here is the example documentation describing the method and data of the " +"``index_object`` class:" +msgstr "" + +msgid "" +".. class:: index_object\n" +"\n" +" .. method:: get(key)\n" +"\n" +" Search for a tuple :ref:`via the given index `.\n" +"\n" +" :param index_object index_object: :ref:`object reference\n" +" `\n" +" :param scalar/table key: values to be matched against the index key\n" +"\n" +" :return: the tuple whose index-key fields are equal to the passed key values\n" +" :rtype: tuple\n" +"\n" +" **Possible errors:**\n" +"\n" +" * No such index\n" +" * Wrong type\n" +" * More than one tuple matches\n" +"\n" +" **Complexity factors:** index size, index type.\n" +" See also :ref:`space_object:get() `.\n" +"\n" +" **Example:**\n" +"\n" +" .. code-block:: tarantoolsession\n" +"\n" +" tarantool> box.space.tester.index.primary:get(2)\n" +" ---\n" +" - [2, 'Music']\n" +" ...\n" +"\n" +" .. data:: unique\n" +"\n" +" True if the index is unique, false if the index is not unique.\n" +"\n" +" :rtype: boolean\n" +"\n" +" .. code-block:: tarantoolsession\n" +"\n" +" tarantool> box.space.tester.index.primary.unique\n" +" ---\n" +" - true\n" +" ...\n" +msgstr "" + +msgid "And the resulting output looks like this:" +msgstr "" + +msgid "Search for a tuple :ref:`via the given index `." +msgstr "" + +msgid ":ref:`object reference `" +msgstr "" + +msgid "values to be matched against the index key" +msgstr "" + +msgid "the tuple whose index-key fields are equal to the passed key values" +msgstr "" + +msgid "tuple" +msgstr "" + +msgid "**Possible errors:**" +msgstr "" + +msgid "No such index" +msgstr "" + +msgid "Wrong type" +msgstr "" + +msgid "More than one tuple matches" +msgstr "" + +msgid "" +"**Complexity factors:** index size, index type. See also " +":ref:`space_object:get() `." +msgstr "" + +msgid "" +"tarantool> box.space.tester.index.primary:get(2)\n" +"---\n" +"- [2, 'Music']\n" +"..." +msgstr "" + +msgid "True if the index is unique, false if the index is not unique." +msgstr "" + +msgid "boolean" +msgstr "" + +msgid "" +"tarantool> box.space.tester.index.primary.unique\n" +"---\n" +"- true\n" +"..." +msgstr "" + +msgid "Example:" +msgstr "" + +msgid "" +".. confval:: wal_dir\n" +"\n" +" Since version 1.6.2.\n" +" A directory where write-ahead log (.xlog) files are stored. Can be relative\n" +" to :ref:`work_dir `. Sometimes ``wal_dir`` and\n" +" :ref:`memtx_dir ` are specified with different values, so\n" +" that write-ahead log files and snapshot files can be stored on different\n" +" disks. If not specified, defaults to ``work_dir``.\n" +"\n" +" | Type: string\n" +" | Default: \".\"\n" +" | Environment variable: TT_WAL_DIR\n" +" | Dynamic: no\n" +msgstr "" + +msgid "Result:" +msgstr "" + +msgid "" +"Since version 1.6.2. A directory where write-ahead log (.xlog) files are " +"stored. Can be relative to :ref:`work_dir `. Sometimes " +"``wal_dir`` and :ref:`memtx_dir ` are specified with " +"different values, so that write-ahead log files and snapshot files can be " +"stored on different disks. If not specified, defaults to ``work_dir``." +msgstr "" + +msgid "Type: string" +msgstr "" + +msgid "Default: \".\"" +msgstr "" + +msgid "Environment variable: TT_WAL_DIR" +msgstr "" + +msgid "Dynamic: no" +msgstr "" diff --git a/locale/ru/LC_MESSAGES/contributing/docs/build.po b/locale/ru/LC_MESSAGES/contributing/docs/build.po index 5e507003cb..a5696dd221 100644 --- a/locale/ru/LC_MESSAGES/contributing/docs/build.po +++ b/locale/ru/LC_MESSAGES/contributing/docs/build.po @@ -1,3 +1,279 @@ msgid "Building Tarantool Docs" msgstr "" + +msgid "How to build Tarantool documentation using Docker" +msgstr "" + +msgid "See `Docker `_" +msgstr "" + +msgid "Prepare for work" +msgstr "" + +msgid "First of all, pull the image for building the docs." +msgstr "" + +msgid "docker pull tarantool/doc-builder:fat-4.3" +msgstr "" + +msgid "Next, initialize a Makefile for your OS:" +msgstr "" + +msgid "" +"docker run --rm -it -v $(pwd):/doc tarantool/doc-builder:fat-4.3 sh -c " +"\"cmake .\"" +msgstr "" + +msgid "Update submodules and generate documentation sources from code" +msgstr "" + +msgid "" +"A big part of documentation sources comes from several other projects, " +"connected as Git submodules. To include their latest contents in the docs, " +"run these two steps." +msgstr "" + +msgid "Update the submodules:" +msgstr "" + +msgid "" +"git submodule update --init\n" +"git fetch --recurse-submodules\n" +"git submodule update --remote --checkout" +msgstr "" + +msgid "" +"This will initialize Git submodules and update them to the top of the stable" +" branch in each repository." +msgstr "" + +msgid "" +"``git submodule update`` can sometimes fail, for example, when you have " +"changes in submodules' files. You can reinitialize submodules to fix the " +"problem." +msgstr "" + +msgid "**Caution:** all untracked changes in submodules will be lost!" +msgstr "" + +msgid "" +"git submodule deinit -f .\n" +"git submodule update --init" +msgstr "" + +msgid "" +"Note that there's an option to update submodule repositories with a ``make``" +" command. However, it's intended for use in a CI environment and not on a " +"local machine." +msgstr "" + +msgid "" +"docker run --rm -it -v $(pwd):/doc tarantool/doc-builder:fat-4.3 sh -c " +"\"make pull-modules\"" +msgstr "" + +msgid "Build the submodules content:" +msgstr "" + +msgid "" +"docker run --rm -it -v $(pwd):/doc tarantool/doc-builder:fat-4.3 sh -c " +"\"make build-modules\"" +msgstr "" + +msgid "This command will do two things:" +msgstr "" + +msgid "Generate documentation source files from the source code" +msgstr "" + +msgid "Copy these files to the right places under the ``./doc/`` directory." +msgstr "" + +msgid "" +"If you're editing submodules locally, repeat this step to view the updated " +"results." +msgstr "" + +msgid "Now you're ready to build and preview the documentation locally." +msgstr "" + +msgid "Build and run the documentation on your machine" +msgstr "" + +msgid "" +"When editing the documentation, you can set up a live-reload server. It will" +" build your documentation and serve it on `127.0.0.1:8000 " +"`_. Every time you make changes in the source files, " +"it will rebuild the docs and refresh the browser page." +msgstr "" + +msgid "" +"docker run --rm -it -p 8000:8000 -v $(pwd):/doc tarantool/doc-" +"builder:fat-4.3 sh -c \"make autobuild\"" +msgstr "" + +msgid "" +"First build will take some time. When it's done, open `127.0.0.1:8000 " +"`_ in the browser. Now when you make changes, they " +"will be rebuilt in a few seconds, and the browser tab with preview will " +"reload automatically." +msgstr "" + +msgid "" +"You can also build the docs manually with ``make html``, and then serve them" +" using python3 built-in server:" +msgstr "" + +msgid "" +"docker run --rm -it -v $(pwd):/doc tarantool/doc-builder:fat-4.3 sh -c \"make html\"\n" +"docker run --rm -it -v $(pwd):/doc tarantool/doc-builder:fat-4.3 sh -c \"make html-ru\"\n" +"python3 -m http.server --directory output/html" +msgstr "" + +msgid "or python2 built-in server:" +msgstr "" + +msgid "" +"cd output/html\n" +"python -m SimpleHTTPServer" +msgstr "" + +msgid "then go to `localhost:8000 `_ in your browser." +msgstr "" + +msgid "" +"There are other commands which can run in the ``tarantool/doc-builder`` " +"container:" +msgstr "" + +msgid "" +"docker run --rm -it -v $(pwd):/doc tarantool/doc-builder:fat-4.3 sh -c \"make html\"\n" +"docker run --rm -it -v $(pwd):/doc tarantool/doc-builder:fat-4.3 sh -c \"make html-ru\"\n" +"docker run --rm -it -v $(pwd):/doc tarantool/doc-builder:fat-4.3 sh -c \"make singlehtml\"\n" +"docker run --rm -it -v $(pwd):/doc tarantool/doc-builder:fat-4.3 sh -c \"make singlehtml-ru\"\n" +"docker run --rm -it -v $(pwd):/doc tarantool/doc-builder:fat-4.3 sh -c \"make pdf\"\n" +"docker run --rm -it -v $(pwd):/doc tarantool/doc-builder:fat-4.3 sh -c \"make pdf-ru\"\n" +"docker run --rm -it -v $(pwd):/doc tarantool/doc-builder:fat-4.3 sh -c \"make json\"\n" +"docker run --rm -it -v $(pwd):/doc tarantool/doc-builder:fat-4.3 sh -c \"make json-ru\"\n" +"docker run --rm -it -v $(pwd):/doc tarantool/doc-builder:fat-4.3 sh -c \"make epub\"\n" +"docker run --rm -it -v $(pwd):/doc tarantool/doc-builder:fat-4.3 sh -c \"make epub-ru\"\n" +"docker run --rm -it -v $(pwd):/doc tarantool/doc-builder:fat-4.3 sh -c \"make update-po\"" +msgstr "" + +msgid "Linkcheck" +msgstr "" + +msgid "" +"There's a specific build mode which checks internal and external links " +"instead of producing a document." +msgstr "" + +msgid "" +"docker run --rm -it -v $(pwd):/doc tarantool/doc-builder:fat-4.3 sh -c " +"\"make linkcheck\"" +msgstr "" + +msgid "" +"If you need to save the linkcheck's report in a file, you can use the " +"following trick:" +msgstr "" + +msgid "" +"docker run --rm -it -v $(pwd):/doc tarantool/doc-builder:fat-4.3 sh -c " +"\"make linkcheck\" 2>&1 | tee linkcheck.log" +msgstr "" + +msgid "" +"Here ``2>&1`` redirects the ``stderr`` output to ``stdout``, and then " +"``tee`` both shows in on screen and writes to a file." +msgstr "" + +msgid "Vale" +msgstr "" + +msgid "" +"Tarantool documentation uses the Vale linter for checking grammar, style, " +"and word usage. Its configuration is placed in the ``vale.ini`` file located" +" in the root project directory." +msgstr "" + +msgid "" +"To enable RST support in Vale, you need to install Sphinx. Then, you can " +"enable Vale integration in your IDE, for example:" +msgstr "" + +msgid "" +"`VS Code `_" +msgstr "" + +msgid "" +"`IntelliJ-based IDEs `_" +msgstr "" + +msgid "Localization" +msgstr "" + +msgid "Terms:" +msgstr "" + +msgid "" +"**translation unit** (TU) is an atomic piece of text which can be " +"translated. A paragraph, a list item, a heading, image's alt-text and so on." +msgstr "" + +msgid "" +"**translation source files** are the files with translation units in English" +" only. They're located in ``locale/en``." +msgstr "" + +msgid "" +"**translation files** are the files which match original text to translated " +"text. They're located in ``locale/ru``." +msgstr "" + +msgid "To update the translation files, run the `make update-po` task:" +msgstr "" + +msgid "" +"docker run --rm -it -v $(pwd):/doc tarantool/doc-builder:fat-4.3 sh -c " +"\"make update-po\"" +msgstr "" + +msgid "" +"Translate the strings in the updated files and then commit the changes." +msgstr "" + +msgid "How to contribute" +msgstr "" + +msgid "" +"To contribute to documentation, use the `REST " +"`_ format for" +" drafting and submit your updates as a `pull request " +"`_ via GitHub." +msgstr "" + +msgid "" +"To comply with the writing and formatting style, use the `guidelines " +"`_ provided in " +"the documentation, common sense and existing documents." +msgstr "" + +msgid "Notes:" +msgstr "" + +msgid "" +"If you suggest creating a new documentation section (a whole new page), it " +"has to be saved to the relevant section at GitHub." +msgstr "" + +msgid "" +"If you want to contribute to localizing this documentation (for example, " +"into Russian), add your translation strings to ``.po`` files stored in the " +"corresponding locale directory (for example, ``/locale/ru/LC_MESSAGES/`` for" +" Russian). See more about localizing with Sphinx at http://www.sphinx-" +"doc.org/en/stable/intl.html." +msgstr "" diff --git a/locale/ru/LC_MESSAGES/contributing/docs/git.po b/locale/ru/LC_MESSAGES/contributing/docs/git.po new file mode 100644 index 0000000000..ab6c97a755 --- /dev/null +++ b/locale/ru/LC_MESSAGES/contributing/docs/git.po @@ -0,0 +1,187 @@ + +msgid "Git workflow" +msgstr "" + +msgid "Branching" +msgstr "" + +msgid "" +"Use one branch for a single task, unless you're fixing typos or markup on " +"several pages. Long commit histories are hard to manage and sometimes end up" +" stale." +msgstr "" + +msgid "" +"Start a new branch from the last commit on ``latest``. Make sure to update " +"your local version of ``latest`` with ``git pull``. Otherwise, you may have " +"to rebase later." +msgstr "" + +msgid "Name your branch so it's clear what you're doing. Examples:" +msgstr "" + +msgid "``short-issue-description``" +msgstr "" + +msgid "``gh-1234-short-issue-description``" +msgstr "" + +msgid "``your-github-handle/short-issue-description``" +msgstr "" + +msgid "" +"It is not recommended to submit PRs to the `documentation repository " +"`__ from forks. Because of a GitHub " +"failsafe mechanism, it is impossible to view changes from a fork on the " +"development website." +msgstr "" + +msgid "" +"Creating branches directly in the repository results in a more convenient " +"workflow." +msgstr "" + +msgid "Linking issues and PRs" +msgstr "" + +msgid "When a PR is linked to an issue:" +msgstr "" + +msgid "" +"You can go from the issue straight to the PR by clicking the link in the " +"right column." +msgstr "" + +msgid "The issue will be automatically closed when you close the PR." +msgstr "" + +msgid "" +"Specify the issue(s) you want to close in the description of your PR. GitHub" +" will connect them if you use specific `keywords " +"`__. Here are some of them:" +msgstr "" + +msgid "Closes #1234" +msgstr "" + +msgid "Resolves #1234" +msgstr "" + +msgid "Fixes #1234" +msgstr "" + +msgid "If your PR closes more than one issue, mention each of them:" +msgstr "" + +msgid "Resolves #1300, resolves #1234, resolves tarantool/doc#100" +msgstr "" + +msgid "Commit messages" +msgstr "" + +msgid "" +"Most of the time, one-line commit messages are sufficient for documentation " +"changes." +msgstr "" + +msgid "" +"When you squash commits at merge, the resulting commit message is a sum of " +"all commit messages in the PR. It is advised to include the \"resolves\" " +"string in the first commit. Otherwise, there's a risk that this line won't " +"be included in the merge commit." +msgstr "" + +msgid "" +"Convey the nature of the change and possibly the reason why it was made." +msgstr "" + +msgid "" +"Don't specify the files you've changed or the issue you're working on. The " +"file names can be looked up in the \"Files\" section of the PR, and the PR " +"description has the issue number(s)." +msgstr "" + +msgid "Try keeping the commit title 50 characters or shorter." +msgstr "" + +msgid "Use the imperative mood." +msgstr "" + +msgid "Start with a capital letter, don't add ending punctuation." +msgstr "" + +msgid "" +"(Optional) Use the telegraphic style, or \"headlinese\", dropping the " +"articles." +msgstr "" + +msgid "Good examples" +msgstr "" + +msgid "``git commit -m \"Expand section on msgpack\"``" +msgstr "" + +msgid "``git commit -m \"Add details on IPROTO_BALLOT\"``" +msgstr "" + +msgid "``git commit -m \"Create new structure\"``" +msgstr "" + +msgid "``git commit -m \"Improve grammar\"``" +msgstr "" + +msgid "Bad examples" +msgstr "" + +msgid "``git commit -m \"Fix gh-2007, second commit\"``" +msgstr "" + +msgid "``git commit -m “Changed the file box_protocol.rst”``" +msgstr "" + +msgid "``git commit -m \"added more list items\"``" +msgstr "" + +msgid "Selecting a reviewer" +msgstr "" + +msgid "" +"Ideally, a PR should have two reviewers: a subject matter expert (SME) and a" +" documentarian. The SME checks the facts, and the documentarian checks the " +"language and style." +msgstr "" + +msgid "If you're not sure who the SME for an issue is, try the following:" +msgstr "" + +msgid "" +"Check the issue description. The SME is often mentioned there explicitly." +msgstr "" + +msgid "Note who created the issue and who was involved in the discussion." +msgstr "" + +msgid "Merging" +msgstr "" + +msgid "" +"Merge when your document is ready and good enough. For external " +"contributors, merging is blocked until a reviewer's approval." +msgstr "" + +msgid "Always squash commits." +msgstr "" + +msgid "" +"Make sure the commit message mentions all relevant issues with \"resolves\" " +"or \"fixes\"." +msgstr "" + +msgid "" +"Make sure you've `attributed `__ all participants with " +"``Co-authored-by``." +msgstr "" diff --git a/locale/ru/LC_MESSAGES/contributing/docs/images.po b/locale/ru/LC_MESSAGES/contributing/docs/images.po new file mode 100644 index 0000000000..d1c9fde289 --- /dev/null +++ b/locale/ru/LC_MESSAGES/contributing/docs/images.po @@ -0,0 +1,126 @@ + +msgid "Images" +msgstr "" + +msgid "" +"Images are useful in explanations of concepts and structures. When you " +"introduce a term or describe a structure of multiple interconnected parts " +"(such as a cluster), consider illustrating it with a diagram. If you are " +"explaining how to use a GUI, check if a screenshot can make the doc clearer." +msgstr "" + +msgid "" +"Note that illustrations should complement the text, not replace it. Even " +"with an image, the text should be enough for readers to understand the " +"topic." +msgstr "" + +msgid "" +"Don't overuse images: they are harder to support than text. Use them only if" +" they bring an obvious benefit." +msgstr "" + +msgid "Diagrams" +msgstr "" + +msgid "" +"There is a basic set of diagram elements -- blocks, arrows, and other -- to " +"use in Tarantool docs. It is stored in `this Miro board " +"`_. It also provides basic rules " +"for creating diagrams." +msgstr "" + +msgid "Size" +msgstr "" + +msgid "There are two sizes of diagram elements:" +msgstr "" + +msgid "" +"**M** – bigger elements to use in diagrams with a small number of elements." +msgstr "" + +msgid "" +"**S** – smaller elements to use in diagrams with a big number of elements." +msgstr "" + +msgid "" +"Avoid changing the size of diagram elements unless it's absolutely " +"necessary." +msgstr "" + +msgid "" +"The diagrams should have the same width. This guarantees that their elements" +" have the same size on pages. The examples in the Miro board have frames of " +"the right width. Copy the frame and and place your diagram in it without " +"changing the frame width." +msgstr "" + +msgid "Exporting" +msgstr "" + +msgid "To save the diagram to a file:" +msgstr "" + +msgid "" +"Make the frame transparent so that it isn't shown in the resulting image " +"(set its color to \"no color\")." +msgstr "" + +msgid "" +"Select all elements together with the frame and click **Copy as image** in " +"the context menu (under the three dots). The image will be copied to the " +"clipboard." +msgstr "" + +msgid "" +"Paste the image from the clipboard to any graphic editor, for example, GIMP." +msgstr "" + +msgid "Remove the Miro logo in the bottom right corner." +msgstr "" + +msgid "Export/save the image to PNG." +msgstr "" + +msgid "Screenshots" +msgstr "" + +msgid "Take screenshots with any tool you like." +msgstr "" + +msgid "Ensure screenshot consistency on the page:" +msgstr "" + +msgid "" +"Screenshots must show the same environment: operating system, product " +"version, visual theme, and so on." +msgstr "" + +msgid "" +"The configuration and data must be consistent. For example, if you've shown " +"spaces with data on a screenshot, subsequent screenshots must have the same " +"data, too." +msgstr "" + +msgid "" +"Size and resolution must be the same across the page unless you want to zoom" +" in to a specific part of the screen." +msgstr "" + +msgid "Markup" +msgstr "" + +msgid "Insert the images using the ``image`` directive:" +msgstr "" + +msgid "" +".. image:: images/example_diagram.png\n" +" :alt: Example diagram alt text" +msgstr "" + +msgid "Result:" +msgstr "" + +msgid "Example diagram alt text" +msgstr "" diff --git a/locale/ru/LC_MESSAGES/contributing/docs/infra.po b/locale/ru/LC_MESSAGES/contributing/docs/infra.po index 323a0cfa18..961410cee5 100644 --- a/locale/ru/LC_MESSAGES/contributing/docs/infra.po +++ b/locale/ru/LC_MESSAGES/contributing/docs/infra.po @@ -15,9 +15,8 @@ msgid "" "The documentation source files are mainly stored in the `documentation " "repository `_. However, in some cases, " "they are stored in the repositories of other Tarantool-related products or " -"modules---`Cartridge `_, `Monitoring" -" `__, and " -"others." +"modules, such as `Monitoring " +"`__." msgstr "" msgid "" @@ -116,40 +115,49 @@ msgid "" "start from the documentation repository root directory." msgstr "" -msgid "cartridge_cli" -msgstr "" - -msgid "" -"The content source file for the ``cartridge_cli`` submodule is " -"``README.rst``, located in the directory of the submodule repository. In the" -" final documentation view, the content should appear here: " -"``https://www.tarantool.io/en/doc/latest/book/cartridge/cartridge_cli/``." -msgstr "" - -msgid "Create a directory at ``./doc/book/cartridge/cartridge_cli``." -msgstr "" - -msgid "" -"Copy ``./modules/cartridge_cli/README.rst`` to " -"``./doc/book/cartridge/cartridge_cli/index.rst``." -msgstr "" - -msgid "Here ar the corresponding settings in ``build_submodules.sh``:" -msgstr "" - -msgid "" -"rst_dest=\"${project_root}/doc/book/cartridge\"\n" -"cartridge_cli_root=\"${project_root}/modules/cartridge-cli\"\n" -"cartridge_cli_dest=\"${rst_dest}/cartridge_cli\"\n" -"cartridge_cli_index_dest=\"${cartridge_cli_dest}/index.rst\"\n" -"\n" -"mkdir -p \"${cartridge_cli_dest}\"\n" -"yes | cp -rf \"${cartridge_cli_root}/README.rst\" \"${cartridge_cli_index_dest}\"" -msgstr "" - msgid "3. Update .gitignore" msgstr "" msgid "" "Finally, add paths to the copied directories and files to ``.gitignore``." msgstr "" + +#~ msgid "" +#~ "The documentation source files are mainly stored in the `documentation " +#~ "repository `_. However, in some cases, " +#~ "they are stored in the repositories of other Tarantool-related products or " +#~ "modules---`Cartridge `_, `Monitoring" +#~ " `__, and " +#~ "others." +#~ msgstr "" + +#~ msgid "cartridge_cli" +#~ msgstr "" + +#~ msgid "" +#~ "The content source file for the ``cartridge_cli`` submodule is " +#~ "``README.rst``, located in the directory of the submodule repository. In the" +#~ " final documentation view, the content should appear here: " +#~ "``https://www.tarantool.io/en/doc/latest/book/cartridge/cartridge_cli/``." +#~ msgstr "" + +#~ msgid "Create a directory at ``./doc/book/cartridge/cartridge_cli``." +#~ msgstr "" + +#~ msgid "" +#~ "Copy ``./modules/cartridge_cli/README.rst`` to " +#~ "``./doc/book/cartridge/cartridge_cli/index.rst``." +#~ msgstr "" + +#~ msgid "Here ar the corresponding settings in ``build_submodules.sh``:" +#~ msgstr "" + +#~ msgid "" +#~ "rst_dest=\"${project_root}/doc/book/cartridge\"\n" +#~ "cartridge_cli_root=\"${project_root}/modules/cartridge-cli\"\n" +#~ "cartridge_cli_dest=\"${rst_dest}/cartridge_cli\"\n" +#~ "cartridge_cli_index_dest=\"${cartridge_cli_dest}/index.rst\"\n" +#~ "\n" +#~ "mkdir -p \"${cartridge_cli_dest}\"\n" +#~ "yes | cp -rf \"${cartridge_cli_root}/README.rst\" \"${cartridge_cli_index_dest}\"" +#~ msgstr "" diff --git a/locale/ru/LC_MESSAGES/contributing/docs/localization/glossaries.po b/locale/ru/LC_MESSAGES/contributing/docs/localization/glossaries.po index 3259781f40..199e08f268 100644 --- a/locale/ru/LC_MESSAGES/contributing/docs/localization/glossaries.po +++ b/locale/ru/LC_MESSAGES/contributing/docs/localization/glossaries.po @@ -2,9 +2,6 @@ msgid "Glossaries" msgstr "" -msgid "Tarantool Core" -msgstr "" - msgid "Term [en]" msgstr "" @@ -26,12 +23,6 @@ msgstr "" msgid "A space is a container for tuples." msgstr "" -msgid "https://www.tarantool.io/en/doc/latest/book/box/data_model/#spaces\"" -msgstr "" - -msgid "NOUN" -msgstr "" - msgid "tuple" msgstr "" @@ -40,8 +31,7 @@ msgstr "" msgid "" "A tuple plays the same role as a “row” or a “record”. The number of tuples " -"in a space is unlimited. Tuples in Tarantool are stored as MsgPack arrays. " -"https://www.tarantool.io/en/doc/latest/book/box/data_model/#tuples" +"in a space is unlimited. Tuples in Tarantool are stored as MsgPack arrays." msgstr "" msgid "Tarantool" @@ -180,9 +170,6 @@ msgid "" "role as «row columns» or «record fields» in relational databases." msgstr "" -msgid "https://www.tarantool.io/ru/doc/latest/book/box/data_model/#term-field\"" -msgstr "" - msgid "leader election" msgstr "" @@ -365,9 +352,6 @@ msgid "" "of each column. A result set is effectively a table." msgstr "" -msgid "resultset" -msgstr "" - msgid "statement" msgstr "" @@ -414,6 +398,9 @@ msgstr "" msgid "deployment" msgstr "" +msgid "развертывание" +msgstr "" + msgid "" "Transforming a mechanical, electrical, or computer system from a packaged to" " an operational state. IT infrastructure deployment typically involves " @@ -466,26 +453,6 @@ msgid "" "into a target system environment." msgstr "" -msgid "Cartridge" -msgstr "" - -msgid "приложение на Tarantool Cartridge" -msgstr "" - -msgid "" -"Если без предлога, то теряется смысл: читается так, как будто Tarantool " -"Cartridge — это название приложения. А это не так." -msgstr "" - -msgid "Tarantool Cartridge application" -msgstr "" - -msgid "Tarantool Cartridge — это фреймворк" -msgstr "" - -msgid "на базе которого можно разработать свое приложение.\"" -msgstr "" - msgid "production environment" msgstr "" @@ -512,9 +479,6 @@ msgid "" "network." msgstr "" -msgid "replicaset" -msgstr "" - msgid "directory" msgstr "" @@ -527,7 +491,7 @@ msgstr "" msgid "сегмент" msgstr "" -msgid "check" +msgid "select" msgstr "" msgid "выберите, выбрать" @@ -535,3 +499,50 @@ msgstr "" msgid "To select a checkbox" msgstr "" + +#~ msgid "Tarantool Core" +#~ msgstr "" + +#~ msgid "https://www.tarantool.io/en/doc/latest/book/box/data_model/#spaces\"" +#~ msgstr "" + +#~ msgid "NOUN" +#~ msgstr "" + +#~ msgid "" +#~ "A tuple plays the same role as a “row” or a “record”. The number of tuples " +#~ "in a space is unlimited. Tuples in Tarantool are stored as MsgPack arrays. " +#~ "https://www.tarantool.io/en/doc/latest/book/box/data_model/#tuples" +#~ msgstr "" + +#~ msgid "https://www.tarantool.io/ru/doc/latest/book/box/data_model/#term-field\"" +#~ msgstr "" + +#~ msgid "resultset" +#~ msgstr "" + +#~ msgid "Cartridge" +#~ msgstr "" + +#~ msgid "приложение на Tarantool Cartridge" +#~ msgstr "" + +#~ msgid "" +#~ "Если без предлога, то теряется смысл: читается так, как будто Tarantool " +#~ "Cartridge — это название приложения. А это не так." +#~ msgstr "" + +#~ msgid "Tarantool Cartridge application" +#~ msgstr "" + +#~ msgid "Tarantool Cartridge — это фреймворк" +#~ msgstr "" + +#~ msgid "на базе которого можно разработать свое приложение.\"" +#~ msgstr "" + +#~ msgid "replicaset" +#~ msgstr "" + +#~ msgid "check" +#~ msgstr "" diff --git a/locale/ru/LC_MESSAGES/contributing/docs/localization/guide.po b/locale/ru/LC_MESSAGES/contributing/docs/localization/guide.po index c2931b4069..9900d88144 100644 --- a/locale/ru/LC_MESSAGES/contributing/docs/localization/guide.po +++ b/locale/ru/LC_MESSAGES/contributing/docs/localization/guide.po @@ -1,5 +1,5 @@ -msgid "Tarantool Translation Guidelines" +msgid "Localization guidelines" msgstr "" msgid "Use this guide when localizing Tarantool into Russian." @@ -54,9 +54,9 @@ msgid "" msgstr "" msgid "" -"If you feel like the older Russian term may sound more familiar for a part " -"of the audience (for example, those with a math background), consider adding" -" it in parentheses along with the English equivalent. Don’t repeat the " +"If you feel like an older Russian term may sound more familiar for a part of" +" the audience (for example, those with a math background), consider adding " +"it in parentheses along with the English equivalent. Don’t repeat the " "parentheses throughout the text. A similar rule applies to :ref:`introducing" " terms in Tarantool documentation `." msgstr "" @@ -168,7 +168,7 @@ msgstr "" msgid "" "To learn how to clear your Russian texts of bureaucratese, check `Timur " -"Anikin's training The Writing Dead " +"Anikin's training \"The Writing Dead\" " "`_." msgstr "" @@ -181,7 +181,7 @@ msgstr "" msgid "Проверка истечения срока действия паролей производится раз в 30 минут." msgstr "" -msgid "Система раз в 30 минут проверяет, не истек ли срок действия паролей." +msgid "Раз в 30 минут система проверяет, не истек ли срок действия паролей." msgstr "" msgid "Consistency" @@ -218,8 +218,8 @@ msgid "" msgstr "" msgid "" -"In the example, it is not quite clear what «к ней» means---to the record or " -"to the configuration. For more on this issue, check out `the writers' " +"In the example, it is not quite clear what «к ней» means -- to the record or" +" to the configuration. For more on this issue, check out `the writers' " "reference at «Ошибкариум» `_." msgstr "" @@ -238,3 +238,29 @@ msgid "" "mistakes, and nobody likes to be punished for them. You can use phrasings " "like \"I suggest\" or \"it's a good idea to... .\"" msgstr "" + +#~ msgid "Tarantool Translation Guidelines" +#~ msgstr "" + +#~ msgid "" +#~ "If you feel like the older Russian term may sound more familiar for a part " +#~ "of the audience (for example, those with a math background), consider adding" +#~ " it in parentheses along with the English equivalent. Don’t repeat the " +#~ "parentheses throughout the text. A similar rule applies to :ref:`introducing" +#~ " terms in Tarantool documentation `." +#~ msgstr "" + +#~ msgid "" +#~ "To learn how to clear your Russian texts of bureaucratese, check `Timur " +#~ "Anikin's training The Writing Dead " +#~ "`_." +#~ msgstr "" + +#~ msgid "Система раз в 30 минут проверяет, не истек ли срок действия паролей." +#~ msgstr "" + +#~ msgid "" +#~ "In the example, it is not quite clear what «к ней» means---to the record or " +#~ "to the configuration. For more on this issue, check out `the writers' " +#~ "reference at «Ошибкариум» `_." +#~ msgstr "" diff --git a/locale/ru/LC_MESSAGES/contributing/docs/localization/locstate.po b/locale/ru/LC_MESSAGES/contributing/docs/localization/locstate.po index 1ff317a988..c021b1e0ae 100644 --- a/locale/ru/LC_MESSAGES/contributing/docs/localization/locstate.po +++ b/locale/ru/LC_MESSAGES/contributing/docs/localization/locstate.po @@ -11,7 +11,7 @@ msgstr "" msgid "Volume, words" msgstr "" -msgid "Tarantool Community" +msgid "Tarantool Community Edition" msgstr "" msgid "|doc|" @@ -23,18 +23,6 @@ msgstr "" msgid "352 000" msgstr "" -msgid "Cartridge" -msgstr "" - -msgid "|cartridge|" -msgstr "" - -msgid "cartridge" -msgstr "" - -msgid "14 000" -msgstr "" - msgid "Tarantool Ansible Role" msgstr "" @@ -47,19 +35,7 @@ msgstr "" msgid "11 000" msgstr "" -msgid "Cartridge CLI" -msgstr "" - -msgid "|cartridge-cli|" -msgstr "" - -msgid "cartridge-cli" -msgstr "" - -msgid "6 500" -msgstr "" - -msgid "Tarantool Enterprise" +msgid "Tarantool Enterprise Edition" msgstr "" msgid "|tarantool-enterprise|" @@ -136,3 +112,33 @@ msgstr "" msgid "500" msgstr "" + +#~ msgid "Tarantool Community" +#~ msgstr "" + +#~ msgid "Cartridge" +#~ msgstr "" + +#~ msgid "|cartridge|" +#~ msgstr "" + +#~ msgid "cartridge" +#~ msgstr "" + +#~ msgid "14 000" +#~ msgstr "" + +#~ msgid "Cartridge CLI" +#~ msgstr "" + +#~ msgid "|cartridge-cli|" +#~ msgstr "" + +#~ msgid "cartridge-cli" +#~ msgstr "" + +#~ msgid "6 500" +#~ msgstr "" + +#~ msgid "Tarantool Enterprise" +#~ msgstr "" diff --git a/locale/ru/LC_MESSAGES/contributing/docs/markup/admonitions.po b/locale/ru/LC_MESSAGES/contributing/docs/markup/admonitions.po index 6133b9e789..be709c6d27 100644 --- a/locale/ru/LC_MESSAGES/contributing/docs/markup/admonitions.po +++ b/locale/ru/LC_MESSAGES/contributing/docs/markup/admonitions.po @@ -55,9 +55,9 @@ msgid "" msgstr "" msgid "" -"For example, the block :doc:`in Getting Started with Docker " -"` is used to warn the user against " -"closing the terminal window." +"For example, the block :doc:`in Getting Started with Docker ` is used to warn the user against closing the " +"terminal window." msgstr "" msgid "Custom admonition:" @@ -91,3 +91,9 @@ msgid "" "enough for us. If you think that it is time to create the new style for some" " of these types, feel free to contribute or contact us to create a task." msgstr "" + +#~ msgid "" +#~ "For example, the block :doc:`in Getting Started with Docker " +#~ "` is used to warn the user against " +#~ "closing the terminal window." +#~ msgstr "" diff --git a/locale/ru/LC_MESSAGES/contributing/docs/markup/gui.po b/locale/ru/LC_MESSAGES/contributing/docs/markup/gui.po new file mode 100644 index 0000000000..f6e2264ac1 --- /dev/null +++ b/locale/ru/LC_MESSAGES/contributing/docs/markup/gui.po @@ -0,0 +1,9 @@ + +msgid "Referring to GUI elements" +msgstr "" + +msgid "To mention a GUI element, use the ``:guilabel:`` directive:" +msgstr "" + +msgid "Click the :guilabel:`OK` button." +msgstr "" diff --git a/locale/ru/LC_MESSAGES/contributing/docs/sphinx-warnings.po b/locale/ru/LC_MESSAGES/contributing/docs/sphinx-warnings.po index e4616dc997..1615d43be9 100644 --- a/locale/ru/LC_MESSAGES/contributing/docs/sphinx-warnings.po +++ b/locale/ru/LC_MESSAGES/contributing/docs/sphinx-warnings.po @@ -138,6 +138,26 @@ msgstr "" msgid ".. _box_space-index_func:" msgstr "" +msgid "Anonymous hyperlink mismatch" +msgstr "" + +msgid "" +"**Warning example:** Anonymous hyperlink mismatch: 1 references but 0 " +"targets." +msgstr "" + +msgid "Check the hyperlink formatting." +msgstr "" + +msgid "Read more in `Lua Manual `__." +msgstr "" + msgid "Toctree contains reference to nonexisting document '...'" msgstr "" @@ -148,9 +168,8 @@ msgid "Check the path." msgstr "" msgid "" -"If the path points to ``cartridge`` or another submodule, check that you've " -":doc:`built the submodules content ` before " -"building docs." +"If the path points to a submodule, check that you've :doc:`built the " +"submodules content ` before building docs." msgstr "" msgid "" @@ -216,3 +235,9 @@ msgstr "" msgid ":doc:`/reference/reference_lua/box_space/update`" msgstr "" + +#~ msgid "" +#~ "If the path points to ``cartridge`` or another submodule, check that you've " +#~ ":doc:`built the submodules content ` before " +#~ "building docs." +#~ msgstr "" diff --git a/locale/ru/LC_MESSAGES/contributing/docs/style.po b/locale/ru/LC_MESSAGES/contributing/docs/style.po index 9e94666943..01763b5f29 100644 --- a/locale/ru/LC_MESSAGES/contributing/docs/style.po +++ b/locale/ru/LC_MESSAGES/contributing/docs/style.po @@ -2,29 +2,88 @@ msgid "Language and style" msgstr "" -msgid "US vs British spelling" -msgstr "Британский или американский вариант английского" +msgid "General style" +msgstr "" -msgid "We use the US English spelling." +msgid "Concise is good" msgstr "" -msgid "Instance vs server" -msgstr "Экземпляр или сервер" +msgid "" +"People usually read technical documentation because they want something up " +"and running quickly. Write simpler, more concise sentences." +msgstr "" msgid "" -"We say \"instance\" rather than \"server\" to refer to a Tarantool server " -"instance. This keeps the manual terminology consistent with names like " -"``/etc/tarantool/instances.enabled`` in the Tarantool environment." +"Split the content into smaller paragraphs to improve readability. This will " +"also eliminate the need for using ``|br|`` and help us translate content " +"faster. Any paragraph over 6 sentences is large." +msgstr "" + +msgid "Keep your audience in mind" msgstr "" msgid "" -"Wrong usage: \"Replication allows multiple Tarantool *servers* to work with " -"copies of the same database.\"" +"Consider your audience's level. A getting started guide should be written in" +" simpler terms than an advanced internals description." msgstr "" msgid "" -"Correct usage: \"Replication allows multiple Tarantool *instances* to work " -"with copies of the same database.\"" +"If you choose to use metaphors to clarify a concept, make sure they are " +"relatable for an international audience of IT professionals." +msgstr "" + +msgid "Don't say \"we\"" +msgstr "" + +msgid "" +"Only use the pronoun \"we\" in entry-level texts like getting started " +"guides. In other cases, avoid using \"we\", because it is unclear who that " +"is exactly. `Consider how Gentoo does it " +"`__." +msgstr "" + +msgid "Stick to the facts" +msgstr "" + +msgid "" +"Use measurable facts instead of personal judgments. Different users may have" +" different ideas of what \"often\", \"slow\", or \"small\" means." +msgstr "" + +msgid "**Bad example:** This parameter is rarely updated." +msgstr "" + +msgid "" +"**Good example:** This parameter is updated every two hours or more rarely." +msgstr "" + +msgid "Refer to absolute time" +msgstr "" + +msgid "" +"Temporal adverbs like \"today\", \"currently\", \"now\", \"in the future\", " +"etc. are relative -- that is, they are based on the time the documentation " +"is created." +msgstr "" + +msgid "" +"Instead of these words, use absolute terms like version numbers or years. " +"The meaning of those terms doesn't change over time." +msgstr "" + +msgid "" +"If technical documentation is tied semantically to the time it was created, " +"it increases the risk of the documentation becoming obsolete." +msgstr "" + +msgid "" +"**Bad example:** Previously, the functionality worked differently. " +"Currently, it supports SSL." +msgstr "" + +msgid "" +"**Good example:** Before version x.y.z, the functionality worked " +"differently. Since version x.y.z, it supports SSL." msgstr "" msgid "Express one idea in a sentence" @@ -43,12 +102,12 @@ msgid "Do" msgstr "" msgid "" -"Dogs (I have three of them) are my favourite animals. Their names are Ace, " +"Dogs (I have three of them) are my favorite animals. Their names are Ace, " "Bingo and Charm; Charm is the youngest one." msgstr "" msgid "" -"Dogs are my favourite animals. I have three of them. Their names are Ace, " +"Dogs are my favorite animals. I have three of them. Their names are Ace, " "Bingo and Charm. Charm is the youngest one." msgstr "" @@ -76,6 +135,108 @@ msgid "" "called the destination." msgstr "" +msgid "Put examples next to theory" +msgstr "" + +msgid "" +"It's best if examples immediately follow the concept they illustrate. The " +"readers wouldn't want to look for the examples in a different part of the " +"article." +msgstr "" + +msgid "Specify link text" +msgstr "" + +msgid "" +"When you provide a :doc:`link `, clearly " +"specify where it leads. In this way, you will not mislead the reader." +msgstr "" + +msgid "Bad example:" +msgstr "" + +msgid "For more details, click :doc:`here `." +msgstr "" + +msgid "Use :doc:`this `." +msgstr "" + +msgid "Good example:" +msgstr "" + +msgid "" +"For more details, refer to the documentation on :doc:`making links " +"`." +msgstr "" + +msgid "Use full :doc:`link names `." +msgstr "" + +msgid "Formatting" +msgstr "" + +msgid "Use lists and tables" +msgstr "" + +msgid "Lists and tables help split heavy content into manageable chunks." +msgstr "" + +msgid "" +"To make tables maintainable and easy to translate, use the ``list-table`` " +"directive, as described in the Tarantool :doc:`table markup reference " +"`." +msgstr "" + +msgid "" +"Translators find it hard to work with content \"drawn\" with ASCII " +"characters, because it requires adjusting the number of spaces and manually " +"counting characters." +msgstr "" + +msgid "Don't \"draw\" tables with ASCII characters" +msgstr "" + +msgid "Use the \"list-table\" directive instead" +msgstr "" + +msgid "Format code as code" +msgstr "" + +msgid "" +"Format large code fragments using the ``code-block`` directive, indicating " +"the language. For ``shorter code snippets``, make sure that only code goes " +"in the backticks. Non-code shouldn't be formatted as code, because this " +"confuses users (and translators, too). Check our guidelines on :doc:`writing" +" about code `." +msgstr "" + +msgid "" +"For more about formatting, check out the Tarantool :doc:`markup reference " +"`." +msgstr "" + +msgid "Word choice" +msgstr "" + +msgid "Instance vs server" +msgstr "Экземпляр или сервер" + +msgid "" +"We say \"instance\" rather than \"server\" to refer to a Tarantool server " +"instance. This keeps the manual terminology consistent with names like " +"``/etc/tarantool/instances.enabled`` in the Tarantool environment." +msgstr "" + +msgid "" +"Wrong usage: \"Replication allows multiple Tarantool *servers* to work with " +"copies of the same database.\"" +msgstr "" + +msgid "" +"Correct usage: \"Replication allows multiple Tarantool *instances* to work " +"with copies of the same database.\"" +msgstr "" + msgid "Don't use i.e. and e.g." msgstr "" @@ -100,30 +261,162 @@ msgid "" "avoid using them." msgstr "" -msgid "Specify link text" +msgid "Spelling and punctuation" +msgstr "" + +msgid "Tarantool capitalization" msgstr "" msgid "" -"When you provide a :doc:`link `, clearly " -"specify where it leads. In this way, you will not mislead the reader." +"The word \"Tarantool\" is capitalized because it's a product name. The only " +"context where it can start with a lowercase \"t\" is code. Learn more about " +":doc:`code formatting in Tarantool documentation " +"`." msgstr "" -msgid "Bad example:" +msgid "US vs British spelling" +msgstr "Британский или американский вариант английского" + +#, fuzzy +msgid "Use the US English spelling." +msgstr "Британский или американский вариант английского" + +msgid "Check your spelling and punctuation" msgstr "" -msgid "For more details, click :doc:`here `." +msgid "" +"Consider checking spelling, grammar, and punctuation with special tools like" +" `LanguageTool `_ or `Grammarly " +"`_." msgstr "" -msgid "Use :doc:`this `." +msgid "Dashes" msgstr "" -msgid "Good example:" +msgid "" +"Special symbols like dashes, quotation marks, and apostrophes look the same " +"across all Tarantool documentation in a single language. This is because the" +" documentation :doc:`builder ` renders specific " +"character sequences in the source into correct typographic characters." msgstr "" msgid "" -"For more details, refer to the documentation on :doc:`making links " -"`." +"Tarantool documentarians are recommended to use the **en dash** (--) only. " +"Type two hyphens to insert it: ``--``. Add spaces on both sides of the dash." +" Don't use a single hyphen as a dash." msgstr "" -msgid "Use full :doc:`link names `." +msgid "Use the dash for the following purposes:" +msgstr "" + +msgid "To separate extra information." msgstr "" + +msgid "To mark a break in a sentence." +msgstr "" + +msgid "" +"To mark ranges like 4--16 GB (don't surround the dash with spaces in this " +"case)." +msgstr "" + +msgid "" +"When indicating a range like ``code element 1``\\--``code element 2``, " +"escape the series of hyphens using `character-level inline markup " +"`_. Otherwise, the RST interpreter will perceive the " +"dash as part of the RST syntax:" +msgstr "" + +msgid "``box.begin()``\\--``box.commit()``" +msgstr "" + +msgid "Ending punctuation in lists and tables" +msgstr "" + +msgid "" +"The following recommendations are *for the English language only.* You can " +"find similar guidelines for the Russian language in the `external reference " +"for Russian proofreaders " +"`__." +msgstr "" + +msgid "Lists" +msgstr "" + +msgid "There are two kinds of lists:" +msgstr "" + +msgid "Where each item forms a complete sentence." +msgstr "" + +msgid "Where each item is a phrase of three or less words or a term." +msgstr "" + +msgid "" +"In the former case, start each item with a capital letter and end with a " +"period. In the latter case, start it with a lowercase letter and add no " +"ending punctuation (no period, no comma, no semicolon)." +msgstr "" + +msgid "" +"A list should be formatted uniformly: choose the first or second rule for " +"all items in a list." +msgstr "" + +msgid "" +"The above rules are adapted from the `Microsoft style guide " +"`__." +msgstr "" + +msgid "" +"The sentence preceding a list can end either with a semicolon or a period." +msgstr "" + +msgid "" +"Don't add redundant conjunctions like \"and\"/\"or\" before the last list " +"item." +msgstr "" + +msgid "General English punctuation rules still apply for text in lists." +msgstr "" + +msgid "Tables" +msgstr "" + +msgid "" +"For the text in cells, use periods or other end punctuation only if the " +"cells contain complete sentences or a mixture of fragments and sentences. " +"(This is also a `Microsoft guideline `__ for the English " +"language.)" +msgstr "" + +msgid "" +"Besides, make sure that your table punctuation is consistent -- either all " +"similar list/table items end with a period or they all don't. In the example" +" below, *all* items in the second column don't have ending punctuation. " +"Meanwhile, *all* items in the fourth column end with a period, because they " +"are a mix of fragments and sentences:" +msgstr "" + +msgid "Items in one column have similar ending punctuation" +msgstr "" + +msgid "" +"To learn more about table formatting, check the :doc:`table markup reference" +" `." +msgstr "" + +#~ msgid "We use the US English spelling." +#~ msgstr "" + +#~ msgid "" +#~ "Dogs (I have three of them) are my favourite animals. Their names are Ace, " +#~ "Bingo and Charm; Charm is the youngest one." +#~ msgstr "" + +#~ msgid "" +#~ "Dogs are my favourite animals. I have three of them. Their names are Ace, " +#~ "Bingo and Charm. Charm is the youngest one." +#~ msgstr "" diff --git a/locale/ru/LC_MESSAGES/contributing/docs/terms.po b/locale/ru/LC_MESSAGES/contributing/docs/terms.po index 1b1b99db2d..3f57cd4705 100644 --- a/locale/ru/LC_MESSAGES/contributing/docs/terms.po +++ b/locale/ru/LC_MESSAGES/contributing/docs/terms.po @@ -57,7 +57,7 @@ msgstr "" msgid "" "A restricted term is a word that the authors explicitly prohibited to use " "for denoting a :term:`concept`. Such a word is sometimes used as a " -":term:`term` for the same :term:`concept` elsewhere---in the community, in " +":term:`term` for the same :term:`concept` elsewhere -- in the community, in " "books, or in other product documentation. Sometimes this word is used to " "denote a similar but different concept. In this case, the right choice of " "terms helps us differentiate between concepts." @@ -167,3 +167,12 @@ msgstr "" msgid "Give examples or links to extra reading where you can." msgstr "" + +#~ msgid "" +#~ "A restricted term is a word that the authors explicitly prohibited to use " +#~ "for denoting a :term:`concept`. Such a word is sometimes used as a " +#~ ":term:`term` for the same :term:`concept` elsewhere---in the community, in " +#~ "books, or in other product documentation. Sometimes this word is used to " +#~ "denote a similar but different concept. In this case, the right choice of " +#~ "terms helps us differentiate between concepts." +#~ msgstr "" diff --git a/locale/ru/LC_MESSAGES/contributing/release_notes.po b/locale/ru/LC_MESSAGES/contributing/release_notes.po new file mode 100644 index 0000000000..095b061be4 --- /dev/null +++ b/locale/ru/LC_MESSAGES/contributing/release_notes.po @@ -0,0 +1,63 @@ + +msgid "How to write release notes" +msgstr "" + +msgid "" +"Below are some best practices to make changelogs consistent, neat, and " +"human-oriented." +msgstr "" + +msgid "Language" +msgstr "" + +msgid "Use the past tense to describe changed or fixed behavior." +msgstr "" + +msgid "Examples" +msgstr "" + +msgid "Fixed false positive panic when yielding in debug hook (gh-5649)." +msgstr "" + +msgid "" +"Fedora 32 is supported now. Added per-commit testing, updated YUM " +"repositories (gh-4966)." +msgstr "" + +msgid "Use the present tense to describe new behavior." +msgstr "" + +msgid "Example" +msgstr "" + +msgid "Data changes in read-only mode are now forbidden (gh-5231)." +msgstr "" + +msgid "Start with a capital letter, end with a period." +msgstr "" + +msgid "" +"Note that these guidelines differ from the best practice for commit message " +"titles that suggests using the imperative mood." +msgstr "" + +msgid "Formatting" +msgstr "" + +msgid "" +"In release notes, use the following Sphinx syntax when referring to a " +"specific version of Tarantool:" +msgstr "" + +msgid "" +"Tarantool :tarantool-release:`2.10.0`.\n" +"This is a link to the release notes on GitHub." +msgstr "" + +msgid "The result looks like this:" +msgstr "" + +msgid "" +"Tarantool :tarantool-release:`2.10.0`. This is a link to the release notes " +"on GitHub." +msgstr "" diff --git a/locale/ru/LC_MESSAGES/dev_guide/building_from_source.po b/locale/ru/LC_MESSAGES/dev_guide/building_from_source.po index 07b2a151af..9ea0fd4e25 100644 --- a/locale/ru/LC_MESSAGES/dev_guide/building_from_source.po +++ b/locale/ru/LC_MESSAGES/dev_guide/building_from_source.po @@ -1,9 +1,8 @@ -msgid "Building from source" -msgstr "Сборка из исходных файлов" +msgid "Building to contribute" +msgstr "" -msgid "" -"To build Tarantool from source files, you will need the following tools:" +msgid "To build Tarantool from source files, you need the following tools:" msgstr "" msgid "Git" @@ -12,13 +11,22 @@ msgstr "" msgid "GCC. Or Clang for Mac OS" msgstr "" -msgid "CMake 3.3+" +msgid "CMake 3.3 or later" msgstr "" msgid "GNU Make" msgstr "" -msgid "`ReadLine `_, any version" +msgid "`Autoconf `_, any version" +msgstr "" + +msgid "`Automake `_, any version" +msgstr "" + +msgid "`Libtool `_, any version" +msgstr "" + +msgid "`Readline `_, any version" msgstr "" msgid "`ncurses `_, any version" @@ -92,9 +100,9 @@ msgid "Ubuntu/Debian" msgstr "" msgid "" -"$ apt-get -y install git build-essential cmake make zlib1g-dev \\\n" -" libreadline-dev libncurses5-dev libssl-dev libunwind-dev libicu-dev \\\n" -" python3 python3-pyyaml python3-six python3-gevent\n" +"$ apt-get -y install git build-essential cmake autoconf automake libtool make \\\n" +" zlib1g-dev libreadline-dev libncurses5-dev libssl-dev libunwind-dev libicu-dev \\\n" +" python3 python3-yaml python3-six python3-gevent\n" "\n" "$ git clone https://github.com/tarantool/tarantool.git --recursive\n" "\n" @@ -119,8 +127,8 @@ msgid "Fedora" msgstr "" msgid "" -"$ dnf install -y git gcc gcc-c++ cmake make readline-devel ncurses-devel \\\n" -" openssl-devel zlib-devel libunwind-devel libicu-devel \\\n" +"$ dnf install -y git gcc gcc-c++ cmake autoconf automake libtool make \\\n" +" readline-devel ncurses-devel openssl-devel zlib-devel libunwind-devel libicu-devel \\\n" " python3-pyyaml python3-six python3-gevent\n" "\n" "$ git clone https://github.com/tarantool/tarantool.git --recursive\n" @@ -151,8 +159,8 @@ msgid "" "\n" "$ curl -s https://packagecloud.io/install/repositories/packpack/backports/script.rpm.sh | bash\n" "\n" -"$ yum install -y git gcc cmake3 make gcc-c++ zlib-devel readline-devel \\\n" -" ncurses-devel openssl-devel libunwind-devel libicu-devel \\\n" +"$ yum install -y git gcc cmake3 autoconf automake libtool make gcc-c++ zlib-devel \\\n" +" readline-devel ncurses-devel openssl-devel libunwind-devel libicu-devel \\\n" " python3-pyyaml python3-six python3-gevent\n" "\n" "$ git clone https://github.com/tarantool/tarantool.git --recursive\n" @@ -180,8 +188,8 @@ msgstr "" msgid "" "$ dnf install -y epel-release\n" "\n" -"$ dnf install -y git gcc cmake3 libarchive make gcc-c++ zlib-devel \\\n" -" readline-devel ncurses-devel openssl-devel libunwind-devel libicu-devel \\\n" +"$ dnf install -y git gcc cmake3 autoconf automake libtool libarchive make gcc-c++ \\\n" +" zlib-devel readline-devel ncurses-devel openssl-devel libunwind-devel libicu-devel \\\n" " python3-pyyaml python3-six python3-gevent\n" "\n" "$ git clone https://github.com/tarantool/tarantool.git --recursive\n" @@ -223,7 +231,7 @@ msgid "" "\n" "$ git submodule update --init --recursive\n" "\n" -"$ brew install -y git openssl readline curl icu4c libiconv zlib cmake\n" +"$ brew install git openssl readline curl icu4c libiconv zlib cmake autoconf automake libtool\n" "\n" "$ pip install --user -r test-run/requirements.txt\n" "\n" @@ -250,7 +258,7 @@ msgid "" "\n" "$ git submodule update --init --recursive\n" "\n" -"$ pkg install -y git cmake gmake readline icu\n" +"$ pkg install -y git cmake autoconf automake libtool gmake readline icu\n" "\n" "$ pip install --user -r test-run/requirements.txt\n" "\n" @@ -273,10 +281,17 @@ msgstr "" msgid "-DENABLE_DIST=ON for tarantoolctl installation" msgstr "" +msgid "" +"``tarantoolctl`` is deprecated in favor of :ref:`tt CLI `. Find the " +"instructions on switching from ``tarantoolctl`` to ``tt`` in :ref:`Migration" +" from tarantoolctl to tt `." +msgstr "" + +#, fuzzy msgid "" "The CMake option for hinting that the result will be distributed is " -":code:`-DENABLE_DIST=ON`. If this option is on, then later ``make install`` " -"will install ``tarantoolctl`` files in addition to ``tarantool`` files." +":code:`-DENABLE_DIST=ON`. With this option, ``make install`` installs " +"``tarantoolctl`` files in addition to ``tarantool`` files." msgstr "" "Чтобы указать в CMake, что результат будет распределен, используется опция " ":code:`-DENABLE_DIST=ON`. При наличии такой опции ``make install`` в " @@ -324,7 +339,7 @@ msgid "" msgstr "" msgid "" -"`Building Tarantool on MacOS " +"`Building Tarantool on macOS " "`_" msgstr "" @@ -343,3 +358,175 @@ msgid "" "`_" msgstr "" + +#~ msgid "Building from source" +#~ msgstr "Сборка из исходных файлов" + +#~ msgid "" +#~ "To build Tarantool from source files, you will need the following tools:" +#~ msgstr "" + +#~ msgid "CMake 3.3+" +#~ msgstr "" + +#~ msgid "`ReadLine `_, any version" +#~ msgstr "" + +#~ msgid "" +#~ "$ apt-get -y install git build-essential cmake make zlib1g-dev \\\n" +#~ " libreadline-dev libncurses5-dev libssl-dev libunwind-dev libicu-dev \\\n" +#~ " python3 python3-pyyaml python3-six python3-gevent\n" +#~ "\n" +#~ "$ git clone https://github.com/tarantool/tarantool.git --recursive\n" +#~ "\n" +#~ "$ cd tarantool\n" +#~ "\n" +#~ "$ git submodule update --init --recursive\n" +#~ "\n" +#~ "$ make clean # unnecessary, added for good luck\n" +#~ "$ rm CMakeCache.txt # unnecessary, added for good luck\n" +#~ "\n" +#~ "$ mkdir build && cd build\n" +#~ "\n" +#~ "$ # start initiating with build type=RelWithDebInfo\n" +#~ "$ cmake .. -DCMAKE_BUILD_TYPE=RelWithDebInfo\n" +#~ "\n" +#~ "$ make\n" +#~ "\n" +#~ "$ make test" +#~ msgstr "" + +#~ msgid "" +#~ "$ dnf install -y git gcc gcc-c++ cmake make readline-devel ncurses-devel \\\n" +#~ " openssl-devel zlib-devel libunwind-devel libicu-devel \\\n" +#~ " python3-pyyaml python3-six python3-gevent\n" +#~ "\n" +#~ "$ git clone https://github.com/tarantool/tarantool.git --recursive\n" +#~ "\n" +#~ "$ cd tarantool\n" +#~ "\n" +#~ "$ git submodule update --init --recursive\n" +#~ "\n" +#~ "$ make clean # unnecessary, added for good luck\n" +#~ "$ rm CMakeCache.txt # unnecessary, added for good luck\n" +#~ "\n" +#~ "$ mkdir build && cd build\n" +#~ "\n" +#~ "$ # start initiating with build type=RelWithDebInfo\n" +#~ "$ cmake .. -DCMAKE_BUILD_TYPE=RelWithDebInfo\n" +#~ "\n" +#~ "$ make\n" +#~ "\n" +#~ "$ make test" +#~ msgstr "" + +#~ msgid "" +#~ "$ yum install -y python-pip\n" +#~ "$ yum install -y epel-release\n" +#~ "\n" +#~ "$ curl -s https://packagecloud.io/install/repositories/packpack/backports/script.rpm.sh | bash\n" +#~ "\n" +#~ "$ yum install -y git gcc cmake3 make gcc-c++ zlib-devel readline-devel \\\n" +#~ " ncurses-devel openssl-devel libunwind-devel libicu-devel \\\n" +#~ " python3-pyyaml python3-six python3-gevent\n" +#~ "\n" +#~ "$ git clone https://github.com/tarantool/tarantool.git --recursive\n" +#~ "\n" +#~ "$ cd tarantool\n" +#~ "\n" +#~ "$ git submodule update --init --recursive\n" +#~ "\n" +#~ "$ make clean # unnecessary, added for good luck\n" +#~ "$ rm CMakeCache.txt # unnecessary, added for good luck\n" +#~ "\n" +#~ "$ mkdir build && cd build\n" +#~ "\n" +#~ "$ # start initiating with build type=RelWithDebInfo\n" +#~ "$ cmake3 .. -DCMAKE_BUILD_TYPE=RelWithDebInfo\n" +#~ "\n" +#~ "$ make\n" +#~ "\n" +#~ "$ make test" +#~ msgstr "" + +#~ msgid "" +#~ "$ dnf install -y epel-release\n" +#~ "\n" +#~ "$ dnf install -y git gcc cmake3 libarchive make gcc-c++ zlib-devel \\\n" +#~ " readline-devel ncurses-devel openssl-devel libunwind-devel libicu-devel \\\n" +#~ " python3-pyyaml python3-six python3-gevent\n" +#~ "\n" +#~ "$ git clone https://github.com/tarantool/tarantool.git --recursive\n" +#~ "\n" +#~ "$ cd tarantool\n" +#~ "\n" +#~ "$ git submodule update --init --recursive\n" +#~ "\n" +#~ "$ make clean # unnecessary, added for good luck\n" +#~ "$ rm CMakeCache.txt # unnecessary, added for good luck\n" +#~ "\n" +#~ "$ mkdir build && cd build\n" +#~ "\n" +#~ "$ # start initiating with build type=RelWithDebInfo\n" +#~ "$ cmake .. -DCMAKE_BUILD_TYPE=RelWithDebInfo\n" +#~ "\n" +#~ "$ make\n" +#~ "\n" +#~ "$ make test" +#~ msgstr "" + +#~ msgid "" +#~ "$ xcode-select --install\n" +#~ "$ xcode-select -switch /Applications/Xcode.app/Contents/Developer\n" +#~ "\n" +#~ "$ git clone https://github.com/tarantool/tarantool.git --recursive\n" +#~ "\n" +#~ "$ cd tarantool\n" +#~ "\n" +#~ "$ git submodule update --init --recursive\n" +#~ "\n" +#~ "$ brew install -y git openssl readline curl icu4c libiconv zlib cmake\n" +#~ "\n" +#~ "$ pip install --user -r test-run/requirements.txt\n" +#~ "\n" +#~ "$ make clean # unnecessary, added for good luck\n" +#~ "$ rm CMakeCache.txt # unnecessary, added for good luck\n" +#~ "\n" +#~ "$ mkdir build && cd build\n" +#~ "\n" +#~ "$ # start initiating with build type=RelWithDebInfo\n" +#~ "$ cmake .. -DCMAKE_BUILD_TYPE=RelWithDebInfo\n" +#~ "\n" +#~ "$ make\n" +#~ "\n" +#~ "$ make test" +#~ msgstr "" + +#~ msgid "" +#~ "$ git clone https://github.com/tarantool/tarantool.git --recursive\n" +#~ "\n" +#~ "$ cd tarantool\n" +#~ "\n" +#~ "$ git submodule update --init --recursive\n" +#~ "\n" +#~ "$ pkg install -y git cmake gmake readline icu\n" +#~ "\n" +#~ "$ pip install --user -r test-run/requirements.txt\n" +#~ "\n" +#~ "$ make clean # unnecessary, added for good luck\n" +#~ "$ rm CMakeCache.txt # unnecessary, added for good luck\n" +#~ "\n" +#~ "$ mkdir build && cd build\n" +#~ "\n" +#~ "$ # start initiating with build type=RelWithDebInfo\n" +#~ "$ cmake .. -DCMAKE_BUILD_TYPE=RelWithDebInfo\n" +#~ "\n" +#~ "$ gmake\n" +#~ "\n" +#~ "$ gmake test" +#~ msgstr "" + +#~ msgid "" +#~ "`Building Tarantool on MacOS " +#~ "`_" +#~ msgstr "" diff --git a/locale/ru/LC_MESSAGES/dev_guide/contributing_module.po b/locale/ru/LC_MESSAGES/dev_guide/contributing_module.po index e1489c40ca..6a7ca9bacb 100644 --- a/locale/ru/LC_MESSAGES/dev_guide/contributing_module.po +++ b/locale/ru/LC_MESSAGES/dev_guide/contributing_module.po @@ -3,22 +3,23 @@ msgid "Contributing a module" msgstr "Добавление собственного модуля" msgid "" -"This page discusses how to create a Tarantool module and then get it published on `Tarantool rocks page" -" `_ and included in `official Tarantool " -"images `_ for Docker." +"This page discusses how to create a Tarantool module and then get it " +"published on `Tarantool rocks page `_ and " +"included in `official Tarantool images " +"`_ for Docker." msgstr "" -"На этой странице рассказано, как " -"создать модуль для Tarantool, а затем разместить" -" его на странице модулей Tarantool `_ и " -"включить его в `официальные образы Tarantool " -"`_ для Docker." +"На этой странице рассказано, как создать модуль для Tarantool, а затем " +"разместить его на странице модулей Tarantool " +"`_ и включить его в `официальные образы " +"Tarantool `_ для Docker." msgid "" -"To learn how to create a simple module in Lua for local usage, check the corresponding " -":ref:`how-to guide `." +"To learn how to create a simple module in Lua for local usage, check the " +"corresponding :ref:`how-to guide `." msgstr "" -"Чтобы узнать, как разработать несложный Lua-модуль для локального использования, " -"прочитайте :ref:`практическое руководство `." +"Чтобы узнать, как разработать несложный Lua-модуль для локального " +"использования, прочитайте :ref:`практическое руководство `." msgid "" "To help our contributors, we have created `modulekit " diff --git a/locale/ru/LC_MESSAGES/dev_guide/internals/box_protocol.po b/locale/ru/LC_MESSAGES/dev_guide/internals/box_protocol.po index 01fe11cf05..ce2f651256 100644 --- a/locale/ru/LC_MESSAGES/dev_guide/internals/box_protocol.po +++ b/locale/ru/LC_MESSAGES/dev_guide/internals/box_protocol.po @@ -1,2296 +1,2326 @@ -msgid "Binary protocol" -msgstr "Бинарный протокол" - -msgid "Introduction" -msgstr "Введение" - -msgid "" -"The binary protocol, iproto, is called a \"request/response\" protocol because it is " -"for sending requests to a Tarantool server and receiving responses. There is" -" complete access to Tarantool functionality, including:" -msgstr "" -"Бинарный протокол iproto передает данные по схеме \"запрос-ответ\", то есть он " -"предназначен для отправки запросов на сервер Tarantool и получения ответов. " -"Протокол предоставляет полный доступ к функциям Tarantool, включая:" - -msgid "" -"request multiplexing, for example ability to issue multiple requests " -"asynchronously via the same connection" -msgstr "" -"мультиплексирование запросов, т.е. возможность асинхронной отправки " -"множества запросов по одному соединению;" - -msgid "response format that supports zero-copy writes" -msgstr "" -"формат ответа, который поддерживает запись в режиме без копирования (zero-" -"copy)." - -msgid "" -"The protocol can be called \"binary\" because the most-frequently-used " -"database accesses are done with binary codes instead of Lua request text. " -"Tarantool experts use it to write their own connectors, to understand " -"network messages, to support new features that their favorite connector " -"doesn't support yet, or to avoid repetitive parsing by the server." -msgstr "" -"Протокол можно назвать \"бинарным\", поскольку наиболее частые обращения к " -"базе данных выполняются с помощью бинарного кода, а не текста запроса на " -"языке Lua. Специалисты по Tarantool используют его, чтобы писать собственные" -" коннекторы, понимать сетевые сообщения, поддерживать новые функции, которые" -" их любимый коннектор еще не поддерживает, или чтобы избежать повторного " -"разбора на сервере." - -msgid "Index" -msgstr "Указатель" - -msgid "Section" -msgstr "Раздел" - -msgid "Description" -msgstr "Описание" - -msgid ":ref:`Symbols and terms `" -msgstr ":ref:`Обозначения и термины `" - -msgid "Notation of binary protocol" -msgstr "Условные обозначения в бинарном протоколе" - -msgid ":ref:`Header and body `" -msgstr ":ref:`Заголовок и тело сообщения `" - -msgid "Header of a request" -msgstr "Заголовок запроса" - -msgid "" -"Requests: |br|:ref:`IPROTO_SELECT ` " -"|br|:ref:`IPROTO_INSERT ` |br|:ref:`IPROTO_REPLACE " -"` |br|:ref:`IPROTO_UPDATE ` " -"|br|:ref:`IPROTO_DELETE ` |br|:ref:`IPROTO_CALL_16 " -"` |br|:ref:`IPROTO_AUTH ` " -"|br|:ref:`IPROTO_EVAL ` |br|:ref:`IPROTO_UPSERT " -"` |br|:ref:`IPROTO_CALL ` " -"|br|:ref:`IPROTO_EXECUTE ` |br|:ref:`IPROTO_NOP " -"` |br|:ref:`IPROTO_PREPARE ` " -"|br|:ref:`IPROTO_PING ` |br|:ref:`IPROTO_JOIN " -"` |br|:ref:`IPROTO_SUBSCRIBE ` " -"|br|:ref:`IPROTO_VOTE_DEPRECATED ` |br|:ref:`IPROTO_VOTE " -"` |br|:ref:`IPROTO_FETCH_SNAPSHOT ` " -"|br|:ref:`IPROTO_REGISTER ` |br|:ref:`IPROTO_BEGIN " -"` |br|:ref:`IPROTO_COMMIT ` " -"|br|:ref:`IPROTO_ROLLBACK `" -msgstr "" -"Запросы: |br|:ref:`IPROTO_SELECT ` " -"|br|:ref:`IPROTO_INSERT ` |br|:ref:`IPROTO_REPLACE " -"` |br|:ref:`IPROTO_UPDATE ` " -"|br|:ref:`IPROTO_DELETE ` |br|:ref:`IPROTO_CALL_16 " -"` |br|:ref:`IPROTO_AUTH ` " -"|br|:ref:`IPROTO_EVAL ` |br|:ref:`IPROTO_UPSERT " -"` |br|:ref:`IPROTO_CALL ` " -"|br|:ref:`IPROTO_EXECUTE ` |br|:ref:`IPROTO_NOP " -"` |br|:ref:`IPROTO_PREPARE ` " -"|br|:ref:`IPROTO_PING ` |br|:ref:`IPROTO_JOIN " -"` |br|:ref:`IPROTO_SUBSCRIBE ` " -"|br|:ref:`IPROTO_VOTE_DEPRECATED ` |br|:ref:`IPROTO_VOTE " -"` |br|:ref:`IPROTO_FETCH_SNAPSHOT ` " -"|br|:ref:`IPROTO_REGISTER ` |br|:ref:`IPROTO_BEGIN " -"` |br|:ref:`IPROTO_COMMIT ` " -"|br|:ref:`IPROTO_ROLLBACK `" - -msgid "Body of a request" -msgstr "Тело запроса" - -msgid ":ref:`Responses if no error and no SQL `" -msgstr ":ref:`Ответы на ошибки и запросы без SQL `" - -msgid "Responses for no SQL" -msgstr "Ответы на запросы без SQL" - -msgid ":ref:`Responses for errors `" -msgstr ":ref:`Ответы на ошибки `" - -msgid "Responses for errors" -msgstr "Ответы на ошибки" - -msgid ":ref:`Responses for SQL `" -msgstr ":ref:`Ответы на запросы с SQL `" - -msgid "Responses for SQL" -msgstr "Ответы на запросы с SQL" - -msgid ":ref:`Authentication `" -msgstr ":ref:`Аутентификация `" - -msgid "Authentication after connection" -msgstr "Аутентификация после установления соединения" - -msgid ":ref:`Replication `" -msgstr ":ref:`Репликация `" - -msgid "Replication request" -msgstr "Запрос репликации" - -msgid ":ref:`Illustration `" -msgstr ":ref:`Примеры `" - -msgid "Illustration of use" -msgstr "Примеры использования" - -msgid ":ref:`XLOG/SNAP `" -msgstr ":ref:`XLOG/SNAP `" - -msgid "Format of .xlog and .snap files" -msgstr "Формат файлов .xlog и .snap" - -msgid "Symbols and terms" -msgstr "Обозначения и термины" - -msgid "" -"Words that start with **MP_** mean: a `MessagePack " -"`_ type or a range of MessagePack types, including " -"the signal and possibly including a value, with slight modification:" -msgstr "" -"Если слово начинается с **MP_**, это указывает на тип `MessagePack " -"`_ или ряд типов MessagePack, включая сигнал и, " -"возможно, включая значение, с небольшими изменениями:" - -msgid "**MP_NIL** nil" -msgstr "**MP_NIL** nil" - -msgid "**MP_UINT** unsigned integer" -msgstr "**MP_UINT** unsigned integer" - -msgid "**MP_INT** either integer or unsigned integer" -msgstr "**MP_INT** integer или unsigned integer" - -msgid "**MP_STR** string" -msgstr "**MP_STR** string" - -msgid "**MP_BIN** binary string" -msgstr "**MP_BIN** binary string" - -msgid "**MP_ARRAY** array" -msgstr "**MP_ARRAY** array" - -msgid "**MP_MAP** map" -msgstr "**MP_MAP** map" - -msgid "**MP_BOOL** boolean" -msgstr "**MP_BOOL** boolean" - -msgid "**MP_FLOAT** float" -msgstr "**MP_FLOAT** float" - -msgid "**MP_DOUBLE** double" -msgstr "**MP_DOUBLE** double" - -msgid "" -"**MP_EXT** extension (including the :ref:`DECIMAL type ` and UUID type)" -msgstr "" -"**MP_EXT** extension (включая :ref:`тип DECIMAL ` и " -"тип UUID)" - -msgid "**MP_OBJECT** any MessagePack object" -msgstr "**MP_OBJECT** любой объект формата MessagePack" - -msgid "" -"Short descriptions are in MessagePack's `\"spec\" page " -"`_." -msgstr "" -"Краткое описание приводится на `странице \"спецификации\" " -"`_ MessagePack." - -msgid "" -"And words that start with **IPROTO_** mean: a Tarantool constant which is " -"either defined or mentioned in the `iproto_constants.h file " -"`_." -msgstr "" -"Если же слово начинается с **IPROTO_**, это указывает на константу " -"Tarantool, которая либо определена, либо упоминается в `файле " -"iproto_constants.h " -"`_." - -msgid "" -"The IPROTO constants that identify requests that we will mention in this " -"section are:" -msgstr "" -"В этом разделе мы будем упоминать следующие константы IPROTO, которые " -"идентифицируют запросы:" - -msgid "" -"IPROTO_SELECT=0x01\n" -"IPROTO_INSERT=0x02\n" -"IPROTO_REPLACE=0x03\n" -"IPROTO_UPDATE=0x04\n" -"IPROTO_DELETE=0x05\n" -"IPROTO_CALL_16=0x06\n" -"IPROTO_AUTH=0x07\n" -"IPROTO_EVAL=0x08\n" -"IPROTO_UPSERT=0x09\n" -"IPROTO_CALL=0x0a\n" -"IPROTO_EXECUTE=0x0b\n" -"IPROTO_NOP=0x0c\n" -"IPROTO_PREPARE=0x0d\n" -"IPROTO_BEGIN=0x0e\n" -"IPROTO_COMMIT=0x0f\n" -"IPROTO_ROLLBACK=0x10\n" -"IPROTO_RAFT_CONFIRM=0x28\n" -"IPROTO_RAFT_ROLLBACK=0x29\n" -"IPROTO_PING=0x40\n" -"IPROTO_JOIN=0x41\n" -"IPROTO_SUBSCRIBE=0x42\n" -"IPROTO_VOTE_DEPRECATED=0x43\n" -"IPROTO_VOTE=0x44\n" -"IPROTO_FETCH_SNAPSHOT=0x45\n" -"IPROTO_REGISTER=0x46" -msgstr "" -"IPROTO_SELECT=0x01\n" -"IPROTO_INSERT=0x02\n" -"IPROTO_REPLACE=0x03\n" -"IPROTO_UPDATE=0x04\n" -"IPROTO_DELETE=0x05\n" -"IPROTO_CALL_16=0x06\n" -"IPROTO_AUTH=0x07\n" -"IPROTO_EVAL=0x08\n" -"IPROTO_UPSERT=0x09\n" -"IPROTO_CALL=0x0a\n" -"IPROTO_EXECUTE=0x0b\n" -"IPROTO_NOP=0x0c\n" -"IPROTO_PREPARE=0x0d\n" -"IPROTO_BEGIN=0x0e\n" -"IPROTO_COMMIT=0x0f\n" -"IPROTO_ROLLBACK=0x10\n" -"IPROTO_RAFT_CONFIRM=0x28\n" -"IPROTO_RAFT_ROLLBACK=0x29\n" -"IPROTO_PING=0x40\n" -"IPROTO_JOIN=0x41\n" -"IPROTO_SUBSCRIBE=0x42\n" -"IPROTO_VOTE_DEPRECATED=0x43\n" -"IPROTO_VOTE=0x44\n" -"IPROTO_FETCH_SNAPSHOT=0x45\n" -"IPROTO_REGISTER=0x46" - -msgid "" -"The IPROTO constants that appear within requests or responses that we will " -"describe in this section are:" -msgstr "" -"В этом разделе мы опишем такие константы IPROTO, которые встречаются в " -"запросах или ответах:" - -msgid "" -"IPROTO_OK=0x00\n" -"IPROTO_REQUEST_TYPE=0x00\n" -"IPROTO_SYNC=0x01\n" -"IPROTO_REPLICA_ID=0x02\n" -"IPROTO_LSN=0x03\n" -"IPROTO_TIMESTAMP=0x04\n" -"IPROTO_SCHEMA_VERSION=0x05\n" -"IPROTO_FLAGS=0x09\n" -"IPROTO_STREAM_ID=0x0a\n" -"IPROTO_SPACE_ID=0x10\n" -"IPROTO_INDEX_ID=0x11\n" -"IPROTO_LIMIT=0x12\n" -"IPROTO_OFFSET=0x13\n" -"IPROTO_ITERATOR=0x14\n" -"IPROTO_INDEX_BASE=0x15\n" -"IPROTO_KEY=0x20\n" -"IPROTO_TUPLE=0x21\n" -"IPROTO_FUNCTION_NAME=0x22\n" -"IPROTO_USER_NAME=0x23\n" -"IPROTO_INSTANCE_UUID=0x24\n" -"IPROTO_CLUSTER_UUID=0x25\n" -"IPROTO_VCLOCK=0x26\n" -"IPROTO_EXPR=0x27\n" -"IPROTO_OPS=0x28\n" -"IPROTO_BALLOT=0x29\n" -"IPROTO_BALLOT_IS_RO_CFG=0x01\n" -"IPROTO_BALLOT_VCLOCK=0x02\n" -"IPROTO_BALLOT_GC_VCLOCK=0x03\n" -"IPROTO_BALLOT_IS_RO=0x04\n" -"IPROTO_BALLOT_IS_ANON=0x05\n" -"IPROTO_BALLOT_IS_BOOTED=0x06\n" -"IPROTO_BALLOT_CAN_LEAD=0x07\n" -"IPROTO_TUPLE_META=0x2a\n" -"IPROTO_OPTIONS=0x2b\n" -"IPROTO_DATA=0x30\n" -"IPROTO_ERROR_24=0x31\n" -"IPROTO_METADATA=0x32\n" -"IPROTO_BIND_METADATA=0x33\n" -"IPROTO_BIND_COUNT=0x34\n" -"IPROTO_SQL_TEXT=0x40\n" -"IPROTO_SQL_BIND=0x41\n" -"IPROTO_SQL_INF O=0x42\n" -"IPROTO_STMT_ID=0x43\n" -"IPROTO_ERROR=0x52\n" -"IPROTO_FIELD_NAME=0x00\n" -"IPROTO_FIELD_TYPE=0x01\n" -"IPROTO_FIELD_COLL=0x02\n" -"IPROTO_FIELD_IS_NULLABLE=0x03\n" -"IPROTO_FIELD_IS_AUTOINCREMENT=0x04\n" -"IPROTO_FIELD_SPAN=0x05" -msgstr "" - -msgid "" -"To denote message descriptions we will say ``msgpack(...)`` and within it we" -" will use modified `YAML `_ so: |br|" -msgstr "" -"Для обозначения описаний сообщений мы будем вызывать ``msgpack(...)``, а " -"внутри него будем использовать модифицированный `YAML " -"`_ таким образом: |br|" - -msgid "" -":code:`{...}` braces enclose an associative array, also called map, which in" -" MsgPack is MP_MAP, |br| :samp:`{k}: {v}` is a key-value pair, also called " -"map-item, in this section k is always an unsigned-integer value = one of the" -" IPROTO constants, |br| :samp:`{italics}` are for replaceable text, which is" -" the convention throughout this manual. Usually this is a data type but we " -"do not show types of IPROTO constants which happen to always be unsigned " -"8-bit integers, |br| :code:`[...]` is for non-associative arrays, |br| " -":code:`#` starts a comment, especially for the beginning of a section, |br| " -"everything else is \"as is\". |br| Map-items may appear in any order but in " -"examples we usually use the order that net_box.c happens to use." -msgstr "" -":code:`{...}` в фигурные скобки заключают ассоциативный массив, в MsgPack " -"это MP_MAP, |br| :samp:`{k}: {v}` — это пара \"ключ-значение\", также " -"называемая элементом ассоциативного массива, в этом разделе k всегда " -"является беззнаковым целым = одной из констант IPROTO, |br| " -":samp:`{italics}` используются для обозначения заменяемого текста в этом " -"руководстве. Обычно это тип данных, но мы не показываем типы констант " -"IPROTO, которые всегда будут беззнаковыми 8-битными целыми числами, |br| " -":code:`[...]` — для неассоциативных массивов, |br| :code:`#` начинает " -"комментарий, особенно в начале раздела, |br| все остальное приводится \"как " -"есть\". |br| Элементы ассоциативного массива могут появляться в любом " -"порядке, но в примерах мы обычно используем тот порядок, который " -"используется в net_box.c." - -msgid "Header and body" -msgstr "Заголовок и тело сообщения" - -msgid "" -"Except during connection (which involves a greeting from the server and " -"optional :ref:`authentication ` that we will " -"discuss later in this section), the protocol is pure request/response (the " -"client requests and the server responds). It is legal to put more than one " -"request in a packet." -msgstr "" -"Кроме как во время соединения (что включает в себя приветствие сервера и " -"необязательную :ref:`аутентификацию `, которую " -"мы обсудим далее в этом разделе), протокол идет по схеме \"запрос-ответ\" " -"(клиент запрашивает, сервер отвечает). Пакет может содержать более одного " -"запроса." - -msgid "" -"Almost all requests and responses contain three sections: size, header, and " -"body. The size is an (MP_UINT) unsigned integer, usually a 32-bit unsigned " -"integer. The header and body are (MP_MAP) maps." -msgstr "" -"Почти все запросы и ответы состоят из трех частей: размер, заголовок и тело." -" Размер — это unsigned integer (MP_UINT), обычно 32-битное беззнаковое целое" -" число. Заголовок и тело — это ассоциативные массивы (MP_MAP)." - -msgid "" -"# \n" -":samp:`{{MP_UINT unsigned integer}}`\n" -"#
\n" -":samp:`{{MP_MAP with
map-items}}`\n" -"# \n" -":samp:`{{MP_MAP with map-items}}`" -msgstr "" -"# \n" -":samp:`{{MP_UINT unsigned integer}}`\n" -"#
\n" -":samp:`{{MP_MAP with
map-items}}`\n" -"# \n" -":samp:`{{MP_MAP with map-items}}`" - -msgid "" -"```` is the size of the header plus the size of the body. It may be " -"useful to compare it with the number of bytes remaining in the packet." -msgstr "" -"```` — это размер заголовка плюс размер тела сообщения. Есть смысл " -"сравнивать его с количеством байтов, оставшихся в пакете." - -msgid "``
`` may contain, in any order:" -msgstr "Заголовок ``
`` может содержать такие данные в любом порядке:" - -msgid "" -"msgpack({\n" -" IPROTO_REQUEST_TYPE: :samp:`{{MP_UINT unsigned integer}}`,\n" -" IPROTO_SYNC: :samp:`{{MP_UINT unsigned integer}}`,\n" -" IPROTO_SCHEMA_VERSION: :samp:`{{MP_UINT unsigned integer}}`\n" -" IPROTO_STREAM_ID: :samp:`{{MP_UINT unsigned integer}}`\n" -"})" -msgstr "" -"msgpack({\n" -" IPROTO_REQUEST_TYPE: :samp:`{{MP_UINT unsigned integer}}`,\n" -" IPROTO_SYNC: :samp:`{{MP_UINT unsigned integer}}`,\n" -" IPROTO_SCHEMA_VERSION: :samp:`{{MP_UINT unsigned integer}}`\n" -" IPROTO_STREAM_ID: :samp:`{{MP_UINT unsigned integer}}`\n" -"})" - -msgid "" -"**IPROTO_REQUEST_TYPE** or Response-Code-Indicator = 0x00. An unsigned " -"number that indicates what will be in the ````. In requests " -"IPROTO_REQUEST_TYPE will be followed by IPROTO_SELECT etc. In responses " -"Response-Code-Indicator will be followed by IPROTO_OK etc." -msgstr "" -"**IPROTO_REQUEST_TYPE** или индикатор кода ответа (Response-Code-Indicator) " -"= 0x00. Это беззнаковое число, которое указывает на то, что будет находиться" -" в теле сообщения ````. В запросах за IPROTO_REQUEST_TYPE будет " -"следовать IPROTO_SELECT и т. д. В ответах за Response-Code-Indicator будет " -"следовать IPROTO_OK и т. д." - -msgid "" -"**IPROTO_SYNC** = 0x01. An unsigned integer that should be incremented so " -"that it is unique in every request. This integer is also returned from " -":doc:`/reference/reference_lua/box_session/sync`. The IPROTO_SYNC value of a" -" response should be the same as the IPROTO_SYNC value of a request." -msgstr "" -"**IPROTO_SYNC** = 0x01. Это беззнаковое целое число должно увеличиваться " -"так, чтобы оно было уникальным в каждом запросе. Это целое число также " -"возвращается в результате :doc:`/reference/reference_lua/box_session/sync`. " -"Значение IPROTO_SYNC в ответе должно быть таким же, как значение IPROTO_SYNC" -" в запросе." - -msgid "" -"**IPROTO_SCHEMA_VERSION** = 0x05. An unsigned number, sometimes called " -"SCHEMA_ID, that goes up when there is a major change. In a request header " -"IPROTO_SCHEMA_VERSION is optional, so the version will not be checked if it " -"is absent. In a response header IPROTO_SCHEMA_VERSION is always present, and" -" it is up to the client to check if it has changed." -msgstr "" -"**IPROTO_SCHEMA_VERSION** = 0x05. Беззнаковое число, иногда называемое " -"SCHEMA_ID, которое увеличивается при значительных изменениях. В заголовке " -"запроса IPROTO_SCHEMA_VERSION указываеть необязательно, поэтому версия не " -"будет проверяться, если она отсутствует. В заголовке ответа " -"IPROTO_SCHEMA_VERSION присутствует всегда, и клиент должен сам проверить, не" -" изменилась ли версия." - -msgid "" -"**IPROTO_STREAM_ID** = 0x0a. An unsigned number that should be unique in " -"every stream. In requests IPROTO_STREAM_ID is optional and is useful for two" -" things: ensuring that requests within transactions are done in separate " -"groups, and ensuring strictly consistent execution of requests (whether or " -"not they are within transactions). In responses IPROTO_STREAM_ID does not " -"appear. See :ref:`Binary protocol -- streams `." -msgstr "" -"**IPROTO_STREAM_ID** = 0x0a. Беззнаковое число, которое должно быть " -"уникально для каждого стрима. В запросах указывать значение IPROTO_STREAM_ID" -" необязательно. Однако оно может понадобиться, если необходимо обрабатывать " -"запросы внутри транзакций отдельными группами или выполнять запросы строго " -"последовательно независимо от того, входят ли они в ту или иную транзакцию. " -"В ответах IPROTO_STREAM_ID отсутствует. См. :ref:`Бинарный протокол -- " -"стримы`." - -msgid "" -"Have a look at file `xrow.c " -"`_ " -"function ``xrow_header_encode``, to see how Tarantool encodes the header. " -"Have a look at file net_box.c, function ``netbox_decode_data``, to see how " -"Tarantool decodes the header. For example, in a successful response to " -"``box.space:select()``, the Response-Code-Indicator value will be 0 = " -"IPROTO_OK and the array will have all the tuples of the result." -msgstr "" -"Чтобы понять, как Tarantool кодирует заголовок, обратите внимание на функцию" -" ``xrow_header_encode`` в файле `xrow.c " -"`_. Чтобы" -" увидеть, как Tarantool декодирует заголовок, посмотрите функцию " -"``netbox_decode_data`` в файле net_box.c. Например, при успешном ответе на " -"``box.space:select()`` значение индикатора кода ответа будет 0 = IPROTO_OK, " -"а массив будет содержать все кортежи из результата." - - -msgid "IPROTO_CONFIRM = 0x28" -msgstr "IPROTO_CONFIRM = 0x28" - -msgid "" -"This message confirms that the transactions originated from the instance " -"with id = IPROTO_REPLICA_ID have achieved quorum and can be committed, up to" -" and including LSN = IPROTO_LSN. Prior to Tarantool :tarantool-release:`2.10.0`, " -"IPROTO_RAFT_CONFIRM was called IPROTO_CONFIRM." -msgstr "" -"Это сообщение подтверждает, что транзакции до ``LSN = IPROTO_LSN`` " -"включительно из экземпляра с ``id = IPROTO_REPLICA_ID`` набрали кворум и " -"могут пройти коммит. До версии Tarantool :tarantool-release:`2.10.0` запрос " -"IPROTO_RAFT_CONFIRM назывался IPROTO_CONFIRM." - -msgid "The body is a 2-item map:" -msgstr "" -"Тело сообщения представляет собой ассоциативный массив из 2 элементов:" - -msgid "" -"# \n" -"msgpack(:samp:`{{MP_UINT unsigned integer = size(
) + size()}}`)\n" -"#
\n" -"msgpack({\n" -" IPROTO_REQUEST_TYPE: IPROTO_RAFT_CONFIRM,\n" -" IPROTO_SYNC: :samp:`{{MP_UINT unsigned integer}}`\n" -"})\n" -"# \n" -"msgpack({\n" -" IPROTO_REPLICA_ID: :samp:`{{MP_INT integer}}`,\n" -" IPROTO_LSN: :samp:`{{MP_INT integer}}`\n" -"})" -msgstr "" -"# \n" -"msgpack(:samp:`{{MP_UINT unsigned integer = size(
) + size()}}`)\n" -"#
\n" -"msgpack({\n" -" IPROTO_REQUEST_TYPE: IPROTO_RAFT_CONFIRM,\n" -" IPROTO_SYNC: :samp:`{{MP_UINT unsigned integer}}`\n" -"})\n" -"# \n" -"msgpack({\n" -" IPROTO_REPLICA_ID: :samp:`{{MP_INT integer}}`,\n" -" IPROTO_LSN: :samp:`{{MP_INT integer}}`\n" -"})" - -msgid "IPROTO_ROLLBACK = 0x29" -msgstr "IPROTO_ROLLBACK = 0x29" - -msgid "" -"This message says that the transactions originated from the instance with id" -" = IPROTO_REPLICA_ID couldn't achieve quorum for some reason and should be " -"rolled back, down to LSN = IPROTO_LSN and including it. Prior to Tarantool " -"version 2.10, IPROTO_RAFT_ROLLBACK was called IPROTO_ROLLBACK." -msgstr "" -"В этом сообщении говорится, что транзакции до ``LSN = IPROTO_LSN`` " -"включительно из экземпляра с ``id = IPROTO_REPLICA_ID`` не смогли набрать " -"кворум и будут отменены. До версии Tarantool 2.10 запрос " -"IPROTO_RAFT_ROLLBACK назывался IPROTO_ROLLBACK." - -msgid "" -"# \n" -"msgpack(:samp:`{{MP_UINT unsigned integer = size(
) + size()}}`)\n" -"#
\n" -"msgpack({\n" -" IPROTO_REQUEST_TYPE: IPROTO_RAFT_ROLLBACK,\n" -" IPROTO_SYNC: :samp:`{{MP_UINT unsigned integer}}`\n" -"})\n" -"# \n" -"msgpack({\n" -" IPROTO_REPLICA_ID: :samp:`{{MP_INT integer}}`,\n" -" IPROTO_LSN: :samp:`{{MP_INT integer}}`\n" -"})" -msgstr "" -"# \n" -"msgpack(:samp:`{{MP_UINT unsigned integer = size(
) + size()}}`)\n" -"#
\n" -"msgpack({\n" -" IPROTO_REQUEST_TYPE: IPROTO_RAFT_ROLLBACK,\n" -" IPROTO_SYNC: :samp:`{{MP_UINT unsigned integer}}`\n" -"})\n" -"# \n" -"msgpack({\n" -" IPROTO_REPLICA_ID: :samp:`{{MP_INT integer}}`,\n" -" IPROTO_LSN: :samp:`{{MP_INT integer}}`\n" -"})" - -msgid "Responses if no error and no SQL" -msgstr "Ответы на запросы без ошибок и без SQL" - -msgid "" -"After the :ref:`header `, for a response, there will be" -" a body. If there was no error, it will contain IPROTO_OK (0x00). If there " -"was an error, it will contain an error code other than IPROTO_OK. Responses " -"to SQL statements are slightly different and will be described in the later " -"section, :ref:`Binary protocol -- responses for SQL `." -msgstr "" -"В ответе после :ref:`заголовка ` идет тело сообщения. " -"Если ошибки не было, оно будет содержать IPROTO_OK (0x00). Если была ошибка," -" то он будет содержать код ошибки, отличный от IPROTO_OK. Ответы на " -"операторы SQL немного отличаются и будут описаны в последующем разделе " -":ref:`Ответы на SQL-запросы `." - -msgid "" -"For IPROTO_OK, the header Response-Code-Indicator will be 0 and the body is " -"a 1-item map." -msgstr "" -"Для IPROTO_OK индикатор кода ответа в заголовке будет 0, а тело сообщения " -"будет представлять собой ассоциативный массив, состоящий из 1 элемента." - -msgid "" -"# \n" -"msgpack(:samp:`{{MP_UINT unsigned integer = size(
) + size()}}`)\n" -"#
\n" -"msgpack({\n" -" Response-Code-Indicator: IPROTO_OK,\n" -" IPROTO_SYNC: :samp:`{{MP_UINT unsigned integer, may be 64-bit}}`,\n" -" IPROTO_SCHEMA_VERSION: :samp:`{{MP_UINT unsigned integer}}`\n" -"})\n" -"# \n" -"msgpack({\n" -" IPROTO_DATA: :samp:`{{any type}}`\n" -"})" -msgstr "" -"# \n" -"msgpack(:samp:`{{MP_UINT unsigned integer = size(
) + size()}}`)\n" -"#
\n" -"msgpack({\n" -" Response-Code-Indicator: IPROTO_OK,\n" -" IPROTO_SYNC: :samp:`{{MP_UINT unsigned integer, may be 64-bit}}`,\n" -" IPROTO_SCHEMA_VERSION: :samp:`{{MP_UINT unsigned integer}}`\n" -"})\n" -"# \n" -"msgpack({\n" -" IPROTO_DATA: :samp:`{{any type}}`\n" -"})" - -msgid "" -"For :ref:`IPROTO_PING ` the body will be an empty map. " -"For most data-access requests (IPROTO_SELECT IPROTO_INSERT IPROTO_DELETE " -"etc.) the body is an IPROTO_DATA map with an array of tuples that contain an" -" array of fields. For :ref:`IPROTO_EVAL ` and " -":ref:`IPROTO_CALL ` it will usually be an array but, " -"since Lua requests can result in a wide variety of structures, bodies can " -"have a wide variety of structures." -msgstr "" -"В теле сообщения :ref:`IPROTO_PING ` будет пустой " -"ассоциативный массив. В теле большинства запросов доступа к данным " -"(IPROTO_SELECT, IPROTO_INSERT, IPROTO_DELETE и т.д.) будет ассоциативный " -"массив IPROTO_DATA с массивом кортежей, содержащих массив полей. Для " -":ref:`IPROTO_EVAL ` и :ref:`IPROTO_CALL ` телом обычно будет массив, но поскольку запросы на Lua могут " -"возвращать самые разные структуры, сами тела могут содержать самые разные " -"структуры." - -msgid "" -"If this is the fifth message and the request is " -":codenormal:`box.space.`:codeitalic:`space-name`:codenormal:`:insert{6}`, " -"and the previous schema version was 100, a successful response will look " -"like this:" -msgstr "" -"Если это пятое сообщение, запрос такой: " -":codenormal:`box.space.`:codeitalic:`space-name`:codenormal:`:insert{6}`, и " -"предыдущая версия схемы была 100, ответ после успешного выполнения будет " -"выглядеть следующим образом:" - -msgid "" -"# \n" -"msgpack(32)\n" -"#
\n" -"msgpack({\n" -" Response-Code-Indicator: IPROTO_OK,\n" -" IPROTO_SYNC: 5,\n" -" IPROTO_SCHEMA_VERSION: 100\n" -"})\n" -"# \n" -"msgpack({\n" -" IPROTO_DATA: [[6]]\n" -"})" -msgstr "" -"# \n" -"msgpack(32)\n" -"#
\n" -"msgpack({\n" -" Response-Code-Indicator: IPROTO_OK,\n" -" IPROTO_SYNC: 5,\n" -" IPROTO_SCHEMA_VERSION: 100\n" -"})\n" -"# \n" -"msgpack({\n" -" IPROTO_DATA: [[6]]\n" -"})" - -msgid "" -"Later in :ref:`Binary protocol -- illustration ` " -"we will show actual byte codes of the response to the IPROTO_INSERT message." -msgstr "" -"Далее в разделе :ref:`Примеры ` будут приведены " -"байт-коды ответа на сообщение IPROTO_INSERT." - -msgid "" -"IPROTO_DATA is what we get with net_box and :ref:`Module buffer ` so if we were using net_box we could decode with " -":ref:`msgpack.decode_unchecked() `, or we " -"could convert to a string with :samp:`ffi.string({pointer},{length})`. The " -":ref:`pickle.unpack() ` function might also be helpful." -msgstr "" -"IPROTO_DATA возвращается в результате использования net_box и :ref:`модуля " -"buffer `. То есть если бы мы использовали net_box, то могли " -"бы интерпретировать результат с помощью :ref:`msgpack.decode_unchecked() " -"` или преобразовать его в строку с помощью " -":samp:`ffi.string({pointer},{length})`. Также здесь можно использовать " -"функцию :ref:`pickle.unpack() `." - -msgid "Responses for no error and out-of-band" -msgstr "Ответы на внеполосные сообщения" - -msgid "If the response is out-of-band, due to use of" -" :ref:`box.session.push() `," -" then the header Response-Code-Indicator will be IPROTO_CHUNK instead of IPROTO_OK." -msgstr "Если используется :ref:`box.session.push() `," -" значением заголовка Response-Code-Indicator для внеполосных сообщений " -"будет IPROTO_CHUNK, а не IPROTO_OK." - -msgid "" -"For a response other than IPROTO_OK, the header Response-Code-Indicator will" -" be ``0x8XXX`` and the body will be a 1-item map." -msgstr "" -"Для ответа, отличного от IPROTO_OK, индикатор кода ответа в заголовке будет " -"``0x8XXX``, а тело будет представлять собой ассоциативный массив, состоящий " -"из 1 элемента." - -msgid "" -"# \n" -"msgpack(32)\n" -"#
\n" -"msgpack({\n" -" Response-Code-Indicator: :samp:`{{0x8XXX}}`,\n" -" IPROTO_SYNC: :samp:`{{MP_UINT unsigned integer, may be 64-bit}}`,\n" -" IPROTO_SCHEMA_VERSION: :samp:`{{MP_UINT unsigned integer}}`\n" -"})\n" -"# \n" -"msgpack({\n" -" IPROTO_ERROR: :samp:`{{MP_STRING string}}`\n" -"})" -msgstr "" -"# \n" -"msgpack(32)\n" -"#
\n" -"msgpack({\n" -" Response-Code-Indicator: :samp:`{{0x8XXX}}`,\n" -" IPROTO_SYNC: :samp:`{{MP_UINT unsigned integer, may be 64-bit}}`,\n" -" IPROTO_SCHEMA_VERSION: :samp:`{{MP_UINT unsigned integer}}`\n" -"})\n" -"# \n" -"msgpack({\n" -" IPROTO_ERROR: :samp:`{{MP_STRING string}}`\n" -"})" - -msgid "" -"where ``0x8XXX`` is the indicator for an error and ``XXX`` is a value in " -"`src/box/errcode.h " -"`_. " -"``src/box/errcode.h`` also has some convenience macros which define " -"hexadecimal constants for return codes." -msgstr "" -"где ``0x8XXX`` — это индикатор ошибки, а ``XXX`` — это значение из файла " -"`src/box/errcode.h " -"`_. В " -"``src/box/errcode.h`` также есть несколько удобных макросов, которые " -"определяют шестнадцатеричные константы для кодов возврата." - -msgid "" -"In version 2.4.0 and earlier, if this is the fifth message and the " -"request is to create a duplicate space with " -"``conn:eval([[box.schema.space.create('_space');]])`` the unsuccessful " -"response will look like this:" -msgstr "" -"В версии 2.4.0 и раньше, если это пятое сообщение и отправляется " -"запрос на создание дубликата спейса с помощью " -"``conn:eval([[box.schema.space.create('_space');]])``, то ответ на " -"невыполненный запрос будет выглядеть следующим образом:" - -msgid "" -"# \n" -"msgpack(32)\n" -"#
\n" -"msgpack({\n" -" Response-Code-Indicator: 0x800a,\n" -" IPROTO_SYNC: 5,\n" -" IPROTO_SCHEMA_VERSION: 0x78\n" -"})\n" -"# \n" -"msgpack({\n" -" IPROTO_ERROR: \"Space '_space' already exists\"\n" -"})" -msgstr "" -"# \n" -"msgpack(32)\n" -"#
\n" -"msgpack({\n" -" Response-Code-Indicator: 0x800a,\n" -" IPROTO_SYNC: 5,\n" -" IPROTO_SCHEMA_VERSION: 0x78\n" -"})\n" -"# \n" -"msgpack({\n" -" IPROTO_ERROR: \"Space '_space' already exists\"\n" -"})" - -msgid "" -"Later in :ref:`Binary protocol -- illustration ` " -"we will show actual byte codes of the response to the IPROTO_EVAL message." -msgstr "" -"Далее в разделе :ref:`Примеры ` будут приведены " -"байт-коды ответа на сообщение IPROTO_EVAL." - -msgid "" -"Looking in errcode.h we find that error code 0x0a (decimal 10) is " -"ER_SPACE_EXISTS, and the string associated with ER_SPACE_EXISTS is \"Space " -"'%s' already exists\"." -msgstr "" -"Заглянув в errcode.h, по коду ошибки 0x0a (10 в десятичной системе) мы " -"обнаружим ER_SPACE_EXISTS, чему соответствует строка \"Space '%s' already " -"exists\" (\"Спейс '%s' уже существует\")." - -msgid "" -"Since version :doc:`2.4.1 `, responses for errors have extra" -" information following what was described above. This extra information is " -"given via MP_ERROR extension type. See details in :ref:`MessagePack " -"extensions ` section." -msgstr "" -"Начиная с версии :doc:`2.4.1 `, ответы на ошибки содержат " -"дополнительную информацию, как описано выше. Эта дополнительная информация " -"передается с помощью расширения MP_ERROR. Подробную информацию см. в разделе" -" :ref:`расширения MessagePack `." - -msgid "" -"After the :ref:`header `, for a response to an SQL " -"statement, there will be a body that is slightly different from the body for" -" :ref:`Binary protocol -- responses if no error and no SQL `." -msgstr "" -"В ответе на SQL-запрос после :ref:`заголовка ` идет " -"тело сообщения, которое немного отличается от тела сообщения, описанного в " -"разделе :ref:`Ответы на запросы без ошибок и без SQL `." - -msgid "" -"If the SQL request is not SELECT or VALUES or PRAGMA, then the response body" -" contains only IPROTO_SQL_INFO (0x42). Usually IPROTO_SQL_INFO is a map with" -" only one item -- SQL_INFO_ROW_COUNT (0x00) -- which is the number of " -"changed rows." -msgstr "" -"Если SQL-запрос не содержит операторы SELECT, VALUES или PRAGMA, то тело " -"ответа содержит только IPROTO_SQL_INFO (0x42). Обычно IPROTO_SQL_INFO " -"представляет собой ассоциативный массив с одним элементом — " -"SQL_INFO_ROW_COUNT (0x00) — количество измененных строк." - -msgid "" -"# \n" -"msgpack(:samp:`{{MP_UINT unsigned integer = size(
) + size()}}`)\n" -"#
\n" -"msgpack({\n" -" Response-Code-Indicator: IPROTO_OK,\n" -" IPROTO_SYNC: :samp:`{{MP_UINT unsigned integer, may be 64-bit}}`,\n" -" IPROTO_SCHEMA_VERSION: :samp:`{{MP_UINT unsigned integer}}`\n" -"})\n" -"# \n" -"msgpack({\n" -" IPROTO_SQL_INFO: {\n" -" SQL_INFO_ROW_COUNT: :samp:`{{MP_UINT}}`\n" -" }\n" -"})" -msgstr "" -"# \n" -"msgpack(:samp:`{{MP_UINT unsigned integer = size(
) + size()}}`)\n" -"#
\n" -"msgpack({\n" -" Response-Code-Indicator: IPROTO_OK,\n" -" IPROTO_SYNC: :samp:`{{MP_UINT unsigned integer, may be 64-bit}}`,\n" -" IPROTO_SCHEMA_VERSION: :samp:`{{MP_UINT unsigned integer}}`\n" -"})\n" -"# \n" -"msgpack({\n" -" IPROTO_SQL_INFO: {\n" -" SQL_INFO_ROW_COUNT: :samp:`{{MP_UINT}}`\n" -" }\n" -"})" - -msgid "" -"For example, if the request is :samp:`INSERT INTO {table-name} VALUES (1), " -"(2), (3)`, then the response body contains an :samp:`IPROTO_SQL_INFO map " -"with SQL_INFO_ROW_COUNT = 3`. :samp:`SQL_INFO_ROW_COUNT` can be 0 for " -"statements that do not change rows, but can be 1 for statements that create " -"new objects." -msgstr "" -"Например, для запроса :samp:`INSERT INTO {table-name} VALUES (1), (2), (3)` " -"тело ответа содержит ассоциативный массив :samp:`IPROTO_SQL_INFO с " -"SQL_INFO_ROW_COUNT = 3`. :samp:`SQL_INFO_ROW_COUNT` может быть 0, если " -"оператор не изменяет строку, и может быть 1, если оператор создает новый " -"объект." - -msgid "" -"The IPROTO_SQL_INFO map may contain a second item -- " -":samp:`SQL_INFO_AUTO_INCREMENT_IDS (0x01)` -- which is the new primary-key " -"value (or values) for an INSERT in a table defined with PRIMARY KEY " -"AUTOINCREMENT. In this case the MP_MAP will have two keys, and one of the " -"two keys will be 0x01: SQL_INFO_AUTO_INCREMENT_IDS, which is an array of " -"unsigned integers." -msgstr "" -"Ассоциативный массив IPROTO_SQL_INFO может содержать второй элемент " -":samp:`SQL_INFO_AUTO_INCREMENT_IDS (0x01)`, который представляет собой новое" -" значение (или значения) первичного ключа в операции вставки INSERT в " -"таблицу с автоматическим увеличением первичного ключа PRIMARY KEY " -"AUTOINCREMENT. В этом случае MP_MAP будет содержать два ключа, и одним из " -"двух ключей будет 0x01: SQL_INFO_AUTO_INCREMENT_IDS, который представляет " -"собой массив целых беззнаковых чисел." - -msgid "" -"If the SQL statement is SELECT or VALUES or PRAGMA, the response contains:" -msgstr "" -"Если запрос содержит SQL-оператор SELECT, VALUES или PRAGMA, ответ будет:" - -msgid "" -"# \n" -"msgpack(32)\n" -"#
\n" -"msgpack({\n" -" Response-Code-Indicator: IPROTO_OK,\n" -" IPROTO_SYNC: :samp:`{{MP_UINT unsigned integer, may be 64-bit}}`,\n" -" IPROTO_SCHEMA_VERSION: :samp:`{{MP_UINT unsigned integer}}`\n" -"})\n" -"# \n" -"msgpack({\n" -" IPROTO_METADATA: :samp:`{{array of column maps}}`,\n" -" IPROTO_DATA: :samp:`{{array of tuples}}`\n" -"})" -msgstr "" -"# \n" -"msgpack(32)\n" -"#
\n" -"msgpack({\n" -" Response-Code-Indicator: IPROTO_OK,\n" -" IPROTO_SYNC: :samp:`{{MP_UINT unsigned integer, may be 64-bit}}`,\n" -" IPROTO_SCHEMA_VERSION: :samp:`{{MP_UINT unsigned integer}}`\n" -"})\n" -"# \n" -"msgpack({\n" -" IPROTO_METADATA: :samp:`{{array of column maps}}`,\n" -" IPROTO_DATA: :samp:`{{array of tuples}}`\n" -"})" - -msgid "" -":samp:`IPROTO_METADATA: {array of column maps}` = array of column maps, with" -" each column map containing at least IPROTO_FIELD_NAME (0x00) and MP_STR, " -"and IPROTO_FIELD_TYPE (0x01) and MP_STR. Additionally, if " -"``sql_full_metadata`` in the :ref:`_session_settings ` system space is TRUE, then the array will have these " -"additional column maps which correspond to components described in the " -":ref:`box.execute() ` section:" -msgstr "" -":samp:`IPROTO_METADATA: {array of column maps}` --- массив ассоциативных " -"массивов, причем каждый ассоциативный массив содержит по крайней мере " -"IPROTO_FIELD_NAME (0x00) + MP_STR и IPROTO_FIELD_TYPE (0x01) + MP_STR. Кроме" -" того, если в системном спейсе :ref:`_session_settings ` задано значение TRUE для ``sql_full_metadata``, то массив" -" будет содержать такие дополнительные ассоциативные массивы, которые " -"соответствуют компонентам, описанным в разделе :ref:`box.execute() `:" - -msgid "" -"IPROTO_FIELD_COLL (0x02) and MP_STR\n" -"IPROTO_FIELD_IS_NULLABLE (0x03) and MP_BOOL\n" -"IPROTO_FIELD_IS_AUTOINCREMENT (0x04) and MP_BOOL\n" -"IPROTO_FIELD_SPAN (0x05) and MP_STR or MP_NIL" -msgstr "" -"IPROTO_FIELD_COLL (0x02) + MP_STR\n" -"IPROTO_FIELD_IS_NULLABLE (0x03) + MP_BOOL\n" -"IPROTO_FIELD_IS_AUTOINCREMENT (0x04) + MP_BOOL\n" -"IPROTO_FIELD_SPAN (0x05) + MP_STR или MP_NIL" - -msgid ":samp:`IPROTO_DATA:{array of tuples}` = the result set \"rows\"." -msgstr "" -":samp:`IPROTO_DATA:{array of tuples}` = строки результирующего набора." - -msgid "" -"If we ask for full metadata by saying |br| " -":code:`conn.space._session_settings:update('sql_full_metadata', {{'=', " -"'value', true}})` |br| and we select the two rows from a table named t1 that" -" has columns named DD and Д, with |br| :code:`conn:execute([[SELECT dd, дд " -"AS д FROM t1;]])` |br| we could get this response, in the body:" -msgstr "" -"Если мы запросим полные метаданные, вызвав |br| " -":code:`conn.space._session_settings:update('sql_full_metadata', {{'=', " -"'value', true}})` |br| и выберем две строки из таблицы t1, в которой есть " -"столбцы DD и Д, с помощью |br| :code:`conn:execute([[SELECT dd, дд AS д FROM" -" t1;]])` |br| мы можем получить такой ответ:" - -msgid "" -"# \n" -"msgpack({\n" -" IPROTO_METADATA: [\n" -" IPROTO_FIELD_NAME: 'DD',\n" -" IPROTO_FIELD_TYPE: 'integer',\n" -" IPROTO_FIELD_IS_NULLABLE: false,\n" -" IPROTO_FIELD_IS_AUTOINCREMENT: true,\n" -" IPROTO_FIELD_SPAN: nil,\n" -" IPROTO_FIELD_NAME: 'Д',\n" -" IPROTO_FIELD_TYPE: 'string',\n" -" IPROTO_FIELD_COLL: 'unicode',\n" -" IPROTO_FIELD_IS_NULLABLE: true,\n" -" IPROTO_FIELD_SPAN: 'дд'\n" -" ],\n" -" IPROTO_DATA: [\n" -" [1,'a'],\n" -" [2,'b']'\n" -" ]\n" -"})" -msgstr "" -"# \n" -"msgpack({\n" -" IPROTO_METADATA: [\n" -" IPROTO_FIELD_NAME: 'DD',\n" -" IPROTO_FIELD_TYPE: 'integer',\n" -" IPROTO_FIELD_IS_NULLABLE: false,\n" -" IPROTO_FIELD_IS_AUTOINCREMENT: true,\n" -" IPROTO_FIELD_SPAN: nil,\n" -" IPROTO_FIELD_NAME: 'Д',\n" -" IPROTO_FIELD_TYPE: 'string',\n" -" IPROTO_FIELD_COLL: 'unicode',\n" -" IPROTO_FIELD_IS_NULLABLE: true,\n" -" IPROTO_FIELD_SPAN: 'дд'\n" -" ],\n" -" IPROTO_DATA: [\n" -" [1,'a'],\n" -" [2,'b']'\n" -" ]\n" -"})" - -msgid "" -"If instead we said |br| :code:`conn:prepare([[SELECT dd, дд AS д FROM " -"t1;]])` |br| then we could get almost the same response, but there would be " -"no IPROTO_DATA and there would be two additional items: |br| ``34 00 = " -"IPROTO_BIND_COUNT and MP_UINT = 0`` (there are no parameters to bind), |br| " -"``33 90 = IPROTO_BIND_METADATA and MP_ARRAY, size 0`` (there are no " -"parameters to bind)." -msgstr "" -"Если бы вместо этого мы вызвали :code:`conn:prepare([[SELECT dd, дд AS д " -"FROM t1;]])`, мы получили бы почти такой же ответ, но без IPROTO_DATA и с " -"двумя дополнительными элементами: |br| ``34`` (IPROTO_BIND_COUNT) и ``00`` " -"(MP_UINT = 0, нет параметров), ``33`` (IPROTO_BIND_METADATA) и ``90`` " -"(MP_ARRAY размера 0, нет параметров)." - -msgid "" -"# \n" -"msgpack({\n" -" IPROTO_STMT_ID: :samp:`{{MP_UINT unsigned integer}}`,\n" -" IPROTO_BIND_COUNT: :samp:`{{MP_INT integer}}`,\n" -" IPROTO_BIND_METADATA: :samp:`{{array of parameter descriptors}}`,\n" -" IPROTO_METADATA: [\n" -" IPROTO_FIELD_NAME: 'DD',\n" -" IPROTO_FIELD_TYPE: 'integer',\n" -" IPROTO_FIELD_IS_NULLABLE: false\n" -" IPROTO_FIELD_IS_AUTOINCREMENT: true\n" -" IPROTO_FIELD_SPAN: nil,\n" -" IPROTO_FIELD_NAME: 'Д',\n" -" IPROTO_FIELD_TYPE: 'string',\n" -" IPROTO_FIELD_COLL: 'unicode',\n" -" IPROTO_FIELD_IS_NULLABLE: true,\n" -" IPROTO_FIELD_SPAN: 'дд'\n" -" ]\n" -" })" -msgstr "" -"# \n" -"msgpack({\n" -" IPROTO_STMT_ID: :samp:`{{MP_UINT unsigned integer}}`,\n" -" IPROTO_BIND_COUNT: :samp:`{{MP_INT integer}}`,\n" -" IPROTO_BIND_METADATA: :samp:`{{array of parameter descriptors}}`,\n" -" IPROTO_METADATA: [\n" -" IPROTO_FIELD_NAME: 'DD',\n" -" IPROTO_FIELD_TYPE: 'integer',\n" -" IPROTO_FIELD_IS_NULLABLE: false\n" -" IPROTO_FIELD_IS_AUTOINCREMENT: true\n" -" IPROTO_FIELD_SPAN: nil,\n" -" IPROTO_FIELD_NAME: 'Д',\n" -" IPROTO_FIELD_TYPE: 'string',\n" -" IPROTO_FIELD_COLL: 'unicode',\n" -" IPROTO_FIELD_IS_NULLABLE: true,\n" -" IPROTO_FIELD_SPAN: 'дд'\n" -" ]\n" -" })" - -msgid "" -"Now read the source code file `net_box.c " -"`_" -" where the function \"decode_metadata_optional\" is an example of how " -"Tarantool itself decodes extra items." -msgstr "" -"Теперь обратитесь к файлу исходного кода `net_box.c " -"`_," -" где функция \"decode_metadata_optional\" показывает, как Tarantool сам " -"интерпретирует дополнительные элементы." - -msgid "" -"Later in :ref:`Binary protocol -- illustration ` " -"we will show actual byte codes of responses to the above SQL messages." -msgstr "" -"Далее в разделе :ref:`Примеры ` будут рассмотрены" -" байт-коды ответов на вышеприведенные SQL сообщения." -<<<<<<< HEAD - -msgid "Authentication" -msgstr "Аутентификация" - -msgid "Greeting message" -msgstr "Приветствие" - -msgid "" -"When a client connects to the server instance, the instance responds with a " -"128-byte text greeting message, not in MsgPack format: |br| 64-byte Greeting" -" text line 1 |br| 64-byte Greeting text line 2 |br| 44-byte base64-encoded " -"salt |br| 20-byte NULL" -msgstr "" -"Когда клиент подключается к экземпляру сервера, тот выдает в ответе " -"128-байтовое текстовое сообщение приветствия не в формате MsgPack: |br| 64 " -"байта — строка 1 текста приветствия |br| 64 байта — строка 2 текста " -"приветствия |br| 44 байта —закодированное в формате base-64 значение соль " -"|br| 20 байтов — NULL" - -msgid "" -"The greeting contains two 64-byte lines of ASCII text. Each line ends with a" -" newline character (:code:`\\n`). The first line contains the instance " -"version and protocol type. The second line contains up to 44 bytes of " -"base64-encoded random string, to use in the authentication packet, and ends " -"with up to 23 spaces." -msgstr "" -"Приветствие содержит две 64-байтные строки текста в формате ASCII. Каждая " -"строка заканчивается символом разрыва строки (:code:`\\n`). Первая строка " -"описывает версию экземпляра и тип протокола. Вторая строка содержит " -"случайную строку в кодировке base-64 размером до 44 байтов для использования" -" в пакете аутентификации и заканчивается на пробелы (до 23)." - -msgid "" -"Part of the greeting is a base64-encoded session salt - a random string " -"which can be used for authentication. The maximum length of an encoded salt " -"(44 bytes) is more than the amount necessary to create the authentication " -"message. An excess is reserved for future authentication schemas." -msgstr "" -"Часть приветствия представляет собой закодированное в формате base-64 " -"значение соль для сессии (случайная строка), которое можно использовать для " -"аутентификации. Максимальная длина закодированного значения соль (44 байта) " -"больше, чем размер создаваемого сообщения аутентификации. Остаток " -"предназначается для будущих схем аутентификации." - -msgid "" -"Authentication is optional -- if it is skipped, then the session user is " -"``'guest'`` (the ``'guest'`` user does not need a password)." -msgstr "" -"Аутентификация необязательна: если аутентификация не проводится, то " -"пользователем в сеансе будет ``'guest'`` (пользователю ``'guest'`` пароль не" -" нужен)." - -msgid "" -"If authentication is not skipped, then at any time an authentication packet " -"can be prepared using the greeting, the user's name and password, and `sha-1" -" `_ functions, as follows." -msgstr "" -"Если аутентификация проводится, то в любое время может быть подготовлен " -"пакет аутентификации с использованием приветствия, имени и пароля " -"пользователя и функции `sha-1 `_, как " -"показано ниже." - -msgid "" -"PREPARE SCRAMBLE:\n" -"\n" -" size_of_encoded_salt_in_greeting = 44;\n" -" size_of_salt_after_base64_decode = 32;\n" -" /* sha1() will only use the first 20 bytes */\n" -" size_of_any_sha1_digest = 20;\n" -" size_of_scramble = 20;\n" -"\n" -"prepare 'chap-sha1' scramble:\n" -"\n" -" salt = base64_decode(encoded_salt);\n" -" step_1 = sha1(password);\n" -" step_2 = sha1(step_1);\n" -" step_3 = sha1(first_20_bytes_of_salt, step_2);\n" -" scramble = xor(step_1, step_3);\n" -" return scramble;" -msgstr "" -"PREPARE SCRAMBLE:\n" -"\n" -" size_of_encoded_salt_in_greeting = 44;\n" -" size_of_salt_after_base64_decode = 32;\n" -" /* sha1() will only use the first 20 bytes */\n" -" size_of_any_sha1_digest = 20;\n" -" size_of_scramble = 20;\n" -"\n" -"prepare 'chap-sha1' scramble:\n" -"\n" -" salt = base64_decode(encoded_salt);\n" -" step_1 = sha1(password);\n" -" step_2 = sha1(step_1);\n" -" step_3 = sha1(first_20_bytes_of_salt, step_2);\n" -" scramble = xor(step_1, step_3);\n" -" return scramble;" - -msgid "The client sends an authentication packet as an IPROTO_AUTH message:" -msgstr "Клиент отправляет пакет аутентификации в виде сообщения IPROTO_AUTH:" - -msgid "" -"# \n" -"msgpack(:samp:`{{MP_UINT unsigned integer = size(
) + size()}}`)\n" -"#
\n" -"msgpack({\n" -" IPROTO_REQUEST_TYPE: IPROTO_AUTH,\n" -" IPROTO_SYNC: :samp:`{{MP_UINT unsigned integer, usually = 1}}`\n" -"})\n" -"# \n" -"msgpack({\n" -" IPROTO_USER_NAME: :samp:`{{MP_STRING string }}`,\n" -" IPROTO_TUPLE: ['chap-sha1', :samp:`{{MP_STRING 20-byte string}}`]\n" -"})" -msgstr "" -"# \n" -"msgpack(:samp:`{{MP_UINT unsigned integer = size(
) + size()}}`)\n" -"#
\n" -"msgpack({\n" -" IPROTO_REQUEST_TYPE: IPROTO_AUTH,\n" -" IPROTO_SYNC: :samp:`{{MP_UINT unsigned integer, usually = 1}}`\n" -"})\n" -"# \n" -"msgpack({\n" -" IPROTO_USER_NAME: :samp:`{{MP_STRING string }}`,\n" -" IPROTO_TUPLE: ['chap-sha1', :samp:`{{MP_STRING 20-byte string}}`]\n" -"})" - -msgid "" -":code:`` holds the user name. :code:`` must be an array of 2 " -"fields: authentication mechanism (\"chap-sha1\" is the only supported " -"mechanism right now) and scramble, encrypted according to the specified " -"mechanism." -msgstr "" -":code:`` содержит имя пользователя. :code:`` должен представлять" -" собой массив из 2 полей: механизм аутентификации (на данный момент " -"поддерживается только механизм \"chap-sha1\") и сообщение, зашифрованное в " -"соответствии с указанным механизмом." - -msgid "" -"The server instance responds to an authentication packet with a standard " -"response with 0 tuples." -msgstr "" -"На пакет аутентификации экземпляр сервера отправляет стандартный ответ с 0 " -"кортежей." - -msgid "" -"To see how Tarantool handles this, look at `net_box.c " -"`_" -" function ``netbox_encode_auth``." -msgstr "" -"Чтобы понять, как Tarantool это обрабатывает, обратите внимание на функцию " -"`netbox_encode_auth`` в файле `net_box.c " -"`_." - -<<<<<<< HEAD -msgid "Binary protocol -- streams" -msgstr "Бинарный протокол — стримы" - -msgid "" -"The :ref:`Streams and interactive transactions ` feature, which " -"was added in Tarantool version :tarantool-release:`2.10.0`, allows two" -" things: sequential processing and interleaving." -msgstr "" -":ref:`Стримы и интерактивные транзакции `, добавленные в " -"Tarantool :tarantool-release:`2.10.0`, делают возможными две " -"процедуры: последовательную обработку и чередование." - -msgid "" -"Sequential processing: With streams there is a guarantee that the server " -"instance will not handle the next request in a stream until it has completed" -" the previous one." -msgstr "" -"Последовательная обработка гарантирует, что экземпляр не будет обрабатывать " -"следующий запрос в стриме, пока не завершит работу с предыдущим." - -msgid "" -"Interleaving: For example, a series of requests can include \"begin for " -"stream #1\", \"begin for stream #2\", \"insert for stream #1\", \"insert for" -" stream #2\", \"delete for stream #1\", \"commit for stream #1\", \"rollback" -" for stream #2\"." -msgstr "" -"Чередование допускает, например, такую последовательность запросов: \"begin " -"для стрима 1\", \"begin для стрима 2\", \"insert для стрима 1\", \"insert " -"для стрима 2\", \"delete для стрима 1\", \"commit для стрима 1\", \"rollback" -" для стрима 2\"." - -msgid "" -"To make these things possible, the engine should be :ref:`vinyl ` or :ref:`memtx with mvcc `, and the" -" client is responsible for ensuring that the stream identifier, unsigned " -"integer :ref:`IPROTO_STREAM_ID `, is in the " -"request header. IPROTO_STREAM_ID can be any positive 64-bit number, and " -"should be unique for the connection. If IPROTO_STREAM_ID equals zero the " -"server instance will ignore it." -msgstr "" -"Эти процедуры возможны, если используется движок :ref:`vinyl ` или :ref:`memtx с mvcc `. При этом " -"клиент отвечает за наличие идентификатора стрима, беззнакового целого числа " -":ref:`IPROTO_STREAM_ID `, в заголовке " -"запроса. Идентификатор IPROTO_STREAM_ID должен быть положительным 64-битовым" -" числом, уникальным для соединения. Если IPROTO_STREAM_ID стрима равен нулю," -" экземпляр его проигнорирует." - -msgid "" -"For example, suppose that the client has started a stream with the " -":ref:`net.box module `" -msgstr "" -"Предположим, что клиент запустил стрим с помощью :ref:`модуля " -"net.box`." - -msgid "" -"net_box = require('net.box')\n" -"conn = net_box.connect('localhost:3302')\n" -"stream = conn:new_stream()" -msgstr "" -"net_box = require('net.box')\n" -"conn = net_box.connect('localhost:3302')\n" -"stream = conn:new_stream()" - -msgid "" -"At this point the stream object will look like a duplicate of the conn " -"object, with just one additional member: ``stream_id``. Now, using stream " -"instead of conn, the client sends two requests:" -msgstr "" -"В этот момент объект ``stream`` будет выглядеть так же, как объект ``conn``," -" но включать один дополнительный элемент: ``stream_id``. Пусть теперь " -"клиент, используя ``stream`` вместо ``conn``, отправит два запроса:" - -msgid "" -"stream.space.T:insert{1}\n" -"stream.space.T:insert{2}" -msgstr "" -"stream.space.T:insert{1}\n" -"stream.space.T:insert{2}" - -msgid "" -"The header and body of these requests will be the same as in non-stream " -":ref:`IPROTO_INSERT ` requests, except that the header " -"will contain an additional item: IPROTO_STREAM_ID=0x0a with MP_UINT=0x01. It" -" happens to equal 1 for this example because each call to conn:new_stream() " -"assigns a new number, starting with 1." -msgstr "" -"Заголовок и тело этих запросов будут такими же, как в обычных запросах " -":ref:`IPROTO_INSERT `, но заголовок будет содержать " -"дополнительный элемент ``IPROTO_STREAM_ID=0x0a``, где ``MP_UINT=0x01``. В " -"этом примере значение IPROTO_STREAM_ID равно 1, так как при вызове " -"``conn:new_stream()`` идентификатору каждого нового стрима присваивается " -"уникальное значение, начиная с 1." - -msgid "" -"The client makes stream transactions by sending, in order: IPROTO_BEGIN, the" -" transaction data-change and query requests, IPROTO_COMMIT or " -"IPROTO_ROLLBACK. Each request must contain the same IPROTO_STREAM_ID value. " -"With streaming there is no need to add :ref:`IPROTO_FLAGS ` and IPROTO_FLAG_COMMIT in the header of the last request of a " -"transaction. Rollback will be automatic if disconnect occurs before commit " -"is possible." -msgstr "" -"Клиент запускает транзакцию внутри стрима, отправляя запросы в следующем " -"порядке: IPROTO_BEGIN, запросы на изменение и получение данных транзакции, " -"затем IPROTO_COMMIT или IPROTO_ROLLBACK. Каждый запрос должен содержать " -"переменную IPROTO_STREAM_ID с одним и тем же значением. Используя стримы, не" -" нужно добавлять в заголовок последнего запроса транзакции " -":ref:`IPROTO_FLAGS ` и IPROTO_FLAG_COMMIT. Если " -"транзакция прервется до того, как можно будет выполнить коммит, она будет " -"автоматически отменена." - -msgid "" -"Thus there are now multiple ways to do transactions: with net_box and " -"stream:begin() and stream:commit() or stream:rollback() which cause " -"IPROTO_BEGIN and IPROTO_COMMIT or IPROTO_ROLLBACK with the current value of " -"stream.stream_id; with :ref:`box.begin() ` and :ref:`box.commit()" -" ` or :ref:`box.rollback() `; with SQL and " -":ref:`START TRANSACTION ` and :ref:`COMMIT " -"` or :ref:`ROLLBACK `. An application can use any " -"or all of these ways." -msgstr "" -"Таким образом, у приложения есть несколько способов выполнять транзакции. " -"Во-первых, можно использовать модуль ``net_box`` с методами " -"``stream:begin()`` и ``stream:commit()``/``stream:rollback()``, которые " -"отправляют запросы IPROTO_BEGIN и IPROTO_COMMIT/IPROTO_ROLLBACK с текущим " -"значением ``stream.stream_id``. Другой способ --- применять методы " -":ref:`box.begin() ` и :ref:`box.commit() `/:ref:`box.rollback() `. Наконец, можно пользоваться " -"инструкциями SQL :ref:`START TRANSACTION ` и " -":ref:`COMMIT `/:ref:`ROLLBACK `." - -msgid "Replication" -msgstr "Репликация" - -msgid "IPROTO_JOIN = 0x41" -msgstr "IPROTO_JOIN = 0x41" - -msgid "First you must send an initial IPROTO_JOIN request." -msgstr "Сначала нужно отправить запрос IPROTO_JOIN." - -msgid "" -"# \n" -"msgpack(:samp:`{{MP_UINT unsigned integer = size(
) + size()}}`)\n" -"#
\n" -"msgpack({\n" -" IPROTO_REQUEST_TYPE: IPROTO_JOIN,\n" -" IPROTO_SYNC: :samp:`{{MP_UINT unsigned integer}}`\n" -"})\n" -"# \n" -"msgpack({\n" -" IPROTO_INSTANCE_UUID: :samp:`{{uuid}}`\n" -"})" -msgstr "" -"# \n" -"msgpack(:samp:`{{MP_UINT unsigned integer = size(
) + size()}}`)\n" -"#
\n" -"msgpack({\n" -" IPROTO_REQUEST_TYPE: IPROTO_JOIN,\n" -" IPROTO_SYNC: :samp:`{{MP_UINT unsigned integer}}`\n" -"})\n" -"# \n" -"msgpack({\n" -" IPROTO_INSTANCE_UUID: :samp:`{{uuid}}`\n" -"})" - -msgid "" -"Then the instance which you want to connect to will send its last SNAP file," -" by simply creating a number of INSERTs (with additional LSN and ServerID) " -"(do not reply to this). Then that instance will send a vclock's MP_MAP and " -"close a socket." -msgstr "" -"Затем экземпляр, к которому вы хотите подключиться, отправит свой последний " -"SNAP-файл, просто создав несколько запросов типа INSERT (с дополнительными " -"LSN и ServerID) (не отвечайте на них). Затем этот экземпляр отправит MP_MAP " -"vclock и закроет сокет." - -msgid "" -"# \n" -"msgpack(:samp:`{{MP_UINT unsigned integer = size(
) + size()}}`)\n" -"#
\n" -"msgpack({\n" -" Response-Code-Indicator: 0,\n" -" IPROTO_SYNC: :samp:`{{MP_UINT unsigned integer}}`\n" -"})\n" -"# \n" -"msgpack({\n" -" IPROTO_VCLOCK: :samp:`{{MP_INT SRV_ID, MP_INT SRV_LSN}}`\n" -"})" -msgstr "" -"# \n" -"msgpack(:samp:`{{MP_UINT unsigned integer = size(
) + size()}}`)\n" -"#
\n" -"msgpack({\n" -" Response-Code-Indicator: 0,\n" -" IPROTO_SYNC: :samp:`{{MP_UINT unsigned integer}}`\n" -"})\n" -"# \n" -"msgpack({\n" -" IPROTO_VCLOCK: :samp:`{{MP_INT SRV_ID, MP_INT SRV_LSN}}`\n" -"})" - -msgid "IPROTO_SUBSCRIBE = 0x42" -msgstr "IPROTO_SUBSCRIBE = 0x42" - -msgid "Then you must send an IPROTO_SUBSCRIBE request." -msgstr "Теперь нужно отправить запрос IPROTO_SUBSCRIBE." - -msgid "" -"# \n" -"msgpack(:samp:`{{MP_UINT unsigned integer = size(
) + size()}}`)\n" -"#
\n" -"msgpack({\n" -" IPROTO_REQUEST_TYPE: IPROTO_SUBSCRIBE,\n" -" IPROTO_SYNC: :samp:`{{MP_UINT unsigned integer}}`,\n" -" IPROTO_INSTANCE_UUID: :samp:`{{uuid}}`,\n" -" IPROTO_CLUSTER_UUID: :samp:`{{uuid}}`,\n" -"})\n" -"# \n" -"msgpack({\n" -" IPROTO_VCLOCK: :samp:`{{MP_INT SRV_ID, MP_INT SRV_LSN}}`\n" -"})" -msgstr "" -"# \n" -"msgpack(:samp:`{{MP_UINT unsigned integer = size(
) + size()}}`)\n" -"#
\n" -"msgpack({\n" -" IPROTO_REQUEST_TYPE: IPROTO_SUBSCRIBE,\n" -" IPROTO_SYNC: :samp:`{{MP_UINT unsigned integer}}`,\n" -" IPROTO_INSTANCE_UUID: :samp:`{{uuid}}`,\n" -" IPROTO_CLUSTER_UUID: :samp:`{{uuid}}`,\n" -"})\n" -"# \n" -"msgpack({\n" -" IPROTO_VCLOCK: :samp:`{{MP_INT SRV_ID, MP_INT SRV_LSN}}`\n" -"})" - -msgid "" -"Then you must process every request that could come through other masters. " -"Every request between masters will have additional LSN and SERVER_ID." -msgstr "" -"Затем нужно обработать каждый запрос, который может прийти через других " -"мастеров. В каждом запросе между мастерами будут дополнительные LSN и " -"SERVER_ID." - -msgid "HEARTBEATS" -msgstr "Контрольные сигналы" - -msgid "" -"Frequently a master sends a :ref:`heartbeat ` message to a " -"replica. For example, if there is a replica with id = 2, and a timestamp " -"with a moment in 2020, a master might send this:" -msgstr "" -"Часто мастер отправляет реплике сообщение :ref:`контрольного сигнала " -"`. Например, если есть реплика с ID = 2 и метка с моментом " -"времени в 2020 году, мастер может послать такое сообщение:" - -msgid "" -"#
\n" -"msgpack({\n" -" IPROTO_REQUEST_TYPE: 0\n" -" IPROTO_REPLICA_ID: 2\n" -" IPROTO_TIMESTAMP: :samp:`{{Float 64 MP_DOUBLE 8-byte timestamp}}`\n" -"})" -msgstr "" -"#
\n" -"msgpack({\n" -" IPROTO_REQUEST_TYPE: 0\n" -" IPROTO_REPLICA_ID: 2\n" -" IPROTO_TIMESTAMP: :samp:`{{Float 64 MP_DOUBLE 8-byte timestamp}}`\n" -"})" - -msgid "and the replica might send back this:" -msgstr "и реплика может отправить в ответ следующее:" - -msgid "" -"#
\n" -"msgpack({\n" -" Response-Code-Indicator: IPROTO_OK\n" -" IPROTO_REPLICA_ID: 2\n" -" IPROTO_VCLOCK: {1, 6}\n" -"})" -msgstr "" -"#
\n" -"msgpack({\n" -" Response-Code-Indicator: IPROTO_OK\n" -" IPROTO_REPLICA_ID: 2\n" -" IPROTO_VCLOCK: {1, 6}\n" -"})" - -msgid "" -"Later in :ref:`Binary protocol -- illustration ` " -"we will show actual byte codes of the above heartbeat examples." -msgstr "" -"Далее в разделе :ref:`Примеры ` будут рассмотрены" -" байт-коды вышеприведенных сообщений контрольного сигнала." - -msgid "BALLOTS" -msgstr "Сообщения с идентификатором BALLOT" - -msgid "" -"While connecting for replication, an instance sends a request with header " -"IPROTO_VOTE (0x44). The normal response is ER_OK,and IPROTO_BALLOT (0x29). " -"The fields within IPROTO_BALLOT are map items:" -msgstr "" -"При подключении для репликации экземпляр отправляет запрос с заголовком " -"IPROTO_VOTE (0x44). Обычно ответом будет ER_OK и IPROTO_BALLOT (0x29). Поля " -"в IPROTO_BALLOT — это элементы ассоциативного массива:" - -msgid "" -"IPROTO_BALLOT_IS_RO_CFG (0x01) + MP_BOOL\n" -"IPROTO_BALLOT_VCLOCK (0x02) + vclock\n" -"IPROTO_BALLOT_GC_VCLOCK (0x03) + vclock\n" -"IPROTO_BALLOT_IS_RO (0x04) + MP_BOOL\n" -"IPROTO_BALLOT_IS_ANON = 0x05 + MP_BOOL\n" -"IPROTO_BALLOT_IS_BOOTED = 0x06 + MP_BOOL\n" -"IPROTO_BALLOT_CAN_LEAD = 0x07 + MP_BOOL" -msgstr "" - -msgid "" -"IPROTO_BALLOT_IS_RO_CFG and IPRO_BALLOT_VCLOCK and IPROTO_BALLOT_GC_VCLOCK " -"and IPROTO_BALLOT_IS_RO were added in version :doc:`2.6.1 `." -" IPROTO_BALLOT_IS_ANON was added in version :doc:`2.7.1 `. " -"IPROTO_BALLOT_IS_BOOTED was added in version 2.7.3 and 2.8.2 and 2.9.1. " -"There have been some name changes starting with version 2.7.3 and 2.8.2 and " -"2.9.1: IPROTO_BALLOT_IS_RO_CFG was formerly called IPROTO_BALLOT_IS_RO, and " -"IPROTO_BALLOT_IS_RO was formerly called IPROTO_BALLOT_IS_LOADING." -msgstr "" -"IPROTO_BALLOT_IS_RO_CFG, IPRO_BALLOT_VCLOCK, IPROTO_BALLOT_GC_VCLOCK и " -"IPROTO_BALLOT_IS_RO добавлены в версии :doc:`2.6.1 `. " -"Константа IPROTO_BALLOT_IS_ANON добавлена в версии :doc:`2.7.1 " -"`. Константа IPROTO_BALLOT_IS_BOOTED добавлена в версиях " -"2.7.3, 2.8.2 и 2.9.1. В версиях 2.7.3, 2.8.2, 2.9.1 и более поздних " -"константа IPROTO_BALLOT_IS_RO переименована в IPROTO_BALLOT_IS_RO_CFG, а " -"IPROTO_BALLOT_IS_LOADING — в IPROTO_BALLOT_IS_RO." - -msgid "" -"IPROTO_BALLOT_IS_RO_CFG corresponds to :ref:`box.cfg.read_only `." -msgstr "" -"Значение IPROTO_BALLOT_IS_RO_CFG соответствует значению " -":ref:`box.cfg.read_only `." - -msgid "" -"IPROTO_BALLOT_GC_VCLOCK can be the vclock value of the instance's oldest WAL" -" entry, which corresponds to :ref:`box.info.gc().vclock `." -msgstr "" -"IPROTO_BALLOT_GC_VCLOCK может принимать значение vclock самой старой записи " -"журнала WAL на экземпляре. Это соответствует значению " -":ref:`box.info.gc().vclock `." - -msgid "" -"IPROTO_BALLOT_IS_RO is true if the instance is not writable, which may " -"happen for a variety of reasons, such as: it was configured as " -":ref:`read_only `, or it has :ref:`orphan status " -"`, or it is a :ref:`Raft ` " -"follower." -msgstr "" -"IPROTO_BALLOT_IS_RO принимает значение ``true``, если экземпляр недоступен " -"для записи. Причины у этого могут быть разные: например, экземпляр настроен " -"как :ref:`read_only `, :ref:`имеет статус orphan " -"` или является последователем (follower) при " -":ref:`выполнении алгоритма Raft `." - -msgid "" -"IPROTO_BALLOT_IS_ANON corresponds to :ref:`box.cfg.replication_anon " -"`." -msgstr "" -"Значение IPROTO_BALLOT_IS_ANON соответствует значению " -":ref:`box.cfg.replication_anon `." - -msgid "" -"IPROTO_BALLOT_IS_BOOTED is true if the instance has finished its bootstrap " -"or recovery process." -msgstr "" -"IPROTO_BALLOT_IS_BOOTED принимает значение ``true``, если экземпляр завершил" -" инициализацию или восстановление." - -msgid "" -"IPROTO_BALLOT_CAN_LEAD is true if the :ref:`election_mode ` configuration setting is either 'candidate' or 'manual', so " -"that during the :ref:`leader election process ` " -"this instance may be preferred over instances whose configuration setting is" -" 'voter'. IPROTO_BALLOT_CAN_LEAD support was added simultaneously in version" -" :doc:`2.7.3 ` and version :doc:`2.8.2 `." -msgstr "" - -msgid "FLAGS" -msgstr "Сообщения с идентификатором FLAG" - -msgid "" -"For replication of :ref:`synchronous transactions " -"` a header may contain a key = IPROTO_FLAGS and" -" an MP_UINT value = one or more bits: IPROTO_FLAG_COMMIT or " -"IPROTO_FLAG_WAIT_SYNC or IPROTO_FLAG_WAIT_ACK." -msgstr "" -"При репликации :ref:`синхронных транзакций ` " -"заголовок может содержать ключ = IPROTO_FLAGS и значение MP_UINT = один или " -"несколько битов: IPROTO_FLAG_COMMIT, IPROTO_FLAG_WAIT_SYNC или " -"IPROTO_FLAG_WAIT_ACK." - -msgid "" -"# \n" -"msgpack(:samp:`{{MP_UINT unsigned integer = size(
) + size()}}`)\n" -"#
\n" -"msgpack({\n" -" # ... other header items ...,\n" -" IPROTO_FLAGS: :samp:`{{MP_UINT unsigned integer}}`\n" -"})\n" -"# \n" -"msgpack({\n" -" # ... message for a transaction ...\n" -"})" -msgstr "" -"# \n" -"msgpack(:samp:`{{MP_UINT unsigned integer = size(
) + size()}}`)\n" -"#
\n" -"msgpack({\n" -" # ... другие элементы заголовка ...,\n" -" IPROTO_FLAGS: :samp:`{{MP_UINT unsigned integer}}`\n" -"})\n" -"# \n" -"msgpack({\n" -" # ... message for a transaction ...\n" -"})" - -msgid "" -"IPROTO_FLAG_COMMIT (0x01) will be set if this is the last message for a " -"transaction, IPROTO_FLAG_WAIT_SYNC (0x02) will be set if this is the last " -"message for a transaction which cannot be completed immediately, " -"IPROTO_FLAG_WAIT_ACK (0x04) will be set if this is the last message for a " -"synchronous transaction." -msgstr "" -"IPROTO_FLAG_COMMIT (0x01) указывает на последнее сообщение для транзакции. " -"IPROTO_FLAG_WAIT_SYNC (0x02) указывает на последнее сообщение для " -"транзакции, которую нельзя завершить немедленно. IPROTO_FLAG_WAIT_ACK (0x04)" -" указывает на последнее сообщение для синхронной транзакции." - msgid "Examples" msgstr "Примеры" -msgid "" -"To follow the examples in this section, get a single Linux computer and " -"start three command-line shells (\"terminals\")." -msgstr "" -"Чтобы выполнить примеры, приведенные в этом разделе, запустите на компьютере" -" с Linux три командных оболочки (терминала)." - -msgid "" -"-- On terminal #1, Start monitoring port 3302 with `tcpdump " -"`_: |br|" -msgstr "" -"-- На терминале №1 запустите мониторинг порта 3302 с помощью `tcpdump " -"`_: |br|" - -msgid "sudo tcpdump -i lo 'port 3302' -X" -msgstr "sudo tcpdump -i lo 'port 3302' -X" - -msgid "On terminal #2, start a server with:" -msgstr "На терминале №2 запустите сервер так:" - -msgid "" -"box.cfg{listen=3302}\n" -"box.schema.space.create('tspace')\n" -"box.space.tspace:create_index('I')\n" -"box.space.tspace:insert{280}\n" -"box.schema.user.grant('guest','read,write,execute,create,drop','universe')" -msgstr "" -"box.cfg{listen=3302}\n" -"box.schema.space.create('tspace')\n" -"box.space.tspace:create_index('I')\n" -"box.space.tspace:insert{280}\n" -"box.schema.user.grant('guest','read,write,execute,create,drop','universe')" - -msgid "" -"On terminal #3, start another server, which will act as a client, with:" -msgstr "" -"На терминале №3 запустите ещё один сервер, который будет выступать в " -"качестве клиента, так:" - -msgid "" -"box.cfg{}\n" -"net_box = require('net.box')\n" -"conn = net_box.connect('localhost:3302')\n" -"conn.space.tspace:select(280)" -msgstr "" -"box.cfg{}\n" -"net_box = require('net.box')\n" -"conn = net_box.connect('localhost:3302')\n" -"conn.space.tspace:select(280)" - -msgid "" -"Now look at what tcpdump shows for the job connecting to 3302 -- the " -"\"request\". After the words \"length 32\" is a packet that ends with these " -"32 bytes (we have added indented comments):" -msgstr "" -"Теперь посмотрите, что tcpdump покажет для запроса на подключение к порту " -"3302. После слов «length 32» идет пакет, который заканчивается этими 32 " -"байтами (комментарии отделены отступами):" - -msgid "" -"ce 00 00 00 1b MP_UINT = decimal 27 = number of bytes after this\n" -"82 MP_MAP, size 2 (we'll call this \"Main-Map\")\n" -"01 IPROTO_SYNC (Main-Map Item#1)\n" -"04 MP_INT = 4 = number that gets incremented with each request\n" -"00 IPROTO_REQUEST_TYPE (Main-Map Item#2)\n" -"01 IPROTO_SELECT\n" -"86 MP_MAP, size 6 (we'll call this \"Select-Map\")\n" -"10 IPROTO_SPACE_ID (Select-Map Item#1)\n" -"cd 02 00 MP_UINT = decimal 512 = id of tspace (could be larger)\n" -"11 IPROTO_INDEX_ID (Select-Map Item#2)\n" -"00 MP_INT = 0 = id of index within tspace\n" -"14 IPROTO_ITERATOR (Select-Map Item#3)\n" -"00 MP_INT = 0 = Tarantool iterator_type.h constant ITER_EQ\n" -"13 IPROTO_OFFSET (Select-Map Item#4)\n" -"00 MP_INT = 0 = amount to offset\n" -"12 IPROTO_LIMIT (Select-Map Item#5)\n" -"ce ff ff ff ff MP_UINT = 4294967295 = biggest possible limit\n" -"20 IPROTO_KEY (Select-Map Item#6)\n" -"91 MP_ARRAY, size 1 (we'll call this \"Key-Array\")\n" -"cd 01 18 MP_UINT = 280 (Select-Map Item#6, Key-Array Item#1)\n" -" -- 280 is the key value that we are searching for" -msgstr "" -"ce 00 00 00 1b MP_UINT = 27, десятичное число = число байт после этого\n" -"82 MP_MAP, размер 2 (назовем это Main-Map)\n" -"01 IPROTO_SYNC (1-й элемент Main-Map)\n" -"04 MP_INT = 4 = число, которое увеличивается на 1 с каждым запросом\n" -"00 IPROTO_REQUEST_TYPE (2-й элемент Main-Map)\n" -"01 IPROTO_SELECT\n" -"86 MP_MAP, размер 6 (назовем это Select-Map)\n" -"10 IPROTO_SPACE_ID (1-й элемент Select-Map)\n" -"cd 02 00 MP_UINT = 512, десятичное число = id tspace (может быть больше)\n" -"11 IPROTO_INDEX_ID (2-й элемент Select-Map)\n" -"00 MP_INT = 0 = id индекса в tspace\n" -"14 IPROTO_ITERATOR (3-й элемент Select-Map)\n" -"00 MP_INT = 0 = константа Tarantool iterator_type.h ITER_EQ\n" -"13 IPROTO_OFFSET (4-й элемент Select-Map)\n" -"00 MP_INT = 0 = смещение\n" -"12 IPROTO_LIMIT (5-й элемент Select-Map)\n" -"ce ff ff ff ff MP_UINT = 4294967295 = наибольший возможный предел\n" -"20 IPROTO_KEY (6-й элемент Select-Map)\n" -"91 MP_ARRAY, размер 1 (назовем это Key-Array)\n" -"cd 01 18 MP_UINT = 280 (6-й элемент Select-Map, 1-й элемент Key-Array)\n" -" -- 280, ключевое значение, которое мы ищем" - -msgid "" -"Now read the source code file `net_box.c " -"`_" -" and skip to the line ``netbox_encode_select(lua_State *L)``. From the " -"comments and from simple function calls like ``mpstream_encode_uint(&stream," -" IPROTO_SPACE_ID);`` you will be able to see how net_box put together the " -"packet contents that you have just observed with tcpdump." -msgstr "" -"Теперь в файле исходного кода `net_box.c " -"`_" -" перейдите к строке ``netbox_encode_select(lua_State *L)``. Из комментариев " -"и из простых вызовов функций типа ``mpstream_encode_uint(&stream, " -"IPROTO_SPACE_ID);`` можно понять, как net_box собирает воедино содержимое " -"пакета, описанного выше с помощью tcpdump." - -msgid "" -"There are libraries for reading and writing MessagePack objects. C " -"programmers sometimes include `msgpuck.h " -"`_." -msgstr "" -"Существуют библиотеки для чтения и записи объектов в формате MessagePack. " -"Программисты на языке C иногда включают `msgpuck.h " -"`_." - -msgid "" -"Now you know how Tarantool itself makes requests with the binary protocol. " -"When in doubt about a detail, consult ``net_box.c`` -- it has routines for " -"each request. Some :ref:`connectors ` have similar " -"code." -msgstr "" -"Теперь вы знаете, как сам Tarantool выполняет запросы по бинарному " -"протоколу. Если какие-то детали остаются неясными, обратитесь к файлу " -"``net_box.c``, где описаны процедуры для каждого запроса. Некоторые " -":ref:`коннекторы ` написаны аналогично." - -msgid "" -"For an IPROTO_UPDATE example, suppose a user changes field #2 in tuple #2 in" -" space #256 to ``'BBBB'``. The body will look like this: (notice that in " -"this case there is an extra map item IPROTO_INDEX_BASE, to emphasize that " -"field numbers start with 1, which is optional and can be omitted):" -msgstr "" -"Рассмотрим пример IPROTO_UPDATE. Предположим, пользователь изменяет поле №2 " -"кортежа №2 в спейсе №256 на `'BBBB'``. Тело будет выглядеть так (обратите " -"внимание, что в этом случае дополнительный необязательный элемент " -"ассоциативного массива IPROTO_INDEX_BASE подчеркивает, что номера полей " -"начинаются с 1 — это можно опустить):" - -msgid "" -"04 IPROTO_UPDATE\n" -"85 IPROTO_MAP, size 5\n" -"10 IPROTO_SPACE_ID, Map Item#1\n" -"cd 02 00 MP_UINT 256\n" -"11 IPROTO_INDEX_ID, Map Item#2\n" -"00 MP_INT 0 = primary-key index number\n" -"15 IPROTO_INDEX_BASE, Map Item#3\n" -"01 MP_INT = 1 i.e. field numbers start at 1\n" -"21 IPROTO_TUPLE, Map Item#4\n" -"91 MP_ARRAY, size 1, for array of operations\n" -"93 MP_ARRAY, size 3\n" -"a1 3d MP_STR = OPERATOR = '='\n" -"02 MP_INT = FIELD_NO = 2\n" -"a5 42 42 42 42 42 MP_STR = VALUE = 'BBBB'\n" -"20 IPROTO_KEY, Map Item#5\n" -"91 MP_ARRAY, size 1, for array of key values\n" -"02 MP_UINT = primary-key value = 2" -msgstr "" -"04 IPROTO_UPDATE\n" -"85 IPROTO_MAP, размер 5\n" -"10 IPROTO_SPACE_ID, 1-й элемент ассоциативного массива\n" -"cd 02 00 MP_UINT 256\n" -"11 IPROTO_INDEX_ID, 2-й элемент ассоциативного массива\n" -"00 MP_INT 0 = номер индекса первичного ключа\n" -"15 IPROTO_INDEX_BASE, 3-й элемент ассоциативного массива\n" -"01 MP_INT = 1, т.е. нумерация полей начинается с 1\n" -"21 IPROTO_TUPLE, 4-й элемент ассоциативного массива\n" -"91 MP_ARRAY, размер 1, для массива операций\n" -"93 MP_ARRAY, размер 3\n" -"a1 3d MP_STR = OPERATOR = '='\n" -"02 MP_INT = FIELD_NO = 2\n" -"a5 42 42 42 42 42 MP_STR = VALUE = 'BBBB'\n" -"20 IPROTO_KEY, 5--й элемент ассоциативного массива\n" -"91 MP_ARRAY, размер 1, для массива ключей\n" -"02 MP_UINT = значение первичного ключа = 2" - -msgid "" -"Byte codes for the :ref:`IPROTO_EXECUTE ` example:" -msgstr "Пример байт-кода :ref:`IPROTO_EXECUTE `:" - -msgid "" -"0b IPROTO_EXECUTE\n" -"83 MP_MAP, size 3\n" -"43 IPROTO_STMT_ID Map Item#1\n" -"ce d7 aa 74 1b MP_UINT value of n.stmt_id\n" -"41 IPROTO_SQL_BIND Map Item#2\n" -"92 MP_ARRAY, size 2\n" -"01 MP_INT = 1 = value for first parameter\n" -"a1 61 MP_STR = 'a' = value for second parameter\n" -"2b IPROTO_OPTIONS Map Item#3\n" -"90 MP_ARRAY, size 0 (there are no options)" -msgstr "" -"0b IPROTO_EXECUTE\n" -"83 MP_MAP, размер 3\n" -"43 IPROTO_STMT_ID 1-й элемент ассоциативного массива\n" -"ce d7 aa 74 1b MP_UINT значение n.stmt_id\n" -"41 IPROTO_SQL_BIND 2-й элемент ассоциативного массива\n" -"92 MP_ARRAY, размер 2\n" -"01 MP_INT = 1 = значение первого параметра\n" -"a1 61 MP_STR = 'a' = значение второго параметра\n" -"2b IPROTO_OPTIONS 3-й элемент ассоциативного массива\n" -"90 MP_ARRAY, размер 0 (никакие опции не выбраны)" - -msgid "" -"Byte codes for the response to the " -":codenormal:`box.space.`:codeitalic:`space-name`:codenormal:`:insert{6}` " -"example:" -msgstr "" -"Пример байт-кода ответа на запрос " -":codenormal:`box.space.`:codeitalic:`space-name`:codenormal:`:insert{6}`:" - -msgid "" -"ce 00 00 00 20 MP_UINT = HEADER AND BODY SIZE\n" -"83 MP_MAP, size 3\n" -"00 Response-Code-Indicator\n" -"ce 00 00 00 00 MP_UINT = IPROTO_OK\n" -"01 IPROTO_SYNC\n" -"cf 00 00 00 00 00 00 00 53 MP_UINT = sync value\n" -"05 IPROTO_SCHEMA_VERSION\n" -"ce 00 00 00 68 MP_UINT = schema version\n" -"81 MP_MAP, size 1\n" -"30 IPROTO_DATA\n" -"dd 00 00 00 01 MP_ARRAY, size 1 (row count)\n" -"91 MP_ARRAY, size 1 (field count)\n" -"06 MP_INT = 6 = the value that was inserted" -msgstr "" -"ce 00 00 00 20 MP_UINT = размер заголовка и тела\n" -"83 MP_MAP, размер 3\n" -"00 индикатор кода ответа\n" -"ce 00 00 00 00 MP_UINT = IPROTO_OK\n" -"01 IPROTO_SYNC\n" -"cf 00 00 00 00 00 00 00 53 MP_UINT = значение синхронизации\n" -"05 IPROTO_SCHEMA_VERSION\n" -"ce 00 00 00 68 MP_UINT = версия схемы\n" -"81 MP_MAP, размер 1\n" -"30 IPROTO_DATA\n" -"dd 00 00 00 01 MP_ARRAY, размер 1 (число строк)\n" -"91 MP_ARRAY, размер 1 (число полей)\n" -"06 MP_INT = 6 = добавленное значение" - -msgid "" -"Byte codes for the response to the " -"``conn:eval([[box.schema.space.create('_space');]])`` example:" -msgstr "" -"Пример байт-кода ответа на запрос " -"``conn:eval([[box.schema.space.create('_space');]])``:" - -msgid "" -"ce 00 00 00 3b MP_UINT = HEADER AND BODY SIZE\n" -"83 MP_MAP, size 3 (i.e. 3 items in header)\n" -" 00 Response-Code-Indicator\n" -" ce 00 00 80 0a MP_UINT = hexadecimal 800a\n" -" 01 IPROTO_SYNC\n" -" cf 00 00 00 00 00 00 00 26 MP_UINT = sync value\n" -" 05 IPROTO_SCHEMA_VERSION\n" -" ce 00 00 00 78 MP_UINT = schema version value\n" -" 81 MP_MAP, size 1\n" -" 31 IPROTO_ERROR_24\n" -" db 00 00 00 1d 53 70 61 63 etc. MP_STR = \"Space '_space' already exists\"" -msgstr "" -"ce 00 00 00 3b MP_UINT = размер заголовка и тела\n" -"83 MP_MAP, размер 3 (3 элемента в заголовке)\n" -" 00 индикатор кода ответа\n" -" ce 00 00 80 0a MP_UINT = шестнадцатеричное значение 800a\n" -" 01 IPROTO_SYNC\n" -" cf 00 00 00 00 00 00 00 26 MP_UINT = значение синхронизации\n" -" 05 IPROTO_SCHEMA_VERSION\n" -" ce 00 00 00 78 MP_UINT = версия схемы \n" -" 81 MP_MAP, размер 1\n" -" 31 IPROTO_ERROR_24\n" -" db 00 00 00 1d 53 70 61 63 ... MP_STR = \"Space '_space' already exists\"" - -msgid "" -"Byte codes, if we use the same net.box connection that we used for " -":ref:`Binary protocol -- illustration ` and we " -"say |br| ``conn:execute([[CREATE TABLE t1 (dd INT PRIMARY KEY AUTOINCREMENT," -" дд STRING COLLATE \"unicode\");]])`` |br| ``conn:execute([[INSERT INTO t1 " -"VALUES (NULL, 'a'), (NULL, 'b');]])`` |br| and we watch what tcpdump " -"displays, we will see two noticeable things: (1) the CREATE statement caused" -" a schema change so the response has a new IPROTO_SCHEMA_VERSION value and " -"the body includes the new contents of some system tables (caused by requests" -" from net.box which users will not see); (2) the final bytes of the response" -" to the INSERT will be:" -msgstr "" -"Подключимся через то же соединение net.box, что приводилось в :ref:`примерах" -" `, и выполним следующее: |br| " -"``conn:execute([[CREATE TABLE t1 (dd INT PRIMARY KEY AUTOINCREMENT, дд " -"STRING COLLATE \"unicode\");]])`` |br| ``conn:execute([[INSERT INTO t1 " -"VALUES (NULL, 'a'), (NULL, 'b');]])`` |br| Результат вывода tcpdump покажет " -"два интересных момента: (1) инструкция CREATE привела к изменению схемы, так" -" что в ответе указано новое значение IPROTO_SCHEMA_VERSION. При этом тело " -"включает новое содержимое некоторых системных таблиц, полученное в " -"результате невидимых для пользователя запросов от net.box; (2) последние " -"байты ответа на INSERT будут следующими:" - -msgid "" -"81 MP_MAP, size 1\n" -"42 IPROTO_SQL_INFO\n" -"82 MP_MAP, size 2\n" -"00 Tarantool constant (not in iproto_constants.h) = SQL_INFO_ROW_COUNT\n" -"02 1 = row count\n" -"01 Tarantool constant (not in iproto_constants.h) = SQL_INFO_AUTOINCREMENT_ID\n" -"92 MP_ARRAY, size 2\n" -"01 first autoincrement number\n" -"02 second autoincrement number" -msgstr "" -"81 MP_MAP, размер 1\n" -"42 IPROTO_SQL_INFO\n" -"82 MP_MAP, размер 2\n" -"00 константа Tarantool (не из iproto_constants.h) = SQL_INFO_ROW_COUNT\n" -"02 1 = число строк\n" -"01 константа Tarantool (не из iproto_constants.h) = SQL_INFO_AUTOINCREMENT_ID\n" -"92 MP_ARRAY, размер 2\n" -"01 первое число с автоинкрементом\n" -"02 второе число с автоинкрементом" - -msgid "" -"Byte codes for the SQL SELECT example, if we ask for full metadata by saying" -" |br| :code:`conn.space._session_settings:update('sql_full_metadata', {{'='," -" 'value', true}})` |br| and we select the two rows from the table that we " -"just created |br| :code:`conn:execute([[SELECT dd, дд AS д FROM t1;]])` |br|" -" then tcpdump will show this response, after the header:" -msgstr "" -"Пример байт-кода SQL SELECT. Запросим полные метаданные, вызвав " -":code:`conn.space._session_settings:update('sql_full_metadata', {{'=', " -"'value', true}})`, и выберем две строки из только что созданной таблицы: " -":code:`conn:execute([[SELECT dd, дд AS д FROM t1;]])`. tcpdump выдаст " -"следующий ответ (после заголовка):" - -msgid "" -"82 MP_MAP, size 2 (i.e. metadata and rows)\n" -"32 IPROTO_METADATA\n" -"92 MP_ARRAY, size 2 (i.e. 2 columns)\n" -"85 MP_MAP, size 5 (i.e. 5 items for column#1)\n" -"00 a2 44 44 IPROTO_FIELD_NAME and 'DD'\n" -"01 a7 69 6e 74 65 67 65 72 IPROTO_FIELD_TYPE and 'integer'\n" -"03 c2 IPROTO_FIELD_IS_NULLABLE and false\n" -"04 c3 IPROTO_FIELD_IS_AUTOINCREMENT and true\n" -"05 c0 PROTO_FIELD_SPAN and nil\n" -"85 MP_MAP, size 5 (i.e. 5 items for column#2)\n" -"00 a2 d0 94 IPROTO_FIELD_NAME and 'Д' upper case\n" -"01 a6 73 74 72 69 6e 67 IPROTO_FIELD_TYPE and 'string'\n" -"02 a7 75 6e 69 63 6f 64 65 IPROTO_FIELD_COLL and 'unicode'\n" -"03 c3 IPROTO_FIELD_IS_NULLABLE and true\n" -"05 a4 d0 b4 d0 b4 IPROTO_FIELD_SPAN and 'дд' lower case\n" -"30 IPROTO_DATA\n" -"92 MP_ARRAY, size 2\n" -"92 MP_ARRAY, size 2\n" -"01 MP_INT = 1 i.e. contents of row#1 column#1\n" -"a1 61 MP_STR = 'a' i.e. contents of row#1 column#2\n" -"92 MP_ARRAY, size 2\n" -"02 MP_INT = 2 i.e. contents of row#2 column#1\n" -"a1 62 MP_STR = 'b' i.e. contents of row#2 column#2" -msgstr "" -"82 MP_MAP, размер 2 (метаданные и строки)\n" -"32 IPROTO_METADATA\n" -"92 MP_ARRAY, размер 2 (2 столбца)\n" -"85 MP_MAP, размер 5 (5 элементов для столбца 1)\n" -"00 a2 44 44 IPROTO_FIELD_NAME и 'DD'\n" -"01 a7 69 6e 74 65 67 65 72 IPROTO_FIELD_TYPE и 'integer'\n" -"03 c2 IPROTO_FIELD_IS_NULLABLE и false\n" -"04 c3 IPROTO_FIELD_IS_AUTOINCREMENT и true\n" -"05 c0 PROTO_FIELD_SPAN и nil\n" -"85 MP_MAP, размер 5 (5 элементов для столбца 2)\n" -"00 a2 d0 94 IPROTO_FIELD_NAME и 'Д' в верхнем регистре\n" -"01 a6 73 74 72 69 6e 67 IPROTO_FIELD_TYPE и 'string'\n" -"02 a7 75 6e 69 63 6f 64 65 IPROTO_FIELD_COLL и 'unicode'\n" -"03 c3 IPROTO_FIELD_IS_NULLABLE и true\n" -"05 a4 d0 b4 d0 b4 IPROTO_FIELD_SPAN и 'дд' в нижнем регистре\n" -"30 IPROTO_DATA\n" -"92 MP_ARRAY, размер 2\n" -"92 MP_ARRAY, размер 2\n" -"01 MP_INT = 1: содержимое строки 1, столбца 1\n" -"a1 61 MP_STR = 'a': содержимое строки 1, столбца 2\n" -"92 MP_ARRAY, размер 2\n" -"02 MP_INT = 2: содержимое строки 2, столбца 1\n" -"a1 62 MP_STR = 'b': содержимое строки 2, столбца 2" - -msgid "" -"Byte code for the SQL PREPARE example. If we said |br| " -":code:`conn:prepare([[SELECT dd, дд AS д FROM t1;]])` |br| then tcpdump " -"would show almost the same response, but there would be no IPROTO_DATA. " -"Instead, additional items will appear:" -msgstr "" -"Пример байт-кода SQL PREPARE. Если вызвать :code:`conn:prepare([[SELECT dd, " -"дд AS д FROM t1;]])`, вывод tcpdump будет почти таким же, но исчезнет " -"IPROTO_DATA. Вместо этого появятся дополнительные байты:" - -msgid "" -"34 IPROTO_BIND_COUNT\n" -"00 MP_UINT = 0\n" -"\n" -"33 IPROTO_BIND_METADATA\n" -"90 MP_ARRAY, size 0" -msgstr "" -"34 IPROTO_BIND_COUNT\n" -"00 MP_UINT = 0\n" -"\n" -"33 IPROTO_BIND_METADATA\n" -"90 MP_ARRAY, размер 0" - -msgid "" -"``MP_UINT = 0`` and ``MP_ARRAY`` has size 0 because there are no parameters " -"to bind. Full output:" -msgstr "" -"``MP_UINT = 0``. Массив ``MP_ARRAY`` имеет размер 0, поскольку параметров " -"нет. Вывод целиком:" +msgid "Binary protocol" +msgstr "Бинарный протокол" msgid "" -"84 MP_MAP, size 4\n" -"43 IPROTO_STMT_ID\n" -"ce c2 3c 2c 1e MP_UINT = statement id\n" -"34 IPROTO_BIND_COUNT\n" -"00 MP_INT = 0 = number of parameters to bind\n" -"33 IPROTO_BIND_METADATA\n" -"90 MP_ARRAY, size 0 = there are no parameters to bind\n" -"32 IPROTO_METADATA\n" -"92 MP_ARRAY, size 2 (i.e. 2 columns)\n" -"85 MP_MAP, size 5 (i.e. 5 items for column#1)\n" -"00 a2 44 44 IPROTO_FIELD_NAME and 'DD'\n" -"01 a7 69 6e 74 65 67 65 72 IPROTO_FIELD_TYPE and 'integer'\n" -"03 c2 IPROTO_FIELD_IS_NULLABLE and false\n" -"04 c3 IPROTO_FIELD_IS_AUTOINCREMENT and true\n" -"05 c0 PROTO_FIELD_SPAN and nil\n" -"85 MP_MAP, size 5 (i.e. 5 items for column#2)\n" -"00 a2 d0 94 IPROTO_FIELD_NAME and 'Д' upper case\n" -"01 a6 73 74 72 69 6e 67 IPROTO_FIELD_TYPE and 'string'\n" -"02 a7 75 6e 69 63 6f 64 65 IPROTO_FIELD_COLL and 'unicode'\n" -"03 c3 IPROTO_FIELD_IS_NULLABLE and true\n" -"05 a4 d0 b4 d0 b4 IPROTO_FIELD_SPAN and 'дд' lower case" -msgstr "" -"84 MP_MAP, размер 4\n" -"43 IPROTO_STMT_ID\n" -"ce c2 3c 2c 1e MP_UINT = ID инструкции\n" -"34 IPROTO_BIND_COUNT\n" -"00 MP_INT = 0 = число привязываемых параметров\n" -"33 IPROTO_BIND_METADATA\n" -"90 MP_ARRAY, размер 0 = нет привязываемых параметров\n" -"32 IPROTO_METADATA\n" -"92 MP_ARRAY, размер 2 (2 столбца)\n" -"85 MP_MAP, размер 5 (5 элементов для столбца 1)\n" -"00 a2 44 44 IPROTO_FIELD_NAME и 'DD'\n" -"01 a7 69 6e 74 65 67 65 72 IPROTO_FIELD_TYPE и 'integer'\n" -"03 c2 IPROTO_FIELD_IS_NULLABLE и false\n" -"04 c3 IPROTO_FIELD_IS_AUTOINCREMENT и true\n" -"05 c0 PROTO_FIELD_SPAN и nil\n" -"85 MP_MAP, размер 5 (5 элементов для столбца 2)\n" -"00 a2 d0 94 IPROTO_FIELD_NAME + 'Д' в верхнем регистре\n" -"01 a6 73 74 72 69 6e 67 IPROTO_FIELD_TYPE и 'string'\n" -"02 a7 75 6e 69 63 6f 64 65 IPROTO_FIELD_COLL и 'unicode'\n" -"03 c3 IPROTO_FIELD_IS_NULLABLE и true\n" -"05 a4 d0 b4 d0 b4 IPROTO_FIELD_SPAN и 'дд' в нижнем регистре" - -msgid "Byte code for the heartbeat example. The master might send this body:" +"This section provides information on the Tarantool binary protocol, iproto. " +"The protocol is called \"binary\" because the database is most frequently " +"accessed via binary code instead of Lua request text. Tarantool experts use " +"it:" msgstr "" -"Пример байт-кода контрольного сигнала. Мастер может отправить следующее " -"тело:" -msgid "" -"83 MP_MAP, size 3\n" -"00 Main-Map Item #1 IPROTO_REQUEST_TYPE\n" -"00 MP_UINT = 0\n" -"02 Main-Map Item #2 IPROTO_REPLICA_ID\n" -"02 MP_UINT = 2 = id\n" -"04 Main-Map Item #3 IPROTO_TIMESTAMP\n" -"cb MP_DOUBLE (MessagePack \"Float 64\")\n" -"41 d7 ba 06 7b 3a 03 21 8-byte timestamp" +msgid "to write their own connectors" msgstr "" -"83 MP_MAP, размер 3\n" -"00 1-й элемент Main-Map IPROTO_REQUEST_TYPE\n" -"00 MP_UINT = 0\n" -"02 2-й элемент Main-Map IPROTO_REPLICA_ID\n" -"02 MP_UINT = 2 = id\n" -"04 3-й элемент Main-Map IPROTO_TIMESTAMP\n" -"cb MP_DOUBLE (MessagePack \"Float 64\")\n" -"41 d7 ba 06 7b 3a 03 21 8-байтовая временная отметка" -msgid "" -"Byte code for the heartbeat example. The replica might send back this body" +msgid "to understand network messages" msgstr "" -"Пример байт-кода ответа на контрольный сигнал. Реплика может вернуть " -"следующее тело:" msgid "" -"81 MP_MAP, size 1\n" -"00 Main-Map Item #1 Response-code-indicator\n" -"00 MP_UINT = 0 = IPROTO_OK\n" -"81 Main-Map Item #2, MP_MAP, size 1\n" -"26 Sub-Map Item #1 IPROTO_VCLOCK\n" -"81 Sub-Map Item #2, MP_MAP, size 1\n" -"01 MP_UINT = 1 = id (part 1 of vclock)\n" -"06 MP_UINT = 6 = lsn (part 2 of vclock)" +"to support new features that their favorite connector doesn't support yet" msgstr "" -"81 MP_MAP, размер 1\n" -"00 1-й элемент Main-Map: индикатор кода ответа\n" -"00 MP_UINT = 0 = IPROTO_OK\n" -"81 2-й элемент Main-Map: MP_MAP, размер 1 (Sub-Map)\n" -"26 1-й элемент Sub-Map: IPROTO_VCLOCK\n" -"81 2-й элемент Sub-Map: MP_MAP, размер 1\n" -"01 MP_UINT = 1 = id (1-я часть vclock)\n" -"06 MP_UINT = 6 = lsn (2-я часть vclock)" -======= ->>>>>>> Outline initial structure - -msgid "XLOG / SNAP" -msgstr "XLOG / SNAP" -msgid "" -".xlog and .snap files have nearly the same format. The header looks like:" +msgid "to avoid repetitive parsing by the server" msgstr "" -"Файлы форматов .xlog и .snap выглядят практически одинаково. Заголовок " -"выглядит так:" msgid "" -"\\n SNAP\\n or XLOG\\n\n" -"\\n currently 0.13\\n\n" -"Server: \\n where UUID is a 36-byte string\n" -"VClock: \\n e.g. {1: 0}\\n\n" -"\\n" +"The binary protocol provides complete access to Tarantool functionality, " +"including:" msgstr "" -"\\n SNAP\\n или XLOG\\n\n" -"\\n в данный момент 0.13\\n\n" -"Server: \\n где UUID -- это 36-байтная строка\n" -"VClock: \\n например, {1: 0}\\n\n" -"\\n" msgid "" -"After the file header come the data tuples. Tuples begin with a row marker " -"``0xd5ba0bab`` and the last tuple may be followed by an EOF marker " -"``0xd510aded``. Thus, between the file header and the EOF marker, there may " -"be data tuples that have this form:" +"request multiplexing, for example ability to issue multiple requests " +"asynchronously via the same connection" msgstr "" -"После файла заголовка идут кортежи с данными. Кортежи начинаются с маркера " -"строки ``0xd5ba0bab``, а после последнего кортежа может стоять маркер конца " -"файла ``0xd510aded``. Таким образом, между заголовком файла и маркером конца" -" файла могут быть кортежи с данными в следующем виде:" +"мультиплексирование запросов, т.е. возможность асинхронной отправки " +"множества запросов по одному соединению;" -msgid "" -"0 3 4 17\n" -"+-------------+========+============+===========+=========+\n" -"| | | | | |\n" -"| 0xd5ba0bab | LENGTH | CRC32 PREV | CRC32 CUR | PADDING |\n" -"| | | | | |\n" -"+-------------+========+============+===========+=========+\n" -" MP_FIXEXT2 MP_INT MP_INT MP_INT ---\n" -"\n" -"+============+ +===================================+\n" -"| | | |\n" -"| HEADER | | BODY |\n" -"| | | |\n" -"+============+ +===================================+\n" -" MP_MAP MP_MAP" +msgid "response format that supports zero-copy writes" msgstr "" -"0 3 4 17\n" -"+-------------+========+============+===========+=========+\n" -"| | | | | |\n" -"| 0xd5ba0bab | LENGTH | CRC32 PREV | CRC32 CUR | PADDING |\n" -"| | | | | |\n" -"+-------------+========+============+===========+=========+\n" -" MP_FIXEXT2 MP_INT MP_INT MP_INT ---\n" -"\n" -"+============+ +===================================+\n" -"| | | |\n" -"| HEADER | | BODY |\n" -"| | | |\n" -"+============+ +===================================+\n" -" MP_MAP MP_MAP" +"формат ответа, который поддерживает запись в режиме без копирования (zero-" +"copy)." msgid "" -"See the example in the :ref:`File formats ` " -"section." -msgstr "" -"См. пример в разделе :ref:`Форматы файлов `." -======= ->>>>>>> Split most box_protocol content and add TODOs +"Since version :doc:`2.11.0 `, you can use the " +":ref:`box.iproto ` submodule to access IPROTO constants and " +"features from Lua. The submodule enables to :ref:`send arbitrary IPROTO " +"packets ` over the session's socket and " +":ref:`override the behavior ` for all " +"IPROTO request types. Also, :ref:`IPROTO_UNKNOWN ` " +"constant is introduced. The constant is used for the " +":ref:`box.iproto.override() ` API, which " +"allows setting a handler for incoming requests with an unknown type." +msgstr "" + +#~ msgid "Introduction" +#~ msgstr "Введение" + +#~ msgid "" +#~ "The binary protocol, iproto, is called a \"request/response\" protocol " +#~ "because it is for sending requests to a Tarantool server and receiving " +#~ "responses. There is complete access to Tarantool functionality, including:" +#~ msgstr "" +#~ "Бинарный протокол iproto передает данные по схеме \"запрос-ответ\", то есть " +#~ "он предназначен для отправки запросов на сервер Tarantool и получения " +#~ "ответов. Протокол предоставляет полный доступ к функциям Tarantool, включая:" + +#~ msgid "" +#~ "The protocol can be called \"binary\" because the most-frequently-used " +#~ "database accesses are done with binary codes instead of Lua request text. " +#~ "Tarantool experts use it to write their own connectors, to understand " +#~ "network messages, to support new features that their favorite connector " +#~ "doesn't support yet, or to avoid repetitive parsing by the server." +#~ msgstr "" +#~ "Протокол можно назвать \"бинарным\", поскольку наиболее частые обращения к " +#~ "базе данных выполняются с помощью бинарного кода, а не текста запроса на " +#~ "языке Lua. Специалисты по Tarantool используют его, чтобы писать собственные" +#~ " коннекторы, понимать сетевые сообщения, поддерживать новые функции, которые" +#~ " их любимый коннектор еще не поддерживает, или чтобы избежать повторного " +#~ "разбора на сервере." + +#~ msgid "Index" +#~ msgstr "Указатель" + +#~ msgid "Section" +#~ msgstr "Раздел" + +#~ msgid "Description" +#~ msgstr "Описание" + +#~ msgid ":ref:`Symbols and terms `" +#~ msgstr ":ref:`Обозначения и термины `" + +#~ msgid "Notation of binary protocol" +#~ msgstr "Условные обозначения в бинарном протоколе" + +#~ msgid ":ref:`Header and body `" +#~ msgstr ":ref:`Заголовок и тело сообщения `" + +#~ msgid "Header of a request" +#~ msgstr "Заголовок запроса" + +#~ msgid "" +#~ "Requests: |br|:ref:`IPROTO_SELECT ` " +#~ "|br|:ref:`IPROTO_INSERT ` |br|:ref:`IPROTO_REPLACE " +#~ "` |br|:ref:`IPROTO_UPDATE ` " +#~ "|br|:ref:`IPROTO_DELETE ` |br|:ref:`IPROTO_CALL_16 " +#~ "` |br|:ref:`IPROTO_AUTH ` " +#~ "|br|:ref:`IPROTO_EVAL ` |br|:ref:`IPROTO_UPSERT " +#~ "` |br|:ref:`IPROTO_CALL ` " +#~ "|br|:ref:`IPROTO_EXECUTE ` |br|:ref:`IPROTO_NOP " +#~ "` |br|:ref:`IPROTO_PREPARE ` " +#~ "|br|:ref:`IPROTO_PING ` |br|:ref:`IPROTO_JOIN " +#~ "` |br|:ref:`IPROTO_SUBSCRIBE ` " +#~ "|br|:ref:`IPROTO_VOTE_DEPRECATED ` |br|:ref:`IPROTO_VOTE " +#~ "` |br|:ref:`IPROTO_FETCH_SNAPSHOT ` " +#~ "|br|:ref:`IPROTO_REGISTER ` |br|:ref:`IPROTO_BEGIN " +#~ "` |br|:ref:`IPROTO_COMMIT ` " +#~ "|br|:ref:`IPROTO_ROLLBACK `" +#~ msgstr "" +#~ "Запросы: |br|:ref:`IPROTO_SELECT ` " +#~ "|br|:ref:`IPROTO_INSERT ` |br|:ref:`IPROTO_REPLACE " +#~ "` |br|:ref:`IPROTO_UPDATE ` " +#~ "|br|:ref:`IPROTO_DELETE ` |br|:ref:`IPROTO_CALL_16 " +#~ "` |br|:ref:`IPROTO_AUTH ` " +#~ "|br|:ref:`IPROTO_EVAL ` |br|:ref:`IPROTO_UPSERT " +#~ "` |br|:ref:`IPROTO_CALL ` " +#~ "|br|:ref:`IPROTO_EXECUTE ` |br|:ref:`IPROTO_NOP " +#~ "` |br|:ref:`IPROTO_PREPARE ` " +#~ "|br|:ref:`IPROTO_PING ` |br|:ref:`IPROTO_JOIN " +#~ "` |br|:ref:`IPROTO_SUBSCRIBE ` " +#~ "|br|:ref:`IPROTO_VOTE_DEPRECATED ` |br|:ref:`IPROTO_VOTE " +#~ "` |br|:ref:`IPROTO_FETCH_SNAPSHOT ` " +#~ "|br|:ref:`IPROTO_REGISTER ` |br|:ref:`IPROTO_BEGIN " +#~ "` |br|:ref:`IPROTO_COMMIT ` " +#~ "|br|:ref:`IPROTO_ROLLBACK `" + +#~ msgid "Body of a request" +#~ msgstr "Тело запроса" + +#~ msgid ":ref:`Responses if no error and no SQL `" +#~ msgstr ":ref:`Ответы на ошибки и запросы без SQL `" + +#~ msgid "Responses for no SQL" +#~ msgstr "Ответы на запросы без SQL" + +#~ msgid ":ref:`Responses for errors `" +#~ msgstr ":ref:`Ответы на ошибки `" + +#~ msgid "Responses for errors" +#~ msgstr "Ответы на ошибки" + +#~ msgid ":ref:`Responses for SQL `" +#~ msgstr ":ref:`Ответы на запросы с SQL `" + +#~ msgid "Responses for SQL" +#~ msgstr "Ответы на запросы с SQL" + +#~ msgid ":ref:`Authentication `" +#~ msgstr ":ref:`Аутентификация `" + +#~ msgid "Authentication after connection" +#~ msgstr "Аутентификация после установления соединения" + +#~ msgid ":ref:`Replication `" +#~ msgstr ":ref:`Репликация `" + +#~ msgid "Replication request" +#~ msgstr "Запрос репликации" + +#~ msgid ":ref:`Illustration `" +#~ msgstr ":ref:`Примеры `" + +#~ msgid "Illustration of use" +#~ msgstr "Примеры использования" + +#~ msgid ":ref:`XLOG/SNAP `" +#~ msgstr ":ref:`XLOG/SNAP `" + +#~ msgid "Format of .xlog and .snap files" +#~ msgstr "Формат файлов .xlog и .snap" + +#~ msgid "Symbols and terms" +#~ msgstr "Обозначения и термины" + +#~ msgid "" +#~ "Words that start with **MP_** mean: a `MessagePack " +#~ "`_ type or a range of MessagePack types, including " +#~ "the signal and possibly including a value, with slight modification:" +#~ msgstr "" +#~ "Если слово начинается с **MP_**, это указывает на тип `MessagePack " +#~ "`_ или ряд типов MessagePack, включая сигнал и, " +#~ "возможно, включая значение, с небольшими изменениями:" + +#~ msgid "**MP_NIL** nil" +#~ msgstr "**MP_NIL** nil" + +#~ msgid "**MP_UINT** unsigned integer" +#~ msgstr "**MP_UINT** unsigned integer" + +#~ msgid "**MP_INT** either integer or unsigned integer" +#~ msgstr "**MP_INT** integer или unsigned integer" + +#~ msgid "**MP_STR** string" +#~ msgstr "**MP_STR** string" + +#~ msgid "**MP_BIN** binary string" +#~ msgstr "**MP_BIN** binary string" + +#~ msgid "**MP_ARRAY** array" +#~ msgstr "**MP_ARRAY** array" + +#~ msgid "**MP_MAP** map" +#~ msgstr "**MP_MAP** map" + +#~ msgid "**MP_BOOL** boolean" +#~ msgstr "**MP_BOOL** boolean" + +#~ msgid "**MP_FLOAT** float" +#~ msgstr "**MP_FLOAT** float" + +#~ msgid "**MP_DOUBLE** double" +#~ msgstr "**MP_DOUBLE** double" + +#~ msgid "" +#~ "**MP_EXT** extension (including the :ref:`DECIMAL type ` and UUID type)" +#~ msgstr "" +#~ "**MP_EXT** extension (включая :ref:`тип DECIMAL ` и " +#~ "тип UUID)" + +#~ msgid "**MP_OBJECT** any MessagePack object" +#~ msgstr "**MP_OBJECT** любой объект формата MessagePack" + +#~ msgid "" +#~ "Short descriptions are in MessagePack's `\"spec\" page " +#~ "`_." +#~ msgstr "" +#~ "Краткое описание приводится на `странице \"спецификации\" " +#~ "`_ MessagePack." + +#~ msgid "" +#~ "And words that start with **IPROTO_** mean: a Tarantool constant which is " +#~ "either defined or mentioned in the `iproto_constants.h file " +#~ "`_." +#~ msgstr "" +#~ "Если же слово начинается с **IPROTO_**, это указывает на константу " +#~ "Tarantool, которая либо определена, либо упоминается в `файле " +#~ "iproto_constants.h " +#~ "`_." + +#~ msgid "" +#~ "The IPROTO constants that identify requests that we will mention in this " +#~ "section are:" +#~ msgstr "" +#~ "В этом разделе мы будем упоминать следующие константы IPROTO, которые " +#~ "идентифицируют запросы:" + +#~ msgid "" +#~ "IPROTO_SELECT=0x01\n" +#~ "IPROTO_INSERT=0x02\n" +#~ "IPROTO_REPLACE=0x03\n" +#~ "IPROTO_UPDATE=0x04\n" +#~ "IPROTO_DELETE=0x05\n" +#~ "IPROTO_CALL_16=0x06\n" +#~ "IPROTO_AUTH=0x07\n" +#~ "IPROTO_EVAL=0x08\n" +#~ "IPROTO_UPSERT=0x09\n" +#~ "IPROTO_CALL=0x0a\n" +#~ "IPROTO_EXECUTE=0x0b\n" +#~ "IPROTO_NOP=0x0c\n" +#~ "IPROTO_PREPARE=0x0d\n" +#~ "IPROTO_BEGIN=0x0e\n" +#~ "IPROTO_COMMIT=0x0f\n" +#~ "IPROTO_ROLLBACK=0x10\n" +#~ "IPROTO_RAFT_CONFIRM=0x28\n" +#~ "IPROTO_RAFT_ROLLBACK=0x29\n" +#~ "IPROTO_PING=0x40\n" +#~ "IPROTO_JOIN=0x41\n" +#~ "IPROTO_SUBSCRIBE=0x42\n" +#~ "IPROTO_VOTE_DEPRECATED=0x43\n" +#~ "IPROTO_VOTE=0x44\n" +#~ "IPROTO_FETCH_SNAPSHOT=0x45\n" +#~ "IPROTO_REGISTER=0x46" +#~ msgstr "" +#~ "IPROTO_SELECT=0x01\n" +#~ "IPROTO_INSERT=0x02\n" +#~ "IPROTO_REPLACE=0x03\n" +#~ "IPROTO_UPDATE=0x04\n" +#~ "IPROTO_DELETE=0x05\n" +#~ "IPROTO_CALL_16=0x06\n" +#~ "IPROTO_AUTH=0x07\n" +#~ "IPROTO_EVAL=0x08\n" +#~ "IPROTO_UPSERT=0x09\n" +#~ "IPROTO_CALL=0x0a\n" +#~ "IPROTO_EXECUTE=0x0b\n" +#~ "IPROTO_NOP=0x0c\n" +#~ "IPROTO_PREPARE=0x0d\n" +#~ "IPROTO_BEGIN=0x0e\n" +#~ "IPROTO_COMMIT=0x0f\n" +#~ "IPROTO_ROLLBACK=0x10\n" +#~ "IPROTO_RAFT_CONFIRM=0x28\n" +#~ "IPROTO_RAFT_ROLLBACK=0x29\n" +#~ "IPROTO_PING=0x40\n" +#~ "IPROTO_JOIN=0x41\n" +#~ "IPROTO_SUBSCRIBE=0x42\n" +#~ "IPROTO_VOTE_DEPRECATED=0x43\n" +#~ "IPROTO_VOTE=0x44\n" +#~ "IPROTO_FETCH_SNAPSHOT=0x45\n" +#~ "IPROTO_REGISTER=0x46" + +#~ msgid "" +#~ "The IPROTO constants that appear within requests or responses that we will " +#~ "describe in this section are:" +#~ msgstr "" +#~ "В этом разделе мы опишем такие константы IPROTO, которые встречаются в " +#~ "запросах или ответах:" + +#~ msgid "" +#~ "IPROTO_OK=0x00\n" +#~ "IPROTO_REQUEST_TYPE=0x00\n" +#~ "IPROTO_SYNC=0x01\n" +#~ "IPROTO_REPLICA_ID=0x02\n" +#~ "IPROTO_LSN=0x03\n" +#~ "IPROTO_TIMESTAMP=0x04\n" +#~ "IPROTO_SCHEMA_VERSION=0x05\n" +#~ "IPROTO_FLAGS=0x09\n" +#~ "IPROTO_STREAM_ID=0x0a\n" +#~ "IPROTO_SPACE_ID=0x10\n" +#~ "IPROTO_INDEX_ID=0x11\n" +#~ "IPROTO_LIMIT=0x12\n" +#~ "IPROTO_OFFSET=0x13\n" +#~ "IPROTO_ITERATOR=0x14\n" +#~ "IPROTO_INDEX_BASE=0x15\n" +#~ "IPROTO_KEY=0x20\n" +#~ "IPROTO_TUPLE=0x21\n" +#~ "IPROTO_FUNCTION_NAME=0x22\n" +#~ "IPROTO_USER_NAME=0x23\n" +#~ "IPROTO_INSTANCE_UUID=0x24\n" +#~ "IPROTO_CLUSTER_UUID=0x25\n" +#~ "IPROTO_VCLOCK=0x26\n" +#~ "IPROTO_EXPR=0x27\n" +#~ "IPROTO_OPS=0x28\n" +#~ "IPROTO_BALLOT=0x29\n" +#~ "IPROTO_BALLOT_IS_RO_CFG=0x01\n" +#~ "IPROTO_BALLOT_VCLOCK=0x02\n" +#~ "IPROTO_BALLOT_GC_VCLOCK=0x03\n" +#~ "IPROTO_BALLOT_IS_RO=0x04\n" +#~ "IPROTO_BALLOT_IS_ANON=0x05\n" +#~ "IPROTO_BALLOT_IS_BOOTED=0x06\n" +#~ "IPROTO_BALLOT_CAN_LEAD=0x07\n" +#~ "IPROTO_TUPLE_META=0x2a\n" +#~ "IPROTO_OPTIONS=0x2b\n" +#~ "IPROTO_DATA=0x30\n" +#~ "IPROTO_ERROR_24=0x31\n" +#~ "IPROTO_METADATA=0x32\n" +#~ "IPROTO_BIND_METADATA=0x33\n" +#~ "IPROTO_BIND_COUNT=0x34\n" +#~ "IPROTO_SQL_TEXT=0x40\n" +#~ "IPROTO_SQL_BIND=0x41\n" +#~ "IPROTO_SQL_INF O=0x42\n" +#~ "IPROTO_STMT_ID=0x43\n" +#~ "IPROTO_ERROR=0x52\n" +#~ "IPROTO_FIELD_NAME=0x00\n" +#~ "IPROTO_FIELD_TYPE=0x01\n" +#~ "IPROTO_FIELD_COLL=0x02\n" +#~ "IPROTO_FIELD_IS_NULLABLE=0x03\n" +#~ "IPROTO_FIELD_IS_AUTOINCREMENT=0x04\n" +#~ "IPROTO_FIELD_SPAN=0x05" +#~ msgstr "" + +#~ msgid "" +#~ "To denote message descriptions we will say ``msgpack(...)`` and within it we" +#~ " will use modified `YAML `_ so: |br|" +#~ msgstr "" +#~ "Для обозначения описаний сообщений мы будем вызывать ``msgpack(...)``, а " +#~ "внутри него будем использовать модифицированный `YAML " +#~ "`_ таким образом: |br|" + +#~ msgid "" +#~ ":code:`{...}` braces enclose an associative array, also called map, which in" +#~ " MsgPack is MP_MAP, |br| :samp:`{k}: {v}` is a key-value pair, also called " +#~ "map-item, in this section k is always an unsigned-integer value = one of the" +#~ " IPROTO constants, |br| :samp:`{italics}` are for replaceable text, which is" +#~ " the convention throughout this manual. Usually this is a data type but we " +#~ "do not show types of IPROTO constants which happen to always be unsigned " +#~ "8-bit integers, |br| :code:`[...]` is for non-associative arrays, |br| " +#~ ":code:`#` starts a comment, especially for the beginning of a section, |br| " +#~ "everything else is \"as is\". |br| Map-items may appear in any order but in " +#~ "examples we usually use the order that net_box.c happens to use." +#~ msgstr "" +#~ ":code:`{...}` в фигурные скобки заключают ассоциативный массив, в MsgPack " +#~ "это MP_MAP, |br| :samp:`{k}: {v}` — это пара \"ключ-значение\", также " +#~ "называемая элементом ассоциативного массива, в этом разделе k всегда " +#~ "является беззнаковым целым = одной из констант IPROTO, |br| " +#~ ":samp:`{italics}` используются для обозначения заменяемого текста в этом " +#~ "руководстве. Обычно это тип данных, но мы не показываем типы констант " +#~ "IPROTO, которые всегда будут беззнаковыми 8-битными целыми числами, |br| " +#~ ":code:`[...]` — для неассоциативных массивов, |br| :code:`#` начинает " +#~ "комментарий, особенно в начале раздела, |br| все остальное приводится \"как " +#~ "есть\". |br| Элементы ассоциативного массива могут появляться в любом " +#~ "порядке, но в примерах мы обычно используем тот порядок, который " +#~ "используется в net_box.c." + +#~ msgid "Header and body" +#~ msgstr "Заголовок и тело сообщения" + +#~ msgid "" +#~ "Except during connection (which involves a greeting from the server and " +#~ "optional :ref:`authentication ` that we will " +#~ "discuss later in this section), the protocol is pure request/response (the " +#~ "client requests and the server responds). It is legal to put more than one " +#~ "request in a packet." +#~ msgstr "" +#~ "Кроме как во время соединения (что включает в себя приветствие сервера и " +#~ "необязательную :ref:`аутентификацию `, которую " +#~ "мы обсудим далее в этом разделе), протокол идет по схеме \"запрос-ответ\" " +#~ "(клиент запрашивает, сервер отвечает). Пакет может содержать более одного " +#~ "запроса." + +#~ msgid "" +#~ "Almost all requests and responses contain three sections: size, header, and " +#~ "body. The size is an (MP_UINT) unsigned integer, usually a 32-bit unsigned " +#~ "integer. The header and body are (MP_MAP) maps." +#~ msgstr "" +#~ "Почти все запросы и ответы состоят из трех частей: размер, заголовок и тело." +#~ " Размер — это unsigned integer (MP_UINT), обычно 32-битное беззнаковое целое" +#~ " число. Заголовок и тело — это ассоциативные массивы (MP_MAP)." + +#~ msgid "" +#~ "# \n" +#~ ":samp:`{{MP_UINT unsigned integer}}`\n" +#~ "#
\n" +#~ ":samp:`{{MP_MAP with
map-items}}`\n" +#~ "# \n" +#~ ":samp:`{{MP_MAP with map-items}}`" +#~ msgstr "" +#~ "# \n" +#~ ":samp:`{{MP_UINT unsigned integer}}`\n" +#~ "#
\n" +#~ ":samp:`{{MP_MAP with
map-items}}`\n" +#~ "# \n" +#~ ":samp:`{{MP_MAP with map-items}}`" + +#~ msgid "" +#~ "```` is the size of the header plus the size of the body. It may be " +#~ "useful to compare it with the number of bytes remaining in the packet." +#~ msgstr "" +#~ "```` — это размер заголовка плюс размер тела сообщения. Есть смысл " +#~ "сравнивать его с количеством байтов, оставшихся в пакете." + +#~ msgid "``
`` may contain, in any order:" +#~ msgstr "Заголовок ``
`` может содержать такие данные в любом порядке:" + +#~ msgid "" +#~ "msgpack({\n" +#~ " IPROTO_REQUEST_TYPE: :samp:`{{MP_UINT unsigned integer}}`,\n" +#~ " IPROTO_SYNC: :samp:`{{MP_UINT unsigned integer}}`,\n" +#~ " IPROTO_SCHEMA_VERSION: :samp:`{{MP_UINT unsigned integer}}`\n" +#~ " IPROTO_STREAM_ID: :samp:`{{MP_UINT unsigned integer}}`\n" +#~ "})" +#~ msgstr "" +#~ "msgpack({\n" +#~ " IPROTO_REQUEST_TYPE: :samp:`{{MP_UINT unsigned integer}}`,\n" +#~ " IPROTO_SYNC: :samp:`{{MP_UINT unsigned integer}}`,\n" +#~ " IPROTO_SCHEMA_VERSION: :samp:`{{MP_UINT unsigned integer}}`\n" +#~ " IPROTO_STREAM_ID: :samp:`{{MP_UINT unsigned integer}}`\n" +#~ "})" + +#~ msgid "" +#~ "**IPROTO_REQUEST_TYPE** or Response-Code-Indicator = 0x00. An unsigned " +#~ "number that indicates what will be in the ````. In requests " +#~ "IPROTO_REQUEST_TYPE will be followed by IPROTO_SELECT etc. In responses " +#~ "Response-Code-Indicator will be followed by IPROTO_OK etc." +#~ msgstr "" +#~ "**IPROTO_REQUEST_TYPE** или индикатор кода ответа (Response-Code-Indicator) " +#~ "= 0x00. Это беззнаковое число, которое указывает на то, что будет находиться" +#~ " в теле сообщения ````. В запросах за IPROTO_REQUEST_TYPE будет " +#~ "следовать IPROTO_SELECT и т. д. В ответах за Response-Code-Indicator будет " +#~ "следовать IPROTO_OK и т. д." + +#~ msgid "" +#~ "**IPROTO_SYNC** = 0x01. An unsigned integer that should be incremented so " +#~ "that it is unique in every request. This integer is also returned from " +#~ ":doc:`/reference/reference_lua/box_session/sync`. The IPROTO_SYNC value of a" +#~ " response should be the same as the IPROTO_SYNC value of a request." +#~ msgstr "" +#~ "**IPROTO_SYNC** = 0x01. Это беззнаковое целое число должно увеличиваться " +#~ "так, чтобы оно было уникальным в каждом запросе. Это целое число также " +#~ "возвращается в результате :doc:`/reference/reference_lua/box_session/sync`. " +#~ "Значение IPROTO_SYNC в ответе должно быть таким же, как значение IPROTO_SYNC" +#~ " в запросе." + +#~ msgid "" +#~ "**IPROTO_SCHEMA_VERSION** = 0x05. An unsigned number, sometimes called " +#~ "SCHEMA_ID, that goes up when there is a major change. In a request header " +#~ "IPROTO_SCHEMA_VERSION is optional, so the version will not be checked if it " +#~ "is absent. In a response header IPROTO_SCHEMA_VERSION is always present, and" +#~ " it is up to the client to check if it has changed." +#~ msgstr "" +#~ "**IPROTO_SCHEMA_VERSION** = 0x05. Беззнаковое число, иногда называемое " +#~ "SCHEMA_ID, которое увеличивается при значительных изменениях. В заголовке " +#~ "запроса IPROTO_SCHEMA_VERSION указываеть необязательно, поэтому версия не " +#~ "будет проверяться, если она отсутствует. В заголовке ответа " +#~ "IPROTO_SCHEMA_VERSION присутствует всегда, и клиент должен сам проверить, не" +#~ " изменилась ли версия." + +#~ msgid "" +#~ "**IPROTO_STREAM_ID** = 0x0a. An unsigned number that should be unique in " +#~ "every stream. In requests IPROTO_STREAM_ID is optional and is useful for two" +#~ " things: ensuring that requests within transactions are done in separate " +#~ "groups, and ensuring strictly consistent execution of requests (whether or " +#~ "not they are within transactions). In responses IPROTO_STREAM_ID does not " +#~ "appear. See :ref:`Binary protocol -- streams `." +#~ msgstr "" +#~ "**IPROTO_STREAM_ID** = 0x0a. Беззнаковое число, которое должно быть " +#~ "уникально для каждого стрима. В запросах указывать значение IPROTO_STREAM_ID" +#~ " необязательно. Однако оно может понадобиться, если необходимо обрабатывать " +#~ "запросы внутри транзакций отдельными группами или выполнять запросы строго " +#~ "последовательно независимо от того, входят ли они в ту или иную транзакцию. " +#~ "В ответах IPROTO_STREAM_ID отсутствует. См. :ref:`Бинарный протокол -- " +#~ "стримы`." + +#~ msgid "" +#~ "Have a look at file `xrow.c " +#~ "`_ " +#~ "function ``xrow_header_encode``, to see how Tarantool encodes the header. " +#~ "Have a look at file net_box.c, function ``netbox_decode_data``, to see how " +#~ "Tarantool decodes the header. For example, in a successful response to " +#~ "``box.space:select()``, the Response-Code-Indicator value will be 0 = " +#~ "IPROTO_OK and the array will have all the tuples of the result." +#~ msgstr "" +#~ "Чтобы понять, как Tarantool кодирует заголовок, обратите внимание на функцию" +#~ " ``xrow_header_encode`` в файле `xrow.c " +#~ "`_. Чтобы" +#~ " увидеть, как Tarantool декодирует заголовок, посмотрите функцию " +#~ "``netbox_decode_data`` в файле net_box.c. Например, при успешном ответе на " +#~ "``box.space:select()`` значение индикатора кода ответа будет 0 = IPROTO_OK, " +#~ "а массив будет содержать все кортежи из результата." + +#~ msgid "IPROTO_CONFIRM = 0x28" +#~ msgstr "IPROTO_CONFIRM = 0x28" + +#~ msgid "" +#~ "This message confirms that the transactions originated from the instance " +#~ "with id = IPROTO_REPLICA_ID have achieved quorum and can be committed, up to" +#~ " and including LSN = IPROTO_LSN. Prior to Tarantool :tarantool-" +#~ "release:`2.10.0`, IPROTO_RAFT_CONFIRM was called IPROTO_CONFIRM." +#~ msgstr "" +#~ "Это сообщение подтверждает, что транзакции до ``LSN = IPROTO_LSN`` " +#~ "включительно из экземпляра с ``id = IPROTO_REPLICA_ID`` набрали кворум и " +#~ "могут пройти коммит. До версии Tarantool :tarantool-release:`2.10.0` запрос " +#~ "IPROTO_RAFT_CONFIRM назывался IPROTO_CONFIRM." + +#~ msgid "The body is a 2-item map:" +#~ msgstr "" +#~ "Тело сообщения представляет собой ассоциативный массив из 2 элементов:" + +#~ msgid "" +#~ "# \n" +#~ "msgpack(:samp:`{{MP_UINT unsigned integer = size(
) + size()}}`)\n" +#~ "#
\n" +#~ "msgpack({\n" +#~ " IPROTO_REQUEST_TYPE: IPROTO_RAFT_CONFIRM,\n" +#~ " IPROTO_SYNC: :samp:`{{MP_UINT unsigned integer}}`\n" +#~ "})\n" +#~ "# \n" +#~ "msgpack({\n" +#~ " IPROTO_REPLICA_ID: :samp:`{{MP_INT integer}}`,\n" +#~ " IPROTO_LSN: :samp:`{{MP_INT integer}}`\n" +#~ "})" +#~ msgstr "" +#~ "# \n" +#~ "msgpack(:samp:`{{MP_UINT unsigned integer = size(
) + size()}}`)\n" +#~ "#
\n" +#~ "msgpack({\n" +#~ " IPROTO_REQUEST_TYPE: IPROTO_RAFT_CONFIRM,\n" +#~ " IPROTO_SYNC: :samp:`{{MP_UINT unsigned integer}}`\n" +#~ "})\n" +#~ "# \n" +#~ "msgpack({\n" +#~ " IPROTO_REPLICA_ID: :samp:`{{MP_INT integer}}`,\n" +#~ " IPROTO_LSN: :samp:`{{MP_INT integer}}`\n" +#~ "})" + +#~ msgid "IPROTO_ROLLBACK = 0x29" +#~ msgstr "IPROTO_ROLLBACK = 0x29" + +#~ msgid "" +#~ "This message says that the transactions originated from the instance with id" +#~ " = IPROTO_REPLICA_ID couldn't achieve quorum for some reason and should be " +#~ "rolled back, down to LSN = IPROTO_LSN and including it. Prior to Tarantool " +#~ "version 2.10, IPROTO_RAFT_ROLLBACK was called IPROTO_ROLLBACK." +#~ msgstr "" +#~ "В этом сообщении говорится, что транзакции до ``LSN = IPROTO_LSN`` " +#~ "включительно из экземпляра с ``id = IPROTO_REPLICA_ID`` не смогли набрать " +#~ "кворум и будут отменены. До версии Tarantool 2.10 запрос " +#~ "IPROTO_RAFT_ROLLBACK назывался IPROTO_ROLLBACK." + +#~ msgid "" +#~ "# \n" +#~ "msgpack(:samp:`{{MP_UINT unsigned integer = size(
) + size()}}`)\n" +#~ "#
\n" +#~ "msgpack({\n" +#~ " IPROTO_REQUEST_TYPE: IPROTO_RAFT_ROLLBACK,\n" +#~ " IPROTO_SYNC: :samp:`{{MP_UINT unsigned integer}}`\n" +#~ "})\n" +#~ "# \n" +#~ "msgpack({\n" +#~ " IPROTO_REPLICA_ID: :samp:`{{MP_INT integer}}`,\n" +#~ " IPROTO_LSN: :samp:`{{MP_INT integer}}`\n" +#~ "})" +#~ msgstr "" +#~ "# \n" +#~ "msgpack(:samp:`{{MP_UINT unsigned integer = size(
) + size()}}`)\n" +#~ "#
\n" +#~ "msgpack({\n" +#~ " IPROTO_REQUEST_TYPE: IPROTO_RAFT_ROLLBACK,\n" +#~ " IPROTO_SYNC: :samp:`{{MP_UINT unsigned integer}}`\n" +#~ "})\n" +#~ "# \n" +#~ "msgpack({\n" +#~ " IPROTO_REPLICA_ID: :samp:`{{MP_INT integer}}`,\n" +#~ " IPROTO_LSN: :samp:`{{MP_INT integer}}`\n" +#~ "})" + +#~ msgid "Responses if no error and no SQL" +#~ msgstr "Ответы на запросы без ошибок и без SQL" + +#~ msgid "" +#~ "After the :ref:`header `, for a response, there will be" +#~ " a body. If there was no error, it will contain IPROTO_OK (0x00). If there " +#~ "was an error, it will contain an error code other than IPROTO_OK. Responses " +#~ "to SQL statements are slightly different and will be described in the later " +#~ "section, :ref:`Binary protocol -- responses for SQL `." +#~ msgstr "" +#~ "В ответе после :ref:`заголовка ` идет тело сообщения. " +#~ "Если ошибки не было, оно будет содержать IPROTO_OK (0x00). Если была ошибка," +#~ " то он будет содержать код ошибки, отличный от IPROTO_OK. Ответы на " +#~ "операторы SQL немного отличаются и будут описаны в последующем разделе " +#~ ":ref:`Ответы на SQL-запросы `." + +#~ msgid "" +#~ "For IPROTO_OK, the header Response-Code-Indicator will be 0 and the body is " +#~ "a 1-item map." +#~ msgstr "" +#~ "Для IPROTO_OK индикатор кода ответа в заголовке будет 0, а тело сообщения " +#~ "будет представлять собой ассоциативный массив, состоящий из 1 элемента." + +#~ msgid "" +#~ "# \n" +#~ "msgpack(:samp:`{{MP_UINT unsigned integer = size(
) + size()}}`)\n" +#~ "#
\n" +#~ "msgpack({\n" +#~ " Response-Code-Indicator: IPROTO_OK,\n" +#~ " IPROTO_SYNC: :samp:`{{MP_UINT unsigned integer, may be 64-bit}}`,\n" +#~ " IPROTO_SCHEMA_VERSION: :samp:`{{MP_UINT unsigned integer}}`\n" +#~ "})\n" +#~ "# \n" +#~ "msgpack({\n" +#~ " IPROTO_DATA: :samp:`{{any type}}`\n" +#~ "})" +#~ msgstr "" +#~ "# \n" +#~ "msgpack(:samp:`{{MP_UINT unsigned integer = size(
) + size()}}`)\n" +#~ "#
\n" +#~ "msgpack({\n" +#~ " Response-Code-Indicator: IPROTO_OK,\n" +#~ " IPROTO_SYNC: :samp:`{{MP_UINT unsigned integer, may be 64-bit}}`,\n" +#~ " IPROTO_SCHEMA_VERSION: :samp:`{{MP_UINT unsigned integer}}`\n" +#~ "})\n" +#~ "# \n" +#~ "msgpack({\n" +#~ " IPROTO_DATA: :samp:`{{any type}}`\n" +#~ "})" + +#~ msgid "" +#~ "For :ref:`IPROTO_PING ` the body will be an empty map. " +#~ "For most data-access requests (IPROTO_SELECT IPROTO_INSERT IPROTO_DELETE " +#~ "etc.) the body is an IPROTO_DATA map with an array of tuples that contain an" +#~ " array of fields. For :ref:`IPROTO_EVAL ` and " +#~ ":ref:`IPROTO_CALL ` it will usually be an array but, " +#~ "since Lua requests can result in a wide variety of structures, bodies can " +#~ "have a wide variety of structures." +#~ msgstr "" +#~ "В теле сообщения :ref:`IPROTO_PING ` будет пустой " +#~ "ассоциативный массив. В теле большинства запросов доступа к данным " +#~ "(IPROTO_SELECT, IPROTO_INSERT, IPROTO_DELETE и т.д.) будет ассоциативный " +#~ "массив IPROTO_DATA с массивом кортежей, содержащих массив полей. Для " +#~ ":ref:`IPROTO_EVAL ` и :ref:`IPROTO_CALL ` телом обычно будет массив, но поскольку запросы на Lua могут " +#~ "возвращать самые разные структуры, сами тела могут содержать самые разные " +#~ "структуры." + +#~ msgid "" +#~ "If this is the fifth message and the request is " +#~ ":codenormal:`box.space.`:codeitalic:`space-name`:codenormal:`:insert{6}`, " +#~ "and the previous schema version was 100, a successful response will look " +#~ "like this:" +#~ msgstr "" +#~ "Если это пятое сообщение, запрос такой: " +#~ ":codenormal:`box.space.`:codeitalic:`space-name`:codenormal:`:insert{6}`, и " +#~ "предыдущая версия схемы была 100, ответ после успешного выполнения будет " +#~ "выглядеть следующим образом:" + +#~ msgid "" +#~ "# \n" +#~ "msgpack(32)\n" +#~ "#
\n" +#~ "msgpack({\n" +#~ " Response-Code-Indicator: IPROTO_OK,\n" +#~ " IPROTO_SYNC: 5,\n" +#~ " IPROTO_SCHEMA_VERSION: 100\n" +#~ "})\n" +#~ "# \n" +#~ "msgpack({\n" +#~ " IPROTO_DATA: [[6]]\n" +#~ "})" +#~ msgstr "" +#~ "# \n" +#~ "msgpack(32)\n" +#~ "#
\n" +#~ "msgpack({\n" +#~ " Response-Code-Indicator: IPROTO_OK,\n" +#~ " IPROTO_SYNC: 5,\n" +#~ " IPROTO_SCHEMA_VERSION: 100\n" +#~ "})\n" +#~ "# \n" +#~ "msgpack({\n" +#~ " IPROTO_DATA: [[6]]\n" +#~ "})" + +#~ msgid "" +#~ "Later in :ref:`Binary protocol -- illustration ` " +#~ "we will show actual byte codes of the response to the IPROTO_INSERT message." +#~ msgstr "" +#~ "Далее в разделе :ref:`Примеры ` будут приведены " +#~ "байт-коды ответа на сообщение IPROTO_INSERT." + +#~ msgid "" +#~ "IPROTO_DATA is what we get with net_box and :ref:`Module buffer ` so if we were using net_box we could decode with " +#~ ":ref:`msgpack.decode_unchecked() `, or we " +#~ "could convert to a string with :samp:`ffi.string({pointer},{length})`. The " +#~ ":ref:`pickle.unpack() ` function might also be helpful." +#~ msgstr "" +#~ "IPROTO_DATA возвращается в результате использования net_box и :ref:`модуля " +#~ "buffer `. То есть если бы мы использовали net_box, то могли " +#~ "бы интерпретировать результат с помощью :ref:`msgpack.decode_unchecked() " +#~ "` или преобразовать его в строку с помощью " +#~ ":samp:`ffi.string({pointer},{length})`. Также здесь можно использовать " +#~ "функцию :ref:`pickle.unpack() `." + +#~ msgid "Responses for no error and out-of-band" +#~ msgstr "Ответы на внеполосные сообщения" + +#~ msgid "" +#~ "If the response is out-of-band, due to use of :ref:`box.session.push() " +#~ "`, then the header Response-Code-Indicator will be " +#~ "IPROTO_CHUNK instead of IPROTO_OK." +#~ msgstr "" +#~ "Если используется :ref:`box.session.push() `, значением " +#~ "заголовка Response-Code-Indicator для внеполосных сообщений будет " +#~ "IPROTO_CHUNK, а не IPROTO_OK." + +#~ msgid "" +#~ "For a response other than IPROTO_OK, the header Response-Code-Indicator will" +#~ " be ``0x8XXX`` and the body will be a 1-item map." +#~ msgstr "" +#~ "Для ответа, отличного от IPROTO_OK, индикатор кода ответа в заголовке будет " +#~ "``0x8XXX``, а тело будет представлять собой ассоциативный массив, состоящий " +#~ "из 1 элемента." + +#~ msgid "" +#~ "# \n" +#~ "msgpack(32)\n" +#~ "#
\n" +#~ "msgpack({\n" +#~ " Response-Code-Indicator: :samp:`{{0x8XXX}}`,\n" +#~ " IPROTO_SYNC: :samp:`{{MP_UINT unsigned integer, may be 64-bit}}`,\n" +#~ " IPROTO_SCHEMA_VERSION: :samp:`{{MP_UINT unsigned integer}}`\n" +#~ "})\n" +#~ "# \n" +#~ "msgpack({\n" +#~ " IPROTO_ERROR: :samp:`{{MP_STRING string}}`\n" +#~ "})" +#~ msgstr "" +#~ "# \n" +#~ "msgpack(32)\n" +#~ "#
\n" +#~ "msgpack({\n" +#~ " Response-Code-Indicator: :samp:`{{0x8XXX}}`,\n" +#~ " IPROTO_SYNC: :samp:`{{MP_UINT unsigned integer, may be 64-bit}}`,\n" +#~ " IPROTO_SCHEMA_VERSION: :samp:`{{MP_UINT unsigned integer}}`\n" +#~ "})\n" +#~ "# \n" +#~ "msgpack({\n" +#~ " IPROTO_ERROR: :samp:`{{MP_STRING string}}`\n" +#~ "})" + +#~ msgid "" +#~ "where ``0x8XXX`` is the indicator for an error and ``XXX`` is a value in " +#~ "`src/box/errcode.h " +#~ "`_. " +#~ "``src/box/errcode.h`` also has some convenience macros which define " +#~ "hexadecimal constants for return codes." +#~ msgstr "" +#~ "где ``0x8XXX`` — это индикатор ошибки, а ``XXX`` — это значение из файла " +#~ "`src/box/errcode.h " +#~ "`_. В " +#~ "``src/box/errcode.h`` также есть несколько удобных макросов, которые " +#~ "определяют шестнадцатеричные константы для кодов возврата." + +#~ msgid "" +#~ "In version 2.4.0 and earlier, if this is the fifth message and the request " +#~ "is to create a duplicate space with " +#~ "``conn:eval([[box.schema.space.create('_space');]])`` the unsuccessful " +#~ "response will look like this:" +#~ msgstr "" +#~ "В версии 2.4.0 и раньше, если это пятое сообщение и отправляется запрос на " +#~ "создание дубликата спейса с помощью " +#~ "``conn:eval([[box.schema.space.create('_space');]])``, то ответ на " +#~ "невыполненный запрос будет выглядеть следующим образом:" + +#~ msgid "" +#~ "# \n" +#~ "msgpack(32)\n" +#~ "#
\n" +#~ "msgpack({\n" +#~ " Response-Code-Indicator: 0x800a,\n" +#~ " IPROTO_SYNC: 5,\n" +#~ " IPROTO_SCHEMA_VERSION: 0x78\n" +#~ "})\n" +#~ "# \n" +#~ "msgpack({\n" +#~ " IPROTO_ERROR: \"Space '_space' already exists\"\n" +#~ "})" +#~ msgstr "" +#~ "# \n" +#~ "msgpack(32)\n" +#~ "#
\n" +#~ "msgpack({\n" +#~ " Response-Code-Indicator: 0x800a,\n" +#~ " IPROTO_SYNC: 5,\n" +#~ " IPROTO_SCHEMA_VERSION: 0x78\n" +#~ "})\n" +#~ "# \n" +#~ "msgpack({\n" +#~ " IPROTO_ERROR: \"Space '_space' already exists\"\n" +#~ "})" + +#~ msgid "" +#~ "Later in :ref:`Binary protocol -- illustration ` " +#~ "we will show actual byte codes of the response to the IPROTO_EVAL message." +#~ msgstr "" +#~ "Далее в разделе :ref:`Примеры ` будут приведены " +#~ "байт-коды ответа на сообщение IPROTO_EVAL." + +#~ msgid "" +#~ "Looking in errcode.h we find that error code 0x0a (decimal 10) is " +#~ "ER_SPACE_EXISTS, and the string associated with ER_SPACE_EXISTS is \"Space " +#~ "'%s' already exists\"." +#~ msgstr "" +#~ "Заглянув в errcode.h, по коду ошибки 0x0a (10 в десятичной системе) мы " +#~ "обнаружим ER_SPACE_EXISTS, чему соответствует строка \"Space '%s' already " +#~ "exists\" (\"Спейс '%s' уже существует\")." + +#~ msgid "" +#~ "Since version :doc:`2.4.1 `, responses for errors have extra" +#~ " information following what was described above. This extra information is " +#~ "given via MP_ERROR extension type. See details in :ref:`MessagePack " +#~ "extensions ` section." +#~ msgstr "" +#~ "Начиная с версии :doc:`2.4.1 `, ответы на ошибки содержат " +#~ "дополнительную информацию, как описано выше. Эта дополнительная информация " +#~ "передается с помощью расширения MP_ERROR. Подробную информацию см. в разделе" +#~ " :ref:`расширения MessagePack `." + +#~ msgid "" +#~ "After the :ref:`header `, for a response to an SQL " +#~ "statement, there will be a body that is slightly different from the body for" +#~ " :ref:`Binary protocol -- responses if no error and no SQL `." +#~ msgstr "" +#~ "В ответе на SQL-запрос после :ref:`заголовка ` идет " +#~ "тело сообщения, которое немного отличается от тела сообщения, описанного в " +#~ "разделе :ref:`Ответы на запросы без ошибок и без SQL `." + +#~ msgid "" +#~ "If the SQL request is not SELECT or VALUES or PRAGMA, then the response body" +#~ " contains only IPROTO_SQL_INFO (0x42). Usually IPROTO_SQL_INFO is a map with" +#~ " only one item -- SQL_INFO_ROW_COUNT (0x00) -- which is the number of " +#~ "changed rows." +#~ msgstr "" +#~ "Если SQL-запрос не содержит операторы SELECT, VALUES или PRAGMA, то тело " +#~ "ответа содержит только IPROTO_SQL_INFO (0x42). Обычно IPROTO_SQL_INFO " +#~ "представляет собой ассоциативный массив с одним элементом — " +#~ "SQL_INFO_ROW_COUNT (0x00) — количество измененных строк." + +#~ msgid "" +#~ "# \n" +#~ "msgpack(:samp:`{{MP_UINT unsigned integer = size(
) + size()}}`)\n" +#~ "#
\n" +#~ "msgpack({\n" +#~ " Response-Code-Indicator: IPROTO_OK,\n" +#~ " IPROTO_SYNC: :samp:`{{MP_UINT unsigned integer, may be 64-bit}}`,\n" +#~ " IPROTO_SCHEMA_VERSION: :samp:`{{MP_UINT unsigned integer}}`\n" +#~ "})\n" +#~ "# \n" +#~ "msgpack({\n" +#~ " IPROTO_SQL_INFO: {\n" +#~ " SQL_INFO_ROW_COUNT: :samp:`{{MP_UINT}}`\n" +#~ " }\n" +#~ "})" +#~ msgstr "" +#~ "# \n" +#~ "msgpack(:samp:`{{MP_UINT unsigned integer = size(
) + size()}}`)\n" +#~ "#
\n" +#~ "msgpack({\n" +#~ " Response-Code-Indicator: IPROTO_OK,\n" +#~ " IPROTO_SYNC: :samp:`{{MP_UINT unsigned integer, may be 64-bit}}`,\n" +#~ " IPROTO_SCHEMA_VERSION: :samp:`{{MP_UINT unsigned integer}}`\n" +#~ "})\n" +#~ "# \n" +#~ "msgpack({\n" +#~ " IPROTO_SQL_INFO: {\n" +#~ " SQL_INFO_ROW_COUNT: :samp:`{{MP_UINT}}`\n" +#~ " }\n" +#~ "})" + +#~ msgid "" +#~ "For example, if the request is :samp:`INSERT INTO {table-name} VALUES (1), " +#~ "(2), (3)`, then the response body contains an :samp:`IPROTO_SQL_INFO map " +#~ "with SQL_INFO_ROW_COUNT = 3`. :samp:`SQL_INFO_ROW_COUNT` can be 0 for " +#~ "statements that do not change rows, but can be 1 for statements that create " +#~ "new objects." +#~ msgstr "" +#~ "Например, для запроса :samp:`INSERT INTO {table-name} VALUES (1), (2), (3)` " +#~ "тело ответа содержит ассоциативный массив :samp:`IPROTO_SQL_INFO с " +#~ "SQL_INFO_ROW_COUNT = 3`. :samp:`SQL_INFO_ROW_COUNT` может быть 0, если " +#~ "оператор не изменяет строку, и может быть 1, если оператор создает новый " +#~ "объект." + +#~ msgid "" +#~ "The IPROTO_SQL_INFO map may contain a second item -- " +#~ ":samp:`SQL_INFO_AUTO_INCREMENT_IDS (0x01)` -- which is the new primary-key " +#~ "value (or values) for an INSERT in a table defined with PRIMARY KEY " +#~ "AUTOINCREMENT. In this case the MP_MAP will have two keys, and one of the " +#~ "two keys will be 0x01: SQL_INFO_AUTO_INCREMENT_IDS, which is an array of " +#~ "unsigned integers." +#~ msgstr "" +#~ "Ассоциативный массив IPROTO_SQL_INFO может содержать второй элемент " +#~ ":samp:`SQL_INFO_AUTO_INCREMENT_IDS (0x01)`, который представляет собой новое" +#~ " значение (или значения) первичного ключа в операции вставки INSERT в " +#~ "таблицу с автоматическим увеличением первичного ключа PRIMARY KEY " +#~ "AUTOINCREMENT. В этом случае MP_MAP будет содержать два ключа, и одним из " +#~ "двух ключей будет 0x01: SQL_INFO_AUTO_INCREMENT_IDS, который представляет " +#~ "собой массив целых беззнаковых чисел." + +#~ msgid "" +#~ "If the SQL statement is SELECT or VALUES or PRAGMA, the response contains:" +#~ msgstr "" +#~ "Если запрос содержит SQL-оператор SELECT, VALUES или PRAGMA, ответ будет:" + +#~ msgid "" +#~ "# \n" +#~ "msgpack(32)\n" +#~ "#
\n" +#~ "msgpack({\n" +#~ " Response-Code-Indicator: IPROTO_OK,\n" +#~ " IPROTO_SYNC: :samp:`{{MP_UINT unsigned integer, may be 64-bit}}`,\n" +#~ " IPROTO_SCHEMA_VERSION: :samp:`{{MP_UINT unsigned integer}}`\n" +#~ "})\n" +#~ "# \n" +#~ "msgpack({\n" +#~ " IPROTO_METADATA: :samp:`{{array of column maps}}`,\n" +#~ " IPROTO_DATA: :samp:`{{array of tuples}}`\n" +#~ "})" +#~ msgstr "" +#~ "# \n" +#~ "msgpack(32)\n" +#~ "#
\n" +#~ "msgpack({\n" +#~ " Response-Code-Indicator: IPROTO_OK,\n" +#~ " IPROTO_SYNC: :samp:`{{MP_UINT unsigned integer, may be 64-bit}}`,\n" +#~ " IPROTO_SCHEMA_VERSION: :samp:`{{MP_UINT unsigned integer}}`\n" +#~ "})\n" +#~ "# \n" +#~ "msgpack({\n" +#~ " IPROTO_METADATA: :samp:`{{array of column maps}}`,\n" +#~ " IPROTO_DATA: :samp:`{{array of tuples}}`\n" +#~ "})" + +#~ msgid "" +#~ ":samp:`IPROTO_METADATA: {array of column maps}` = array of column maps, with" +#~ " each column map containing at least IPROTO_FIELD_NAME (0x00) and MP_STR, " +#~ "and IPROTO_FIELD_TYPE (0x01) and MP_STR. Additionally, if " +#~ "``sql_full_metadata`` in the :ref:`_session_settings ` system space is TRUE, then the array will have these " +#~ "additional column maps which correspond to components described in the " +#~ ":ref:`box.execute() ` section:" +#~ msgstr "" +#~ ":samp:`IPROTO_METADATA: {array of column maps}` --- массив ассоциативных " +#~ "массивов, причем каждый ассоциативный массив содержит по крайней мере " +#~ "IPROTO_FIELD_NAME (0x00) + MP_STR и IPROTO_FIELD_TYPE (0x01) + MP_STR. Кроме" +#~ " того, если в системном спейсе :ref:`_session_settings ` задано значение TRUE для ``sql_full_metadata``, то массив" +#~ " будет содержать такие дополнительные ассоциативные массивы, которые " +#~ "соответствуют компонентам, описанным в разделе :ref:`box.execute() `:" + +#~ msgid "" +#~ "IPROTO_FIELD_COLL (0x02) and MP_STR\n" +#~ "IPROTO_FIELD_IS_NULLABLE (0x03) and MP_BOOL\n" +#~ "IPROTO_FIELD_IS_AUTOINCREMENT (0x04) and MP_BOOL\n" +#~ "IPROTO_FIELD_SPAN (0x05) and MP_STR or MP_NIL" +#~ msgstr "" +#~ "IPROTO_FIELD_COLL (0x02) + MP_STR\n" +#~ "IPROTO_FIELD_IS_NULLABLE (0x03) + MP_BOOL\n" +#~ "IPROTO_FIELD_IS_AUTOINCREMENT (0x04) + MP_BOOL\n" +#~ "IPROTO_FIELD_SPAN (0x05) + MP_STR или MP_NIL" + +#~ msgid ":samp:`IPROTO_DATA:{array of tuples}` = the result set \"rows\"." +#~ msgstr "" +#~ ":samp:`IPROTO_DATA:{array of tuples}` = строки результирующего набора." + +#~ msgid "" +#~ "If we ask for full metadata by saying |br| " +#~ ":code:`conn.space._session_settings:update('sql_full_metadata', {{'=', " +#~ "'value', true}})` |br| and we select the two rows from a table named t1 that" +#~ " has columns named DD and Д, with |br| :code:`conn:execute([[SELECT dd, дд " +#~ "AS д FROM t1;]])` |br| we could get this response, in the body:" +#~ msgstr "" +#~ "Если мы запросим полные метаданные, вызвав |br| " +#~ ":code:`conn.space._session_settings:update('sql_full_metadata', {{'=', " +#~ "'value', true}})` |br| и выберем две строки из таблицы t1, в которой есть " +#~ "столбцы DD и Д, с помощью |br| :code:`conn:execute([[SELECT dd, дд AS д FROM" +#~ " t1;]])` |br| мы можем получить такой ответ:" + +#~ msgid "" +#~ "# \n" +#~ "msgpack({\n" +#~ " IPROTO_METADATA: [\n" +#~ " IPROTO_FIELD_NAME: 'DD',\n" +#~ " IPROTO_FIELD_TYPE: 'integer',\n" +#~ " IPROTO_FIELD_IS_NULLABLE: false,\n" +#~ " IPROTO_FIELD_IS_AUTOINCREMENT: true,\n" +#~ " IPROTO_FIELD_SPAN: nil,\n" +#~ " IPROTO_FIELD_NAME: 'Д',\n" +#~ " IPROTO_FIELD_TYPE: 'string',\n" +#~ " IPROTO_FIELD_COLL: 'unicode',\n" +#~ " IPROTO_FIELD_IS_NULLABLE: true,\n" +#~ " IPROTO_FIELD_SPAN: 'дд'\n" +#~ " ],\n" +#~ " IPROTO_DATA: [\n" +#~ " [1,'a'],\n" +#~ " [2,'b']'\n" +#~ " ]\n" +#~ "})" +#~ msgstr "" +#~ "# \n" +#~ "msgpack({\n" +#~ " IPROTO_METADATA: [\n" +#~ " IPROTO_FIELD_NAME: 'DD',\n" +#~ " IPROTO_FIELD_TYPE: 'integer',\n" +#~ " IPROTO_FIELD_IS_NULLABLE: false,\n" +#~ " IPROTO_FIELD_IS_AUTOINCREMENT: true,\n" +#~ " IPROTO_FIELD_SPAN: nil,\n" +#~ " IPROTO_FIELD_NAME: 'Д',\n" +#~ " IPROTO_FIELD_TYPE: 'string',\n" +#~ " IPROTO_FIELD_COLL: 'unicode',\n" +#~ " IPROTO_FIELD_IS_NULLABLE: true,\n" +#~ " IPROTO_FIELD_SPAN: 'дд'\n" +#~ " ],\n" +#~ " IPROTO_DATA: [\n" +#~ " [1,'a'],\n" +#~ " [2,'b']'\n" +#~ " ]\n" +#~ "})" + +#~ msgid "" +#~ "If instead we said |br| :code:`conn:prepare([[SELECT dd, дд AS д FROM " +#~ "t1;]])` |br| then we could get almost the same response, but there would be " +#~ "no IPROTO_DATA and there would be two additional items: |br| ``34 00 = " +#~ "IPROTO_BIND_COUNT and MP_UINT = 0`` (there are no parameters to bind), |br| " +#~ "``33 90 = IPROTO_BIND_METADATA and MP_ARRAY, size 0`` (there are no " +#~ "parameters to bind)." +#~ msgstr "" +#~ "Если бы вместо этого мы вызвали :code:`conn:prepare([[SELECT dd, дд AS д " +#~ "FROM t1;]])`, мы получили бы почти такой же ответ, но без IPROTO_DATA и с " +#~ "двумя дополнительными элементами: |br| ``34`` (IPROTO_BIND_COUNT) и ``00`` " +#~ "(MP_UINT = 0, нет параметров), ``33`` (IPROTO_BIND_METADATA) и ``90`` " +#~ "(MP_ARRAY размера 0, нет параметров)." + +#~ msgid "" +#~ "# \n" +#~ "msgpack({\n" +#~ " IPROTO_STMT_ID: :samp:`{{MP_UINT unsigned integer}}`,\n" +#~ " IPROTO_BIND_COUNT: :samp:`{{MP_INT integer}}`,\n" +#~ " IPROTO_BIND_METADATA: :samp:`{{array of parameter descriptors}}`,\n" +#~ " IPROTO_METADATA: [\n" +#~ " IPROTO_FIELD_NAME: 'DD',\n" +#~ " IPROTO_FIELD_TYPE: 'integer',\n" +#~ " IPROTO_FIELD_IS_NULLABLE: false\n" +#~ " IPROTO_FIELD_IS_AUTOINCREMENT: true\n" +#~ " IPROTO_FIELD_SPAN: nil,\n" +#~ " IPROTO_FIELD_NAME: 'Д',\n" +#~ " IPROTO_FIELD_TYPE: 'string',\n" +#~ " IPROTO_FIELD_COLL: 'unicode',\n" +#~ " IPROTO_FIELD_IS_NULLABLE: true,\n" +#~ " IPROTO_FIELD_SPAN: 'дд'\n" +#~ " ]\n" +#~ " })" +#~ msgstr "" +#~ "# \n" +#~ "msgpack({\n" +#~ " IPROTO_STMT_ID: :samp:`{{MP_UINT unsigned integer}}`,\n" +#~ " IPROTO_BIND_COUNT: :samp:`{{MP_INT integer}}`,\n" +#~ " IPROTO_BIND_METADATA: :samp:`{{array of parameter descriptors}}`,\n" +#~ " IPROTO_METADATA: [\n" +#~ " IPROTO_FIELD_NAME: 'DD',\n" +#~ " IPROTO_FIELD_TYPE: 'integer',\n" +#~ " IPROTO_FIELD_IS_NULLABLE: false\n" +#~ " IPROTO_FIELD_IS_AUTOINCREMENT: true\n" +#~ " IPROTO_FIELD_SPAN: nil,\n" +#~ " IPROTO_FIELD_NAME: 'Д',\n" +#~ " IPROTO_FIELD_TYPE: 'string',\n" +#~ " IPROTO_FIELD_COLL: 'unicode',\n" +#~ " IPROTO_FIELD_IS_NULLABLE: true,\n" +#~ " IPROTO_FIELD_SPAN: 'дд'\n" +#~ " ]\n" +#~ " })" + +#~ msgid "" +#~ "Now read the source code file `net_box.c " +#~ "`_" +#~ " where the function \"decode_metadata_optional\" is an example of how " +#~ "Tarantool itself decodes extra items." +#~ msgstr "" +#~ "Теперь обратитесь к файлу исходного кода `net_box.c " +#~ "`_," +#~ " где функция \"decode_metadata_optional\" показывает, как Tarantool сам " +#~ "интерпретирует дополнительные элементы." + +#~ msgid "" +#~ "Later in :ref:`Binary protocol -- illustration ` " +#~ "we will show actual byte codes of responses to the above SQL messages." +#~ msgstr "" +#~ "Далее в разделе :ref:`Примеры ` будут рассмотрены" +#~ " байт-коды ответов на вышеприведенные SQL сообщения." + +#~ msgid "Authentication" +#~ msgstr "Аутентификация" + +#~ msgid "Greeting message" +#~ msgstr "Приветствие" + +#~ msgid "" +#~ "When a client connects to the server instance, the instance responds with a " +#~ "128-byte text greeting message, not in MsgPack format: |br| 64-byte Greeting" +#~ " text line 1 |br| 64-byte Greeting text line 2 |br| 44-byte base64-encoded " +#~ "salt |br| 20-byte NULL" +#~ msgstr "" +#~ "Когда клиент подключается к экземпляру сервера, тот выдает в ответе " +#~ "128-байтовое текстовое сообщение приветствия не в формате MsgPack: |br| 64 " +#~ "байта — строка 1 текста приветствия |br| 64 байта — строка 2 текста " +#~ "приветствия |br| 44 байта —закодированное в формате base-64 значение соль " +#~ "|br| 20 байтов — NULL" + +#~ msgid "" +#~ "The greeting contains two 64-byte lines of ASCII text. Each line ends with a" +#~ " newline character (:code:`\\n`). The first line contains the instance " +#~ "version and protocol type. The second line contains up to 44 bytes of " +#~ "base64-encoded random string, to use in the authentication packet, and ends " +#~ "with up to 23 spaces." +#~ msgstr "" +#~ "Приветствие содержит две 64-байтные строки текста в формате ASCII. Каждая " +#~ "строка заканчивается символом разрыва строки (:code:`\\n`). Первая строка " +#~ "описывает версию экземпляра и тип протокола. Вторая строка содержит " +#~ "случайную строку в кодировке base-64 размером до 44 байтов для использования" +#~ " в пакете аутентификации и заканчивается на пробелы (до 23)." + +#~ msgid "" +#~ "Part of the greeting is a base64-encoded session salt - a random string " +#~ "which can be used for authentication. The maximum length of an encoded salt " +#~ "(44 bytes) is more than the amount necessary to create the authentication " +#~ "message. An excess is reserved for future authentication schemas." +#~ msgstr "" +#~ "Часть приветствия представляет собой закодированное в формате base-64 " +#~ "значение соль для сессии (случайная строка), которое можно использовать для " +#~ "аутентификации. Максимальная длина закодированного значения соль (44 байта) " +#~ "больше, чем размер создаваемого сообщения аутентификации. Остаток " +#~ "предназначается для будущих схем аутентификации." + +#~ msgid "" +#~ "Authentication is optional -- if it is skipped, then the session user is " +#~ "``'guest'`` (the ``'guest'`` user does not need a password)." +#~ msgstr "" +#~ "Аутентификация необязательна: если аутентификация не проводится, то " +#~ "пользователем в сеансе будет ``'guest'`` (пользователю ``'guest'`` пароль не" +#~ " нужен)." + +#~ msgid "" +#~ "If authentication is not skipped, then at any time an authentication packet " +#~ "can be prepared using the greeting, the user's name and password, and `sha-1" +#~ " `_ functions, as follows." +#~ msgstr "" +#~ "Если аутентификация проводится, то в любое время может быть подготовлен " +#~ "пакет аутентификации с использованием приветствия, имени и пароля " +#~ "пользователя и функции `sha-1 `_, как " +#~ "показано ниже." + +#~ msgid "" +#~ "PREPARE SCRAMBLE:\n" +#~ "\n" +#~ " size_of_encoded_salt_in_greeting = 44;\n" +#~ " size_of_salt_after_base64_decode = 32;\n" +#~ " /* sha1() will only use the first 20 bytes */\n" +#~ " size_of_any_sha1_digest = 20;\n" +#~ " size_of_scramble = 20;\n" +#~ "\n" +#~ "prepare 'chap-sha1' scramble:\n" +#~ "\n" +#~ " salt = base64_decode(encoded_salt);\n" +#~ " step_1 = sha1(password);\n" +#~ " step_2 = sha1(step_1);\n" +#~ " step_3 = sha1(first_20_bytes_of_salt, step_2);\n" +#~ " scramble = xor(step_1, step_3);\n" +#~ " return scramble;" +#~ msgstr "" +#~ "PREPARE SCRAMBLE:\n" +#~ "\n" +#~ " size_of_encoded_salt_in_greeting = 44;\n" +#~ " size_of_salt_after_base64_decode = 32;\n" +#~ " /* sha1() will only use the first 20 bytes */\n" +#~ " size_of_any_sha1_digest = 20;\n" +#~ " size_of_scramble = 20;\n" +#~ "\n" +#~ "prepare 'chap-sha1' scramble:\n" +#~ "\n" +#~ " salt = base64_decode(encoded_salt);\n" +#~ " step_1 = sha1(password);\n" +#~ " step_2 = sha1(step_1);\n" +#~ " step_3 = sha1(first_20_bytes_of_salt, step_2);\n" +#~ " scramble = xor(step_1, step_3);\n" +#~ " return scramble;" + +#~ msgid "The client sends an authentication packet as an IPROTO_AUTH message:" +#~ msgstr "Клиент отправляет пакет аутентификации в виде сообщения IPROTO_AUTH:" + +#~ msgid "" +#~ "# \n" +#~ "msgpack(:samp:`{{MP_UINT unsigned integer = size(
) + size()}}`)\n" +#~ "#
\n" +#~ "msgpack({\n" +#~ " IPROTO_REQUEST_TYPE: IPROTO_AUTH,\n" +#~ " IPROTO_SYNC: :samp:`{{MP_UINT unsigned integer, usually = 1}}`\n" +#~ "})\n" +#~ "# \n" +#~ "msgpack({\n" +#~ " IPROTO_USER_NAME: :samp:`{{MP_STRING string }}`,\n" +#~ " IPROTO_TUPLE: ['chap-sha1', :samp:`{{MP_STRING 20-byte string}}`]\n" +#~ "})" +#~ msgstr "" +#~ "# \n" +#~ "msgpack(:samp:`{{MP_UINT unsigned integer = size(
) + size()}}`)\n" +#~ "#
\n" +#~ "msgpack({\n" +#~ " IPROTO_REQUEST_TYPE: IPROTO_AUTH,\n" +#~ " IPROTO_SYNC: :samp:`{{MP_UINT unsigned integer, usually = 1}}`\n" +#~ "})\n" +#~ "# \n" +#~ "msgpack({\n" +#~ " IPROTO_USER_NAME: :samp:`{{MP_STRING string }}`,\n" +#~ " IPROTO_TUPLE: ['chap-sha1', :samp:`{{MP_STRING 20-byte string}}`]\n" +#~ "})" + +#~ msgid "" +#~ ":code:`` holds the user name. :code:`` must be an array of 2 " +#~ "fields: authentication mechanism (\"chap-sha1\" is the only supported " +#~ "mechanism right now) and scramble, encrypted according to the specified " +#~ "mechanism." +#~ msgstr "" +#~ ":code:`` содержит имя пользователя. :code:`` должен представлять" +#~ " собой массив из 2 полей: механизм аутентификации (на данный момент " +#~ "поддерживается только механизм \"chap-sha1\") и сообщение, зашифрованное в " +#~ "соответствии с указанным механизмом." + +#~ msgid "" +#~ "The server instance responds to an authentication packet with a standard " +#~ "response with 0 tuples." +#~ msgstr "" +#~ "На пакет аутентификации экземпляр сервера отправляет стандартный ответ с 0 " +#~ "кортежей." + +#~ msgid "" +#~ "To see how Tarantool handles this, look at `net_box.c " +#~ "`_" +#~ " function ``netbox_encode_auth``." +#~ msgstr "" +#~ "Чтобы понять, как Tarantool это обрабатывает, обратите внимание на функцию " +#~ "`netbox_encode_auth`` в файле `net_box.c " +#~ "`_." + +#~ msgid "Binary protocol -- streams" +#~ msgstr "Бинарный протокол — стримы" + +#~ msgid "" +#~ "The :ref:`Streams and interactive transactions ` feature, which " +#~ "was added in Tarantool version :tarantool-release:`2.10.0`, allows two " +#~ "things: sequential processing and interleaving." +#~ msgstr "" +#~ ":ref:`Стримы и интерактивные транзакции `, добавленные в " +#~ "Tarantool :tarantool-release:`2.10.0`, делают возможными две процедуры: " +#~ "последовательную обработку и чередование." + +#~ msgid "" +#~ "Sequential processing: With streams there is a guarantee that the server " +#~ "instance will not handle the next request in a stream until it has completed" +#~ " the previous one." +#~ msgstr "" +#~ "Последовательная обработка гарантирует, что экземпляр не будет обрабатывать " +#~ "следующий запрос в стриме, пока не завершит работу с предыдущим." + +#~ msgid "" +#~ "Interleaving: For example, a series of requests can include \"begin for " +#~ "stream #1\", \"begin for stream #2\", \"insert for stream #1\", \"insert for" +#~ " stream #2\", \"delete for stream #1\", \"commit for stream #1\", \"rollback" +#~ " for stream #2\"." +#~ msgstr "" +#~ "Чередование допускает, например, такую последовательность запросов: \"begin " +#~ "для стрима 1\", \"begin для стрима 2\", \"insert для стрима 1\", \"insert " +#~ "для стрима 2\", \"delete для стрима 1\", \"commit для стрима 1\", \"rollback" +#~ " для стрима 2\"." + +#~ msgid "" +#~ "To make these things possible, the engine should be :ref:`vinyl ` or :ref:`memtx with mvcc `, and the" +#~ " client is responsible for ensuring that the stream identifier, unsigned " +#~ "integer :ref:`IPROTO_STREAM_ID `, is in the " +#~ "request header. IPROTO_STREAM_ID can be any positive 64-bit number, and " +#~ "should be unique for the connection. If IPROTO_STREAM_ID equals zero the " +#~ "server instance will ignore it." +#~ msgstr "" +#~ "Эти процедуры возможны, если используется движок :ref:`vinyl ` или :ref:`memtx с mvcc `. При этом " +#~ "клиент отвечает за наличие идентификатора стрима, беззнакового целого числа " +#~ ":ref:`IPROTO_STREAM_ID `, в заголовке " +#~ "запроса. Идентификатор IPROTO_STREAM_ID должен быть положительным 64-битовым" +#~ " числом, уникальным для соединения. Если IPROTO_STREAM_ID стрима равен нулю," +#~ " экземпляр его проигнорирует." + +#~ msgid "" +#~ "For example, suppose that the client has started a stream with the " +#~ ":ref:`net.box module `" +#~ msgstr "" +#~ "Предположим, что клиент запустил стрим с помощью :ref:`модуля " +#~ "net.box`." + +#~ msgid "" +#~ "net_box = require('net.box')\n" +#~ "conn = net_box.connect('localhost:3302')\n" +#~ "stream = conn:new_stream()" +#~ msgstr "" +#~ "net_box = require('net.box')\n" +#~ "conn = net_box.connect('localhost:3302')\n" +#~ "stream = conn:new_stream()" + +#~ msgid "" +#~ "At this point the stream object will look like a duplicate of the conn " +#~ "object, with just one additional member: ``stream_id``. Now, using stream " +#~ "instead of conn, the client sends two requests:" +#~ msgstr "" +#~ "В этот момент объект ``stream`` будет выглядеть так же, как объект ``conn``," +#~ " но включать один дополнительный элемент: ``stream_id``. Пусть теперь " +#~ "клиент, используя ``stream`` вместо ``conn``, отправит два запроса:" + +#~ msgid "" +#~ "stream.space.T:insert{1}\n" +#~ "stream.space.T:insert{2}" +#~ msgstr "" +#~ "stream.space.T:insert{1}\n" +#~ "stream.space.T:insert{2}" + +#~ msgid "" +#~ "The header and body of these requests will be the same as in non-stream " +#~ ":ref:`IPROTO_INSERT ` requests, except that the header " +#~ "will contain an additional item: IPROTO_STREAM_ID=0x0a with MP_UINT=0x01. It" +#~ " happens to equal 1 for this example because each call to conn:new_stream() " +#~ "assigns a new number, starting with 1." +#~ msgstr "" +#~ "Заголовок и тело этих запросов будут такими же, как в обычных запросах " +#~ ":ref:`IPROTO_INSERT `, но заголовок будет содержать " +#~ "дополнительный элемент ``IPROTO_STREAM_ID=0x0a``, где ``MP_UINT=0x01``. В " +#~ "этом примере значение IPROTO_STREAM_ID равно 1, так как при вызове " +#~ "``conn:new_stream()`` идентификатору каждого нового стрима присваивается " +#~ "уникальное значение, начиная с 1." + +#~ msgid "" +#~ "The client makes stream transactions by sending, in order: IPROTO_BEGIN, the" +#~ " transaction data-change and query requests, IPROTO_COMMIT or " +#~ "IPROTO_ROLLBACK. Each request must contain the same IPROTO_STREAM_ID value. " +#~ "With streaming there is no need to add :ref:`IPROTO_FLAGS ` and IPROTO_FLAG_COMMIT in the header of the last request of a " +#~ "transaction. Rollback will be automatic if disconnect occurs before commit " +#~ "is possible." +#~ msgstr "" +#~ "Клиент запускает транзакцию внутри стрима, отправляя запросы в следующем " +#~ "порядке: IPROTO_BEGIN, запросы на изменение и получение данных транзакции, " +#~ "затем IPROTO_COMMIT или IPROTO_ROLLBACK. Каждый запрос должен содержать " +#~ "переменную IPROTO_STREAM_ID с одним и тем же значением. Используя стримы, не" +#~ " нужно добавлять в заголовок последнего запроса транзакции " +#~ ":ref:`IPROTO_FLAGS ` и IPROTO_FLAG_COMMIT. Если " +#~ "транзакция прервется до того, как можно будет выполнить коммит, она будет " +#~ "автоматически отменена." + +#~ msgid "" +#~ "Thus there are now multiple ways to do transactions: with net_box and " +#~ "stream:begin() and stream:commit() or stream:rollback() which cause " +#~ "IPROTO_BEGIN and IPROTO_COMMIT or IPROTO_ROLLBACK with the current value of " +#~ "stream.stream_id; with :ref:`box.begin() ` and :ref:`box.commit()" +#~ " ` or :ref:`box.rollback() `; with SQL and " +#~ ":ref:`START TRANSACTION ` and :ref:`COMMIT " +#~ "` or :ref:`ROLLBACK `. An application can use any " +#~ "or all of these ways." +#~ msgstr "" +#~ "Таким образом, у приложения есть несколько способов выполнять транзакции. " +#~ "Во-первых, можно использовать модуль ``net_box`` с методами " +#~ "``stream:begin()`` и ``stream:commit()``/``stream:rollback()``, которые " +#~ "отправляют запросы IPROTO_BEGIN и IPROTO_COMMIT/IPROTO_ROLLBACK с текущим " +#~ "значением ``stream.stream_id``. Другой способ --- применять методы " +#~ ":ref:`box.begin() ` и :ref:`box.commit() `/:ref:`box.rollback() `. Наконец, можно пользоваться " +#~ "инструкциями SQL :ref:`START TRANSACTION ` и " +#~ ":ref:`COMMIT `/:ref:`ROLLBACK `." + +#~ msgid "Replication" +#~ msgstr "Репликация" + +#~ msgid "IPROTO_JOIN = 0x41" +#~ msgstr "IPROTO_JOIN = 0x41" + +#~ msgid "First you must send an initial IPROTO_JOIN request." +#~ msgstr "Сначала нужно отправить запрос IPROTO_JOIN." + +#~ msgid "" +#~ "# \n" +#~ "msgpack(:samp:`{{MP_UINT unsigned integer = size(
) + size()}}`)\n" +#~ "#
\n" +#~ "msgpack({\n" +#~ " IPROTO_REQUEST_TYPE: IPROTO_JOIN,\n" +#~ " IPROTO_SYNC: :samp:`{{MP_UINT unsigned integer}}`\n" +#~ "})\n" +#~ "# \n" +#~ "msgpack({\n" +#~ " IPROTO_INSTANCE_UUID: :samp:`{{uuid}}`\n" +#~ "})" +#~ msgstr "" +#~ "# \n" +#~ "msgpack(:samp:`{{MP_UINT unsigned integer = size(
) + size()}}`)\n" +#~ "#
\n" +#~ "msgpack({\n" +#~ " IPROTO_REQUEST_TYPE: IPROTO_JOIN,\n" +#~ " IPROTO_SYNC: :samp:`{{MP_UINT unsigned integer}}`\n" +#~ "})\n" +#~ "# \n" +#~ "msgpack({\n" +#~ " IPROTO_INSTANCE_UUID: :samp:`{{uuid}}`\n" +#~ "})" + +#~ msgid "" +#~ "Then the instance which you want to connect to will send its last SNAP file," +#~ " by simply creating a number of INSERTs (with additional LSN and ServerID) " +#~ "(do not reply to this). Then that instance will send a vclock's MP_MAP and " +#~ "close a socket." +#~ msgstr "" +#~ "Затем экземпляр, к которому вы хотите подключиться, отправит свой последний " +#~ "SNAP-файл, просто создав несколько запросов типа INSERT (с дополнительными " +#~ "LSN и ServerID) (не отвечайте на них). Затем этот экземпляр отправит MP_MAP " +#~ "vclock и закроет сокет." + +#~ msgid "" +#~ "# \n" +#~ "msgpack(:samp:`{{MP_UINT unsigned integer = size(
) + size()}}`)\n" +#~ "#
\n" +#~ "msgpack({\n" +#~ " Response-Code-Indicator: 0,\n" +#~ " IPROTO_SYNC: :samp:`{{MP_UINT unsigned integer}}`\n" +#~ "})\n" +#~ "# \n" +#~ "msgpack({\n" +#~ " IPROTO_VCLOCK: :samp:`{{MP_INT SRV_ID, MP_INT SRV_LSN}}`\n" +#~ "})" +#~ msgstr "" +#~ "# \n" +#~ "msgpack(:samp:`{{MP_UINT unsigned integer = size(
) + size()}}`)\n" +#~ "#
\n" +#~ "msgpack({\n" +#~ " Response-Code-Indicator: 0,\n" +#~ " IPROTO_SYNC: :samp:`{{MP_UINT unsigned integer}}`\n" +#~ "})\n" +#~ "# \n" +#~ "msgpack({\n" +#~ " IPROTO_VCLOCK: :samp:`{{MP_INT SRV_ID, MP_INT SRV_LSN}}`\n" +#~ "})" + +#~ msgid "IPROTO_SUBSCRIBE = 0x42" +#~ msgstr "IPROTO_SUBSCRIBE = 0x42" + +#~ msgid "Then you must send an IPROTO_SUBSCRIBE request." +#~ msgstr "Теперь нужно отправить запрос IPROTO_SUBSCRIBE." + +#~ msgid "" +#~ "# \n" +#~ "msgpack(:samp:`{{MP_UINT unsigned integer = size(
) + size()}}`)\n" +#~ "#
\n" +#~ "msgpack({\n" +#~ " IPROTO_REQUEST_TYPE: IPROTO_SUBSCRIBE,\n" +#~ " IPROTO_SYNC: :samp:`{{MP_UINT unsigned integer}}`,\n" +#~ " IPROTO_INSTANCE_UUID: :samp:`{{uuid}}`,\n" +#~ " IPROTO_CLUSTER_UUID: :samp:`{{uuid}}`,\n" +#~ "})\n" +#~ "# \n" +#~ "msgpack({\n" +#~ " IPROTO_VCLOCK: :samp:`{{MP_INT SRV_ID, MP_INT SRV_LSN}}`\n" +#~ "})" +#~ msgstr "" +#~ "# \n" +#~ "msgpack(:samp:`{{MP_UINT unsigned integer = size(
) + size()}}`)\n" +#~ "#
\n" +#~ "msgpack({\n" +#~ " IPROTO_REQUEST_TYPE: IPROTO_SUBSCRIBE,\n" +#~ " IPROTO_SYNC: :samp:`{{MP_UINT unsigned integer}}`,\n" +#~ " IPROTO_INSTANCE_UUID: :samp:`{{uuid}}`,\n" +#~ " IPROTO_CLUSTER_UUID: :samp:`{{uuid}}`,\n" +#~ "})\n" +#~ "# \n" +#~ "msgpack({\n" +#~ " IPROTO_VCLOCK: :samp:`{{MP_INT SRV_ID, MP_INT SRV_LSN}}`\n" +#~ "})" + +#~ msgid "" +#~ "Then you must process every request that could come through other masters. " +#~ "Every request between masters will have additional LSN and SERVER_ID." +#~ msgstr "" +#~ "Затем нужно обработать каждый запрос, который может прийти через других " +#~ "мастеров. В каждом запросе между мастерами будут дополнительные LSN и " +#~ "SERVER_ID." + +#~ msgid "HEARTBEATS" +#~ msgstr "Контрольные сигналы" + +#~ msgid "" +#~ "Frequently a master sends a :ref:`heartbeat ` message to a " +#~ "replica. For example, if there is a replica with id = 2, and a timestamp " +#~ "with a moment in 2020, a master might send this:" +#~ msgstr "" +#~ "Часто мастер отправляет реплике сообщение :ref:`контрольного сигнала " +#~ "`. Например, если есть реплика с ID = 2 и метка с моментом " +#~ "времени в 2020 году, мастер может послать такое сообщение:" + +#~ msgid "" +#~ "#
\n" +#~ "msgpack({\n" +#~ " IPROTO_REQUEST_TYPE: 0\n" +#~ " IPROTO_REPLICA_ID: 2\n" +#~ " IPROTO_TIMESTAMP: :samp:`{{Float 64 MP_DOUBLE 8-byte timestamp}}`\n" +#~ "})" +#~ msgstr "" +#~ "#
\n" +#~ "msgpack({\n" +#~ " IPROTO_REQUEST_TYPE: 0\n" +#~ " IPROTO_REPLICA_ID: 2\n" +#~ " IPROTO_TIMESTAMP: :samp:`{{Float 64 MP_DOUBLE 8-byte timestamp}}`\n" +#~ "})" + +#~ msgid "and the replica might send back this:" +#~ msgstr "и реплика может отправить в ответ следующее:" + +#~ msgid "" +#~ "#
\n" +#~ "msgpack({\n" +#~ " Response-Code-Indicator: IPROTO_OK\n" +#~ " IPROTO_REPLICA_ID: 2\n" +#~ " IPROTO_VCLOCK: {1, 6}\n" +#~ "})" +#~ msgstr "" +#~ "#
\n" +#~ "msgpack({\n" +#~ " Response-Code-Indicator: IPROTO_OK\n" +#~ " IPROTO_REPLICA_ID: 2\n" +#~ " IPROTO_VCLOCK: {1, 6}\n" +#~ "})" + +#~ msgid "" +#~ "Later in :ref:`Binary protocol -- illustration ` " +#~ "we will show actual byte codes of the above heartbeat examples." +#~ msgstr "" +#~ "Далее в разделе :ref:`Примеры ` будут рассмотрены" +#~ " байт-коды вышеприведенных сообщений контрольного сигнала." + +#~ msgid "BALLOTS" +#~ msgstr "Сообщения с идентификатором BALLOT" + +#~ msgid "" +#~ "While connecting for replication, an instance sends a request with header " +#~ "IPROTO_VOTE (0x44). The normal response is ER_OK,and IPROTO_BALLOT (0x29). " +#~ "The fields within IPROTO_BALLOT are map items:" +#~ msgstr "" +#~ "При подключении для репликации экземпляр отправляет запрос с заголовком " +#~ "IPROTO_VOTE (0x44). Обычно ответом будет ER_OK и IPROTO_BALLOT (0x29). Поля " +#~ "в IPROTO_BALLOT — это элементы ассоциативного массива:" + +#~ msgid "" +#~ "IPROTO_BALLOT_IS_RO_CFG (0x01) + MP_BOOL\n" +#~ "IPROTO_BALLOT_VCLOCK (0x02) + vclock\n" +#~ "IPROTO_BALLOT_GC_VCLOCK (0x03) + vclock\n" +#~ "IPROTO_BALLOT_IS_RO (0x04) + MP_BOOL\n" +#~ "IPROTO_BALLOT_IS_ANON = 0x05 + MP_BOOL\n" +#~ "IPROTO_BALLOT_IS_BOOTED = 0x06 + MP_BOOL\n" +#~ "IPROTO_BALLOT_CAN_LEAD = 0x07 + MP_BOOL" +#~ msgstr "" + +#~ msgid "" +#~ "IPROTO_BALLOT_IS_RO_CFG and IPRO_BALLOT_VCLOCK and IPROTO_BALLOT_GC_VCLOCK " +#~ "and IPROTO_BALLOT_IS_RO were added in version :doc:`2.6.1 `." +#~ " IPROTO_BALLOT_IS_ANON was added in version :doc:`2.7.1 `. " +#~ "IPROTO_BALLOT_IS_BOOTED was added in version 2.7.3 and 2.8.2 and 2.9.1. " +#~ "There have been some name changes starting with version 2.7.3 and 2.8.2 and " +#~ "2.9.1: IPROTO_BALLOT_IS_RO_CFG was formerly called IPROTO_BALLOT_IS_RO, and " +#~ "IPROTO_BALLOT_IS_RO was formerly called IPROTO_BALLOT_IS_LOADING." +#~ msgstr "" +#~ "IPROTO_BALLOT_IS_RO_CFG, IPRO_BALLOT_VCLOCK, IPROTO_BALLOT_GC_VCLOCK и " +#~ "IPROTO_BALLOT_IS_RO добавлены в версии :doc:`2.6.1 `. " +#~ "Константа IPROTO_BALLOT_IS_ANON добавлена в версии :doc:`2.7.1 " +#~ "`. Константа IPROTO_BALLOT_IS_BOOTED добавлена в версиях " +#~ "2.7.3, 2.8.2 и 2.9.1. В версиях 2.7.3, 2.8.2, 2.9.1 и более поздних " +#~ "константа IPROTO_BALLOT_IS_RO переименована в IPROTO_BALLOT_IS_RO_CFG, а " +#~ "IPROTO_BALLOT_IS_LOADING — в IPROTO_BALLOT_IS_RO." + +#~ msgid "" +#~ "IPROTO_BALLOT_IS_RO_CFG corresponds to :ref:`box.cfg.read_only `." +#~ msgstr "" +#~ "Значение IPROTO_BALLOT_IS_RO_CFG соответствует значению " +#~ ":ref:`box.cfg.read_only `." + +#~ msgid "" +#~ "IPROTO_BALLOT_GC_VCLOCK can be the vclock value of the instance's oldest WAL" +#~ " entry, which corresponds to :ref:`box.info.gc().vclock `." +#~ msgstr "" +#~ "IPROTO_BALLOT_GC_VCLOCK может принимать значение vclock самой старой записи " +#~ "журнала WAL на экземпляре. Это соответствует значению " +#~ ":ref:`box.info.gc().vclock `." + +#~ msgid "" +#~ "IPROTO_BALLOT_IS_RO is true if the instance is not writable, which may " +#~ "happen for a variety of reasons, such as: it was configured as " +#~ ":ref:`read_only `, or it has :ref:`orphan status " +#~ "`, or it is a :ref:`Raft ` " +#~ "follower." +#~ msgstr "" +#~ "IPROTO_BALLOT_IS_RO принимает значение ``true``, если экземпляр недоступен " +#~ "для записи. Причины у этого могут быть разные: например, экземпляр настроен " +#~ "как :ref:`read_only `, :ref:`имеет статус orphan " +#~ "` или является последователем (follower) при " +#~ ":ref:`выполнении алгоритма Raft `." + +#~ msgid "" +#~ "IPROTO_BALLOT_IS_ANON corresponds to :ref:`box.cfg.replication_anon " +#~ "`." +#~ msgstr "" +#~ "Значение IPROTO_BALLOT_IS_ANON соответствует значению " +#~ ":ref:`box.cfg.replication_anon `." + +#~ msgid "" +#~ "IPROTO_BALLOT_IS_BOOTED is true if the instance has finished its bootstrap " +#~ "or recovery process." +#~ msgstr "" +#~ "IPROTO_BALLOT_IS_BOOTED принимает значение ``true``, если экземпляр завершил" +#~ " инициализацию или восстановление." + +#~ msgid "" +#~ "IPROTO_BALLOT_CAN_LEAD is true if the :ref:`election_mode ` configuration setting is either 'candidate' or 'manual', so " +#~ "that during the :ref:`leader election process ` " +#~ "this instance may be preferred over instances whose configuration setting is" +#~ " 'voter'. IPROTO_BALLOT_CAN_LEAD support was added simultaneously in version" +#~ " :doc:`2.7.3 ` and version :doc:`2.8.2 `." +#~ msgstr "" + +#~ msgid "FLAGS" +#~ msgstr "Сообщения с идентификатором FLAG" + +#~ msgid "" +#~ "For replication of :ref:`synchronous transactions ` a header may " +#~ "contain a key = IPROTO_FLAGS and an MP_UINT value = one or more bits: " +#~ "IPROTO_FLAG_COMMIT or IPROTO_FLAG_WAIT_SYNC or IPROTO_FLAG_WAIT_ACK." +#~ msgstr "" +#~ "При репликации :ref:`синхронных транзакций ` заголовок может " +#~ "содержать ключ = IPROTO_FLAGS и значение MP_UINT = один или несколько битов:" +#~ " IPROTO_FLAG_COMMIT, IPROTO_FLAG_WAIT_SYNC или IPROTO_FLAG_WAIT_ACK." + +#~ msgid "" +#~ "# \n" +#~ "msgpack(:samp:`{{MP_UINT unsigned integer = size(
) + size()}}`)\n" +#~ "#
\n" +#~ "msgpack({\n" +#~ " # ... other header items ...,\n" +#~ " IPROTO_FLAGS: :samp:`{{MP_UINT unsigned integer}}`\n" +#~ "})\n" +#~ "# \n" +#~ "msgpack({\n" +#~ " # ... message for a transaction ...\n" +#~ "})" +#~ msgstr "" +#~ "# \n" +#~ "msgpack(:samp:`{{MP_UINT unsigned integer = size(
) + size()}}`)\n" +#~ "#
\n" +#~ "msgpack({\n" +#~ " # ... другие элементы заголовка ...,\n" +#~ " IPROTO_FLAGS: :samp:`{{MP_UINT unsigned integer}}`\n" +#~ "})\n" +#~ "# \n" +#~ "msgpack({\n" +#~ " # ... message for a transaction ...\n" +#~ "})" + +#~ msgid "" +#~ "IPROTO_FLAG_COMMIT (0x01) will be set if this is the last message for a " +#~ "transaction, IPROTO_FLAG_WAIT_SYNC (0x02) will be set if this is the last " +#~ "message for a transaction which cannot be completed immediately, " +#~ "IPROTO_FLAG_WAIT_ACK (0x04) will be set if this is the last message for a " +#~ "synchronous transaction." +#~ msgstr "" +#~ "IPROTO_FLAG_COMMIT (0x01) указывает на последнее сообщение для транзакции. " +#~ "IPROTO_FLAG_WAIT_SYNC (0x02) указывает на последнее сообщение для " +#~ "транзакции, которую нельзя завершить немедленно. IPROTO_FLAG_WAIT_ACK (0x04)" +#~ " указывает на последнее сообщение для синхронной транзакции." + +#~ msgid "" +#~ "To follow the examples in this section, get a single Linux computer and " +#~ "start three command-line shells (\"terminals\")." +#~ msgstr "" +#~ "Чтобы выполнить примеры, приведенные в этом разделе, запустите на компьютере" +#~ " с Linux три командных оболочки (терминала)." + +#~ msgid "" +#~ "-- On terminal #1, Start monitoring port 3302 with `tcpdump " +#~ "`_: |br|" +#~ msgstr "" +#~ "-- На терминале №1 запустите мониторинг порта 3302 с помощью `tcpdump " +#~ "`_: |br|" + +#~ msgid "sudo tcpdump -i lo 'port 3302' -X" +#~ msgstr "sudo tcpdump -i lo 'port 3302' -X" + +#~ msgid "On terminal #2, start a server with:" +#~ msgstr "На терминале №2 запустите сервер так:" + +#~ msgid "" +#~ "box.cfg{listen=3302}\n" +#~ "box.schema.space.create('tspace')\n" +#~ "box.space.tspace:create_index('I')\n" +#~ "box.space.tspace:insert{280}\n" +#~ "box.schema.user.grant('guest','read,write,execute,create,drop','universe')" +#~ msgstr "" +#~ "box.cfg{listen=3302}\n" +#~ "box.schema.space.create('tspace')\n" +#~ "box.space.tspace:create_index('I')\n" +#~ "box.space.tspace:insert{280}\n" +#~ "box.schema.user.grant('guest','read,write,execute,create,drop','universe')" + +#~ msgid "" +#~ "On terminal #3, start another server, which will act as a client, with:" +#~ msgstr "" +#~ "На терминале №3 запустите ещё один сервер, который будет выступать в " +#~ "качестве клиента, так:" + +#~ msgid "" +#~ "box.cfg{}\n" +#~ "net_box = require('net.box')\n" +#~ "conn = net_box.connect('localhost:3302')\n" +#~ "conn.space.tspace:select(280)" +#~ msgstr "" +#~ "box.cfg{}\n" +#~ "net_box = require('net.box')\n" +#~ "conn = net_box.connect('localhost:3302')\n" +#~ "conn.space.tspace:select(280)" + +#~ msgid "" +#~ "Now look at what tcpdump shows for the job connecting to 3302 -- the " +#~ "\"request\". After the words \"length 32\" is a packet that ends with these " +#~ "32 bytes (we have added indented comments):" +#~ msgstr "" +#~ "Теперь посмотрите, что tcpdump покажет для запроса на подключение к порту " +#~ "3302. После слов «length 32» идет пакет, который заканчивается этими 32 " +#~ "байтами (комментарии отделены отступами):" + +#~ msgid "" +#~ "ce 00 00 00 1b MP_UINT = decimal 27 = number of bytes after this\n" +#~ "82 MP_MAP, size 2 (we'll call this \"Main-Map\")\n" +#~ "01 IPROTO_SYNC (Main-Map Item#1)\n" +#~ "04 MP_INT = 4 = number that gets incremented with each request\n" +#~ "00 IPROTO_REQUEST_TYPE (Main-Map Item#2)\n" +#~ "01 IPROTO_SELECT\n" +#~ "86 MP_MAP, size 6 (we'll call this \"Select-Map\")\n" +#~ "10 IPROTO_SPACE_ID (Select-Map Item#1)\n" +#~ "cd 02 00 MP_UINT = decimal 512 = id of tspace (could be larger)\n" +#~ "11 IPROTO_INDEX_ID (Select-Map Item#2)\n" +#~ "00 MP_INT = 0 = id of index within tspace\n" +#~ "14 IPROTO_ITERATOR (Select-Map Item#3)\n" +#~ "00 MP_INT = 0 = Tarantool iterator_type.h constant ITER_EQ\n" +#~ "13 IPROTO_OFFSET (Select-Map Item#4)\n" +#~ "00 MP_INT = 0 = amount to offset\n" +#~ "12 IPROTO_LIMIT (Select-Map Item#5)\n" +#~ "ce ff ff ff ff MP_UINT = 4294967295 = biggest possible limit\n" +#~ "20 IPROTO_KEY (Select-Map Item#6)\n" +#~ "91 MP_ARRAY, size 1 (we'll call this \"Key-Array\")\n" +#~ "cd 01 18 MP_UINT = 280 (Select-Map Item#6, Key-Array Item#1)\n" +#~ " -- 280 is the key value that we are searching for" +#~ msgstr "" +#~ "ce 00 00 00 1b MP_UINT = 27, десятичное число = число байт после этого\n" +#~ "82 MP_MAP, размер 2 (назовем это Main-Map)\n" +#~ "01 IPROTO_SYNC (1-й элемент Main-Map)\n" +#~ "04 MP_INT = 4 = число, которое увеличивается на 1 с каждым запросом\n" +#~ "00 IPROTO_REQUEST_TYPE (2-й элемент Main-Map)\n" +#~ "01 IPROTO_SELECT\n" +#~ "86 MP_MAP, размер 6 (назовем это Select-Map)\n" +#~ "10 IPROTO_SPACE_ID (1-й элемент Select-Map)\n" +#~ "cd 02 00 MP_UINT = 512, десятичное число = id tspace (может быть больше)\n" +#~ "11 IPROTO_INDEX_ID (2-й элемент Select-Map)\n" +#~ "00 MP_INT = 0 = id индекса в tspace\n" +#~ "14 IPROTO_ITERATOR (3-й элемент Select-Map)\n" +#~ "00 MP_INT = 0 = константа Tarantool iterator_type.h ITER_EQ\n" +#~ "13 IPROTO_OFFSET (4-й элемент Select-Map)\n" +#~ "00 MP_INT = 0 = смещение\n" +#~ "12 IPROTO_LIMIT (5-й элемент Select-Map)\n" +#~ "ce ff ff ff ff MP_UINT = 4294967295 = наибольший возможный предел\n" +#~ "20 IPROTO_KEY (6-й элемент Select-Map)\n" +#~ "91 MP_ARRAY, размер 1 (назовем это Key-Array)\n" +#~ "cd 01 18 MP_UINT = 280 (6-й элемент Select-Map, 1-й элемент Key-Array)\n" +#~ " -- 280, ключевое значение, которое мы ищем" + +#~ msgid "" +#~ "Now read the source code file `net_box.c " +#~ "`_" +#~ " and skip to the line ``netbox_encode_select(lua_State *L)``. From the " +#~ "comments and from simple function calls like ``mpstream_encode_uint(&stream," +#~ " IPROTO_SPACE_ID);`` you will be able to see how net_box put together the " +#~ "packet contents that you have just observed with tcpdump." +#~ msgstr "" +#~ "Теперь в файле исходного кода `net_box.c " +#~ "`_" +#~ " перейдите к строке ``netbox_encode_select(lua_State *L)``. Из комментариев " +#~ "и из простых вызовов функций типа ``mpstream_encode_uint(&stream, " +#~ "IPROTO_SPACE_ID);`` можно понять, как net_box собирает воедино содержимое " +#~ "пакета, описанного выше с помощью tcpdump." + +#~ msgid "" +#~ "There are libraries for reading and writing MessagePack objects. C " +#~ "programmers sometimes include `msgpuck.h " +#~ "`_." +#~ msgstr "" +#~ "Существуют библиотеки для чтения и записи объектов в формате MessagePack. " +#~ "Программисты на языке C иногда включают `msgpuck.h " +#~ "`_." + +#~ msgid "" +#~ "Now you know how Tarantool itself makes requests with the binary protocol. " +#~ "When in doubt about a detail, consult ``net_box.c`` -- it has routines for " +#~ "each request. Some :ref:`connectors ` have similar " +#~ "code." +#~ msgstr "" +#~ "Теперь вы знаете, как сам Tarantool выполняет запросы по бинарному " +#~ "протоколу. Если какие-то детали остаются неясными, обратитесь к файлу " +#~ "``net_box.c``, где описаны процедуры для каждого запроса. Некоторые " +#~ ":ref:`коннекторы ` написаны аналогично." + +#~ msgid "" +#~ "For an IPROTO_UPDATE example, suppose a user changes field #2 in tuple #2 in" +#~ " space #256 to ``'BBBB'``. The body will look like this: (notice that in " +#~ "this case there is an extra map item IPROTO_INDEX_BASE, to emphasize that " +#~ "field numbers start with 1, which is optional and can be omitted):" +#~ msgstr "" +#~ "Рассмотрим пример IPROTO_UPDATE. Предположим, пользователь изменяет поле №2 " +#~ "кортежа №2 в спейсе №256 на `'BBBB'``. Тело будет выглядеть так (обратите " +#~ "внимание, что в этом случае дополнительный необязательный элемент " +#~ "ассоциативного массива IPROTO_INDEX_BASE подчеркивает, что номера полей " +#~ "начинаются с 1 — это можно опустить):" + +#~ msgid "" +#~ "04 IPROTO_UPDATE\n" +#~ "85 IPROTO_MAP, size 5\n" +#~ "10 IPROTO_SPACE_ID, Map Item#1\n" +#~ "cd 02 00 MP_UINT 256\n" +#~ "11 IPROTO_INDEX_ID, Map Item#2\n" +#~ "00 MP_INT 0 = primary-key index number\n" +#~ "15 IPROTO_INDEX_BASE, Map Item#3\n" +#~ "01 MP_INT = 1 i.e. field numbers start at 1\n" +#~ "21 IPROTO_TUPLE, Map Item#4\n" +#~ "91 MP_ARRAY, size 1, for array of operations\n" +#~ "93 MP_ARRAY, size 3\n" +#~ "a1 3d MP_STR = OPERATOR = '='\n" +#~ "02 MP_INT = FIELD_NO = 2\n" +#~ "a5 42 42 42 42 42 MP_STR = VALUE = 'BBBB'\n" +#~ "20 IPROTO_KEY, Map Item#5\n" +#~ "91 MP_ARRAY, size 1, for array of key values\n" +#~ "02 MP_UINT = primary-key value = 2" +#~ msgstr "" +#~ "04 IPROTO_UPDATE\n" +#~ "85 IPROTO_MAP, размер 5\n" +#~ "10 IPROTO_SPACE_ID, 1-й элемент ассоциативного массива\n" +#~ "cd 02 00 MP_UINT 256\n" +#~ "11 IPROTO_INDEX_ID, 2-й элемент ассоциативного массива\n" +#~ "00 MP_INT 0 = номер индекса первичного ключа\n" +#~ "15 IPROTO_INDEX_BASE, 3-й элемент ассоциативного массива\n" +#~ "01 MP_INT = 1, т.е. нумерация полей начинается с 1\n" +#~ "21 IPROTO_TUPLE, 4-й элемент ассоциативного массива\n" +#~ "91 MP_ARRAY, размер 1, для массива операций\n" +#~ "93 MP_ARRAY, размер 3\n" +#~ "a1 3d MP_STR = OPERATOR = '='\n" +#~ "02 MP_INT = FIELD_NO = 2\n" +#~ "a5 42 42 42 42 42 MP_STR = VALUE = 'BBBB'\n" +#~ "20 IPROTO_KEY, 5--й элемент ассоциативного массива\n" +#~ "91 MP_ARRAY, размер 1, для массива ключей\n" +#~ "02 MP_UINT = значение первичного ключа = 2" + +#~ msgid "" +#~ "Byte codes for the :ref:`IPROTO_EXECUTE ` example:" +#~ msgstr "Пример байт-кода :ref:`IPROTO_EXECUTE `:" + +#~ msgid "" +#~ "0b IPROTO_EXECUTE\n" +#~ "83 MP_MAP, size 3\n" +#~ "43 IPROTO_STMT_ID Map Item#1\n" +#~ "ce d7 aa 74 1b MP_UINT value of n.stmt_id\n" +#~ "41 IPROTO_SQL_BIND Map Item#2\n" +#~ "92 MP_ARRAY, size 2\n" +#~ "01 MP_INT = 1 = value for first parameter\n" +#~ "a1 61 MP_STR = 'a' = value for second parameter\n" +#~ "2b IPROTO_OPTIONS Map Item#3\n" +#~ "90 MP_ARRAY, size 0 (there are no options)" +#~ msgstr "" +#~ "0b IPROTO_EXECUTE\n" +#~ "83 MP_MAP, размер 3\n" +#~ "43 IPROTO_STMT_ID 1-й элемент ассоциативного массива\n" +#~ "ce d7 aa 74 1b MP_UINT значение n.stmt_id\n" +#~ "41 IPROTO_SQL_BIND 2-й элемент ассоциативного массива\n" +#~ "92 MP_ARRAY, размер 2\n" +#~ "01 MP_INT = 1 = значение первого параметра\n" +#~ "a1 61 MP_STR = 'a' = значение второго параметра\n" +#~ "2b IPROTO_OPTIONS 3-й элемент ассоциативного массива\n" +#~ "90 MP_ARRAY, размер 0 (никакие опции не выбраны)" + +#~ msgid "" +#~ "Byte codes for the response to the " +#~ ":codenormal:`box.space.`:codeitalic:`space-name`:codenormal:`:insert{6}` " +#~ "example:" +#~ msgstr "" +#~ "Пример байт-кода ответа на запрос " +#~ ":codenormal:`box.space.`:codeitalic:`space-name`:codenormal:`:insert{6}`:" + +#~ msgid "" +#~ "ce 00 00 00 20 MP_UINT = HEADER AND BODY SIZE\n" +#~ "83 MP_MAP, size 3\n" +#~ "00 Response-Code-Indicator\n" +#~ "ce 00 00 00 00 MP_UINT = IPROTO_OK\n" +#~ "01 IPROTO_SYNC\n" +#~ "cf 00 00 00 00 00 00 00 53 MP_UINT = sync value\n" +#~ "05 IPROTO_SCHEMA_VERSION\n" +#~ "ce 00 00 00 68 MP_UINT = schema version\n" +#~ "81 MP_MAP, size 1\n" +#~ "30 IPROTO_DATA\n" +#~ "dd 00 00 00 01 MP_ARRAY, size 1 (row count)\n" +#~ "91 MP_ARRAY, size 1 (field count)\n" +#~ "06 MP_INT = 6 = the value that was inserted" +#~ msgstr "" +#~ "ce 00 00 00 20 MP_UINT = размер заголовка и тела\n" +#~ "83 MP_MAP, размер 3\n" +#~ "00 индикатор кода ответа\n" +#~ "ce 00 00 00 00 MP_UINT = IPROTO_OK\n" +#~ "01 IPROTO_SYNC\n" +#~ "cf 00 00 00 00 00 00 00 53 MP_UINT = значение синхронизации\n" +#~ "05 IPROTO_SCHEMA_VERSION\n" +#~ "ce 00 00 00 68 MP_UINT = версия схемы\n" +#~ "81 MP_MAP, размер 1\n" +#~ "30 IPROTO_DATA\n" +#~ "dd 00 00 00 01 MP_ARRAY, размер 1 (число строк)\n" +#~ "91 MP_ARRAY, размер 1 (число полей)\n" +#~ "06 MP_INT = 6 = добавленное значение" + +#~ msgid "" +#~ "Byte codes for the response to the " +#~ "``conn:eval([[box.schema.space.create('_space');]])`` example:" +#~ msgstr "" +#~ "Пример байт-кода ответа на запрос " +#~ "``conn:eval([[box.schema.space.create('_space');]])``:" + +#~ msgid "" +#~ "ce 00 00 00 3b MP_UINT = HEADER AND BODY SIZE\n" +#~ "83 MP_MAP, size 3 (i.e. 3 items in header)\n" +#~ " 00 Response-Code-Indicator\n" +#~ " ce 00 00 80 0a MP_UINT = hexadecimal 800a\n" +#~ " 01 IPROTO_SYNC\n" +#~ " cf 00 00 00 00 00 00 00 26 MP_UINT = sync value\n" +#~ " 05 IPROTO_SCHEMA_VERSION\n" +#~ " ce 00 00 00 78 MP_UINT = schema version value\n" +#~ " 81 MP_MAP, size 1\n" +#~ " 31 IPROTO_ERROR_24\n" +#~ " db 00 00 00 1d 53 70 61 63 etc. MP_STR = \"Space '_space' already exists\"" +#~ msgstr "" +#~ "ce 00 00 00 3b MP_UINT = размер заголовка и тела\n" +#~ "83 MP_MAP, размер 3 (3 элемента в заголовке)\n" +#~ " 00 индикатор кода ответа\n" +#~ " ce 00 00 80 0a MP_UINT = шестнадцатеричное значение 800a\n" +#~ " 01 IPROTO_SYNC\n" +#~ " cf 00 00 00 00 00 00 00 26 MP_UINT = значение синхронизации\n" +#~ " 05 IPROTO_SCHEMA_VERSION\n" +#~ " ce 00 00 00 78 MP_UINT = версия схемы \n" +#~ " 81 MP_MAP, размер 1\n" +#~ " 31 IPROTO_ERROR_24\n" +#~ " db 00 00 00 1d 53 70 61 63 ... MP_STR = \"Space '_space' already exists\"" + +#~ msgid "" +#~ "Byte codes, if we use the same net.box connection that we used for " +#~ ":ref:`Binary protocol -- illustration ` and we " +#~ "say |br| ``conn:execute([[CREATE TABLE t1 (dd INT PRIMARY KEY AUTOINCREMENT," +#~ " дд STRING COLLATE \"unicode\");]])`` |br| ``conn:execute([[INSERT INTO t1 " +#~ "VALUES (NULL, 'a'), (NULL, 'b');]])`` |br| and we watch what tcpdump " +#~ "displays, we will see two noticeable things: (1) the CREATE statement caused" +#~ " a schema change so the response has a new IPROTO_SCHEMA_VERSION value and " +#~ "the body includes the new contents of some system tables (caused by requests" +#~ " from net.box which users will not see); (2) the final bytes of the response" +#~ " to the INSERT will be:" +#~ msgstr "" +#~ "Подключимся через то же соединение net.box, что приводилось в :ref:`примерах" +#~ " `, и выполним следующее: |br| " +#~ "``conn:execute([[CREATE TABLE t1 (dd INT PRIMARY KEY AUTOINCREMENT, дд " +#~ "STRING COLLATE \"unicode\");]])`` |br| ``conn:execute([[INSERT INTO t1 " +#~ "VALUES (NULL, 'a'), (NULL, 'b');]])`` |br| Результат вывода tcpdump покажет " +#~ "два интересных момента: (1) инструкция CREATE привела к изменению схемы, так" +#~ " что в ответе указано новое значение IPROTO_SCHEMA_VERSION. При этом тело " +#~ "включает новое содержимое некоторых системных таблиц, полученное в " +#~ "результате невидимых для пользователя запросов от net.box; (2) последние " +#~ "байты ответа на INSERT будут следующими:" + +#~ msgid "" +#~ "81 MP_MAP, size 1\n" +#~ "42 IPROTO_SQL_INFO\n" +#~ "82 MP_MAP, size 2\n" +#~ "00 Tarantool constant (not in iproto_constants.h) = SQL_INFO_ROW_COUNT\n" +#~ "02 1 = row count\n" +#~ "01 Tarantool constant (not in iproto_constants.h) = SQL_INFO_AUTOINCREMENT_ID\n" +#~ "92 MP_ARRAY, size 2\n" +#~ "01 first autoincrement number\n" +#~ "02 second autoincrement number" +#~ msgstr "" +#~ "81 MP_MAP, размер 1\n" +#~ "42 IPROTO_SQL_INFO\n" +#~ "82 MP_MAP, размер 2\n" +#~ "00 константа Tarantool (не из iproto_constants.h) = SQL_INFO_ROW_COUNT\n" +#~ "02 1 = число строк\n" +#~ "01 константа Tarantool (не из iproto_constants.h) = SQL_INFO_AUTOINCREMENT_ID\n" +#~ "92 MP_ARRAY, размер 2\n" +#~ "01 первое число с автоинкрементом\n" +#~ "02 второе число с автоинкрементом" + +#~ msgid "" +#~ "Byte codes for the SQL SELECT example, if we ask for full metadata by saying" +#~ " |br| :code:`conn.space._session_settings:update('sql_full_metadata', {{'='," +#~ " 'value', true}})` |br| and we select the two rows from the table that we " +#~ "just created |br| :code:`conn:execute([[SELECT dd, дд AS д FROM t1;]])` |br|" +#~ " then tcpdump will show this response, after the header:" +#~ msgstr "" +#~ "Пример байт-кода SQL SELECT. Запросим полные метаданные, вызвав " +#~ ":code:`conn.space._session_settings:update('sql_full_metadata', {{'=', " +#~ "'value', true}})`, и выберем две строки из только что созданной таблицы: " +#~ ":code:`conn:execute([[SELECT dd, дд AS д FROM t1;]])`. tcpdump выдаст " +#~ "следующий ответ (после заголовка):" + +#~ msgid "" +#~ "82 MP_MAP, size 2 (i.e. metadata and rows)\n" +#~ "32 IPROTO_METADATA\n" +#~ "92 MP_ARRAY, size 2 (i.e. 2 columns)\n" +#~ "85 MP_MAP, size 5 (i.e. 5 items for column#1)\n" +#~ "00 a2 44 44 IPROTO_FIELD_NAME and 'DD'\n" +#~ "01 a7 69 6e 74 65 67 65 72 IPROTO_FIELD_TYPE and 'integer'\n" +#~ "03 c2 IPROTO_FIELD_IS_NULLABLE and false\n" +#~ "04 c3 IPROTO_FIELD_IS_AUTOINCREMENT and true\n" +#~ "05 c0 PROTO_FIELD_SPAN and nil\n" +#~ "85 MP_MAP, size 5 (i.e. 5 items for column#2)\n" +#~ "00 a2 d0 94 IPROTO_FIELD_NAME and 'Д' upper case\n" +#~ "01 a6 73 74 72 69 6e 67 IPROTO_FIELD_TYPE and 'string'\n" +#~ "02 a7 75 6e 69 63 6f 64 65 IPROTO_FIELD_COLL and 'unicode'\n" +#~ "03 c3 IPROTO_FIELD_IS_NULLABLE and true\n" +#~ "05 a4 d0 b4 d0 b4 IPROTO_FIELD_SPAN and 'дд' lower case\n" +#~ "30 IPROTO_DATA\n" +#~ "92 MP_ARRAY, size 2\n" +#~ "92 MP_ARRAY, size 2\n" +#~ "01 MP_INT = 1 i.e. contents of row#1 column#1\n" +#~ "a1 61 MP_STR = 'a' i.e. contents of row#1 column#2\n" +#~ "92 MP_ARRAY, size 2\n" +#~ "02 MP_INT = 2 i.e. contents of row#2 column#1\n" +#~ "a1 62 MP_STR = 'b' i.e. contents of row#2 column#2" +#~ msgstr "" +#~ "82 MP_MAP, размер 2 (метаданные и строки)\n" +#~ "32 IPROTO_METADATA\n" +#~ "92 MP_ARRAY, размер 2 (2 столбца)\n" +#~ "85 MP_MAP, размер 5 (5 элементов для столбца 1)\n" +#~ "00 a2 44 44 IPROTO_FIELD_NAME и 'DD'\n" +#~ "01 a7 69 6e 74 65 67 65 72 IPROTO_FIELD_TYPE и 'integer'\n" +#~ "03 c2 IPROTO_FIELD_IS_NULLABLE и false\n" +#~ "04 c3 IPROTO_FIELD_IS_AUTOINCREMENT и true\n" +#~ "05 c0 PROTO_FIELD_SPAN и nil\n" +#~ "85 MP_MAP, размер 5 (5 элементов для столбца 2)\n" +#~ "00 a2 d0 94 IPROTO_FIELD_NAME и 'Д' в верхнем регистре\n" +#~ "01 a6 73 74 72 69 6e 67 IPROTO_FIELD_TYPE и 'string'\n" +#~ "02 a7 75 6e 69 63 6f 64 65 IPROTO_FIELD_COLL и 'unicode'\n" +#~ "03 c3 IPROTO_FIELD_IS_NULLABLE и true\n" +#~ "05 a4 d0 b4 d0 b4 IPROTO_FIELD_SPAN и 'дд' в нижнем регистре\n" +#~ "30 IPROTO_DATA\n" +#~ "92 MP_ARRAY, размер 2\n" +#~ "92 MP_ARRAY, размер 2\n" +#~ "01 MP_INT = 1: содержимое строки 1, столбца 1\n" +#~ "a1 61 MP_STR = 'a': содержимое строки 1, столбца 2\n" +#~ "92 MP_ARRAY, размер 2\n" +#~ "02 MP_INT = 2: содержимое строки 2, столбца 1\n" +#~ "a1 62 MP_STR = 'b': содержимое строки 2, столбца 2" + +#~ msgid "" +#~ "Byte code for the SQL PREPARE example. If we said |br| " +#~ ":code:`conn:prepare([[SELECT dd, дд AS д FROM t1;]])` |br| then tcpdump " +#~ "would show almost the same response, but there would be no IPROTO_DATA. " +#~ "Instead, additional items will appear:" +#~ msgstr "" +#~ "Пример байт-кода SQL PREPARE. Если вызвать :code:`conn:prepare([[SELECT dd, " +#~ "дд AS д FROM t1;]])`, вывод tcpdump будет почти таким же, но исчезнет " +#~ "IPROTO_DATA. Вместо этого появятся дополнительные байты:" + +#~ msgid "" +#~ "34 IPROTO_BIND_COUNT\n" +#~ "00 MP_UINT = 0\n" +#~ "\n" +#~ "33 IPROTO_BIND_METADATA\n" +#~ "90 MP_ARRAY, size 0" +#~ msgstr "" +#~ "34 IPROTO_BIND_COUNT\n" +#~ "00 MP_UINT = 0\n" +#~ "\n" +#~ "33 IPROTO_BIND_METADATA\n" +#~ "90 MP_ARRAY, размер 0" + +#~ msgid "" +#~ "``MP_UINT = 0`` and ``MP_ARRAY`` has size 0 because there are no parameters " +#~ "to bind. Full output:" +#~ msgstr "" +#~ "``MP_UINT = 0``. Массив ``MP_ARRAY`` имеет размер 0, поскольку параметров " +#~ "нет. Вывод целиком:" + +#~ msgid "" +#~ "84 MP_MAP, size 4\n" +#~ "43 IPROTO_STMT_ID\n" +#~ "ce c2 3c 2c 1e MP_UINT = statement id\n" +#~ "34 IPROTO_BIND_COUNT\n" +#~ "00 MP_INT = 0 = number of parameters to bind\n" +#~ "33 IPROTO_BIND_METADATA\n" +#~ "90 MP_ARRAY, size 0 = there are no parameters to bind\n" +#~ "32 IPROTO_METADATA\n" +#~ "92 MP_ARRAY, size 2 (i.e. 2 columns)\n" +#~ "85 MP_MAP, size 5 (i.e. 5 items for column#1)\n" +#~ "00 a2 44 44 IPROTO_FIELD_NAME and 'DD'\n" +#~ "01 a7 69 6e 74 65 67 65 72 IPROTO_FIELD_TYPE and 'integer'\n" +#~ "03 c2 IPROTO_FIELD_IS_NULLABLE and false\n" +#~ "04 c3 IPROTO_FIELD_IS_AUTOINCREMENT and true\n" +#~ "05 c0 PROTO_FIELD_SPAN and nil\n" +#~ "85 MP_MAP, size 5 (i.e. 5 items for column#2)\n" +#~ "00 a2 d0 94 IPROTO_FIELD_NAME and 'Д' upper case\n" +#~ "01 a6 73 74 72 69 6e 67 IPROTO_FIELD_TYPE and 'string'\n" +#~ "02 a7 75 6e 69 63 6f 64 65 IPROTO_FIELD_COLL and 'unicode'\n" +#~ "03 c3 IPROTO_FIELD_IS_NULLABLE and true\n" +#~ "05 a4 d0 b4 d0 b4 IPROTO_FIELD_SPAN and 'дд' lower case" +#~ msgstr "" +#~ "84 MP_MAP, размер 4\n" +#~ "43 IPROTO_STMT_ID\n" +#~ "ce c2 3c 2c 1e MP_UINT = ID инструкции\n" +#~ "34 IPROTO_BIND_COUNT\n" +#~ "00 MP_INT = 0 = число привязываемых параметров\n" +#~ "33 IPROTO_BIND_METADATA\n" +#~ "90 MP_ARRAY, размер 0 = нет привязываемых параметров\n" +#~ "32 IPROTO_METADATA\n" +#~ "92 MP_ARRAY, размер 2 (2 столбца)\n" +#~ "85 MP_MAP, размер 5 (5 элементов для столбца 1)\n" +#~ "00 a2 44 44 IPROTO_FIELD_NAME и 'DD'\n" +#~ "01 a7 69 6e 74 65 67 65 72 IPROTO_FIELD_TYPE и 'integer'\n" +#~ "03 c2 IPROTO_FIELD_IS_NULLABLE и false\n" +#~ "04 c3 IPROTO_FIELD_IS_AUTOINCREMENT и true\n" +#~ "05 c0 PROTO_FIELD_SPAN и nil\n" +#~ "85 MP_MAP, размер 5 (5 элементов для столбца 2)\n" +#~ "00 a2 d0 94 IPROTO_FIELD_NAME + 'Д' в верхнем регистре\n" +#~ "01 a6 73 74 72 69 6e 67 IPROTO_FIELD_TYPE и 'string'\n" +#~ "02 a7 75 6e 69 63 6f 64 65 IPROTO_FIELD_COLL и 'unicode'\n" +#~ "03 c3 IPROTO_FIELD_IS_NULLABLE и true\n" +#~ "05 a4 d0 b4 d0 b4 IPROTO_FIELD_SPAN и 'дд' в нижнем регистре" + +#~ msgid "Byte code for the heartbeat example. The master might send this body:" +#~ msgstr "" +#~ "Пример байт-кода контрольного сигнала. Мастер может отправить следующее " +#~ "тело:" + +#~ msgid "" +#~ "83 MP_MAP, size 3\n" +#~ "00 Main-Map Item #1 IPROTO_REQUEST_TYPE\n" +#~ "00 MP_UINT = 0\n" +#~ "02 Main-Map Item #2 IPROTO_REPLICA_ID\n" +#~ "02 MP_UINT = 2 = id\n" +#~ "04 Main-Map Item #3 IPROTO_TIMESTAMP\n" +#~ "cb MP_DOUBLE (MessagePack \"Float 64\")\n" +#~ "41 d7 ba 06 7b 3a 03 21 8-byte timestamp" +#~ msgstr "" +#~ "83 MP_MAP, размер 3\n" +#~ "00 1-й элемент Main-Map IPROTO_REQUEST_TYPE\n" +#~ "00 MP_UINT = 0\n" +#~ "02 2-й элемент Main-Map IPROTO_REPLICA_ID\n" +#~ "02 MP_UINT = 2 = id\n" +#~ "04 3-й элемент Main-Map IPROTO_TIMESTAMP\n" +#~ "cb MP_DOUBLE (MessagePack \"Float 64\")\n" +#~ "41 d7 ba 06 7b 3a 03 21 8-байтовая временная отметка" + +#~ msgid "" +#~ "Byte code for the heartbeat example. The replica might send back this body" +#~ msgstr "" +#~ "Пример байт-кода ответа на контрольный сигнал. Реплика может вернуть " +#~ "следующее тело:" + +#~ msgid "" +#~ "81 MP_MAP, size 1\n" +#~ "00 Main-Map Item #1 Response-code-indicator\n" +#~ "00 MP_UINT = 0 = IPROTO_OK\n" +#~ "81 Main-Map Item #2, MP_MAP, size 1\n" +#~ "26 Sub-Map Item #1 IPROTO_VCLOCK\n" +#~ "81 Sub-Map Item #2, MP_MAP, size 1\n" +#~ "01 MP_UINT = 1 = id (part 1 of vclock)\n" +#~ "06 MP_UINT = 6 = lsn (part 2 of vclock)" +#~ msgstr "" +#~ "81 MP_MAP, размер 1\n" +#~ "00 1-й элемент Main-Map: индикатор кода ответа\n" +#~ "00 MP_UINT = 0 = IPROTO_OK\n" +#~ "81 2-й элемент Main-Map: MP_MAP, размер 1 (Sub-Map)\n" +#~ "26 1-й элемент Sub-Map: IPROTO_VCLOCK\n" +#~ "81 2-й элемент Sub-Map: MP_MAP, размер 1\n" +#~ "01 MP_UINT = 1 = id (1-я часть vclock)\n" +#~ "06 MP_UINT = 6 = lsn (2-я часть vclock)" + +#~ msgid "XLOG / SNAP" +#~ msgstr "XLOG / SNAP" + +#~ msgid "" +#~ ".xlog and .snap files have nearly the same format. The header looks like:" +#~ msgstr "" +#~ "Файлы форматов .xlog и .snap выглядят практически одинаково. Заголовок " +#~ "выглядит так:" + +#~ msgid "" +#~ "\\n SNAP\\n or XLOG\\n\n" +#~ "\\n currently 0.13\\n\n" +#~ "Server: \\n where UUID is a 36-byte string\n" +#~ "VClock: \\n e.g. {1: 0}\\n\n" +#~ "\\n" +#~ msgstr "" +#~ "\\n SNAP\\n или XLOG\\n\n" +#~ "\\n в данный момент 0.13\\n\n" +#~ "Server: \\n где UUID -- это 36-байтная строка\n" +#~ "VClock: \\n например, {1: 0}\\n\n" +#~ "\\n" + +#~ msgid "" +#~ "After the file header come the data tuples. Tuples begin with a row marker " +#~ "``0xd5ba0bab`` and the last tuple may be followed by an EOF marker " +#~ "``0xd510aded``. Thus, between the file header and the EOF marker, there may " +#~ "be data tuples that have this form:" +#~ msgstr "" +#~ "После файла заголовка идут кортежи с данными. Кортежи начинаются с маркера " +#~ "строки ``0xd5ba0bab``, а после последнего кортежа может стоять маркер конца " +#~ "файла ``0xd510aded``. Таким образом, между заголовком файла и маркером конца" +#~ " файла могут быть кортежи с данными в следующем виде:" + +#~ msgid "" +#~ "0 3 4 17\n" +#~ "+-------------+========+============+===========+=========+\n" +#~ "| | | | | |\n" +#~ "| 0xd5ba0bab | LENGTH | CRC32 PREV | CRC32 CUR | PADDING |\n" +#~ "| | | | | |\n" +#~ "+-------------+========+============+===========+=========+\n" +#~ " MP_FIXEXT2 MP_INT MP_INT MP_INT ---\n" +#~ "\n" +#~ "+============+ +===================================+\n" +#~ "| | | |\n" +#~ "| HEADER | | BODY |\n" +#~ "| | | |\n" +#~ "+============+ +===================================+\n" +#~ " MP_MAP MP_MAP" +#~ msgstr "" +#~ "0 3 4 17\n" +#~ "+-------------+========+============+===========+=========+\n" +#~ "| | | | | |\n" +#~ "| 0xd5ba0bab | LENGTH | CRC32 PREV | CRC32 CUR | PADDING |\n" +#~ "| | | | | |\n" +#~ "+-------------+========+============+===========+=========+\n" +#~ " MP_FIXEXT2 MP_INT MP_INT MP_INT ---\n" +#~ "\n" +#~ "+============+ +===================================+\n" +#~ "| | | |\n" +#~ "| HEADER | | BODY |\n" +#~ "| | | |\n" +#~ "+============+ +===================================+\n" +#~ " MP_MAP MP_MAP" + +#~ msgid "" +#~ "See the example in the :ref:`File formats ` " +#~ "section." +#~ msgstr "" +#~ "См. пример в разделе :ref:`Форматы файлов `." diff --git a/locale/ru/LC_MESSAGES/dev_guide/internals/file_formats.po b/locale/ru/LC_MESSAGES/dev_guide/internals/file_formats.po index 6cc8a0d499..a95f7a6187 100644 --- a/locale/ru/LC_MESSAGES/dev_guide/internals/file_formats.po +++ b/locale/ru/LC_MESSAGES/dev_guide/internals/file_formats.po @@ -5,16 +5,16 @@ msgstr "Форматы файлов" msgid "Data persistence and the WAL file format" msgstr "Персистентность данных и формат WAL-файла" +#, fuzzy msgid "" "To maintain data persistence, Tarantool writes each data change request " "(insert, update, delete, replace, upsert) into a write-ahead log (WAL) file " "in the :ref:`wal_dir ` directory. A new WAL file is " -"created for every :ref:`rows_per_wal ` records, or for every :ref:`wal_max_size " -"` bytes. Each data change request" -" gets assigned a continuously growing 64-bit log sequence number. The name " -"of the WAL file is based on the log sequence number of the first record in " -"the file, plus an extension ``.xlog``." +"created when the current one reaches the :ref:`wal_max_size " +"` size. Each data change request " +"gets assigned a continuously growing 64-bit log sequence number. The name of" +" the WAL file is based on the log sequence number of the first record in the" +" file, plus an extension ``.xlog``." msgstr "" "Чтобы поддерживать персистентность данных, Tarantool записывает каждый " "запрос изменения данных (insert, update, delete, replace, upsert) в файл " @@ -256,12 +256,10 @@ msgid "" msgstr "" "Во вторую очередь записи в .snap-файле упорядочены по первичному ключу." +msgid "Example" +msgstr "" -msgid "XLOG / SNAP" -msgstr "XLOG / SNAP" - -msgid "" -"The header of a ``.snap`` or ``.xlog`` file looks like:" +msgid "The header of a ``.snap`` or ``.xlog`` file looks like:" msgstr "" "Файлы форматов .xlog и .snap выглядят практически одинаково. Заголовок " "выглядит так:" @@ -320,3 +318,6 @@ msgstr "" "| | | |\n" "+============+ +===================================+\n" " MP_MAP MP_MAP" + +#~ msgid "XLOG / SNAP" +#~ msgstr "XLOG / SNAP" diff --git a/locale/ru/LC_MESSAGES/dev_guide/internals/iproto/authentication.po b/locale/ru/LC_MESSAGES/dev_guide/internals/iproto/authentication.po index b81bddffa3..9de78cfc1e 100644 --- a/locale/ru/LC_MESSAGES/dev_guide/internals/iproto/authentication.po +++ b/locale/ru/LC_MESSAGES/dev_guide/internals/iproto/authentication.po @@ -1,7 +1,12 @@ -msgid "Authentication" +#, fuzzy +msgid "Session start and authentication" msgstr "Аутентификация" +msgid "" +"Every iproto session begins with a greeting and optional authentication." +msgstr "" + msgid "Greeting message" msgstr "Приветствие" @@ -12,53 +17,59 @@ msgstr "" "Когда клиент подключается к экземпляру сервера, тот выдает в ответе " "128-байтовое текстовое сообщение приветствия не в формате MsgPack:" +msgid "" +"Tarantool () \n" +"" +msgstr "" msgid "For example:" msgstr "Пример:" +msgid "" +"Tarantool 2.10.0 (Binary) 29b74bed-fdc5-454c-a828-1d4bf42c639a\n" +"QK2HoFZGXTXBq2vFj7soCsHqTo6PGTF575ssUBAJLAI=" +msgstr "" + msgid "" "The greeting contains two 64-byte lines of ASCII text. Each line ends with a" -" newline character (:code:`\\n`). If the line content is less than 64 bytes long," -" the rest of the line is filled up with symbols with an ASCII code of 0 that aren't displayed in the console." +" newline character (:code:`\\n`). If the line content is less than 64 bytes " +"long, the rest of the line is filled up with symbols with an ASCII code of 0" +" that aren't displayed in the console." msgstr "" "Приветствие содержит две 64-байтные строки текста в формате ASCII. Каждая " -"строка заканчивается символом разрыва строки (:code:`\\n`). Если длина содержимого строки " -"менее 64 байтов, то оставшееся место заполняется символами с ASCII-кодом 0. " -"В консоли эти символы не отображаются." - -msgid "The first line contains the instance " -"version and protocol type. The second line contains the session salt -- " -"a base64-encoded random string, which is usually 44 bytes long." -" The salt is used in the authentication packet." -msgstr "Первая строка " -"описывает версию экземпляра и тип протокола. Вторая строка содержит соль сеанса -- " -"случайную строку в кодировке base-64, обычно длиной 44 байта. Соль используется " -"в пакете аутентификации." +"строка заканчивается символом разрыва строки (:code:`\\n`). Если длина " +"содержимого строки менее 64 байтов, то оставшееся место заполняется " +"символами с ASCII-кодом 0. В консоли эти символы не отображаются." +#, fuzzy msgid "" -"Part of the greeting is a base64-encoded session salt - a random string " -"which can be used for authentication. The maximum length of an encoded salt " -"(44 bytes) is more than the amount necessary to create the authentication " -"message. An excess is reserved for future authentication schemas." +"The first line contains the instance version and protocol type. The second " +"line contains the session salt -- a base64-encoded random string, which is " +"usually 44 bytes long. The salt is used in the authentication packet -- the " +":ref:`IPROTO_AUTH message `." msgstr "" -"Часть приветствия представляет собой закодированное в формате base-64 " -"значение соль для сессии (случайная строка), которое можно использовать для " -"аутентификации. Максимальная длина закодированного значения соль (44 байта) " -"больше, чем размер создаваемого сообщения аутентификации. Остаток " -"предназначается для будущих схем аутентификации." +"Первая строка описывает версию экземпляра и тип протокола. Вторая строка " +"содержит соль сеанса -- случайную строку в кодировке base-64, обычно длиной " +"44 байта. Соль используется в пакете аутентификации." + +msgid "Authentication" +msgstr "Аутентификация" +#, fuzzy msgid "" -"Authentication is optional -- if it is skipped, then the session user is " -"``'guest'`` (the ``'guest'`` user does not need a password)." +"If authentication is skipped, then the session user is ``'guest'`` (the " +"``'guest'`` user does not need a password)." msgstr "" "Аутентификация необязательна: если аутентификация не проводится, то " "пользователем в сеансе будет ``'guest'`` (пользователю ``'guest'`` пароль не" " нужен)." +#, fuzzy msgid "" -"If authentication is not skipped, then at any time an authentication packet " -"can be prepared using the greeting, the user's name and password, and `sha-1" -" `_ functions, as follows." +"If authentication is not skipped, then at any time an :ref:`authentication " +"packet ` can be prepared using the greeting, the user's " +"name and password, and `sha-1 `_ " +"functions, as follows." msgstr "" "Если аутентификация проводится, то в любое время может быть подготовлен " "пакет аутентификации с использованием приветствия, имени и пароля " @@ -100,59 +111,71 @@ msgstr "" " scramble = xor(step_1, step_3);\n" " return scramble;" -msgid "The client sends an authentication packet as an IPROTO_AUTH message:" -msgstr "Клиент отправляет пакет аутентификации в виде сообщения IPROTO_AUTH:" - -msgid "" -"# \n" -"msgpack(:samp:`{{MP_UINT unsigned integer = size(
) + size()}}`)\n" -"#
\n" -"msgpack({\n" -" IPROTO_REQUEST_TYPE: IPROTO_AUTH,\n" -" IPROTO_SYNC: :samp:`{{MP_UINT unsigned integer, usually = 1}}`\n" -"})\n" -"# \n" -"msgpack({\n" -" IPROTO_USER_NAME: :samp:`{{MP_STRING string }}`,\n" -" IPROTO_TUPLE: ['chap-sha1', :samp:`{{MP_STRING 20-byte string}}`]\n" -"})" -msgstr "" -"# \n" -"msgpack(:samp:`{{MP_UINT unsigned integer = size(
) + size()}}`)\n" -"#
\n" -"msgpack({\n" -" IPROTO_REQUEST_TYPE: IPROTO_AUTH,\n" -" IPROTO_SYNC: :samp:`{{MP_UINT unsigned integer, usually = 1}}`\n" -"})\n" -"# \n" -"msgpack({\n" -" IPROTO_USER_NAME: :samp:`{{MP_STRING string }}`,\n" -" IPROTO_TUPLE: ['chap-sha1', :samp:`{{MP_STRING 20-byte string}}`]\n" -"})" - -msgid "" -":code:`` holds the user name. :code:`` must be an array of 2 " -"fields: authentication mechanism (\"chap-sha1\" is the only supported " -"mechanism right now) and scramble, encrypted according to the specified " -"mechanism." -msgstr "" -":code:`` содержит имя пользователя. :code:`` должен представлять" -" собой массив из 2 полей: механизм аутентификации (на данный момент " -"поддерживается только механизм \"chap-sha1\") и сообщение, зашифрованное в " -"соответствии с указанным механизмом." - -msgid "" -"The server instance responds to an authentication packet with a standard " -"response with 0 tuples." -msgstr "" -"На пакет аутентификации экземпляр сервера отправляет стандартный ответ с 0 " -"кортежей." - -msgid "" -"To see how Tarantool handles this, look at `net_box.c " -"`_" -" function ``netbox_encode_auth``." -msgstr "" -"Чтобы понять, как Tarantool это обрабатывает, обратите внимание на функцию " -"`netbox_encode_auth`` в файле `net_box.c " -"`_." +#~ msgid "" +#~ "Part of the greeting is a base64-encoded session salt - a random string " +#~ "which can be used for authentication. The maximum length of an encoded salt " +#~ "(44 bytes) is more than the amount necessary to create the authentication " +#~ "message. An excess is reserved for future authentication schemas." +#~ msgstr "" +#~ "Часть приветствия представляет собой закодированное в формате base-64 " +#~ "значение соль для сессии (случайная строка), которое можно использовать для " +#~ "аутентификации. Максимальная длина закодированного значения соль (44 байта) " +#~ "больше, чем размер создаваемого сообщения аутентификации. Остаток " +#~ "предназначается для будущих схем аутентификации." + +#~ msgid "The client sends an authentication packet as an IPROTO_AUTH message:" +#~ msgstr "Клиент отправляет пакет аутентификации в виде сообщения IPROTO_AUTH:" + +#~ msgid "" +#~ "# \n" +#~ "msgpack(:samp:`{{MP_UINT unsigned integer = size(
) + size()}}`)\n" +#~ "#
\n" +#~ "msgpack({\n" +#~ " IPROTO_REQUEST_TYPE: IPROTO_AUTH,\n" +#~ " IPROTO_SYNC: :samp:`{{MP_UINT unsigned integer, usually = 1}}`\n" +#~ "})\n" +#~ "# \n" +#~ "msgpack({\n" +#~ " IPROTO_USER_NAME: :samp:`{{MP_STRING string }}`,\n" +#~ " IPROTO_TUPLE: ['chap-sha1', :samp:`{{MP_STRING 20-byte string}}`]\n" +#~ "})" +#~ msgstr "" +#~ "# \n" +#~ "msgpack(:samp:`{{MP_UINT unsigned integer = size(
) + size()}}`)\n" +#~ "#
\n" +#~ "msgpack({\n" +#~ " IPROTO_REQUEST_TYPE: IPROTO_AUTH,\n" +#~ " IPROTO_SYNC: :samp:`{{MP_UINT unsigned integer, usually = 1}}`\n" +#~ "})\n" +#~ "# \n" +#~ "msgpack({\n" +#~ " IPROTO_USER_NAME: :samp:`{{MP_STRING string }}`,\n" +#~ " IPROTO_TUPLE: ['chap-sha1', :samp:`{{MP_STRING 20-byte string}}`]\n" +#~ "})" + +#~ msgid "" +#~ ":code:`` holds the user name. :code:`` must be an array of 2 " +#~ "fields: authentication mechanism (\"chap-sha1\" is the only supported " +#~ "mechanism right now) and scramble, encrypted according to the specified " +#~ "mechanism." +#~ msgstr "" +#~ ":code:`` содержит имя пользователя. :code:`` должен представлять" +#~ " собой массив из 2 полей: механизм аутентификации (на данный момент " +#~ "поддерживается только механизм \"chap-sha1\") и сообщение, зашифрованное в " +#~ "соответствии с указанным механизмом." + +#~ msgid "" +#~ "The server instance responds to an authentication packet with a standard " +#~ "response with 0 tuples." +#~ msgstr "" +#~ "На пакет аутентификации экземпляр сервера отправляет стандартный ответ с 0 " +#~ "кортежей." + +#~ msgid "" +#~ "To see how Tarantool handles this, look at `net_box.c " +#~ "`_" +#~ " function ``netbox_encode_auth``." +#~ msgstr "" +#~ "Чтобы понять, как Tarantool это обрабатывает, обратите внимание на функцию " +#~ "`netbox_encode_auth`` в файле `net_box.c " +#~ "`_." diff --git a/locale/ru/LC_MESSAGES/dev_guide/internals/iproto/events.po b/locale/ru/LC_MESSAGES/dev_guide/internals/iproto/events.po new file mode 100644 index 0000000000..fc8beff7ab --- /dev/null +++ b/locale/ru/LC_MESSAGES/dev_guide/internals/iproto/events.po @@ -0,0 +1,83 @@ + +msgid "Events and subscriptions" +msgstr "" + +msgid "" +"The commands below support asynchronous server-client notifications " +"signalled with :ref:`box.broadcast() `. Servers that support " +"the new feature set the ``IPROTO_FEATURE_WATCHERS`` feature in reply to the " +"``IPROTO_ID`` command. When the connection is closed, all watchers " +"registered for it are unregistered." +msgstr "" + +msgid "" +"The remote watcher (event subscription) protocol works in the following way:" +msgstr "" + +msgid "" +"The client sends an ``IPROTO_WATCH`` packet to subscribe to the updates of a" +" specified key defined on the server." +msgstr "" + +msgid "" +"The server sends an ``IPROTO_EVENT`` packet to the subscribed client after " +"registration. The packet contains the key name and its current value. After " +"that, the packet is sent every time the key value is updated with " +"``box.broadcast()``, provided that the last notification was acknowledged " +"(see below)." +msgstr "" + +msgid "" +"After receiving the notification, the client sends an ``IPROTO_WATCH`` " +"packet to acknowledge the notification." +msgstr "" + +msgid "" +"If the client doesn't want to receive any more notifications, it " +"unsubscribes by sending an ``IPROTO_UNWATCH`` packet." +msgstr "" + +msgid "" +"All the three request types are asynchronous -- the receiving end doesn't " +"send a packet in reply to any of them. Therefore, neither of them has a sync" +" number." +msgstr "" + +msgid "IPROTO_WATCH" +msgstr "" + +msgid "Code: 0x4a." +msgstr "" + +msgid "" +"Register a new watcher for the given notification key or confirms a " +"notification if the watcher is already subscribed. The watcher is notified " +"after registration. After that, the notification is sent every time the key " +"is updated. The server doesn't reply to the request unless it fails to parse" +" the packet." +msgstr "" + +msgid "IPROTO_UNWATCH" +msgstr "" + +msgid "Code: 0x4b." +msgstr "" + +msgid "" +"Unregister a watcher subscribed to the given notification key. The server " +"doesn't reply to the request unless it fails to parse the packet." +msgstr "" + +msgid "IPROTO_EVENT" +msgstr "" + +msgid "Code: 0x4c." +msgstr "" + +msgid "Sent by the server to notify a client about an update of a key." +msgstr "" + +msgid "" +"``IPROTO_EVENT_DATA`` contains data sent to a remote watcher. The parameter " +"is optional, the default value is ``MP_NIL``." +msgstr "" diff --git a/locale/ru/LC_MESSAGES/dev_guide/internals/iproto/format.po b/locale/ru/LC_MESSAGES/dev_guide/internals/iproto/format.po new file mode 100644 index 0000000000..6a5877eb86 --- /dev/null +++ b/locale/ru/LC_MESSAGES/dev_guide/internals/iproto/format.po @@ -0,0 +1,182 @@ + +msgid "Request and response format" +msgstr "" + +msgid "" +"The types referred to in this document are `MessagePack " +"`_ types. For their definitions, see the :ref:`MP_* " +"MessagePack types ` section." +msgstr "" + +msgid "Packet structure" +msgstr "" + +msgid "" +"Requests and responses have similar structure. They contain three sections: " +"size, header, and body." +msgstr "" + +msgid "It is legal to put more than one request in a packet." +msgstr "" + +msgid "Size" +msgstr "" + +msgid "" +"The size is an MP_UINT -- unsigned integer, usually 32-bit. It is the size " +"of the header plus the size of the body. It may be useful to compare it with" +" the number of bytes remaining in the packet." +msgstr "" + +msgid "Header" +msgstr "" + +msgid "The header is an MP_MAP. It may contain, in any order:" +msgstr "" + +msgid "" +"Both the request and response use the :ref:`IPROTO_REQUEST_TYPE ` key. It denotes the type of the packet." +msgstr "" + +msgid "" +"The request and the matching response have the same sync number " +"(:ref:`IPROTO_SYNC `)." +msgstr "" + +msgid "" +":ref:`IPROTO_SCHEMA_VERSION ` is an " +"optional key that indicates whether there was a major change in the schema." +msgstr "" + +msgid "" +"In :ref:`interactive transactions `, every stream is identified by a unique " +":ref:`IPROTO_STREAM_ID `." +msgstr "" + +msgid "" +"In case of replicating :ref:`synchronous transactions `, the " +"header also contains the :ref:`IPROTO_FLAGS ` key." +msgstr "" + +msgid "Encoding and decoding" +msgstr "" + +msgid "" +"To see how Tarantool encodes the header, have a look at file `xrow.c " +"`_, " +"function ``xrow_header_encode``." +msgstr "" + +msgid "" +"To see how Tarantool decodes the header, have a look at file `net_box.c " +"`__," +" function ``netbox_decode_data``." +msgstr "" + +msgid "" +"For example, in a successful response to ``box.space:select()``, the " +"IPROTO_REQUEST_TYPE value is 0 = ``IPROTO_OK`` and the array has all the " +"tuples of the result." +msgstr "" + +msgid "" +"Read the source code file `net_box.c " +"`__" +" where the function ``decode_metadata_optional`` is an example of how " +"Tarantool itself decodes extra items." +msgstr "" + +msgid "Body" +msgstr "" + +msgid "The body is an MP_MAP. Maximal iproto package body length is 2 GiB." +msgstr "" + +msgid "" +"The body has the details of the request or response. In a request, it can " +"also be absent or be an empty map. Both these states are interpreted " +"equally. Responses contain the body anyway even for an :ref:`IPROTO_PING " +"` request, where it is an empty MP_MAP." +msgstr "" + +msgid "A lot of responses contain the IPROTO_DATA map:" +msgstr "" + +msgid "" +"For most data-access requests (:ref:`IPROTO_SELECT `, " +":ref:`IPROTO_INSERT `, :ref:`IPROTO_DELETE " +"`, etc.) the body is an IPROTO_DATA map with an array " +"of tuples that contain an array of fields." +msgstr "" + +msgid "" +"IPROTO_DATA is what we get with net_box and :ref:`Module buffer ` so if we were using net_box we could decode with " +":ref:`msgpack.decode_unchecked() `, or we " +"could convert to a string with :samp:`ffi.string({pointer},{length})`. The " +":ref:`pickle.unpack() ` function might also be helpful." +msgstr "" + +msgid "" +"For SQL-specific requests and responses, the body is a bit different. " +":ref:`Learn more ` about this type of packets." +msgstr "" + +msgid "Error responses" +msgstr "" + +msgid "" +"Instead of :ref:`IPROTO_OK `, an error response header " +"has IPROTO_REQUEST_TYPE = :ref:`IPROTO_TYPE_ERROR `. Its code is ``0x8XXX``, where ``XXX`` is the error code -- a " +"value in `src/box/errcode.h " +"`_. " +"``src/box/errcode.h`` also has some convenience macros which define " +"hexadecimal constants for return codes." +msgstr "" + +msgid "" +"The error response body is a map that contains two keys: :ref:`IPROTO_ERROR " +"` and :ref:`IPROTO_ERROR_24 `. While IPROTO_ERROR contains an MP_MAP value, IPROTO_ERROR_24 " +"contains a string. The two keys are provided to accommodate clients with " +"older and newer Tarantool versions." +msgstr "" + +msgid "Error responses before 2.4.1" +msgstr "" + +msgid "" +"Before Tarantool v. :doc:`2.4.1 `, the key IPROTO_ERROR " +"contained a string and was identical to the current IPROTO_ERROR_24 key." +msgstr "" + +msgid "" +"Let's consider an example. This is the fifth message, and the request was to" +" create a duplicate space with " +"``conn:eval([[box.schema.space.create('_space');]])``. The unsuccessful " +"response looks like this:" +msgstr "" + +msgid "" +"The tutorial :ref:`Understanding the binary protocol ` shows actual byte codes of the response to the IPROTO_EVAL " +"message." +msgstr "" + +#, python-format +msgid "" +"Looking in `errcode.h " +"`__, " +"we find that the error code ``0x0a`` (decimal 10) is ER_SPACE_EXISTS, and " +"the string associated with ER_SPACE_EXISTS is \"Space '%s' already exists\"." +msgstr "" + +msgid "" +"Since version :doc:`2.4.1 `, responses for errors have extra" +" information following what was described above. This extra information is " +"given via the MP_ERROR extension type. See details in the :ref:`MessagePack " +"extensions ` section." +msgstr "" diff --git a/locale/ru/LC_MESSAGES/dev_guide/internals/iproto/graceful_shutdown.po b/locale/ru/LC_MESSAGES/dev_guide/internals/iproto/graceful_shutdown.po new file mode 100644 index 0000000000..0aaf15dab3 --- /dev/null +++ b/locale/ru/LC_MESSAGES/dev_guide/internals/iproto/graceful_shutdown.po @@ -0,0 +1,68 @@ + +msgid "Graceful shutdown protocol" +msgstr "" + +msgid "Overview" +msgstr "" + +msgid "Since :doc:`2.10.0 `." +msgstr "" + +msgid "" +"The graceful shutdown protocol is a mechanism that helps to prevent data " +"loss in requests in case of a shutdown command. According to the protocol, " +"when a server receives an ``os.exit()`` command or a ``SIGTERM`` signal, it" +" does not exit immediately. Instead of that, first, the server stops " +"listening for new connections. Then, the server sends the shutdown packets " +"to all connections that support the graceful shutdown protocol. When a " +"client is notified about the upcoming server exit, it stops serving any new " +"requests and waits for active requests to complete before closing the " +"connections. Once all connections are terminated, the server will be shut " +"down." +msgstr "" + +msgid "" +"The protocol uses the event subscription system. That is, the feature is " +"available if the server supports the :ref:`box.shutdown ` event and ``IPROTO_WATCH``. For more information about it, see " +":ref:`reference for the event watchers ` and the " +":ref:`corresponding page in the Binary Protocol section `." +msgstr "" + +msgid "How the graceful shutdown works" +msgstr "" + +msgid "The shutdown protocol works in the following way:" +msgstr "" + +msgid "" +"First, the server receives a shutdown request. It can be either an " +"``os.exit()`` command or a :ref:`SIGTERM ` signal." +msgstr "" + +msgid "" +"Then the :ref:`box.shutdown ` event is " +"generated. The server broadcasts it to all subscribed remote watchers (see " +":ref:`IPROTO_WATCH `). That is, the server calls " +":ref:`box.broadcast('box.shutdown', true) ` from the " +":ref:`box.ctl.on_shutdown() ` trigger callback. Once " +"this is done, the server stops listening for new connections." +msgstr "" + +msgid "" +"From now on, the server waits until all subscribed connections are " +"terminated." +msgstr "" + +msgid "" +"At the same time, the client gets the ``box.shutdown`` event and shuts the " +"connection down gracefully." +msgstr "" + +msgid "" +"After all connections are closed, the server will be stopped. Otherwise, a " +"timeout occurs, and the Tarantool exits immediately. You can set up the " +"required timeout with the :ref:`set_on_shutdown_timeout() ` function." +msgstr "" diff --git a/locale/ru/LC_MESSAGES/dev_guide/internals/iproto/keys.po b/locale/ru/LC_MESSAGES/dev_guide/internals/iproto/keys.po new file mode 100644 index 0000000000..0b2bad9004 --- /dev/null +++ b/locale/ru/LC_MESSAGES/dev_guide/internals/iproto/keys.po @@ -0,0 +1,1280 @@ + +msgid "Keys used in requests and responses" +msgstr "" + +msgid "" +"This section describes ``iproto`` keys contained in requests and responses. " +"The keys are Tarantool constants that are either defined or mentioned in the" +" `iproto_constants.h file " +"`_." +msgstr "" + +msgid "" +"While the keys themselves are unsigned 8-bit integers, their values can have" +" different types." +msgstr "" + +msgid "Basic description" +msgstr "" + +msgid "General" +msgstr "" + +msgid "Name" +msgstr "" + +msgid "Code and |br| value type" +msgstr "" + +msgid "Description" +msgstr "" + +msgid ":ref:`IPROTO_VERSION `" +msgstr "" + +msgid "0x54 |br| MP_UINT" +msgstr "" + +msgid "Binary protocol version supported by the client" +msgstr "" + +msgid ":ref:`IPROTO_FEATURES `" +msgstr "" + +msgid "0x55 |br| MP_ARRAY" +msgstr "" + +msgid "Supported binary protocol features" +msgstr "" + +msgid ":ref:`IPROTO_SYNC `" +msgstr "" + +msgid "0x01 |br| MP_UINT" +msgstr "" + +msgid "Unique request identifier" +msgstr "" + +msgid ":ref:`IPROTO_SCHEMA_VERSION `" +msgstr "" + +msgid "0x05 |br| MP_UINT" +msgstr "" + +msgid "Version of the database schema" +msgstr "" + +msgid "IPROTO_TIMESTAMP" +msgstr "" + +msgid "0x04 |br| MP_DOUBLE" +msgstr "" + +msgid "Time in seconds since the Unix epoch" +msgstr "" + +msgid ":ref:`IPROTO_REQUEST_TYPE `" +msgstr "" + +msgid "0x00 |br| MP_UINT" +msgstr "" + +msgid "Request type or response type" +msgstr "" + +msgid ":ref:`IPROTO_ERROR `" +msgstr "" + +msgid "0x52 |br| :ref:`MP_ERROR `" +msgstr "" + +msgid "Error response" +msgstr "" + +msgid ":ref:`IPROTO_ERROR_24 `" +msgstr "" + +msgid "0x31 |br| MP_STR" +msgstr "" + +msgid "Error as a string" +msgstr "" + +msgid "IPROTO_DATA" +msgstr "" + +msgid "0x30 |br| MP_OBJECT" +msgstr "" + +msgid "" +"Data passed in the transaction. Can be empty. Used in all requests and " +"responses" +msgstr "" + +msgid "IPROTO_SPACE_ID" +msgstr "" + +msgid "0x10 |br| MP_UINT" +msgstr "" + +msgid "Space identifier" +msgstr "" + +msgid "IPROTO_INDEX_ID" +msgstr "" + +msgid "0x11 |br| MP_UINT" +msgstr "" + +msgid "Index identifier" +msgstr "" + +msgid ":ref:`IPROTO_TUPLE `" +msgstr "" + +msgid "0x21 |br| MP_ARRAY" +msgstr "" + +msgid "" +"Tuple, arguments, operations, or authentication pair. :ref:`See details " +"`" +msgstr "" + +msgid "IPROTO_KEY" +msgstr "" + +msgid "0x20 |br| MP_ARRAY" +msgstr "" + +msgid "" +"Array of index keys in the request. See :ref:`space_object:select() " +"`" +msgstr "" + +msgid "IPROTO_LIMIT" +msgstr "" + +msgid "0x12 |br| MP_UINT" +msgstr "" + +msgid "Maximum number of tuples in the space" +msgstr "" + +msgid "IPROTO_OFFSET" +msgstr "" + +msgid "0x13 |br| MP_UINT" +msgstr "" + +msgid "Number of tuples to skip in the select" +msgstr "" + +msgid ":ref:`IPROTO_ITERATOR `" +msgstr "" + +msgid "0x14 |br| MP_UINT" +msgstr "" + +msgid "Iterator type" +msgstr "" + +msgid "IPROTO_INDEX_BASE" +msgstr "" + +msgid "0x15 |br| MP_UINT" +msgstr "" + +msgid "Indicates whether the first field number is 1 or 0" +msgstr "" + +msgid "IPROTO_FUNCTION_NAME" +msgstr "" + +msgid "0x22 |br| MP_STR" +msgstr "" + +msgid "" +"Name of the called function. Used in :ref:`IPROTO_CALL `" +msgstr "" + +msgid "IPROTO_USER_NAME" +msgstr "" + +msgid "0x23 |br| MP_STR" +msgstr "" + +msgid "User name. Used in :ref:`IPROTO_AUTH `" +msgstr "" + +msgid "IPROTO_OPS" +msgstr "" + +msgid "0x28 |br| MP_ARRAY" +msgstr "" + +msgid "" +"Array of operations. Used in :ref:`IPROTO_UPSERT `" +msgstr "" + +msgid "IPROTO_EXPR" +msgstr "" + +msgid "0x27 |br| MP_STR" +msgstr "" + +msgid "Command argument. Used in :ref:`IPROTO_EVAL `" +msgstr "" + +msgid "IPROTO_AUTH_TYPE" +msgstr "" + +msgid "0x5b |br| MP_STR" +msgstr "" + +msgid "" +"A :ref:`protocol ` used to generate user " +"authentication data" +msgstr "" + +msgid "IPROTO_AFTER_POSITION" +msgstr "" + +msgid "0x2e |br| MP_STR" +msgstr "" + +msgid "" +"The position of a tuple after which :ref:`space_object:select() ` starts the search" +msgstr "" + +msgid "IPROTO_AFTER_TUPLE" +msgstr "" + +msgid "0x2f |br| MP_ARRAY" +msgstr "" + +msgid "" +"A tuple after which :ref:`space_object:select() ` starts " +"the search" +msgstr "" + +msgid "IPROTO_FETCH_POSITION" +msgstr "" + +msgid "0x1f |br| MP_BOOL" +msgstr "" + +msgid "" +"If **true**, :ref:`space_object:select() ` returns the " +"position of the last selected tuple" +msgstr "" + +msgid "IPROTO_POSITION" +msgstr "" + +msgid "0x35 |br| MP_STR" +msgstr "" + +msgid "" +"If ``IPROTO_FETCH_POSITION`` is **true**, returns a base64-encoded string " +"representing the position of the last selected tuple" +msgstr "" + +msgid "Streams" +msgstr "" + +msgid ":ref:`IPROTO_STREAM_ID `" +msgstr "" + +msgid "0x0a |br| MP_UINT" +msgstr "" + +msgid "" +"Unique :ref:`stream ` identifier" +msgstr "" + +msgid "IPROTO_TIMEOUT" +msgstr "" + +msgid "0x56 |br| MP_DOUBLE" +msgstr "" + +msgid "Timeout in seconds, after which the transactions are rolled back" +msgstr "" + +msgid ":ref:`IPROTO_TXN_ISOLATION `" +msgstr "" + +msgid "0x59 |br| MP_UINT" +msgstr "" + +msgid "Transaction isolation level" +msgstr "" + +msgid "General replication" +msgstr "" + +msgid "IPROTO_REPLICA_ID" +msgstr "" + +msgid "0x02 |br| MP_INT" +msgstr "" + +msgid "Replica ID" +msgstr "" + +msgid "IPROTO_INSTANCE_UUID" +msgstr "" + +msgid "0x24 |br| MP_STR" +msgstr "" + +msgid "Instance UUID" +msgstr "" + +msgid ":ref:`IPROTO_VCLOCK `" +msgstr "" + +msgid "0x26 |br| MP_MAP" +msgstr "" + +msgid "The instance's vclock" +msgstr "" + +msgid ":ref:`IPROTO_VCLOCK_SYNC `" +msgstr "" + +msgid "0x5a |br| MP_UINT" +msgstr "" + +msgid "ID of the vclock synchronization request. Since 2.11" +msgstr "" + +msgid "IPROTO_REPLICASET_UUID" +msgstr "" + +msgid "0x25 |br| MP_STR" +msgstr "" + +msgid "" +"Before Tarantool version 2.11, IPROTO_REPLICASET_UUID was called " +"IPROTO_CLUSTER_UUID." +msgstr "" + +msgid "IPROTO_LSN" +msgstr "" + +msgid "0x03 |br| MP_UINT" +msgstr "" + +msgid "Log sequence number of the transaction" +msgstr "" + +msgid "IPROTO_TSN" +msgstr "" + +msgid "0x08 |br| MP_UINT" +msgstr "" + +msgid "Transaction sequence number" +msgstr "" + +msgid ":ref:`IPROTO_BALLOT_IS_RO_CFG `" +msgstr "" + +msgid "0x01 |br| MP_BOOL" +msgstr "" + +msgid "" +"True if the instance is configured as :ref:`read_only `. Since :doc:`2.6.1 `" +msgstr "" + +msgid ":ref:`IPROTO_BALLOT_VCLOCK `" +msgstr "" + +msgid "0x02 |br| MP_MAP" +msgstr "" + +msgid "Current vclock of the instance" +msgstr "" + +msgid ":ref:`IPROTO_BALLOT_GC_VCLOCK `" +msgstr "" + +msgid "0x03 |br| MP_MAP" +msgstr "" + +msgid "Vclock of the instance’s oldest WAL entry" +msgstr "" + +msgid ":ref:`IPROTO_BALLOT_IS_RO `" +msgstr "" + +msgid "0x04 |br| MP_BOOL" +msgstr "" + +msgid "" +"True if the instance is not writable: configured as :ref:`read_only " +"`, has :ref:`orphan status `, or is a :ref:`Raft follower `. Since " +":doc:`2.6.1 `" +msgstr "" + +msgid ":ref:`IPROTO_BALLOT_IS_ANON `" +msgstr "" + +msgid "0x05 |br| MP_BOOL" +msgstr "" + +msgid "" +"True if the replica is anonymous. Corresponds to " +":ref:`box.cfg.replication_anon `. Since " +":doc:`2.7.1 `" +msgstr "" + +msgid ":ref:`IPROTO_BALLOT_IS_BOOTED `" +msgstr "" + +msgid "0x06 |br| MP_BOOL" +msgstr "" + +msgid "" +"True if the instance has finished its bootstrap or recovery process. Since " +":doc:`2.7.3 `, :doc:`2.8.2 `, :doc:`2.10.0 " +"`" +msgstr "" + +msgid ":ref:`IPROTO_BALLOT_CAN_LEAD `" +msgstr "" + +msgid "0x07 |br| MP_BOOL" +msgstr "" + +msgid "" +"True if :ref:`box.cfg.election_mode ` is " +"``candidate`` or ``manual``. Since v. :doc:`2.7.3 ` and " +":doc:`2.8.2 `" +msgstr "" + +msgid "" +":ref:`IPROTO_BALLOT_BOOTSTRAP_LEADER_UUID `" +msgstr "" + +msgid "0x08 |br| MP_STR" +msgstr "" + +msgid "" +"UUID of the bootstrap leader. The UUID is encoded as a 36-byte string. Since" +" v. 2.11" +msgstr "" + +msgid "" +":ref:`IPROTO_BALLOT_REGISTERED_REPLICA_UUIDS `" +msgstr "" + +msgid "0x09 |br| MP_ARRAY" +msgstr "" + +msgid "" +"An array of MP_STR elements that contains the UUIDs of members registered in" +" the replica set. Each UUID is encoded as a 36-byte string. Since v. 2.11" +msgstr "" + +msgid ":ref:`IPROTO_FLAGS `" +msgstr "" + +msgid "0x09 |br| MP_UINT" +msgstr "" + +msgid "" +"Auxiliary data to indicate the last transaction message state. Included in " +"the header of any DML request that is recorded in the WAL." +msgstr "" + +msgid "IPROTO_SERVER_VERSION" +msgstr "" + +msgid "0x06 |br| MP_UINT" +msgstr "" + +msgid "Tarantool version of the subscribing node, in a compact representation" +msgstr "" + +msgid "IPROTO_REPLICA_ANON" +msgstr "" + +msgid "0x50 |br| MP_BOOL" +msgstr "" + +msgid "" +"Optional key used in :ref:`SUBSCRIBE request `. True if the subscribing replica is anonymous" +msgstr "" + +msgid "IPROTO_ID_FILTER" +msgstr "" + +msgid "0x51 |br| MP_ARRAY" +msgstr "" + +msgid "" +"Optional key used in :ref:`SUBSCRIBE request `, followed by an array of ids of instances whose rows won't be " +"relayed to the replica. Since v. :doc:`2.10.0 `" +msgstr "" + +msgid "Synchronous replication" +msgstr "" + +msgid ":ref:`IPROTO_TERM `" +msgstr "" + +msgid "0x53 |br| MP_UINT" +msgstr "" + +msgid ":ref:`RAFT term ` on an instance" +msgstr "" + +msgid "IPROTO_RAFT_TERM" +msgstr "" + +msgid "" +":ref:`RAFT term ` on an instance. The key is only used " +"for requests with the :ref:`IPROTO_RAFT ` type." +msgstr "" + +msgid "IPROTO_RAFT_VOTE" +msgstr "" + +msgid "0x01 |br| MP_UINT" +msgstr "" + +msgid "Instance vote in the current term (if any)" +msgstr "" + +msgid "IPROTO_RAFT_STATE" +msgstr "" + +msgid "0x02 |br| MP_UINT" +msgstr "" + +msgid "" +":ref:`RAFT state `. Possible values: ``1`` -- follower, " +"``2`` -- candidate, ``3`` -- leader" +msgstr "" + +msgid ":ref:`IPROTO_RAFT_VCLOCK `" +msgstr "" + +msgid "IPROTO_RAFT_LEADER_ID" +msgstr "" + +msgid "0x04 |br| MP_UINT" +msgstr "" + +msgid "" +"Current leader node ID as seen by the node that issues the request Since " +"version :doc:`2.10.0 `" +msgstr "" + +msgid "IPROTO_RAFT_IS_LEADER_SEEN" +msgstr "" + +msgid "" +"True if the node has a direct connection to the leader node. Since version " +":doc:`2.10.0 `" +msgstr "" + +msgid "All ``IPROTO_RAFT_*`` keys are used only in ``IPROTO_RAFT*`` requests." +msgstr "" + +msgid "Events and subscriptions" +msgstr "" + +msgid "IPROTO_EVENT_KEY" +msgstr "" + +msgid "0x56 |br| MP_STR" +msgstr "" + +msgid ":ref:`Event ` key name" +msgstr "" + +msgid "IPROTO_EVENT_DATA" +msgstr "" + +msgid "0x57 |br| MP_OBJECT" +msgstr "" + +msgid ":ref:`Event ` data sent to a remote watcher" +msgstr "" + +msgid "" +":ref:`Learn more about events and subscriptions in iproto `." +msgstr "" + +msgid "SQL-specific" +msgstr "" + +msgid "" +"These keys are used with SQL within :ref:`SQL-specific requests and " +"responses ` like :ref:`IPROTO_EXECUTE ` and :ref:`IPROTO_PREPARE `." +msgstr "" + +msgid "IPROTO_SQL_TEXT" +msgstr "" + +msgid "0x40 |br| MP_STR" +msgstr "" + +msgid "SQL statement text" +msgstr "" + +msgid "IPROTO_STMT_ID" +msgstr "" + +msgid "0x43 |br| MP_INT" +msgstr "" + +msgid "Identifier of the prepared statement" +msgstr "" + +msgid "IPROTO_OPTIONS" +msgstr "" + +msgid "0x2b |br| MP_ARRAY" +msgstr "" + +msgid "SQL transaction options. Usually empty" +msgstr "" + +msgid ":ref:`IPROTO_METADATA `" +msgstr "" + +msgid "0x32 |br| MP_ARRAY of MP_MAP items" +msgstr "" + +msgid "SQL transaction metadata" +msgstr "" + +msgid "IPROTO_FIELD_NAME" +msgstr "" + +msgid "0x00 |br| MP_STR" +msgstr "" + +msgid "" +"Field name. Nested in :ref:`IPROTO_METADATA `" +msgstr "" + +msgid "IPROTO_FIELD_TYPE" +msgstr "" + +msgid "0x01 |br| MP_STR" +msgstr "" + +msgid "" +"Field type. Nested in :ref:`IPROTO_METADATA `" +msgstr "" + +msgid "IPROTO_FIELD_COLL" +msgstr "" + +msgid "0x02 |br| MP_STR" +msgstr "" + +msgid "" +"Field collation. Nested in :ref:`IPROTO_METADATA `" +msgstr "" + +msgid "IPROTO_FIELD_IS_NULLABLE" +msgstr "" + +msgid "0x03 |br| MP_BOOL" +msgstr "" + +msgid "" +"True if the field is nullable. Nested in :ref:`IPROTO_METADATA `." +msgstr "" + +msgid "IPROTO_FIELD_IS_AUTOINCREMENT" +msgstr "" + +msgid "" +"True if the field is auto-incremented. Nested in :ref:`IPROTO_METADATA " +"`." +msgstr "" + +msgid "IPROTO_FIELD_SPAN" +msgstr "" + +msgid "0x05 |br| MP_STR or MP_NIL" +msgstr "" + +msgid "" +"Original expression under SELECT. Nested in :ref:`IPROTO_METADATA " +"`. See :ref:`box.execute() `" +msgstr "" + +msgid "IPROTO_BIND_METADATA" +msgstr "" + +msgid "0x33 |br| MP_ARRAY" +msgstr "" + +msgid "Bind variable names and types" +msgstr "" + +msgid "IPROTO_BIND_COUNT" +msgstr "" + +msgid "0x34 |br| MP_INT" +msgstr "" + +msgid "Number of parameters to bind" +msgstr "" + +msgid ":ref:`IPROTO_SQL_BIND `" +msgstr "" + +msgid "0x41 |br| MP_ARRAY" +msgstr "" + +msgid "Parameter values to match ? placeholders or :name placeholders" +msgstr "" + +msgid "IPROTO_SQL_INFO" +msgstr "" + +msgid "0x42 |br| MP_MAP" +msgstr "" + +msgid "Additional SQL-related parameters" +msgstr "" + +msgid "SQL_INFO_ROW_COUNT" +msgstr "" + +msgid "" +"Number of changed rows. Is ``0`` for statements that do not change rows. " +"Nested in IPROTO_SQL_INFO" +msgstr "" + +msgid "SQL_INFO_AUTO_INCREMENT_IDS" +msgstr "" + +msgid "0x01 |br| MP_ARRAY of MP_UINT items" +msgstr "" + +msgid "" +"New primary key value (or values) for an INSERT in a table defined with " +"PRIMARY KEY AUTOINCREMENT. Nested in IPROTO_SQL_INFO" +msgstr "" + +msgid "Details on individual keys" +msgstr "" + +msgid "IPROTO_VERSION" +msgstr "" + +msgid "Code: 0x54." +msgstr "" + +msgid "" +"IPROTO_VERSION is an integer number reflecting the version of protocol that " +"the client supports. The latest IPROTO_VERSION is |iproto_version|." +msgstr "" + +msgid "IPROTO_FEATURES" +msgstr "" + +msgid "Code: 0x55." +msgstr "" + +msgid "Available IPROTO_FEATURES are the following:" +msgstr "" + +msgid "" +"``IPROTO_FEATURE_STREAMS = 0`` -- streams support: :ref:`IPROTO_STREAM_ID " +"` in the request header." +msgstr "" + +msgid "" +"``IPROTO_FEATURE_TRANSACTIONS = 1`` -- transaction support: IPROTO_BEGIN, " +"IPROTO_COMMIT, and IPROTO_ROLLBACK commands (with :ref:`IPROTO_STREAM_ID " +"` in the request header). Learn more about " +":ref:`sending transaction commands `." +msgstr "" + +msgid "" +"``IPROTO_FEATURE_ERROR_EXTENSION = 2`` -- :ref:`MP_ERROR ` MsgPack extension support. Clients that don't support this feature " +"receive error responses for :ref:`IPROTO_EVAL ` and " +":ref:`IPROTO_CALL ` encoded to string error messages." +msgstr "" + +msgid "" +"``IPROTO_FEATURE_WATCHERS = 3`` -- remote watchers support: " +":ref:`IPROTO_WATCH `, :ref:`IPROTO_UNWATCH " +"`, and :ref:`IPROTO_EVENT ` " +"commands." +msgstr "" + +msgid "IPROTO_SYNC" +msgstr "" + +msgid "Code: 0x01." +msgstr "" + +msgid "" +"This is an unsigned integer that should be incremented so that it is unique " +"in every request. This integer is also returned from " +":doc:`/reference/reference_lua/box_session/sync`." +msgstr "" + +msgid "" +"The IPROTO_SYNC value of a response should be the same as the IPROTO_SYNC " +"value of a request." +msgstr "" + +msgid "IPROTO_SCHEMA_VERSION" +msgstr "" + +msgid "Code: 0x05." +msgstr "" + +msgid "" +"Version of the database schema -- an unsigned number that goes up when there" +" is a major change in the schema." +msgstr "" + +msgid "" +"In a *request* header, IPROTO_SCHEMA_VERSION is optional, so the version " +"will not be checked if it is absent." +msgstr "" + +msgid "" +"In a *response* header, IPROTO_SCHEMA_VERSION is always present, and it is " +"up to the client to check if it has changed." +msgstr "" + +msgid "IPROTO_ITERATOR" +msgstr "" + +msgid "Code: 0x14." +msgstr "" + +msgid "" +"Possible values (see `iterator_type.h " +"`_):" +msgstr "" + +msgid "``0``" +msgstr "" + +msgid ":ref:`EQ `" +msgstr "" + +msgid "``1``" +msgstr "" + +msgid ":ref:`REQ `" +msgstr "" + +msgid "``2``" +msgstr "" + +msgid ":ref:`ALL `, all tuples" +msgstr "" + +msgid "``3``" +msgstr "" + +msgid ":ref:`LT `, less than" +msgstr "" + +msgid "``4``" +msgstr "" + +msgid ":ref:`LE `, less than or equal" +msgstr "" + +msgid "``5``" +msgstr "" + +msgid ":ref:`GE `, greater than or equal" +msgstr "" + +msgid "``6``" +msgstr "" + +msgid ":ref:`GT `, greater than" +msgstr "" + +msgid "``7``" +msgstr "" + +msgid "" +":ref:`BITS_ALL_SET `, all bits of the value are set in the " +"key" +msgstr "" + +msgid "``8``" +msgstr "" + +msgid "" +":ref:`BITS_ANY_SET `, at least one bit of the value is set" +msgstr "" + +msgid "``9``" +msgstr "" + +msgid ":ref:`BITS_ALL_NOT_SET `, no bits are set" +msgstr "" + +msgid "``10``" +msgstr "" + +msgid ":ref:`OVERLAPS `, overlaps the rectangle or box" +msgstr "" + +msgid "``11``" +msgstr "" + +msgid ":ref:`NEIGHBOR `, neighbors the rectangle or box" +msgstr "" + +msgid "IPROTO_STREAM_ID" +msgstr "" + +msgid "Code: 0x0a." +msgstr "" + +msgid "" +"Only used in :ref:`streams `. This" +" is an unsigned number that should be unique in every stream." +msgstr "" + +msgid "" +"In requests, IPROTO_STREAM_ID is useful for two things: ensuring that " +"requests within transactions are done in separate groups, and ensuring " +"strictly consistent execution of requests (whether or not they are within " +"transactions)." +msgstr "" + +msgid "In responses, IPROTO_STREAM_ID does not appear." +msgstr "" + +msgid "See :ref:`Binary protocol -- streams `." +msgstr "" + +msgid "IPROTO_TXN_ISOLATION" +msgstr "" + +msgid "" +"IPROTO_TXN_ISOLATION is the :ref:`transaction isolation level " +"`. It can take the following values:" +msgstr "" + +msgid "" +"``TXN_ISOLATION_DEFAULT = 0`` -- use the default level from ``box.cfg`` " +"(default value)" +msgstr "" + +msgid "" +"``TXN_ISOLATION_READ_COMMITTED = 1`` -- read changes that are committed but " +"not confirmed yet" +msgstr "" + +msgid "``TXN_ISOLATION_READ_CONFIRMED = 2`` -- read confirmed changes" +msgstr "" + +msgid "" +"``TXN_ISOLATION_BEST_EFFORT = 3`` -- determine isolation level automatically" +msgstr "" + +msgid "" +"See :ref:`Binary protocol -- streams ` to learn more " +"about stream transactions in the binary protocol." +msgstr "" + +msgid "IPROTO_REQUEST_TYPE" +msgstr "" + +msgid "Code: 0x00." +msgstr "" + +msgid "" +"The key is used both in requests and responses. It indicates the request or " +"response type and has any request or response name for the value (example: " +"IPROTO_AUTH). See requests and responses for :ref:`client-server " +"communication `, :ref:`replication `, :ref:`events and subscriptions `, :ref:`streams and interactive transactions `." +msgstr "" + +msgid "IPROTO_ERROR" +msgstr "" + +msgid "Code: 0x52." +msgstr "" + +msgid "" +"In case of error, the response body contains IPROTO_ERROR and " +":ref:`IPROTO_ERROR_24 ` instead of " +"IPROTO_DATA." +msgstr "" + +msgid "" +"To learn more about error responses, check the section :ref:`Request and " +"response format `." +msgstr "" + +msgid "IPROTO_ERROR_24" +msgstr "" + +msgid "Code: 0x31." +msgstr "" + +msgid "" +"IPROTO_ERROR_24 is used in Tarantool versions before :doc:`2.4.1 " +"`. The key contains the error in the string format." +msgstr "" + +msgid "" +"Since :doc:`Tarantool 2.4.1 `, Tarantool packs errors as the" +" :ref:`MP_ERROR ` MessagePack extension, which includes " +"extra information. Two keys are passed in the error response body: " +"IPROTO_ERROR and IPROTO_ERROR_24." +msgstr "" + +msgid "IPROTO_TUPLE" +msgstr "" + +msgid "Code: 0x21." +msgstr "" + +msgid "Multiple operations make use of this key in different ways:" +msgstr "" + +msgid "" +":ref:`IPROTO_INSERT `, :ref:`IPROTO_REPLACE " +"`, :ref:`IPROTO_UPSERT `" +msgstr "" + +msgid "Tuple to be inserted" +msgstr "" + +msgid ":ref:`IPROTO_UPSERT `" +msgstr "" + +msgid "Operations to perform" +msgstr "" + +msgid ":ref:`IPROTO_AUTH `" +msgstr "" + +msgid "" +"Array of 2 fields: authentication mechanism and scramble, encrypted " +"according to the specified mechanism. See more on the :ref:`authentication " +"` sequence." +msgstr "" + +msgid "" +":ref:`IPROTO_CALL `, :ref:`IPROTO_EVAL `" +msgstr "" + +msgid "Array of arguments" +msgstr "" + +msgid "IPROTO_FLAGS" +msgstr "" + +msgid "Code: 0x09." +msgstr "" + +msgid "" +"When it comes to replicating synchronous transactions, the IPROTO_FLAGS key " +"is included in the header. The key contains an MP_UINT value of one or more " +"bits:" +msgstr "" + +msgid "" +"IPROTO_FLAG_COMMIT (0x01) is set if this is the last message for a " +"transaction." +msgstr "" + +msgid "" +"IPROTO_FLAG_WAIT_SYNC (0x02) is set if this is the last message for a " +"transaction which cannot be completed immediately." +msgstr "" + +msgid "" +"IPROTO_FLAG_WAIT_ACK (0x04) is set if this is the last message for a " +"synchronous transaction." +msgstr "" + +msgid "Example:" +msgstr "" + +msgid "IPROTO_TERM" +msgstr "" + +msgid "Code: 0x53." +msgstr "" + +msgid "" +"The key is used in the :ref:`IPROTO_RAFT_PROMOTE ` and :ref:`IPROTO_RAFT_DEMOTE ` requests." +msgstr "" + +msgid "" +"Since version 2.11, the key is included in response to a :ref:`heartbeat " +"message `. The term corresponds to the value of " +":ref:`box.info.synchro.queue.term ` on the sender " +"instance." +msgstr "" + +msgid "Vclock keys" +msgstr "" + +msgid "" +"The vclock (vector clock) is a log sequence number map that defines the " +"version of the dataset stored on the node. In fact, it represents the number" +" of logical operations executed on a specific node. A vclock looks like " +"this:" +msgstr "" + +msgid "" +"There are five keys that correspond to vector clocks in different contexts " +"of replication. They all have the MP_MAP type:" +msgstr "" + +msgid "" +"IPROTO_VCLOCK (0x26) is passed to a new instance :ref:`joining the replica " +"set `." +msgstr "" + +msgid "" +"IPROTO_VCLOCK_SYNC (0x5a) is used by :ref:`replication heartbeats " +"`. The master sends its heartbeats, including this " +"monotonically growing key, to a replica. Once the replica receives a " +"heartbeat with a non-zero IPROTO_VCLOCK_SYNC value, it starts responding " +"with the same value in all its acknowledgements. This key was introduced in " +"version 2.11." +msgstr "" + +msgid "" +"IPROTO_BALLOT_VCLOCK (0x02) is included in the :ref:`IPROTO_BALLOT " +"` message. IPROTO_BALLOT is sent in response to the " +":ref:`IPROTO_VOTE ` request. This key was" +" introduced in :doc:`/release/2.6.1`." +msgstr "" + +msgid "" +"IPROTO_BALLOT_GC_VCLOCK (0x03) is also included in the :ref:`IPROTO_BALLOT " +"` message. IPROTO_BALLOT is sent in response to the " +":ref:`IPROTO_VOTE ` request. It is the " +"vclock of the oldest WAL entry on the instance. Corresponds to " +":ref:`box.info.gc().vclock `. This key was introduced in " +":doc:`/release/2.6.1`." +msgstr "" + +msgid "" +"IPROTO_RAFT_VCLOCK (0x03) is included in the :ref:`IPROTO_RAFT " +"` message. It is present only on the instances in the " +":ref:`\"candidate\" state ` " +"(IPROTO_RAFT_STATE == 2)." +msgstr "" + +msgid "IPROTO_BALLOT keys" +msgstr "" + +msgid "" +"All IPROTO_BALLOT_* keys are only used in the :ref:`IPROTO_BALLOT " +"` requests. There have been the following name changes" +" starting with versions :doc:`/release/2.7.3`, :doc:`/release/2.8.2`, and " +":doc:`/release/2.10.0`:" +msgstr "" + +msgid "" +"IPROTO_BALLOT_IS_RO_CFG (0x01) was formerly called IPROTO_BALLOT_IS_RO." +msgstr "" + +msgid "" +"IPROTO_BALLOT_IS_RO (0x04) was formerly called IPROTO_BALLOT_IS_LOADING." +msgstr "" + +msgid "IPROTO_METADATA" +msgstr "" + +msgid "Code: 0x32." +msgstr "" + +msgid "Used with SQL within :ref:`IPROTO_EXECUTE `." +msgstr "" + +msgid "" +"The key contains an array of column maps, with each column map containing at" +" least IPROTO_FIELD_NAME (0x00) and MP_STR, and IPROTO_FIELD_TYPE (0x01) and" +" MP_STR." +msgstr "" + +msgid "" +"Additionally, if ``sql_full_metadata`` in the :ref:`_session_settings " +"` system space is TRUE, then the array has these" +" additional column maps which correspond to components described in the " +":ref:`box.execute() ` section." +msgstr "" + +msgid "IPROTO_SQL_BIND" +msgstr "" + +msgid "Code: 0x41." +msgstr "" + +msgid "" +"IPROTO_SQL_BIND is an array of parameter values to match ? placeholders or " +":name placeholders. It can contain values of any type, including MP_MAP." +msgstr "" + +msgid "" +"Values that are not MP_MAP replace the ``?`` placeholders in the request." +msgstr "" + +msgid "" +"MP_MAP values must have the format ``{[name] = value}``, where ``name`` is " +"the named parameter in the request. Here is an example of such a request:" +msgstr "" + +msgid "" +"tarantool> conn:execute('SELECT ?, ?, :name1, ?, :name2, :name1', {1, 2, {[':name1'] = 5}, 'str', {[':name2'] = true}})\n" +"---\n" +"- metadata:\n" +"- name: COLUMN_1\n" +" type: integer\n" +"- name: COLUMN_2\n" +" type: integer\n" +"- name: COLUMN_3\n" +" type: integer\n" +"- name: COLUMN_4\n" +" type: text\n" +"- name: COLUMN_5\n" +" type: boolean\n" +"- name: COLUMN_6\n" +" type: boolean\n" +"rows:\n" +"- [1, 2, 5, 'str', true, 5]" +msgstr "" diff --git a/locale/ru/LC_MESSAGES/dev_guide/internals/iproto/mp_types.po b/locale/ru/LC_MESSAGES/dev_guide/internals/iproto/mp_types.po new file mode 100644 index 0000000000..abfd5b8dbe --- /dev/null +++ b/locale/ru/LC_MESSAGES/dev_guide/internals/iproto/mp_types.po @@ -0,0 +1,89 @@ + +msgid "MP_* MessagePack types" +msgstr "" + +msgid "" +"The binary protocol handles data in the `MessagePack " +"`_ format. Short descriptions of the basic " +"MessagePack data types are on MessagePack's `specification page " +"`_. Tarantool also " +"introduces several MessagePack type :ref:`extensions `." +msgstr "" + +msgid "" +"In this document, MessagePack types are described by words that start with " +"**MP_**. See this table:" +msgstr "" + +msgid "**MP_NIL**" +msgstr "" + +msgid "nil" +msgstr "" + +msgid "**MP_UINT**" +msgstr "" + +msgid "unsigned integer" +msgstr "" + +msgid "**MP_INT**" +msgstr "" + +msgid "either integer or unsigned integer" +msgstr "" + +msgid "**MP_STR**" +msgstr "" + +msgid "string" +msgstr "" + +msgid "**MP_BIN**" +msgstr "" + +msgid "binary string" +msgstr "" + +msgid "**MP_ARRAY**" +msgstr "" + +msgid "array" +msgstr "" + +msgid "**MP_MAP**" +msgstr "" + +msgid "map" +msgstr "" + +msgid "**MP_BOOL**" +msgstr "" + +msgid "boolean" +msgstr "" + +msgid "**MP_FLOAT**" +msgstr "" + +msgid "float" +msgstr "" + +msgid "**MP_DOUBLE**" +msgstr "" + +msgid "double" +msgstr "" + +msgid "**MP_EXT**" +msgstr "" + +msgid ":ref:`extension `" +msgstr "" + +msgid "**MP_OBJECT**" +msgstr "" + +msgid "any MessagePack object" +msgstr "" diff --git a/locale/ru/LC_MESSAGES/dev_guide/internals/iproto/replication.po b/locale/ru/LC_MESSAGES/dev_guide/internals/iproto/replication.po index c0e6154d9d..8b38c281a0 100644 --- a/locale/ru/LC_MESSAGES/dev_guide/internals/iproto/replication.po +++ b/locale/ru/LC_MESSAGES/dev_guide/internals/iproto/replication.po @@ -1,342 +1,734 @@ -msgid "Replication" +msgid "Replication requests and responses" +msgstr "" + +msgid "" +"This section describes internal requests and responses that happen during " +"replication. Each of them is distinguished by the header, containing a " +"unique :ref:`IPROTO_REQUEST_TYPE ` " +"value. These values and the corresponding packet body structures are " +"considered below." +msgstr "" + +msgid "Connectors and clients do not need to send replication packets." +msgstr "" + +msgid "General" +msgstr "" + +msgid "Name" +msgstr "" + +msgid "Code" +msgstr "" + +msgid "Description" +msgstr "" + +msgid ":ref:`IPROTO_JOIN `" +msgstr "" + +msgid "0x41" +msgstr "" + +msgid "Request to join a replica set" +msgstr "" + +msgid ":ref:`IPROTO_SUBSCRIBE `" +msgstr "" + +msgid "0x42" +msgstr "" + +msgid "Request to subscribe to a specific node in a replica set" +msgstr "" + +msgid ":ref:`IPROTO_VOTE `" +msgstr "" + +msgid "0x44" +msgstr "" + +#, fuzzy +msgid "Request for replication" msgstr "Репликация" +msgid ":ref:`IPROTO_BALLOT `" +msgstr "" + +msgid "0x29" +msgstr "" + +msgid "Response to IPROTO_VOTE. Used during replica set bootstrap" +msgstr "" + +msgid "IPROTO_FETCH_SNAPSHOT" +msgstr "" +msgid "0x45" +msgstr "" + +#, fuzzy msgid "" -"IPROTO_JOIN = 0x41 -- for replication\n" -"IPROTO_SUBSCRIBE = 0x42 -- for replication SUBSCRIBE\n" -"IPROTO_VOTE_DEPRECATED = 0x43 -- for old style vote, superseded by IPROTO_VOTE\n" -"IPROTO_VOTE = 0x44 -- for master election\n" -"IPROTO_FETCH_SNAPSHOT = 0x45 -- for starting anonymous replication\n" -"IPROTO_REGISTER = 0x46 -- for leaving anonymous replication." +"Fetch the master's snapshot and start anonymous replication. See " +":ref:`replication_anon `" +msgstr "" +"Значение IPROTO_BALLOT_IS_ANON соответствует значению " +":ref:`box.cfg.replication_anon `." + +msgid "IPROTO_REGISTER" +msgstr "" + +msgid "0x46" +msgstr "" + +msgid "Register an anonymous replica so it is not anonymous anymore" msgstr "" -"IPROTO_JOIN = 0x41 — для репликации\n" -"IPROTO_SUBSCRIBE = 0x42 — для репликации SUBSCRIBE\n" -"IPROTO_VOTE_DEPRECATED = 0x43 — для устаревшего типа голосования, взамен используется IPROTO_VOTE\n" -"IPROTO_VOTE = 0x44 — для выбора мастера\n" -"IPROTO_FETCH_SNAPSHOT = 0x45 — для начала анонимной репликации\n" -"IPROTO_REGISTER = 0x46 — для выхода из анонимной репликации" msgid "" -"Tarantool constants 0x41 to 0x46 (decimal 65 to 70) are for replication. " -"Connectors and clients do not need to send replication packets. See " -":ref:`Binary protocol -- replication `." +"The master also sends :ref:`heartbeat ` messages to the replicas." +" The heartbeat message's IPROTO_REQUEST_TYPE is ``0``." msgstr "" -"Константы Tarantool 0x41–0x46 (в десятичной системе 65-70) предназначены для" -" репликации. Коннекторы и клиенты не должны отправлять репликационные " -"пакеты. См. раздел о :ref:`репликации `." msgid "" -"The next two IPROTO messages are used in replication connections between " -"Tarantool nodes in :ref:`synchronous replication `. The messages " -"are not supposed to be used by any client applications in their regular " -"connections." +"Below are details on individual replication requests. For synchronous " +"replication requests, see :ref:`below `." msgstr "" -"Следующие два сообщения IPROTO используются в соединениях репликации между " -"узлами Tarantool при :ref:`синхронной репликации `. Эти сообщения" -" не должны использоваться клиентскими приложениями при обычном соединении." +#, fuzzy +msgid "Heartbeats" +msgstr "Контрольные сигналы" -msgid "IPROTO_JOIN = 0x41" +msgid "" +"Once in :ref:`replication_timeout ` " +"seconds, a master sends a :ref:`heartbeat ` message to a replica," +" and the replica sends a response. Both messages' IPROTO_REQUEST_TYPE is " +"IPROTO_OK. IPROTO_TIMESTAMP is a float-64 MP_DOUBLE 8-byte timestamp." +msgstr "" + +msgid "" +"Since version 2.11, both messages have an optional field in the body that " +"contains the :ref:`IPROTO_VCLOCK_SYNC ` key. " +"The master's heartbeat has no body if the IPROTO_VCLOCK_SYNC key is omitted." +msgstr "" + +msgid "The message from master to a replica:" +msgstr "" + +msgid "The response from the replica:" +msgstr "" + +#, fuzzy +msgid "" +"The tutorial :ref:`Understanding the binary protocol ` shows actual byte codes of the above heartbeat examples." +msgstr "" +"Далее в разделе :ref:`Примеры ` будут рассмотрены" +" байт-коды вышеприведенных сообщений контрольного сигнала." + +#, fuzzy +msgid "IPROTO_JOIN" msgstr "IPROTO_JOIN = 0x41" -msgid "First you must send an initial IPROTO_JOIN request." -msgstr "Сначала нужно отправить запрос IPROTO_JOIN." - -msgid "" -"# \n" -"msgpack(:samp:`{{MP_UINT unsigned integer = size(
) + size()}}`)\n" -"#
\n" -"msgpack({\n" -" IPROTO_REQUEST_TYPE: IPROTO_JOIN,\n" -" IPROTO_SYNC: :samp:`{{MP_UINT unsigned integer}}`\n" -"})\n" -"# \n" -"msgpack({\n" -" IPROTO_INSTANCE_UUID: :samp:`{{uuid}}`\n" -"})" -msgstr "" -"# \n" -"msgpack(:samp:`{{MP_UINT unsigned integer = size(
) + size()}}`)\n" -"#
\n" -"msgpack({\n" -" IPROTO_REQUEST_TYPE: IPROTO_JOIN,\n" -" IPROTO_SYNC: :samp:`{{MP_UINT unsigned integer}}`\n" -"})\n" -"# \n" -"msgpack({\n" -" IPROTO_INSTANCE_UUID: :samp:`{{uuid}}`\n" -"})" - -msgid "" -"Then the instance which you want to connect to will send its last SNAP file," -" by simply creating a number of INSERTs (with additional LSN and ServerID) " -"(do not reply to this). Then that instance will send a vclock's MP_MAP and " -"close a socket." -msgstr "" -"Затем экземпляр, к которому вы хотите подключиться, отправит свой последний " -"SNAP-файл, просто создав несколько запросов типа INSERT (с дополнительными " -"LSN и ServerID) (не отвечайте на них). Затем этот экземпляр отправит MP_MAP " -"vclock и закроет сокет." - -msgid "" -"# \n" -"msgpack(:samp:`{{MP_UINT unsigned integer = size(
) + size()}}`)\n" -"#
\n" -"msgpack({\n" -" Response-Code-Indicator: 0,\n" -" IPROTO_SYNC: :samp:`{{MP_UINT unsigned integer}}`\n" -"})\n" -"# \n" -"msgpack({\n" -" IPROTO_VCLOCK: :samp:`{{MP_INT SRV_ID, MP_INT SRV_LSN}}`\n" -"})" -msgstr "" -"# \n" -"msgpack(:samp:`{{MP_UINT unsigned integer = size(
) + size()}}`)\n" -"#
\n" -"msgpack({\n" -" Response-Code-Indicator: 0,\n" -" IPROTO_SYNC: :samp:`{{MP_UINT unsigned integer}}`\n" -"})\n" -"# \n" -"msgpack({\n" -" IPROTO_VCLOCK: :samp:`{{MP_INT SRV_ID, MP_INT SRV_LSN}}`\n" -"})" - -msgid "IPROTO_SUBSCRIBE = 0x42" +msgid "Code: 0x41." +msgstr "" + +msgid "" +"To join a replica set, an instance must send an initial IPROTO_JOIN request " +"to any node in the replica set:" +msgstr "" + +msgid "The node that receives the request does the following in response:" +msgstr "" + +msgid "It sends its vclock:" +msgstr "" + +msgid "" +"It sends a number of :ref:`INSERT ` requests (with " +"additional LSN and ServerID). In this way, the data is updated on the " +"instance that sent the IPROTO_JOIN request. The instance should not reply to" +" these INSERT requests." +msgstr "" + +msgid "" +"It sends the new vclock's MP_MAP in a response similar to the one above and " +"closes the socket." +msgstr "" + +#, fuzzy +msgid "IPROTO_SUBSCRIBE" msgstr "IPROTO_SUBSCRIBE = 0x42" -msgid "Then you must send an IPROTO_SUBSCRIBE request." -msgstr "Теперь нужно отправить запрос IPROTO_SUBSCRIBE." - -msgid "" -"# \n" -"msgpack(:samp:`{{MP_UINT unsigned integer = size(
) + size()}}`)\n" -"#
\n" -"msgpack({\n" -" IPROTO_REQUEST_TYPE: IPROTO_SUBSCRIBE,\n" -" IPROTO_SYNC: :samp:`{{MP_UINT unsigned integer}}`,\n" -" IPROTO_INSTANCE_UUID: :samp:`{{uuid}}`,\n" -" IPROTO_CLUSTER_UUID: :samp:`{{uuid}}`,\n" -"})\n" -"# \n" -"msgpack({\n" -" IPROTO_VCLOCK: :samp:`{{MP_INT SRV_ID, MP_INT SRV_LSN}}`\n" -"})" -msgstr "" -"# \n" -"msgpack(:samp:`{{MP_UINT unsigned integer = size(
) + size()}}`)\n" -"#
\n" -"msgpack({\n" -" IPROTO_REQUEST_TYPE: IPROTO_SUBSCRIBE,\n" -" IPROTO_SYNC: :samp:`{{MP_UINT unsigned integer}}`,\n" -" IPROTO_INSTANCE_UUID: :samp:`{{uuid}}`,\n" -" IPROTO_CLUSTER_UUID: :samp:`{{uuid}}`,\n" -"})\n" -"# \n" -"msgpack({\n" -" IPROTO_VCLOCK: :samp:`{{MP_INT SRV_ID, MP_INT SRV_LSN}}`\n" -"})" - -msgid "" -"Then you must process every request that could come through other masters. " -"Every request between masters will have additional LSN and SERVER_ID." -msgstr "" -"Затем нужно обработать каждый запрос, который может прийти через других " -"мастеров. В каждом запросе между мастерами будут дополнительные LSN и " -"SERVER_ID." - -msgid "HEARTBEATS" -msgstr "Контрольные сигналы" +msgid "Code: 0x42." +msgstr "" + +msgid "" +"If :ref:`IPROTO_JOIN ` was successful, the initiator " +"instance must send an IPROTO_SUBSCRIBE request to all the nodes listed in " +"its :ref:`box.cfg.replication `:" +msgstr "" msgid "" -"Frequently a master sends a :ref:`heartbeat ` message to a " -"replica. For example, if there is a replica with id = 2, and a timestamp " -"with a moment in 2020, a master might send this:" +"After a successful IPROTO_SUBSCRIBE request, the instance must process every" +" request that could come from other masters. Each master's request includes " +"a vclock pair corresponding to that master -- its instance ID and its LSN, " +"independent from other masters." msgstr "" -"Часто мастер отправляет реплике сообщение :ref:`контрольного сигнала " -"`. Например, если есть реплика с ID = 2 и метка с моментом " -"времени в 2020 году, мастер может послать такое сообщение:" msgid "" -"#
\n" -"msgpack({\n" -" IPROTO_REQUEST_TYPE: 0\n" -" IPROTO_REPLICA_ID: 2\n" -" IPROTO_TIMESTAMP: :samp:`{{Float 64 MP_DOUBLE 8-byte timestamp}}`\n" -"})" +"IPROTO_ID_FILTER (0x51) is an optional key used in the SUBSCRIBE request " +"followed by an array of ids of instances whose rows won't be relayed to the " +"replica. The field is encoded only when the ID list is not empty." msgstr "" -"#
\n" -"msgpack({\n" -" IPROTO_REQUEST_TYPE: 0\n" -" IPROTO_REPLICA_ID: 2\n" -" IPROTO_TIMESTAMP: :samp:`{{Float 64 MP_DOUBLE 8-byte timestamp}}`\n" -"})" -msgid "and the replica might send back this:" -msgstr "и реплика может отправить в ответ следующее:" +msgid "IPROTO_VOTE" +msgstr "" + +msgid "Code: 0x44." +msgstr "" msgid "" -"#
\n" -"msgpack({\n" -" Response-Code-Indicator: IPROTO_OK\n" -" IPROTO_REPLICA_ID: 2\n" -" IPROTO_VCLOCK: {1, 6}\n" -"})" +"When connecting for replication, an instance sends an IPROTO_VOTE request. " +"It has no body:" msgstr "" -"#
\n" -"msgpack({\n" -" Response-Code-Indicator: IPROTO_OK\n" -" IPROTO_REPLICA_ID: 2\n" -" IPROTO_VCLOCK: {1, 6}\n" -"})" msgid "" -"Later in :ref:`Binary protocol -- illustration ` " -"we will show actual byte codes of the above heartbeat examples." +"IPROTO_VOTE is critical during replica set bootstrap. The response to this " +"request is :ref:`IPROTO_BALLOT `." msgstr "" -"Далее в разделе :ref:`Примеры ` будут рассмотрены" -" байт-коды вышеприведенных сообщений контрольного сигнала." -msgid "BALLOTS" +#, fuzzy +msgid "IPROTO_BALLOT" msgstr "Сообщения с идентификатором BALLOT" +msgid "Code: 0x29." +msgstr "" + +msgid "" +"This value of IPROTO_REQUEST_TYPE indicates a message sent in response to " +":ref:`IPROTO_VOTE ` (not to be confused " +"with the key IPROTO_RAFT_VOTE)." +msgstr "" + +msgid "" +"IPROTO_BALLOT and IPROTO_VOTE are critical during replica set bootstrap. " +"IPROTO_BALLOT corresponds to a map containing the following fields:" +msgstr "" + msgid "" -"While connecting for replication, an instance sends a request with header " -"IPROTO_VOTE (0x44). The normal response is ER_OK,and IPROTO_BALLOT (0x29). " -"The fields within IPROTO_BALLOT are map items:" +"IPROTO_BALLOT_REGISTERED_REPLICA_UUIDS has the MP_ARRAY type. The array " +"contains MP_STR elements." +msgstr "" + +msgid "Synchronous" +msgstr "" + +msgid ":ref:`IPROTO_RAFT `" +msgstr "" + +msgid "0x1e" +msgstr "" + +msgid "" +"Inform that the node changed its :ref:`RAFT status `" +msgstr "" + +msgid ":ref:`IPROTO_RAFT_PROMOTE `" +msgstr "" + +msgid "0x1f" +msgstr "" + +msgid "Wait, then choose new replication leader" +msgstr "" + +msgid ":ref:`IPROTO_RAFT_DEMOTE `" +msgstr "" + +msgid "0x20" +msgstr "" + +msgid "Revoke the leader role from the instance" +msgstr "" + +msgid ":ref:`IPROTO_RAFT_CONFIRM `" +msgstr "" + +msgid "0x28" msgstr "" -"При подключении для репликации экземпляр отправляет запрос с заголовком " -"IPROTO_VOTE (0x44). Обычно ответом будет ER_OK и IPROTO_BALLOT (0x29). Поля " -"в IPROTO_BALLOT — это элементы ассоциативного массива:" msgid "" -"IPROTO_BALLOT_IS_RO_CFG (0x01) + MP_BOOL\n" -"IPROTO_BALLOT_VCLOCK (0x02) + vclock\n" -"IPROTO_BALLOT_GC_VCLOCK (0x03) + vclock\n" -"IPROTO_BALLOT_IS_RO (0x04) + MP_BOOL\n" -"IPROTO_BALLOT_IS_ANON = 0x05 + MP_BOOL\n" -"IPROTO_BALLOT_IS_BOOTED = 0x06 + MP_BOOL\n" -"IPROTO_BALLOT_CAN_LEAD = 0x07 + MP_BOOL" +"Confirm that the RAFT transactions have achieved quorum and can be committed" +msgstr "" + +msgid ":ref:`IPROTO_RAFT_ROLLBACK `" +msgstr "" + +msgid "Roll back the RAFT transactions because they haven't achieved quorum" +msgstr "" + +msgid "IPROTO_RAFT" +msgstr "" + +msgid "Code: 0x1e." msgstr "" msgid "" -"IPROTO_BALLOT_IS_RO_CFG and IPRO_BALLOT_VCLOCK and IPROTO_BALLOT_GC_VCLOCK " -"and IPROTO_BALLOT_IS_RO were added in version :doc:`2.6.1 `." -" IPROTO_BALLOT_IS_ANON was added in version :doc:`2.7.1 `. " -"IPROTO_BALLOT_IS_BOOTED was added in version 2.7.3 and 2.8.2 and 2.9.1. " -"There have been some name changes starting with version 2.7.3 and 2.8.2 and " -"2.9.1: IPROTO_BALLOT_IS_RO_CFG was formerly called IPROTO_BALLOT_IS_RO, and " -"IPROTO_BALLOT_IS_RO was formerly called IPROTO_BALLOT_IS_LOADING." +"A node broadcasts the IPROTO_RAFT request to all the replicas connected to " +"it when the RAFT state of the node changes. It can be any actions changing " +"the state, like starting a new election, bumping the term, voting for " +"another node, becoming the leader, and so on." msgstr "" -"IPROTO_BALLOT_IS_RO_CFG, IPRO_BALLOT_VCLOCK, IPROTO_BALLOT_GC_VCLOCK и " -"IPROTO_BALLOT_IS_RO добавлены в версии :doc:`2.6.1 `. " -"Константа IPROTO_BALLOT_IS_ANON добавлена в версии :doc:`2.7.1 " -"`. Константа IPROTO_BALLOT_IS_BOOTED добавлена в версиях " -"2.7.3, 2.8.2 и 2.9.1. В версиях 2.7.3, 2.8.2, 2.9.1 и более поздних " -"константа IPROTO_BALLOT_IS_RO переименована в IPROTO_BALLOT_IS_RO_CFG, а " -"IPROTO_BALLOT_IS_LOADING — в IPROTO_BALLOT_IS_RO." msgid "" -"IPROTO_BALLOT_IS_RO_CFG corresponds to :ref:`box.cfg.read_only `." +"If there should be a response, for example, in case of a vote request to " +"other nodes, the response will also be an IPROTO_RAFT message. In this case," +" the node should be connected as a replica to another node from which the " +"response is expected because the response is sent via the replication " +"channel. In other words, there should be a full-mesh connection between the " +"nodes." msgstr "" -"Значение IPROTO_BALLOT_IS_RO_CFG соответствует значению " -":ref:`box.cfg.read_only `." msgid "" -"IPROTO_BALLOT_GC_VCLOCK can be the vclock value of the instance's oldest WAL" -" entry, which corresponds to :ref:`box.info.gc().vclock `." +"IPROTO_REPLICA_ID is the ID of the replica from which the request came." +msgstr "" + +msgid "IPROTO_RAFT_PROMOTE" +msgstr "" + +msgid "Code: 0x1f." +msgstr "" + +msgid "See :ref:`box.ctl.promote() `." +msgstr "" + +msgid "In the header:" +msgstr "" + +msgid "IPROTO_REPLICA_ID is the replica ID of the node that sent the request." +msgstr "" + +msgid "" +"IPROTO_LSN is the actual LSN of the promote operation as recorded in the " +"WAL." +msgstr "" + +msgid "In the body:" msgstr "" -"IPROTO_BALLOT_GC_VCLOCK может принимать значение vclock самой старой записи " -"журнала WAL на экземпляре. Это соответствует значению " -":ref:`box.info.gc().vclock `." msgid "" -"IPROTO_BALLOT_IS_RO is true if the instance is not writable, which may " -"happen for a variety of reasons, such as: it was configured as " -":ref:`read_only `, or it has :ref:`orphan status " -"`, or it is a :ref:`Raft ` " -"follower." +"IPROTO_REPLICA_ID is the replica ID of the previous :ref:`synchronous queue " +"owner `." msgstr "" -"IPROTO_BALLOT_IS_RO принимает значение ``true``, если экземпляр недоступен " -"для записи. Причины у этого могут быть разные: например, экземпляр настроен " -"как :ref:`read_only `, :ref:`имеет статус orphan " -"` или является последователем (follower) при " -":ref:`выполнении алгоритма Raft `." msgid "" -"IPROTO_BALLOT_IS_ANON corresponds to :ref:`box.cfg.replication_anon " -"`." +"IPROTO_LSN is the LSN of the last operation on the previous synchronous " +"queue owner." msgstr "" -"Значение IPROTO_BALLOT_IS_ANON соответствует значению " -":ref:`box.cfg.replication_anon `." msgid "" -"IPROTO_BALLOT_IS_BOOTED is true if the instance has finished its bootstrap " -"or recovery process." +"IPROTO_TERM is the term in which the node that sent the request becomes the " +"synchronous queue owner. This term corresponds to the value of " +":ref:`box.info.synchro.queue.term ` on the instance." msgstr "" -"IPROTO_BALLOT_IS_BOOTED принимает значение ``true``, если экземпляр завершил" -" инициализацию или восстановление." + +msgid "IPROTO_RAFT_DEMOTE" +msgstr "" + +msgid "Code: 0x20." +msgstr "" + +msgid "See :ref:`box.ctl.demote() `." +msgstr "" + +msgid "" +"IPROTO_LSN is the actual LSN of the demote operation as recorded in the WAL." +msgstr "" + +msgid "" +"IPROTO_REPLICA_ID is the replica ID of the node that sent the request (same " +"as the value in the header)." +msgstr "" + +msgid "" +"IPROTO_LSN is the LSN of the last synchronous transaction recorded in the " +"node's WAL." +msgstr "" + +msgid "IPROTO_TERM is the term in which the queue becomes empty." +msgstr "" + +msgid "IPROTO_RAFT_CONFIRM" +msgstr "" + +msgid "Code: 0x28." +msgstr "" + +#, fuzzy +msgid "" +"This message is used in replication connections between Tarantool nodes in " +":ref:`synchronous replication `. It is not supposed to be used by" +" any client applications in their regular connections." +msgstr "" +"Следующие два сообщения IPROTO используются в соединениях репликации между " +"узлами Tarantool при :ref:`синхронной репликации `. Эти сообщения" +" не должны использоваться клиентскими приложениями при обычном соединении." msgid "" -"IPROTO_BALLOT_CAN_LEAD is true if the :ref:`election_mode ` configuration setting is either 'candidate' or 'manual', so " -"that during the :ref:`leader election process ` " -"this instance may be preferred over instances whose configuration setting is" -" 'voter'. IPROTO_BALLOT_CAN_LEAD support was added simultaneously in version" -" :doc:`2.7.3 ` and version :doc:`2.8.2 `." +"This message confirms that the transactions that originated from the " +"instance with id = IPROTO_REPLICA_ID (body) have achieved quorum and can be " +"committed, up to and including LSN = IPROTO_LSN (body)." msgstr "" -msgid "FLAGS" -msgstr "Сообщения с идентификатором FLAG" +msgid "The body is a 2-item map:" +msgstr "" msgid "" -"For replication of :doc:`synchronous transactions " -"` a header may contain a key = IPROTO_FLAGS and" -" an MP_UINT value = one or more bits: IPROTO_FLAG_COMMIT or " -"IPROTO_FLAG_WAIT_SYNC or IPROTO_FLAG_WAIT_ACK." +"IPROTO_REPLICA_ID is the ID of the replica that sends the confirm message." +msgstr "" + +msgid "IPROTO_LSN is the LSN of the confirmation action." msgstr "" -"При репликации :doc:`синхронных транзакций ` " -"заголовок может содержать ключ = IPROTO_FLAGS и значение MP_UINT = один или " -"несколько битов: IPROTO_FLAG_COMMIT, IPROTO_FLAG_WAIT_SYNC или " -"IPROTO_FLAG_WAIT_ACK." msgid "" -"# \n" -"msgpack(:samp:`{{MP_UINT unsigned integer = size(
) + size()}}`)\n" -"#
\n" -"msgpack({\n" -" # ... other header items ...,\n" -" IPROTO_FLAGS: :samp:`{{MP_UINT unsigned integer}}`\n" -"})\n" -"# \n" -"msgpack({\n" -" # ... message for a transaction ...\n" -"})" +"IPROTO_REPLICA_ID is the ID of the instance from which the transactions " +"originated." +msgstr "" + +msgid "" +"IPROTO_LSN is the LSN up to which the transactions should be confirmed." +msgstr "" + +msgid "" +"Prior to Tarantool :tarantool-release:`2.10.0`, IPROTO_RAFT_CONFIRM was " +"called IPROTO_CONFIRM." +msgstr "" + +msgid "IPROTO_RAFT_ROLLBACK" msgstr "" -"# \n" -"msgpack(:samp:`{{MP_UINT unsigned integer = size(
) + size()}}`)\n" -"#
\n" -"msgpack({\n" -" # ... другие элементы заголовка ...,\n" -" IPROTO_FLAGS: :samp:`{{MP_UINT unsigned integer}}`\n" -"})\n" -"# \n" -"msgpack({\n" -" # ... message for a transaction ...\n" -"})" msgid "" -"IPROTO_FLAG_COMMIT (0x01) will be set if this is the last message for a " -"transaction, IPROTO_FLAG_WAIT_SYNC (0x02) will be set if this is the last " -"message for a transaction which cannot be completed immediately, " -"IPROTO_FLAG_WAIT_ACK (0x04) will be set if this is the last message for a " -"synchronous transaction." +"This message says that the transactions that originated from the instance " +"with id = IPROTO_REPLICA_ID (body) couldn't achieve quorum for some reason " +"and should be rolled back, down to LSN = IPROTO_LSN (body) and including it." msgstr "" -"IPROTO_FLAG_COMMIT (0x01) указывает на последнее сообщение для транзакции. " -"IPROTO_FLAG_WAIT_SYNC (0x02) указывает на последнее сообщение для " -"транзакции, которую нельзя завершить немедленно. IPROTO_FLAG_WAIT_ACK (0x04)" -" указывает на последнее сообщение для синхронной транзакции." + +msgid "" +"IPROTO_REPLICA_ID is the ID of the replica that sends the rollback message." +msgstr "" + +msgid "IPROTO_LSN is the LSN of the rollback action." +msgstr "" + +msgid "" +"IPROTO_LSN is the LSN starting with which all pending synchronous " +"transactions should be rolled back." +msgstr "" + +msgid "" +"Prior to Tarantool :tarantool-release:`2.10.0`, IPROTO_RAFT_ROLLBACK was " +"called IPROTO_ROLLBACK." +msgstr "" + +#~ msgid "" +#~ "IPROTO_JOIN = 0x41 -- for replication\n" +#~ "IPROTO_SUBSCRIBE = 0x42 -- for replication SUBSCRIBE\n" +#~ "IPROTO_VOTE_DEPRECATED = 0x43 -- for old style vote, superseded by IPROTO_VOTE\n" +#~ "IPROTO_VOTE = 0x44 -- for master election\n" +#~ "IPROTO_FETCH_SNAPSHOT = 0x45 -- for starting anonymous replication\n" +#~ "IPROTO_REGISTER = 0x46 -- for leaving anonymous replication." +#~ msgstr "" +#~ "IPROTO_JOIN = 0x41 — для репликации\n" +#~ "IPROTO_SUBSCRIBE = 0x42 — для репликации SUBSCRIBE\n" +#~ "IPROTO_VOTE_DEPRECATED = 0x43 — для устаревшего типа голосования, взамен используется IPROTO_VOTE\n" +#~ "IPROTO_VOTE = 0x44 — для выбора мастера\n" +#~ "IPROTO_FETCH_SNAPSHOT = 0x45 — для начала анонимной репликации\n" +#~ "IPROTO_REGISTER = 0x46 — для выхода из анонимной репликации" + +#~ msgid "" +#~ "Tarantool constants 0x41 to 0x46 (decimal 65 to 70) are for replication. " +#~ "Connectors and clients do not need to send replication packets. See " +#~ ":ref:`Binary protocol -- replication `." +#~ msgstr "" +#~ "Константы Tarantool 0x41–0x46 (в десятичной системе 65-70) предназначены для" +#~ " репликации. Коннекторы и клиенты не должны отправлять репликационные " +#~ "пакеты. См. раздел о :ref:`репликации `." + +#~ msgid "First you must send an initial IPROTO_JOIN request." +#~ msgstr "Сначала нужно отправить запрос IPROTO_JOIN." + +#~ msgid "" +#~ "# \n" +#~ "msgpack(:samp:`{{MP_UINT unsigned integer = size(
) + size()}}`)\n" +#~ "#
\n" +#~ "msgpack({\n" +#~ " IPROTO_REQUEST_TYPE: IPROTO_JOIN,\n" +#~ " IPROTO_SYNC: :samp:`{{MP_UINT unsigned integer}}`\n" +#~ "})\n" +#~ "# \n" +#~ "msgpack({\n" +#~ " IPROTO_INSTANCE_UUID: :samp:`{{uuid}}`\n" +#~ "})" +#~ msgstr "" +#~ "# \n" +#~ "msgpack(:samp:`{{MP_UINT unsigned integer = size(
) + size()}}`)\n" +#~ "#
\n" +#~ "msgpack({\n" +#~ " IPROTO_REQUEST_TYPE: IPROTO_JOIN,\n" +#~ " IPROTO_SYNC: :samp:`{{MP_UINT unsigned integer}}`\n" +#~ "})\n" +#~ "# \n" +#~ "msgpack({\n" +#~ " IPROTO_INSTANCE_UUID: :samp:`{{uuid}}`\n" +#~ "})" + +#~ msgid "" +#~ "Then the instance which you want to connect to will send its last SNAP file," +#~ " by simply creating a number of INSERTs (with additional LSN and ServerID) " +#~ "(do not reply to this). Then that instance will send a vclock's MP_MAP and " +#~ "close a socket." +#~ msgstr "" +#~ "Затем экземпляр, к которому вы хотите подключиться, отправит свой последний " +#~ "SNAP-файл, просто создав несколько запросов типа INSERT (с дополнительными " +#~ "LSN и ServerID) (не отвечайте на них). Затем этот экземпляр отправит MP_MAP " +#~ "vclock и закроет сокет." + +#~ msgid "" +#~ "# \n" +#~ "msgpack(:samp:`{{MP_UINT unsigned integer = size(
) + size()}}`)\n" +#~ "#
\n" +#~ "msgpack({\n" +#~ " Response-Code-Indicator: 0,\n" +#~ " IPROTO_SYNC: :samp:`{{MP_UINT unsigned integer}}`\n" +#~ "})\n" +#~ "# \n" +#~ "msgpack({\n" +#~ " IPROTO_VCLOCK: :samp:`{{MP_INT SRV_ID, MP_INT SRV_LSN}}`\n" +#~ "})" +#~ msgstr "" +#~ "# \n" +#~ "msgpack(:samp:`{{MP_UINT unsigned integer = size(
) + size()}}`)\n" +#~ "#
\n" +#~ "msgpack({\n" +#~ " Response-Code-Indicator: 0,\n" +#~ " IPROTO_SYNC: :samp:`{{MP_UINT unsigned integer}}`\n" +#~ "})\n" +#~ "# \n" +#~ "msgpack({\n" +#~ " IPROTO_VCLOCK: :samp:`{{MP_INT SRV_ID, MP_INT SRV_LSN}}`\n" +#~ "})" + +#~ msgid "Then you must send an IPROTO_SUBSCRIBE request." +#~ msgstr "Теперь нужно отправить запрос IPROTO_SUBSCRIBE." + +#~ msgid "" +#~ "# \n" +#~ "msgpack(:samp:`{{MP_UINT unsigned integer = size(
) + size()}}`)\n" +#~ "#
\n" +#~ "msgpack({\n" +#~ " IPROTO_REQUEST_TYPE: IPROTO_SUBSCRIBE,\n" +#~ " IPROTO_SYNC: :samp:`{{MP_UINT unsigned integer}}`,\n" +#~ " IPROTO_INSTANCE_UUID: :samp:`{{uuid}}`,\n" +#~ " IPROTO_CLUSTER_UUID: :samp:`{{uuid}}`,\n" +#~ "})\n" +#~ "# \n" +#~ "msgpack({\n" +#~ " IPROTO_VCLOCK: :samp:`{{MP_INT SRV_ID, MP_INT SRV_LSN}}`\n" +#~ "})" +#~ msgstr "" +#~ "# \n" +#~ "msgpack(:samp:`{{MP_UINT unsigned integer = size(
) + size()}}`)\n" +#~ "#
\n" +#~ "msgpack({\n" +#~ " IPROTO_REQUEST_TYPE: IPROTO_SUBSCRIBE,\n" +#~ " IPROTO_SYNC: :samp:`{{MP_UINT unsigned integer}}`,\n" +#~ " IPROTO_INSTANCE_UUID: :samp:`{{uuid}}`,\n" +#~ " IPROTO_CLUSTER_UUID: :samp:`{{uuid}}`,\n" +#~ "})\n" +#~ "# \n" +#~ "msgpack({\n" +#~ " IPROTO_VCLOCK: :samp:`{{MP_INT SRV_ID, MP_INT SRV_LSN}}`\n" +#~ "})" + +#~ msgid "" +#~ "Then you must process every request that could come through other masters. " +#~ "Every request between masters will have additional LSN and SERVER_ID." +#~ msgstr "" +#~ "Затем нужно обработать каждый запрос, который может прийти через других " +#~ "мастеров. В каждом запросе между мастерами будут дополнительные LSN и " +#~ "SERVER_ID." + +#~ msgid "" +#~ "Frequently a master sends a :ref:`heartbeat ` message to a " +#~ "replica. For example, if there is a replica with id = 2, and a timestamp " +#~ "with a moment in 2020, a master might send this:" +#~ msgstr "" +#~ "Часто мастер отправляет реплике сообщение :ref:`контрольного сигнала " +#~ "`. Например, если есть реплика с ID = 2 и метка с моментом " +#~ "времени в 2020 году, мастер может послать такое сообщение:" + +#~ msgid "" +#~ "#
\n" +#~ "msgpack({\n" +#~ " IPROTO_REQUEST_TYPE: 0\n" +#~ " IPROTO_REPLICA_ID: 2\n" +#~ " IPROTO_TIMESTAMP: :samp:`{{Float 64 MP_DOUBLE 8-byte timestamp}}`\n" +#~ "})" +#~ msgstr "" +#~ "#
\n" +#~ "msgpack({\n" +#~ " IPROTO_REQUEST_TYPE: 0\n" +#~ " IPROTO_REPLICA_ID: 2\n" +#~ " IPROTO_TIMESTAMP: :samp:`{{Float 64 MP_DOUBLE 8-byte timestamp}}`\n" +#~ "})" + +#~ msgid "and the replica might send back this:" +#~ msgstr "и реплика может отправить в ответ следующее:" + +#~ msgid "" +#~ "#
\n" +#~ "msgpack({\n" +#~ " Response-Code-Indicator: IPROTO_OK\n" +#~ " IPROTO_REPLICA_ID: 2\n" +#~ " IPROTO_VCLOCK: {1, 6}\n" +#~ "})" +#~ msgstr "" +#~ "#
\n" +#~ "msgpack({\n" +#~ " Response-Code-Indicator: IPROTO_OK\n" +#~ " IPROTO_REPLICA_ID: 2\n" +#~ " IPROTO_VCLOCK: {1, 6}\n" +#~ "})" + +#~ msgid "" +#~ "While connecting for replication, an instance sends a request with header " +#~ "IPROTO_VOTE (0x44). The normal response is ER_OK,and IPROTO_BALLOT (0x29). " +#~ "The fields within IPROTO_BALLOT are map items:" +#~ msgstr "" +#~ "При подключении для репликации экземпляр отправляет запрос с заголовком " +#~ "IPROTO_VOTE (0x44). Обычно ответом будет ER_OK и IPROTO_BALLOT (0x29). Поля " +#~ "в IPROTO_BALLOT — это элементы ассоциативного массива:" + +#~ msgid "" +#~ "IPROTO_BALLOT_IS_RO_CFG (0x01) + MP_BOOL\n" +#~ "IPROTO_BALLOT_VCLOCK (0x02) + vclock\n" +#~ "IPROTO_BALLOT_GC_VCLOCK (0x03) + vclock\n" +#~ "IPROTO_BALLOT_IS_RO (0x04) + MP_BOOL\n" +#~ "IPROTO_BALLOT_IS_ANON = 0x05 + MP_BOOL\n" +#~ "IPROTO_BALLOT_IS_BOOTED = 0x06 + MP_BOOL\n" +#~ "IPROTO_BALLOT_CAN_LEAD = 0x07 + MP_BOOL" +#~ msgstr "" + +#~ msgid "" +#~ "IPROTO_BALLOT_IS_RO_CFG and IPRO_BALLOT_VCLOCK and IPROTO_BALLOT_GC_VCLOCK " +#~ "and IPROTO_BALLOT_IS_RO were added in version :doc:`2.6.1 `." +#~ " IPROTO_BALLOT_IS_ANON was added in version :doc:`2.7.1 `. " +#~ "IPROTO_BALLOT_IS_BOOTED was added in version 2.7.3 and 2.8.2 and 2.9.1. " +#~ "There have been some name changes starting with version 2.7.3 and 2.8.2 and " +#~ "2.9.1: IPROTO_BALLOT_IS_RO_CFG was formerly called IPROTO_BALLOT_IS_RO, and " +#~ "IPROTO_BALLOT_IS_RO was formerly called IPROTO_BALLOT_IS_LOADING." +#~ msgstr "" +#~ "IPROTO_BALLOT_IS_RO_CFG, IPRO_BALLOT_VCLOCK, IPROTO_BALLOT_GC_VCLOCK и " +#~ "IPROTO_BALLOT_IS_RO добавлены в версии :doc:`2.6.1 `. " +#~ "Константа IPROTO_BALLOT_IS_ANON добавлена в версии :doc:`2.7.1 " +#~ "`. Константа IPROTO_BALLOT_IS_BOOTED добавлена в версиях " +#~ "2.7.3, 2.8.2 и 2.9.1. В версиях 2.7.3, 2.8.2, 2.9.1 и более поздних " +#~ "константа IPROTO_BALLOT_IS_RO переименована в IPROTO_BALLOT_IS_RO_CFG, а " +#~ "IPROTO_BALLOT_IS_LOADING — в IPROTO_BALLOT_IS_RO." + +#~ msgid "" +#~ "IPROTO_BALLOT_IS_RO_CFG corresponds to :ref:`box.cfg.read_only `." +#~ msgstr "" +#~ "Значение IPROTO_BALLOT_IS_RO_CFG соответствует значению " +#~ ":ref:`box.cfg.read_only `." + +#~ msgid "" +#~ "IPROTO_BALLOT_GC_VCLOCK can be the vclock value of the instance's oldest WAL" +#~ " entry, which corresponds to :ref:`box.info.gc().vclock `." +#~ msgstr "" +#~ "IPROTO_BALLOT_GC_VCLOCK может принимать значение vclock самой старой записи " +#~ "журнала WAL на экземпляре. Это соответствует значению " +#~ ":ref:`box.info.gc().vclock `." + +#~ msgid "" +#~ "IPROTO_BALLOT_IS_RO is true if the instance is not writable, which may " +#~ "happen for a variety of reasons, such as: it was configured as " +#~ ":ref:`read_only `, or it has :ref:`orphan status " +#~ "`, or it is a :ref:`Raft ` " +#~ "follower." +#~ msgstr "" +#~ "IPROTO_BALLOT_IS_RO принимает значение ``true``, если экземпляр недоступен " +#~ "для записи. Причины у этого могут быть разные: например, экземпляр настроен " +#~ "как :ref:`read_only `, :ref:`имеет статус orphan " +#~ "` или является последователем (follower) при " +#~ ":ref:`выполнении алгоритма Raft `." + +#~ msgid "" +#~ "IPROTO_BALLOT_IS_BOOTED is true if the instance has finished its bootstrap " +#~ "or recovery process." +#~ msgstr "" +#~ "IPROTO_BALLOT_IS_BOOTED принимает значение ``true``, если экземпляр завершил" +#~ " инициализацию или восстановление." + +#~ msgid "" +#~ "IPROTO_BALLOT_CAN_LEAD is true if the :ref:`election_mode ` configuration setting is either 'candidate' or 'manual', so " +#~ "that during the :ref:`leader election process ` " +#~ "this instance may be preferred over instances whose configuration setting is" +#~ " 'voter'. IPROTO_BALLOT_CAN_LEAD support was added simultaneously in version" +#~ " :doc:`2.7.3 ` and version :doc:`2.8.2 `." +#~ msgstr "" + +#~ msgid "FLAGS" +#~ msgstr "Сообщения с идентификатором FLAG" + +#~ msgid "" +#~ "For replication of :doc:`synchronous transactions " +#~ "` a header may contain a key = IPROTO_FLAGS and" +#~ " an MP_UINT value = one or more bits: IPROTO_FLAG_COMMIT or " +#~ "IPROTO_FLAG_WAIT_SYNC or IPROTO_FLAG_WAIT_ACK." +#~ msgstr "" +#~ "При репликации :doc:`синхронных транзакций ` " +#~ "заголовок может содержать ключ = IPROTO_FLAGS и значение MP_UINT = один или " +#~ "несколько битов: IPROTO_FLAG_COMMIT, IPROTO_FLAG_WAIT_SYNC или " +#~ "IPROTO_FLAG_WAIT_ACK." + +#~ msgid "" +#~ "# \n" +#~ "msgpack(:samp:`{{MP_UINT unsigned integer = size(
) + size()}}`)\n" +#~ "#
\n" +#~ "msgpack({\n" +#~ " # ... other header items ...,\n" +#~ " IPROTO_FLAGS: :samp:`{{MP_UINT unsigned integer}}`\n" +#~ "})\n" +#~ "# \n" +#~ "msgpack({\n" +#~ " # ... message for a transaction ...\n" +#~ "})" +#~ msgstr "" +#~ "# \n" +#~ "msgpack(:samp:`{{MP_UINT unsigned integer = size(
) + size()}}`)\n" +#~ "#
\n" +#~ "msgpack({\n" +#~ " # ... другие элементы заголовка ...,\n" +#~ " IPROTO_FLAGS: :samp:`{{MP_UINT unsigned integer}}`\n" +#~ "})\n" +#~ "# \n" +#~ "msgpack({\n" +#~ " # ... message for a transaction ...\n" +#~ "})" + +#~ msgid "" +#~ "IPROTO_FLAG_COMMIT (0x01) will be set if this is the last message for a " +#~ "transaction, IPROTO_FLAG_WAIT_SYNC (0x02) will be set if this is the last " +#~ "message for a transaction which cannot be completed immediately, " +#~ "IPROTO_FLAG_WAIT_ACK (0x04) will be set if this is the last message for a " +#~ "synchronous transaction." +#~ msgstr "" +#~ "IPROTO_FLAG_COMMIT (0x01) указывает на последнее сообщение для транзакции. " +#~ "IPROTO_FLAG_WAIT_SYNC (0x02) указывает на последнее сообщение для " +#~ "транзакции, которую нельзя завершить немедленно. IPROTO_FLAG_WAIT_ACK (0x04)" +#~ " указывает на последнее сообщение для синхронной транзакции." diff --git a/locale/ru/LC_MESSAGES/dev_guide/internals/iproto/requests.po b/locale/ru/LC_MESSAGES/dev_guide/internals/iproto/requests.po index c716e9185b..147e2b9def 100644 --- a/locale/ru/LC_MESSAGES/dev_guide/internals/iproto/requests.po +++ b/locale/ru/LC_MESSAGES/dev_guide/internals/iproto/requests.po @@ -1,17 +1,263 @@ -msgid "Requests" -msgstr "Запросы" +msgid "Client-server requests and responses" +msgstr "" + +msgid "" +"This section describes client requests, their arguments, and the values " +"returned by the server." +msgstr "" + +msgid "" +"Some requests are described on separate pages. Those are the requests " +"related to:" +msgstr "" + +msgid ":ref:`stream transactions `" +msgstr "" + +msgid ":ref:`asynchronous server-client notifications `" +msgstr "" + +msgid ":ref:`replication `" +msgstr "" + +msgid "" +":ref:`SQL ` -- :ref:`IPROTO_EXECUTE ` and :ref:`IPROTO_PREPARE `." +msgstr "" + +msgid "Overview" +msgstr "" + +msgid "Name" +msgstr "" + +msgid "Code" +msgstr "" + +msgid "Description" +msgstr "" + +msgid ":ref:`IPROTO_OK `" +msgstr "" + +msgid "0x00 |br| MP_UINT" +msgstr "" + +msgid "Successful response" +msgstr "" + +msgid ":ref:`IPROTO_CHUNK `" +msgstr "" + +msgid "0x80 |br| MP_UINT" +msgstr "" + +msgid "Out-of-band response" +msgstr "" + +msgid ":ref:`IPROTO_TYPE_ERROR `" +msgstr "" + +msgid "0x8XXX |br| MP_INT" +msgstr "" + +msgid "Error response" +msgstr "" + +msgid ":ref:`IPROTO_UNKNOWN `" +msgstr "" + +msgid "-1 |br| MP_UINT" +msgstr "" + +msgid "An unknown request type" +msgstr "" + +msgid ":ref:`IPROTO_SELECT `" +msgstr "" + +msgid "0x01" +msgstr "" + +#, fuzzy +msgid ":ref:`Select ` request" +msgstr "См. :ref:`space_object:upsert() `." + +msgid ":ref:`IPROTO_INSERT `" +msgstr "" + +msgid "0x02" +msgstr "" + +#, fuzzy +msgid ":ref:`Insert ` request" +msgstr "См. :ref:`space_object:upsert() `." + +msgid ":ref:`IPROTO_REPLACE `" +msgstr "" + +msgid "0x03" +msgstr "" + +msgid ":ref:`Replace ` request" +msgstr "" + +#, fuzzy +msgid ":ref:`IPROTO_UPDATE `" +msgstr "См. :ref:`space_object:update() `." + +msgid "0x04" +msgstr "" + +#, fuzzy +msgid ":ref:`Update ` request" +msgstr "См. :ref:`space_object:update() `." + +#, fuzzy +msgid ":ref:`IPROTO_UPSERT `" +msgstr "См. :ref:`space_object:upsert() `." + +msgid "0x09" +msgstr "" + +#, fuzzy +msgid ":ref:`Upsert ` request" +msgstr "См. :ref:`space_object:upsert() `." + +msgid ":ref:`IPROTO_DELETE `" +msgstr "" + +msgid "0x05" +msgstr "" + +msgid ":ref:`Delete ` request" +msgstr "" + +msgid ":ref:`IPROTO_CALL `" +msgstr "" + +msgid "0x0a" +msgstr "" + +#, fuzzy +msgid "Function remote call (:ref:`conn:call() `)" +msgstr "" +"См. :ref:`conn:call() `. Тело сообщения представляет собой " +"ассоциативный массив из 2 элементов:" + +msgid ":ref:`IPROTO_AUTH `" +msgstr "" + +msgid "0x07" +msgstr "" + +msgid "Authentication request" +msgstr "" + +msgid ":ref:`IPROTO_EVAL `" +msgstr "" + +msgid "0x08" +msgstr "" + +msgid "Evaluate a Lua expression (:ref:`conn:eval() `)" +msgstr "" + +msgid ":ref:`IPROTO_NOP `" +msgstr "" + +msgid "0x0c" +msgstr "" + +msgid "Increment the LSN and do nothing else" +msgstr "" + +msgid ":ref:`IPROTO_PING `" +msgstr "" + +msgid "0x40" +msgstr "" + +msgid "Ping (:ref:`conn:ping() `)" +msgstr "" + +msgid ":ref:`IPROTO_ID `" +msgstr "" + +msgid "0x49" +msgstr "" + +msgid "Share iproto version and supported features" +msgstr "" + +#, fuzzy +msgid "IPROTO_OK" +msgstr "IPROTO_NOP = 0x0c" + +msgid "Code: 0x00." +msgstr "" + +msgid "" +"This request/response type is contained in the header and signifies success." +" Here is an example:" +msgstr "" + +msgid "IPROTO_CHUNK" +msgstr "" + +msgid "Code: 0x80." +msgstr "" + +msgid "" +"If the response is out-of-band, due to use of :ref:`box.session.push() " +"`, then IPROTO_REQUEST_TYPE is IPROTO_CHUNK instead of " +"IPROTO_OK." +msgstr "" + +msgid "IPROTO_TYPE_ERROR" +msgstr "" + +msgid "Code: 0x8XXX (see below)." +msgstr "" msgid "" -"A request has a size, a :ref:`header ` that contains " -"the IPROTO key, and a body as described here." +"Instead of :ref:`IPROTO_OK `, an error response header " +"has ``0x8XXX`` for IPROTO_REQUEST_TYPE. ``XXX`` is the error code -- a value" +" in `src/box/errcode.h " +"`_. " +"``src/box/errcode.h`` also has some convenience macros which define " +"hexadecimal constants for return codes." msgstr "" -"Запрос содержит размер, :ref:`заголовок `, который " -"содержит ключ IPROTO, и тело сообщения, как описано в этом разделе." -msgid "IPROTO_SELECT = 0x01" +msgid "" +"To learn more about error responses, check the section :ref:`Request and " +"response format `." +msgstr "" + +msgid "IPROTO_UNKNOWN" +msgstr "" + +msgid "Since :doc:`2.11.0 `." +msgstr "" + +msgid "Code: -1." +msgstr "" + +msgid "" +"An unknown request type. The constant is used to override the handler of " +"unknown IPROTO request types. Learn more: :ref:`box.iproto.override() " +"` and :ref:`box_iproto_override " +"`." +msgstr "" + +#, fuzzy +msgid "IPROTO_SELECT" msgstr "IPROTO_SELECT = 0x01" +msgid "Code: 0x01." +msgstr "" + msgid "" "See :ref:`space_object:select() `. The body is a 6-item " "map." @@ -19,41 +265,6 @@ msgstr "" "См. :ref:`space_object:select() `. Тело сообщения " "представляет собой ассоциативный массив из 6 элементов." -msgid "" -"# \n" -"msgpack(:samp:`{{MP_UINT unsigned integer = size(
) + size()}}`)\n" -"#
\n" -"msgpack({\n" -" IPROTO_REQUEST_TYPE: IPROTO_SELECT,\n" -" IPROTO_SYNC: :samp:`{{MP_UINT unsigned integer}}`\n" -"})\n" -"# \n" -"msgpack({\n" -" IPROTO_SPACE_ID: :samp:`{{MP_UINT unsigned integer}}`,\n" -" IPROTO_INDEX_ID: :samp:`{{MP_UINT unsigned integer}}`,\n" -" IPROTO_LIMIT: :samp:`{{MP_UINT unsigned integer}}`,\n" -" IPROTO_OFFSET: :samp:`{{MP_UINT unsigned integer}}`,\n" -" IPROTO_ITERATOR: :samp:`{{MP_UINT unsigned integer}}`,\n" -" IPROTO_KEY: :samp:`{{MP_ARRAY array of key values}}`\n" -"})" -msgstr "" -"# \n" -"msgpack(:samp:`{{MP_UINT unsigned integer = size(
) + size()}}`)\n" -"#
\n" -"msgpack({\n" -" IPROTO_REQUEST_TYPE: IPROTO_SELECT,\n" -" IPROTO_SYNC: :samp:`{{MP_UINT unsigned integer}}`\n" -"})\n" -"# \n" -"msgpack({\n" -" IPROTO_SPACE_ID: :samp:`{{MP_UINT unsigned integer}}`,\n" -" IPROTO_INDEX_ID: :samp:`{{MP_UINT unsigned integer}}`,\n" -" IPROTO_LIMIT: :samp:`{{MP_UINT unsigned integer}}`,\n" -" IPROTO_OFFSET: :samp:`{{MP_UINT unsigned integer}}`,\n" -" IPROTO_ITERATOR: :samp:`{{MP_UINT unsigned integer}}`,\n" -" IPROTO_KEY: :samp:`{{MP_ARRAY array of key values}}`\n" -"})" - msgid "Example" msgstr "Пример" @@ -67,50 +278,19 @@ msgstr "" " вызовет следующий пакет запроса:" msgid "" -"\n" -"msgpack(21)\n" -"#
\n" -"msgpack({\n" -" IPROTO_SYNC: 5,\n" -" IPROTO_REQUEST_TYPE: IPROTO_SELECT\n" -"})\n" -"# \n" -"msgpack({\n" -" IPROTO_SPACE_ID: 512,\n" -" IPROTO_INDEX_ID: 0,\n" -" IPROTO_ITERATOR: 6,\n" -" IPROTO_OFFSET: 1,\n" -" IPROTO_LIMIT: 2,\n" -" IPROTO_KEY: [1]\n" -"})" -msgstr "" -"\n" -"msgpack(21)\n" -"#
\n" -"msgpack({\n" -" IPROTO_SYNC: 5,\n" -" IPROTO_REQUEST_TYPE: IPROTO_SELECT\n" -"})\n" -"# \n" -"msgpack({\n" -" IPROTO_SPACE_ID: 512,\n" -" IPROTO_INDEX_ID: 0,\n" -" IPROTO_ITERATOR: 6,\n" -" IPROTO_OFFSET: 1,\n" -" IPROTO_LIMIT: 2,\n" -" IPROTO_KEY: [1]\n" -"})" - -msgid "" -"In the :ref:`examples `, " -"you can find actual byte codes of an IPROTO_SELECT message." -msgstr "" -"Байт-коды сообщения IPROTO_SELECT рассмотрены в разделе :ref:`Примеры `. - - -msgid "IPROTO_INSERT = 0x02" +"In the :ref:`examples `, you can find actual byte" +" codes of an IPROTO_SELECT message." +msgstr "" +"Байт-коды сообщения IPROTO_SELECT рассмотрены в разделе :ref:`Примеры " +"`" + +#, fuzzy +msgid "IPROTO_INSERT" msgstr "IPROTO_INSERT = 0x02" +msgid "Code: 0x02." +msgstr "" + msgid "" "See :ref:`space_object:insert() `. The body is a 2-item " "map:" @@ -119,69 +299,38 @@ msgstr "" "представляет собой ассоциативный массив из 2 элементов:" msgid "" -"# \n" -"msgpack(:samp:`{{MP_UINT unsigned integer = size(
) + size()}}`)\n" -"#
\n" -"msgpack({\n" -" IPROTO_REQUEST_TYPE: IPROTO_INSERT,\n" -" IPROTO_SYNC: :samp:`{{MP_UINT unsigned integer}}`\n" -"})\n" -"# \n" -"msgpack({\n" -" IPROTO_SPACE_ID: :samp:`{{MP_UINT unsigned integer}}`,\n" -" IPROTO_TUPLE: :samp:`{{MP_ARRAY array of field values}}`\n" -"})" -msgstr "" -"# \n" -"msgpack(:samp:`{{MP_UINT unsigned integer = size(
) + size()}}`)\n" -"#
\n" -"msgpack({\n" -" IPROTO_REQUEST_TYPE: IPROTO_INSERT,\n" -" IPROTO_SYNC: :samp:`{{MP_UINT unsigned integer}}`\n" -"})\n" -"# \n" -"msgpack({\n" -" IPROTO_SPACE_ID: :samp:`{{MP_UINT unsigned integer}}`,\n" -" IPROTO_TUPLE: :samp:`{{MP_ARRAY array of field values}}`\n" -"})" +"For example, if the request is :samp:`INSERT INTO {table-name} VALUES (1), " +"(2), (3)`, then the response body contains an :samp:`IPROTO_SQL_INFO` map " +"with :samp:`SQL_INFO_ROW_COUNT = 3`. :samp:`SQL_INFO_ROW_COUNT` can be 0 for" +" statements that do not change rows, but can be 1 for statements that create" +" new objects." +msgstr "" msgid "" "If the ID of ``tspace`` is 512 and this is the fifth message, |br| " -":samp:`{conn}.`:code:`space.tspace:insert{1, 'AAA'}` will produce the following request and response packets:" +":samp:`{conn}.`:code:`space.tspace:insert{1, 'AAA'}` will produce the " +"following request and response packets:" msgstr "" "Если ID спейса ``tspace`` = 512 и это пятое сообщение, |br| " -":samp:`{conn}.`:code:`space.tspace:insert{1, 'AAA'}` вызовет следующие пакеты запроса и ответа:" - -msgid "" -"# \n" -"msgpack(17)\n" -"#
\n" -"msgpack({\n" -" IPROTO_REQUEST_TYPE: IPROTO_INSERT,\n" -" IPROTO_SYNC: 5\n" -"})\n" -"# \n" -"msgpack({\n" -" IPROTO_SPACE_ID: 512,\n" -" IPROTO_TUPLE: [1, 'AAA']\n" -"})" -msgstr "" -"# \n" -"msgpack(17)\n" -"#
\n" -"msgpack({\n" -" IPROTO_REQUEST_TYPE: IPROTO_INSERT,\n" -" IPROTO_SYNC: 5\n" -"})\n" -"# \n" -"msgpack({\n" -" IPROTO_SPACE_ID: 512,\n" -" IPROTO_TUPLE: [1, 'AAA']\n" -"})" - -msgid "IPROTO_REPLACE = 0x03" +":samp:`{conn}.`:code:`space.tspace:insert{1, 'AAA'}` вызовет следующие " +"пакеты запроса и ответа:" + +#, fuzzy +msgid "" +"The tutorial :ref:`Understanding the binary protocol ` shows actual byte codes of the response to the IPROTO_INSERT " +"message." +msgstr "" +"Далее в разделе :ref:`Примеры ` будут рассмотрены" +" байт-коды сообщения IPROTO_EXECUTE." + +#, fuzzy +msgid "IPROTO_REPLACE" msgstr "IPROTO_REPLACE = 0x03" +msgid "Code: 0x03." +msgstr "" + msgid "" "See :ref:`space_object:replace() `. The body is a 2-item" " map, the same as for IPROTO_INSERT:" @@ -190,36 +339,13 @@ msgstr "" "представляет собой ассоциативный массив из 2 элементов, как и в случае " "IPROTO_INSERT:" -msgid "" -"# \n" -"msgpack(:samp:`{{MP_UINT unsigned integer = size(
) + size()}}`)\n" -"#
\n" -"msgpack({\n" -" IPROTO_REQUEST_TYPE: IPROTO_REPLACE,\n" -" IPROTO_SYNC: :samp:`{{MP_UINT unsigned integer}}`\n" -"})\n" -"# \n" -"msgpack({\n" -" IPROTO_SPACE_ID: :samp:`{{MP_UINT unsigned integer}}`,\n" -" IPROTO_TUPLE: :samp:`{{MP_ARRAY array of field values}}`\n" -"})" -msgstr "" -"# \n" -"msgpack(:samp:`{{MP_UINT unsigned integer = size(
) + size()}}`)\n" -"#
\n" -"msgpack({\n" -" IPROTO_REQUEST_TYPE: IPROTO_REPLACE,\n" -" IPROTO_SYNC: :samp:`{{MP_UINT unsigned integer}}`\n" -"})\n" -"# \n" -"msgpack({\n" -" IPROTO_SPACE_ID: :samp:`{{MP_UINT unsigned integer}}`,\n" -" IPROTO_TUPLE: :samp:`{{MP_ARRAY array of field values}}`\n" -"})" - -msgid "IPROTO_UPDATE = 0x04" +#, fuzzy +msgid "IPROTO_UPDATE" msgstr "IPROTO_UPDATE = 0x04" +msgid "Code: 0x04." +msgstr "" + msgid "See :ref:`space_object:update() `." msgstr "См. :ref:`space_object:update() `." @@ -228,317 +354,93 @@ msgstr "" "Тело сообщения обычно представляет собой ассоциативный массив из 4 " "элементов:" +#, fuzzy +msgid "Examples" +msgstr "Пример" + +msgid "" +"If the operation specifies no values, then IPROTO_TUPLE is a 2-item array:" +msgstr "" + +msgid "Normally field numbers start with 1." +msgstr "" + msgid "" -"# \n" -"msgpack(:samp:`{{MP_UINT unsigned integer = size(
) + size()}}`)\n" -"#
\n" -"msgpack({\n" -" IPROTO_REQUEST_TYPE: IPROTO_UPDATE,\n" -" IPROTO_SYNC: :samp:`{{MP_UINT unsigned integer}}`\n" -"})\n" -"# \n" -"msgpack({\n" -" IPROTO_SPACE_ID: :samp:`{{MP_UINT unsigned integer}}`,\n" -" IPROTO_INDEX_ID: :samp:`{{MP_UINT unsigned integer}}`,\n" -" IPROTO_KEY: :samp:`{{MP_ARRAY array of index keys}}`,\n" -" IPROTO_TUPLE: :samp:`{{MP_ARRAY array of update operations}}`\n" -"})" -msgstr "" -"# \n" -"msgpack(:samp:`{{MP_UINT unsigned integer = size(
) + size()}}`)\n" -"#
\n" -"msgpack({\n" -" IPROTO_REQUEST_TYPE: IPROTO_UPDATE,\n" -" IPROTO_SYNC: :samp:`{{MP_UINT unsigned integer}}`\n" -"})\n" -"# \n" -"msgpack({\n" -" IPROTO_SPACE_ID: :samp:`{{MP_UINT unsigned integer}}`,\n" -" IPROTO_INDEX_ID: :samp:`{{MP_UINT unsigned integer}}`,\n" -" IPROTO_KEY: :samp:`{{MP_ARRAY array of index keys}}`,\n" -" IPROTO_TUPLE: :samp:`{{MP_ARRAY array of update operations}}`\n" -"})" - -msgid "" -"If the operation specifies no values, then IPROTO_TUPLE is a 2-item array: " -"|br| :samp:`[{MP_STR OPERATOR = '#', {MP_INT FIELD_NO = field number " -"starting with 1}]`. Normally field numbers start with 1." -msgstr "" -"Если в операции не указаны значения, то IPROTO_TUPLE — это массив из 2 " -"элементов: |br| :samp:`[{MP_STR OPERATOR = '#', {MP_INT FIELD_NO = номер " -"поля, начиная с 1}]`. Обычно номера полей начинаются с 1." - -msgid "" -"If the operation specifies one value, then IPROTO_TUPLE is a 3-item array: " -"|br| :samp:`[{MP_STR string OPERATOR = '+' or '-' or '^' or '^' or '|' or " -"'!' or '='}, {MP_INT FIELD_NO}, {MP_OBJECT VALUE}]`. |br|" -msgstr "" -"Если в операции задано одно значение, то IPROTO_TUPLE — это массив из трех " -"элементов: |br| :samp:`[{MP_STR string OPERATOR = '+' or '-' or '^' or '^' " -"or '|' or '!' or '='}, {MP_INT FIELD_NO}, {MP_OBJECT VALUE}]`. |br|" - -msgid "" -"Otherwise IPROTO_TUPLE is a 5-item array: |br| :samp:`[{MP_STR string " -"OPERATOR = ':'}, {MP_INT integer FIELD_NO}, {MP_INT POSITION}, {MP_INT " -"OFFSET}, {MP_STR VALUE}]`. |br|" -msgstr "" -"В остальных случаях IPROTO_TUPLE — это массив из 5 элементов: |br| " -":samp:`[{MP_STR string OPERATOR = ':'}, {MP_INT integer FIELD_NO}, {MP_INT " -"POSITION}, {MP_INT OFFSET}, {MP_STR VALUE}]`. |br|" +"If the operation specifies one value, then IPROTO_TUPLE is a 3-item array:" +msgstr "" + +msgid "Otherwise IPROTO_TUPLE is a 5-item array:" +msgstr "" msgid "" "If the ID of ``tspace`` is 512 and this is the fifth message, |br| " -":samp:`{conn}.`:code:`space.tspace:update(999, {{'=', 2, 'B'}})` will cause the following request packet:" +":samp:`{conn}.`:code:`space.tspace:update(999, {{'=', 2, 'B'}})` will cause " +"the following request packet:" msgstr "" "Если ID спейса ``tspace`` = 512 и это пятое сообщение, |br| " -":samp:`{conn}.`:code:`space.tspace:update(999, {{'=', 2, 'B'}})` вызовет следующий пакет запроса:" - -msgid "" -"# \n" -"msgpack(17)\n" -"#
\n" -"msgpack({\n" -" IPROTO_REQUEST_TYPE: IPROTO_UPDATE,\n" -" IPROTO_SYNC: 5\n" -"})\n" -"# ... the map-item IPROTO_INDEX_BASE is optional\n" -"msgpack({\n" -" IPROTO_SPACE_ID: 512,\n" -" IPROTO_INDEX_ID: 0,\n" -" IPROTO_INDEX_BASE: 1,\n" -" IPROTO_TUPLE: [['=',2,'B']],\n" -" IPROTO_KEY: [999]\n" -"})" -msgstr "" -"# \n" -"msgpack(17)\n" -"#
\n" -"msgpack({\n" -" IPROTO_REQUEST_TYPE: IPROTO_UPDATE,\n" -" IPROTO_SYNC: 5\n" -"})\n" -"# ... the map-item IPROTO_INDEX_BASE is optional\n" -"msgpack({\n" -" IPROTO_SPACE_ID: 512,\n" -" IPROTO_INDEX_ID: 0,\n" -" IPROTO_INDEX_BASE: 1,\n" -" IPROTO_TUPLE: [['=',2,'B']],\n" -" IPROTO_KEY: [999]\n" -"})" - -msgid "" -"Later in :ref:`Binary protocol -- illustration ` " -"we will show actual byte codes of an IPROTO_UPDATE message." -msgstr "" -"Далее в разделе :ref:`Примеры ` будут рассмотрены" -" байт-коды сообщения IPROTO_UPDATE." +":samp:`{conn}.`:code:`space.tspace:update(999, {{'=', 2, 'B'}})` вызовет " +"следующий пакет запроса:" -msgid "IPROTO_DELETE = 0x05" -msgstr "IPROTO_DELETE = 0x05" +msgid "The map item IPROTO_INDEX_BASE is optional." +msgstr "" +#, fuzzy msgid "" -"See :ref:`space_object:delete() `. The body is a 3-item " -"map:" +"The tutorial :ref:`Understanding the binary protocol ` shows the actual byte codes of an IPROTO_UPDATE message." msgstr "" -"См. :ref:`space_object:delete() `. Тело сообщения " -"представляет собой ассоциативный массив из 3 элементов:" +"Далее в разделе :ref:`Примеры ` будут рассмотрены" +" байт-коды сообщения IPROTO_UPDATE." -msgid "" -"# \n" -"msgpack(:samp:`{{MP_UINT unsigned integer = size(
) + size()}}`)\n" -"#
\n" -"msgpack({\n" -" IPROTO_REQUEST_TYPE: IPROTO_DELETE,\n" -" IPROTO_SYNC: :samp:`{{MP_UINT unsigned integer}}`\n" -"})\n" -"# \n" -"msgpack({\n" -" IPROTO_SPACE_ID: :samp:`{{MP_UINT unsigned integer}}`,\n" -" IPROTO_INDEX_ID: :samp:`{{MP_UINT unsigned integer}}`,\n" -" IPROTO_KEY: :samp:`{{MP_ARRAY array of key values}}`\n" -"})" -msgstr "" -"# \n" -"msgpack(:samp:`{{MP_UINT unsigned integer = size(
) + size()}}`)\n" -"#
\n" -"msgpack({\n" -" IPROTO_REQUEST_TYPE: IPROTO_DELETE,\n" -" IPROTO_SYNC: :samp:`{{MP_UINT unsigned integer}}`\n" -"})\n" -"# \n" -"msgpack({\n" -" IPROTO_SPACE_ID: :samp:`{{MP_UINT unsigned integer}}`,\n" -" IPROTO_INDEX_ID: :samp:`{{MP_UINT unsigned integer}}`,\n" -" IPROTO_KEY: :samp:`{{MP_ARRAY array of key values}}`\n" -"})" - - -msgid "IPROTO_UPSERT = 0x09" +#, fuzzy +msgid "IPROTO_UPSERT" msgstr "IPROTO_UPSERT = 0x09" +msgid "Code: 0x09." +msgstr "" + msgid "See :ref:`space_object:upsert() `." msgstr "См. :ref:`space_object:upsert() `." +#, fuzzy msgid "" -"# \n" -"msgpack(:samp:`{{MP_UINT unsigned integer = size(
) + size()}}`)\n" -"#
\n" -"msgpack({\n" -" IPROTO_REQUEST_TYPE: IPROTO_UPSERT,\n" -" IPROTO_SYNC: :samp:`{{MP_UINT unsigned integer}}`\n" -"})\n" -"# \n" -"msgpack({\n" -" IPROTO_SPACE_ID: :samp:`{{MP_UINT unsigned integer}}`,\n" -" IPROTO_INDEX_BASE: :samp:`{{MP_UINT unsigned integer}}`,\n" -" IPROTO_OPS: :samp:`{{MP_ARRAY array of update operations}}`,\n" -" IPROTO_TUPLE: :samp:`{{MP_ARRAY array of primary-key field values}}`\n" -"})" -msgstr "" -"# \n" -"msgpack(:samp:`{{MP_UINT unsigned integer = size(
) + size()}}`)\n" -"#
\n" -"msgpack({\n" -" IPROTO_REQUEST_TYPE: IPROTO_UPSERT,\n" -" IPROTO_SYNC: :samp:`{{MP_UINT unsigned integer}}`\n" -"})\n" -"# \n" -"msgpack({\n" -" IPROTO_SPACE_ID: :samp:`{{MP_UINT unsigned integer}}`,\n" -" IPROTO_INDEX_BASE: :samp:`{{MP_UINT unsigned integer}}`,\n" -" IPROTO_OPS: :samp:`{{MP_ARRAY array of update operations}}`,\n" -" IPROTO_TUPLE: :samp:`{{MP_ARRAY array of primary-key field values}}`\n" -"})" - -msgid "" -"The IPROTO_OPS is the same as the IPROTO_TUPLE of :ref:`IPROTO_UPDATE " -"`." +"IPROTO_OPS is the array of operations. It is the same as the IPROTO_TUPLE of" +" :ref:`IPROTO_UPDATE `." msgstr "" "IPROTO_OPS — это то же самое, что и IPROTO_TUPLE в :ref:`IPROTO_UPDATE " "`." +msgid "IPROTO_TUPLE is an array of primary-key field values." +msgstr "" -msgid "IPROTO_CALL = 0x0a" -msgstr "IPROTO_CALL = 0x0a" +#, fuzzy +msgid "IPROTO_DELETE" +msgstr "IPROTO_DELETE = 0x05" -msgid "See :ref:`conn:call() `. The body is a 2-item map:" +msgid "Code: 0x05." msgstr "" -"См. :ref:`conn:call() `. Тело сообщения представляет собой " -"ассоциативный массив из 2 элементов:" msgid "" -"# \n" -"msgpack(:samp:`{{MP_UINT unsigned integer = size(
) + size()}}`)\n" -"#
\n" -"msgpack({\n" -" IPROTO_REQUEST_TYPE: IPROTO_CALL,\n" -" IPROTO_SYNC: :samp:`{{MP_UINT unsigned integer}}`\n" -"})\n" -"# \n" -"msgpack({\n" -" IPROTO_FUNCTION_NAME: :samp:`{{MP_STR string}}`,\n" -" IPROTO_TUPLE: :samp:`{{MP_ARRAY array of arguments}}`\n" -"})" -msgstr "" -"# \n" -"msgpack(:samp:`{{MP_UINT unsigned integer = size(
) + size()}}`)\n" -"#
\n" -"msgpack({\n" -" IPROTO_REQUEST_TYPE: IPROTO_CALL,\n" -" IPROTO_SYNC: :samp:`{{MP_UINT unsigned integer}}`\n" -"})\n" -"# \n" -"msgpack({\n" -" IPROTO_FUNCTION_NAME: :samp:`{{MP_STR string}}`,\n" -" IPROTO_TUPLE: :samp:`{{MP_ARRAY array of arguments}}`\n" -"})" - -msgid "" -"The response will be a list of values, similar to the :ref:`IPROTO_EVAL " -"` response." +"See :ref:`space_object:delete() `. The body is a 3-item " +"map:" msgstr "" -"Вернется список значений, наподобие ответа :ref:`IPROTO_EVAL `." - +"См. :ref:`space_object:delete() `. Тело сообщения " +"представляет собой ассоциативный массив из 3 элементов:" -msgid "" -"The ```` has the details of the request or response. In a request, it " -"can also be absent or be an empty map. Both these states will be interpreted" -" equally. Responses will contain the ```` anyway even for an " -":ref:`IPROTO_PING ` request." -msgstr "" -"Тело сообщения ```` содержит детали запроса или ответа. В запросе оно " -"может отсутствовать или представлять собой пустой ассоциативный массив. И " -"то, и другое будет интерпретироваться одинаково. Ответы будут содержать " -"```` в любом случае, даже после запроса :ref:`IPROTO_PING " -"`." -" - -msgid "IPROTO_CALL_16 = 0x06" -msgstr "IPROTO_CALL_16 = 0x06" - -msgid "" -"See :ref:`conn:call() `. The suffix ``_16`` is a hint that " -"this is for the ``call()`` until Tarantool 1.6. It is deprecated. Use " -":ref:`IPROTO_CALL ` instead. The body is a 2-item map:" -msgstr "" -"См. :ref:`conn:call() `. ``_16`` в конце подсказывает, что " -"константа используется для ``call()`` до версии Tarantool 1.6. Эта константа" -" объявлена устаревшей. Вместо нее используйте :ref:`IPROTO_CALL " -"`. Тело сообщения представляет собой ассоциативный массив" -" из 2 элементов:" - -msgid "" -"# \n" -"msgpack(:samp:`{{MP_UINT unsigned integer = size(
) + size()}}`)\n" -"#
\n" -"msgpack({\n" -" IPROTO_REQUEST_TYPE: IPROTO_CALL_16,\n" -" IPROTO_SYNC: :samp:`{{MP_UINT unsigned integer}}`\n" -"})\n" -"# \n" -"msgpack({\n" -" IPROTO_FUNCTION_NAME: :samp:`{{MP_STR string}}`,\n" -" IPROTO_TUPLE: :samp:`{{MP_ARRAY array of arguments}}`\n" -"})" -msgstr "" -"# \n" -"msgpack(:samp:`{{MP_UINT unsigned integer = size(
) + size()}}`)\n" -"#
\n" -"msgpack({\n" -" IPROTO_REQUEST_TYPE: IPROTO_CALL_16,\n" -" IPROTO_SYNC: :samp:`{{MP_UINT unsigned integer}}`\n" -"})\n" -"# \n" -"msgpack({\n" -" IPROTO_FUNCTION_NAME: :samp:`{{MP_STR string}}`,\n" -" IPROTO_TUPLE: :samp:`{{MP_ARRAY array of arguments}}`\n" -"})" - -msgid "The return value is an array of tuples." -msgstr "Возвращается массив кортежей." - -msgid "IPROTO_AUTH = 0x07" -msgstr "IPROTO_AUTH = 0x07" +#, fuzzy +msgid "IPROTO_EVAL" +msgstr "IPROTO_EVAL = 0x08" -msgid "" -"See :ref:`authentication `. See the later section " -":ref:`Binary protocol -- authentication `." +msgid "Code: 0x08." msgstr "" -"См. раздел :ref:`Аутентификация ` в документации. См. " -"раздел об :ref:`аутентификации ` ниже." - -msgid "IPROTO_EVAL = 0x08" -msgstr "IPROTO_EVAL = 0x08" +#, fuzzy msgid "" "See :ref:`conn:eval() `. Since the argument is a Lua " "expression, this is Tarantool's way to handle non-binary with the binary " "protocol. Any request that does not have its own code, for example " ":samp:`box.space.{space-name}:drop()`, will be handled either with " -":ref:`IPROTO_CALL ` or IPROTO_EVAL. The " -":ref:`tarantoolctl ` administrative utility makes extensive " -"use of ``eval``. The body is a 2-item map:" +":ref:`IPROTO_CALL ` or IPROTO_EVAL." msgstr "" "См. :ref:`conn:eval() `. В качестве аргумента выступает " "выражение на Lua — так Tarantool обрабатывает небинарный код с помощью " @@ -549,244 +451,120 @@ msgstr "" " сообщения представляет собой ассоциативный массив из 2 элементов:" msgid "" -"# \n" -"msgpack(:samp:`{{MP_UINT unsigned integer = size(
) + size()}}`)\n" -"#
\n" -"msgpack({\n" -" IPROTO_REQUEST_TYPE: IPROTO_EVAL,\n" -" IPROTO_SYNC: :samp:`{{MP_UINT unsigned integer}}`\n" -"})\n" -"# \n" -"msgpack({\n" -" IPROTO_EXPR: :samp:`{{MP_STR string}}`,\n" -" IPROTO_TUPLE: :samp:`{{MP_ARRAY array of arguments}}`\n" -"})" -msgstr "" -"# \n" -"msgpack(:samp:`{{MP_UINT unsigned integer = size(
) + size()}}`)\n" -"#
\n" -"msgpack({\n" -" IPROTO_REQUEST_TYPE: IPROTO_EVAL,\n" -" IPROTO_SYNC: :samp:`{{MP_UINT unsigned integer}}`\n" -"})\n" -"# \n" -"msgpack({\n" -" IPROTO_EXPR: :samp:`{{MP_STR string}}`,\n" -" IPROTO_TUPLE: :samp:`{{MP_ARRAY array of arguments}}`\n" -"})" - -msgid "" -"If this is the fifth message, :samp:`conn:eval('return 5;')` will " -"cause:" +"The :ref:`tt ` administrative utility makes extensive use of " +"``eval``." +msgstr "" + +#, fuzzy +msgid "The body is a 2-item map:" +msgstr "" +"Тело сообщения обычно представляет собой ассоциативный массив из 4 " +"элементов:" + +msgid "" +"For :ref:`IPROTO_EVAL ` and :ref:`IPROTO_CALL " +"` the response body will usually be an array but, since " +"Lua requests can result in a wide variety of structures, bodies can have a " +"wide variety of structures." +msgstr "" + +msgid "" +"For SQL-specific responses, the body is a bit different. :ref:`Learn more " +"` about this type of packets." +msgstr "" + +msgid "" +"If this is the fifth message, :samp:`conn:eval('return 5;')` will cause:" msgstr "" "Если это пятое сообщение, :samp:`conn:eval('return 5;')` приведет к " "следующему:" -msgid "" -"# \n" -"msgpack(19)\n" -"#
\n" -"msgpack({\n" -" IPROTO_SYNC: 5\n" -" IPROTO_REQUEST_TYPE: IPROTO_EVAL\n" -"})\n" -"# \n" -"msgpack({\n" -" IPROTO_EXPR: 'return 5;',\n" -" IPROTO_TUPLE: []\n" -"})" -msgstr "" -"# \n" -"msgpack(19)\n" -"#
\n" -"msgpack({\n" -" IPROTO_SYNC: 5\n" -" IPROTO_REQUEST_TYPE: IPROTO_EVAL\n" -"})\n" -"# \n" -"msgpack({\n" -" IPROTO_EXPR: 'return 5;',\n" -" IPROTO_TUPLE: []\n" -"})" - - -msgid "IPROTO_EXECUTE = 0x0b" -msgstr "IPROTO_EXECUTE = 0x0b" - -msgid "" -"See :ref:`box.execute() `, this is only for SQL. The " -"body is a 3-item map:" -msgstr "" -"См. :ref:`box.execute() `, используется только для SQL." -" Тело сообщения представляет собой ассоциативный массив из 3 элементов:" - -msgid "" -"# \n" -"msgpack(:samp:`{{MP_UINT unsigned integer = size(
) + size()}}`)\n" -"#
\n" -"msgpack({\n" -" IPROTO_REQUEST_TYPE: IPROTO_EXECUTE,\n" -" IPROTO_SYNC: :samp:`{{MP_UINT unsigned integer}}`\n" -"})\n" -"# \n" -"msgpack({\n" -" IPROTO_STMT_ID: :samp:`{{MP_INT integer}}` or IPROTO_SQL_TEXT: :samp:`{{MP_STR string}}`,\n" -" IPROTO_SQL_BIND: :samp:`{{MP_INT integer}}`,\n" -" IPROTO_OPTIONS: :samp:`{{MP_ARRAY array}}`\n" -"})" -msgstr "" -"# \n" -"msgpack(:samp:`{{MP_UINT unsigned integer = size(
) + size()}}`)\n" -"#
\n" -"msgpack({\n" -" IPROTO_REQUEST_TYPE: IPROTO_EXECUTE,\n" -" IPROTO_SYNC: :samp:`{{MP_UINT unsigned integer}}`\n" -"})\n" -"# \n" -"msgpack({\n" -" IPROTO_STMT_ID: :samp:`{{MP_INT integer}}` или IPROTO_SQL_TEXT: :samp:`{{MP_STR string}}`,\n" -" IPROTO_SQL_BIND: :samp:`{{MP_INT integer}}`,\n" -" IPROTO_OPTIONS: :samp:`{{MP_ARRAY array}}`\n" -"})" - -msgid "" -"Use IPROTO_STMT_ID (0x43) and statement-id (MP_INT) if executing a prepared " -"statement, or use IPROTO_SQL_TEXT (0x40) and statement-text (MP_STR) if " -"executing an SQL string, then IPROTO_SQL_BIND (0x41) and array of parameter " -"values to match ? placeholders or :name placeholders, IPROTO_OPTIONS (0x2b) " -"and array of options (usually empty)." -msgstr "" -"При выполнении подготовленного оператора используйте IPROTO_STMT_ID (0x43) и" -" ID оператора (MP_INT), при работе со строками SQL — IPROTO_SQL_TEXT (0x40) " -"и текст оператора (MP_STR), а затем IPROTO_SQL_BIND (0x41) и массив значений" -" параметров для подстановочных знаков ``?`` или ``:name``, IPROTO_OPTIONS " -"(0x2b) и массив параметров (обычно пустой)." - -msgid "" -"For example, suppose we prepare a statement with two ? placeholders, and " -"execute with two parameters, thus: |br| :code:`n = conn:prepare([[VALUES (?," -" ?);]])` |br| :code:`conn:execute(n.stmt_id, {1,'a'})` |br| Then the body " -"will look like this:" -msgstr "" -"Например, предположим, что мы создаем подготовленный оператор с двумя " -"подстановочными знаками ? и выполняем его с двумя параметрами таким образом:" -" |br| :code:`n = conn:prepare([[VALUES (?, ?);]])` |br| " -":code:`conn:execute(n.stmt_id, {1,'a'})` |br| Тогда тело сообщения будет " -"выглядеть так:" - -msgid "" -"# \n" -"msgpack({\n" -" IPROTO_STMT_ID: 0xd7aa741b,\n" -" IPROTO_SQL_BIND: [1, 'a'],\n" -" IPROTO_OPTIONS: []\n" -"})" -msgstr "" -"# \n" -"msgpack({\n" -" IPROTO_STMT_ID: 0xd7aa741b,\n" -" IPROTO_SQL_BIND: [1, 'a'],\n" -" IPROTO_OPTIONS: []\n" -"})" - -msgid "" -"Later in :ref:`Binary protocol -- illustration ` " -"we will show actual byte codes of the IPROTO_EXECUTE message." +#, fuzzy +msgid "IPROTO_CALL" +msgstr "IPROTO_CALL = 0x0a" + +msgid "Code: 0x0a." msgstr "" -"Далее в разделе :ref:`Примеры ` будут рассмотрены" -" байт-коды сообщения IPROTO_EXECUTE." msgid "" -"To call a prepared statement with named parameters from a connector pass the" -" parameters within an array of maps. A client should wrap each element into " -"a map, where the key holds a name of the parameter (with a colon) and the " -"value holds an actual value. So, to bind foo and bar to 42 and 43, a client " -"should send ``IPROTO_SQL_TEXT: <...>, IPROTO_SQL_BIND: [{\"foo\": 42}, " -"{\"bar\": 43}]``." +"See :ref:`conn:call() `. This is a remote stored-procedure " +"call. :doc:`/release/1.6` and earlier made use of the IPROTO_CALL_16 request" +" (code: 0x06). It is now deprecated and superseded by IPROTO_CALL." msgstr "" -"Чтобы вызвать подготовленный оператор с именованными параметрами из " -"коннектора, передайте параметры в массиве ассоциативных массивов. Клиент " -"должен поместить каждый элемент в ассоциативный массив, где ключ содержит " -"имя параметра (с двоеточием), а значение — фактическое значение. Так, чтобы " -"связать foo и bar с 42 и 43, клиент должен отправить ``IPROTO_SQL_TEXT: " -"<...>, IPROTO_SQL_BIND: [{\"foo\": 42}, {\"bar\": 43}]``." +#, fuzzy msgid "" -"If a statement has both named and non-named parameters, wrap only named ones" -" into a map. The rest of the parameters are positional and will be " -"substituted in order." +"The body is a 2-item map. The response will be a list of values, similar to " +"the :ref:`IPROTO_EVAL ` response. The return from " +"conn:call is whatever the function returns." msgstr "" -"Если оператор содержит как именованные, так и неименованные параметры, " -"поместите в ассоциативный массив только именованные параметры. Остальные " -"параметры являются позиционными и будут подставляться по порядку." +"Вернется список значений, наподобие ответа :ref:`IPROTO_EVAL `." -msgid "IPROTO_NOP = 0x0c" -msgstr "IPROTO_NOP = 0x0c" +#, fuzzy +msgid "IPROTO_AUTH" +msgstr "IPROTO_AUTH = 0x07" + +msgid "Code: 0x07." +msgstr "" msgid "" -"There is no Lua request exactly equivalent to IPROTO_NOP. It causes the LSN " -"to be incremented. It could be sometimes used for updates where the old and " -"new values are the same, but the LSN must be increased because a data-change" -" must be recorded. The body is: nothing." +"For general information, see the :ref:`Access control ` section in the administrator's guide." msgstr "" -"Нет такого запроса на Lua, который бы соответствовал IPROTO_NOP. IPROTO_NOP " -"приводит к увеличению LSN. Иногда константу можно использовать для " -"обновления значения, когда старое и новое значения одинаковы, но LSN нужно " -"увеличить, поскольку нужно зарегистрировать изменение данных. Тело сообщения" -" пустое." +msgid "" +"For more on how authentication is handled in the binary protocol, see the " +":ref:`Authentication ` section of this " +"document." +msgstr "" +msgid "The client sends an authentication packet as an IPROTO_AUTH message:" +msgstr "" -msgid "IPROTO_PREPARE = 0x0d" -msgstr "IPROTO_PREPARE = 0x0d" +msgid "" +"IPROTO_USERNAME holds the user name. IPROTO_TUPLE must be an array of 2 " +"fields: authentication mechanism and scramble, encrypted according to the " +"specified mechanism." +msgstr "" msgid "" -"See :ref:`box.prepare `, this is only for SQL. The body" -" is a 1-item map:" +"The server instance responds to an authentication packet with a standard " +"response with 0 tuples." msgstr "" -"См. :ref:`box.prepare `, используется только для SQL. " -"Тело сообщения представляет собой ассоциативный массив из 1 элемента:" msgid "" -"# \n" -"msgpack(:samp:`{{MP_UINT unsigned integer = size(
) + size()}}`)\n" -"#
\n" -"msgpack({\n" -" IPROTO_REQUEST_TYPE: IPROTO_PREPARE,\n" -" IPROTO_SYNC: :samp:`{{MP_UINT unsigned integer}}`\n" -"})\n" -"# \n" -"msgpack({\n" -" IPROTO_STMT_ID: :samp:`{{MP_INT integer}}` or IPROTO_SQL_TEXT: :samp:`{{MP_STR string}}`\n" -"})" +"To see how Tarantool handles this, look at `net_box.c " +"`_" +" function ``netbox_encode_auth``." +msgstr "" + +#, fuzzy +msgid "IPROTO_NOP" +msgstr "IPROTO_NOP = 0x0c" + +msgid "Code: 0x0c." msgstr "" -"# \n" -"msgpack(:samp:`{{MP_UINT unsigned integer = size(
) + size()}}`)\n" -"#
\n" -"msgpack({\n" -" IPROTO_REQUEST_TYPE: IPROTO_PREPARE,\n" -" IPROTO_SYNC: :samp:`{{MP_UINT unsigned integer}}`\n" -"})\n" -"# \n" -"msgpack({\n" -" IPROTO_STMT_ID: :samp:`{{MP_INT integer}}` или IPROTO_SQL_TEXT: :samp:`{{MP_STR string}}`\n" -"})" msgid "" -"IPROTO_STMT_ID (0x43) and statement-id (MP_INT) if executing a prepared " -"statement or IPROTO_SQL_TEXT (0x40) and statement-text (string) if executing" -" an SQL string. Thus the IPROTO_PREPARE map item is the same as the first " -"item of the :ref:`IPROTO_EXECUTE ` body." +"There is no Lua request exactly equivalent to IPROTO_NOP. It causes the LSN " +"to be incremented. It could be sometimes used for updates where the old and " +"new values are the same, but the LSN must be increased because a data-change" +" must be recorded. The body is: nothing." msgstr "" -"При выполнении подготовленного оператора используйте IPROTO_STMT_ID (0x43) и" -" ID оператора (MP_INT), при работе со строками SQL --- IPROTO_SQL_TEXT " -"(0x40) и текст оператора (string). Таким образом, элемент ассоциативного " -"массива IPROTO_PREPARE — это то же самое, что и первый элемент тела " -"сообщения :ref:`IPROTO_EXECUTE `." +"Нет такого запроса на Lua, который бы соответствовал IPROTO_NOP. IPROTO_NOP " +"приводит к увеличению LSN. Иногда константу можно использовать для " +"обновления значения, когда старое и новое значения одинаковы, но LSN нужно " +"увеличить, поскольку нужно зарегистрировать изменение данных. Тело сообщения" +" пустое." -msgid "IPROTO_PING = 0x40" +#, fuzzy +msgid "IPROTO_PING" msgstr "IPROTO_PING = 0x40" +msgid "Code: 0x40." +msgstr "" + msgid "" "See :ref:`conn:ping() `. The body will be an empty map because " "IPROTO_PING in the header contains all the information that the server " @@ -796,19 +574,646 @@ msgstr "" "ассоциативный массив, потому что IPROTO_PING в заголовке содержит всю " "информацию, необходимую экземпляру сервера." +msgid "IPROTO_ID" +msgstr "" + +msgid "Code: 0x49." +msgstr "" + +msgid "" +"Clients send this message to inform the server about the protocol version " +"and features they support. Based on this information, the server can enable " +"or disable certain features in interacting with these clients." +msgstr "" + msgid "" -"# \n" -"msgpack(5)\n" -"#
\n" -"msgpack({\n" -" IPROTO_REQUEST_TYPE: IPROTO_PING,\n" -" IPROTO_SYNC: :samp:`{{MP_UINT unsigned integer}}`\n" -"})" -msgstr "" -"# \n" -"msgpack(5)\n" -"#
\n" -"msgpack({\n" -" IPROTO_REQUEST_TYPE: IPROTO_PING,\n" -" IPROTO_SYNC: :samp:`{{MP_UINT unsigned integer}}`\n" -"})" +"The response body has the same structure as the request body. It informs the" +" client about the protocol version, features supported by the server, and a " +"protocol used to generate user authentication data." +msgstr "" + +msgid "IPROTO_ID requests can be processed without authentication." +msgstr "" + +#~ msgid "Requests" +#~ msgstr "Запросы" + +#~ msgid "" +#~ "A request has a size, a :ref:`header ` that contains " +#~ "the IPROTO key, and a body as described here." +#~ msgstr "" +#~ "Запрос содержит размер, :ref:`заголовок `, который " +#~ "содержит ключ IPROTO, и тело сообщения, как описано в этом разделе." + +#~ msgid "" +#~ "# \n" +#~ "msgpack(:samp:`{{MP_UINT unsigned integer = size(
) + size()}}`)\n" +#~ "#
\n" +#~ "msgpack({\n" +#~ " IPROTO_REQUEST_TYPE: IPROTO_SELECT,\n" +#~ " IPROTO_SYNC: :samp:`{{MP_UINT unsigned integer}}`\n" +#~ "})\n" +#~ "# \n" +#~ "msgpack({\n" +#~ " IPROTO_SPACE_ID: :samp:`{{MP_UINT unsigned integer}}`,\n" +#~ " IPROTO_INDEX_ID: :samp:`{{MP_UINT unsigned integer}}`,\n" +#~ " IPROTO_LIMIT: :samp:`{{MP_UINT unsigned integer}}`,\n" +#~ " IPROTO_OFFSET: :samp:`{{MP_UINT unsigned integer}}`,\n" +#~ " IPROTO_ITERATOR: :samp:`{{MP_UINT unsigned integer}}`,\n" +#~ " IPROTO_KEY: :samp:`{{MP_ARRAY array of key values}}`\n" +#~ "})" +#~ msgstr "" +#~ "# \n" +#~ "msgpack(:samp:`{{MP_UINT unsigned integer = size(
) + size()}}`)\n" +#~ "#
\n" +#~ "msgpack({\n" +#~ " IPROTO_REQUEST_TYPE: IPROTO_SELECT,\n" +#~ " IPROTO_SYNC: :samp:`{{MP_UINT unsigned integer}}`\n" +#~ "})\n" +#~ "# \n" +#~ "msgpack({\n" +#~ " IPROTO_SPACE_ID: :samp:`{{MP_UINT unsigned integer}}`,\n" +#~ " IPROTO_INDEX_ID: :samp:`{{MP_UINT unsigned integer}}`,\n" +#~ " IPROTO_LIMIT: :samp:`{{MP_UINT unsigned integer}}`,\n" +#~ " IPROTO_OFFSET: :samp:`{{MP_UINT unsigned integer}}`,\n" +#~ " IPROTO_ITERATOR: :samp:`{{MP_UINT unsigned integer}}`,\n" +#~ " IPROTO_KEY: :samp:`{{MP_ARRAY array of key values}}`\n" +#~ "})" + +#~ msgid "" +#~ "\n" +#~ "msgpack(21)\n" +#~ "#
\n" +#~ "msgpack({\n" +#~ " IPROTO_SYNC: 5,\n" +#~ " IPROTO_REQUEST_TYPE: IPROTO_SELECT\n" +#~ "})\n" +#~ "# \n" +#~ "msgpack({\n" +#~ " IPROTO_SPACE_ID: 512,\n" +#~ " IPROTO_INDEX_ID: 0,\n" +#~ " IPROTO_ITERATOR: 6,\n" +#~ " IPROTO_OFFSET: 1,\n" +#~ " IPROTO_LIMIT: 2,\n" +#~ " IPROTO_KEY: [1]\n" +#~ "})" +#~ msgstr "" +#~ "\n" +#~ "msgpack(21)\n" +#~ "#
\n" +#~ "msgpack({\n" +#~ " IPROTO_SYNC: 5,\n" +#~ " IPROTO_REQUEST_TYPE: IPROTO_SELECT\n" +#~ "})\n" +#~ "# \n" +#~ "msgpack({\n" +#~ " IPROTO_SPACE_ID: 512,\n" +#~ " IPROTO_INDEX_ID: 0,\n" +#~ " IPROTO_ITERATOR: 6,\n" +#~ " IPROTO_OFFSET: 1,\n" +#~ " IPROTO_LIMIT: 2,\n" +#~ " IPROTO_KEY: [1]\n" +#~ "})" + +#~ msgid "" +#~ "# \n" +#~ "msgpack(:samp:`{{MP_UINT unsigned integer = size(
) + size()}}`)\n" +#~ "#
\n" +#~ "msgpack({\n" +#~ " IPROTO_REQUEST_TYPE: IPROTO_INSERT,\n" +#~ " IPROTO_SYNC: :samp:`{{MP_UINT unsigned integer}}`\n" +#~ "})\n" +#~ "# \n" +#~ "msgpack({\n" +#~ " IPROTO_SPACE_ID: :samp:`{{MP_UINT unsigned integer}}`,\n" +#~ " IPROTO_TUPLE: :samp:`{{MP_ARRAY array of field values}}`\n" +#~ "})" +#~ msgstr "" +#~ "# \n" +#~ "msgpack(:samp:`{{MP_UINT unsigned integer = size(
) + size()}}`)\n" +#~ "#
\n" +#~ "msgpack({\n" +#~ " IPROTO_REQUEST_TYPE: IPROTO_INSERT,\n" +#~ " IPROTO_SYNC: :samp:`{{MP_UINT unsigned integer}}`\n" +#~ "})\n" +#~ "# \n" +#~ "msgpack({\n" +#~ " IPROTO_SPACE_ID: :samp:`{{MP_UINT unsigned integer}}`,\n" +#~ " IPROTO_TUPLE: :samp:`{{MP_ARRAY array of field values}}`\n" +#~ "})" + +#~ msgid "" +#~ "# \n" +#~ "msgpack(17)\n" +#~ "#
\n" +#~ "msgpack({\n" +#~ " IPROTO_REQUEST_TYPE: IPROTO_INSERT,\n" +#~ " IPROTO_SYNC: 5\n" +#~ "})\n" +#~ "# \n" +#~ "msgpack({\n" +#~ " IPROTO_SPACE_ID: 512,\n" +#~ " IPROTO_TUPLE: [1, 'AAA']\n" +#~ "})" +#~ msgstr "" +#~ "# \n" +#~ "msgpack(17)\n" +#~ "#
\n" +#~ "msgpack({\n" +#~ " IPROTO_REQUEST_TYPE: IPROTO_INSERT,\n" +#~ " IPROTO_SYNC: 5\n" +#~ "})\n" +#~ "# \n" +#~ "msgpack({\n" +#~ " IPROTO_SPACE_ID: 512,\n" +#~ " IPROTO_TUPLE: [1, 'AAA']\n" +#~ "})" + +#~ msgid "" +#~ "# \n" +#~ "msgpack(:samp:`{{MP_UINT unsigned integer = size(
) + size()}}`)\n" +#~ "#
\n" +#~ "msgpack({\n" +#~ " IPROTO_REQUEST_TYPE: IPROTO_REPLACE,\n" +#~ " IPROTO_SYNC: :samp:`{{MP_UINT unsigned integer}}`\n" +#~ "})\n" +#~ "# \n" +#~ "msgpack({\n" +#~ " IPROTO_SPACE_ID: :samp:`{{MP_UINT unsigned integer}}`,\n" +#~ " IPROTO_TUPLE: :samp:`{{MP_ARRAY array of field values}}`\n" +#~ "})" +#~ msgstr "" +#~ "# \n" +#~ "msgpack(:samp:`{{MP_UINT unsigned integer = size(
) + size()}}`)\n" +#~ "#
\n" +#~ "msgpack({\n" +#~ " IPROTO_REQUEST_TYPE: IPROTO_REPLACE,\n" +#~ " IPROTO_SYNC: :samp:`{{MP_UINT unsigned integer}}`\n" +#~ "})\n" +#~ "# \n" +#~ "msgpack({\n" +#~ " IPROTO_SPACE_ID: :samp:`{{MP_UINT unsigned integer}}`,\n" +#~ " IPROTO_TUPLE: :samp:`{{MP_ARRAY array of field values}}`\n" +#~ "})" + +#~ msgid "" +#~ "# \n" +#~ "msgpack(:samp:`{{MP_UINT unsigned integer = size(
) + size()}}`)\n" +#~ "#
\n" +#~ "msgpack({\n" +#~ " IPROTO_REQUEST_TYPE: IPROTO_UPDATE,\n" +#~ " IPROTO_SYNC: :samp:`{{MP_UINT unsigned integer}}`\n" +#~ "})\n" +#~ "# \n" +#~ "msgpack({\n" +#~ " IPROTO_SPACE_ID: :samp:`{{MP_UINT unsigned integer}}`,\n" +#~ " IPROTO_INDEX_ID: :samp:`{{MP_UINT unsigned integer}}`,\n" +#~ " IPROTO_KEY: :samp:`{{MP_ARRAY array of index keys}}`,\n" +#~ " IPROTO_TUPLE: :samp:`{{MP_ARRAY array of update operations}}`\n" +#~ "})" +#~ msgstr "" +#~ "# \n" +#~ "msgpack(:samp:`{{MP_UINT unsigned integer = size(
) + size()}}`)\n" +#~ "#
\n" +#~ "msgpack({\n" +#~ " IPROTO_REQUEST_TYPE: IPROTO_UPDATE,\n" +#~ " IPROTO_SYNC: :samp:`{{MP_UINT unsigned integer}}`\n" +#~ "})\n" +#~ "# \n" +#~ "msgpack({\n" +#~ " IPROTO_SPACE_ID: :samp:`{{MP_UINT unsigned integer}}`,\n" +#~ " IPROTO_INDEX_ID: :samp:`{{MP_UINT unsigned integer}}`,\n" +#~ " IPROTO_KEY: :samp:`{{MP_ARRAY array of index keys}}`,\n" +#~ " IPROTO_TUPLE: :samp:`{{MP_ARRAY array of update operations}}`\n" +#~ "})" + +#~ msgid "" +#~ "If the operation specifies no values, then IPROTO_TUPLE is a 2-item array: " +#~ "|br| :samp:`[{MP_STR OPERATOR = '#', {MP_INT FIELD_NO = field number " +#~ "starting with 1}]`. Normally field numbers start with 1." +#~ msgstr "" +#~ "Если в операции не указаны значения, то IPROTO_TUPLE — это массив из 2 " +#~ "элементов: |br| :samp:`[{MP_STR OPERATOR = '#', {MP_INT FIELD_NO = номер " +#~ "поля, начиная с 1}]`. Обычно номера полей начинаются с 1." + +#~ msgid "" +#~ "If the operation specifies one value, then IPROTO_TUPLE is a 3-item array: " +#~ "|br| :samp:`[{MP_STR string OPERATOR = '+' or '-' or '^' or '^' or '|' or " +#~ "'!' or '='}, {MP_INT FIELD_NO}, {MP_OBJECT VALUE}]`. |br|" +#~ msgstr "" +#~ "Если в операции задано одно значение, то IPROTO_TUPLE — это массив из трех " +#~ "элементов: |br| :samp:`[{MP_STR string OPERATOR = '+' or '-' or '^' or '^' " +#~ "or '|' or '!' or '='}, {MP_INT FIELD_NO}, {MP_OBJECT VALUE}]`. |br|" + +#~ msgid "" +#~ "Otherwise IPROTO_TUPLE is a 5-item array: |br| :samp:`[{MP_STR string " +#~ "OPERATOR = ':'}, {MP_INT integer FIELD_NO}, {MP_INT POSITION}, {MP_INT " +#~ "OFFSET}, {MP_STR VALUE}]`. |br|" +#~ msgstr "" +#~ "В остальных случаях IPROTO_TUPLE — это массив из 5 элементов: |br| " +#~ ":samp:`[{MP_STR string OPERATOR = ':'}, {MP_INT integer FIELD_NO}, {MP_INT " +#~ "POSITION}, {MP_INT OFFSET}, {MP_STR VALUE}]`. |br|" + +#~ msgid "" +#~ "# \n" +#~ "msgpack(17)\n" +#~ "#
\n" +#~ "msgpack({\n" +#~ " IPROTO_REQUEST_TYPE: IPROTO_UPDATE,\n" +#~ " IPROTO_SYNC: 5\n" +#~ "})\n" +#~ "# ... the map-item IPROTO_INDEX_BASE is optional\n" +#~ "msgpack({\n" +#~ " IPROTO_SPACE_ID: 512,\n" +#~ " IPROTO_INDEX_ID: 0,\n" +#~ " IPROTO_INDEX_BASE: 1,\n" +#~ " IPROTO_TUPLE: [['=',2,'B']],\n" +#~ " IPROTO_KEY: [999]\n" +#~ "})" +#~ msgstr "" +#~ "# \n" +#~ "msgpack(17)\n" +#~ "#
\n" +#~ "msgpack({\n" +#~ " IPROTO_REQUEST_TYPE: IPROTO_UPDATE,\n" +#~ " IPROTO_SYNC: 5\n" +#~ "})\n" +#~ "# ... the map-item IPROTO_INDEX_BASE is optional\n" +#~ "msgpack({\n" +#~ " IPROTO_SPACE_ID: 512,\n" +#~ " IPROTO_INDEX_ID: 0,\n" +#~ " IPROTO_INDEX_BASE: 1,\n" +#~ " IPROTO_TUPLE: [['=',2,'B']],\n" +#~ " IPROTO_KEY: [999]\n" +#~ "})" + +#~ msgid "" +#~ "# \n" +#~ "msgpack(:samp:`{{MP_UINT unsigned integer = size(
) + size()}}`)\n" +#~ "#
\n" +#~ "msgpack({\n" +#~ " IPROTO_REQUEST_TYPE: IPROTO_DELETE,\n" +#~ " IPROTO_SYNC: :samp:`{{MP_UINT unsigned integer}}`\n" +#~ "})\n" +#~ "# \n" +#~ "msgpack({\n" +#~ " IPROTO_SPACE_ID: :samp:`{{MP_UINT unsigned integer}}`,\n" +#~ " IPROTO_INDEX_ID: :samp:`{{MP_UINT unsigned integer}}`,\n" +#~ " IPROTO_KEY: :samp:`{{MP_ARRAY array of key values}}`\n" +#~ "})" +#~ msgstr "" +#~ "# \n" +#~ "msgpack(:samp:`{{MP_UINT unsigned integer = size(
) + size()}}`)\n" +#~ "#
\n" +#~ "msgpack({\n" +#~ " IPROTO_REQUEST_TYPE: IPROTO_DELETE,\n" +#~ " IPROTO_SYNC: :samp:`{{MP_UINT unsigned integer}}`\n" +#~ "})\n" +#~ "# \n" +#~ "msgpack({\n" +#~ " IPROTO_SPACE_ID: :samp:`{{MP_UINT unsigned integer}}`,\n" +#~ " IPROTO_INDEX_ID: :samp:`{{MP_UINT unsigned integer}}`,\n" +#~ " IPROTO_KEY: :samp:`{{MP_ARRAY array of key values}}`\n" +#~ "})" + +#~ msgid "" +#~ "# \n" +#~ "msgpack(:samp:`{{MP_UINT unsigned integer = size(
) + size()}}`)\n" +#~ "#
\n" +#~ "msgpack({\n" +#~ " IPROTO_REQUEST_TYPE: IPROTO_UPSERT,\n" +#~ " IPROTO_SYNC: :samp:`{{MP_UINT unsigned integer}}`\n" +#~ "})\n" +#~ "# \n" +#~ "msgpack({\n" +#~ " IPROTO_SPACE_ID: :samp:`{{MP_UINT unsigned integer}}`,\n" +#~ " IPROTO_INDEX_BASE: :samp:`{{MP_UINT unsigned integer}}`,\n" +#~ " IPROTO_OPS: :samp:`{{MP_ARRAY array of update operations}}`,\n" +#~ " IPROTO_TUPLE: :samp:`{{MP_ARRAY array of primary-key field values}}`\n" +#~ "})" +#~ msgstr "" +#~ "# \n" +#~ "msgpack(:samp:`{{MP_UINT unsigned integer = size(
) + size()}}`)\n" +#~ "#
\n" +#~ "msgpack({\n" +#~ " IPROTO_REQUEST_TYPE: IPROTO_UPSERT,\n" +#~ " IPROTO_SYNC: :samp:`{{MP_UINT unsigned integer}}`\n" +#~ "})\n" +#~ "# \n" +#~ "msgpack({\n" +#~ " IPROTO_SPACE_ID: :samp:`{{MP_UINT unsigned integer}}`,\n" +#~ " IPROTO_INDEX_BASE: :samp:`{{MP_UINT unsigned integer}}`,\n" +#~ " IPROTO_OPS: :samp:`{{MP_ARRAY array of update operations}}`,\n" +#~ " IPROTO_TUPLE: :samp:`{{MP_ARRAY array of primary-key field values}}`\n" +#~ "})" + +#~ msgid "" +#~ "# \n" +#~ "msgpack(:samp:`{{MP_UINT unsigned integer = size(
) + size()}}`)\n" +#~ "#
\n" +#~ "msgpack({\n" +#~ " IPROTO_REQUEST_TYPE: IPROTO_CALL,\n" +#~ " IPROTO_SYNC: :samp:`{{MP_UINT unsigned integer}}`\n" +#~ "})\n" +#~ "# \n" +#~ "msgpack({\n" +#~ " IPROTO_FUNCTION_NAME: :samp:`{{MP_STR string}}`,\n" +#~ " IPROTO_TUPLE: :samp:`{{MP_ARRAY array of arguments}}`\n" +#~ "})" +#~ msgstr "" +#~ "# \n" +#~ "msgpack(:samp:`{{MP_UINT unsigned integer = size(
) + size()}}`)\n" +#~ "#
\n" +#~ "msgpack({\n" +#~ " IPROTO_REQUEST_TYPE: IPROTO_CALL,\n" +#~ " IPROTO_SYNC: :samp:`{{MP_UINT unsigned integer}}`\n" +#~ "})\n" +#~ "# \n" +#~ "msgpack({\n" +#~ " IPROTO_FUNCTION_NAME: :samp:`{{MP_STR string}}`,\n" +#~ " IPROTO_TUPLE: :samp:`{{MP_ARRAY array of arguments}}`\n" +#~ "})" + +#~ msgid "" +#~ "The ```` has the details of the request or response. In a request, it " +#~ "can also be absent or be an empty map. Both these states will be interpreted" +#~ " equally. Responses will contain the ```` anyway even for an " +#~ ":ref:`IPROTO_PING ` request." +#~ msgstr "" +#~ "Тело сообщения ```` содержит детали запроса или ответа. В запросе оно " +#~ "может отсутствовать или представлять собой пустой ассоциативный массив. И " +#~ "то, и другое будет интерпретироваться одинаково. Ответы будут содержать " +#~ "```` в любом случае, даже после запроса :ref:`IPROTO_PING " +#~ "`." + +#~ msgid "IPROTO_CALL_16 = 0x06" +#~ msgstr "IPROTO_CALL_16 = 0x06" + +#~ msgid "" +#~ "See :ref:`conn:call() `. The suffix ``_16`` is a hint that " +#~ "this is for the ``call()`` until Tarantool 1.6. It is deprecated. Use " +#~ ":ref:`IPROTO_CALL ` instead. The body is a 2-item map:" +#~ msgstr "" +#~ "См. :ref:`conn:call() `. ``_16`` в конце подсказывает, что " +#~ "константа используется для ``call()`` до версии Tarantool 1.6. Эта константа" +#~ " объявлена устаревшей. Вместо нее используйте :ref:`IPROTO_CALL " +#~ "`. Тело сообщения представляет собой ассоциативный массив" +#~ " из 2 элементов:" + +#~ msgid "" +#~ "# \n" +#~ "msgpack(:samp:`{{MP_UINT unsigned integer = size(
) + size()}}`)\n" +#~ "#
\n" +#~ "msgpack({\n" +#~ " IPROTO_REQUEST_TYPE: IPROTO_CALL_16,\n" +#~ " IPROTO_SYNC: :samp:`{{MP_UINT unsigned integer}}`\n" +#~ "})\n" +#~ "# \n" +#~ "msgpack({\n" +#~ " IPROTO_FUNCTION_NAME: :samp:`{{MP_STR string}}`,\n" +#~ " IPROTO_TUPLE: :samp:`{{MP_ARRAY array of arguments}}`\n" +#~ "})" +#~ msgstr "" +#~ "# \n" +#~ "msgpack(:samp:`{{MP_UINT unsigned integer = size(
) + size()}}`)\n" +#~ "#
\n" +#~ "msgpack({\n" +#~ " IPROTO_REQUEST_TYPE: IPROTO_CALL_16,\n" +#~ " IPROTO_SYNC: :samp:`{{MP_UINT unsigned integer}}`\n" +#~ "})\n" +#~ "# \n" +#~ "msgpack({\n" +#~ " IPROTO_FUNCTION_NAME: :samp:`{{MP_STR string}}`,\n" +#~ " IPROTO_TUPLE: :samp:`{{MP_ARRAY array of arguments}}`\n" +#~ "})" + +#~ msgid "The return value is an array of tuples." +#~ msgstr "Возвращается массив кортежей." + +#~ msgid "" +#~ "See :ref:`authentication `. See the later section " +#~ ":ref:`Binary protocol -- authentication `." +#~ msgstr "" +#~ "См. раздел :ref:`Аутентификация ` в документации. См. " +#~ "раздел об :ref:`аутентификации ` ниже." + +#~ msgid "" +#~ "# \n" +#~ "msgpack(:samp:`{{MP_UINT unsigned integer = size(
) + size()}}`)\n" +#~ "#
\n" +#~ "msgpack({\n" +#~ " IPROTO_REQUEST_TYPE: IPROTO_EVAL,\n" +#~ " IPROTO_SYNC: :samp:`{{MP_UINT unsigned integer}}`\n" +#~ "})\n" +#~ "# \n" +#~ "msgpack({\n" +#~ " IPROTO_EXPR: :samp:`{{MP_STR string}}`,\n" +#~ " IPROTO_TUPLE: :samp:`{{MP_ARRAY array of arguments}}`\n" +#~ "})" +#~ msgstr "" +#~ "# \n" +#~ "msgpack(:samp:`{{MP_UINT unsigned integer = size(
) + size()}}`)\n" +#~ "#
\n" +#~ "msgpack({\n" +#~ " IPROTO_REQUEST_TYPE: IPROTO_EVAL,\n" +#~ " IPROTO_SYNC: :samp:`{{MP_UINT unsigned integer}}`\n" +#~ "})\n" +#~ "# \n" +#~ "msgpack({\n" +#~ " IPROTO_EXPR: :samp:`{{MP_STR string}}`,\n" +#~ " IPROTO_TUPLE: :samp:`{{MP_ARRAY array of arguments}}`\n" +#~ "})" + +#~ msgid "" +#~ "# \n" +#~ "msgpack(19)\n" +#~ "#
\n" +#~ "msgpack({\n" +#~ " IPROTO_SYNC: 5\n" +#~ " IPROTO_REQUEST_TYPE: IPROTO_EVAL\n" +#~ "})\n" +#~ "# \n" +#~ "msgpack({\n" +#~ " IPROTO_EXPR: 'return 5;',\n" +#~ " IPROTO_TUPLE: []\n" +#~ "})" +#~ msgstr "" +#~ "# \n" +#~ "msgpack(19)\n" +#~ "#
\n" +#~ "msgpack({\n" +#~ " IPROTO_SYNC: 5\n" +#~ " IPROTO_REQUEST_TYPE: IPROTO_EVAL\n" +#~ "})\n" +#~ "# \n" +#~ "msgpack({\n" +#~ " IPROTO_EXPR: 'return 5;',\n" +#~ " IPROTO_TUPLE: []\n" +#~ "})" + +#~ msgid "IPROTO_EXECUTE = 0x0b" +#~ msgstr "IPROTO_EXECUTE = 0x0b" + +#~ msgid "" +#~ "See :ref:`box.execute() `, this is only for SQL. The " +#~ "body is a 3-item map:" +#~ msgstr "" +#~ "См. :ref:`box.execute() `, используется только для SQL." +#~ " Тело сообщения представляет собой ассоциативный массив из 3 элементов:" + +#~ msgid "" +#~ "# \n" +#~ "msgpack(:samp:`{{MP_UINT unsigned integer = size(
) + size()}}`)\n" +#~ "#
\n" +#~ "msgpack({\n" +#~ " IPROTO_REQUEST_TYPE: IPROTO_EXECUTE,\n" +#~ " IPROTO_SYNC: :samp:`{{MP_UINT unsigned integer}}`\n" +#~ "})\n" +#~ "# \n" +#~ "msgpack({\n" +#~ " IPROTO_STMT_ID: :samp:`{{MP_INT integer}}` or IPROTO_SQL_TEXT: :samp:`{{MP_STR string}}`,\n" +#~ " IPROTO_SQL_BIND: :samp:`{{MP_INT integer}}`,\n" +#~ " IPROTO_OPTIONS: :samp:`{{MP_ARRAY array}}`\n" +#~ "})" +#~ msgstr "" +#~ "# \n" +#~ "msgpack(:samp:`{{MP_UINT unsigned integer = size(
) + size()}}`)\n" +#~ "#
\n" +#~ "msgpack({\n" +#~ " IPROTO_REQUEST_TYPE: IPROTO_EXECUTE,\n" +#~ " IPROTO_SYNC: :samp:`{{MP_UINT unsigned integer}}`\n" +#~ "})\n" +#~ "# \n" +#~ "msgpack({\n" +#~ " IPROTO_STMT_ID: :samp:`{{MP_INT integer}}` или IPROTO_SQL_TEXT: :samp:`{{MP_STR string}}`,\n" +#~ " IPROTO_SQL_BIND: :samp:`{{MP_INT integer}}`,\n" +#~ " IPROTO_OPTIONS: :samp:`{{MP_ARRAY array}}`\n" +#~ "})" + +#~ msgid "" +#~ "Use IPROTO_STMT_ID (0x43) and statement-id (MP_INT) if executing a prepared " +#~ "statement, or use IPROTO_SQL_TEXT (0x40) and statement-text (MP_STR) if " +#~ "executing an SQL string, then IPROTO_SQL_BIND (0x41) and array of parameter " +#~ "values to match ? placeholders or :name placeholders, IPROTO_OPTIONS (0x2b) " +#~ "and array of options (usually empty)." +#~ msgstr "" +#~ "При выполнении подготовленного оператора используйте IPROTO_STMT_ID (0x43) и" +#~ " ID оператора (MP_INT), при работе со строками SQL — IPROTO_SQL_TEXT (0x40) " +#~ "и текст оператора (MP_STR), а затем IPROTO_SQL_BIND (0x41) и массив значений" +#~ " параметров для подстановочных знаков ``?`` или ``:name``, IPROTO_OPTIONS " +#~ "(0x2b) и массив параметров (обычно пустой)." + +#~ msgid "" +#~ "For example, suppose we prepare a statement with two ? placeholders, and " +#~ "execute with two parameters, thus: |br| :code:`n = conn:prepare([[VALUES (?," +#~ " ?);]])` |br| :code:`conn:execute(n.stmt_id, {1,'a'})` |br| Then the body " +#~ "will look like this:" +#~ msgstr "" +#~ "Например, предположим, что мы создаем подготовленный оператор с двумя " +#~ "подстановочными знаками ? и выполняем его с двумя параметрами таким образом:" +#~ " |br| :code:`n = conn:prepare([[VALUES (?, ?);]])` |br| " +#~ ":code:`conn:execute(n.stmt_id, {1,'a'})` |br| Тогда тело сообщения будет " +#~ "выглядеть так:" + +#~ msgid "" +#~ "# \n" +#~ "msgpack({\n" +#~ " IPROTO_STMT_ID: 0xd7aa741b,\n" +#~ " IPROTO_SQL_BIND: [1, 'a'],\n" +#~ " IPROTO_OPTIONS: []\n" +#~ "})" +#~ msgstr "" +#~ "# \n" +#~ "msgpack({\n" +#~ " IPROTO_STMT_ID: 0xd7aa741b,\n" +#~ " IPROTO_SQL_BIND: [1, 'a'],\n" +#~ " IPROTO_OPTIONS: []\n" +#~ "})" + +#~ msgid "" +#~ "To call a prepared statement with named parameters from a connector pass the" +#~ " parameters within an array of maps. A client should wrap each element into " +#~ "a map, where the key holds a name of the parameter (with a colon) and the " +#~ "value holds an actual value. So, to bind foo and bar to 42 and 43, a client " +#~ "should send ``IPROTO_SQL_TEXT: <...>, IPROTO_SQL_BIND: [{\"foo\": 42}, " +#~ "{\"bar\": 43}]``." +#~ msgstr "" +#~ "Чтобы вызвать подготовленный оператор с именованными параметрами из " +#~ "коннектора, передайте параметры в массиве ассоциативных массивов. Клиент " +#~ "должен поместить каждый элемент в ассоциативный массив, где ключ содержит " +#~ "имя параметра (с двоеточием), а значение — фактическое значение. Так, чтобы " +#~ "связать foo и bar с 42 и 43, клиент должен отправить ``IPROTO_SQL_TEXT: " +#~ "<...>, IPROTO_SQL_BIND: [{\"foo\": 42}, {\"bar\": 43}]``." + +#~ msgid "" +#~ "If a statement has both named and non-named parameters, wrap only named ones" +#~ " into a map. The rest of the parameters are positional and will be " +#~ "substituted in order." +#~ msgstr "" +#~ "Если оператор содержит как именованные, так и неименованные параметры, " +#~ "поместите в ассоциативный массив только именованные параметры. Остальные " +#~ "параметры являются позиционными и будут подставляться по порядку." + +#~ msgid "IPROTO_PREPARE = 0x0d" +#~ msgstr "IPROTO_PREPARE = 0x0d" + +#~ msgid "" +#~ "See :ref:`box.prepare `, this is only for SQL. The body" +#~ " is a 1-item map:" +#~ msgstr "" +#~ "См. :ref:`box.prepare `, используется только для SQL. " +#~ "Тело сообщения представляет собой ассоциативный массив из 1 элемента:" + +#~ msgid "" +#~ "# \n" +#~ "msgpack(:samp:`{{MP_UINT unsigned integer = size(
) + size()}}`)\n" +#~ "#
\n" +#~ "msgpack({\n" +#~ " IPROTO_REQUEST_TYPE: IPROTO_PREPARE,\n" +#~ " IPROTO_SYNC: :samp:`{{MP_UINT unsigned integer}}`\n" +#~ "})\n" +#~ "# \n" +#~ "msgpack({\n" +#~ " IPROTO_STMT_ID: :samp:`{{MP_INT integer}}` or IPROTO_SQL_TEXT: :samp:`{{MP_STR string}}`\n" +#~ "})" +#~ msgstr "" +#~ "# \n" +#~ "msgpack(:samp:`{{MP_UINT unsigned integer = size(
) + size()}}`)\n" +#~ "#
\n" +#~ "msgpack({\n" +#~ " IPROTO_REQUEST_TYPE: IPROTO_PREPARE,\n" +#~ " IPROTO_SYNC: :samp:`{{MP_UINT unsigned integer}}`\n" +#~ "})\n" +#~ "# \n" +#~ "msgpack({\n" +#~ " IPROTO_STMT_ID: :samp:`{{MP_INT integer}}` или IPROTO_SQL_TEXT: :samp:`{{MP_STR string}}`\n" +#~ "})" + +#~ msgid "" +#~ "IPROTO_STMT_ID (0x43) and statement-id (MP_INT) if executing a prepared " +#~ "statement or IPROTO_SQL_TEXT (0x40) and statement-text (string) if executing" +#~ " an SQL string. Thus the IPROTO_PREPARE map item is the same as the first " +#~ "item of the :ref:`IPROTO_EXECUTE ` body." +#~ msgstr "" +#~ "При выполнении подготовленного оператора используйте IPROTO_STMT_ID (0x43) и" +#~ " ID оператора (MP_INT), при работе со строками SQL --- IPROTO_SQL_TEXT " +#~ "(0x40) и текст оператора (string). Таким образом, элемент ассоциативного " +#~ "массива IPROTO_PREPARE — это то же самое, что и первый элемент тела " +#~ "сообщения :ref:`IPROTO_EXECUTE `." + +#~ msgid "" +#~ "# \n" +#~ "msgpack(5)\n" +#~ "#
\n" +#~ "msgpack({\n" +#~ " IPROTO_REQUEST_TYPE: IPROTO_PING,\n" +#~ " IPROTO_SYNC: :samp:`{{MP_UINT unsigned integer}}`\n" +#~ "})" +#~ msgstr "" +#~ "# \n" +#~ "msgpack(5)\n" +#~ "#
\n" +#~ "msgpack({\n" +#~ " IPROTO_REQUEST_TYPE: IPROTO_PING,\n" +#~ " IPROTO_SYNC: :samp:`{{MP_UINT unsigned integer}}`\n" +#~ "})" diff --git a/locale/ru/LC_MESSAGES/dev_guide/internals/iproto/sql.po b/locale/ru/LC_MESSAGES/dev_guide/internals/iproto/sql.po new file mode 100644 index 0000000000..de2b5de7a2 --- /dev/null +++ b/locale/ru/LC_MESSAGES/dev_guide/internals/iproto/sql.po @@ -0,0 +1,203 @@ + +msgid "SQL-specific requests and responses" +msgstr "" + +msgid "" +"Below are considered the :ref:`IPROTO_EXECUTE ` and " +":ref:`IPROTO_PREPARE ` requests, followed by a " +"description of :ref:`responses `." +msgstr "" + +msgid "Basic request description" +msgstr "" + +msgid "Name" +msgstr "" + +msgid "Code" +msgstr "" + +msgid "Description" +msgstr "" + +msgid ":ref:`IPROTO_EXECUTE `" +msgstr "" + +msgid "0x0b" +msgstr "" + +msgid "Execute an SQL statement (:ref:`box.execute() `)" +msgstr "" + +msgid ":ref:`IPROTO_PREPARE `" +msgstr "" + +msgid "0x0d" +msgstr "" + +msgid "Prepare an SQL statement (:ref:`box.prepare() `)" +msgstr "" + +msgid "IPROTO_EXECUTE" +msgstr "" + +msgid "Code: 0x0b." +msgstr "" + +msgid "The body is a 3-item map:" +msgstr "" + +msgid "" +"Use IPROTO_STMT_ID (0x43) and statement-id (MP_INT) if executing a prepared " +"statement. Use IPROTO_SQL_TEXT (0x40) and statement-text (MP_STR) if " +"executing an SQL string." +msgstr "" + +msgid "" +"IPROTO_SQL_BIND (0x41) corresponds to the array of parameter values to match" +" ? placeholders or :name placeholders." +msgstr "" + +msgid "" +"IPROTO_OPTIONS (0x2b) corresponds to the array of options. It is usually " +"empty." +msgstr "" + +msgid "Example 1" +msgstr "" + +msgid "" +"Suppose we prepare a statement with two ? placeholders, and execute with two" +" parameters, thus:" +msgstr "" + +msgid "" +"n = conn:prepare([[VALUES (?, ?);]])\n" +"conn:execute(n.stmt_id, {1,'a'})" +msgstr "" + +msgid "Then the body will look like this:" +msgstr "" + +msgid "" +"The :ref:`Understanding binary protocol ` " +"tutorial shows actual byte codes of the IPROTO_EXECUTE message." +msgstr "" + +msgid "" +"To call a prepared statement with named parameters from a connector pass the" +" parameters within an array of maps. A client should wrap each element into " +"a map, where the key holds a name of the parameter (with a colon) and the " +"value holds an actual value. So, to bind foo and bar to 42 and 43, a client " +"should send ``IPROTO_SQL_TEXT: <...>, IPROTO_SQL_BIND: [{\"foo\": 42}, " +"{\"bar\": 43}]``." +msgstr "" + +msgid "" +"If a statement has both named and non-named parameters, wrap only named ones" +" into a map. The rest of the parameters are positional and will be " +"substituted in order." +msgstr "" + +msgid "Example 2" +msgstr "" + +msgid "" +"Let's ask for full metadata and then select the two rows from a table named " +"t1 that has columns named DD and Д:" +msgstr "" + +msgid "" +"conn.space._session_settings:update('sql_full_metadata', {{'=', 'value', true}})\n" +"conn:prepare([[SELECT dd, дд AS д FROM t1;]])" +msgstr "" + +msgid "" +"In the iproto request, there would be no IPROTO_DATA and there would be two " +"additional items:" +msgstr "" + +msgid "" +"``34 00 = IPROTO_BIND_COUNT and MP_UINT = 0`` (there are no parameters to " +"bind)." +msgstr "" + +msgid "" +"``33 90 = IPROTO_BIND_METADATA and MP_ARRAY, size 0`` (there are no " +"parameters to bind)." +msgstr "" + +msgid "Here is what the request body looks like:" +msgstr "" + +msgid "IPROTO_PREPARE" +msgstr "" + +msgid "Code: 0x0d." +msgstr "" + +msgid "The body is a 1-item map:" +msgstr "" + +msgid "" +"The IPROTO_PREPARE map item is the same as the first item of the " +":ref:`IPROTO_EXECUTE ` body for an SQL string." +msgstr "" + +msgid "Responses for SQL" +msgstr "" + +msgid "" +"After the :ref:`header `, for a response to an SQL " +"statement, there will be a body that is slightly different from the body for" +" non-SQL requests/responses." +msgstr "" + +msgid "Responses to SELECT, VALUES, or PRAGMA" +msgstr "" + +msgid "" +"If the SQL statement is SELECT or VALUES or PRAGMA, the response contains:" +msgstr "" + +msgid "Example" +msgstr "" + +msgid "" +"conn.space._session_settings:update('sql_full_metadata', {{'=', 'value', true}})\n" +"conn:execute([[SELECT dd, дд AS д FROM t1;]])" +msgstr "" + +msgid "The response body might look like this:" +msgstr "" + +msgid "" +"The tutorial :ref:`Understanding the binary protocol ` shows actual byte codes of responses to the above SQL " +"messages." +msgstr "" + +msgid "Responses to other requests" +msgstr "" + +msgid "" +"If the SQL request is not SELECT or VALUES or PRAGMA, then the response body" +" contains only IPROTO_SQL_INFO (0x42). Usually IPROTO_SQL_INFO is a map with" +" only one item -- SQL_INFO_ROW_COUNT (0x00) -- which is the number of " +"changed rows." +msgstr "" + +msgid "" +"For example, if the request is :samp:`INSERT INTO {table-name} VALUES (1), " +"(2), (3)`, then the response body contains an :samp:`IPROTO_SQL_INFO` map " +"with :samp:`SQL_INFO_ROW_COUNT = 3`." +msgstr "" + +msgid "" +"The IPROTO_SQL_INFO map may contain a second item -- " +":samp:`SQL_INFO_AUTO_INCREMENT_IDS (0x01)` -- which is the new primary-key " +"value (or values) for an INSERT in a table defined with PRIMARY KEY " +"AUTOINCREMENT. In this case the MP_MAP will have two keys, and one of the " +"two keys will be 0x01: SQL_INFO_AUTO_INCREMENT_IDS, which is an array of " +"unsigned integers." +msgstr "" diff --git a/locale/ru/LC_MESSAGES/dev_guide/internals/iproto/streams.po b/locale/ru/LC_MESSAGES/dev_guide/internals/iproto/streams.po index 96ac605ec5..dd12b2a367 100644 --- a/locale/ru/LC_MESSAGES/dev_guide/internals/iproto/streams.po +++ b/locale/ru/LC_MESSAGES/dev_guide/internals/iproto/streams.po @@ -1,26 +1,32 @@ -msgid "Binary protocol -- streams" -msgstr "Бинарный протокол — стримы" +msgid "Streams" +msgstr "" + +msgid "Overview" +msgstr "" +#, fuzzy msgid "" -"The :ref:`Streams and interactive transactions ` feature, which " -"was added in Tarantool version :tarantool-release:`2.10.0`, allows two" -" things: sequential processing and interleaving." +"The :ref:`Streams and interactive transactions ` feature, which was added in Tarantool version :tarantool-" +"release:`2.10.0`, allows two things: sequential processing and interleaving." msgstr "" ":ref:`Стримы и интерактивные транзакции `, добавленные в " -"Tarantool :tarantool-release:`2.10.0`, делают возможными две " -"процедуры: последовательную обработку и чередование." +"Tarantool :tarantool-release:`2.10.0`, делают возможными две процедуры: " +"последовательную обработку и чередование." +#, fuzzy msgid "" -"Sequential processing: With streams there is a guarantee that the server " -"instance will not handle the next request in a stream until it has completed" -" the previous one." +"**Sequential processing**: With streams there is a guarantee that the server" +" instance will not handle the next request in a stream until it has " +"completed the previous one." msgstr "" "Последовательная обработка гарантирует, что экземпляр не будет обрабатывать " "следующий запрос в стриме, пока не завершит работу с предыдущим." +#, fuzzy msgid "" -"Interleaving: For example, a series of requests can include \"begin for " +"**Interleaving**: For example, a series of requests can include \"begin for " "stream #1\", \"begin for stream #2\", \"insert for stream #1\", \"insert for" " stream #2\", \"delete for stream #1\", \"commit for stream #1\", \"rollback" " for stream #2\"." @@ -31,12 +37,20 @@ msgstr "" " для стрима 2\"." msgid "" -"To make these things possible, the engine should be :ref:`vinyl ` or :ref:`memtx with mvcc `, and the" -" client is responsible for ensuring that the stream identifier, unsigned " +"To work with stream transactions using iproto, the following is required:" +msgstr "" + +msgid "" +"The engine should be :ref:`vinyl ` or :ref:`memtx with mvcc " +"`." +msgstr "" + +#, fuzzy +msgid "" +"The client is responsible for ensuring that the stream identifier, unsigned " "integer :ref:`IPROTO_STREAM_ID `, is in the " "request header. IPROTO_STREAM_ID can be any positive 64-bit number, and " -"should be unique for the connection. If IPROTO_STREAM_ID equals zero the " +"should be unique for the connection. If IPROTO_STREAM_ID equals zero, the " "server instance will ignore it." msgstr "" "Эти процедуры возможны, если используется движок :ref:`vinyl `" +msgstr "" + +msgid "0x0e" +msgstr "" + +msgid "Begin a transaction in the specified stream" +msgstr "" + +msgid ":ref:`IPROTO_COMMIT `" +msgstr "" + +msgid "0x0f" +msgstr "" + +msgid "Commit the transaction in the specified stream" +msgstr "" + +msgid ":ref:`IPROTO_ROLLBACK `" +msgstr "" + +msgid "0x10" +msgstr "" + +msgid "Rollback the transaction in the specified stream" +msgstr "" + +msgid "IPROTO_BEGIN" +msgstr "" + +msgid "Code: 0x0e." +msgstr "" + msgid "" -"For example, suppose that the client has started a stream with the " -":ref:`net.box module `" +"Begin a transaction in the specified stream. See :ref:`stream:begin() " +"`. The body is optional and can contain two items:" +msgstr "" + +msgid "" +"IPROTO_TIMEOUT is an optional timeout (in seconds). After it expires, the " +"transaction will be rolled back automatically." +msgstr "" + +msgid "IPROTO_COMMIT" +msgstr "" + +msgid "Code: 0x0f." +msgstr "" + +msgid "" +"Commit the transaction in the specified stream. See :ref:`stream:commit() " +"`." +msgstr "" + +msgid "IPROTO_ROLLBACK" +msgstr "" + +msgid "Codde: 0x10." +msgstr "" + +msgid "" +"Rollback the transaction in the specified stream. See " +":ref:`stream:rollback() `." +msgstr "" + +msgid "Example" +msgstr "" + +#, fuzzy +msgid "" +"Suppose that the client has started a stream with the :ref:`net.box module " +"`" msgstr "" "Предположим, что клиент запустил стрим с помощью :ref:`модуля " "net.box`." @@ -93,33 +188,38 @@ msgstr "" "``conn:new_stream()`` идентификатору каждого нового стрима присваивается " "уникальное значение, начиная с 1." +msgid "The client makes stream transactions by sending, in order:" +msgstr "" + msgid "" -"The client makes stream transactions by sending, in order: IPROTO_BEGIN, the" -" transaction data-change and query requests, IPROTO_COMMIT or " -"IPROTO_ROLLBACK. Each request must contain the same IPROTO_STREAM_ID value. " -"With streaming there is no need to add :ref:`IPROTO_FLAGS ` and IPROTO_FLAG_COMMIT in the header of the last request of a " -"transaction. Rollback will be automatic if disconnect occurs before commit " -"is possible." -msgstr "" -"Клиент запускает транзакцию внутри стрима, отправляя запросы в следующем " -"порядке: IPROTO_BEGIN, запросы на изменение и получение данных транзакции, " -"затем IPROTO_COMMIT или IPROTO_ROLLBACK. Каждый запрос должен содержать " -"переменную IPROTO_STREAM_ID с одним и тем же значением. Используя стримы, не" -" нужно добавлять в заголовок последнего запроса транзакции " -":ref:`IPROTO_FLAGS ` и IPROTO_FLAG_COMMIT. Если " -"транзакция прервется до того, как можно будет выполнить коммит, она будет " -"автоматически отменена." - -msgid "" -"Thus there are now multiple ways to do transactions: with net_box and " -"stream:begin() and stream:commit() or stream:rollback() which cause " -"IPROTO_BEGIN and IPROTO_COMMIT or IPROTO_ROLLBACK with the current value of " -"stream.stream_id; with :ref:`box.begin() ` and :ref:`box.commit()" -" ` or :ref:`box.rollback() `; with SQL and " -":ref:`START TRANSACTION ` and :ref:`COMMIT " -"` or :ref:`ROLLBACK `. An application can use any " -"or all of these ways." +"IPROTO_BEGIN with an optional transaction timeout in the IPROTO_TIMEOUT " +"field of the request body." +msgstr "" + +msgid "The transaction data-change and query requests." +msgstr "" + +msgid "IPROTO_COMMIT or IPROTO_ROLLBACK." +msgstr "" + +msgid "All these requests must contain the same IPROTO_STREAM_ID value." +msgstr "" + +msgid "" +"A rollback will happen automatically if a disconnect occurs or the " +"transaction timeout expires before the commit is possible." +msgstr "" + +#, fuzzy +msgid "" +"Thus there are now multiple ways to do transactions: with ``net_box`` " +"``stream:begin()`` and ``stream:commit()`` or ``stream:rollback()`` which " +"cause IPROTO_BEGIN and IPROTO_COMMIT or IPROTO_ROLLBACK with the current " +"value of stream.stream_id; with :ref:`box.begin() ` and " +":ref:`box.commit() ` or :ref:`box.rollback() `; " +"with SQL and :ref:`START TRANSACTION ` and " +":ref:`COMMIT ` or :ref:`ROLLBACK `. An application" +" can use any or all of these ways." msgstr "" "Таким образом, у приложения есть несколько способов выполнять транзакции. " "Во-первых, можно использовать модуль ``net_box`` с методами " @@ -130,3 +230,24 @@ msgstr "" "commit>`/:ref:`box.rollback() `. Наконец, можно пользоваться " "инструкциями SQL :ref:`START TRANSACTION ` и " ":ref:`COMMIT `/:ref:`ROLLBACK `." + +#~ msgid "Binary protocol -- streams" +#~ msgstr "Бинарный протокол — стримы" + +#~ msgid "" +#~ "The client makes stream transactions by sending, in order: IPROTO_BEGIN, the" +#~ " transaction data-change and query requests, IPROTO_COMMIT or " +#~ "IPROTO_ROLLBACK. Each request must contain the same IPROTO_STREAM_ID value. " +#~ "With streaming there is no need to add :ref:`IPROTO_FLAGS ` and IPROTO_FLAG_COMMIT in the header of the last request of a " +#~ "transaction. Rollback will be automatic if disconnect occurs before commit " +#~ "is possible." +#~ msgstr "" +#~ "Клиент запускает транзакцию внутри стрима, отправляя запросы в следующем " +#~ "порядке: IPROTO_BEGIN, запросы на изменение и получение данных транзакции, " +#~ "затем IPROTO_COMMIT или IPROTO_ROLLBACK. Каждый запрос должен содержать " +#~ "переменную IPROTO_STREAM_ID с одним и тем же значением. Используя стримы, не" +#~ " нужно добавлять в заголовок последнего запроса транзакции " +#~ ":ref:`IPROTO_FLAGS ` и IPROTO_FLAG_COMMIT. Если " +#~ "транзакция прервется до того, как можно будет выполнить коммит, она будет " +#~ "автоматически отменена." diff --git a/locale/ru/LC_MESSAGES/dev_guide/internals/msgpack_extensions.po b/locale/ru/LC_MESSAGES/dev_guide/internals/msgpack_extensions.po index b7709b6724..9df72da994 100644 --- a/locale/ru/LC_MESSAGES/dev_guide/internals/msgpack_extensions.po +++ b/locale/ru/LC_MESSAGES/dev_guide/internals/msgpack_extensions.po @@ -4,18 +4,18 @@ msgstr "Дополнительные типы MessagePack" msgid "" "Tarantool uses predefined MessagePack extension types to represent some of " -"the special values. Extension types include ``MP_DECIMAL``, ``MP_UUID``," -" ``MP_ERROR``, ``MP_DATETIME``, and ``MP_INTERVAL``. " -"These types require special attention from the connector " -"developers, as they must be treated separately from the default MessagePack " -"types, and correctly mapped to programming language types." +"the special values. Extension types include ``MP_DECIMAL``, ``MP_UUID``, " +"``MP_ERROR``, ``MP_DATETIME``, and ``MP_INTERVAL``. These types require " +"special attention from the connector developers, as they must be treated " +"separately from the default MessagePack types, and correctly mapped to " +"programming language types." msgstr "" "Tarantool использует предопределенные дополнительные типы MessagePack для " "представления некоторых специальных значений. Дополнительные типы включают " -"``MP_DECIMAL``, ``MP_UUID``,``MP_ERROR``, ``MP_DATETIME``, and ``MP_INTERVAL``. " -"Эти типы требуют особого внимания со стороны разработчиков коннекторов, так как должны " -"рассматриваться отдельно от типов MessagePack по умолчанию и корректно " -"приводиться к типам языков программирования." +"``MP_DECIMAL``, ``MP_UUID``,``MP_ERROR``, ``MP_DATETIME``, and " +"``MP_INTERVAL``. Эти типы требуют особого внимания со стороны разработчиков " +"коннекторов, так как должны рассматриваться отдельно от типов MessagePack по" +" умолчанию и корректно приводиться к типам языков программирования." msgid "The DECIMAL type" msgstr "Тип DECIMAL" @@ -31,8 +31,9 @@ msgid "``MP_DECIMAL`` type is 1." msgstr "MP_DECIMAL -- это 1." msgid "" -"`MessagePack specification `_" -" defines two kinds of types:" +"`MessagePack specification " +"`_ defines two kinds" +" of types:" msgstr "" "`Спецификация MessagePack " "`_ определяет два " @@ -170,10 +171,12 @@ msgstr "Тип UUID" msgid "" "The MessagePack EXT type ``MP_EXT`` together with the extension type " -"``MP_UUID`` for values of the UUID type. Since version :doc:`2.4.1 `." +"``MP_UUID`` for values of the UUID type. Since version :doc:`2.4.1 " +"`." msgstr "" "Тип MessagePack EXT ``MP_EXT`` вместе с типом расширения ``MP_UUID`` " -"является заголовком для значений типа UUID. Доступно с версии :doc:`2.4.1 `." +"является заголовком для значений типа UUID. Доступно с версии :doc:`2.4.1 " +"`." msgid "``MP_UUID`` type is 2." msgstr "MP_UUID -- это 2." @@ -196,42 +199,39 @@ msgid "" "+--------+------------+-----------------+" msgstr "" +#, fuzzy msgid "" -"The 16-byte value has 2 digits per byte. Typically, it consists of 11 fields," -" which are encoded as big-endian unsigned integers in the following order: " +"The 16-byte value has 2 digits per byte. Typically, it consists of 11 " +"fields, which are encoded as big-endian unsigned integers in the following " +"order:" msgstr "" "16-байтовое значение имеет 2 цифры на байт. Обычно оно состоит из 11 полей, " -"которые кодируются от большего к меньшему беззнаковыми целыми числами в следующем порядке:" +"которые кодируются от большего к меньшему беззнаковыми целыми числами в " +"следующем порядке:" -msgid "" -"time_low (4 bytes)" -msgstr "" -"time_low (4 байта)" +#, fuzzy +msgid "``time_low`` (4 bytes)" +msgstr "time_low (4 байта)" -msgid "" -"time_mid (2 bytes)" -msgstr "" -"time_mid (2 байта)" +#, fuzzy +msgid "``time_mid`` (2 bytes)" +msgstr "time_mid (2 байта)" -msgid "" -"time_hi_and_version (2 bytes)" -msgstr "" -"time_hi_and_version (2 байта)" +#, fuzzy +msgid "``time_hi_and_version`` (2 bytes)" +msgstr "time_hi_and_version (2 байта)" -msgid "" -"clock_seq_hi_and_reserved (1 byte)" -msgstr "" -"clock_seq_hi_and_reserved (1 байт)" +#, fuzzy +msgid "``clock_seq_hi_and_reserved`` (1 byte)" +msgstr "clock_seq_hi_and_reserved (1 байт)" -msgid "" -"clock_seq_low (1 byte)" -msgstr "" -"clock_seq_low (1 байт)" +#, fuzzy +msgid "``clock_seq_low`` (1 byte)" +msgstr "clock_seq_low (1 байт)" -msgid "" -"node[0], ..., node[5] (1 byte each)" -msgstr "" -"node[0], ..., node[5] (по 1 байту)" +#, fuzzy +msgid "``node[0]``, ..., ``node[5]`` (1 byte each)" +msgstr "node[0], ..., node[5] (по 1 байту)" msgid "" "Some of the functions in :ref:`Module uuid ` can produce values" @@ -264,8 +264,8 @@ msgid "" "enhancement, because clients that expect old-style server responses should " "ignore map components that they do not recognize. Notice, however, that " "there has been a renaming of a constant: formerly ``IPROTO_ERROR`` in " -":file:`./box/iproto_constants.h` was ``0x31``, now ``IPROTO_ERROR`` is ``0x52`` and " -"``IPROTO_ERROR_24`` is ``0x31``." +":file:`./box/iproto_constants.h` was ``0x31``, now ``IPROTO_ERROR`` is " +"``0x52`` and ``IPROTO_ERROR_24`` is ``0x31``." msgstr "" "Начиная с версии :doc:`2.4.1 `, в ответах на ошибки " "содержится дополнительная информация, соответствующая описанию в разделе " @@ -273,8 +273,8 @@ msgstr "" "Это \"совместимое\" улучшение, потому что клиенты, которые ожидают ответы " "сервера старого образца, должны игнорировать компоненты ассоциативного " "массива, которые они не распознают. Обратите внимание, что константа " -"``IPROTO_ERROR`` в :file:`./box/iproto_constants.h` была ``0x31``, а теперь ``IPROTO_ERROR`` -- " -"``0x52``, а ``IPROTO_ERROR_24`` -- ``0x31``." +"``IPROTO_ERROR`` в :file:`./box/iproto_constants.h` была ``0x31``, а теперь " +"``IPROTO_ERROR`` -- ``0x52``, а ``IPROTO_ERROR_24`` -- ``0x31``." msgid "``MP_ERROR`` type is 3." msgstr "MP_ERROR -- это 3." @@ -416,3 +416,239 @@ msgid "" " 05 MP_ERROR_ERRCODE\n" " 0a MP_UINT = eror code ER_SPACE_EXISTS" msgstr "" + +#, fuzzy +msgid "The DATETIME type" +msgstr "Тип DECIMAL" + +#, fuzzy +msgid "" +"Since version :doc:`2.10.0 `. The MessagePack EXT type " +"``MP_EXT`` together with the extension type ``MP_DATETIME`` is a header for " +"values of the DATETIME type. It creates a container with a payload of 8 or " +"16 bytes." +msgstr "" +"Тип MessagePack EXT ``MP_EXT`` вместе с типом расширения ``MP_DECIMAL`` " +"является заголовком для значений типа DECIMAL." + +#, fuzzy +msgid "``MP_DATETIME`` type is 4." +msgstr "MP_DECIMAL -- это 1." + +#, fuzzy +msgid "" +"The `MessagePack specification " +"`_ defines ``d7`` to" +" mean ``fixext`` with size 8 or ``d8`` to mean ``fixext`` with size 16." +msgstr "" +"`Спецификация MessagePack " +"`_ определяет два " +"вида типов:" + +#, fuzzy +msgid "So the datetime MessagePack representation looks like this:" +msgstr "Десятичное представление MessagePack выглядит следующим образом:" + +msgid "" +"+---------+----------------+==========+-----------------+\n" +"| MP_EXT | MP_DATETIME | seconds | nsec; tzoffset; |\n" +"| = d7/d8 | = 4 | | tzindex; |\n" +"+---------+----------------+==========+-----------------+" +msgstr "" + +#, fuzzy +msgid "MessagePack data contains:" +msgstr "Дополнительные типы MessagePack" + +msgid "" +"Seconds (8 bytes) as an unencoded 64-bit signed integer stored in the " +"little-endian order." +msgstr "" + +msgid "" +"The optional fields (8 bytes), if any of them have a non-zero value. The " +"fields include ``nsec``, ``tzoffset``, and ``tzindex`` packed in the little-" +"endian order." +msgstr "" + +msgid "" +"For more information about the datetime type, see :ref:`datetime field type " +"details ` and :doc:`reference for the datetime module " +"`." +msgstr "" + +#, fuzzy +msgid "The INTERVAL type" +msgstr "Тип DECIMAL" + +#, fuzzy +msgid "" +"Since version :doc:`2.10.0 `. The MessagePack EXT type " +"``MP_EXT`` together with the extension type ``MP_INTERVAL`` is a header for " +"values of the INTERVAL type." +msgstr "" +"Тип MessagePack EXT ``MP_EXT`` вместе с типом расширения ``MP_DECIMAL`` " +"является заголовком для значений типа DECIMAL." + +#, fuzzy +msgid "``MP_INTERVAL`` type is 6." +msgstr "MP_DECIMAL -- это 1." + +msgid "" +"The interval is saved as a variant of a map with a predefined number of " +"known attribute names. If some attributes are undefined, they are omitted " +"from the generated payload." +msgstr "" + +#, fuzzy +msgid "The interval MessagePack representation looks like this:" +msgstr "Десятичное представление MessagePack выглядит следующим образом:" + +msgid "" +"+--------+-------------------------+-------------+----------------+\n" +"| MP_EXT | Size of packed interval | MP_INTERVAL | PackedInterval |\n" +"+--------+-------------------------+-------------+----------------+" +msgstr "" + +msgid "Packed interval consists of:" +msgstr "" + +msgid "Packed number of non-zero fields." +msgstr "" + +msgid "Packed non-null fields." +msgstr "" + +#, fuzzy +msgid "Each packed field has the following structure:" +msgstr "``PackedDecimal`` имеет следующую структуру:" + +#, fuzzy +msgid "" +"+----------+=====================+\n" +"| field ID | field value |\n" +"+----------+=====================+" +msgstr "" +" <--- длина в байтах -->\n" +"+-------+=============+\n" +"| scale | BCD |\n" +"+-------+=============+" + +msgid "" +"The number of defined (non-null) fields can be zero. In this case, the " +"packed interval will be encoded as integer 0." +msgstr "" + +msgid "List of the field IDs:" +msgstr "" + +msgid "0 -- year" +msgstr "" + +msgid "1 -- month" +msgstr "" + +msgid "2 -- week" +msgstr "" + +msgid "3 -- day" +msgstr "" + +msgid "4 -- hour" +msgstr "" + +msgid "5 -- minute" +msgstr "" + +msgid "6 -- second" +msgstr "" + +msgid "7 -- nanosecond" +msgstr "" + +msgid "8 -- adjust" +msgstr "" + +#, fuzzy +msgid "**Example**" +msgstr "**Примеры**" + +msgid "" +"Interval value ``1 years, 200 months, -77 days`` is encoded in the following" +" way:" +msgstr "" + +#, python-format +msgid "" +"tarantool> I = datetime.interval.new{year = 1, month = 200, day = -77}\n" +"---\n" +"...\n" +"\n" +"tarantool> I\n" +"---\n" +"- +1 years, 200 months, -77 days\n" +"...\n" +"\n" +"tarantool> M = msgpack.encode(I)\n" +"---\n" +"...\n" +"\n" +"tarantool> M\n" +"---\n" +"- !!binary xwsGBAABAczIA9CzCAE=\n" +"...\n" +"\n" +"tarantool> tohex = function(s) return (s:gsub('.', function(c) return string.format('%02X ', string.byte(c)) end)) end\n" +"---\n" +"...\n" +"\n" +"tarantool> tohex(M)\n" +"---\n" +"- 'C7 0B 06 04 00 01 01 CC C8 03 D0 B3 08 01 '\n" +"..." +msgstr "" + +msgid "Where:" +msgstr "" + +msgid "C7 -- MP_EXT" +msgstr "" + +msgid "0B -- size of a packed interval value (11 bytes)" +msgstr "" + +msgid "06 -- MP_INTERVAL type" +msgstr "" + +msgid "04 -- number of defined fields" +msgstr "" + +msgid "00 -- field ID (year)" +msgstr "" + +msgid "01 -- packed value ``1``" +msgstr "" + +msgid "01 -- field ID (month)" +msgstr "" + +msgid "CCC8 -- packed value ``200``" +msgstr "" + +msgid "03 -- field ID (day)" +msgstr "" + +msgid "D0B3 -- packed value ``-77``" +msgstr "" + +msgid "08 -- field ID (adjust)" +msgstr "" + +msgid "01 -- packed value ``1`` (DT_LIMIT)" +msgstr "" + +msgid "" +"For more information about the interval type, see :ref:`interval field type " +"details ` and :doc:`description of the datetime module " +"`." +msgstr "" diff --git a/locale/ru/LC_MESSAGES/dev_guide/internals/recovery_internals.po b/locale/ru/LC_MESSAGES/dev_guide/internals/recovery_internals.po index ea5ae78974..bfea6b6dd7 100644 --- a/locale/ru/LC_MESSAGES/dev_guide/internals/recovery_internals.po +++ b/locale/ru/LC_MESSAGES/dev_guide/internals/recovery_internals.po @@ -3,8 +3,8 @@ msgid "The recovery process" msgstr "Процесс восстановления" msgid "" -"The recovery process begins when ``box.cfg{}`` happens for the first time after " -"the Tarantool server instance starts." +"The recovery process begins when ``box.cfg{}`` happens for the first time " +"after the Tarantool server instance starts." msgstr "" "Процесс восстановления начинается, когда ``box.cfg{}`` впервые используется " "после запуска экземпляра Tarantool-сервера." diff --git a/locale/ru/LC_MESSAGES/dev_guide/internals/replication/index.po b/locale/ru/LC_MESSAGES/dev_guide/internals/replication/index.po new file mode 100644 index 0000000000..211fab1649 --- /dev/null +++ b/locale/ru/LC_MESSAGES/dev_guide/internals/replication/index.po @@ -0,0 +1,3 @@ + +msgid "Replication internals" +msgstr "" diff --git a/locale/ru/LC_MESSAGES/dev_guide/internals/replication/orphan.po b/locale/ru/LC_MESSAGES/dev_guide/internals/replication/orphan.po index 90e818a4b8..6c813c0517 100644 --- a/locale/ru/LC_MESSAGES/dev_guide/internals/replication/orphan.po +++ b/locale/ru/LC_MESSAGES/dev_guide/internals/replication/orphan.po @@ -2,14 +2,15 @@ msgid "Orphan status" msgstr "Статус orphan (одиночный)" +#, fuzzy msgid "" "Starting with Tarantool version 1.9, there is a change to the procedure when" -" an instance joins a replica set. During ``box.cfg()`` the instance will try" -" to join all masters listed in :ref:`box.cfg.replication `. If the instance does not succeed with at least the number of " -"masters specified in :ref:`replication_connect_quorum `, then it will switch to **orphan status**. " -"While an instance is in orphan status, it is read-only." +" an instance joins a replica set. During ``box.cfg()`` the instance tries to" +" join all nodes listed in :ref:`box.cfg.replication `. If the instance does not succeed with connecting to the " +"required number of nodes (see :ref:`bootstrap_strategy `), it switches to the **orphan** status. While an " +"instance is in orphan status, it is read-only." msgstr "" "Начиная с версии Tarantool 1.9, процедура подключения реплики к набору " "реплик изменяется. Во время ``box.cfg()`` экземпляр попытается подключиться " @@ -61,23 +62,17 @@ msgstr "" "\"TIMEOUT_INFINITY\", то реплика пропускает шаг \"синхронизация\" и сразу же" " переходит на \"отслеживание\"." +#, fuzzy msgid "" -"In order to leave orphan mode you need to sync with a sufficient number " -"(:ref:`replication_connect_quorum `) of instances. To do so, you may either:" +"In order to leave orphan mode, you need to sync with a sufficient number of " +"instances (:ref:`bootstrap_strategy `). " +"To do so, you may either:" msgstr "" "Чтобы вывести узел из одиночного статуса, нужно синхронизировать его с " "достаточным (т.е. равным :ref:`replication_connect_quorum `) количеством других узлов. Этого можно " "добиться, выполнив любое из следующих действий:" -msgid "" -"Set :ref:`replication_connect_quorum ` to a lower value." -msgstr "" -"Уменьшить значение :ref:`replication_connect_quorum `." - msgid "" "Reset ``box.cfg.replication`` to exclude instances that cannot be reached or" " synced with." @@ -103,31 +98,22 @@ msgstr "" "Здесь впервые происходит вызов ``box.cfg{}``. Реплика подключается, но " "набора реплик пока нет." -msgid "Set status to 'orphan'." +#, fuzzy +msgid "Set the status to 'orphan'." msgstr "Установка статуса 'orphan' (одиночный)." msgid "" -"Try to connect to all nodes from ``box.cfg.replication``, or to the number " -"of nodes required by :ref:`replication_connect_quorum `. Retrying up to 3 times in 30 seconds is " -"possible because this is bootstrap, :ref:`replication_connect_timeout " -"` is overridden." +"Try to connect to all nodes from ``box.cfg.replication``. The replica tries " +"to connect for the :ref:`replication_connect_timeout ` number of seconds and retries each " +":ref:`replication_timeout ` seconds if " +"needed." msgstr "" -"Попытка установить соединение со всеми узлами из ``box.cfg.replication`` или" -" с количеством узлов, указанным в параметре :ref:`replication_connect_quorum" -" `. Допускаются три повторные " -"попытки за 30 секунд, поскольку идет стадия настройки, параметр " -":ref:`replication_connect_timeout ` не учитывается." msgid "" -"Abort and throw an error if not connected to all nodes in " -"``box.cfg.replication`` or :ref:`replication_connect_quorum " -"`." +"Abort and throw an error if a replica is not connected to the majority of " +"nodes in ``box.cfg.replication``." msgstr "" -"Прекращение работы и выдача ошибки в случае отсутствия соединения со всеми " -"узлами в ``box.cfg.replication`` или :ref:`replication_connect_quorum " -"`." msgid "" "This instance might be elected as the replica set 'leader'. Criteria for " @@ -194,19 +180,17 @@ msgstr "" "локального снимка и WAL-файлов." msgid "" -"Connect to at least :ref:`replication_connect_quorum ` nodes. If failed -- set status to 'orphan'. " -"(Attempts to sync will continue in the background and when/if they succeed " -"then 'orphan' will be changed to 'connected'.)" +"Try to establish connections to all other nodes for the " +":ref:`replication_connect_timeout ` number of seconds. Once " +"``replication_connect_timeout`` is expired or all the connections are " +"established, proceed to the \"sync\" state with all the established " +"connections." msgstr "" -"Установить соединение с количеством узлов не меньшим, чем " -":ref:`replication_connect_quorum `. Если не получается -- установить статус " -"'orphan'. (Попытки синхронизации будут повторяться в фоновом режиме, и " -"когда/если они окажутся успешными, статус 'orphan' сменится на 'connected'.)" +#, fuzzy msgid "" -"If connected - sync with all connected nodes, until the difference is not " +"If connected, sync with all connected nodes, until the difference is not " "more than :ref:`replication_sync_lag `" " seconds." msgstr "" @@ -225,18 +209,15 @@ msgstr "" "Здесь вызов ``box.cfg{}`` происходит не впервые, а повторно, поскольку " "изменились некоторые параметры репликации или что-то в наборе реплик." +#, fuzzy msgid "" -"Try to connect to all nodes from ``box.cfg.replication``, or to the number " -"of nodes required by :ref:`replication_connect_quorum `, within the time period specified in " -":ref:`replication_connect_timeout `." msgstr "" -"Попытка установить соединение со всеми узлами из ``box.cfg.replication`` или" -" с количеством узлов, указанным в параметре :ref:`replication_connect_quorum" -" ` в течение периода времени, " -"указанного в :ref:`replication_connect_timeout `." +"Попытка синхронизации со всеми подключенными узлами в течение периода " +"времени, указанного в :ref:`replication_sync_timeout `." msgid "" "Try to sync with the connected nodes, within the time period specified in " @@ -297,3 +278,58 @@ msgstr "" "реплика, и сохранит идентификатор экземпляра реплики, которой уже не " "существует. Полностью автоматизированный процесс повторной настройки " "появился в версии Tarantool 1.10.2." + +#~ msgid "" +#~ "Set :ref:`replication_connect_quorum ` to a lower value." +#~ msgstr "" +#~ "Уменьшить значение :ref:`replication_connect_quorum `." + +#~ msgid "" +#~ "Try to connect to all nodes from ``box.cfg.replication``, or to the number " +#~ "of nodes required by :ref:`replication_connect_quorum `. Retrying up to 3 times in 30 seconds is " +#~ "possible because this is bootstrap, :ref:`replication_connect_timeout " +#~ "` is overridden." +#~ msgstr "" +#~ "Попытка установить соединение со всеми узлами из ``box.cfg.replication`` или" +#~ " с количеством узлов, указанным в параметре :ref:`replication_connect_quorum" +#~ " `. Допускаются три повторные " +#~ "попытки за 30 секунд, поскольку идет стадия настройки, параметр " +#~ ":ref:`replication_connect_timeout ` не учитывается." + +#~ msgid "" +#~ "Abort and throw an error if not connected to all nodes in " +#~ "``box.cfg.replication`` or :ref:`replication_connect_quorum " +#~ "`." +#~ msgstr "" +#~ "Прекращение работы и выдача ошибки в случае отсутствия соединения со всеми " +#~ "узлами в ``box.cfg.replication`` или :ref:`replication_connect_quorum " +#~ "`." + +#~ msgid "" +#~ "Connect to at least :ref:`replication_connect_quorum ` nodes. If failed -- set status to 'orphan'. " +#~ "(Attempts to sync will continue in the background and when/if they succeed " +#~ "then 'orphan' will be changed to 'connected'.)" +#~ msgstr "" +#~ "Установить соединение с количеством узлов не меньшим, чем " +#~ ":ref:`replication_connect_quorum `. Если не получается -- установить статус " +#~ "'orphan'. (Попытки синхронизации будут повторяться в фоновом режиме, и " +#~ "когда/если они окажутся успешными, статус 'orphan' сменится на 'connected'.)" + +#~ msgid "" +#~ "Try to connect to all nodes from ``box.cfg.replication``, or to the number " +#~ "of nodes required by :ref:`replication_connect_quorum `, within the time period specified in " +#~ ":ref:`replication_connect_timeout `." +#~ msgstr "" +#~ "Попытка установить соединение со всеми узлами из ``box.cfg.replication`` или" +#~ " с количеством узлов, указанным в параметре :ref:`replication_connect_quorum" +#~ " ` в течение периода времени, " +#~ "указанного в :ref:`replication_connect_timeout `." diff --git a/locale/ru/LC_MESSAGES/dev_guide/internals/replication/replication_server_startup.po b/locale/ru/LC_MESSAGES/dev_guide/internals/replication/replication_server_startup.po new file mode 100644 index 0000000000..1ecebf9e0e --- /dev/null +++ b/locale/ru/LC_MESSAGES/dev_guide/internals/replication/replication_server_startup.po @@ -0,0 +1,140 @@ + +msgid "Server startup with replication" +msgstr "" + +msgid "" +"In addition to the recovery process described in the section :ref:`Recovery " +"process `, the server must take additional steps" +" and precautions if :ref:`replication ` is enabled." +msgstr "" + +msgid "" +"Once again the startup procedure is initiated by the ``box.cfg{}`` request. " +"One of the ``box.cfg`` parameters may be :ref:`replication ` which specifies replication source(-s). We will refer to this " +"replica, which is starting up due to ``box.cfg``, as the \"local\" replica " +"to distinguish it from the other replicas in a replica set, which we will " +"refer to as \"distant\" replicas." +msgstr "" + +msgid "" +"*If there is no snapshot .snap file and the* ``replication`` *parameter is " +"empty and* ``cfg.read_only=false``: |br| then the local replica assumes it " +"is an unreplicated \"standalone\" instance, or is the first replica of a new" +" replica set. It will generate new UUIDs for itself and for the replica set." +" The replica UUID is stored in the ``_cluster`` space; the replica set UUID " +"is stored in the ``_schema`` space. Since a snapshot contains all the data " +"in all the spaces, that means the local replica's snapshot will contain the " +"replica UUID and the replica set UUID. Therefore, when the local replica " +"restarts on later occasions, it will be able to recover these UUIDs when it " +"reads the .snap file." +msgstr "" + +msgid "" +"*If there is no snapshot .snap file and the* ``replication`` *parameter is " +"empty and* ``cfg.read_only=true``: |br| it cannot be the first replica of a " +"new replica set because the first replica must be a master. Therefore an " +"error message will occur: ER_BOOTSTRAP_READONLY. To avoid this, change the " +"setting for this (local) instance to ``read_only = false``, or ensure that " +"another (distant) instance starts first and has the local instance's UUID in" +" its ``_cluster`` space. In the latter case, if ER_BOOTSTRAP_READONLY still " +"occurs, set the local instance's :ref:`box.replication_connect_timeout " +"` to a larger value." +msgstr "" + +msgid "" +"*If there is no snapshot .snap file and the* ``replication`` *parameter is " +"not empty and the* ``_cluster`` *space contains no other replica UUIDs*: " +"|br| then the local replica assumes it is not a standalone instance, but is " +"not yet part of a replica set. It must now join the replica set. It will " +"send its replica UUID to the first distant replica which is listed in " +"``replication`` and which will act as a master. This is called the \"join " +"request\". When a distant replica receives a join request, it will send " +"back:" +msgstr "" + +msgid "the distant replica's replica set UUID," +msgstr "" + +msgid "" +"the contents of the distant replica's .snap file. |br| When the local " +"replica receives this information, it puts the replica set UUID in its " +"``_schema`` space, puts the distant replica's UUID and connection " +"information in its ``_cluster`` space, and makes a snapshot containing all " +"the data sent by the distant replica. Then, if the local replica has data in" +" its WAL .xlog files, it sends that data to the distant replica. The distant" +" replica will receive this and update its own copy of the data, and add the " +"local replica's UUID to its ``_cluster`` space." +msgstr "" + +msgid "" +"*If there is no snapshot .snap file and the* ``replication`` *parameter is " +"not empty and the* ``_cluster`` *space contains other replica UUIDs*: |br| " +"then the local replica assumes it is not a standalone instance, and is " +"already part of a replica set. It will send its replica UUID and replica set" +" UUID to all the distant replicas which are listed in ``replication``. This " +"is called the \"on-connect handshake\". When a distant replica receives an " +"on-connect handshake: |br|" +msgstr "" + +msgid "" +"the distant replica compares its own copy of the replica set UUID to the one" +" in the on-connect handshake. If there is no match, then the handshake fails" +" and the local replica will display an error." +msgstr "" + +msgid "" +"the distant replica looks for a record of the connecting instance in its " +"``_cluster`` space. If there is none, then the handshake fails. |br| " +"Otherwise the handshake is successful. The distant replica will read any new" +" information from its own .snap and .xlog files, and send the new requests " +"to the local replica." +msgstr "" + +msgid "" +"In the end, the local replica knows what replica set it belongs to, the " +"distant replica knows that the local replica is a member of the replica set," +" and both replicas have the same database contents." +msgstr "" + +msgid "" +"*If there is a snapshot file and replication source is not empty*: |br| " +"first the local replica goes through the recovery process described in the " +"previous section, using its own .snap and .xlog files. Then it sends a " +"\"subscribe\" request to all the other replicas of the replica set. The " +"subscribe request contains the server vector clock. The vector clock has a " +"collection of pairs 'server id, lsn' for every replica in the ``_cluster`` " +"system space. Each distant replica, upon receiving a subscribe request, will" +" read its .xlog files' requests and send them to the local replica if (lsn " +"of .xlog file request) is greater than (lsn of the vector clock in the " +"subscribe request). After all the other replicas of the replica set have " +"responded to the local replica's subscribe request, the replica startup is " +"complete." +msgstr "" + +msgid "" +"The following temporary limitations applied for Tarantool versions earlier " +"than 1.7.7:" +msgstr "" + +msgid "" +"The URIs in the ``replication`` parameter should all be in the same order on" +" all replicas. This is not mandatory but is an aid to consistency." +msgstr "" + +msgid "" +"The replicas of a replica set should be started up at slightly different " +"times. This is not mandatory but prevents a situation where each replica is " +"waiting for the other replica to be ready." +msgstr "" + +msgid "" +"The following limitation still applies for the current Tarantool version:" +msgstr "" + +msgid "" +"The maximum number of entries in the ``_cluster`` space is :ref:`32 " +"`. Tuples for out-of-date replicas are not " +"automatically re-used, so if this 32-replica limit is reached, users may " +"have to reorganize the ``_cluster`` space manually." +msgstr "" diff --git a/locale/ru/LC_MESSAGES/dev_guide/lua_style_guide.po b/locale/ru/LC_MESSAGES/dev_guide/lua_style_guide.po index 5ac3100da0..2e0682ca17 100644 --- a/locale/ru/LC_MESSAGES/dev_guide/lua_style_guide.po +++ b/locale/ru/LC_MESSAGES/dev_guide/lua_style_guide.po @@ -1,5 +1,6 @@ -msgid "Lua Style Guide" +#, fuzzy +msgid "Lua style guide" msgstr "Руководство по написанию кода на Lua" msgid "Inspiration:" @@ -14,11 +15,12 @@ msgstr "http://dev.minetest.net/Lua_code_style_guidelines" msgid "http://sputnik.freewisdom.org/en/Coding_Standard" msgstr "http://sputnik.freewisdom.org/en/Coding_Standard" +#, fuzzy msgid "" -"Programming style is an art. There is some arbitrariness to the rules, but " +"Programming style is art. There is some arbitrariness to the rules, but " "there are sound rationales for them. It is useful not only to provide sound " -"advice on style but to understand the underlying rationale and human aspect " -"of why the style recommendations are formed:" +"advice on style but to understand the underlying rationale behind the style " +"recommendations:" msgstr "" "Придерживаться стиля в программировании -- это искусство. Даже учитывая " "некоторую произвольность правил, для них есть надежное обоснование. Полезно " @@ -35,7 +37,8 @@ msgstr "http://www.oreilly.com/catalog/perlbp/" msgid "http://books.google.com/books?id=QnghAQAAIAAJ" msgstr "http://books.google.com/books?id=QnghAQAAIAAJ" -msgid "Zen of Python is good; understand it and use wisely:" +#, fuzzy +msgid "The Zen of Python is good. Understand it and use wisely:" msgstr "" "Дзен языка программирования Python подходит и здесь; используйте его с умом:" @@ -102,12 +105,14 @@ msgstr "Пространства имен -- отличная штука! Сде msgid "https://www.python.org/dev/peps/pep-0020/" msgstr "https://www.python.org/dev/peps/pep-0020/" -msgid "Indentation and Formatting" +#, fuzzy +msgid "Indentation and formatting" msgstr "Отступы и форматирование" +#, fuzzy msgid "" -"4 spaces instead tabs. PIL suggests using of two spaces, but programmer " -"looks at code 4 up to 8 hours a day, so it's simpler to distinguish " +"4 spaces instead of tabs. PIL suggests using two spaces, but a programmer " +"looks at code from 4 to 8 hours a day, so it's simpler to distinguish " "indentation with 4 spaces. Why spaces? Similar representation everywhere." msgstr "" "4 пробела, а не табуляция. Библиотека PIL предлагает использовать два " @@ -130,23 +135,28 @@ msgstr "" msgid "Every do/while/for/if/function should indent 4 spaces." msgstr "Отступы всех do/while/for/if/function должны составлять 4 пробела." +#, fuzzy msgid "" -"related ``or``/``and`` in ``if`` must be enclosed in the round brackets (). " +"Related ``or``/``and`` in ``if`` must be enclosed in the round brackets (). " "Example:" msgstr "" "``or``/``and`` в ``if`` должны быть обрамлены круглыми скобками (). Пример:" +#, fuzzy msgid "" +"-- Good\n" "if (a == true and b == false) or (a == false and b == true) then\n" " <...>\n" -"end -- good\n" +"end\n" "\n" +"-- Bad\n" "if a == true and b == false or a == false and b == true then\n" " <...>\n" -"end -- bad\n" +"end\n" "\n" +"-- Good but not explicit\n" "if a ^ b == true then\n" -"end -- good, but not explicit" +"end" msgstr "" "if (a == true and b == false) or (a == false and b == true) then\n" " <...>\n" @@ -169,22 +179,23 @@ msgstr "" "Не используйте конкатенацию для конвертации в строку или в число (вместо " "этого воспользуйтесь ``tostring``/``tonumber``):" +#, fuzzy msgid "" +"-- Bad\n" "local a = 123\n" "a = a .. ''\n" -"-- bad\n" "\n" +"-- Good\n" "local a = 123\n" "a = tostring(a)\n" -"-- good\n" "\n" +"-- Bad\n" "local a = '123'\n" "a = a + 5 -- 128\n" -"-- bad\n" "\n" +"-- Good\n" "local a = '123'\n" -"a = tonumber(a) + 5 -- 128\n" -"-- good" +"a = tonumber(a) + 5 -- 128" msgstr "" "local a = 123\n" "a = a .. ''\n" @@ -206,12 +217,14 @@ msgid "Try to avoid multiple nested ``if``'s with common body:" msgstr "" "Постарайтесь избегать несколько вложенных ``if`` с общим телом оператора:" +#, fuzzy msgid "" +"-- Good\n" "if (a == true and b == false) or (a == false and b == true) then\n" " do_something()\n" "end\n" -"-- good\n" "\n" +"-- Bad\n" "if a == true then\n" " if b == false then\n" " do_something()\n" @@ -220,8 +233,7 @@ msgid "" " if a == false then\n" " do_something()\n" " end\n" -"end\n" -"-- bad" +"end" msgstr "" "if (a == true and b == false) or (a == false and b == true) then\n" " do_something()\n" @@ -246,22 +258,23 @@ msgstr "" "Избегайте множества конкатенаций в одном операторе, лучше использовать " "``string.format``:" +#, fuzzy, python-format msgid "" +"-- Bad\n" "function say_greeting(period, name)\n" " local a = \"good \" .. period .. \", \" .. name\n" "end\n" -"-- bad\n" "\n" +"-- Good\n" "function say_greeting(period, name)\n" " local a = string.format(\"good %s, %s\", period, name)\n" "end\n" -"-- good\n" "\n" +"-- Best\n" "local say_greeting_fmt = \"good %s, %s\"\n" "function say_greeting(period, name)\n" " local a = say_greeting_fmt:format(period, name)\n" -"end\n" -"-- best" +"end" msgstr "" "function say_greeting(period, name)\n" " local a = \"good \" .. period .. \", \" .. name\n" @@ -284,16 +297,19 @@ msgstr "" "Используйте ``and``/``or`` для указания значений переменных, используемых по" " умолчанию," +#, fuzzy msgid "" +"-- Good\n" "function(input)\n" " input = input or 'default_value'\n" -"end -- good\n" +"end\n" "\n" +"-- Ok but excessive\n" "function(input)\n" " if input == nil then\n" " input = 'default_value'\n" " end\n" -"end -- ok, but excessive" +"end" msgstr "" "function(input)\n" " input = input or 'default_value'\n" @@ -308,17 +324,20 @@ msgstr "" msgid "``if``'s and return statements:" msgstr "операторов ``if`` и возврата:" +#, fuzzy msgid "" +"-- Good\n" "if a == true then\n" " return do_something()\n" "end\n" -"do_other_thing() -- good\n" +"do_other_thing()\n" "\n" +"-- Bad\n" "if a == true then\n" " return do_something()\n" "else\n" " do_other_thing()\n" -"end -- bad" +"end" msgstr "" "if a == true then\n" " return do_something()\n" @@ -334,19 +353,23 @@ msgstr "" msgid "Using spaces:" msgstr "Использование пробелов:" +#, fuzzy msgid "" -"one shouldn't use spaces between function name and opening round bracket, " -"but arguments must be split with one whitespace character" +"Don't use spaces between function name and opening round bracket. Split " +"arguments with one whitespace character:" msgstr "" "не следует вставлять пробелы между именем функции и открывающей круглой " "скобкой, но аргумент необходимо разделять одним символом пробела" +#, fuzzy msgid "" +"-- Bad\n" "function name (arg1,arg2,...)\n" -"end -- bad\n" +"end\n" "\n" +"-- Good\n" "function name(arg1, arg2, ...)\n" -"end -- good" +"end" msgstr "" "function name (arg1,arg2,...)\n" "end -- плохо\n" @@ -354,17 +377,19 @@ msgstr "" "function name(arg1, arg2, ...)\n" "end -- хорошо" -msgid "use space after comment marker" +#, fuzzy +msgid "Add a space after comment markers:" msgstr "добавляйте пробел после маркера комментария" +#, fuzzy msgid "" -"while true do -- inline comment\n" -"-- comment\n" -"do_something()\n" +"while true do -- Inline comment\n" +" -- Comment\n" +" do_something()\n" "end\n" "--[[\n" -" multiline\n" -" comment\n" +"Multiline\n" +"comment\n" "]]--" msgstr "" "while true do -- встроенный комментарий\n" @@ -376,21 +401,23 @@ msgstr "" " комментарий\n" "]]--" -msgid "surrounding operators" +#, fuzzy +msgid "Surrounding operators:" msgstr "примыкающие конструкции" +#, fuzzy msgid "" +"-- Bad\n" "local thing=1\n" "thing = thing-1\n" "thing = thing*1\n" "thing = 'string'..'s'\n" -"-- bad\n" "\n" +"-- Good\n" "local thing = 1\n" "thing = thing - 1\n" "thing = thing * 1\n" -"thing = 'string' .. 's'\n" -"-- good" +"thing = 'string' .. 's'" msgstr "" "local thing=1\n" "thing = thing-1\n" @@ -404,17 +431,19 @@ msgstr "" "thing = 'string' .. 's'\n" "-- хорошо" -msgid "use space after commas in tables" +#, fuzzy +msgid "Add a space after commas in tables:" msgstr "добавляйте пробел после запятых в таблицах" +#, fuzzy msgid "" +"-- Bad\n" "local thing = {1,2,3}\n" "thing = {1 , 2 , 3}\n" "thing = {1 ,2 ,3}\n" -"-- bad\n" "\n" -"local thing = {1, 2, 3}\n" -"-- good" +"-- Good\n" +"local thing = {1, 2, 3}" msgstr "" "local thing = {1,2,3}\n" "thing = {1 , 2 , 3}\n" @@ -424,24 +453,26 @@ msgstr "" "local thing = {1, 2, 3}\n" "-- хорошо" -msgid "use space in map definitions around equality sign and commas" +#, fuzzy +msgid "Add a space in map definitions after equals signs and commas:" msgstr "" "используйте пробелы в определениях ассоциативного массива по сторонам от " "знаков равенства и запятых" +#, fuzzy msgid "" +"-- Bad\n" "return {1,2,3,4}\n" "return {\n" " key1 = val1,key2=val2\n" "}\n" -"-- bad\n" "\n" +"-- Good\n" "return {1, 2, 3, 4}\n" "return {\n" " key1 = val1, key2 = val2,\n" -" key3 = vallll\n" -"}\n" -"-- good" +" key3 = val3\n" +"}" msgstr "" "return {1,2,3,4}\n" "return {\n" @@ -456,7 +487,8 @@ msgstr "" "}\n" "-- хорошо" -msgid "also, you may use alignment:" +#, fuzzy +msgid "You can also use alignment:" msgstr "также можно применить выравнивание:" msgid "" @@ -472,40 +504,43 @@ msgstr "" " something = 'even better'\n" "}" +#, fuzzy msgid "" -"extra blank lines may be used (sparingly) to separate groups of related " -"functions. Blank lines may be omitted between a bunch of related one-liners " -"(e.g. a set of dummy implementations)" +"Extra blank lines may be used (sparingly) to separate groups of related " +"functions. Blank lines may be omitted between several related one-liners " +"(for example, a set of dummy implementations)." msgstr "" "также можно добавлять пустые строки (не слишком часто) для выделения групп " "связанных функций. Пустые строки не стоит добавлять между несколькими " "связанными программами в одну строку (например, в формальной реализации)" -msgid "use blank lines in function, sparingly, to indicate logical sections" +#, fuzzy +msgid "Use blank lines in functions (sparingly) to indicate logical sections:" msgstr "" "не слишком часто можно добавлять пустые строки в коде функций, чтобы " "отделить друг от друга логические части" +#, fuzzy msgid "" -"if thing then\n" -" -- ...stuff...\n" +"-- Bad\n" +"if thing ~= nil then\n" +" -- ... stuff ...\n" "end\n" "function derp()\n" -" -- ...stuff...\n" +" -- ... stuff ...\n" "end\n" "local wat = 7\n" -"-- bad\n" "\n" -"if thing then\n" -" -- ...stuff...\n" +"-- Good\n" +"if thing ~= nil then\n" +" -- ... stuff ...\n" "end\n" "\n" "function derp()\n" -" -- ...stuff...\n" +" -- ... stuff ...\n" "end\n" "\n" -"local wat = 7\n" -"-- good" +"local wat = 7" msgstr "" "if thing then\n" " -- ...что-то...\n" @@ -527,33 +562,41 @@ msgstr "" "local wat = 7\n" "-- хорошо" +#, fuzzy msgid "" "Delete whitespace at EOL (strongly forbidden. Use ``:s/\\s\\+$//gc`` in vim " -"to delete them)" +"to delete them)." msgstr "" "Удаляйте символы пробела в конце файла (они категорически запрещаются). Для " "их удаления в vim используйте ``:s/\\s\\+$//gc``." -msgid "Avoid global variable" +#, fuzzy +msgid "Avoid global variables" msgstr "Недопущение глобальных переменных" +#, fuzzy msgid "" -"You must avoid global variables. If you have an exceptional case, use ``_G``" -" variable to set it, add prefix or add table instead of prefix:" +"Avoid using global variables. In exceptional cases, start the name of such a" +" variable with ``_G``, add a prefix, or add a table instead of a prefix:" msgstr "" "Следует избегать глобальных переменных. В исключительных случаях используйте" " переменную ``_G`` для объявления, добавьте префикс или таблицу вместо " "префикса:" +#, fuzzy msgid "" +"-- Very bad\n" "function bad_global_example()\n" -"end -- very, very bad\n" +"end\n" "\n" "function good_local_example()\n" "end\n" -"_G.modulename_good_local_example = good_local_example -- good\n" +"-- Good\n" +"_G.modulename_good_local_example = good_local_example\n" +"\n" +"-- Better\n" "_G.modulename = {}\n" -"_G.modulename.good_local_example = good_local_example -- better" +"_G.modulename.good_local_example = good_local_example" msgstr "" "function bad_global_example()\n" "end -- глобальная, очень-очень плохо\n" @@ -564,82 +607,123 @@ msgstr "" "_G.modulename = {}\n" "_G.modulename.good_local_example = good_local_example -- локальная, лучше" -msgid "Always use prefix to avoid name clash" +#, fuzzy +msgid "Always use a prefix to avoid name conflicts." msgstr "Всегда добавляйте префиксы во избежание конфликта имен" msgid "Naming" msgstr "Именование" -msgid "names of variables/\"objects\" and \"methods\"/functions: snake_case" +#, fuzzy +msgid "Names of variables/\"objects\" and \"methods\"/functions: snake_case." msgstr "имена переменных/\"объектов\" и \"методов\"/функций: snake_case" -msgid "names of \"classes\": CamelCase" +#, fuzzy +msgid "Names of \"classes\": CamelCase." msgstr "имена \"классов\": CamelCase" +#, fuzzy msgid "" -"private variables/methods (properties in the future) of object starts with " -"underscores ``._``. Avoid using of ``local function " -"private_methods(self) end``" +"Private variables/methods (future properties) of objects start with " +"underscores ``._``. Avoid syntax like ``local function " +"private_methods(self) end``." msgstr "" "частные переменные/методы (в будущем параметры) объекта начинаются с символа" " подчеркивания ``._``. Избегайте ``local function " "private_methods(self) end``" +#, fuzzy msgid "" -"boolean - naming ``is_<...>``, ``isnt_<...>``, ``has_``, ``hasnt_`` is a " -"good style." +"Boolean: naming ``is_<...>``, ``isnt_<...>``, ``has_``, ``hasnt_`` is good " +"style." msgstr "" "логическое именование приветствуется ``is_<...>``, ``isnt_<...>``, ``has_``," " ``hasnt_``." +#, fuzzy +msgid "For \"very local\" variables:" +msgstr "Недопущение глобальных переменных" + +msgid "``t`` is for tables" +msgstr "" + +msgid "``i``, ``j`` are for indexing" +msgstr "" + +msgid "``n`` is for counting" +msgstr "" + msgid "" -"for \"very local\" variables: - ``t`` is for tables - ``i``, ``j`` are for " -"indexing - ``n`` is for counting - ``k``, ``v`` is what you get out of " -"``pairs()`` (are acceptable, ``_`` if unused) - ``i``, ``v`` is what you get" -" out of ``ipairs()`` (are acceptable, ``_`` if unused) - ``k``/``key`` is " -"for table keys - ``v``/``val``/``value`` is for values that are passed " -"around - ``x``/``y``/``z`` is for generic math quantities - " -"``s``/``str``/``string`` is for strings - ``c`` is for 1-char strings - " -"``f``/``func``/``cb`` are for functions - ``status, ..`` or ``ok, " -"..`` is what you get out of pcall/xpcall - ``buf, sz`` is a (buffer, " -"size) pair - ``_p`` is for pointers - ``t0``.. is for timestamps - " -"``err`` is for errors" -msgstr "" -"для \"самых локальных\" переменных: - ``t`` для таблиц - ``i``, ``j`` для " -"индексации - ``n`` для подсчета - ``k``, ``v`` для получения из ``pairs()`` " -"(допускаются, ``_`` если не используются) - ``i``, ``v`` is what you get out" -" of ``ipairs()`` (допускаются, ``_`` если не используются) - ``k``/``key`` " -"для ключей таблицы - ``v``/``val``/``value`` для передаваемых значений - " -"``x``/``y``/``z`` для общих математических величин - " -"``s``/``str``/``string`` для строк - ``c`` для односимвольных строк - " -"``f``/``func``/``cb`` для функций - ``status, ..`` или ``ok, ..`` " -"для получения из pcall/xpcall - ``buf, sz`` -- это пара (буфер, размер) - " -"``_p`` для указателей - ``t0``.. для временных отметок - ``err`` для " -"ошибок" +"``k``, ``v`` is what you get out of ``pairs()`` (are acceptable, ``_`` if " +"unused)" +msgstr "" msgid "" -"abbreviations are acceptable if they're unambiguous and if you'll document " -"(or they're too common) them." +"``i``, ``v`` is what you get out of ``ipairs()`` (are acceptable, ``_`` if " +"unused)" +msgstr "" + +msgid "``k``/``key`` is for table keys" +msgstr "" + +msgid "``v``/``val``/``value`` is for values that are passed around" +msgstr "" + +msgid "``x``/``y``/``z`` is for generic math quantities" +msgstr "" + +msgid "``s``/``str``/``string`` is for strings" +msgstr "" + +msgid "``c`` is for 1-char strings" +msgstr "" + +msgid "``f``/``func``/``cb`` are for functions" +msgstr "" + +msgid "" +"``status, ..`` or ``ok, ..`` is what you get out of pcall/xpcall" +msgstr "" + +msgid "``buf, sz`` is a (buffer, size) pair" +msgstr "" + +msgid "``_p`` is for pointers" +msgstr "" + +msgid "``t0``.. is for timestamps" +msgstr "" + +msgid "``err`` is for errors" +msgstr "" + +#, fuzzy +msgid "" +"Abbreviations are acceptable if they're very common or if they're " +"unambiguous and you've documented them." msgstr "" "допускается использование сокращений, если они недвусмысленны, и если вы " "документируете их (или они слишком распространены)." +#, fuzzy msgid "" -"global variables are written with ALL_CAPS. If it's some system variable, " -"then they're using underscore to define it (``_G``/``_VERSION``/..)" +"Global variables are spelled in ALL_CAPS. If it's a system variable, it " +"starts with an underscore (``_G``/``_VERSION``/..)." msgstr "" "глобальные переменные пишутся ЗАГЛАВНЫМИ_БУКВАМИ. Если это системная " "переменная, для определения используется символ подчеркивания " "(``_G``/``_VERSION``/..)" +#, fuzzy msgid "" -"module naming snake_case (avoid underscores and dashes) - 'luasql', instead " -"of 'Lua-SQL'" +"Modules are named in snake_case (avoid underscores and dashes): for example," +" 'luasql', not 'Lua-SQL'." msgstr "" "именование модулей -- с помощью snake_case (избегайте подчеркивания и " "дефисов) - 'luasql', а не 'Lua-SQL'" -msgid "``*_mt`` and ``*_methods`` defines metatable and methods table" +#, fuzzy +msgid "``*_mt`` and ``*_methods`` defines metatable and methods table." msgstr "``*_mt`` и ``*_methods`` определяют метатаблицу и таблицу методов" msgid "Idioms and patterns" @@ -658,55 +742,70 @@ msgstr "функции ``*.cfg{ }`` (``box.cfg``/``memcached.cfg``/..)" msgid "``ffi.cdef[[ ]]`` function" msgstr "функция ``ffi.cdef[[ ]]``" -msgid "Avoid these kind of constructions:" +#, fuzzy +msgid "Avoid the following constructions:" msgstr "Избегайте конструкций такого типа:" -msgid "'' (strongly avoid require'..')" +#, fuzzy +msgid "''. Strongly avoid require'..'." msgstr "'' (особенно избегайте require'..')" +#, fuzzy msgid "" -"``function object:method() end`` (use ``function object.method(self) end`` " -"instead)" +"``function object:method() end``. Use ``function object.method(self) end`` " +"instead." msgstr "" "``function object:method() end`` (используйте ``function object.method(self)" " end``)" -msgid "do not use semicolon as table separator (only comma)" +#, fuzzy +msgid "Semicolons as table separators. Only use commas." msgstr "" "не вставляйте точку с запятой в качестве символа-разделителя в таблице " "(только запятые)" +#, fuzzy msgid "" -"semicolons at the end of line (only to split multiple statements on one " -"line)" +"Semicolons at the end of line. Use semicolons only to split multiple " +"statements on one line." msgstr "" "точки с запятой в конце строки (только для разделения нескольких операторов " "в одной строке)" -msgid "try to avoid unnecessary function creation (closures/..)" +#, fuzzy +msgid "Unnecessary function creation (closures/..)." msgstr "старайтесь избегать создания ненужных функций (closures/..)" +msgid "" +"Avoid implicit casting to boolean in ``if`` conditions like ``if x then`` or" +" ``if not x then``. Such expressions will likely result in troubles with " +":doc:`box.NULL `. Instead of those " +"conditions, use ``if x ~= nil then`` and ``if x == nil then``." +msgstr "" + msgid "Modules" msgstr "Модули" +#, fuzzy msgid "" "Don't start modules with license/authors/descriptions, you can write it in " -"LICENSE/AUTHORS/README files. For writing modules use one of the two " -"patterns (don't use ``modules()``):" +"LICENSE/AUTHORS/README files. To write modules, use one of the two patterns " +"(don't use ``modules()``):" msgstr "" "Не начинайте создание модуля с указания лицензии/авторов/описания, это можно" " сделать в файлах LICENSE/AUTHORS/README соответственно. Для написания " "модулей используйте один из двух шаблонов (не используйте ``modules()``):" +#, fuzzy msgid "" "local M = {}\n" "\n" "function M.foo()\n" -"...\n" +" ...\n" "end\n" "\n" "function M.bar()\n" -"...\n" +" ...\n" "end\n" "\n" "return M" @@ -726,18 +825,19 @@ msgstr "" msgid "or" msgstr "или" +#, fuzzy msgid "" "local function foo()\n" -"...\n" +" ...\n" "end\n" "\n" "local function bar()\n" -"...\n" +" ...\n" "end\n" "\n" "return {\n" -"foo = foo,\n" -"bar = bar,\n" +" foo = foo,\n" +" bar = bar,\n" "}" msgstr "" "local function foo()\n" @@ -756,16 +856,20 @@ msgstr "" msgid "Commenting" msgstr "Комментирование" +#, fuzzy msgid "" -"You should write code the way it shouldn't be described, but don't forget " -"about commenting it. You shouldn't comment Lua syntax (assume that reader " -"already knows Lua language). Try to tell about functions/variable names/etc." +"Don't forget to comment your Lua code. You shouldn't comment Lua syntax " +"(assume that the reader already knows the Lua language). Instead, tell about" +" functions/variable names/etc." msgstr "" "Пишите код так, чтобы его не нужно было описывать, но не забывайте о " "комментировании. Не следует комментировать Lua-синтаксис (примите, что " "читатель знаком с языком Lua). Постарайтесь рассказать о функциях, именах " "переменных и так далее." +msgid "Start a sentence with a capital letter and end with a period." +msgstr "" + msgid "" "Multiline comments: use matching (``--[[ ]]--``) instead of simple (``--[[ " "]]``)." @@ -773,14 +877,16 @@ msgstr "" "Многострочные комментарии: используйте соответствующие скобки (``--[[ " "]]--``) вместо простых (``--[[ ]]``)." -msgid "Public function comments (??):" +#, fuzzy +msgid "Public function comments:" msgstr "Комментарии к доступным функциям (??):" +#, fuzzy msgid "" -"--- Copy any table (shallow and deep version)\n" +"--- Copy any table (shallow and deep version).\n" "-- * deepcopy: copies all levels\n" "-- * shallowcopy: copies only first level\n" -"-- Supports __copy metamethod for copying custom tables with metatables\n" +"-- Supports __copy metamethod for copying custom tables with metatables.\n" "-- @function gsplit\n" "-- @table inp original table\n" "-- @shallow[opt] sep flag for shallow copy\n" @@ -798,54 +904,58 @@ msgstr "" msgid "Testing" msgstr "Тестирование" -msgid "Use ``tap`` module for writing efficient tests. Example of test file:" +#, fuzzy +msgid "" +"Use the ``tap`` module for writing efficient tests. Example of a test file:" msgstr "" "Используйте модуль ``tap``, чтобы написать эффективные тесты. Пример файла с" " тестом:" +#, fuzzy msgid "" "#!/usr/bin/env tarantool\n" "\n" "local test = require('tap').test('table')\n" "test:plan(31)\n" "\n" -"do -- check basic table.copy (deepcopy)\n" +"do\n" +" -- Check basic table.copy (deepcopy).\n" " local example_table = {\n" -" {1, 2, 3},\n" -" {\"help, I'm very nested\", {{{ }}} }\n" +" { 1, 2, 3 },\n" +" { \"help, I'm very nested\", { { { } } } }\n" " }\n" "\n" " local copy_table = table.copy(example_table)\n" "\n" " test:is_deeply(\n" -" example_table,\n" -" copy_table,\n" -" \"checking, that deepcopy behaves ok\"\n" +" example_table,\n" +" copy_table,\n" +" \"checking, that deepcopy behaves ok\"\n" " )\n" " test:isnt(\n" -" example_table,\n" -" copy_table,\n" -" \"checking, that tables are different\"\n" +" example_table,\n" +" copy_table,\n" +" \"checking, that tables are different\"\n" " )\n" " test:isnt(\n" -" example_table[1],\n" -" copy_table[1],\n" -" \"checking, that tables are different\"\n" +" example_table[1],\n" +" copy_table[1],\n" +" \"checking, that tables are different\"\n" " )\n" " test:isnt(\n" -" example_table[2],\n" -" copy_table[2],\n" -" \"checking, that tables are different\"\n" +" example_table[2],\n" +" copy_table[2],\n" +" \"checking, that tables are different\"\n" " )\n" " test:isnt(\n" -" example_table[2][2],\n" -" copy_table[2][2],\n" -" \"checking, that tables are different\"\n" +" example_table[2][2],\n" +" copy_table[2][2],\n" +" \"checking, that tables are different\"\n" " )\n" " test:isnt(\n" -" example_table[2][2][1],\n" -" copy_table[2][2][1],\n" -" \"checking, that tables are different\"\n" +" example_table[2][2][1],\n" +" copy_table[2][2][1],\n" +" \"checking, that tables are different\"\n" " )\n" "end\n" "\n" @@ -902,7 +1012,8 @@ msgstr "" "\n" "os.exit(test:check() and 0 or 1)" -msgid "When you'll test your code output will be something like this:" +#, fuzzy +msgid "When you test your code, the output will be something like this:" msgstr "После тестирования кода вывод будет примерно таким:" msgid "" @@ -926,17 +1037,19 @@ msgstr "" "ok - checking, that tables are different\n" "..." -msgid "Error Handling" +#, fuzzy +msgid "Error handling" msgstr "Обработка ошибок" msgid "Be generous in what you accept and strict in what you return." msgstr "Принимайте разнообразные значения и выдавайте строго определенные." +#, fuzzy msgid "" -"With error handling this means that you must provide an error object as " -"second multi-return value in case of error. The error object can be a " -"string, a Lua table or cdata, in the latter cases it must have " -"``__tostring`` metamethod defined." +"With error handling, this means that you must provide an error object as the" +" second multi-return value in case of error. The error object can be a " +"string, a Lua table, cdata, or userdata. In the latter three cases, it must " +"have a ``__tostring`` metamethod defined." msgstr "" "В рамках обработки ошибок это означает, что в случае ошибки вы должны " "предоставить объект ошибки как второе возвращаемое значение. Объектом ошибки" @@ -957,9 +1070,10 @@ msgstr "" "При проверке возвращаемых значений функции проверяйте сначала первый " "аргумент. Если это ``nil``, ищите ошибку во втором аргументе:" +#, fuzzy msgid "" "local data, err = foo()\n" -"if not data then\n" +"if data == nil then\n" " return nil, err\n" "end\n" "return bar(data)" @@ -970,23 +1084,26 @@ msgstr "" "end\n" "return bar(data)" +#, fuzzy msgid "" -"Unless performance of your code is paramount, try to avoid using more than " -"two return values." +"Unless the performance of your code is paramount, try to avoid using more " +"than two return values." msgstr "" "Если производительность вашего кода не имеет первоочередное значение, " "постарайтесь избегать использования более двух возвращаемых значений." +#, fuzzy msgid "" -"In rare cases you may want to return ``nil`` as a legal return value. In " -"this case it's OK to check for error first, and return second:" +"In rare cases, you may want to return ``nil`` as a legal return value. In " +"this case, it's OK to check for error first and then for return:" msgstr "" "В редких случаях ``nil`` можно сделать возвращаемым значением. В таком " "случае можно сначала проверить ошибку, а потом вернуть значение:" +#, fuzzy msgid "" "local data, err = foo()\n" -"if not err then\n" +"if err == nil then\n" " return data\n" "end\n" "return nil, err" @@ -997,7 +1114,8 @@ msgstr "" "end\n" "return nil, err" -msgid "Luacheck" +#, fuzzy +msgid "luacheck" msgstr "Luacheck" msgid "" @@ -1023,3 +1141,28 @@ msgstr "" "\"421\", -- Переопределение локальной переменной на вложенном уровне.\n" "\"431\", -- Переопределение значения, заданного ранее, в функции.\n" "\"432\", -- Перегрузка аргумента на вложенном уровне." + +#~ msgid "" +#~ "for \"very local\" variables: - ``t`` is for tables - ``i``, ``j`` are for " +#~ "indexing - ``n`` is for counting - ``k``, ``v`` is what you get out of " +#~ "``pairs()`` (are acceptable, ``_`` if unused) - ``i``, ``v`` is what you get" +#~ " out of ``ipairs()`` (are acceptable, ``_`` if unused) - ``k``/``key`` is " +#~ "for table keys - ``v``/``val``/``value`` is for values that are passed " +#~ "around - ``x``/``y``/``z`` is for generic math quantities - " +#~ "``s``/``str``/``string`` is for strings - ``c`` is for 1-char strings - " +#~ "``f``/``func``/``cb`` are for functions - ``status, ..`` or ``ok, " +#~ "..`` is what you get out of pcall/xpcall - ``buf, sz`` is a (buffer, " +#~ "size) pair - ``_p`` is for pointers - ``t0``.. is for timestamps - " +#~ "``err`` is for errors" +#~ msgstr "" +#~ "для \"самых локальных\" переменных: - ``t`` для таблиц - ``i``, ``j`` для " +#~ "индексации - ``n`` для подсчета - ``k``, ``v`` для получения из ``pairs()`` " +#~ "(допускаются, ``_`` если не используются) - ``i``, ``v`` is what you get out" +#~ " of ``ipairs()`` (допускаются, ``_`` если не используются) - ``k``/``key`` " +#~ "для ключей таблицы - ``v``/``val``/``value`` для передаваемых значений - " +#~ "``x``/``y``/``z`` для общих математических величин - " +#~ "``s``/``str``/``string`` для строк - ``c`` для односимвольных строк - " +#~ "``f``/``func``/``cb`` для функций - ``status, ..`` или ``ok, ..`` " +#~ "для получения из pcall/xpcall - ``buf, sz`` -- это пара (буфер, размер) - " +#~ "``_p`` для указателей - ``t0``.. для временных отметок - ``err`` для " +#~ "ошибок" diff --git a/locale/ru/LC_MESSAGES/dev_guide/reference_capi/box.po b/locale/ru/LC_MESSAGES/dev_guide/reference_capi/box.po index 6e182a3f84..ad4a70aa14 100644 --- a/locale/ru/LC_MESSAGES/dev_guide/reference_capi/box.po +++ b/locale/ru/LC_MESSAGES/dev_guide/reference_capi/box.po @@ -1,5 +1,6 @@ -msgid "Module `box`" +#, fuzzy +msgid "Module box" msgstr "Модуль `box`" msgid "Opaque structure passed to a C stored procedure" @@ -155,13 +156,15 @@ msgstr "" "-1 в случае ошибки (проверьте :ref:`box_error_last()`)" -msgid "See also :ref:`space_object.insert()`" +#, fuzzy +msgid "See also: :ref:`space_object.insert()`" msgstr "См. также :ref:`space_object.insert()`" msgid "Execute a REPLACE request." msgstr "Выполнение запроса замены (REPLACE)." -msgid "See also :ref:`space_object.replace()`" +#, fuzzy +msgid "See also: :ref:`space_object.replace()`" msgstr "См. также :ref:`space_object.replace()`" msgid "Execute a DELETE request." @@ -182,7 +185,8 @@ msgstr "" "аргумент вывода. Старый кортеж. Можно задать значение NULL для сброса " "результата" -msgid "See also :ref:`space_object.delete()`" +#, fuzzy +msgid "See also: :ref:`space_object.delete()`" msgstr "См. также :ref:`space_object.delete()`" msgid "Execute an UPDATE request." @@ -204,7 +208,8 @@ msgstr "" "0, если идентификаторы полей field_id с основанием 0, как в C, 1, если " "идентификаторы полей с основанием 1, как в Lua" -msgid "See also :ref:`space_object.update()`" +#, fuzzy +msgid "See also: :ref:`space_object.update()`" msgstr "См. также :ref:`space_object.update()`" msgid "Execute an UPSERT request." @@ -213,7 +218,8 @@ msgstr "Выполнение запроса обновления и вставк msgid "end of a ``ops``" msgstr "конец операций ``ops``" -msgid "See also :ref:`space_object.upsert()`" +#, fuzzy +msgid "See also: :ref:`space_object.upsert()`" msgstr "См. также :ref:`space_object.upsert()`" msgid "Truncate a space." @@ -258,3 +264,271 @@ msgid "" msgstr "" "0 при успехе и -1 в обратном случае. В случае ошибки, ее можно получить с " "помощью ``box_error_last()``." + +msgid "" +"Since version :doc:`2.11.0 `. Return the database schema " +"version. A schema version is a number that indicates whether the " +":ref:`database schema ` is changed. For " +"example, the ``schema_version`` value grows if a :ref:`space ` or :ref:`index ` is added or deleted, or a " +"space, index, or field name is changed." +msgstr "" + +msgid "the database schema version" +msgstr "" + +#, fuzzy +msgid "Return type" +msgstr "Возвращает" + +msgid "number" +msgstr "" + +msgid "" +"See also: :ref:`box.info.schema_version ` and " +":ref:`IPROTO_SCHEMA_VERSION `" +msgstr "" + +#, fuzzy +msgid "" +"Since version :doc:`2.11.0 `. Return the unique identifier " +"(ID) for the current session." +msgstr "" +"С версии :doc:`2.4.1 `. Возврат последнего полученного " +"значения из указанной последовательности." + +msgid "the session identifier; 0 or -1 if there is no session" +msgstr "" + +#, fuzzy +msgid "See also: :ref:`box.session.id() `" +msgstr "См. также :ref:`space_object.update()`" + +msgid "" +"Since version :doc:`2.11.0 `. Send an :ref:`IPROTO " +"` packet over the session's socket with the given " +"MsgPack header and body. The function yields. The function works for binary " +"sessions only. For details, see :ref:`box.session.type() `." +msgstr "" + +msgid "" +"the IPROTO session identifier (see :ref:`box_session_id() " +"`)" +msgstr "" + +msgid "a MsgPack-encoded header" +msgstr "" + +msgid "end of a header encoded as MsgPack" +msgstr "" + +msgid "" +"a MsgPack-encoded body. If the ``body`` and ``body_end`` parameters are " +"omitted, the packet consists of the header only." +msgstr "" + +msgid "end of a body encoded as MsgPack" +msgstr "" + +#, fuzzy +msgid "" +"0 on success; -1 on error (check :ref:`box_error_last() `)" +msgstr "" +"-1 в случае ошибки (проверьте :ref:`box_error_last()`)" + +msgid "See also: :ref:`box.iproto.send() `" +msgstr "" + +msgid "**Possible errors:**" +msgstr "" + +msgid ":errcode:`ER_SESSION_CLOSED` -- the session is closed." +msgstr "" + +msgid ":errcode:`ER_NO_SUCH_SESSION` -- the session does not exist." +msgstr "" + +msgid ":errcode:`ER_MEMORY_ISSUE` -- out-of-memory limit has been reached." +msgstr "" + +msgid ":errcode:`ER_WRONG_SESSION_TYPE` -- the session type is not binary." +msgstr "" + +msgid "" +"For details, see `src/box/errcode.h " +"`__." +msgstr "" + +msgid "**Example**" +msgstr "" + +msgid "" +"/* IPROTO constants are not exported to C.\n" +"* That is, the user encodes them by himself.\n" +"*/\n" +"#define IPROTO_REQUEST_TYPE 0x00\n" +"#define IPROTO_OK 0x00\n" +"#define IPROTO_SYNC 0x01\n" +"#define IPROTO_SCHEMA_VERSION 0x05\n" +"#define IPROTO_DATA 0x30\n" +"\n" +"char buf[256] = {};\n" +"char *header = buf;\n" +"char *header_end = header;\n" +"header_end = mp_encode_map(header_end, 3);\n" +"header_end = mp_encode_uint(header_end, IPROTO_REQUEST_TYPE);\n" +"header_end = mp_encode_uint(header_end, IPROTO_OK);\n" +"header_end = mp_encode_uint(header_end, IPROTO_SYNC);\n" +"header_end = mp_encode_uint(header_end, 10);\n" +"header_end = mp_encode_uint(header_end, IPROTO_SCHEMA_VERSION);\n" +"header_end = mp_encode_uint(header_end, box_schema_version());\n" +"\n" +"char *body = header_end;\n" +"char *body_end = body;\n" +"body_end = mp_encode_map(body_end, 1);\n" +"body_end = mp_encode_uint(body_end, IPROTO_DATA);\n" +"body_end = mp_encode_uint(body_end, 1);\n" +"\n" +"/* The packet contains both the header and body. */\n" +"box_iproto_send(box_session_id(), header, header_end, body, body_end);\n" +"\n" +"/* The packet contains the header only. */\n" +"box_iproto_send(box_session_id(), header, header_end, NULL, NULL);" +msgstr "" + +msgid "" +"Since version :doc:`2.11.0 `. Set a new IPROTO request " +"handler with the provided context for the given request type. The function " +"yields." +msgstr "" + +msgid "" +"IPROTO request type code (for example, ``IPROTO_SELECT``). For details, " +"check :ref:`Client-server requests and responses `. To override the handler of unknown request types, use" +" the :ref:`IPROTO_UNKNOWN ` type code." +msgstr "" + +msgid "" +"IPROTO request type code (for example, ``IPROTO_SELECT``). For details, " +"check :ref:`Client-server requests and responses `." +msgstr "" + +msgid "" +"To override the handler of unknown request types, use the " +":ref:`IPROTO_UNKNOWN ` type code." +msgstr "" + +msgid "" +"IPROTO request handler. To reset the request handler, set the ``handler`` " +"parameter to ``NULL``. See the full parameter description in the " +":ref:`Handler function ` section." +msgstr "" + +msgid "" +"IPROTO request handler destructor. The destructor is called when the " +"corresponding handler is removed. See the full parameter description in the " +":ref:`Handler destructor function ` " +"section." +msgstr "" + +msgid "a context passed to the ``handler`` and ``destroy`` callbacks" +msgstr "" + +msgid "" +"See also: :ref:`box.iproto.override() `" +msgstr "" + +msgid "" +"If a Lua handler throws an exception, the behavior is similar to that of a " +"remote procedure call. The following errors are returned to the client over " +"IPROTO (see `src/lua/utils.h " +"`__):" +msgstr "" + +msgid "" +":errcode:`ER_PROC_LUA` -- an exception is thrown from a Lua handler, " +"diagnostic is not set." +msgstr "" + +msgid "" +"diagnostics from ``src/box/errcode.h`` -- an exception is thrown, diagnostic" +" is set." +msgstr "" + +msgid "**Handler function**" +msgstr "" + +msgid "The signature of a handler function (the ``handler`` parameter):" +msgstr "" + +msgid "" +"enum iproto_handler_status {\n" +" IPROTO_HANDLER_OK,\n" +" IPROTO_HANDLER_ERROR,\n" +" IPROTO_HANDLER_FALLBACK,\n" +"}\n" +"\n" +"typedef enum iproto_handler_status\n" +"(*iproto_handler_t)(const char *header, const char *header_end,\n" +" const char *body, const char *body_end, void *ctx);" +msgstr "" + +msgid "where:" +msgstr "" + +msgid "``header`` (const char*) -- a MsgPack-encoded header" +msgstr "" + +msgid "``header_end`` (const char*) -- end of a header encoded as MsgPack" +msgstr "" + +msgid "``body`` (const char*) -- a MsgPack-encoded body" +msgstr "" + +msgid "``header_end`` (const char*) -- end of a body encoded as MsgPack" +msgstr "" + +msgid "The handler returns a status code. Possible statuses:" +msgstr "" + +msgid "``IPROTO_REQUEST_HANDLER_OK`` -- success" +msgstr "" + +msgid "" +"``IPROTO_REQUEST_HANDLER_ERROR`` -- error, diagnostic must be set by handler" +" (see :ref:`box_error_set() ` and " +":ref:`box_error_raise() `)" +msgstr "" + +msgid "``IPROTO_REQUEST_HANDLER_FALLBACK`` -- fallback to the default handler" +msgstr "" + +msgid "**Handler destructor function**" +msgstr "" + +msgid "" +"The destructor is called when the handler is reset. The signature of a " +"destructor function (the ``destroy`` parameter):" +msgstr "" + +msgid "typedef void (*iproto_handler_destroy_t)(void *ctx);" +msgstr "" + +msgid "" +"``ctx`` (void*): the context provided by ``box_iproto_override()`` function." +msgstr "" + +msgid "**Examples**" +msgstr "" + +msgid "" +"box_iproto_override(1000, iproto_request_handler_с, NULL)\n" +"box_iproto_override(IPROTO_SELECT, iproto_request_handler_с, (uintptr_t)23)\n" +"box_iproto_override(IPROTO_SELECT, NULL, NULL)\n" +"box_iproto_override(IPROTO_UNKNOWN, iproto_unknown_request_handler_с, &ctx)" +msgstr "" diff --git a/locale/ru/LC_MESSAGES/dev_guide/reference_capi/box_index.po b/locale/ru/LC_MESSAGES/dev_guide/reference_capi/box_index.po index 8e066a1021..f73947eaa8 100644 --- a/locale/ru/LC_MESSAGES/dev_guide/reference_capi/box_index.po +++ b/locale/ru/LC_MESSAGES/dev_guide/reference_capi/box_index.po @@ -1,5 +1,6 @@ -msgid "Module `index`" +#, fuzzy +msgid "Module index" msgstr "Модуль `index`" msgid "A space iterator" diff --git a/locale/ru/LC_MESSAGES/dev_guide/reference_capi/clock.po b/locale/ru/LC_MESSAGES/dev_guide/reference_capi/clock.po index 922f07a7f4..b201856173 100644 --- a/locale/ru/LC_MESSAGES/dev_guide/reference_capi/clock.po +++ b/locale/ru/LC_MESSAGES/dev_guide/reference_capi/clock.po @@ -1,3 +1,4 @@ -msgid "Module `clock`" +#, fuzzy +msgid "Module clock" msgstr "Модуль `clock`" diff --git a/locale/ru/LC_MESSAGES/dev_guide/reference_capi/coio.po b/locale/ru/LC_MESSAGES/dev_guide/reference_capi/coio.po index 50446ecbdb..fcbf8a7269 100644 --- a/locale/ru/LC_MESSAGES/dev_guide/reference_capi/coio.po +++ b/locale/ru/LC_MESSAGES/dev_guide/reference_capi/coio.po @@ -1,5 +1,6 @@ -msgid "Module `coio`" +#, fuzzy +msgid "Module coio" msgstr "Модуль `coio`" msgid "READ event" diff --git a/locale/ru/LC_MESSAGES/dev_guide/reference_capi/error.po b/locale/ru/LC_MESSAGES/dev_guide/reference_capi/error.po index ceb380c19b..26e7820a74 100644 --- a/locale/ru/LC_MESSAGES/dev_guide/reference_capi/error.po +++ b/locale/ru/LC_MESSAGES/dev_guide/reference_capi/error.po @@ -1,11 +1,16 @@ -msgid "Module `error`" +#, fuzzy +msgid "Module error" msgstr "Модуль `error`" -msgid "For a complete list of errors, refer to the Tarantool" -" `error code header file `__" -msgstr "Полный список ошибок Tarantool находится в " -"`файле заголовка errcode.h `__" +#, fuzzy +msgid "" +"For a complete list of errors, refer to the Tarantool `error code header " +"file " +"`__." +msgstr "" +"Полный список ошибок Tarantool находится в `файле заголовка errcode.h " +"`__" msgid "Error -- contains information about error." msgstr "Ошибка -- содержит информацию об ошибке." diff --git a/locale/ru/LC_MESSAGES/dev_guide/reference_capi/fiber.po b/locale/ru/LC_MESSAGES/dev_guide/reference_capi/fiber.po index e6a74ec64d..6605613abe 100644 --- a/locale/ru/LC_MESSAGES/dev_guide/reference_capi/fiber.po +++ b/locale/ru/LC_MESSAGES/dev_guide/reference_capi/fiber.po @@ -1,10 +1,12 @@ -msgid "Module `fiber`" +#, fuzzy +msgid "Module fiber" msgstr "Модуль `fiber`" +#, fuzzy msgid "" -"Fiber - contains information about a :ref:`fiber `." +"Fiber - contains information about a :ref:`fiber " +"`." msgstr "" "Файбер -- содержит информацию о :ref:`файбере `." @@ -89,15 +91,16 @@ msgid "Cancel the subject fiber." msgstr "Отмена файбера." msgid "" -"Cancellation is asynchronous. Use :ref:`fiber_join()` " -"to wait for the cancellation to complete." +"Cancellation is asynchronous. Use :ref:`fiber_join()` to wait for the cancellation to complete." msgstr "" "Отмена файбера происходит асинхронно. Чтобы дождаться окончания отмены, " "используйте :ref:`fiber_join()`." msgid "" -"After ``fiber_cancel()`` is called, the fiber may or may not check whether it " -"was cancelled. If the fiber does not check it, it cannot ever be cancelled." +"After ``fiber_cancel()`` is called, the fiber may or may not check whether " +"it was cancelled. If the fiber does not check it, it cannot ever be " +"cancelled." msgstr "" "После вызова ``fiber_cancel()`` файбер может проверить, был ли он отменен. " "Если он этого не сделает, его отменить невозможно. " @@ -105,9 +108,10 @@ msgstr "" msgid "fiber to be cancelled" msgstr "отменяемый файбер" +#, fuzzy msgid "" -"Make it possible or not possible to wakeup the current fiber immediately " -"when it's cancelled." +"Deprecated since :doc:`2.11.0 `. Make it possible or not " +"possible to wakeup the current fiber immediately when it's cancelled." msgstr "" "Возможность или невозможность пробуждения текущего файбера сразу после его " "отмены." @@ -158,7 +162,16 @@ msgstr "Проверка отмены текущего файбера (это д msgid "Report loop begin time as double (cheap)." msgstr "Сообщение времени начала цикла в виде числа двойной точности." -msgid "Report loop begin time as 64-bit int." +#, fuzzy +msgid "Report loop begin time as 64-bit int. Uses real time clock." +msgstr "Сообщение времени начала цикла в виде 64-битного целого числа." + +#, fuzzy +msgid "Report loop begin time as double (cheap). Uses monotonic clock." +msgstr "Сообщение времени начала цикла в виде числа двойной точности." + +#, fuzzy +msgid "Report loop begin time as 64-bit int. Uses monotonic clock." msgstr "Сообщение времени начала цикла в виде 64-битного целого числа." msgid "Reschedule fiber to end of event loop cycle." @@ -218,11 +231,11 @@ msgstr "контейнер с атрибутами файбера или NULL, msgid "stack size (in bytes)" msgstr "размер стека (в байтах)" +#, fuzzy msgid "" "A conditional variable: a synchronization primitive that allow fibers in " -"Tarantool's :ref:`cooperative multitasking ` environment to yield until some predicate is " -"satisfied." +"Tarantool's :ref:`cooperative multitasking ` " +"environment to yield until some predicate is satisfied." msgstr "" "Условная переменная: примитив синхронизации, который позволяет файберам в " "среде :ref:`кооперативной многозадачности `" diff --git a/locale/ru/LC_MESSAGES/dev_guide/reference_capi/latch.po b/locale/ru/LC_MESSAGES/dev_guide/reference_capi/latch.po index 64c4b8cca7..49095af841 100644 --- a/locale/ru/LC_MESSAGES/dev_guide/reference_capi/latch.po +++ b/locale/ru/LC_MESSAGES/dev_guide/reference_capi/latch.po @@ -1,5 +1,6 @@ -msgid "Module `latch`" +#, fuzzy +msgid "Module latch" msgstr "Модуль `latch`" msgid "A lock for cooperative multitasking environment" @@ -31,13 +32,9 @@ msgstr "удаляемая защелка" msgid "" "Lock a latch. Waits indefinitely until the current fiber can gain access to " -"the latch." +"the latch. Since version :doc:`2.11.0 `, locks are acquired" +" exactly in the order in which they were requested." msgstr "" -"Применение защелки. Бесконечно ожидает момента, когда текущий файбер может " -"получить доступ к защелке." - -msgid "param box_latch_t* latch" -msgstr "param box_latch_t* latch" msgid "latch to lock" msgstr "применяемая защелка" @@ -60,3 +57,13 @@ msgstr "" msgid "latch to unlock" msgstr "отменяемая защелка" + +#~ msgid "" +#~ "Lock a latch. Waits indefinitely until the current fiber can gain access to " +#~ "the latch." +#~ msgstr "" +#~ "Применение защелки. Бесконечно ожидает момента, когда текущий файбер может " +#~ "получить доступ к защелке." + +#~ msgid "param box_latch_t* latch" +#~ msgstr "param box_latch_t* latch" diff --git a/locale/ru/LC_MESSAGES/dev_guide/reference_capi/on_shutdown.po b/locale/ru/LC_MESSAGES/dev_guide/reference_capi/on_shutdown.po index 88e3761a41..ae528b520d 100644 --- a/locale/ru/LC_MESSAGES/dev_guide/reference_capi/on_shutdown.po +++ b/locale/ru/LC_MESSAGES/dev_guide/reference_capi/on_shutdown.po @@ -1,5 +1,5 @@ -msgid "Function `on_shutdown`" +msgid "Function on_shutdown" msgstr "" msgid "Register and/or deregister an on_shutdown function." @@ -65,3 +65,6 @@ msgstr "" msgid "Added in version :doc:`2.8.1 `." msgstr "" + +#~ msgid "Function `on_shutdown`" +#~ msgstr "" diff --git a/locale/ru/LC_MESSAGES/dev_guide/reference_capi/say.po b/locale/ru/LC_MESSAGES/dev_guide/reference_capi/say.po index b0f051d560..0b469b418f 100644 --- a/locale/ru/LC_MESSAGES/dev_guide/reference_capi/say.po +++ b/locale/ru/LC_MESSAGES/dev_guide/reference_capi/say.po @@ -1,5 +1,6 @@ -msgid "Module `say` (logging)" +#, fuzzy +msgid "Module say (logging)" msgstr "Модуль `say` (запись в журнал)" msgid "do not use this value directly" @@ -26,5 +27,6 @@ msgstr "См. также :manpage:`printf(3)`, :ref:`say_level`" -msgstr ":ref:`проводник спейсов `" - -msgid "" -":ref:`upgrade of environment-independent applications in production " -"`" -msgstr "" -":ref:`обновление независимых от среды приложений на рабочих серверах " -"`" - -msgid "Otherwise, consult the following documentation for:" -msgstr "" -"Либо обратитесь к следующей документации чтобы" -" получить:" - -msgid "" -"basic information on `deploying and managing a Tarantool cluster " -"`_" -msgstr "" -"базовую информацию о `развертывании и управлении Tarantool-кластером " -"`_" - -msgid "" -"more information on `managing Tarantool instances " -"`_." -msgstr "" -"дополнительную информацию об `управлении экземплярами Tarantool " -"`_" - -msgid "Exploring spaces" -msgstr "Анализ спейсов" - -msgid "" -"The web interface lets you connect (in the browser) to any instance in the " -"cluster and see what spaces it stores (if any) and their contents." -msgstr "" -"Веб-интерфейс позволяет подключиться к любому экземпляру в кластере в " -"браузере, чтобы проверить, какие в нем хранятся спейсы (если они есть) и их " -"содержимое." - -msgid "To explore spaces:" -msgstr "Чтобы просмотреть спейсы:" - -msgid "Open the **Space Explorer** tab in the menu on the left:" -msgstr "Откройте вкладку **Space Explorer** (Проводник спейсов) в меню слева:" - -msgid "" -"Click **connect** next to an instance that stores data. The basic sanity-" -"check (``test.py``) of the example application puts sample data to one " -"replica set (shard), so its master and replica store the data in their " -"spaces:" -msgstr "" -"Нажмите **connect** (подключиться) рядом с экземпляром, в котором хранятся " -"данные. Базовая проверка работоспособности (``test.py``) из примера " -"приложения размещает образцы данных в одном наборе реплик (шарде), поэтому " -"его мастер и реплика хранят данные в своих спейсах:" - -msgid "" -"When connected to a instance, the space explorer shows a table with basic " -"information on its spaces. For more information, see the `box.space " -"reference `_." -msgstr "" -"При подключении к экземпляру проводник спейсов отображает таблицу с базовой " -"информацией по спейсам. Для получения дополнительной информации см. " -"`справочник по box.space " -"`_." - -msgid "To see hidden spaces, tick the corresponding checkbox:" -msgstr "Чтобы просмотреть скрытые спейсы, отметьте соответствующий флажок:" - -msgid "Click the space's name to see its format and contents:" -msgstr "" -"Нажмите на имя спейса, чтобы увидеть информацию о его формате и содержимом:" - -msgid "" -"To search the data, select an index and, optionally, its iteration type from" -" the drop-down lists, and enter the index value:" -msgstr "" -"Для поиска данных выберите индекс и (необязательно) его тип итерации из " -"выпадающего списка и введите значение индекса:" - -msgid "Upgrading in production" -msgstr "Обновление в эксплуатационной среде" - -msgid "" -"To upgrade either a single instance or a cluster, you need a new version of " -"the packaged (archived) application." -msgstr "" -"Чтобы выполнить обновление отдельного экземпляра или кластера, необходима " -"новая версия пакетного (или архивированного) приложения." - -msgid "A single instance upgrade is simple:" -msgstr "Обновить отдельный экземпляр просто:" - -msgid "Upload the package (archive) to the server." -msgstr "Загрузите пакет (архив) на сервер." - -msgid "Stop the current instance." -msgstr "Остановите текущий экземпляр." - -msgid "" -"Deploy the new one as described in :ref:`deploying packaged applications " -"` (or :ref:`archived ones `)." -msgstr "" -"Разверните новый экземпляр, как описано в разделе о развертывании " -":ref:`пакетных приложений ` (или " -":ref:`архивированных `)." - -msgid "Cluster upgrade" -msgstr "Обновление кластера" - -msgid "To upgrade a cluster, choose one of the following scenarios:" -msgstr "Чтобы обновить кластер, выберите один из следующих сценариев:" - -msgid "" -"**Cluster shutdown**. Recommended for backward-incompatible updates, " -"requires downtime." -msgstr "" -"**Завершение работы кластера**. Рекомендуется для обновлений без обратной " -"совместимости, требует простоя." - -msgid "" -"**Instance by instance**. Recommended for backward-compatible updates, does " -"not require downtime." -msgstr "" -"**Поочередное обновление**. Рекомендуется для обновлений с обратной " -"совместимостью, не требует простоя." - -msgid "To upgrade the cluster, do the following:" -msgstr "Чтобы обновить кластер, выполните следующие действия:" - -msgid "Schedule a downtime or plan for the instance-by-instance upgrade." -msgstr "Запланируйте время простоя или поочередное обновление экземпляров." - -msgid "Upload a new application package (archive) to all servers." -msgstr "Загрузите новый пакет (или архив) приложения на все серверы." - -msgid "Next, execute the chosen scenario:" -msgstr "Далее действуйте по выбранному сценарию:" - -msgid "**Cluster shutdown**:" -msgstr "**Завершение работы кластера**:" - -msgid "Stop all instances on all servers." -msgstr "Остановите все экземпляры на всех серверах." - -msgid "Deploy the new package (archive) on every server." -msgstr "Разверните новый пакет (архив) на каждом сервере." - -msgid "" -"**Instance by instance**. Do the following in every replica set in " -"succession:" -msgstr "" -"**Поочередное обновление**. Выполните следующие действия для каждого набора " -"реплик поочередно:" - -msgid "Stop a replica on any server." -msgstr "Остановите реплику на любом сервере." - -msgid "Deploy the new package (archive) in place of the old replica." -msgstr "Разверните новый пакет (архив) на месте старой реплики." - -msgid "" -"Promote the new replica to a master (see `Switching the replica set's " -"master`_ section in the Tarantool manual)." -msgstr "" -"Переведите новую реплику в статус мастера (см. раздел `Смена мастера в " -"наборе реплик " -"`_ в руководстве по Tarantool)." - -msgid "" -"Redeploy the old master and the rest of the instances in the replica set." -msgstr "" -"Повторно разверните старый мастер и остальные экземпляры в наборе реплик." - -msgid "Be prepared to resolve possible logic conflicts." -msgstr "Будьте готовы решать возможные проблемы с логикой." - #~ msgid "" #~ "To enable it manually, click **Log in** in the upper left corner, enter the " #~ "credentials, click another **Log in** and the **Auth: disabled** switch (it " @@ -471,12 +281,10 @@ msgstr "Будьте готовы решать возможные проблем #~ msgid "" #~ "For more information on buckets and replica set's weights, see the `vshard " -#~ "module documentation " -#~ "`_." +#~ "module documentation `_." #~ msgstr "" #~ "Для получения дополнительной информации о сегментах и весах набора реплик " -#~ "см. `документацию по модулю vshard " -#~ "`_." +#~ "см. `документацию по модулю vshard `_." #~ msgid "" #~ "Bootstrap ``vshard`` by clicking the corresponding button and OK, or by " @@ -736,14 +544,14 @@ msgstr "Будьте готовы решать возможные проблем #~ "Rebalancing (resharding) is initiated periodically and upon adding a new " #~ "replica set with a non-zero weight to the cluster. For more information, see" #~ " the `rebalancing process section " -#~ "`_ of the ``vshard`` module documentation." +#~ "`_ of the ``vshard`` " +#~ "module documentation." #~ msgstr "" #~ "Балансировка (повторный шардинг) запускается регулярно, а также после " #~ "добавления нового набора реплик с ненулевым весом в кластер. Для получения " #~ "дополнительной информации см. `раздел о процессе балансировки " -#~ "`_ в документации по модулю ``vshard``." +#~ "`_ в документации по" +#~ " модулю ``vshard``." #~ msgid "" #~ "The most convenient way to trace through the process of rebalancing is to " @@ -871,13 +679,11 @@ msgstr "Будьте готовы решать возможные проблем #~ "Статус восстановления после отказа изменится на **enabled** (включено):" #~ msgid "" -#~ "For more information, see the `replication section " -#~ "`_ of the Tarantool " -#~ "manual." +#~ "For more information, see the `replication section `_ of" +#~ " the Tarantool manual." #~ msgstr "" #~ "Для получения дополнительной информации см. `раздел по репликации " -#~ "`_ в руководстве по " -#~ "Tarantool." +#~ "`_ в руководстве по Tarantool." #~ msgid "Switching the replica set's master" #~ msgstr "Смена мастера в наборе реплик" @@ -1404,34 +1210,211 @@ msgstr "Будьте готовы решать возможные проблем #~ msgstr "Разрешение проблем" #~ msgid "" -#~ "Please see the `Troubleshooting guide " -#~ "`_ in the " +#~ "Please see the `Troubleshooting guide `_ in the " #~ "Tarantool manual." #~ msgstr "" #~ "Обратитесь к `Руководству по разрешению проблем " -#~ "`_ в руководстве " -#~ "по Tarantool." +#~ "`_ в руководстве по Tarantool." #~ msgid "Disaster recovery" #~ msgstr "Аварийное восстановление" #~ msgid "" -#~ "Please see the section `Disaster recovery " -#~ "`_ in the " -#~ "Tarantool manual." +#~ "Please see the section `Disaster recovery `_" +#~ " in the Tarantool manual." #~ msgstr "" #~ "Обратитесь к `Руководству по аварийному восстановлению " -#~ "`_ в " -#~ "руководстве по Tarantool." +#~ "`_ в руководстве по Tarantool." #~ msgid "Backups" #~ msgstr "Резервное копирование" #~ msgid "" -#~ "Please see the section `Backups " -#~ "`_ in the Tarantool " +#~ "Please see the section `Backups `_ in the Tarantool " #~ "manual." #~ msgstr "" -#~ "Обратитесь к `Руководству по резервному копированию " -#~ "`_ в руководстве по " -#~ "Tarantool." +#~ "Обратитесь к `Руководству по резервному копированию `_" +#~ " в руководстве по Tarantool." + +#~ msgid "" +#~ "This guide focuses on Enterprise-specific administration features available " +#~ "on top of Tarantool Community Edition with Tarantool Cartridge framework:" +#~ msgstr "" +#~ "В этом руководстве особое внимание уделяется функциям разработчика, " +#~ "специфичным для Enterprise-версии, которые доступны в дополнение к версии " +#~ "Tarantool с открытым исходным кодом в среде Tarantool Cartridge:" + +#~ msgid ":ref:`space explorer `" +#~ msgstr ":ref:`проводник спейсов `" + +#~ msgid "" +#~ ":ref:`upgrade of environment-independent applications in production " +#~ "`" +#~ msgstr "" +#~ ":ref:`обновление независимых от среды приложений на рабочих серверах " +#~ "`" + +#~ msgid "Otherwise, consult the following documentation for:" +#~ msgstr "Либо обратитесь к следующей документации чтобы получить:" + +#~ msgid "" +#~ "basic information on `deploying and managing a Tarantool cluster " +#~ "`_" +#~ msgstr "" +#~ "базовую информацию о `развертывании и управлении Tarantool-кластером " +#~ "`_" + +#~ msgid "more information on `managing Tarantool instances `_." +#~ msgstr "" +#~ "дополнительную информацию об `управлении экземплярами Tarantool " +#~ "`_" + +#~ msgid "Exploring spaces" +#~ msgstr "Анализ спейсов" + +#~ msgid "" +#~ "The web interface lets you connect (in the browser) to any instance in the " +#~ "cluster and see what spaces it stores (if any) and their contents." +#~ msgstr "" +#~ "Веб-интерфейс позволяет подключиться к любому экземпляру в кластере в " +#~ "браузере, чтобы проверить, какие в нем хранятся спейсы (если они есть) и их " +#~ "содержимое." + +#~ msgid "To explore spaces:" +#~ msgstr "Чтобы просмотреть спейсы:" + +#~ msgid "Open the **Space Explorer** tab in the menu on the left:" +#~ msgstr "Откройте вкладку **Space Explorer** (Проводник спейсов) в меню слева:" + +#~ msgid "" +#~ "Click **connect** next to an instance that stores data. The basic sanity-" +#~ "check (``test.py``) of the example application puts sample data to one " +#~ "replica set (shard), so its master and replica store the data in their " +#~ "spaces:" +#~ msgstr "" +#~ "Нажмите **connect** (подключиться) рядом с экземпляром, в котором хранятся " +#~ "данные. Базовая проверка работоспособности (``test.py``) из примера " +#~ "приложения размещает образцы данных в одном наборе реплик (шарде), поэтому " +#~ "его мастер и реплика хранят данные в своих спейсах:" + +#~ msgid "" +#~ "When connected to a instance, the space explorer shows a table with basic " +#~ "information on its spaces. For more information, see the `box.space " +#~ "reference `_." +#~ msgstr "" +#~ "При подключении к экземпляру проводник спейсов отображает таблицу с базовой " +#~ "информацией по спейсам. Для получения дополнительной информации см. " +#~ "`справочник по box.space `_." + +#~ msgid "To see hidden spaces, tick the corresponding checkbox:" +#~ msgstr "Чтобы просмотреть скрытые спейсы, отметьте соответствующий флажок:" + +#~ msgid "Click the space's name to see its format and contents:" +#~ msgstr "" +#~ "Нажмите на имя спейса, чтобы увидеть информацию о его формате и содержимом:" + +#~ msgid "" +#~ "To search the data, select an index and, optionally, its iteration type from" +#~ " the drop-down lists, and enter the index value:" +#~ msgstr "" +#~ "Для поиска данных выберите индекс и (необязательно) его тип итерации из " +#~ "выпадающего списка и введите значение индекса:" + +#~ msgid "Upgrading in production" +#~ msgstr "Обновление в эксплуатационной среде" + +#~ msgid "" +#~ "To upgrade either a single instance or a cluster, you need a new version of " +#~ "the packaged (archived) application." +#~ msgstr "" +#~ "Чтобы выполнить обновление отдельного экземпляра или кластера, необходима " +#~ "новая версия пакетного (или архивированного) приложения." + +#~ msgid "A single instance upgrade is simple:" +#~ msgstr "Обновить отдельный экземпляр просто:" + +#~ msgid "Upload the package (archive) to the server." +#~ msgstr "Загрузите пакет (архив) на сервер." + +#~ msgid "Stop the current instance." +#~ msgstr "Остановите текущий экземпляр." + +#~ msgid "" +#~ "Deploy the new one as described in :ref:`deploying packaged applications " +#~ "` (or :ref:`archived ones `)." +#~ msgstr "" +#~ "Разверните новый экземпляр, как описано в разделе о развертывании " +#~ ":ref:`пакетных приложений ` (или " +#~ ":ref:`архивированных `)." + +#~ msgid "Cluster upgrade" +#~ msgstr "Обновление кластера" + +#~ msgid "To upgrade a cluster, choose one of the following scenarios:" +#~ msgstr "Чтобы обновить кластер, выберите один из следующих сценариев:" + +#~ msgid "" +#~ "**Cluster shutdown**. Recommended for backward-incompatible updates, " +#~ "requires downtime." +#~ msgstr "" +#~ "**Завершение работы кластера**. Рекомендуется для обновлений без обратной " +#~ "совместимости, требует простоя." + +#~ msgid "" +#~ "**Instance by instance**. Recommended for backward-compatible updates, does " +#~ "not require downtime." +#~ msgstr "" +#~ "**Поочередное обновление**. Рекомендуется для обновлений с обратной " +#~ "совместимостью, не требует простоя." + +#~ msgid "To upgrade the cluster, do the following:" +#~ msgstr "Чтобы обновить кластер, выполните следующие действия:" + +#~ msgid "Schedule a downtime or plan for the instance-by-instance upgrade." +#~ msgstr "Запланируйте время простоя или поочередное обновление экземпляров." + +#~ msgid "Upload a new application package (archive) to all servers." +#~ msgstr "Загрузите новый пакет (или архив) приложения на все серверы." + +#~ msgid "Next, execute the chosen scenario:" +#~ msgstr "Далее действуйте по выбранному сценарию:" + +#~ msgid "**Cluster shutdown**:" +#~ msgstr "**Завершение работы кластера**:" + +#~ msgid "Stop all instances on all servers." +#~ msgstr "Остановите все экземпляры на всех серверах." + +#~ msgid "Deploy the new package (archive) on every server." +#~ msgstr "Разверните новый пакет (архив) на каждом сервере." + +#~ msgid "" +#~ "**Instance by instance**. Do the following in every replica set in " +#~ "succession:" +#~ msgstr "" +#~ "**Поочередное обновление**. Выполните следующие действия для каждого набора " +#~ "реплик поочередно:" + +#~ msgid "Stop a replica on any server." +#~ msgstr "Остановите реплику на любом сервере." + +#~ msgid "Deploy the new package (archive) in place of the old replica." +#~ msgstr "Разверните новый пакет (архив) на месте старой реплики." + +#~ msgid "" +#~ "Promote the new replica to a master (see `Switching the replica set's " +#~ "master`_ section in the Tarantool manual)." +#~ msgstr "" +#~ "Переведите новую реплику в статус мастера (см. раздел `Смена мастера в " +#~ "наборе реплик `_ в руководстве по Tarantool)." + +#~ msgid "" +#~ "Redeploy the old master and the rest of the instances in the replica set." +#~ msgstr "" +#~ "Повторно разверните старый мастер и остальные экземпляры в наборе реплик." + +#~ msgid "Be prepared to resolve possible logic conflicts." +#~ msgstr "Будьте готовы решать возможные проблемы с логикой." diff --git a/locale/ru/LC_MESSAGES/enterprise/audit.po b/locale/ru/LC_MESSAGES/enterprise/audit.po index 31cbc2cd18..d5e18986c9 100644 --- a/locale/ru/LC_MESSAGES/enterprise/audit.po +++ b/locale/ru/LC_MESSAGES/enterprise/audit.po @@ -2,12 +2,13 @@ msgid "Security audit" msgstr "Аудит безопасности" +#, fuzzy msgid "" -"This document will help you audit the security of a Tarantool Enterprise Edition's " -"cluster. It explains certain security aspects, their rationale, and the ways" -" to check them. For details on how to configure Tarantool Enterprise Edition and its" -" infrastructure for each aspect, refer to the :doc:`security hardening guide" -" `." +"This document will help you audit the security of a Tarantool cluster. It " +"explains certain security aspects, their rationale, and the ways to check " +"them. For details on how to configure Tarantool Enterprise Edition and its " +"infrastructure for each aspect, refer to the :doc:`security hardening guide " +"`." msgstr "" "В этом документе рассказано, как провести аудит безопасности кластера Tarantool Enterprise. Здесь рассмотрены различные аспекты защиты, их смысл, а также способы проверки. Подробнее о том, как настроить Tarantool Enterprise и его инфраструктуру, вы узнаете из :doc:`инструкций по повышению безопасности\n" "`." @@ -15,12 +16,11 @@ msgstr "" msgid "Encryption of external iproto traffic" msgstr "Шифрование внешнего трафика iproto" +#, fuzzy msgid "" "Tarantool uses the :doc:`iproto binary protocol " -"` for replicating data between " -"instances and also in the connector libraries. Iproto doesn't have built-in " -"encryption. All iproto connections between data centers must use a separate " -"encryption mechanism, such as a VPN." +"` for replicating data between instances " +"and also in the connector libraries." msgstr "" "В Tarantool используется :doc:`бинарный протокол iproto " "` для репликации данных между " @@ -28,17 +28,29 @@ msgstr "" "системы шифрования. Все соединения iproto с дата-центрами должны быть " "зашифрованы, например через отдельное VPN-соединение." +msgid "" +"Since version 2.10.0, the Enterprise Edition has the built-in support for " +"using SSL to encrypt the client-server communications over binary " +"connections. For details on enabling SSL encryption, see the " +":ref:`enterprise-iproto-encryption` section of this document." +msgstr "" + +msgid "" +"In case the built-in encryption is not enabled, we recommend using VPN to " +"secure data exchange between data centers." +msgstr "" + msgid "Closed iproto ports" msgstr "Закрытые порты iproto" msgid "" -"When a Tarantool cluster does not use iproto for external " -"requests, connections to the iproto ports should be allowed only between " -"Tarantool instances." +"When a Tarantool cluster does not use iproto for external requests, " +"connections to the iproto ports should be allowed only between Tarantool " +"instances." msgstr "" -"Если в кластере Tarantool не используется iproto для внешних " -"запросов, подключение к портам iproto должно разрешаться только между " -"экземплярами Tarantool." +"Если в кластере Tarantool не используется iproto для внешних запросов, " +"подключение к портам iproto должно разрешаться только между экземплярами " +"Tarantool." msgid "" "For more details on configuring ports for iproto, see the ``advertise_uri`` " @@ -51,33 +63,32 @@ msgid "HTTPS connection termination" msgstr "Механизм HTTPS termination" msgid "" -"A Tarantool instance can accept HTTP connections from external " -"services or access the administrative web UI. All such connections must " -"go through an HTTPS-providing web server, running on the same host, such as " -"nginx. This requirement is for both virtual and physical hosts. Running HTTP" -" traffic through a few separate hosts with HTTPS termination is not " -"sufficiently secure." -msgstr "" -"Экземпляр Tarantool может принимать HTTP-подключения от внешних " -"источников или при доступе к веб-интерфейсу администратора. Все такие " -"подключения должны проходить через веб-сервер с HTTPS, работающий на том же " -"хосте (например, nginx). Это требование относится как к виртуальным, так и к" -" физическим хостам. Проведение HTTP-трафика через несколько отдельных хостов" -" с механизмом HTTPS termination недостаточно безопасно." +"A Tarantool instance can accept HTTP connections from external services or " +"access the administrative web UI. All such connections must go through an " +"HTTPS-providing web server, running on the same host, such as nginx. This " +"requirement is for both virtual and physical hosts. Running HTTP traffic " +"through a few separate hosts with HTTPS termination is not sufficiently " +"secure." +msgstr "" +"Экземпляр Tarantool может принимать HTTP-подключения от внешних источников " +"или при доступе к веб-интерфейсу администратора. Все такие подключения " +"должны проходить через веб-сервер с HTTPS, работающий на том же хосте " +"(например, nginx). Это требование относится как к виртуальным, так и к " +"физическим хостам. Проведение HTTP-трафика через несколько отдельных хостов " +"с механизмом HTTPS termination недостаточно безопасно." msgid "Closed HTTP ports" msgstr "Закрытые HTTP-порты" +#, fuzzy msgid "" -"Tarantool accepts HTTP connections on a specific port, configured" -" with ``http_port: `` value (see :ref:`configuring Cartridge " -"instances `). It must be only available on the " -"same host for nginx to connect to it." +"Tarantool accepts HTTP connections on a specific port. It must be only " +"available on the same host for nginx to connect to it." msgstr "" -"Tarantool принимает HTTP-соединения по определенному порту. Его " -"номер указывается в :ref:`конфигурации экземпляров Cartridge " -"`: ``http_port: <число>``. Порт должен быть " -"доступен только на этом хосте для подключения nginx." +"Tarantool принимает HTTP-соединения по определенному порту. Его номер " +"указывается в :ref:`конфигурации экземпляров Cartridge `: " +"``http_port: <число>``. Порт должен быть доступен только на этом хосте для " +"подключения nginx." msgid "" "Check that the configured HTTP port is closed and that the HTTPS port " @@ -90,20 +101,24 @@ msgid "Restricted access to the administrative console" msgstr "Ограниченный доступ к административной консоли" msgid "" -"The :doc:`console ` module " -"provides a way to connect to a running instance and run custom Lua code. " -"This can be useful for development and administration. The following code " -"examples open connections on a TCP port and on a UNIX socket." +"The :doc:`console ` module provides a way " +"to connect to a running instance and run custom Lua code. This can be useful" +" for development and administration. The following code examples open " +"connections on a TCP port and on a UNIX socket." +msgstr "" +"Модуль :doc:`console ` дает возможность " +"подключиться к рабочему экземпляру и запускать пользовательский код Lua. Это" +" полезная возможность для разработчиков и администраторов. В следующих " +"примерах показано, как открыть соединение по TCP-порту и на UNIX-сокете." + +msgid "" +"console.listen()\n" +"console.listen('/var/lib/tarantool/socket_name.sock')" msgstr "" -"Модуль :doc:`console ` дает " -"возможность подключиться к рабочему экземпляру и запускать пользовательский " -"код Lua. Это полезная возможность для разработчиков и администраторов. В " -"следующих примерах показано, как открыть соединение по TCP-порту и на UNIX-" -"сокете." msgid "" -"Opening an administrative console through a TCP port is always unsafe. Check " -"that there are no calls like ``console.listen()`` in the code." +"Opening an administrative console through a TCP port is always unsafe. Check" +" that there are no calls like ``console.listen()`` in the code." msgstr "" "Открывать административную консоль через TCP-порт всегда небезопасно. " "Убедитесь, что в коде нет вызовов формата ``console.listen()``." @@ -120,9 +135,10 @@ msgstr "" msgid "Limiting the guest user" msgstr "Ограничения для пользователя guest" +#, fuzzy msgid "" -"Connecting to the instance with ``tarantoolctl connect`` without user " -"credentials (under the ``guest`` user) must be disabled." +"Connecting to the instance with ``tt connect`` or ``tarantoolctl connect`` " +"without user credentials (under the ``guest`` user) must be disabled." msgstr "" "Подключение к экземпляру с помощью ``tarantoolctl connect`` без учетных " "данных (под пользователем ``guest``) необходимо отключить." @@ -137,6 +153,14 @@ msgstr "" "Убедитесь, что в исходном коде не предоставляются права доступа пользователю" " ``guest``. Этот участок кода может выглядеть так:" +msgid "" +"box.schema.user.grant('guest',\n" +" 'read,write',\n" +" 'universe',\n" +" nil, { if_not_exists = true }\n" +")" +msgstr "" + msgid "" "Besides searching for the whole code pattern, search for any entries of " "``'universe'``." @@ -144,16 +168,16 @@ msgstr "" "Помимо сооветствующего фрагмента кода, ищите все вхождения значения " "``'universe'``." -msgid "" -"Try connecting with ``tarantoolctl connect`` to each Tarantool " -"node." +#, fuzzy +msgid "Try connecting with ``tt connect`` to each Tarantool node." msgstr "" "Попытайтесь подключиться с помощью ``tarantoolctl connect`` к каждому из " "узлов Tarantool." +#, fuzzy msgid "" -"For more details, refer to the documentation on :doc:`access control " -"`." +"For more details, refer to the documentation on :ref:`access control " +"`." msgstr "" "Подробнее см. в разделе документации :doc:`Управление доступом " "`." @@ -162,23 +186,17 @@ msgid "Authorization in the web UI" msgstr "Авторизация в веб-интерфейсе" msgid "" -"Using the web interface must require logging in with a username and password. " -"See more details in the documentation on :ref:`configuring web interface " -"authorization `." +"Using the web interface must require logging in with a username and " +"password." msgstr "" -"Для входа в веб-интерфейс должны требоваться имя пользователя и пароль. " -"Подробнее см. в разделе документации :ref:`Реализация авторизации в веб-" -"интерфейсе `." msgid "Running under the tarantool user" msgstr "Запуск под пользователем tarantool" msgid "" -"All Tarantool instances should be running under the ``tarantool``" -" user." +"All Tarantool instances should be running under the ``tarantool`` user." msgstr "" -"Все экземпляры Tarantool должны работать под пользователем " -"``tarantool``." +"Все экземпляры Tarantool должны работать под пользователем ``tarantool``." msgid "Limiting access to the tarantool user" msgstr "Ограничение доступа для пользователя tarantool" @@ -195,56 +213,65 @@ msgid "Keeping two or more snapshots" msgstr "Хранение двух и более снимков данных" msgid "" -"In order to have a reliable backup, a Tarantool instance must " -"keep two or more latest snapshots. This should be checked on each Tarantool " -"instance." +"In order to have a reliable backup, a Tarantool instance must keep two or " +"more latest snapshots. This should be checked on each Tarantool instance." msgstr "" -"Для надежности резервного копирования в экземпляре Tarantool " -"должны храниться минимум два последних снимка данных. Не забудьте проверить " -"каждый экземпляр." +"Для надежности резервного копирования в экземпляре Tarantool должны " +"храниться минимум два последних снимка данных. Не забудьте проверить каждый " +"экземпляр." +#, fuzzy msgid "" -"The :ref:`snapshot_count `" -" value determines the number of kept snapshots. Configuration values are " -"primarily set in the configuration files but :doc:`can be overridden " -"` with " -"environment variables and command-line arguments. So, it's best to check " -"both the values in the configuration files and the actual values using the " -"console:" -msgstr "" -"Значение :ref:`snapshot_count ` определяет количество сохраненных снимков данных. Такие " -"параметры задаются в основном в файлах конфигурации, но :doc:`их могут " -"замещать " -"` " -"переменные окружения и аргументы в командной строке. Так что рекомендуется " -"проверить через консоль как значения в файлах конфигурации, так и " -"фактические значения:" +"The :ref:`snapshot_count ` value " +"determines the number of kept snapshots. Configuration values are primarily " +"set in the configuration files but can be overridden with environment " +"variables and command-line arguments. So, it's best to check both the values" +" in the configuration files and the actual values using the console:" +msgstr "" +"Значение :ref:`snapshot_count ` " +"определяет количество сохраненных снимков данных. Такие параметры задаются в" +" основном в файлах конфигурации, но :doc:`их могут замещать " +"` переменные " +"окружения и аргументы в командной строке. Так что рекомендуется проверить " +"через консоль как значения в файлах конфигурации, так и фактические " +"значения:" + +msgid "" +"tarantool> box.cfg.checkpoint_count\n" +"---\n" +"- 2" +msgstr "" msgid "Enabled write-ahead logging (WAL)" msgstr "Включен журнал упреждающей записи (WAL)" msgid "" -"Tarantool records all incoming data in the write-ahead log (WAL)." -" The WAL must be enabled to ensure that data will be recovered in case of a " -"possible instance restart." +"Tarantool records all incoming data in the write-ahead log (WAL). The WAL " +"must be enabled to ensure that data will be recovered in case of a possible " +"instance restart." msgstr "" -"Tarantool фиксирует все входящие данные в журнале упреждающей " -"записи (WAL). WAL должен быть включен, чтобы в случае перезапуска экземпляра" -" эти данные можно было восстановить." +"Tarantool фиксирует все входящие данные в журнале упреждающей записи (WAL). " +"WAL должен быть включен, чтобы в случае перезапуска экземпляра эти данные " +"можно было восстановить." msgid "Secure values of ``wal_mode`` are ``write`` and ``fsync``:" msgstr "Безопасные значения ``wal_mode`` -- ``write`` и ``fsync``:" +msgid "" +"tarantool> box.cfg.wal_mode\n" +"---\n" +"- write" +msgstr "" + msgid "" "An exclusion from this requirement is when the instance is processing data, " -"which can be freely rejected. For example, when Tarantool is used" -" for caching. Then WAL can be disabled to reduce i/o load." +"which can be freely rejected. For example, when Tarantool is used for " +"caching. Then WAL can be disabled to reduce i/o load." msgstr "" "Исключением может быть ситуация, когда экземпляр обрабатывает данные, " -"которые можно удалять: к примеру, когда Tarantool используется " -"для кэширования. В этом случае WAL можно отключить, чтобы снизить нагрузку " -"на ввод/вывод." +"которые можно удалять: к примеру, когда Tarantool используется для " +"кэширования. В этом случае WAL можно отключить, чтобы снизить нагрузку на " +"ввод/вывод." msgid "" "For more details, see the :ref:`wal_mode reference " @@ -265,6 +292,12 @@ msgstr "" "(``DEBUG``). Тогда в случае нарушения безопасности в журналах приложения " "будет достаточно информации для расследования инцидента." +msgid "" +"tarantool> box.cfg.log_level\n" +"---\n" +"- 5" +msgstr "" + msgid "" "For a full list of logging levels, see the :ref:`log_level reference " "`." @@ -276,6 +309,13 @@ msgid "Logging with journald" msgstr "Ведение журнала с помощью journald" msgid "Tarantool should use ``journald`` for logging." -msgstr "" -"В Tarantool для ведения журнала следует использовать " -"``journald``." +msgstr "В Tarantool для ведения журнала следует использовать ``journald``." + +#~ msgid "" +#~ "Using the web interface must require logging in with a username and " +#~ "password. See more details in the documentation on :ref:`configuring web " +#~ "interface authorization `." +#~ msgstr "" +#~ "Для входа в веб-интерфейс должны требоваться имя пользователя и пароль. " +#~ "Подробнее см. в разделе документации :ref:`Реализация авторизации в веб-" +#~ "интерфейсе `." diff --git a/locale/ru/LC_MESSAGES/enterprise/audit_log.po b/locale/ru/LC_MESSAGES/enterprise/audit_log.po index 7f4dd74ebb..84b7a6d632 100755 --- a/locale/ru/LC_MESSAGES/enterprise/audit_log.po +++ b/locale/ru/LC_MESSAGES/enterprise/audit_log.po @@ -3,125 +3,247 @@ msgid "Audit module" msgstr "Журнал аудита" msgid "" -"Audit log provides records on the Tarantool DBMS events in the JSON-format. " -"The following event logs are available:" +"The audit module available in Tarantool Enterprise Edition writes messages " +"that record Tarantool events in plain text, CSV, or JSON format." msgstr "" -"Журнал аудита содержит записи о событиях СУБД Tarantool в формате JSON. " -"Доступны следующие журналы событий:" -msgid "successful/failed user authentication and authorization," -msgstr "пройденная/непройденная аутентификация и авторизация пользователя," +msgid "" +"It provides detailed reports of security-related activities and helps you " +"find and fix breaches to protect your business. For example, you can see who" +" created a new user and when:" +msgstr "" -msgid "closed connection," -msgstr "закрытое соединение," +msgid "" +"{\n" +" \"time\": \"2022-04-07T13:39:36.046+0300\",\n" +" \"remote\": \"\",\n" +" \"session_type\": \"background\",\n" +" \"module\": \"tarantool\",\n" +" \"user\": \"admin\",\n" +" \"type\": \"user_create\",\n" +" \"tag\": \"\",\n" +" \"description\": \"Create user alice\"\n" +"}" +msgstr "" -msgid "password change," -msgstr "изменение пароля," +msgid "" +"It is up to each company to decide exactly what activities to audit and what" +" actions to take. System administrators, security engineers, and people in " +"charge of the company may want to audit different events for different " +"reasons. Tarantool provides such an option for each of them." +msgstr "" -msgid "creation/deletion of a user/role," -msgstr "создание/удаление пользователя/роли," +#, fuzzy +msgid "Audit log events" +msgstr "идентификатор события" -msgid "enabling/disabling a user," -msgstr "включение/отключение пользователя," +msgid "" +"The Tarantool audit log module can record various events that you can " +"monitor and decide whether you need to take actions:" +msgstr "" -msgid "changing privileges of a user/role." -msgstr "изменение прав пользователя/роли." +msgid "" +"Admin activity -- events related to actions performed by the administrator. " +"For example, such logs record the creation of a user." +msgstr "" -msgid "Log structure" -msgstr "Структура журнала" +msgid "" +"Access events -- events related to authorization and authentication of " +"users. For example, such logs record failed attempts to access secure data." +msgstr "" -msgid "Key" -msgstr "Ключ" +msgid "" +"Data access and modification -- events of data manipulation in the storage." +msgstr "" -msgid "Type" -msgstr "Тип" +msgid "" +"System events -- events related to modification or configuration of " +"resources. For example, such logs record the replacement of a space." +msgstr "" -msgid "Description" -msgstr "Описание" +msgid "" +":ref:`User-defined events `-- any events added manually " +"using the audit module API." +msgstr "" -msgid "Example" -msgstr "Пример" +msgid "" +"The full list of available audit log events is provided in the table below:" +msgstr "" -msgid "``type``" -msgstr "``type``" +msgid "Event" +msgstr "Событие" -msgid "string" -msgstr "строка" +msgid "Type of event written to the audit log" +msgstr "" -msgid "type of event" -msgstr "тип события" +#, fuzzy +msgid "Example of an event description" +msgstr "Описание события" -msgid "``type_id``" -msgstr "``type_id``" +msgid "Audit log enabled for events" +msgstr "" -msgid "number" -msgstr "число" +#, fuzzy +msgid "``audit_enable``" +msgstr "``user_enable``" -msgid "id of event" -msgstr "идентификатор события" +msgid ":ref:`User-defined events `" +msgstr "" -msgid "``description``" -msgstr "``description``" +#, fuzzy +msgid "``custom``" +msgstr "``user``" -msgid "description of event" -msgstr "описание события" +#, fuzzy +msgid "User authorized successfully" +msgstr "авторизация пользователя пройдена" -msgid "``time``" -msgstr "``time``" +msgid "``auth_ok``" +msgstr "``auth_ok``" -msgid "time of event" -msgstr "время события" +msgid "``Authenticate user ``" +msgstr "" -msgid "``peer``" -msgstr "``peer``" +#, fuzzy +msgid "User authorization failed" +msgstr "авторизация пользователя не пройдена" -msgid "remote client" -msgstr "удаленный клиент" +msgid "``auth_fail``" +msgstr "``auth_fail``" -msgid "``user``" -msgstr "``user``" +msgid "``Failed to authenticate user ``" +msgstr "" -msgid "user" -msgstr "пользователь" +#, fuzzy +msgid "User logged out or quit the session" +msgstr "пользователь вышел из системы или завершил сеанс" -msgid "``param``" -msgstr "``param``" +msgid "``disconnect``" +msgstr "``disconnect``" -msgid "parameters of event" -msgstr "параметры события" +#, fuzzy +msgid "``Close connection``" +msgstr "закрытое соединение," -msgid "see below" -msgstr "см. ниже" +#, fuzzy +msgid "User created" +msgstr "``user_create``" -msgid "Events description" -msgstr "Описание события" +msgid "``user_create``" +msgstr "``user_create``" -msgid "Event" -msgstr "Событие" +msgid "``Create user ``" +msgstr "" -msgid "Parameters" -msgstr "Параметры" +#, fuzzy +msgid "User dropped" +msgstr "``user_drop``" -msgid "user authorized successfully" -msgstr "авторизация пользователя пройдена" +msgid "``user_drop``" +msgstr "``user_drop``" -msgid "``auth_ok``" -msgstr "``auth_ok``" +msgid "``Drop user ``" +msgstr "" -msgid "user authorization failed" -msgstr "авторизация пользователя не пройдена" +#, fuzzy +msgid "Role created" +msgstr "``role_create``" -msgid "``auth_fail``" -msgstr "``auth_fail``" +msgid "``role_create``" +msgstr "``role_create``" -msgid "user logged out or quit the session" -msgstr "пользователь вышел из системы или завершил сеанс" +msgid "``Create role ``" +msgstr "" -msgid "``disconnect``" -msgstr "``disconnect``" +msgid "Role dropped" +msgstr "" + +#, fuzzy +msgid "``role_drop``" +msgstr "``user_drop``" + +msgid "``Drop role ``" +msgstr "" + +#, fuzzy +msgid "User disabled" +msgstr "``user_disable``" + +msgid "``user_disable``" +msgstr "``user_disable``" + +msgid "``Disable user ``" +msgstr "" + +#, fuzzy +msgid "User enabled" +msgstr "``user_enable``" + +msgid "``user_enable``" +msgstr "``user_enable``" + +msgid "``Enable user ``" +msgstr "" + +msgid "User granted rights" +msgstr "" + +#, fuzzy +msgid "``user_grant_rights``" +msgstr "``user_create``" + +msgid "" +"``Grant rights for to user ``" +msgstr "" + +msgid "User revoked rights" +msgstr "" + +#, fuzzy +msgid "``user_revoke_rights``" +msgstr "``user_create``" + +msgid "" +"``Revoke rights for from user " +"``" +msgstr "" + +msgid "Role granted rights" +msgstr "" + +#, fuzzy +msgid "``role_grant_rights``" +msgstr "``role_create``" + +msgid "" +"``Grant rights for to role ``" +msgstr "" + +msgid "Role revoked rights" +msgstr "" + +#, fuzzy +msgid "``role_revoke_rights``" +msgstr "``role_create``" + +msgid "" +"``Revoke rights for from role " +"``" +msgstr "" + +#, fuzzy +msgid "User password changed" +msgstr "изменение пароля," + +msgid "``password_change``" +msgstr "``password_change``" + +msgid "``Change password for user ``" +msgstr "" +#, fuzzy msgid "" -"failed access attempts to secure data (personal records, details, " +"Failed attempt to access secure data (personal records, details, " "geolocation, etc.)" msgstr "" "неудачные попытки доступа к конфиденциальным данным (личные записи, данные, " @@ -130,53 +252,860 @@ msgstr "" msgid "``access_denied``" msgstr "``access_denied``" -msgid "creating a user" -msgstr "создание пользователя" +msgid "`` denied to ``" +msgstr "" + +msgid "Expressions with arguments evaluated in a string" +msgstr "" -msgid "``user_create``" +#, fuzzy +msgid "``eval``" +msgstr "``user``" + +msgid "``Evaluate expression ``" +msgstr "" + +msgid "Function called with arguments" +msgstr "" + +msgid "``call``" +msgstr "" + +msgid "``Call function with arguments ``" +msgstr "" + +msgid "Iterator key selected from ``space.index``" +msgstr "" + +#, fuzzy +msgid "``space_select``" +msgstr "``disconnect``" + +msgid "``Select from .``" +msgstr "" + +msgid "Space created" +msgstr "" + +#, fuzzy +msgid "``space_create``" msgstr "``user_create``" -msgid "dropping a user" -msgstr "удаление пользователя" +msgid "``Create space ``" +msgstr "" -msgid "``user_drop``" +msgid "Space altered" +msgstr "" + +#, fuzzy +msgid "``space_alter``" +msgstr "``peer``" + +msgid "``Alter space ``" +msgstr "" + +msgid "Space dropped" +msgstr "" + +#, fuzzy +msgid "``space_drop``" msgstr "``user_drop``" -msgid "disabling a user" -msgstr "отключение пользователя" +msgid "``Drop space ``" +msgstr "" + +msgid "Tuple inserted into space" +msgstr "" -msgid "``user_disable``" -msgstr "``user_disable``" +#, fuzzy +msgid "``space_insert``" +msgstr "``peer``" -msgid "enabling a user" -msgstr "включение пользователя" +msgid "``Insert tuple into space ``" +msgstr "" -msgid "``user_enable``" -msgstr "``user_enable``" +msgid "Tuple replaced in space" +msgstr "" + +#, fuzzy +msgid "``space_replace``" +msgstr "``user_create``" + +msgid "``Replace tuple with in space ``" +msgstr "" + +msgid "Tuple deleted from space" +msgstr "" -msgid "granting (changing) privileges (roles, profiles, etc.) for the user" -msgstr "выдача (изменение) прав (роли, профили и т.д.) пользователю" +#, fuzzy +msgid "``space_delete``" +msgstr "``access_denied``" -msgid "``user_priv``" -msgstr "``user_priv``" +msgid "``Delete tuple from space ``" +msgstr "" msgid "" -"resetting password of the user (the user making changes should be specified)" +"The ``eval`` event displays data from the ``console`` module and the " +"``eval`` function of the ``net.box`` module. For more on how they work, see " +":ref:`Module console ` and :ref:`Module net.box -- eval " +"`. To separate the data, specify ``console`` or ``binary`` in " +"the session field." msgstr "" -"сброс пароля пользователя (должен быть указан пользователь, который вносит " -"изменения)" -msgid "``password_change``" -msgstr "``password_change``" +msgid "Event groups" +msgstr "" -msgid "creating a role" -msgstr "создание роли" +msgid "" +"You can simplify working with audit log events by using built-in event " +"groups. For example, you can set to record only events related to the " +"enabling of the audit log, or only events related to a space." +msgstr "" -msgid "``role_create``" -msgstr "``role_create``" +msgid "Tarantool provides the following event groups:" +msgstr "" + +msgid "``all`` -- all :ref:`events `." +msgstr "" + +msgid "Events ``call`` and ``eval`` are included only into the ``all`` group." +msgstr "" + +msgid "``audit`` -- ``audit_enable`` event." +msgstr "" + +msgid "``auth`` -- authorization events: ``auth_ok``, ``auth_fail``." +msgstr "" + +msgid "" +"``priv`` -- events related to authentication, authorization, users, and " +"roles: ``user_create``, ``user_drop``, ``role_create``, ``role_drop``, " +"``user_enable``, ``user_disable``, ``user_grant_rights``, " +"``user_revoke_rights``, ``role_grant_rights``, ``role_revoke_rights``." +msgstr "" + +msgid "" +"``ddl`` -- events of space creation, altering, and dropping: " +"``space_create``, ``space_alter``, ``space_drop``." +msgstr "" + +msgid "" +"``dml`` -- events of data modification in spaces: ``space_insert``, " +"``space_replace``, ``space_delete``." +msgstr "" + +msgid "" +"``data_operations`` -- events of data modification or selection from spaces:" +" ``space_select``, ``space_insert``, ``space_replace``, ``space_delete``." +msgstr "" + +msgid "" +"``compatibility`` -- events available in Tarantool before the version " +"2.10.0. ``auth_ok``, ``auth_fail``, ``disconnect``, ``user_create``, " +"``user_drop``, ``role_create``, ``role_drop``, ``user_enable``, " +"``user_disable``, ``user_grant_rights``, ``user_revoke_rights``, " +"``role_grant_rights``. ``role_revoke_rights``, ``password_change``, " +"``access_denied``. This group enables the compatibility with earlier " +"Tarantool versions." +msgstr "" + +msgid "" +"Be careful when recording ``all`` and ``data_operations`` event groups. The " +"more events you record, the slower the requests will be processed over time." +" It is recommended that you select only those groups whose events your " +"company really needs to monitor and analyze." +msgstr "" + +msgid "Structure of audit log events" +msgstr "" + +msgid "" +"Each audit log event contains several fields to make it easy to filter and " +"aggregate the resulting logs. They are described in the following table." +msgstr "" + +msgid "Field" +msgstr "" + +msgid "Description" +msgstr "Описание" + +msgid "Example of a log field display" +msgstr "" + +msgid "``time``" +msgstr "``time``" + +#, fuzzy +msgid "Time of the event" +msgstr "время события" + +msgid "2022-04-07T13:20:05.327+0300" +msgstr "" + +#, fuzzy +msgid "``remote``" +msgstr "``type``" + +msgid "Remote host that triggered the event" +msgstr "" + +msgid "100.96.163.226:48722" +msgstr "" + +#, fuzzy +msgid "``session_type``" +msgstr "``type``" + +msgid "Session type" +msgstr "" + +msgid "console" +msgstr "" + +#, fuzzy +msgid "``module``" +msgstr "``user``" + +msgid "" +"Audit log module. Set to ``tarantool`` for system events; can be overwritten" +" for user-defined events" +msgstr "" + +msgid "tarantool" +msgstr "" + +msgid "``user``" +msgstr "``user``" + +msgid "User who triggered the event" +msgstr "" + +msgid "admin" +msgstr "" + +msgid "``type``" +msgstr "``type``" + +msgid "Audit event type" +msgstr "" + +#, fuzzy +msgid "access_denied" +msgstr "``access_denied``" + +#, fuzzy +msgid "``tag``" +msgstr "``type``" + +msgid "A text field that can be overwritten by the user" +msgstr "" + +msgid "``description``" +msgstr "``description``" + +#, fuzzy +msgid "Human-readable event description" +msgstr "Описание события" + +msgid "Authenticate user Alice" +msgstr "" + +msgid "" +"You can set all these parameters only once. Unlike many other parameters in " +"``box.cfg``, they cannot be changed." +msgstr "" + +msgid "Enable the Tarantool audit log" +msgstr "" + +msgid "" +"By default, audit logging is disabled. To enable audit logging, define the " +"logs location by setting the ``box.cfg.audit_log`` option. Tarantool can " +"write audit logs to a file, to a pipe, or to the system logger." +msgstr "" + +msgid "To disable audit logging, set the ``audit_log`` option to ``nil``." +msgstr "" + +msgid "Write to a file" +msgstr "" + +msgid "" +"box.cfg{audit_log = 'audit_tarantool.log'}\n" +"-- or\n" +"box.cfg{audit_log = 'file:audit_tarantool.log'}" +msgstr "" + +msgid "" +"This opens the ``audit_tarantool.log`` file for output in the server’s " +"default directory. If the ``audit_log`` string has no prefix or the prefix " +"``file:``, the string is interpreted as a file path." +msgstr "" + +msgid "Send to a pipe" +msgstr "" + +msgid "" +"box.cfg{audit_log = '| cronolog audit_tarantool.log'}\n" +"-- or\n" +"box.cfg{audit_log = 'pipe: cronolog audit_tarantool.log'}'" +msgstr "" + +msgid "" +"This starts the `cronolog `_ program " +"when the server starts and sends all ``audit_log`` messages to cronolog's " +"standard input (``stdin``). If the ``audit_log`` string starts with '|' or " +"contains the prefix ``pipe:``, the string is interpreted as a Unix `pipeline" +" `_." +msgstr "" + +msgid "Send to syslog" +msgstr "" + +msgid "" +"Below is an example of writing audit logs to a directory shared with the " +"system logs. Tarantool allows this option, but it is not recommended to do " +"this to avoid difficulties when working with audit logs. System and audit " +"logs should be written separately. To do this, create separate paths and " +"specify them." +msgstr "" + +msgid "This example setting sends the audit log to syslog:" +msgstr "" + +msgid "" +"box.cfg{audit_log = 'syslog:identity=tarantool'}\n" +"-- or\n" +"box.cfg{audit_log = 'syslog:facility=user'}\n" +"-- or\n" +"box.cfg{audit_log = 'syslog:identity=tarantool,facility=user'}\n" +"-- or\n" +"box.cfg{audit_log = 'syslog:server=unix:/dev/log'}" +msgstr "" + +msgid "" +"If the ``audit_log`` string starts with \"syslog:\", it is interpreted as a " +"message for the `syslogd `_ " +"program, which normally runs in the background of any Unix-like platform. " +"The setting can be 'syslog:', 'syslog:facility=...', 'syslog:identity=...', " +"'syslog:server=...' or a combination." +msgstr "" + +msgid "" +"The ``syslog:identity`` setting is an arbitrary string that is placed at the" +" beginning of all messages. The default value is ``tarantool``." +msgstr "" + +msgid "" +"The ``syslog:facility`` setting is currently ignored, but will be used in " +"the future. The value must be one of the `syslog " +"`_ keywords that tell ``syslogd`` " +"where to send the message. The possible values are ``auth``, ``authpriv``, " +"``cron``, ``daemon``, ``ftp``, ``kern``, ``lpr``, ``mail``, ``news``, " +"``security``, ``syslog``, ``user``, ``uucp``, ``local0``, ``local1``, " +"``local2``, ``local3``, ``local4``, ``local5``, ``local6``, ``local7``. The " +"default value is ``local7``." +msgstr "" + +msgid "" +"The ``syslog:server`` setting is the locator for the syslog server. It can " +"be a Unix socket path starting with \"unix:\" or an ipv4 port number. The " +"default socket value is ``/dev/log`` (on Linux) or ``/var/run/syslog`` (on " +"Mac OS). The default port value is 514, which is the UDP port." +msgstr "" + +msgid "" +"If you log to a file, Tarantool will reopen the audit log at `SIGHUP " +"`_. If log is a program, its pid is " +"stored in the ``audit_log.logger_pid`` variable. You need to send it a " +"signal to rotate logs." +msgstr "" + +msgid "An example of a Tarantool audit log entry in the syslog:" +msgstr "" + +msgid "" +"{\n" +" \"__CURSOR\" : \"s=81564632436a4de590e80b89b0151148;i=11519;b=def80c1464fe49d1aac8a64895d6614d;m=8c825ebfc;t=5edb27a75f282;x=7eba320f7cc9ae4d\",\n" +" \"__REALTIME_TIMESTAMP\" : \"1668725698065026\",\n" +" \"__MONOTONIC_TIMESTAMP\" : \"37717666812\",\n" +" \"_BOOT_ID\" : \"def80c1464fe49d1aac8a64895d6614d\",\n" +" \"_UID\" : \"1003\",\n" +" \"_GID\" : \"1004\",\n" +" \"_COMM\" : \"tarantool\",\n" +" \"_EXE\" : \"/app/tarantool/dist/tdg-2.6.4.0.x86_64/tarantool\",\n" +" \"_CMDLINE\" : \"tarantool init.lua : core-03\",\n" +" \"_CAP_EFFECTIVE\" : \"0\",\n" +" \"_AUDIT_SESSION\" : \"1\",\n" +" \"_AUDIT_LOGINUID\" : \"1003\",\n" +" \"_SYSTEMD_CGROUP\" : \"/user.slice/user-1003.slice/user@1003.service/app.slice/app@core-03.service\",\n" +" \"_SYSTEMD_OWNER_UID\" : \"1003\",\n" +" \"_SYSTEMD_UNIT\" : \"user@1003.service\",\n" +" \"_SYSTEMD_USER_UNIT\" : \"app@core-03.service\",\n" +" \"_SYSTEMD_SLICE\" : \"user-1003.slice\",\n" +" \"_SYSTEMD_USER_SLICE\" : \"app.slice\",\n" +" \"_SYSTEMD_INVOCATION_ID\" : \"be368b4243d842ea8c06b010e0df62c2\",\n" +" \"_MACHINE_ID\" : \"2e2339725deb4bc198c54ff4a2e8d626\",\n" +" \"_HOSTNAME\" : \"vm-0.test.env\",\n" +" \"_TRANSPORT\" : \"syslog\",\n" +" \"PRIORITY\" : \"6\",\n" +" \"SYSLOG_FACILITY\" : \"23\",\n" +" \"SYSLOG_IDENTIFIER\" : \"tarantool\",\n" +" \"SYSLOG_PID\" : \"101562\",\n" +" \"_PID\" : \"101562\",\n" +" \"MESSAGE\" : \"remote: session_type:background module:common.admin.auth user: type:custom_tdg_audit tag:tdg_severity_INFO description:[119eae0e-a691-42cc-9b4c-f14c499e6726] subj: \\\"anonymous\\\", msg: \\\"Access granted to anonymous user\\\"\",\n" +" \"_SOURCE_REALTIME_TIMESTAMP\" : \"1668725698064202\"\n" +"}" +msgstr "" + +msgid "Select events to write to audit log" +msgstr "" + +msgid "" +"Tarantool's extensive filtering options help you write only the events you " +"need to the audit log." +msgstr "" + +msgid "" +"To select events to write to audit log, use the ``box.cfg.audit_filter`` " +"option. Its value can be a list of events and event groups. The default " +"value for the ``box.cfg.audit_filter`` option is ``compatibility``, which " +"enables logging of all events available before 2.10.0." +msgstr "" + +msgid "" +"box.cfg{\n" +" audit_log = 'audit.log',\n" +" audit_filter = 'audit,auth,priv,password_change,access_denied'\n" +" }" +msgstr "" + +msgid "Customize your filters" +msgstr "" + +msgid "" +"You can customize the filters and use different combinations of filters for " +"your purposes." +msgstr "" + +msgid "Filter based on a specific event" +msgstr "" + +msgid "You can set only certain events that you need to record." +msgstr "" + +msgid "" +"For example, select ``password_change`` to monitor the users who have " +"changed their passwords." +msgstr "" + +msgid "" +"box.cfg{\n" +" audit_log = 'audit.log',\n" +" audit_filter = 'password_change'\n" +" }" +msgstr "" + +msgid "Filter based on a specific group" +msgstr "" + +msgid "You can set one of the groups of events that you need to record." +msgstr "" + +msgid "" +"For example, select ``compatibility`` to monitor only events of user " +"authorization, granted privileges, disconnection, user password change, and " +"denied access." +msgstr "" + +msgid "" +"box.cfg{\n" +" audit_log = 'audit.log',\n" +" audit_filter = 'compatibility'\n" +" }" +msgstr "" + +msgid "Filter based on multiple groups" +msgstr "" + +msgid "You can specify multiple groups depending on the purpose." +msgstr "" + +msgid "" +"For example, select ``auth`` and ``priv`` to see only events related to " +"authorization and granted privileges." +msgstr "" + +msgid "" +"box.cfg{\n" +" audit_log = 'audit.log',\n" +" audit_filter = 'auth,priv'\n" +" }" +msgstr "" + +msgid "Filter based on a group and a specific event" +msgstr "" + +msgid "You can specify a group and a certain event depending on the purpose." +msgstr "" + +msgid "" +"For example, you can select ``priv`` and ``disconnect`` to see only events " +"related to granted privileges and disconnect events." +msgstr "" + +msgid "" +"box.cfg{\n" +" audit_log = 'audit.log',\n" +" audit_filter = 'priv,disconnect'\n" +" }" +msgstr "" + +msgid "Example" +msgstr "Пример" + +msgid "Run the command to filter:" +msgstr "" + +msgid "" +"local audit = require('audit')\n" +"\n" +"box.cfg{audit_log = 'audit.log', audit_filter = 'custom,user_create', audit_format = 'csv'}\n" +"-- The Tarantool audit module writes the event because a filter is set for it\n" +"box.schema.user.create('alice')\n" +"-- The Tarantool audit module will not write the event because no filter is set for it\n" +"box.schema.user.drop('alice')" +msgstr "" + +msgid "Configure a blocking mode" +msgstr "" + +msgid "" +"By default, the ``audit_nonblock`` option is set to ``true`` and Tarantool " +"will not block during logging if the system is not ready to write, dropping " +"the message instead. Using this value may improve logging performance at the" +" cost of losing some log messages. This option only has an effect if the " +"output goes to ``syslog:`` or ``pipe:``. Setting ``audit_nonblock`` to " +"``true`` is not allowed if the output is to a file. In this case, set " +"``audit_nonblock`` to ``false``." +msgstr "" + +msgid "Configure the format of audit log events" +msgstr "" + +msgid "" +"You can choose the format of audit log events -- plain text, CSV or JSON " +"format." +msgstr "" + +msgid "" +"Plain text is used by default. This human-readable format can be efficiently" +" compressed. The JSON format is more convenient to receive log events, " +"analyze them and integrate them with other systems if needed. Using the CSV " +"format allows you to view audit log events in tabular form." +msgstr "" + +msgid "" +"Use these commands to configure the format of audit log events in Tarantool." +msgstr "" + +msgid "Plain text" +msgstr "" + +msgid "box.cfg{audit_log = 'audit.log', audit_format = 'plain'}" +msgstr "" + +#, fuzzy +msgid "Example:" +msgstr "Пример" + +msgid "" +"remote:\n" +"session_type:background\n" +"module:common.admin.auth\n" +"user: type:custom_tdg_audit\n" +"tag:tdg_severity_INFO\n" +"description:[5e35b406-4274-4903-857b-c80115275940]\n" +"subj: \"anonymous\",\n" +"msg: \"Access granted to anonymous user\"" +msgstr "" + +msgid "JSON format" +msgstr "" + +msgid "box.cfg{audit_log = 'audit.log', audit_format = 'json'}" +msgstr "" + +msgid "" +"{\n" +" \"time\": \"2022-11-17T21:55:49.880+0300\",\n" +" \"remote\": \"\",\n" +" \"session_type\": \"background\",\n" +" \"module\": \"common.admin.auth\",\n" +" \"user\": \"\",\n" +" \"type\": \"custom_tdg_audit\",\n" +" \"tag\": \"tdg_severity_INFO\",\n" +" \"description\": \"[c26cd11a-3342-4ce6-8f0b-a4b222268b9d] subj: \\\"anonymous\\\", msg: \\\"Access granted to anonymous user\\\"\"\n" +"}" +msgstr "" + +msgid "CSV format" +msgstr "" + +msgid "box.cfg{audit_log = 'audit.log', audit_format = 'csv'}" +msgstr "" + +msgid "" +"2022-11-17T21:58:03.131+0300,,background,common.admin.auth,,,custom_tdg_audit,tdg_severity_INFO,\"[b3dfe2a3-ec29-4e61-b747-eb2332c83b2e]" +" subj: \"\"anonymous\"\", msg: \"\"Access granted to anonymous user\"\"\"" +msgstr "" + +msgid "Create user-defined events" +msgstr "" + +msgid "Tarantool provides an API for writing user-defined audit log events." +msgstr "" + +msgid "" +"To add a new event, use the ``audit.log()`` function that takes one of the " +"following values:" +msgstr "" + +msgid "" +"Message string. Printed to the audit log with type ``message``. Example: " +"``audit.log('Hello, World!')``." +msgstr "" + +#, python-format +msgid "" +"Format string and arguments. Passed to string format and then output to the " +"audit log with type message. Example: ``audit.log('Hello, %s!', 'World')``." +msgstr "" + +msgid "" +"Table with audit log field values. The table must contain at least one field" +" -- description. Example: ``audit.log({type = 'custom_hello', description = " +"'Hello, World!'})``." +msgstr "" + +msgid "" +"Using the field ``audit.new()``, you can create a new log module that allows" +" you to avoid passing all custom audit log fields each time ``audit.log()`` " +"is called. It takes a table of audit log field values (same as " +"``audit.log()``). The ``type`` of the log module for writing user-defined " +"events must either be ``message`` or have the ``custom_`` prefix." +msgstr "" + +msgid "" +"local my_audit = audit.new({type = 'custom_hello', module = 'my_module'})\n" +"my_audit:log('Hello, Alice!')\n" +"my_audit:log({tag = 'admin', description = 'Hello, Bob!'})\n" +"\n" +"-- is equivalent to\n" +"audit.log({type = 'custom_hello', module = 'my_module',\n" +" description = 'Hello, Alice!' })\n" +"audit.log({type = 'custom_hello', module = 'my_module',\n" +" tag = 'admin', description = 'Hello, Bob!'})" +msgstr "" + +msgid "" +"Some user-defined audit log fields (``time``, ``remote``, ``session_type``) " +"are set in the same way as for a system event. If a field is not " +"overwritten, it is set to the same value as for a system event." +msgstr "" + +msgid "" +"Some audit log fields you can overwrite with ``audit.new()`` and " +"``audit.log()``:" +msgstr "" + +#, fuzzy +msgid "type" +msgstr "Тип" + +msgid "user" +msgstr "пользователь" + +#, fuzzy +msgid "module" +msgstr "Журнал аудита" + +msgid "tag" +msgstr "" + +#, fuzzy +msgid "description" +msgstr "Описание" + +msgid "" +"To avoid confusion with system events, the value of the type field must " +"either be ``message`` (default) or begin with ``custom_``. Otherwise you " +"will get the error message. User-defined events are filtered out by default." +" To enable user-defined audit log events, you must add ``custom`` to " +"``box.cfg.audit_filter``." +msgstr "" + +#, python-format +msgid "" +"local audit = require('audit')\n" +"\n" +"box.cfg{audit_log = 'audit.log', audit_filter = 'custom', audit_format = 'csv'}\n" +"audit.log('Hello, Alice!')\n" +"audit.log('Hello, %s!', 'Bob')\n" +"audit.log({type = 'custom_hello', description = 'Hello, Eve!'})\n" +"audit.log({type = 'custom_farewell', user = 'eve', module = 'custom', description = 'Farewell, Eve!'})\n" +"\n" +"local my_audit = audit.new({module = 'my_module', tag = 'default'})\n" +"my_audit:log({description = 'Message 1'})\n" +"my_audit:log({description = 'Message 2', tag = 'my_tag'})\n" +"my_audit:log({description = 'Message 3', module = 'other_module'})" +msgstr "" + +msgid "Use read commands" +msgstr "" + +msgid "" +"To easily read the audit log events in the needed form, use the different " +"commands:" +msgstr "" + +msgid "``cat`` -- prints one or more files" +msgstr "" + +msgid "``grep`` -- prints a specific text" +msgstr "" + +msgid "``head`` -- prints the first N lines of the file" +msgstr "" + +msgid "``tail`` -- prints the last N lines of the file" +msgstr "" + +msgid "" +"These are the basic commands to help you read the logs. If necessary, you " +"can use other commands." +msgstr "" + +msgid "Tips" +msgstr "" + +msgid "How many events can be recorded?" +msgstr "" + +msgid "" +"If you write to a file, the size of the Tarantool audit module is limited by" +" the disk space. If you write to a system logger, the size of the Tarantool " +"audit module is limited by the system logger. If you write to a pipe, the " +"size of the Tarantool audit module is limited by the system buffer if the " +"``audit_nonblock`` = ``false``; if ``audit_nonblock`` = ``true``, there is " +"no limit. However, it is not recommended to use the entire memory, as this " +"may cause performance degradation and even loss of some logs." +msgstr "" + +msgid "How often should audit logs be reviewed?" +msgstr "" + +msgid "" +"Consider setting up a schedule in your company. It is recommended to review " +"audit logs at least every 3 months." +msgstr "" + +msgid "How long should audit logs be stored?" +msgstr "" + +msgid "It is recommended to store audit logs for at least one year." +msgstr "" + +msgid "What is the best way to process audit logs?" +msgstr "" + +msgid "It is recommended to use SIEM systems for this issue." +msgstr "" + +#~ msgid "" +#~ "Audit log provides records on the Tarantool DBMS events in the JSON-format. " +#~ "The following event logs are available:" +#~ msgstr "" +#~ "Журнал аудита содержит записи о событиях СУБД Tarantool в формате JSON. " +#~ "Доступны следующие журналы событий:" + +#~ msgid "successful/failed user authentication and authorization," +#~ msgstr "пройденная/непройденная аутентификация и авторизация пользователя," + +#~ msgid "creation/deletion of a user/role," +#~ msgstr "создание/удаление пользователя/роли," + +#~ msgid "enabling/disabling a user," +#~ msgstr "включение/отключение пользователя," + +#~ msgid "changing privileges of a user/role." +#~ msgstr "изменение прав пользователя/роли." + +#~ msgid "Log structure" +#~ msgstr "Структура журнала" + +#~ msgid "Key" +#~ msgstr "Ключ" + +#~ msgid "string" +#~ msgstr "строка" + +#~ msgid "type of event" +#~ msgstr "тип события" + +#~ msgid "``type_id``" +#~ msgstr "``type_id``" + +#~ msgid "number" +#~ msgstr "число" + +#~ msgid "description of event" +#~ msgstr "описание события" + +#~ msgid "remote client" +#~ msgstr "удаленный клиент" + +#~ msgid "``param``" +#~ msgstr "``param``" + +#~ msgid "parameters of event" +#~ msgstr "параметры события" + +#~ msgid "see below" +#~ msgstr "см. ниже" + +#~ msgid "Parameters" +#~ msgstr "Параметры" + +#~ msgid "creating a user" +#~ msgstr "создание пользователя" + +#~ msgid "dropping a user" +#~ msgstr "удаление пользователя" + +#~ msgid "disabling a user" +#~ msgstr "отключение пользователя" + +#~ msgid "enabling a user" +#~ msgstr "включение пользователя" + +#~ msgid "granting (changing) privileges (roles, profiles, etc.) for the user" +#~ msgstr "выдача (изменение) прав (роли, профили и т.д.) пользователю" + +#~ msgid "``user_priv``" +#~ msgstr "``user_priv``" + +#~ msgid "" +#~ "resetting password of the user (the user making changes should be specified)" +#~ msgstr "" +#~ "сброс пароля пользователя (должен быть указан пользователь, который вносит " +#~ "изменения)" + +#~ msgid "creating a role" +#~ msgstr "создание роли" -msgid "granting (changing) privileges for the role" -msgstr "выдача (изменение) прав для роли" +#~ msgid "granting (changing) privileges for the role" +#~ msgstr "выдача (изменение) прав для роли" -msgid "``role_priv``" -msgstr "``role_priv``" +#~ msgid "``role_priv``" +#~ msgstr "``role_priv``" diff --git a/locale/ru/LC_MESSAGES/enterprise/cartridge-auth.po b/locale/ru/LC_MESSAGES/enterprise/cartridge-auth.po new file mode 100644 index 0000000000..42b04b1d9b --- /dev/null +++ b/locale/ru/LC_MESSAGES/enterprise/cartridge-auth.po @@ -0,0 +1,3 @@ + +msgid "LDAP authorization" +msgstr "" diff --git a/locale/ru/LC_MESSAGES/enterprise/changelog.po b/locale/ru/LC_MESSAGES/enterprise/changelog.po index 9b8f713fc6..b3048c6f7f 100644 --- a/locale/ru/LC_MESSAGES/enterprise/changelog.po +++ b/locale/ru/LC_MESSAGES/enterprise/changelog.po @@ -2,1407 +2,2305 @@ msgid "Changelog" msgstr "Журнал изменений" -msgid "Versioning Policy" +#, fuzzy +msgid "Versioning policy" msgstr "Политика версионирования" -msgid "Tarantool Enterprise SDK version consists of two parts:" +#, fuzzy +msgid "A Tarantool Enterprise SDK version consists of two parts:" msgstr "Версия Tarantool Enterprise SDK состоит из двух частей:" +msgid "-r" +msgstr "" + msgid "For example: ``2.11.1-0-gc42d9735b-r589``." msgstr "Например: ``2.11.1-0-gc42d9735b-r589``." msgid "" -"``TARANTOOL_BASE_VERSION`` is the Community version which the Enterprise version" -" is based on." +"``TARANTOOL_BASE_VERSION`` is the Community version which the Enterprise " +"version is based on." msgstr "" "``TARANTOOL_BASE_VERSION`` -- это версия Community, на которой основана " "версия Enterprise." msgid "" -"``REVISION`` is the SDK revision. Besides Tarantool itself, it includes " -"examples, templates, and a set of rocks." +"``REVISION`` is the SDK revision. Besides Tarantool itself, it includes the " +"``tt`` utility, a set of open and closed source modules, and examples. Learn" +" more from :ref:`Package contents `." msgstr "" -"``REVISION`` -- это версия SDK. Помимо самого Tarantool, в ней содержатся " -"примеры, шаблоны и набор библиотек rocks." -msgid "r422" -msgstr "r422" +msgid "598" +msgstr "" +#, fuzzy msgid "" -"Added space-explorer ``v1.1.4`` rock with removed permanency flag and " -"reduced bundle size." +"Updated cartridge-cli to `2.12.9 `__." msgstr "" -"Добавлен модуль (rock) space-explorer ``v1.1.4`` без флага permanency и с " -"меньшим размером сборки." +"Утилита Cartridge CLI обновлена до v2.10.0. (`Журнал изменений " +"`__)" -msgid "r421" -msgstr "r421" +#, fuzzy +msgid "" +"Updated tt-ee to `1.3.1 `__." +msgstr "" +"Добавлен модуль ``queue`` 1.1.0. (`Журнал изменений " +"`__)" -msgid "Updated base versions:" -msgstr "Обновлены базовые версии:" +msgid "595" +msgstr "" + +#, fuzzy +msgid "" +"Updated tt-ee to `1.3.0 `__." +msgstr "" +"Добавлен модуль ``queue`` 1.1.0. (`Журнал изменений " +"`__)" + +#, fuzzy +msgid "" +"Updated cartridge to `2.8.3 " +"`__." +msgstr "" +"Утилита Cartridge CLI обновлена до v2.8.0. (`Журнал изменений " +"`__)" + +#, fuzzy +msgid "" +"Updated cartridge-cli-extensions to `1.1.2 " +"`__." +msgstr "" +"Добавлен модуль ``cartridge-cli-extensions`` v1.1.1. (`Журнал изменений " +"`__)" -msgid "1.10.11-0-gf0b0e7ecf" -msgstr "1.10.11-0-gf0b0e7ecf" +#, fuzzy +msgid "" +"Updated crud to `1.3.0 " +"`__." +msgstr "" +"Добавлен модуль ``crud`` 0.8.0. (`Журнал изменений " +"`__)" -msgid "2.7.3-0-gdddf926c3" -msgstr "2.7.3-0-gdddf926c3" +#, fuzzy +msgid "" +"Updated queue to `1.3.3 " +"`__." +msgstr "" +"Добавлен модуль ``queue`` 1.1.0. (`Журнал изменений " +"`__)" -msgid "2.8.2-0-gfc96d10f5" -msgstr "2.8.2-0-gfc96d10f5" +#, fuzzy +msgid "" +"Updated sharded-queue to `0.1.1 `__." +msgstr "" +"Добавлен модуль ``vshard`` 0.1.18. (`Журнал изменений " +"`__)" -msgid "Fixed audit log." -msgstr "Исправлен журнал аудита." +#, fuzzy +msgid "" +"Updated membership to `2.4.1 " +"`__." +msgstr "" +"Добавлен модуль ``membership`` 2.4.0. (`Журнал изменений " +"`__)" -msgid "r419" -msgstr "r419" +msgid "Added tests for Astra Linux 1.7." +msgstr "" -msgid "Fixed compatibility with Tarantool 2.9:" -msgstr "Исправлена проблема совместимости с Tarantool 2.9:" +msgid "589" +msgstr "" -msgid "Added errors 2.2.1." -msgstr "Добавлен модуль ``errors`` 2.2.1." +#, fuzzy +msgid "Updated ``tarantool-2.10`` to 2.10.8." +msgstr "Утилита ``cartridge-cli`` обновлена до v2.4.0." -msgid "Added cartridge 2.7.1 instead of 2.7.0." -msgstr "Модуль ``cartridge`` 2.7.0 обновлен до версии 2.7.1." +msgid "Updated ``tarantool-master`` to 3.0.0-alpha3." +msgstr "" -msgid "r418" -msgstr "r418" +#, fuzzy +msgid "" +"Updated migrations to `0.6.0 " +"`__." +msgstr "" +"Добавлен модуль ``expirationd`` 1.1.0. (`Журнал изменений " +"`__)" + +#, fuzzy +msgid "" +"Updated tt-ee to `1.2.0 `__." +msgstr "" +"Добавлен модуль ``queue`` 1.1.0. (`Журнал изменений " +"`__)" + +#, fuzzy +msgid "" +"Updated space-explorer to `1.1.8 `__." +msgstr "" +"Добавлен модуль ``expirationd`` 1.1.0. (`Журнал изменений " +"`__)" + +#, fuzzy +msgid "" +"Updated cartridge-metrics-role to `0.1.1 " +"`__." +msgstr "" +"Утилита Cartridge CLI обновлена до v2.9.1. (`Журнал изменений " +"`__)" + +#, fuzzy +msgid "" +"Updated cartridge to `2.8.2 " +"`__." +msgstr "" +"Утилита Cartridge CLI обновлена до v2.8.0. (`Журнал изменений " +"`__)" + +#, fuzzy +msgid "" +"Updated expirationd to `1.5.0 " +"`__." +msgstr "" +"Добавлен модуль ``expirationd`` 1.1.0. (`Журнал изменений " +"`__)" + +#, fuzzy +msgid "" +"Added sideservice `0.1.0 " +"`__." +msgstr "" +"Добавлен модуль ``metrics`` 0.10.0. (`Журнал изменений " +"`__)" + +msgid "579" +msgstr "" + +#, fuzzy +msgid "" +"Updated cartridge-cli to `2.12.7 `__." +msgstr "" +"Утилита Cartridge CLI обновлена до v2.10.0. (`Журнал изменений " +"`__)" + +#, fuzzy +msgid "Updated ``tarantool-2.11`` to 2.11.1." +msgstr "Утилита ``cartridge-cli`` обновлена до v2.4.0." + +msgid "577" +msgstr "" + +#, fuzzy +msgid "" +"Added crud `1.2.0 `__." +msgstr "" +"Добавлен модуль ``crud`` 0.8.0. (`Журнал изменений " +"`__)" + +#, fuzzy +msgid "" +"Added ddl `1.6.3 `__." +msgstr "" +"Добавлен модуль ``ddl`` 1.5.0. (`Журнал изменений " +"`__)" + +#, fuzzy +msgid "" +"Added sharded-queue `0.1.0 `__." +msgstr "" +"Добавлен модуль ``queue`` 1.1.0. (`Журнал изменений " +"`__)" + +#, fuzzy +msgid "" +"Added ddl `1.6.4 `__." +msgstr "" +"Добавлен модуль ``ddl`` 1.5.0. (`Журнал изменений " +"`__)" + +#, fuzzy +msgid "" +"Updated tt-ee to `1.1.2 `__." +msgstr "" +"Добавлен модуль ``queue`` 1.1.0. (`Журнал изменений " +"`__)" + +#, fuzzy +msgid "" +"Updated cartridge-cli to `2.12.6 `__." +msgstr "" +"Утилита Cartridge CLI обновлена до v2.10.0. (`Журнал изменений " +"`__)" + +msgid "563" +msgstr "" + +#, fuzzy +msgid "Updated ``tarantool-2.10`` to 2.10.7." +msgstr "Утилита ``cartridge-cli`` обновлена до v2.4.0." + +#, fuzzy +msgid "Updated ``tarantool-2.11`` to 2.11.0." +msgstr "Утилита ``cartridge-cli`` обновлена до v2.4.0." + +#, fuzzy +msgid "" +"Added kafka `1.6.6 " +"`__." +msgstr "" +"Добавлен модуль ``kafka`` v1.3.1. (`Журнал изменений " +"`__)." + +#, fuzzy +msgid "" +"Added vshard `0.1.24 " +"`__." +msgstr "" +"Добавлен модуль ``vshard`` 0.1.18. (`Журнал изменений " +"`__)" + +#, fuzzy +msgid "" +"Added metrics `1.0.0 " +"`__." +msgstr "" +"Добавлен модуль ``metrics`` 0.10.0. (`Журнал изменений " +"`__)" + +#, fuzzy +msgid "" +"Added cartridge-metrics-role `0.1.0 `__." +msgstr "" +"Добавлен модуль ``cartridge-extensions`` 1.1.0. (`Журнал изменений " +"`__)" + +#, fuzzy +msgid "" +"Added cartridge `2.8.0 " +"`__." +msgstr "" +"Добавлен модуль ``cartridge`` 2.7.0. (`Журнал изменений " +"`__)" + +#, fuzzy +msgid "" +"Added http `1.5.0 `__." +msgstr "" +"Добавлен модуль ``ddl`` 1.5.0. (`Журнал изменений " +"`__)" + +msgid "557" +msgstr "" + +#, fuzzy +msgid "" +"Added checks `3.3.0 " +"`__." +msgstr "" +"Добавлен модуль ``metrics`` 0.9.0. (`Журнал изменений " +"`__)" + +#, fuzzy +msgid "" +"Updated cartridge-cli to `2.12.5 `__." +msgstr "" +"Утилита Cartridge CLI обновлена до v2.10.0. (`Журнал изменений " +"`__)" + +msgid "553" +msgstr "" + +msgid "Added ``tt-ee`` and ``tt`` environment configuration." +msgstr "" + +#, fuzzy +msgid "" +"Added crud `1.1.1 `__." +msgstr "" +"Добавлен модуль ``crud`` 0.8.0. (`Журнал изменений " +"`__)" + +#, fuzzy +msgid "" +"Added avro-schema `3.1.1 `__." +msgstr "" +"Добавлен модуль ``vshard`` 0.1.18. (`Журнал изменений " +"`__)" + +#, fuzzy +msgid "" +"Added expirationd `1.4.0 " +"`__." +msgstr "" +"Добавлен модуль ``expirationd`` 1.1.0. (`Журнал изменений " +"`__)" + +#, fuzzy +msgid "" +"Added graphql `0.3.0 " +"`__." +msgstr "" +"Добавлен модуль ``graphql`` v0.1.1. (`Журнал изменений " +"`__)" + +#, fuzzy +msgid "" +"Added graphqlapi `0.0.10 " +"`__." +msgstr "" +"Добавлен модуль ``graphql`` v0.1.1. (`Журнал изменений " +"`__)" + +#, fuzzy +msgid "" +"Added metrics `0.17.0 " +"`__." +msgstr "" +"Добавлен модуль ``metrics`` 0.10.0. (`Журнал изменений " +"`__)" + +#, fuzzy +msgid "" +"Added migrations `0.5.0 " +"`__." +msgstr "" +"Добавлен модуль ``expirationd`` 1.1.0. (`Журнал изменений " +"`__)" +#, fuzzy msgid "" -"Added cartridge 2.7.0. (`Changelog " +"Added oracle `1.4.0 " +"`__." +msgstr "" +"Добавлен модуль ``ddl`` 1.5.0. (`Журнал изменений " +"`__)" + +#, fuzzy +msgid "" +"Added cartridge `2.7.9 " +"`__." +msgstr "" +"Добавлен модуль ``cartridge`` 2.7.0. (`Журнал изменений " "`__)" + +#, fuzzy +msgid "" +"Added vshard `0.1.23 " +"`__." +msgstr "" +"Добавлен модуль ``vshard`` 0.1.18. (`Журнал изменений " +"`__)" + +#, fuzzy +msgid "" +"Added kafka `1.6.5 " +"`__." +msgstr "" +"Добавлен модуль ``kafka`` v1.3.1. (`Журнал изменений " +"`__)." + +msgid "549" +msgstr "" + +#, fuzzy +msgid "Updated ``tarantool-2.10`` to 2.10.6." +msgstr "Утилита ``cartridge-cli`` обновлена до v2.4.0." + +msgid "545" +msgstr "" + +#, fuzzy +msgid "Updated ``tarantool-2.11`` to 2.11.0-rc2." +msgstr "Утилита ``cartridge-cli`` обновлена до v2.4.0." + +msgid "543" +msgstr "" + +msgid "Added the ``tarantool-2.11`` submodule." +msgstr "" + +msgid "542" +msgstr "" + +msgid "Updated ``tarantool-1.10`` to 1.10.15." +msgstr "" + +msgid "541" +msgstr "" + +msgid "Updated ``tarantool-master`` to ``3.0.0-entrypoint``." +msgstr "" + +msgid "540" +msgstr "" + +#, fuzzy +msgid "Updated ``tarantool-2.10`` to 2.10.5." +msgstr "Утилита ``cartridge-cli`` обновлена до v2.4.0." + +msgid "539" +msgstr "" + +#, fuzzy +msgid "" +"Added vshard `0.1.22 " +"`__." +msgstr "" +"Добавлен модуль ``vshard`` 0.1.18. (`Журнал изменений " +"`__)" + +msgid "538" +msgstr "" + +msgid "Updated ``tarantool-2.8`` to apply 2 hotfixes." +msgstr "" + +msgid "537" +msgstr "" + +msgid "Fix non-interactive installation of the ``brew`` package." +msgstr "" + +msgid "Changed the owner of the ``/usr/local/bin`` directory." +msgstr "" + +msgid "" +"Installed ``awscli@1`` instead of ``awscli`` since it takes much less time." +msgstr "" + +msgid "536" +msgstr "" + +msgid "" +"Added the missing property ``2.10`` for scope ``CACHE`` in CMakeLists.txt." +msgstr "" + +msgid "535" +msgstr "" + +#, fuzzy +msgid "" +"Added expirationd `1.3.1 " +"`__." +msgstr "" +"Добавлен модуль ``expirationd`` 1.1.0. (`Журнал изменений " +"`__)" + +msgid "534" +msgstr "" + +#, fuzzy +msgid "" +"Added crud `1.0.0 `__." +msgstr "" +"Добавлен модуль ``crud`` 0.8.0. (`Журнал изменений " +"`__)" + +msgid "533" +msgstr "" + +msgid "" +"Use runners with label ``regular`` for builds and the tagged release " +"workflow." +msgstr "" + +msgid "532" +msgstr "" + +#, fuzzy +msgid "" +"Added http `1.4.0 `__." +msgstr "" +"Добавлен модуль ``ddl`` 1.5.0. (`Журнал изменений " +"`__)" + +#, fuzzy +msgid "" +"Added space-explorer `1.1.7 `__." +msgstr "" +"Добавлен модуль ``queue`` 1.1.0. (`Журнал изменений " +"`__)" + +#, fuzzy +msgid "" +"Added checks `3.2.0 " +"`__." +msgstr "" +"Добавлен модуль ``errors`` 2.2.0. (`Журнал изменений " +"`__)" + +#, fuzzy +msgid "" +"Added metrics `0.16.0 " +"`__." +msgstr "" +"Добавлен модуль ``metrics`` 0.10.0. (`Журнал изменений " +"`__)" + +#, fuzzy +msgid "" +"Added cartridge `2.7.8 " +"`__." msgstr "" "Добавлен модуль ``cartridge`` 2.7.0. (`Журнал изменений " "`__)" +msgid "531" +msgstr "" + msgid "" -"Added membership 2.4.0. (`Changelog " -"`__)" +"Added the ``-DENABLE_LTO=ON`` flag for tarantool-ee@master branch to " +"CMakeLists.txt" +msgstr "" + +msgid "530" +msgstr "" + +msgid "" +"Upgraded devtoolset from 8 to 9. It was required for upgrading ld from 2.30 " +"to 2.31+ for LTO." +msgstr "" + +msgid "529" +msgstr "" + +msgid "Updated tarantool’s master branch to a recent revision." +msgstr "" + +msgid "528" +msgstr "" + +msgid "Fixed code style in the Linux and macOS workflows." +msgstr "" + +msgid "527" +msgstr "" + +msgid "Reliably install packages in macOS builds." +msgstr "" + +msgid "526" +msgstr "" + +msgid "" +"Refactored the way that GC64 builds are defined in the build workflow. There" +" are no changes to the composition of resulting bundles." +msgstr "" + +msgid "525" +msgstr "" + +msgid "" +"Added alerting failures in builds on stable branches and integration testing" +" to VK Teams chats." +msgstr "" + +msgid "524" +msgstr "" + +msgid "Updated to fresh tarantool master (``2.11.0-entrypoint-107-ga18449d``)" +msgstr "" + +msgid "523" +msgstr "" + +#, fuzzy +msgid "" +"Added cartridge `2.7.7 " +"`__." +msgstr "" +"Добавлен модуль ``cartridge`` 2.7.0. (`Журнал изменений " +"`__)" + +msgid "522" +msgstr "" + +msgid "Outdated workflow runs are now canceled to save CI time." +msgstr "" + +msgid "521" +msgstr "" + +#, fuzzy +msgid "" +"Added crud `0.14.1 " +"`__." +msgstr "" +"Добавлен модуль ``crud`` 0.8.0. (`Журнал изменений " +"`__)" + +#, fuzzy +msgid "" +"Added expirationd `1.3.0 " +"`__." +msgstr "" +"Добавлен модуль ``expirationd`` 1.1.0. (`Журнал изменений " +"`__)" + +#, fuzzy +msgid "" +"Added metrics `0.15.1 " +"`__." +msgstr "" +"Добавлен модуль ``metrics`` 0.7.1. (`Журнал изменений " +"`__)" + +#, fuzzy +msgid "" +"Added queue `1.2.2 " +"`__." +msgstr "" +"Добавлен модуль ``queue`` 1.1.0. (`Журнал изменений " +"`__)" + +msgid "520" +msgstr "" + +msgid "Release SDK by tags:" +msgstr "" + +msgid "Run workflow in SDK docker container." +msgstr "" + +msgid "Upload SDK files for 1.10, 2.8, 2.10 versions to release folder." +msgstr "" + +msgid "Add consistency check for all versions." msgstr "" -"Добавлен модуль ``membership`` 2.4.0. (`Журнал изменений " -"`__)" -msgid "" -"Added ddl 1.5.0. (`Changelog " -"`__)" +msgid "519" msgstr "" -"Добавлен модуль ``ddl`` 1.5.0. (`Журнал изменений " -"`__)" -msgid "" -"Added vshard 0.1.18. (`Changelog " -"`__)" +msgid "On feature branches, SDK is now rebuilt only on relevant changes." msgstr "" -"Добавлен модуль ``vshard`` 0.1.18. (`Журнал изменений " -"`__)" +#, fuzzy +msgid "r518" +msgstr "r418" + +#, fuzzy msgid "" -"Added frontend-core 7.10.0. (`Changelog " -"`__)" +"Added frontend core `8.2.1 `__." msgstr "" "Добавлен модуль ``frontend-core`` 7.10.0. (`Журнал изменений " "`__)" +#, fuzzy msgid "" -"Added luatest 0.5.4. (`Changelog " -"`__)" +"Added vshard `0.1.21 " +"`__." msgstr "" -"Добавлен модуль ``luatest`` 0.5.4. (`Журнал изменений " -"`__)" +"Добавлен модуль ``vshard`` 0.1.18. (`Журнал изменений " +"`__)" +#, fuzzy msgid "" -"Added cartridge-extensions 1.1.0. (`Changelog " -"`__)" +"Added http `1.3.0 `__." msgstr "" -"Добавлен модуль ``cartridge-extensions`` 1.1.0. (`Журнал изменений " -"`__)" +"Добавлен модуль ``ddl`` 1.5.0. (`Журнал изменений " +"`__)" + +#, fuzzy +msgid "" +"Added cartridge `2.7.6 " +"`__." +msgstr "" +"Добавлен модуль ``cartridge`` 2.7.0. (`Журнал изменений " +"`__)" -msgid "r417" +#, fuzzy +msgid "r517" msgstr "r417" -msgid "No noticeable changes" -msgstr "Нет заметных изменений." +#, fuzzy +msgid "" +"Updated Tarantool EE to `2.10.4 `__." +msgstr "" +"Утилита Cartridge CLI обновлена до v2.10.0. (`Журнал изменений " +"`__)" -msgid "r416" +#, fuzzy +msgid "r516" msgstr "r416" -msgid "" -"Added metrics 0.10.0. (`Changelog " -"`__)" +msgid "Updated bundled OpenSSL to version 1.1.1q." msgstr "" -"Добавлен модуль ``metrics`` 0.10.0. (`Журнал изменений " -"`__)" -msgid "r415" +#, fuzzy +msgid "r515" msgstr "r415" +msgid "Removed support of Tarantool 2.7." +msgstr "" + msgid "" -"Updated Cartridge CLI to v2.10.0. (`Changelog " -"`__)" +"Started using ``tarantool/actions/prepare-checkout`` to make builds more " +"stable." msgstr "" -"Утилита Cartridge CLI обновлена до v2.10.0. (`Журнал изменений " -"`__)" -msgid "r414" +#, fuzzy +msgid "r514" msgstr "r414" -msgid "1.10.10-52-g0df29b137" -msgstr "1.10.10-52-g0df29b137" +msgid "Remove the local registry and setup using GitHub registry." +msgstr "" -msgid "2.7.2-110-g51248c7d2" -msgstr "2.7.2-110-g51248c7d2" +msgid "Sync rocks cache to s3 and back." +msgstr "" -msgid "2.8.1-119-g1b0050564" -msgstr "2.8.1-119-g1b0050564" +msgid "Setup using shared runners." +msgstr "" -msgid "" -"The most notable change is the fix for `gh-4040 " -"`__." +msgid "Refactor and format ``ci-linux.yml`` and ``ci-macos.yml``." msgstr "" -"Самое важное изменение: исправлена проблема, описанная в тикете `gh-4040 " -"`__." -msgid "r413" +#, fuzzy +msgid "r513" msgstr "r413" -msgid "Added migrations 0.4.1." -msgstr "Добавлен модуль ``migrations`` 0.4.1." +msgid "" +"Removed kafka 1.5.0 due to a build issue with Tarantool 2.10.3 and higher." +msgstr "" + +#, fuzzy +msgid "" +"Updated kafka to version `1.6.2 " +"`__." +msgstr "" +"Добавлен модуль ``kafka`` v1.3.1. (`Журнал изменений " +"`__)." -msgid "r412" +#, fuzzy +msgid "r512" msgstr "r412" -msgid "Added ldap 1.0.2 instead of 1.0.1 with a bugfix." -msgstr "Модуль ldap обновлен с версии 1.0.1 до 1.0.2, исправлены ошибки." +#, fuzzy +msgid "" +"Updated tuple-keydef to version `0.0.3 `__." +msgstr "" +"Добавлен модуль ``tuple-keydef`` 0.0.2. (`Журнал изменений " +"`__)" -msgid "r411" +#, fuzzy +msgid "r511" msgstr "r411" -msgid "" -"Added expirationd 1.1.0. (`Changelog " -"`__)" +msgid "Enabled parallel build of rocks for macOS in CI." msgstr "" -"Добавлен модуль ``expirationd`` 1.1.0. (`Журнал изменений " -"`__)" -msgid "r410" +#, fuzzy +msgid "r510" msgstr "r410" -msgid "" -"Added crud 0.8.0. (`Changelog " -"`__)" +msgid "Updated Tarantool to :doc:`2.10.3 `." msgstr "" -"Добавлен модуль ``crud`` 0.8.0. (`Журнал изменений " -"`__)" msgid "" -"Added luatest 0.5.3. (`Changelog " -"`__)" +"Added a readable error for the case when the flight recoder fails to write " +"data due to insufficient free space on the disk device. Previously, it was " +"sending a `SIGBUS` error (:tarantool-ee-issue:`196`)." msgstr "" -"Добавлен модуль ``luatest`` 0.5.3. (`Журнал изменений " -"`__)" - -msgid "r409" -msgstr "r409" msgid "" -"Added tuple-merger 0.0.2. (`Changelog `__)" +"Fixed a crash in the flight recorder caused by non-thread-safe log recording" +" from multiple threads (:tarantool-ee-issue:`226`)." msgstr "" -"Добавлен модуль ``tuple-merger`` 0.0.2. (`Журнал изменений " -"`__)" -msgid "r408" -msgstr "r408" +#, fuzzy +msgid "r502" +msgstr "r402" -msgid "" -"Added crud 0.7.1 instead of broken 0.7.0. (`Changelog " -"`__)" +msgid "Updated Tarantool to :doc:`2.10.2 `." msgstr "" -"Добавлен модуль ``crud`` 0.7.1 вместо неисправной версии 0.7.0. (`Журнал " -"изменений `__)" - -msgid "r407" -msgstr "r407" msgid "" -"Added crud 0.7.0. (`Changelog " -"`__)" +"Increased resolution of stored entries in flight recorder (:tarantool-ee-" +"issue:`193`)." msgstr "" -"Добавлен модуль ``crud`` 0.7.0. (`Журнал изменений " -"`__)" msgid "" -"Added tuple-keydef 0.0.2. (`Changelog `__)" +"Fixed a bug in the flight recorder that resulted in skipping log entries in " +"case ``box.cfg.log_level`` is less than ``flightrec_log_level`` (:tarantool-" +"ee-issue:`201`)." msgstr "" -"Добавлен модуль ``tuple-keydef`` 0.0.2. (`Журнал изменений " -"`__)" -msgid "" -"Added watchdog 1.1.1 instead of 1.0.1. (`Changelog " -"`__)" +#, fuzzy +msgid "r498" +msgstr "r419" + +msgid "Updated Tarantool to :doc:`2.10.1 `." msgstr "" -"Модуль ``watchdog`` обновлен с версии 1.0.1 до 1.1.1. (`Журнал изменений " -"`__)" -msgid "Added ldap 1.0.1 instead of 1.0.0 with several bugfixes." -msgstr "Модуль ldap обновлен с версии 1.0.0 до 1.0.1, исправлены ошибки." +#, fuzzy +msgid "Updated Cyrus SASL to version 2.1.28." +msgstr "Обновлены базовые версии:" -msgid "Added space-explorer 1.1.3 with fixed roles reload compatibility." +msgid "Updated OpenLDAP to version 2.5.13." msgstr "" -"Добавлен модуль ``space-explorer`` 1.1.3 с улучшенной совместимостью при " -"перезагрузке ролей." - -msgid "r406" -msgstr "r406" msgid "" -"Added metrics 0.9.0. (`Changelog " -"`__)" +"Updated LZ4 to version 1.9.3. Fixed `CVE-2021-3520 " +"`__." msgstr "" -"Добавлен модуль ``metrics`` 0.9.0. (`Журнал изменений " -"`__)" - -msgid "r405" -msgstr "r405" msgid "" -"Added errors 2.2.0. (`Changelog " -"`__)" +"Fixed replication reconnect failure after disabling SSL encryption " +"(:tarantool-ee-issue:`137`)." msgstr "" -"Добавлен модуль ``errors`` 2.2.0. (`Журнал изменений " -"`__)" - -msgid "r404" -msgstr "r404" msgid "" -"Added smtp 0.0.6. (`Changelog " -"`__)" +"Fixed a crash that occurred while tyring to start an instance that has a " +"compressed memtx space (:tarantool-ee-issue:`171`)." msgstr "" -"Добавлен модуль ``smtp`` 0.0.6. (`Журнал изменений " -"`__)" - -msgid "r403" -msgstr "r403" msgid "" -"Updated Cartridge CLI to v2.9.1. (`Changelog " -"`__)" +"Fixed `CVE-2022-29242 `__ " +"in GOST SSL engine." msgstr "" -"Утилита Cartridge CLI обновлена до v2.9.1. (`Журнал изменений " -"`__)" - -msgid "r402" -msgstr "r402" msgid "" -"Added odbc 1.0.1. (`Changelog " -"`__)" +"Fixed a bug in the flight recorder reader implementation that resulted in a " +"hang or error while trying to open an empty section (:tarantool-ee-" +"issue:`187`)." msgstr "" -"Добавлен модуль ``odbc`` 1.0.1. (`Журнал изменений " -"`__)" - -msgid "r401" -msgstr "r401" - -msgid "Added tools for collecting crash artifacts:" -msgstr "Добавлены инструменты для сбора артефактов сбоев:" -msgid "``tools/gdb.sh``" -msgstr "``tools/gdb.sh``" +#, fuzzy +msgid "r467" +msgstr "r417" -msgid "``tools/tarabrt.sh``" -msgstr "``tools/tarabrt.sh``" +msgid "Breaking changes" +msgstr "" -msgid "Also moved luajit gdb extension:" -msgstr "Также перемещено расширение LuaJIT gdb:" +msgid "Default audit log format was changed to CSV." +msgstr "" -msgid "``tools/luajit-gdb.py``" -msgstr "``tools/luajit-gdb.py``" +msgid "Functionality added or changed" +msgstr "" -msgid "r400" -msgstr "r400" +msgid "Enterprise" +msgstr "" msgid "" -"Updated Cartridge CLI to v2.9.0. (`Changelog " -"`__)" +"Implemented user-defined audit events. Now it's possible to log custom " +"messages to the audit log from Lua (:tarantool-ee-issue:`65`)." msgstr "" -"Утилита Cartridge CLI обновлена до v2.9.0. (`Журнал изменений " -"`__)" msgid "" -"Added cartridge v2.6.0 rock. (`Changelog " -"`__)" +"**[Breaking change]** Switched the default audit log format to CSV. The " +"format can be switched back to JSON using the new ``box.cfg.audit_format`` " +"configuration option (:tarantool-ee-issue:`66`)." msgstr "" -"Добавлен модуль ``cartridge`` 2.6.0. (`Журнал изменений " -"`__)" msgid "" -"Added ddl v1.4.0 rock. (`Changelog " -"`__)" +"Implemented the audit log filter. Now, it's possible to enable logging only " +"for a subset of all audit events using the new ``box.cfg.audit_filter`` " +"configuration option (:tarantool-ee-issue:`67`)." msgstr "" -"Добавлен модуль ``ddl`` v1.4.0. (`Журнал изменений " -"`__)" -msgid "" -"Added vshard v0.1.17 rock. (`Changelog " -"`__)" +msgid "Core" msgstr "" -"Добавлен модуль ``vshard`` v0.1.17. (`Журнал изменений " -"`__)" msgid "" -"Added membership v2.3.2 rock. (`Changelog " -"`__)" +"Implement constraints and foreign keys. Now a user can create function " +"constraints and foreign key relations (:tarantool-issue:`6436`)." msgstr "" -"Добавлен модуль ``membership`` v2.3.2. (`Журнал изменений " -"`__)" msgid "" -"Added frontend-core v7.7.0 rock. (`Changelog " -"`__)" +"Changed log level of some information messages from critical to info " +"(:tarantool-issue:`4675`)." msgstr "" -"Добавлен модуль ``frontend-core`` 7.7.0. (`Журнал изменений " -"`__)" msgid "" -"Added graphql v0.1.1 rock. (`Changelog " -"`__)" +"Added predefined system events: ``box.status``, ``box.id``, ``box.election``" +" and ``box.schema`` (:tarantool-issue:`6260`)." msgstr "" -"Добавлен модуль ``graphql`` v0.1.1. (`Журнал изменений " -"`__)" - -msgid "r399" -msgstr "r399" -msgid "1.10.10-0-gaea7ae77a" -msgstr "1.10.10-0-gaea7ae77a" - -msgid "2.6.3-0-gcd487a2c5" -msgstr "2.6.3-0-gcd487a2c5" +msgid "" +"Introduced transaction isolation levels in Lua and IPROTO (:tarantool-" +"issue:`6930`)." +msgstr "" -msgid "2.7.2-0-g4d8c06890" -msgstr "2.7.2-0-g4d8c06890" +msgid "Vinyl" +msgstr "" -msgid "2.8.1-0-ge2a1ec0c2" -msgstr "2.8.1-0-ge2a1ec0c2" +msgid "" +"Disabled the deferred DELETE optimization in Vinyl to avoid possible " +"performance degradation of secondary index reads. Now, to enable the " +"optimization, one has to set the ``defer_deletes`` flag in space options " +"(:tarantool-issue:`4501`)." +msgstr "" -msgid "r398" -msgstr "r398" +msgid "Lua" +msgstr "" msgid "" -"Added metrics 0.8.0. (`Changelog " -"`__)" +"Added support of console autocompletion for net.box objects ``stream`` and " +"``future`` (:tarantool-issue:`6305`)." msgstr "" -"Добавлен модуль ``metrics`` v0.8.0. (`Журнал изменений " -"`__)" -msgid "r397" -msgstr "r397" +msgid "Datetime" +msgstr "" -msgid "" -"Added queue 1.1.0. (`Changelog " -"`__)" +msgid "Parse method to allow converting string literals in extended iso-8601" msgstr "" -"Добавлен модуль ``queue`` 1.1.0. (`Журнал изменений " -"`__)" -msgid "r396" -msgstr "r396" +msgid "or rfc3339 formats (:tarantool-issue:`6731`)." +msgstr "" -msgid "r395" -msgstr "r395" +msgid "The range of supported years has been extended in all parsers to cover" +msgstr "" -msgid "" -"Added task v0.8.4 rock. (:doc:`Changelog " -"`)" +msgid "fully -5879610-06-22..5879611-07-11 (:tarantool-issue:`6731`)." msgstr "" -"Добавлен модуль task v.0.8.4. (:doc:`Журнал изменений " -"`)" -msgid "r394" -msgstr "r394" +msgid "Build" +msgstr "" msgid "" -"Updated Cartridge CLI to v2.8.0. (`Changelog " -"`__)" +"Added bundling of *GNU libunwind* to support backtrace feature on *AARCH64* " +"architecture and distributives that don't provide *libunwind* package." msgstr "" -"Утилита Cartridge CLI обновлена до v2.8.0. (`Журнал изменений " -"`__)" - -msgid "r392" -msgstr "r392" msgid "" -"Added crud v0.6.0 rock. (`Changelog " -"`__)" +"Re-enabled backtrace feature for all *RHEL* distributions by default, except" +" for *AARCH64* architecture and ancient *GCC* versions, which lack compiler " +"features required for backtrace (gh-4611)." msgstr "" -"Добавлен модуль ``crud`` v0.6.0. (`Журнал изменений " -"`__)" -msgid "r391" -msgstr "r391" +msgid "Bugs fixed" +msgstr "" msgid "" -"Added cartridge v2.5.1 rock. (`Changelog " -"`__)" +"Disabled audit log unless explicitly configured (:tarantool-ee-issue:`39`). " +"Before this change, audit events were written to stderr if " +"``box.cfg.audit_log`` wasn't set. Now, audit log is disabled in this case." msgstr "" -"Добавлен модуль ``cartridge`` v2.5.1. (`Журнал изменений " -"`__)" msgid "" -"Added cartridge-cli-extensions v1.1.1 rock. (`Changelog " -"`__)" +"Disabled audit logging of replicated events (:tarantool-ee-issue:`59`). Now," +" replicated events (for example, user creation) are logged only on the " +"origin, never on a replica." msgstr "" -"Добавлен модуль ``cartridge-cli-extensions`` v1.1.1. (`Журнал изменений " -"`__)" msgid "" -"Added errors v2.1.5 rock. (`Changelog " -"`__)" +"Banned DDL operations in space on_replace triggers, since they could lead to" +" a crash (:tarantool-issue:`6920`)." msgstr "" -"Добавлен модуль ``errors`` v2.1.5. (`Журнал изменений " -"`__)" msgid "" -"Updated Cartridge CLI to v2.7.2. (`Changelog " -"`__)" +"Fixed a bug due to which all fibers created with " +"``fiber_attr_setstacksize()`` leaked until the thread exit. Their stacks " +"also leaked except when ``fiber_set_joinable(..., true)`` was used." msgstr "" -"Утилита Cartridge CLI обновлена до v2.7.2. (`Журнал изменений " -"`__)" - -msgid "r390" -msgstr "r390" - -msgid "Updated 2.6 version to ``2.6.2-124-g2c3b91439``." -msgstr "Базовая версия 2.6 обновлена до ``2.6.2-124-g2c3b91439``." msgid "" -"Added metrics v0.7.1. (`Changelog " -"`__)" +"Fixed a crash in mvcc connected with secondary index conflict (:tarantool-" +"issue:`6452`)." msgstr "" -"Добавлен модуль ``metrics`` 0.7.1. (`Журнал изменений " -"`__)" -msgid "Added watchdog 1.1.0 with a new option to enable core dumps." +msgid "" +"Fixed a bug which resulted in wrong space count (:tarantool-issue:`6421`)." msgstr "" -"Добавлен модуль ``watchdog`` 1.1.0 с новой возможностью совершать дампы " -"памяти." - -msgid "Bundle luajit gdb extension." -msgstr "Расширение LuaJIT gdb упаковано." - -msgid "r389" -msgstr "r389" - -msgid "Fixed OpenSSL certificates lookup." -msgstr "Исправлен поиск сертификатов OpenSSL." - -msgid "Fixed smtp module compatibility (tarantool 2.6, 2.7 only)." -msgstr "Исправлена совместимость модуля smtp (только Tarantool 2.6, 2.7)." - -msgid "r388" -msgstr "r388" msgid "" -"Updated Cartridge CLI to v2.7.1. (`Changelog " -"`__)" +"Select in RO transaction now reads confirmed data, like a standalone " +"(auotcommit) select does (:tarantool-issue:`6452`)." msgstr "" -"Утилита Cartridge CLI обновлена до v2.7.1. (`Журнал изменений " -"`__)" - -msgid "r387" -msgstr "r387" -msgid "Added odbc v1.0.0 rock." -msgstr "Добавлен модуль ``odbc`` v1.0.0." - -msgid "r386" -msgstr "r386" +msgid "Replication" +msgstr "" msgid "" -"Updated Cartridge CLI to v2.7.0. (`Changelog " -"`__)" +"Fixed potential obsolete data write in synchronious replication due to race " +"in accessing terms while disk write operation is in progress and not yet " +"completed." msgstr "" -"Утилита Cartridge CLI обновлена до v2.7.0. (`Журнал изменений " -"`__)" - -msgid "r385" -msgstr "r385" msgid "" -"Added crud v0.5.0 rock. (`Changelog " -"`__)" +"Fixed replicas failing to bootstrap when master is just re-started " +"(:tarantool-issue:`6966`)." msgstr "" -"Добавлен модуль ``crud`` v0.5.0. (`Журнал изменений " -"`__)" -msgid "r384" -msgstr "r384" +msgid "" +"Fixed the behavior of tarantool console on SIGINT. Now Ctrl+C discards the " +"current input and prints the new prompt (:tarantool-issue:`2717`)." +msgstr "" -msgid "Added cartridge v2.5.0 rock." -msgstr "Добавлен модуль ``cartridge`` v2.5.0." +msgid "Triggers" +msgstr "" -msgid "Added frontend-core v7.5.0 rock (a cartridge dependency)." -msgstr "Добавлен модуль ``frontend-core`` v7.5.0 (зависимость Cartridge)." +msgid "" +"Fixed assertion or segfault when MP_EXT received via net.box (:tarantool-" +"issue:`6766`)." +msgstr "" -msgid "Updated luarapidxml rock: added v2.0.2, removed v2.0.1." -msgstr "Модуль luarapidxml обновлен с 2.0.1 до 2.0.2." +msgid "" +"Now ROUND() properly support INTEGER and DECIMAL as the first argument " +"(:tarantool-issue:`6988`)." +msgstr "" -msgid "r383" -msgstr "r383" +msgid "" +"Intervals received after datetime arithmetic operations may be improperly " +"normalized if result was negative" +msgstr "" -msgid "Added luagraphqlparser v0.1.0 rock." -msgstr "Добавлен модуль ``luagraphqlparser`` v0.1.0." +msgid "" +"tarantool> date.now() - date.now()\n" +"---\n" +"- -1.000026000 seconds\n" +"..." +msgstr "" -msgid "Added graphql v0.1.0 rock." -msgstr "Добавлен модуль ``graphql`` v0.1.0." +msgid "" +"I.e. 2 immediately called ``date.now()`` produce very close values, whose " +"difference should be close to 0, not 1 second (gh-6882)." +msgstr "" -msgid "r382" -msgstr "r382" +msgid "Net.box" +msgstr "" msgid "" -"Updated Cartridge CLI to v2.6.0. (`Changelog " -"`__)" +"Changed the type of the error returned by net.box on timeout from " +"ClientError to TimedOut (:tarantool-issue:`6144`)." msgstr "" -"Утилита Cartridge CLI обновлена до v2.6.0. (`Журнал изменений " -"`__)" -msgid "r381" -msgstr "r381" +#, fuzzy +msgid "r457" +msgstr "r417" -msgid "Add ``space-explorer`` v1.1.2 rock with fixed styles." -msgstr "Добавлен модуль ``space-explorer`` v1.1.2 с исправленными стилями." +msgid "Fixed some binary protocol encryption bugs." +msgstr "" -msgid "r380" -msgstr "r380" +#, fuzzy +msgid "r455" +msgstr "r415" -msgid "Add ``metrics`` v0.7.0 rock." -msgstr "Добавлен модуль ``metrics`` v0.7.0." +msgid "" +"Added :ref:`binary protocol encryption `." +msgstr "" -msgid "r376" -msgstr "r376" +msgid "Added :doc:`tuple field compression `." +msgstr "" -msgid "Add ``migrations`` v0.4.0 rock." -msgstr "Добавлен модуль ``migrations`` v0.4.0." +#~ msgid "" +#~ "``REVISION`` is the SDK revision. Besides Tarantool itself, it includes " +#~ "examples, templates, and a set of rocks." +#~ msgstr "" +#~ "``REVISION`` -- это версия SDK. Помимо самого Tarantool, в ней содержатся " +#~ "примеры, шаблоны и набор библиотек rocks." -msgid "r375" -msgstr "r375" +#~ msgid "r422" +#~ msgstr "r422" -msgid "Update base versions:" -msgstr "Обновлены базовые версии:" +#~ msgid "" +#~ "Added space-explorer ``v1.1.4`` rock with removed permanency flag and " +#~ "reduced bundle size." +#~ msgstr "" +#~ "Добавлен модуль (rock) space-explorer ``v1.1.4`` без флага permanency и с " +#~ "меньшим размером сборки." -msgid "1.10.9-0-g720ffdd23" -msgstr "1.10.9-0-g720ffdd23" +#~ msgid "r421" +#~ msgstr "r421" -msgid "2.5.3-0-gf93e48013" -msgstr "2.5.3-0-gf93e48013" +#~ msgid "1.10.11-0-gf0b0e7ecf" +#~ msgstr "1.10.11-0-gf0b0e7ecf" -msgid "2.6.2-0-g34d504d7d" -msgstr "2.6.2-0-g34d504d7d" +#~ msgid "2.7.3-0-gdddf926c3" +#~ msgstr "2.7.3-0-gdddf926c3" -msgid "2.7.1-0-g3ac498c9f" -msgstr "2.7.1-0-g3ac498c9f" +#~ msgid "2.8.2-0-gfc96d10f5" +#~ msgstr "2.8.2-0-gfc96d10f5" -msgid "r372" -msgstr "r372" +#~ msgid "Fixed audit log." +#~ msgstr "Исправлен журнал аудита." -msgid "Add ``frontend-core`` v7.4.0 rock (a Cartridge dependency)." -msgstr "Добавлен модуль ``frontend-core`` v7.4.0 (зависимость Cartridge)." +#~ msgid "Fixed compatibility with Tarantool 2.9:" +#~ msgstr "Исправлена проблема совместимости с Tarantool 2.9:" -msgid "" -"Add ``metrics`` v0.6.1 rock. (`Changelog " -"`__)." -msgstr "" -"Добавлен модуль ``metrics`` v0.6.1. (`Журнал изменений " -"`__)." +#~ msgid "Added errors 2.2.1." +#~ msgstr "Добавлен модуль ``errors`` 2.2.1." -msgid "" -"Add ``kafka`` v1.3.1 rock. (`Changelog " -"`__)." -msgstr "" -"Добавлен модуль ``kafka`` v1.3.1. (`Журнал изменений " -"`__)." +#~ msgid "Added cartridge 2.7.1 instead of 2.7.0." +#~ msgstr "Модуль ``cartridge`` 2.7.0 обновлен до версии 2.7.1." -msgid "r371" -msgstr "r371" +#~ msgid "" +#~ "Added luatest 0.5.4. (`Changelog " +#~ "`__)" +#~ msgstr "" +#~ "Добавлен модуль ``luatest`` 0.5.4. (`Журнал изменений " +#~ "`__)" -msgid "" -"Add ``ddl`` v1.3.0 rock. (`Changelog " -"`__)" -msgstr "" -"Добавлен модуль ``ddl`` v1.3.0. (`Журнал изменений " -"`__)" +#~ msgid "No noticeable changes" +#~ msgstr "Нет заметных изменений." -msgid "r370" -msgstr "r370" +#~ msgid "1.10.10-52-g0df29b137" +#~ msgstr "1.10.10-52-g0df29b137" -msgid "" -"Add ``cartridge`` v2.4.0 rock. (`Changelog " -"`__)" -msgstr "" -"Добавлен модуль ``cartridge`` v2.4.0. (`Журнал изменений " -"`__)" +#~ msgid "2.7.2-110-g51248c7d2" +#~ msgstr "2.7.2-110-g51248c7d2" -msgid "" -"Add ``metrics`` v0.6.0 rock. (`Changelog " -"`__)" -msgstr "" -"Добавлен модуль ``metrics`` v0.6.0. (`Журнал изменений " -"`__)" +#~ msgid "2.8.1-119-g1b0050564" +#~ msgstr "2.8.1-119-g1b0050564" -msgid "" -"Update Cartridge CLI to v2.5.0. (`Changelog " -"`__)" -msgstr "" -"Утилита Cartridge CLI обновлена до v2.5.0. (`Журнал изменений " -"`__)" +#~ msgid "" +#~ "The most notable change is the fix for `gh-4040 " +#~ "`__." +#~ msgstr "" +#~ "Самое важное изменение: исправлена проблема, описанная в тикете `gh-4040 " +#~ "`__." -msgid "" -"Add ``cartridge-cli-extensions`` 1.1.0 rock. (`Changelog " -"`__)" -msgstr "" -"Добавлен модуль ``cartridge-cli-extensions`` v1.1.0. (`Журнал изменений " -"`__)" +#~ msgid "Added migrations 0.4.1." +#~ msgstr "Добавлен модуль ``migrations`` 0.4.1." -msgid "" -"Add ``crud`` 0.4.0 rock. (`Changelog " -"`__)" -msgstr "" -"Добавлен модуль ``crud`` v0.4.0. (`Журнал изменений " -"`__)" +#~ msgid "Added ldap 1.0.2 instead of 1.0.1 with a bugfix." +#~ msgstr "Модуль ldap обновлен с версии 1.0.1 до 1.0.2, исправлены ошибки." -msgid "r369" -msgstr "r369" +#~ msgid "" +#~ "Added luatest 0.5.3. (`Changelog " +#~ "`__)" +#~ msgstr "" +#~ "Добавлен модуль ``luatest`` 0.5.3. (`Журнал изменений " +#~ "`__)" -msgid "Update ``luarapidxml`` rock: added v2.0.1, removed v2.0.0" -msgstr "Модуль ``luarapidxml`` обновлен с версии 2.0.0 до 2.0.1." +#~ msgid "r409" +#~ msgstr "r409" -msgid "r368" -msgstr "r368" +#~ msgid "" +#~ "Added tuple-merger 0.0.2. (`Changelog `__)" +#~ msgstr "" +#~ "Добавлен модуль ``tuple-merger`` 0.0.2. (`Журнал изменений " +#~ "`__)" -msgid "Update ``migrations`` rock: added v0.3.1" -msgstr "Модуль ``migrations`` обновлен до версии 0.3.1." +#~ msgid "r408" +#~ msgstr "r408" -msgid "r366" -msgstr "r366" +#~ msgid "" +#~ "Added crud 0.7.1 instead of broken 0.7.0. (`Changelog " +#~ "`__)" +#~ msgstr "" +#~ "Добавлен модуль ``crud`` 0.7.1 вместо неисправной версии 0.7.0. (`Журнал " +#~ "изменений `__)" + +#~ msgid "r407" +#~ msgstr "r407" + +#~ msgid "" +#~ "Added crud 0.7.0. (`Changelog " +#~ "`__)" +#~ msgstr "" +#~ "Добавлен модуль ``crud`` 0.7.0. (`Журнал изменений " +#~ "`__)" + +#~ msgid "" +#~ "Added watchdog 1.1.1 instead of 1.0.1. (`Changelog " +#~ "`__)" +#~ msgstr "" +#~ "Модуль ``watchdog`` обновлен с версии 1.0.1 до 1.1.1. (`Журнал изменений " +#~ "`__)" + +#~ msgid "Added ldap 1.0.1 instead of 1.0.0 with several bugfixes." +#~ msgstr "Модуль ldap обновлен с версии 1.0.0 до 1.0.1, исправлены ошибки." + +#~ msgid "Added space-explorer 1.1.3 with fixed roles reload compatibility." +#~ msgstr "" +#~ "Добавлен модуль ``space-explorer`` 1.1.3 с улучшенной совместимостью при " +#~ "перезагрузке ролей." + +#~ msgid "r406" +#~ msgstr "r406" + +#~ msgid "r405" +#~ msgstr "r405" + +#~ msgid "r404" +#~ msgstr "r404" + +#~ msgid "" +#~ "Added smtp 0.0.6. (`Changelog " +#~ "`__)" +#~ msgstr "" +#~ "Добавлен модуль ``smtp`` 0.0.6. (`Журнал изменений " +#~ "`__)" + +#~ msgid "r403" +#~ msgstr "r403" + +#~ msgid "" +#~ "Added odbc 1.0.1. (`Changelog " +#~ "`__)" +#~ msgstr "" +#~ "Добавлен модуль ``odbc`` 1.0.1. (`Журнал изменений " +#~ "`__)" + +#~ msgid "r401" +#~ msgstr "r401" + +#~ msgid "Added tools for collecting crash artifacts:" +#~ msgstr "Добавлены инструменты для сбора артефактов сбоев:" + +#~ msgid "``tools/gdb.sh``" +#~ msgstr "``tools/gdb.sh``" + +#~ msgid "``tools/tarabrt.sh``" +#~ msgstr "``tools/tarabrt.sh``" + +#~ msgid "Also moved luajit gdb extension:" +#~ msgstr "Также перемещено расширение LuaJIT gdb:" + +#~ msgid "``tools/luajit-gdb.py``" +#~ msgstr "``tools/luajit-gdb.py``" + +#~ msgid "r400" +#~ msgstr "r400" + +#~ msgid "" +#~ "Updated Cartridge CLI to v2.9.0. (`Changelog " +#~ "`__)" +#~ msgstr "" +#~ "Утилита Cartridge CLI обновлена до v2.9.0. (`Журнал изменений " +#~ "`__)" + +#~ msgid "" +#~ "Added cartridge v2.6.0 rock. (`Changelog " +#~ "`__)" +#~ msgstr "" +#~ "Добавлен модуль ``cartridge`` 2.6.0. (`Журнал изменений " +#~ "`__)" + +#~ msgid "" +#~ "Added ddl v1.4.0 rock. (`Changelog " +#~ "`__)" +#~ msgstr "" +#~ "Добавлен модуль ``ddl`` v1.4.0. (`Журнал изменений " +#~ "`__)" + +#~ msgid "" +#~ "Added vshard v0.1.17 rock. (`Changelog " +#~ "`__)" +#~ msgstr "" +#~ "Добавлен модуль ``vshard`` v0.1.17. (`Журнал изменений " +#~ "`__)" + +#~ msgid "" +#~ "Added membership v2.3.2 rock. (`Changelog " +#~ "`__)" +#~ msgstr "" +#~ "Добавлен модуль ``membership`` v2.3.2. (`Журнал изменений " +#~ "`__)" + +#~ msgid "" +#~ "Added frontend-core v7.7.0 rock. (`Changelog " +#~ "`__)" +#~ msgstr "" +#~ "Добавлен модуль ``frontend-core`` 7.7.0. (`Журнал изменений " +#~ "`__)" + +#~ msgid "r399" +#~ msgstr "r399" + +#~ msgid "1.10.10-0-gaea7ae77a" +#~ msgstr "1.10.10-0-gaea7ae77a" + +#~ msgid "2.6.3-0-gcd487a2c5" +#~ msgstr "2.6.3-0-gcd487a2c5" + +#~ msgid "2.7.2-0-g4d8c06890" +#~ msgstr "2.7.2-0-g4d8c06890" + +#~ msgid "2.8.1-0-ge2a1ec0c2" +#~ msgstr "2.8.1-0-ge2a1ec0c2" + +#~ msgid "r398" +#~ msgstr "r398" + +#~ msgid "" +#~ "Added metrics 0.8.0. (`Changelog " +#~ "`__)" +#~ msgstr "" +#~ "Добавлен модуль ``metrics`` v0.8.0. (`Журнал изменений " +#~ "`__)" + +#~ msgid "r397" +#~ msgstr "r397" + +#~ msgid "r396" +#~ msgstr "r396" + +#~ msgid "r395" +#~ msgstr "r395" + +#~ msgid "" +#~ "Added task v0.8.4 rock. (:doc:`Changelog " +#~ "`)" +#~ msgstr "" +#~ "Добавлен модуль task v.0.8.4. (:doc:`Журнал изменений " +#~ "`)" + +#~ msgid "r394" +#~ msgstr "r394" + +#~ msgid "r392" +#~ msgstr "r392" + +#~ msgid "" +#~ "Added crud v0.6.0 rock. (`Changelog " +#~ "`__)" +#~ msgstr "" +#~ "Добавлен модуль ``crud`` v0.6.0. (`Журнал изменений " +#~ "`__)" + +#~ msgid "r391" +#~ msgstr "r391" + +#~ msgid "" +#~ "Added cartridge v2.5.1 rock. (`Changelog " +#~ "`__)" +#~ msgstr "" +#~ "Добавлен модуль ``cartridge`` v2.5.1. (`Журнал изменений " +#~ "`__)" + +#~ msgid "" +#~ "Added errors v2.1.5 rock. (`Changelog " +#~ "`__)" +#~ msgstr "" +#~ "Добавлен модуль ``errors`` v2.1.5. (`Журнал изменений " +#~ "`__)" + +#~ msgid "" +#~ "Updated Cartridge CLI to v2.7.2. (`Changelog " +#~ "`__)" +#~ msgstr "" +#~ "Утилита Cartridge CLI обновлена до v2.7.2. (`Журнал изменений " +#~ "`__)" + +#~ msgid "r390" +#~ msgstr "r390" + +#~ msgid "Updated 2.6 version to ``2.6.2-124-g2c3b91439``." +#~ msgstr "Базовая версия 2.6 обновлена до ``2.6.2-124-g2c3b91439``." -msgid "" -"Update ``kafka`` rock: added v1.3.0, removed v1.2.0 and earlier, critical " -"fix." -msgstr "" -"Модуль ``kafka`` обновлен до версии 1.3.0. Версии 1.2.0 и более ранние " -"удалены, исправлена критическая ошибка." +#~ msgid "Added watchdog 1.1.0 with a new option to enable core dumps." +#~ msgstr "" +#~ "Добавлен модуль ``watchdog`` 1.1.0 с новой возможностью совершать дампы " +#~ "памяти." -msgid "r363" -msgstr "r363" +#~ msgid "Bundle luajit gdb extension." +#~ msgstr "Расширение LuaJIT gdb упаковано." -msgid "Update ``oracle`` rock: added v1.3.2, removed v1.3.0, critical fix." -msgstr "" -"Модуль ``oracle`` обновлен с версии 1.3.0 до 1.3.2, исправлена критическая " -"ошибка." +#~ msgid "r389" +#~ msgstr "r389" -msgid "r360" -msgstr "r360" +#~ msgid "Fixed OpenSSL certificates lookup." +#~ msgstr "Исправлен поиск сертификатов OpenSSL." -msgid "1.10.8-0-g2f18757b7" -msgstr "1.10.8-0-g2f18757b7" +#~ msgid "Fixed smtp module compatibility (tarantool 2.6, 2.7 only)." +#~ msgstr "Исправлена совместимость модуля smtp (только Tarantool 2.6, 2.7)." -msgid "2.4.3-0-g5180d98f1" -msgstr "2.4.3-0-g5180d98f1" +#~ msgid "r388" +#~ msgstr "r388" -msgid "2.5.2-0-g05730d326" -msgstr "2.5.2-0-g05730d326" +#~ msgid "" +#~ "Updated Cartridge CLI to v2.7.1. (`Changelog " +#~ "`__)" +#~ msgstr "" +#~ "Утилита Cartridge CLI обновлена до v2.7.1. (`Журнал изменений " +#~ "`__)" -msgid "2.6.1-0-gcfe0d1a55" -msgstr "2.6.1-0-gcfe0d1a55" +#~ msgid "r387" +#~ msgstr "r387" -msgid "1.10.6-16, 2.2.2-56, 2.3.1-143 and 2.4.2-8" -msgstr "1.10.6-16, 2.2.2-56, 2.3.1-143 и 2.4.2-8" +#~ msgid "Added odbc v1.0.0 rock." +#~ msgstr "Добавлен модуль ``odbc`` v1.0.0." -msgid "Changed:" -msgstr "Изменения:" +#~ msgid "r386" +#~ msgstr "r386" -msgid "**Tarantool 1.10** version updated to 1.10.6-16-g4764acd68" -msgstr "Версия **Tarantool 1.10** обновлена до 1.10.6-16-g4764acd68." +#~ msgid "" +#~ "Updated Cartridge CLI to v2.7.0. (`Changelog " +#~ "`__)" +#~ msgstr "" +#~ "Утилита Cartridge CLI обновлена до v2.7.0. (`Журнал изменений " +#~ "`__)" -msgid "**Tarantool 2.2** version updated to 2.2.2-56-g62efd9cf6" -msgstr "Версия **Tarantool 2.2** обновлена до 2.2.2-56-g62efd9cf6." +#~ msgid "r385" +#~ msgstr "r385" -msgid "**Tarantool 2.3** version (2.3.1-143-g8124538b8) added" -msgstr "Добавлена версия **Tarantool 2.3** (2.3.1-143-g8124538b8)." +#~ msgid "" +#~ "Added crud v0.5.0 rock. (`Changelog " +#~ "`__)" +#~ msgstr "" +#~ "Добавлен модуль ``crud`` v0.5.0. (`Журнал изменений " +#~ "`__)" -msgid "**Tarantool 2.4** version (2.4.2-8-ge56224b) added" -msgstr "Добавлена версия **Tarantool 2.4** (2.4.2-8-ge56224b)." +#~ msgid "r384" +#~ msgstr "r384" -msgid "Update ``cartridge-cli`` to v2.4.0" -msgstr "Утилита ``cartridge-cli`` обновлена до v2.4.0." +#~ msgid "Added cartridge v2.5.0 rock." +#~ msgstr "Добавлен модуль ``cartridge`` v2.5.0." -msgid "All ``cartridge-cli`` rocks are removed" -msgstr "Удалены все модули ``cartridge-cli``." +#~ msgid "Added frontend-core v7.5.0 rock (a cartridge dependency)." +#~ msgstr "Добавлен модуль ``frontend-core`` v7.5.0 (зависимость Cartridge)." -msgid "Update ``vshard-zookeeper`` rock" -msgstr "Обновлен модуль ``vshard-zookeeper``." +#~ msgid "Updated luarapidxml rock: added v2.0.2, removed v2.0.1." +#~ msgstr "Модуль luarapidxml обновлен с 2.0.1 до 2.0.2." + +#~ msgid "r383" +#~ msgstr "r383" -msgid "Added:" -msgstr "Добавлено:" +#~ msgid "Added luagraphqlparser v0.1.0 rock." +#~ msgstr "Добавлен модуль ``luagraphqlparser`` v0.1.0." + +#~ msgid "Added graphql v0.1.0 rock." +#~ msgstr "Добавлен модуль ``graphql`` v0.1.0." + +#~ msgid "r382" +#~ msgstr "r382" + +#~ msgid "" +#~ "Updated Cartridge CLI to v2.6.0. (`Changelog " +#~ "`__)" +#~ msgstr "" +#~ "Утилита Cartridge CLI обновлена до v2.6.0. (`Журнал изменений " +#~ "`__)" + +#~ msgid "r381" +#~ msgstr "r381" -msgid "Add ``kafka`` rock v1.2.0" -msgstr "Модуль ``kafka`` v1.2.0." +#~ msgid "Add ``space-explorer`` v1.1.2 rock with fixed styles." +#~ msgstr "Добавлен модуль ``space-explorer`` v1.1.2 с исправленными стилями." -msgid "Add ``task`` rock v0.8.3" -msgstr "Модуль ``task`` v0.8.3." +#~ msgid "r380" +#~ msgstr "r380" -msgid "Add ``kafka`` rock v1.1.0" -msgstr "Модуль ``kafka`` v1.1.0." +#~ msgid "Add ``metrics`` v0.7.0 rock." +#~ msgstr "Добавлен модуль ``metrics`` v0.7.0." -msgid "Add ``vshard`` rock v0.1.15" -msgstr "Модуль ``vshard`` v0.1.15." +#~ msgid "r376" +#~ msgstr "r376" -msgid "Add ``odbc`` rock v0.5.0, v0.6.4, v0.7.2, v0.7.3" -msgstr "Модуль ``odbc`` v0.5.0, v0.6.4, v0.7.2, v0.7.3." +#~ msgid "Add ``migrations`` v0.4.0 rock." +#~ msgstr "Добавлен модуль ``migrations`` v0.4.0." -msgid "Add ``cartridge`` rock v2.1.2" -msgstr "Модуль ``cartridge`` v2.1.2." +#~ msgid "r375" +#~ msgstr "r375" -msgid "Add ``cartridge`` rock v2.2.1" -msgstr "Модуль ``cartridge`` v2.2.1." +#~ msgid "Update base versions:" +#~ msgstr "Обновлены базовые версии:" -msgid "Add ``cartridge`` rock v2.3.0" -msgstr "Модуль ``cartridge`` v2.3.0." +#~ msgid "1.10.9-0-g720ffdd23" +#~ msgstr "1.10.9-0-g720ffdd23" -msgid "Add ``icu-date`` rock v1.3.3" -msgstr "Модуль ``icu-date`` v1.3.3." +#~ msgid "2.5.3-0-gf93e48013" +#~ msgstr "2.5.3-0-gf93e48013" -msgid "Add ``ddl`` rock v1.1.0" -msgstr "Модуль ``ddl`` v1.1.0." +#~ msgid "2.6.2-0-g34d504d7d" +#~ msgstr "2.6.2-0-g34d504d7d" -msgid "Add ``errors`` rock v2.1.3" -msgstr "Модуль ``errors`` v2.1.3." +#~ msgid "2.7.1-0-g3ac498c9f" +#~ msgstr "2.7.1-0-g3ac498c9f" -msgid "Add ``errors`` rock v2.1.4" -msgstr "Модуль ``errors`` v2.1.4." +#~ msgid "r372" +#~ msgstr "r372" -msgid "Add ``frontend-core`` rock v6.5.1" -msgstr "Модуль ``frontend-core`` v6.5.1." +#~ msgid "Add ``frontend-core`` v7.4.0 rock (a Cartridge dependency)." +#~ msgstr "Добавлен модуль ``frontend-core`` v7.4.0 (зависимость Cartridge)." -msgid "Add ``frontend-core`` rock v7.1.0" -msgstr "Модуль ``frontend-core`` v7.1.0." +#~ msgid "" +#~ "Add ``metrics`` v0.6.1 rock. (`Changelog " +#~ "`__)." +#~ msgstr "" +#~ "Добавлен модуль ``metrics`` v0.6.1. (`Журнал изменений " +#~ "`__)." -msgid "Add ``luatest`` rock v0.5.2" -msgstr "Модуль ``luatest`` v0.5.2." +#~ msgid "r371" +#~ msgstr "r371" -msgid "Add ``metrics`` rock v0.3.0" -msgstr "Модуль ``metrics`` v0.3.0." +#~ msgid "" +#~ "Add ``ddl`` v1.3.0 rock. (`Changelog " +#~ "`__)" +#~ msgstr "" +#~ "Добавлен модуль ``ddl`` v1.3.0. (`Журнал изменений " +#~ "`__)" -msgid "Add ``metrics`` rock v0.4.0" -msgstr "Модуль ``metrics`` v0.4.0." +#~ msgid "r370" +#~ msgstr "r370" -msgid "Add ``metrics`` rock v0.5.0" -msgstr "Модуль ``metrics`` v0.5.0." +#~ msgid "" +#~ "Add ``cartridge`` v2.4.0 rock. (`Changelog " +#~ "`__)" +#~ msgstr "" +#~ "Добавлен модуль ``cartridge`` v2.4.0. (`Журнал изменений " +#~ "`__)" -msgid "Add ``http`` rock v2.1.0" -msgstr "Модуль ``http`` v2.1.0." +#~ msgid "" +#~ "Add ``metrics`` v0.6.0 rock. (`Changelog " +#~ "`__)" +#~ msgstr "" +#~ "Добавлен модуль ``metrics`` v0.6.0. (`Журнал изменений " +#~ "`__)" -msgid "Add ``luacheck`` rock v0.26.0" -msgstr "Модуль ``luacheck`` v0.26.0." +#~ msgid "" +#~ "Update Cartridge CLI to v2.5.0. (`Changelog " +#~ "`__)" +#~ msgstr "" +#~ "Утилита Cartridge CLI обновлена до v2.5.0. (`Журнал изменений " +#~ "`__)" -msgid "Add ``luacov-reporters`` rock v0.1.0 -- collection of LuaCov reporters." -msgstr "Модуль ``luacov-reporters`` v0.1.0 -- генераторы отчетов LuaCov." +#~ msgid "" +#~ "Add ``cartridge-cli-extensions`` 1.1.0 rock. (`Changelog " +#~ "`__)" +#~ msgstr "" +#~ "Добавлен модуль ``cartridge-cli-extensions`` v1.1.0. (`Журнал изменений " +#~ "`__)" -msgid "Add ``migrations`` rock v0.3.0" -msgstr "Модуль ``migrations`` v0.3.0." +#~ msgid "" +#~ "Add ``crud`` 0.4.0 rock. (`Changelog " +#~ "`__)" +#~ msgstr "" +#~ "Добавлен модуль ``crud`` v0.4.0. (`Журнал изменений " +#~ "`__)" -msgid "Add ``checks`` rock v3.1.0" -msgstr "Модуль ``checks`` v3.1.0." +#~ msgid "r369" +#~ msgstr "r369" -msgid "Add ``crud`` rock v0.3.0" -msgstr "Модуль ``crud`` v0.3.0." +#~ msgid "Update ``luarapidxml`` rock: added v2.0.1, removed v2.0.0" +#~ msgstr "Модуль ``luarapidxml`` обновлен с версии 2.0.0 до 2.0.1." -msgid "Add ``cartridge-cli-extensions`` rock v1.0.0" -msgstr "Модуль ``cartridge-cli-extensions`` v1.0.0." +#~ msgid "r368" +#~ msgstr "r368" -msgid "Removed:" -msgstr "Удалено:" +#~ msgid "Update ``migrations`` rock: added v0.3.1" +#~ msgstr "Модуль ``migrations`` обновлен до версии 0.3.1." -msgid "Remove ``quickfix`` rock v1.0.0" -msgstr "Модуль ``quickfix`` v1.0.0." +#~ msgid "r366" +#~ msgstr "r366" -msgid "1.10.5-12 / 2.1.3-1 / 2.2.2-3" -msgstr "1.10.5-12 / 2.1.3-1 / 2.2.2-3" +#~ msgid "" +#~ "Update ``kafka`` rock: added v1.3.0, removed v1.2.0 and earlier, critical " +#~ "fix." +#~ msgstr "" +#~ "Модуль ``kafka`` обновлен до версии 1.3.0. Версии 1.2.0 и более ранние " +#~ "удалены, исправлена критическая ошибка." -msgid "Release date: 2020-02-07" -msgstr "Дата релиза: 2020-02-07" +#~ msgid "r363" +#~ msgstr "r363" -msgid "" -"Since this release, we also deliver Enterprise bundles based on Tarantool " -"Community version 2.2. It supports decimals, multikey indexes, functional " -"indexes, ``key_def`` module, partial core dumps, tuple format over " -"``netbox``, parallel applier, etc." -msgstr "" -"Начиная с этого релиза, мы выпускаем сборки Enterprise на основе Tarantool " -"Community 2.2. В этих сборках поддерживаются числовой тип decimal, " -"многозначные (multikey) индексы, функциональные индексы, модуль ``key_def``," -" частичные дампы памяти, передача формата кортежей по ``netbox``, " -"параллельный applier и т. д." +#~ msgid "Update ``oracle`` rock: added v1.3.2, removed v1.3.0, critical fix." +#~ msgstr "" +#~ "Модуль ``oracle`` обновлен с версии 1.3.0 до 1.3.2, исправлена критическая " +#~ "ошибка." -msgid "The underlying Tarantool Community version upgraded to:" -msgstr "Базовая версия Tarantool Community обновлена до:" +#~ msgid "r360" +#~ msgstr "r360" -msgid "1.10.5-15-gcfd9d54ae" -msgstr "1.10.5-15-gcfd9d54ae" +#~ msgid "1.10.8-0-g2f18757b7" +#~ msgstr "1.10.8-0-g2f18757b7" -msgid "2.1.3-16-g7dd5910" -msgstr "2.1.3-16-g7dd5910" +#~ msgid "2.4.3-0-g5180d98f1" +#~ msgstr "2.4.3-0-g5180d98f1" -msgid "2.2.2-29-g5c8a435df" -msgstr "2.2.2-29-g5c8a435df" +#~ msgid "2.5.2-0-g05730d326" +#~ msgstr "2.5.2-0-g05730d326" -msgid "" -"``cartridge-cli`` module v1.4.0 with local cluster start, colored logs, " -"packer for docker images and dev packages, updated templates, and many " -"smaller improvements." -msgstr "" -"Модуль ``cartridge-cli`` v1.4.0: локальный запуск кластера, цветные логи, " -"упаковка docker-образов и dev-пакетов, обновленные шаблоны и многое другое." +#~ msgid "2.6.1-0-gcfe0d1a55" +#~ msgstr "2.6.1-0-gcfe0d1a55" -msgid "``cartridge-cli`` module v1.3.2." -msgstr "Модуль ``cartridge-cli`` v1.3.2." +#~ msgid "1.10.6-16, 2.2.2-56, 2.3.1-143 and 2.4.2-8" +#~ msgstr "1.10.6-16, 2.2.2-56, 2.3.1-143 и 2.4.2-8" -msgid "" -"``cartridge`` module v2.0.1 with dramatic improvements in failover, cluster-" -"wide DDL and configuration editor, and many smaller improvements." -msgstr "" -"Модуль ``cartridge`` v2.0.1: значительные улучшения в работе восстановления " -"после сбоев, общекластерные DDL-схема и редактор конфигурации, а также много" -" мелких изменений." +#~ msgid "Changed:" +#~ msgstr "Изменения:" -msgid "" -"``task`` module v0.7.1 with sharded mode support and the ability to define " -"task arguments, default configuration, recurrence strategy and anonymous " -"tasks." -msgstr "" -"Модуль ``task`` v0.7.1: поддержка режима шардирования, возможность указывать" -" аргументы задач, конфигурацию по умолчанию, стратегию повторов и анонимные " -"задачи." +#~ msgid "**Tarantool 1.10** version updated to 1.10.6-16-g4764acd68" +#~ msgstr "Версия **Tarantool 1.10** обновлена до 1.10.6-16-g4764acd68." -msgid "" -"``luatest`` module v0.5.0 with automatic coverage builds, colored logs, and " -"many smaller improvements." -msgstr "" -"Модуль ``luatest`` v0.5.0: сборки с автоматическим покрытием тестами, " -"цветные логи и много мелких улучшений." +#~ msgid "**Tarantool 2.2** version updated to 2.2.2-56-g62efd9cf6" +#~ msgstr "Версия **Tarantool 2.2** обновлена до 2.2.2-56-g62efd9cf6." -msgid "``luatest`` module v0.4.0." -msgstr "Модуль ``luatest`` v0.4.0." +#~ msgid "**Tarantool 2.3** version (2.3.1-143-g8124538b8) added" +#~ msgstr "Добавлена версия **Tarantool 2.3** (2.3.1-143-g8124538b8)." -msgid "" -"``ddl`` module v1.0.0, a cluster-wide DDL schema used in ``cartridge`` " -"v2.0.0." -msgstr "" -"Модуль ``ddl`` v1.0.0: общекластерная DDL-схема, которая используется в " -"``cartridge`` v2.0.0." +#~ msgid "**Tarantool 2.4** version (2.4.2-8-ge56224b) added" +#~ msgstr "Добавлена версия **Tarantool 2.4** (2.4.2-8-ge56224b)." -msgid "``luacov`` module v0.13.0, a code coverage analyzer for Lua." -msgstr "Модуль ``luacov`` v0.13.0: анализатор покрытия кода для Lua." +#~ msgid "All ``cartridge-cli`` rocks are removed" +#~ msgstr "Удалены все модули ``cartridge-cli``." -msgid "``odbc`` module v0.4.1." -msgstr "Модуль ``odbc`` v0.4.1." +#~ msgid "Update ``vshard-zookeeper`` rock" +#~ msgstr "Обновлен модуль ``vshard-zookeeper``." -msgid "``avro-schema`` module v3.0.4." -msgstr "Модуль ``avro-schema`` v3.0.4." +#~ msgid "Added:" +#~ msgstr "Добавлено:" -msgid "``vshard`` module v0.1.14." -msgstr "Модуль ``vshard`` v0.1.14." +#~ msgid "Add ``kafka`` rock v1.2.0" +#~ msgstr "Модуль ``kafka`` v1.2.0." -msgid "``tracing`` module v0.1.1." -msgstr "Модуль ``tracing`` v0.1.1." +#~ msgid "Add ``task`` rock v0.8.3" +#~ msgstr "Модуль ``task`` v0.8.3." -msgid "``oracle`` module v1.3.0." -msgstr "Модуль ``oracle`` v1.3.0." +#~ msgid "Add ``kafka`` rock v1.1.0" +#~ msgstr "Модуль ``kafka`` v1.1.0." -msgid "``watchdog`` module v1.0.2." -msgstr "Модуль ``watchdog`` v1.0.2." +#~ msgid "Add ``vshard`` rock v0.1.15" +#~ msgstr "Модуль ``vshard`` v0.1.15." -msgid "``metrics`` module v0.1.7 and v0.1.8." -msgstr "Модуль ``metrics`` v0.1.7 и v0.1.8." +#~ msgid "Add ``odbc`` rock v0.5.0, v0.6.4, v0.7.2, v0.7.3" +#~ msgstr "Модуль ``odbc`` v0.5.0, v0.6.4, v0.7.2, v0.7.3." -msgid "``queue`` module v1.0.5." -msgstr "Модуль ``queue`` v1.0.5." +#~ msgid "Add ``cartridge`` rock v2.1.2" +#~ msgstr "Модуль ``cartridge`` v2.1.2." -msgid "``membership`` module v2.2.0." -msgstr "Модуль ``membership`` v2.2.0." +#~ msgid "Add ``cartridge`` rock v2.2.1" +#~ msgstr "Модуль ``cartridge`` v2.2.1." -msgid "1.10.4-1 / 2.1.2-109" -msgstr "1.10.4-1 / 2.1.2-109" +#~ msgid "Add ``cartridge`` rock v2.3.0" +#~ msgstr "Модуль ``cartridge`` v2.3.0." -msgid "Release date: 2019-10-23" -msgstr "Дата релиза: 2019-10-23" +#~ msgid "Add ``icu-date`` rock v1.3.3" +#~ msgstr "Модуль ``icu-date`` v1.3.3." -msgid "Major news:" -msgstr "Главные новости:" +#~ msgid "Add ``ddl`` rock v1.1.0" +#~ msgstr "Модуль ``ddl`` v1.1.0." -msgid "" -"The framework for developing cluster applications (:doc:`Tarantool Cartridge" -" `) has gone open source as two modules: " -":doc:`cartridge ` (successor of ``cluster`` " -"rock) and :doc:`cartridge-cli " -"` (successor of " -"``tarantoolapp`` utility)." -msgstr "" -"Фреймворк для разработки кластерных приложений (:doc:`Tarantool Cartridge " -"`) стал частью Tarantool с открытым кодом. " -"Теперь Cartridge представлен двумя модулями: :doc:`cartridge " -"` (вместо модуля ``cluster``) и " -":doc:`cartridge-cli ` (вместо " -"утилиты ``tarantoolapp``)." +#~ msgid "Add ``errors`` rock v2.1.3" +#~ msgstr "Модуль ``errors`` v2.1.3." -msgid "" -"We added another open source module named `luacheck " -"`_ -- a static analyzer and linter " -"for Lua, preconfigured for Tarantool." -msgstr "" -"Добавлен новый открытый модуль `luacheck " -"`__ -- статический анализатор кода " -"для Lua, предконфигурированный под Tarantool." +#~ msgid "Add ``errors`` rock v2.1.4" +#~ msgstr "Модуль ``errors`` v2.1.4." -msgid "" -"We added :doc:`documentation ` for all closed source modules." -msgstr "" -"Для всех модулей с закрытым кодом добавлена :doc:`документация `." +#~ msgid "Add ``frontend-core`` rock v6.5.1" +#~ msgstr "Модуль ``frontend-core`` v6.5.1." -msgid "Meet the redesigned administrative web interface!" -msgstr "Обновлен дизайн веб-интерфейса администратора." +#~ msgid "Add ``frontend-core`` rock v7.1.0" +#~ msgstr "Модуль ``frontend-core`` v7.1.0." -msgid "1.10.4-21-g9349237" -msgstr "1.10.4-21-g9349237" +#~ msgid "Add ``luatest`` rock v0.5.2" +#~ msgstr "Модуль ``luatest`` v0.5.2." -msgid "2.1.2-206-g2499a73" -msgstr "2.1.2-206-g2499a73" +#~ msgid "Add ``metrics`` rock v0.3.0" +#~ msgstr "Модуль ``metrics`` v0.3.0." -msgid "``vshard-zookeeper`` module updated." -msgstr "Обновлен модуль ``vshard-zookeeper``." +#~ msgid "Add ``metrics`` rock v0.4.0" +#~ msgstr "Модуль ``metrics`` v0.4.0." -msgid "``quickfix`` module v1.0.0." -msgstr "Модуль ``quickfix`` v1.0.0." +#~ msgid "Add ``metrics`` rock v0.5.0" +#~ msgstr "Модуль ``metrics`` v0.5.0." -msgid "``luarapidxml`` module v2.0.0." -msgstr "Модуль ``luarapidxml`` v2.0.0." +#~ msgid "Add ``http`` rock v2.1.0" +#~ msgstr "Модуль ``http`` v2.1.0." -msgid "``cartridge`` module v1.0.0, successor of ``cluster`` module." -msgstr "Модуль ``cartridge`` v1.0.0 (вместо модуля ``cluster``)." +#~ msgid "Add ``luacheck`` rock v0.26.0" +#~ msgstr "Модуль ``luacheck`` v0.26.0." -msgid "" -"``cartridge-cli`` module v1.0.0-1, successor of ``tarantoolapp`` utility." -msgstr "Модуль ``cartridge-cli`` v1.0.0-1 (вместо утилиты ``tarantoolapp``)." +#~ msgid "" +#~ "Add ``luacov-reporters`` rock v0.1.0 -- collection of LuaCov reporters." +#~ msgstr "Модуль ``luacov-reporters`` v0.1.0 -- генераторы отчетов LuaCov." -msgid "``task`` module v0.4.0." -msgstr "Модуль ``task`` v0.4.0." +#~ msgid "Add ``migrations`` rock v0.3.0" +#~ msgstr "Модуль ``migrations`` v0.3.0." -msgid "" -"``membership`` module v2.1.2 with improved stability on large clusters." -msgstr "" -"Модуль ``membership`` v2.1.2, улучшение стабильности на больших кластерах." +#~ msgid "Add ``checks`` rock v3.1.0" +#~ msgstr "Модуль ``checks`` v3.1.0." -msgid "``membership`` module v2.1.4." -msgstr "Модуль ``membership`` v2.1.4." +#~ msgid "Add ``crud`` rock v0.3.0" +#~ msgstr "Модуль ``crud`` v0.3.0." -msgid "``odbc`` module v0.3.0." -msgstr "Модуль ``odbc`` v0.3.0." +#~ msgid "Add ``cartridge-cli-extensions`` rock v1.0.0" +#~ msgstr "Модуль ``cartridge-cli-extensions`` v1.0.0." -msgid "``cluster`` module v0.10.0." -msgstr "Модуль ``cluster`` v0.10.0." +#~ msgid "Removed:" +#~ msgstr "Удалено:" -msgid "``task`` module v0.3.0." -msgstr "Модуль ``task`` v0.3.0." +#~ msgid "Remove ``quickfix`` rock v1.0.0" +#~ msgstr "Модуль ``quickfix`` v1.0.0." -msgid "``odbc`` module v0.4.0." -msgstr "Модуль ``odbc`` v0.4.0." +#~ msgid "1.10.5-12 / 2.1.3-1 / 2.2.2-3" +#~ msgstr "1.10.5-12 / 2.1.3-1 / 2.2.2-3" -msgid "``kafka`` module v1.0.2." -msgstr "Модуль ``kafka`` v1.0.2." +#~ msgid "Release date: 2020-02-07" +#~ msgstr "Дата релиза: 2020-02-07" -msgid "``frontend-core`` module v6.0.1." -msgstr "Модуль ``frontend-core`` v6.0.1." +#~ msgid "" +#~ "Since this release, we also deliver Enterprise bundles based on Tarantool " +#~ "Community version 2.2. It supports decimals, multikey indexes, functional " +#~ "indexes, ``key_def`` module, partial core dumps, tuple format over " +#~ "``netbox``, parallel applier, etc." +#~ msgstr "" +#~ "Начиная с этого релиза, мы выпускаем сборки Enterprise на основе Tarantool " +#~ "Community 2.2. В этих сборках поддерживаются числовой тип decimal, " +#~ "многозначные (multikey) индексы, функциональные индексы, модуль ``key_def``," +#~ " частичные дампы памяти, передача формата кортежей по ``netbox``, " +#~ "параллельный applier и т. д." -msgid "``space-explorer`` module v1.1.0." -msgstr "Модуль ``space-explorer`` v1.1.0." +#~ msgid "The underlying Tarantool Community version upgraded to:" +#~ msgstr "Базовая версия Tarantool Community обновлена до:" -msgid "``oracle`` module v1.2.2." -msgstr "Модуль ``oracle`` v1.2.2." +#~ msgid "1.10.5-15-gcfd9d54ae" +#~ msgstr "1.10.5-15-gcfd9d54ae" -msgid "``http`` module v1.1.0." -msgstr "Модуль ``http`` v1.1.0." +#~ msgid "2.1.3-16-g7dd5910" +#~ msgstr "2.1.3-16-g7dd5910" -msgid "``avro-schema`` module v3.0.3." -msgstr "Модуль ``avro-schema`` v3.0.3." +#~ msgid "2.2.2-29-g5c8a435df" +#~ msgstr "2.2.2-29-g5c8a435df" -msgid "``vshard`` module v0.1.12." -msgstr "Модуль ``vshard`` v0.1.12." +#~ msgid "" +#~ "``cartridge-cli`` module v1.4.0 with local cluster start, colored logs, " +#~ "packer for docker images and dev packages, updated templates, and many " +#~ "smaller improvements." +#~ msgstr "" +#~ "Модуль ``cartridge-cli`` v1.4.0: локальный запуск кластера, цветные логи, " +#~ "упаковка docker-образов и dev-пакетов, обновленные шаблоны и многое другое." -msgid "``icu-date`` module v1.3.1." -msgstr "Модуль ``icu-date`` v1.3.1." +#~ msgid "``cartridge-cli`` module v1.3.2." +#~ msgstr "Модуль ``cartridge-cli`` v1.3.2." -msgid "``luatest`` module v0.2.2." -msgstr "Модуль ``luatest`` v0.2.2." +#~ msgid "" +#~ "``cartridge`` module v2.0.1 with dramatic improvements in failover, cluster-" +#~ "wide DDL and configuration editor, and many smaller improvements." +#~ msgstr "" +#~ "Модуль ``cartridge`` v2.0.1: значительные улучшения в работе восстановления " +#~ "после сбоев, общекластерные DDL-схема и редактор конфигурации, а также много" +#~ " мелких изменений." + +#~ msgid "" +#~ "``task`` module v0.7.1 with sharded mode support and the ability to define " +#~ "task arguments, default configuration, recurrence strategy and anonymous " +#~ "tasks." +#~ msgstr "" +#~ "Модуль ``task`` v0.7.1: поддержка режима шардирования, возможность указывать" +#~ " аргументы задач, конфигурацию по умолчанию, стратегию повторов и анонимные " +#~ "задачи." + +#~ msgid "" +#~ "``luatest`` module v0.5.0 with automatic coverage builds, colored logs, and " +#~ "many smaller improvements." +#~ msgstr "" +#~ "Модуль ``luatest`` v0.5.0: сборки с автоматическим покрытием тестами, " +#~ "цветные логи и много мелких улучшений." + +#~ msgid "``luatest`` module v0.4.0." +#~ msgstr "Модуль ``luatest`` v0.4.0." + +#~ msgid "" +#~ "``ddl`` module v1.0.0, a cluster-wide DDL schema used in ``cartridge`` " +#~ "v2.0.0." +#~ msgstr "" +#~ "Модуль ``ddl`` v1.0.0: общекластерная DDL-схема, которая используется в " +#~ "``cartridge`` v2.0.0." + +#~ msgid "``luacov`` module v0.13.0, a code coverage analyzer for Lua." +#~ msgstr "Модуль ``luacov`` v0.13.0: анализатор покрытия кода для Lua." + +#~ msgid "``odbc`` module v0.4.1." +#~ msgstr "Модуль ``odbc`` v0.4.1." + +#~ msgid "``avro-schema`` module v3.0.4." +#~ msgstr "Модуль ``avro-schema`` v3.0.4." + +#~ msgid "``vshard`` module v0.1.14." +#~ msgstr "Модуль ``vshard`` v0.1.14." + +#~ msgid "``tracing`` module v0.1.1." +#~ msgstr "Модуль ``tracing`` v0.1.1." + +#~ msgid "``oracle`` module v1.3.0." +#~ msgstr "Модуль ``oracle`` v1.3.0." + +#~ msgid "``watchdog`` module v1.0.2." +#~ msgstr "Модуль ``watchdog`` v1.0.2." + +#~ msgid "``metrics`` module v0.1.7 and v0.1.8." +#~ msgstr "Модуль ``metrics`` v0.1.7 и v0.1.8." + +#~ msgid "``queue`` module v1.0.5." +#~ msgstr "Модуль ``queue`` v1.0.5." + +#~ msgid "``membership`` module v2.2.0." +#~ msgstr "Модуль ``membership`` v2.2.0." + +#~ msgid "1.10.4-1 / 2.1.2-109" +#~ msgstr "1.10.4-1 / 2.1.2-109" + +#~ msgid "Release date: 2019-10-23" +#~ msgstr "Дата релиза: 2019-10-23" -msgid "``metrics`` module v0.1.6." -msgstr "Модуль ``metrics`` v0.1.6." +#~ msgid "Major news:" +#~ msgstr "Главные новости:" -msgid "``queue`` module v1.0.4." -msgstr "Модуль ``queue`` v1.0.4." +#~ msgid "" +#~ "The framework for developing cluster applications (:doc:`Tarantool Cartridge" +#~ " `) has gone open source as two modules: " +#~ ":doc:`cartridge ` (successor of ``cluster`` rock) and" +#~ " :doc:`cartridge-cli ` (successor of " +#~ "``tarantoolapp`` utility)." +#~ msgstr "" +#~ "Фреймворк для разработки кластерных приложений (:doc:`Tarantool Cartridge " +#~ "`) стал частью Tarantool с открытым кодом. Теперь " +#~ "Cartridge представлен двумя модулями: :doc:`cartridge " +#~ "` (вместо модуля ``cluster``) и :doc:`cartridge-cli " +#~ "` (вместо утилиты ``tarantoolapp``)." -msgid "``tarantoolapp`` utility." -msgstr "Утилита ``tarantoolapp``." +#~ msgid "" +#~ "We added another open source module named `luacheck " +#~ "`_ -- a static analyzer and linter " +#~ "for Lua, preconfigured for Tarantool." +#~ msgstr "" +#~ "Добавлен новый открытый модуль `luacheck " +#~ "`__ -- статический анализатор кода " +#~ "для Lua, предконфигурированный под Tarantool." -msgid "1.10.3-71 / 2.1.2-63" -msgstr "1.10.3-71 / 2.1.2-63" +#~ msgid "" +#~ "We added :doc:`documentation ` for all closed source modules." +#~ msgstr "" +#~ "Для всех модулей с закрытым кодом добавлена :doc:`документация `." -msgid "Release date: 2019-07-12" -msgstr "Дата релиза: 2019-07-12" +#~ msgid "Meet the redesigned administrative web interface!" +#~ msgstr "Обновлен дизайн веб-интерфейса администратора." -msgid "1.10.3-89-g412e943" -msgstr "1.10.3-89-g412e943" +#~ msgid "1.10.4-21-g9349237" +#~ msgstr "1.10.4-21-g9349237" -msgid "2.1.2-127-gcb2f5e4" -msgstr "2.1.2-127-gcb2f5e4" +#~ msgid "2.1.2-206-g2499a73" +#~ msgstr "2.1.2-206-g2499a73" -msgid "" -"Unit / integration test templates for a Tarantool cluster; available via " -"``tarantoolctl rocks test``." -msgstr "" -"Шаблоны юнит-тестов и интеграционных тестов для кластера Tarantool, " -"доступные через ``tarantoolctl rocks test``." +#~ msgid "``vshard-zookeeper`` module updated." +#~ msgstr "Обновлен модуль ``vshard-zookeeper``." -msgid "" -"``.tarantoolapp.ignore`` files to exclude specific resources from build." -msgstr "" -"При сборке проекта теперь можно исключать ресурсы с помощью файлов " -"``.tarantoolapp.ignore``." +#~ msgid "``quickfix`` module v1.0.0." +#~ msgstr "Модуль ``quickfix`` v1.0.0." -msgid "``kafka`` module v1.0.1 (Apache Kafka connector for Tarantool)." -msgstr "Модуль ``kafka`` v1.0.1 (коннектор Apache Kafka для Tarantool)." +#~ msgid "``luarapidxml`` module v2.0.0." +#~ msgstr "Модуль ``luarapidxml`` v2.0.0." -msgid "" -"``tracing`` module v0.1.0 (for debugging performance issues in applications;" -" based on OpenTracing/Zipkin)." -msgstr "" -"Модуль ``tracing`` v0.1.0 для отладки производительности приложения. " -"Реализован на базе OpenTracing/Zipkin." +#~ msgid "``cartridge`` module v1.0.0, successor of ``cluster`` module." +#~ msgstr "Модуль ``cartridge`` v1.0.0 (вместо модуля ``cluster``)." -msgid "" -"``task`` module v0.2.0 (for managing background tasks in cluster " -"applications)." -msgstr "" -"Модуль ``task`` v0.2.0 для работы с фоновыми задачами в кластерных " -"приложениях." +#~ msgid "" +#~ "``cartridge-cli`` module v1.0.0-1, successor of ``tarantoolapp`` utility." +#~ msgstr "Модуль ``cartridge-cli`` v1.0.0-1 (вместо утилиты ``tarantoolapp``)." -msgid "``odbc`` module v0.1.0 (outgoing ODBC connector for Tarantool)." -msgstr "Модуль ``odbc`` v0.1.0 (исходящий ODBC-коннектор для Tarantool)." +#~ msgid "``task`` module v0.4.0." +#~ msgstr "Модуль ``task`` v0.4.0." -msgid "``luatest`` module v0.2.0 (testing framework for Tarantool)." -msgstr "Модуль ``luatest`` v0.2.0 (тестовый фреймворк для Tarantool)." +#~ msgid "" +#~ "``membership`` module v2.1.2 with improved stability on large clusters." +#~ msgstr "" +#~ "Модуль ``membership`` v2.1.2, улучшение стабильности на больших кластерах." -msgid "``checks`` module v3.0.1." -msgstr "Модуль ``checks`` v3.0.1." +#~ msgid "``membership`` module v2.1.4." +#~ msgstr "Модуль ``membership`` v2.1.4." -msgid "``errors`` module v2.1.1." -msgstr "Модуль ``errors`` v2.1.1." +#~ msgid "``odbc`` module v0.3.0." +#~ msgstr "Модуль ``odbc`` v0.3.0." -msgid "``frontend-core`` module v5.0.2." -msgstr "Модуль ``frontend-core`` v5.0.2." +#~ msgid "``cluster`` module v0.10.0." +#~ msgstr "Модуль ``cluster`` v0.10.0." -msgid "``metrics`` module v0.1.5." -msgstr "Модуль ``metrics`` v0.1.5." +#~ msgid "``task`` module v0.3.0." +#~ msgstr "Модуль ``task`` v0.3.0." -msgid "``oracle`` module v1.1.6." -msgstr "Модуль ``oracle`` v1.1.6." +#~ msgid "``odbc`` module v0.4.0." +#~ msgstr "Модуль ``odbc`` v0.4.0." -msgid "``cluster`` module v0.9.2 with new features:" -msgstr "Модуль ``cluster`` v0.9.2 с новыми функциональными возможностями:" +#~ msgid "``kafka`` module v1.0.2." +#~ msgstr "Модуль ``kafka`` v1.0.2." -msgid "" -"**Users**, a new tab in the web interface for managing cluster admin users." -msgstr "" -"**Users**, новая вкладка веб-интерфейса для управления пользователями-" -"администраторами кластера." +#~ msgid "``frontend-core`` module v6.0.1." +#~ msgstr "Модуль ``frontend-core`` v6.0.1." -msgid "" -"Multiple isolated groups for storage replica sets in a single cluster, e.g. " -"``hot`` or ``cold`` groups to process hot and cold data independently." -msgstr "" -"Для наборов реплик storage в одном кластере можно задавать группы (например," -" группы ``hot`` и ``cold`` для независимой обработки горячих и холодных " -"данных)." +#~ msgid "``space-explorer`` module v1.1.0." +#~ msgstr "Модуль ``space-explorer`` v1.1.0." -msgid "Integration tests helpers for ``luatest``." -msgstr "Вспомогательные утилиты для интеграционных тестов на ``luatest``." +#~ msgid "``oracle`` module v1.2.2." +#~ msgstr "Модуль ``oracle`` v1.2.2." -msgid "``cluster`` module v0.2.0, v0.3.0." -msgstr "Модуль ``cluster`` v0.2.0, v0.3.0." +#~ msgid "``http`` module v1.1.0." +#~ msgstr "Модуль ``http`` v1.1.0." -msgid "``oracle`` module v1.0.0, v1.1.0." -msgstr "Модуль ``oracle`` v1.0.0, v1.1.0." +#~ msgid "``avro-schema`` module v3.0.3." +#~ msgstr "Модуль ``avro-schema`` v3.0.3." -msgid "``vshard`` module v0.1.5, v0.1.6." -msgstr "Модуль ``vshard`` v0.1.5, v0.1.6." +#~ msgid "``vshard`` module v0.1.12." +#~ msgstr "Модуль ``vshard`` v0.1.12." -msgid "1.10.3-29 / 2.1.2-21" -msgstr "1.10.3-29 / 2.1.2-21" +#~ msgid "``icu-date`` module v1.3.1." +#~ msgstr "Модуль ``icu-date`` v1.3.1." -msgid "Release date: 2019-05-28" -msgstr "Дата релиза: 2019-05-28" +#~ msgid "``luatest`` module v0.2.2." +#~ msgstr "Модуль ``luatest`` v0.2.2." -msgid "" -"Since this release, we also deliver Enterprise bundles based on Tarantool " -"Community version 2.1." -msgstr "" -"Начиная с этого релиза, мы выпускаем сборки Enterprise на основе Tarantool " -"Community 2.1." +#~ msgid "``metrics`` module v0.1.6." +#~ msgstr "Модуль ``metrics`` v0.1.6." -msgid "2.1.2-85-g6b01fa0" -msgstr "2.1.2-85-g6b01fa0" +#~ msgid "``queue`` module v1.0.4." +#~ msgstr "Модуль ``queue`` v1.0.4." -msgid "1.10.3-57-gd2efb0d" -msgstr "1.10.3-57-gd2efb0d" +#~ msgid "``tarantoolapp`` utility." +#~ msgstr "Утилита ``tarantoolapp``." -msgid "``tarantoolapp pack`` now puts VERSION file inside of packed project." -msgstr "" -"Команда ``tarantoolapp pack`` теперь добавляет в упакованный проект файл " -"VERSION." +#~ msgid "1.10.3-71 / 2.1.2-63" +#~ msgstr "1.10.3-71 / 2.1.2-63" -msgid "Ability to set up logging level per route." -msgstr "" -"Возможность задавать уровень детализации записей журнала для каждого " -"маршрута." +#~ msgid "Release date: 2019-07-12" +#~ msgstr "Дата релиза: 2019-07-12" -msgid "" -"``http`` module v0.1.6 with a new feature: setting up logging level per " -"route." -msgstr "" -"Модуль ``http`` v0.1.6 с новой возможностью определять уровень детализации " -"записей журнала для каждого маршрута." +#~ msgid "1.10.3-89-g412e943" +#~ msgstr "1.10.3-89-g412e943" -msgid "``space-explorer`` module v1.0.2." -msgstr "Модуль ``space-explorer`` v1.0.2." +#~ msgid "2.1.2-127-gcb2f5e4" +#~ msgstr "2.1.2-127-gcb2f5e4" -msgid "``cron-parser`` module v1.0.0." -msgstr "Модуль ``cron-parser`` v1.0.0." +#~ msgid "" +#~ "Unit / integration test templates for a Tarantool cluster; available via " +#~ "``tarantoolctl rocks test``." +#~ msgstr "" +#~ "Шаблоны юнит-тестов и интеграционных тестов для кластера Tarantool, " +#~ "доступные через ``tarantoolctl rocks test``." -msgid "``argon2`` module v3.0.1 with PCI DSS grade hashing algorithms." -msgstr "Модуль ``argon2`` v3.0.1 с алгоритмами хеширования класса PCI DSS." +#~ msgid "" +#~ "``.tarantoolapp.ignore`` files to exclude specific resources from build." +#~ msgstr "" +#~ "При сборке проекта теперь можно исключать ресурсы с помощью файлов " +#~ "``.tarantoolapp.ignore``." -msgid "``metrics`` module v0.1.3." -msgstr "Модуль ``metrics`` v0.1.3." +#~ msgid "``kafka`` module v1.0.1 (Apache Kafka connector for Tarantool)." +#~ msgstr "Модуль ``kafka`` v1.0.1 (коннектор Apache Kafka для Tarantool)." -msgid "``vshard`` module v0.1.9" -msgstr "Модуль ``vshard`` v0.1.9." +#~ msgid "" +#~ "``tracing`` module v0.1.0 (for debugging performance issues in applications;" +#~ " based on OpenTracing/Zipkin)." +#~ msgstr "" +#~ "Модуль ``tracing`` v0.1.0 для отладки производительности приложения. " +#~ "Реализован на базе OpenTracing/Zipkin." -msgid "``oracle`` module v1.1.5." -msgstr "Модуль ``oracle`` v1.1.5." +#~ msgid "" +#~ "``task`` module v0.2.0 (for managing background tasks in cluster " +#~ "applications)." +#~ msgstr "" +#~ "Модуль ``task`` v0.2.0 для работы с фоновыми задачами в кластерных " +#~ "приложениях." -msgid "``frontend-core`` module v5.0.0, v5.0.1" -msgstr "Модуль ``frontend-core`` v5.0.0, v5.0.1." +#~ msgid "``odbc`` module v0.1.0 (outgoing ODBC connector for Tarantool)." +#~ msgstr "Модуль ``odbc`` v0.1.0 (исходящий ODBC-коннектор для Tarantool)." -msgid "``cluster`` module v0.8.0 with some bug fixes and new features:" -msgstr "" -"Модуль ``cluster`` v0.8.0 с исправленными ошибками и новыми возможностями:" +#~ msgid "``luatest`` module v0.2.0 (testing framework for Tarantool)." +#~ msgstr "Модуль ``luatest`` v0.2.0 (тестовый фреймворк для Tarantool)." -msgid "role dependencies;" -msgstr "зависимостями для ролей;" +#~ msgid "``checks`` module v3.0.1." +#~ msgstr "Модуль ``checks`` v3.0.1." -msgid "cluster cookies;" -msgstr "кластерными cookies;" +#~ msgid "``errors`` module v2.1.1." +#~ msgstr "Модуль ``errors`` v2.1.1." -msgid "labels for servers." -msgstr "метками для серверов." +#~ msgid "``frontend-core`` module v5.0.2." +#~ msgstr "Модуль ``frontend-core`` v5.0.2." -msgid "1.10.3-5" -msgstr "1.10.3-5" +#~ msgid "``metrics`` module v0.1.5." +#~ msgstr "Модуль ``metrics`` v0.1.5." -msgid "Release date: 2019-04-05" -msgstr "Дата релиза: 2019-04-05" +#~ msgid "``oracle`` module v1.1.6." +#~ msgstr "Модуль ``oracle`` v1.1.6." -msgid "" -"The underlying Tarantool Community version upgraded to 1.10.3-6-gfbf53b9." -msgstr "Базовая версия Tarantool Community обновлена до 1.10.3-6-gfbf53b9." +#~ msgid "``cluster`` module v0.9.2 with new features:" +#~ msgstr "Модуль ``cluster`` v0.9.2 с новыми функциональными возможностями:" -msgid "The following features added:" -msgstr "Добавлены следующие функциональные возможности:" +#~ msgid "" +#~ "**Users**, a new tab in the web interface for managing cluster admin users." +#~ msgstr "" +#~ "**Users**, новая вкладка веб-интерфейса для управления пользователями-" +#~ "администраторами кластера." -msgid "Failover priority configuration via the web interface." -msgstr "Настройка приоритета восстановления после сбоев через веб-интерфейс." +#~ msgid "" +#~ "Multiple isolated groups for storage replica sets in a single cluster, e.g. " +#~ "``hot`` or ``cold`` groups to process hot and cold data independently." +#~ msgstr "" +#~ "Для наборов реплик storage в одном кластере можно задавать группы (например," +#~ " группы ``hot`` и ``cold`` для независимой обработки горячих и холодных " +#~ "данных)." -msgid "RPC module (remote calls between cluster instances)." -msgstr "Модуль RPC (удаленные вызовы между экземплярами кластера)." +#~ msgid "Integration tests helpers for ``luatest``." +#~ msgstr "Вспомогательные утилиты для интеграционных тестов на ``luatest``." -msgid "Space explorer via the web interface." -msgstr "Space-explorer в веб-интерфейсе." +#~ msgid "``cluster`` module v0.2.0, v0.3.0." +#~ msgstr "Модуль ``cluster`` v0.2.0, v0.3.0." -msgid "OpenLDAP client for Tarantool." -msgstr "Клиент OpenLDAP для Tarantool." +#~ msgid "``oracle`` module v1.0.0, v1.1.0." +#~ msgstr "Модуль ``oracle`` v1.0.0, v1.1.0." -msgid "" -"Instance restart now triggers configuration validation before the roles " -"initialization." -msgstr "" -"При перезапуске экземпляра конфигурация теперь проверяется до инициализации " -"ролей." +#~ msgid "``vshard`` module v0.1.5, v0.1.6." +#~ msgstr "Модуль ``vshard`` v0.1.5, v0.1.6." -msgid "The web interface design has been updated." -msgstr "Обновлен дизайн веб-интерфейса." +#~ msgid "1.10.3-29 / 2.1.2-21" +#~ msgstr "1.10.3-29 / 2.1.2-21" -msgid "1.10.2-41" -msgstr "1.10.2-41" +#~ msgid "Release date: 2019-05-28" +#~ msgstr "Дата релиза: 2019-05-28" -msgid "Release date: 2019-02-08" -msgstr "Дата релиза: 2019-02-08" +#~ msgid "" +#~ "Since this release, we also deliver Enterprise bundles based on Tarantool " +#~ "Community version 2.1." +#~ msgstr "" +#~ "Начиная с этого релиза, мы выпускаем сборки Enterprise на основе Tarantool " +#~ "Community 2.1." -msgid "" -"The underlying Tarantool Community version has been upgraded to " -"1.10.2-131-g6f96bfe." -msgstr "Базовая версия Tarantool Community обновлена до 1.10.2-131-g6f96bfe." +#~ msgid "2.1.2-85-g6b01fa0" +#~ msgstr "2.1.2-85-g6b01fa0" -msgid "" -"The cluster template has been updated to allow the application to operate " -"across several hosts (virtual machines)." -msgstr "" -"Обновлен шаблон кластера, чтобы приложение могло работать на нескольких " -"хостах (виртуальных машинах)." +#~ msgid "1.10.3-57-gd2efb0d" +#~ msgstr "1.10.3-57-gd2efb0d" -msgid "" -"The following closed-source modules of latest versions have been added: " -"``queue``, ``front``, ``errors``, ``membership``, ``cluster``, and " -"``oracle``. These rocks include:" -msgstr "" -"Добавлены последние версии следующих модулей с закрытым исходным кодом: " -"``queue``, ``front``, ``errors``, ``membership``, ``cluster`` и ``oracle``. " -"Эти модули rocks включают в себя:" +#~ msgid "``tarantoolapp pack`` now puts VERSION file inside of packed project." +#~ msgstr "" +#~ "Команда ``tarantoolapp pack`` теперь добавляет в упакованный проект файл " +#~ "VERSION." -msgid "a new front-end core with cosmetic changes;" -msgstr "новое ядро фронтенда с косметическими изменениями;" +#~ msgid "Ability to set up logging level per route." +#~ msgstr "" +#~ "Возможность задавать уровень детализации записей журнала для каждого " +#~ "маршрута." -msgid "active master indication during failover;" -msgstr "индикатор активного мастера во время восстановления после сбоев;" +#~ msgid "" +#~ "``http`` module v0.1.6 with a new feature: setting up logging level per " +#~ "route." +#~ msgstr "" +#~ "Модуль ``http`` v0.1.6 с новой возможностью определять уровень детализации " +#~ "записей журнала для каждого маршрута." -msgid "" -"the ability to disable the ``vshard-storage`` role after the end of the " -"rebalancing process;" -msgstr "" -"возможность отключить роль ``vshard-storage`` по окончании процесса " -"балансировки;" +#~ msgid "``space-explorer`` module v1.0.2." +#~ msgstr "Модуль ``space-explorer`` v1.0.2." -msgid "dependencies updates and minor improvements." -msgstr "обновление зависимостей и незначительные улучшения." +#~ msgid "``cron-parser`` module v1.0.0." +#~ msgstr "Модуль ``cron-parser`` v1.0.0." -msgid "1.10.2-15" -msgstr "1.10.2-15" +#~ msgid "``argon2`` module v3.0.1 with PCI DSS grade hashing algorithms." +#~ msgstr "Модуль ``argon2`` v3.0.1 с алгоритмами хеширования класса PCI DSS." -msgid "Release date: 2018-12-13" -msgstr "Дата релиза: 2018-12-13" +#~ msgid "``metrics`` module v0.1.3." +#~ msgstr "Модуль ``metrics`` v0.1.3." -msgid "" -"The underlying Tarantool Community version has been upgraded to " -"1.10.2-84-g19d471bd4." -msgstr "Базовая версия Tarantool Community обновлена до 1.10.2-84-g19d471bd4." +#~ msgid "``vshard`` module v0.1.9" +#~ msgstr "Модуль ``vshard`` v0.1.9." -msgid "The ``checks`` module has been updated in the bundle." -msgstr "Обновлена сборка модуля ``checks``." +#~ msgid "``oracle`` module v1.1.5." +#~ msgstr "Модуль ``oracle`` v1.1.5." -msgid "" -"The custom (user-defined) cluster roles API has been added to the " -"``cluster`` module." -msgstr "" -"В модуль ``cluster`` добавлены пользовательские API для кластерных ролей." +#~ msgid "``frontend-core`` module v5.0.0, v5.0.1" +#~ msgstr "Модуль ``frontend-core`` v5.0.0, v5.0.1." -msgid "The ``vshard`` replica set's weight parameter is now supported." -msgstr "Добавлена поддержка параметра веса для наборов реплик в ``vshard``." +#~ msgid "``cluster`` module v0.8.0 with some bug fixes and new features:" +#~ msgstr "" +#~ "Модуль ``cluster`` v0.8.0 с исправленными ошибками и новыми возможностями:" -msgid "1.10.2-4" -msgstr "1.10.2-4" +#~ msgid "role dependencies;" +#~ msgstr "зависимостями для ролей;" -msgid "Release date: 2018-10-31" -msgstr "Дата релиза: 2018-10-31" +#~ msgid "cluster cookies;" +#~ msgstr "кластерными cookies;" -msgid "" -"Sample applications demonstrating how to run Tarantool in Docker and a " -"write-through cache to PostgreSQL have been added." -msgstr "" -"Добавлены примеры приложений, демонстрирующих запуск Tarantool в Docker и " -"использование кэша со сквозной записью для PostgreSQL." +#~ msgid "labels for servers." +#~ msgstr "метками для серверов." -msgid "" -"The abilities to manually switch the replica set's master and enable " -"automatic failover have been added to Web interface." -msgstr "" -"В веб-интерфейсе добавлена возможность переключать мастер в наборе реплик " -"вручную, а также включить автоматическое восстановление после сбоев." +#~ msgid "1.10.3-5" +#~ msgstr "1.10.3-5" -msgid "" -"The ``tarantoolapp`` utility that helps set up a development environment and" -" pack the application in an environment-independent way has been added." -msgstr "" -"Добавлена утилита ``tarantoolapp``, которая помогает настроить среду " -"разработки и упаковать приложение независимо от среды разработки." +#~ msgid "Release date: 2019-04-05" +#~ msgstr "Дата релиза: 2019-04-05" -msgid "1.10.1-29" -msgstr "1.10.1-29" +#~ msgid "" +#~ "The underlying Tarantool Community version upgraded to 1.10.3-6-gfbf53b9." +#~ msgstr "Базовая версия Tarantool Community обновлена до 1.10.3-6-gfbf53b9." -msgid "Release date: 2018-10-04" -msgstr "Дата релиза: 2018-10-04" +#~ msgid "The following features added:" +#~ msgstr "Добавлены следующие функциональные возможности:" -msgid "" -"The sample application is now cluster-based and the cluster is orchestrated " -"via a Web interface." -msgstr "" -"Приложение-пример теперь кластерное, а оркестрация кластера выполняется " -"через веб-интерфейс." +#~ msgid "Failover priority configuration via the web interface." +#~ msgstr "Настройка приоритета восстановления после сбоев через веб-интерфейс." -msgid "" -"Tarantool Enterprise release comes in an archive that includes an offline " -"rocks repository from which you can install all necessary modules." -msgstr "" -"Релиз Tarantool Enterprise представляет собой архив. Он включает в себя " -"автономный репозиторий, из которого можно установить все необходимые модули." +#~ msgid "RPC module (remote calls between cluster instances)." +#~ msgstr "Модуль RPC (удаленные вызовы между экземплярами кластера)." -msgid "" -"Oracle connector is now included in the rocks repository. With this package," -" Lua applications can access Oracle databases." -msgstr "" -"В репозиторий с модулями добавлен коннектор для Oracle. Теперь Lua-" -"приложения могут получать доступ к базам данных Oracle." +#~ msgid "Space explorer via the web interface." +#~ msgstr "Space-explorer в веб-интерфейсе." -msgid "1.10.1" -msgstr "1.10.1" +#~ msgid "OpenLDAP client for Tarantool." +#~ msgstr "Клиент OpenLDAP для Tarantool." -msgid "Release date: 2018-04-09" -msgstr "Дата релиза: 2018-04-09" +#~ msgid "" +#~ "Instance restart now triggers configuration validation before the roles " +#~ "initialization." +#~ msgstr "" +#~ "При перезапуске экземпляра конфигурация теперь проверяется до инициализации " +#~ "ролей." -msgid "" -"The Tarantool build is now static: all dependencies are linked into a static" -" binary. This simplifies deploy of Tarantool in the Linux environment." -msgstr "" -"Теперь у Tarantool статическая сборка: все зависимости скомпонованы в " -"статический бинарный файл. Это упрощает развертывание Tarantool в среде " -"Linux." +#~ msgid "The web interface design has been updated." +#~ msgstr "Обновлен дизайн веб-интерфейса." -msgid "" -"The underlying Tarantool Community version has been upgraded to 1.10.1. For " -"all new features and bugfixes of the Community version please refer to " -"https://github.com/tarantool/tarantool/releases." -msgstr "" -"Базовая версия Tarantool Community обновлена до 1.10.1. Описание новых " -"возможностей и исправленных ошибок в версии Community доступно по ссылке " -"https://github.com/tarantool/tarantool/releases." +#~ msgid "1.10.2-41" +#~ msgstr "1.10.2-41" + +#~ msgid "Release date: 2019-02-08" +#~ msgstr "Дата релиза: 2019-02-08" -msgid "" -"The modules required for integration with ZooKeeper and orchestrator are now" -" deprecated and no longer supported." -msgstr "" -"Модули, необходимые для интеграции с ZooKeeper и orchestrator, объявлены " -"устаревшими и больше не поддерживаются." +#~ msgid "" +#~ "The underlying Tarantool Community version has been upgraded to " +#~ "1.10.2-131-g6f96bfe." +#~ msgstr "Базовая версия Tarantool Community обновлена до 1.10.2-131-g6f96bfe." + +#~ msgid "" +#~ "The cluster template has been updated to allow the application to operate " +#~ "across several hosts (virtual machines)." +#~ msgstr "" +#~ "Обновлен шаблон кластера, чтобы приложение могло работать на нескольких " +#~ "хостах (виртуальных машинах)." + +#~ msgid "" +#~ "The following closed-source modules of latest versions have been added: " +#~ "``queue``, ``front``, ``errors``, ``membership``, ``cluster``, and " +#~ "``oracle``. These rocks include:" +#~ msgstr "" +#~ "Добавлены последние версии следующих модулей с закрытым исходным кодом: " +#~ "``queue``, ``front``, ``errors``, ``membership``, ``cluster`` и ``oracle``. " +#~ "Эти модули rocks включают в себя:" + +#~ msgid "a new front-end core with cosmetic changes;" +#~ msgstr "новое ядро фронтенда с косметическими изменениями;" + +#~ msgid "active master indication during failover;" +#~ msgstr "индикатор активного мастера во время восстановления после сбоев;" + +#~ msgid "" +#~ "the ability to disable the ``vshard-storage`` role after the end of the " +#~ "rebalancing process;" +#~ msgstr "" +#~ "возможность отключить роль ``vshard-storage`` по окончании процесса " +#~ "балансировки;" + +#~ msgid "dependencies updates and minor improvements." +#~ msgstr "обновление зависимостей и незначительные улучшения." + +#~ msgid "1.10.2-15" +#~ msgstr "1.10.2-15" + +#~ msgid "Release date: 2018-12-13" +#~ msgstr "Дата релиза: 2018-12-13" + +#~ msgid "" +#~ "The underlying Tarantool Community version has been upgraded to " +#~ "1.10.2-84-g19d471bd4." +#~ msgstr "Базовая версия Tarantool Community обновлена до 1.10.2-84-g19d471bd4." + +#~ msgid "The ``checks`` module has been updated in the bundle." +#~ msgstr "Обновлена сборка модуля ``checks``." + +#~ msgid "" +#~ "The custom (user-defined) cluster roles API has been added to the " +#~ "``cluster`` module." +#~ msgstr "" +#~ "В модуль ``cluster`` добавлены пользовательские API для кластерных ролей." + +#~ msgid "The ``vshard`` replica set's weight parameter is now supported." +#~ msgstr "Добавлена поддержка параметра веса для наборов реплик в ``vshard``." + +#~ msgid "1.10.2-4" +#~ msgstr "1.10.2-4" + +#~ msgid "Release date: 2018-10-31" +#~ msgstr "Дата релиза: 2018-10-31" + +#~ msgid "" +#~ "Sample applications demonstrating how to run Tarantool in Docker and a " +#~ "write-through cache to PostgreSQL have been added." +#~ msgstr "" +#~ "Добавлены примеры приложений, демонстрирующих запуск Tarantool в Docker и " +#~ "использование кэша со сквозной записью для PostgreSQL." + +#~ msgid "" +#~ "The abilities to manually switch the replica set's master and enable " +#~ "automatic failover have been added to Web interface." +#~ msgstr "" +#~ "В веб-интерфейсе добавлена возможность переключать мастер в наборе реплик " +#~ "вручную, а также включить автоматическое восстановление после сбоев." + +#~ msgid "" +#~ "The ``tarantoolapp`` utility that helps set up a development environment and" +#~ " pack the application in an environment-independent way has been added." +#~ msgstr "" +#~ "Добавлена утилита ``tarantoolapp``, которая помогает настроить среду " +#~ "разработки и упаковать приложение независимо от среды разработки." + +#~ msgid "1.10.1-29" +#~ msgstr "1.10.1-29" + +#~ msgid "Release date: 2018-10-04" +#~ msgstr "Дата релиза: 2018-10-04" + +#~ msgid "" +#~ "The sample application is now cluster-based and the cluster is orchestrated " +#~ "via a Web interface." +#~ msgstr "" +#~ "Приложение-пример теперь кластерное, а оркестрация кластера выполняется " +#~ "через веб-интерфейс." + +#~ msgid "" +#~ "Tarantool Enterprise release comes in an archive that includes an offline " +#~ "rocks repository from which you can install all necessary modules." +#~ msgstr "" +#~ "Релиз Tarantool Enterprise представляет собой архив. Он включает в себя " +#~ "автономный репозиторий, из которого можно установить все необходимые модули." + +#~ msgid "" +#~ "Oracle connector is now included in the rocks repository. With this package," +#~ " Lua applications can access Oracle databases." +#~ msgstr "" +#~ "В репозиторий с модулями добавлен коннектор для Oracle. Теперь Lua-" +#~ "приложения могут получать доступ к базам данных Oracle." + +#~ msgid "1.10.1" +#~ msgstr "1.10.1" + +#~ msgid "Release date: 2018-04-09" +#~ msgstr "Дата релиза: 2018-04-09" + +#~ msgid "" +#~ "The Tarantool build is now static: all dependencies are linked into a static" +#~ " binary. This simplifies deploy of Tarantool in the Linux environment." +#~ msgstr "" +#~ "Теперь у Tarantool статическая сборка: все зависимости скомпонованы в " +#~ "статический бинарный файл. Это упрощает развертывание Tarantool в среде " +#~ "Linux." + +#~ msgid "" +#~ "The underlying Tarantool Community version has been upgraded to 1.10.1. For " +#~ "all new features and bugfixes of the Community version please refer to " +#~ "https://github.com/tarantool/tarantool/releases." +#~ msgstr "" +#~ "Базовая версия Tarantool Community обновлена до 1.10.1. Описание новых " +#~ "возможностей и исправленных ошибок в версии Community доступно по ссылке " +#~ "https://github.com/tarantool/tarantool/releases." + +#~ msgid "" +#~ "The modules required for integration with ZooKeeper and orchestrator are now" +#~ " deprecated and no longer supported." +#~ msgstr "" +#~ "Модули, необходимые для интеграции с ZooKeeper и orchestrator, объявлены " +#~ "устаревшими и больше не поддерживаются." diff --git a/locale/ru/LC_MESSAGES/enterprise/deprecated.po b/locale/ru/LC_MESSAGES/enterprise/deprecated.po index 05efef6b2f..043710a6de 100755 --- a/locale/ru/LC_MESSAGES/enterprise/deprecated.po +++ b/locale/ru/LC_MESSAGES/enterprise/deprecated.po @@ -44,6 +44,13 @@ msgstr "" "В следующем примере показано, как зарегистрировать новую зону доступности " "(DC):" +msgid "" +"$ curl -X POST http://HOST:PORT/api/v1/zone \\\n" +" -d '{\n" +" \"name\": \"Caucasian Boulevard\"\n" +" }'" +msgstr "" + msgid "" "To check whether the DC registration was successful, try the following " "instruction. It retrieves the list of all registered nodes in the JSON " @@ -53,6 +60,9 @@ msgstr "" "следующую команду. Результатом будет список всех зарегистрированных узлов в " "формате JSON:" +msgid "$ curl http://HOST:PORT/api/v1/zone| python -m json.tool" +msgstr "" + msgid "" "To apply the new configuration directly on the Tarantool nodes, increase the" " configuration version number after calling the API function. To do this, " @@ -62,32 +72,33 @@ msgstr "" "увеличьте номер версии конфигурации после вызова API-функции. Для этого " "используйте запрос POST к ``/api/v1/version``:" +msgid "$ curl -X POST http://HOST:PORT/api/v1/version" +msgstr "" + msgid "Altogether, to update the cluster configuration:" msgstr "В целом, чтобы обновить конфигурацию кластера:" -msgid "Call the ``POST/PUT`` method of the ``orchestrator``." -msgstr "Вызовите метод ``POST/PUT`` в ``orchestrator``." - +#, fuzzy msgid "" -"As a result, the ZooKeeper nodes are updated, and a subsequent update of the" -" Tarantool nodes is initiated." +"Call the ``POST/PUT`` method of the ``orchestrator``. As a result, the " +"ZooKeeper nodes are updated, and a subsequent update of the Tarantool nodes " +"is initiated." msgstr "" "В результате будут обновлены узлы в ZooKeeper, а также будет инициировано " "последующее обновление узлов Tarantool." +#, fuzzy msgid "" "Update the configuration version using the ``POST`` request to " -"``/api/v1/version``." +"``/api/v1/version``. As a result, the configuration is applied to the " +"Tarantool nodes." msgstr "" "Обновите версию конфигурации, используя запрос ``POST`` к " "``/api/v1/version``." -msgid "As a result, the configuration is applied to the Tarantool nodes." -msgstr "В результате конфигурация применится к узлам Tarantool." - msgid "" -"See the :ref:`Orchestrator API reference ` for the detailed orchestrator " -"API." +"See the :ref:`Orchestrator API reference ` for " +"the detailed orchestrator API." msgstr "" "Для получения дополнительной информации об API оркестратора см. " ":ref:`Справочник по Orchestrator API `." @@ -144,3 +155,9 @@ msgstr "" " и начинает использовать эту реплику для чтения. Если эта реплика " "недоступна, то выбирается следующая ближайшая реплика с учетом расстояний, " "указанных в конфигурации." + +#~ msgid "Call the ``POST/PUT`` method of the ``orchestrator``." +#~ msgstr "Вызовите метод ``POST/PUT`` в ``orchestrator``." + +#~ msgid "As a result, the configuration is applied to the Tarantool nodes." +#~ msgstr "В результате конфигурация применится к узлам Tarantool." diff --git a/locale/ru/LC_MESSAGES/enterprise/deprecated/orchestrator_api.po b/locale/ru/LC_MESSAGES/enterprise/deprecated/orchestrator_api.po index e1071a4e97..fca745ef20 100755 --- a/locale/ru/LC_MESSAGES/enterprise/deprecated/orchestrator_api.po +++ b/locale/ru/LC_MESSAGES/enterprise/deprecated/orchestrator_api.po @@ -23,9 +23,29 @@ msgstr "Создание новой зоны." msgid "**Request**" msgstr "**Запрос**" +msgid "" +"{\n" +"\"name\": \"zone 1\"\n" +"}" +msgstr "" + msgid "**Response**" msgstr "**Ответ**" +msgid "" +"{\n" +"\"error\": {\n" +" \"code\": 0,\n" +" \"message\": \"ok\"\n" +"},\n" +"\"data\": {\n" +" \"id\": 2,\n" +" \"name\": \"zone 2\"\n" +"},\n" +"\"status\": true\n" +"}" +msgstr "" + msgid "**Potential errors**" msgstr "**Возможные ошибки**" @@ -35,6 +55,26 @@ msgstr "``zone_exists`` -- указанная зона уже существуе msgid "Return information on the specified zone or on all the zones." msgstr "Возврат информации об указанной зоне или обо всех зонах." +msgid "" +"{\n" +" \"error\": {\n" +" \"code\": 0,\n" +" \"message\": \"ok\"\n" +" },\n" +" \"data\": [\n" +" {\n" +" \"id\": 1,\n" +" \"name\": \"zone 11\"\n" +" },\n" +" {\n" +" \"id\": 2,\n" +" \"name\": \"zone 2\"\n" +" }\n" +" ],\n" +" \"status\": true\n" +"}" +msgstr "" + msgid "``zone_not_found`` - the specified zone is not found" msgstr "``zone_not_found`` -- указанная зона не обнаружена" @@ -44,6 +84,23 @@ msgstr "Обновление информации о зоне." msgid "**Body**" msgstr "**Тело**" +msgid "" +"{\n" +" \"name\": \"zone 22\"\n" +"}" +msgstr "" + +msgid "" +"{\n" +" \"error\": {\n" +" \"code\": 0,\n" +" \"message\": \"ok\"\n" +" },\n" +" \"data\": {},\n" +" \"status\": true\n" +"}" +msgstr "" + msgid "Delete a zone if it doesn’t store any nodes." msgstr "Удаление зоны, если в ней нет узлов." @@ -62,12 +119,55 @@ msgstr ":ref:`POST /api/v1/zones/weights `" msgid "Set the zone weights configuration." msgstr "Конфигурация веса зоны." +msgid "" +"{\n" +" \"weights\": {\n" +" \"1\": {\n" +" \"2\": 10,\n" +" \"3\": 11\n" +" },\n" +" \"2\": {\n" +" \"1\": 10,\n" +" \"3\": 12\n" +" },\n" +" \"3\": {\n" +" \"1\": 11,\n" +" \"2\": 12\n" +" }\n" +" }\n" +"}" +msgstr "" + msgid "``zones_weights_error`` - configuration error" msgstr "``zones_weights_error`` -- ошибка конфигурации" msgid "Return the zone weights configuration." msgstr "Возврат конфигурации веса зоны." +msgid "" +"{\n" +" \"error\": {\n" +" \"code\": 0,\n" +" \"message\": \"ok\"\n" +" },\n" +" \"data\": {\n" +" \"1\": {\n" +" \"2\": 10,\n" +" \"3\": 11\n" +" },\n" +" \"2\": {\n" +" \"1\": 10,\n" +" \"3\": 12\n" +" },\n" +" \"3\": {\n" +" \"1\": 11,\n" +" \"2\": 12\n" +" }\n" +" },\n" +" \"status\": true\n" +"}" +msgstr "" + msgid "Configuring registry" msgstr "Настройка реестра" @@ -91,9 +191,39 @@ msgstr ":ref:`DELETE /api/v1/registry/node/ `" msgid "Return all the detected nodes." msgstr "Возврат всех обнаруженных узлов." +msgid "" +"{\n" +" \"error\": {\n" +" \"code\": 0,\n" +" \"message\": \"ok\"\n" +" },\n" +" \"data\": [\n" +" {\n" +" \"uuid\": \"uuid-2\",\n" +" \"hostname\": \"tnt2.public.i\",\n" +" \"name\": \"tnt2\"\n" +" }\n" +" ],\n" +" \"status\": true\n" +"}" +msgstr "" + msgid "Register the detected node." msgstr "Регистрация обнаруженного узла." +msgid "" +"{\n" +" \"zone_id\": 1,\n" +" \"uuid\": \"uuid-2\",\n" +" \"uri\": \"tnt2.public.i:3301\",\n" +" \"user\": \"user1:pass1\",\n" +" \"repl_user\": \"repl_user1:repl_pass1\",\n" +" \"cfg\": {\n" +" \"listen\": \"0.0.0.0:3301\"\n" +" }\n" +"}" +msgstr "" + msgid "``node_already_registered`` - the specified node is already registered" msgstr "``node_already_registered`` -- указанный узел уже зарегистрирован" @@ -106,6 +236,17 @@ msgstr "Обновление параметров зарегистрирован msgid "Pass only those parameters that need to be updated." msgstr "Передача только обновляемых параметров." +msgid "" +"{\n" +" \"zone_id\": 1,\n" +" \"repl_user\": \"repl_user2:repl_pass2\",\n" +" \"cfg\": {\n" +" \"listen\": \"0.0.0.0:3301\",\n" +" \"memtx_memory\": 100000\n" +" }\n" +"}" +msgstr "" + msgid "``node_not_registered`` - the specified node is not registered" msgstr "``node_not_registered`` -- указанный узел не зарегистрирован" @@ -116,6 +257,42 @@ msgstr "" "Возврат информации об узлах в кластере. Если передать ``node_uuid``, " "вернется информация только по данному узлу." +msgid "" +"{\n" +" \"error\": {\n" +" \"code\": 0,\n" +" \"message\": \"ok\"\n" +" },\n" +" \"data\": {\n" +" \"uuid-1\": {\n" +" \"user\": \"user1:pass1\",\n" +" \"hostname\": \"tnt1.public.i\",\n" +" \"repl_user\": \"repl_user2:repl_pass2\",\n" +" \"uri\": \"tnt1.public.i:3301\",\n" +" \"zone_id\": 1,\n" +" \"name\": \"tnt1\",\n" +" \"cfg\": {\n" +" \"listen\": \"0.0.0.0:3301\",\n" +" \"memtx_memory\": 100000\n" +" },\n" +" \"zone\": 1\n" +" },\n" +" \"uuid-2\": {\n" +" \"user\": \"user1:pass1\",\n" +" \"hostname\": \"tnt2.public.i\",\n" +" \"name\": \"tnt2\",\n" +" \"uri\": \"tnt2.public.i:3301\",\n" +" \"repl_user\": \"repl_user1:repl_pass1\",\n" +" \"cfg\": {\n" +" \"listen\": \"0.0.0.0:3301\"\n" +" },\n" +" \"zone\": 1\n" +" }\n" +" },\n" +" \"status\": true\n" +"}" +msgstr "" + msgid "Delete the node if it doesn’t belong to any replica set." msgstr "Удаление узла, если он не относится ни к одному набору реплик." @@ -138,9 +315,28 @@ msgstr "" msgid "Return the list of all nodes that constitute the router." msgstr "Возврат списка всех узлов, которые представляют собой роутер." +msgid "" +"{\n" +" \"data\": [\n" +" \"uuid-1\"\n" +" ],\n" +" \"status\": true,\n" +" \"error\": {\n" +" \"code\": 0,\n" +" \"message\": \"ok\"\n" +" }\n" +"}" +msgstr "" + msgid "Assign the router role to the node." msgstr "Присвоение узлу роли роутера." +msgid "" +"{\n" +" \"uuid\": \"uuid-1\"\n" +"}" +msgstr "" + msgid "Release the router role from the node." msgstr "Снятие роли роутера с узла." @@ -177,6 +373,31 @@ msgstr "" msgid "Create a replica set containing all the registered nodes." msgstr "Создание набора реплик со всеми зарегистрированными узлами." +msgid "" +"{\n" +" \"uuid\": \"optional-uuid\",\n" +" \"replicaset\": [\n" +" {\n" +" \"uuid\": \"uuid-1\",\n" +" \"master\": true\n" +" }\n" +" ]\n" +"}" +msgstr "" + +msgid "" +"{\n" +" \"error\": {\n" +" \"code\": 0,\n" +" \"message\": \"ok\"\n" +" },\n" +" \"data\": {\n" +" \"replicaset_uuid\": \"cc6568a2-63ca-413d-8e39-704b20adb7ae\"\n" +" },\n" +" \"status\": true\n" +"}" +msgstr "" + msgid "``replicaset_exists`` – the specified replica set already exists" msgstr "``replicaset_exists`` -- указанный набор реплик уже существует" @@ -194,6 +415,22 @@ msgstr "``node_in_use`` -- указанный узел используется msgid "Update the replica set parameters." msgstr "Обновление параметров набора реплик." +msgid "" +"{\n" +" \"replicaset\": [\n" +" {\n" +" \"uuid\": \"uuid-1\",\n" +" \"master\": true\n" +" },\n" +" {\n" +" \"uuid\": \"uuid-2\",\n" +" \"master\": false,\n" +" \"off\": true\n" +" }\n" +" ]\n" +"}" +msgstr "" + msgid "``replicaset_not_found`` – the specified replica set is not found" msgstr "``replicaset_not_found`` -- указанный набор реплик не обнаружен" @@ -204,6 +441,41 @@ msgstr "" "Возврат информации обо всех компонентах кластера. Если передать " "``replicaset_uuid``, вернется информация только по данному набору реплик." +msgid "" +"{\n" +" \"error\": {\n" +" \"code\": 0,\n" +" \"message\": \"ok\"\n" +" },\n" +" \"data\": {\n" +" \"cc6568a2-63ca-413d-8e39-704b20adb7ae\": {\n" +" \"uuid-1\": {\n" +" \"hostname\": \"tnt1.public.i\",\n" +" \"off\": false,\n" +" \"repl_user\": \"repl_user2:repl_pass2\",\n" +" \"uri\": \"tnt1.public.i:3301\",\n" +" \"master\": true,\n" +" \"name\": \"tnt1\",\n" +" \"user\": \"user1:pass1\",\n" +" \"zone_id\": 1,\n" +" \"zone\": 1\n" +" },\n" +" \"uuid-2\": {\n" +" \"hostname\": \"tnt2.public.i\",\n" +" \"off\": true,\n" +" \"repl_user\": \"repl_user1:repl_pass1\",\n" +" \"uri\": \"tnt2.public.i:3301\",\n" +" \"master\": false,\n" +" \"name\": \"tnt2\",\n" +" \"user\": \"user1:pass1\",\n" +" \"zone\": 1\n" +" }\n" +" }\n" +" },\n" +" \"status\": true\n" +"}" +msgstr "" + msgid "Delete a replica set." msgstr "Удаление набора реплик." @@ -213,6 +485,13 @@ msgstr "``replicaset_not_found`` -- указанный набор реплик msgid "Switch the master in the replica set." msgstr "Смена мастера в наборе реплик." +msgid "" +"{\n" +" \"instance_uuid\": \"uuid-1\",\n" +" \"hostname_name\": \"hostname:instance_name\"\n" +"}" +msgstr "" + msgid "" "``node_not_in_replicaset`` – the specified node is not in the specified " "replica set" @@ -223,9 +502,74 @@ msgstr "" msgid "Add a node to the replica set." msgstr "Добавление узла в набор реплик." +msgid "" +"{\n" +" \"instance_uuid\": \"uuid-1\",\n" +" \"hostname_name\": \"hostname:instance_name\",\n" +" \"master\": false,\n" +" \"off\": false\n" +"}" +msgstr "" + msgid "Return statistics on the cluster." msgstr "Возврат статистики по кластеру." +msgid "" +"{\n" +" \"error\": {\n" +" \"code\": 0,\n" +" \"message\": \"ok\"\n" +" },\n" +" \"data\": {\n" +" \"cluster\": {\n" +" \"routers\": [\n" +" {\n" +" \"zone\": 1,\n" +" \"name\": \"tnt1\",\n" +" \"repl_user\": \"repl_user1:repl_pass1\",\n" +" \"hostname\": \"tnt1.public.i\",\n" +" \"status\": null,\n" +" \"uri\": \"tnt1.public.i:3301\",\n" +" \"user\": \"user1:pass1\",\n" +" \"uuid\": \"uuid-1\",\n" +" \"total_rps\": null\n" +" }\n" +" ],\n" +" \"storages\": [\n" +" {\n" +" \"hostname\": \"tnt1.public.i\",\n" +" \"repl_user\": \"repl_user2:repl_pass2\",\n" +" \"uri\": \"tnt1.public.i:3301\",\n" +" \"name\": \"tnt1\",\n" +" \"total_rps\": null,\n" +" \"status\": 'online',\n" +" \"replicas\": [\n" +" {\n" +" \"user\": \"user1:pass1\",\n" +" \"hostname\": \"tnt2.public.i\",\n" +" \"replication_info\": null,\n" +" \"repl_user\": \"repl_user1:repl_pass1\",\n" +" \"uri\": \"tnt2.public.i:3301\",\n" +" \"uuid\": \"uuid-2\",\n" +" \"status\": 'online',\n" +" \"name\": \"tnt2\",\n" +" \"total_rps\": null,\n" +" \"zone\": 1\n" +" }\n" +" ],\n" +" \"user\": \"user1:pass1\",\n" +" \"zone_id\": 1,\n" +" \"uuid\": \"uuid-1\",\n" +" \"replicaset_uuid\": \"cc6568a2-63ca-413d-8e39-704b20adb7ae\",\n" +" \"zone\": 1\n" +" }\n" +" ]\n" +" }\n" +" },\n" +" \"status\": true\n" +"}" +msgstr "" + msgid "Setting up configuration versions" msgstr "Настройка версии конфигурации" @@ -238,6 +582,19 @@ msgstr ":ref:`GET /api/v1/version `" msgid "Set the configuration version." msgstr "Настройка версии конфигурации." +msgid "" +"{\n" +" \"error\": {\n" +" \"code\": 0,\n" +" \"message\": \"ok\"\n" +" },\n" +" \"status\": true,\n" +" \"data\": {\n" +" \"version\": 2\n" +" }\n" +"}" +msgstr "" + msgid "``cfg_error`` - configuration error" msgstr "``cfg_error`` -- ошибка конфигурации" @@ -256,6 +613,17 @@ msgstr ":ref:`GET /api/v1/sharding/cfg `" msgid "Add a new sharding configuration." msgstr "Добавление новой конфигурации шардинга." +msgid "" +"{\n" +" \"error\": {\n" +" \"code\": 0,\n" +" \"message\": \"ok\"\n" +" },\n" +" \"status\": true,\n" +" \"data\": {}\n" +"}" +msgstr "" + msgid "Return the current sharding configuration." msgstr "Возврат текущей конфигурации шардинга." diff --git a/locale/ru/LC_MESSAGES/enterprise/dev.po b/locale/ru/LC_MESSAGES/enterprise/dev.po index d169757af8..86fc41b9a2 100755 --- a/locale/ru/LC_MESSAGES/enterprise/dev.po +++ b/locale/ru/LC_MESSAGES/enterprise/dev.po @@ -2,614 +2,6 @@ msgid "Developer's guide" msgstr "Руководство для разработчика" -msgid "" -"To develop an application, use the Tarantool Cartridge framework that is " -":ref:`installed ` as part of Tarantool Enterprise." -msgstr "" -"Для разработки приложений используйте среду Tarantool Cartridge, которая " -":ref:`установлена ` как компонент Tarantool Enterprise." - -msgid "Here is a summary of the commands you need:" -msgstr "Ниже приведен список необходимых команд:" - -msgid "Create a cluster-aware application from the template:" -msgstr "Создайте приложение с поддержкой кластеров из шаблона:" - -msgid "Develop your application:" -msgstr "Разработайте приложение:" - -msgid "Package your application:" -msgstr "Упакуйте приложение:" - -msgid "Deploy your application:" -msgstr "Разверните приложение:" - -msgid "For ``rpm`` package:" -msgstr "Для пакета ``rpm``:" - -msgid "Upload the package to all servers dedicated to Tarantool." -msgstr "Загрузите пакет на все серверы, выделенные для Tarantool." - -msgid "Install the package:" -msgstr "Установите пакет:" - -msgid "Launch the application." -msgstr "Запустите приложение." - -msgid "For ``tgz`` archive:" -msgstr "Для архива ``tgz``:" - -msgid "Upload the archive to all servers dedicated to Tarantool." -msgstr "Загрузите архив на все серверы, выделенные для Tarantool." - -msgid "Unpack the archive:" -msgstr "Распакуйте архив:" - -msgid "Launch the application" -msgstr "Запустите приложение" - -msgid "" -"For details and examples, consult the following " -"documentation:" -msgstr "" -"Более подробную информацию с примерами см. на следующих " -"страницах:" - -msgid "" -"a `getting started guide `_ that walks you " -"through developing and deploying a simple clustered application using " -"Tarantool Cartridge," -msgstr "" -"`руководство для начинающих `_, в котором " -"пошагово разбирается разработка и развертывание простого кластерного " -"приложения с помощью Tarantool Cartridge," - -msgid "" -"a `detailed manual `_ " -"on creating and managing clustered Tarantool applications using Tarantool " -"Cartridge." -msgstr "" -"`подробное руководство " -"`_ по созданию и " -"управлению кластерными приложениями Tarantool с помощью Tarantool Cartridge." - -msgid "" -"Further on, this guide focuses on Enterprise-specific developer features " -"available on top of Tarantool Community Edition with the Tarantool " -"Cartridge framework:" -msgstr "" -"Кроме того, в этом руководстве особое внимание уделяется функциям " -"разработчика, специфичным для Enterprise-версии, которые доступны в " -"дополнение к Tarantool Community Edition в среде Tarantool " -"Cartridge:" - -msgid ":ref:`LDAP authorization in the web interface `," -msgstr "" -":ref:`авторизация с использованием LDAP в веб-интерфейсе `," - -msgid "" -":ref:`environment-independent applications `," -msgstr "" -":ref:`независимые от среды приложения `," - -msgid "" -":ref:`sample applications with Enterprise flavors `." -msgstr "" -":ref:`примеры приложений, которые подходят для Enterprise-версии " -"`." - -msgid "Implementing LDAP authorization in the web interface" -msgstr "Реализация авторизации с использованием LDAP в веб-интерфейсе" - -msgid "" -"If you run an LDAP server in your organization, you can connect Tarantool " -"Enterprise to it and let it handle the authorization. In this case, follow " -"the `general recipe " -"`_ where in the first step add the " -"``ldap`` module to the ``.rockspec`` file as a dependency and consider " -"implementing the ``check_password`` function the following way:" -msgstr "" -"Если в вашей организации есть сервер LDAP, можно подключить к нему Tarantool" -" Enterprise для обработки авторизации. В этом случае следуйте `общим " -"рекомендациям " -"`_ " -"`_ , где на первом шаге необходимо " -"добавить модуль ``ldap`` в файл ``.rockspec`` в качестве зависимости; " -"рекомендуется также реализовать функцию ``check_password`` следующим " -"образом:" - -msgid "Delivering environment-independent applications" -msgstr "Формирование независимых от среды приложений" - -msgid "" -"Tarantool Enterprise Edition allows you to build environment-independent " -"applications." -msgstr "" -"Tarantool Enterprise позволяет создавать независимые от среды приложения." - -msgid "" -"An environment-independent application is an assembly (in one directory) of:" -msgstr "" -"Независимое от среды приложение представляет собой сборку следующих " -"компонентов (в одной директории):" - -msgid "files with Lua code," -msgstr "файлы с кодом на Lua," - -msgid "``tarantool`` executable," -msgstr "исполняемый файл ``tarantool``," - -msgid "plugged external modules (if necessary)." -msgstr "подключенные внешние модули (при необходимости)." - -msgid "" -"When started by the ``tarantool`` executable, the application provides a " -"service." -msgstr "" -"Запущенное с помощью исполняемого файла tarantool приложение обеспечивает " -"работу сервиса." - -msgid "" -"The modules are Lua rocks installed into a virtual environment (under the " -"application directory) similar to Python's ``virtualenv`` and Ruby's " -"bundler." -msgstr "" -"Модули -- это сторонние библиотеки на Lua, установленные в виртуальную среду" -" (в директории приложения), которая аналогична ``virtualenv`` в Python и " -"bundler в Ruby." - -msgid "" -"Such an application has the same structure both in development and " -"production-ready phases. All the application-related code resides in one " -"place, ready to be packed and copied over to any server." -msgstr "" -"Структура такого приложения остается неизменной как на стадии разработки, " -"так и на стадии производственной эксплуатации. Весь связанный с приложением " -"код находится в одном месте, готов к упаковке и копированию на любой сервер." - -msgid "Packaging applications" -msgstr "Упаковка приложений" - -msgid "" -"Once custom cluster role(s) are defined and the application is developed, " -"pack it and all its dependencies (module binaries) together with the " -"``tarantool`` executable." -msgstr "" -"После определения пользовательских кластерных ролей и разработки приложения " -"упакуйте его со всеми зависимостями (бинарные файлы модулей) и с исполняемым" -" файлом ``tarantool``." - -msgid "" -"This will allow you to upload, install, and run your application on any " -"server in one go." -msgstr "" -"Это позволит вам легко загружать, устанавливать и запускать приложение на " -"любом сервере." - -msgid "To pack the application, say:" -msgstr "Чтобы упаковать приложение, выполните команду:" - -msgid "" -"where specify a path to your development environment -- the Git repository " -"containing your application code, -- and one of the following build options:" -msgstr "" -"где укажите путь к вашей среде разработки (репозиторию Git, который содержит" -" код приложения), а также один из параметров сборки:" - -msgid "``rpm`` to build an RPM package (recommended), or" -msgstr "``rpm`` для сборки RPM-пакета (рекомендуется), или" - -msgid "" -"``tgz`` to build a ``tar + gz`` archive (choose this option only if you do " -"not have root privileges on servers dedicated for Tarantool Enterprise)." -msgstr "" -"``tgz`` для сборки архива ``tar + gz`` (выберите этот параметр, только если " -"у вас нет прав уровня root на серверах, выделенных для Tarantool " -"Enterprise)." - -msgid "" -"This will create a package (or compressed archive) named " -"``--`` (e.g., " -"``myapp-1.2.1-12.rpm``) containing your environment-independent application." -msgstr "" -"В результате будет создан пакет (или сжатый архив) с именем " -"``<имя_приложения>-<версия_тег>-<количество_коммитов>`` (например, " -"``myapp-1.2.1-12.rpm``), который будет хранить ваше приложение в не " -"зависимом от среды виде." - -msgid "" -"Next, proceed to deploying :ref:`packaged applications ` (or :ref:`archived ones `) on your servers." -msgstr "" -"Далее переходите к развертыванию :ref:`пакетных ` " -"(или же :ref:`архивированных `) приложений на " -"серверах." - -msgid "Deploying packaged applications" -msgstr "Развертывание пакетных приложений" - -msgid "" -"To deploy your packaged application, do the following on every server " -"dedicated for Tarantool Enterprise:" -msgstr "" -"Чтобы развернуть пакетное приложение, выполните следующие действия на каждом" -" сервере, выделенном для Tarantool Enterprise:" - -msgid "" -"Upload the package created in the :ref:`previous step `." -msgstr "" -"Загрузите локально пакет, созданный на :ref:`предыдущем шаге `." - -msgid "Install:" -msgstr "Установите приложение:" - -msgid "" -"Start one or multiple Tarantool instances with the corresponding services as" -" described below." -msgstr "" -"Запустите один или несколько экземпляров Tarantool с соответствующими " -"сервисами, как описано ниже." - -msgid "A single instance:" -msgstr "Отдельный экземпляр:" - -msgid "" -"This will start an instantiated ``systemd`` service that will listen to port" -" ``3301``." -msgstr "" -"Это запустит экземпляр сервиса ``systemd`` с прослушиванием по порту " -"``3301``." - -msgid "Multiple instances on one or multiple servers:" -msgstr "Несколько экземпляров на одном или нескольких серверах:" - -msgid "" -"where ``@instance_`` is the instantiated service name for " -"``systemd`` with an incremental ```` (unique for every instance) to " -"be added to the ``3300`` port the instance will listen to (e.g., ``3301``, " -"``3302``, etc.)." -msgstr "" -"где ``@instance_`` (<имя_приложения>@экземпляр_<число>) --" -" это имя экземпляра сервиса ``systemd`` с инкрементным числом ```` " -"(уникальным для каждого экземпляра), которое следует добавить к порту " -"``3300`` для настройки прослушивания (например, ``3301``, ``3302`` и т.д.)." - -msgid "" -"In case it is a cluster-aware application, proceed to `deploying the cluster" -" " -"`_." -msgstr "" -"Если это приложение с поддержкой кластеров, далее переходите к " -"`развертыванию кластера " -"`_." - -msgid "" -"To stop all services on a server, use the ``systemctl stop`` command and " -"specify instance names one by one. For example:" -msgstr "" -"Чтобы остановить все сервисы на сервере, используйте команду ``systemctl " -"stop`` и укажите имена экземпляров по одному. Например:" - -msgid "Deploying archived applications" -msgstr "Развертывание архивированных приложений" - -msgid "" -"While the RPM package places your application to " -"``/usr/share/tarantool/`` on your server by default, the ``tar + " -"gz`` archive does not enforce any structure apart from just the " -"``/`` directory, so you are responsible for placing it " -"appropriately." -msgstr "" -"Тогда как пакет RPM по умолчанию помещает ваше приложение в " -"``/usr/share/tarantool/<имя_приложения>`` на вашем сервере, архив ``tar + " -"gz`` не создает какую-либо структуру, помимо директории " -"``<имя_приложения>/``, поэтому вы сами несете ответственность за " -"правильность размещения приложения." - -msgid "" -"RPM packages are recommended for deployment. Deploy archives only if you do " -"not have root privileges." -msgstr "" -"Для развертывания рекомендуется использовать RPM-пакеты. Развертывайте " -"архивы, только если у вас нет прав уровня root." - -msgid "" -"To place and deploy the application, do the following on every server " -"dedicated for Tarantool Enterprise:" -msgstr "" -"Чтобы разместить и развернуть приложение, выполните следующие действия на " -"каждом сервере, выделенном для Tarantool Enterprise:" - -msgid "" -"Upload the archive, decompress, and extract it to the ``/home//apps`` " -"directory:" -msgstr "" -"Загрузите архив, распакуйте его и извлеките содержимое в директорию " -"``/home//apps``:" - -msgid "Start Tarantool instances with the corresponding services." -msgstr "Запустите экземпляры Tarantool с соответствующими сервисами." - -msgid "" -"To manage instances and configuration, use tools like ``ansible``, " -"``systemd``, and ``supervisord``." -msgstr "" -"Для управления и конфигурации экземпляров используйте такие средства, как " -"``ansible``, ``systemd`` и ``supervisord``." - -msgid "Upgrading code" -msgstr "Обновление кода" - -msgid "" -"All instances in the cluster are to run the same code. This includes all the" -" components: custom roles, applications, module binaries, ``tarantool``, and " -"``tt`` (if necessary) executables." -msgstr "" -"Все экземпляры в кластере должны использовать один и тот же код. Это " -"относится ко всем компонентам: пользовательским ролям, приложениям, бинарным" -" файлам модулей, исполняемым файлам ``tarantool`` и ``tt`` (при " -"необходимости)." - -msgid "" -"Pay attention to possible backward incompatibility that any component may " -"introduce. This will help you choose a scenario for an :ref:`upgrade in " -"production `. Keep in mind that you are " -"responsible for code compatibility and handling conflicts should " -"inconsistencies occur." -msgstr "" -"Обратите внимание на возможную обратную совместимость, которую может " -"принести с собой любой компонент. Это поможет вам выбрать сценарий для " -":ref:`обновления в эксплуатационной среде `. " -"Имейте в виду, что вы несете ответственность за совместимость кода и " -"обработку конфликтов в случае возникновения несоответствий." - -msgid "" -"To upgrade any of the components, prepare a new version of the package " -"(archive):" -msgstr "" -"Чтобы обновить любой из компонентов, подготовьте новую версию пакета " -"(архива):" - -msgid "" -"Update the necessary files in your development environment (directory):" -msgstr "Обновите необходимые файлы в вашей среде разработки (директории):" - -msgid "Your own source code: custom roles and/or applications." -msgstr "" -"Ваш собственный исходный код: пользовательские роли и / или приложения." - -msgid "Module binaries." -msgstr "Бинарные файлы модулей." - -msgid "Executables. Replace them with ones from the new bundle." -msgstr "Исполняемые файлы. Замените их на файлы из нового комплекта." - -msgid "" -"Increment the version as described in `application versioning " -"`_." -msgstr "" -"Увеличьте версию, как описано в разделе по `управлению версиями приложения " -"`_." - -msgid "" -"Repack the updated files as described in :ref:`packaging applications " -"`." -msgstr "" -"Повторно упакуйте обновленные файлы, как описано в разделе по :ref:`упаковке" -" приложений `." - -msgid "" -"Choose an upgrade scenario as described in the :ref:`Upgrading in production " -"` section." -msgstr "" -"Выберите сценарий обновления, как описано в разделе по :ref:`обновлению в " -"эксплуатационной среде `." - -msgid "Running sample applications" -msgstr "Запуск примеров приложений" - -msgid "" -"The Enterprise distribution package includes sample applications in the " -"``examples/`` directory that showcase basic Tarantool functionality." -msgstr "" -"Дистрибутив Enterprise включает в себя примеры приложений в директории " -"``examples/``, которые демонстрируют основные функциональные возможности " -"Tarantool." - -msgid "Sample applications:" -msgstr "Примеры приложений:" - -msgid "Write-through cache application for PostgreSQL" -msgstr "Приложение кэширования со сквозной записью в PostgreSQL" - -msgid "" -"The example in ``pg_writethrough_cache/`` shows how Tarantool can cache data" -" written *through* it to a PostgreSQL database to speed up the reads." -msgstr "" -"Пример в ``pg_writethrough_cache/`` показывает, как Tarantool может " -"кэшировать данные, записанные через него в базу данных PostgreSQL для " -"ускорения запросов на чтение." - -msgid "" -"The sample application requires a deployed PostgreSQL database and the " -"following rock modules:" -msgstr "" -"Для примера приложения требуется развернутая база данных PostgreSQL и " -"следующие модули сторонних библиотек:" - -msgid "" -"Look through the code in the files to get an understanding of what the " -"application does." -msgstr "Просмотрите код в файлах, чтобы понять, что может делать приложение." - -msgid "To run the application for a local PostgreSQL database, say:" -msgstr "" -"Чтобы запустить приложение для локальной базы данных PostgreSQL, выполните " -"команду:" - -msgid "Write-behind cache application for Oracle" -msgstr "Приложение кэширования с отложенной записью в Oracle" - -msgid "" -"The example in ``ora-writebehind-cache/`` shows how Tarantool can cache " -"writes and queue them to an Oracle database to speed up both writes and " -"reads." -msgstr "" -"Пример в ``ora-writebehind-cache/`` показывает, как Tarantool может " -"кэшировать записи и помещать их в базу данных Oracle для ускорения как " -"записи, так и чтения." - -msgid "Application requirements" -msgstr "Требования приложения" - -msgid "The sample application requires:" -msgstr "Для примера приложения необходимы:" - -msgid "deployed Oracle database;" -msgstr "развернутая база данных Oracle;" - -msgid "" -"Oracle tools: `Instant Client and SQL Plus " -"`_, " -"both of version 12.2;" -msgstr "" -"инструменты Oracle: `Instant Client and SQL Plus " -"`_, " -"оба версии 12.2;" - -msgid "" -"In case the Oracle Instant Client errors out on ``.so`` files (Oracle's " -"dynamic libraries), put them to some directory and add it to the " -"``LD_LIBRARY_PATH`` environment variable." -msgstr "" -"Если Oracle Instant Client выдает ошибки в файлах с расширением ``.so`` " -"(динамические библиотеки Oracle), поместите их в какую-либо директорию и " -"добавьте ее в переменную окружения ``LD_LIBRARY_PATH``." - -msgid "" -"For example: ``export " -"LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$PWD/``" -msgstr "" -"Например: ``export " -"LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$PWD/<путь_к_файлам_so>``" - -msgid "rock modules listed in the ``rockspec`` file." -msgstr "модули сторонних библиотек, перечисленные в файле ``rockspec``." - -msgid "" -"To install the modules, run the following command in the " -"``examples/ora_writebehind_cache`` directory:" -msgstr "" -"Чтобы установить модули, выполните следующую команду в директории " -"``examples/ora_writebehind_cache``:" - -msgid "" -"If you do not have a deployed Oracle instance at hand, run a dummy in a " -"Docker container:" -msgstr "" -"Если у вас нет развернутого экземпляра Oracle под рукой, запустите пустой " -"объект в контейнере Docker:" - -msgid "" -"In the browser, log in to `Oracle container registry `_, click **Database**, and accept the Oracle's " -"Enterprise Terms and Restrictions." -msgstr "" -"В браузере войдите в `Реестр контейнеров Oracle `_, выберите **Database** (База данных) и примите " -"«Корпоративные условия и ограничения Oracle»." - -msgid "" -"In the ``ora-writebehind-cache/`` directory, log in to the repository under " -"the Oracle account, pull, and run an image using the prepared scripts:" -msgstr "" -"В директории ``ora-writebehind-cache/`` войдите в репозиторий под учетной " -"записью Oracle, получите данные и запустите образ с помощью подготовленных " -"скриптов" - -msgid "When all is set and done, run the example application." -msgstr "Когда всё будет готово, запустите пример приложения." - -msgid "Running write-behind cache" -msgstr "Запуск кэширования с отложенной записью" - -msgid "" -"To launch the application, run the following in the " -"``examples/ora_writebehind_cache`` directory:" -msgstr "" -"Чтобы запустить приложение, выполните следующую команду в директории " -"``examples/ora_writebehind_cache``:" - -msgid "The application supports the following requests:" -msgstr "Данное приложение поддерживает следующие запросы:" - -msgid "Get: ``GET http://:/account/id``;" -msgstr "Получение данных: ``GET http://:/account/id``;" - -msgid "" -"Add: ``POST http://:/account/`` with the following data:" -msgstr "" -"Добавление: ``POST http://:/account/`` со следующими " -"данными:" - -msgid "" -"Update: ``POST http://:/account/id`` with the same data as " -"in the add request;" -msgstr "" -"Обновление: ``POST http://:/account/id`` с теми же данными," -" что и в запросе на добавление;" - -msgid "" -"Remove: ``DELETE http://:/account/id`` where ``id`` is an " -"account identifier." -msgstr "" -"Удаление: ``DELETE http://:/account/id``,где ``id`` -- это " -"идентификатор учетной записи." - -msgid "" -"Look for sample CURL scripts in the " -"``examples/ora_writebehind_cache/testing`` directory and check " -"``README.md`` for more information on implementation." -msgstr "" -"Взгляните на примеры скриптов CURL в директории " -"``examples/ora_writebehind_cache/testing`` и просмотрите файл ``README.md`` " -"для получения дополнительной информации об их использовании." - -msgid "Hello-world application in Docker" -msgstr "Простейшее приложение в Docker" - -msgid "" -"The example in the ``docker/`` directory contains a hello-world application " -"that you can pack in a Docker container and run on CentOS 7." -msgstr "" -"Пример в директории ``docker/`` содержит простейшее приложение, которое " -"можно упаковать в контейнер Docker и запустить на CentOS 7." - -msgid "" -"The ``hello.lua`` file is the entry point and it is very bare-bones, so you " -"can add your code here." -msgstr "" -"Файл ``hello.lua`` представляет собой элементарную точку входа в приложение," -" поэтому вы можете добавить туда собственный код." - -msgid "To build the container, say:" -msgstr "Чтобы создать контейнер, выполните команду:" - -msgid "To run it:" -msgstr "Чтобы запустить его:" - #~ msgid "" #~ "Implement some setters (and getters, if necessary) using the " #~ "``cluster.confapplier`` public API functions: ``get_readonly(section)``, " @@ -946,8 +338,7 @@ msgstr "Чтобы запустить его:" #~ "`_." #~ msgstr "" #~ "Для получения дополнительной информации о шардинге см. `документацию по " -#~ "модулю vshard " -#~ "`_." +#~ "модулю vshard `_." #~ msgid "" #~ "With the built-in and custom roles, Tarantool Enterprise allows you to " @@ -2064,3 +1455,596 @@ msgstr "Чтобы запустить его:" #~ msgid "To stop the application, say:" #~ msgstr "Чтобы остановить приложение, выполните команду:" + +#~ msgid "" +#~ "To develop an application, use the Tarantool Cartridge framework that is " +#~ ":ref:`installed ` as part of Tarantool Enterprise." +#~ msgstr "" +#~ "Для разработки приложений используйте среду Tarantool Cartridge, которая " +#~ ":ref:`установлена ` как компонент Tarantool Enterprise." + +#~ msgid "Here is a summary of the commands you need:" +#~ msgstr "Ниже приведен список необходимых команд:" + +#~ msgid "Create a cluster-aware application from the template:" +#~ msgstr "Создайте приложение с поддержкой кластеров из шаблона:" + +#~ msgid "Develop your application:" +#~ msgstr "Разработайте приложение:" + +#~ msgid "Package your application:" +#~ msgstr "Упакуйте приложение:" + +#~ msgid "Deploy your application:" +#~ msgstr "Разверните приложение:" + +#~ msgid "For ``rpm`` package:" +#~ msgstr "Для пакета ``rpm``:" + +#~ msgid "Upload the package to all servers dedicated to Tarantool." +#~ msgstr "Загрузите пакет на все серверы, выделенные для Tarantool." + +#~ msgid "Install the package:" +#~ msgstr "Установите пакет:" + +#~ msgid "Launch the application." +#~ msgstr "Запустите приложение." + +#~ msgid "For ``tgz`` archive:" +#~ msgstr "Для архива ``tgz``:" + +#~ msgid "Upload the archive to all servers dedicated to Tarantool." +#~ msgstr "Загрузите архив на все серверы, выделенные для Tarantool." + +#~ msgid "Unpack the archive:" +#~ msgstr "Распакуйте архив:" + +#~ msgid "Launch the application" +#~ msgstr "Запустите приложение" + +#~ msgid "For details and examples, consult the following documentation:" +#~ msgstr "Более подробную информацию с примерами см. на следующих страницах:" + +#~ msgid "" +#~ "a `getting started guide `_ that walks you " +#~ "through developing and deploying a simple clustered application using " +#~ "Tarantool Cartridge," +#~ msgstr "" +#~ "`руководство для начинающих `_, в котором " +#~ "пошагово разбирается разработка и развертывание простого кластерного " +#~ "приложения с помощью Tarantool Cartridge," + +#~ msgid "" +#~ "a `detailed manual `_ on creating and managing clustered " +#~ "Tarantool applications using Tarantool Cartridge." +#~ msgstr "" +#~ "`подробное руководство `_ по созданию и управлению " +#~ "кластерными приложениями Tarantool с помощью Tarantool Cartridge." + +#~ msgid "" +#~ "Further on, this guide focuses on Enterprise-specific developer features " +#~ "available on top of Tarantool Community Edition with the Tarantool Cartridge" +#~ " framework:" +#~ msgstr "" +#~ "Кроме того, в этом руководстве особое внимание уделяется функциям " +#~ "разработчика, специфичным для Enterprise-версии, которые доступны в " +#~ "дополнение к Tarantool Community Edition в среде Tarantool Cartridge:" + +#~ msgid ":ref:`LDAP authorization in the web interface `," +#~ msgstr "" +#~ ":ref:`авторизация с использованием LDAP в веб-интерфейсе `," + +#~ msgid "" +#~ ":ref:`environment-independent applications `," +#~ msgstr "" +#~ ":ref:`независимые от среды приложения `," + +#~ msgid "" +#~ ":ref:`sample applications with Enterprise flavors `." +#~ msgstr "" +#~ ":ref:`примеры приложений, которые подходят для Enterprise-версии " +#~ "`." + +#~ msgid "Implementing LDAP authorization in the web interface" +#~ msgstr "Реализация авторизации с использованием LDAP в веб-интерфейсе" + +#~ msgid "" +#~ "If you run an LDAP server in your organization, you can connect Tarantool " +#~ "Enterprise to it and let it handle the authorization. In this case, follow " +#~ "the `general recipe `_ where in the first step add the " +#~ "``ldap`` module to the ``.rockspec`` file as a dependency and consider " +#~ "implementing the ``check_password`` function the following way:" +#~ msgstr "" +#~ "Если в вашей организации есть сервер LDAP, можно подключить к нему Tarantool" +#~ " Enterprise для обработки авторизации. В этом случае следуйте `общим " +#~ "рекомендациям `_ `_ , где на первом шаге необходимо " +#~ "добавить модуль ``ldap`` в файл ``.rockspec`` в качестве зависимости; " +#~ "рекомендуется также реализовать функцию ``check_password`` следующим " +#~ "образом:" + +#~ msgid "Delivering environment-independent applications" +#~ msgstr "Формирование независимых от среды приложений" + +#~ msgid "" +#~ "Tarantool Enterprise Edition allows you to build environment-independent " +#~ "applications." +#~ msgstr "" +#~ "Tarantool Enterprise позволяет создавать независимые от среды приложения." + +#~ msgid "" +#~ "An environment-independent application is an assembly (in one directory) of:" +#~ msgstr "" +#~ "Независимое от среды приложение представляет собой сборку следующих " +#~ "компонентов (в одной директории):" + +#~ msgid "files with Lua code," +#~ msgstr "файлы с кодом на Lua," + +#~ msgid "``tarantool`` executable," +#~ msgstr "исполняемый файл ``tarantool``," + +#~ msgid "plugged external modules (if necessary)." +#~ msgstr "подключенные внешние модули (при необходимости)." + +#~ msgid "" +#~ "When started by the ``tarantool`` executable, the application provides a " +#~ "service." +#~ msgstr "" +#~ "Запущенное с помощью исполняемого файла tarantool приложение обеспечивает " +#~ "работу сервиса." + +#~ msgid "" +#~ "The modules are Lua rocks installed into a virtual environment (under the " +#~ "application directory) similar to Python's ``virtualenv`` and Ruby's " +#~ "bundler." +#~ msgstr "" +#~ "Модули -- это сторонние библиотеки на Lua, установленные в виртуальную среду" +#~ " (в директории приложения), которая аналогична ``virtualenv`` в Python и " +#~ "bundler в Ruby." + +#~ msgid "" +#~ "Such an application has the same structure both in development and " +#~ "production-ready phases. All the application-related code resides in one " +#~ "place, ready to be packed and copied over to any server." +#~ msgstr "" +#~ "Структура такого приложения остается неизменной как на стадии разработки, " +#~ "так и на стадии производственной эксплуатации. Весь связанный с приложением " +#~ "код находится в одном месте, готов к упаковке и копированию на любой сервер." + +#~ msgid "Packaging applications" +#~ msgstr "Упаковка приложений" + +#~ msgid "" +#~ "Once custom cluster role(s) are defined and the application is developed, " +#~ "pack it and all its dependencies (module binaries) together with the " +#~ "``tarantool`` executable." +#~ msgstr "" +#~ "После определения пользовательских кластерных ролей и разработки приложения " +#~ "упакуйте его со всеми зависимостями (бинарные файлы модулей) и с исполняемым" +#~ " файлом ``tarantool``." + +#~ msgid "" +#~ "This will allow you to upload, install, and run your application on any " +#~ "server in one go." +#~ msgstr "" +#~ "Это позволит вам легко загружать, устанавливать и запускать приложение на " +#~ "любом сервере." + +#~ msgid "To pack the application, say:" +#~ msgstr "Чтобы упаковать приложение, выполните команду:" + +#~ msgid "" +#~ "where specify a path to your development environment -- the Git repository " +#~ "containing your application code, -- and one of the following build options:" +#~ msgstr "" +#~ "где укажите путь к вашей среде разработки (репозиторию Git, который содержит" +#~ " код приложения), а также один из параметров сборки:" + +#~ msgid "``rpm`` to build an RPM package (recommended), or" +#~ msgstr "``rpm`` для сборки RPM-пакета (рекомендуется), или" + +#~ msgid "" +#~ "``tgz`` to build a ``tar + gz`` archive (choose this option only if you do " +#~ "not have root privileges on servers dedicated for Tarantool Enterprise)." +#~ msgstr "" +#~ "``tgz`` для сборки архива ``tar + gz`` (выберите этот параметр, только если " +#~ "у вас нет прав уровня root на серверах, выделенных для Tarantool " +#~ "Enterprise)." + +#~ msgid "" +#~ "This will create a package (or compressed archive) named " +#~ "``--`` (e.g., " +#~ "``myapp-1.2.1-12.rpm``) containing your environment-independent application." +#~ msgstr "" +#~ "В результате будет создан пакет (или сжатый архив) с именем " +#~ "``<имя_приложения>-<версия_тег>-<количество_коммитов>`` (например, " +#~ "``myapp-1.2.1-12.rpm``), который будет хранить ваше приложение в не " +#~ "зависимом от среды виде." + +#~ msgid "" +#~ "Next, proceed to deploying :ref:`packaged applications ` (or :ref:`archived ones `) on your servers." +#~ msgstr "" +#~ "Далее переходите к развертыванию :ref:`пакетных ` " +#~ "(или же :ref:`архивированных `) приложений на " +#~ "серверах." + +#~ msgid "Deploying packaged applications" +#~ msgstr "Развертывание пакетных приложений" + +#~ msgid "" +#~ "To deploy your packaged application, do the following on every server " +#~ "dedicated for Tarantool Enterprise:" +#~ msgstr "" +#~ "Чтобы развернуть пакетное приложение, выполните следующие действия на каждом" +#~ " сервере, выделенном для Tarantool Enterprise:" + +#~ msgid "" +#~ "Upload the package created in the :ref:`previous step `." +#~ msgstr "" +#~ "Загрузите локально пакет, созданный на :ref:`предыдущем шаге `." + +#~ msgid "Install:" +#~ msgstr "Установите приложение:" + +#~ msgid "" +#~ "Start one or multiple Tarantool instances with the corresponding services as" +#~ " described below." +#~ msgstr "" +#~ "Запустите один или несколько экземпляров Tarantool с соответствующими " +#~ "сервисами, как описано ниже." + +#~ msgid "A single instance:" +#~ msgstr "Отдельный экземпляр:" + +#~ msgid "" +#~ "This will start an instantiated ``systemd`` service that will listen to port" +#~ " ``3301``." +#~ msgstr "" +#~ "Это запустит экземпляр сервиса ``systemd`` с прослушиванием по порту " +#~ "``3301``." + +#~ msgid "Multiple instances on one or multiple servers:" +#~ msgstr "Несколько экземпляров на одном или нескольких серверах:" + +#~ msgid "" +#~ "where ``@instance_`` is the instantiated service name for " +#~ "``systemd`` with an incremental ```` (unique for every instance) to " +#~ "be added to the ``3300`` port the instance will listen to (e.g., ``3301``, " +#~ "``3302``, etc.)." +#~ msgstr "" +#~ "где ``@instance_`` (<имя_приложения>@экземпляр_<число>) --" +#~ " это имя экземпляра сервиса ``systemd`` с инкрементным числом ```` " +#~ "(уникальным для каждого экземпляра), которое следует добавить к порту " +#~ "``3300`` для настройки прослушивания (например, ``3301``, ``3302`` и т.д.)." + +#~ msgid "" +#~ "In case it is a cluster-aware application, proceed to `deploying the cluster" +#~ " `_." +#~ msgstr "" +#~ "Если это приложение с поддержкой кластеров, далее переходите к " +#~ "`развертыванию кластера `_." + +#~ msgid "" +#~ "To stop all services on a server, use the ``systemctl stop`` command and " +#~ "specify instance names one by one. For example:" +#~ msgstr "" +#~ "Чтобы остановить все сервисы на сервере, используйте команду ``systemctl " +#~ "stop`` и укажите имена экземпляров по одному. Например:" + +#~ msgid "Deploying archived applications" +#~ msgstr "Развертывание архивированных приложений" + +#~ msgid "" +#~ "While the RPM package places your application to " +#~ "``/usr/share/tarantool/`` on your server by default, the ``tar + " +#~ "gz`` archive does not enforce any structure apart from just the " +#~ "``/`` directory, so you are responsible for placing it " +#~ "appropriately." +#~ msgstr "" +#~ "Тогда как пакет RPM по умолчанию помещает ваше приложение в " +#~ "``/usr/share/tarantool/<имя_приложения>`` на вашем сервере, архив ``tar + " +#~ "gz`` не создает какую-либо структуру, помимо директории " +#~ "``<имя_приложения>/``, поэтому вы сами несете ответственность за " +#~ "правильность размещения приложения." + +#~ msgid "" +#~ "RPM packages are recommended for deployment. Deploy archives only if you do " +#~ "not have root privileges." +#~ msgstr "" +#~ "Для развертывания рекомендуется использовать RPM-пакеты. Развертывайте " +#~ "архивы, только если у вас нет прав уровня root." + +#~ msgid "" +#~ "To place and deploy the application, do the following on every server " +#~ "dedicated for Tarantool Enterprise:" +#~ msgstr "" +#~ "Чтобы разместить и развернуть приложение, выполните следующие действия на " +#~ "каждом сервере, выделенном для Tarantool Enterprise:" + +#~ msgid "" +#~ "Upload the archive, decompress, and extract it to the ``/home//apps`` " +#~ "directory:" +#~ msgstr "" +#~ "Загрузите архив, распакуйте его и извлеките содержимое в директорию " +#~ "``/home//apps``:" + +#~ msgid "Start Tarantool instances with the corresponding services." +#~ msgstr "Запустите экземпляры Tarantool с соответствующими сервисами." + +#~ msgid "" +#~ "To manage instances and configuration, use tools like ``ansible``, " +#~ "``systemd``, and ``supervisord``." +#~ msgstr "" +#~ "Для управления и конфигурации экземпляров используйте такие средства, как " +#~ "``ansible``, ``systemd`` и ``supervisord``." + +#~ msgid "Upgrading code" +#~ msgstr "Обновление кода" + +#~ msgid "" +#~ "All instances in the cluster are to run the same code. This includes all the" +#~ " components: custom roles, applications, module binaries, ``tarantool``, and" +#~ " ``tt`` (if necessary) executables." +#~ msgstr "" +#~ "Все экземпляры в кластере должны использовать один и тот же код. Это " +#~ "относится ко всем компонентам: пользовательским ролям, приложениям, бинарным" +#~ " файлам модулей, исполняемым файлам ``tarantool`` и ``tt`` (при " +#~ "необходимости)." + +#~ msgid "" +#~ "Pay attention to possible backward incompatibility that any component may " +#~ "introduce. This will help you choose a scenario for an :ref:`upgrade in " +#~ "production `. Keep in mind that you are " +#~ "responsible for code compatibility and handling conflicts should " +#~ "inconsistencies occur." +#~ msgstr "" +#~ "Обратите внимание на возможную обратную совместимость, которую может " +#~ "принести с собой любой компонент. Это поможет вам выбрать сценарий для " +#~ ":ref:`обновления в эксплуатационной среде `. " +#~ "Имейте в виду, что вы несете ответственность за совместимость кода и " +#~ "обработку конфликтов в случае возникновения несоответствий." + +#~ msgid "" +#~ "To upgrade any of the components, prepare a new version of the package " +#~ "(archive):" +#~ msgstr "" +#~ "Чтобы обновить любой из компонентов, подготовьте новую версию пакета " +#~ "(архива):" + +#~ msgid "" +#~ "Update the necessary files in your development environment (directory):" +#~ msgstr "Обновите необходимые файлы в вашей среде разработки (директории):" + +#~ msgid "Your own source code: custom roles and/or applications." +#~ msgstr "" +#~ "Ваш собственный исходный код: пользовательские роли и / или приложения." + +#~ msgid "Module binaries." +#~ msgstr "Бинарные файлы модулей." + +#~ msgid "Executables. Replace them with ones from the new bundle." +#~ msgstr "Исполняемые файлы. Замените их на файлы из нового комплекта." + +#~ msgid "" +#~ "Increment the version as described in `application versioning " +#~ "`_." +#~ msgstr "" +#~ "Увеличьте версию, как описано в разделе по `управлению версиями приложения " +#~ "`_." + +#~ msgid "" +#~ "Repack the updated files as described in :ref:`packaging applications " +#~ "`." +#~ msgstr "" +#~ "Повторно упакуйте обновленные файлы, как описано в разделе по :ref:`упаковке" +#~ " приложений `." + +#~ msgid "" +#~ "Choose an upgrade scenario as described in the :ref:`Upgrading in production" +#~ " ` section." +#~ msgstr "" +#~ "Выберите сценарий обновления, как описано в разделе по :ref:`обновлению в " +#~ "эксплуатационной среде `." + +#~ msgid "Running sample applications" +#~ msgstr "Запуск примеров приложений" + +#~ msgid "" +#~ "The Enterprise distribution package includes sample applications in the " +#~ "``examples/`` directory that showcase basic Tarantool functionality." +#~ msgstr "" +#~ "Дистрибутив Enterprise включает в себя примеры приложений в директории " +#~ "``examples/``, которые демонстрируют основные функциональные возможности " +#~ "Tarantool." + +#~ msgid "Sample applications:" +#~ msgstr "Примеры приложений:" + +#~ msgid "Write-through cache application for PostgreSQL" +#~ msgstr "Приложение кэширования со сквозной записью в PostgreSQL" + +#~ msgid "" +#~ "The example in ``pg_writethrough_cache/`` shows how Tarantool can cache data" +#~ " written *through* it to a PostgreSQL database to speed up the reads." +#~ msgstr "" +#~ "Пример в ``pg_writethrough_cache/`` показывает, как Tarantool может " +#~ "кэшировать данные, записанные через него в базу данных PostgreSQL для " +#~ "ускорения запросов на чтение." + +#~ msgid "" +#~ "The sample application requires a deployed PostgreSQL database and the " +#~ "following rock modules:" +#~ msgstr "" +#~ "Для примера приложения требуется развернутая база данных PostgreSQL и " +#~ "следующие модули сторонних библиотек:" + +#~ msgid "" +#~ "Look through the code in the files to get an understanding of what the " +#~ "application does." +#~ msgstr "Просмотрите код в файлах, чтобы понять, что может делать приложение." + +#~ msgid "To run the application for a local PostgreSQL database, say:" +#~ msgstr "" +#~ "Чтобы запустить приложение для локальной базы данных PostgreSQL, выполните " +#~ "команду:" + +#~ msgid "Write-behind cache application for Oracle" +#~ msgstr "Приложение кэширования с отложенной записью в Oracle" + +#~ msgid "" +#~ "The example in ``ora-writebehind-cache/`` shows how Tarantool can cache " +#~ "writes and queue them to an Oracle database to speed up both writes and " +#~ "reads." +#~ msgstr "" +#~ "Пример в ``ora-writebehind-cache/`` показывает, как Tarantool может " +#~ "кэшировать записи и помещать их в базу данных Oracle для ускорения как " +#~ "записи, так и чтения." + +#~ msgid "Application requirements" +#~ msgstr "Требования приложения" + +#~ msgid "The sample application requires:" +#~ msgstr "Для примера приложения необходимы:" + +#~ msgid "deployed Oracle database;" +#~ msgstr "развернутая база данных Oracle;" + +#~ msgid "" +#~ "Oracle tools: `Instant Client and SQL Plus " +#~ "`_, " +#~ "both of version 12.2;" +#~ msgstr "" +#~ "инструменты Oracle: `Instant Client and SQL Plus " +#~ "`_, " +#~ "оба версии 12.2;" + +#~ msgid "" +#~ "In case the Oracle Instant Client errors out on ``.so`` files (Oracle's " +#~ "dynamic libraries), put them to some directory and add it to the " +#~ "``LD_LIBRARY_PATH`` environment variable." +#~ msgstr "" +#~ "Если Oracle Instant Client выдает ошибки в файлах с расширением ``.so`` " +#~ "(динамические библиотеки Oracle), поместите их в какую-либо директорию и " +#~ "добавьте ее в переменную окружения ``LD_LIBRARY_PATH``." + +#~ msgid "" +#~ "For example: ``export " +#~ "LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$PWD/``" +#~ msgstr "" +#~ "Например: ``export " +#~ "LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$PWD/<путь_к_файлам_so>``" + +#~ msgid "rock modules listed in the ``rockspec`` file." +#~ msgstr "модули сторонних библиотек, перечисленные в файле ``rockspec``." + +#~ msgid "" +#~ "To install the modules, run the following command in the " +#~ "``examples/ora_writebehind_cache`` directory:" +#~ msgstr "" +#~ "Чтобы установить модули, выполните следующую команду в директории " +#~ "``examples/ora_writebehind_cache``:" + +#~ msgid "" +#~ "If you do not have a deployed Oracle instance at hand, run a dummy in a " +#~ "Docker container:" +#~ msgstr "" +#~ "Если у вас нет развернутого экземпляра Oracle под рукой, запустите пустой " +#~ "объект в контейнере Docker:" + +#~ msgid "" +#~ "In the browser, log in to `Oracle container registry `_, click **Database**, and accept the Oracle's " +#~ "Enterprise Terms and Restrictions." +#~ msgstr "" +#~ "В браузере войдите в `Реестр контейнеров Oracle `_, выберите **Database** (База данных) и примите " +#~ "«Корпоративные условия и ограничения Oracle»." + +#~ msgid "" +#~ "In the ``ora-writebehind-cache/`` directory, log in to the repository under " +#~ "the Oracle account, pull, and run an image using the prepared scripts:" +#~ msgstr "" +#~ "В директории ``ora-writebehind-cache/`` войдите в репозиторий под учетной " +#~ "записью Oracle, получите данные и запустите образ с помощью подготовленных " +#~ "скриптов" + +#~ msgid "When all is set and done, run the example application." +#~ msgstr "Когда всё будет готово, запустите пример приложения." + +#~ msgid "Running write-behind cache" +#~ msgstr "Запуск кэширования с отложенной записью" + +#~ msgid "" +#~ "To launch the application, run the following in the " +#~ "``examples/ora_writebehind_cache`` directory:" +#~ msgstr "" +#~ "Чтобы запустить приложение, выполните следующую команду в директории " +#~ "``examples/ora_writebehind_cache``:" + +#~ msgid "The application supports the following requests:" +#~ msgstr "Данное приложение поддерживает следующие запросы:" + +#~ msgid "Get: ``GET http://:/account/id``;" +#~ msgstr "Получение данных: ``GET http://:/account/id``;" + +#~ msgid "" +#~ "Add: ``POST http://:/account/`` with the following data:" +#~ msgstr "" +#~ "Добавление: ``POST http://:/account/`` со следующими " +#~ "данными:" + +#~ msgid "" +#~ "Update: ``POST http://:/account/id`` with the same data as " +#~ "in the add request;" +#~ msgstr "" +#~ "Обновление: ``POST http://:/account/id`` с теми же данными," +#~ " что и в запросе на добавление;" + +#~ msgid "" +#~ "Remove: ``DELETE http://:/account/id`` where ``id`` is an " +#~ "account identifier." +#~ msgstr "" +#~ "Удаление: ``DELETE http://:/account/id``,где ``id`` -- это " +#~ "идентификатор учетной записи." + +#~ msgid "" +#~ "Look for sample CURL scripts in the " +#~ "``examples/ora_writebehind_cache/testing`` directory and check ``README.md``" +#~ " for more information on implementation." +#~ msgstr "" +#~ "Взгляните на примеры скриптов CURL в директории " +#~ "``examples/ora_writebehind_cache/testing`` и просмотрите файл ``README.md`` " +#~ "для получения дополнительной информации об их использовании." + +#~ msgid "Hello-world application in Docker" +#~ msgstr "Простейшее приложение в Docker" + +#~ msgid "" +#~ "The example in the ``docker/`` directory contains a hello-world application " +#~ "that you can pack in a Docker container and run on CentOS 7." +#~ msgstr "" +#~ "Пример в директории ``docker/`` содержит простейшее приложение, которое " +#~ "можно упаковать в контейнер Docker и запустить на CentOS 7." + +#~ msgid "" +#~ "The ``hello.lua`` file is the entry point and it is very bare-bones, so you " +#~ "can add your code here." +#~ msgstr "" +#~ "Файл ``hello.lua`` представляет собой элементарную точку входа в приложение," +#~ " поэтому вы можете добавить туда собственный код." + +#~ msgid "To build the container, say:" +#~ msgstr "Чтобы создать контейнер, выполните команду:" + +#~ msgid "To run it:" +#~ msgstr "Чтобы запустить его:" diff --git a/locale/ru/LC_MESSAGES/enterprise/flight_recorder.po b/locale/ru/LC_MESSAGES/enterprise/flight_recorder.po new file mode 100644 index 0000000000..ba8c68fcc5 --- /dev/null +++ b/locale/ru/LC_MESSAGES/enterprise/flight_recorder.po @@ -0,0 +1,221 @@ + +msgid "Flight recorder" +msgstr "" + +msgid "" +"The flight recorder available in the Enterprise Edition is an event " +"collection tool that gathers various information about a working Tarantool " +"instance, such as:" +msgstr "" + +msgid "logs" +msgstr "" + +msgid "metrics" +msgstr "" + +msgid "requests and responses" +msgstr "" + +msgid "" +"This information helps you investigate incidents related to :ref:`crashing " +"` a Tarantool instance." +msgstr "" + +msgid "Enabling the flight recorder" +msgstr "" + +msgid "" +"The flight recorder is disabled by default and can be enabled and configured" +" for a specific Tarantool instance. To enable the flight recorder, set the " +"``flightrec_enabled`` :doc:`configuration option " +"` to ``true``. This option is :ref:`dynamic " +"` and can be changed at runtime by calling ``box.cfg{}``:" +msgstr "" + +msgid "box.cfg{ flightrec_enabled = true }" +msgstr "" + +msgid "" +"After ``flightrec_enabled`` is set to ``true``, the flight recorder starts " +"collecting data in the flight recording file ``current.ttfr``. This file is" +" stored in the :ref:`memtx_dir ` directory. If the " +"instance crashes and reboots, Tarantool rotates the flight recording: " +"``current.ttfr`` is renamed to ``.ttfr`` (for example, " +"``20230411T050721.ttfr``) and the new ``current.ttfr`` file is created for " +"collecting data. In the case of correct shutdown (for example, using " +"``os.exit()``), Tarantool continues writing to the existing ``current.ttfr``" +" file after restart." +msgstr "" + +msgid "Note that old flight recordings should be removed manually." +msgstr "" + +msgid "Configuration" +msgstr "" + +msgid "" +"This section describes options related to the flight recorder configuration." +" Note that all options are :ref:`dynamic ` and can be " +"changed at runtime." +msgstr "" + +msgid "Logs" +msgstr "" + +msgid "" +"This section describes the flight recorder settings related to :ref:`logging" +" `. For example, you can configure a more detailed logging " +"level in the flight recorder for deeper analysis." +msgstr "" + +msgid ":ref:`flightrec_logs_size `" +msgstr "" + +msgid ":ref:`flightrec_logs_max_msg_size `" +msgstr "" + +msgid ":ref:`flightrec_logs_log_level `" +msgstr "" + +msgid "" +"Specifies the size (in bytes) of the log storage. You can set this option to" +" ``0`` to disable the log storage." +msgstr "" + +msgid "Type: integer" +msgstr "" + +msgid "Default: 10485760" +msgstr "" + +msgid "Environment variable: TT_FLIGHTREC_LOGS_SIZE" +msgstr "" + +msgid "" +"Specifies the maximum size (in bytes) of the log message. The log message is" +" truncated if its size exceeds this limit." +msgstr "" + +msgid "Default: 4096" +msgstr "" + +msgid "Maximum: 16384" +msgstr "" + +msgid "Environment variable: TT_FLIGHTREC_LOGS_MAX_MSG_SIZE" +msgstr "" + +msgid "" +"Specifies the level of detail the log has. You can learn more about log " +"levels from the :ref:`log_level ` option description." +" Note that the ``flightrec_logs_log_level`` value might differ from " +"``log_level``." +msgstr "" + +msgid "Default: 6" +msgstr "" + +msgid "Environment variable: TT_FLIGHTREC_LOGS_LOG_LEVEL" +msgstr "" + +msgid "Metrics" +msgstr "" + +msgid "" +"This section describes the flight recorder settings related to collecting " +":ref:`metrics `." +msgstr "" + +msgid ":ref:`flightrec_metrics_period `" +msgstr "" + +msgid ":ref:`flightrec_metrics_interval `" +msgstr "" + +msgid "" +"Specifies the time period (in seconds) that defines how long metrics are " +"stored from the moment of dump. So, this value defines how much historical " +"metrics data is collected up to the moment of crash. The frequency of metric" +" dumps is defined by :ref:`flightrec_metrics_interval " +"`." +msgstr "" + +msgid "Default: 180" +msgstr "" + +msgid "Environment variable: TT_FLIGHTREC_METRICS_PERIOD" +msgstr "" + +msgid "" +"Specifies the time interval (in seconds) that defines the frequency of " +"dumping metrics. This value shouldn't exceed :ref:`flightrec_metrics_period " +"`." +msgstr "" + +msgid "Type: number" +msgstr "" + +msgid "Default: 1.0" +msgstr "" + +msgid "Minimum: 0.001" +msgstr "" + +msgid "Environment variable: TT_FLIGHTREC_METRICS_INTERVAL" +msgstr "" + +msgid "" +"Given that the average size of a metrics entry is 2 kB, you can estimate the" +" size of the metrics storage as follows:" +msgstr "" + +msgid "(flightrec_metrics_period / flightrec_metrics_interval) * 2 kB" +msgstr "" + +msgid "Requests" +msgstr "" + +msgid "" +"This section lists the flight recorder settings related to storing the " +":ref:`request and response ` data." +msgstr "" + +msgid ":ref:`flightrec_requests_size `" +msgstr "" + +msgid "" +":ref:`flightrec_requests_max_req_size `" +msgstr "" + +msgid "" +":ref:`flightrec_requests_max_res_size `" +msgstr "" + +msgid "" +"Specifies the size (in bytes) of storage for the request and response data. " +"You can set this parameter to ``0`` to disable a storage of requests and " +"responses." +msgstr "" + +msgid "Environment variable: TT_FLIGHTREC_REQUESTS_SIZE" +msgstr "" + +msgid "" +"Specifies the maximum size (in bytes) of a request entry. A request entry is" +" truncated if this size is exceeded." +msgstr "" + +msgid "Default: 16384" +msgstr "" + +msgid "Environment variable: TT_FLIGHTREC_REQUESTS_MAX_REQ_SIZE" +msgstr "" + +msgid "" +"Specifies the maximum size (in bytes) of a response entry. A response entry " +"is truncated if this size is exceeded." +msgstr "" + +msgid "Environment variable: TT_FLIGHTREC_REQUESTS_MAX_RES_SIZE" +msgstr "" diff --git a/locale/ru/LC_MESSAGES/enterprise/index.po b/locale/ru/LC_MESSAGES/enterprise/index.po new file mode 100644 index 0000000000..bb685c02eb --- /dev/null +++ b/locale/ru/LC_MESSAGES/enterprise/index.po @@ -0,0 +1,39 @@ + +msgid "Tarantool Enterprise Edition" +msgstr "" + +msgid "" +"This section describes the Enterprise Edition of Tarantool software -- a Lua" +" application server integrated with a DBMS for deploying fault-tolerant " +"distributed data storages." +msgstr "" + +msgid "" +"The Enterprise Edition provides an `extended feature set " +"`__ for developing and managing " +"clustered Tarantool applications, for example:" +msgstr "" + +msgid "Static package for standalone Linux systems." +msgstr "" + +msgid "Tarantool bindings to OpenLDAP." +msgstr "" + +msgid "Security :ref:`audit log `." +msgstr "" + +msgid "" +"Enterprise database connectivity: Oracle and any ODBC-supported DBMS (for " +"example, MySQL, Microsoft SQL Server)." +msgstr "" + +msgid "" +"SSL support for :ref:`traffic encryption `." +msgstr "" + +msgid ":doc:`Tuple compression `." +msgstr "" + +msgid ":doc:`Non-blocking DDL `." +msgstr "" diff --git a/locale/ru/LC_MESSAGES/enterprise/migration.po b/locale/ru/LC_MESSAGES/enterprise/migration.po index 83e1775748..996e84e636 100644 --- a/locale/ru/LC_MESSAGES/enterprise/migration.po +++ b/locale/ru/LC_MESSAGES/enterprise/migration.po @@ -68,9 +68,9 @@ msgid "That's it!" msgstr "Готово!" msgid "" -"You can now use Tarantool Enterprise Edition's features in your installation. For " -"example, to enable the audit log, :ref:`set up the audit_log parameter in " -"your node configuration `." +"You can now use Tarantool Enterprise Edition's features in your " +"installation. For example, to enable the audit log, :ref:`set up the " +"audit_log parameter in your node configuration `." msgstr "" "Теперь вы можете использовать функциональные возможности Tarantool " "Enterprise в своей инсталляции. К примеру, чтобы включить журнал аудита, " diff --git a/locale/ru/LC_MESSAGES/enterprise/read_views.po b/locale/ru/LC_MESSAGES/enterprise/read_views.po new file mode 100644 index 0000000000..0ed58947ba --- /dev/null +++ b/locale/ru/LC_MESSAGES/enterprise/read_views.po @@ -0,0 +1,212 @@ + +msgid "Read views" +msgstr "" + +msgid "" +"A read view is an in-memory snapshot of the entire database that isn't " +"affected by future :ref:`data modifications `. Read " +"views provide access to database spaces and their indexes and enable you to " +"retrieve data using the same ``select`` and ``pairs`` operations." +msgstr "" + +msgid "" +"Read views can be used to make complex analytical queries. This reduces the " +"load on the main database and improves RPS for a single Tarantool instance." +msgstr "" + +msgid "" +"To improve memory consumption and performance, Tarantool creates read views " +"using the copy-on-write technique. In this case, duplication of the entire " +"data set is not required: Tarantool duplicates only blocks modified after a " +"read view is created." +msgstr "" + +msgid "" +"Tarantool Enterprise Edition supports read views starting from v2.11.0 and " +"enables the ability to work with them using both :ref:`Lua " +"` and :ref:`C API `." +msgstr "" + +msgid "Limitations" +msgstr "" + +msgid "Read views have the following limitations:" +msgstr "" + +msgid "Only the :ref:`memtx ` engine is supported." +msgstr "" + +msgid "Only TREE and HASH :ref:`indexes ` are supported." +msgstr "" + +msgid "" +"Pagination is not supported (the :ref:`after ` option)." +msgstr "" + +msgid "Working with read views" +msgstr "" + +msgid "Creating a read view" +msgstr "" + +msgid "" +"To create a read view, call the :ref:`box.read_view.open() ` function. The snippet below shows how to create a read view with the " +"``read_view1`` name." +msgstr "" + +msgid "tarantool> read_view1 = box.read_view.open({name = 'read_view1'})" +msgstr "" + +msgid "" +"After creating a read view, you can see the information about it by calling " +":ref:`read_view_object:info() `." +msgstr "" + +msgid "" +"tarantool> read_view1:info()\n" +"---\n" +"- timestamp: 66.606817935\n" +" signature: 24\n" +" is_system: false\n" +" status: open\n" +" vclock: {1: 24}\n" +" name: read_view1\n" +" id: 1\n" +"..." +msgstr "" + +msgid "" +"To list all the created read views, call the :ref:`box.read_view.list() " +"` function." +msgstr "" + +msgid "Querying data" +msgstr "" + +msgid "" +"After creating a read view, you can access database spaces using the " +":ref:`read_view_object.space ` field. This field " +"provides access to a space object that exposes the :ref:`select `, :ref:`get `, and :ref:`pairs ` " +"methods with the same behavior as corresponding ``box.space`` methods." +msgstr "" + +msgid "" +"The example below shows how to select 4 records from the ``bands`` space:" +msgstr "" + +msgid "" +"tarantool> read_view1.space.bands:select({}, {limit = 4})\n" +"---\n" +"- - [1, 'Roxette', 1986]\n" +" - [2, 'Scorpions', 1965]\n" +" - [3, 'Ace of Base', 1987]\n" +" - [4, 'The Beatles', 1960]\n" +"..." +msgstr "" + +msgid "Similarly, you can retrieve data by the specific index." +msgstr "" + +msgid "" +"tarantool> read_view1.space.bands.index.year:select({}, {limit = 4})\n" +"---\n" +"- - [4, 'The Beatles', 1960]\n" +" - [2, 'Scorpions', 1965]\n" +" - [1, 'Roxette', 1986]\n" +" - [3, 'Ace of Base', 1987]\n" +"..." +msgstr "" + +msgid "Closing a read view" +msgstr "" + +msgid "" +"When a read view is no longer needed, close it using the " +":ref:`read_view_object:close() ` method because a " +"read view may consume a substantial amount of memory." +msgstr "" + +msgid "" +"tarantool> read_view1:close()\n" +"---\n" +"..." +msgstr "" + +msgid "" +"Otherwise, a read view is closed implicitly when the read view object is " +"collected by the Lua garbage collector." +msgstr "" + +msgid "" +"After the read view is closed, its :ref:`status ` " +"is set to ``closed``. On an attempt to use it, an error is raised." +msgstr "" + +msgid "Example" +msgstr "" + +msgid "" +"A Tarantool session below demonstrates how to open a read view, get data " +"from this view, and close it. To repeat these steps, you need to bootstrap a" +" Tarantool instance as described in :ref:`Using data operations ` (you can skip creating secondary indexes)." +msgstr "" + +msgid "Insert test data." +msgstr "" + +msgid "" +"tarantool> bands:insert{1, 'Roxette', 1986}\n" +" bands:insert{2, 'Scorpions', 1965}\n" +" bands:insert{3, 'Ace of Base', 1987}\n" +" bands:insert{4, 'The Beatles', 1960}" +msgstr "" + +msgid "" +"Create a read view by calling the ``open`` function. Then, make sure that " +"the read view status is ``open``." +msgstr "" + +msgid "" +"tarantool> read_view1 = box.read_view.open({name = 'read_view1'})\n" +"\n" +"tarantool> read_view1.status\n" +"---\n" +"- open\n" +"..." +msgstr "" + +msgid "" +"Change data in a database using the ``delete`` and ``update`` operations." +msgstr "" + +msgid "" +"tarantool> bands:delete(4)\n" +"---\n" +"- [4, 'The Beatles', 1960]\n" +"...\n" +"tarantool> bands:update({2}, {{'=', 2, 'Pink Floyd'}})\n" +"---\n" +"- [2, 'Pink Floyd', 1965]\n" +"..." +msgstr "" + +msgid "" +"Query a read view to make sure it contains a snapshot of data before a " +"database is updated." +msgstr "" + +msgid "" +"tarantool> read_view1.space.bands:select()\n" +"---\n" +"- - [1, 'Roxette', 1986]\n" +" - [2, 'Scorpions', 1965]\n" +" - [3, 'Ace of Base', 1987]\n" +" - [4, 'The Beatles', 1960]\n" +"..." +msgstr "" + +msgid "Close a read view." +msgstr "" diff --git a/locale/ru/LC_MESSAGES/enterprise/read_views/c_api.po b/locale/ru/LC_MESSAGES/enterprise/read_views/c_api.po new file mode 100644 index 0000000000..c0eb9f693d --- /dev/null +++ b/locale/ru/LC_MESSAGES/enterprise/read_views/c_api.po @@ -0,0 +1,271 @@ + +msgid "Read views: C API" +msgstr "" + +msgid "" +"This topic describes the C API for working with :ref:`read views " +"`. The C API is MT-safe and provides the ability to use a read " +"view from any thread, not only from the :ref:`main (TX) thread " +"`." +msgstr "" + +msgid "The C API has the following specifics:" +msgstr "" + +msgid "" +"The :ref:`space.upgrade ` function is not applied " +"to retrieved tuples even if a space upgrade is in progress." +msgstr "" + +msgid "" +"Tuples stored in :ref:`compressed spaces ` are not " +"decompressed - they are returned as :ref:`raw MessagePack ` " +"(``MP_EXT/MP_COMPRESSION``)." +msgstr "" + +msgid "" +"You can learn how to call C code using stored procedures in the :ref:`C " +"tutorial`." +msgstr "" + +msgid "Data types" +msgstr "" + +msgid "" +"The opaque data types below represent raw read views and an iterator over " +"data in a raw read view. Note that there is no special data type for tuples " +"retrieved from a read view. Tuples are returned as raw MessagePack data " +"(``const char *``)." +msgstr "" + +msgid "A raw database read view." +msgstr "" + +msgid "A space in a raw read view." +msgstr "" + +msgid "An index in a raw read view." +msgstr "" + +msgid "An iterator over data in a raw read view." +msgstr "" + +msgid "Creating and destroying read views" +msgstr "" + +msgid "To create or destroy a read view, use the functions below." +msgstr "" + +msgid "" +"Open a raw read view with the specified name and get a pointer to this read " +"view. In the case of error, returns ``NULL`` and sets " +":ref:`box_error_last()`. This function may be " +"called from the main (TX) thread only." +msgstr "" + +msgid "Parameters" +msgstr "" + +msgid "" +"(optional) a read view name; if ``name`` is not specified, a read view name " +"is set to ``unknown``" +msgstr "" + +msgid "Returns" +msgstr "" + +msgid "a pointer to a read view" +msgstr "" + +msgid "" +"Close a raw read view and release all resources associated with it. This " +"function may be called from the main (TX) thread only." +msgstr "" + +msgid "" +"Read views created using ``box_raw_read_view_new`` are displayed in " +":ref:`box.read_view.list() ` along with " +"read views :ref:`created in Lua `." +msgstr "" + +msgid "Spaces and indexes" +msgstr "" + +msgid "" +"To fetch data from a read view, you need to specify an index to fetch the " +"data from. The following functions are available for looking up spaces and " +"indexes in a read view object." +msgstr "" + +msgid "" +"Find a space by ID in a raw read view. If not found, returns ``NULL`` and " +"sets :ref:`box_error_last()`." +msgstr "" + +msgid "a space identifier" +msgstr "" + +msgid "a pointer to a space" +msgstr "" + +msgid "" +"Find a space by name in a raw read view. If not found, returns ``NULL`` and " +"sets :ref:`box_error_last()`." +msgstr "" + +msgid "a space name" +msgstr "" + +msgid "a space name length" +msgstr "" + +msgid "" +"Find an index by ID in a read view's space. If not found, returns ``NULL`` " +"and sets :ref:`box_error_last()`." +msgstr "" + +msgid "a pointer to a read view's space" +msgstr "" + +msgid "a pointer to an index" +msgstr "" + +msgid "" +"Find an index by name in a read view's space. If not found, returns ``NULL``" +" and sets :ref:`box_error_last()`." +msgstr "" + +msgid "an index name" +msgstr "" + +msgid "an index name length" +msgstr "" + +msgid "Iteration and lookup" +msgstr "" + +msgid "" +"The functions below provide the ability to look up a tuple by the key or " +"create an iterator over a read view index." +msgstr "" + +msgid "" +"Methods of the read view iterator are safe to call from any thread, but they" +" may be used in one thread at the same time. This means that an iterator " +"should be thread-local." +msgstr "" + +msgid "" +"Look up a tuple in a read view's index. If found, the ``data`` and ``size`` " +"out arguments return a pointer to and the size of tuple data. If not found, " +"``*data`` is set to ``NULL`` and ``*size`` is set to ``0``." +msgstr "" + +msgid "a pointer to a read view's index" +msgstr "" + +msgid "" +"a pointer to the first byte of the MsgPack data that represents the search " +"key" +msgstr "" + +msgid "" +"a pointer to the byte following the last byte of the MsgPack data that " +"represents the search key" +msgstr "" + +msgid "a pointer to the tuple data" +msgstr "" + +msgid "the size of tuple data" +msgstr "" + +msgid "" +"``0`` on success; in the case of error, returns ``-1`` and sets " +":ref:`box_error_last()`" +msgstr "" + +msgid "" +"Create an iterator over a raw read view index. The initialized iterator " +"object returned by this function remains valid and may be safely used until " +"it's destroyed or the read view is closed. When the iterator object is no " +"longer needed, it should be destroyed using " +":ref:`box_raw_read_view_iterator_destroy() " +"`." +msgstr "" + +msgid "an iterator over a raw read view index" +msgstr "" + +msgid "a pointer to a read view index" +msgstr "" + +msgid "" +"an iteration direction represented by the :ref:`iterator_type `" +msgstr "" + +msgid "" +"Retrieve the current tuple and advance the given iterator over a raw read " +"view index. The pointer to and the size of tuple data are returned in the " +"``data`` and the ``size`` out arguments. The data returned by this function " +"remains valid and may be safely used until the read view is closed." +msgstr "" + +msgid "an iterator over a read view index" +msgstr "" + +msgid "" +"a pointer to the tuple data; at the end of iteration, ``*data`` is set to " +"``NULL``" +msgstr "" + +msgid "" +"the size of tuple data; at the end of iteration, ``*size`` is set to ``0``" +msgstr "" + +msgid "" +"Destroy an iterator over a raw read view index. The iterator object should " +"not be used after calling this function, but the data returned by the " +"iterator may be safely dereferenced until the read view is closed." +msgstr "" + +msgid "Space format" +msgstr "" + +msgid "" +"A space object's methods below provide the ability to get names and types of" +" space fields." +msgstr "" + +msgid "Get the number of fields defined in the format of a read view space." +msgstr "" + +msgid "a pointer to a read view space" +msgstr "" + +msgid "the number of fields" +msgstr "" + +msgid "" +"Get the name of a field defined in the format of a read view space. If the " +"field number is greater than the total number of fields defined in the " +"format, ``NULL`` is returned. The string returned by this function is " +"guaranteed to remain valid until the read view is closed." +msgstr "" + +msgid "the field number (starts with ``0``)" +msgstr "" + +msgid "the name of a field" +msgstr "" + +msgid "" +"Get the type of a field defined in the format of a read view space. If the " +"field number is greater than the total number of fields defined in the " +"format, ``NULL`` is returned. The string returned by this function is " +"guaranteed to remain valid until the read view is closed." +msgstr "" + +msgid "the type of a field" +msgstr "" diff --git a/locale/ru/LC_MESSAGES/enterprise/read_views/lua_api.po b/locale/ru/LC_MESSAGES/enterprise/read_views/lua_api.po new file mode 100644 index 0000000000..da9d3716d0 --- /dev/null +++ b/locale/ru/LC_MESSAGES/enterprise/read_views/lua_api.po @@ -0,0 +1,107 @@ + +msgid "Read views: Lua API" +msgstr "" + +msgid "" +"This topic describes the Lua API for working with :ref:`read views " +"`." +msgstr "" + +msgid "Create a :ref:`new read view `." +msgstr "" + +msgid "Parameters" +msgstr "" + +msgid "" +"(optional) configurations options for a read view. For example, the ``name``" +" option specifies a read view name. If ``name`` is not specified, a read " +"view name is set to ``unknown``." +msgstr "" + +msgid "return" +msgstr "" + +msgid "a created read view object" +msgstr "" + +msgid "rtype" +msgstr "" + +msgid "read_view_object" +msgstr "" + +msgid "**Example:**" +msgstr "" + +msgid "tarantool> read_view1 = box.read_view.open({name = 'read_view1'})" +msgstr "" + +msgid "An object that represents a :ref:`read view `." +msgstr "" + +msgid "" +"Get information about a read view such as a name, status, or ID. All the " +"available fields are listed below in the object options." +msgstr "" + +msgid "information about a read view" +msgstr "" + +msgid "table" +msgstr "" + +msgid "" +"Close a read view. After the read view is closed, its :ref:`status " +"` is set to ``closed``. On an attempt to use it, an" +" error is raised." +msgstr "" + +msgid "A read view status. The possible values are ``open`` and ``closed``." +msgstr "" + +msgid "string" +msgstr "" + +msgid "A unique numeric identifier of a read view." +msgstr "" + +msgid "number" +msgstr "" + +msgid "" +"A read view name. You can specify a read view name in the " +":ref:`box.read_view.open() ` arguments." +msgstr "" + +msgid "" +"Determine whether a read view is system. For example, system read views can " +"be created to make a :ref:`checkpoint ` or join " +"a new :ref:`replica `." +msgstr "" + +msgid "boolean" +msgstr "" + +msgid "" +"The :ref:`fiber.clock() ` value at the moment of opening a read" +" view." +msgstr "" + +msgid "" +"The :ref:`box.info.vclock ` value at the moment " +"of opening a read view." +msgstr "" + +msgid "" +"The :ref:`box.info.signature ` value at the " +"moment of opening a read view." +msgstr "" + +msgid "" +"Get access to database spaces included in a read view. You can use this " +"field to :ref:`query space data `." +msgstr "" + +msgid "space object" +msgstr "" diff --git a/locale/ru/LC_MESSAGES/enterprise/rocksref.po b/locale/ru/LC_MESSAGES/enterprise/rocksref.po index 01017a00b1..b8b36f1c78 100755 --- a/locale/ru/LC_MESSAGES/enterprise/rocksref.po +++ b/locale/ru/LC_MESSAGES/enterprise/rocksref.po @@ -1,10 +1,11 @@ -msgid "Modules reference" -msgstr "Справочник по модулям" +msgid "Modules" +msgstr "" msgid "" "This section covers open and closed source Lua modules for Tarantool " -"Enterprise Edition included in the distribution as an offline rocks repository." +"Enterprise Edition included in the distribution as an offline rocks " +"repository." msgstr "" "В данной главе рассматриваются Lua-модули с открытым и закрытым исходным " "кодом для Tarantool Enterprise, которые включены в дистрибутив в качестве " @@ -22,60 +23,12 @@ msgstr "" "schema/blob/master/README.md>`_ -- набор инструментов для схемы `Apache Avro" " `_;" +#, fuzzy msgid "" -"`cartridge `_ is a high-" -"level cluster management interface that contains several modules:" -msgstr "" -"`cartridge `_ -- это " -"высокоуровневый интерфейс управления кластером, который содержит несколько " -"модулей:" - -msgid "" -"``rpc`` implements remote procedure calls between cluster instances and " -"allows roles running on some instances to interact with other roles on other" -" instances." -msgstr "" -"``rpc`` обеспечивает удаленные вызовы процедур между экземплярами кластера и" -" позволяет ролям, запущенным на некоторых экземплярах, взаимодействовать с " -"другими ролями в других экземплярах." - -msgid "" -"``service-registry`` implements inter-role interaction and allows different " -"roles to interact with each other in the scope of one instance." -msgstr "" -"``service-registry`` обеспечивает взаимодействие между ролями и позволяет " -"различным ролям взаимодействовать друг с другом в рамках одного экземпляра." - -msgid "" -"``confapplier`` implements cluster-wide configuration validation and " -"application via a two-phase commit." -msgstr "" -"``confapplier`` обеспечивает валидацию и применение конфигурации в масштабе " -"всего кластера с помощью двухфазной фиксации." - -msgid "``auth`` manages authentication." -msgstr "``auth`` управляет аутентификацией." - -msgid "``pool`` reuses Tarantool's ``net.box`` connections." -msgstr "``pool`` повторно использует соединения ``net.box`` в Tarantool." - -msgid "``admin`` implements administration functions." -msgstr "``admin`` обеспечивает функции администрирования." - -msgid "" -"`cartridge-cli " -"`_ is the command-line interface for the ``cartridge`` module." -msgstr "" -"`cartridge-cli " -"`_ -- это интерфейс командной строки для модуля ``cartridge``." - -msgid "" -"`checks `_ is a " -"type checker of functional arguments. This library that declares a " -"``checks()`` function and ``checkers`` table that allow to check the " -"parameters passed to a Lua function in a fast and unobtrusive way." +":ref:`checks ` is a type checker of functional arguments. " +"This library that declares a ``checks()`` function and ``checkers`` table " +"that allow to check the parameters passed to a Lua function in a fast and " +"unobtrusive way." msgstr "" "`checks `_ -- это" " модуль контроля типов функциональных аргументов. Эта библиотека объявляет " @@ -126,71 +79,75 @@ msgstr "" "быстрый анализатор XML." msgid "" -"`luatest `_ is a" -" Tarantool test framework written in Lua." +"`luatest `_ is " +"a Tarantool test framework written in Lua." msgstr "" "`luatest `_ -- " "среда тестирования Tarantool, которая написана на Lua." +#, fuzzy +msgid "" +":ref:`membership ` builds a mesh from multiple Tarantool " +"instances based on gossip protocol. The mesh monitors itself, helps members " +"discover everyone else in the group and get notified about their status " +"changes with low latency. It is built upon the ideas from Consul or, more " +"precisely, the SWIM algorithm." +msgstr "" +"`membership `_ создает сеть из " +"нескольких экземпляров Tarantool на основе протокола gossip. Сеть сама " +"контролирует себя, помогает участникам обнаружить всех остальных в группе и " +"получать уведомления об изменениях своего статуса с низкой задержкой. Модуль" +" основан на концепциях из Consul или, точнее, алгоритма SWIM." + +#, fuzzy msgid "" -"`membership " -"`_" -" builds a mesh from multiple Tarantool instances based on gossip protocol. " -"The mesh monitors itself, helps members discover everyone else in the group " -"and get notified about their status changes with low latency. It is built " -"upon the ideas from Consul or, more precisely, the SWIM algorithm." +":ref:`metrics ` is a collection of useful monitoring metrics." msgstr "" -"`membership " -"`_" -" создает сеть из нескольких экземпляров Tarantool на основе протокола " -"gossip. Сеть сама контролирует себя, помогает участникам обнаружить всех " -"остальных в группе и получать уведомления об изменениях своего статуса с " -"низкой задержкой. Модуль основан на концепциях из Consul или, точнее, " -"алгоритма SWIM." +":doc:`metrics ` -- набор полезных метрик для " +"мониторинга." +#, fuzzy msgid "" -":doc:`metrics ` is a " -"collection of useful monitoring metrics." +"`tracing `_ is a module for debugging" +" performance issues." msgstr "" -":doc:`metrics ` -- набор " -"полезных метрик для мониторинга." +"`tracing `_" +" -- модуль для отладки проблем с производительностью." +#, fuzzy msgid "" -"`vshard " -"`_ is" -" an automatic sharding system that enables horizontal scaling for Tarantool " -"DBMS instances." +":ref:`vshard ` is an automatic sharding system that enables " +"horizontal scaling for Tarantool DBMS instances." msgstr "" -"`vshard " -"`_ --" -" автоматическая система шардинга для горизонтального масштабирования " -"экземпляров СУБД Tarantool." +"`vshard `_ -- автоматическая система " +"шардинга для горизонтального масштабирования экземпляров СУБД Tarantool." msgid "Closed source modules" msgstr "Модули с закрытым исходным кодом" +#, fuzzy msgid "" -"`ldap `_ " -"allows you to authenticate in a LDAP server and perform searches." +":doc:`ldap ` allows you to authenticate in a LDAP " +"server and perform searches." msgstr "" "`ldap `_ " "позволяет осуществлять аутентификацию на сервере LDAP и выполнять поиск." +#, fuzzy msgid "" -"`odbc `_ " -"is an ODBC connector for Tarantool based on unixODBC." +":doc:`odbc ` is an ODBC connector for Tarantool " +"based on unixODBC." msgstr "" "`odbc `_ " "-- коннектор ODBC для Tarantool на основе unixODBC." +#, fuzzy msgid "" -"`oracle " -"`_ is " -"an Oracle connector for Lua applications through which they can send and " -"receive data to and from Oracle databases. The advantage of the Tarantool-" -"Oracle integration is that anyone can handle all the tasks with Oracle DBMSs" -" (control, manipulation, storage, access) with the same high-level language " -"(Lua) and with minimal delay." +":doc:`oracle ` is an Oracle connector for Lua " +"applications through which they can send and receive data to and from Oracle" +" databases. The advantage of the Tarantool-Oracle integration is that anyone" +" can handle all the tasks with Oracle DBMSs (control, manipulation, storage," +" access) with the same high-level language (Lua) and with minimal delay." msgstr "" "`oracle " "`_ -- " @@ -200,30 +157,15 @@ msgstr "" "обработка, хранение, доступ) на одном языке высокого уровня (Lua) с " "минимальной задержкой." +#, fuzzy msgid "" -"`task `_ is a " -"module for managing background tasks in a Tarantool cluster." +":doc:`task ` is a module for managing background " +"tasks in a Tarantool cluster." msgstr "" -"`task `_ -- " +"`task `_ -- " "модуль для управления фоновыми задачами в Tarantool-кластере." -msgid "" -"`tracing `_" -" is a module for debugging performance issues." -msgstr "" -"`tracing `_" -" -- модуль для отладки проблем с производительностью." - -msgid "" -"`space-explorer " -"`_ is a module for exploring Tarantool spaces in " -"``cartridge``." -msgstr "" -"`space-explorer " -"`_ -- модуль для просмотра спейсов Tarantool в ``cartridge``." - msgid "Installing and using modules" msgstr "Установка и использование модулей" @@ -240,15 +182,13 @@ msgstr "" msgid "The module itself on every Tarantool instance:" msgstr "Сам модуль на каждый экземпляр Tarantool:" +msgid "$ tt rocks install MODULE_NAME [MODULE_VERSION]" +msgstr "" + msgid "" -"See also other useful `tarantoolctl commands " -"`_ for managing Tarantool modules." +"See the :ref:`tt rocks reference ` to learn more about managing " +"Lua modules." msgstr "" -"Для получения информации об управлении модулями Tarantool см. также другие " -"важные `команды tarantoolctl " -"`_." #~ msgid "" #~ "The ``membership`` module works over UDP protocol and can operate even " @@ -1005,3 +945,71 @@ msgstr "" #~ msgid "**Example**" #~ msgstr "**Пример**" + +#~ msgid "Modules reference" +#~ msgstr "Справочник по модулям" + +#~ msgid "" +#~ "`cartridge `_ is a high-" +#~ "level cluster management interface that contains several modules:" +#~ msgstr "" +#~ "`cartridge `_ -- это " +#~ "высокоуровневый интерфейс управления кластером, который содержит несколько " +#~ "модулей:" + +#~ msgid "" +#~ "``rpc`` implements remote procedure calls between cluster instances and " +#~ "allows roles running on some instances to interact with other roles on other" +#~ " instances." +#~ msgstr "" +#~ "``rpc`` обеспечивает удаленные вызовы процедур между экземплярами кластера и" +#~ " позволяет ролям, запущенным на некоторых экземплярах, взаимодействовать с " +#~ "другими ролями в других экземплярах." + +#~ msgid "" +#~ "``service-registry`` implements inter-role interaction and allows different " +#~ "roles to interact with each other in the scope of one instance." +#~ msgstr "" +#~ "``service-registry`` обеспечивает взаимодействие между ролями и позволяет " +#~ "различным ролям взаимодействовать друг с другом в рамках одного экземпляра." + +#~ msgid "" +#~ "``confapplier`` implements cluster-wide configuration validation and " +#~ "application via a two-phase commit." +#~ msgstr "" +#~ "``confapplier`` обеспечивает валидацию и применение конфигурации в масштабе " +#~ "всего кластера с помощью двухфазной фиксации." + +#~ msgid "``auth`` manages authentication." +#~ msgstr "``auth`` управляет аутентификацией." + +#~ msgid "``pool`` reuses Tarantool's ``net.box`` connections." +#~ msgstr "``pool`` повторно использует соединения ``net.box`` в Tarantool." + +#~ msgid "``admin`` implements administration functions." +#~ msgstr "``admin`` обеспечивает функции администрирования." + +#~ msgid "" +#~ "`cartridge-cli `_ is the command-" +#~ "line interface for the ``cartridge`` module." +#~ msgstr "" +#~ "`cartridge-cli `_ -- это интерфейс" +#~ " командной строки для модуля ``cartridge``." + +#~ msgid "" +#~ "`space-explorer " +#~ "`_ is a module for exploring Tarantool spaces in ``cartridge``." +#~ msgstr "" +#~ "`space-explorer " +#~ "`_ -- модуль для просмотра спейсов Tarantool в ``cartridge``." + +#~ msgid "" +#~ "See also other useful `tarantoolctl commands " +#~ "`_ for " +#~ "managing Tarantool modules." +#~ msgstr "" +#~ "Для получения информации об управлении модулями Tarantool см. также другие " +#~ "важные `команды tarantoolctl `_." diff --git a/locale/ru/LC_MESSAGES/enterprise/security.po b/locale/ru/LC_MESSAGES/enterprise/security.po index 90fe0bb1bc..f6e08f8dab 100755 --- a/locale/ru/LC_MESSAGES/enterprise/security.po +++ b/locale/ru/LC_MESSAGES/enterprise/security.po @@ -2,86 +2,70 @@ msgid "Security hardening guide" msgstr "Инструкции по повышению безопасности" +#, fuzzy msgid "" -"This guide explains how to enhance security in your Tarantool Enterprise Edition's " -"cluster using built-in features and provides general recommendations on " -"security hardening." +"This guide explains how to enhance security in your Tarantool Enterprise " +"Edition's cluster using built-in features and provides general " +"recommendations on security hardening. If you need to perform a security " +"audit of a Tarantool Enterprise cluster, refer to the :doc:`security " +"checklist `." msgstr "" "В данном руководстве объясняется, как обеспечить безопасность в кластере " "Tarantool Enterprise, используя встроенные функции, и даются общие " "рекомендации по повышению безопасности." +#, fuzzy msgid "" -"Tarantool Enterprise Edition does not provide a dedicated API for security control. " -"All the necessary configuration can be done via an administrative console or" -" initialization code." +"Tarantool Enterprise Edition does not provide a dedicated API for security " +"control. All the necessary configurations can be done via an administrative " +"console or initialization code." msgstr "" "В Tarantool Enterprise нет выделенного API для контроля безопасности. Все " "необходимые настройки можно выполнить через административную консоль или код" " инициализации." -msgid "Built-in security features" -msgstr "Встроенные средства безопасности" - -msgid "Tarantool Enterprise Edition has the following built-in security features:" +msgid "" +"Tarantool Enterprise Edition has the following built-in security features:" msgstr "" "В Tarantool Enterprise есть следующие встроенные средства безопасности:" -msgid "authentication," -msgstr "аутентификация," - -msgid "access control," -msgstr "управление доступом," - -msgid "audit log;" -msgstr "журнал аудита;" - -msgid "And backup functionality:" -msgstr "А также функции резервного копирования:" +msgid ":ref:`authentication `" +msgstr "" -msgid "" -"`snapshotting `_ " -"(physical)," +msgid ":ref:`access control `" msgstr "" -"`создание снимков `_ " -"(физическое)," -msgid "`dumping `_ (logical)." -msgstr "`создание дампов `_ (логическое)." +msgid ":ref:`audit log `" +msgstr "" -msgid "" -"The following sections describe the features and provide links to detailed " -"documentation." +msgid ":ref:`traffic encryption `" msgstr "" -"В следующих разделах описаны эти функции и приведены ссылки на подробную " -"документацию." msgid "Authentication" msgstr "Аутентификация" msgid "" -"Tarantool Enterprise Edition supports password-based authentication and allows for " -"two types of connections:" +"Tarantool Enterprise Edition supports password-based authentication and " +"allows for two types of connections:" msgstr "" "Tarantool Enterprise поддерживает аутентификацию на основе паролей и " "допускает два типа соединений:" +#, fuzzy msgid "" -"via an `administrative console " -"`_ " -"and" +"Via an :doc:`administrative console `." msgstr "" -"через `административную консоль " -"`_ и" +"через `административную консоль `_ и" +#, fuzzy msgid "" -"over a binary port for read and write operations and procedure invocation." +"Over a binary port for read and write operations and procedure invocation." msgstr "через двоичный порт для операций чтения / записи и вызова процедур." +#, fuzzy msgid "" "For more information on authentication and connection types, see the " -"`security section of the Tarantool manual " -"`_." +":doc:`Security ` section of the Tarantool manual." msgstr "" "Для получения дополнительной информации об аутентификации и типах соединений" " см. `раздел по безопасности в руководстве по Tarantool " @@ -91,26 +75,27 @@ msgid "In addition, Tarantool provides the following functionality:" msgstr "" "Кроме того, Tarantool предоставляет следующие функциональные возможности:" +#, fuzzy msgid "" -"`sessions " -"`_ -- states which associate connections with users and make " -"Tarantool API available to them after authentication," +":ref:`Sessions ` -- states which associate " +"connections with users and make Tarantool API available to them after " +"authentication." msgstr "" -"`сеансы `_ -- состояния, которые связывают соединения с пользователями " -"и предоставляют доступ к API Tarantool после аутентификации," +"`сеансы `_ -- состояния, " +"которые связывают соединения с пользователями и предоставляют доступ к API " +"Tarantool после аутентификации," +#, fuzzy msgid "" -"authentication `triggers " -"`_ which execute " +"Authentication :ref:`triggers `, which execute " "actions on authentication events." msgstr "" -"`триггеры `_ " -"аутентификации, которые выполняют действия при событиях аутентификации." +"`триггеры `_ аутентификации, которые выполняют действия" +" при событиях аутентификации." +#, fuzzy msgid "" -"third-party (external) authentication protocols and services such as LDAP or" +"Third-party (external) authentication protocols and services such as LDAP or" " Active Directory -- supported in the web interface, but unavailable on the " "binary-protocol level." msgstr "" @@ -122,8 +107,8 @@ msgid "Access control" msgstr "Управление доступом" msgid "" -"Tarantool Enterprise Edition provides the means for administrators to prevent " -"unauthorized access to the database and to certain functions." +"Tarantool Enterprise Edition provides the means for administrators to " +"prevent unauthorized access to the database and to certain functions." msgstr "" "Для администраторов Tarantool Enterprise предоставляет средства " "предотвращения несанкционированного доступа к базе данных и к определенным " @@ -132,139 +117,448 @@ msgstr "" msgid "Tarantool recognizes:" msgstr "Tarantool различает:" -msgid "different users (guests and administrators)," +#, fuzzy +msgid "different users (guests and administrators)" msgstr "разных пользователей (гостей и администраторов)," -msgid "**privileges** associated with users," +#, fuzzy +msgid "privileges associated with users" msgstr "**права**, связанные с пользователями," -msgid "**roles** (containers for privileges) granted to users;" +#, fuzzy +msgid "roles (containers for privileges) granted to users" msgstr "**роли** (контейнеры для ролей), выданные пользователям;" -msgid "And divides system space into:" -msgstr "И хранит информацию о доступе в системных спейсах:" +msgid "The following system spaces are used to store users and privileges:" +msgstr "" +#, fuzzy msgid "" -"``_user`` space to store usernames and hashed passwords for authentication," +"The ``_user`` space to store usernames and hashed passwords for " +"authentication." msgstr "" "спейс ``_user`` для хранения имен пользователей и хеш-паролей для " "аутентификации," -msgid "``_priv`` space to store privileges for access control." +#, fuzzy +msgid "The ``_priv`` space to store privileges for access control." msgstr "спейс ``_priv`` для хранения прав доступа." +#, fuzzy msgid "" -"For more information, see the `access control section of the Tarantool " -"manual " -"`_." +"For more information, see the :ref:`Access control ` " +"section." msgstr "" "Для получения дополнительной информации см. `раздел по управлению доступом в" -" руководстве по Tarantool " -"`_." +#, fuzzy msgid "" "Users who create **objects** (spaces, indexes, users, roles, sequences, and " "functions) in the database become their **owners** and automatically acquire" -" privileges for what they create. For more information, see the `owners and " -"privileges section of the Tarantool manual " -"`_." +" privileges for what they create. For more information, see the :ref:`Owners" +" and privileges ` section." msgstr "" "Пользователи, которые создают **объекты** (спейсы, индексы, пользователей, " "роли, последовательности и функции) в базе данных становятся их " "**владельцами** и автоматически получают права на то, что они создают. Для " "получения дополнительной информации см. `раздел о владельцах и правах в " -"руководстве по Tarantool " -"`_." +#, fuzzy +msgid "Authentication restrictions" +msgstr "Аутентификация" + +msgid "" +"Tarantool Enterprise Edition provides the ability to apply additional " +"restrictions for user authentication. For example, you can specify the " +"minimum time between authentication attempts or disable access for guest " +"users." +msgstr "" + +#, fuzzy +msgid "" +"The following :doc:`configuration options ` " +"are available:" +msgstr "" +"`раздел по журналированию в справочнике по настройке " +"`_," + +msgid ":ref:`auth_delay `" +msgstr "" + +msgid ":ref:`disable_guest `" +msgstr "" + +msgid "" +"Specifies a period of time (in seconds) that a specific user should wait for" +" the next attempt after failed authentication." +msgstr "" + +msgid "" +"With the configuration below, Tarantool refuses the authentication attempt " +"if the previous attempt was less than 5 seconds ago." +msgstr "" + +msgid "box.cfg{ auth_delay = 5 }" +msgstr "" + +msgid "Since version: 2.11" +msgstr "" + +msgid "Type: number" +msgstr "" + +msgid "Default: 0" +msgstr "" + +msgid "Environment variable: TT_AUTH_DELAY" +msgstr "" + +msgid "Dynamic: **yes**" +msgstr "" + +msgid "" +"If **true**, disables access over remote connections from unauthenticated or" +" :ref:`guest access ` users. This option affects " +"both :doc:`net.box ` and :ref:`replication" +" ` connections." +msgstr "" + +msgid "Type: boolean" +msgstr "" + +msgid "Default: false" +msgstr "" + +msgid "Environment variable: TT_DISABLE_GUEST" +msgstr "" + +msgid "Password policy" +msgstr "" + +msgid "" +"A password policy allows you to improve database security by enforcing the " +"use of strong passwords, setting up a maximum password age, and so on. When " +"you create a new user with :doc:`box.schema.user.create " +"` or update the password of" +" an existing user with :doc:`box.schema.user.passwd " +"`, the password is checked " +"against the configured password policy settings." +msgstr "" + +msgid ":ref:`password_min_length `" +msgstr "" + +msgid ":ref:`password_enforce_uppercase `" +msgstr "" + +msgid ":ref:`password_enforce_lowercase `" +msgstr "" + +msgid ":ref:`password_enforce_digits `" +msgstr "" + +msgid "" +":ref:`password_enforce_specialchars `" +msgstr "" + +msgid ":ref:`password_lifetime_days `" +msgstr "" + +msgid ":ref:`password_history_length `" +msgstr "" + +msgid "Specifies the minimum number of characters for a password." +msgstr "" + +msgid "" +"The following example shows how to set the minimum password length to 10." +msgstr "" + +msgid "box.cfg{ password_min_length = 10 }" +msgstr "" + +msgid "Type: integer" +msgstr "" + +msgid "Environment variable: TT_PASSWORD_MIN_LENGTH" +msgstr "" + +msgid "If **true**, a password should contain uppercase letters (A-Z)." +msgstr "" + +msgid "Environment variable: TT_PASSWORD_ENFORCE_UPPERCASE" +msgstr "" + +msgid "If **true**, a password should contain lowercase letters (a-z)." +msgstr "" + +msgid "Environment variable: TT_PASSWORD_ENFORCE_LOWERCASE" +msgstr "" + +msgid "If **true**, a password should contain digits (0-9)." +msgstr "" + +msgid "Environment variable: TT_PASSWORD_ENFORCE_DIGITS" +msgstr "" + +msgid "" +"If **true**, a password should contain at least one special character (such " +"as ``&|?!@$``)." +msgstr "" + +msgid "Environment variable: TT_PASSWORD_ENFORCE_SPECIALCHARS" +msgstr "" + +msgid "" +"Specifies the maximum period of time (in days) a user can use the same " +"password. When this period ends, a user gets the \"Password expired\" error " +"on a login attempt. To restore access for such users, use " +":doc:`box.schema.user.passwd " +"`." +msgstr "" + +msgid "The default 0 value means that a password never expires." +msgstr "" + +msgid "The example below shows how to set a maximum password age to 365 days." +msgstr "" + +msgid "box.cfg{ password_lifetime_days = 365 }" +msgstr "" + +msgid "Environment variable: TT_PASSWORD_LIFETIME_DAYS" +msgstr "" + +msgid "" +"Specifies the number of unique new user passwords before an old password can" +" be reused." +msgstr "" + +msgid "" +"In the example below, a new password should differ from the last three " +"passwords." +msgstr "" + +msgid "box.cfg{ password_history_length = 3 }" +msgstr "" + +msgid "Environment variable: TT_PASSWORD_HISTORY_LENGTH" +msgstr "" + +msgid "" +"Tarantool uses the ``auth_history`` field in the :doc:`box.space._user " +"` system space to store user " +"passwords." +msgstr "" + +#, fuzzy +msgid "Authentication protocol" +msgstr "Аутентификация" + +msgid "" +"By default, Tarantool uses the `CHAP " +"`_ protocol to authenticate users and " +"applies ``SHA-1`` hashing to :ref:`passwords `. " +"Note that CHAP stores password hashes in the ``_user`` space unsalted. If an" +" attacker gains access to the database, they may crack a password, for " +"example, using a `rainbow table " +"`_." +msgstr "" + +msgid "" +"In the Enterprise Edition, you can enable `PAP " +"`_ " +"authentication with the ``SHA256`` hashing algorithm. For PAP, a password is" +" salted with a user-unique salt before saving it in the database, which " +"keeps the database protected from cracking using a rainbow table." +msgstr "" + +msgid "To enable PAP, specify the ``box.cfg.auth_type`` option as follows:" +msgstr "" + +msgid "box.cfg{ auth_type = 'pap-sha256' }" +msgstr "" + +msgid "Type: string" +msgstr "" + +msgid "Default value: 'chap-sha1'" +msgstr "" + +msgid "Possible values: 'chap-sha1', 'pap-sha256'" +msgstr "" + +msgid "Environment variable: TT_AUTH_TYPE" +msgstr "" + +msgid "" +"For new users, the :doc:`box.schema.user.create " +"` method will generate " +"authentication data using ``PAP-SHA256``. For existing users, you need to " +"reset a password using :doc:`box.schema.user.passwd " +"` to use the new " +"authentication protocol." +msgstr "" + +msgid "" +"Given that ``PAP`` transmits a password as plain text, Tarantool requires " +"configuring :ref:`SSL/TLS ` for a " +"connection." +msgstr "" + +msgid "" +"The examples below show how to specify the authentication protocol on the " +"client side:" +msgstr "" + +msgid "" +"For :doc:`net.box `, you can specify the " +"authentication protocol using the ``auth_type`` URI parameter or the " +"corresponding connection option:" +msgstr "" + +msgid "" +"-- URI parameters\n" +"conn = require('net.box').connect(\n" +" 'username:password@localhost:3301?auth_type=pap-sha256')\n" +"\n" +"-- URI parameters table\n" +"conn = require('net.box').connect({\n" +" uri = 'username:password@localhost:3301',\n" +" params = {auth_type = 'pap-sha256'},\n" +"})\n" +"\n" +"-- Connection options\n" +"conn = require('net.box').connect('localhost:3301', {\n" +" user = 'username',\n" +" password = 'password',\n" +" auth_type = 'pap-sha256',\n" +"})" +msgstr "" + +msgid "" +"For :ref:`replication configuration `," +" the authentication protocol can be specified in URI parameters:" +msgstr "" + +msgid "" +"-- URI parameters\n" +"box.cfg{\n" +" replication = {\n" +" 'replicator:password@localhost:3301?auth_type=pap-sha256',\n" +" },\n" +"}\n" +"\n" +"-- URI parameters table\n" +"box.cfg{\n" +" replication = {\n" +" {\n" +" uri = 'replicator:password@localhost:3301',\n" +" params = {auth_type = 'pap-sha256'},\n" +" },\n" +" },\n" +"}" +msgstr "" + +msgid "" +"If the authentication protocol isn't specified explicitly on the client " +"side, the client uses the protocol configured on the server via " +"``box.cfg.auth_type``." +msgstr "" + msgid "Audit log" msgstr "Журнал аудита" msgid "" -"Tarantool Enterprise Edition has a built-in audit log that records events such as:" +"Tarantool Enterprise Edition has a built-in audit log that records events " +"such as:" msgstr "" "В Tarantool Enterprise есть встроенный журнал аудита, в котором записываются" " такие события, как:" -msgid "authentication successes and failures;" +#, fuzzy +msgid "authentication successes and failures" msgstr "пройденная и непройденная аутентификации;" -msgid "connection closures;" +#, fuzzy +msgid "connection closures" msgstr "закрытие подключения;" -msgid "creation, removal, enabling, and disabling of users;" +#, fuzzy +msgid "creation, removal, enabling, and disabling of users" msgstr "создание, удаление, включение и отключение пользователей;" -msgid "changes of passwords, privileges, and roles;" +#, fuzzy +msgid "changes of passwords, privileges, and roles" msgstr "изменение паролей, прав и ролей;" -msgid "denials of access to database objects;" +#, fuzzy +msgid "denials of access to database objects" msgstr "отказ в доступе к объектам базы данных;" -msgid "Audit log contains:" +#, fuzzy +msgid "The audit log contains:" msgstr "В журнале аудита указываются:" -msgid "timestamps," +#, fuzzy +msgid "timestamps" msgstr "отметки времени," -msgid "usernames of users who performed actions," +#, fuzzy +msgid "usernames of users who performed actions" msgstr "имена пользователей, которые выполняли действия," +#, fuzzy msgid "" -"event types (e.g. ``user_create``, ``user_enable``, ``disconnect``, etc)," +"event types (e.g. ``user_create``, ``user_enable``, ``disconnect``, etc)" msgstr "" "типы событий (например, ``user_create``, ``user_enable``, ``disconnect`` и " "т.д.)," -msgid "descriptions." +#, fuzzy +msgid "descriptions" msgstr "описание." -msgid "Audit log has two configuration parameters:" -msgstr "Есть два конфигурационных параметра для настройки журнала аудита:" +msgid "You can configure the following audit log parameters:" +msgstr "" +#, fuzzy msgid "" -"``audit_log = `` which is similar to the `log " -"`_ parameter; it tells Tarantool to record audit events to a specific " -"file;" +"``audit_log = `` which is similar to the :ref:`log " +"` parameter. This parameter tells Tarantool to record audit" +" events to a specific file." msgstr "" "``audit_log = ``, аналог параметра `log " -"`_; если данный параметр задан, то Tarantool записывает события, " -"подлежащие аудиту, в указанный файл;" +"`_; если данный параметр задан, " +"то Tarantool записывает события, подлежащие аудиту, в указанный файл;" +#, fuzzy msgid "" -"``audit_nonblock`` which is similar to the `log_nonblock " -"`_ parameter." +"``audit_nonblock`` which is similar to the :ref:`log_nonblock ` parameter." msgstr "" "``audit_nonblock``, аналог параметра `log_nonblock " -"`_." +"`_." msgid "For more information on logging, see the following:" msgstr "" "Для получения дополнительной информации о журналировании см. следующие " "разделы:" -msgid "" -"`logs section of the Tarantool manual " -"`_," +msgid "the :doc:`Logs ` section" msgstr "" -"`раздел о журналах в руководстве по Tarantool " -"`_," msgid "" -"`logging section of the configuration reference " -"`_," +"the :ref:`Logging ` section in the configuration reference" msgstr "" -"`раздел по журналированию в справочнике по настройке " -"`_," -msgid ":ref:`Audit module ` in this document." +#, fuzzy +msgid "the :ref:`Tarantool audit module ` topic" msgstr ":ref:`Журнал аудита ` данного документа." msgid "" @@ -274,6 +568,439 @@ msgstr "" "Права доступа к файлам журнала можно настроить, как для любого другого " "объекта файловой системы Unix -- через ``chmod``." +msgid "Traffic encryption" +msgstr "Криптографическая защита трафика" + +msgid "" +"Since version 2.10.0, Tarantool Enterprise Edition has the built-in support " +"for using SSL to encrypt the client-server communications over :ref:`binary " +"connections `, that is, between Tarantool " +"instances in a cluster or connecting to an instance via connectors using " +":doc:`net.box `." +msgstr "" + +msgid "" +"Tarantool uses the OpenSSL library that is included in the delivery package." +" Please note that SSL connections use only TLSv1.2." +msgstr "" + +#, fuzzy +msgid "Configuration" +msgstr "Настройка брандмауэра" + +msgid "" +"To configure traffic encryption, you need to set the special :ref:`URI " +"parameters ` for a particular connection. The " +"parameters can be set for the following ``box.cfg`` options and ``nex.box`` " +"method:" +msgstr "" + +msgid ":ref:`box.cfg.listen ` -- on the server side." +msgstr "" + +msgid "" +":ref:`box.cfg.replication `--on the client " +"side." +msgstr "" + +msgid ":ref:`net_box_object.connect() `--on the client side." +msgstr "" + +msgid "" +"Below is the list of the parameters. In the :ref:`next section `, you can find details and examples on what " +"should be configured on both the server side and the client side." +msgstr "" + +msgid "" +"``transport`` -- enables SSL encryption for a connection if set to ``ssl``. " +"The default value is ``plain``, which means the encryption is off. If the " +"parameter is not set, the encryption is off too. Other encryption-related " +"parameters can be used only if the ``transport = 'ssl'`` is set." +msgstr "" + +msgid "Example:" +msgstr "" + +msgid "" +"c = require('net.box').connect({\n" +" uri = 'localhost:3301',\n" +" params = {transport = 'ssl'}\n" +"})" +msgstr "" + +msgid "" +"``ssl_key_file`` -- a path to a private SSL key file. Mandatory for a " +"server. For a client, it's mandatory if the ``ssl_ca_file`` parameter is set" +" for a server; otherwise, optional. If the private key is encrypted, provide" +" a password for it in the ``ssl_password`` or ``ssl_password_file`` " +"parameter." +msgstr "" + +msgid "" +"``ssl_cert_file`` -- a path to an SSL certificate file. Mandatory for a " +"server. For a client, it's mandatory if the ``ssl_ca_file`` parameter is set" +" for a server; otherwise, optional." +msgstr "" + +msgid "" +"``ssl_ca_file`` -- a path to a trusted certificate authorities (CA) file. " +"Optional. If not set, the peer won't be checked for authenticity." +msgstr "" + +msgid "Both a server and a client can use the ``ssl_ca_file`` parameter:" +msgstr "" + +msgid "If it's on the server side, the server verifies the client." +msgstr "" + +msgid "If it's on the client side, the client verifies the server." +msgstr "" + +msgid "" +"If both sides have the CA files, the sever and the client verify each other." +msgstr "" + +msgid "" +"``ssl_ciphers`` -- a colon-separated (``:``) list of SSL cipher suites the " +"connection can use. See the :ref:`enterprise-iproto-encryption-ciphers` " +"section for details. Optional. Note that the list is not validated: if a " +"cipher suite is unknown, Tarantool just ignores it, doesn't establish the " +"connection and writes to the log that no shared cipher found." +msgstr "" + +msgid "" +"``ssl_password`` -- a password for an encrypted private SSL key. Optional. " +"Alternatively, the password can be provided in ``ssl_password_file``." +msgstr "" + +msgid "" +"``ssl_password_file`` -- a text file with one or more passwords for " +"encrypted private SSL keys (each on a separate line). Optional. " +"Alternatively, the password can be provided in ``ssl_password``." +msgstr "" + +msgid "" +"Tarantool applies the ``ssl_password`` and ``ssl_password_file`` parameters " +"in the following order:" +msgstr "" + +msgid "" +"If ``ssl_password`` is provided, Tarantool tries to decrypt the private key " +"with it." +msgstr "" + +msgid "" +"If ``ssl_password`` is incorrect or isn't provided, Tarantool tries all " +"passwords from ``ssl_password_file`` one by one in the order they are " +"written." +msgstr "" + +msgid "" +"If ``ssl_password`` and all passwords from ``ssl_password_file`` are " +"incorrect, or none of them is provided, Tarantool treats the private key as " +"unencrypted." +msgstr "" + +msgid "Configuration example:" +msgstr "" + +msgid "" +"box.cfg{ listen = {\n" +" uri = 'localhost:3301',\n" +" params = {\n" +" transport = 'ssl',\n" +" ssl_key_file = '/path_to_key_file',\n" +" ssl_cert_file = '/path_to_cert_file',\n" +" ssl_ciphers = 'HIGH:!aNULL',\n" +" ssl_password = 'topsecret'\n" +" }\n" +"}}" +msgstr "" + +msgid "Supported ciphers" +msgstr "" + +#, fuzzy +msgid "Tarantool Enterprise supports the following cipher suites:" +msgstr "" +"В Tarantool Enterprise есть следующие встроенные средства безопасности:" + +msgid "ECDHE-ECDSA-AES256-GCM-SHA384" +msgstr "" + +msgid "ECDHE-RSA-AES256-GCM-SHA384" +msgstr "" + +msgid "DHE-RSA-AES256-GCM-SHA384" +msgstr "" + +msgid "ECDHE-ECDSA-CHACHA20-POLY1305" +msgstr "" + +msgid "ECDHE-RSA-CHACHA20-POLY1305" +msgstr "" + +msgid "DHE-RSA-CHACHA20-POLY1305" +msgstr "" + +msgid "ECDHE-ECDSA-AES128-GCM-SHA256" +msgstr "" + +msgid "ECDHE-RSA-AES128-GCM-SHA256" +msgstr "" + +msgid "DHE-RSA-AES128-GCM-SHA256" +msgstr "" + +msgid "ECDHE-ECDSA-AES256-SHA384" +msgstr "" + +msgid "ECDHE-RSA-AES256-SHA384" +msgstr "" + +msgid "DHE-RSA-AES256-SHA256" +msgstr "" + +msgid "ECDHE-ECDSA-AES128-SHA256" +msgstr "" + +msgid "ECDHE-RSA-AES128-SHA256" +msgstr "" + +msgid "DHE-RSA-AES128-SHA256" +msgstr "" + +msgid "ECDHE-ECDSA-AES256-SHA" +msgstr "" + +msgid "ECDHE-RSA-AES256-SHA" +msgstr "" + +msgid "DHE-RSA-AES256-SHA" +msgstr "" + +msgid "ECDHE-ECDSA-AES128-SHA" +msgstr "" + +msgid "ECDHE-RSA-AES128-SHA" +msgstr "" + +msgid "DHE-RSA-AES128-SHA" +msgstr "" + +msgid "AES256-GCM-SHA384" +msgstr "" + +msgid "AES128-GCM-SHA256" +msgstr "" + +msgid "AES256-SHA256" +msgstr "" + +msgid "AES128-SHA256" +msgstr "" + +msgid "AES256-SHA" +msgstr "" + +msgid "AES128-SHA" +msgstr "" + +msgid "GOST2012-GOST8912-GOST8912" +msgstr "" + +msgid "GOST2001-GOST89-GOST89" +msgstr "" + +msgid "" +"Tarantool Enterprise static build has the embeded engine to support the GOST" +" cryptographic algorithms. If you use these algorithms for traffic " +"encryption, specify the corresponding cipher suite in the ``ssl_ciphers`` " +"parameter, for example:" +msgstr "" + +msgid "" +"box.cfg{ listen = {\n" +" uri = 'localhost:3301',\n" +" params = {\n" +" transport = 'ssl',\n" +" ssl_key_file = '/path_to_key_file',\n" +" ssl_cert_file = '/path_to_cert_file',\n" +" ssl_ciphers = 'GOST2012-GOST8912-GOST8912'\n" +" }\n" +"}}" +msgstr "" + +msgid "" +"For detailed information on SSL ciphers and their syntax, refer to `OpenSSL " +"documentation `__." +msgstr "" + +msgid "Using environment variables" +msgstr "" + +msgid "" +"The URI parameters for traffic encryption can also be set via environment " +"variables. For example:" +msgstr "" + +msgid "" +"export " +"TT_LISTEN=\"localhost:3301?transport=ssl&ssl_cert_file=/path_to_cert_file&ssl_key_file=/path_to_key_file\"" +msgstr "" + +msgid "" +"For details, refer to the Tarantool :ref:`configuration reference `." +msgstr "" + +msgid "Server-client configuration details" +msgstr "" + +msgid "" +"When configuring the traffic encryption, you need to specify the necessary " +"parameters on both the server side and the client side. Below you can find " +"the summary on the options and parameters to be used and :ref:`examples of " +"configuration `." +msgstr "" + +msgid "**Server side**" +msgstr "" + +msgid "Is configured via the ``box.cfg.listen`` option." +msgstr "" + +msgid "" +"Mandatory URI parameters: ``transport``, ``ssl_key_file`` and " +"``ssl_cert_file``." +msgstr "" + +msgid "" +"Optional URI parameters: ``ssl_ca_file``, ``ssl_ciphers``, ``ssl_password``," +" and ``ssl_password_file``." +msgstr "" + +msgid "**Client side**" +msgstr "" + +msgid "" +"Is configured via the ``box.cfg.replication`` option (see :ref:`details " +"`) or " +"``net_box_object.connect()``." +msgstr "" + +msgid "Parameters:" +msgstr "" + +msgid "" +"If the server side has only the ``transport``, ``ssl_key_file`` and " +"``ssl_cert_file`` parameters set, on the client side, you need to specify " +"only ``transport = ssl`` as the mandatory parameter. All other URI " +"parameters are optional." +msgstr "" + +msgid "" +"If the server side also has the ``ssl_ca_file`` parameter set, on the client" +" side, you need to specify ``transport``, ``ssl_key_file`` and " +"``ssl_cert_file`` as the mandatory parameters. Other parameters -- " +"``ssl_ca_file``, ``ssl_ciphers``, ``ssl_password``, and " +"``ssl_password_file`` -- are optional." +msgstr "" + +msgid "Configuration examples" +msgstr "" + +msgid "" +"Suppose, there is a :ref:`master-replica ` set with two Tarantool instances:" +msgstr "" + +msgid "127.0.0.1:3301 -- master (server)" +msgstr "" + +msgid "127.0.0.1:3302 -- replica (client)." +msgstr "" + +msgid "" +"Examples below show the configuration related to connection encryption for " +"two cases: when the trusted certificate authorities (CA) file is not set on " +"the server side and when it does. Only mandatory URI parameters are " +"mentioned in these examples." +msgstr "" + +msgid "**Without CA**" +msgstr "" + +msgid "" +"box.cfg{\n" +" listen = {\n" +" uri = '127.0.0.1:3301',\n" +" params = {\n" +" transport = 'ssl',\n" +" ssl_key_file = '/path_to_key_file',\n" +" ssl_cert_file = '/path_to_cert_file'\n" +" }\n" +" }\n" +"}" +msgstr "" + +msgid "127.0.0.1:3302 -- replica (client)" +msgstr "" + +msgid "" +"box.cfg{\n" +" listen = {\n" +" uri = '127.0.0.1:3302',\n" +" params = {transport = 'ssl'}\n" +" },\n" +" replication = {\n" +" uri = 'username:password@127.0.0.1:3301',\n" +" params = {transport = 'ssl'}\n" +" },\n" +" read_only = true\n" +"}" +msgstr "" + +msgid "**With CA**" +msgstr "" + +msgid "" +"box.cfg{\n" +" listen = {\n" +" uri = '127.0.0.1:3301',\n" +" params = {\n" +" transport = 'ssl',\n" +" ssl_key_file = '/path_to_key_file',\n" +" ssl_cert_file = '/path_to_cert_file',\n" +" ssl_ca_file = '/path_to_ca_file'\n" +" }\n" +" }\n" +"}" +msgstr "" + +msgid "" +"box.cfg{\n" +" listen = {\n" +" uri = '127.0.0.1:3302',\n" +" params = {\n" +" transport = 'ssl',\n" +" ssl_key_file = '/path_to_key_file',\n" +" ssl_cert_file = '/path_to_cert_file'\n" +" }\n" +" },\n" +" replication = {\n" +" uri = 'username:password@127.0.0.1:3301',\n" +" params = {\n" +" transport = 'ssl',\n" +" ssl_key_file = '/path_to_key_file',\n" +" ssl_cert_file = '/path_to_cert_file'\n" +" }\n" +" },\n" +" read_only = true\n" +"}" +msgstr "" + msgid "Recommendations on security hardening" msgstr "Рекомендации по повышению безопасности" @@ -284,16 +1011,21 @@ msgstr "" "В этом разделе даны рекомендации, которые могут помочь вам повысить " "безопасность кластера." -msgid "Traffic encryption" -msgstr "Криптографическая защита трафика" +msgid "Encrypting traffic" +msgstr "" msgid "" -"Tarantool Enterprise does not encrypt traffic over binary connections (i.e.," -" between servers in the cluster). To secure such connections, consider:" +"Since version 2.10.0, Tarantool Enterprise Edition has built-in support for " +"using SSL to encrypt the client-server communications over binary " +"connections, that is, between Tarantool instances in a cluster. For details " +"on enabling SSL encryption, see the :ref:`enterprise-iproto-encryption` " +"section of this guide." +msgstr "" + +msgid "" +"In case the built-in encryption is not set for particular connections, " +"consider the following security recommendations:" msgstr "" -"Tarantool Enterprise не шифрует трафик, проходящий через двоичные соединения" -" (т.е. между серверами в кластере). Чтобы защитить такие соединения, " -"рекомендуется:" msgid "setting up connection tunneling, or" msgstr "настроить туннелирование соединения или" @@ -301,18 +1033,20 @@ msgstr "настроить туннелирование соединения и msgid "encrypting the actual data stored in the database." msgstr "зашифровать сами данные, которые хранятся в базе." +#, fuzzy msgid "" -"For more information on data encryption, see the `crypto module reference " -"`_." +"For more information on data encryption, see the :doc:`crypto module " +"reference `." msgstr "" "Для получения дополнительной информации см. `справочник по модулю crypto " "`_." +#, fuzzy msgid "" "The `HTTP server module `_ provided by " "rocks does not support the HTTPS protocol. To set up a secure connection for" " a client (e.g., REST service), consider hiding the Tarantool instance " -"(router if it is a cluster of instances) behind a Nginx server and setting " +"(router if it is a cluster of instances) behind an Nginx server and setting " "up an SSL certificate for it." msgstr "" "`Модуль HTTP-сервера `_ из сторонних " @@ -321,26 +1055,26 @@ msgstr "" "экземпляр Tarantool (роутер, если это кластер экземпляров) за сервером Nginx" " и настроить для него сертификат SSL." +#, fuzzy msgid "" "To make sure that no information can be intercepted 'from the wild', run " -"Nginx on the same physical server as the instance and set up their " -"communication over a Unix socket. For more information, see the `socket " -"module reference " -"`_." +"nginx on the same physical server as the instance and set up their " +"communication over a Unix socket. For more information, see the :doc:`socket" +" module reference `." msgstr "" "Чтобы убедиться, что никакая информация не может быть перехвачена извне, " "запустите Nginx на том же физическом сервере, что и экземпляр, и настройте " "их связь по Unix-сокету. Для получения дополнительной информации см. " -"`справочник по модулю socket " -"`_." +"`справочник по модулю socket `_." msgid "Firewall configuration" msgstr "Настройка брандмауэра" +#, fuzzy msgid "" "To protect the cluster from any unwanted network activity 'from the wild', " "configure the firewall on each server to allow traffic on ports listed in " -":ref:`network requirements `." +":ref:`Network requirements `." msgstr "" "Чтобы защитить кластер от нежелательной сетевой активности извне, настройте " "брандмауэр на каждом сервере, чтобы разрешить трафик через порты, " @@ -368,13 +1102,14 @@ msgstr "" msgid "Data integrity" msgstr "Целостность данных" +#, fuzzy msgid "" -"Tarantool Enterprise does not keep checksums or provide the means to control" -" data integrity. However, it ensures data persistence using a write ahead " -"log, regularly snapshots the entire data set to disk, and checks the data " -"format whenever it reads the data back from the disk. For more information, " -"see the `data persistence section of the Tarantool manual " -"`_." +"Tarantool Enterprise Edition does not keep checksums or provide the means to" +" control data integrity. However, it ensures data persistence using a write-" +"ahead log, regularly snapshots the entire data set to disk, and checks the " +"data format whenever it reads the data back from the disk. For more " +"information, see the :ref:`Data persistence ` " +"section." msgstr "" "Tarantool Enterprise не хранит контрольные суммы и не предоставляет " "инструменты для контроля целостности данных. Тем не менее, он обеспечивает " @@ -401,3 +1136,48 @@ msgstr "" #~ msgstr "" #~ "Tarantool Enterprise не поддерживает сторонние (внешние) протоколы или " #~ "сервисы аутентификации, такие как LDAP или Active Directory." + +#~ msgid "Built-in security features" +#~ msgstr "Встроенные средства безопасности" + +#~ msgid "authentication," +#~ msgstr "аутентификация," + +#~ msgid "access control," +#~ msgstr "управление доступом," + +#~ msgid "audit log;" +#~ msgstr "журнал аудита;" + +#~ msgid "And backup functionality:" +#~ msgstr "А также функции резервного копирования:" + +#~ msgid "`snapshotting `_ (physical)," +#~ msgstr "`создание снимков `_ (физическое)," + +#~ msgid "`dumping `_ (logical)." +#~ msgstr "`создание дампов `_ (логическое)." + +#~ msgid "" +#~ "The following sections describe the features and provide links to detailed " +#~ "documentation." +#~ msgstr "" +#~ "В следующих разделах описаны эти функции и приведены ссылки на подробную " +#~ "документацию." + +#~ msgid "And divides system space into:" +#~ msgstr "И хранит информацию о доступе в системных спейсах:" + +#~ msgid "Audit log has two configuration parameters:" +#~ msgstr "Есть два конфигурационных параметра для настройки журнала аудита:" + +#~ msgid "`logs section of the Tarantool manual `_," +#~ msgstr "`раздел о журналах в руководстве по Tarantool `_," + +#~ msgid "" +#~ "Tarantool Enterprise does not encrypt traffic over binary connections (i.e.," +#~ " between servers in the cluster). To secure such connections, consider:" +#~ msgstr "" +#~ "Tarantool Enterprise не шифрует трафик, проходящий через двоичные соединения" +#~ " (т.е. между серверами в кластере). Чтобы защитить такие соединения, " +#~ "рекомендуется:" diff --git a/locale/ru/LC_MESSAGES/enterprise/setup.po b/locale/ru/LC_MESSAGES/enterprise/setup.po index ca31d40a27..20a5754c93 100755 --- a/locale/ru/LC_MESSAGES/enterprise/setup.po +++ b/locale/ru/LC_MESSAGES/enterprise/setup.po @@ -2,9 +2,10 @@ msgid "Setup" msgstr "Настройка" +#, fuzzy msgid "" -"This chapter explains how to download and set up Tarantool Enterprise and " -"run a sample application provided with it." +"This chapter explains how to download and set up Tarantool Enterprise " +"Edition and run a sample application provided with it." msgstr "" "В этой главе объясняется, как загрузить и настроить Tarantool Enterprise, а " "также запустить пример приложения." @@ -64,6 +65,12 @@ msgstr "" "Требуется ``glibc`` версии 2.17-260.el7_6.6 и выше. Необходимо проверить " "текущую версию и обновить в случае необходимости:" +msgid "" +"$ rpm -q glibc\n" +"glibc-2.17-196.el7_4.2\n" +"$ yum update glibc" +msgstr "" + msgid "Network requirements" msgstr "Сетевые требования" @@ -92,6 +99,22 @@ msgstr "" "``config: advertise_uri: ':'`` в файле " "``/etc/tarantool/conf.d/*.yml`` для каждого экземпляра). Например:" +msgid "" +"# /etc/tarantool/conf.d/*.yml\n" +"\n" +"myapp.s2-replica:\n" +" advertise_uri: localhost:3305 # this is a TCP/UDP port\n" +" http_port: 8085\n" +"\n" +"all:\n" +" ...\n" +" hosts:\n" +" storage-1:\n" +" config:\n" +" advertise_uri: 'vm1:3301' # this is a TCP/UDP port\n" +" http_port: 8081" +msgstr "" + msgid "" "To configure remote monitoring or to connect via the administrative console," " the administration server should be able to access the following TCP ports " @@ -104,14 +127,12 @@ msgstr "" msgid "22 to use the SSH protocol," msgstr "22 -- чтобы использовать SSH-протокол;" -msgid "" -"ports specified in `instance configuration " -"`_ (``http_port`` parameter) to monitor the HTTP-metrics." +#, fuzzy +msgid "ports specified in instance configuration to monitor the HTTP-metrics." msgstr "" "к портам, указанным в `конфигурации экземпляра " -"`_ (параметр ``http_port``), для мониторинга HTTP-метрик." +"`_ (параметр " +"``http_port``), для мониторинга HTTP-метрик." msgid "" "Additionally, it is recommended to apply the following settings for " @@ -120,12 +141,19 @@ msgstr "" "Кроме того, рекомендуется применить следующие настройки для ``sysctl`` на " "всех серверах Tarantool:" +msgid "" +"$ # TCP KeepAlive setting\n" +"$ sysctl -w net.ipv4.tcp_keepalive_time=60\n" +"$ sysctl -w net.ipv4.tcp_keepalive_intvl=5\n" +"$ sysctl -w net.ipv4.tcp_keepalive_probes=5" +msgstr "" + msgid "" "This optional setup of the Linux network stack helps speed up the " "troubleshooting of network connectivity when the server physically fails. To" -" achieve maximum performance, you may also need to configure other " -"network stack parameters that are not specific to the Tarantool DBMS. For " -"more information, please refer to the `Network Performance Tuning Guide " +" achieve maximum performance, you may also need to configure other network " +"stack parameters that are not specific to the Tarantool DBMS. For more " +"information, please refer to the `Network Performance Tuning Guide " "`_" " section of the RHEL7 user documentation." msgstr "" @@ -141,16 +169,17 @@ msgstr "" msgid "Package contents" msgstr "Комплектация" +#, fuzzy msgid "" "The latest release packages of Tarantool Enterprise are available in the " "`customer zone " -"`_. " -"at Tarantool website. Please contact ``support@tarantool.io`` for access." +"`_ at " +"Tarantool website. Please contact ``support@tarantool.io`` for access." msgstr "" "Последние версии пакетов Tarantool Enterprise доступны в `разделе для " "клиентов " -"` _ " -"на веб-сайте Tarantool. Для получения доступа обратитесь в " +"` _ на " +"веб-сайте Tarantool. Для получения доступа обратитесь в " "``support@tarantool.io``." msgid "" @@ -160,16 +189,29 @@ msgstr "" "Каждый пакет представляет собой архив ``tar + gzip`` и включает в себя " "следующие компоненты и функции:" +#, fuzzy msgid "" -"static Tarantool binary for simplified deployment in Linux environments," +"Static Tarantool binary for simplified deployment in Linux environments." msgstr "" "статический бинарный файл Tarantool, чтобы упростить развертывание в средах " "Linux," -msgid "selection of open and closed source modules," +msgid "" +"``tt`` command-line utility that provides a unified command-line interface " +"for managing Tarantool-based applications. See :ref:`tt-cli` for details." +msgstr "" + +msgid "" +"|tcm_full_name| -- a web-based interface for managing Tarantool EE clusters." +" See :ref:`tcm` for details." +msgstr "" + +#, fuzzy +msgid "Selection of open and closed source modules." msgstr "набор модулей с открытым и закрытым исходным кодом," -msgid "sample application walking you through all included modules." +#, fuzzy +msgid "Sample application walking you through all included modules" msgstr "пример приложения, чтобы рассмотреть все включенные модули." msgid "Archive contents:" @@ -178,6 +220,12 @@ msgstr "Содержимое архива:" msgid "``tarantool`` is the main executable of Tarantool." msgstr "``tarantool`` -- основной исполняемый файл Tarantool." +msgid "``tt`` command-line utility." +msgstr "" + +msgid "``tcm`` is the |tcm_full_name| executable." +msgstr "" + msgid "" "``tarantoolctl`` is the utility script for installing supplementary modules " "and connecting to the administrative console." @@ -186,11 +234,9 @@ msgstr "" " подключения к административной консоли." msgid "" -"``cartridge`` is the utility script to help you set up a development " -"environment for applications and pack them for easy deployment." +"``tarantoolctl`` is deprecated in favor of the :ref:`tt CLI utility `." msgstr "" -"``cartridge`` -- служебный скрипт, который помогает настроить среду " -"разработки для приложений и упаковать их с целью упростить развертывание." msgid "``examples/`` is the directory containing sample applications:" msgstr "``examples/`` -- директория, которая содержит примеры приложений:" @@ -236,8 +282,7 @@ msgstr "" "``templates/`` -- директория, которая содержит файлы шаблонов для среды " "разработки приложений." -msgid "" -"``deprecated/`` is a set of modules that are no longer supported:" +msgid "``deprecated/`` is a set of modules that are no longer supported:" msgstr "" "``deprecated/`` -- это набор модулей, которые больше не поддерживаются:" @@ -264,6 +309,9 @@ msgid "" msgstr "" "Готовый архив ``tar + gzip`` необходимо загрузить на сервер и распаковать:" +msgid "$ tar xvf tarantool-enterprise-sdk-.tar.gz" +msgstr "" + msgid "" "No further installation is required as the unpacked binaries are almost " "ready to go. Go to the directory with the binaries (``tarantool-" @@ -275,6 +323,9 @@ msgstr "" "(``tarantool-enterprise``) и добавьте их в путь для поиска исполняемых " "файлов, запустив скрипт из дистрибутива:" +msgid "$ source ./env.sh" +msgstr "" + msgid "" "Make sure you have enough privileges to run the script and that the file is " "executable. Otherwise, try ``chmod`` and ``chown`` commands to adjust it." @@ -344,3 +395,10 @@ msgstr "" #~ "Кластер Tarantool работает по принципам полносвязной топологии (full mesh " #~ "topology), поэтому все серверы Tarantool должны поддерживать обмен и " #~ "передачу данных с любого TCP-порта на TCP-порты 3000:4000." + +#~ msgid "" +#~ "``cartridge`` is the utility script to help you set up a development " +#~ "environment for applications and pack them for easy deployment." +#~ msgstr "" +#~ "``cartridge`` -- служебный скрипт, который помогает настроить среду " +#~ "разработки для приложений и упаковать их с целью упростить развертывание." diff --git a/locale/ru/LC_MESSAGES/enterprise/space_upgrade.po b/locale/ru/LC_MESSAGES/enterprise/space_upgrade.po new file mode 100644 index 0000000000..13a7ff9059 --- /dev/null +++ b/locale/ru/LC_MESSAGES/enterprise/space_upgrade.po @@ -0,0 +1,634 @@ + +msgid "Upgrading space schema" +msgstr "" + +msgid "" +"In Tarantool, :ref:`migration ` refers to any change in a data " +"schema, for example, creating an index, adding a field, or changing a field " +"format. If you need to change a data schema, there are several possible " +"cases:" +msgstr "" + +msgid "" +"Schema migration does not require data migration: adding a field with the " +"``is_nullable`` parameter to the end of the space, creating an index." +msgstr "" + +msgid "" +"Schema migration requires data migration. For example, it is necessary when " +"you have to iterate over the entire space to convert columns to a new format" +" or remove the column completely." +msgstr "" + +msgid "To solve the task of migrating the data, you can:" +msgstr "" + +msgid ":ref:`Migrate data ` to a new space manually." +msgstr "" + +msgid "Use the ``space:upgrade()`` feature." +msgstr "" + +msgid "Space upgrade overview" +msgstr "" + +msgid "" +"The ``space:upgrade()`` feature allows users to upgrade the format of a " +"space and the tuples stored in it without blocking the database." +msgstr "" + +msgid "How to apply space upgrade" +msgstr "" + +msgid "" +"First, specify an upgrade function -- a function that will convert the " +"tuples in the space to a new format. The requirements for this function are " +"listed below." +msgstr "" + +msgid "" +"The upgrade function takes two arguments. The first argument is a tuple to " +"be upgraded. The second one is optional. It contains some additional " +"information stored in plain Lua object. If omitted, the second argument is " +"``nil``." +msgstr "" + +msgid "" +"The function returns a new tuple or a Lua table. For example, it can add a " +"new field to the tuple. The new tuple must conform to the new space format " +"set by the upgrade operation." +msgstr "" + +msgid "" +"The function should be registered with :doc:`box.schema.func.create " +"`. It should also be " +"stored, deterministic, and written in Lua." +msgstr "" + +msgid "The function should not change the primary key of the tuple." +msgstr "" + +msgid "" +"The function should be idempotent: ``f(f(t)) = f(t)``. This is necessary " +"because the function is applied to all tuples returned to the user, and some" +" of them may have already been upgraded in the background." +msgstr "" + +msgid "" +"Then define a new space format. This step is optional. However, it could be " +"useful if, for example, you want to add a new column with data. For details," +" check the :ref:`Usage Example ` section." +msgstr "" + +msgid "" +"The next optional step is to choose an upgrade mode. There are three modes: " +"``upgrade``, ``dryrun``, and ``dryrun+upgrade``. The default value is " +"``upgrade``. To check an upgrade function without applying any changes, " +"choose the ``dryrun`` mode. To run a space upgrade without testing the " +"function, pick the ``upgrade`` mode. If you want to apply both the test and " +"the actual upgrade, use the ``dryrun+upgrade`` option. For details, see the " +":ref:`Upgrade Modes ` section." +msgstr "" + +msgid "How the upgrade works" +msgstr "" + +msgid "" +"The user defines an upgrade function. Each tuple of the chosen space is " +"passed through the function. The function converts the tuple from the old " +"format to a new one. The function is applied to all tuples stored in the " +"space in the background. Besides, the function is applied to all tuples " +"returned to the user via the box API (for example, ``select``, ``get``). " +"Therefore, it appears that the space upgrades instantly." +msgstr "" + +msgid "" +"Keep in mind that ``space:upgrade`` differs from the " +":doc:`space_object:format() ` in " +"the following ways:" +msgstr "" + +msgid "Difference" +msgstr "" + +msgid "``space:upgrade()``" +msgstr "" + +msgid "``space:format()``" +msgstr "" + +msgid "Non-blocking" +msgstr "" + +msgid "" +"Yes. It returns tuples in the new format, whether or not they have already " +"been converted." +msgstr "" + +msgid "Yes." +msgstr "" + +msgid "Set a format incompatible with the current one" +msgstr "" + +msgid "Yes. Works for non-indexed field types only." +msgstr "" + +msgid "No, only expand the format in a compatible way." +msgstr "" + +msgid "Visibility of changes" +msgstr "" + +msgid "" +"Immediately. All changes are visible and replicated immediately. New data " +"should conform to the new format immediately after the call." +msgstr "" + +msgid "" +"After data validation. Data validation starts in the background, it does not" +" block the database. Inserting data incompatible with the new format is " +"allowed before validation is completed -- in this case ``space.format`` " +"fails." +msgstr "" + +msgid "Cancel (error/restart)" +msgstr "" + +msgid "" +"Writes the state to the system table. Restart: the operation continues. " +"Error: the operation should be restarted manually, any other attempt to " +"change the table fails." +msgstr "" + +msgid "Leaves no traces." +msgstr "" + +msgid "Set the upgrade function" +msgstr "" + +msgid "" +"Yes. The upgrade may take a while to traverse the space and transform " +"tuples." +msgstr "" + +msgid "No." +msgstr "" + +msgid "" +"At the moment, the feature is not supported for :ref:`vinyl `" +" spaces." +msgstr "" + +msgid "User API" +msgstr "" + +msgid "" +"The ``space:upgrade()`` method is added to the :doc:`space object " +"`:" +msgstr "" + +msgid "Parameters" +msgstr "" + +msgid "" +"upgrade function name (string) or ID (integer). For details, see the " +":ref:`upgrade function requirements ` section." +msgstr "" + +msgid "" +"additional information passed to the upgrade function in the second " +"argument. The option accepts any Lua value that can be encoded in MsgPack, " +"which means that the :doc:`msgpack.encode(arg) " +"` should succeed. For example, one can " +"pass a scalar or a Lua table. The default value is ``nil``." +msgstr "" + +msgid "" +"new space format. The requirements for this are the same as for any other " +":doc:`space:format() `. If the " +"field is omitted, the space format will remain the same as before the " +"upgrade." +msgstr "" + +msgid "" +":ref:`upgrade mode `. Possible values: ``upgrade``, " +"``dryrun``, ``dryrun+upgrade``. The default value is ``upgrade``." +msgstr "" + +msgid "" +"the flag indicates whether to wait until the upgrade operation is complete " +"before exiting the function. The default value is ``false`` -- the function " +"is blocked until the upgrade operation is finished." +msgstr "" + +msgid "Return" +msgstr "" + +msgid "" +"object describing the status of the operation (also known as ``future``). " +"The methods of the object are described below." +msgstr "" + +msgid "Shows information about the state of the upgrade operation." +msgstr "" + +msgid "" +"dry run mode flag. Possible values: ``true`` for a dry run, ``nil`` for an " +"actual upgrade." +msgstr "" + +msgid "" +":ref:`upgrade status `. Possible values: " +"``inprogress``, ``waitrw``, ``error``, ``replica``, ``done``." +msgstr "" + +msgid "" +"name of the upgrade function. It is the same as passed to the " +"``space:upgrade`` method. The field is ``nil`` if the ``status`` is " +"``done``." +msgstr "" + +msgid "" +"additional information passed to the upgrade function. It is the same as for" +" the ``space:upgrade`` method. The field is ``nil`` if it is omitted in the " +"``space:upgrade``." +msgstr "" + +msgid "" +"UUID of the instance running the upgrade (see :doc:`box.info.uuid " +"`). The field is ``nil`` if the " +"``status`` is ``done``." +msgstr "" + +msgid "error message if the ``status`` is ``error``, otherwise ``nil``." +msgstr "" + +msgid "" +"completion percentage if the ``status`` is ``inprogress``/``waitrw``, " +"otherwise ``nil``." +msgstr "" + +msgid "return" +msgstr "" + +msgid "a table with information about the state of the upgrade operation" +msgstr "" + +msgid "rtype" +msgstr "" + +msgid "table" +msgstr "" + +msgid "" +"The fields can also be accessed directly, without calling the ``info()`` " +"method. For example, ``future.status`` is the same as " +"``future:info().status``." +msgstr "" + +msgid "" +"Waits until the upgrade operation is completed or a timeout occurs. An " +"operation is considered completed if its status is ``done`` or ``error``." +msgstr "" + +msgid "" +"if the ``timeout`` argument is omitted, the method waits as long as it " +"takes." +msgstr "" + +msgid "" +"returns ``true`` if the operation has been completed, ``false`` on timeout" +msgstr "" + +msgid "boolean" +msgstr "" + +msgid "" +"Cancels the upgrade operation if it is currently running. Otherwise, an " +"exception is thrown. A canceled upgrade operation completes with an error." +msgstr "" + +msgid "none" +msgstr "" + +msgid "void" +msgstr "" + +msgid "" +"Running ``space:upgrade()`` with ``is_async = false`` or the ``is_async`` " +"field not set is equal to:" +msgstr "" + +msgid "" +"local future = space:upgrade({func = 'my_func', is_async = true})\n" +"future:wait()\n" +"return future" +msgstr "" + +msgid "" +"If called without arguments, ``space:upgrade()`` returns a future object for" +" the active upgrade operation. If there is none, it returns ``nil``." +msgstr "" + +msgid "Upgrade modes" +msgstr "" + +msgid "" +"There are three upgrade modes: ``dryrun``, ``dryrun+upgrade``, and " +"``upgrade``. Regardless of the mode selected, the upgrade does not block " +"execution. Once in a while, the background fiber commits the upgraded tuples" +" and yields." +msgstr "" + +msgid "" +"Calling ``space:upgrade`` without arguments always returns the current state" +" of the space upgrade, never the state of a dry run. If there is a dry run " +"working in the background, ``space:upgrade`` will still return ``nil``. " +"Unlike an actual space upgrade, the future object returned by a dry run " +"upgrade can't be recovered if it is lost. So a dry run is aborted if it is " +"garbage collected." +msgstr "" + +msgid "" +"In ``dryrun+upgrade`` mode: if the future object is garbage collected by Lua" +" before the end of the dry run and the start of the upgrade, then the dry " +"run will be canceled, and no upgrade will be started." +msgstr "" + +msgid "Upgrade modes:" +msgstr "" + +msgid "" +"``upgrade`` mode: the background fiber iterates over the space, applies the " +"upgrade function, checks that obtained tuples fit the new space format, and " +"updates the tuples. This mode prevents the space from being altered. The " +"mode can only be performed on the master instance." +msgstr "" + +msgid "" +"``dryrun`` mode: the dry-run mode is used to check the upgrade function. The" +" mode does not apply any changes to the target space. It starts a background" +" fiber. The fiber:" +msgstr "" + +msgid "Iterates over the target space." +msgstr "" + +msgid "" +"Attempts to apply the upgrade function to each tuple stored in the space." +msgstr "" + +msgid "Checks if the returned tuple matches the new format." +msgstr "" + +msgid "Checks if the function is idempotent." +msgstr "" + +msgid "Checks that the function does not modify the primary key." +msgstr "" + +msgid "" +"For details, see the :ref:`upgrade function requirements ` section." +msgstr "" + +msgid "" +"To start a dry run, pass ``mode='dryrun'`` to the ``space:upgrade`` method. " +"In this case, the future object has the ``dryrun`` field set to ``true``. " +"The possible statuses are ``inprogress`` and ``dryrun``. ``replica`` and " +"``waitrw`` states are never set for a dry run future object." +msgstr "" + +msgid "" +"The ``dryrun`` mode is not persisted. Restarting the instance does not " +"restart a dry run. A dry run only works on the original instance, never on " +"replicas. Unlike a real upgrade, a dry run does not prevent the space from " +"being altered. The space can even be dropped. In this case, the dry run will" +" complete with an error." +msgstr "" + +msgid "" +"``dryrun+upgrade`` mode: it starts a dry run, which, if completed " +"successfully, triggers an actual upgrade. The future object returned by " +"``space:upgrade`` remains valid throughout the process. It starts as the " +"future object of the dry run. Then, under the hood, it is converted into an " +"upgrade future object. Waiting on it would wait for both the dry run and the" +" upgrade to complete. During the dry run, the future object has the " +"``dryrun`` field set to ``true``. When the actual upgrade starts, the " +"``dryrun`` field is set to ``nil``. The mode can only be performed on the " +"master instance." +msgstr "" + +msgid "States" +msgstr "" + +msgid "An upgrade operation has one of the following upgrade states:" +msgstr "" + +msgid "" +"``inprogress`` -- the upgrade operation is running in the background. The " +"function is applied to all tuples returned to the user." +msgstr "" + +msgid "" +"``waitrw`` -- the instance was switched to the read-only mode (for example, " +"by using ``box.cfg.read_only``), so the upgrade couldn't proceed. The " +"upgrade process will resume as soon as the instance switches back to read-" +"write mode. Nevertheless, the upgrade function is applied to all tuples " +"returned to the user." +msgstr "" + +msgid "" +"``error`` -- the upgrade operation failed with an error. See the ``error`` " +"field for the error message. See the log for the tuple that caused the " +"error. No alter operation is allowed, except for another upgrade, supposed " +"to fix the problem. Nevertheless, the upgrade function is applied to all " +"tuples returned to the user. The space is writable." +msgstr "" + +msgid "" +"``done`` -- the upgrade operation is successfully completed. The upgrade " +"function is not applied to tuples returned to the user anymore. The function" +" can be deleted." +msgstr "" + +msgid "" +"``replica`` -- the upgrade operation is either running or completed with an " +"error on another instance. See the ``owner`` field for the UUID of the " +"instance running the upgrade. Nevertheless, the upgrade function is applied " +"to all tuples returned to the user." +msgstr "" + +msgid "Interaction with alter" +msgstr "" + +msgid "" +"While a space upgrade is in progress, the space can't be altered or dropped." +" The attempt to do that will throw an exception. Restarting an upgrade is " +"allowed in case the currently running upgrade is canceled or completed with " +"an error. It means the manual restart is possible if the upgrade operation " +"is in the :ref:`error state `." +msgstr "" + +msgid "" +"If a space upgrade was canceled or failed with an error, the space can't be " +"altered or dropped. The only option is to restart the upgrade using a " +"different upgrade function or format." +msgstr "" + +msgid "Interaction with recovery" +msgstr "" + +msgid "" +"The space upgrade state is persisted. It is stored in the ``_space`` system " +"table. If an instance with a space upgrade in progress (``inprogress`` " +"state) is shut down, it restarts the space upgrade after recovery. If a " +"space upgrade fails (switches to the ``error`` state), it remains in the " +"error state after recovery." +msgstr "" + +msgid "Interaction with replication" +msgstr "" + +msgid "" +"The changes made to a space by a space upgrade are replicated. Just as on " +"the instance where the upgrade is performed, the upgrade function is applied" +" to all tuples returned to the user on the replicas. However, the upgrade " +"operation is not performed on the replicas in the background. The replicas " +"wait for the upgrade operation to complete on the master. They can't alter " +"or drop the space. Normally, they can't cancel or restart the upgrade " +"operation either." +msgstr "" + +msgid "" +"There is an emergency exception when the master is permanently dead. It is " +"possible to restart a space upgrade that started on another instance. The " +"restart is possible if the upgrade owner UUID (see the ``owner`` field) has " +"been deleted from the ``_cluster`` system table." +msgstr "" + +msgid "" +"Except the ``dryrun`` mode, the upgrade can only be performed on the master." +" If the instance is no longer the master, the upgrade is suspended until the" +" instance is master again. Restarting the upgrade on a new master works only" +" if the old one has been removed from the replica set (``_cluster`` system " +"space)." +msgstr "" + +msgid "Usage example" +msgstr "" + +msgid "" +"Suppose there are two columns in the space `test` -- ``id`` (unsigned) and " +"``data`` (string). The example shows how to upgrade the schema and add " +"another column to the space using ``space:upgrade()``. The new column " +"contains the ``id`` values converted to string. Each step takes a while." +msgstr "" + +msgid "The test space is generated with the following script:" +msgstr "" + +#, python-format +msgid "" +"local log = require('log')\n" +"box.cfg{\n" +" checkpoint_count = 1,\n" +" memtx_memory = 5 * 1024 * 1024 * 1024,\n" +"}\n" +"box.schema.space.create('test')\n" +"box.space.test:format{\n" +" {name = 'id', type = 'unsigned'},\n" +" {name = 'data', type = 'string'},\n" +"}\n" +"box.space.test:create_index('pk')\n" +"local count = 20 * 1000 * 1000\n" +"local progress = 0\n" +"box.begin()\n" +"for i = 1, count do\n" +" box.space.test:insert{i, 'data' .. i}\n" +"\n" +" if i % 1000 == 0 then\n" +" box.commit()\n" +" local p = math.floor(i / count * 100)\n" +" if progress ~= p then\n" +" progress = p\n" +" log.info('Generating test data set... %d%% done', p)\n" +" end\n" +" box.begin()\n" +" end\n" +"end\n" +"box.commit()\n" +"box.snapshot()\n" +"os.exit(0)" +msgstr "" + +msgid "" +"To upgrade the space, connect to the server and then run the commands below:" +msgstr "" + +msgid "" +"localhost:3301> box.schema.func.create('convert', {\n" +" > language = 'lua',\n" +" > is_deterministic = true,\n" +" > body = [[function(t)\n" +" > if #t == 2 then\n" +" > return t:update({{'!', 2, tostring(t.id)}})\n" +" > else\n" +" > return t\n" +" > end\n" +" > end]],\n" +" > })\n" +"localhost:3301> box.space.test:upgrade({\n" +" > func = 'convert',\n" +" > format = {\n" +" > {name = 'id', type = 'unsigned'},\n" +" > {name = 'id_string', type = 'string'},\n" +" > {name = 'data', type = 'string'},\n" +" > },\n" +" > })" +msgstr "" + +msgid "" +"While the upgrade is in progress, you can track the state of the upgrade. To" +" check the status, connect to Tarantool from another console and run the " +"following commands:" +msgstr "" + +msgid "" +"localhost:3311> box.space.test:upgrade()\n" +"---\n" +"- status: inprogress\n" +" progress: 8%\n" +" owner: 579a9e99-427e-4e99-9e2e-216bbd3098a7\n" +" func: convert\n" +"..." +msgstr "" + +#, python-format +msgid "" +"Even though the upgrade is only 8% complete, selecting the data from the " +"space returns the converted tuples:" +msgstr "" + +msgid "" +"localhost:3311> box.space.test:select({}, {iterator = 'req', limit = 5})\n" +"---\n" +"- - [20000000, '20000000', 'data20000000']\n" +" - [19999999, '19999999', 'data19999999']\n" +" - [19999998, '19999998', 'data19999998']\n" +" - [19999997, '19999997', 'data19999997']\n" +" - [19999996, '19999996', 'data19999996']\n" +"..." +msgstr "" + +msgid "" +"The tuples contain the new field even though the space upgrade is still " +"running." +msgstr "" + +msgid "Wait for the space upgrade to complete using the command below:" +msgstr "" + +msgid "localhost:3311> box.space.test:upgrade():wait()" +msgstr "" diff --git a/locale/ru/LC_MESSAGES/enterprise/system_metrics.po b/locale/ru/LC_MESSAGES/enterprise/system_metrics.po index fa58a6ea22..82b702e459 100755 --- a/locale/ru/LC_MESSAGES/enterprise/system_metrics.po +++ b/locale/ru/LC_MESSAGES/enterprise/system_metrics.po @@ -5,6 +5,9 @@ msgstr "Метрики системы мониторинга" msgid "Option" msgstr "Параметр" +msgid "Description" +msgstr "" + msgid "SNMP type" msgstr "Тип по SNMP" diff --git a/locale/ru/LC_MESSAGES/enterprise/tuple_compression.po b/locale/ru/LC_MESSAGES/enterprise/tuple_compression.po new file mode 100644 index 0000000000..0305f0e241 --- /dev/null +++ b/locale/ru/LC_MESSAGES/enterprise/tuple_compression.po @@ -0,0 +1,232 @@ + +msgid "Tuple compression" +msgstr "" + +msgid "" +"Tuple compression, introduced in Tarantool Enterprise Edition 2.10.0, aims " +"to save memory space. Typically, it decreases the volume of stored data by " +"15%. However, the exact volume saved depends on the type of data." +msgstr "" + +msgid "The following compression algorithms are supported:" +msgstr "" + +msgid "`lz4 `_" +msgstr "" + +msgid "`zstd `_" +msgstr "" + +msgid "" +"`zlib `_ (since :doc:`2.11.0 " +"`)" +msgstr "" + +msgid "" +"To learn about the performance costs of each algorithm, check :ref:`Tuple " +"compression performance `." +msgstr "" + +msgid "" +"Tarantool doesn't compress tuples themselves, just the fields inside these " +"tuples. You can only compress non-indexed fields. Compression works best " +"when JSON is stored in the field." +msgstr "" + +msgid "" +"The :ref:`compress ` module provides the API for " +"compressing and decompressing data." +msgstr "" + +msgid "Enabling compression for a new space" +msgstr "" + +msgid "First, create a space:" +msgstr "" + +msgid "box.schema.space.create('bands')" +msgstr "" + +msgid "Then, create an index for this space, for example:" +msgstr "" + +msgid "box.space.bands:create_index('primary', {parts = {{1, 'unsigned'}}})" +msgstr "" + +msgid "" +"Create a format to declare field names and types. In the example below, the " +"``band_name`` and ``year`` fields have the ``zstd`` and ``lz4`` compression " +"formats, respectively. The first field (``id``) has the index, so it cannot " +"be compressed." +msgstr "" + +msgid "" +"box.space.bands:format({\n" +" {name = 'id', type = 'unsigned'},\n" +" {name = 'band_name', type = 'string', compression = 'zstd'},\n" +" {name = 'year', type = 'unsigned', compression = 'lz4'}\n" +" })" +msgstr "" + +msgid "" +"Now, the new tuples that you add to the space ``bands`` will be compressed. " +"When you read a compressed tuple, you do not need to decompress it back " +"yourself." +msgstr "" + +msgid "Checking which fields are compressed" +msgstr "" + +msgid "" +"To check which fields in a space are compressed, run " +":ref:`space_object:format() ` on the space. If a field is " +"compressed, the format includes the compression algorithm, for example:" +msgstr "" + +msgid "" +"tarantool> box.space.bands:format()\n" +" ---\n" +" - [{'name': 'id', 'type': 'unsigned'},\n" +" {'type': 'string', 'compression': 'zstd', 'name': 'band_name'},\n" +" {'type': 'unsigned', 'compression': 'lz4', 'name': 'year'}]\n" +" ..." +msgstr "" + +msgid "Enabling compression for existing spaces" +msgstr "" + +msgid "" +"You can enable compression for existing fields. All the tuples added after " +"that will have this field compressed. However, this doesn't affect the " +"tuples already stored in the space. You need to make the snapshot and " +"restart Tarantool to compress the existing tuples." +msgstr "" + +msgid "Here's an example of how to compress existing fields:" +msgstr "" + +msgid "Create a space without compression and add several tuples:" +msgstr "" + +msgid "" +"box.schema.space.create('bands')\n" +"\n" +"box.space.bands:format({\n" +" { name = 'id', type = 'unsigned' },\n" +" { name = 'band_name', type = 'string' },\n" +" { name = 'year', type = 'unsigned' }\n" +"})\n" +"\n" +"box.space.bands:create_index('primary', { parts = { 'id' } })\n" +"\n" +"box.space.bands:insert { 1, 'Roxette', 1986 }\n" +"box.space.bands:insert { 2, 'Scorpions', 1965 }\n" +"box.space.bands:insert { 3, 'Ace of Base', 1987 }\n" +"box.space.bands:insert { 4, 'The Beatles', 1960 }" +msgstr "" + +msgid "" +"Suppose that you want fields 2 and 3 to be compressed from now on. To enable" +" compression, change the format as follows:" +msgstr "" + +msgid "" +"local new_format = box.space.bands:format()\n" +"\n" +"new_format[2].compression = 'zstd'\n" +"new_format[3].compression = 'lz4'\n" +"\n" +"box.space.bands:format(new_format)" +msgstr "" + +msgid "" +"From now on, all the tuples that you add to the space have fields 2 and 3 " +"compressed." +msgstr "" + +msgid "" +"To finalize the change, create a snapshot by running :ref:`box.snapshot() " +"` and restart Tarantool. As a result, all old tuples will also" +" be compressed in memory during recovery." +msgstr "" + +msgid "" +":doc:`space:upgrade() ` provides the ability to enable " +"compression and update the existing tuples in the background. To achieve " +"this, you need to pass a new space format in the ``format`` argument of " +"``space:upgrade()``." +msgstr "" + +msgid "Tuple compression performance" +msgstr "" + +msgid "" +"Below are the results of a `synthetic test " +"`_" +" that illustrate how tuple compression affects performance. The test was " +"carried out on a simple Tarantool space containing 100,000 tuples, each " +"having a field with a sample JSON roughly 600 bytes large. The test compared" +" the speed of running ``select`` and ``replace`` operations on uncompressed " +"and compressed data as well as the overall data size of the space. " +"Performance is measured in requests per second." +msgstr "" + +msgid "Compression type" +msgstr "" + +msgid "``select``, RPS" +msgstr "" + +msgid "``replace``, RPS" +msgstr "" + +msgid "Space size, bytes" +msgstr "" + +msgid "None" +msgstr "" + +msgid "4,486k" +msgstr "" + +msgid "1,109k" +msgstr "" + +msgid "41,168,548" +msgstr "" + +msgid "``zstd``" +msgstr "" + +msgid "308k" +msgstr "" + +msgid "26k" +msgstr "" + +msgid "21,368,548" +msgstr "" + +msgid "``lz4``" +msgstr "" + +msgid "1,765k" +msgstr "" + +msgid "672k" +msgstr "" + +msgid "25,268,548" +msgstr "" + +msgid "``zlib``" +msgstr "" + +msgid "325k" +msgstr "" + +msgid "107k" +msgstr "" + +msgid "20,768,548" +msgstr "" diff --git a/locale/ru/LC_MESSAGES/enterprise/tuple_compression/api/compress.po b/locale/ru/LC_MESSAGES/enterprise/tuple_compression/api/compress.po new file mode 100644 index 0000000000..95e69714c9 --- /dev/null +++ b/locale/ru/LC_MESSAGES/enterprise/tuple_compression/api/compress.po @@ -0,0 +1,11 @@ + +msgid "Module compress" +msgstr "" + +msgid "**Since:** :doc:`2.11.0 `" +msgstr "" + +msgid "" +"The ``compress`` module provides a set of submodules for compressing and " +"decompressing data using different algorithms:" +msgstr "" diff --git a/locale/ru/LC_MESSAGES/enterprise/tuple_compression/api/lz4.po b/locale/ru/LC_MESSAGES/enterprise/tuple_compression/api/lz4.po new file mode 100644 index 0000000000..915343221e --- /dev/null +++ b/locale/ru/LC_MESSAGES/enterprise/tuple_compression/api/lz4.po @@ -0,0 +1,175 @@ + +msgid "Submodule compress.lz4" +msgstr "" + +msgid "Overview" +msgstr "" + +msgid "" +"The ``compress.lz4`` submodule provides the ability to compress and " +"decompress data using the `lz4 " +"`_ algorithm. You" +" can use the ``lz4`` compressor as follows:" +msgstr "" + +msgid "" +"Create a compressor instance using the :ref:`compress.lz4.new() ` function:" +msgstr "" + +msgid "" +"local lz4_compressor = require('compress.lz4').new()\n" +"-- or --\n" +"local lz4_compressor = require('compress').lz4.new()" +msgstr "" + +msgid "" +"Optionally, you can pass compression options (:ref:`lz4_opts " +"`) specific for ``lz4``:" +msgstr "" + +msgid "" +"local lz4_compressor = require('compress.lz4').new({\n" +" acceleration = 1000,\n" +" decompress_buffer_size = 2097152\n" +"})\n" +msgstr "" + +msgid "" +"To compress the specified data, use the :ref:`compress() ` method:" +msgstr "" + +msgid "compressed_data = lz4_compressor:compress('Hello world!')\n" +msgstr "" + +msgid "" +"To decompress data, call :ref:`decompress() `:" +msgstr "" + +msgid "decompressed_data = lz4_compressor:decompress(compressed_data)\n" +msgstr "" + +msgid "API Reference" +msgstr "" + +msgid "**Functions**" +msgstr "" + +msgid ":ref:`compress.lz4.new() `" +msgstr "" + +msgid "Create a ``lz4`` compressor instance." +msgstr "" + +msgid "**Objects**" +msgstr "" + +msgid ":ref:`lz4_compressor `" +msgstr "" + +msgid "A ``lz4`` compressor instance." +msgstr "" + +msgid ":ref:`lz4_opts `" +msgstr "" + +msgid "Configuration options of the ``lz4`` compressor." +msgstr "" + +msgid "compress.lz4.new()" +msgstr "" + +msgid "Parameters" +msgstr "" + +msgid "``lz4`` compression options (see :ref:`lz4_opts `)" +msgstr "" + +msgid "return" +msgstr "" + +msgid "" +"a new ``lz4`` compressor instance (see :ref:`lz4_compressor " +"`)" +msgstr "" + +msgid "rtype" +msgstr "" + +msgid "userdata" +msgstr "" + +msgid "**Example**" +msgstr "" + +msgid "lz4_compressor" +msgstr "" + +msgid "" +"A compressor instance that exposes the API for compressing and decompressing" +" data using the ``lz4`` algorithm. To create the ``lz4`` compressor, call " +":ref:`compress.lz4.new() `." +msgstr "" + +msgid "Compress the specified data." +msgstr "" + +msgid "data to be compressed" +msgstr "" + +msgid "compressed data" +msgstr "" + +msgid "string" +msgstr "" + +msgid "Decompress the specified data." +msgstr "" + +msgid "data to be decompressed" +msgstr "" + +msgid "decompressed data" +msgstr "" + +msgid "lz4_opts" +msgstr "" + +msgid "" +"Configuration options of the :ref:`lz4_compressor `. " +"These options can be passed to the :ref:`compress.lz4.new() ` function." +msgstr "" + +msgid "" +"local lz4_compressor = require('compress.lz4').new({\n" +" acceleration = 1000,\n" +" decompress_buffer_size = 2097152\n" +"})\n" +"\n" +msgstr "" + +msgid "" +"Specifies the acceleration factor that enables you to adjust the compression" +" ratio and speed. The higher acceleration factor increases the compression " +"speed but decreases the compression ratio." +msgstr "" + +msgid "Default: 1" +msgstr "" + +msgid "Maximum: 65537" +msgstr "" + +msgid "Minimum: 1" +msgstr "" + +msgid "" +"Specifies the decompress buffer size (in bytes). If the size of decompressed" +" data is larger than this value, the compressor returns an error on " +"decompression." +msgstr "" + +msgid "Default: 1048576" +msgstr "" diff --git a/locale/ru/LC_MESSAGES/enterprise/tuple_compression/api/zlib.po b/locale/ru/LC_MESSAGES/enterprise/tuple_compression/api/zlib.po new file mode 100644 index 0000000000..812651b193 --- /dev/null +++ b/locale/ru/LC_MESSAGES/enterprise/tuple_compression/api/zlib.po @@ -0,0 +1,198 @@ + +msgid "Submodule compress.zlib" +msgstr "" + +msgid "Overview" +msgstr "" + +msgid "" +"The ``compress.zlib`` submodule provides the ability to compress and " +"decompress data using the `zlib `_ " +"algorithm. You can use the ``zlib`` compressor as follows:" +msgstr "" + +msgid "" +"Create a compressor instance using the :ref:`compress.zlib.new() ` function:" +msgstr "" + +msgid "" +"local zlib_compressor = require('compress.zlib').new()\n" +"-- or --\n" +"local zlib_compressor = require('compress').zlib.new()" +msgstr "" + +msgid "" +"Optionally, you can pass compression options (:ref:`zlib_opts " +"`) specific for ``zlib``:" +msgstr "" + +msgid "" +"local zlib_compressor = require('compress.zlib').new({\n" +" level = 5,\n" +" mem_level = 5,\n" +" strategy = 'filtered'\n" +"})\n" +msgstr "" + +msgid "" +"To compress the specified data, use the :ref:`compress() ` method:" +msgstr "" + +msgid "compressed_data = zlib_compressor:compress('Hello world!')\n" +msgstr "" + +msgid "" +"To decompress data, call :ref:`decompress() `:" +msgstr "" + +msgid "decompressed_data = zlib_compressor:decompress(compressed_data)\n" +msgstr "" + +msgid "API Reference" +msgstr "" + +msgid "**Functions**" +msgstr "" + +msgid ":ref:`compress.zlib.new() `" +msgstr "" + +msgid "Create a ``zlib`` compressor instance." +msgstr "" + +msgid "**Objects**" +msgstr "" + +msgid ":ref:`zlib_compressor `" +msgstr "" + +msgid "A ``zlib`` compressor instance." +msgstr "" + +msgid ":ref:`zlib_opts `" +msgstr "" + +msgid "Configuration options of the ``zlib`` compressor." +msgstr "" + +msgid "compress.zlib.new()" +msgstr "" + +msgid "Parameters" +msgstr "" + +msgid "``zlib`` compression options (see :ref:`zlib_opts `)" +msgstr "" + +msgid "return" +msgstr "" + +msgid "" +"a new ``zlib`` compressor instance (see :ref:`zlib_compressor " +"`)" +msgstr "" + +msgid "rtype" +msgstr "" + +msgid "userdata" +msgstr "" + +msgid "**Example**" +msgstr "" + +msgid "zlib_compressor" +msgstr "" + +msgid "" +"A compressor instance that exposes the API for compressing and decompressing" +" data using the ``zlib`` algorithm. To create the ``zlib`` compressor, call " +":ref:`compress.zlib.new() `." +msgstr "" + +msgid "Compress the specified data." +msgstr "" + +msgid "data to be compressed" +msgstr "" + +msgid "compressed data" +msgstr "" + +msgid "string" +msgstr "" + +msgid "Decompress the specified data." +msgstr "" + +msgid "data to be decompressed" +msgstr "" + +msgid "decompressed data" +msgstr "" + +msgid "zlib_opts" +msgstr "" + +msgid "" +"Configuration options of the :ref:`zlib_compressor `." +" These options can be passed to the :ref:`compress.zlib.new() ` function." +msgstr "" + +msgid "" +"Specifies the ``zlib`` compression level that enables you to adjust the " +"compression ratio and speed. The lower level improves the compression speed " +"at the cost of compression ratio." +msgstr "" + +msgid "Default: 6" +msgstr "" + +msgid "Minimum: 0 (no compression)" +msgstr "" + +msgid "Maximum: 9" +msgstr "" + +msgid "" +"Specifies how much memory is allocated for the ``zlib`` compressor. The " +"larger value improves the compression speed and ratio." +msgstr "" + +msgid "Default: 8" +msgstr "" + +msgid "Minimum: 1" +msgstr "" + +msgid "Specifies the compression strategy. The possible values:" +msgstr "" + +msgid "``default`` - for normal data." +msgstr "" + +msgid "" +"``huffman_only`` - forces Huffman encoding only (no string match). The " +"fastest compression algorithm but not very effective in compression for most" +" of the data." +msgstr "" + +msgid "" +"``filtered`` - for data produced by a filter or predictor. Filtered data " +"consists mostly of small values with a somewhat random distribution. This " +"compression algorithm is tuned to compress them better." +msgstr "" + +msgid "" +"``rle`` - limits match distances to one (run-length encoding). ``rle`` is " +"designed to be almost as fast as ``huffman_only`` but gives better " +"compression for PNG image data." +msgstr "" + +msgid "" +"``fixed`` - prevents the use of dynamic Huffman codes and provides a simpler" +" decoder for special applications." +msgstr "" diff --git a/locale/ru/LC_MESSAGES/enterprise/tuple_compression/api/zstd.po b/locale/ru/LC_MESSAGES/enterprise/tuple_compression/api/zstd.po new file mode 100644 index 0000000000..1fa7e9a646 --- /dev/null +++ b/locale/ru/LC_MESSAGES/enterprise/tuple_compression/api/zstd.po @@ -0,0 +1,160 @@ + +msgid "Submodule compress.zstd" +msgstr "" + +msgid "Overview" +msgstr "" + +msgid "" +"The ``compress.zstd`` submodule provides the ability to compress and " +"decompress data using the `zstd `_ " +"algorithm. You can use the ``zstd`` compressor as follows:" +msgstr "" + +msgid "" +"Create a compressor instance using the :ref:`compress.zstd.new() ` function:" +msgstr "" + +msgid "" +"local zstd_compressor = require('compress.zstd').new()\n" +"-- or --\n" +"local zstd_compressor = require('compress').zstd.new()" +msgstr "" + +msgid "" +"Optionally, you can pass compression options (:ref:`zstd_opts " +"`) specific for ``zstd``:" +msgstr "" + +msgid "" +"local zstd_compressor = require('compress.zstd').new({\n" +" level = 5\n" +"})\n" +msgstr "" + +msgid "" +"To compress the specified data, use the :ref:`compress() ` method:" +msgstr "" + +msgid "compressed_data = zstd_compressor:compress('Hello world!')\n" +msgstr "" + +msgid "" +"To decompress data, call :ref:`decompress() `:" +msgstr "" + +msgid "decompressed_data = zstd_compressor:decompress(compressed_data)\n" +msgstr "" + +msgid "API Reference" +msgstr "" + +msgid "**Functions**" +msgstr "" + +msgid ":ref:`compress.zstd.new() `" +msgstr "" + +msgid "Create a ``zstd`` compressor instance." +msgstr "" + +msgid "**Objects**" +msgstr "" + +msgid ":ref:`zstd_compressor `" +msgstr "" + +msgid "A ``zstd`` compressor instance." +msgstr "" + +msgid ":ref:`zstd_opts `" +msgstr "" + +msgid "Configuration options of the ``zstd`` compressor." +msgstr "" + +msgid "compress.zstd.new()" +msgstr "" + +msgid "Parameters" +msgstr "" + +msgid "``zstd`` compression options (see :ref:`zstd_opts `)" +msgstr "" + +msgid "return" +msgstr "" + +msgid "" +"a new ``zstd`` compressor instance (see :ref:`zstd_compressor " +"`)" +msgstr "" + +msgid "rtype" +msgstr "" + +msgid "userdata" +msgstr "" + +msgid "**Example**" +msgstr "" + +msgid "zstd_compressor" +msgstr "" + +msgid "" +"A compressor instance that exposes the API for compressing and decompressing" +" data using the ``zstd`` algorithm. To create the ``zstd`` compressor, call " +":ref:`compress.zstd.new() `." +msgstr "" + +msgid "Compress the specified data." +msgstr "" + +msgid "data to be compressed" +msgstr "" + +msgid "compressed data" +msgstr "" + +msgid "string" +msgstr "" + +msgid "Decompress the specified data." +msgstr "" + +msgid "data to be decompressed" +msgstr "" + +msgid "decompressed data" +msgstr "" + +msgid "zstd_opts" +msgstr "" + +msgid "" +"Configuration options of the :ref:`zstd_compressor `." +" These options can be passed to the :ref:`compress.zstd.new() ` function." +msgstr "" + +msgid "" +"Specifies the ``zstd`` compression level that enables you to adjust the " +"compression ratio and speed. The lower level improves the compression speed " +"at the cost of compression ratio. For example, you can use level 1 if speed " +"is most important and level 22 if size is most important." +msgstr "" + +msgid "Default: 3" +msgstr "" + +msgid "Minimum: -131072" +msgstr "" + +msgid "Maximum: 22" +msgstr "" + +msgid "Assigning 0 to ``level`` resets its value to the default (3)." +msgstr "" diff --git a/locale/ru/LC_MESSAGES/enterprise/wal_extensions.po b/locale/ru/LC_MESSAGES/enterprise/wal_extensions.po new file mode 100644 index 0000000000..aa0298f0e6 --- /dev/null +++ b/locale/ru/LC_MESSAGES/enterprise/wal_extensions.po @@ -0,0 +1,168 @@ + +msgid "WAL extensions" +msgstr "" + +msgid "" +"WAL extensions available in Tarantool Enterprise Edition allow you to add " +"auxiliary information to each :ref:`write-ahead log ` record." +" For example, you can enable storing an old and new tuple for each CRUD " +"operation performed. This information might be helpful for implementing a " +"CDC (Change Data Capture) utility that transforms a data replication stream." +msgstr "" + +msgid "Configuration" +msgstr "" + +msgid "" +"To configure WAL extensions, use the ``wal_ext`` :ref:`configuration " +"property `. Inside the ``wal_ext`` block, you can enable " +"storing old and new tuples as follows:" +msgstr "" + +msgid "" +"Set the ``old`` and ``new`` options to ``true`` to store old and new tuples " +"in a write-ahead log for all spaces." +msgstr "" + +msgid "" +"box.cfg {\n" +" wal_ext = { old = true, new = true }\n" +"}" +msgstr "" + +msgid "" +"To adjust these options for specific spaces, use the ``spaces`` option." +msgstr "" + +msgid "" +"box.cfg {\n" +" wal_ext = {\n" +" old = true, new = true,\n" +" spaces = {\n" +" space1 = { old = false },\n" +" space2 = { new = false }\n" +" }\n" +" }\n" +"}" +msgstr "" + +msgid "" +"The configuration for specific spaces has priority over the global " +"configuration, so only new tuples are added to the log for ``space1`` and " +"only old tuples for ``space2``." +msgstr "" + +msgid "" +"Note that records with additional fields are :ref:`replicated ` as follows:" +msgstr "" + +msgid "" +"If a replica doesn't support the extended format configured on a master, " +"auxiliary fields are skipped." +msgstr "" + +msgid "" +"If a replica and master have different configurations for WAL records, a " +"master's configuration is ignored." +msgstr "" + +msgid "Example" +msgstr "" + +msgid "" +"The table below demonstrates how write-ahead log records might look for the " +"specific :ref:`CRUD operations ` if storing old and new " +"tuples is enabled for the ``bands`` space." +msgstr "" + +msgid "Operation" +msgstr "" + +msgid "WAL information" +msgstr "" + +msgid "insert" +msgstr "" + +msgid "``bands:insert{4, 'The Beatles', 1960}``" +msgstr "" + +msgid "**new_tuple**: [4, 'The Beatles', 1960]" +msgstr "" + +msgid "tuple: [4, 'The Beatles', 1960]" +msgstr "" + +msgid "delete" +msgstr "" + +msgid "``bands:delete{4}``" +msgstr "" + +msgid "key: [4]" +msgstr "" + +msgid "**old_tuple**: [4, 'The Beatles', 1960]" +msgstr "" + +msgid "update" +msgstr "" + +msgid "``bands:update({2}, {{'=', 2, 'Pink Floyd'}})``" +msgstr "" + +msgid "**new_tuple**: [2, 'Pink Floyd', 1965]" +msgstr "" + +msgid "**old_tuple**: [2, 'Scorpions', 1965]" +msgstr "" + +msgid "key: [2]" +msgstr "" + +msgid "tuple: [['=', 2, 'Pink Floyd']]" +msgstr "" + +msgid "upsert" +msgstr "" + +msgid "``bands:upsert({2, 'Pink Floyd', 1965}, {{'=', 2, 'The Doors'}})``" +msgstr "" + +msgid "**new_tuple**: [2, 'The Doors', 1965]" +msgstr "" + +msgid "**old_tuple**: [2, 'Pink Floyd', 1965]" +msgstr "" + +msgid "operations: [['=', 2, 'The Doors']]" +msgstr "" + +msgid "tuple: [2, 'Pink Floyd', 1965]" +msgstr "" + +msgid "replace" +msgstr "" + +msgid "``bands:replace{1, 'The Beatles', 1960}``" +msgstr "" + +msgid "**old_tuple**: [1, 'Roxette', 1986]" +msgstr "" + +msgid "**new_tuple**: [1, 'The Beatles', 1960]" +msgstr "" + +msgid "tuple: [1, 'The Beatles', 1960]" +msgstr "" + +msgid "" +"Storing both old and new tuples is especially useful for the ``update`` " +"operation because a write-ahead log record contains only a key value." +msgstr "" + +msgid "" +"You can use the :doc:`tt cat ` command to see" +" the contents of a write-ahead log." +msgstr "" diff --git a/locale/ru/LC_MESSAGES/getting_started/change_schema_dynamically.po b/locale/ru/LC_MESSAGES/getting_started/change_schema_dynamically.po index 7bb9e11e4c..57658aa309 100644 --- a/locale/ru/LC_MESSAGES/getting_started/change_schema_dynamically.po +++ b/locale/ru/LC_MESSAGES/getting_started/change_schema_dynamically.po @@ -57,8 +57,8 @@ msgstr "" " в рабочей директории Tarantool." msgid "" -"To understand how the Tarantool data schema works, read the :ref:`Data " -"model ` section." +"To understand how the Tarantool data schema works, read the :ref:`Data model" +" ` section." msgstr "" "Чтобы понять, как устроена схема данных в Tarantool, читайте раздел " ":ref:`Модель данных `." diff --git a/locale/ru/LC_MESSAGES/getting_started/getting_started_imcp.po b/locale/ru/LC_MESSAGES/getting_started/getting_started_imcp.po index c2c73c6f50..9735d6fd05 100644 --- a/locale/ru/LC_MESSAGES/getting_started/getting_started_imcp.po +++ b/locale/ru/LC_MESSAGES/getting_started/getting_started_imcp.po @@ -809,10 +809,10 @@ msgid "Checking how sharding works [1 minute]" msgstr "Смотрим, как работает шардирование [1 мин]" msgid "" -"Now we have two shards -- two logical nodes that share data among themselves." -" The router decides what piece of data goes to what shard. By default, the " -"router uses the hash function from the field ``sharding_key`` we've " -"specified in the DDL." +"Now we have two shards -- two logical nodes that share data among " +"themselves. The router decides what piece of data goes to what shard. By " +"default, the router uses the hash function from the field ``sharding_key`` " +"we've specified in the DDL." msgstr "" "Теперь у нас есть два шарда --- два логических узла, которые будут\n" "разделять между собой данные. Роутер сам решает, какие данные на какой шард положить. По умолчанию, он просто использует хеш-функцию от поля ``sharding_key`` , которое мы указали в DDL." diff --git a/locale/ru/LC_MESSAGES/getting_started/index.po b/locale/ru/LC_MESSAGES/getting_started/index.po index 017e036de2..bd525eb70c 100644 --- a/locale/ru/LC_MESSAGES/getting_started/index.po +++ b/locale/ru/LC_MESSAGES/getting_started/index.po @@ -2,12 +2,12 @@ msgid "Getting started" msgstr "Руководство для начинающих" +#, fuzzy msgid "" -"The :ref:`First steps ` section will get you " -"acquainted with Tarantool in 15 minutes. We will be creating a basic " -"microservice for TikTok. We will start Tarantool, create a data schema, and " -"write our first data. You'll get an understanding of the technology and " -"learn about the basic terms and features." +"The :ref:`Creating your first Tarantool database ` " +"section will get you acquainted with Tarantool. We will start Tarantool, " +"create a data schema, and write our first data. You'll get an understanding " +"of the technology and learn about the basic terms and features." msgstr "" "Раздел :ref:`Начало знакомства ` познакомит вас с " "Tarantool за 15 минут. В этом пошаговом руководстве мы создадим простой " @@ -15,49 +15,49 @@ msgstr "" "схему данных и запишем наши первые данные. Вы получите общее представление о" " технологии, узнаете об основных терминах и функциональных возможностях." +#, fuzzy msgid "" -"In the :ref:`Connecting to cluster ` section, we'll " -"show you how to read or write data to Tarantool from your Python/Go/PHP " -"application or another programming language." +"To continue exploring Tarantool and its ecosystem, you might want to check " +"out Tarantool :doc:`tutorials and guides <../how-to/index>`." msgstr "" -"Из раздела :ref:`Подключаемся к кластеру ` вы " -"узнаете, как читать и писать данные в Tarantool с помощью вашего приложения " -"на Python, Go, PHP или другом языке программирования." +"Чтобы продолжить знакомство с Tarantool и экосистемой платформы, переходите " +"на страницу с :doc:`практическими руководствами <../how-to/index>`. Среди " +"них вы найдете :ref:`руководство для начинающих по работе с Cartridge " +"` и другие материалы." -msgid "" -"After connecting to the database for the first time, you might want to " -"change the data schema. In the section :ref:`Updating the data schema " -"`, we'll discuss the approaches to changing" -" the data schema and the associated limitations." -msgstr "" -"После того как вы впервые подключились к базе данных, вам может понадобиться" -" изменить схему данных. В разделе :ref:`Обновление схемы данных " -"` мы расскажем, какие к этому есть подходы " -"и какие существуют ограничения." +#~ msgid "" +#~ "In the :ref:`Connecting to cluster ` section, we'll " +#~ "show you how to read or write data to Tarantool from your Python/Go/PHP " +#~ "application or another programming language." +#~ msgstr "" +#~ "Из раздела :ref:`Подключаемся к кластеру ` вы " +#~ "узнаете, как читать и писать данные в Tarantool с помощью вашего приложения " +#~ "на Python, Go, PHP или другом языке программирования." -msgid "" -"To make our code work with Tarantool, we may want to transfer some of our " -"data logic to Tarantool. In the section :ref:`Writing cluster application " -"code `, we'll write a \"Hello, " -"World!\" program in the Lua language, which will work in our Tarantool " -"cluster. This will give you a basic understanding of how the role mechanism " -"works. In this way, you'll understand what part of your business logic you " -"would like to write in/migrate to Tarantool." -msgstr "" -"Чтобы наш код работал с Tarantool, нам может понадобиться перенести часть " -"логики работы с данными в Tarantool. В разделе :ref:`Написание кода в " -"кластерном приложении ` мы создадим " -"на языке Lua программу \"Hello, World!\", которая будет работать в нашем " -"кластере Tarantool. Вы получите базовое представление о том, как работает " -"механизм ролей, и поймете, какую часть бизнес-логики стоит писать на " -"Tarantool или перенести туда." +#~ msgid "" +#~ "After connecting to the database for the first time, you might want to " +#~ "change the data schema. In the section :ref:`Updating the data schema " +#~ "`, we'll discuss the approaches to changing" +#~ " the data schema and the associated limitations." +#~ msgstr "" +#~ "После того как вы впервые подключились к базе данных, вам может понадобиться" +#~ " изменить схему данных. В разделе :ref:`Обновление схемы данных " +#~ "` мы расскажем, какие к этому есть подходы " +#~ "и какие существуют ограничения." -msgid "" -"To continue exploring Tarantool and its ecosystem, you might want to check out " -"Tarantool :doc:`tutorials and guides <../how-to/index>`. " -"The :ref:`Cartridge beginner tutorial ` can also be found there." -msgstr "" -"Чтобы продолжить знакомство с Tarantool и экосистемой платформы, переходите на страницу " -"с :doc:`практическими руководствами <../how-to/index>`. Среди них вы найдете " -":ref:`руководство для начинающих по работе с Cartridge ` " -"и другие материалы." \ No newline at end of file +#~ msgid "" +#~ "To make our code work with Tarantool, we may want to transfer some of our " +#~ "data logic to Tarantool. In the section :ref:`Writing cluster application " +#~ "code `, we'll write a \"Hello, " +#~ "World!\" program in the Lua language, which will work in our Tarantool " +#~ "cluster. This will give you a basic understanding of how the role mechanism " +#~ "works. In this way, you'll understand what part of your business logic you " +#~ "would like to write in/migrate to Tarantool." +#~ msgstr "" +#~ "Чтобы наш код работал с Tarantool, нам может понадобиться перенести часть " +#~ "логики работы с данными в Tarantool. В разделе :ref:`Написание кода в " +#~ "кластерном приложении ` мы создадим " +#~ "на языке Lua программу \"Hello, World!\", которая будет работать в нашем " +#~ "кластере Tarantool. Вы получите базовое представление о том, как работает " +#~ "механизм ролей, и поймете, какую часть бизнес-логики стоит писать на " +#~ "Tarantool или перенести туда." diff --git a/locale/ru/LC_MESSAGES/getting_started/writing_cluster_code.po b/locale/ru/LC_MESSAGES/getting_started/writing_cluster_code.po index b05a413ab6..70001c2b32 100644 --- a/locale/ru/LC_MESSAGES/getting_started/writing_cluster_code.po +++ b/locale/ru/LC_MESSAGES/getting_started/writing_cluster_code.po @@ -19,11 +19,11 @@ msgstr "" msgid "" "However, in Tarantool, you can implement absolutely any business logic on " -"top of a cluster. This :doc:`Cartridge getting started section " -"` covers the cluster roles " -"mechanism and writing a cluster application from scratch." +"top of a cluster. This :doc:`Cartridge getting started section ` covers the cluster roles mechanism and " +"writing a cluster application from scratch." msgstr "" "Однако в Tarantool можно реализовывать совершенно любую бизнес-логику поверх" " кластера. В разделе :doc:`Создаем свое первое приложение на Tarantool " -"Cartridge ` мы узнаем о " -"механизме кластерных ролей и напишем кластерное приложение с нуля." +"Cartridge ` мы узнаем о механизме " +"кластерных ролей и напишем кластерное приложение с нуля." diff --git a/locale/ru/LC_MESSAGES/how-to/app/c_tutorial.po b/locale/ru/LC_MESSAGES/how-to/app/c_tutorial.po index 59b01e7a27..0a7d8c2cf7 100644 --- a/locale/ru/LC_MESSAGES/how-to/app/c_tutorial.po +++ b/locale/ru/LC_MESSAGES/how-to/app/c_tutorial.po @@ -2,13 +2,6 @@ msgid "C tutorial" msgstr "Практическое задание на C" -msgid "" -"Here is one C tutorial: :ref:`C stored procedures `." -msgstr "" -"Ниже приводится практическое занятие на языке C: :ref:`Хранимые процедуры на" -" языке C `." - msgid "C stored procedures" msgstr "Хранимые процедуры на языке C" @@ -31,8 +24,8 @@ msgid "" "development package and a C compiler, there are five tasks:" msgstr "" "Данное практическое задание могут выполнить те, у кого есть пакет программ " -"для разработки Tarantool и компилятор языка программирования C. Оно " -"состоит из пяти задач:" +"для разработки Tarantool и компилятор языка программирования C. Оно состоит " +"из пяти задач:" msgid ":ref:`easy.c ` -- prints \"hello world\";" msgstr ":ref:`easy.c ` -- выводит \"hello world\";" @@ -70,7 +63,8 @@ msgstr "" "По окончании задания, вы увидите описанные здесь результаты и сможете " "самостоятельно написать хранимые процедуры." -msgid "**Preparation**" +#, fuzzy +msgid "Preparation" msgstr "**Подготовка**" msgid "Check that these items exist on the computer:" @@ -182,7 +176,8 @@ msgid "" "Leave the client running. It will be necessary to enter more requests later." msgstr "Не закрывайте клиент. Он понадобится для последующих запросов." -msgid "**easy.c**" +#, fuzzy +msgid "easy.c" msgstr "**easy.c**" msgid "" @@ -325,7 +320,8 @@ msgstr "... и на этот раз результатом будет: \"hello w msgid "Conclusion: calling a C function is easy." msgstr "Вывод: вызвать C-функцию легко." -msgid "**harder.c**" +#, fuzzy +msgid "harder.c" msgstr "**harder.c**" msgid "Go back to the shell where the ``easy.c`` program was created." @@ -336,6 +332,7 @@ msgstr "" "Создайте файл. Назовите его ``harder.c``. Запишите в него следующие 17 " "строк:" +#, python-format msgid "" "#include \"module.h\"\n" "#include \"msgpuck.h\"\n" @@ -467,7 +464,8 @@ msgstr "" "C-функцию непросто, но существуют документированные процедуры для этих " "целей, и их не так много." -msgid "**hardest.c**" +#, fuzzy +msgid "hardest.c" msgstr "**hardest.c**" msgid "" @@ -584,7 +582,8 @@ msgstr "" ":ref:`box_insert() `? Ответ: :ref:`API для языка C `." -msgid "**read.c**" +#, fuzzy +msgid "read.c" msgstr "**read.c**" msgid "" @@ -598,6 +597,7 @@ msgid "Create a file. Name it ``read.c``. Put these 43 lines in it:" msgstr "" "Создайте файл. Назовите его ``read.c``. Запишите в него следующие 43 строки:" +#, fuzzy, python-format msgid "" "#include \"module.h\"\n" "#include \n" @@ -609,13 +609,12 @@ msgid "" " uint32_t key = 10000; /* The key value that box_insert() used */\n" " mp_encode_array(tuple_buf, 0); /* clear */\n" " box_tuple_format_t *fmt = box_tuple_format_default();\n" -" box_tuple_t *tuple = box_tuple_new(fmt, tuple_buf, tuple_buf+512);\n" -" assert(tuple != NULL);\n" +" box_tuple_t *tuple = NULL;\n" " char key_buf[16]; /* Pass key_buf = encoded key = 1000 */\n" " char *key_end = key_buf;\n" " key_end = mp_encode_array(key_end, 1);\n" " key_end = mp_encode_uint(key_end, key);\n" -" assert(key_end < key_buf + sizeof(key_buf));\n" +" assert(key_end <= key_buf + sizeof(key_buf));\n" " /* Get the tuple. There's no box_select() but there's this. */\n" " int r = box_index_get(space_id, index_id, key_buf, key_end, &tuple);\n" " assert(r == 0);\n" @@ -767,7 +766,8 @@ msgstr "" "box_tuple_field>` -- пришли из :ref:`API для языка C `." -msgid "**write.c**" +#, fuzzy +msgid "write.c" msgstr "**write.c**" msgid "" @@ -782,6 +782,7 @@ msgstr "" "Создайте файл. Назовите его ``write.c``. Запишите в него следующие 24 " "строки:" +#, python-format msgid "" "#include \"module.h\"\n" "#include \n" @@ -916,7 +917,8 @@ msgstr "" "Таким образом, хранимые процедуры на языке C получают полный доступ к базе " "данных." -msgid "**Cleaning up**" +#, fuzzy +msgid "Cleaning up" msgstr "**Очистка данных**" msgid "" @@ -939,7 +941,8 @@ msgstr "" "Удалите файлы с разрешением ``.c`` и ``.so``, созданные для данного " "практического задания." -msgid "**An example in the test suite**" +#, fuzzy +msgid "An example in the test suite" msgstr "**Пример из набора тестов**" msgid "" @@ -963,3 +966,10 @@ msgstr "" "Вывод: некоторые тесты из стандартного набора используют хранимые процедуры " "на языке C, а они должны работать, поскольку мы не можем выпустить " "Tarantool, если он не прошел тестирование." + +#~ msgid "" +#~ "Here is one C tutorial: :ref:`C stored procedures `." +#~ msgstr "" +#~ "Ниже приводится практическое занятие на языке C: :ref:`Хранимые процедуры на" +#~ " языке C `." diff --git a/locale/ru/LC_MESSAGES/how-to/app/cookbook.po b/locale/ru/LC_MESSAGES/how-to/app/cookbook.po index be7dcb3940..5ac2360b17 100644 --- a/locale/ru/LC_MESSAGES/how-to/app/cookbook.po +++ b/locale/ru/LC_MESSAGES/how-to/app/cookbook.po @@ -41,7 +41,8 @@ msgid "" "See more recipes on `Tarantool GitHub " "`__." msgstr "" -"Другие рецепты см. на `GitHub Tarantool `__." +"Другие рецепты см. на `GitHub Tarantool " +"`__." msgid "hello_world.lua" msgstr "hello_world.lua" diff --git a/locale/ru/LC_MESSAGES/how-to/app/creating_app.po b/locale/ru/LC_MESSAGES/how-to/app/creating_app.po index 598cb88c83..38419af376 100644 --- a/locale/ru/LC_MESSAGES/how-to/app/creating_app.po +++ b/locale/ru/LC_MESSAGES/how-to/app/creating_app.po @@ -2,21 +2,18 @@ msgid "Creating an application" msgstr "Создание приложения" +#, fuzzy msgid "" "Further we walk you through key programming practices that will give you a " -"good start in writing Lua applications for Tarantool. For an adventure, this" -" is a story of implementing... a real microservice based on Tarantool! We " -"implement a backend for a simplified version of `Pokémon Go " -"`_, a location-based augmented " -"reality game released in mid-2016. In this game, players use a mobile " -"device's GPS capability to locate, capture, battle and train virtual " -"monsters called \"pokémon\", who appear on the screen as if they were in the" -" same real-world location as the player." +"good start in writing Lua applications for Tarantool. We will implement a " +"real microservice based on Tarantool! It is a backend for a simplified " +"version of `Pokémon Go `_, a " +"location-based augmented reality game launched in mid-2016." msgstr "" "Далее мы пошагово разберем ключевые методики программирования, что послужит " "хорошим началом для написания Lua-приложений для Tarantool. Для интереса " -"возьмем историю реализации... настоящего микросервиса на основе Tarantool!" -" Мы реализуем бэкенд для упрощенной версии `Pokémon Go " +"возьмем историю реализации... настоящего микросервиса на основе Tarantool! " +"Мы реализуем бэкенд для упрощенной версии `Pokémon Go " "`_, игры на основе " "определения местоположения дополненной реальности, выпущенной в середине " "2016 года. В этой игре игроки используют GPS-возможности мобильных " @@ -24,12 +21,19 @@ msgstr "" "существ, или покемонов, которые появляются на экране, как если бы они " "находились в том же реальном месте, как и игрок." +msgid "" +"In this game, players use the GPS capability of a mobile device to locate, " +"catch, battle, and train virtual monsters called \"pokémon\" that appear on " +"the screen as if they were in the same real-world location as the player." +msgstr "" + +#, fuzzy msgid "" "To stay within the walk-through format, let's narrow the original gameplay " "as follows. We have a map with pokémon spawn locations. Next, we have " "multiple players who can send catch-a-pokémon requests to the server (which " -"runs our Tarantool microservice). The server replies whether the pokémon is " -"caught or not, increases the player's pokémon counter if yes, and triggers " +"runs our Tarantool microservice). The server responds whether the pokémon is" +" caught or not, increases the player's pokémon counter if yes, and triggers " "the respawn-a-pokémon method that spawns a new pokémon at the same location " "in a while." msgstr "" @@ -41,1763 +45,1765 @@ msgstr "" "респауна покемона, который через некоторое время создает нового покемона на " "том же самом месте." +#, fuzzy msgid "" -"We leave client-side applications outside the scope of this story. Yet we " -"promise a mini-demo in the end to simulate real users and give us some fun. " -":-)" +"We leave client-side applications outside the scope of this story. However, " +"we promise a mini-demo in the end to simulate real users and give us some " +"fun." msgstr "" "Мы вынесем клиентские приложения за рамки рассказа. Но в конце обещаем " "небольшую демонстрацию с моделированием настоящих пользователей, чтобы " "немного поразвлечься. :-)" -msgid "First, what would be the best way to deliver our microservice?" -msgstr "Для начала как лучше всего предоставить микросервис?" - -msgid "Modules, rocks and applications" -msgstr "Модули и приложения" - -msgid "" -"To make our game logic available to other developers and Lua applications, " -"let's put it into a Lua module." -msgstr "" -"Чтобы наша логическая схема игры была доступна другим разработчикам и Lua-" -"приложениям, поместим ее в Lua-модуль." - -msgid "" -"A **module** (called \"rock\" in Lua) is an optional library which enhances " -"Tarantool functionality. So, we can install our logic as a module in " -"Tarantool and use it from any Tarantool application or module. Like " -"applications, modules in Tarantool can be written in Lua (rocks), C or C++." -msgstr "" -"**Модуль** (который называется \"rock\" в Lua) -- это дополнительная " -"библиотека, которая расширяет функции Tarantool. Поэтому можно установить " -"нашу логическую схему в виде модуля в Tarantool и использовать ее из любого " -"Tarantool-приложения или модуля. Как и приложения, модули в Tarantool " -"могут быть написаны на Lua (rocks), C или C++." - -msgid "Modules are good for two things:" -msgstr "Модули хороши для двух целей:" - -msgid "easier **code management** (reuse, packaging, versioning), and" -msgstr "" -"облегченное **управление кодом** (переиспользование, подготовка к " -"развертыванию, версионирование) и" - -msgid "hot **code reload** without restarting the Tarantool instance." -msgstr "горячая **перезагрузка кода** без перезапуска экземпляра Tarantool." - -msgid "" -"Technically, a module is a file with source code that exports its functions " -"in an API. For example, here is a Lua module named ``mymodule.lua`` that " -"exports one function named ``myfun``:" -msgstr "" -"В техническом смысле, модуль - это файл с исходным кодом, который " -"экспортирует свои функции в API. Например, вот Lua-модуль под названием " -"``mymodule.lua``, который экспортирует одну функцию под названием ``myfun``:" - -msgid "" -"local exports = {}\n" -"exports.myfun = function(input_string)\n" -" print('Hello', input_string)\n" -"end\n" -"return exports" -msgstr "" -"local exports = {}\n" -"exports.myfun = function(input_string)\n" -" print('Hello', input_string)\n" -"end\n" -"return exports" - -msgid "" -"To launch the function ``myfun()`` -- from another module, from a Lua " -"application, or from Tarantool itself, -- we need to save this module as a " -"file, then load this module with the ``require()`` directive and call the " -"exported function." -msgstr "" -"Чтобы запустить функцию ``myfun()`` -- из другого модуля, из Lua-приложения " -"или из самого Tarantool -- необходимо сохранить этот модуль в виде файла, " -"а затем загрузить этот модуль с директивой ``require()`` и вызвать " -"экспортированную функцию." - -msgid "" -"For example, here's a Lua application that uses ``myfun()`` function from " -"``mymodule.lua`` module:" -msgstr "" -"Например, вот Lua-приложение, которое использует функцию ``myfun()`` из " -"модуля ``mymodule.lua``:" - -msgid "" -"-- loading the module\n" -"local mymodule = require('mymodule')\n" -"\n" -"-- calling myfun() from within test() function\n" -"local test = function()\n" -" mymodule.myfun()\n" -"end" -msgstr "" -"-- загрузка модуля\n" -"local mymodule = require('mymodule')\n" -"\n" -"-- вызов myfun() из функции test\n" -"local test = function()\n" -" mymodule.myfun()\n" -"end" - -msgid "" -"A thing to remember here is that the ``require()`` directive takes load " -"paths to Lua modules from the ``package.path`` variable. This is a " -"semicolon-separated string, where a question mark is used to interpolate the" -" module name. By default, this variable contains system-wide Lua paths and " -"the working directory. But if we put our modules inside a specific folder " -"(e.g. ``scripts/``), we need to add this folder to ``package.path`` before " -"any calls to ``require()``:" -msgstr "" -"Здесь важно запомнить, что директива ``require()`` берет пути загрузки к " -"Lua-модулям из переменной ``package.path``. Она представляет собой строку с " -"разделителями в виде точки с запятой, где знак вопроса используется для " -"вставки имени модуля. По умолчанию, эта переменная содержит пути в системе и" -" рабочую директорию. Но если мы поместим наши модули в особую папку " -"(например, ``scripts/``), необходимо будет добавить эту папку в " -"``package.path`` до вызова ``require()``:" - -msgid "package.path = 'scripts/?.lua;' .. package.path" -msgstr "package.path = 'scripts/?.lua;' .. package.path" - -msgid "" -"For our microservice, a simple and convenient solution would be to put all " -"methods in a Lua module (say ``pokemon.lua``) and to write a Lua application" -" (say ``game.lua``) that initializes the gaming environment and starts the " -"game loop." -msgstr "" -"Для нашего микросервиса простым и удобным решением будет разместить все " -"методы в Lua-модуле (скажем, ``pokemon.lua``) и написать Lua-приложение " -"(скажем, ``game.lua``), которое запустит игровое окружение и цикл игры." - -msgid "" -"Now let's get down to implementation details. In our game, we need three " -"entities:" -msgstr "" -"Теперь приступим к деталям реализации. В игре нам необходимы три сущности:" - -msgid "" -"**map**, which is an array of pokémons with coordinates of respawn " -"locations; in this version of the game, let a location be a rectangle " -"identified with two points, upper-left and lower-right;" -msgstr "" -"**карта**, которая представляет собой массив покемонов с координатами мест " -"респауна; в данной версии игры пусть местом будет прямоугольник, " -"установленный по двум точкам, верхней левой и нижней правой;" - -msgid "" -"**player**, which has an ID, a name, and coordinates of the player's " -"location point;" -msgstr "" -"**игрок**, у которого есть ID, имя и координаты местонахождения игрока;" - -msgid "" -"**pokémon**, which has the same fields as the player, plus a status " -"(active/inactive, that is present on the map or not) and a catch probability" -" (well, let's give our pokémons a chance to escape :-) )" -msgstr "" -"**покемон**, у которого такие же поля, как и у игрока, плюс статус " -"(активный/неактивный, то есть находится ли на карте) и возможность поимки " -"(давайте уж дадим нашим покемонам шанс сбежать :-) )" - -msgid "" -"We'll store these entities as tuples in Tarantool spaces. But to deliver our" -" backend application as a microservice, the good practice would be to " -"send/receive our data in the universal JSON format, thus using Tarantool as " -"a document storage." -msgstr "" -"Эти данные будем хранить как кортежи в спейсах Tarantool. Но чтобы бэкенд-" -"приложение работало как микросервис, правильно будет отправлять/получать " -"данные в универсальном формате JSON, используя Tarantool в качестве системы " -"хранения документов." - -msgid "Avro schemas" -msgstr "Avro-схемы" - -msgid "" -"To store JSON data as tuples, we will apply a savvy practice which reduces " -"data footprint and ensures all stored documents are valid. We will use " -"Tarantool module `avro-schema `_ " -"which checks the schema of a JSON document and converts it to a Tarantool " -"tuple. The tuple will contain only field values, and thus take a lot less " -"space than the original document. In avro-schema terms, converting JSON " -"documents to tuples is \"flattening\", and restoring the original documents " -"is \"unflattening\"." -msgstr "" -"Чтобы хранить JSON-данные в виде кортежей, используем продвинутую методику, " -"которая уменьшит отпечаток данных и обеспечит пригодность всех сохраняемых " -"документов. Будем использовать Tarantool-модуль `avro-schema " -"`_, который проверяет схему JSON-" -"документа и конвертирует его в кортеж Tarantool. Кортеж будет содержать " -"только значения полей, таким образом, занимая меньше места, чем оригинальный" -" документ. С точки зрения avro-схемы, конвертация JSON-документов в кортежи " -"-- \"flattening\" (конвертация в плоские файлы), а восстановление " -"оригинальных документов -- \"unflattening\" (конвертация из плоских файлов)." - -msgid "" -"First you need to `install " -"`_ " -"the module with ``tarantoolctl rocks install avro-schema``." -msgstr "" -"Для начала необходимо `установить " -"`_ " -"модуль с помощью команды ``tarantoolctl rocks install avro-schema``." - -msgid "Further usage is quite straightforward:" -msgstr "Использовать модуль достаточно просто:" - -msgid "" -"For each entity, we need to define a schema in `Apache Avro schema " -"`_ syntax, where we list the " -"entity's fields with their names and `Avro data types " -"`_." -msgstr "" -"Для каждой сущности необходимо определить схему в синтаксисе `схемы Apache " -"Avro `_, где мы перечисляем поля " -"сущности с их наименованиями и `типами данных по Avro " -"`_." - -msgid "" -"At initialization, we call ``avro-schema.create()`` that creates objects in " -"memory for all schema entities, and ``compile()`` that generates " -"flatten/unflatten methods for each entity." -msgstr "" -"При инициализации мы вызываем функцию ``avro-schema.create()``, которая " -"создает объекты в памяти для всех сущностей схемы, а также функцию " -"``compile()``, которая создает методы flatten/unflatten (конвертация в " -"плоские файлы и обратно) для каждой сущности." - -msgid "" -"Further on, we just call flatten/unflatten methods for a respective entity " -"on receiving/sending the entity's data." -msgstr "" -"Далее мы просто вызываем методы flatten/unflatten для соответствующей " -"сущности при получении/отправке данных об этой сущности." - -msgid "" -"Here's what our schema definitions for the player and pokémon entities look " -"like:" -msgstr "" -"Вот как будут выглядеть определения схемы для сущностей игрока и покемона:" - -msgid "" -"local schema = {\n" -" player = {\n" -" type=\"record\",\n" -" name=\"player_schema\",\n" -" fields={\n" -" {name=\"id\", type=\"long\"},\n" -" {name=\"name\", type=\"string\"},\n" -" {\n" -" name=\"location\",\n" -" type= {\n" -" type=\"record\",\n" -" name=\"player_location\",\n" -" fields={\n" -" {name=\"x\", type=\"double\"},\n" -" {name=\"y\", type=\"double\"}\n" -" }\n" -" }\n" -" }\n" -" }\n" -" },\n" -" pokemon = {\n" -" type=\"record\",\n" -" name=\"pokemon_schema\",\n" -" fields={\n" -" {name=\"id\", type=\"long\"},\n" -" {name=\"status\", type=\"string\"},\n" -" {name=\"name\", type=\"string\"},\n" -" {name=\"chance\", type=\"double\"},\n" -" {\n" -" name=\"location\",\n" -" type= {\n" -" type=\"record\",\n" -" name=\"pokemon_location\",\n" -" fields={\n" -" {name=\"x\", type=\"double\"},\n" -" {name=\"y\", type=\"double\"}\n" -" }\n" -" }\n" -" }\n" -" }\n" -" }\n" -"}" -msgstr "" -"local schema = {\n" -" player = {\n" -" type=\"record\",\n" -" name=\"player_schema\",\n" -" fields={\n" -" {name=\"id\", type=\"long\"},\n" -" {name=\"name\", type=\"string\"},\n" -" {\n" -" name=\"location\",\n" -" type= {\n" -" type=\"record\",\n" -" name=\"player_location\",\n" -" fields={\n" -" {name=\"x\", type=\"double\"},\n" -" {name=\"y\", type=\"double\"}\n" -" }\n" -" }\n" -" }\n" -" }\n" -" },\n" -" pokemon = {\n" -" type=\"record\",\n" -" name=\"pokemon_schema\",\n" -" fields={\n" -" {name=\"id\", type=\"long\"},\n" -" {name=\"status\", type=\"string\"},\n" -" {name=\"name\", type=\"string\"},\n" -" {name=\"chance\", type=\"double\"},\n" -" {\n" -" name=\"location\",\n" -" type= {\n" -" type=\"record\",\n" -" name=\"pokemon_location\",\n" -" fields={\n" -" {name=\"x\", type=\"double\"},\n" -" {name=\"y\", type=\"double\"}\n" -" }\n" -" }\n" -" }\n" -" }\n" -" }\n" -"}" - -msgid "And here's how we create and compile our entities at initialization:" -msgstr "А вот как мы создадим и скомпилируем наши сущности при инициализации:" - -msgid "" -"-- load avro-schema module with require()\n" -"local avro = require('avro_schema')\n" -"\n" -"-- create models\n" -"local ok_m, pokemon = avro.create(schema.pokemon)\n" -"local ok_p, player = avro.create(schema.player)\n" -"if ok_m and ok_p then\n" -" -- compile models\n" -" local ok_cm, compiled_pokemon = avro.compile(pokemon)\n" -" local ok_cp, compiled_player = avro.compile(player)\n" -" if ok_cm and ok_cp then\n" -" -- start the game\n" -" <...>\n" -" else\n" -" log.error('Schema compilation failed')\n" -" end\n" -"else\n" -" log.info('Schema creation failed')\n" -"end\n" -"return false" -msgstr "" -"-- загрузить модуль avro-schema с директивой require()\n" -"local avro = require('avro_schema')\n" -"\n" -"-- создать модели\n" -"local ok_m, pokemon = avro.create(schema.pokemon)\n" -"local ok_p, player = avro.create(schema.player)\n" -"if ok_m and ok_p then\n" -" -- скомпилировать модели\n" -" local ok_cm, compiled_pokemon = avro.compile(pokemon)\n" -" local ok_cp, compiled_player = avro.compile(player)\n" -" if ok_cm and ok_cp then\n" -" -- начать игру\n" -" <...>\n" -" else\n" -" log.error('Schema compilation failed')\n" -" end\n" -"else\n" -" log.info('Schema creation failed')\n" -"end\n" -"return false" - -msgid "" -"As for the map entity, it would be an overkill to introduce a schema for it," -" because we have only one map in the game, it has very few fields, and -- " -"which is most important -- we use the map only inside our logic, never " -"exposing it to external users." -msgstr "" -"Что касается сущности карты, вводить для нее схему будет перебор, потому что" -" в игре всего одна карта, у нее мало полей, и -- что самое главное -- мы " -"используем карту только внутри нашей логики, не показывая ее внешним " -"пользователям." - -msgid "" -"Next, we need methods to implement the game logic. To simulate object-" -"oriented programming in our Lua code, let's store all Lua functions and " -"shared variables in a single local variable (let's name it as ``game``). " -"This will allow us to address functions or variables from within our module " -"as ``self.func_name`` or ``self.var_name``. Like this:" -msgstr "" -"Далее нам нужны методы для реализации игровой логики. Чтобы смоделировать " -"объектно-ориентированное программирование в нашем Lua-коде, будем хранить " -"все Lua-функции и общие переменные в одной внутренней переменной (назовем ее" -" ``game``). Это позволит нам обращаться к функциям или переменным из нашего " -"модуля с помощью ``self.func_name`` или ``self.var_name`` следующим образом:" - -msgid "" -"local game = {\n" -" -- a local variable\n" -" num_players = 0,\n" -"\n" -" -- a method that prints a local variable\n" -" hello = function(self)\n" -" print('Hello! Your player number is ' .. self.num_players .. '.')\n" -" end,\n" -"\n" -" -- a method that calls another method and returns a local variable\n" -" sign_in = function(self)\n" -" self.num_players = self.num_players + 1\n" -" self:hello()\n" -" return self.num_players\n" -" end\n" -"}" -msgstr "" -"local game = {\n" -" -- локальная переменная\n" -" num_players = 0,\n" -"\n" -" -- метод, который выводит локальную переменную\n" -" hello = function(self)\n" -" print('Hello! Your player number is ' .. self.num_players .. '.')\n" -" end,\n" -"\n" -" -- метод, который вызывает другой метод и возвращает локальную переменную\n" -" sign_in = function(self)\n" -" self.num_players = self.num_players + 1\n" -" self:hello()\n" -" return self.num_players\n" -" end\n" -"}" - -msgid "" -"In OOP terms, we can now regard local variables inside ``game`` as object " -"fields, and local functions as object methods." -msgstr "" -"В терминах ООП сейчас мы можем рассматривать внутренние переменные внутри " -"переменной ``game`` как поля объекта, а внутренние функции -- как методы " -"объекта." - -msgid "" -"In this manual, Lua examples use **local** variables. Use **global** " -"variables with caution, since the module’s users may be unaware of them." -msgstr "" -"Обратите внимание, что в текущей документации в примерах Lua-кода " -"используются *локальные* переменные. Используйте *глобальные* переменные " -"аккуратно, поскольку пользователи ваших модулей могут не знать об этих " -"переменных." - -msgid "" -"To enable/disable the use of undeclared global variables in your Lua code, " -"use Tarantool's :ref:`strict ` module." -msgstr "" -"Чтобы включить/отключить использование необъявленных глобальных переменных в" -" вашем коде на языке Lua, используйте модуль Tarantool :ref:`strict " -"`." - -msgid "So, our game module will have the following methods:" -msgstr "Таким образом, в модуле игры будут следующие методы:" - -msgid "" -"``catch()`` to calculate whether the pokémon was caught (besides the " -"coordinates of both the player and pokémon, this method will apply a " -"probability factor, so not every pokémon within the player's reach will be " -"caught);" -msgstr "" -"``catch()`` (поймать) для расчета, когда был пойман покемон (помимо " -"координат как игрока, так и покемона, этот метод будет использовать " -"коэффициент вероятности, чтобы в пределах досягаемости игрока можно было " -"поймать не каждого покемона);" - -msgid "" -"``respawn()`` to add missing pokémons to the map, say, every 60 seconds (we " -"assume that a frightened pokémon runs away, so we remove a pokémon from the " -"map on any catch attempt and add it back to the map in a while);" -msgstr "" -"``respawn()`` (респаун) для добавления отсутствующих покемонов на карту, " -"скажем, каждые 60 секунд (предположим, что испуганный покемон убегает, " -"поэтому мы убираем покемона с карты при любой попытке поймать его и через " -"некоторое время добавляем обратно на карту);" - -msgid "" -"``notify()`` to log information about caught pokémons (like \"Player 1 " -"caught pokémon A\");" -msgstr "" -"``notify()`` (уведомить) для записи информации о пойманных покемонах " -"(например, \"Игрок 1 поймал покемона A\");" - -msgid "" -"``start()`` to initialize the game (it will create database spaces, create " -"and compile avro schemas, and launch ``respawn()``)." -msgstr "" -"``start()`` (начать) для инициализации игры (метод создаст спейсы в базе " -"данных, создаст и скомпилирует avro-схемы, а также запустит метод " -"``respawn()``)." - -msgid "" -"Besides, it would be convenient to have methods for working with Tarantool " -"storage. For example:" -msgstr "" -"Кроме того, было бы удобно завести методы для работы с хранилищем " -"Tarantool. Например:" - -msgid "``add_pokemon()`` to add a pokémon to the database, and" -msgstr "" -"``add_pokemon()`` (добавить покемона) для добавления покемона в базу данных " -"и" - -msgid "``map()`` to populate the map with all pokémons stored in Tarantool." -msgstr "" -"``map()`` (карта) для заполнения карты всеми покемонами, которые хранятся в " -"Tarantool." - -msgid "" -"We'll need these two methods primarily when initializing our game, but we " -"can also call them later, for example to test our code." -msgstr "" -"Эти два метода будут главным образом использоваться во время инициализации " -"нашей игры, но их также можно вызывать позднее, например для тестирования " -"кода." - -msgid "Bootstrapping a database" -msgstr "Настройка базы данных" - -msgid "" -"Let's discuss game initialization. In ``start()`` method, we need to " -"populate Tarantool spaces with pokémon data. Why not keep all game data in " -"memory? Why use a database? The answer is: :ref:`persistence `. Without a database, we risk losing data on power outage, " -"for example. But if we store our data in an in-memory database, Tarantool " -"takes care to persist it on disk whenever it's changed. This gives us one " -"more benefit: quick startup in case of failure. Tarantool has a :ref:`smart " -"algorithm ` that quickly loads all data from " -"disk into memory on startup, so the warm-up takes little time." -msgstr "" -"Обсудим инициализацию игры. В методе ``start()`` нам нужно заполнить спейсы " -"Tarantool данными о покемонах. Почему бы не хранить все игровые данные в " -"памяти? Зачем нужна база данных? Ответ на это: :ref:`персистентность `. Без базы данных мы рискуем потерять данные при отключении" -" электроэнергии, например. Но если мы храним данные в in-memory базе данных," -" Tarantool позаботится о том, чтобы обеспечить постоянное хранение данных " -"при их изменении. Это дает дополнительное преимущество: быстрая загрузка в " -"случае отказа. :ref:`Умный алгоритм ` " -"Tarantool быстро загружает все данные с диска в память при начале работы, " -"так что подготовка к работе не займет много времени." - -msgid "" -"We'll be using functions from Tarantool built-in :ref:`box ` " -"module:" -msgstr "" -"Мы будем использовать функции из встроенного модуля Tarantool :ref:`box " -"`:" - -msgid "" -"``box.schema.create_space('pokemons')`` to create a space named ``pokemon`` " -"for storing information about pokémons (we don't create a similar space for " -"players, because we intend to only send/receive player information via API " -"calls, so we needn't store it);" -msgstr "" -"``box.schema.create_space('pokemons')`` для создания спейса под названием " -"``pokemon`` (покемон), чтобы хранить информацию о покемонах (мы не создаем " -"аналогичный спейс по игрокам, потому что планируем только отправлять и " -"получать информацию об игроках с помощью вызовов API, так что нет " -"необходимости хранить ее);" - -msgid "" -"``box.space.pokemons:create_index('primary', {type = 'hash', parts = {1, " -"'unsigned'}})`` to create a primary HASH index by pokémon ID;" -msgstr "" -"``box.space.pokemons:create_index('primary', {type = 'hash', parts = {1, " -"'unsigned'}})`` для создания первичного HASH-индекса по ID покемона;" - -msgid "" -"``box.space.pokemons:create_index('status', {type = 'tree', parts = {2, " -"'str'}})`` to create a secondary TREE index by pokémon status." -msgstr "" -"``box.space.pokemons:create_index('status', {type = 'tree', parts = {2, " -"'str'}})`` для создания вторичного TREE-индекса по статусу покемона." - -msgid "" -"Notice the ``parts =`` argument in the index specification. The pokémon ID " -"is the first field in a Tarantool tuple since it’s the first member of the " -"respective Avro type. So does the pokémon status. The actual JSON document " -"may have ID or status fields at any position of the JSON map." -msgstr "" -"Обратите внимание на аргумент ``parts =`` в спецификации индекса. ID " -"покемона -- это первое поле в кортеже Tarantool, потому что это первый " -"элемент соответствующего типа Avro. То же относится к статусу покемона. В " -"самом JSON-файле поля ID или статуса могут быть в любом положении на JSON-" -"карте." - -msgid "The implementation of ``start()`` method looks like this:" -msgstr "Реализация метода ``start()`` выглядит следующим образом:" - -msgid "" -"-- create game object\n" -"start = function(self)\n" -" -- create spaces and indexes\n" -" box.once('init', function()\n" -" box.schema.create_space('pokemons')\n" -" box.space.pokemons:create_index(\n" -" \"primary\", {type = 'hash', parts = {1, 'unsigned'}}\n" -" )\n" -" box.space.pokemons:create_index(\n" -" \"status\", {type = \"tree\", parts = {2, 'str'}}\n" -" )\n" -" end)\n" -"\n" -" -- create models\n" -" local ok_m, pokemon = avro.create(schema.pokemon)\n" -" local ok_p, player = avro.create(schema.player)\n" -" if ok_m and ok_p then\n" -" -- compile models\n" -" local ok_cm, compiled_pokemon = avro.compile(pokemon)\n" -" local ok_cp, compiled_player = avro.compile(player)\n" -" if ok_cm and ok_cp then\n" -" -- start the game\n" -" <...>\n" -" else\n" -" log.error('Schema compilation failed')\n" -" end\n" -" else\n" -" log.info('Schema creation failed')\n" -" end\n" -" return false\n" -"end" -msgstr "" -"-- создать игровой объект\n" -"start = function(self)\n" -" -- создать спейсы и индексы\n" -" box.once('init', function()\n" -" box.schema.create_space('pokemons')\n" -" box.space.pokemons:create_index(\n" -" \"primary\", {type = 'hash', parts = {1, 'unsigned'}}\n" -" )\n" -" box.space.pokemons:create_index(\n" -" \"status\", {type = \"tree\", parts = {2, 'str'}}\n" -" )\n" -" end)\n" -"\n" -" -- создать модели\n" -" local ok_m, pokemon = avro.create(schema.pokemon)\n" -" local ok_p, player = avro.create(schema.player)\n" -" if ok_m and ok_p then\n" -" -- скомпилировать модели\n" -" local ok_cm, compiled_pokemon = avro.compile(pokemon)\n" -" local ok_cp, compiled_player = avro.compile(player)\n" -" if ok_cm and ok_cp then\n" -" -- начать игру\n" -" <...>\n" -" else\n" -" log.error('Schema compilation failed')\n" -" end\n" -" else\n" -" log.info('Schema creation failed')\n" -" end\n" -" return false\n" -"end" - -msgid "GIS" -msgstr "ГИС" - -msgid "" -"Now let's discuss ``catch()``, which is the main method in our gaming logic." -msgstr "" -"Теперь обсудим метод ``catch()``, который является основным в логике нашей " -"игры." - -msgid "" -"Here we receive the player's coordinates and the target pokémon's ID number," -" and we need to answer whether the player has actually caught the pokémon or" -" not (remember that each pokémon has a chance to escape)." -msgstr "" -"Здесь мы получаем координаты игрока и номер ID искомого покемона, а нужен " -"нам ответ на вопрос, поймали ли игрок покемона (помните, что у каждого " -"покемона есть шанс убежать)." - -msgid "" -"First thing, we validate the received player data against its :ref:`Avro " -"schema `. And we check whether such a pokémon " -"exists in our database and is displayed on the map (the pokémon must have " -"the active status):" -msgstr "" -"Для начала проверим полученные данные об игроке по :ref:`Avro-схеме " -"`. Также проверим, есть ли такой покемон в базе " -"данных, и отображается ли он на карте (у покемона должен быть активный " -"статус):" - -msgid "" -"catch = function(self, pokemon_id, player)\n" -" -- check player data\n" -" local ok, tuple = self.player_model.flatten(player)\n" -" if not ok then\n" -" return false\n" -" end\n" -" -- get pokemon data\n" -" local p_tuple = box.space.pokemons:get(pokemon_id)\n" -" if p_tuple == nil then\n" -" return false\n" -" end\n" -" local ok, pokemon = self.pokemon_model.unflatten(p_tuple)\n" -" if not ok then\n" -" return false\n" -" end\n" -" if pokemon.status ~= self.state.ACTIVE then\n" -" return false\n" -" end\n" -" -- more catch logic to follow\n" -" <...>\n" -"end" -msgstr "" -"catch = function(self, pokemon_id, player)\n" -" -- проверить данные игрока\n" -" local ok, tuple = self.player_model.flatten(player)\n" -" if not ok then\n" -" return false\n" -" end\n" -" -- получить данные покемона\n" -" local p_tuple = box.space.pokemons:get(pokemon_id)\n" -" if p_tuple == nil then\n" -" return false\n" -" end\n" -" local ok, pokemon = self.pokemon_model.unflatten(p_tuple)\n" -" if not ok then\n" -" return false\n" -" end\n" -" if pokemon.status ~= self.state.ACTIVE then\n" -" return false\n" -" end\n" -" -- логика поимки будет дополняться\n" -" <...>\n" -"end" - -msgid "Next, we calculate the answer: caught or not." -msgstr "Далее вычисляем ответ: пойман или нет." - -msgid "" -"To work with geographical coordinates, we use Tarantool `gis " -"`_ module." -msgstr "" -"Чтобы работать с географическими координатами, используем модуль Tarantool" -" `gis `_." - -msgid "" -"To keep things simple, we don't load any specific map, assuming that we deal" -" with a world map. And we do not validate incoming coordinates, assuming " -"again that all received locations are within the planet Earth." -msgstr "" -"Чтобы не усложнять, не будем загружать какую-то особую карту, допуская, что " -"рассматриваем карту мира. Также не будет проверять поступающие координаты, " -"снова допуская, что все места находятся на планете Земля." - -msgid "We use two geo-specific variables:" -msgstr "Используем две географические переменные:" - -msgid "" -"``wgs84``, which stands for the latest revision of the World Geodetic System" -" standard, `WGS84 " -"`_. Basically, it" -" comprises a standard coordinate system for the Earth and represents the " -"Earth as an ellipsoid." -msgstr "" -"``wgs84``, что означает последнюю редакцию стандарта Мировой геодезической " -"системы координат, `WGS84 " -"`_. В целом, она " -"представляет собой стандартную систему координат Земли и изображает Землю " -"как эллипсоид." - -msgid "" -"``nationalmap``, which stands for the `US National Atlas Equal Area " -"`_. This is a projected coordinates system based on " -"WGS84. It gives us a zero base for location projection and allows " -"positioning our players and pokémons in meters." -msgstr "" -"``nationalmap``, что означает `Государственный атлас США в равновеликой " -"проекции (US National Atlas Equal Area) `_. Это " -"система спроецированных координат на основании WGS84. Она дает основу для " -"проецирования мест и позволяет определить местоположение наших игроков и " -"покемонов в метрах." - -msgid "" -"Both these systems are listed in the EPSG Geodetic Parameter Registry, where" -" each system has a unique number. In our code, we assign these listing " -"numbers to respective variables:" -msgstr "" -"Обе системы указаны в Реестре геодезических параметров EPSG, где каждой " -"системе присвоен уникальный номер. Мы назначим эти числа соответствующим " -"переменным в нашем коде:" - -msgid "" -"wgs84 = 4326,\n" -"nationalmap = 2163," -msgstr "" -"wgs84 = 4326,\n" -"nationalmap = 2163," - -msgid "" -"For our game logic, we need one more variable, ``catch_distance``, which " -"defines how close a player must get to a pokémon before trying to catch it. " -"Let's set the distance to 100 meters." -msgstr "" -"Для игровой логики необходима еще одна переменная ``catch_distance``, " -"которая определяет, насколько близко игрок должен подойти к покемону, чтобы " -"попытаться поймать его. Определим это расстояние в 100 метров." - -msgid "catch_distance = 100," -msgstr "catch_distance = 100," - -msgid "" -"Now we're ready to calculate the answer. We need to project the current " -"location of both player (``p_pos``) and pokémon (``m_pos``) on the map, " -"check whether the player is close enough to the pokémon (using " -"``catch_distance``), and calculate whether the player has caught the pokémon" -" (here we generate some random value and let the pokémon escape if the " -"random value happens to be less than 100 minus pokémon's chance value):" -msgstr "" -"Теперь можно рассчитать ответ. Необходимо спроецировать текущее " -"местоположение как игрока (``p_pos``), так и покемона (``m_pos``) на карте, " -"проверить, достаточно ли близко к покемону находится игрок (с помощью " -"``catch_distance``), и рассчитать, поймал ли игрок покемона (здесь мы " -"генерируем случайное значение, и покемон убегает, если случайное значение " -"оказывается меньше, чем 100 минус случайная величина покемона):" - -msgid "" -"-- project locations\n" -"local m_pos = gis.Point(\n" -" {pokemon.location.x, pokemon.location.y}, self.wgs84\n" -"):transform(self.nationalmap)\n" -"local p_pos = gis.Point(\n" -" {player.location.x, player.location.y}, self.wgs84\n" -"):transform(self.nationalmap)\n" -"\n" -"-- check catch distance condition\n" -"if p_pos:distance(m_pos) > self.catch_distance then\n" -" return false\n" -"end\n" -"-- try to catch pokemon\n" -"local caught = math.random(100) >= 100 - pokemon.chance\n" -"if caught then\n" -" -- update and notify on success\n" -" box.space.pokemons:update(\n" -" pokemon_id, {{'=', self.STATUS, self.state.CAUGHT}}\n" -" )\n" -" self:notify(player, pokemon)\n" -"end\n" -"return caught" -msgstr "" -"-- спроецировать местоположение\n" -" local m_pos = gis.Point(\n" -" {pokemon.location.x, pokemon.location.y}, self.wgs84\n" -" ):transform(self.nationalmap)\n" -" local p_pos = gis.Point(\n" -" {player.location.x, player.location.y}, self.wgs84\n" -" ):transform(self.nationalmap)\n" -" \n" -" -- проверить условие близости игрока\n" -" if p_pos:distance(m_pos) > self.catch_distance then\n" -" return false\n" -" end\n" -" -- попытаться поймать покемона\n" -" local caught = math.random(100) >= 100 - pokemon.chance\n" -" if caught then\n" -" -- обновить и сообщить об успехе\n" -" box.space.pokemons:update(\n" -" pokemon_id, {{'=', self.STATUS, self.state.CAUGHT}}\n" -" )\n" -" self:notify(player, pokemon)\n" -" end\n" -" return caught" - -msgid "Index iterators" -msgstr "Итератор с индексом" - -msgid "" -"By our gameplay, all caught pokémons are returned back to the map. We do " -"this for all pokémons on the map every 60 seconds using ``respawn()`` " -"method. We iterate through pokémons by status using Tarantool index iterator" -" function :doc:`/reference/reference_lua/box_index/pairs` and reset the " -"statuses of all \"caught\" pokémons back to \"active\" using " -"``box.space.pokemons:update()``." -msgstr "" -"По сюжету игры все пойманные покемоны возвращаются на карту. Метод " -"``respawn()`` обеспечивает это для всех покемонов на карте каждые 60 секунд." -" Мы выполняем перебор покемонов по статусу с помощью функции Tarantool " -"итератора с индексом :doc:`/reference/reference_lua/box_index/pairs` и " -"сбрасываем статусы всех \"пойманных\" покемонов обратно на \"активный\" с " -"помощью ``box.space.pokemons:update()``." - -msgid "" -"respawn = function(self)\n" -" fiber.name('Respawn fiber')\n" -" for _, tuple in box.space.pokemons.index.status:pairs(\n" -" self.state.CAUGHT) do\n" -" box.space.pokemons:update(\n" -" tuple[self.ID],\n" -" {{'=', self.STATUS, self.state.ACTIVE}}\n" -" )\n" -" end\n" -" end" -msgstr "" -"respawn = function(self)\n" -" fiber.name('Respawn fiber')\n" -" for _, tuple in box.space.pokemons.index.status:pairs(\n" -" self.state.CAUGHT) do\n" -" box.space.pokemons:update(\n" -" tuple[self.ID],\n" -" {{'=', self.STATUS, self.state.ACTIVE}}\n" -" )\n" -" end\n" -" end" - -msgid "For readability, we introduce named fields:" -msgstr "Для удобства введем именованные поля:" - -msgid "ID = 1, STATUS = 2," -msgstr "ID = 1, STATUS = 2," - -msgid "The complete implementation of ``start()`` now looks like this:" -msgstr "Реализация метода ``start()`` полностью теперь выглядит так:" - -msgid "" -"-- create game object\n" -"start = function(self)\n" -" -- create spaces and indexes\n" -" box.once('init', function()\n" -" box.schema.create_space('pokemons')\n" -" box.space.pokemons:create_index(\n" -" \"primary\", {type = 'hash', parts = {1, 'unsigned'}}\n" -" )\n" -" box.space.pokemons:create_index(\n" -" \"status\", {type = \"tree\", parts = {2, 'str'}}\n" -" )\n" -" end)\n" -"\n" -" -- create models\n" -" local ok_m, pokemon = avro.create(schema.pokemon)\n" -" local ok_p, player = avro.create(schema.player)\n" -" if ok_m and ok_p then\n" -" -- compile models\n" -" local ok_cm, compiled_pokemon = avro.compile(pokemon)\n" -" local ok_cp, compiled_player = avro.compile(player)\n" -" if ok_cm and ok_cp then\n" -" -- start the game\n" -" self.pokemon_model = compiled_pokemon\n" -" self.player_model = compiled_player\n" -" self.respawn()\n" -" log.info('Started')\n" -" return true\n" -" else\n" -" log.error('Schema compilation failed')\n" -" end\n" -" else\n" -" log.info('Schema creation failed')\n" -" end\n" -" return false\n" -"end" -msgstr "" -"-- создать игровой объект\n" -"start = function(self)\n" -" -- создать спейсы и индексы\n" -" box.once('init', function()\n" -" box.schema.create_space('pokemons')\n" -" box.space.pokemons:create_index(\n" -" \"primary\", {type = 'hash', parts = {1, 'unsigned'}}\n" -" )\n" -" box.space.pokemons:create_index(\n" -" \"status\", {type = \"tree\", parts = {2, 'str'}}\n" -" )\n" -" end)\n" -"\n" -" -- создать модели\n" -" local ok_m, pokemon = avro.create(schema.pokemon)\n" -" local ok_p, player = avro.create(schema.player)\n" -" if ok_m and ok_p then\n" -" -- скомпилировать модели\n" -" local ok_cm, compiled_pokemon = avro.compile(pokemon)\n" -" local ok_cp, compiled_player = avro.compile(player)\n" -" if ok_cm and ok_cp then\n" -" -- начать игру\n" -" self.pokemon_model = compiled_pokemon\n" -" self.player_model = compiled_player\n" -" self.respawn()\n" -" log.info('Started')\n" -" return true\n" -" else\n" -" log.error('Schema compilation failed')\n" -" end\n" -" else\n" -" log.info('Schema creation failed')\n" -" end\n" -" return false\n" -"end" - -msgid "Fibers" -msgstr "Файберы" - -msgid "" -"But wait! If we launch it as shown above -- ``self.respawn()`` -- the " -"function will be executed only once, just like all the other methods. But we" -" need to execute ``respawn()`` every 60 seconds. Creating a :ref:`fiber " -"` is the Tarantool way of making application logic work in the" -" background at all times." -msgstr "" -"Но подождите! Если мы запустим функцию ``self.respawn()``, как показано " -"выше, то она запустится только один раз, как и остальные методы. А нам " -"необходимо запускать ``respawn()`` каждые 60 секунд. Tarantool заставляет " -"логику приложения непрерывно работать в фоновом режиме с помощью " -":ref:`файбера `." - -msgid "" -"A **fiber** exists for executing instruction sequences but it is not a " -"thread. The key difference is that threads use preemptive multitasking, " -"while fibers use cooperative multitasking. This gives fibers the following " -"two advantages over threads:" -msgstr "" -"**Файбер** предназначен для выполнения последовательностей команд, но это не" -" поток. Ключевое отличие в том, что потоки используют многозадачность с " -"реализацией приоритетов, тогда как файберы используют кооперативную " -"многозадачность. Это дает файберам два преимущества над потоками:" - -msgid "" -"Better controllability. Threads often depend on the kernel's thread " -"scheduler to preempt a busy thread and resume another thread, so preemption " -"may occur unpredictably. Fibers yield themselves to run another fiber while " -"executing, so yields are controlled by application logic." -msgstr "" -"Улучшенная управляемость. Потоки часто зависят от планировщика потока ядра в" -" вопросе вытеснения занятого потока и возобновления другого потока, поэтому " -"вытеснение может быть непредвиденным. Файберы передают управление " -"самостоятельно другому файберу во время работы, поэтому управление файберами" -" осуществляется логикой приложения." - -msgid "" -"Higher performance. Threads require more resources to preempt as they need " -"to address the system kernel. Fibers are lighter and faster as they don't " -"need to address the kernel to yield." -msgstr "" -"Повышенная производительность. Потокам необходимо больше ресурсов для " -"вытеснения, поскольку они обращаются к ядру системы. Файберы легче и " -"быстрее, поскольку для передачи управления им не нужно обращаться к ядру." - -msgid "" -"Yet fibers have some limitations as compared with threads, the main " -"limitation being no multi-core mode. All fibers in an application belong to " -"a single thread, so they all use the same CPU core as the parent thread. " -"Meanwhile, this limitation is not really serious for Tarantool applications," -" because a typical bottleneck for Tarantool is the HDD, not the CPU." -msgstr "" -"Однако у файберов есть определенные ограничения, по сравнению с потоками, " -"основное из которых -- отсутствие режима работы с многоядерной системой. Все" -" файберы в приложении относятся к одному потоку, поэтому они используют то " -"же ядро процессора, что и родительский поток. В то же время, это ограничение" -" незначительно для приложений Tarantool, поскольку узкое место Tarantool" -" -- жесткий диск, а не ЦП." - -msgid "" -"A fiber has all the features of a Lua `coroutine " -"`_ and all programming concepts that" -" apply for Lua coroutines will apply for fibers as well. However, Tarantool " -"has made some enhancements for fibers and has used fibers internally. So, " -"although use of coroutines is possible and supported, use of fibers is " -"recommended." -msgstr "" -"У файбера есть все возможности `сопрограммы " -"`_ на языке Lua, и все принципы " -"программирования, которые применяются к сопрограммам на Lua, применимы и к " -"файберам. Однако Tarantool расширил возможности файберов для внутреннего " -"использования. Поэтому, несмотря на возможность и поддержку использования " -"сопрограмм, рекомендуется использовать файберы." - -msgid "" -"Well, performance or controllability are of little importance in our case. " -"We'll launch ``respawn()`` in a fiber to make it work in the background all " -"the time. To do so, we'll need to amend ``respawn()``:" -msgstr "" -"Производительность или управляемость не слишком важны в нашем случае. " -"Запустим ``respawn()`` в файбере для непрерывной работы в фоновом режиме. " -"Для этого необходимо изменить ``respawn()``:" - -msgid "" -"respawn = function(self)\n" -" -- let's give our fiber a name;\n" -" -- this will produce neat output in fiber.info()\n" -" fiber.name('Respawn fiber')\n" -" while true do\n" -" for _, tuple in box.space.pokemons.index.status:pairs(\n" -" self.state.CAUGHT) do\n" -" box.space.pokemons:update(\n" -" tuple[self.ID],\n" -" {{'=', self.STATUS, self.state.ACTIVE}}\n" -" )\n" -" end\n" -" fiber.sleep(self.respawn_time)\n" -" end\n" -"end" -msgstr "" -"respawn = function(self)\n" -" -- назовем наш файбер;\n" -" -- это выполнит чистый вывод в fiber.info()\n" -" fiber.name('Respawn fiber')\n" -" while true do\n" -" for _, tuple in box.space.pokemons.index.status:pairs(\n" -" self.state.CAUGHT) do\n" -" box.space.pokemons:update(\n" -" tuple[self.ID],\n" -" {{'=', self.STATUS, self.state.ACTIVE}}\n" -" )\n" -" end\n" -" fiber.sleep(self.respawn_time)\n" -" end\n" -"end" - -msgid "and call it as a fiber in ``start()``:" -msgstr "и назвать его файбером в ``start()``:" - -msgid "" -"start = function(self)\n" -" -- create spaces and indexes\n" -" <...>\n" -" -- create models\n" -" <...>\n" -" -- compile models\n" -" <...>\n" -" -- start the game\n" -" self.pokemon_model = compiled_pokemon\n" -" self.player_model = compiled_player\n" -" fiber.create(self.respawn, self)\n" -" log.info('Started')\n" -" -- errors if schema creation or compilation fails\n" -" <...>\n" -"end" -msgstr "" -"start = function(self)\n" -" -- создать спейсы и индексы\n" -" <...>\n" -" -- создать модели\n" -" <...>\n" -" -- скомпилировать модели\n" -" <...>\n" -" -- начать игру\n" -" self.pokemon_model = compiled_pokemon\n" -" self.player_model = compiled_player\n" -" fiber.create(self.respawn, self)\n" -" log.info('Started')\n" -" -- ошибки, если создание схемы или компиляция не работает\n" -" <...>\n" -"end" - -msgid "Logging" -msgstr "Запись в журнал" - -msgid "" -"One more helpful function that we used in ``start()`` was ``log.infо()`` " -"from Tarantool :ref:`log ` module. We also need this function in" -" ``notify()`` to add a record to the log file on every successful catch:" -msgstr "" -"В ``start()`` мы использовали еще одну полезную функцию -- ``log.infо()`` " -"из :ref:`модуля log ` Tarantool . Эта функция также " -"понадобится в ``notify()`` для добавления записи в файл журнала при каждой " -"успешной поимке:" - -msgid "" -"-- event notification\n" -"notify = function(self, player, pokemon)\n" -" log.info(\"Player '%s' caught '%s'\", player.name, pokemon.name)\n" -"end" -msgstr "" -"-- уведомление о событии\n" -"notify = function(self, player, pokemon)\n" -" log.info(\"Player '%s' caught '%s'\", player.name, pokemon.name)\n" -"end" - -msgid "" -"We use default Tarantool :ref:`log settings `, so we'll see the" -" log output in console when we launch our application in script mode." -msgstr "" -"Мы используем стандартные :ref:`настройки журнала ` " -"Tarantool, поэтому увидим вывод записей журнала в консоли, когда запустим " -"приложение в режиме скрипта." - -msgid "" -"Great! We've discussed all programming practices used in our Lua module (see" -" `pokemon.lua " -"`_)." -msgstr "" -"Отлично! Мы обсудили все методики программирования, используемые в нашем " -"Lua-модуле (см. `pokemon.lua " -"`_)." - -msgid "" -"Now let's prepare the test environment. As planned, we write a Lua " -"application (see `game.lua " -"`_) to initialize " -"Tarantool's database module, initialize our game, call the game loop and " -"simulate a couple of player requests." -msgstr "" -"Теперь подготовим среду тестирования. Как и планировалось, напишем " -"приложение на языке Lua (см. `game.lua " -"`_), чтобы " -"инициализировать модуль базы данных Tarantool, инициализировать нашу игру," -" вызвать цикл игры и смоделировать пару запросов от игроков." - -msgid "" -"To launch our microservice, we put both the ``pokemon.lua`` module and the " -"``game.lua`` application in the current directory, install all external " -"modules, and launch the Tarantool instance running our ``game.lua`` " -"application (this example is for Ubuntu):" -msgstr "" -"Чтобы запустить микросервис, поместим модуль ``pokemon.lua`` и приложение " -"``game.lua`` в текущую директорию, установим все внешние модули и запустим " -"экземпляр Tarantool с работающим приложением ``game.lua`` (это пример для " -"Ubuntu):" - -msgid "" -"$ ls\n" -"game.lua pokemon.lua\n" -"$ sudo apt-get install tarantool-gis\n" -"$ sudo apt-get install tarantool-avro-schema\n" -"$ tarantool game.lua" -msgstr "" -"$ ls\n" -"game.lua pokemon.lua\n" -"$ sudo apt-get install tarantool-gis\n" -"$ sudo apt-get install tarantool-avro-schema\n" -"$ tarantool game.lua" - -msgid "" -"Tarantool starts and initializes the database. Then Tarantool executes the " -"demo logic from ``game.lua``: adds a pokémon named Pikachu (its chance to be" -" caught is very high, 99.1), displays the current map (it contains one " -"active pokémon, Pikachu) and processes catch requests from two players. " -"Player1 is located just near the lonely Pikachu pokémon and Player2 is " -"located far away from it. As expected, the catch results in this output are " -"\"true\" for Player1 and \"false\" for Player2. Finally, Tarantool displays " -"the current map which is empty, because Pikachu is caught and temporarily " -"inactive:" -msgstr "" -"Tarantool запускает и инициализирует базу данных. Затем Tarantool выполняет " -"демо-логику из ``game.lua``: добавляет покемона под названием Пикачу " -"(Pikachu) (шанс его поимки очень высок -- 99,1), отображает текущую карту " -"(на ней расположен один активный покемон, Пикачу) и обрабатывает запросы " -"поимки от двух игроков. Player1 (Игрок 1) находится очень близко к одинокому" -" покемону Пикачу, а Player2 (Игрок 2) находится очень далеко от него. Как " -"предполагается, результаты поимки в таком выводе будут \"true\" для Player1 " -"и \"false\" для Player2. Наконец, Tarantool отображает текущую карту, " -"которая пуста, потому что Пикачу пойман и временно неактивен:" - -msgid "" -"$ tarantool game.lua\n" -"2017-01-09 20:19:24.605 [6282] main/101/game.lua C> version 1.7.3-43-gf5fa1e1\n" -"2017-01-09 20:19:24.605 [6282] main/101/game.lua C> log level 5\n" -"2017-01-09 20:19:24.605 [6282] main/101/game.lua I> mapping 1073741824 bytes for tuple arena...\n" -"2017-01-09 20:19:24.609 [6282] main/101/game.lua I> initializing an empty data directory\n" -"2017-01-09 20:19:24.634 [6282] snapshot/101/main I> saving snapshot `./00000000000000000000.snap.inprogress'\n" -"2017-01-09 20:19:24.635 [6282] snapshot/101/main I> done\n" -"2017-01-09 20:19:24.641 [6282] main/101/game.lua I> ready to accept requests\n" -"2017-01-09 20:19:24.786 [6282] main/101/game.lua I> Started\n" -"---\n" -"- {'id': 1, 'status': 'active', 'location': {'y': 2, 'x': 1}, 'name': 'Pikachu', 'chance': 99.1}\n" -"...\n" -"\n" -"2017-01-09 20:19:24.789 [6282] main/101/game.lua I> Player 'Player1' caught 'Pikachu'\n" -"true\n" -"false\n" -"--- []\n" -"...\n" -"\n" -"2017-01-09 20:19:24.789 [6282] main C> entering the event loop" -msgstr "" -"$ tarantool game.lua\n" -"2017-01-09 20:19:24.605 [6282] main/101/game.lua C> version 1.7.3-43-gf5fa1e1\n" -"2017-01-09 20:19:24.605 [6282] main/101/game.lua C> log level 5\n" -"2017-01-09 20:19:24.605 [6282] main/101/game.lua I> mapping 1073741824 bytes for tuple arena...\n" -"2017-01-09 20:19:24.609 [6282] main/101/game.lua I> initializing an empty data directory\n" -"2017-01-09 20:19:24.634 [6282] snapshot/101/main I> saving snapshot `./00000000000000000000.snap.inprogress'\n" -"2017-01-09 20:19:24.635 [6282] snapshot/101/main I> done\n" -"2017-01-09 20:19:24.641 [6282] main/101/game.lua I> ready to accept requests\n" -"2017-01-09 20:19:24.786 [6282] main/101/game.lua I> Started\n" -"---\n" -"- {'id': 1, 'status': 'active', 'location': {'y': 2, 'x': 1}, 'name': 'Pikachu', 'chance': 99.1}\n" -"...\n" -"\n" -"2017-01-09 20:19:24.789 [6282] main/101/game.lua I> Player 'Player1' caught 'Pikachu'\n" -"true\n" -"false\n" -"--- []\n" -"...\n" -"\n" -"2017-01-09 20:19:24.789 [6282] main C> entering the event loop" - -msgid "nginx" -msgstr "nginx" - -msgid "" -"In the real life, this microservice would work over HTTP. Let's add `nginx " -"`_ web server to our environment and make a similar " -"demo. But how do we make Tarantool methods callable via REST API? We use " -"nginx with `Tarantool nginx upstream " -"`_ module and create one" -" more Lua script (`app.lua " -"`_) that exports " -"three of our game methods -- ``add_pokemon()``, ``map()`` and ``catch()`` --" -" as REST endpoints of the nginx upstream module:" -msgstr "" -"В реальной жизни такой микросервис работал бы по HTTP. Добавим веб-сервер " -"`nginx `_ в нашу среду и сделаем аналогичный пример. " -"Но как вызывать методы Tarantool с помощью REST API? Мы используем nginx с" -" модулем `Tarantool nginx upstream " -"`_ и создадим еще один " -"скрипт на Lua (`app.lua " -"`_), который " -"экспортирует три наших игровых метода -- ``add_pokemon()``, ``map()`` и " -"``catch()`` -- в качестве конечных точек обработки запросов REST модуля " -"nginx upstream:" - -msgid "" -"local game = require('pokemon')\n" -"box.cfg{listen=3301}\n" -"game:start()\n" -"\n" -"-- add, map and catch functions exposed to REST API\n" -"function add(request, pokemon)\n" -" return {\n" -" result=game:add_pokemon(pokemon)\n" -" }\n" -"end\n" -"\n" -"function map(request)\n" -" return {\n" -" map=game:map()\n" -" }\n" -"end\n" -"\n" -"function catch(request, pid, player)\n" -" local id = tonumber(pid)\n" -" if id == nil then\n" -" return {result=false}\n" -" end\n" -" return {\n" -" result=game:catch(id, player)\n" -" }\n" -"end" -msgstr "" -"local game = require('pokemon')\n" -"box.cfg{listen=3301}\n" -"game:start()\n" -"\n" -"-- функции add, map и catch по REST API\n" -"function add(request, pokemon)\n" -" return {\n" -" result=game:add_pokemon(pokemon)\n" -" }\n" -"end\n" -"\n" -"function map(request)\n" -" return {\n" -" map=game:map()\n" -" }\n" -"end\n" -"\n" -"function catch(request, pid, player)\n" -" local id = tonumber(pid)\n" -" if id == nil then\n" -" return {result=false}\n" -" end\n" -" return {\n" -" result=game:catch(id, player)\n" -" }\n" -"end" - -msgid "" -"An easy way to configure and launch nginx would be to create a Docker " -"container based on a `Docker image " -"`_ with nginx and the " -"upstream module already installed (see `http/Dockerfile " -"`_). We take " -"a standard `nginx.conf " -"`_, where we " -"define an upstream with our Tarantool backend running (this is another " -"Docker container, see details below):" -msgstr "" -"Чтобы с легкостью настроить и запустить nginx, необходимо создать Docker-" -"контейнер на основе `Docker-образа `_ с уже установленными nginx и модулем upstream (см. " -"`http/Dockerfile " -"`_). Берем " -"стандартный `nginx.conf " -"`_, где " -"определяем upstream с работающим бэкендом Tarantool (это еще один Docker-" -"контейнер, см. нижеприведенную информацию):" - -msgid "" -"upstream tnt {\n" -" server pserver:3301 max_fails=1 fail_timeout=60s;\n" -" keepalive 250000;\n" -"}" -msgstr "" -"upstream tnt {\n" -" server pserver:3301 max_fails=1 fail_timeout=60s;\n" -" keepalive 250000;\n" -"}" - -msgid "" -"and add some Tarantool-specific parameters (see descriptions in the upstream" -" module's `README " -"`_ file):" -msgstr "" -"и добавляем специальные параметры для Tarantool (см. описание в файле " -"`README `_ " -"модуля upstream):" - -msgid "" -"server {\n" -" server_name tnt_test;\n" -"\n" -" listen 80 default deferred reuseport so_keepalive=on backlog=65535;\n" -"\n" -" location = / {\n" -" root /usr/local/nginx/html;\n" -" }\n" -"\n" -" location /api {\n" -" # answers check infinity timeout\n" -" tnt_read_timeout 60m;\n" -" if ( $request_method = GET ) {\n" -" tnt_method \"map\";\n" -" }\n" -" tnt_http_rest_methods get;\n" -" tnt_http_methods all;\n" -" tnt_multireturn_skip_count 2;\n" -" tnt_pure_result on;\n" -" tnt_pass_http_request on parse_args;\n" -" tnt_pass tnt;\n" -" }\n" -"}" -msgstr "" -"server {\n" -" server_name tnt_test;\n" -"\n" -" listen 80 default deferred reuseport so_keepalive=on backlog=65535;\n" -"\n" -" location = / {\n" -" root /usr/local/nginx/html;\n" -" }\n" -"\n" -" location /api {\n" -" # ответы проверяют бесконечное время ожидания\n" -" tnt_read_timeout 60m;\n" -" if ( $request_method = GET ) {\n" -" tnt_method \"map\";\n" -" }\n" -" tnt_http_rest_methods get;\n" -" tnt_http_methods all;\n" -" tnt_multireturn_skip_count 2;\n" -" tnt_pure_result on;\n" -" tnt_pass_http_request on parse_args;\n" -" tnt_pass tnt;\n" -" }\n" -"}" - -msgid "" -"Likewise, we put Tarantool server and all our game logic in a second Docker " -"container based on the `official Tarantool 1.9 image " -"`_ (see `src/Dockerfile " -"`_) and set " -"the container's default command to ``tarantool app.lua``. This is the " -"backend." -msgstr "" -"Аналогичным образом, поместим Tarantool-сервер и всю игровую логику в другой" -" Docker-контейнер на основе `официального образа Tarantool 1.9 " -"`_ (см. `src/Dockerfile " -"`_) и " -"установим ``tarantool app.lua`` в качестве стандартной команды для " -"контейнера. Это бэкенд." - -msgid "Non-blocking IO" -msgstr "Неблокирующий ввод-вывод" - -msgid "" -"To test the REST API, we create a new script (`client.lua " -"`_), which " -"is similar to our ``game.lua`` application, but makes HTTP POST and GET " -"requests rather than calling Lua functions:" -msgstr "" -"Чтобы протестировать REST API, создадим новый скрипт (`client.lua " -"`_), " -"который похож на наше приложение ``game.lua``, но отправляет запросы HTTP " -"POST и GET, а не вызывает Lua-функции:" - -msgid "" -"local http = require('curl').http()\n" -"local json = require('json')\n" -"local URI = os.getenv('SERVER_URI')\n" -"local fiber = require('fiber')\n" -"\n" -"local player1 = {\n" -" name=\"Player1\",\n" -" id=1,\n" -" location = {\n" -" x=1.0001,\n" -" y=2.0003\n" -" }\n" -"}\n" -"local player2 = {\n" -" name=\"Player2\",\n" -" id=2,\n" -" location = {\n" -" x=30.123,\n" -" y=40.456\n" -" }\n" -"}\n" -"\n" -"local pokemon = {\n" -" name=\"Pikachu\",\n" -" chance=99.1,\n" -" id=1,\n" -" status=\"active\",\n" -" location = {\n" -" x=1,\n" -" y=2\n" -" }\n" -"}\n" -"\n" -"function request(method, body, id)\n" -" local resp = http:request(\n" -" method, URI, body\n" -" )\n" -" if id ~= nil then\n" -" print(string.format('Player %d result: %s',\n" -" id, resp.body))\n" -" else\n" -" print(resp.body)\n" -" end\n" -"end\n" -"\n" -"local players = {}\n" -"function catch(player)\n" -" fiber.sleep(math.random(5))\n" -" print('Catch pokemon by player ' .. tostring(player.id))\n" -" request(\n" -" 'POST', '{\"method\": \"catch\",\n" -" \"params\": [1, '..json.encode(player)..']}',\n" -" tostring(player.id)\n" -" )\n" -" table.insert(players, player.id)\n" -"end\n" -"\n" -"print('Create pokemon')\n" -"request('POST', '{\"method\": \"add\",\n" -" \"params\": ['..json.encode(pokemon)..']}')\n" -"request('GET', '')\n" -"\n" -"fiber.create(catch, player1)\n" -"fiber.create(catch, player2)\n" -"\n" -"-- wait for players\n" -"while #players ~= 2 do\n" -" fiber.sleep(0.001)\n" -"end\n" -"\n" -"request('GET', '')\n" -"os.exit()" -msgstr "" -"local http = require('curl').http()\n" -"local json = require('json')\n" -"local URI = os.getenv('SERVER_URI')\n" -"local fiber = require('fiber')\n" -"\n" -"local player1 = {\n" -" name=\"Player1\",\n" -" id=1,\n" -" location = {\n" -" x=1.0001,\n" -" y=2.0003\n" -" }\n" -"}\n" -"local player2 = {\n" -" name=\"Player2\",\n" -" id=2,\n" -" location = {\n" -" x=30.123,\n" -" y=40.456\n" -" }\n" -"}\n" -"\n" -"local pokemon = {\n" -" name=\"Pikachu\",\n" -" chance=99.1,\n" -" id=1,\n" -" status=\"active\",\n" -" location = {\n" -" x=1,\n" -" y=2\n" -" }\n" -"}\n" -"\n" -"function request(method, body, id)\n" -" local resp = http:request(\n" -" method, URI, body\n" -" )\n" -" if id ~= nil then\n" -" print(string.format('Player %d result: %s',\n" -" id, resp.body))\n" -" else\n" -" print(resp.body)\n" -" end\n" -"end\n" -"\n" -"local players = {}\n" -"function catch(player)\n" -" fiber.sleep(math.random(5))\n" -" print('Catch pokemon by player ' .. tostring(player.id))\n" -" request(\n" -" 'POST', '{\"method\": \"catch\",\n" -" \"params\": [1, '..json.encode(player)..']}',\n" -" tostring(player.id)\n" -" )\n" -" table.insert(players, player.id)\n" -"end\n" -"\n" -"print('Create pokemon')\n" -"request('POST', '{\"method\": \"add\",\n" -" \"params\": ['..json.encode(pokemon)..']}')\n" -"request('GET', '')\n" -"\n" -"fiber.create(catch, player1)\n" -"fiber.create(catch, player2)\n" -"\n" -"-- подождать игроков\n" -"while #players ~= 2 do\n" -" fiber.sleep(0.001)\n" -"end\n" -"\n" -"request('GET', '')\n" -"os.exit()" - -msgid "" -"When you run this script, you’ll notice that both players have equal chances" -" to make the first attempt at catching the pokémon. In a classical Lua " -"script, a networked call blocks the script until it’s finished, so the first" -" catch attempt can only be done by the player who entered the game first. In" -" Tarantool, both players play concurrently, since all modules are integrated" -" with Tarantool :ref:`cooperative multitasking ` and use non-blocking I/O." -msgstr "" -"При запуске этого скрипта вы заметите, что у обоих игроков одинаковые шансы " -"сделать первую попытку поимки покемона. В классическом Lua-скрипте сетевой " -"вызов блокирует скрипт, пока он не будет выполнен, поэтому первым попытаться" -" поймать может тот игрок, который раньше зашел в игру. В Tarantool оба " -"игрока играют одновременно, поскольку все модули объединены в " -":ref:`кооперативной многозадачности ` и " -"используют неблокирующий ввод-вывод." - -msgid "" -"Indeed, when Player1 makes its first REST call, the script doesn’t block. " -"The fiber running ``catch()`` function on behalf of Player1 issues a non-" -"blocking call to the operating system and yields control to the next fiber, " -"which happens to be the fiber of Player2. Player2’s fiber does the same. " -"When the network response is received, Player1's fiber is activated by " -"Tarantool cooperative scheduler, and resumes its work. All Tarantool " -":ref:`modules ` use non-blocking I/O and are integrated " -"with Tarantool cooperative scheduler. For module developers, Tarantool " -"provides an :ref:`API `." -msgstr "" -"Действительно, когда Player1 посылает первый REST-вызов, скрипт не " -"блокируется. Файбер, выполняющий функцию ``catch()`` от Player1, посылает " -"неблокирующий вызов в операционную систему и передает управление на " -"следующий файбер, которым оказывается файбер от Player2. Файбер от Player2 " -"делает то же самое. Когда получен сетевой ответ, файбер от Player1 " -"активируется с помощью кооперативного планировщика Tarantool и " -"возобновляет работу. Все :ref:`модули ` Tarantool " -"используют неблокирующий ввод-вывод и интегрированы с кооперативным " -"планировщиком Tarantool. Разработчикам модулей Tarantool предоставляет " -":ref:`API `." - -msgid "" -"For our HTTP test, we create a third container based on the `official " -"Tarantool 1.9 image `_ (see " -"`client/Dockerfile " -"`_) and set" -" the container's default command to ``tarantool client.lua``." -msgstr "" -"Для HTTP-теста создадим третий контейнер на основе `официального образа " -"Tarantool 1.9 `_ (см. " -"`client/Dockerfile " -"`_) " -"установим ``tarantool client.lua`` в качестве стандартной команды для " -"контейнера." - -msgid "" -"To run this test locally, download our `pokemon " -"`_ project from GitHub and say:" -msgstr "" -"Чтобы запустить тест локально, скачайте наш проект `покемон " -"`_ из GitHub и вызовите:" - -msgid "" -"$ docker-compose build\n" -"$ docker-compose up" -msgstr "" -"$ docker-compose build\n" -"$ docker-compose up" - -msgid "" -"Docker Compose builds and runs all the three containers: ``pserver`` " -"(Tarantool backend), ``phttp`` (nginx) and ``pclient`` (demo client). You " -"can see log messages from all these containers in the console, pclient " -"saying that it made an HTTP request to create a pokémon, made two catch " -"requests, requested the map (empty since the pokémon is caught and " -"temporarily inactive) and exited:" -msgstr "" -"Docker Compose собирает и запускает все три контейнера: ``pserver`` (бэкенд " -"Tarantool), ``phttp`` (nginx) и``pclient`` (демо-клиент). ВЫ можете " -"увидеть все сообщения журнала из всех этих контейнеров в консоли. pclient " -"выведет, что сделал HTTP-запрос на создание покемона, два запроса на поимку " -"покемона, запросил карту (пустая, поскольку покемон пойман и временно " -"неактивен) и завершил работу:" - -msgid "" -"pclient_1 | Create pokemon\n" -"<...>\n" -"pclient_1 | {\"result\":true}\n" -"pclient_1 | {\"map\":[{\"id\":1,\"status\":\"active\",\"location\":{\"y\":2,\"x\":1},\"name\":\"Pikachu\",\"chance\":99.100000}]}\n" -"pclient_1 | Catch pokemon by player 2\n" -"pclient_1 | Catch pokemon by player 1\n" -"pclient_1 | Player 1 result: {\"result\":true}\n" -"pclient_1 | Player 2 result: {\"result\":false}\n" -"pclient_1 | {\"map\":[]}\n" -"pokemon_pclient_1 exited with code 0" -msgstr "" -"pclient_1 | Create pokemon\n" -"<...>\n" -"pclient_1 | {\"result\":true}\n" -"pclient_1 | {\"map\":[{\"id\":1,\"status\":\"active\",\"location\":{\"y\":2,\"x\":1},\"name\":\"Pikachu\",\"chance\":99.100000}]}\n" -"pclient_1 | Catch pokemon by player 2\n" -"pclient_1 | Catch pokemon by player 1\n" -"pclient_1 | Player 1 result: {\"result\":true}\n" -"pclient_1 | Player 2 result: {\"result\":false}\n" -"pclient_1 | {\"map\":[]}\n" -"pokemon_pclient_1 exited with code 0" - -msgid "" -"Congratulations! Here's the end point of our walk-through. As further " -"reading, see more about :ref:`installing ` and" -" :ref:`contributing ` a module." -msgstr "" -"Поздравляем! Вот мы и закончили наш пошаговый пример. Для дальнейшего " -"изучения рекомендуем :ref:`установку ` и " -":ref:`добавление ` модуля." - -msgid "" -"See also reference on :ref:`Tarantool modules ` and " -":ref:`C API `, and don't miss our :ref:`Lua cookbook " -"recipes `." -msgstr "" -"См. также справочник по :ref:`модулям Tarantool ` и " -":ref:`C API ` и не пропустите наши :ref:`рекомендации" -" по разработке на Lua `." +msgid "Follow these topics to implement our application:" +msgstr "" + +#~ msgid "First, what would be the best way to deliver our microservice?" +#~ msgstr "Для начала как лучше всего предоставить микросервис?" + +#~ msgid "Modules, rocks and applications" +#~ msgstr "Модули и приложения" + +#~ msgid "" +#~ "To make our game logic available to other developers and Lua applications, " +#~ "let's put it into a Lua module." +#~ msgstr "" +#~ "Чтобы наша логическая схема игры была доступна другим разработчикам и Lua-" +#~ "приложениям, поместим ее в Lua-модуль." + +#~ msgid "" +#~ "A **module** (called \"rock\" in Lua) is an optional library which enhances " +#~ "Tarantool functionality. So, we can install our logic as a module in " +#~ "Tarantool and use it from any Tarantool application or module. Like " +#~ "applications, modules in Tarantool can be written in Lua (rocks), C or C++." +#~ msgstr "" +#~ "**Модуль** (который называется \"rock\" в Lua) -- это дополнительная " +#~ "библиотека, которая расширяет функции Tarantool. Поэтому можно установить " +#~ "нашу логическую схему в виде модуля в Tarantool и использовать ее из любого " +#~ "Tarantool-приложения или модуля. Как и приложения, модули в Tarantool могут " +#~ "быть написаны на Lua (rocks), C или C++." + +#~ msgid "Modules are good for two things:" +#~ msgstr "Модули хороши для двух целей:" + +#~ msgid "easier **code management** (reuse, packaging, versioning), and" +#~ msgstr "" +#~ "облегченное **управление кодом** (переиспользование, подготовка к " +#~ "развертыванию, версионирование) и" + +#~ msgid "hot **code reload** without restarting the Tarantool instance." +#~ msgstr "горячая **перезагрузка кода** без перезапуска экземпляра Tarantool." + +#~ msgid "" +#~ "Technically, a module is a file with source code that exports its functions " +#~ "in an API. For example, here is a Lua module named ``mymodule.lua`` that " +#~ "exports one function named ``myfun``:" +#~ msgstr "" +#~ "В техническом смысле, модуль - это файл с исходным кодом, который " +#~ "экспортирует свои функции в API. Например, вот Lua-модуль под названием " +#~ "``mymodule.lua``, который экспортирует одну функцию под названием ``myfun``:" + +#~ msgid "" +#~ "local exports = {}\n" +#~ "exports.myfun = function(input_string)\n" +#~ " print('Hello', input_string)\n" +#~ "end\n" +#~ "return exports" +#~ msgstr "" +#~ "local exports = {}\n" +#~ "exports.myfun = function(input_string)\n" +#~ " print('Hello', input_string)\n" +#~ "end\n" +#~ "return exports" + +#~ msgid "" +#~ "To launch the function ``myfun()`` -- from another module, from a Lua " +#~ "application, or from Tarantool itself, -- we need to save this module as a " +#~ "file, then load this module with the ``require()`` directive and call the " +#~ "exported function." +#~ msgstr "" +#~ "Чтобы запустить функцию ``myfun()`` -- из другого модуля, из Lua-приложения " +#~ "или из самого Tarantool -- необходимо сохранить этот модуль в виде файла, а " +#~ "затем загрузить этот модуль с директивой ``require()`` и вызвать " +#~ "экспортированную функцию." + +#~ msgid "" +#~ "For example, here's a Lua application that uses ``myfun()`` function from " +#~ "``mymodule.lua`` module:" +#~ msgstr "" +#~ "Например, вот Lua-приложение, которое использует функцию ``myfun()`` из " +#~ "модуля ``mymodule.lua``:" + +#~ msgid "" +#~ "-- loading the module\n" +#~ "local mymodule = require('mymodule')\n" +#~ "\n" +#~ "-- calling myfun() from within test() function\n" +#~ "local test = function()\n" +#~ " mymodule.myfun()\n" +#~ "end" +#~ msgstr "" +#~ "-- загрузка модуля\n" +#~ "local mymodule = require('mymodule')\n" +#~ "\n" +#~ "-- вызов myfun() из функции test\n" +#~ "local test = function()\n" +#~ " mymodule.myfun()\n" +#~ "end" + +#~ msgid "" +#~ "A thing to remember here is that the ``require()`` directive takes load " +#~ "paths to Lua modules from the ``package.path`` variable. This is a " +#~ "semicolon-separated string, where a question mark is used to interpolate the" +#~ " module name. By default, this variable contains system-wide Lua paths and " +#~ "the working directory. But if we put our modules inside a specific folder " +#~ "(e.g. ``scripts/``), we need to add this folder to ``package.path`` before " +#~ "any calls to ``require()``:" +#~ msgstr "" +#~ "Здесь важно запомнить, что директива ``require()`` берет пути загрузки к " +#~ "Lua-модулям из переменной ``package.path``. Она представляет собой строку с " +#~ "разделителями в виде точки с запятой, где знак вопроса используется для " +#~ "вставки имени модуля. По умолчанию, эта переменная содержит пути в системе и" +#~ " рабочую директорию. Но если мы поместим наши модули в особую папку " +#~ "(например, ``scripts/``), необходимо будет добавить эту папку в " +#~ "``package.path`` до вызова ``require()``:" + +#~ msgid "package.path = 'scripts/?.lua;' .. package.path" +#~ msgstr "package.path = 'scripts/?.lua;' .. package.path" + +#~ msgid "" +#~ "For our microservice, a simple and convenient solution would be to put all " +#~ "methods in a Lua module (say ``pokemon.lua``) and to write a Lua application" +#~ " (say ``game.lua``) that initializes the gaming environment and starts the " +#~ "game loop." +#~ msgstr "" +#~ "Для нашего микросервиса простым и удобным решением будет разместить все " +#~ "методы в Lua-модуле (скажем, ``pokemon.lua``) и написать Lua-приложение " +#~ "(скажем, ``game.lua``), которое запустит игровое окружение и цикл игры." + +#~ msgid "" +#~ "Now let's get down to implementation details. In our game, we need three " +#~ "entities:" +#~ msgstr "" +#~ "Теперь приступим к деталям реализации. В игре нам необходимы три сущности:" + +#~ msgid "" +#~ "**map**, which is an array of pokémons with coordinates of respawn " +#~ "locations; in this version of the game, let a location be a rectangle " +#~ "identified with two points, upper-left and lower-right;" +#~ msgstr "" +#~ "**карта**, которая представляет собой массив покемонов с координатами мест " +#~ "респауна; в данной версии игры пусть местом будет прямоугольник, " +#~ "установленный по двум точкам, верхней левой и нижней правой;" + +#~ msgid "" +#~ "**player**, which has an ID, a name, and coordinates of the player's " +#~ "location point;" +#~ msgstr "" +#~ "**игрок**, у которого есть ID, имя и координаты местонахождения игрока;" + +#~ msgid "" +#~ "**pokémon**, which has the same fields as the player, plus a status " +#~ "(active/inactive, that is present on the map or not) and a catch probability" +#~ " (well, let's give our pokémons a chance to escape :-) )" +#~ msgstr "" +#~ "**покемон**, у которого такие же поля, как и у игрока, плюс статус " +#~ "(активный/неактивный, то есть находится ли на карте) и возможность поимки " +#~ "(давайте уж дадим нашим покемонам шанс сбежать :-) )" + +#~ msgid "" +#~ "We'll store these entities as tuples in Tarantool spaces. But to deliver our" +#~ " backend application as a microservice, the good practice would be to " +#~ "send/receive our data in the universal JSON format, thus using Tarantool as " +#~ "a document storage." +#~ msgstr "" +#~ "Эти данные будем хранить как кортежи в спейсах Tarantool. Но чтобы бэкенд-" +#~ "приложение работало как микросервис, правильно будет отправлять/получать " +#~ "данные в универсальном формате JSON, используя Tarantool в качестве системы " +#~ "хранения документов." + +#~ msgid "Avro schemas" +#~ msgstr "Avro-схемы" + +#~ msgid "" +#~ "To store JSON data as tuples, we will apply a savvy practice which reduces " +#~ "data footprint and ensures all stored documents are valid. We will use " +#~ "Tarantool module `avro-schema `_ " +#~ "which checks the schema of a JSON document and converts it to a Tarantool " +#~ "tuple. The tuple will contain only field values, and thus take a lot less " +#~ "space than the original document. In avro-schema terms, converting JSON " +#~ "documents to tuples is \"flattening\", and restoring the original documents " +#~ "is \"unflattening\"." +#~ msgstr "" +#~ "Чтобы хранить JSON-данные в виде кортежей, используем продвинутую методику, " +#~ "которая уменьшит отпечаток данных и обеспечит пригодность всех сохраняемых " +#~ "документов. Будем использовать Tarantool-модуль `avro-schema " +#~ "`_, который проверяет схему JSON-" +#~ "документа и конвертирует его в кортеж Tarantool. Кортеж будет содержать " +#~ "только значения полей, таким образом, занимая меньше места, чем оригинальный" +#~ " документ. С точки зрения avro-схемы, конвертация JSON-документов в кортежи " +#~ "-- \"flattening\" (конвертация в плоские файлы), а восстановление " +#~ "оригинальных документов -- \"unflattening\" (конвертация из плоских файлов)." + +#~ msgid "" +#~ "First you need to `install `_ the " +#~ "module with ``tarantoolctl rocks install avro-schema``." +#~ msgstr "" +#~ "Для начала необходимо `установить `_ " +#~ "модуль с помощью команды ``tarantoolctl rocks install avro-schema``." + +#~ msgid "Further usage is quite straightforward:" +#~ msgstr "Использовать модуль достаточно просто:" + +#~ msgid "" +#~ "For each entity, we need to define a schema in `Apache Avro schema " +#~ "`_ syntax, where we list the " +#~ "entity's fields with their names and `Avro data types " +#~ "`_." +#~ msgstr "" +#~ "Для каждой сущности необходимо определить схему в синтаксисе `схемы Apache " +#~ "Avro `_, где мы перечисляем поля " +#~ "сущности с их наименованиями и `типами данных по Avro " +#~ "`_." + +#~ msgid "" +#~ "At initialization, we call ``avro-schema.create()`` that creates objects in " +#~ "memory for all schema entities, and ``compile()`` that generates " +#~ "flatten/unflatten methods for each entity." +#~ msgstr "" +#~ "При инициализации мы вызываем функцию ``avro-schema.create()``, которая " +#~ "создает объекты в памяти для всех сущностей схемы, а также функцию " +#~ "``compile()``, которая создает методы flatten/unflatten (конвертация в " +#~ "плоские файлы и обратно) для каждой сущности." + +#~ msgid "" +#~ "Further on, we just call flatten/unflatten methods for a respective entity " +#~ "on receiving/sending the entity's data." +#~ msgstr "" +#~ "Далее мы просто вызываем методы flatten/unflatten для соответствующей " +#~ "сущности при получении/отправке данных об этой сущности." + +#~ msgid "" +#~ "Here's what our schema definitions for the player and pokémon entities look " +#~ "like:" +#~ msgstr "" +#~ "Вот как будут выглядеть определения схемы для сущностей игрока и покемона:" + +#~ msgid "" +#~ "local schema = {\n" +#~ " player = {\n" +#~ " type=\"record\",\n" +#~ " name=\"player_schema\",\n" +#~ " fields={\n" +#~ " {name=\"id\", type=\"long\"},\n" +#~ " {name=\"name\", type=\"string\"},\n" +#~ " {\n" +#~ " name=\"location\",\n" +#~ " type= {\n" +#~ " type=\"record\",\n" +#~ " name=\"player_location\",\n" +#~ " fields={\n" +#~ " {name=\"x\", type=\"double\"},\n" +#~ " {name=\"y\", type=\"double\"}\n" +#~ " }\n" +#~ " }\n" +#~ " }\n" +#~ " }\n" +#~ " },\n" +#~ " pokemon = {\n" +#~ " type=\"record\",\n" +#~ " name=\"pokemon_schema\",\n" +#~ " fields={\n" +#~ " {name=\"id\", type=\"long\"},\n" +#~ " {name=\"status\", type=\"string\"},\n" +#~ " {name=\"name\", type=\"string\"},\n" +#~ " {name=\"chance\", type=\"double\"},\n" +#~ " {\n" +#~ " name=\"location\",\n" +#~ " type= {\n" +#~ " type=\"record\",\n" +#~ " name=\"pokemon_location\",\n" +#~ " fields={\n" +#~ " {name=\"x\", type=\"double\"},\n" +#~ " {name=\"y\", type=\"double\"}\n" +#~ " }\n" +#~ " }\n" +#~ " }\n" +#~ " }\n" +#~ " }\n" +#~ "}" +#~ msgstr "" +#~ "local schema = {\n" +#~ " player = {\n" +#~ " type=\"record\",\n" +#~ " name=\"player_schema\",\n" +#~ " fields={\n" +#~ " {name=\"id\", type=\"long\"},\n" +#~ " {name=\"name\", type=\"string\"},\n" +#~ " {\n" +#~ " name=\"location\",\n" +#~ " type= {\n" +#~ " type=\"record\",\n" +#~ " name=\"player_location\",\n" +#~ " fields={\n" +#~ " {name=\"x\", type=\"double\"},\n" +#~ " {name=\"y\", type=\"double\"}\n" +#~ " }\n" +#~ " }\n" +#~ " }\n" +#~ " }\n" +#~ " },\n" +#~ " pokemon = {\n" +#~ " type=\"record\",\n" +#~ " name=\"pokemon_schema\",\n" +#~ " fields={\n" +#~ " {name=\"id\", type=\"long\"},\n" +#~ " {name=\"status\", type=\"string\"},\n" +#~ " {name=\"name\", type=\"string\"},\n" +#~ " {name=\"chance\", type=\"double\"},\n" +#~ " {\n" +#~ " name=\"location\",\n" +#~ " type= {\n" +#~ " type=\"record\",\n" +#~ " name=\"pokemon_location\",\n" +#~ " fields={\n" +#~ " {name=\"x\", type=\"double\"},\n" +#~ " {name=\"y\", type=\"double\"}\n" +#~ " }\n" +#~ " }\n" +#~ " }\n" +#~ " }\n" +#~ " }\n" +#~ "}" + +#~ msgid "And here's how we create and compile our entities at initialization:" +#~ msgstr "А вот как мы создадим и скомпилируем наши сущности при инициализации:" + +#~ msgid "" +#~ "-- load avro-schema module with require()\n" +#~ "local avro = require('avro_schema')\n" +#~ "\n" +#~ "-- create models\n" +#~ "local ok_m, pokemon = avro.create(schema.pokemon)\n" +#~ "local ok_p, player = avro.create(schema.player)\n" +#~ "if ok_m and ok_p then\n" +#~ " -- compile models\n" +#~ " local ok_cm, compiled_pokemon = avro.compile(pokemon)\n" +#~ " local ok_cp, compiled_player = avro.compile(player)\n" +#~ " if ok_cm and ok_cp then\n" +#~ " -- start the game\n" +#~ " <...>\n" +#~ " else\n" +#~ " log.error('Schema compilation failed')\n" +#~ " end\n" +#~ "else\n" +#~ " log.info('Schema creation failed')\n" +#~ "end\n" +#~ "return false" +#~ msgstr "" +#~ "-- загрузить модуль avro-schema с директивой require()\n" +#~ "local avro = require('avro_schema')\n" +#~ "\n" +#~ "-- создать модели\n" +#~ "local ok_m, pokemon = avro.create(schema.pokemon)\n" +#~ "local ok_p, player = avro.create(schema.player)\n" +#~ "if ok_m and ok_p then\n" +#~ " -- скомпилировать модели\n" +#~ " local ok_cm, compiled_pokemon = avro.compile(pokemon)\n" +#~ " local ok_cp, compiled_player = avro.compile(player)\n" +#~ " if ok_cm and ok_cp then\n" +#~ " -- начать игру\n" +#~ " <...>\n" +#~ " else\n" +#~ " log.error('Schema compilation failed')\n" +#~ " end\n" +#~ "else\n" +#~ " log.info('Schema creation failed')\n" +#~ "end\n" +#~ "return false" + +#~ msgid "" +#~ "As for the map entity, it would be an overkill to introduce a schema for it," +#~ " because we have only one map in the game, it has very few fields, and -- " +#~ "which is most important -- we use the map only inside our logic, never " +#~ "exposing it to external users." +#~ msgstr "" +#~ "Что касается сущности карты, вводить для нее схему будет перебор, потому что" +#~ " в игре всего одна карта, у нее мало полей, и -- что самое главное -- мы " +#~ "используем карту только внутри нашей логики, не показывая ее внешним " +#~ "пользователям." + +#~ msgid "" +#~ "Next, we need methods to implement the game logic. To simulate object-" +#~ "oriented programming in our Lua code, let's store all Lua functions and " +#~ "shared variables in a single local variable (let's name it as ``game``). " +#~ "This will allow us to address functions or variables from within our module " +#~ "as ``self.func_name`` or ``self.var_name``. Like this:" +#~ msgstr "" +#~ "Далее нам нужны методы для реализации игровой логики. Чтобы смоделировать " +#~ "объектно-ориентированное программирование в нашем Lua-коде, будем хранить " +#~ "все Lua-функции и общие переменные в одной внутренней переменной (назовем ее" +#~ " ``game``). Это позволит нам обращаться к функциям или переменным из нашего " +#~ "модуля с помощью ``self.func_name`` или ``self.var_name`` следующим образом:" + +#~ msgid "" +#~ "local game = {\n" +#~ " -- a local variable\n" +#~ " num_players = 0,\n" +#~ "\n" +#~ " -- a method that prints a local variable\n" +#~ " hello = function(self)\n" +#~ " print('Hello! Your player number is ' .. self.num_players .. '.')\n" +#~ " end,\n" +#~ "\n" +#~ " -- a method that calls another method and returns a local variable\n" +#~ " sign_in = function(self)\n" +#~ " self.num_players = self.num_players + 1\n" +#~ " self:hello()\n" +#~ " return self.num_players\n" +#~ " end\n" +#~ "}" +#~ msgstr "" +#~ "local game = {\n" +#~ " -- локальная переменная\n" +#~ " num_players = 0,\n" +#~ "\n" +#~ " -- метод, который выводит локальную переменную\n" +#~ " hello = function(self)\n" +#~ " print('Hello! Your player number is ' .. self.num_players .. '.')\n" +#~ " end,\n" +#~ "\n" +#~ " -- метод, который вызывает другой метод и возвращает локальную переменную\n" +#~ " sign_in = function(self)\n" +#~ " self.num_players = self.num_players + 1\n" +#~ " self:hello()\n" +#~ " return self.num_players\n" +#~ " end\n" +#~ "}" + +#~ msgid "" +#~ "In OOP terms, we can now regard local variables inside ``game`` as object " +#~ "fields, and local functions as object methods." +#~ msgstr "" +#~ "В терминах ООП сейчас мы можем рассматривать внутренние переменные внутри " +#~ "переменной ``game`` как поля объекта, а внутренние функции -- как методы " +#~ "объекта." + +#~ msgid "" +#~ "In this manual, Lua examples use **local** variables. Use **global** " +#~ "variables with caution, since the module’s users may be unaware of them." +#~ msgstr "" +#~ "Обратите внимание, что в текущей документации в примерах Lua-кода " +#~ "используются *локальные* переменные. Используйте *глобальные* переменные " +#~ "аккуратно, поскольку пользователи ваших модулей могут не знать об этих " +#~ "переменных." + +#~ msgid "" +#~ "To enable/disable the use of undeclared global variables in your Lua code, " +#~ "use Tarantool's :ref:`strict ` module." +#~ msgstr "" +#~ "Чтобы включить/отключить использование необъявленных глобальных переменных в" +#~ " вашем коде на языке Lua, используйте модуль Tarantool :ref:`strict `." + +#~ msgid "So, our game module will have the following methods:" +#~ msgstr "Таким образом, в модуле игры будут следующие методы:" + +#~ msgid "" +#~ "``catch()`` to calculate whether the pokémon was caught (besides the " +#~ "coordinates of both the player and pokémon, this method will apply a " +#~ "probability factor, so not every pokémon within the player's reach will be " +#~ "caught);" +#~ msgstr "" +#~ "``catch()`` (поймать) для расчета, когда был пойман покемон (помимо " +#~ "координат как игрока, так и покемона, этот метод будет использовать " +#~ "коэффициент вероятности, чтобы в пределах досягаемости игрока можно было " +#~ "поймать не каждого покемона);" + +#~ msgid "" +#~ "``respawn()`` to add missing pokémons to the map, say, every 60 seconds (we " +#~ "assume that a frightened pokémon runs away, so we remove a pokémon from the " +#~ "map on any catch attempt and add it back to the map in a while);" +#~ msgstr "" +#~ "``respawn()`` (респаун) для добавления отсутствующих покемонов на карту, " +#~ "скажем, каждые 60 секунд (предположим, что испуганный покемон убегает, " +#~ "поэтому мы убираем покемона с карты при любой попытке поймать его и через " +#~ "некоторое время добавляем обратно на карту);" + +#~ msgid "" +#~ "``notify()`` to log information about caught pokémons (like \"Player 1 " +#~ "caught pokémon A\");" +#~ msgstr "" +#~ "``notify()`` (уведомить) для записи информации о пойманных покемонах " +#~ "(например, \"Игрок 1 поймал покемона A\");" + +#~ msgid "" +#~ "``start()`` to initialize the game (it will create database spaces, create " +#~ "and compile avro schemas, and launch ``respawn()``)." +#~ msgstr "" +#~ "``start()`` (начать) для инициализации игры (метод создаст спейсы в базе " +#~ "данных, создаст и скомпилирует avro-схемы, а также запустит метод " +#~ "``respawn()``)." + +#~ msgid "" +#~ "Besides, it would be convenient to have methods for working with Tarantool " +#~ "storage. For example:" +#~ msgstr "" +#~ "Кроме того, было бы удобно завести методы для работы с хранилищем Tarantool." +#~ " Например:" + +#~ msgid "``add_pokemon()`` to add a pokémon to the database, and" +#~ msgstr "" +#~ "``add_pokemon()`` (добавить покемона) для добавления покемона в базу данных " +#~ "и" + +#~ msgid "``map()`` to populate the map with all pokémons stored in Tarantool." +#~ msgstr "" +#~ "``map()`` (карта) для заполнения карты всеми покемонами, которые хранятся в " +#~ "Tarantool." + +#~ msgid "" +#~ "We'll need these two methods primarily when initializing our game, but we " +#~ "can also call them later, for example to test our code." +#~ msgstr "" +#~ "Эти два метода будут главным образом использоваться во время инициализации " +#~ "нашей игры, но их также можно вызывать позднее, например для тестирования " +#~ "кода." + +#~ msgid "Bootstrapping a database" +#~ msgstr "Настройка базы данных" + +#~ msgid "" +#~ "Let's discuss game initialization. In ``start()`` method, we need to " +#~ "populate Tarantool spaces with pokémon data. Why not keep all game data in " +#~ "memory? Why use a database? The answer is: :ref:`persistence `. Without a database, we risk losing data on power outage, " +#~ "for example. But if we store our data in an in-memory database, Tarantool " +#~ "takes care to persist it on disk whenever it's changed. This gives us one " +#~ "more benefit: quick startup in case of failure. Tarantool has a :ref:`smart " +#~ "algorithm ` that quickly loads all data from " +#~ "disk into memory on startup, so the warm-up takes little time." +#~ msgstr "" +#~ "Обсудим инициализацию игры. В методе ``start()`` нам нужно заполнить спейсы " +#~ "Tarantool данными о покемонах. Почему бы не хранить все игровые данные в " +#~ "памяти? Зачем нужна база данных? Ответ на это: :ref:`персистентность `. Без базы данных мы рискуем потерять данные при отключении" +#~ " электроэнергии, например. Но если мы храним данные в in-memory базе данных," +#~ " Tarantool позаботится о том, чтобы обеспечить постоянное хранение данных " +#~ "при их изменении. Это дает дополнительное преимущество: быстрая загрузка в " +#~ "случае отказа. :ref:`Умный алгоритм ` Tarantool " +#~ "быстро загружает все данные с диска в память при начале работы, так что " +#~ "подготовка к работе не займет много времени." + +#~ msgid "" +#~ "We'll be using functions from Tarantool built-in :ref:`box ` " +#~ "module:" +#~ msgstr "" +#~ "Мы будем использовать функции из встроенного модуля Tarantool :ref:`box " +#~ "`:" + +#~ msgid "" +#~ "``box.schema.create_space('pokemons')`` to create a space named ``pokemon`` " +#~ "for storing information about pokémons (we don't create a similar space for " +#~ "players, because we intend to only send/receive player information via API " +#~ "calls, so we needn't store it);" +#~ msgstr "" +#~ "``box.schema.create_space('pokemons')`` для создания спейса под названием " +#~ "``pokemon`` (покемон), чтобы хранить информацию о покемонах (мы не создаем " +#~ "аналогичный спейс по игрокам, потому что планируем только отправлять и " +#~ "получать информацию об игроках с помощью вызовов API, так что нет " +#~ "необходимости хранить ее);" + +#~ msgid "" +#~ "``box.space.pokemons:create_index('primary', {type = 'hash', parts = {1, " +#~ "'unsigned'}})`` to create a primary HASH index by pokémon ID;" +#~ msgstr "" +#~ "``box.space.pokemons:create_index('primary', {type = 'hash', parts = {1, " +#~ "'unsigned'}})`` для создания первичного HASH-индекса по ID покемона;" + +#~ msgid "" +#~ "``box.space.pokemons:create_index('status', {type = 'tree', parts = {2, " +#~ "'str'}})`` to create a secondary TREE index by pokémon status." +#~ msgstr "" +#~ "``box.space.pokemons:create_index('status', {type = 'tree', parts = {2, " +#~ "'str'}})`` для создания вторичного TREE-индекса по статусу покемона." + +#~ msgid "" +#~ "Notice the ``parts =`` argument in the index specification. The pokémon ID " +#~ "is the first field in a Tarantool tuple since it’s the first member of the " +#~ "respective Avro type. So does the pokémon status. The actual JSON document " +#~ "may have ID or status fields at any position of the JSON map." +#~ msgstr "" +#~ "Обратите внимание на аргумент ``parts =`` в спецификации индекса. ID " +#~ "покемона -- это первое поле в кортеже Tarantool, потому что это первый " +#~ "элемент соответствующего типа Avro. То же относится к статусу покемона. В " +#~ "самом JSON-файле поля ID или статуса могут быть в любом положении на JSON-" +#~ "карте." + +#~ msgid "The implementation of ``start()`` method looks like this:" +#~ msgstr "Реализация метода ``start()`` выглядит следующим образом:" + +#~ msgid "" +#~ "-- create game object\n" +#~ "start = function(self)\n" +#~ " -- create spaces and indexes\n" +#~ " box.once('init', function()\n" +#~ " box.schema.create_space('pokemons')\n" +#~ " box.space.pokemons:create_index(\n" +#~ " \"primary\", {type = 'hash', parts = {1, 'unsigned'}}\n" +#~ " )\n" +#~ " box.space.pokemons:create_index(\n" +#~ " \"status\", {type = \"tree\", parts = {2, 'str'}}\n" +#~ " )\n" +#~ " end)\n" +#~ "\n" +#~ " -- create models\n" +#~ " local ok_m, pokemon = avro.create(schema.pokemon)\n" +#~ " local ok_p, player = avro.create(schema.player)\n" +#~ " if ok_m and ok_p then\n" +#~ " -- compile models\n" +#~ " local ok_cm, compiled_pokemon = avro.compile(pokemon)\n" +#~ " local ok_cp, compiled_player = avro.compile(player)\n" +#~ " if ok_cm and ok_cp then\n" +#~ " -- start the game\n" +#~ " <...>\n" +#~ " else\n" +#~ " log.error('Schema compilation failed')\n" +#~ " end\n" +#~ " else\n" +#~ " log.info('Schema creation failed')\n" +#~ " end\n" +#~ " return false\n" +#~ "end" +#~ msgstr "" +#~ "-- создать игровой объект\n" +#~ "start = function(self)\n" +#~ " -- создать спейсы и индексы\n" +#~ " box.once('init', function()\n" +#~ " box.schema.create_space('pokemons')\n" +#~ " box.space.pokemons:create_index(\n" +#~ " \"primary\", {type = 'hash', parts = {1, 'unsigned'}}\n" +#~ " )\n" +#~ " box.space.pokemons:create_index(\n" +#~ " \"status\", {type = \"tree\", parts = {2, 'str'}}\n" +#~ " )\n" +#~ " end)\n" +#~ "\n" +#~ " -- создать модели\n" +#~ " local ok_m, pokemon = avro.create(schema.pokemon)\n" +#~ " local ok_p, player = avro.create(schema.player)\n" +#~ " if ok_m and ok_p then\n" +#~ " -- скомпилировать модели\n" +#~ " local ok_cm, compiled_pokemon = avro.compile(pokemon)\n" +#~ " local ok_cp, compiled_player = avro.compile(player)\n" +#~ " if ok_cm and ok_cp then\n" +#~ " -- начать игру\n" +#~ " <...>\n" +#~ " else\n" +#~ " log.error('Schema compilation failed')\n" +#~ " end\n" +#~ " else\n" +#~ " log.info('Schema creation failed')\n" +#~ " end\n" +#~ " return false\n" +#~ "end" + +#~ msgid "GIS" +#~ msgstr "ГИС" + +#~ msgid "" +#~ "Now let's discuss ``catch()``, which is the main method in our gaming logic." +#~ msgstr "" +#~ "Теперь обсудим метод ``catch()``, который является основным в логике нашей " +#~ "игры." + +#~ msgid "" +#~ "Here we receive the player's coordinates and the target pokémon's ID number," +#~ " and we need to answer whether the player has actually caught the pokémon or" +#~ " not (remember that each pokémon has a chance to escape)." +#~ msgstr "" +#~ "Здесь мы получаем координаты игрока и номер ID искомого покемона, а нужен " +#~ "нам ответ на вопрос, поймали ли игрок покемона (помните, что у каждого " +#~ "покемона есть шанс убежать)." + +#~ msgid "" +#~ "First thing, we validate the received player data against its :ref:`Avro " +#~ "schema `. And we check whether such a pokémon " +#~ "exists in our database and is displayed on the map (the pokémon must have " +#~ "the active status):" +#~ msgstr "" +#~ "Для начала проверим полученные данные об игроке по :ref:`Avro-схеме " +#~ "`. Также проверим, есть ли такой покемон в базе " +#~ "данных, и отображается ли он на карте (у покемона должен быть активный " +#~ "статус):" + +#~ msgid "" +#~ "catch = function(self, pokemon_id, player)\n" +#~ " -- check player data\n" +#~ " local ok, tuple = self.player_model.flatten(player)\n" +#~ " if not ok then\n" +#~ " return false\n" +#~ " end\n" +#~ " -- get pokemon data\n" +#~ " local p_tuple = box.space.pokemons:get(pokemon_id)\n" +#~ " if p_tuple == nil then\n" +#~ " return false\n" +#~ " end\n" +#~ " local ok, pokemon = self.pokemon_model.unflatten(p_tuple)\n" +#~ " if not ok then\n" +#~ " return false\n" +#~ " end\n" +#~ " if pokemon.status ~= self.state.ACTIVE then\n" +#~ " return false\n" +#~ " end\n" +#~ " -- more catch logic to follow\n" +#~ " <...>\n" +#~ "end" +#~ msgstr "" +#~ "catch = function(self, pokemon_id, player)\n" +#~ " -- проверить данные игрока\n" +#~ " local ok, tuple = self.player_model.flatten(player)\n" +#~ " if not ok then\n" +#~ " return false\n" +#~ " end\n" +#~ " -- получить данные покемона\n" +#~ " local p_tuple = box.space.pokemons:get(pokemon_id)\n" +#~ " if p_tuple == nil then\n" +#~ " return false\n" +#~ " end\n" +#~ " local ok, pokemon = self.pokemon_model.unflatten(p_tuple)\n" +#~ " if not ok then\n" +#~ " return false\n" +#~ " end\n" +#~ " if pokemon.status ~= self.state.ACTIVE then\n" +#~ " return false\n" +#~ " end\n" +#~ " -- логика поимки будет дополняться\n" +#~ " <...>\n" +#~ "end" + +#~ msgid "Next, we calculate the answer: caught or not." +#~ msgstr "Далее вычисляем ответ: пойман или нет." + +#~ msgid "" +#~ "To work with geographical coordinates, we use Tarantool `gis " +#~ "`_ module." +#~ msgstr "" +#~ "Чтобы работать с географическими координатами, используем модуль Tarantool " +#~ "`gis `_." + +#~ msgid "" +#~ "To keep things simple, we don't load any specific map, assuming that we deal" +#~ " with a world map. And we do not validate incoming coordinates, assuming " +#~ "again that all received locations are within the planet Earth." +#~ msgstr "" +#~ "Чтобы не усложнять, не будем загружать какую-то особую карту, допуская, что " +#~ "рассматриваем карту мира. Также не будет проверять поступающие координаты, " +#~ "снова допуская, что все места находятся на планете Земля." + +#~ msgid "We use two geo-specific variables:" +#~ msgstr "Используем две географические переменные:" + +#~ msgid "" +#~ "``wgs84``, which stands for the latest revision of the World Geodetic System" +#~ " standard, `WGS84 " +#~ "`_. Basically, it" +#~ " comprises a standard coordinate system for the Earth and represents the " +#~ "Earth as an ellipsoid." +#~ msgstr "" +#~ "``wgs84``, что означает последнюю редакцию стандарта Мировой геодезической " +#~ "системы координат, `WGS84 " +#~ "`_. В целом, она " +#~ "представляет собой стандартную систему координат Земли и изображает Землю " +#~ "как эллипсоид." + +#~ msgid "" +#~ "``nationalmap``, which stands for the `US National Atlas Equal Area " +#~ "`_. This is a projected coordinates system based on " +#~ "WGS84. It gives us a zero base for location projection and allows " +#~ "positioning our players and pokémons in meters." +#~ msgstr "" +#~ "``nationalmap``, что означает `Государственный атлас США в равновеликой " +#~ "проекции (US National Atlas Equal Area) `_. Это " +#~ "система спроецированных координат на основании WGS84. Она дает основу для " +#~ "проецирования мест и позволяет определить местоположение наших игроков и " +#~ "покемонов в метрах." + +#~ msgid "" +#~ "Both these systems are listed in the EPSG Geodetic Parameter Registry, where" +#~ " each system has a unique number. In our code, we assign these listing " +#~ "numbers to respective variables:" +#~ msgstr "" +#~ "Обе системы указаны в Реестре геодезических параметров EPSG, где каждой " +#~ "системе присвоен уникальный номер. Мы назначим эти числа соответствующим " +#~ "переменным в нашем коде:" + +#~ msgid "" +#~ "wgs84 = 4326,\n" +#~ "nationalmap = 2163," +#~ msgstr "" +#~ "wgs84 = 4326,\n" +#~ "nationalmap = 2163," + +#~ msgid "" +#~ "For our game logic, we need one more variable, ``catch_distance``, which " +#~ "defines how close a player must get to a pokémon before trying to catch it. " +#~ "Let's set the distance to 100 meters." +#~ msgstr "" +#~ "Для игровой логики необходима еще одна переменная ``catch_distance``, " +#~ "которая определяет, насколько близко игрок должен подойти к покемону, чтобы " +#~ "попытаться поймать его. Определим это расстояние в 100 метров." + +#~ msgid "catch_distance = 100," +#~ msgstr "catch_distance = 100," + +#~ msgid "" +#~ "Now we're ready to calculate the answer. We need to project the current " +#~ "location of both player (``p_pos``) and pokémon (``m_pos``) on the map, " +#~ "check whether the player is close enough to the pokémon (using " +#~ "``catch_distance``), and calculate whether the player has caught the pokémon" +#~ " (here we generate some random value and let the pokémon escape if the " +#~ "random value happens to be less than 100 minus pokémon's chance value):" +#~ msgstr "" +#~ "Теперь можно рассчитать ответ. Необходимо спроецировать текущее " +#~ "местоположение как игрока (``p_pos``), так и покемона (``m_pos``) на карте, " +#~ "проверить, достаточно ли близко к покемону находится игрок (с помощью " +#~ "``catch_distance``), и рассчитать, поймал ли игрок покемона (здесь мы " +#~ "генерируем случайное значение, и покемон убегает, если случайное значение " +#~ "оказывается меньше, чем 100 минус случайная величина покемона):" + +#~ msgid "" +#~ "-- project locations\n" +#~ "local m_pos = gis.Point(\n" +#~ " {pokemon.location.x, pokemon.location.y}, self.wgs84\n" +#~ "):transform(self.nationalmap)\n" +#~ "local p_pos = gis.Point(\n" +#~ " {player.location.x, player.location.y}, self.wgs84\n" +#~ "):transform(self.nationalmap)\n" +#~ "\n" +#~ "-- check catch distance condition\n" +#~ "if p_pos:distance(m_pos) > self.catch_distance then\n" +#~ " return false\n" +#~ "end\n" +#~ "-- try to catch pokemon\n" +#~ "local caught = math.random(100) >= 100 - pokemon.chance\n" +#~ "if caught then\n" +#~ " -- update and notify on success\n" +#~ " box.space.pokemons:update(\n" +#~ " pokemon_id, {{'=', self.STATUS, self.state.CAUGHT}}\n" +#~ " )\n" +#~ " self:notify(player, pokemon)\n" +#~ "end\n" +#~ "return caught" +#~ msgstr "" +#~ "-- спроецировать местоположение\n" +#~ " local m_pos = gis.Point(\n" +#~ " {pokemon.location.x, pokemon.location.y}, self.wgs84\n" +#~ " ):transform(self.nationalmap)\n" +#~ " local p_pos = gis.Point(\n" +#~ " {player.location.x, player.location.y}, self.wgs84\n" +#~ " ):transform(self.nationalmap)\n" +#~ " \n" +#~ " -- проверить условие близости игрока\n" +#~ " if p_pos:distance(m_pos) > self.catch_distance then\n" +#~ " return false\n" +#~ " end\n" +#~ " -- попытаться поймать покемона\n" +#~ " local caught = math.random(100) >= 100 - pokemon.chance\n" +#~ " if caught then\n" +#~ " -- обновить и сообщить об успехе\n" +#~ " box.space.pokemons:update(\n" +#~ " pokemon_id, {{'=', self.STATUS, self.state.CAUGHT}}\n" +#~ " )\n" +#~ " self:notify(player, pokemon)\n" +#~ " end\n" +#~ " return caught" + +#~ msgid "Index iterators" +#~ msgstr "Итератор с индексом" + +#~ msgid "" +#~ "By our gameplay, all caught pokémons are returned back to the map. We do " +#~ "this for all pokémons on the map every 60 seconds using ``respawn()`` " +#~ "method. We iterate through pokémons by status using Tarantool index iterator" +#~ " function :doc:`/reference/reference_lua/box_index/pairs` and reset the " +#~ "statuses of all \"caught\" pokémons back to \"active\" using " +#~ "``box.space.pokemons:update()``." +#~ msgstr "" +#~ "По сюжету игры все пойманные покемоны возвращаются на карту. Метод " +#~ "``respawn()`` обеспечивает это для всех покемонов на карте каждые 60 секунд." +#~ " Мы выполняем перебор покемонов по статусу с помощью функции Tarantool " +#~ "итератора с индексом :doc:`/reference/reference_lua/box_index/pairs` и " +#~ "сбрасываем статусы всех \"пойманных\" покемонов обратно на \"активный\" с " +#~ "помощью ``box.space.pokemons:update()``." + +#~ msgid "" +#~ "respawn = function(self)\n" +#~ " fiber.name('Respawn fiber')\n" +#~ " for _, tuple in box.space.pokemons.index.status:pairs(\n" +#~ " self.state.CAUGHT) do\n" +#~ " box.space.pokemons:update(\n" +#~ " tuple[self.ID],\n" +#~ " {{'=', self.STATUS, self.state.ACTIVE}}\n" +#~ " )\n" +#~ " end\n" +#~ " end" +#~ msgstr "" +#~ "respawn = function(self)\n" +#~ " fiber.name('Respawn fiber')\n" +#~ " for _, tuple in box.space.pokemons.index.status:pairs(\n" +#~ " self.state.CAUGHT) do\n" +#~ " box.space.pokemons:update(\n" +#~ " tuple[self.ID],\n" +#~ " {{'=', self.STATUS, self.state.ACTIVE}}\n" +#~ " )\n" +#~ " end\n" +#~ " end" + +#~ msgid "For readability, we introduce named fields:" +#~ msgstr "Для удобства введем именованные поля:" + +#~ msgid "ID = 1, STATUS = 2," +#~ msgstr "ID = 1, STATUS = 2," + +#~ msgid "The complete implementation of ``start()`` now looks like this:" +#~ msgstr "Реализация метода ``start()`` полностью теперь выглядит так:" + +#~ msgid "" +#~ "-- create game object\n" +#~ "start = function(self)\n" +#~ " -- create spaces and indexes\n" +#~ " box.once('init', function()\n" +#~ " box.schema.create_space('pokemons')\n" +#~ " box.space.pokemons:create_index(\n" +#~ " \"primary\", {type = 'hash', parts = {1, 'unsigned'}}\n" +#~ " )\n" +#~ " box.space.pokemons:create_index(\n" +#~ " \"status\", {type = \"tree\", parts = {2, 'str'}}\n" +#~ " )\n" +#~ " end)\n" +#~ "\n" +#~ " -- create models\n" +#~ " local ok_m, pokemon = avro.create(schema.pokemon)\n" +#~ " local ok_p, player = avro.create(schema.player)\n" +#~ " if ok_m and ok_p then\n" +#~ " -- compile models\n" +#~ " local ok_cm, compiled_pokemon = avro.compile(pokemon)\n" +#~ " local ok_cp, compiled_player = avro.compile(player)\n" +#~ " if ok_cm and ok_cp then\n" +#~ " -- start the game\n" +#~ " self.pokemon_model = compiled_pokemon\n" +#~ " self.player_model = compiled_player\n" +#~ " self.respawn()\n" +#~ " log.info('Started')\n" +#~ " return true\n" +#~ " else\n" +#~ " log.error('Schema compilation failed')\n" +#~ " end\n" +#~ " else\n" +#~ " log.info('Schema creation failed')\n" +#~ " end\n" +#~ " return false\n" +#~ "end" +#~ msgstr "" +#~ "-- создать игровой объект\n" +#~ "start = function(self)\n" +#~ " -- создать спейсы и индексы\n" +#~ " box.once('init', function()\n" +#~ " box.schema.create_space('pokemons')\n" +#~ " box.space.pokemons:create_index(\n" +#~ " \"primary\", {type = 'hash', parts = {1, 'unsigned'}}\n" +#~ " )\n" +#~ " box.space.pokemons:create_index(\n" +#~ " \"status\", {type = \"tree\", parts = {2, 'str'}}\n" +#~ " )\n" +#~ " end)\n" +#~ "\n" +#~ " -- создать модели\n" +#~ " local ok_m, pokemon = avro.create(schema.pokemon)\n" +#~ " local ok_p, player = avro.create(schema.player)\n" +#~ " if ok_m and ok_p then\n" +#~ " -- скомпилировать модели\n" +#~ " local ok_cm, compiled_pokemon = avro.compile(pokemon)\n" +#~ " local ok_cp, compiled_player = avro.compile(player)\n" +#~ " if ok_cm and ok_cp then\n" +#~ " -- начать игру\n" +#~ " self.pokemon_model = compiled_pokemon\n" +#~ " self.player_model = compiled_player\n" +#~ " self.respawn()\n" +#~ " log.info('Started')\n" +#~ " return true\n" +#~ " else\n" +#~ " log.error('Schema compilation failed')\n" +#~ " end\n" +#~ " else\n" +#~ " log.info('Schema creation failed')\n" +#~ " end\n" +#~ " return false\n" +#~ "end" + +#~ msgid "Fibers" +#~ msgstr "Файберы" + +#~ msgid "" +#~ "But wait! If we launch it as shown above -- ``self.respawn()`` -- the " +#~ "function will be executed only once, just like all the other methods. But we" +#~ " need to execute ``respawn()`` every 60 seconds. Creating a :ref:`fiber " +#~ "` is the Tarantool way of making application logic work in the" +#~ " background at all times." +#~ msgstr "" +#~ "Но подождите! Если мы запустим функцию ``self.respawn()``, как показано " +#~ "выше, то она запустится только один раз, как и остальные методы. А нам " +#~ "необходимо запускать ``respawn()`` каждые 60 секунд. Tarantool заставляет " +#~ "логику приложения непрерывно работать в фоновом режиме с помощью " +#~ ":ref:`файбера `." + +#~ msgid "" +#~ "A **fiber** exists for executing instruction sequences but it is not a " +#~ "thread. The key difference is that threads use preemptive multitasking, " +#~ "while fibers use cooperative multitasking. This gives fibers the following " +#~ "two advantages over threads:" +#~ msgstr "" +#~ "**Файбер** предназначен для выполнения последовательностей команд, но это не" +#~ " поток. Ключевое отличие в том, что потоки используют многозадачность с " +#~ "реализацией приоритетов, тогда как файберы используют кооперативную " +#~ "многозадачность. Это дает файберам два преимущества над потоками:" + +#~ msgid "" +#~ "Better controllability. Threads often depend on the kernel's thread " +#~ "scheduler to preempt a busy thread and resume another thread, so preemption " +#~ "may occur unpredictably. Fibers yield themselves to run another fiber while " +#~ "executing, so yields are controlled by application logic." +#~ msgstr "" +#~ "Улучшенная управляемость. Потоки часто зависят от планировщика потока ядра в" +#~ " вопросе вытеснения занятого потока и возобновления другого потока, поэтому " +#~ "вытеснение может быть непредвиденным. Файберы передают управление " +#~ "самостоятельно другому файберу во время работы, поэтому управление файберами" +#~ " осуществляется логикой приложения." + +#~ msgid "" +#~ "Higher performance. Threads require more resources to preempt as they need " +#~ "to address the system kernel. Fibers are lighter and faster as they don't " +#~ "need to address the kernel to yield." +#~ msgstr "" +#~ "Повышенная производительность. Потокам необходимо больше ресурсов для " +#~ "вытеснения, поскольку они обращаются к ядру системы. Файберы легче и " +#~ "быстрее, поскольку для передачи управления им не нужно обращаться к ядру." + +#~ msgid "" +#~ "Yet fibers have some limitations as compared with threads, the main " +#~ "limitation being no multi-core mode. All fibers in an application belong to " +#~ "a single thread, so they all use the same CPU core as the parent thread. " +#~ "Meanwhile, this limitation is not really serious for Tarantool applications," +#~ " because a typical bottleneck for Tarantool is the HDD, not the CPU." +#~ msgstr "" +#~ "Однако у файберов есть определенные ограничения, по сравнению с потоками, " +#~ "основное из которых -- отсутствие режима работы с многоядерной системой. Все" +#~ " файберы в приложении относятся к одному потоку, поэтому они используют то " +#~ "же ядро процессора, что и родительский поток. В то же время, это ограничение" +#~ " незначительно для приложений Tarantool, поскольку узкое место Tarantool -- " +#~ "жесткий диск, а не ЦП." + +#~ msgid "" +#~ "A fiber has all the features of a Lua `coroutine " +#~ "`_ and all programming concepts that" +#~ " apply for Lua coroutines will apply for fibers as well. However, Tarantool " +#~ "has made some enhancements for fibers and has used fibers internally. So, " +#~ "although use of coroutines is possible and supported, use of fibers is " +#~ "recommended." +#~ msgstr "" +#~ "У файбера есть все возможности `сопрограммы " +#~ "`_ на языке Lua, и все принципы " +#~ "программирования, которые применяются к сопрограммам на Lua, применимы и к " +#~ "файберам. Однако Tarantool расширил возможности файберов для внутреннего " +#~ "использования. Поэтому, несмотря на возможность и поддержку использования " +#~ "сопрограмм, рекомендуется использовать файберы." + +#~ msgid "" +#~ "Well, performance or controllability are of little importance in our case. " +#~ "We'll launch ``respawn()`` in a fiber to make it work in the background all " +#~ "the time. To do so, we'll need to amend ``respawn()``:" +#~ msgstr "" +#~ "Производительность или управляемость не слишком важны в нашем случае. " +#~ "Запустим ``respawn()`` в файбере для непрерывной работы в фоновом режиме. " +#~ "Для этого необходимо изменить ``respawn()``:" + +#~ msgid "" +#~ "respawn = function(self)\n" +#~ " -- let's give our fiber a name;\n" +#~ " -- this will produce neat output in fiber.info()\n" +#~ " fiber.name('Respawn fiber')\n" +#~ " while true do\n" +#~ " for _, tuple in box.space.pokemons.index.status:pairs(\n" +#~ " self.state.CAUGHT) do\n" +#~ " box.space.pokemons:update(\n" +#~ " tuple[self.ID],\n" +#~ " {{'=', self.STATUS, self.state.ACTIVE}}\n" +#~ " )\n" +#~ " end\n" +#~ " fiber.sleep(self.respawn_time)\n" +#~ " end\n" +#~ "end" +#~ msgstr "" +#~ "respawn = function(self)\n" +#~ " -- назовем наш файбер;\n" +#~ " -- это выполнит чистый вывод в fiber.info()\n" +#~ " fiber.name('Respawn fiber')\n" +#~ " while true do\n" +#~ " for _, tuple in box.space.pokemons.index.status:pairs(\n" +#~ " self.state.CAUGHT) do\n" +#~ " box.space.pokemons:update(\n" +#~ " tuple[self.ID],\n" +#~ " {{'=', self.STATUS, self.state.ACTIVE}}\n" +#~ " )\n" +#~ " end\n" +#~ " fiber.sleep(self.respawn_time)\n" +#~ " end\n" +#~ "end" + +#~ msgid "and call it as a fiber in ``start()``:" +#~ msgstr "и назвать его файбером в ``start()``:" + +#~ msgid "" +#~ "start = function(self)\n" +#~ " -- create spaces and indexes\n" +#~ " <...>\n" +#~ " -- create models\n" +#~ " <...>\n" +#~ " -- compile models\n" +#~ " <...>\n" +#~ " -- start the game\n" +#~ " self.pokemon_model = compiled_pokemon\n" +#~ " self.player_model = compiled_player\n" +#~ " fiber.create(self.respawn, self)\n" +#~ " log.info('Started')\n" +#~ " -- errors if schema creation or compilation fails\n" +#~ " <...>\n" +#~ "end" +#~ msgstr "" +#~ "start = function(self)\n" +#~ " -- создать спейсы и индексы\n" +#~ " <...>\n" +#~ " -- создать модели\n" +#~ " <...>\n" +#~ " -- скомпилировать модели\n" +#~ " <...>\n" +#~ " -- начать игру\n" +#~ " self.pokemon_model = compiled_pokemon\n" +#~ " self.player_model = compiled_player\n" +#~ " fiber.create(self.respawn, self)\n" +#~ " log.info('Started')\n" +#~ " -- ошибки, если создание схемы или компиляция не работает\n" +#~ " <...>\n" +#~ "end" + +#~ msgid "Logging" +#~ msgstr "Запись в журнал" + +#~ msgid "" +#~ "One more helpful function that we used in ``start()`` was ``log.infо()`` " +#~ "from Tarantool :ref:`log ` module. We also need this function in" +#~ " ``notify()`` to add a record to the log file on every successful catch:" +#~ msgstr "" +#~ "В ``start()`` мы использовали еще одну полезную функцию -- ``log.infо()`` " +#~ "из :ref:`модуля log ` Tarantool . Эта функция также понадобится " +#~ "в ``notify()`` для добавления записи в файл журнала при каждой успешной " +#~ "поимке:" + +#~ msgid "" +#~ "-- event notification\n" +#~ "notify = function(self, player, pokemon)\n" +#~ " log.info(\"Player '%s' caught '%s'\", player.name, pokemon.name)\n" +#~ "end" +#~ msgstr "" +#~ "-- уведомление о событии\n" +#~ "notify = function(self, player, pokemon)\n" +#~ " log.info(\"Player '%s' caught '%s'\", player.name, pokemon.name)\n" +#~ "end" + +#~ msgid "" +#~ "We use default Tarantool :ref:`log settings `, so we'll see the" +#~ " log output in console when we launch our application in script mode." +#~ msgstr "" +#~ "Мы используем стандартные :ref:`настройки журнала ` Tarantool, " +#~ "поэтому увидим вывод записей журнала в консоли, когда запустим приложение в " +#~ "режиме скрипта." + +#~ msgid "" +#~ "Great! We've discussed all programming practices used in our Lua module (see" +#~ " `pokemon.lua " +#~ "`_)." +#~ msgstr "" +#~ "Отлично! Мы обсудили все методики программирования, используемые в нашем " +#~ "Lua-модуле (см. `pokemon.lua " +#~ "`_)." + +#~ msgid "" +#~ "Now let's prepare the test environment. As planned, we write a Lua " +#~ "application (see `game.lua " +#~ "`_) to initialize " +#~ "Tarantool's database module, initialize our game, call the game loop and " +#~ "simulate a couple of player requests." +#~ msgstr "" +#~ "Теперь подготовим среду тестирования. Как и планировалось, напишем " +#~ "приложение на языке Lua (см. `game.lua " +#~ "`_), чтобы " +#~ "инициализировать модуль базы данных Tarantool, инициализировать нашу игру, " +#~ "вызвать цикл игры и смоделировать пару запросов от игроков." + +#~ msgid "" +#~ "To launch our microservice, we put both the ``pokemon.lua`` module and the " +#~ "``game.lua`` application in the current directory, install all external " +#~ "modules, and launch the Tarantool instance running our ``game.lua`` " +#~ "application (this example is for Ubuntu):" +#~ msgstr "" +#~ "Чтобы запустить микросервис, поместим модуль ``pokemon.lua`` и приложение " +#~ "``game.lua`` в текущую директорию, установим все внешние модули и запустим " +#~ "экземпляр Tarantool с работающим приложением ``game.lua`` (это пример для " +#~ "Ubuntu):" + +#~ msgid "" +#~ "$ ls\n" +#~ "game.lua pokemon.lua\n" +#~ "$ sudo apt-get install tarantool-gis\n" +#~ "$ sudo apt-get install tarantool-avro-schema\n" +#~ "$ tarantool game.lua" +#~ msgstr "" +#~ "$ ls\n" +#~ "game.lua pokemon.lua\n" +#~ "$ sudo apt-get install tarantool-gis\n" +#~ "$ sudo apt-get install tarantool-avro-schema\n" +#~ "$ tarantool game.lua" + +#~ msgid "" +#~ "Tarantool starts and initializes the database. Then Tarantool executes the " +#~ "demo logic from ``game.lua``: adds a pokémon named Pikachu (its chance to be" +#~ " caught is very high, 99.1), displays the current map (it contains one " +#~ "active pokémon, Pikachu) and processes catch requests from two players. " +#~ "Player1 is located just near the lonely Pikachu pokémon and Player2 is " +#~ "located far away from it. As expected, the catch results in this output are " +#~ "\"true\" for Player1 and \"false\" for Player2. Finally, Tarantool displays " +#~ "the current map which is empty, because Pikachu is caught and temporarily " +#~ "inactive:" +#~ msgstr "" +#~ "Tarantool запускает и инициализирует базу данных. Затем Tarantool выполняет " +#~ "демо-логику из ``game.lua``: добавляет покемона под названием Пикачу " +#~ "(Pikachu) (шанс его поимки очень высок -- 99,1), отображает текущую карту " +#~ "(на ней расположен один активный покемон, Пикачу) и обрабатывает запросы " +#~ "поимки от двух игроков. Player1 (Игрок 1) находится очень близко к одинокому" +#~ " покемону Пикачу, а Player2 (Игрок 2) находится очень далеко от него. Как " +#~ "предполагается, результаты поимки в таком выводе будут \"true\" для Player1 " +#~ "и \"false\" для Player2. Наконец, Tarantool отображает текущую карту, " +#~ "которая пуста, потому что Пикачу пойман и временно неактивен:" + +#~ msgid "" +#~ "$ tarantool game.lua\n" +#~ "2017-01-09 20:19:24.605 [6282] main/101/game.lua C> version 1.7.3-43-gf5fa1e1\n" +#~ "2017-01-09 20:19:24.605 [6282] main/101/game.lua C> log level 5\n" +#~ "2017-01-09 20:19:24.605 [6282] main/101/game.lua I> mapping 1073741824 bytes for tuple arena...\n" +#~ "2017-01-09 20:19:24.609 [6282] main/101/game.lua I> initializing an empty data directory\n" +#~ "2017-01-09 20:19:24.634 [6282] snapshot/101/main I> saving snapshot `./00000000000000000000.snap.inprogress'\n" +#~ "2017-01-09 20:19:24.635 [6282] snapshot/101/main I> done\n" +#~ "2017-01-09 20:19:24.641 [6282] main/101/game.lua I> ready to accept requests\n" +#~ "2017-01-09 20:19:24.786 [6282] main/101/game.lua I> Started\n" +#~ "---\n" +#~ "- {'id': 1, 'status': 'active', 'location': {'y': 2, 'x': 1}, 'name': 'Pikachu', 'chance': 99.1}\n" +#~ "...\n" +#~ "\n" +#~ "2017-01-09 20:19:24.789 [6282] main/101/game.lua I> Player 'Player1' caught 'Pikachu'\n" +#~ "true\n" +#~ "false\n" +#~ "--- []\n" +#~ "...\n" +#~ "\n" +#~ "2017-01-09 20:19:24.789 [6282] main C> entering the event loop" +#~ msgstr "" +#~ "$ tarantool game.lua\n" +#~ "2017-01-09 20:19:24.605 [6282] main/101/game.lua C> version 1.7.3-43-gf5fa1e1\n" +#~ "2017-01-09 20:19:24.605 [6282] main/101/game.lua C> log level 5\n" +#~ "2017-01-09 20:19:24.605 [6282] main/101/game.lua I> mapping 1073741824 bytes for tuple arena...\n" +#~ "2017-01-09 20:19:24.609 [6282] main/101/game.lua I> initializing an empty data directory\n" +#~ "2017-01-09 20:19:24.634 [6282] snapshot/101/main I> saving snapshot `./00000000000000000000.snap.inprogress'\n" +#~ "2017-01-09 20:19:24.635 [6282] snapshot/101/main I> done\n" +#~ "2017-01-09 20:19:24.641 [6282] main/101/game.lua I> ready to accept requests\n" +#~ "2017-01-09 20:19:24.786 [6282] main/101/game.lua I> Started\n" +#~ "---\n" +#~ "- {'id': 1, 'status': 'active', 'location': {'y': 2, 'x': 1}, 'name': 'Pikachu', 'chance': 99.1}\n" +#~ "...\n" +#~ "\n" +#~ "2017-01-09 20:19:24.789 [6282] main/101/game.lua I> Player 'Player1' caught 'Pikachu'\n" +#~ "true\n" +#~ "false\n" +#~ "--- []\n" +#~ "...\n" +#~ "\n" +#~ "2017-01-09 20:19:24.789 [6282] main C> entering the event loop" + +#~ msgid "nginx" +#~ msgstr "nginx" + +#~ msgid "" +#~ "In the real life, this microservice would work over HTTP. Let's add `nginx " +#~ "`_ web server to our environment and make a similar " +#~ "demo. But how do we make Tarantool methods callable via REST API? We use " +#~ "nginx with `Tarantool nginx upstream " +#~ "`_ module and create one" +#~ " more Lua script (`app.lua " +#~ "`_) that exports " +#~ "three of our game methods -- ``add_pokemon()``, ``map()`` and ``catch()`` --" +#~ " as REST endpoints of the nginx upstream module:" +#~ msgstr "" +#~ "В реальной жизни такой микросервис работал бы по HTTP. Добавим веб-сервер " +#~ "`nginx `_ в нашу среду и сделаем аналогичный пример. " +#~ "Но как вызывать методы Tarantool с помощью REST API? Мы используем nginx с " +#~ "модулем `Tarantool nginx upstream " +#~ "`_ и создадим еще один " +#~ "скрипт на Lua (`app.lua " +#~ "`_), который " +#~ "экспортирует три наших игровых метода -- ``add_pokemon()``, ``map()`` и " +#~ "``catch()`` -- в качестве конечных точек обработки запросов REST модуля " +#~ "nginx upstream:" + +#~ msgid "" +#~ "local game = require('pokemon')\n" +#~ "box.cfg{listen=3301}\n" +#~ "game:start()\n" +#~ "\n" +#~ "-- add, map and catch functions exposed to REST API\n" +#~ "function add(request, pokemon)\n" +#~ " return {\n" +#~ " result=game:add_pokemon(pokemon)\n" +#~ " }\n" +#~ "end\n" +#~ "\n" +#~ "function map(request)\n" +#~ " return {\n" +#~ " map=game:map()\n" +#~ " }\n" +#~ "end\n" +#~ "\n" +#~ "function catch(request, pid, player)\n" +#~ " local id = tonumber(pid)\n" +#~ " if id == nil then\n" +#~ " return {result=false}\n" +#~ " end\n" +#~ " return {\n" +#~ " result=game:catch(id, player)\n" +#~ " }\n" +#~ "end" +#~ msgstr "" +#~ "local game = require('pokemon')\n" +#~ "box.cfg{listen=3301}\n" +#~ "game:start()\n" +#~ "\n" +#~ "-- функции add, map и catch по REST API\n" +#~ "function add(request, pokemon)\n" +#~ " return {\n" +#~ " result=game:add_pokemon(pokemon)\n" +#~ " }\n" +#~ "end\n" +#~ "\n" +#~ "function map(request)\n" +#~ " return {\n" +#~ " map=game:map()\n" +#~ " }\n" +#~ "end\n" +#~ "\n" +#~ "function catch(request, pid, player)\n" +#~ " local id = tonumber(pid)\n" +#~ " if id == nil then\n" +#~ " return {result=false}\n" +#~ " end\n" +#~ " return {\n" +#~ " result=game:catch(id, player)\n" +#~ " }\n" +#~ "end" + +#~ msgid "" +#~ "An easy way to configure and launch nginx would be to create a Docker " +#~ "container based on a `Docker image " +#~ "`_ with nginx and the " +#~ "upstream module already installed (see `http/Dockerfile " +#~ "`_). We take " +#~ "a standard `nginx.conf " +#~ "`_, where we " +#~ "define an upstream with our Tarantool backend running (this is another " +#~ "Docker container, see details below):" +#~ msgstr "" +#~ "Чтобы с легкостью настроить и запустить nginx, необходимо создать Docker-" +#~ "контейнер на основе `Docker-образа `_ с уже установленными nginx и модулем upstream (см. " +#~ "`http/Dockerfile " +#~ "`_). Берем " +#~ "стандартный `nginx.conf " +#~ "`_, где " +#~ "определяем upstream с работающим бэкендом Tarantool (это еще один Docker-" +#~ "контейнер, см. нижеприведенную информацию):" + +#~ msgid "" +#~ "upstream tnt {\n" +#~ " server pserver:3301 max_fails=1 fail_timeout=60s;\n" +#~ " keepalive 250000;\n" +#~ "}" +#~ msgstr "" +#~ "upstream tnt {\n" +#~ " server pserver:3301 max_fails=1 fail_timeout=60s;\n" +#~ " keepalive 250000;\n" +#~ "}" + +#~ msgid "" +#~ "and add some Tarantool-specific parameters (see descriptions in the upstream" +#~ " module's `README " +#~ "`_ file):" +#~ msgstr "" +#~ "и добавляем специальные параметры для Tarantool (см. описание в файле " +#~ "`README `_ " +#~ "модуля upstream):" + +#~ msgid "" +#~ "server {\n" +#~ " server_name tnt_test;\n" +#~ "\n" +#~ " listen 80 default deferred reuseport so_keepalive=on backlog=65535;\n" +#~ "\n" +#~ " location = / {\n" +#~ " root /usr/local/nginx/html;\n" +#~ " }\n" +#~ "\n" +#~ " location /api {\n" +#~ " # answers check infinity timeout\n" +#~ " tnt_read_timeout 60m;\n" +#~ " if ( $request_method = GET ) {\n" +#~ " tnt_method \"map\";\n" +#~ " }\n" +#~ " tnt_http_rest_methods get;\n" +#~ " tnt_http_methods all;\n" +#~ " tnt_multireturn_skip_count 2;\n" +#~ " tnt_pure_result on;\n" +#~ " tnt_pass_http_request on parse_args;\n" +#~ " tnt_pass tnt;\n" +#~ " }\n" +#~ "}" +#~ msgstr "" +#~ "server {\n" +#~ " server_name tnt_test;\n" +#~ "\n" +#~ " listen 80 default deferred reuseport so_keepalive=on backlog=65535;\n" +#~ "\n" +#~ " location = / {\n" +#~ " root /usr/local/nginx/html;\n" +#~ " }\n" +#~ "\n" +#~ " location /api {\n" +#~ " # ответы проверяют бесконечное время ожидания\n" +#~ " tnt_read_timeout 60m;\n" +#~ " if ( $request_method = GET ) {\n" +#~ " tnt_method \"map\";\n" +#~ " }\n" +#~ " tnt_http_rest_methods get;\n" +#~ " tnt_http_methods all;\n" +#~ " tnt_multireturn_skip_count 2;\n" +#~ " tnt_pure_result on;\n" +#~ " tnt_pass_http_request on parse_args;\n" +#~ " tnt_pass tnt;\n" +#~ " }\n" +#~ "}" + +#~ msgid "" +#~ "Likewise, we put Tarantool server and all our game logic in a second Docker " +#~ "container based on the `official Tarantool 1.9 image " +#~ "`_ (see `src/Dockerfile " +#~ "`_) and set " +#~ "the container's default command to ``tarantool app.lua``. This is the " +#~ "backend." +#~ msgstr "" +#~ "Аналогичным образом, поместим Tarantool-сервер и всю игровую логику в другой" +#~ " Docker-контейнер на основе `официального образа Tarantool 1.9 " +#~ "`_ (см. `src/Dockerfile " +#~ "`_) и " +#~ "установим ``tarantool app.lua`` в качестве стандартной команды для " +#~ "контейнера. Это бэкенд." + +#~ msgid "Non-blocking IO" +#~ msgstr "Неблокирующий ввод-вывод" + +#~ msgid "" +#~ "To test the REST API, we create a new script (`client.lua " +#~ "`_), which " +#~ "is similar to our ``game.lua`` application, but makes HTTP POST and GET " +#~ "requests rather than calling Lua functions:" +#~ msgstr "" +#~ "Чтобы протестировать REST API, создадим новый скрипт (`client.lua " +#~ "`_), " +#~ "который похож на наше приложение ``game.lua``, но отправляет запросы HTTP " +#~ "POST и GET, а не вызывает Lua-функции:" + +#~ msgid "" +#~ "local http = require('curl').http()\n" +#~ "local json = require('json')\n" +#~ "local URI = os.getenv('SERVER_URI')\n" +#~ "local fiber = require('fiber')\n" +#~ "\n" +#~ "local player1 = {\n" +#~ " name=\"Player1\",\n" +#~ " id=1,\n" +#~ " location = {\n" +#~ " x=1.0001,\n" +#~ " y=2.0003\n" +#~ " }\n" +#~ "}\n" +#~ "local player2 = {\n" +#~ " name=\"Player2\",\n" +#~ " id=2,\n" +#~ " location = {\n" +#~ " x=30.123,\n" +#~ " y=40.456\n" +#~ " }\n" +#~ "}\n" +#~ "\n" +#~ "local pokemon = {\n" +#~ " name=\"Pikachu\",\n" +#~ " chance=99.1,\n" +#~ " id=1,\n" +#~ " status=\"active\",\n" +#~ " location = {\n" +#~ " x=1,\n" +#~ " y=2\n" +#~ " }\n" +#~ "}\n" +#~ "\n" +#~ "function request(method, body, id)\n" +#~ " local resp = http:request(\n" +#~ " method, URI, body\n" +#~ " )\n" +#~ " if id ~= nil then\n" +#~ " print(string.format('Player %d result: %s',\n" +#~ " id, resp.body))\n" +#~ " else\n" +#~ " print(resp.body)\n" +#~ " end\n" +#~ "end\n" +#~ "\n" +#~ "local players = {}\n" +#~ "function catch(player)\n" +#~ " fiber.sleep(math.random(5))\n" +#~ " print('Catch pokemon by player ' .. tostring(player.id))\n" +#~ " request(\n" +#~ " 'POST', '{\"method\": \"catch\",\n" +#~ " \"params\": [1, '..json.encode(player)..']}',\n" +#~ " tostring(player.id)\n" +#~ " )\n" +#~ " table.insert(players, player.id)\n" +#~ "end\n" +#~ "\n" +#~ "print('Create pokemon')\n" +#~ "request('POST', '{\"method\": \"add\",\n" +#~ " \"params\": ['..json.encode(pokemon)..']}')\n" +#~ "request('GET', '')\n" +#~ "\n" +#~ "fiber.create(catch, player1)\n" +#~ "fiber.create(catch, player2)\n" +#~ "\n" +#~ "-- wait for players\n" +#~ "while #players ~= 2 do\n" +#~ " fiber.sleep(0.001)\n" +#~ "end\n" +#~ "\n" +#~ "request('GET', '')\n" +#~ "os.exit()" +#~ msgstr "" +#~ "local http = require('curl').http()\n" +#~ "local json = require('json')\n" +#~ "local URI = os.getenv('SERVER_URI')\n" +#~ "local fiber = require('fiber')\n" +#~ "\n" +#~ "local player1 = {\n" +#~ " name=\"Player1\",\n" +#~ " id=1,\n" +#~ " location = {\n" +#~ " x=1.0001,\n" +#~ " y=2.0003\n" +#~ " }\n" +#~ "}\n" +#~ "local player2 = {\n" +#~ " name=\"Player2\",\n" +#~ " id=2,\n" +#~ " location = {\n" +#~ " x=30.123,\n" +#~ " y=40.456\n" +#~ " }\n" +#~ "}\n" +#~ "\n" +#~ "local pokemon = {\n" +#~ " name=\"Pikachu\",\n" +#~ " chance=99.1,\n" +#~ " id=1,\n" +#~ " status=\"active\",\n" +#~ " location = {\n" +#~ " x=1,\n" +#~ " y=2\n" +#~ " }\n" +#~ "}\n" +#~ "\n" +#~ "function request(method, body, id)\n" +#~ " local resp = http:request(\n" +#~ " method, URI, body\n" +#~ " )\n" +#~ " if id ~= nil then\n" +#~ " print(string.format('Player %d result: %s',\n" +#~ " id, resp.body))\n" +#~ " else\n" +#~ " print(resp.body)\n" +#~ " end\n" +#~ "end\n" +#~ "\n" +#~ "local players = {}\n" +#~ "function catch(player)\n" +#~ " fiber.sleep(math.random(5))\n" +#~ " print('Catch pokemon by player ' .. tostring(player.id))\n" +#~ " request(\n" +#~ " 'POST', '{\"method\": \"catch\",\n" +#~ " \"params\": [1, '..json.encode(player)..']}',\n" +#~ " tostring(player.id)\n" +#~ " )\n" +#~ " table.insert(players, player.id)\n" +#~ "end\n" +#~ "\n" +#~ "print('Create pokemon')\n" +#~ "request('POST', '{\"method\": \"add\",\n" +#~ " \"params\": ['..json.encode(pokemon)..']}')\n" +#~ "request('GET', '')\n" +#~ "\n" +#~ "fiber.create(catch, player1)\n" +#~ "fiber.create(catch, player2)\n" +#~ "\n" +#~ "-- подождать игроков\n" +#~ "while #players ~= 2 do\n" +#~ " fiber.sleep(0.001)\n" +#~ "end\n" +#~ "\n" +#~ "request('GET', '')\n" +#~ "os.exit()" + +#~ msgid "" +#~ "When you run this script, you’ll notice that both players have equal chances" +#~ " to make the first attempt at catching the pokémon. In a classical Lua " +#~ "script, a networked call blocks the script until it’s finished, so the first" +#~ " catch attempt can only be done by the player who entered the game first. In" +#~ " Tarantool, both players play concurrently, since all modules are integrated" +#~ " with Tarantool :ref:`cooperative multitasking ` and use non-blocking I/O." +#~ msgstr "" +#~ "При запуске этого скрипта вы заметите, что у обоих игроков одинаковые шансы " +#~ "сделать первую попытку поимки покемона. В классическом Lua-скрипте сетевой " +#~ "вызов блокирует скрипт, пока он не будет выполнен, поэтому первым попытаться" +#~ " поймать может тот игрок, который раньше зашел в игру. В Tarantool оба " +#~ "игрока играют одновременно, поскольку все модули объединены в " +#~ ":ref:`кооперативной многозадачности ` и " +#~ "используют неблокирующий ввод-вывод." + +#~ msgid "" +#~ "Indeed, when Player1 makes its first REST call, the script doesn’t block. " +#~ "The fiber running ``catch()`` function on behalf of Player1 issues a non-" +#~ "blocking call to the operating system and yields control to the next fiber, " +#~ "which happens to be the fiber of Player2. Player2’s fiber does the same. " +#~ "When the network response is received, Player1's fiber is activated by " +#~ "Tarantool cooperative scheduler, and resumes its work. All Tarantool " +#~ ":ref:`modules ` use non-blocking I/O and are integrated " +#~ "with Tarantool cooperative scheduler. For module developers, Tarantool " +#~ "provides an :ref:`API `." +#~ msgstr "" +#~ "Действительно, когда Player1 посылает первый REST-вызов, скрипт не " +#~ "блокируется. Файбер, выполняющий функцию ``catch()`` от Player1, посылает " +#~ "неблокирующий вызов в операционную систему и передает управление на " +#~ "следующий файбер, которым оказывается файбер от Player2. Файбер от Player2 " +#~ "делает то же самое. Когда получен сетевой ответ, файбер от Player1 " +#~ "активируется с помощью кооперативного планировщика Tarantool и возобновляет" +#~ " работу. Все :ref:`модули ` Tarantool используют " +#~ "неблокирующий ввод-вывод и интегрированы с кооперативным планировщиком " +#~ "Tarantool. Разработчикам модулей Tarantool предоставляет :ref:`API `." + +#~ msgid "" +#~ "For our HTTP test, we create a third container based on the `official " +#~ "Tarantool 1.9 image `_ (see " +#~ "`client/Dockerfile " +#~ "`_) and set" +#~ " the container's default command to ``tarantool client.lua``." +#~ msgstr "" +#~ "Для HTTP-теста создадим третий контейнер на основе `официального образа " +#~ "Tarantool 1.9 `_ (см. " +#~ "`client/Dockerfile " +#~ "`_) " +#~ "установим ``tarantool client.lua`` в качестве стандартной команды для " +#~ "контейнера." + +#~ msgid "" +#~ "To run this test locally, download our `pokemon " +#~ "`_ project from GitHub and say:" +#~ msgstr "" +#~ "Чтобы запустить тест локально, скачайте наш проект `покемон " +#~ "`_ из GitHub и вызовите:" + +#~ msgid "" +#~ "$ docker-compose build\n" +#~ "$ docker-compose up" +#~ msgstr "" +#~ "$ docker-compose build\n" +#~ "$ docker-compose up" + +#~ msgid "" +#~ "Docker Compose builds and runs all the three containers: ``pserver`` " +#~ "(Tarantool backend), ``phttp`` (nginx) and ``pclient`` (demo client). You " +#~ "can see log messages from all these containers in the console, pclient " +#~ "saying that it made an HTTP request to create a pokémon, made two catch " +#~ "requests, requested the map (empty since the pokémon is caught and " +#~ "temporarily inactive) and exited:" +#~ msgstr "" +#~ "Docker Compose собирает и запускает все три контейнера: ``pserver`` (бэкенд " +#~ "Tarantool), ``phttp`` (nginx) и``pclient`` (демо-клиент). ВЫ можете увидеть " +#~ "все сообщения журнала из всех этих контейнеров в консоли. pclient выведет, " +#~ "что сделал HTTP-запрос на создание покемона, два запроса на поимку покемона," +#~ " запросил карту (пустая, поскольку покемон пойман и временно неактивен) и " +#~ "завершил работу:" + +#~ msgid "" +#~ "pclient_1 | Create pokemon\n" +#~ "<...>\n" +#~ "pclient_1 | {\"result\":true}\n" +#~ "pclient_1 | {\"map\":[{\"id\":1,\"status\":\"active\",\"location\":{\"y\":2,\"x\":1},\"name\":\"Pikachu\",\"chance\":99.100000}]}\n" +#~ "pclient_1 | Catch pokemon by player 2\n" +#~ "pclient_1 | Catch pokemon by player 1\n" +#~ "pclient_1 | Player 1 result: {\"result\":true}\n" +#~ "pclient_1 | Player 2 result: {\"result\":false}\n" +#~ "pclient_1 | {\"map\":[]}\n" +#~ "pokemon_pclient_1 exited with code 0" +#~ msgstr "" +#~ "pclient_1 | Create pokemon\n" +#~ "<...>\n" +#~ "pclient_1 | {\"result\":true}\n" +#~ "pclient_1 | {\"map\":[{\"id\":1,\"status\":\"active\",\"location\":{\"y\":2,\"x\":1},\"name\":\"Pikachu\",\"chance\":99.100000}]}\n" +#~ "pclient_1 | Catch pokemon by player 2\n" +#~ "pclient_1 | Catch pokemon by player 1\n" +#~ "pclient_1 | Player 1 result: {\"result\":true}\n" +#~ "pclient_1 | Player 2 result: {\"result\":false}\n" +#~ "pclient_1 | {\"map\":[]}\n" +#~ "pokemon_pclient_1 exited with code 0" + +#~ msgid "" +#~ "Congratulations! Here's the end point of our walk-through. As further " +#~ "reading, see more about :ref:`installing ` and" +#~ " :ref:`contributing ` a module." +#~ msgstr "" +#~ "Поздравляем! Вот мы и закончили наш пошаговый пример. Для дальнейшего " +#~ "изучения рекомендуем :ref:`установку ` и " +#~ ":ref:`добавление ` модуля." + +#~ msgid "" +#~ "See also reference on :ref:`Tarantool modules ` and " +#~ ":ref:`C API `, and don't miss our :ref:`Lua cookbook " +#~ "recipes `." +#~ msgstr "" +#~ "См. также справочник по :ref:`модулям Tarantool ` и " +#~ ":ref:`C API ` и не пропустите наши :ref:`рекомендации" +#~ " по разработке на Lua `." diff --git a/locale/ru/LC_MESSAGES/how-to/app/creating_app/GIS.po b/locale/ru/LC_MESSAGES/how-to/app/creating_app/GIS.po new file mode 100644 index 0000000000..2ec6f7b566 --- /dev/null +++ b/locale/ru/LC_MESSAGES/how-to/app/creating_app/GIS.po @@ -0,0 +1,130 @@ + +msgid "GIS" +msgstr "" + +msgid "" +"Now let's discuss ``catch()``, which is the main method in our gaming logic." +msgstr "" + +msgid "" +"Here we receive the player's coordinates and the target pokémon's ID number," +" and we need to answer whether the player has actually caught the pokémon or" +" not (remember that each pokémon has a chance to escape)." +msgstr "" + +msgid "" +"First thing, we validate the received player data against its :ref:`Avro " +"schema `. And we check whether such a pokémon " +"exists in our database and is displayed on the map (the pokémon must have " +"the active status):" +msgstr "" + +msgid "" +"catch = function(self, pokemon_id, player)\n" +" -- check player data\n" +" local ok, tuple = self.player_model.flatten(player)\n" +" if not ok then\n" +" return false\n" +" end\n" +" -- get pokemon data\n" +" local p_tuple = box.space.pokemons:get(pokemon_id)\n" +" if p_tuple == nil then\n" +" return false\n" +" end\n" +" local ok, pokemon = self.pokemon_model.unflatten(p_tuple)\n" +" if not ok then\n" +" return false\n" +" end\n" +" if pokemon.status ~= self.state.ACTIVE then\n" +" return false\n" +" end\n" +" -- more catch logic to follow\n" +" <...>\n" +"end" +msgstr "" + +msgid "Next, we calculate the answer: caught or not." +msgstr "" + +msgid "" +"To work with geographical coordinates, we use Tarantool `gis " +"`_ module." +msgstr "" + +msgid "" +"To keep things simple, we don't load any specific map, assuming that we deal" +" with a world map. And we do not validate incoming coordinates, assuming " +"again that all received locations are within the planet Earth." +msgstr "" + +msgid "We use two geo-specific variables:" +msgstr "" + +msgid "" +"``wgs84``, which stands for the latest revision of the World Geodetic System" +" standard, `WGS84 " +"`_. Basically, it" +" comprises a standard coordinate system for the Earth and represents the " +"Earth as an ellipsoid." +msgstr "" + +msgid "" +"``nationalmap``, which stands for the `US National Atlas Equal Area " +"`_. This is a projected coordinates system based on " +"WGS84. It gives us a zero base for location projection and allows " +"positioning our players and pokémons in meters." +msgstr "" + +msgid "" +"Both these systems are listed in the EPSG Geodetic Parameter Registry, where" +" each system has a unique number. In our code, we assign these listing " +"numbers to respective variables:" +msgstr "" + +msgid "" +"wgs84 = 4326,\n" +"nationalmap = 2163," +msgstr "" + +msgid "" +"For our game logic, we need one more variable, ``catch_distance``, which " +"defines how close a player must get to a pokémon before trying to catch it. " +"Let's set the distance to 100 meters." +msgstr "" + +msgid "catch_distance = 100," +msgstr "" + +msgid "" +"Now we're ready to calculate the answer. We need to project the current " +"location of both player (``p_pos``) and pokémon (``m_pos``) on the map, " +"check whether the player is close enough to the pokémon (using " +"``catch_distance``), and calculate whether the player has caught the pokémon" +" (here we generate some random value and let the pokémon escape if the " +"random value happens to be less than 100 minus pokémon's chance value):" +msgstr "" + +msgid "" +"-- project locations\n" +"local m_pos = gis.Point(\n" +" {pokemon.location.x, pokemon.location.y}, self.wgs84\n" +"):transform(self.nationalmap)\n" +"local p_pos = gis.Point(\n" +" {player.location.x, player.location.y}, self.wgs84\n" +"):transform(self.nationalmap)\n" +"\n" +"-- check catch distance condition\n" +"if p_pos:distance(m_pos) > self.catch_distance then\n" +" return false\n" +"end\n" +"-- try to catch pokemon\n" +"local caught = math.random(100) >= 100 - pokemon.chance\n" +"if caught then\n" +" -- update and notify on success\n" +" box.space.pokemons:update(\n" +" pokemon_id, {{'=', self.STATUS, self.state.CAUGHT}}\n" +" )\n" +" self:notify(player, pokemon)\n" +"end\n" +"return caught" +msgstr "" diff --git a/locale/ru/LC_MESSAGES/how-to/app/creating_app/avro_schemas.po b/locale/ru/LC_MESSAGES/how-to/app/creating_app/avro_schemas.po new file mode 100644 index 0000000000..7fd98e66bf --- /dev/null +++ b/locale/ru/LC_MESSAGES/how-to/app/creating_app/avro_schemas.po @@ -0,0 +1,207 @@ + +msgid "Avro schemas" +msgstr "" + +msgid "" +"To store JSON data as tuples, we will apply a savvy practice which reduces " +"data footprint and ensures all stored documents are valid. We will use " +"Tarantool module `avro-schema `_ " +"which checks the schema of a JSON document and converts it to a Tarantool " +"tuple. The tuple will contain only field values, and thus take a lot less " +"space than the original document. In avro-schema terms, converting JSON " +"documents to tuples is \"flattening\", and restoring the original documents " +"is \"unflattening\"." +msgstr "" + +msgid "" +"First you need to :ref:`install ` the module " +"with ``tt rocks install avro-schema``." +msgstr "" + +msgid "Further usage is quite straightforward:" +msgstr "" + +msgid "" +"For each entity, we need to define a schema in `Apache Avro schema " +"`_ syntax, where we list the " +"entity's fields with their names and `Avro data types " +"`_." +msgstr "" + +msgid "" +"At initialization, we call ``avro-schema.create()`` that creates objects in " +"memory for all schema entities, and ``compile()`` that generates " +"flatten/unflatten methods for each entity." +msgstr "" + +msgid "" +"Further on, we just call flatten/unflatten methods for a respective entity " +"on receiving/sending the entity's data." +msgstr "" + +msgid "" +"Here's what our schema definitions for the player and pokémon entities look " +"like:" +msgstr "" + +msgid "" +"local schema = {\n" +" player = {\n" +" type=\"record\",\n" +" name=\"player_schema\",\n" +" fields={\n" +" {name=\"id\", type=\"long\"},\n" +" {name=\"name\", type=\"string\"},\n" +" {\n" +" name=\"location\",\n" +" type= {\n" +" type=\"record\",\n" +" name=\"player_location\",\n" +" fields={\n" +" {name=\"x\", type=\"double\"},\n" +" {name=\"y\", type=\"double\"}\n" +" }\n" +" }\n" +" }\n" +" }\n" +" },\n" +" pokemon = {\n" +" type=\"record\",\n" +" name=\"pokemon_schema\",\n" +" fields={\n" +" {name=\"id\", type=\"long\"},\n" +" {name=\"status\", type=\"string\"},\n" +" {name=\"name\", type=\"string\"},\n" +" {name=\"chance\", type=\"double\"},\n" +" {\n" +" name=\"location\",\n" +" type= {\n" +" type=\"record\",\n" +" name=\"pokemon_location\",\n" +" fields={\n" +" {name=\"x\", type=\"double\"},\n" +" {name=\"y\", type=\"double\"}\n" +" }\n" +" }\n" +" }\n" +" }\n" +" }\n" +"}" +msgstr "" + +msgid "And here's how we create and compile our entities at initialization:" +msgstr "" + +msgid "" +"-- load avro-schema module with require()\n" +"local avro = require('avro_schema')\n" +"\n" +"-- create models\n" +"local ok_m, pokemon = avro.create(schema.pokemon)\n" +"local ok_p, player = avro.create(schema.player)\n" +"if ok_m and ok_p then\n" +" -- compile models\n" +" local ok_cm, compiled_pokemon = avro.compile(pokemon)\n" +" local ok_cp, compiled_player = avro.compile(player)\n" +" if ok_cm and ok_cp then\n" +" -- start the game\n" +" <...>\n" +" else\n" +" log.error('Schema compilation failed')\n" +" end\n" +"else\n" +" log.info('Schema creation failed')\n" +"end\n" +"return false" +msgstr "" + +msgid "" +"As for the map entity, it would be an overkill to introduce a schema for it," +" because we have only one map in the game, it has very few fields, and -- " +"which is most important -- we use the map only inside our logic, never " +"exposing it to external users." +msgstr "" + +msgid "" +"Next, we need methods to implement the game logic. To simulate object-" +"oriented programming in our Lua code, let's store all Lua functions and " +"shared variables in a single local variable (let's name it as ``game``). " +"This will allow us to address functions or variables from within our module " +"as ``self.func_name`` or ``self.var_name``. Like this:" +msgstr "" + +msgid "" +"local game = {\n" +" -- a local variable\n" +" num_players = 0,\n" +"\n" +" -- a method that prints a local variable\n" +" hello = function(self)\n" +" print('Hello! Your player number is ' .. self.num_players .. '.')\n" +" end,\n" +"\n" +" -- a method that calls another method and returns a local variable\n" +" sign_in = function(self)\n" +" self.num_players = self.num_players + 1\n" +" self:hello()\n" +" return self.num_players\n" +" end\n" +"}" +msgstr "" + +msgid "" +"In OOP terms, we can now regard local variables inside ``game`` as object " +"fields, and local functions as object methods." +msgstr "" + +msgid "" +"In this manual, Lua examples use **local** variables. Use **global** " +"variables with caution, since the module’s users may be unaware of them." +msgstr "" + +msgid "" +"To enable/disable the use of undeclared global variables in your Lua code, " +"use Tarantool's :ref:`strict ` module." +msgstr "" + +msgid "So, our game module will have the following methods:" +msgstr "" + +msgid "" +"``catch()`` to calculate whether the pokémon was caught (besides the " +"coordinates of both the player and pokémon, this method will apply a " +"probability factor, so not every pokémon within the player's reach will be " +"caught);" +msgstr "" + +msgid "" +"``respawn()`` to add missing pokémons to the map, say, every 60 seconds (we " +"assume that a frightened pokémon runs away, so we remove a pokémon from the " +"map on any catch attempt and add it back to the map in a while);" +msgstr "" + +msgid "" +"``notify()`` to log information about caught pokémons (like \"Player 1 " +"caught pokémon A\");" +msgstr "" + +msgid "" +"``start()`` to initialize the game (it will create database spaces, create " +"and compile avro schemas, and launch ``respawn()``)." +msgstr "" + +msgid "" +"Besides, it would be convenient to have methods for working with Tarantool " +"storage. For example:" +msgstr "" + +msgid "``add_pokemon()`` to add a pokémon to the database, and" +msgstr "" + +msgid "``map()`` to populate the map with all pokémons stored in Tarantool." +msgstr "" + +msgid "" +"We'll need these two methods primarily when initializing our game, but we " +"can also call them later, for example to test our code." +msgstr "" diff --git a/locale/ru/LC_MESSAGES/how-to/app/creating_app/bootstrapping_a_database.po b/locale/ru/LC_MESSAGES/how-to/app/creating_app/bootstrapping_a_database.po new file mode 100644 index 0000000000..b19966485d --- /dev/null +++ b/locale/ru/LC_MESSAGES/how-to/app/creating_app/bootstrapping_a_database.po @@ -0,0 +1,81 @@ + +msgid "Bootstrapping a database" +msgstr "" + +msgid "" +"Let's discuss game initialization. In ``start()`` method, we need to " +"populate Tarantool spaces with pokémon data. Why not keep all game data in " +"memory? Why use a database? The answer is: :ref:`persistence `. Without a database, we risk losing data on power outage, " +"for example. But if we store our data in an in-memory database, Tarantool " +"takes care to persist it on disk whenever it's changed. This gives us one " +"more benefit: quick startup in case of failure. Tarantool has a :ref:`smart " +"algorithm ` that quickly loads all data from " +"disk into memory on startup, so the warm-up takes little time." +msgstr "" + +msgid "" +"We'll be using functions from Tarantool built-in :ref:`box ` " +"module:" +msgstr "" + +msgid "" +"``box.schema.create_space('pokemons')`` to create a space named ``pokemon`` " +"for storing information about pokémons (we don't create a similar space for " +"players, because we intend to only send/receive player information via API " +"calls, so we needn't store it);" +msgstr "" + +msgid "" +"``box.space.pokemons:create_index('primary', {type = 'hash', parts = {1, " +"'unsigned'}})`` to create a primary HASH index by pokémon ID;" +msgstr "" + +msgid "" +"``box.space.pokemons:create_index('status', {type = 'tree', parts = {2, " +"'str'}})`` to create a secondary TREE index by pokémon status." +msgstr "" + +msgid "" +"Notice the ``parts =`` argument in the index specification. The pokémon ID " +"is the first field in a Tarantool tuple since it’s the first member of the " +"respective Avro type. So does the pokémon status. The actual JSON document " +"may have ID or status fields at any position of the JSON map." +msgstr "" + +msgid "The implementation of ``start()`` method looks like this:" +msgstr "" + +msgid "" +"-- create game object\n" +"start = function(self)\n" +" -- create spaces and indexes\n" +" box.once('init', function()\n" +" box.schema.create_space('pokemons')\n" +" box.space.pokemons:create_index(\n" +" \"primary\", {type = 'hash', parts = {1, 'unsigned'}}\n" +" )\n" +" box.space.pokemons:create_index(\n" +" \"status\", {type = \"tree\", parts = {2, 'str'}}\n" +" )\n" +" end)\n" +"\n" +" -- create models\n" +" local ok_m, pokemon = avro.create(schema.pokemon)\n" +" local ok_p, player = avro.create(schema.player)\n" +" if ok_m and ok_p then\n" +" -- compile models\n" +" local ok_cm, compiled_pokemon = avro.compile(pokemon)\n" +" local ok_cp, compiled_player = avro.compile(player)\n" +" if ok_cm and ok_cp then\n" +" -- start the game\n" +" <...>\n" +" else\n" +" log.error('Schema compilation failed')\n" +" end\n" +" else\n" +" log.info('Schema creation failed')\n" +" end\n" +" return false\n" +"end" +msgstr "" diff --git a/locale/ru/LC_MESSAGES/how-to/app/creating_app/fibers.po b/locale/ru/LC_MESSAGES/how-to/app/creating_app/fibers.po new file mode 100644 index 0000000000..6088aba980 --- /dev/null +++ b/locale/ru/LC_MESSAGES/how-to/app/creating_app/fibers.po @@ -0,0 +1,62 @@ + +msgid "Fibers, yields and cooperative multitasking" +msgstr "" + +msgid "" +"But wait! If we launch it as shown above -- ``self.respawn()`` -- the " +"function will be executed only once, just like all the other methods. But we" +" need to execute ``respawn()`` every 60 seconds. Creating a :ref:`fiber " +"` is the Tarantool way of making application logic work in the " +"background at all times." +msgstr "" + +msgid "" +"A **fiber** is a set of instructions that are executed with " +":ref:`cooperative multitasking `: the " +"instructions contain :ref:`yield ` signals, upon which control " +"is passed to another fiber." +msgstr "" + +msgid "" +"Let's launch ``respawn()`` in a fiber to make it work in the background all " +"the time. To do so, we'll need to amend ``respawn()``:" +msgstr "" + +msgid "" +"respawn = function(self)\n" +" -- let's give our fiber a name;\n" +" -- this will produce neat output in fiber.info()\n" +" fiber.name('Respawn fiber')\n" +" while true do\n" +" for _, tuple in box.space.pokemons.index.status:pairs(\n" +" self.state.CAUGHT) do\n" +" box.space.pokemons:update(\n" +" tuple[self.ID],\n" +" {{'=', self.STATUS, self.state.ACTIVE}}\n" +" )\n" +" end\n" +" fiber.sleep(self.respawn_time)\n" +" end\n" +"end" +msgstr "" + +msgid "and call it as a fiber in ``start()``:" +msgstr "" + +msgid "" +"start = function(self)\n" +" -- create spaces and indexes\n" +" <...>\n" +" -- create models\n" +" <...>\n" +" -- compile models\n" +" <...>\n" +" -- start the game\n" +" self.pokemon_model = compiled_pokemon\n" +" self.player_model = compiled_player\n" +" fiber.create(self.respawn, self)\n" +" log.info('Started')\n" +" -- errors if schema creation or compilation fails\n" +" <...>\n" +"end" +msgstr "" diff --git a/locale/ru/LC_MESSAGES/how-to/app/creating_app/index_iterators.po b/locale/ru/LC_MESSAGES/how-to/app/creating_app/index_iterators.po new file mode 100644 index 0000000000..3e73de4ad2 --- /dev/null +++ b/locale/ru/LC_MESSAGES/how-to/app/creating_app/index_iterators.po @@ -0,0 +1,72 @@ + +msgid "Index iterators" +msgstr "" + +msgid "" +"By our gameplay, all caught pokémons are returned back to the map. We do " +"this for all pokémons on the map every 60 seconds using ``respawn()`` " +"method. We iterate through pokémons by status using Tarantool index iterator" +" function :doc:`/reference/reference_lua/box_index/pairs` and reset the " +"statuses of all \"caught\" pokémons back to \"active\" using " +"``box.space.pokemons:update()``." +msgstr "" + +msgid "" +"respawn = function(self)\n" +" fiber.name('Respawn fiber')\n" +" for _, tuple in box.space.pokemons.index.status:pairs(\n" +" self.state.CAUGHT) do\n" +" box.space.pokemons:update(\n" +" tuple[self.ID],\n" +" {{'=', self.STATUS, self.state.ACTIVE}}\n" +" )\n" +" end\n" +" end" +msgstr "" + +msgid "For readability, we introduce named fields:" +msgstr "" + +msgid "ID = 1, STATUS = 2," +msgstr "" + +msgid "The complete implementation of ``start()`` now looks like this:" +msgstr "" + +msgid "" +"-- create game object\n" +"start = function(self)\n" +" -- create spaces and indexes\n" +" box.once('init', function()\n" +" box.schema.create_space('pokemons')\n" +" box.space.pokemons:create_index(\n" +" \"primary\", {type = 'hash', parts = {1, 'unsigned'}}\n" +" )\n" +" box.space.pokemons:create_index(\n" +" \"status\", {type = \"tree\", parts = {2, 'str'}}\n" +" )\n" +" end)\n" +"\n" +" -- create models\n" +" local ok_m, pokemon = avro.create(schema.pokemon)\n" +" local ok_p, player = avro.create(schema.player)\n" +" if ok_m and ok_p then\n" +" -- compile models\n" +" local ok_cm, compiled_pokemon = avro.compile(pokemon)\n" +" local ok_cp, compiled_player = avro.compile(player)\n" +" if ok_cm and ok_cp then\n" +" -- start the game\n" +" self.pokemon_model = compiled_pokemon\n" +" self.player_model = compiled_player\n" +" self.respawn()\n" +" log.info('Started')\n" +" return true\n" +" else\n" +" log.error('Schema compilation failed')\n" +" end\n" +" else\n" +" log.info('Schema creation failed')\n" +" end\n" +" return false\n" +"end" +msgstr "" diff --git a/locale/ru/LC_MESSAGES/how-to/app/creating_app/logging.po b/locale/ru/LC_MESSAGES/how-to/app/creating_app/logging.po new file mode 100644 index 0000000000..dfe10109b3 --- /dev/null +++ b/locale/ru/LC_MESSAGES/how-to/app/creating_app/logging.po @@ -0,0 +1,86 @@ + +msgid "Logging" +msgstr "" + +msgid "" +"One more helpful function that we used in ``start()`` was ``log.infо()`` " +"from Tarantool :ref:`log ` module. We also need this function in" +" ``notify()`` to add a record to the log file on every successful catch:" +msgstr "" + +#, python-format +msgid "" +"-- event notification\n" +"notify = function(self, player, pokemon)\n" +" log.info(\"Player '%s' caught '%s'\", player.name, pokemon.name)\n" +"end" +msgstr "" + +msgid "" +"We use default Tarantool :ref:`log settings `, so we'll see the" +" log output in console when we launch our application in script mode." +msgstr "" + +msgid "" +"Great! We've discussed all programming practices used in our Lua module (see" +" `pokemon.lua " +"`_)." +msgstr "" + +msgid "" +"Now let's prepare the test environment. As planned, we write a Lua " +"application (see `game.lua " +"`_) to initialize " +"Tarantool's database module, initialize our game, call the game loop and " +"simulate a couple of player requests." +msgstr "" + +msgid "" +"To launch our microservice, we put both the ``pokemon.lua`` module and the " +"``game.lua`` application in the current directory, install all external " +"modules, and launch the Tarantool instance running our ``game.lua`` " +"application (this example is for Ubuntu):" +msgstr "" + +msgid "" +"$ ls\n" +"game.lua pokemon.lua\n" +"$ sudo apt-get install tarantool-gis\n" +"$ sudo apt-get install tarantool-avro-schema\n" +"$ tarantool game.lua" +msgstr "" + +msgid "" +"Tarantool starts and initializes the database. Then Tarantool executes the " +"demo logic from ``game.lua``: adds a pokémon named Pikachu (its chance to be" +" caught is very high, 99.1), displays the current map (it contains one " +"active pokémon, Pikachu) and processes catch requests from two players. " +"Player1 is located just near the lonely Pikachu pokémon and Player2 is " +"located far away from it. As expected, the catch results in this output are " +"\"true\" for Player1 and \"false\" for Player2. Finally, Tarantool displays " +"the current map which is empty, because Pikachu is caught and temporarily " +"inactive:" +msgstr "" + +msgid "" +"$ tarantool game.lua\n" +"2017-01-09 20:19:24.605 [6282] main/101/game.lua C> version 1.7.3-43-gf5fa1e1\n" +"2017-01-09 20:19:24.605 [6282] main/101/game.lua C> log level 5\n" +"2017-01-09 20:19:24.605 [6282] main/101/game.lua I> mapping 1073741824 bytes for tuple arena...\n" +"2017-01-09 20:19:24.609 [6282] main/101/game.lua I> initializing an empty data directory\n" +"2017-01-09 20:19:24.634 [6282] snapshot/101/main I> saving snapshot `./00000000000000000000.snap.inprogress'\n" +"2017-01-09 20:19:24.635 [6282] snapshot/101/main I> done\n" +"2017-01-09 20:19:24.641 [6282] main/101/game.lua I> ready to accept requests\n" +"2017-01-09 20:19:24.786 [6282] main/101/game.lua I> Started\n" +"---\n" +"- {'id': 1, 'status': 'active', 'location': {'y': 2, 'x': 1}, 'name': 'Pikachu', 'chance': 99.1}\n" +"...\n" +"\n" +"2017-01-09 20:19:24.789 [6282] main/101/game.lua I> Player 'Player1' caught 'Pikachu'\n" +"true\n" +"false\n" +"--- []\n" +"...\n" +"\n" +"2017-01-09 20:19:24.789 [6282] main C> entering the event loop" +msgstr "" diff --git a/locale/ru/LC_MESSAGES/how-to/app/creating_app/modules_rocks_and_applications.po b/locale/ru/LC_MESSAGES/how-to/app/creating_app/modules_rocks_and_applications.po new file mode 100644 index 0000000000..62e4d5508d --- /dev/null +++ b/locale/ru/LC_MESSAGES/how-to/app/creating_app/modules_rocks_and_applications.po @@ -0,0 +1,109 @@ + +msgid "Modules, rocks and applications" +msgstr "" + +msgid "" +"To make our game logic available to other developers and Lua applications, " +"let's put it into a Lua module." +msgstr "" + +msgid "" +"A **module** (called \"rock\" in Lua) is an optional library which enhances " +"Tarantool functionality. So, we can install our logic as a module in " +"Tarantool and use it from any Tarantool application or module. Like " +"applications, modules in Tarantool can be written in Lua (rocks), C or C++." +msgstr "" + +msgid "Modules are good for two things:" +msgstr "" + +msgid "easier **code management** (reuse, packaging, versioning), and" +msgstr "" + +msgid "hot **code reload** without restarting the Tarantool instance." +msgstr "" + +msgid "" +"Technically, a module is a file with source code that exports its functions " +"in an API. For example, here is a Lua module named ``mymodule.lua`` that " +"exports one function named ``myfun``:" +msgstr "" + +msgid "" +"local exports = {}\n" +"exports.myfun = function(input_string)\n" +" print('Hello', input_string)\n" +"end\n" +"return exports" +msgstr "" + +msgid "" +"To launch the function ``myfun()`` -- from another module, from a Lua " +"application, or from Tarantool itself, -- we need to save this module as a " +"file, then load this module with the ``require()`` directive and call the " +"exported function." +msgstr "" + +msgid "" +"For example, here's a Lua application that uses ``myfun()`` function from " +"``mymodule.lua`` module:" +msgstr "" + +msgid "" +"-- loading the module\n" +"local mymodule = require('mymodule')\n" +"\n" +"-- calling myfun() from within test() function\n" +"local test = function()\n" +" mymodule.myfun()\n" +"end" +msgstr "" + +msgid "" +"A thing to remember here is that the ``require()`` directive takes load " +"paths to Lua modules from the ``package.path`` variable. This is a " +"semicolon-separated string, where a question mark is used to interpolate the" +" module name. By default, this variable contains system-wide Lua paths and " +"the working directory. But if we put our modules inside a specific folder " +"(e.g. ``scripts/``), we need to add this folder to ``package.path`` before " +"any calls to ``require()``:" +msgstr "" + +msgid "package.path = 'scripts/?.lua;' .. package.path" +msgstr "" + +msgid "" +"For our microservice, a simple and convenient solution would be to put all " +"methods in a Lua module (say ``pokemon.lua``) and to write a Lua application" +" (say ``game.lua``) that initializes the gaming environment and starts the " +"game loop." +msgstr "" + +msgid "" +"Now let's get down to implementation details. In our game, we need three " +"entities:" +msgstr "" + +msgid "" +"**map**, which is an array of pokémons with coordinates of respawn " +"locations; in this version of the game, let a location be a rectangle " +"identified with two points, upper-left and lower-right;" +msgstr "" + +msgid "" +"**player**, which has an ID, a name, and coordinates of the player's " +"location point;" +msgstr "" + +msgid "" +"**pokémon**, which has the same fields as the player, plus a status " +"(active/inactive, that is present on the map or not) and a catch probability" +" (well, let's give our pokémons a chance to escape :-) )" +msgstr "" + +msgid "" +"We'll store these entities as tuples in Tarantool spaces. But to deliver our" +" backend application as a microservice, the good practice would be to " +"send/receive our data in the universal JSON format, thus using Tarantool as " +"a document storage." +msgstr "" diff --git a/locale/ru/LC_MESSAGES/how-to/app/creating_app/nginx.po b/locale/ru/LC_MESSAGES/how-to/app/creating_app/nginx.po new file mode 100644 index 0000000000..250e2722f3 --- /dev/null +++ b/locale/ru/LC_MESSAGES/how-to/app/creating_app/nginx.po @@ -0,0 +1,104 @@ + +msgid "nginx" +msgstr "" + +msgid "" +"In the real life, this microservice would work over HTTP. Let's add `nginx " +"`_ web server to our environment and make a similar " +"demo. But how do we make Tarantool methods callable via REST API? We use " +"nginx with `Tarantool nginx upstream " +"`_ module and create one" +" more Lua script (`app.lua " +"`_) that exports " +"three of our game methods -- ``add_pokemon()``, ``map()`` and ``catch()`` --" +" as REST endpoints of the nginx upstream module:" +msgstr "" + +msgid "" +"local game = require('pokemon')\n" +"box.cfg{listen=3301}\n" +"game:start()\n" +"\n" +"-- add, map and catch functions exposed to REST API\n" +"function add(request, pokemon)\n" +" return {\n" +" result=game:add_pokemon(pokemon)\n" +" }\n" +"end\n" +"\n" +"function map(request)\n" +" return {\n" +" map=game:map()\n" +" }\n" +"end\n" +"\n" +"function catch(request, pid, player)\n" +" local id = tonumber(pid)\n" +" if id == nil then\n" +" return {result=false}\n" +" end\n" +" return {\n" +" result=game:catch(id, player)\n" +" }\n" +"end" +msgstr "" + +msgid "" +"An easy way to configure and launch nginx would be to create a Docker " +"container based on a `Docker image " +"`_ with nginx and the " +"upstream module already installed (see `http/Dockerfile " +"`_). We take " +"a standard `nginx.conf " +"`_, where we " +"define an upstream with our Tarantool backend running (this is another " +"Docker container, see details below):" +msgstr "" + +msgid "" +"upstream tnt {\n" +" server pserver:3301 max_fails=1 fail_timeout=60s;\n" +" keepalive 250000;\n" +"}" +msgstr "" + +msgid "" +"and add some Tarantool-specific parameters (see descriptions in the upstream" +" module's `README " +"`_ file):" +msgstr "" + +msgid "" +"server {\n" +" server_name tnt_test;\n" +"\n" +" listen 80 default deferred reuseport so_keepalive=on backlog=65535;\n" +"\n" +" location = / {\n" +" root /usr/local/nginx/html;\n" +" }\n" +"\n" +" location /api {\n" +" # answers check infinity timeout\n" +" tnt_read_timeout 60m;\n" +" if ( $request_method = GET ) {\n" +" tnt_method \"map\";\n" +" }\n" +" tnt_http_rest_methods get;\n" +" tnt_http_methods all;\n" +" tnt_multireturn_skip_count 2;\n" +" tnt_pure_result on;\n" +" tnt_pass_http_request on parse_args;\n" +" tnt_pass tnt;\n" +" }\n" +"}" +msgstr "" + +msgid "" +"Likewise, we put Tarantool server and all our game logic in a second Docker " +"container based on the `official Tarantool 1.9 image " +"`_ (see `src/Dockerfile " +"`_) and set " +"the container's default command to ``tarantool app.lua``. This is the " +"backend." +msgstr "" diff --git a/locale/ru/LC_MESSAGES/how-to/app/creating_app/non-blockng_io.po b/locale/ru/LC_MESSAGES/how-to/app/creating_app/non-blockng_io.po new file mode 100644 index 0000000000..f77a118f50 --- /dev/null +++ b/locale/ru/LC_MESSAGES/how-to/app/creating_app/non-blockng_io.po @@ -0,0 +1,160 @@ + +msgid "Non-blocking IO" +msgstr "" + +msgid "" +"To test the REST API, we create a new script (`client.lua " +"`_), which " +"is similar to our ``game.lua`` application, but makes HTTP POST and GET " +"requests rather than calling Lua functions:" +msgstr "" + +#, python-format +msgid "" +"local http = require('curl').http()\n" +"local json = require('json')\n" +"local URI = os.getenv('SERVER_URI')\n" +"local fiber = require('fiber')\n" +"\n" +"local player1 = {\n" +" name=\"Player1\",\n" +" id=1,\n" +" location = {\n" +" x=1.0001,\n" +" y=2.0003\n" +" }\n" +"}\n" +"local player2 = {\n" +" name=\"Player2\",\n" +" id=2,\n" +" location = {\n" +" x=30.123,\n" +" y=40.456\n" +" }\n" +"}\n" +"\n" +"local pokemon = {\n" +" name=\"Pikachu\",\n" +" chance=99.1,\n" +" id=1,\n" +" status=\"active\",\n" +" location = {\n" +" x=1,\n" +" y=2\n" +" }\n" +"}\n" +"\n" +"function request(method, body, id)\n" +" local resp = http:request(\n" +" method, URI, body\n" +" )\n" +" if id ~= nil then\n" +" print(string.format('Player %d result: %s',\n" +" id, resp.body))\n" +" else\n" +" print(resp.body)\n" +" end\n" +"end\n" +"\n" +"local players = {}\n" +"function catch(player)\n" +" fiber.sleep(math.random(5))\n" +" print('Catch pokemon by player ' .. tostring(player.id))\n" +" request(\n" +" 'POST', '{\"method\": \"catch\",\n" +" \"params\": [1, '..json.encode(player)..']}',\n" +" tostring(player.id)\n" +" )\n" +" table.insert(players, player.id)\n" +"end\n" +"\n" +"print('Create pokemon')\n" +"request('POST', '{\"method\": \"add\",\n" +" \"params\": ['..json.encode(pokemon)..']}')\n" +"request('GET', '')\n" +"\n" +"fiber.create(catch, player1)\n" +"fiber.create(catch, player2)\n" +"\n" +"-- wait for players\n" +"while #players ~= 2 do\n" +" fiber.sleep(0.001)\n" +"end\n" +"\n" +"request('GET', '')\n" +"os.exit()" +msgstr "" + +msgid "" +"When you run this script, you’ll notice that both players have equal chances" +" to make the first attempt at catching the pokémon. In a classical Lua " +"script, a networked call blocks the script until it’s finished, so the first" +" catch attempt can only be done by the player who entered the game first. In" +" Tarantool, both players play concurrently, since all modules are integrated" +" with Tarantool :ref:`cooperative multitasking ` and use non-blocking I/O." +msgstr "" + +msgid "" +"Indeed, when Player1 makes its first REST call, the script doesn’t block. " +"The fiber running ``catch()`` function on behalf of Player1 issues a non-" +"blocking call to the operating system and yields control to the next fiber, " +"which happens to be the fiber of Player2. Player2’s fiber does the same. " +"When the network response is received, Player1's fiber is activated by " +"Tarantool cooperative scheduler, and resumes its work. All Tarantool " +":ref:`modules ` use non-blocking I/O and are integrated " +"with Tarantool cooperative scheduler. For module developers, Tarantool " +"provides an :ref:`API `." +msgstr "" + +msgid "" +"For our HTTP test, we create a third container based on the `official " +"Tarantool 1.9 image `_ (see " +"`client/Dockerfile " +"`_) and set" +" the container's default command to ``tarantool client.lua``." +msgstr "" + +msgid "" +"To run this test locally, download our `pokemon " +"`_ project from GitHub and say:" +msgstr "" + +msgid "" +"$ docker-compose build\n" +"$ docker-compose up" +msgstr "" + +msgid "" +"Docker Compose builds and runs all the three containers: ``pserver`` " +"(Tarantool backend), ``phttp`` (nginx) and ``pclient`` (demo client). You " +"can see log messages from all these containers in the console, pclient " +"saying that it made an HTTP request to create a pokémon, made two catch " +"requests, requested the map (empty since the pokémon is caught and " +"temporarily inactive) and exited:" +msgstr "" + +msgid "" +"pclient_1 | Create pokemon\n" +"<...>\n" +"pclient_1 | {\"result\":true}\n" +"pclient_1 | {\"map\":[{\"id\":1,\"status\":\"active\",\"location\":{\"y\":2,\"x\":1},\"name\":\"Pikachu\",\"chance\":99.100000}]}\n" +"pclient_1 | Catch pokemon by player 2\n" +"pclient_1 | Catch pokemon by player 1\n" +"pclient_1 | Player 1 result: {\"result\":true}\n" +"pclient_1 | Player 2 result: {\"result\":false}\n" +"pclient_1 | {\"map\":[]}\n" +"pokemon_pclient_1 exited with code 0" +msgstr "" + +msgid "" +"Congratulations! Here's the end point of our walk-through. As further " +"reading, see more about :ref:`installing ` and" +" :ref:`contributing ` a module." +msgstr "" + +msgid "" +"See also reference on :ref:`Tarantool modules ` and " +":ref:`C API `, and don't miss our :ref:`Lua cookbook " +"recipes `." +msgstr "" diff --git a/locale/ru/LC_MESSAGES/how-to/app/index.po b/locale/ru/LC_MESSAGES/how-to/app/index.po new file mode 100644 index 0000000000..04e6d9f7c8 --- /dev/null +++ b/locale/ru/LC_MESSAGES/how-to/app/index.po @@ -0,0 +1,11 @@ + +msgid "Developing applications with Tarantool" +msgstr "" + +msgid "" +"Using Tarantool as an application server, you can write your own " +"applications. Tarantool’s native language for writing applications is `Lua " +"`_, so a typical application would be a file " +"that contains your Lua script. But you can also write applications in C or " +"C++." +msgstr "" diff --git a/locale/ru/LC_MESSAGES/how-to/app/launching_app.po b/locale/ru/LC_MESSAGES/how-to/app/launching_app.po new file mode 100644 index 0000000000..64372d64a5 --- /dev/null +++ b/locale/ru/LC_MESSAGES/how-to/app/launching_app.po @@ -0,0 +1,245 @@ + +msgid "Launching an application" +msgstr "" + +msgid "" +"Using Tarantool as an application server, you can write your own " +"applications. Tarantool’s native language for writing applications is `Lua " +"`_, so a typical application would be a file " +"that contains your Lua script. But you can also write applications in C or " +"C++." +msgstr "" + +msgid "" +"If you're new to Lua, we recommend going over the interactive Tarantool " +"tutorial before proceeding with this chapter. To launch the tutorial, say " +"``tutorial()`` in Tarantool console:" +msgstr "" + +msgid "" +"tarantool> tutorial()\n" +"---\n" +"- |\n" +" Tutorial -- Screen #1 -- Hello, Moon\n" +" ====================================\n" +"\n" +" Welcome to the Tarantool tutorial.\n" +" It will introduce you to Tarantool’s Lua application server\n" +" and database server, which is what’s running what you’re seeing.\n" +" This is INTERACTIVE -- you’re expected to enter requests\n" +" based on the suggestions or examples in the screen’s text.\n" +" <...>" +msgstr "" + +msgid "" +"Let's create and launch our first Lua application for Tarantool. Here's a " +"simplest Lua application, the good old \"Hello, world!\":" +msgstr "" + +msgid "" +"#!/usr/bin/env tarantool\n" +"print('Hello, world!')" +msgstr "" + +msgid "" +"We save it in a file. Let it be ``myapp.lua`` in the current directory." +msgstr "" + +msgid "Now let's discuss how we can launch our application with Tarantool." +msgstr "" + +msgid "Launching in Docker" +msgstr "" + +msgid "" +"If we run Tarantool in a :ref:`Docker container `, the following command will start Tarantool without any " +"application:" +msgstr "" + +msgid "" +"$ # create a temporary container and run it in interactive mode\n" +"$ docker run --rm -t -i tarantool/tarantool:latest" +msgstr "" + +msgid "To run Tarantool with our application, we can say:" +msgstr "" + +msgid "" +"$ # create a temporary container and\n" +"$ # launch Tarantool with our application\n" +"$ docker run --rm -t -i \\\n" +" -v `pwd`/myapp.lua:/opt/tarantool/myapp.lua \\\n" +" -v /data/dir/on/host:/var/lib/tarantool \\\n" +" tarantool/tarantool:latest tarantool /opt/tarantool/myapp.lua" +msgstr "" + +msgid "Here two resources on the host get mounted in the container:" +msgstr "" + +msgid "our application file (myapp.lua) and" +msgstr "" + +msgid "Tarantool data directory (``/data/dir/on/host``)." +msgstr "" + +msgid "" +"By convention, the directory for Tarantool application code inside a " +"container is ``/opt/tarantool``, and the directory for data is " +"``/var/lib/tarantool``." +msgstr "" + +msgid "Launching a binary program" +msgstr "" + +msgid "" +"If we run Tarantool from a :ref:`package ` or from a :ref:`source build " +"`, we can launch our application:" +msgstr "" + +msgid "in the script mode," +msgstr "" + +msgid "as a server application, or" +msgstr "" + +msgid "as a daemon service." +msgstr "" + +msgid "The simplest way is to pass the filename to Tarantool at start:" +msgstr "" + +msgid "" +"$ tarantool myapp.lua\n" +"Hello, world!\n" +"$" +msgstr "" + +msgid "" +"Tarantool starts, executes our script in the **script mode** and exits." +msgstr "" + +msgid "" +"Now let’s turn this script into a **server application**. We use " +":doc:`box.cfg ` from Tarantool’s built-in " +"Lua module to:" +msgstr "" + +msgid "" +"launch the database (a database has a persistent on-disk state, which needs " +"to be restored after we start an application) and" +msgstr "" + +msgid "configure Tarantool as a server that accepts requests over a TCP port." +msgstr "" + +msgid "" +"We also add some simple database logic, using :doc:`space.create() " +"` and :ref:`create_index()" +" ` to create a space with a primary index. We use " +"the function :doc:`box.once() ` to make " +"sure that our logic will be executed only once when the database is " +"initialized for the first time, so we don't try to create an existing space " +"or index on each invocation of the script:" +msgstr "" + +msgid "" +"#!/usr/bin/env tarantool\n" +"-- Configure database\n" +"box.cfg {\n" +" listen = 3301\n" +"}\n" +"box.once(\"bootstrap\", function()\n" +" box.schema.space.create('tweedledum')\n" +" box.space.tweedledum:create_index('primary',\n" +" { type = 'TREE', parts = {1, 'unsigned'}})\n" +"end)" +msgstr "" + +msgid "Now we launch our application in the same manner as before:" +msgstr "" + +msgid "" +"$ tarantool myapp.lua\n" +"Hello, world!\n" +"2017-08-11 16:07:14.250 [41436] main/101/myapp.lua C> version 2.1.0-429-g4e5231702\n" +"2017-08-11 16:07:14.250 [41436] main/101/myapp.lua C> log level 5\n" +"2017-08-11 16:07:14.251 [41436] main/101/myapp.lua I> mapping 1073741824 bytes for tuple arena...\n" +"2017-08-11 16:07:14.255 [41436] main/101/myapp.lua I> recovery start\n" +"2017-08-11 16:07:14.255 [41436] main/101/myapp.lua I> recovering from `./00000000000000000000.snap'\n" +"2017-08-11 16:07:14.271 [41436] main/101/myapp.lua I> recover from `./00000000000000000000.xlog'\n" +"2017-08-11 16:07:14.271 [41436] main/101/myapp.lua I> done `./00000000000000000000.xlog'\n" +"2017-08-11 16:07:14.272 [41436] main/102/hot_standby I> recover from `./00000000000000000000.xlog'\n" +"2017-08-11 16:07:14.274 [41436] iproto/102/iproto I> binary: started\n" +"2017-08-11 16:07:14.275 [41436] iproto/102/iproto I> binary: bound to [::]:3301\n" +"2017-08-11 16:07:14.275 [41436] main/101/myapp.lua I> done `./00000000000000000000.xlog'\n" +"2017-08-11 16:07:14.278 [41436] main/101/myapp.lua I> ready to accept requests" +msgstr "" + +msgid "" +"This time, Tarantool executes our script and keeps working as a server, " +"accepting TCP requests on port 3301. We can see Tarantool in the current " +"session’s process list:" +msgstr "" + +msgid "" +"$ ps | grep \"tarantool\"\n" +" PID TTY TIME CMD\n" +"41608 ttys001 0:00.47 tarantool myapp.lua " +msgstr "" + +msgid "" +"But the Tarantool instance will stop if we close the current terminal " +"window. To detach Tarantool and our application from the terminal window, we" +" can launch it in the **daemon mode**. To do so, we add some parameters to " +"``box.cfg{}``:" +msgstr "" + +msgid "" +":ref:`background ` = ``true`` that actually tells " +"Tarantool to work as a daemon service," +msgstr "" + +msgid "" +":ref:`log ` = ``'dir-name'`` that tells the Tarantool " +"daemon where to store its log file (other log settings are available in " +"Tarantool :ref:`log ` module), and" +msgstr "" + +msgid "" +":ref:`pid_file ` = ``'file-name'`` that tells the " +"Tarantool daemon where to store its pid file." +msgstr "" + +msgid "For example:" +msgstr "" + +msgid "" +"box.cfg {\n" +" listen = 3301,\n" +" background = true,\n" +" log = '1.log',\n" +" pid_file = '1.pid'\n" +"}" +msgstr "" + +msgid "We launch our application in the same manner as before:" +msgstr "" + +msgid "" +"Tarantool executes our script, gets detached from the current shell session " +"(you won't see it with ``ps | grep \"tarantool\"``) and continues working in" +" the background as a daemon attached to the global session (with SID = 0):" +msgstr "" + +msgid "" +"$ ps -ef | grep \"tarantool\"\n" +" PID SID TIME CMD\n" +"42178 0 0:00.72 tarantool myapp.lua " +msgstr "" + +msgid "" +"Now that we have discussed how to create and launch a Lua application for " +"Tarantool, let's dive deeper into programming practices." +msgstr "" diff --git a/locale/ru/LC_MESSAGES/how-to/app/lua_tutorials.po b/locale/ru/LC_MESSAGES/how-to/app/lua_tutorials.po index 8ee2e31a94..c32b7a00ec 100644 --- a/locale/ru/LC_MESSAGES/how-to/app/lua_tutorials.po +++ b/locale/ru/LC_MESSAGES/how-to/app/lua_tutorials.po @@ -7,12 +7,12 @@ msgstr "Первые шаги" msgid "" "If you're new to Lua, we recommend going over the interactive Tarantool " -"tutorial. " -"To launch the tutorial, run the ``tutorial()`` command in the Tarantool console:" +"tutorial. To launch the tutorial, run the ``tutorial()`` command in the " +"Tarantool console:" msgstr "" "Если вы только осваиваете Lua, рекомендуем выполнить практическое задание, " -"встроенное в Tarantool. Чтобы начать работу с этим заданием, " -"выполните команду ``tutorial()`` в консоли Tarantool:" +"встроенное в Tarantool. Чтобы начать работу с этим заданием, выполните " +"команду ``tutorial()`` в консоли Tarantool:" msgid "" "tarantool> tutorial()\n" @@ -41,30 +41,6 @@ msgstr "" " based on the suggestions or examples in the screen’s text.\n" " <...>" -msgid "" -"Here are three tutorials on using Lua stored procedures with Tarantool:" -msgstr "" -"Практические задания по использованию хранимых процедур на языке Lua в " -"работе с Tarantool:" - -msgid "" -":ref:`Insert one million tuples with a Lua stored procedure `," -msgstr "" -":ref:`Вставка 1 млн кортежей с помощью хранимой процедуры на языке Lua " -"`," - -msgid "" -":ref:`Sum a JSON field for all tuples `," -msgstr "" -":ref:`Подсчет суммы по JSON-полям во всех кортежах `," - -msgid ":ref:`Indexed pattern search `." -msgstr "" -":ref:`Индексированный поиск по шаблонам `." - msgid "Insert one million tuples with a Lua stored procedure" msgstr "Вставка 1 млн кортежей с помощью хранимой процедуры на языке Lua" @@ -91,10 +67,10 @@ msgid "" "with the tarantool client while reading along." msgstr "" "Цель данного упражнения состоит в том, чтобы показать, как выглядят Lua-" -"функции в Tarantool. Необходимо будет работать с математической " -"библиотекой Lua, библиотекой для работы со строками интерпретатора Lua, " -"Tarantool-библиотекой ``box``, Tarantool-библиотекой ``box.tuple``, циклами " -"и конкатенацией. Инструкции легко будет выполнять даже тем, кто никогда не " +"функции в Tarantool. Необходимо будет работать с математической библиотекой " +"Lua, библиотекой для работы со строками интерпретатора Lua, Tarantool-" +"библиотекой ``box``, Tarantool-библиотекой ``box.tuple``, циклами и " +"конкатенацией. Инструкции легко будет выполнять даже тем, кто никогда не " "использовал раньше Lua или Tarantool. Единственное требование -- знание " "того, как работают другие языки программирования, и изучение первых двух " "глав данного руководства. Но для лучшего понимания можно следовать по " @@ -131,8 +107,8 @@ msgstr "" "символами-разделителями. Сейчас в них нет необходимости, поэтому в данном " "практическом задании они использоваться не будут. Однако они все еще " "поддерживаются. Если вы хотите использовать разделители или используете " -"более раннюю версию Tarantool, перед работой проверьте описание синтаксиса" -" для :ref:`объявления разделителя `." +"более раннюю версию Tarantool, перед работой проверьте описание синтаксиса " +"для :ref:`объявления разделителя `." msgid "Create a function that returns a string" msgstr "Создание функции, которая возвращает строку" @@ -643,11 +619,10 @@ msgid "" "section :ref:`Submodule box.space `, :ref:`space_object:insert() " "`, and :ref:`space_object:replace() `." msgstr "" -"Для получения подробной информации о вызовах insert и replace в Tarantool," -" см. разделы :ref:`Вложенный модуль box.space `, " +"Для получения подробной информации о вызовах insert и replace в Tarantool, " +"см. разделы :ref:`Вложенный модуль box.space `, " ":ref:`space_object:insert() ` и " -":ref:`space_object:replace() ` руководства по " -"Tarantool." +":ref:`space_object:replace() ` руководства по Tarantool." msgid "" "tarantool> function main_function()\n" @@ -1152,12 +1127,13 @@ msgstr "" "- 22\n" "..." +#, fuzzy msgid "" "It works. We'll just leave, as exercises for future improvement, the " "possibility that the \"hard coding\" assumptions could be removed, that " "there might have to be an overflow check if some field values are huge, and " -"that the function should contain a :ref:`yield ` instruction if the count of tuples is huge." +"that the function should contain a :ref:`yield ` instruction if " +"the count of tuples is huge." msgstr "" "Сработало. Для дополнительной отработки материала можно убрать заранее " "заданные значения, добавить проверку потенциально возможного арифметического" @@ -1176,7 +1152,7 @@ msgid "" "\"magic characters\" in regular expressions. |br| * The initial characters " "in the pattern, as far as the first magic character, will be used as an " "index search key. For each tuple that is found via the index, there will be " -"a match of the whole pattern. |br| * To be :ref:`cooperative `, the function should yield after every 10 tuples," " unless there is a reason to delay yielding. |br| With this function, we can" " take advantage of Tarantool's indexes for speed, and take advantage of " @@ -1420,14 +1396,14 @@ msgstr "" "это число выбрано произвольно, и даже ноль здесь подойдет, но по короткому " "ключу поиск займет длительное время." +#, fuzzy msgid "" "NOTE #3 -- \"OUTER LOOP: INITIATE\" |br| The function's job is to return a " "result set, just as `box.space...select ` would. We will " "fill it within an outer loop that contains an inner loop. The outer loop's " -"job is to execute the inner loop, and possibly :ref:`yield `, until the search ends. The inner loop's job is to " -"find tuples via the index, and put them in the result set if they match the " -"pattern." +"job is to execute the inner loop, and possibly :ref:`yield `, " +"until the search ends. The inner loop's job is to find tuples via the index," +" and put them in the result set if they match the pattern." msgstr "" "ПРИМЕЧАНИЕ №3 \"ВНЕШНИЙ ЦИКЛ: НАЧАЛО\" |br| Назначение функции -- вернуть " "результирующий набор данных, как вернул бы запрос `box.space...select " @@ -1586,3 +1562,43 @@ msgstr "" "---\n" "- - [7, 'ABCDEF', 'a']\n" "..." + +#~ msgid "" +#~ "Here are three tutorials on using Lua stored procedures with Tarantool:" +#~ msgstr "" +#~ "Практические задания по использованию хранимых процедур на языке Lua в " +#~ "работе с Tarantool:" + +#~ msgid "" +#~ ":ref:`Insert one million tuples with a Lua stored procedure `," +#~ msgstr "" +#~ ":ref:`Вставка 1 млн кортежей с помощью хранимой процедуры на языке Lua " +#~ "`," + +#~ msgid "" +#~ ":ref:`Sum a JSON field for all tuples `," +#~ msgstr "" +#~ ":ref:`Подсчет суммы по JSON-полям во всех кортежах `," + +#~ msgid ":ref:`Indexed pattern search `." +#~ msgstr "" +#~ ":ref:`Индексированный поиск по шаблонам `." + +#~ msgid "" +#~ "Here is a generic function which takes a field identifier and a search " +#~ "pattern, and returns all tuples that match. |br| * The field must be the " +#~ "first field of a TREE index. |br| * The function will use `Lua pattern " +#~ "matching `_, which allows " +#~ "\"magic characters\" in regular expressions. |br| * The initial characters " +#~ "in the pattern, as far as the first magic character, will be used as an " +#~ "index search key. For each tuple that is found via the index, there will be " +#~ "a match of the whole pattern. |br| * To be :ref:`cooperative `, the function should yield after every 10 tuples," +#~ " unless there is a reason to delay yielding. |br| With this function, we can" +#~ " take advantage of Tarantool's indexes for speed, and take advantage of " +#~ "Lua's pattern matching for flexibility. It does everything that an SQL " +#~ ":ref:`LIKE ` search can do, and far more." +#~ msgstr "" diff --git a/locale/ru/LC_MESSAGES/how-to/db/crud.po b/locale/ru/LC_MESSAGES/how-to/db/crud.po index b06a001f96..c1dd0c4290 100644 --- a/locale/ru/LC_MESSAGES/how-to/db/crud.po +++ b/locale/ru/LC_MESSAGES/how-to/db/crud.po @@ -2,777 +2,313 @@ msgid "CRUD operation examples" msgstr "Примеры CRUD-операций" -msgid "Example: using box.space functions to read _space tuples" -msgstr "Пример: использование функций box.space для чтения кортежей из _space" - -msgid "" -"This function will illustrate how to look at all the spaces, and for each " -"display: approximately how many tuples it contains, and the first field of " -"its first tuple. The function uses Tarantool ``box.space`` functions " -"``len()`` and ``pairs()``. The iteration through the spaces is coded as a " -"scan of the ``_space`` system space, which contains metadata. The third " -"field in ``_space`` contains the space name, so the key instruction " -"``space_name = v[3]`` means ``space_name`` is the ``space_name`` field in " -"the tuple of ``_space`` that we've just fetched with ``pairs()``. The " -"function returns a table:" -msgstr "" -"Функция ниже проиллюстрирует, как обращаться ко всем спейсам, и для каждого " -"отобразит примерное количество кортежей и первое поле первого кортежа. В " -"данной функции используются функции из ``box.space`` в Tarantool: " -"``len()`` и ``pairs()``. Итерация по спейсам закодирована в форме " -"сканирования системного спейса ``_space``, который содержит метаданные. " -"Третье поле в ``_space`` содержит имя спейса, поэтому ключевая команда " -"``space_name = v[3]`` означает, что ``space_name`` -- это поле " -"``space_name`` в кортеже ``_space``, который мы только что получили с " -"помощью ``pairs()``. Функция возвращает таблицу:" - -msgid "" -"function example()\n" -" local tuple_count, space_name, line\n" -" local ta = {}\n" -" for k, v in box.space._space:pairs() do\n" -" space_name = v[3]\n" -" if box.space[space_name].index[0] ~= nil then\n" -" tuple_count = '1 or more'\n" -" else\n" -" tuple_count = '0'\n" -" end\n" -" line = space_name .. ' tuple_count =' .. tuple_count\n" -" if tuple_count == '1 or more' then\n" -" for k1, v1 in box.space[space_name]:pairs() do\n" -" line = line .. '. first field in first tuple = ' .. v1[1]\n" -" break\n" -" end\n" -" end\n" -" table.insert(ta, line)\n" -" end\n" -" return ta\n" -"end" -msgstr "" -"function example()\n" -" local tuple_count, space_name, line\n" -" local ta = {}\n" -" for k, v in box.space._space:pairs() do\n" -" space_name = v[3]\n" -" if box.space[space_name].index[0] ~= nil then\n" -" tuple_count = '1 or more'\n" -" else\n" -" tuple_count = '0'\n" -" end\n" -" line = space_name .. ' tuple_count =' .. tuple_count\n" -" if tuple_count == '1 or more' then\n" -" for k1, v1 in box.space[space_name]:pairs() do\n" -" line = line .. '. first field in first tuple = ' .. v1[1]\n" -" break\n" -" end\n" -" end\n" -" table.insert(ta, line)\n" -" end\n" -" return ta\n" -"end" - -msgid "And here is what happens when one invokes the function:" -msgstr "А вот что происходит, когда вызывается функция:" - -msgid "" -"tarantool> example()\n" -"---\n" -"- - _schema tuple_count =1 or more. first field in first tuple = cluster\n" -" - _space tuple_count =1 or more. first field in first tuple = 272\n" -" - _vspace tuple_count =1 or more. first field in first tuple = 272\n" -" - _index tuple_count =1 or more. first field in first tuple = 272\n" -" - _vindex tuple_count =1 or more. first field in first tuple = 272\n" -" - _func tuple_count =1 or more. first field in first tuple = 1\n" -" - _vfunc tuple_count =1 or more. first field in first tuple = 1\n" -" - _user tuple_count =1 or more. first field in first tuple = 0\n" -" - _vuser tuple_count =1 or more. first field in first tuple = 0\n" -" - _priv tuple_count =1 or more. first field in first tuple = 1\n" -" - _vpriv tuple_count =1 or more. first field in first tuple = 1\n" -" - _cluster tuple_count =1 or more. first field in first tuple = 1\n" -"..." -msgstr "" -"tarantool> example()\n" -"---\n" -"- - _schema tuple_count =1 or more. first field in first tuple = cluster\n" -" - _space tuple_count =1 or more. first field in first tuple = 272\n" -" - _vspace tuple_count =1 or more. first field in first tuple = 272\n" -" - _index tuple_count =1 or more. first field in first tuple = 272\n" -" - _vindex tuple_count =1 or more. first field in first tuple = 272\n" -" - _func tuple_count =1 or more. first field in first tuple = 1\n" -" - _vfunc tuple_count =1 or more. first field in first tuple = 1\n" -" - _user tuple_count =1 or more. first field in first tuple = 0\n" -" - _vuser tuple_count =1 or more. first field in first tuple = 0\n" -" - _priv tuple_count =1 or more. first field in first tuple = 1\n" -" - _vpriv tuple_count =1 or more. first field in first tuple = 1\n" -" - _cluster tuple_count =1 or more. first field in first tuple = 1\n" -"..." - -msgid "Example: using box.space functions to organize a _space tuple" -msgstr "" -"Пример: использование функций box.space для организации кортежа из _space" - -msgid "" -"The objective is to display field names and field types of a system space --" -" using metadata to find metadata." -msgstr "" -"Основная цель -- отобразить имена и типы полей системного спейса, то есть " -"использование метаданных для поиска метаданных." +#, fuzzy +msgid "Using data operations" +msgstr "Пример: использование операций с данными" +#, fuzzy msgid "" -"To begin: how can one select the ``_space`` tuple that describes ``_space``?" +"This section shows basic usage scenarios and typical errors for each " +":ref:`data operation ` in Tarantool: :ref:`INSERT" +" `, :ref:`DELETE `, :ref:`UPDATE `, :ref:`UPSERT " +"`, :ref:`REPLACE `, and :ref:`SELECT `. Before trying " +"out the examples, you need to bootstrap a Tarantool instance as shown below." msgstr "" -"Для начала: как можно сделать выборку кортежа из ``_space``, который " -"описывает ``_space``?" +"Пример ниже иллюстрирует все возможные сценарии -- а также типичные ошибки " +"-- для всех :ref:`операций с данными ` в " +"Tarantool: :ref:`INSERT `, :ref:`DELETE " +"`, :ref:`UPDATE `," +" :ref:`UPSERT `, :ref:`REPLACE ` и :ref:`SELECT `." msgid "" -"A simple way is to look at the constants in ``box.schema``, which tell us " -"that there is an item named SPACE_ID == 288, so these statements will " -"retrieve the correct tuple:" +"-- Create a space --\n" +"bands = box.schema.space.create('bands')\n" +"\n" +"-- Specify field names and types --\n" +"box.space.bands:format({\n" +" { name = 'id', type = 'unsigned' },\n" +" { name = 'band_name', type = 'string' },\n" +" { name = 'year', type = 'unsigned' }\n" +"})\n" +"\n" +"-- Create a primary index --\n" +"box.space.bands:create_index('primary', { parts = { 'id' } })\n" +"\n" +"-- Create a unique secondary index --\n" +"box.space.bands:create_index('band', { parts = { 'band_name' } })\n" +"\n" +"-- Create a non-unique secondary index --\n" +"box.space.bands:create_index('year', { parts = { { 'year' } }, unique = false })\n" +"\n" +"-- Create a multi-part index --\n" +"box.space.bands:create_index('year_band', { parts = { { 'year' }, { 'band_name' } } })\n" msgstr "" -"Проще всего проверить постоянные в ``box.schema``, что укажет на наличие " -"элемента под названием SPACE_ID == 288. Таким образом, следующие запросы " -"вернут нужный кортеж:" -msgid "" -"box.space._space:select{ 288 }\n" -"-- or --\n" -"box.space._space:select{ box.schema.SPACE_ID }" -msgstr "" -"box.space._space:select{ 288 }\n" -"-- или --\n" -"box.space._space:select{ box.schema.SPACE_ID }" +msgid "INSERT" +msgstr "INSERT" msgid "" -"Another way is to look at the tuples in ``box.space._index``, which tell us " -"that there is a secondary index named 'name' for space number 288, so this " -"statement also will retrieve the correct tuple:" +"The :ref:`space_object.insert ` method accepts a well-" +"formatted tuple." msgstr "" -"Также можно обратиться к спейсам в ``box.space._index``, что укажет на " -"наличие вторичного индекса с именем 'name' для спейса под номером 288. Таким" -" образом, следующий запрос также вернет нужный кортеж:" - -msgid "box.space._space.index.name:select{ '_space' }" -msgstr "box.space._space.index.name:select{ '_space' }" - -msgid "However, the retrieved tuple is not easy to read:" -msgstr "Однако непросто прочитать информацию из полученного кортежа:" msgid "" -"tarantool> box.space._space.index.name:select{'_space'}\n" +"-- Insert a tuple with a unique primary key --\n" +"tarantool> bands:insert{1, 'Scorpions', 1965}\n" "---\n" -"- - [280, 1, '_space', 'memtx', 0, {}, [{'name': 'id', 'type': 'num'}, {'name': 'owner',\n" -" 'type': 'num'}, {'name': 'name', 'type': 'str'}, {'name': 'engine', 'type': 'str'},\n" -" {'name': 'field_count', 'type': 'num'}, {'name': 'flags', 'type': 'str'}, {\n" -" 'name': 'format', 'type': '*'}]]\n" +"- [1, 'Scorpions', 1965]\n" "..." msgstr "" -"tarantool> box.space._space.index.name:select{'_space'}\n" -"---\n" -"- - [280, 1, '_space', 'memtx', 0, {}, [{'name': 'id', 'type': 'num'}, {'name': 'owner',\n" -" 'type': 'num'}, {'name': 'name', 'type': 'str'}, {'name': 'engine', 'type': 'str'},\n" -" {'name': 'field_count', 'type': 'num'}, {'name': 'flags', 'type': 'str'}, {\n" -" 'name': 'format', 'type': '*'}]]\n" -"..." -msgid "" -"It looks disorganized because field number 7 has been formatted with " -"recommended names and data types. How can one get those specific sub-fields?" -" Since it's visible that field number 7 is an array of maps, this `for` loop" -" will do the organizing:" +#, fuzzy +msgid "``insert`` also checks all the keys for duplicates." msgstr "" -"Информация подается бессистемно, поскольку по формату поле №7 содержит " -"рекомендованные имена и типы данных. Как же получить эти данные? Поскольку " -"очевидно, что поле №7 представляет собой ассоциативный массив, цикл `for` " -"проведет организацию данных:" +"Операция ``insert`` (вставка) работает с кортежами с четким форматом и " +"проверяет все ключи на наличие совпадений." msgid "" -"tarantool> do\n" -" > local tuple_of_space = box.space._space.index.name:get{'_space'}\n" -" > for _, field in ipairs(tuple_of_space[7]) do\n" -" > print(field.name .. ', ' .. field.type)\n" -" > end\n" -" > end\n" -"id, num\n" -"owner, num\n" -"name, str\n" -"engine, str\n" -"field_count, num\n" -"flags, str\n" -"format, *\n" +"-- Try to insert a tuple with a duplicate primary key --\n" +"tarantool> bands:insert{1, 'Scorpions', 1965}\n" "---\n" -"..." -msgstr "" -"tarantool> do\n" -" > local tuple_of_space = box.space._space.index.name:get{'_space'}\n" -" > for _, field in ipairs(tuple_of_space[7]) do\n" -" > print(field.name .. ', ' .. field.type)\n" -" > end\n" -" > end\n" -"id, num\n" -"owner, num\n" -"name, str\n" -"engine, str\n" -"field_count, num\n" -"flags, str\n" -"format, *\n" +"- error: Duplicate key exists in unique index \"primary\" in space \"bands\" with old\n" +" tuple - [1, \"Scorpions\", 1965] and new tuple - [1, \"Scorpions\", 1965]\n" +"...\n" +"\n" +"-- Try to insert a tuple with a duplicate secondary key --\n" +"tarantool> bands:insert{2, 'Scorpions', 1965}\n" +"---\n" +"- error: Duplicate key exists in unique index \"band\" in space \"bands\" with old tuple\n" +" - [1, \"Scorpions\", 1965] and new tuple - [2, \"Scorpions\", 1965]\n" +"...\n" +"\n" +"-- Insert a second tuple with unique primary and secondary keys --\n" +"tarantool> bands:insert{2, 'Pink Floyd', 1965}\n" +"---\n" +"- [2, 'Pink Floyd', 1965]\n" +"...\n" +"\n" +"-- Delete all tuples --\n" +"tarantool> bands:truncate()\n" "---\n" "..." +msgstr "" -msgid "Example: using data operations" -msgstr "Пример: использование операций с данными" +msgid "DELETE" +msgstr "DELETE" msgid "" -"This example demonstrates all legal scenarios -- as well as typical errors " -"-- for each :ref:`data operation ` in Tarantool: " -":ref:`INSERT `, :ref:`DELETE `, :ref:`UPDATE `, " -":ref:`UPSERT `, :ref:`REPLACE `, and :ref:`SELECT `." +":ref:`space_object.delete ` allows you to delete a tuple " +"identified by the primary key." msgstr "" -"Пример ниже иллюстрирует все возможные сценарии -- а также типичные ошибки " -"-- для всех :ref:`операций с данными ` в " -"Tarantool: :ref:`INSERT `, :ref:`DELETE " -"`, :ref:`UPDATE `," -" :ref:`UPSERT `, :ref:`REPLACE ` и :ref:`SELECT `." msgid "" -"-- Bootstrap the database --\n" -"box.cfg{}\n" -"format = {}\n" -"format[1] = {'field1', 'unsigned'}\n" -"format[2] = {'field2', 'unsigned'}\n" -"format[3] = {'field3', 'unsigned'}\n" -"s = box.schema.create_space('test', {format = format})\n" -"-- Create a primary index --\n" -"pk = s:create_index('pk', {parts = {{'field1'}}})\n" -"-- Create a unique secondary index --\n" -"sk_uniq = s:create_index('sk_uniq', {parts = {{'field2'}}})\n" -"-- Create a non-unique secondary index --\n" -"sk_non_uniq = s:create_index('sk_non_uniq', {parts = {{'field3'}}, unique = false})" +"-- Insert test data --\n" +"tarantool> bands:insert{1, 'Roxette', 1986}\n" +" bands:insert{2, 'Scorpions', 1965}\n" +" bands:insert{3, 'Ace of Base', 1987}\n" +" bands:insert{4, 'The Beatles', 1960}\n" +"\n" +"-- Delete a tuple with an existing key --\n" +"tarantool> bands:delete{4}\n" +"---\n" +"- [4, 'The Beatles', 1960]\n" +"...\n" +"tarantool> bands:select()\n" +"---\n" +"- - [1, 'Roxette', 1986]\n" +" - [2, 'Scorpions', 1965]\n" +" - [3, 'Ace of Base', 1987]\n" +"..." msgstr "" -"-- Настройка базы данных --\n" -"box.cfg{}\n" -"format = {}\n" -"format[1] = {'field1', 'unsigned'}\n" -"format[2] = {'field2', 'unsigned'}\n" -"format[3] = {'field3', 'unsigned'}\n" -"s = box.schema.create_space('test', {format = format})\n" -"-- Создание первичного индекса --\n" -"pk = s:create_index('pk', {parts = {{'field1'}}})\n" -"-- Создание уникального вторичного индекса --\n" -"sk_uniq = s:create_index('sk_uniq', {parts = {{'field2'}}})\n" -"-- Создание неуникального вторичного индекса --\n" -"sk_non_uniq = s:create_index('sk_non_uniq', {parts = {{'field3'}}, unique = false})" - -msgid "INSERT" -msgstr "INSERT" msgid "" -"``insert`` accepts a well-formatted tuple and checks all keys for " -"duplicates." +"You can also use :ref:`index_object.delete ` to delete a " +"tuple by the specified unique index." msgstr "" -"Операция ``insert`` (вставка) работает с кортежами с четким форматом и " -"проверяет все ключи на наличие совпадений." msgid "" -"tarantool> -- Unique indexes: ok --\n" -"tarantool> s:insert({1, 1, 1})\n" +"-- Delete a tuple by the primary index --\n" +"tarantool> bands.index.primary:delete{3}\n" "---\n" -"- [1, 1, 1]\n" +"- [3, 'Ace of Base', 1987]\n" "...\n" -"tarantool> -- Conflicting primary key: error --\n" -"tarantool> s:insert({1, 1, 1})\n" +"tarantool> bands:select()\n" "---\n" -"- error: Duplicate key exists in unique index 'pk' in space 'test'\n" +"- - [1, 'Roxette', 1986]\n" +" - [2, 'Scorpions', 1965]\n" "...\n" -"tarantool> -- Conflicting unique secondary key: error --\n" -"tarantool> s:insert({2, 1, 1})\n" +"\n" +"-- Delete a tuple by a unique secondary index --\n" +"tarantool> bands.index.band:delete{'Scorpions'}\n" "---\n" -"- error: Duplicate key exists in unique index 'sk_uniq' in space 'test'\n" +"- [2, 'Scorpions', 1965]\n" "...\n" -"tarantool> -- Key {1} exists in sk_non_uniq index, but it is not unique: ok --\n" -"tarantool> s:insert({2, 2, 1})\n" +"tarantool> bands:select()\n" "---\n" -"- [2, 2, 1]\n" +"- - [1, 'Roxette', 1986]\n" "...\n" -"tarantool> s:truncate()\n" +"\n" +"-- Try to delete a tuple by a non-unique secondary index --\n" +"tarantool> bands.index.year:delete(1986)\n" "---\n" -"..." -msgstr "" -"tarantool> -- Уникальные индексы: разрешено --\n" -"tarantool> s:insert({1, 1, 1})\n" +"- error: Get() doesn't support partial keys and non-unique indexes\n" +"...\n" +"tarantool> bands:select()\n" "---\n" -"- [1, 1, 1]\n" +"- - [1, 'Roxette', 1986]\n" "...\n" -"tarantool> -- Конфликт первичного ключа: ошибка --\n" -"tarantool> s:insert({1, 1, 1})\n" +"\n" +"-- Try to delete a tuple by a partial key --\n" +"tarantool> bands.index.year_band:delete('Roxette')\n" "---\n" -"- error: Duplicate key exists in unique index 'pk' in space 'test'\n" +"- error: Invalid key part count in an exact match (expected 2, got 1)\n" "...\n" -"tarantool> -- Конфликт уникального вторичного ключа: ошибка --\n" -"tarantool> s:insert({2, 1, 1})\n" +"\n" +"-- Delete a tuple by a full key --\n" +"tarantool> bands.index.year_band:delete{1986, 'Roxette'}\n" "---\n" -"- error: Duplicate key exists in unique index 'sk_uniq' in space 'test'\n" +"- [1, 'Roxette', 1986]\n" "...\n" -"tarantool> -- Ключ {1} присутствует в индексе sk_non_uniq, но он не уникален: разрешено --\n" -"tarantool> s:insert({2, 2, 1})\n" +"tarantool> bands:select()\n" "---\n" -"- [2, 2, 1]\n" +"- []\n" "...\n" -"tarantool> s:truncate()\n" +"\n" +"-- Delete all tuples --\n" +"tarantool> bands:truncate()\n" "---\n" "..." +msgstr "" -msgid "DELETE" -msgstr "DELETE" +msgid "UPDATE" +msgstr "UPDATE" + +msgid "" +":ref:`space_object.update ` allows you to update a tuple " +"identified by the primary key. Similarly to ``delete``, the ``update`` " +"method accepts a full key and also an operation to execute." +msgstr "" -msgid "``delete`` accepts a full key of any unique index." +msgid "" +"-- Insert test data --\n" +"tarantool> bands:insert{1, 'Roxette', 1986}\n" +" bands:insert{2, 'Scorpions', 1965}\n" +" bands:insert{3, 'Ace of Base', 1987}\n" +" bands:insert{4, 'The Beatles', 1960}\n" +"\n" +"-- Update a tuple with an existing key --\n" +"tarantool> bands:update({2}, {{'=', 2, 'Pink Floyd'}})\n" +"---\n" +"- [2, 'Pink Floyd', 1965]\n" +"...\n" +"\n" +"tarantool> bands:select()\n" +"---\n" +"- - [1, 'Roxette', 1986]\n" +" - [2, 'Pink Floyd', 1965]\n" +" - [3, 'Ace of Base', 1987]\n" +" - [4, 'The Beatles', 1960]\n" +"..." msgstr "" -"``delete`` (удаление) работает с полными ключами любого уникального индекса." -msgid "``space:delete`` is an alias for \"delete by primary key\"." +msgid "" +":ref:`index_object.update ` updates a tuple identified by " +"the specified unique index." msgstr "" -"``space:delete`` -- это псевдоним для операции \"удалить по первичному " -"ключу\"." msgid "" -"tarantool> -- Insert some test data --\n" -"tarantool> s:insert{3, 4, 5}\n" +"-- Update a tuple by the primary index --\n" +"tarantool> bands.index.primary:update({2}, {{'=', 2, 'The Rolling Stones'}})\n" "---\n" -"- [3, 4, 5]\n" +"- [2, 'The Rolling Stones', 1965]\n" "...\n" -"tarantool> s:insert{6, 7, 8}\n" +"\n" +"tarantool> bands:select()\n" "---\n" -"- [6, 7, 8]\n" +"- - [1, 'Roxette', 1986]\n" +" - [2, 'The Rolling Stones', 1965]\n" +" - [3, 'Ace of Base', 1987]\n" +" - [4, 'The Beatles', 1960]\n" "...\n" -"tarantool> s:insert{9, 10, 11}\n" +"\n" +"-- Update a tuple by a unique secondary index --\n" +"tarantool> bands.index.band:update({'The Rolling Stones'}, {{'=', 2, 'The Doors'}})\n" "---\n" -"- [9, 10, 11]\n" +"- [2, 'The Doors', 1965]\n" "...\n" -"tarantool> s:insert{12, 13, 14}\n" +"\n" +"tarantool> bands:select()\n" "---\n" -"- [12, 13, 14]\n" +"- - [1, 'Roxette', 1986]\n" +" - [2, 'The Doors', 1965]\n" +" - [3, 'Ace of Base', 1987]\n" +" - [4, 'The Beatles', 1960]\n" "...\n" -"tarantool> -- Nothing done here: no {4} key in pk index --\n" -"tarantool> s:delete{4}\n" +"\n" +"-- Try to update a tuple by a non-unique secondary index --\n" +"tarantool> bands.index.year:update({1965}, {{'=', 2, 'Scorpions'}})\n" "---\n" +"- error: Get() doesn't support partial keys and non-unique indexes\n" "...\n" -"tarantool> s:select{}\n" +"tarantool> bands:select()\n" "---\n" -"- - [3, 4, 5]\n" -" - [6, 7, 8]\n" -" - [9, 10, 11]\n" -" - [12, 13, 14]\n" +"- - [1, 'Roxette', 1986]\n" +" - [2, 'The Doors', 1965]\n" +" - [3, 'Ace of Base', 1987]\n" +" - [4, 'The Beatles', 1960]\n" "...\n" -"tarantool> -- Delete by a primary key: ok --\n" -"tarantool> s:delete{3}\n" +"\n" +"-- Delete all tuples --\n" +"tarantool> bands:truncate()\n" +"---\n" +"..." +msgstr "" + +msgid "UPSERT" +msgstr "UPSERT" + +msgid "" +":ref:`space_object.upsert ` updates an existing tuple or " +"inserts a new one:" +msgstr "" + +#, fuzzy +msgid "" +"If the existing tuple is found by the primary key, Tarantool applies the " +"update operation to this tuple and ignores the new tuple." +msgstr "" +"Если найден старый кортеж по первичному ключу, то операции обновления " +"применяются к старому кортежу, а новый кортеж игнорируется." + +#, fuzzy +msgid "" +"If no existing tuple is found, Tarantool inserts the new tuple and ignores " +"the update operation." +msgstr "" +"Если старый кортеж не найден, то происходит вставка нового кортежа, а " +"операции обновления **игнорируются**." + +#, fuzzy +msgid "" +"tarantool> bands:insert{1, 'Scorpions', 1965}\n" "---\n" -"- [3, 4, 5]\n" +"- [1, 'Scorpions', 1965]\n" "...\n" -"tarantool> s:select{}\n" +"-- As the first argument, upsert accepts a tuple, not a key --\n" +"tarantool> bands:upsert({2}, {{'=', 2, 'Pink Floyd'}})\n" "---\n" -"- - [6, 7, 8]\n" -" - [9, 10, 11]\n" -" - [12, 13, 14]\n" +"- error: Tuple field 2 (band_name) required by space format is missing\n" "...\n" -"tarantool> -- Explicitly delete by a primary key: ok --\n" -"tarantool> s.index.pk:delete{6}\n" +"tarantool> bands:select()\n" "---\n" -"- [6, 7, 8]\n" +"- - [1, 'Scorpions', 1965]\n" "...\n" -"tarantool> s:select{}\n" -"---\n" -"- - [9, 10, 11]\n" -" - [12, 13, 14]\n" -"...\n" -"tarantool> -- Delete by a unique secondary key: ok --\n" -"s.index.sk_uniq:delete{10}\n" -"---\n" -"- [9, 10, 11]\n" -"...\n" -"s:select{}\n" -"---\n" -"- - [12, 13, 14]\n" -"...\n" -"tarantool> -- Delete by a non-unique secondary index: error --\n" -"tarantool> s.index.sk_non_uniq:delete{14}\n" -"---\n" -"- error: Get() doesn't support partial keys and non-unique indexes\n" -"...\n" -"tarantool> s:select{}\n" -"---\n" -"- - [12, 13, 14]\n" -"...\n" -"tarantool> s:truncate()\n" -"---\n" -"..." -msgstr "" -"tarantool> -- Вставить некоторые тестовые данные --\n" -"tarantool> s:insert{3, 4, 5}\n" -"---\n" -"- [3, 4, 5]\n" -"...\n" -"tarantool> s:insert{6, 7, 8}\n" -"---\n" -"- [6, 7, 8]\n" -"...\n" -"tarantool> s:insert{9, 10, 11}\n" -"---\n" -"- [9, 10, 11]\n" -"...\n" -"tarantool> s:insert{12, 13, 14}\n" -"---\n" -"- [12, 13, 14]\n" -"...\n" -"tarantool> -- Здесь ничего не происходит: нет ключа {4} в индексе pk --\n" -"tarantool> s:delete{4}\n" -"---\n" -"...\n" -"tarantool> s:select{}\n" -"---\n" -"- - [3, 4, 5]\n" -" - [6, 7, 8]\n" -" - [9, 10, 11]\n" -" - [12, 13, 14]\n" -"...\n" -"tarantool> -- Удалить по первичному ключу: разрешено --\n" -"tarantool> s:delete{3}\n" -"---\n" -"- [3, 4, 5]\n" -"...\n" -"tarantool> s:select{}\n" -"---\n" -"- - [6, 7, 8]\n" -" - [9, 10, 11]\n" -" - [12, 13, 14]\n" -"...\n" -"tarantool> -- Точно удалить по первичному ключу: разрешено --\n" -"tarantool> s.index.pk:delete{6}\n" -"---\n" -"- [6, 7, 8]\n" -"...\n" -"tarantool> s:select{}\n" -"---\n" -"- - [9, 10, 11]\n" -" - [12, 13, 14]\n" -"...\n" -"tarantool> -- Удалить по уникальному вторичному ключу: разрешено --\n" -"s.index.sk_uniq:delete{10}\n" -"---\n" -"- [9, 10, 11]\n" -"...\n" -"s:select{}\n" -"---\n" -"- - [12, 13, 14]\n" -"...\n" -"tarantool> -- Удалить по неуникальному вторичному индексу: ошибка --\n" -"tarantool> s.index.sk_non_uniq:delete{14}\n" -"---\n" -"- error: Get() doesn't support partial keys and non-unique indexes\n" -"...\n" -"tarantool> s:select{}\n" -"---\n" -"- - [12, 13, 14]\n" -"...\n" -"tarantool> s:truncate()\n" -"---\n" -"..." - -msgid "The key must be full: ``delete`` cannot work with partial keys." -msgstr "" -"Ключ должен быть полным: операция ``delete`` не работает с компонентами " -"ключа." - -msgid "" -"tarantool> s2 = box.schema.create_space('test2')\n" -"---\n" -"...\n" -"tarantool> pk2 = s2:create_index('pk2', {parts = {{1, 'unsigned'}, {2, 'unsigned'}}})\n" -"---\n" -"...\n" -"tarantool> s2:insert{1, 1}\n" -"---\n" -"- [1, 1]\n" -"...\n" -"tarantool> -- Delete by a partial key: error --\n" -"tarantool> s2:delete{1}\n" -"---\n" -"- error: Invalid key part count in an exact match (expected 2, got 1)\n" -"...\n" -"tarantool> -- Delete by a full key: ok --\n" -"tarantool> s2:delete{1, 1}\n" -"---\n" -"- [1, 1]\n" -"...\n" -"tarantool> s2:select{}\n" -"---\n" -"- []\n" -"...\n" -"tarantool> s2:drop()\n" -"---\n" -"..." -msgstr "" -"tarantool> s2 = box.schema.create_space('test2')\n" -"---\n" -"...\n" -"tarantool> pk2 = s2:create_index('pk2', {parts = {{1, 'unsigned'}, {2, 'unsigned'}}})\n" -"---\n" -"...\n" -"tarantool> s2:insert{1, 1}\n" -"---\n" -"- [1, 1]\n" -"...\n" -"tarantool> -- Удалить по компоненту ключа: ошибка --\n" -"tarantool> s2:delete{1}\n" -"---\n" -"- error: Invalid key part count in an exact match (expected 2, got 1)\n" -"...\n" -"tarantool> -- Удалить по ключу целиком: разрешено --\n" -"tarantool> s2:delete{1, 1}\n" -"---\n" -"- [1, 1]\n" -"...\n" -"tarantool> s2:select{}\n" -"---\n" -"- []\n" -"...\n" -"tarantool> s2:drop()\n" +"tarantool> bands:delete(1)\n" "---\n" -"..." - -msgid "UPDATE" -msgstr "UPDATE" - -msgid "" -"Similarly to ``delete``, ``update`` accepts a full key of any unique index, " -"and also the operations to execute." -msgstr "" -"Как и ``delete``, ``update`` работает с полными ключами любого уникального " -"индекса, а также выполняет операции." - -msgid "``space:update`` is an alias for \"update by primary key\"." -msgstr "" -"``space:update`` -- это псевдоним для операции \"обновить по первичному " -"ключу\"." - -msgid "" -"tarantool> -- Insert some test data --\n" -"tarantool> s:insert{3, 4, 5}\n" -"---\n" -"- [3, 4, 5]\n" -"...\n" -"tarantool> s:insert{6, 7, 8}\n" -"---\n" -"- [6, 7, 8]\n" -"...\n" -"tarantool> s:insert{9, 10, 11}\n" -"---\n" -"- [9, 10, 11]\n" -"...\n" -"tarantool> s:insert{12, 13, 14}\n" -"---\n" -"- [12, 13, 14]\n" -"...\n" -"tarantool> -- Nothing done here: no {4} key in pk index --\n" -"s:update({4}, {{'=', 2, 400}})\n" -"---\n" -"...\n" -"tarantool> s:select{}\n" -"---\n" -"- - [3, 4, 5]\n" -" - [6, 7, 8]\n" -" - [9, 10, 11]\n" -" - [12, 13, 14]\n" -"...\n" -"tarantool> -- Update by a primary key: ok --\n" -"tarantool> s:update({3}, {{'=', 2, 400}})\n" -"---\n" -"- [3, 400, 5]\n" -"...\n" -"tarantool> s:select{}\n" -"---\n" -"- - [3, 400, 5]\n" -" - [6, 7, 8]\n" -" - [9, 10, 11]\n" -" - [12, 13, 14]\n" -"...\n" -"tarantool> -- Explicitly update by a primary key: ok --\n" -"tarantool> s.index.pk:update({6}, {{'=', 2, 700}})\n" -"---\n" -"- [6, 700, 8]\n" -"...\n" -"tarantool> s:select{}\n" -"---\n" -"- - [3, 400, 5]\n" -" - [6, 700, 8]\n" -" - [9, 10, 11]\n" -" - [12, 13, 14]\n" -"...\n" -"tarantool> -- Update by a unique secondary key: ok --\n" -"tarantool> s.index.sk_uniq:update({10}, {{'=', 2, 1000}})\n" -"---\n" -"- [9, 1000, 11]\n" -"...\n" -"tarantool> s:select{}\n" -"---\n" -"- - [3, 400, 5]\n" -" - [6, 700, 8]\n" -" - [9, 1000, 11]\n" -" - [12, 13, 14]\n" -"...\n" -"tarantool> -- Update by a non-unique secondary key: error --\n" -"tarantool> s.index.sk_non_uniq:update({14}, {{'=', 2, 1300}})\n" -"---\n" -"- error: Get() doesn't support partial keys and non-unique indexes\n" -"...\n" -"tarantool> s:select{}\n" -"---\n" -"- - [3, 400, 5]\n" -" - [6, 700, 8]\n" -" - [9, 1000, 11]\n" -" - [12, 13, 14]\n" -"...\n" -"tarantool> s:truncate()\n" -"---\n" -"..." -msgstr "" -"tarantool> -- Вставить некоторые тестовые данные --\n" -"tarantool> s:insert{3, 4, 5}\n" -"---\n" -"- [3, 4, 5]\n" -"...\n" -"tarantool> s:insert{6, 7, 8}\n" -"---\n" -"- [6, 7, 8]\n" -"...\n" -"tarantool> s:insert{9, 10, 11}\n" -"---\n" -"- [9, 10, 11]\n" -"...\n" -"tarantool> s:insert{12, 13, 14}\n" -"---\n" -"- [12, 13, 14]\n" -"...\n" -"tarantool> -- Здесь ничего не происходит: нет ключа {4} в индексе pk --\n" -"s:update({4}, {{'=', 2, 400}})\n" -"---\n" -"...\n" -"tarantool> s:select{}\n" -"---\n" -"- - [3, 4, 5]\n" -" - [6, 7, 8]\n" -" - [9, 10, 11]\n" -" - [12, 13, 14]\n" -"...\n" -"tarantool> -- Обновить по первичному ключу: разрешено --\n" -"tarantool> s:update({3}, {{'=', 2, 400}})\n" -"---\n" -"- [3, 400, 5]\n" -"...\n" -"tarantool> s:select{}\n" -"---\n" -"- - [3, 400, 5]\n" -" - [6, 7, 8]\n" -" - [9, 10, 11]\n" -" - [12, 13, 14]\n" -"...\n" -"tarantool> -- Точно обновить по первичному ключу: разрешено --\n" -"tarantool> s.index.pk:update({6}, {{'=', 2, 700}})\n" -"---\n" -"- [6, 700, 8]\n" -"...\n" -"tarantool> s:select{}\n" -"---\n" -"- - [3, 400, 5]\n" -" - [6, 700, 8]\n" -" - [9, 10, 11]\n" -" - [12, 13, 14]\n" -"...\n" -"tarantool> -- Обновить по уникальному вторичному ключу: разрешено --\n" -"tarantool> s.index.sk_uniq:update({10}, {{'=', 2, 1000}})\n" -"---\n" -"- [9, 1000, 11]\n" -"...\n" -"tarantool> s:select{}\n" -"---\n" -"- - [3, 400, 5]\n" -" - [6, 700, 8]\n" -" - [9, 1000, 11]\n" -" - [12, 13, 14]\n" -"...\n" -"tarantool> -- Обновить по неуникальному вторичному ключу: ошибка --\n" -"tarantool> s.index.sk_non_uniq:update({14}, {{'=', 2, 1300}})\n" -"---\n" -"- error: Get() doesn't support partial keys and non-unique indexes\n" -"...\n" -"tarantool> s:select{}\n" -"---\n" -"- - [3, 400, 5]\n" -" - [6, 700, 8]\n" -" - [9, 1000, 11]\n" -" - [12, 13, 14]\n" -"...\n" -"tarantool> s:truncate()\n" -"---\n" -"..." - -msgid "UPSERT" -msgstr "UPSERT" - -msgid "``upsert`` accepts a well-formatted tuple and update operations." -msgstr "" -"``upsert`` (обновление и вставка) работает с кортежами с четким форматом и " -"выполняет операции обновления." - -msgid "" -"If an old tuple is found by the primary key of the specified tuple, then the" -" update operations are applied to the old tuple, and the new tuple is " -"ignored." -msgstr "" -"Если найден старый кортеж по первичному ключу, то операции обновления " -"применяются к старому кортежу, а новый кортеж игнорируется." - -msgid "" -"If no old tuple is found, then the new tuple is inserted, and the update " -"operations are **ignored**." -msgstr "" -"Если старый кортеж не найден, то происходит вставка нового кортежа, а " -"операции обновления **игнорируются**." - -msgid "Indexes have no ``upsert`` method - this is a method of a space." -msgstr "Для индексов нет метода ``upsert`` -- это метод для спейса." - -msgid "" -"tarantool> s.index.pk.upsert == nil\n" -"---\n" -"- true\n" -"...\n" -"tarantool> s.index.sk_uniq.upsert == nil\n" -"---\n" -"- true\n" -"...\n" -"tarantool> s.upsert ~= nil\n" -"---\n" -"- true\n" -"...\n" -"tarantool> -- As the first argument, upsert accepts --\n" -"tarantool> -- a well-formatted tuple, NOT a key! --\n" -"tarantool> s:insert{1, 2, 3}\n" -"---\n" -"- [1, 2, 3]\n" -"...\n" -"tarantool> s:upsert({1}, {{'=', 2, 200}})\n" -"---\n" -"- error: Tuple field 2 required by space format is missing\n" -"...\n" -"tarantool> s:select{}\n" -"---\n" -"- - [1, 2, 3]\n" -"...\n" -"tarantool> s:delete{1}\n" -"---\n" -"- [1, 2, 3]\n" +"- [1, 'Scorpions', 1965]\n" "..." msgstr "" "tarantool> s.index.pk.upsert == nil\n" @@ -806,86 +342,70 @@ msgstr "" "- [1, 2, 3]\n" "..." +#, fuzzy msgid "" -"``upsert`` turns into ``insert`` when no old tuple is found by the primary " -"key." +"``upsert`` acts as ``insert`` when no existing tuple is found by the primary" +" key." msgstr "" "``upsert`` превращается в ``insert``, когда старый кортеж не найден по " "первичному ключу." msgid "" -"tarantool> s:upsert({1, 2, 3}, {{'=', 2, 200}})\n" +"tarantool> bands:upsert({1, 'Scorpions', 1965}, {{'=', 2, 'The Doors'}})\n" "---\n" "...\n" -"tarantool> -- As you can see, {1, 2, 3} were inserted, --\n" -"tarantool> -- and the update operations were not applied. --\n" -"s:select{}\n" +"-- As you can see, {1, 'Scorpions', 1965} is inserted, --\n" +"-- and the update operation is not applied. --\n" +"tarantool> bands:select()\n" "---\n" -"- - [1, 2, 3]\n" +"- - [1, 'Scorpions', 1965]\n" "...\n" -"tarantool> -- Performing another upsert with the same primary key, --\n" -"tarantool> -- but different values in the other fields. --\n" -"s:upsert({1, 20, 30}, {{'=', 2, 200}})\n" +"\n" +"-- upsert with the same primary key but different values in other fields --\n" +"-- applies the update operation and ignores the new tuple. --\n" +"tarantool> bands:upsert({1, 'Scorpions', 1965}, {{'=', 2, 'The Doors'}})\n" "---\n" "...\n" -"tarantool> -- The old tuple was found by the primary key {1} --\n" -"tarantool> -- and update operations were applied. --\n" -"tarantool> -- The new tuple was ignored. --\n" -"tarantool> s:select{}\n" +"tarantool> bands:select()\n" "---\n" -"- - [1, 200, 3]\n" +"- - [1, 'The Doors', 1965]\n" "..." msgstr "" -"tarantool> s:upsert({1, 2, 3}, {{'=', 2, 200}})\n" -"---\n" -"...\n" -"tarantool> -- Как можно увидеть, произошла вставка {1, 2, 3}, --\n" -"tarantool> -- а операции обновления не применились. --\n" -"s:select{}\n" -"---\n" -"- - [1, 2, 3]\n" -"...\n" -"tarantool> -- Еще одна операция upsert с тем же первичным ключом, --\n" -"tarantool> -- но другими значениями прочих полей. --\n" -"s:upsert({1, 20, 30}, {{'=', 2, 200}})\n" -"---\n" -"...\n" -"tarantool> -- Старый кортеж был найден по первичному ключу {1}, --\n" -"tarantool> -- и применились операции обновления. --\n" -"tarantool> -- Новый кортеж игнорируется. --\n" -"tarantool> s:select{}\n" -"---\n" -"- - [1, 200, 3]\n" -"..." +#, fuzzy msgid "" -"``upsert`` searches for an old tuple by the primary index, NOT by a " -"secondary index. This can lead to a duplication error if the new tuple ruins" -" the uniqueness of a secondary index." +"``upsert`` searches for the existing tuple by the primary index, not by the " +"secondary index. This can lead to a duplication error if the tuple violates " +"a secondary index uniqueness." msgstr "" "``upsert`` ищет старый кортеж по первичному индексу, НЕ по вторичному. Это " "может привести к ошибкам с дубликатами, если новый кортеж нарушает " "уникальность вторичного индекса." +#, fuzzy msgid "" -"tarantool> s:upsert({2, 200, 3}, {{'=', 3, 300}})\n" +"tarantool> bands:upsert({2, 'The Doors', 1965}, {{'=', 2, 'Pink Floyd'}})\n" "---\n" -"- error: Duplicate key exists in unique index 'sk_uniq' in space 'test'\n" +"- error: Duplicate key exists in unique index \"band\" in space \"bands\" with old tuple\n" +" - [1, \"The Doors\", 1965] and new tuple - [2, \"The Doors\", 1965]\n" "...\n" -"s:select{}\n" +"tarantool> bands:select()\n" "---\n" -"- - [1, 200, 3]\n" +"- - [1, 'The Doors', 1965]\n" "...\n" -"tarantool> -- But this works, when uniqueness is preserved. --\n" -"tarantool> s:upsert({2, 0, 0}, {{'=', 3, 300}})\n" +"\n" +"-- This works if uniqueness is preserved. --\n" +"tarantool> bands:upsert({2, 'The Beatles', 1960}, {{'=', 2, 'Pink Floyd'}})\n" "---\n" "...\n" -"tarantool> s:select{}\n" +"tarantool> bands:select()\n" "---\n" -"- - [1, 200, 3]\n" -" - [2, 0, 0]\n" +"- - [1, 'The Doors', 1965]\n" +" - [2, 'The Beatles', 1960]\n" "...\n" -"tarantool> s:truncate()\n" +"\n" +"-- Delete all tuples --\n" +"tarantool> bands:truncate()\n" "---\n" "..." msgstr "" @@ -913,41 +433,48 @@ msgstr "" msgid "REPLACE" msgstr "REPLACE" +#, fuzzy msgid "" -"``replace`` accepts a well-formatted tuple and searches for an old tuple by " -"the primary key of the new tuple." +":ref:`space_object.replace ` accepts a well-formatted " +"tuple and searches for the existing tuple by the primary key of the new " +"tuple:" msgstr "" "``replace`` (замена) работает с кортежами с четким форматом и ищет старый " "кортеж по первичному ключу нового кортежа." +#, fuzzy msgid "" -"If the old tuple is found, then it is deleted, and the new tuple is " -"inserted." +"If the existing tuple is found, Tarantool deletes it and inserts the new " +"tuple." msgstr "" "Если найден старый кортеж, то происходит удаление старого кортежа и вставка " "нового." -msgid "If the old tuple was not found, then just the new tuple is inserted." -msgstr "Если старый кортеж не найден, вставляется новый кортеж." +#, fuzzy +msgid "If no existing tuple is found, Tarantool inserts the new tuple." +msgstr "" +"Если найден старый кортеж, то происходит удаление старого кортежа и вставка " +"нового." +#, fuzzy msgid "" -"tarantool> s:replace{1, 2, 3}\n" +"tarantool> bands:replace{1, 'Scorpions', 1965}\n" "---\n" -"- [1, 2, 3]\n" +"- [1, 'Scorpions', 1965]\n" "...\n" -"tarantool> s:select{}\n" +"tarantool> bands:select()\n" "---\n" -"- - [1, 2, 3]\n" +"- - [1, 'Scorpions', 1965]\n" "...\n" -"tarantool> s:replace{1, 3, 4}\n" +"tarantool> bands:replace{1, 'The Beatles', 1960}\n" "---\n" -"- [1, 3, 4]\n" +"- [1, 'The Beatles', 1960]\n" "...\n" -"tarantool> s:select{}\n" +"tarantool> bands:select()\n" "---\n" -"- - [1, 3, 4]\n" +"- - [1, 'The Beatles', 1960]\n" "...\n" -"tarantool> s:truncate()\n" +"tarantool> bands:truncate()\n" "---\n" "..." msgstr "" @@ -971,146 +498,954 @@ msgstr "" "---\n" "..." -msgid "``replace`` can ruin unique constraints, like ``upsert`` does." +#, fuzzy +msgid "``replace`` can violate unique constraints, like ``upsert`` does." msgstr "Как и ``upsert``, ``replace`` может нарушить требования уникальности." msgid "" -"tarantool> s:insert{1, 1, 1}\n" -"---\n" -"- [1, 1, 1]\n" +"tarantool> bands:insert{1, 'Scorpions', 1965}\n" +"- [1, 'Scorpions', 1965]\n" "...\n" -"tarantool> s:insert{2, 2, 2}\n" +"tarantool> bands:insert{2, 'The Beatles', 1960}\n" "---\n" -"- [2, 2, 2]\n" +"- [2, 'The Beatles', 1960]\n" "...\n" -"tarantool> -- This replace fails, because if the new tuple {1, 2, 0} replaces --\n" -"tarantool> -- the old tuple by the primary key from 'pk' index {1, 1, 1}, --\n" -"tarantool> -- this results in a duplicate unique secondary key in 'sk_uniq' index: --\n" -"tarantool> -- key {2} is used both in the new tuple and in {2, 2, 2}. --\n" -"tarantool> s:replace{1, 2, 0}\n" +"tarantool> bands:replace{2, 'Scorpions', 1965}\n" "---\n" -"- error: Duplicate key exists in unique index 'sk_uniq' in space 'test'\n" +"- error: Duplicate key exists in unique index \"band\" in space \"bands\" with old tuple\n" +" - [1, \"Scorpions\", 1965] and new tuple - [2, \"Scorpions\", 1965]\n" "...\n" -"tarantool> s:truncate()\n" +"tarantool> bands:truncate()\n" "---\n" "..." msgstr "" -"tarantool> s:insert{1, 1, 1}\n" -"---\n" -"- [1, 1, 1]\n" -"...\n" -"tarantool> s:insert{2, 2, 2}\n" -"---\n" -"- [2, 2, 2]\n" -"...\n" -"tarantool> -- Такая замена не сработает, поскольку замена новым кортежем {1, 2, 0} --\n" -"tarantool> -- старого кортежа по первичному ключу из индекса 'pk' {1, 1, 1}, --\n" -"tarantool> -- приведет к созданию дубликата уникального вторичного ключа в индексе 'sk_uniq': --\n" -"tarantool> -- ключ {2} используется и в новом кортеже, и в {2, 2, 2}. --\n" -"tarantool> s:replace{1, 2, 0}\n" -"---\n" -"- error: Duplicate key exists in unique index 'sk_uniq' in space 'test'\n" -"...\n" -"tarantool> s:truncate()\n" -"---\n" -"..." msgid "SELECT" msgstr "SELECT" msgid "" -"``select`` works with any indexes (primary/secondary) and with any keys " -"(unique/non-unique, full/partial)." +"The :ref:`space_object.select ` request searches for a " +"tuple or a set of tuples in the given space by the primary key. To search by" +" the specified index, use :ref:`index_object.select `. " +"These methods work with any keys, including unique and non-unique, full and " +"partial. If a key is partial, ``select`` searches by all keys where the " +"prefix matches the specified key part." msgstr "" -"``select`` (выборка) работает с любыми индексами (первичными/вторичными) и с" -" любыми ключами (уникальными/неуникальными, полными/компонентами)." msgid "" -"If a key is partial, then ``select`` searches by all keys, where the prefix " -"matches the specified key part." -msgstr "" -"Если задан компонент ключа, ``select`` выполняет поиск всех ключей, префикс " -"которых совпадает с указанным компонентом ключа." - -msgid "" -"tarantool> s:insert{1, 2, 3}\n" -"---\n" -"- [1, 2, 3]\n" -"...\n" -"tarantool> s:insert{4, 5, 6}\n" -"---\n" -"- [4, 5, 6]\n" -"...\n" -"tarantool> s:insert{7, 8, 9}\n" -"---\n" -"- [7, 8, 9]\n" -"...\n" -"tarantool> s:insert{10, 11, 9}\n" -"---\n" -"- [10, 11, 9]\n" -"...\n" -"tarantool> s:select{1}\n" +"tarantool> bands:insert{1, 'Roxette', 1986}\n" +" bands:insert{2, 'Scorpions', 1965}\n" +" bands:insert{3, 'The Doors', 1965}\n" +" bands:insert{4, 'The Beatles', 1960}\n" +"\n" +"tarantool> bands:select(1)\n" "---\n" -"- - [1, 2, 3]\n" +"- - [1, 'Roxette', 1986]\n" "...\n" -"tarantool> s:select{}\n" +"\n" +"tarantool> bands:select()\n" "---\n" -"- - [1, 2, 3]\n" -" - [4, 5, 6]\n" -" - [7, 8, 9]\n" -" - [10, 11, 9]\n" +"- - [1, 'Roxette', 1986]\n" +" - [2, 'Scorpions', 1965]\n" +" - [3, 'The Doors', 1965]\n" +" - [4, 'The Beatles', 1960]\n" "...\n" -"tarantool> s.index.pk:select{4}\n" +"\n" +"tarantool> bands.index.primary:select(2)\n" "---\n" -"- - [4, 5, 6]\n" +"- - [2, 'Scorpions', 1965]\n" "...\n" -"tarantool> s.index.sk_uniq:select{8}\n" +"\n" +"tarantool> bands.index.band:select('The Doors')\n" "---\n" -"- - [7, 8, 9]\n" +"- - [3, 'The Doors', 1965]\n" "...\n" -"tarantool> s.index.sk_non_uniq:select{9}\n" +"\n" +"tarantool> bands.index.year:select(1965)\n" "---\n" -"- - [7, 8, 9]\n" -" - [10, 11, 9]\n" +"- - [2, 'Scorpions', 1965]\n" +" - [3, 'The Doors', 1965]\n" "..." msgstr "" -"tarantool> s:insert{1, 2, 3}\n" -"---\n" -"- [1, 2, 3]\n" -"...\n" -"tarantool> s:insert{4, 5, 6}\n" -"---\n" -"- [4, 5, 6]\n" -"...\n" -"tarantool> s:insert{7, 8, 9}\n" -"---\n" -"- [7, 8, 9]\n" -"...\n" -"tarantool> s:insert{10, 11, 9}\n" + +#, fuzzy +msgid "Using box.space functions to read _space tuples" +msgstr "Пример: использование функций box.space для чтения кортежей из _space" + +#, fuzzy +msgid "" +"This example illustrates how to look at all the spaces, and for each " +"display: approximately how many tuples it contains, and the first field of " +"its first tuple. The function uses the Tarantool's ``box.space`` functions " +"``len()`` and ``pairs()``. The iteration through the spaces is coded as a " +"scan of the ``_space`` system space, which contains metadata. The third " +"field in ``_space`` contains the space name, so the key instruction " +"``space_name = v[3]`` means ``space_name`` is the ``space_name`` field in " +"the tuple of ``_space`` that we've just fetched with ``pairs()``. The " +"function returns a table:" +msgstr "" +"Функция ниже проиллюстрирует, как обращаться ко всем спейсам, и для каждого " +"отобразит примерное количество кортежей и первое поле первого кортежа. В " +"данной функции используются функции из ``box.space`` в Tarantool: ``len()`` " +"и ``pairs()``. Итерация по спейсам закодирована в форме сканирования " +"системного спейса ``_space``, который содержит метаданные. Третье поле в " +"``_space`` содержит имя спейса, поэтому ключевая команда ``space_name = " +"v[3]`` означает, что ``space_name`` -- это поле ``space_name`` в кортеже " +"``_space``, который мы только что получили с помощью ``pairs()``. Функция " +"возвращает таблицу:" + +msgid "" +"function example()\n" +" local tuple_count, space_name, line\n" +" local ta = {}\n" +" for k, v in box.space._space:pairs() do\n" +" space_name = v[3]\n" +" if box.space[space_name].index[0] ~= nil then\n" +" tuple_count = '1 or more'\n" +" else\n" +" tuple_count = '0'\n" +" end\n" +" line = space_name .. ' tuple_count =' .. tuple_count\n" +" if tuple_count == '1 or more' then\n" +" for k1, v1 in box.space[space_name]:pairs() do\n" +" line = line .. '. first field in first tuple = ' .. v1[1]\n" +" break\n" +" end\n" +" end\n" +" table.insert(ta, line)\n" +" end\n" +" return ta\n" +"end" +msgstr "" +"function example()\n" +" local tuple_count, space_name, line\n" +" local ta = {}\n" +" for k, v in box.space._space:pairs() do\n" +" space_name = v[3]\n" +" if box.space[space_name].index[0] ~= nil then\n" +" tuple_count = '1 or more'\n" +" else\n" +" tuple_count = '0'\n" +" end\n" +" line = space_name .. ' tuple_count =' .. tuple_count\n" +" if tuple_count == '1 or more' then\n" +" for k1, v1 in box.space[space_name]:pairs() do\n" +" line = line .. '. first field in first tuple = ' .. v1[1]\n" +" break\n" +" end\n" +" end\n" +" table.insert(ta, line)\n" +" end\n" +" return ta\n" +"end" + +#, fuzzy +msgid "The output below shows what happens if you invoke this function:" +msgstr "А вот что происходит, когда вызывается функция:" + +msgid "" +"tarantool> example()\n" "---\n" -"- [10, 11, 9]\n" -"...\n" -"tarantool> s:select{1}\n" +"- - _schema tuple_count =1 or more. first field in first tuple = cluster\n" +" - _space tuple_count =1 or more. first field in first tuple = 272\n" +" - _vspace tuple_count =1 or more. first field in first tuple = 272\n" +" - _index tuple_count =1 or more. first field in first tuple = 272\n" +" - _vindex tuple_count =1 or more. first field in first tuple = 272\n" +" - _func tuple_count =1 or more. first field in first tuple = 1\n" +" - _vfunc tuple_count =1 or more. first field in first tuple = 1\n" +" - _user tuple_count =1 or more. first field in first tuple = 0\n" +" - _vuser tuple_count =1 or more. first field in first tuple = 0\n" +" - _priv tuple_count =1 or more. first field in first tuple = 1\n" +" - _vpriv tuple_count =1 or more. first field in first tuple = 1\n" +" - _cluster tuple_count =1 or more. first field in first tuple = 1\n" +"..." +msgstr "" +"tarantool> example()\n" "---\n" -"- - [1, 2, 3]\n" -"...\n" -"tarantool> s:select{}\n" +"- - _schema tuple_count =1 or more. first field in first tuple = cluster\n" +" - _space tuple_count =1 or more. first field in first tuple = 272\n" +" - _vspace tuple_count =1 or more. first field in first tuple = 272\n" +" - _index tuple_count =1 or more. first field in first tuple = 272\n" +" - _vindex tuple_count =1 or more. first field in first tuple = 272\n" +" - _func tuple_count =1 or more. first field in first tuple = 1\n" +" - _vfunc tuple_count =1 or more. first field in first tuple = 1\n" +" - _user tuple_count =1 or more. first field in first tuple = 0\n" +" - _vuser tuple_count =1 or more. first field in first tuple = 0\n" +" - _priv tuple_count =1 or more. first field in first tuple = 1\n" +" - _vpriv tuple_count =1 or more. first field in first tuple = 1\n" +" - _cluster tuple_count =1 or more. first field in first tuple = 1\n" +"..." + +#, fuzzy +msgid "Using box.space functions to organize a _space tuple" +msgstr "" +"Пример: использование функций box.space для организации кортежа из _space" + +#, fuzzy +msgid "" +"This examples shows how to display field names and field types of a system " +"space -- using metadata to find metadata." +msgstr "" +"Основная цель -- отобразить имена и типы полей системного спейса, то есть " +"использование метаданных для поиска метаданных." + +msgid "" +"To begin: how can one select the ``_space`` tuple that describes ``_space``?" +msgstr "" +"Для начала: как можно сделать выборку кортежа из ``_space``, который " +"описывает ``_space``?" + +#, fuzzy +msgid "" +"A simple way is to look at the constants in ``box.schema``, which shows that" +" there is an item named SPACE_ID == 288, so these statements retrieve the " +"correct tuple:" +msgstr "" +"Проще всего проверить постоянные в ``box.schema``, что укажет на наличие " +"элемента под названием SPACE_ID == 288. Таким образом, следующие запросы " +"вернут нужный кортеж:" + +msgid "" +"box.space._space:select{ 288 }\n" +"-- or --\n" +"box.space._space:select{ box.schema.SPACE_ID }" +msgstr "" +"box.space._space:select{ 288 }\n" +"-- или --\n" +"box.space._space:select{ box.schema.SPACE_ID }" + +#, fuzzy +msgid "" +"Another way is to look at the tuples in ``box.space._index``, which shows " +"that there is a secondary index named 'name' for a space number 288, so this" +" statement also retrieve the correct tuple:" +msgstr "" +"Также можно обратиться к спейсам в ``box.space._index``, что укажет на " +"наличие вторичного индекса с именем 'name' для спейса под номером 288. Таким" +" образом, следующий запрос также вернет нужный кортеж:" + +msgid "box.space._space.index.name:select{ '_space' }" +msgstr "box.space._space.index.name:select{ '_space' }" + +msgid "However, the retrieved tuple is not easy to read:" +msgstr "Однако непросто прочитать информацию из полученного кортежа:" + +msgid "" +"tarantool> box.space._space.index.name:select{'_space'}\n" "---\n" -"- - [1, 2, 3]\n" -" - [4, 5, 6]\n" -" - [7, 8, 9]\n" -" - [10, 11, 9]\n" -"...\n" -"tarantool> s.index.pk:select{4}\n" +"- - [280, 1, '_space', 'memtx', 0, {}, [{'name': 'id', 'type': 'num'}, {'name': 'owner',\n" +" 'type': 'num'}, {'name': 'name', 'type': 'str'}, {'name': 'engine', 'type': 'str'},\n" +" {'name': 'field_count', 'type': 'num'}, {'name': 'flags', 'type': 'str'}, {\n" +" 'name': 'format', 'type': '*'}]]\n" +"..." +msgstr "" +"tarantool> box.space._space.index.name:select{'_space'}\n" "---\n" -"- - [4, 5, 6]\n" -"...\n" -"tarantool> s.index.sk_uniq:select{8}\n" +"- - [280, 1, '_space', 'memtx', 0, {}, [{'name': 'id', 'type': 'num'}, {'name': 'owner',\n" +" 'type': 'num'}, {'name': 'name', 'type': 'str'}, {'name': 'engine', 'type': 'str'},\n" +" {'name': 'field_count', 'type': 'num'}, {'name': 'flags', 'type': 'str'}, {\n" +" 'name': 'format', 'type': '*'}]]\n" +"..." + +msgid "" +"It looks disorganized because field number 7 has been formatted with " +"recommended names and data types. How can one get those specific sub-fields?" +" Since it's visible that field number 7 is an array of maps, this `for` loop" +" will do the organizing:" +msgstr "" +"Информация подается бессистемно, поскольку по формату поле №7 содержит " +"рекомендованные имена и типы данных. Как же получить эти данные? Поскольку " +"очевидно, что поле №7 представляет собой ассоциативный массив, цикл `for` " +"проведет организацию данных:" + +msgid "" +"tarantool> do\n" +" > local tuple_of_space = box.space._space.index.name:get{'_space'}\n" +" > for _, field in ipairs(tuple_of_space[7]) do\n" +" > print(field.name .. ', ' .. field.type)\n" +" > end\n" +" > end\n" +"id, num\n" +"owner, num\n" +"name, str\n" +"engine, str\n" +"field_count, num\n" +"flags, str\n" +"format, *\n" "---\n" -"- - [7, 8, 9]\n" -"...\n" -"tarantool> s.index.sk_non_uniq:select{9}\n" +"..." +msgstr "" +"tarantool> do\n" +" > local tuple_of_space = box.space._space.index.name:get{'_space'}\n" +" > for _, field in ipairs(tuple_of_space[7]) do\n" +" > print(field.name .. ', ' .. field.type)\n" +" > end\n" +" > end\n" +"id, num\n" +"owner, num\n" +"name, str\n" +"engine, str\n" +"field_count, num\n" +"flags, str\n" +"format, *\n" "---\n" -"- - [7, 8, 9]\n" -" - [10, 11, 9]\n" "..." + +#~ msgid "" +#~ "-- Bootstrap the database --\n" +#~ "box.cfg{}\n" +#~ "format = {}\n" +#~ "format[1] = {'field1', 'unsigned'}\n" +#~ "format[2] = {'field2', 'unsigned'}\n" +#~ "format[3] = {'field3', 'unsigned'}\n" +#~ "s = box.schema.create_space('test', {format = format})\n" +#~ "-- Create a primary index --\n" +#~ "pk = s:create_index('pk', {parts = {{'field1'}}})\n" +#~ "-- Create a unique secondary index --\n" +#~ "sk_uniq = s:create_index('sk_uniq', {parts = {{'field2'}}})\n" +#~ "-- Create a non-unique secondary index --\n" +#~ "sk_non_uniq = s:create_index('sk_non_uniq', {parts = {{'field3'}}, unique = false})" +#~ msgstr "" +#~ "-- Настройка базы данных --\n" +#~ "box.cfg{}\n" +#~ "format = {}\n" +#~ "format[1] = {'field1', 'unsigned'}\n" +#~ "format[2] = {'field2', 'unsigned'}\n" +#~ "format[3] = {'field3', 'unsigned'}\n" +#~ "s = box.schema.create_space('test', {format = format})\n" +#~ "-- Создание первичного индекса --\n" +#~ "pk = s:create_index('pk', {parts = {{'field1'}}})\n" +#~ "-- Создание уникального вторичного индекса --\n" +#~ "sk_uniq = s:create_index('sk_uniq', {parts = {{'field2'}}})\n" +#~ "-- Создание неуникального вторичного индекса --\n" +#~ "sk_non_uniq = s:create_index('sk_non_uniq', {parts = {{'field3'}}, unique = false})" + +#~ msgid "" +#~ "tarantool> -- Unique indexes: ok --\n" +#~ "tarantool> s:insert({1, 1, 1})\n" +#~ "---\n" +#~ "- [1, 1, 1]\n" +#~ "...\n" +#~ "tarantool> -- Conflicting primary key: error --\n" +#~ "tarantool> s:insert({1, 1, 1})\n" +#~ "---\n" +#~ "- error: Duplicate key exists in unique index 'pk' in space 'test'\n" +#~ "...\n" +#~ "tarantool> -- Conflicting unique secondary key: error --\n" +#~ "tarantool> s:insert({2, 1, 1})\n" +#~ "---\n" +#~ "- error: Duplicate key exists in unique index 'sk_uniq' in space 'test'\n" +#~ "...\n" +#~ "tarantool> -- Key {1} exists in sk_non_uniq index, but it is not unique: ok --\n" +#~ "tarantool> s:insert({2, 2, 1})\n" +#~ "---\n" +#~ "- [2, 2, 1]\n" +#~ "...\n" +#~ "tarantool> s:truncate()\n" +#~ "---\n" +#~ "..." +#~ msgstr "" +#~ "tarantool> -- Уникальные индексы: разрешено --\n" +#~ "tarantool> s:insert({1, 1, 1})\n" +#~ "---\n" +#~ "- [1, 1, 1]\n" +#~ "...\n" +#~ "tarantool> -- Конфликт первичного ключа: ошибка --\n" +#~ "tarantool> s:insert({1, 1, 1})\n" +#~ "---\n" +#~ "- error: Duplicate key exists in unique index 'pk' in space 'test'\n" +#~ "...\n" +#~ "tarantool> -- Конфликт уникального вторичного ключа: ошибка --\n" +#~ "tarantool> s:insert({2, 1, 1})\n" +#~ "---\n" +#~ "- error: Duplicate key exists in unique index 'sk_uniq' in space 'test'\n" +#~ "...\n" +#~ "tarantool> -- Ключ {1} присутствует в индексе sk_non_uniq, но он не уникален: разрешено --\n" +#~ "tarantool> s:insert({2, 2, 1})\n" +#~ "---\n" +#~ "- [2, 2, 1]\n" +#~ "...\n" +#~ "tarantool> s:truncate()\n" +#~ "---\n" +#~ "..." + +#~ msgid "``delete`` accepts a full key of any unique index." +#~ msgstr "" +#~ "``delete`` (удаление) работает с полными ключами любого уникального индекса." + +#~ msgid "``space:delete`` is an alias for \"delete by primary key\"." +#~ msgstr "" +#~ "``space:delete`` -- это псевдоним для операции \"удалить по первичному " +#~ "ключу\"." + +#~ msgid "" +#~ "tarantool> -- Insert some test data --\n" +#~ "tarantool> s:insert{3, 4, 5}\n" +#~ "---\n" +#~ "- [3, 4, 5]\n" +#~ "...\n" +#~ "tarantool> s:insert{6, 7, 8}\n" +#~ "---\n" +#~ "- [6, 7, 8]\n" +#~ "...\n" +#~ "tarantool> s:insert{9, 10, 11}\n" +#~ "---\n" +#~ "- [9, 10, 11]\n" +#~ "...\n" +#~ "tarantool> s:insert{12, 13, 14}\n" +#~ "---\n" +#~ "- [12, 13, 14]\n" +#~ "...\n" +#~ "tarantool> -- Nothing done here: no {4} key in pk index --\n" +#~ "tarantool> s:delete{4}\n" +#~ "---\n" +#~ "...\n" +#~ "tarantool> s:select{}\n" +#~ "---\n" +#~ "- - [3, 4, 5]\n" +#~ " - [6, 7, 8]\n" +#~ " - [9, 10, 11]\n" +#~ " - [12, 13, 14]\n" +#~ "...\n" +#~ "tarantool> -- Delete by a primary key: ok --\n" +#~ "tarantool> s:delete{3}\n" +#~ "---\n" +#~ "- [3, 4, 5]\n" +#~ "...\n" +#~ "tarantool> s:select{}\n" +#~ "---\n" +#~ "- - [6, 7, 8]\n" +#~ " - [9, 10, 11]\n" +#~ " - [12, 13, 14]\n" +#~ "...\n" +#~ "tarantool> -- Explicitly delete by a primary key: ok --\n" +#~ "tarantool> s.index.pk:delete{6}\n" +#~ "---\n" +#~ "- [6, 7, 8]\n" +#~ "...\n" +#~ "tarantool> s:select{}\n" +#~ "---\n" +#~ "- - [9, 10, 11]\n" +#~ " - [12, 13, 14]\n" +#~ "...\n" +#~ "tarantool> -- Delete by a unique secondary key: ok --\n" +#~ "s.index.sk_uniq:delete{10}\n" +#~ "---\n" +#~ "- [9, 10, 11]\n" +#~ "...\n" +#~ "s:select{}\n" +#~ "---\n" +#~ "- - [12, 13, 14]\n" +#~ "...\n" +#~ "tarantool> -- Delete by a non-unique secondary index: error --\n" +#~ "tarantool> s.index.sk_non_uniq:delete{14}\n" +#~ "---\n" +#~ "- error: Get() doesn't support partial keys and non-unique indexes\n" +#~ "...\n" +#~ "tarantool> s:select{}\n" +#~ "---\n" +#~ "- - [12, 13, 14]\n" +#~ "...\n" +#~ "tarantool> s:truncate()\n" +#~ "---\n" +#~ "..." +#~ msgstr "" +#~ "tarantool> -- Вставить некоторые тестовые данные --\n" +#~ "tarantool> s:insert{3, 4, 5}\n" +#~ "---\n" +#~ "- [3, 4, 5]\n" +#~ "...\n" +#~ "tarantool> s:insert{6, 7, 8}\n" +#~ "---\n" +#~ "- [6, 7, 8]\n" +#~ "...\n" +#~ "tarantool> s:insert{9, 10, 11}\n" +#~ "---\n" +#~ "- [9, 10, 11]\n" +#~ "...\n" +#~ "tarantool> s:insert{12, 13, 14}\n" +#~ "---\n" +#~ "- [12, 13, 14]\n" +#~ "...\n" +#~ "tarantool> -- Здесь ничего не происходит: нет ключа {4} в индексе pk --\n" +#~ "tarantool> s:delete{4}\n" +#~ "---\n" +#~ "...\n" +#~ "tarantool> s:select{}\n" +#~ "---\n" +#~ "- - [3, 4, 5]\n" +#~ " - [6, 7, 8]\n" +#~ " - [9, 10, 11]\n" +#~ " - [12, 13, 14]\n" +#~ "...\n" +#~ "tarantool> -- Удалить по первичному ключу: разрешено --\n" +#~ "tarantool> s:delete{3}\n" +#~ "---\n" +#~ "- [3, 4, 5]\n" +#~ "...\n" +#~ "tarantool> s:select{}\n" +#~ "---\n" +#~ "- - [6, 7, 8]\n" +#~ " - [9, 10, 11]\n" +#~ " - [12, 13, 14]\n" +#~ "...\n" +#~ "tarantool> -- Точно удалить по первичному ключу: разрешено --\n" +#~ "tarantool> s.index.pk:delete{6}\n" +#~ "---\n" +#~ "- [6, 7, 8]\n" +#~ "...\n" +#~ "tarantool> s:select{}\n" +#~ "---\n" +#~ "- - [9, 10, 11]\n" +#~ " - [12, 13, 14]\n" +#~ "...\n" +#~ "tarantool> -- Удалить по уникальному вторичному ключу: разрешено --\n" +#~ "s.index.sk_uniq:delete{10}\n" +#~ "---\n" +#~ "- [9, 10, 11]\n" +#~ "...\n" +#~ "s:select{}\n" +#~ "---\n" +#~ "- - [12, 13, 14]\n" +#~ "...\n" +#~ "tarantool> -- Удалить по неуникальному вторичному индексу: ошибка --\n" +#~ "tarantool> s.index.sk_non_uniq:delete{14}\n" +#~ "---\n" +#~ "- error: Get() doesn't support partial keys and non-unique indexes\n" +#~ "...\n" +#~ "tarantool> s:select{}\n" +#~ "---\n" +#~ "- - [12, 13, 14]\n" +#~ "...\n" +#~ "tarantool> s:truncate()\n" +#~ "---\n" +#~ "..." + +#~ msgid "The key must be full: ``delete`` cannot work with partial keys." +#~ msgstr "" +#~ "Ключ должен быть полным: операция ``delete`` не работает с компонентами " +#~ "ключа." + +#~ msgid "" +#~ "tarantool> s2 = box.schema.create_space('test2')\n" +#~ "---\n" +#~ "...\n" +#~ "tarantool> pk2 = s2:create_index('pk2', {parts = {{1, 'unsigned'}, {2, 'unsigned'}}})\n" +#~ "---\n" +#~ "...\n" +#~ "tarantool> s2:insert{1, 1}\n" +#~ "---\n" +#~ "- [1, 1]\n" +#~ "...\n" +#~ "tarantool> -- Delete by a partial key: error --\n" +#~ "tarantool> s2:delete{1}\n" +#~ "---\n" +#~ "- error: Invalid key part count in an exact match (expected 2, got 1)\n" +#~ "...\n" +#~ "tarantool> -- Delete by a full key: ok --\n" +#~ "tarantool> s2:delete{1, 1}\n" +#~ "---\n" +#~ "- [1, 1]\n" +#~ "...\n" +#~ "tarantool> s2:select{}\n" +#~ "---\n" +#~ "- []\n" +#~ "...\n" +#~ "tarantool> s2:drop()\n" +#~ "---\n" +#~ "..." +#~ msgstr "" +#~ "tarantool> s2 = box.schema.create_space('test2')\n" +#~ "---\n" +#~ "...\n" +#~ "tarantool> pk2 = s2:create_index('pk2', {parts = {{1, 'unsigned'}, {2, 'unsigned'}}})\n" +#~ "---\n" +#~ "...\n" +#~ "tarantool> s2:insert{1, 1}\n" +#~ "---\n" +#~ "- [1, 1]\n" +#~ "...\n" +#~ "tarantool> -- Удалить по компоненту ключа: ошибка --\n" +#~ "tarantool> s2:delete{1}\n" +#~ "---\n" +#~ "- error: Invalid key part count in an exact match (expected 2, got 1)\n" +#~ "...\n" +#~ "tarantool> -- Удалить по ключу целиком: разрешено --\n" +#~ "tarantool> s2:delete{1, 1}\n" +#~ "---\n" +#~ "- [1, 1]\n" +#~ "...\n" +#~ "tarantool> s2:select{}\n" +#~ "---\n" +#~ "- []\n" +#~ "...\n" +#~ "tarantool> s2:drop()\n" +#~ "---\n" +#~ "..." + +#~ msgid "" +#~ "Similarly to ``delete``, ``update`` accepts a full key of any unique index, " +#~ "and also the operations to execute." +#~ msgstr "" +#~ "Как и ``delete``, ``update`` работает с полными ключами любого уникального " +#~ "индекса, а также выполняет операции." + +#~ msgid "``space:update`` is an alias for \"update by primary key\"." +#~ msgstr "" +#~ "``space:update`` -- это псевдоним для операции \"обновить по первичному " +#~ "ключу\"." + +#~ msgid "" +#~ "tarantool> -- Insert some test data --\n" +#~ "tarantool> s:insert{3, 4, 5}\n" +#~ "---\n" +#~ "- [3, 4, 5]\n" +#~ "...\n" +#~ "tarantool> s:insert{6, 7, 8}\n" +#~ "---\n" +#~ "- [6, 7, 8]\n" +#~ "...\n" +#~ "tarantool> s:insert{9, 10, 11}\n" +#~ "---\n" +#~ "- [9, 10, 11]\n" +#~ "...\n" +#~ "tarantool> s:insert{12, 13, 14}\n" +#~ "---\n" +#~ "- [12, 13, 14]\n" +#~ "...\n" +#~ "tarantool> -- Nothing done here: no {4} key in pk index --\n" +#~ "s:update({4}, {{'=', 2, 400}})\n" +#~ "---\n" +#~ "...\n" +#~ "tarantool> s:select{}\n" +#~ "---\n" +#~ "- - [3, 4, 5]\n" +#~ " - [6, 7, 8]\n" +#~ " - [9, 10, 11]\n" +#~ " - [12, 13, 14]\n" +#~ "...\n" +#~ "tarantool> -- Update by a primary key: ok --\n" +#~ "tarantool> s:update({3}, {{'=', 2, 400}})\n" +#~ "---\n" +#~ "- [3, 400, 5]\n" +#~ "...\n" +#~ "tarantool> s:select{}\n" +#~ "---\n" +#~ "- - [3, 400, 5]\n" +#~ " - [6, 7, 8]\n" +#~ " - [9, 10, 11]\n" +#~ " - [12, 13, 14]\n" +#~ "...\n" +#~ "tarantool> -- Explicitly update by a primary key: ok --\n" +#~ "tarantool> s.index.pk:update({6}, {{'=', 2, 700}})\n" +#~ "---\n" +#~ "- [6, 700, 8]\n" +#~ "...\n" +#~ "tarantool> s:select{}\n" +#~ "---\n" +#~ "- - [3, 400, 5]\n" +#~ " - [6, 700, 8]\n" +#~ " - [9, 10, 11]\n" +#~ " - [12, 13, 14]\n" +#~ "...\n" +#~ "tarantool> -- Update by a unique secondary key: ok --\n" +#~ "tarantool> s.index.sk_uniq:update({10}, {{'=', 2, 1000}})\n" +#~ "---\n" +#~ "- [9, 1000, 11]\n" +#~ "...\n" +#~ "tarantool> s:select{}\n" +#~ "---\n" +#~ "- - [3, 400, 5]\n" +#~ " - [6, 700, 8]\n" +#~ " - [9, 1000, 11]\n" +#~ " - [12, 13, 14]\n" +#~ "...\n" +#~ "tarantool> -- Update by a non-unique secondary key: error --\n" +#~ "tarantool> s.index.sk_non_uniq:update({14}, {{'=', 2, 1300}})\n" +#~ "---\n" +#~ "- error: Get() doesn't support partial keys and non-unique indexes\n" +#~ "...\n" +#~ "tarantool> s:select{}\n" +#~ "---\n" +#~ "- - [3, 400, 5]\n" +#~ " - [6, 700, 8]\n" +#~ " - [9, 1000, 11]\n" +#~ " - [12, 13, 14]\n" +#~ "...\n" +#~ "tarantool> s:truncate()\n" +#~ "---\n" +#~ "..." +#~ msgstr "" +#~ "tarantool> -- Вставить некоторые тестовые данные --\n" +#~ "tarantool> s:insert{3, 4, 5}\n" +#~ "---\n" +#~ "- [3, 4, 5]\n" +#~ "...\n" +#~ "tarantool> s:insert{6, 7, 8}\n" +#~ "---\n" +#~ "- [6, 7, 8]\n" +#~ "...\n" +#~ "tarantool> s:insert{9, 10, 11}\n" +#~ "---\n" +#~ "- [9, 10, 11]\n" +#~ "...\n" +#~ "tarantool> s:insert{12, 13, 14}\n" +#~ "---\n" +#~ "- [12, 13, 14]\n" +#~ "...\n" +#~ "tarantool> -- Здесь ничего не происходит: нет ключа {4} в индексе pk --\n" +#~ "s:update({4}, {{'=', 2, 400}})\n" +#~ "---\n" +#~ "...\n" +#~ "tarantool> s:select{}\n" +#~ "---\n" +#~ "- - [3, 4, 5]\n" +#~ " - [6, 7, 8]\n" +#~ " - [9, 10, 11]\n" +#~ " - [12, 13, 14]\n" +#~ "...\n" +#~ "tarantool> -- Обновить по первичному ключу: разрешено --\n" +#~ "tarantool> s:update({3}, {{'=', 2, 400}})\n" +#~ "---\n" +#~ "- [3, 400, 5]\n" +#~ "...\n" +#~ "tarantool> s:select{}\n" +#~ "---\n" +#~ "- - [3, 400, 5]\n" +#~ " - [6, 7, 8]\n" +#~ " - [9, 10, 11]\n" +#~ " - [12, 13, 14]\n" +#~ "...\n" +#~ "tarantool> -- Точно обновить по первичному ключу: разрешено --\n" +#~ "tarantool> s.index.pk:update({6}, {{'=', 2, 700}})\n" +#~ "---\n" +#~ "- [6, 700, 8]\n" +#~ "...\n" +#~ "tarantool> s:select{}\n" +#~ "---\n" +#~ "- - [3, 400, 5]\n" +#~ " - [6, 700, 8]\n" +#~ " - [9, 10, 11]\n" +#~ " - [12, 13, 14]\n" +#~ "...\n" +#~ "tarantool> -- Обновить по уникальному вторичному ключу: разрешено --\n" +#~ "tarantool> s.index.sk_uniq:update({10}, {{'=', 2, 1000}})\n" +#~ "---\n" +#~ "- [9, 1000, 11]\n" +#~ "...\n" +#~ "tarantool> s:select{}\n" +#~ "---\n" +#~ "- - [3, 400, 5]\n" +#~ " - [6, 700, 8]\n" +#~ " - [9, 1000, 11]\n" +#~ " - [12, 13, 14]\n" +#~ "...\n" +#~ "tarantool> -- Обновить по неуникальному вторичному ключу: ошибка --\n" +#~ "tarantool> s.index.sk_non_uniq:update({14}, {{'=', 2, 1300}})\n" +#~ "---\n" +#~ "- error: Get() doesn't support partial keys and non-unique indexes\n" +#~ "...\n" +#~ "tarantool> s:select{}\n" +#~ "---\n" +#~ "- - [3, 400, 5]\n" +#~ " - [6, 700, 8]\n" +#~ " - [9, 1000, 11]\n" +#~ " - [12, 13, 14]\n" +#~ "...\n" +#~ "tarantool> s:truncate()\n" +#~ "---\n" +#~ "..." + +#~ msgid "``upsert`` accepts a well-formatted tuple and update operations." +#~ msgstr "" +#~ "``upsert`` (обновление и вставка) работает с кортежами с четким форматом и " +#~ "выполняет операции обновления." + +#~ msgid "Indexes have no ``upsert`` method - this is a method of a space." +#~ msgstr "Для индексов нет метода ``upsert`` -- это метод для спейса." + +#~ msgid "" +#~ "tarantool> s:upsert({1, 2, 3}, {{'=', 2, 200}})\n" +#~ "---\n" +#~ "...\n" +#~ "tarantool> -- As you can see, {1, 2, 3} were inserted, --\n" +#~ "tarantool> -- and the update operations were not applied. --\n" +#~ "s:select{}\n" +#~ "---\n" +#~ "- - [1, 2, 3]\n" +#~ "...\n" +#~ "tarantool> -- Performing another upsert with the same primary key, --\n" +#~ "tarantool> -- but different values in the other fields. --\n" +#~ "s:upsert({1, 20, 30}, {{'=', 2, 200}})\n" +#~ "---\n" +#~ "...\n" +#~ "tarantool> -- The old tuple was found by the primary key {1} --\n" +#~ "tarantool> -- and update operations were applied. --\n" +#~ "tarantool> -- The new tuple was ignored. --\n" +#~ "tarantool> s:select{}\n" +#~ "---\n" +#~ "- - [1, 200, 3]\n" +#~ "..." +#~ msgstr "" +#~ "tarantool> s:upsert({1, 2, 3}, {{'=', 2, 200}})\n" +#~ "---\n" +#~ "...\n" +#~ "tarantool> -- Как можно увидеть, произошла вставка {1, 2, 3}, --\n" +#~ "tarantool> -- а операции обновления не применились. --\n" +#~ "s:select{}\n" +#~ "---\n" +#~ "- - [1, 2, 3]\n" +#~ "...\n" +#~ "tarantool> -- Еще одна операция upsert с тем же первичным ключом, --\n" +#~ "tarantool> -- но другими значениями прочих полей. --\n" +#~ "s:upsert({1, 20, 30}, {{'=', 2, 200}})\n" +#~ "---\n" +#~ "...\n" +#~ "tarantool> -- Старый кортеж был найден по первичному ключу {1}, --\n" +#~ "tarantool> -- и применились операции обновления. --\n" +#~ "tarantool> -- Новый кортеж игнорируется. --\n" +#~ "tarantool> s:select{}\n" +#~ "---\n" +#~ "- - [1, 200, 3]\n" +#~ "..." + +#~ msgid "If the old tuple was not found, then just the new tuple is inserted." +#~ msgstr "Если старый кортеж не найден, вставляется новый кортеж." + +#~ msgid "" +#~ "tarantool> s:insert{1, 1, 1}\n" +#~ "---\n" +#~ "- [1, 1, 1]\n" +#~ "...\n" +#~ "tarantool> s:insert{2, 2, 2}\n" +#~ "---\n" +#~ "- [2, 2, 2]\n" +#~ "...\n" +#~ "tarantool> -- This replace fails, because if the new tuple {1, 2, 0} replaces --\n" +#~ "tarantool> -- the old tuple by the primary key from 'pk' index {1, 1, 1}, --\n" +#~ "tarantool> -- this results in a duplicate unique secondary key in 'sk_uniq' index: --\n" +#~ "tarantool> -- key {2} is used both in the new tuple and in {2, 2, 2}. --\n" +#~ "tarantool> s:replace{1, 2, 0}\n" +#~ "---\n" +#~ "- error: Duplicate key exists in unique index 'sk_uniq' in space 'test'\n" +#~ "...\n" +#~ "tarantool> s:truncate()\n" +#~ "---\n" +#~ "..." +#~ msgstr "" +#~ "tarantool> s:insert{1, 1, 1}\n" +#~ "---\n" +#~ "- [1, 1, 1]\n" +#~ "...\n" +#~ "tarantool> s:insert{2, 2, 2}\n" +#~ "---\n" +#~ "- [2, 2, 2]\n" +#~ "...\n" +#~ "tarantool> -- Такая замена не сработает, поскольку замена новым кортежем {1, 2, 0} --\n" +#~ "tarantool> -- старого кортежа по первичному ключу из индекса 'pk' {1, 1, 1}, --\n" +#~ "tarantool> -- приведет к созданию дубликата уникального вторичного ключа в индексе 'sk_uniq': --\n" +#~ "tarantool> -- ключ {2} используется и в новом кортеже, и в {2, 2, 2}. --\n" +#~ "tarantool> s:replace{1, 2, 0}\n" +#~ "---\n" +#~ "- error: Duplicate key exists in unique index 'sk_uniq' in space 'test'\n" +#~ "...\n" +#~ "tarantool> s:truncate()\n" +#~ "---\n" +#~ "..." + +#~ msgid "" +#~ "``select`` works with any indexes (primary/secondary) and with any keys " +#~ "(unique/non-unique, full/partial)." +#~ msgstr "" +#~ "``select`` (выборка) работает с любыми индексами (первичными/вторичными) и с" +#~ " любыми ключами (уникальными/неуникальными, полными/компонентами)." + +#~ msgid "" +#~ "If a key is partial, then ``select`` searches by all keys, where the prefix " +#~ "matches the specified key part." +#~ msgstr "" +#~ "Если задан компонент ключа, ``select`` выполняет поиск всех ключей, префикс " +#~ "которых совпадает с указанным компонентом ключа." + +#~ msgid "" +#~ "tarantool> s:insert{1, 2, 3}\n" +#~ "---\n" +#~ "- [1, 2, 3]\n" +#~ "...\n" +#~ "tarantool> s:insert{4, 5, 6}\n" +#~ "---\n" +#~ "- [4, 5, 6]\n" +#~ "...\n" +#~ "tarantool> s:insert{7, 8, 9}\n" +#~ "---\n" +#~ "- [7, 8, 9]\n" +#~ "...\n" +#~ "tarantool> s:insert{10, 11, 9}\n" +#~ "---\n" +#~ "- [10, 11, 9]\n" +#~ "...\n" +#~ "tarantool> s:select{1}\n" +#~ "---\n" +#~ "- - [1, 2, 3]\n" +#~ "...\n" +#~ "tarantool> s:select{}\n" +#~ "---\n" +#~ "- - [1, 2, 3]\n" +#~ " - [4, 5, 6]\n" +#~ " - [7, 8, 9]\n" +#~ " - [10, 11, 9]\n" +#~ "...\n" +#~ "tarantool> s.index.pk:select{4}\n" +#~ "---\n" +#~ "- - [4, 5, 6]\n" +#~ "...\n" +#~ "tarantool> s.index.sk_uniq:select{8}\n" +#~ "---\n" +#~ "- - [7, 8, 9]\n" +#~ "...\n" +#~ "tarantool> s.index.sk_non_uniq:select{9}\n" +#~ "---\n" +#~ "- - [7, 8, 9]\n" +#~ " - [10, 11, 9]\n" +#~ "..." +#~ msgstr "" +#~ "tarantool> s:insert{1, 2, 3}\n" +#~ "---\n" +#~ "- [1, 2, 3]\n" +#~ "...\n" +#~ "tarantool> s:insert{4, 5, 6}\n" +#~ "---\n" +#~ "- [4, 5, 6]\n" +#~ "...\n" +#~ "tarantool> s:insert{7, 8, 9}\n" +#~ "---\n" +#~ "- [7, 8, 9]\n" +#~ "...\n" +#~ "tarantool> s:insert{10, 11, 9}\n" +#~ "---\n" +#~ "- [10, 11, 9]\n" +#~ "...\n" +#~ "tarantool> s:select{1}\n" +#~ "---\n" +#~ "- - [1, 2, 3]\n" +#~ "...\n" +#~ "tarantool> s:select{}\n" +#~ "---\n" +#~ "- - [1, 2, 3]\n" +#~ " - [4, 5, 6]\n" +#~ " - [7, 8, 9]\n" +#~ " - [10, 11, 9]\n" +#~ "...\n" +#~ "tarantool> s.index.pk:select{4}\n" +#~ "---\n" +#~ "- - [4, 5, 6]\n" +#~ "...\n" +#~ "tarantool> s.index.sk_uniq:select{8}\n" +#~ "---\n" +#~ "- - [7, 8, 9]\n" +#~ "...\n" +#~ "tarantool> s.index.sk_non_uniq:select{9}\n" +#~ "---\n" +#~ "- - [7, 8, 9]\n" +#~ " - [10, 11, 9]\n" +#~ "..." diff --git a/locale/ru/LC_MESSAGES/how-to/db/index.po b/locale/ru/LC_MESSAGES/how-to/db/index.po new file mode 100644 index 0000000000..e4c41e6d03 --- /dev/null +++ b/locale/ru/LC_MESSAGES/how-to/db/index.po @@ -0,0 +1,7 @@ + +msgid "Defining and manipulating data" +msgstr "" + +msgid "" +"This section contains guides on performing data operations in Tarantool." +msgstr "" diff --git a/locale/ru/LC_MESSAGES/how-to/db/indexes.po b/locale/ru/LC_MESSAGES/how-to/db/indexes.po index 33619cc9a1..570b39df54 100644 --- a/locale/ru/LC_MESSAGES/how-to/db/indexes.po +++ b/locale/ru/LC_MESSAGES/how-to/db/indexes.po @@ -1,56 +1,8 @@ -msgid "Indexes" +#, fuzzy +msgid "Using indexes" msgstr "Индексы" -msgid "" -"An **index** is a special data structure that stores a group of key values " -"and pointers. It is used for efficient manipulations with data." -msgstr "" -"**Индекс** — это специальная структура данных, которая хранит группу " -"ключевых значений и указателей. Индекс используется для эффективного " -"управления данными." - -msgid "" -"As with spaces, you should specify the index **name**, and let Tarantool " -"come up with a unique **numeric identifier** (\"index id\")." -msgstr "" -"Как и для спейсов, индексам следует указать **имена**, а Tarantool определит" -" уникальный **числовой идентификатор** (\"ID индекса\")." - -msgid "" -"An index may be **multi-part**, that is, you can declare that an index key " -"value is composed of two or more fields in the tuple, in any order. For " -"example, for an ordinary TREE index, the maximum number of parts is 255." -msgstr "" -"Индекс может быть **составным** (multi-part), то есть можно объявить, что " -"ключ индекса состоит из двух или более полей в кортеже в любом порядке. " -"Например, для обычного TREE-индекса максимальное количество частей равно " -"255." - -msgid "" -"An index may be **unique**, that is, you can declare that it would be " -"illegal to have the same key value twice." -msgstr "" -"Индекс может быть **уникальным**, то есть можно объявить, что недопустимо " -"дважды задавать одно значение ключа." - -msgid "" -"The first index defined on a space is called the **primary key index**, and " -"it must be unique. All other indexes are called **secondary indexes**, and " -"they may be non-unique." -msgstr "" -"Первый индекс, определенный для спейса, называется **первичный индекс** " -"(primary key). Он должен быть уникальным. Все остальные индексы называются " -"**вторичными индексами** (secondary), они могут строиться по неуникальным " -"значениям." - -msgid "" -"Indexes have certain limitations. See details on page :doc:`Limitations " -"`." -msgstr "" -"На индексы распространяются определенные ограничения. Более подробную " -"информацию см. на странице :doc:`Ограничения `." - msgid "Creating an index" msgstr "Создание индекса" @@ -113,10 +65,11 @@ msgstr "" "кортежи. Осторожно! Если вызвать ``select()`` без аргументов в огромном " "спейсе, ваш экземпляр зависнет." +#, fuzzy msgid "" "An index definition may also include identifiers of tuple fields and their " "expected **types**. See allowed indexed field types in section :ref:`Details" -" about indexed field types `:" +" about indexed field types `:" msgstr "" "Определение индекса может также содержать идентификаторы полей кортежа и их " "предполагаемые **типы**. См. допустимые типы полей в разделе :ref:`Описание " @@ -163,23 +116,23 @@ msgstr "" "данных меняет данные в кортеже, то изменятся и ключи индекса для данного " "кортежа." -msgid "" -"Create a sample space named ``bands``:" -msgstr "" -"Для примера создадим спейс с именем ``bands``:" +msgid "Create a sample space named ``bands``:" +msgstr "Для примера создадим спейс с именем ``bands``:" -msgid "tarantool> my_space = box.schema.space.create('tester')" +#, fuzzy +msgid "bands = box.schema.space.create('bands')\n" msgstr "tarantool> my_space = box.schema.space.create('tester')" msgid "Format the created space by specifying field names and types:" msgstr "Отформатируем созданный спейс, указав имена и типы полей:" +#, fuzzy msgid "" -"tarantool> my_space:format({\n" -" > {name = 'id', type = 'unsigned'},\n" -" > {name = 'band_name', type = 'string'},\n" -" > {name = 'year', type = 'unsigned'},\n" -" > {name = 'rate', type = 'unsigned', is_nullable = true}})" +"box.space.bands:format({\n" +" { name = 'id', type = 'unsigned' },\n" +" { name = 'band_name', type = 'string' },\n" +" { name = 'year', type = 'unsigned' }\n" +"})\n" msgstr "" "tarantool> my_space:format({\n" " > {name = 'id', type = 'unsigned'},\n" @@ -190,113 +143,49 @@ msgstr "" msgid "Create the **primary** index (named ``primary``):" msgstr "Создадим **первичный** индекс с именем ``primary``:" -msgid "" -"tarantool> my_space:create_index('primary', {\n" -" > type = 'tree',\n" -" > parts = {'id'}\n" -" > })" +msgid "box.space.bands:create_index('primary', { parts = { 'id' } })\n" msgstr "" -"tarantool> my_space:create_index('primary', {\n" -" > type = 'tree',\n" -" > parts = {'id'}\n" -" > })" -msgid "This is a primary index based on the ``id`` field of each tuple." +#, fuzzy +msgid "This index is based on the ``id`` field of each tuple." msgstr "Это первичный индекс по полю ``id`` в каждом кортеже." msgid "Insert some :ref:`tuples ` into the space:" msgstr "Вставим несколько :ref:`кортежей ` в спейс:" msgid "" -"tarantool> my_space:insert{1, 'Roxette', 1986, 1}\n" -"tarantool> my_space:insert{2, 'Scorpions', 2015, 4}\n" -"tarantool> my_space:insert{3, 'Ace of Base', 1993}\n" -"tarantool> my_space:insert{4, 'Roxette', 2016, 3}" +"box.space.bands:insert { 1, 'Roxette', 1986 }\n" +"box.space.bands:insert { 2, 'Scorpions', 1965 }\n" +"box.space.bands:insert { 3, 'Ace of Base', 1987 }\n" +"box.space.bands:insert { 4, 'The Beatles', 1960 }\n" +"box.space.bands:insert { 5, 'Pink Floyd', 1965 }\n" +"box.space.bands:insert { 6, 'The Rolling Stones', 1962 }\n" +"box.space.bands:insert { 7, 'The Doors', 1965 }\n" +"box.space.bands:insert { 8, 'Nirvana', 1987 }\n" +"box.space.bands:insert { 9, 'Led Zeppelin', 1968 }\n" +"box.space.bands:insert { 10, 'Queen', 1970 }\n" msgstr "" -"tarantool> my_space:insert{1, 'Roxette', 1986, 1}\n" -"tarantool> my_space:insert{2, 'Scorpions', 2015, 4}\n" -"tarantool> my_space:insert{3, 'Ace of Base', 1993}\n" -"tarantool> my_space:insert{4, 'Roxette', 2016, 3}" -msgid "Create a **secondary index**:" +#, fuzzy +msgid "Create **secondary indexes**:" msgstr "Создадим **вторичный индекс**:" msgid "" -"tarantool> box.space.tester:create_index('secondary', {parts = {{field=3, type='unsigned'}}})\n" -"---\n" -"- unique: true\n" -" parts:\n" -" - type: unsigned\n" -" is_nullable: false\n" -" fieldno: 3\n" -" id: 2\n" -" space_id: 512\n" -" type: TREE\n" -" name: secondary\n" -"..." +"-- Create a unique secondary index --\n" +"box.space.bands:create_index('band', { parts = { 'band_name' } })\n" +"\n" +"-- Create a non-unique secondary index --\n" +"box.space.bands:create_index('year', { parts = { { 'year' } }, unique = false })\n" msgstr "" -"tarantool> box.space.tester:create_index('secondary', {parts = {{field=3, type='unsigned'}}})\n" -"---\n" -"- unique: true\n" -" parts:\n" -" - type: unsigned\n" -" is_nullable: false\n" -" fieldno: 3\n" -" id: 2\n" -" space_id: 512\n" -" type: TREE\n" -" name: secondary\n" -"..." - -msgid "Create a **multi-part index** with three parts:" + +#, fuzzy +msgid "Create a **multi-part index** with two parts:" msgstr "Создадим **составной индекс** (multi-part) из трех частей:" msgid "" -"tarantool> box.space.tester:create_index('thrine', {parts = {\n" -" > {field = 2, type = 'string'},\n" -" > {field = 3, type = 'unsigned'},\n" -" > {field = 4, type = 'unsigned'}\n" -" > }})\n" -"---\n" -"- unique: true\n" -" parts:\n" -" - type: string\n" -" is_nullable: false\n" -" fieldno: 2\n" -" - type: unsigned\n" -" is_nullable: false\n" -" fieldno: 3\n" -" - type: unsigned\n" -" is_nullable: true\n" -" fieldno: 4\n" -" id: 6\n" -" space_id: 513\n" -" type: TREE\n" -" name: thrine\n" -"..." +"box.space.bands:create_index('year_band', { parts = { { 'year' }, { " +"'band_name' } } })\n" msgstr "" -"tarantool> box.space.tester:create_index('thrine', {parts = {\n" -" > {field = 2, type = 'string'},\n" -" > {field = 3, type = 'unsigned'},\n" -" > {field = 4, type = 'unsigned'}\n" -" > }})\n" -"---\n" -"- unique: true\n" -" parts:\n" -" - type: string\n" -" is_nullable: false\n" -" fieldno: 2\n" -" - type: unsigned\n" -" is_nullable: false\n" -" fieldno: 3\n" -" - type: unsigned\n" -" is_nullable: true\n" -" fieldno: 4\n" -" id: 6\n" -" space_id: 513\n" -" type: TREE\n" -" name: thrine\n" -"..." msgid "There are the following SELECT variations:" msgstr "Можно использовать такие варианты SELECT:" @@ -307,19 +196,16 @@ msgstr "" " сравнения**:" msgid "" -"tarantool> box.space.tester:select(1, {iterator = 'GT'})\n" +"-- Select maximum 3 tuples with the key value greater than 1965 --\n" +"select_greater = bands.index.year:select({ 1965 }, { iterator = 'GT', limit = 3 })\n" +"--[[\n" "---\n" -"- - [2, 'Scorpions', 2015, 4]\n" -" - [3, 'Ace of Base', 1993]\n" -" - [4, 'Roxette', 2016, 3]\n" -"..." +"- - [9, 'Led Zeppelin', 1968]\n" +" - [10, 'Queen', 1970]\n" +" - [1, 'Roxette', 1986]\n" +"...\n" +"--]]\n" msgstr "" -"tarantool> box.space.tester:select(1, {iterator = 'GT'})\n" -"---\n" -"- - [2, 'Scorpions', 2015, 4]\n" -" - [3, 'Ace of Base', 1993]\n" -" - [4, 'Roxette', 2016, 3]\n" -"..." msgid "The :ref:`comparison operators ` are:" msgstr "Есть такие :ref:`операторы сравнения `:" @@ -333,10 +219,12 @@ msgstr "``LE`` — \"меньше или равно\"" msgid "``GT`` for \"greater\"" msgstr "``GT`` — \"больше\"" -msgid "``GE`` for \"greater than or equal\" ." +#, fuzzy +msgid "``GE`` for \"greater than or equal\"" msgstr "``GE`` — \"больше или равно\"" -msgid "``EQ`` for \"equal\"," +#, fuzzy +msgid "``EQ`` for \"equal\"" msgstr "``EQ`` — \"равно\"," msgid "``REQ`` for \"reversed equal\"" @@ -373,23 +261,14 @@ msgid "The search can use a **secondary index**." msgstr "Для поиска можно использовать **вторичный индекс**." msgid "" -"For a primary-key search, it is optional to specify an index name as was " -"demonstrated above. For a secondary-key search, it is mandatory." -msgstr "" -"При поиске по первичному ключу имя индекса можно не указывать, как показано " -"выше. При поиске же по вторичному ключу имя индекса нужно указать " -"обязательно." - -msgid "" -"tarantool> box.space.tester.index.secondary:select({1993})\n" +"-- Select a tuple by the specified secondary key value --\n" +"select_secondary = bands.index.band:select { 'The Doors' }\n" +"--[[\n" "---\n" -"- - [3, 'Ace of Base', 1993]\n" -"..." +"- - [7, 'The Doors', 1965]\n" +"...\n" +"--]]\n" msgstr "" -"tarantool> box.space.tester.index.secondary:select({1993})\n" -"---\n" -"- - [3, 'Ace of Base', 1993]\n" -"..." msgid "" "**Partial key search:** The search may be for some key parts starting with " @@ -401,47 +280,29 @@ msgstr "" "только в TREE-индексах." msgid "" -"tarantool> box.space.tester.index.thrine:select({'Scorpions', 2015})\n" +"-- Select tuples by the specified partial key value --\n" +"select_multipart_partial = bands.index.year_band:select { 1965 }\n" +"--[[\n" "---\n" -"- - [2, 'Scorpions', 2015, 4]\n" -"..." +"- - [5, 'Pink Floyd', 1965]\n" +" - [2, 'Scorpions', 1965]\n" +" - [7, 'The Doors', 1965]\n" +"...\n" +"--]]\n" msgstr "" -"tarantool> box.space.tester.index.thrine:select({'Scorpions', 2015})\n" -"---\n" -"- - [2, 'Scorpions', 2015, 4]\n" -"..." msgid "The search can be for all fields, using a table as the value:" msgstr "Поиск можно производить по всем полям через запись в виде таблицы:" msgid "" -"tarantool> box.space.tester.index.thrine:select({'Roxette', 2016, 3})\n" -"---\n" -"- - [4, 'Roxette', 2016, 3]\n" -"..." -msgstr "" -"tarantool> box.space.tester.index.thrine:select({'Roxette', 2016, 3})\n" +"-- Select a tuple by the specified multi-part secondary key value --\n" +"select_multipart = bands.index.year_band:select { 1960, 'The Beatles' }\n" +"--[[\n" "---\n" -"- - [4, 'Roxette', 2016, 3]\n" -"..." - -msgid "or the search can be for one field, using a table or a scalar:" +"- - [4, 'The Beatles', 1960]\n" +"...\n" +"--]]\n" msgstr "" -"либо же по одному полю, в этом случае используется таблица или скалярное " -"значение:" - -msgid "" -"tarantool> box.space.tester.index.thrine:select({'Roxette'})\n" -"---\n" -"- - [1, 'Roxette', 1986, 5]\n" -" - [4, 'Roxette', 2016, 3]\n" -"..." -msgstr "" -"tarantool> box.space.tester.index.thrine:select({'Roxette'})\n" -"---\n" -"- - [1, 'Roxette', 1986, 5]\n" -" - [4, 'Roxette', 2016, 3]\n" -"..." msgid "" "You can also add, drop, or alter the definitions at runtime, with some " @@ -452,3 +313,222 @@ msgstr "" " во время исполнения кода. Более подробную информацию об операциях с " "индексами см. в справочнике по :doc:`вложенному модулю box.index " "`." + +#~ msgid "" +#~ "An **index** is a special data structure that stores a group of key values " +#~ "and pointers. It is used for efficient manipulations with data." +#~ msgstr "" +#~ "**Индекс** — это специальная структура данных, которая хранит группу " +#~ "ключевых значений и указателей. Индекс используется для эффективного " +#~ "управления данными." + +#~ msgid "" +#~ "As with spaces, you should specify the index **name**, and let Tarantool " +#~ "come up with a unique **numeric identifier** (\"index id\")." +#~ msgstr "" +#~ "Как и для спейсов, индексам следует указать **имена**, а Tarantool определит" +#~ " уникальный **числовой идентификатор** (\"ID индекса\")." + +#~ msgid "" +#~ "An index may be **multi-part**, that is, you can declare that an index key " +#~ "value is composed of two or more fields in the tuple, in any order. For " +#~ "example, for an ordinary TREE index, the maximum number of parts is 255." +#~ msgstr "" +#~ "Индекс может быть **составным** (multi-part), то есть можно объявить, что " +#~ "ключ индекса состоит из двух или более полей в кортеже в любом порядке. " +#~ "Например, для обычного TREE-индекса максимальное количество частей равно " +#~ "255." + +#~ msgid "" +#~ "An index may be **unique**, that is, you can declare that it would be " +#~ "illegal to have the same key value twice." +#~ msgstr "" +#~ "Индекс может быть **уникальным**, то есть можно объявить, что недопустимо " +#~ "дважды задавать одно значение ключа." + +#~ msgid "" +#~ "The first index defined on a space is called the **primary key index**, and " +#~ "it must be unique. All other indexes are called **secondary indexes**, and " +#~ "they may be non-unique." +#~ msgstr "" +#~ "Первый индекс, определенный для спейса, называется **первичный индекс** " +#~ "(primary key). Он должен быть уникальным. Все остальные индексы называются " +#~ "**вторичными индексами** (secondary), они могут строиться по неуникальным " +#~ "значениям." + +#~ msgid "" +#~ "Indexes have certain limitations. See details on page :doc:`Limitations " +#~ "`." +#~ msgstr "" +#~ "На индексы распространяются определенные ограничения. Более подробную " +#~ "информацию см. на странице :doc:`Ограничения `." + +#~ msgid "" +#~ "tarantool> my_space:create_index('primary', {\n" +#~ " > type = 'tree',\n" +#~ " > parts = {'id'}\n" +#~ " > })" +#~ msgstr "" +#~ "tarantool> my_space:create_index('primary', {\n" +#~ " > type = 'tree',\n" +#~ " > parts = {'id'}\n" +#~ " > })" + +#~ msgid "" +#~ "tarantool> my_space:insert{1, 'Roxette', 1986, 1}\n" +#~ "tarantool> my_space:insert{2, 'Scorpions', 2015, 4}\n" +#~ "tarantool> my_space:insert{3, 'Ace of Base', 1993}\n" +#~ "tarantool> my_space:insert{4, 'Roxette', 2016, 3}" +#~ msgstr "" +#~ "tarantool> my_space:insert{1, 'Roxette', 1986, 1}\n" +#~ "tarantool> my_space:insert{2, 'Scorpions', 2015, 4}\n" +#~ "tarantool> my_space:insert{3, 'Ace of Base', 1993}\n" +#~ "tarantool> my_space:insert{4, 'Roxette', 2016, 3}" + +#~ msgid "" +#~ "tarantool> box.space.tester:create_index('secondary', {parts = {{field=3, type='unsigned'}}})\n" +#~ "---\n" +#~ "- unique: true\n" +#~ " parts:\n" +#~ " - type: unsigned\n" +#~ " is_nullable: false\n" +#~ " fieldno: 3\n" +#~ " id: 2\n" +#~ " space_id: 512\n" +#~ " type: TREE\n" +#~ " name: secondary\n" +#~ "..." +#~ msgstr "" +#~ "tarantool> box.space.tester:create_index('secondary', {parts = {{field=3, type='unsigned'}}})\n" +#~ "---\n" +#~ "- unique: true\n" +#~ " parts:\n" +#~ " - type: unsigned\n" +#~ " is_nullable: false\n" +#~ " fieldno: 3\n" +#~ " id: 2\n" +#~ " space_id: 512\n" +#~ " type: TREE\n" +#~ " name: secondary\n" +#~ "..." + +#~ msgid "" +#~ "tarantool> box.space.tester:create_index('thrine', {parts = {\n" +#~ " > {field = 2, type = 'string'},\n" +#~ " > {field = 3, type = 'unsigned'},\n" +#~ " > {field = 4, type = 'unsigned'}\n" +#~ " > }})\n" +#~ "---\n" +#~ "- unique: true\n" +#~ " parts:\n" +#~ " - type: string\n" +#~ " is_nullable: false\n" +#~ " fieldno: 2\n" +#~ " - type: unsigned\n" +#~ " is_nullable: false\n" +#~ " fieldno: 3\n" +#~ " - type: unsigned\n" +#~ " is_nullable: true\n" +#~ " fieldno: 4\n" +#~ " id: 6\n" +#~ " space_id: 513\n" +#~ " type: TREE\n" +#~ " name: thrine\n" +#~ "..." +#~ msgstr "" +#~ "tarantool> box.space.tester:create_index('thrine', {parts = {\n" +#~ " > {field = 2, type = 'string'},\n" +#~ " > {field = 3, type = 'unsigned'},\n" +#~ " > {field = 4, type = 'unsigned'}\n" +#~ " > }})\n" +#~ "---\n" +#~ "- unique: true\n" +#~ " parts:\n" +#~ " - type: string\n" +#~ " is_nullable: false\n" +#~ " fieldno: 2\n" +#~ " - type: unsigned\n" +#~ " is_nullable: false\n" +#~ " fieldno: 3\n" +#~ " - type: unsigned\n" +#~ " is_nullable: true\n" +#~ " fieldno: 4\n" +#~ " id: 6\n" +#~ " space_id: 513\n" +#~ " type: TREE\n" +#~ " name: thrine\n" +#~ "..." + +#~ msgid "" +#~ "tarantool> box.space.tester:select(1, {iterator = 'GT'})\n" +#~ "---\n" +#~ "- - [2, 'Scorpions', 2015, 4]\n" +#~ " - [3, 'Ace of Base', 1993]\n" +#~ " - [4, 'Roxette', 2016, 3]\n" +#~ "..." +#~ msgstr "" +#~ "tarantool> box.space.tester:select(1, {iterator = 'GT'})\n" +#~ "---\n" +#~ "- - [2, 'Scorpions', 2015, 4]\n" +#~ " - [3, 'Ace of Base', 1993]\n" +#~ " - [4, 'Roxette', 2016, 3]\n" +#~ "..." + +#~ msgid "" +#~ "For a primary-key search, it is optional to specify an index name as was " +#~ "demonstrated above. For a secondary-key search, it is mandatory." +#~ msgstr "" +#~ "При поиске по первичному ключу имя индекса можно не указывать, как показано " +#~ "выше. При поиске же по вторичному ключу имя индекса нужно указать " +#~ "обязательно." + +#~ msgid "" +#~ "tarantool> box.space.tester.index.secondary:select({1993})\n" +#~ "---\n" +#~ "- - [3, 'Ace of Base', 1993]\n" +#~ "..." +#~ msgstr "" +#~ "tarantool> box.space.tester.index.secondary:select({1993})\n" +#~ "---\n" +#~ "- - [3, 'Ace of Base', 1993]\n" +#~ "..." + +#~ msgid "" +#~ "tarantool> box.space.tester.index.thrine:select({'Scorpions', 2015})\n" +#~ "---\n" +#~ "- - [2, 'Scorpions', 2015, 4]\n" +#~ "..." +#~ msgstr "" +#~ "tarantool> box.space.tester.index.thrine:select({'Scorpions', 2015})\n" +#~ "---\n" +#~ "- - [2, 'Scorpions', 2015, 4]\n" +#~ "..." + +#~ msgid "" +#~ "tarantool> box.space.tester.index.thrine:select({'Roxette', 2016, 3})\n" +#~ "---\n" +#~ "- - [4, 'Roxette', 2016, 3]\n" +#~ "..." +#~ msgstr "" +#~ "tarantool> box.space.tester.index.thrine:select({'Roxette', 2016, 3})\n" +#~ "---\n" +#~ "- - [4, 'Roxette', 2016, 3]\n" +#~ "..." + +#~ msgid "or the search can be for one field, using a table or a scalar:" +#~ msgstr "" +#~ "либо же по одному полю, в этом случае используется таблица или скалярное " +#~ "значение:" + +#~ msgid "" +#~ "tarantool> box.space.tester.index.thrine:select({'Roxette'})\n" +#~ "---\n" +#~ "- - [1, 'Roxette', 1986, 5]\n" +#~ " - [4, 'Roxette', 2016, 3]\n" +#~ "..." +#~ msgstr "" +#~ "tarantool> box.space.tester.index.thrine:select({'Roxette'})\n" +#~ "---\n" +#~ "- - [1, 'Roxette', 1986, 5]\n" +#~ " - [4, 'Roxette', 2016, 3]\n" +#~ "..." diff --git a/locale/ru/LC_MESSAGES/how-to/db/sequences.po b/locale/ru/LC_MESSAGES/how-to/db/sequences.po new file mode 100644 index 0000000000..354d741db6 --- /dev/null +++ b/locale/ru/LC_MESSAGES/how-to/db/sequences.po @@ -0,0 +1,222 @@ + +msgid "Using sequences" +msgstr "" + +msgid "A **sequence** is a generator of ordered integer values." +msgstr "" + +msgid "" +"As with spaces and indexes, you should specify the sequence **name** and let" +" Tarantool generate a unique numeric identifier (sequence ID)." +msgstr "" + +msgid "" +"As well, you can specify several options when creating a new sequence. The " +"options determine the values that are generated whenever the sequence is " +"used." +msgstr "" + +msgid "Options for box.schema.sequence.create()" +msgstr "" + +msgid "Option name" +msgstr "" + +msgid "Type and meaning" +msgstr "" + +msgid "Default" +msgstr "" + +msgid "Examples" +msgstr "" + +msgid "``start``" +msgstr "" + +msgid "Integer. The value to generate the first time a sequence is used" +msgstr "" + +msgid "1" +msgstr "" + +msgid "``start=0``" +msgstr "" + +msgid "``min``" +msgstr "" + +msgid "Integer. Values smaller than this cannot be generated" +msgstr "" + +msgid "``min=-1000``" +msgstr "" + +msgid "``max``" +msgstr "" + +msgid "Integer. Values larger than this cannot be generated" +msgstr "" + +msgid "9223372036854775807" +msgstr "" + +msgid "``max=0``" +msgstr "" + +msgid "``cycle``" +msgstr "" + +msgid "Boolean. Whether to start again when values cannot be generated" +msgstr "" + +msgid "false" +msgstr "" + +msgid "``cycle=true``" +msgstr "" + +msgid "``cache``" +msgstr "" + +msgid "Integer. The number of values to store in a cache" +msgstr "" + +msgid "0" +msgstr "" + +msgid "``cache=0``" +msgstr "" + +msgid "``step``" +msgstr "" + +msgid "" +"Integer. What to add to the previous generated value, when generating a new " +"value" +msgstr "" + +msgid "``step=-1``" +msgstr "" + +msgid "``if_not_exists``" +msgstr "" + +msgid "" +"Boolean. If this is true and a sequence with this name exists already, " +"ignore other options and use the existing values" +msgstr "" + +msgid "``false``" +msgstr "" + +msgid "``if_not_exists=true``" +msgstr "" + +msgid "" +"Once a sequence exists, it can be altered, dropped, reset, forced to " +"generate the next value, or associated with an index." +msgstr "" + +msgid "Associating a sequence with an index" +msgstr "" + +msgid "First, create a sequence:" +msgstr "" + +msgid "" +"-- Create a sequence --\n" +"box.schema.sequence.create('id_seq',{min=1000, start=1000})\n" +"--[[\n" +"---\n" +"- step: 1\n" +" id: 1\n" +" min: 1000\n" +" cache: 0\n" +" uid: 1\n" +" cycle: false\n" +" name: id_seq\n" +" start: 1000\n" +" max: 9223372036854775807\n" +"...\n" +"--]]\n" +msgstr "" + +msgid "" +"The result shows that the new sequence has all default values, except for " +"the two that were specified, ``min`` and ``start``." +msgstr "" + +msgid "" +"Get the next value from the sequence by calling the ``next()`` function:" +msgstr "" + +msgid "" +"-- Get the next item --\n" +"box.sequence.id_seq:next()\n" +"--[[\n" +"---\n" +"- 1000\n" +"...\n" +"--]]\n" +msgstr "" + +msgid "" +"The result is the same as the start value. The next call increases the value" +" by one (the default sequence step)." +msgstr "" + +msgid "" +"Create a space and specify that its primary key should be generated from the" +" sequence:" +msgstr "" + +msgid "" +"-- Create a space --\n" +"box.schema.space.create('customers')\n" +"\n" +"-- Create an index that uses the sequence --\n" +"box.space.customers:create_index('primary',{ sequence = 'id_seq' })\n" +"--[[\n" +"---\n" +"- parts:\n" +" - type: unsigned\n" +" is_nullable: false\n" +" fieldno: 1\n" +" sequence_id: 1\n" +" id: 0\n" +" space_id: 513\n" +" unique: true\n" +" hint: true\n" +" type: TREE\n" +" name: primary\n" +" sequence_fieldno: 1\n" +"...\n" +"--]]\n" +msgstr "" + +msgid "Insert a tuple without specifying a value for the primary key:" +msgstr "" + +msgid "" +"\n" +"-- Insert a tuple without the primary key value --\n" +"box.space.customers:insert{ nil, 'Adams' }\n" +"--[[\n" +"---\n" +"- [1001, 'Adams']\n" +"...\n" +"--]]\n" +msgstr "" + +msgid "" +"The result is a new tuple where the first field is assigned the next value " +"from the sequence. This arrangement, where the system automatically " +"generates the values for a primary key, is sometimes called \"auto-" +"incrementing\" or \"identity\"." +msgstr "" + +msgid "" +"For syntax and implementation details, see the reference for " +":doc:`box.schema.sequence `." +msgstr "" diff --git a/locale/ru/LC_MESSAGES/how-to/getting_started_cartridge.po b/locale/ru/LC_MESSAGES/how-to/getting_started_cartridge.po index 15bf4ee3d9..dfc8725782 100644 --- a/locale/ru/LC_MESSAGES/how-to/getting_started_cartridge.po +++ b/locale/ru/LC_MESSAGES/how-to/getting_started_cartridge.po @@ -6,9 +6,11 @@ msgid "Here we'll walk you through developing a simple cluster application." msgstr "Здесь мы показываем, как сделать простое кластерное приложение." msgid "" -"First, :doc:`set up the development environment `." +"First, :doc:`set up the development environment " +"`." msgstr "" -"Первым делом :doc:`настройте среду разработки `." +"Первым делом :doc:`настройте среду разработки " +"`." msgid "Next, create an application named ``myapp``. Run:" msgstr "Затем создайте приложение с именем ``myapp``. Выполните:" @@ -38,25 +40,25 @@ msgstr "" "$ cartridge start" msgid "" -"This will build the application locally, start 5 instances of Tarantool " -"and a :ref:`stateboard ` (state provider), and" -" run the application as it is, with no business logic yet." +"This will build the application locally, start 5 instances of Tarantool and " +"a :ref:`stateboard ` (state provider), and run " +"the application as it is, with no business logic yet." msgstr "" -"Эта команда собирает приложение локально, стартует 5 экземпляров Tarantool и " -":ref:`stateboard ` (провайдер состояния), а затем " -" запускает приложение в том виде, как оно было создано -- без какой-либо " -"интересной бизнес-логики." +"Эта команда собирает приложение локально, стартует 5 экземпляров Tarantool и" +" :ref:`stateboard ` (провайдер состояния), а " +"затем запускает приложение в том виде, как оно было создано -- без какой-" +"либо интересной бизнес-логики." msgid "" -"Why 5 instances and a stateboard? See the ``instances.yml`` file in your application " -"directory. It contains the :ref:`configuration ` of " -"all instances that you can use in the cluster. By default, it defines " -"configuration for 5 Tarantool instances." +"Why 5 instances and a stateboard? See the ``instances.yml`` file in your " +"application directory. It contains the :ref:`configuration ` of all instances that you can use in the cluster. By default, " +"it defines configuration for 5 Tarantool instances." msgstr "" -"Откуда взялись 5 экземпляров и stateboard? Загляните внутрь файла ``instances.yml``.Там " -"задается :ref:`конфигурация ` всех экземпляров, " -"которые вы можете настроить внутри вашего кластера. По умолчанию там задана" -" конфигурация 5 экземпляров." +"Откуда взялись 5 экземпляров и stateboard? Загляните внутрь файла " +"``instances.yml``.Там задается :ref:`конфигурация ` " +"всех экземпляров, которые вы можете настроить внутри вашего кластера. По " +"умолчанию там задана конфигурация 5 экземпляров." msgid "" "myapp.router:\n" @@ -229,13 +231,13 @@ msgstr "" msgid "" "Next, amend ``role_name`` in the \"return\" section of the ``hello-" -"world.lua`` file. You'll see this section at the bottom of the file. " -"This text will be displayed as a label for your role in " -"the cluster management web interface." +"world.lua`` file. You'll see this section at the bottom of the file. This " +"text will be displayed as a label for your role in the cluster management " +"web interface." msgstr "" "Далее изменим значение параметра ``role_name`` в \"return\"-блоке файла " -"``hello-world.lua``. Этот блок находится в конце файла. Введенное имя роли вы увидите в " -"веб-интерфейсе для управления кластером." +"``hello-world.lua``. Этот блок находится в конце файла. Введенное имя роли " +"вы увидите в веб-интерфейсе для управления кластером." msgid "" " return {\n" @@ -256,10 +258,12 @@ msgstr "" msgid "" "The final thing to do before you can run the application is to add your role" -" to the list of available cluster roles in the ``init.lua`` file in the project root directory." +" to the list of available cluster roles in the ``init.lua`` file in the " +"project root directory." msgstr "" "Последнее, что осталось сделать — это добавить вашу роль в список доступных " -"ролей кластера в файле ``init.lua``, который находится в корневой директории проекта (``myapp``)." +"ролей кластера в файле ``init.lua``, который находится в корневой директории" +" проекта (``myapp``)." msgid "" " local ok, err = cartridge.cfg({\n" @@ -295,8 +299,8 @@ msgstr "" "до файла роли (``app/roles/hello-world.lua``)." msgid "" -"Great! Your role is ready. Re-build the application and re-start the cluster " -"now:" +"Great! Your role is ready. Re-build the application and re-start the cluster" +" now:" msgstr "" "Отлично! Роль готова. Теперь заново соберите и запустите ваше приложение:" @@ -355,11 +359,11 @@ msgstr "" "set\"." msgid "" -"Click :guilabel:`Create replica set` and see the newly-created replica set in the " -"web interface." +"Click :guilabel:`Create replica set` and see the newly-created replica set " +"in the web interface." msgstr "" -"Нажмите кнопку :guilabel:`Create replica set`. Информация о вашем наборе реплик " -"появится в веб-интерфейсе." +"Нажмите кнопку :guilabel:`Create replica set`. Информация о вашем наборе " +"реплик появится в веб-интерфейсе." msgid "" "Your custom role got enabled. Find the \"Hello world!\" message in console, " @@ -378,30 +382,33 @@ msgid "Everything is up and running! What's next?" msgstr "Все работает! Что же дальше?" msgid "" -"Follow the :ref:`administrator's guide ` to set up the rest of the " -"cluster and try some cool cluster management features -- for example, enable failover." +"Follow the :ref:`administrator's guide ` to set up the" +" rest of the cluster and try some cool cluster management features -- for " +"example, enable failover." msgstr "" -"Загляните в :ref:`руководство администратора `, чтобы настроить " -"оставшиеся наборы реплик и опробовать разные кластерные возможности -- " -"например, включить восстановление после сбоев." +"Загляните в :ref:`руководство администратора `, чтобы " +"настроить оставшиеся наборы реплик и опробовать разные кластерные " +"возможности -- например, включить восстановление после сбоев." msgid "" -"Check out the Cartridge :doc:`developer's guide `" -" and implement more sophisticated business logic for your role." +"Check out the Cartridge :doc:`developer's guide " +"` and implement more sophisticated business " +"logic for your role." msgstr "" -"Посмотрите :doc:`руководство разработчика `" -" и реализуйте более сложную логику для вашей роли." +"Посмотрите :doc:`руководство разработчика ` и" +" реализуйте более сложную логику для вашей роли." msgid "" ":doc:`Pack ` your application " "for easy distribution. Choose what you like: a DEB or RPM package, a TGZ " -"archive, or a Docker image. " -"Archives and packages can be deployed with `ansible-cartridge `__." +"archive, or a Docker image. Archives and packages can be deployed with " +"`ansible-cartridge `__." msgstr "" ":doc:`Упакуйте ` ваше " "приложение для дальнейшего распространения. Вы можете выбрать любой из " -"поддерживаемых видов пакетов: DEB, RPM, архив TGZ или Docker-образ." -" Архивы и пакеты можно разворачивать с помощью `ansible-cartridge `__." +"поддерживаемых видов пакетов: DEB, RPM, архив TGZ или Docker-образ. Архивы и" +" пакеты можно разворачивать с помощью `ansible-cartridge " +"`__." msgid "Read the :doc:`Cartridge documentation `." msgstr "" diff --git a/locale/ru/LC_MESSAGES/how-to/getting_started_connectors.po b/locale/ru/LC_MESSAGES/how-to/getting_started_connectors.po index 2676600ad7..bb45f48211 100644 --- a/locale/ru/LC_MESSAGES/how-to/getting_started_connectors.po +++ b/locale/ru/LC_MESSAGES/how-to/getting_started_connectors.po @@ -3,14 +3,14 @@ msgid "Connecting from your favorite language" msgstr "Подключаемся к базе из разных языков программирования" msgid "" -"In the :ref:`previous sections `, you " -"have learned how to create a Tarantool database. Now let's see how to " -"connect to the database from different programming languages, such as " -"Python, PHP, Go, and C++, and execute typical requests for manipulating the " -"data (select, insert, delete, and so on)." +"In the :ref:`previous sections `, you have learned how " +"to create a Tarantool database. Now let's see how to connect to the database" +" from different programming languages, such as Python, PHP, Go, and C++, and" +" execute typical requests for manipulating the data (select, insert, delete," +" and so on)." msgstr "" -"В :ref:`предыдущих разделах ` вы " -"узнали, как создать базу данных Tarantool. Теперь давайте посмотрим, как " -"подключаться к базе данных из разных языков программирования, таких как " -"Python, PHP, Go и C++, и выполнять типовые запросы для работы с данными " -"(select, insert, delete и так далее)." +"В :ref:`предыдущих разделах ` вы узнали, как создать " +"базу данных Tarantool. Теперь давайте посмотрим, как подключаться к базе " +"данных из разных языков программирования, таких как Python, PHP, Go и C++, и" +" выполнять типовые запросы для работы с данными (select, insert, delete и " +"так далее)." diff --git a/locale/ru/LC_MESSAGES/how-to/getting_started_cxx.po b/locale/ru/LC_MESSAGES/how-to/getting_started_cxx.po new file mode 100644 index 0000000000..a88f7d0df5 --- /dev/null +++ b/locale/ru/LC_MESSAGES/how-to/getting_started_cxx.po @@ -0,0 +1,738 @@ + +msgid "Connecting to Tarantool from C++" +msgstr "" + +msgid "" +"To simplify the start of your working with the Tarantool C++ connector, we " +"will use the `example application " +"`_ from" +" the connector repository. We will go step by step through the application " +"code and explain what each part does." +msgstr "" + +msgid "The following main topics are discussed in this manual:" +msgstr "" + +msgid "Pre-requisites" +msgstr "" + +msgid "" +"To go through this Getting Started exercise, you need the following pre-" +"requisites to be done:" +msgstr "" + +msgid "" +":ref:`clone the connector source code and ensure having Tarantool and third-" +"party software `" +msgstr "" + +msgid ":ref:`start Tarantool and create a database `" +msgstr "" + +msgid ":ref:`set up access rights `." +msgstr "" + +msgid "Installation" +msgstr "" + +msgid "The Tarantool C++ connector is currently supported for Linux only." +msgstr "" + +msgid "" +"The connector itself is a header-only library, so, it doesn't require " +"installation and building as such. All you need is to clone the connector " +"source code and :ref:`embed ` it in your C++ project." +msgstr "" + +msgid "" +"Also, make sure you have other necessary software and Tarantool installed." +msgstr "" + +msgid "" +"Make sure you have the following third-party software. If you miss some of " +"the items, install them:" +msgstr "" + +msgid "" +"`Git `_, a " +"version control system" +msgstr "" + +msgid "" +"`unzip utility `_" +msgstr "" + +msgid "" +"`gcc compiler `_ complied with the `C++17 " +"standard `_" +msgstr "" + +msgid "`cmake and make tools `_." +msgstr "" + +msgid "If you don't have Tarantool on your OS, install it in one of the ways:" +msgstr "" + +msgid "" +"from a package--refer to `OS-specific instructions " +"`_" +msgstr "" + +msgid "" +"from the `source `_." +msgstr "" + +msgid "Clone the Tarantool C++ connector repository." +msgstr "" + +msgid "git clone git@github.com:tarantool/tntcxx.git" +msgstr "" + +msgid "Starting Tarantool and creating a database" +msgstr "" + +msgid "" +"Start Tarantool :ref:`locally ` or " +":ref:`in Docker ` and create a space with the " +"following schema and index:" +msgstr "" + +msgid "" +"box.cfg{listen = 3301}\n" +"t = box.schema.space.create('t')\n" +"t:format({\n" +" {name = 'id', type = 'unsigned'},\n" +" {name = 'a', type = 'string'},\n" +" {name = 'b', type = 'number'}\n" +" })\n" +"t:create_index('primary', {\n" +" type = 'hash',\n" +" parts = {'id'}\n" +" })" +msgstr "" + +msgid "" +"Do not close the terminal window where Tarantool is running. You will need " +"it later to connect to Tarantool from your C++ application." +msgstr "" + +msgid "Setting up access rights" +msgstr "" + +msgid "" +"To be able to execute the necessary operations in Tarantool, you need to " +"grant the ``guest`` user with the read-write rights. The simplest way is to " +"grant the user with the :ref:`super role `:" +msgstr "" + +msgid "box.schema.user.grant('guest', 'super')" +msgstr "" + +msgid "Connecting to Tarantool" +msgstr "" + +msgid "" +"There are three main parts of the C++ connector: the IO-zero-copy buffer, " +"the msgpack encoder/decoder, and the client that handles requests." +msgstr "" + +msgid "" +"To set up connection to a Tarantool instance from a C++ application, you " +"need to do the following:" +msgstr "" + +msgid ":ref:`embed the connector into the application `" +msgstr "" + +msgid "" +":ref:`instantiate a connector client and a connection object " +"`" +msgstr "" + +msgid "" +":ref:`define connection parameters and invoke the method to connect " +"`" +msgstr "" + +msgid ":ref:`define error handling behavior `." +msgstr "" + +msgid "Embedding connector" +msgstr "" + +msgid "" +"Embed the connector in your C++ application by including the main header:" +msgstr "" + +msgid "#include \"../src/Client/Connector.hpp\"\n" +msgstr "" + +msgid "Instantiating objects" +msgstr "" + +msgid "" +"First, we should create a connector client. It can handle many connections " +"to Tarantool instances asynchronously. To instantiate a client, you should " +"specify the buffer and the network provider implementations as template " +"parameters. The connector's main class has the following signature:" +msgstr "" + +msgid "" +"template>\n" +"class Connector;" +msgstr "" + +msgid "" +"The buffer is parametrized by allocator. It means that users can choose " +"which allocator will be used to provide memory for the buffer's blocks. Data" +" is organized into a linked list of blocks of fixed size that is specified " +"as the template parameter of the buffer." +msgstr "" + +msgid "" +"You can either implement your own buffer or network provider or use the " +"default ones as we do in our example. So, the default connector " +"instantiation looks as follows:" +msgstr "" + +msgid "" +"using Buf_t = tnt::Buffer<16 * 1024>;\n" +"#include \"../src/Client/LibevNetProvider.hpp\"\n" +"using Net_t = LibevNetProvider;\n" +msgstr "" + +msgid "Connector client;\n" +msgstr "" + +msgid "" +"To use the ``BUFFER`` class, the buffer header should also be included:" +msgstr "" + +msgid "#include \"../src/Buffer/Buffer.hpp\"\n" +msgstr "" + +msgid "" +"A client itself is not enough to work with Tarantool instances--we also need" +" to create connection objects. A connection also takes the buffer and the " +"network provider as template parameters. Note that they must be the same as " +"ones of the client:" +msgstr "" + +msgid "Connection conn(client);\n" +msgstr "" + +msgid "Connecting" +msgstr "" + +msgid "" +"Our :ref:`Tarantool instance ` is listening to the " +"``3301`` port on ``localhost``. Let's define the corresponding variables as " +"well as the ``WAIT_TIMEOUT`` variable for connection timeout." +msgstr "" + +msgid "" +"const char *address = \"127.0.0.1\";\n" +"int port = 3301;\n" +"int WAIT_TIMEOUT = 1000; //milliseconds\n" +msgstr "" + +msgid "" +"To connect to the Tarantool instance, we should invoke the " +"``Connector::connect()`` method of the client object and pass three " +"arguments: connection instance, address, and port." +msgstr "" + +msgid "" +"int rc = client.connect(conn, {.address = address,\n" +"\t\t\t .service = std::to_string(port),\n" +"\t\t\t /*.user = ...,*/\n" +"\t\t\t /*.passwd = ...,*/\n" +"\t\t\t /* .transport = STREAM_SSL, */});\n" +msgstr "" + +msgid "Error handling" +msgstr "" + +msgid "" +"Implementation of the connector is exception free, so we rely on the return " +"codes: in case of fail, the ``connect()`` method returns ``rc < 0``. To get " +"the error message corresponding to the last error occured during " +"communication with the instance, we can invoke the " +"``Connection::getError()`` method." +msgstr "" + +msgid "" +"if (rc != 0) {\n" +"\t//assert(conn.getError().saved_errno != 0);\n" +"\tstd::cerr << conn.getError().msg << std::endl;\n" +"\treturn -1;\n" +"}\n" +msgstr "" + +msgid "" +"To reset connection after errors, that is, to clean up the error message and" +" connection status, the ``Connection::reset()`` method is used." +msgstr "" + +msgid "Working with requests" +msgstr "" + +msgid "In this section, we will show how to:" +msgstr "" + +msgid ":ref:`prepare different types of requests `" +msgstr "" + +msgid ":ref:`send the requests `" +msgstr "" + +msgid ":ref:`receive and handle responses `." +msgstr "" + +msgid "" +"We will also go through the :ref:`case of having several connections " +"` and executing a number of requests from different" +" connections simultaneously." +msgstr "" + +msgid "" +"In our example C++ application, we execute the following types of requests:" +msgstr "" + +msgid "``ping``" +msgstr "" + +msgid "``replace``" +msgstr "" + +msgid "``select``." +msgstr "" + +msgid "" +"Examples on other request types, namely, ``insert``, ``delete``, ``upsert``," +" and ``update``, will be added to this manual later." +msgstr "" + +msgid "" +"Each request method returns a request ID that is a sort of `future " +"`_. This ID can be used " +"to get the response message when it is ready. Requests are queued in the " +"output buffer of connection until the ``Connector::wait()`` method is " +"called." +msgstr "" + +msgid "Preparing requests" +msgstr "" + +msgid "" +"At this step, requests are encoded in the `MessagePack " +"`_ format and saved in the output connection buffer. " +"They are ready to be sent but the network communication itself will be done " +"later." +msgstr "" + +msgid "" +"Let's remind that for the requests manipulating with data we are dealing " +"with the Tarantool space ``t`` :ref:`created earlier " +"`, and the space has the following format:" +msgstr "" + +msgid "" +"t:format({\n" +" {name = 'id', type = 'unsigned'},\n" +" {name = 'a', type = 'string'},\n" +" {name = 'b', type = 'number'}\n" +" })" +msgstr "" + +msgid "**ping**" +msgstr "" + +msgid "rid_t ping = conn.ping();\n" +msgstr "" + +msgid "**replace**" +msgstr "" + +msgid "Equals to Lua request ``:replace(pk_value, \"111\", 1)``." +msgstr "" + +msgid "" +"uint32_t space_id = 512;\n" +"int pk_value = 666;\n" +"std::tuple data = std::make_tuple(pk_value /* field 1*/, \"111\" /* field 2*/, 1.01 /* field 3*/);\n" +"rid_t replace = conn.space[space_id].replace(data);\n" +msgstr "" + +msgid "**select**" +msgstr "" + +msgid "" +"Equals to Lua request ``.index[0]:select({pk_value}, {limit = " +"1})``." +msgstr "" + +msgid "" +"uint32_t index_id = 0;\n" +"uint32_t limit = 1;\n" +"uint32_t offset = 0;\n" +"IteratorType iter = IteratorType::EQ;\n" +"auto i = conn.space[space_id].index[index_id];\n" +"rid_t select = i.select(std::make_tuple(pk_value), limit, offset, iter);\n" +msgstr "" + +msgid "Sending requests" +msgstr "" + +msgid "" +"To send requests to the server side, invoke the ``client.wait()`` method." +msgstr "" + +msgid "client.wait(conn, ping, WAIT_TIMEOUT);" +msgstr "" + +msgid "" +"The ``wait()`` method takes the connection to poll, the request ID, and, " +"optionally, the timeout as parameters. Once a response for the specified " +"request is ready, ``wait()`` terminates. It also provides a negative return " +"code in case of system related fails, for example, a broken or timeouted " +"connection. If ``wait()`` returns ``0``, then a response has been received " +"and expected to be parsed." +msgstr "" + +msgid "" +"Now let's send our requests to the Tarantool instance. The " +"``futureIsReady()`` function checks availability of a future and returns " +"``true`` or ``false``." +msgstr "" + +msgid "" +"while (! conn.futureIsReady(ping)) {\n" +"\t/*\n" +"\t * wait() is the main function responsible for sending/receiving\n" +"\t * requests and implements event-loop under the hood. It may\n" +"\t * fail due to several reasons:\n" +"\t * - connection is timed out;\n" +"\t * - connection is broken (e.g. closed);\n" +"\t * - epoll is failed.\n" +"\t */\n" +"\tif (client.wait(conn, ping, WAIT_TIMEOUT) != 0) {\n" +"\t\tstd::cerr << conn.getError().msg << std::endl;\n" +"\t\tconn.reset();\n" +"\t}\n" +"}\n" +msgstr "" + +msgid "Receiving responses" +msgstr "" + +msgid "" +"To get the response when it is ready, use the ``Connection::getResponse()`` " +"method. It takes the request ID and returns an optional object containing " +"the response. If the response is not ready yet, the method returns " +"``std::nullopt``. Note that on each future, ``getResponse()`` can be called " +"only once: it erases the request ID from the internal map once it is " +"returned to a user." +msgstr "" + +msgid "" +"A response consists of a header and a body (``response.header`` and " +"``response.body``). Depending on success of the request execution on the " +"server side, body may contain either runtime error(s) accessible by " +"``response.body.error_stack`` or data (tuples)--``response.body.data``. In " +"turn, data is a vector of tuples. However, tuples are not decoded and come " +"in the form of pointers to the start and the end of msgpacks. See the " +":ref:`\"Decoding and reading the data\" ` section to " +"understand how to decode tuples." +msgstr "" + +msgid "" +"There are two options for single connection it regards to receiving " +"responses: we can either wait for one specific future or for all of them at " +"once. We'll try both options in our example. For the ``ping`` request, let's" +" use the first option." +msgstr "" + +msgid "" +"std::optional> response = conn.getResponse(ping);\n" +"/*\n" +" * Since conn.futureIsReady(ping) returned , then response\n" +" * must be ready.\n" +" */\n" +"assert(response != std::nullopt);\n" +"/*\n" +" * If request is successfully executed on server side, response\n" +" * will contain data (i.e. tuple being replaced in case of :replace()\n" +" * request or tuples satisfying search conditions in case of :select();\n" +" * responses for pings contain nothing - empty map).\n" +" * To tell responses containing data from error responses, one can\n" +" * rely on response code storing in the header or check\n" +" * Response->body.data and Response->body.error_stack members.\n" +" */\n" +"printResponse(conn, *response);\n" +msgstr "" + +msgid "" +"For the ``replace`` and ``select`` requests, let's examine the option of " +"waiting for both futures at once." +msgstr "" + +msgid "" +"/* Let's wait for both futures at once. */\n" +"std::vector futures;\n" +"futures[0] = replace;\n" +"futures[1] = select;\n" +"/* No specified timeout means that we poll futures until they are ready.*/\n" +"client.waitAll(conn, futures);\n" +"for (size_t i = 0; i < futures.size(); ++i) {\n" +"\tassert(conn.futureIsReady(futures[i]));\n" +"\tresponse = conn.getResponse(futures[i]);\n" +"\tassert(response != std::nullopt);\n" +"\tprintResponse(conn, *response);\n" +"}\n" +msgstr "" + +msgid "Several connections at once" +msgstr "" + +msgid "" +"Now, let's have a look at the case when we establish two connections to " +"Tarantool instance simultaneously." +msgstr "" + +msgid "" +"/* Let's create another connection. */\n" +"Connection another(client);\n" +"if (client.connect(another, {.address = address,\n" +"\t\t\t .service = std::to_string(port),\n" +"\t\t\t /* .transport = STREAM_SSL, */}) != 0) {\n" +"\tstd::cerr << conn.getError().msg << std::endl;\n" +"\treturn -1;\n" +"}\n" +"/* Simultaneously execute two requests from different connections. */\n" +"rid_t f1 = conn.ping();\n" +"rid_t f2 = another.ping();\n" +"/*\n" +" * waitAny() returns the first connection received response.\n" +" * All connections registered via :connect() call are participating.\n" +" */\n" +"std::optional> conn_opt = client.waitAny(WAIT_TIMEOUT);\n" +"Connection first = *conn_opt;\n" +"if (first == conn) {\n" +"\tassert(conn.futureIsReady(f1));\n" +"\t(void) f1;\n" +"} else {\n" +"\tassert(another.futureIsReady(f2));\n" +"\t(void) f2;\n" +"}\n" +msgstr "" + +msgid "Closing connections" +msgstr "" + +msgid "Finally, a user is responsible for closing connections." +msgstr "" + +msgid "" +"client.close(conn);\n" +"client.close(another);\n" +msgstr "" + +msgid "Building and launching C++ application" +msgstr "" + +msgid "" +"Now, we are going to build our example C++ application, launch it to connect" +" to the Tarantool instance and execute all the requests defined." +msgstr "" + +msgid "" +"Make sure you are in the root directory of the cloned C++ connector " +"repository. To build the example application:" +msgstr "" + +msgid "" +"cd examples\n" +"cmake .\n" +"make" +msgstr "" + +msgid "" +"Make sure the :ref:`Tarantool session ` you started " +"earlier is running. Launch the application:" +msgstr "" + +msgid "./Simple" +msgstr "" + +msgid "" +"As you can see from the execution log, all the connections to Tarantool " +"defined in our application have been established and all the requests have " +"been executed successfully." +msgstr "" + +msgid "Decoding and reading the data" +msgstr "" + +msgid "" +"Responses from a Tarantool instance contain raw data, that is, the data " +"encoded into the `MessagePack `_ tuples. To decode " +"client's data, the user has to write their own decoders (readers) based on " +"the database schema and include them in one's application:" +msgstr "" + +msgid "" +"\n" +"#include \"Reader.hpp\"\n" +msgstr "" + +msgid "" +"To show the logic of decoding a response, we will use `the reader from our " +"example " +"`_." +msgstr "" + +msgid "" +"First, the structure corresponding our :ref:`example space format " +"` is defined:" +msgstr "" + +msgid "" +"/**\n" +" * Corresponds to tuples stored in user's space:\n" +" * box.execute(\"CREATE TABLE t (id UNSIGNED PRIMARY KEY, a TEXT, d DOUBLE);\")\n" +" */\n" +"struct UserTuple {\n" +"\tuint64_t field1;\n" +"\tstd::string field2;\n" +"\tdouble field3;\n" +"};\n" +msgstr "" + +msgid "Base reader prototype" +msgstr "" + +msgid "Prototype of the base reader is given in ``src/mpp/Dec.hpp``:" +msgstr "" + +msgid "" +"template \n" +"struct SimpleReaderBase : DefaultErrorHandler {\n" +" using BufferIterator_t = typename BUFFER::iterator;\n" +" /* Allowed type of values to be parsed. */\n" +" static constexpr Type VALID_TYPES = TYPE;\n" +" BufferIterator_t* StoreEndIterator() { return nullptr; }\n" +"};" +msgstr "" + +msgid "" +"Every new reader should inherit from it or directly from the " +"``DefaultErrorHandler``." +msgstr "" + +msgid "Parsing values" +msgstr "" + +msgid "" +"To parse a particular value, we should define the ``Value()`` method. First " +"two arguments of the method are common and unused as a rule, but the third " +"one defines the parsed value. In case of `POD (Plain Old Data) " +"`_ structures, it's " +"enough to provide a byte-to-byte copy. Since there are fields of three " +"different types in our schema, let's define the corresponding ``Value()`` " +"functions:" +msgstr "" + +msgid "" +"struct UserTupleValueReader : mpp::DefaultErrorHandler {\n" +"\texplicit UserTupleValueReader(UserTuple& t) : tuple(t) {}\n" +"\tstatic constexpr mpp::Family VALID_TYPES = mpp::MP_UINT | mpp::MP_STR | mpp::MP_DBL;\n" +"\ttemplate \n" +"\tvoid Value(BufIter_t&, mpp::compact::Family, T v)\n" +"\t{\n" +"\t\tusing A = UserTuple;\n" +"\t\tstatic constexpr std::tuple map(&A::field1, &A::field3);\n" +"\t\tauto ptr = std::get A::*>(map);\n" +"\t\ttuple.*ptr = v;\n" +"\t}\n" +"\tvoid Value(BufIter_t& itr, mpp::compact::Family, mpp::StrValue v)\n" +"\t{\n" +"\t\tBufIter_t tmp = itr;\n" +"\t\ttmp += v.offset;\n" +"\t\tstd::string &dst = tuple.field2;\n" +"\t\twhile (v.size) {\n" +"\t\t\tdst.push_back(*tmp);\n" +"\t\t\t++tmp;\n" +"\t\t\t--v.size;\n" +"\t\t}\n" +"\t}\n" +"\tvoid WrongType(mpp::Family expected, mpp::Family got)\n" +"\t{\n" +"\t\tstd::cout << \"expected type is \" << expected <<\n" +"\t\t\t \" but got \" << got << std::endl;\n" +"\t}\n" +"\n" +"\tBufIter_t* StoreEndIterator() { return nullptr; }\n" +"\tUserTuple& tuple;\n" +"};\n" +msgstr "" + +msgid "Parsing array" +msgstr "" + +msgid "" +"It's also important to understand that a tuple itself is wrapped in an " +"array, so, in fact, we should parse the array first. Let's define another " +"reader for that purpose." +msgstr "" + +msgid "" +"template \n" +"struct UserTupleReader : mpp::SimpleReaderBase {\n" +"\n" +"\tUserTupleReader(mpp::Dec& d, UserTuple& t) : dec(d), tuple(t) {}\n" +"\n" +"\tvoid Value(const iterator_t&, mpp::compact::Family, mpp::ArrValue u)\n" +"\t{\n" +"\t\tassert(u.size == 3);\n" +"\t\t(void) u;\n" +"\t\tdec.SetReader(false, UserTupleValueReader{tuple});\n" +"\t}\n" +"\tmpp::Dec& dec;\n" +"\tUserTuple& tuple;\n" +"};\n" +msgstr "" + +msgid "Setting reader" +msgstr "" + +msgid "" +"The ``SetReader()`` method sets the reader that is invoked while each of the" +" array's entries is parsed. To make two readers defined above work, we " +"should create a decoder, set its iterator to the position of the encoded " +"tuple, and invoke the ``Read()`` method (the code block below is from the " +"`example application " +"`_)." +msgstr "" + +msgid "" +"template \n" +"std::vector\n" +"decodeUserTuple(BUFFER &buf, Data &data)\n" +"{\n" +"\tstd::vector results;\n" +"\tfor(auto& t: data.tuples) {\n" +"\t\tUserTuple tuple;\n" +"\t\tmpp::Dec dec(buf);\n" +"\t\tdec.SetPosition(t.begin);\n" +"\t\tdec.SetReader(false, UserTupleReader{dec, tuple});\n" +"\t\tmpp::ReadResult_t res = dec.Read();\n" +"\t\tassert(res == mpp::READ_SUCCESS);\n" +"\t\t(void) res;\n" +"\t\tresults.push_back(tuple);\n" +"\t}\n" +"\treturn results;\n" +"}\n" +msgstr "" diff --git a/locale/ru/LC_MESSAGES/how-to/getting_started_db.po b/locale/ru/LC_MESSAGES/how-to/getting_started_db.po index 9f3fc7aa3a..78fcc764ac 100644 --- a/locale/ru/LC_MESSAGES/how-to/getting_started_db.po +++ b/locale/ru/LC_MESSAGES/how-to/getting_started_db.po @@ -62,8 +62,8 @@ msgstr "" msgid "" "This command runs a new container named ``mytarantool``. Docker starts it " -"from an official image named ``tarantool/tarantool:latest``, with the latest Tarantool " -"version and all external modules already installed." +"from an official image named ``tarantool/tarantool:latest``, with the latest" +" Tarantool version and all external modules already installed." msgstr "" "Эта команда запускает новый контейнер с именем ``mytarantool``. Docker " "запускает его из официального образа ``tarantool/tarantool:latest`` с " @@ -73,8 +73,9 @@ msgid "" "Tarantool will accept incoming connections on ``localhost:3301``. You can " "start using it as a key-value storage right away." msgstr "" -"Tarantool будет принимать входящие подключения по адресу ``localhost:3301``. " -"Вы сразу можете начать пользоваться Tarantool как хранилищем данных типа \"ключ-значение\"." +"Tarantool будет принимать входящие подключения по адресу ``localhost:3301``." +" Вы сразу можете начать пользоваться Tarantool как хранилищем данных типа " +"\"ключ-значение\"." msgid "" "Tarantool :ref:`persists data ` inside the container." @@ -84,13 +85,15 @@ msgid "" "directory ``/var/lib/tarantool`` (by convention, Tarantool in a container " "uses this directory to persist data). Through this, all changes made in the " "mounted directory on the container's side are applied to the host's disk." -msgstr "Tarantool :ref:`хранит данные персистентно ` внутри контейнера. " -"Чтобы тестовые данные оставались доступны после остановки контейнера, " -"эта команда также монтирует директорию хоста ``/data/dir/on/host`` " -"(следует заменить на абсолютный путь к существующей локальной директории) " -"в директорию ``/var/lib/tarantool`` внутри контейнера. Tarantool, развернутый в контейнере, " -"использует директорию ``/var/lib/tarantool``, чтобы обеспечить персистентность данных. " -"Таким образом, все изменения в директории, смонтированной внутри контейнера, " +msgstr "" +"Tarantool :ref:`хранит данные персистентно ` внутри " +"контейнера. Чтобы тестовые данные оставались доступны после остановки " +"контейнера, эта команда также монтирует директорию хоста " +"``/data/dir/on/host`` (следует заменить на абсолютный путь к существующей " +"локальной директории) в директорию ``/var/lib/tarantool`` внутри контейнера." +" Tarantool, развернутый в контейнере, использует директорию " +"``/var/lib/tarantool``, чтобы обеспечить персистентность данных. Таким " +"образом, все изменения в директории, смонтированной внутри контейнера, " "попадают на диск хоста." msgid "" @@ -193,10 +196,14 @@ msgstr "" " > parts = {'id'}\n" " > })" -msgid "This is a primary index based on the ``id`` field of each tuple. " -"``TREE`` is the most universal index type. To learn more, check the documentation on Tarantool :ref:`index types `." -msgstr "Это первичный индекс по полю ``id`` в каждом кортеже. " -"Тип индекса ``TREE`` --- самый универсальный. Подробная информация изложена в документации о :ref:`типах индексов в Tarantool `." +msgid "" +"This is a primary index based on the ``id`` field of each tuple. ``TREE`` is" +" the most universal index type. To learn more, check the documentation on " +"Tarantool :ref:`index types `." +msgstr "" +"Это первичный индекс по полю ``id`` в каждом кортеже. Тип индекса ``TREE`` " +"--- самый универсальный. Подробная информация изложена в документации о " +":ref:`типах индексов в Tarantool `." msgid "" "Insert three :term:`tuples ` (our name for records) into the space:" @@ -477,7 +484,8 @@ msgstr "" "COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME\n" "tarantool 6851 root 12u IPv4 40827 0t0 TCP *:3301 (LISTEN)" -msgid "If it does, kill the corresponding process. In this example:" +#, fuzzy +msgid "If it is running, kill the corresponding process. In this example:" msgstr "Если он запущен, отключите соответствующий процесс. В данном примере:" msgid "$ kill 6851" @@ -678,7 +686,8 @@ msgstr "" "другой экземпляр Tarantool (с помощью модуля :ref:`console `)," -msgid ":ref:`tarantoolctl ` administrative utility." +#, fuzzy +msgid ":ref:`tt ` administrative utility." msgstr "административную утилиту :ref:`tarantoolctl `." msgid "Let’s try (3)." diff --git a/locale/ru/LC_MESSAGES/how-to/getting_started_net_box.po b/locale/ru/LC_MESSAGES/how-to/getting_started_net_box.po index 2d551ae658..fe99ab2677 100644 --- a/locale/ru/LC_MESSAGES/how-to/getting_started_net_box.po +++ b/locale/ru/LC_MESSAGES/how-to/getting_started_net_box.po @@ -6,11 +6,11 @@ msgid "The tutorial shows how to work with some common ``net.box`` methods." msgstr "Ниже приводится пример использования большинства методов ``net.box``." msgid "" -"For more information about the ``net.box`` module, " -"check the :ref:`corresponding module reference `." +"For more information about the ``net.box`` module, check the " +":ref:`corresponding module reference `." msgstr "" -"Подробную информацию о модуле ``net.box`` вы найдете " -"в соответствующем :ref:`разделе справочника по модулям `." +"Подробную информацию о модуле ``net.box`` вы найдете в соответствующем " +":ref:`разделе справочника по модулям `." msgid "Sandbox configuration" msgstr "Настройка песочницы" @@ -34,96 +34,184 @@ msgstr "у текущего пользователя есть права на ч msgid "Use the commands below for a quick sandbox setup:" msgstr "Используйте команды ниже для быстрой настройки песочницы:" +msgid "" +"box.cfg{listen = 3301}\n" +"s = box.schema.space.create('tester')\n" +"s:create_index('primary', {type = 'hash', parts = {1, 'unsigned'}})\n" +"t = s:insert({800, 'TEST'})\n" +"box.schema.user.grant('guest', 'read,write,execute', 'universe')" +msgstr "" + msgid "Creating a net.box connection" msgstr "Создание подключения" msgid "" -"First, load the ``net.box`` module with " -"the ``require('net.box')`` method:" +"First, load the ``net.box`` module with the ``require('net.box')`` method:" +msgstr "" +"Чтобы начать работу, запустите модуль ``net.box``, используя команду " +"``require('net.box')``:" + +msgid "tarantool> net_box = require('net.box')" msgstr "" -"Чтобы начать работу, запустите модуль ``net.box``, " -"используя команду ``require('net.box')``:" msgid "" -"The next step is to create a new connection. " -"In ``net.box``, self-connection is pre-established. That is, " -"``conn = net_box.connect('localhost:3301')`` command can be " -"replaced with the ``conn = net_box.self`` object call:" +"The next step is to create a new connection. In ``net.box``, self-connection" +" is pre-established. That is, ``conn = net_box.connect('localhost:3301')`` " +"command can be replaced with the ``conn = net_box.self`` object call:" +msgstr "" +"Далее необходимо создать новое подключение. В ``net.box`` для локального " +"Tarantool-сервера есть заданный объект ``self`` всегда установленного " +"подключения. Таким образом, команду ``conn = " +"net_box.connect('localhost:3301')`` можно заменить на вызов объекта ``conn =" +" net_box.self``." + +msgid "tarantool> conn = net_box.self" msgstr "" -"Далее необходимо создать новое подключение. " -"В ``net.box`` для локального Tarantool-сервера есть заданный объект ``self`` всегда " -"установленного подключения. Таким образом, команду ``conn = net_box.connect('localhost:3301')`` " -"можно заменить на вызов объекта ``conn = net_box.self``." msgid "Then, make a ping:" msgstr "Запустите команду ``ping()``:" +msgid "" +"tarantool> conn:ping()\n" +"---\n" +"- true\n" +"..." +msgstr "" + msgid "Using data operations" msgstr "Операции с данными" -msgid "Select all tuples in the ``tester`` space where the key value is ``800``:" -msgstr "Сделайте выборку всех кортежей в спейсе ``tester``, у которых значение ключа равно ``800``:" +msgid "" +"Select all tuples in the ``tester`` space where the key value is ``800``:" +msgstr "" +"Сделайте выборку всех кортежей в спейсе ``tester``, у которых значение ключа" +" равно ``800``:" + +msgid "" +"tarantool> conn.space.tester:select{800}\n" +"---\n" +"- - [800, 'TEST']\n" +"..." +msgstr "" msgid "Insert two tuples into the space:" msgstr "Вставьте два кортежа в спейс:" msgid "" -"After the insert, there is one tuple where the key value is ``600``. " -"To select this tuple, you can use the ``get()`` method. " -"Unlike the ``select()`` command, ``get()`` returns only one tuple " -"that satisfies the stated condition." +"tarantool> conn.space.tester:insert({700, 'TEST700'})\n" +"---\n" +"- [700, 'TEST700']\n" +"...\n" +"tarantool> conn.space.tester:insert({600, 'TEST600'})\n" +"---\n" +"- [600, 'TEST600']\n" +"..." msgstr "" -"После вставки в спейсе появился один кортеж со значением ключа ``600``. " -"Для выбора этого кортежа вы можете использовать метод ``get()``. " -"В отличие от команды ``select()``, метод ``get()`` возвращает только один кортеж, " + +msgid "" +"After the insert, there is one tuple where the key value is ``600``. To " +"select this tuple, you can use the ``get()`` method. Unlike the ``select()``" +" command, ``get()`` returns only one tuple that satisfies the stated " +"condition." +msgstr "" +"После вставки в спейсе появился один кортеж со значением ключа ``600``. Для " +"выбора этого кортежа вы можете использовать метод ``get()``. В отличие от " +"команды ``select()``, метод ``get()`` возвращает только один кортеж, " "удовлетворяющий заданным условиям." msgid "" -"To update the existing tuple, you can use either ``update()`` or ``upsert()``. " -"The ``update()`` method can be used for assignment, " -"arithmetic (if the field is numeric), " -"cutting and pasting fragments of a field, and deleting or inserting a field." +"tarantool> conn.space.tester:get({600})\n" +"---\n" +"- [600, 'TEST600']\n" +"..." msgstr "" -"Чтобы обновить существующий кортеж, вы можете использовать как метод ``update()``, так и метод ``upsert()``. " -"Функция ``update()`` может использоваться для присваивания, " -"арифметических операций (если поле числовое), вырезания и вставки фрагментов" -" поля, а также для удаления или вставки поля." + +msgid "" +"To update the existing tuple, you can use either ``update()`` or " +"``upsert()``. The ``update()`` method can be used for assignment, arithmetic" +" (if the field is numeric), cutting and pasting fragments of a field, and " +"deleting or inserting a field." +msgstr "" +"Чтобы обновить существующий кортеж, вы можете использовать как метод " +"``update()``, так и метод ``upsert()``. Функция ``update()`` может " +"использоваться для присваивания, арифметических операций (если поле " +"числовое), вырезания и вставки фрагментов поля, а также для удаления или " +"вставки поля." msgid "" "In this tutorial, the ``update()`` command is used to update the tuple " -"identified by primary key value = ``800``. " -"The operation assigns a new value to the second field in the tuple:" +"identified by primary key value = ``800``. The operation assigns a new value" +" to the second field in the tuple:" +msgstr "" +"В этом руководстве команда ``update()`` используется для обновления " +"кортежа, определенного значением ключа ``800``. Операция присваивает новое " +"значение второму полю в кортеже:" + +msgid "" +"tarantool> conn.space.tester:update(800, {{'=', 2, 'TEST800'}})\n" +"---\n" +"- [800, 'TEST800']\n" +"..." +msgstr "" + +msgid "" +"As for the ``upsert`` function, if there is an existing tuple that matches " +"the key field of tuple, then the command has the same effect as " +"``update()``. Otherwise, the effect is equal to the ``insert()`` method." +msgstr "" +"Для функции ``upsert``, если уже существует кортеж, который совпадает с " +"ключевыми полями tuple, запрос приведет к тому же результату, что и метод " +"``update()``. Если подходящего кортежа нет, запрос приведет к тому же " +"результату, что и метод ``insert()``." + +msgid "" +"tarantool> conn.space.tester:upsert({500, 'TEST500'}, {{'=', 2, 'TEST'}})" msgstr "" -"В этом руководстве команда ``update()`` используется для обновления кортежа, " -"определенного значением ключа ``800``. " -"Операция присваивает новое значение второму полю в кортеже:" msgid "" -"As for the ``upsert`` function, if there is an existing tuple " -"that matches the key field of tuple, then the command " -"has the same effect as ``update()``. " -"Otherwise, the effect is equal to the ``insert()`` method." +"To delete a tuple where the key value is ``600``, run the ``delete()`` " +"method below:" msgstr "" -"Для функции ``upsert``, если уже существует кортеж, " -"который совпадает с ключевыми полями tuple, запрос приведет к тому же " -"результату, что и метод ``update()``. Если подходящего кортежа нет," -" запрос приведет к тому же результату, что и метод ``insert()``." +"Чтобы удалить кортеж, в котором значение ключа равно ``600``, запустите " +"метод ``delete()``:" msgid "" -"To delete a tuple where the key value is ``600``, " -"run the ``delete()`` method below:" +"tarantool> conn.space.tester:delete{600}\n" +"---\n" +"- [600, 'TEST600']\n" +"..." msgstr "" -"Чтобы удалить кортеж, в котором значение ключа равно ``600``, " -"запустите метод ``delete()``:" msgid "Then, replace the existing tuple with a new one:" msgstr "Затем замените существующий кортеж на новый:" +msgid "" +"tarantool> conn.space.tester:replace{500, 'New data', 'Extra data'}\n" +"---\n" +"- [500, 'New data', 'Extra data']\n" +"..." +msgstr "" + msgid "Finally, select all tuples from the space:" msgstr "Наконец, сделайте выборку по всем кортежам из спейса:" +msgid "" +"tarantool> conn.space.tester:select{}\n" +"---\n" +"- - [800, 'TEST800']\n" +" - [500, 'New data', 'Extra data']\n" +" - [700, 'TEST700']\n" +"..." +msgstr "" + msgid "Closing the connection" msgstr "Закрытие подключения" msgid "In the end, close the connection when it is no longer needed:" msgstr "Закройте соединение явным образом, когда оно больше не используется:" + +msgid "" +"tarantool> conn:close()\n" +"---\n" +"..." +msgstr "" diff --git a/locale/ru/LC_MESSAGES/how-to/index.po b/locale/ru/LC_MESSAGES/how-to/index.po index efb518e59f..50529c340f 100644 --- a/locale/ru/LC_MESSAGES/how-to/index.po +++ b/locale/ru/LC_MESSAGES/how-to/index.po @@ -1,15 +1,17 @@ +msgid "Creating Tarantool database" +msgstr "" + msgid "How-to guides" msgstr "Примеры и руководства" msgid "" -"This chapter contains practical examples as well as " -"tutorials for those who would like to dig deeper into Tarantool " -"usage." +"This chapter contains practical examples as well as tutorials for those who " +"would like to dig deeper into Tarantool usage." msgstr "" -"Глава содержит полезные примеры использования Tarantool, " -"а также практические руководства для тех, кто хочет получше " -"познакомиться с платформой." +"Глава содержит полезные примеры использования Tarantool, а также " +"практические руководства для тех, кто хочет получше познакомиться с " +"платформой." msgid "" "If you are new to Tarantool, please see our :ref:`Getting Started guides " diff --git a/locale/ru/LC_MESSAGES/how-to/other/index.po b/locale/ru/LC_MESSAGES/how-to/other/index.po new file mode 100644 index 0000000000..d60a38ce98 --- /dev/null +++ b/locale/ru/LC_MESSAGES/how-to/other/index.po @@ -0,0 +1,3 @@ + +msgid "More guides" +msgstr "" diff --git a/locale/ru/LC_MESSAGES/how-to/other/iproto.po b/locale/ru/LC_MESSAGES/how-to/other/iproto.po index e03afa3892..e74fce4e8c 100644 --- a/locale/ru/LC_MESSAGES/how-to/other/iproto.po +++ b/locale/ru/LC_MESSAGES/how-to/other/iproto.po @@ -1,4 +1,21 @@ +msgid "Understanding the binary protocol" +msgstr "" + +msgid "Overview" +msgstr "" + +msgid "" +"To communicate with each other, Tarantool instances use a binary protocol " +"called iproto. To learn more, see the :ref:`Binary protocol ` " +"section." +msgstr "" + +msgid "" +"In this set of examples, the user will be looking at binary code transferred" +" via iproto. The code is intercepted with ``tcpdump``, a monitoring utility." +msgstr "" + msgid "Examples" msgstr "Примеры" @@ -41,17 +58,26 @@ msgstr "" "На терминале №3 запустите ещё один сервер, который будет выступать в " "качестве клиента, так:" +#, fuzzy msgid "" "box.cfg{}\n" "net_box = require('net.box')\n" -"conn = net_box.connect('localhost:3302')\n" -"conn.space.tspace:select(280)" +"conn = net_box.connect('localhost:3302')" msgstr "" "box.cfg{}\n" "net_box = require('net.box')\n" "conn = net_box.connect('localhost:3302')\n" "conn.space.tspace:select(280)" +msgid "IPROTO_SELECT" +msgstr "" + +msgid "On terminal #3, run the following:" +msgstr "" + +msgid "conn.space.tspace:select(280)" +msgstr "" + msgid "" "Now look at what tcpdump shows for the job connecting to 3302 -- the " "\"request\". After the words \"length 32\" is a packet that ends with these " @@ -141,6 +167,9 @@ msgstr "" "``net_box.c``, где описаны процедуры для каждого запроса. Некоторые " ":ref:`коннекторы ` написаны аналогично." +msgid "IPROTO_UPDATE" +msgstr "" + msgid "" "For an IPROTO_UPDATE example, suppose a user changes field #2 in tuple #2 in" " space #256 to ``'BBBB'``. The body will look like this: (notice that in " @@ -190,6 +219,9 @@ msgstr "" "91 MP_ARRAY, размер 1, для массива ключей\n" "02 MP_UINT = значение первичного ключа = 2" +msgid "IPROTO_EXECUTE" +msgstr "" + msgid "" "Byte codes for the :ref:`IPROTO_EXECUTE ` example:" msgstr "Пример байт-кода :ref:`IPROTO_EXECUTE `:" @@ -217,6 +249,9 @@ msgstr "" "2b IPROTO_OPTIONS 3-й элемент ассоциативного массива\n" "90 MP_ARRAY, размер 0 (никакие опции не выбраны)" +msgid "IPROTO_INSERT" +msgstr "" + msgid "" "Byte codes for the response to the " ":codenormal:`box.space.`:codeitalic:`space-name`:codenormal:`:insert{6}` " @@ -225,10 +260,11 @@ msgstr "" "Пример байт-кода ответа на запрос " ":codenormal:`box.space.`:codeitalic:`space-name`:codenormal:`:insert{6}`:" +#, fuzzy msgid "" "ce 00 00 00 20 MP_UINT = HEADER AND BODY SIZE\n" "83 MP_MAP, size 3\n" -"00 Response-Code-Indicator\n" +"00 IPROTO_REQUEST_TYPE\n" "ce 00 00 00 00 MP_UINT = IPROTO_OK\n" "01 IPROTO_SYNC\n" "cf 00 00 00 00 00 00 00 53 MP_UINT = sync value\n" @@ -254,6 +290,9 @@ msgstr "" "91 MP_ARRAY, размер 1 (число полей)\n" "06 MP_INT = 6 = добавленное значение" +msgid "IPROTO_EVAL" +msgstr "" + msgid "" "Byte codes for the response to the " "``conn:eval([[box.schema.space.create('_space');]])`` example:" @@ -261,10 +300,11 @@ msgstr "" "Пример байт-кода ответа на запрос " "``conn:eval([[box.schema.space.create('_space');]])``:" +#, fuzzy msgid "" "ce 00 00 00 3b MP_UINT = HEADER AND BODY SIZE\n" "83 MP_MAP, size 3 (i.e. 3 items in header)\n" -" 00 Response-Code-Indicator\n" +" 00 IPROTO_REQUEST_TYPE\n" " ce 00 00 80 0a MP_UINT = hexadecimal 800a\n" " 01 IPROTO_SYNC\n" " cf 00 00 00 00 00 00 00 26 MP_UINT = sync value\n" @@ -286,17 +326,20 @@ msgstr "" " 31 IPROTO_ERROR_24\n" " db 00 00 00 1d 53 70 61 63 ... MP_STR = \"Space '_space' already exists\"" +msgid "Creating a table with IPROTO_EXECUTE" +msgstr "" + +#, fuzzy msgid "" -"Byte codes, if we use the same net.box connection that we used for " -":ref:`Binary protocol -- illustration ` and we " -"say |br| ``conn:execute([[CREATE TABLE t1 (dd INT PRIMARY KEY AUTOINCREMENT," -" дд STRING COLLATE \"unicode\");]])`` |br| ``conn:execute([[INSERT INTO t1 " -"VALUES (NULL, 'a'), (NULL, 'b');]])`` |br| and we watch what tcpdump " -"displays, we will see two noticeable things: (1) the CREATE statement caused" -" a schema change so the response has a new IPROTO_SCHEMA_VERSION value and " -"the body includes the new contents of some system tables (caused by requests" -" from net.box which users will not see); (2) the final bytes of the response" -" to the INSERT will be:" +"Byte codes, if we use the same net.box connection that we used in the " +"beginning and we say |br| ``conn:execute([[CREATE TABLE t1 (dd INT PRIMARY " +"KEY AUTOINCREMENT, дд STRING COLLATE \"unicode\");]])`` |br| " +"``conn:execute([[INSERT INTO t1 VALUES (NULL, 'a'), (NULL, 'b');]])`` |br| " +"and we watch what tcpdump displays, we will see two noticeable things: (1) " +"the CREATE statement caused a schema change so the response has a new " +"IPROTO_SCHEMA_VERSION value and the body includes the new contents of some " +"system tables (caused by requests from net.box which users will not see); " +"(2) the final bytes of the response to the INSERT will be:" msgstr "" "Подключимся через то же соединение net.box, что приводилось в :ref:`примерах" " `, и выполним следующее: |br| " @@ -330,6 +373,9 @@ msgstr "" "01 первое число с автоинкрементом\n" "02 второе число с автоинкрементом" +msgid "SELECT with SQL" +msgstr "" + msgid "" "Byte codes for the SQL SELECT example, if we ask for full metadata by saying" " |br| :code:`conn.space._session_settings:update('sql_full_metadata', {{'='," @@ -392,6 +438,9 @@ msgstr "" "02 MP_INT = 2: содержимое строки 2, столбца 1\n" "a1 62 MP_STR = 'b': содержимое строки 2, столбца 2" +msgid "IPROTO_PREPARE" +msgstr "" + msgid "" "Byte code for the SQL PREPARE example. If we said |br| " ":code:`conn:prepare([[SELECT dd, дд AS д FROM t1;]])` |br| then tcpdump " @@ -467,11 +516,17 @@ msgstr "" "03 c3 IPROTO_FIELD_IS_NULLABLE и true\n" "05 a4 d0 b4 d0 b4 IPROTO_FIELD_SPAN и 'дд' в нижнем регистре" -msgid "Byte code for the :ref:`heartbeat ` example. The master might send this body:" +msgid "Heartbeat" +msgstr "" + +msgid "" +"Byte code for the :ref:`heartbeat ` example. The " +"master might send this body:" msgstr "" -"Пример байт-кода :ref:`контрольного сигнала `. Мастер может отправить следующее " -"тело:" +"Пример байт-кода :ref:`контрольного сигнала `. " +"Мастер может отправить следующее тело:" +#, fuzzy msgid "" "83 MP_MAP, size 3\n" "00 Main-Map Item #1 IPROTO_REQUEST_TYPE\n" @@ -480,7 +535,10 @@ msgid "" "02 MP_UINT = 2 = id\n" "04 Main-Map Item #3 IPROTO_TIMESTAMP\n" "cb MP_DOUBLE (MessagePack \"Float 64\")\n" -"41 d7 ba 06 7b 3a 03 21 8-byte timestamp" +"41 d7 ba 06 7b 3a 03 21 8-byte timestamp\n" +"81 MP_MAP (body), size 1\n" +"5a Body Map Item #1 IPROTO_VCLOCK_SYNC\n" +"14 MP_UINT = 20 (vclock sync value)" msgstr "" "83 MP_MAP, размер 3\n" "00 1-й элемент Main-Map IPROTO_REQUEST_TYPE\n" @@ -491,21 +549,28 @@ msgstr "" "cb MP_DOUBLE (MessagePack \"Float 64\")\n" "41 d7 ba 06 7b 3a 03 21 8-байтовая временная отметка" +#, fuzzy msgid "" -"Byte code for the :ref:`heartbeat ` example. The replica might send back this body" +"Byte code for the :ref:`heartbeat ` example. The " +"replica might send back this body:" msgstr "" -"Пример байт-кода ответа на :ref:`контрольный сигнал `. Реплика может вернуть " -"следующее тело:" +"Пример байт-кода ответа на :ref:`контрольный сигнал `. Реплика может вернуть следующее тело:" +#, fuzzy msgid "" "81 MP_MAP, size 1\n" -"00 Main-Map Item #1 Response-code-indicator\n" +"00 Main-Map Item #1 IPROTO_REQUEST_TYPE\n" "00 MP_UINT = 0 = IPROTO_OK\n" -"81 Main-Map Item #2, MP_MAP, size 1\n" -"26 Sub-Map Item #1 IPROTO_VCLOCK\n" -"81 Sub-Map Item #2, MP_MAP, size 1\n" -"01 MP_UINT = 1 = id (part 1 of vclock)\n" -"06 MP_UINT = 6 = lsn (part 2 of vclock)" +"83 MP_MAP (body), size 3\n" +"26 Body Map Item #1 IPROTO_VCLOCK\n" +"81 MP_MAP, size 1 (vclock of 1 component)\n" +"01 MP_UINT = 1 = id (part 1 of vclock)\n" +"06 MP_UINT = 6 = lsn (part 2 of vclock)\n" +"5a Body Map Item #2 IPROTO_VCLOCK_SYNC\n" +"14 MP_UINT = 20 (vclock sync value)\n" +"53 Body Map Item #3 IPROTO_TERM\n" +"31 MP_UINT = 49 (term value)" msgstr "" "81 MP_MAP, размер 1\n" "00 1-й элемент Main-Map: индикатор кода ответа\n" diff --git a/locale/ru/LC_MESSAGES/how-to/other/libslave.po b/locale/ru/LC_MESSAGES/how-to/other/libslave.po index a44928d8ae..bbdd840247 100644 --- a/locale/ru/LC_MESSAGES/how-to/other/libslave.po +++ b/locale/ru/LC_MESSAGES/how-to/other/libslave.po @@ -19,9 +19,9 @@ msgstr "" "бинарный журнал и передает ее на любой клиент, который запрашивает: \"Хочу " "увидеть всю информацию, начиная с этого файла и этой записи, " "безостановочно\". Таким образом, библиотека ``libslave``, прежде всего, " -"используется для создания реплик базы данных Tarantool (намного быстрее, " -"чем используя традиционный ведомый сервер MySQL) и для отслеживания " -"изменений данных, чтобы они были пригодны для поиска." +"используется для создания реплик базы данных Tarantool (намного быстрее, чем" +" используя традиционный ведомый сервер MySQL) и для отслеживания изменений " +"данных, чтобы они были пригодны для поиска." msgid "" "We will not go into the many details here -- the `API documentation " diff --git a/locale/ru/LC_MESSAGES/how-to/other/sequences.po b/locale/ru/LC_MESSAGES/how-to/other/sequences.po index 01956e4568..982027c39c 100644 --- a/locale/ru/LC_MESSAGES/how-to/other/sequences.po +++ b/locale/ru/LC_MESSAGES/how-to/other/sequences.po @@ -1,3 +1,4 @@ + msgid "Sequences" msgstr "Последовательности" @@ -132,10 +133,8 @@ msgstr "" "Существующую последовательность можно изменять, удалять, сбрасывать, " "заставить сгенерировать новое значение или ассоциировать с индексом." -msgid "" -"Associating a sequence with an index" -msgstr "" -"Привязка последовательности к индексу" +msgid "Associating a sequence with an index" +msgstr "Привязка последовательности к индексу" msgid "For an initial example, we generate a sequence named 'S'." msgstr "" diff --git a/locale/ru/LC_MESSAGES/how-to/replication/index.po b/locale/ru/LC_MESSAGES/how-to/replication/index.po new file mode 100644 index 0000000000..8425b0d73e --- /dev/null +++ b/locale/ru/LC_MESSAGES/how-to/replication/index.po @@ -0,0 +1,3 @@ + +msgid "Replication tutorials" +msgstr "" diff --git a/locale/ru/LC_MESSAGES/how-to/replication/repl_add_instances.po b/locale/ru/LC_MESSAGES/how-to/replication/repl_add_instances.po index 92c322faeb..7274ab889f 100644 --- a/locale/ru/LC_MESSAGES/how-to/replication/repl_add_instances.po +++ b/locale/ru/LC_MESSAGES/how-to/replication/repl_add_instances.po @@ -3,15 +3,15 @@ msgid "Adding instances" msgstr "Добавление экземпляров" msgid "" -"This tutorial is intended as a follow-up to the " -":ref:`replication bootstrapping ` guide. " -"It continues building on the examples from that page. " -"It is recommended that you complete the bootstrapping guide before you proceed." +"This tutorial is intended as a follow-up to the :ref:`replication " +"bootstrapping ` guide. It continues building on the " +"examples from that page. It is recommended that you complete the " +"bootstrapping guide before you proceed." msgstr "" -"Эта страница логически продолжает " -":ref:`руководство по настройке набора реплик `. " -"Здесь используются и дорабатываются те же примеры. Прежде чем читать дальше, " -"рекомендуется пройти руководство по настройке набора реплик." +"Эта страница логически продолжает :ref:`руководство по настройке набора " +"реплик `. Здесь используются и дорабатываются те же " +"примеры. Прежде чем читать дальше, рекомендуется пройти руководство по " +"настройке набора реплик." msgid "Adding a replica" msgstr "Добавление реплики" diff --git a/locale/ru/LC_MESSAGES/how-to/replication/repl_bootstrap.po b/locale/ru/LC_MESSAGES/how-to/replication/repl_bootstrap.po index adbc278c3a..1d4a856f09 100644 --- a/locale/ru/LC_MESSAGES/how-to/replication/repl_bootstrap.po +++ b/locale/ru/LC_MESSAGES/how-to/replication/repl_bootstrap.po @@ -1,713 +1,1424 @@ -msgid "Bootstrapping a replica set" +#, fuzzy +msgid "Master-replica: manual failover" +msgstr "Настройка репликации мастер-реплика" + +msgid "" +"**Example on GitHub**: `manual_leader " +"`_" +msgstr "" + +msgid "" +"This tutorial shows how to configure and work with a replica set with manual" +" failover." +msgstr "" + +msgid "Prerequisites" +msgstr "" + +msgid "Before starting this tutorial:" +msgstr "" + +msgid "Install the :ref:`tt ` utility." +msgstr "" + +msgid "" +"Create a tt environment in the current directory by executing the :ref:`tt " +"init ` command." +msgstr "" + +msgid "" +"Inside the ``instances.enabled`` directory of the created tt environment, " +"create the ``manual_leader`` directory." +msgstr "" + +msgid "" +"Inside ``instances.enabled/manual_leader``, create the ``instances.yml`` and" +" ``config.yaml`` files:" +msgstr "" + +msgid "" +"``instances.yml`` specifies instances to :ref:`run ` in the current environment and should look like " +"this:" +msgstr "" + +msgid "" +"instance001:\n" +"instance002:\n" +msgstr "" + +msgid "" +"The ``config.yaml`` file is intended to store a :ref:`replica set " +"configuration `." +msgstr "" + +#, fuzzy +msgid "Configuring a replica set" msgstr "Настройка набора реплик" -msgid "Replication setup" -msgstr "Первоначальная настройка репликации" +msgid "" +"This section describes how to configure a replica set in ``config.yaml``." +msgstr "" + +msgid "Step 1: Configuring a failover mode" +msgstr "" msgid "" -"To enable :ref:`replication `, you need to specify two parameters in a ``box.cfg{}``" -" request:" +"First, set the :ref:`replication.failover " +"` option to ``manual``:" msgstr "" -"Чтобы включить репликацию, необходимо указать два параметра в запросе " -"``box.cfg{}``:" msgid "" -":ref:`replication ` which defines the " -"replication source(s), and" +"replication:\n" +" failover: manual\n" msgstr "" -":ref:`replication `, который определяет " -"источники репликации, и" + +#, fuzzy +msgid "Step 2: Defining a replica set topology" +msgstr "Настройка набора реплик" msgid "" -":ref:`read_only ` which is ``true`` for a replica and " -"``false`` for a master." +"Define a replica set topology inside the :ref:`groups " +"` section:" msgstr "" -":ref:`read_only ` со значением ``true`` для реплики и " -"``false`` для мастера." msgid "" -"Both these parameters are \"dynamic\". This allows a replica to become a " -"master and vice versa on the fly with the help of a ``box.cfg{}`` request." +"The :ref:`leader ` option " +"sets ``instance001`` as a replica set leader." msgstr "" -"\"Динамические\" параметры репликации можно менять на лету, что позволяет " -"назначать реплику на роль мастера и наоборот. Для этого используется запрос " -"``box.cfg{}``." -msgid "Master-replica bootstrap" -msgstr "Настройка репликации мастер-реплика" +msgid "" +"The :ref:`iproto.listen ` option " +"specifies an address used to listen for incoming requests and allows " +"replicas to communicate with each other." +msgstr "" + +msgid "" +"groups:\n" +" group001:\n" +" replicasets:\n" +" replicaset001:\n" +" leader: instance001\n" +" instances:\n" +" instance001:\n" +" iproto:\n" +" listen: 127.0.0.1:3301\n" +" instance002:\n" +" iproto:\n" +" listen: 127.0.0.1:3302\n" +msgstr "" + +msgid "Step 3: Creating a user for replication" +msgstr "" + +msgid "" +"In the :ref:`credentials ` section, " +"create the ``replicator`` user with the ``replication`` role:" +msgstr "" + +msgid "" +"credentials:\n" +" users:\n" +" replicator:\n" +" password: 'topsecret'\n" +" roles: [replication]\n" +msgstr "" + +msgid "Step 4: Specifying advertise URIs" +msgstr "" + +msgid "" +"Set :ref:`iproto.advertise.peer " +"` to advertise the current " +"instance to other replica set members:" +msgstr "" + +msgid "" +"iproto:\n" +" advertise:\n" +" peer: replicator@\n" +msgstr "" + +msgid "Resulting configuration" +msgstr "" + +msgid "The resulting replica set configuration should look as follows:" +msgstr "" + +msgid "" +"credentials:\n" +" users:\n" +" replicator:\n" +" password: 'topsecret'\n" +" roles: [replication]\n" +"\n" +"iproto:\n" +" advertise:\n" +" peer: replicator@\n" +"\n" +"replication:\n" +" failover: manual\n" +"\n" +"groups:\n" +" group001:\n" +" replicasets:\n" +" replicaset001:\n" +" leader: instance001\n" +" instances:\n" +" instance001:\n" +" iproto:\n" +" listen: 127.0.0.1:3301\n" +" instance002:\n" +" iproto:\n" +" listen: 127.0.0.1:3302\n" +msgstr "" + +#, fuzzy +msgid "Working with a replica set" +msgstr "Настройка набора реплик" + +msgid "Starting instances" +msgstr "" + +msgid "" +"After configuring a replica set, execute the :ref:`tt start ` " +"command from the :ref:`tt environment directory `:" +msgstr "" + +msgid "" +"$ tt start manual_leader\n" +" • Starting an instance [manual_leader:instance001]...\n" +" • Starting an instance [manual_leader:instance002]..." +msgstr "" + +msgid "" +"Check that instances are in the ``RUNNING`` status using the :ref:`tt status" +" ` command:" +msgstr "" + +msgid "" +"$ tt status manual_leader\n" +"INSTANCE STATUS PID\n" +"manual_leader:instance001 RUNNING 15272\n" +"manual_leader:instance002 RUNNING 15273" +msgstr "" + +#, fuzzy +msgid "Checking a replica set status" +msgstr "Настройка набора реплик" + +msgid "Connect to ``instance001`` using :ref:`tt connect `:" +msgstr "" + +msgid "" +"$ tt connect manual_leader:instance001\n" +" • Connecting to the instance...\n" +" • Connected to manual_leader:instance001" +msgstr "" + +msgid "" +"Make sure that the instance is in the ``running`` state by executing " +":ref:`box.info.status `:" +msgstr "" + +msgid "" +"manual_leader:instance001> box.info.status\n" +"---\n" +"- running\n" +"..." +msgstr "" + +msgid "Check that the instance is writable using ``box.info.ro``:" +msgstr "" + +msgid "" +"manual_leader:instance001> box.info.ro\n" +"---\n" +"- false\n" +"..." +msgstr "" + +msgid "" +"Execute ``box.info.replication`` to check a replica set status. For " +"``instance002``, ``upstream.status`` and ``downstream.status`` should be " +"``follow``." +msgstr "" + +msgid "" +"manual_leader:instance001> box.info.replication\n" +"---\n" +"- 1:\n" +" id: 1\n" +" uuid: 9bb111c2-3ff5-36a7-00f4-2b9a573ea660\n" +" lsn: 7\n" +" name: instance001\n" +" 2:\n" +" id: 2\n" +" uuid: 4cfa6e3c-625e-b027-00a7-29b2f2182f23\n" +" lsn: 0\n" +" upstream:\n" +" status: follow\n" +" idle: 0.3893879999996\n" +" peer: replicator@127.0.0.1:3302\n" +" lag: 0.00028800964355469\n" +" name: instance002\n" +" downstream:\n" +" status: follow\n" +" idle: 0.37777199999982\n" +" vclock: {1: 7}\n" +" lag: 0\n" +"..." +msgstr "" + +msgid "Adding data" +msgstr "" + +msgid "" +"To check that a replica (``instance002``) gets all updates from the master, " +"follow the steps below:" +msgstr "" + +msgid "" +"On ``instance001``, create a space and add data as described in :ref:`CRUD " +"operation examples `." +msgstr "" + +msgid "" +"Open the second terminal, connect to ``instance002`` using ``tt connect``, " +"and use the ``select`` operation to make sure data is replicated." +msgstr "" + +msgid "" +"Check that :ref:`box.info.vclock ` values are " +"the same on both instances:" +msgstr "" + +msgid "``instance001``:" +msgstr "" + +msgid "" +"manual_leader:instance001> box.info.vclock\n" +"---\n" +"- {1: 21}\n" +"..." +msgstr "" + +msgid "``instance002``:" +msgstr "" + +msgid "" +"manual_leader:instance002> box.info.vclock\n" +"---\n" +"- {1: 21}\n" +"..." +msgstr "" + +msgid "" +"Note that a ``vclock`` value might include the ``0`` component that is " +"related to local space operations and might differ for different instances " +"in a replica set." +msgstr "" + +msgid "Adding instances" +msgstr "" + +msgid "This section describes how to add a new replica to a replica set." +msgstr "" + +msgid "Adding an instance to the configuration" +msgstr "" + +msgid "Add ``instance003`` to the ``instances.yml`` file:" +msgstr "" + +msgid "" +"instance001:\n" +"instance002:\n" +"instance003:" +msgstr "" + +msgid "" +"Add ``instance003`` with the specified ``iproto.listen`` option to the " +"``config.yaml`` file:" +msgstr "" + +msgid "" +"groups:\n" +" group001:\n" +" replicasets:\n" +" replicaset001:\n" +" leader: instance001\n" +" instances:\n" +" instance001:\n" +" iproto:\n" +" listen: 127.0.0.1:3301\n" +" instance002:\n" +" iproto:\n" +" listen: 127.0.0.1:3302\n" +" instance003:\n" +" iproto:\n" +" listen: 127.0.0.1:3303\n" +msgstr "" + +msgid "Starting an instance" +msgstr "" + +msgid "" +"Open the third terminal to work with a new instance. Start ``instance003`` " +"using ``tt start``:" +msgstr "" + +msgid "" +"$ tt start manual_leader:instance003\n" +" • Starting an instance [manual_leader:instance003]..." +msgstr "" + +msgid "Check a replica set status using ``tt status``:" +msgstr "" + +msgid "" +"$ tt status manual_leader\n" +"INSTANCE STATUS PID\n" +"manual_leader:instance001 RUNNING 15272\n" +"manual_leader:instance002 RUNNING 15273\n" +"manual_leader:instance003 RUNNING 15551" +msgstr "" + +msgid "Reloading configuration" +msgstr "" + +msgid "" +"After you added ``instance003`` to the configuration and started it, you " +"need to reload configurations on all instances. This is required to allow " +"``instance001`` and ``instance002`` to get data from the new instance in " +"case it becomes a master." +msgstr "" + +msgid "Connect to ``instance003`` using ``tt connect``:" +msgstr "" + +msgid "" +"$ tt connect manual_leader:instance003\n" +" • Connecting to the instance...\n" +" • Connected to manual_leader:instance001" +msgstr "" + +msgid "" +"Reload configurations on all three instances using the ``reload()`` function" +" provided by the :ref:`config ` module:" +msgstr "" + +msgid "" +"manual_leader:instance001> require('config'):reload()\n" +"---\n" +"..." +msgstr "" + +msgid "" +"manual_leader:instance002> require('config'):reload()\n" +"---\n" +"..." +msgstr "" + +msgid "``instance003``:" +msgstr "" + +msgid "" +"manual_leader:instance003> require('config'):reload()\n" +"---\n" +"..." +msgstr "" + +msgid "" +"Execute ``box.info.replication`` to check a replica set status. Make sure " +"that ``upstream.status`` and ``downstream.status`` are ``follow`` for " +"``instance003``." +msgstr "" + +msgid "" +"manual_leader:instance001> box.info.replication\n" +"---\n" +"- 1:\n" +" id: 1\n" +" uuid: 9bb111c2-3ff5-36a7-00f4-2b9a573ea660\n" +" lsn: 21\n" +" name: instance001\n" +" 2:\n" +" id: 2\n" +" uuid: 4cfa6e3c-625e-b027-00a7-29b2f2182f23\n" +" lsn: 0\n" +" upstream:\n" +" status: follow\n" +" idle: 0.052655000000414\n" +" peer: replicator@127.0.0.1:3302\n" +" lag: 0.00010204315185547\n" +" name: instance002\n" +" downstream:\n" +" status: follow\n" +" idle: 0.09503500000028\n" +" vclock: {1: 21}\n" +" lag: 0.00026917457580566\n" +" 3:\n" +" id: 3\n" +" uuid: 9a3a1b9b-8a18-baf6-00b3-a6e5e11fd8b6\n" +" lsn: 0\n" +" upstream:\n" +" status: follow\n" +" idle: 0.77522099999987\n" +" peer: replicator@127.0.0.1:3303\n" +" lag: 0.0001838207244873\n" +" name: instance003\n" +" downstream:\n" +" status: follow\n" +" idle: 0.33186100000012\n" +" vclock: {1: 21}\n" +" lag: 0\n" +" ..." +msgstr "" + +msgid "Performing manual failover" +msgstr "" + +msgid "" +"This section shows how to perform manual failover and change a replica set " +"leader." +msgstr "" + +msgid "Switching instances to read-only mode" +msgstr "" + +msgid "" +"In the ``config.yaml`` file, change the replica set leader from " +"``instance001`` to ``null``:" +msgstr "" + +msgid "" +"replicaset001:\n" +" leader: null" +msgstr "" + +msgid "" +"Reload configurations on all three instances using :ref:`config:reload() " +"` and check that instances are in read-only mode. The example" +" below shows how to do this for ``instance001``:" +msgstr "" msgid "" -"Let us first bootstrap a simple **master-replica** set containing two " -"instances, each located on its own machine. For easier administration, we " -"make the :ref:`instance files ` almost identical." -msgstr "" -"Сначала настроим простой набор **мастер-реплика** с двумя экземплярами, " -"каждый из которых находится на отдельном сервере. Для удобства " -"администрирования сделаем :ref:`файлы экземпляров ` " -"практически одинаковыми." - -msgid "Here is an example of the master's instance file:" -msgstr "Ниже пример файла экземпляра для мастера:" - -msgid "" -"-- instance file for the master\n" -"box.cfg{\n" -" listen = 3301,\n" -" replication = {'replicator:password@192.168.0.101:3301', -- master URI\n" -" 'replicator:password@192.168.0.102:3301'}, -- replica URI\n" -" read_only = false\n" -"}\n" -"box.once(\"schema\", function()\n" -" box.schema.user.create('replicator', {password = 'password'})\n" -" box.schema.user.grant('replicator', 'replication') -- grant replication role\n" -" box.schema.space.create(\"test\")\n" -" box.space.test:create_index(\"primary\")\n" -" print('box.once executed on master')\n" -"end)" -msgstr "" -"-- файл экземпляра для мастера\n" -"box.cfg{\n" -" listen = 3301,\n" -" replication = {'replicator:password@192.168.0.101:3301', -- URI мастера\n" -" 'replicator:password@192.168.0.102:3301'}, -- URI реплики\n" -" read_only = false\n" -"}\n" -"box.once(\"schema\", function()\n" -" box.schema.user.create('replicator', {password = 'password'})\n" -" box.schema.user.grant('replicator', 'replication') -- настроить роль для репликации\n" -" box.schema.space.create(\"test\")\n" -" box.space.test:create_index(\"primary\")\n" -" print('box.once executed on master')\n" -"end)" - -msgid "where:" -msgstr "где:" - -msgid "" -"the ``box.cfg()`` :ref:`listen ` parameter defines a URI " -"(port 3301 in our example), on which the master can accept connections from " -"replicas." -msgstr "" -"параметр :ref:`listen ` в ``box.cfg{}`` определяет URI " -"(порт 3301 в нашем примере), на котором мастер может принимать подключения " -"от реплик." - -msgid "" -"the ``box.cfg()`` :ref:`replication ` parameter" -" defines the URIs at which all instances in the replica set can accept " -"connections. It includes the replica's URI as well, although the replica is " -"not a replication source right now. This parameter is mandatory only for " -"master-master or full-mesh cluster setups." -msgstr "" -"параметр :ref:`replication ` в ``box.cfg{}`` " -"определяет URI, на которых все экземпляры в наборе реплик могут принимать " -"подключения. Он включает в себя также URI реплики, хотя реплики в данном " -"случае не является источником репликации. Этот параметр является " -"обязательным только при настройке кластеров с конфигурацией master-master " -"или full-mesh." - -msgid "" -"For security reasons, we recommend that administrators prevent unauthorized " -"replication sources by associating a password with every user that has a " -"replication :ref:`role `. That way, the :ref:`URI " -"` for ``replication`` parameter must have the long form " -"``username:password@host:port``." -msgstr "" -"Для целей безопасности рекомендуем администраторам не допускать репликацию " -"из неавторизованных источников с помощью установки пароля для каждого " -"пользователя, у которого есть :ref:`роль ` для " -"репликации. Таким образом, :ref:`URI ` для параметра " -"``replication`` должен иметь развернутый вид " -"``username:password@host:port``." - -msgid "" -"the :ref:`read_only = false ` parameter setting enables" -" data-change operations on the instance and makes the instance act as a " -"master, not as a replica. *That is the only parameter setting in our " -"instance files that will differ.*" -msgstr "" -"параметр :ref:`read_only = false ` разрешает операции " -"по изменению данных на экземпляре и заставляет данный экземпляр работать в " -"качестве мастера, а не реплики. *Это единственное значение параметра, " -"которое отличается в наших файлах экземпляров.*" - -msgid "" -"the :doc:`box.once() ` function contains " -"database initialization logic that should be executed only once during the " -"replica set lifetime." -msgstr "" -"функция :doc:`box.once() ` содержит " -"логику инициализации базы данных, которая должна выполняться однократно в " -"течение срока работы набора реплик." - -msgid "" -"In this example, we create a space with a primary index, and a user for " -"replication purposes. We also say ``print('box.once executed on master')`` " -"so that it will later be visible on a console whether ``box.once()`` was " -"executed." -msgstr "" -"В данном примере создаем спейс с первичным индексом и пользователя для целей" -" репликации. Также выполним команду ``print('box.once executed on " -"master')``, чтобы позднее увидеть в консоли, была ли выполнена функция " -"``box.once()``." - -msgid "" -"Replication requires privileges. We can grant privileges for accessing " -"spaces directly to the user who will start the instance. However, it is more" -" usual to grant privileges for accessing spaces to a :ref:`role " -"`, and then grant the role to the user who will start " -"the replica." -msgstr "" -"Репликация требует настройки прав. Права на доступ к спейсам можно задать " -"напрямую для пользователя, под чьим именем запущен экземпляр. Но обычно " -"права на доступ к спейсам задаются с помощью :ref:`роли `, которая затем присваивается пользователю, под чьим именем запущена " -"реплика." - -msgid "" -"Here we use Tarantool's predefined role named \"replication\" which by " -"default grants \"read\" privileges for all database objects (\"universe\"), " -"and we can change privileges for this role as required." -msgstr "" -"Здесь мы используем предварительно определенную роль Tarantool под " -"названием \"replication\", которая по умолчанию предоставляет права на " -"чтение всех объектов в базе данных (\"universe\"), а также сможем настроить " -"необходимые права для этой роли." - -msgid "" -"In the replica's instance file, we set the ``read_only`` parameter to " -"\"true\", and say ``print('box.once executed on replica')`` so that later it" -" will be visible that ``box.once()`` was not executed more than once. " -"Otherwise the replica's instance file is identical to the master's instance " -"file." -msgstr "" -"В файле экземпляра для реплики устанавливаем значение \"true\" для параметра" -" ``read_only`` и выполняем команду ``print('box.once executed on " -"replica')``, чтобы позднее убедиться, что ``box.once()`` выполняется только " -"однократно. В других отношениях файл экземпляра для реплики совпадает с " -"файлом экземпляра для мастера." - -msgid "" -"-- instance file for the replica\n" -"box.cfg{\n" -" listen = 3301,\n" -" replication = {'replicator:password@192.168.0.101:3301', -- master URI\n" -" 'replicator:password@192.168.0.102:3301'}, -- replica URI\n" -" read_only = true\n" -"}\n" -"box.once(\"schema\", function()\n" -" box.schema.user.create('replicator', {password = 'password'})\n" -" box.schema.user.grant('replicator', 'replication') -- grant replication role\n" -" box.schema.space.create(\"test\")\n" -" box.space.test:create_index(\"primary\")\n" -" print('box.once executed on replica')\n" -"end)" -msgstr "" -"-- файл экземпляра для реплики\n" -"box.cfg{\n" -" listen = 3301,\n" -" replication = {'replicator:password@192.168.0.101:3301', -- URI мастера\n" -" 'replicator:password@192.168.0.102:3301'}, -- URI реплики\n" -" read_only = true\n" -"}\n" -"box.once(\"schema\", function()\n" -" box.schema.user.create('replicator', {password = 'password'})\n" -" box.schema.user.grant('replicator', 'replication') -- настроить роль для репликации\n" -" box.schema.space.create(\"test\")\n" -" box.space.test:create_index(\"primary\")\n" -" print('box.once executed on replica')\n" -"end)" - -msgid "" -"The replica does not inherit the master’s configuration parameters, such as " -"those making the :ref:`checkpoint daemon ` run " -"on the master. To get the same behavior, set the relevant parameters " -"explicitly so that they are the same on both master and replica." -msgstr "" -"Реплика не берет конфигурационные параметры с мастера, например настройки " -"запуска :ref:`фоновой программы для работы с контрольными точками " -"` на мастере. Чтобы получить те же настройки на " -"реплике, необходимо задать их явным образом." - -msgid "Now we can launch the two instances. The master..." -msgstr "Теперь можно запустить два экземпляра. Мастер..." - -msgid "" -"$ # launching the master\n" -"$ tarantool master.lua\n" -"2017-06-14 14:12:03.847 [18933] main/101/master.lua C> version 1.7.4-52-g980d30092\n" -"2017-06-14 14:12:03.848 [18933] main/101/master.lua C> log level 5\n" -"2017-06-14 14:12:03.849 [18933] main/101/master.lua I> mapping 268435456 bytes for tuple arena...\n" -"2017-06-14 14:12:03.859 [18933] iproto/101/main I> binary: bound to [::]:3301\n" -"2017-06-14 14:12:03.861 [18933] main/105/applier/replicator@192.168.0. I> can't connect to master\n" -"2017-06-14 14:12:03.861 [18933] main/105/applier/replicator@192.168.0. coio.cc:105 !> SystemError connect, called on fd 14, aka 192.168.0.102:56736: Connection refused\n" -"2017-06-14 14:12:03.861 [18933] main/105/applier/replicator@192.168.0. I> will retry every 1 second\n" -"2017-06-14 14:12:03.861 [18933] main/104/applier/replicator@192.168.0. I> remote master is 1.7.4 at 192.168.0.101:3301\n" -"2017-06-14 14:12:19.878 [18933] main/105/applier/replicator@192.168.0. I> remote master is 1.7.4 at 192.168.0.102:3301\n" -"2017-06-14 14:12:19.879 [18933] main/101/master.lua I> initializing an empty data directory\n" -"2017-06-14 14:12:19.908 [18933] snapshot/101/main I> saving snapshot `/var/lib/tarantool/master/00000000000000000000.snap.inprogress'\n" -"2017-06-14 14:12:19.914 [18933] snapshot/101/main I> done\n" -"2017-06-14 14:12:19.914 [18933] main/101/master.lua I> vinyl checkpoint done\n" -"2017-06-14 14:12:19.917 [18933] main/101/master.lua I> ready to accept requests\n" -"2017-06-14 14:12:19.918 [18933] main/105/applier/replicator@192.168.0. I> failed to authenticate\n" -"2017-06-14 14:12:19.918 [18933] main/105/applier/replicator@192.168.0. xrow.cc:431 E> ER_LOADING: Instance bootstrap hasn't finished yet\n" -"box.once executed on master\n" -"2017-06-14 14:12:19.920 [18933] main C> entering the event loop" -msgstr "" -"$ # запуск мастера\n" -"$ tarantool master.lua\n" -"2017-06-14 14:12:03.847 [18933] main/101/master.lua C> version 1.7.4-52-g980d30092\n" -"2017-06-14 14:12:03.848 [18933] main/101/master.lua C> log level 5\n" -"2017-06-14 14:12:03.849 [18933] main/101/master.lua I> mapping 268435456 bytes for tuple arena...\n" -"2017-06-14 14:12:03.859 [18933] iproto/101/main I> binary: bound to [::]:3301\n" -"2017-06-14 14:12:03.861 [18933] main/105/applier/replicator@192.168.0. I> can't connect to master\n" -"2017-06-14 14:12:03.861 [18933] main/105/applier/replicator@192.168.0. coio.cc:105 !> SystemError connect, called on fd 14, aka 192.168.0.102:56736: Connection refused\n" -"2017-06-14 14:12:03.861 [18933] main/105/applier/replicator@192.168.0. I> will retry every 1 second\n" -"2017-06-14 14:12:03.861 [18933] main/104/applier/replicator@192.168.0. I> remote master is 1.7.4 at 192.168.0.101:3301\n" -"2017-06-14 14:12:19.878 [18933] main/105/applier/replicator@192.168.0. I> remote master is 1.7.4 at 192.168.0.102:3301\n" -"2017-06-14 14:12:19.879 [18933] main/101/master.lua I> initializing an empty data directory\n" -"2017-06-14 14:12:19.908 [18933] snapshot/101/main I> saving snapshot `/var/lib/tarantool/master/00000000000000000000.snap.inprogress'\n" -"2017-06-14 14:12:19.914 [18933] snapshot/101/main I> done\n" -"2017-06-14 14:12:19.914 [18933] main/101/master.lua I> vinyl checkpoint done\n" -"2017-06-14 14:12:19.917 [18933] main/101/master.lua I> ready to accept requests\n" -"2017-06-14 14:12:19.918 [18933] main/105/applier/replicator@192.168.0. I> failed to authenticate\n" -"2017-06-14 14:12:19.918 [18933] main/105/applier/replicator@192.168.0. xrow.cc:431 E> ER_LOADING: Instance bootstrap hasn't finished yet\n" -"box.once executed on master\n" -"2017-06-14 14:12:19.920 [18933] main C> entering the event loop" - -msgid "" -"... (the display confirms that ``box.once()`` was executed on the master) --" -" and the replica:" -msgstr "" -"... (выведенный результат подтверждает, что функция ``box.once()`` была " -"выполнена на мастере) -- и реплику:" - -msgid "" -"$ # launching the replica\n" -"$ tarantool replica.lua\n" -"2017-06-14 14:12:19.486 [18934] main/101/replica.lua C> version 1.7.4-52-g980d30092\n" -"2017-06-14 14:12:19.486 [18934] main/101/replica.lua C> log level 5\n" -"2017-06-14 14:12:19.487 [18934] main/101/replica.lua I> mapping 268435456 bytes for tuple arena...\n" -"2017-06-14 14:12:19.494 [18934] iproto/101/main I> binary: bound to [::]:3311\n" -"2017-06-14 14:12:19.495 [18934] main/104/applier/replicator@192.168.0. I> remote master is 1.7.4 at 192.168.0.101:3301\n" -"2017-06-14 14:12:19.495 [18934] main/105/applier/replicator@192.168.0. I> remote master is 1.7.4 at 192.168.0.102:3302\n" -"2017-06-14 14:12:19.496 [18934] main/104/applier/replicator@192.168.0. I> failed to authenticate\n" -"2017-06-14 14:12:19.496 [18934] main/104/applier/replicator@192.168.0. xrow.cc:431 E> ER_LOADING: Instance bootstrap hasn't finished yet" -msgstr "" -"$ # запуск реплики\n" -"$ tarantool replica.lua\n" -"2017-06-14 14:12:19.486 [18934] main/101/replica.lua C> version 1.7.4-52-g980d30092\n" -"2017-06-14 14:12:19.486 [18934] main/101/replica.lua C> log level 5\n" -"2017-06-14 14:12:19.487 [18934] main/101/replica.lua I> mapping 268435456 bytes for tuple arena...\n" -"2017-06-14 14:12:19.494 [18934] iproto/101/main I> binary: bound to [::]:3311\n" -"2017-06-14 14:12:19.495 [18934] main/104/applier/replicator@192.168.0. I> remote master is 1.7.4 at 192.168.0.101:3301\n" -"2017-06-14 14:12:19.495 [18934] main/105/applier/replicator@192.168.0. I> remote master is 1.7.4 at 192.168.0.102:3302\n" -"2017-06-14 14:12:19.496 [18934] main/104/applier/replicator@192.168.0. I> failed to authenticate\n" -"2017-06-14 14:12:19.496 [18934] main/104/applier/replicator@192.168.0. xrow.cc:431 E> ER_LOADING: Instance bootstrap hasn't finished yet" - -msgid "" -"In both logs, there are messages saying that the replica was bootstrapped " -"from the master:" -msgstr "" -"В обоих журналах есть сообщения о том, что реплика получила настройки от " -"мастера:" - -msgid "" -"$ # bootstrapping the replica (from the master's log)\n" -"<...>\n" -"2017-06-14 14:12:20.503 [18933] main/106/main I> initial data sent.\n" -"2017-06-14 14:12:20.505 [18933] relay/[::ffff:192.168.0.101]:/101/main I> recover from `/var/lib/tarantool/master/00000000000000000000.xlog'\n" -"2017-06-14 14:12:20.505 [18933] main/106/main I> final data sent.\n" -"2017-06-14 14:12:20.522 [18933] relay/[::ffff:192.168.0.101]:/101/main I> recover from `/Users/e.shebunyaeva/work/tarantool-test-repl/master_dir/00000000000000000000.xlog'\n" -"2017-06-14 14:12:20.922 [18933] main/105/applier/replicator@192.168.0. I> authenticated" -msgstr "" -"$ # настройка реплики (из журнала мастера)\n" -"<...>\n" -"2017-06-14 14:12:20.503 [18933] main/106/main I> initial data sent.\n" -"2017-06-14 14:12:20.505 [18933] relay/[::ffff:192.168.0.101]:/101/main I> recover from `/var/lib/tarantool/master/00000000000000000000.xlog'\n" -"2017-06-14 14:12:20.505 [18933] main/106/main I> final data sent.\n" -"2017-06-14 14:12:20.522 [18933] relay/[::ffff:192.168.0.101]:/101/main I> recover from `/Users/e.shebunyaeva/work/tarantool-test-repl/master_dir/00000000000000000000.xlog'\n" -"2017-06-14 14:12:20.922 [18933] main/105/applier/replicator@192.168.0. I> authenticated" - -msgid "" -"$ # bootstrapping the replica (from the replica's log)\n" -"<...>\n" -"2017-06-14 14:12:20.498 [18934] main/104/applier/replicator@192.168.0. I> authenticated\n" -"2017-06-14 14:12:20.498 [18934] main/101/replica.lua I> bootstrapping replica from 192.168.0.101:3301\n" -"2017-06-14 14:12:20.512 [18934] main/104/applier/replicator@192.168.0. I> initial data received\n" -"2017-06-14 14:12:20.512 [18934] main/104/applier/replicator@192.168.0. I> final data received\n" -"2017-06-14 14:12:20.517 [18934] snapshot/101/main I> saving snapshot `/var/lib/tarantool/replica/00000000000000000005.snap.inprogress'\n" -"2017-06-14 14:12:20.518 [18934] snapshot/101/main I> done\n" -"2017-06-14 14:12:20.519 [18934] main/101/replica.lua I> vinyl checkpoint done\n" -"2017-06-14 14:12:20.520 [18934] main/101/replica.lua I> ready to accept requests\n" -"2017-06-14 14:12:20.520 [18934] main/101/replica.lua I> set 'read_only' configuration option to true\n" -"2017-06-14 14:12:20.520 [18934] main C> entering the event loop" -msgstr "" -"$ # настройка реплики (из журнала реплики)\n" -"<...>\n" -"2017-06-14 14:12:20.498 [18934] main/104/applier/replicator@192.168.0. I> authenticated\n" -"2017-06-14 14:12:20.498 [18934] main/101/replica.lua I> bootstrapping replica from 192.168.0.101:3301\n" -"2017-06-14 14:12:20.512 [18934] main/104/applier/replicator@192.168.0. I> initial data received\n" -"2017-06-14 14:12:20.512 [18934] main/104/applier/replicator@192.168.0. I> final data received\n" -"2017-06-14 14:12:20.517 [18934] snapshot/101/main I> saving snapshot `/var/lib/tarantool/replica/00000000000000000005.snap.inprogress'\n" -"2017-06-14 14:12:20.518 [18934] snapshot/101/main I> done\n" -"2017-06-14 14:12:20.519 [18934] main/101/replica.lua I> vinyl checkpoint done\n" -"2017-06-14 14:12:20.520 [18934] main/101/replica.lua I> ready to accept requests\n" -"2017-06-14 14:12:20.520 [18934] main/101/replica.lua I> set 'read_only' configuration option to true\n" -"2017-06-14 14:12:20.520 [18934] main C> entering the event loop" - -msgid "" -"Notice that ``box.once()`` was executed only at the master, although we " -"added ``box.once()`` to both instance files." -msgstr "" -"Обратите внимание, что функция ``box.once()`` была выполнена только на " -"мастере, хотя мы добавили ``box.once()`` в оба файла экземпляра." - -msgid "We could as well launch the replica first:" -msgstr "Также можно было сначала запустить реплику:" - -msgid "" -"$ # launching the replica\n" -"$ tarantool replica.lua\n" -"2017-06-14 14:35:36.763 [18952] main/101/replica.lua C> version 1.7.4-52-g980d30092\n" -"2017-06-14 14:35:36.765 [18952] main/101/replica.lua C> log level 5\n" -"2017-06-14 14:35:36.765 [18952] main/101/replica.lua I> mapping 268435456 bytes for tuple arena...\n" -"2017-06-14 14:35:36.772 [18952] iproto/101/main I> binary: bound to [::]:3301\n" -"2017-06-14 14:35:36.772 [18952] main/104/applier/replicator@192.168.0. I> can't connect to master\n" -"2017-06-14 14:35:36.772 [18952] main/104/applier/replicator@192.168.0. coio.cc:105 !> SystemError connect, called on fd 13, aka 192.168.0.101:56820: Connection refused\n" -"2017-06-14 14:35:36.772 [18952] main/104/applier/replicator@192.168.0. I> will retry every 1 second\n" -"2017-06-14 14:35:36.772 [18952] main/105/applier/replicator@192.168.0. I> remote master is 1.7.4 at 192.168.0.102:3301" -msgstr "" -"$ # запуск реплики\n" -"$ tarantool replica.lua\n" -"2017-06-14 14:35:36.763 [18952] main/101/replica.lua C> version 1.7.4-52-g980d30092\n" -"2017-06-14 14:35:36.765 [18952] main/101/replica.lua C> log level 5\n" -"2017-06-14 14:35:36.765 [18952] main/101/replica.lua I> mapping 268435456 bytes for tuple arena...\n" -"2017-06-14 14:35:36.772 [18952] iproto/101/main I> binary: bound to [::]:3301\n" -"2017-06-14 14:35:36.772 [18952] main/104/applier/replicator@192.168.0. I> can't connect to master\n" -"2017-06-14 14:35:36.772 [18952] main/104/applier/replicator@192.168.0. coio.cc:105 !> SystemError connect, called on fd 13, aka 192.168.0.101:56820: Connection refused\n" -"2017-06-14 14:35:36.772 [18952] main/104/applier/replicator@192.168.0. I> will retry every 1 second\n" -"2017-06-14 14:35:36.772 [18952] main/105/applier/replicator@192.168.0. I> remote master is 1.7.4 at 192.168.0.102:3301" - -msgid "... and the master later:" -msgstr "... а затем уже мастера:" - -msgid "" -"$ # launching the master\n" -"$ tarantool master.lua\n" -"2017-06-14 14:35:43.701 [18953] main/101/master.lua C> version 1.7.4-52-g980d30092\n" -"2017-06-14 14:35:43.702 [18953] main/101/master.lua C> log level 5\n" -"2017-06-14 14:35:43.702 [18953] main/101/master.lua I> mapping 268435456 bytes for tuple arena...\n" -"2017-06-14 14:35:43.709 [18953] iproto/101/main I> binary: bound to [::]:3301\n" -"2017-06-14 14:35:43.709 [18953] main/105/applier/replicator@192.168.0. I> remote master is 1.7.4 at 192.168.0.102:3301\n" -"2017-06-14 14:35:43.709 [18953] main/104/applier/replicator@192.168.0. I> remote master is 1.7.4 at 192.168.0.101:3301\n" -"2017-06-14 14:35:43.709 [18953] main/101/master.lua I> initializing an empty data directory\n" -"2017-06-14 14:35:43.721 [18953] snapshot/101/main I> saving snapshot `/var/lib/tarantool/master/00000000000000000000.snap.inprogress'\n" -"2017-06-14 14:35:43.722 [18953] snapshot/101/main I> done\n" -"2017-06-14 14:35:43.723 [18953] main/101/master.lua I> vinyl checkpoint done\n" -"2017-06-14 14:35:43.723 [18953] main/101/master.lua I> ready to accept requests\n" -"2017-06-14 14:35:43.724 [18953] main/105/applier/replicator@192.168.0. I> failed to authenticate\n" -"2017-06-14 14:35:43.724 [18953] main/105/applier/replicator@192.168.0. xrow.cc:431 E> ER_LOADING: Instance bootstrap hasn't finished yet\n" -"box.once executed on master\n" -"2017-06-14 14:35:43.726 [18953] main C> entering the event loop\n" -"2017-06-14 14:35:43.779 [18953] main/103/main I> initial data sent.\n" -"2017-06-14 14:35:43.780 [18953] relay/[::ffff:192.168.0.101]:/101/main I> recover from `/var/lib/tarantool/master/00000000000000000000.xlog'\n" -"2017-06-14 14:35:43.780 [18953] main/103/main I> final data sent.\n" -"2017-06-14 14:35:43.796 [18953] relay/[::ffff:192.168.0.102]:/101/main I> recover from `/var/lib/tarantool/master/00000000000000000000.xlog'\n" -"2017-06-14 14:35:44.726 [18953] main/105/applier/replicator@192.168.0. I> authenticated" -msgstr "" -"$ # запуск мастера\n" -"$ tarantool master.lua\n" -"2017-06-14 14:35:43.701 [18953] main/101/master.lua C> version 1.7.4-52-g980d30092\n" -"2017-06-14 14:35:43.702 [18953] main/101/master.lua C> log level 5\n" -"2017-06-14 14:35:43.702 [18953] main/101/master.lua I> mapping 268435456 bytes for tuple arena...\n" -"2017-06-14 14:35:43.709 [18953] iproto/101/main I> binary: bound to [::]:3301\n" -"2017-06-14 14:35:43.709 [18953] main/105/applier/replicator@192.168.0. I> remote master is 1.7.4 at 192.168.0.102:3301\n" -"2017-06-14 14:35:43.709 [18953] main/104/applier/replicator@192.168.0. I> remote master is 1.7.4 at 192.168.0.101:3301\n" -"2017-06-14 14:35:43.709 [18953] main/101/master.lua I> initializing an empty data directory\n" -"2017-06-14 14:35:43.721 [18953] snapshot/101/main I> saving snapshot `/var/lib/tarantool/master/00000000000000000000.snap.inprogress'\n" -"2017-06-14 14:35:43.722 [18953] snapshot/101/main I> done\n" -"2017-06-14 14:35:43.723 [18953] main/101/master.lua I> vinyl checkpoint done\n" -"2017-06-14 14:35:43.723 [18953] main/101/master.lua I> ready to accept requests\n" -"2017-06-14 14:35:43.724 [18953] main/105/applier/replicator@192.168.0. I> failed to authenticate\n" -"2017-06-14 14:35:43.724 [18953] main/105/applier/replicator@192.168.0. xrow.cc:431 E> ER_LOADING: Instance bootstrap hasn't finished yet\n" -"box.once executed on master\n" -"2017-06-14 14:35:43.726 [18953] main C> entering the event loop\n" -"2017-06-14 14:35:43.779 [18953] main/103/main I> initial data sent.\n" -"2017-06-14 14:35:43.780 [18953] relay/[::ffff:192.168.0.101]:/101/main I> recover from `/var/lib/tarantool/master/00000000000000000000.xlog'\n" -"2017-06-14 14:35:43.780 [18953] main/103/main I> final data sent.\n" -"2017-06-14 14:35:43.796 [18953] relay/[::ffff:192.168.0.102]:/101/main I> recover from `/var/lib/tarantool/master/00000000000000000000.xlog'\n" -"2017-06-14 14:35:44.726 [18953] main/105/applier/replicator@192.168.0. I> authenticated" - -msgid "" -"In this case, the replica would wait for the master to become available, so " -"the launch order doesn't matter. Our ``box.once()`` logic would also be " -"executed only once, at the master." -msgstr "" -"В данном случае реплика ожидает доступности мастера, поэтому порядок запуска" -" не имеет значения. Наша функция ``box.once()`` также будет выполняться " -"однократно, только на мастере." - -msgid "" -"$ # the replica has eventually connected to the master\n" -"$ # and got bootstrapped (from the replica's log)\n" -"2017-06-14 14:35:43.777 [18952] main/104/applier/replicator@192.168.0. I> remote master is 1.7.4 at 192.168.0.101:3301\n" -"2017-06-14 14:35:43.777 [18952] main/104/applier/replicator@192.168.0. I> authenticated\n" -"2017-06-14 14:35:43.777 [18952] main/101/replica.lua I> bootstrapping replica from 192.168.0.199:3310\n" -"2017-06-14 14:35:43.788 [18952] main/104/applier/replicator@192.168.0. I> initial data received\n" -"2017-06-14 14:35:43.789 [18952] main/104/applier/replicator@192.168.0. I> final data received\n" -"2017-06-14 14:35:43.793 [18952] snapshot/101/main I> saving snapshot `/var/lib/tarantool/replica/00000000000000000005.snap.inprogress'\n" -"2017-06-14 14:35:43.793 [18952] snapshot/101/main I> done\n" -"2017-06-14 14:35:43.795 [18952] main/101/replica.lua I> vinyl checkpoint done\n" -"2017-06-14 14:35:43.795 [18952] main/101/replica.lua I> ready to accept requests\n" -"2017-06-14 14:35:43.795 [18952] main/101/replica.lua I> set 'read_only' configuration option to true\n" -"2017-06-14 14:35:43.795 [18952] main C> entering the event loop" -msgstr "" -"$ # реплика в итоге подключена к мастеру\n" -"$ # и получила настройки (из журнала реплики)\n" -"2017-06-14 14:35:43.777 [18952] main/104/applier/replicator@192.168.0. I> remote master is 1.7.4 at 192.168.0.101:3301\n" -"2017-06-14 14:35:43.777 [18952] main/104/applier/replicator@192.168.0. I> authenticated\n" -"2017-06-14 14:35:43.777 [18952] main/101/replica.lua I> bootstrapping replica from 192.168.0.199:3310\n" -"2017-06-14 14:35:43.788 [18952] main/104/applier/replicator@192.168.0. I> initial data received\n" -"2017-06-14 14:35:43.789 [18952] main/104/applier/replicator@192.168.0. I> final data received\n" -"2017-06-14 14:35:43.793 [18952] snapshot/101/main I> saving snapshot `/var/lib/tarantool/replica/00000000000000000005.snap.inprogress'\n" -"2017-06-14 14:35:43.793 [18952] snapshot/101/main I> done\n" -"2017-06-14 14:35:43.795 [18952] main/101/replica.lua I> vinyl checkpoint done\n" -"2017-06-14 14:35:43.795 [18952] main/101/replica.lua I> ready to accept requests\n" -"2017-06-14 14:35:43.795 [18952] main/101/replica.lua I> set 'read_only' configuration option to true\n" -"2017-06-14 14:35:43.795 [18952] main C> entering the event loop" - -msgid "Controlled failover" -msgstr "Контролируемое восстановление после сбоя" - -msgid "" -"To perform a **controlled failover**, that is, swap the roles of the master " -"and replica, all we need to do is to set ``read_only=true`` at the master, " -"and ``read_only=false`` at the replica. The order of actions is important " -"here. If a system is running in production, we do not want concurrent writes" -" happening both at the replica and the master. Nor do we want the new " -"replica to accept any writes until it has finished fetching all replication " -"data from the old master. To compare replica and master state, we can use " -":ref:`box.info.signature `." -msgstr "" -"Чтобы провести **контролируемое восстановление после сбоя**, то есть " -"поменять роли мастера и реплики, нужно лишь настроить параметры " -"``read_only=true`` на мастере и ``read_only=false`` на реплике. Порядок " -"действий в данном случае имеет значение. Если система принята в " -"эксплуатацию, нам не нужна параллельная запись на реплике и на мастере. " -"Нежелательно также, чтобы новая реплика принимала запись, пока не получит " -"все реплицируемые данные со старого мастера. Чтобы сопоставить состояние " -"реплики и мастера, можно использовать :ref:`box.info.signature " -"`." - -msgid "Set ``read_only=true`` at the master." -msgstr "Настройте ``read_only=true`` на мастере." - -msgid "" -"# at the master\n" -"tarantool> box.cfg{read_only=true}" -msgstr "" -"# на мастере\n" -"tarantool> box.cfg{read_only=true}" - -msgid "" -"Record the master’s current position with ``box.info.signature``, containing" -" the sum of all LSNs in the master’s vector clock." -msgstr "" -"Зарегистрируйте текущее состояние мастера с помощью ``box.info.signature``, " -"которое содержит общее количество всех LSN в векторных часах мастера." - -msgid "" -"# at the master\n" -"tarantool> box.info.signature" -msgstr "" -"# на мастере\n" -"tarantool> box.info.signature" - -msgid "Wait until the replica’s signature is the same as the master’s." -msgstr "Подождите, пока сигнатура реплики не совпадет с сигнатурой мастера." +"manual_leader:instance001> require('config'):reload()\n" +"---\n" +"...\n" +"manual_leader:instance001> box.info.ro\n" +"---\n" +"- true\n" +"...\n" +"manual_leader:instance001> box.info.ro_reason\n" +"---\n" +"- config\n" +"..." +msgstr "" msgid "" -"# at the replica\n" -"tarantool> box.info.signature" +"Make sure that :ref:`box.info.vclock ` values " +"are the same on all instances:" msgstr "" -"# на реплике\n" -"tarantool> box.info.signature" -msgid "Set ``read_only=false`` at the replica to enable write operations." +msgid "" +"manual_leader:instance003> box.info.vclock\n" +"---\n" +"- {1: 21}\n" +"..." +msgstr "" + +msgid "Configuring a new leader" +msgstr "" + +msgid "Change a replica set leader in ``config.yaml`` to ``instance002``:" +msgstr "" + +msgid "" +"replicaset001:\n" +" leader: instance002" +msgstr "" + +msgid "" +"Reload configuration on all instances using :ref:`config:reload() `." +msgstr "" + +msgid "Make sure that ``instance002`` is a new master:" +msgstr "" + +msgid "" +"manual_leader:instance002> box.info.ro\n" +"---\n" +"- false\n" +"..." +msgstr "" + +msgid "Check replication status using ``box.info.replication``." +msgstr "" + +msgid "Removing instances" +msgstr "" + +msgid "" +"This section describes the process of removing an instance from a replica " +"set." +msgstr "" + +msgid "" +"Before removing an instance, make sure it is in read-only mode. If the " +"instance is a master, perform :ref:`manual failover `." +msgstr "" + +msgid "Disconnecting an instance" +msgstr "" + +msgid "" +"Clear the ``iproto`` option for ``instance003`` by setting its value to " +"``{}``:" +msgstr "" + +msgid "" +"instance003:\n" +" iproto: {}" +msgstr "" + +msgid "Reload configurations on ``instance001`` and ``instance002``:" +msgstr "" + +msgid "" +"Check that the ``upstream`` section is missing for ``instance003`` by " +"executing ``box.info.replication[3]``:" +msgstr "" + +msgid "" +"manual_leader:instance001> box.info.replication[3]\n" +"---\n" +"- id: 3\n" +" uuid: 9a3a1b9b-8a18-baf6-00b3-a6e5e11fd8b6\n" +" lsn: 0\n" +" downstream:\n" +" status: follow\n" +" idle: 0.4588760000006\n" +" vclock: {1: 21}\n" +" lag: 0\n" +" name: instance003\n" +"..." +msgstr "" + +msgid "Stopping an instance" +msgstr "" + +msgid "Stop ``instance003`` using the :ref:`tt stop ` command:" +msgstr "" + +msgid "" +"$ tt stop manual_leader:instance003\n" +" • The Instance manual_leader:instance003 (PID = 15551) has been terminated." msgstr "" -"Настройте ``read_only=false`` на реплике, чтобы запустить операции записи " -"данных." -msgid "" -"# at the replica\n" -"tarantool> box.cfg{read_only=false}" -msgstr "" -"# на реплике\n" -"tarantool> box.cfg{read_only=false}" - -msgid "" -"These four steps ensure that the replica doesn’t accept new writes until " -"it’s done fetching writes from the master." -msgstr "" -"Эти шаги нужны для того, чтобы реплика гарантированно не принимала новые " -"записи, пока не получит данные от мастера." - -msgid "Master-master bootstrap" -msgstr "Настройка репликации мастер-мастер" - -msgid "" -"Now let us bootstrap a two-instance **master-master** set. For easier " -"administration, we make master#1 and master#2 instance files fully " -"identical." -msgstr "" -"Теперь настроим набор с двумя экземплярами **мастер-мастер**. Для удобства " -"управления сделаем файлы экземпляра для мастера №1 и мастера №2 практически " -"одинаковыми." - -msgid "" -"We re-use the master's instance file from the :ref:`master-replica example " -"` above." -msgstr "" -"Переиспользуем файл экземпляра для мастера из вышеописанного :ref:`примера " -"мастер-реплика `." - -msgid "" -"-- instance file for any of the two masters\n" -"box.cfg{\n" -" listen = 3301,\n" -" replication = {'replicator:password@192.168.0.101:3301', -- master1 URI\n" -" 'replicator:password@192.168.0.102:3301'}, -- master2 URI\n" -" read_only = false\n" -"}\n" -"box.once(\"schema\", function()\n" -" box.schema.user.create('replicator', {password = 'password'})\n" -" box.schema.user.grant('replicator', 'replication') -- grant replication role\n" -" box.schema.space.create(\"test\")\n" -" box.space.test:create_index(\"primary\")\n" -" print('box.once executed on master #1')\n" -"end)" -msgstr "" -"-- файл экземпляра для любого из двух мастеров\n" -" box.cfg{\n" -" listen = 3301,\n" -" replication = {'replicator:password@192.168.0.101:3301', -- URI мастера 1\n" -" 'replicator:password@192.168.0.102:3301'}, -- URI мастера 2\n" -" read_only = false\n" -"}\n" -"box.once(\"schema\", function()\n" -" box.schema.user.create('replicator', {password = 'password'})\n" -" box.schema.user.grant('replicator', 'replication') -- настроить роль для репликации\n" -" box.schema.space.create(\"test\")\n" -" box.space.test:create_index(\"primary\")\n" -" print('box.once executed on master #1')\n" -"end)" - -msgid "" -"In the :ref:`replication ` parameter, we define" -" the URIs of both masters in the replica set and say ``print('box.once " -"executed on master #1')`` so it will be clear when and where the " -"``box.once()`` logic is executed." -msgstr "" -"В параметре :ref:`replication ` определим URI " -"обоих мастеров в наборе реплик и выполним команду ``print('box.once executed" -" on master #1')``, чтобы увидеть, когда и где будет выполнена логика функции" -" ``box.once()``." - -msgid "" -"Now we can launch the two masters. Again, the launch order doesn't matter. " -"The ``box.once()`` logic will also be executed only once, at the master " -"which is elected as the replica set :ref:`leader ` at " -"bootstrap." -msgstr "" -"Теперь можно запустить оба мастера. Повторимся, что порядок запуска не имеет" -" значения. Логика ``box.once()`` также будет выполняться лишь однократно на " -"мастере, который будет выбран лидером (:ref:`leader `) в" -" наборе реплик при настройке." - -msgid "" -"$ # launching master #1\n" -"$ tarantool master1.lua\n" -"2017-06-14 15:39:03.062 [47021] main/101/master1.lua C> version 1.7.4-52-g980d30092\n" -"2017-06-14 15:39:03.062 [47021] main/101/master1.lua C> log level 5\n" -"2017-06-14 15:39:03.063 [47021] main/101/master1.lua I> mapping 268435456 bytes for tuple arena...\n" -"2017-06-14 15:39:03.065 [47021] iproto/101/main I> binary: bound to [::]:3301\n" -"2017-06-14 15:39:03.065 [47021] main/105/applier/replicator@192.168.0.10 I> can't connect to master\n" -"2017-06-14 15:39:03.065 [47021] main/105/applier/replicator@192.168.0.10 coio.cc:107 !> SystemError connect, called on fd 14, aka 192.168.0.102:57110: Connection refused\n" -"2017-06-14 15:39:03.065 [47021] main/105/applier/replicator@192.168.0.10 I> will retry every 1 second\n" -"2017-06-14 15:39:03.065 [47021] main/104/applier/replicator@192.168.0.10 I> remote master is 1.7.4 at 192.168.0.101:3301\n" -"2017-06-14 15:39:08.070 [47021] main/105/applier/replicator@192.168.0.10 I> remote master is 1.7.4 at 192.168.0.102:3301\n" -"2017-06-14 15:39:08.071 [47021] main/105/applier/replicator@192.168.0.10 I> authenticated\n" -"2017-06-14 15:39:08.071 [47021] main/101/master1.lua I> bootstrapping replica from 192.168.0.102:3301\n" -"2017-06-14 15:39:08.073 [47021] main/105/applier/replicator@192.168.0.10 I> initial data received\n" -"2017-06-14 15:39:08.074 [47021] main/105/applier/replicator@192.168.0.10 I> final data received\n" -"2017-06-14 15:39:08.074 [47021] snapshot/101/main I> saving snapshot `/Users/e.shebunyaeva/work/tarantool-test-repl/master1_dir/00000000000000000008.snap.inprogress'\n" -"2017-06-14 15:39:08.074 [47021] snapshot/101/main I> done\n" -"2017-06-14 15:39:08.076 [47021] main/101/master1.lua I> vinyl checkpoint done\n" -"2017-06-14 15:39:08.076 [47021] main/101/master1.lua I> ready to accept requests\n" -"box.once executed on master #1\n" -"2017-06-14 15:39:08.077 [47021] main C> entering the event loop" -msgstr "" -"$ # запуск мастера №1\n" -"$ tarantool master1.lua\n" -"2017-06-14 15:39:03.062 [47021] main/101/master1.lua C> version 1.7.4-52-g980d30092\n" -"2017-06-14 15:39:03.062 [47021] main/101/master1.lua C> log level 5\n" -"2017-06-14 15:39:03.063 [47021] main/101/master1.lua I> mapping 268435456 bytes for tuple arena...\n" -"2017-06-14 15:39:03.065 [47021] iproto/101/main I> binary: bound to [::]:3301\n" -"2017-06-14 15:39:03.065 [47021] main/105/applier/replicator@192.168.0.10 I> can't connect to master\n" -"2017-06-14 15:39:03.065 [47021] main/105/applier/replicator@192.168.0.10 coio.cc:107 !> SystemError connect, called on fd 14, aka 192.168.0.102:57110: Connection refused\n" -"2017-06-14 15:39:03.065 [47021] main/105/applier/replicator@192.168.0.10 I> will retry every 1 second\n" -"2017-06-14 15:39:03.065 [47021] main/104/applier/replicator@192.168.0.10 I> remote master is 1.7.4 at 192.168.0.101:3301\n" -"2017-06-14 15:39:08.070 [47021] main/105/applier/replicator@192.168.0.10 I> remote master is 1.7.4 at 192.168.0.102:3301\n" -"2017-06-14 15:39:08.071 [47021] main/105/applier/replicator@192.168.0.10 I> authenticated\n" -"2017-06-14 15:39:08.071 [47021] main/101/master1.lua I> bootstrapping replica from 192.168.0.102:3301\n" -"2017-06-14 15:39:08.073 [47021] main/105/applier/replicator@192.168.0.10 I> initial data received\n" -"2017-06-14 15:39:08.074 [47021] main/105/applier/replicator@192.168.0.10 I> final data received\n" -"2017-06-14 15:39:08.074 [47021] snapshot/101/main I> saving snapshot `/Users/e.shebunyaeva/work/tarantool-test-repl/master1_dir/00000000000000000008.snap.inprogress'\n" -"2017-06-14 15:39:08.074 [47021] snapshot/101/main I> done\n" -"2017-06-14 15:39:08.076 [47021] main/101/master1.lua I> vinyl checkpoint done\n" -"2017-06-14 15:39:08.076 [47021] main/101/master1.lua I> ready to accept requests\n" -"box.once executed on master #1\n" -"2017-06-14 15:39:08.077 [47021] main C> entering the event loop" - -msgid "" -"$ # launching master #2\n" -"$ tarantool master2.lua\n" -"2017-06-14 15:39:07.452 [47022] main/101/master2.lua C> version 1.7.4-52-g980d30092\n" -"2017-06-14 15:39:07.453 [47022] main/101/master2.lua C> log level 5\n" -"2017-06-14 15:39:07.453 [47022] main/101/master2.lua I> mapping 268435456 bytes for tuple arena...\n" -"2017-06-14 15:39:07.455 [47022] iproto/101/main I> binary: bound to [::]:3301\n" -"2017-06-14 15:39:07.455 [47022] main/104/applier/replicator@192.168.0.19 I> remote master is 1.7.4 at 192.168.0.101:3301\n" -"2017-06-14 15:39:07.455 [47022] main/105/applier/replicator@192.168.0.10 I> remote master is 1.7.4 at 192.168.0.102:3301\n" -"2017-06-14 15:39:07.455 [47022] main/101/master2.lua I> initializing an empty data directory\n" -"2017-06-14 15:39:07.457 [47022] snapshot/101/main I> saving snapshot `/Users/e.shebunyaeva/work/tarantool-test-repl/master2_dir/00000000000000000000.snap.inprogress'\n" -"2017-06-14 15:39:07.457 [47022] snapshot/101/main I> done\n" -"2017-06-14 15:39:07.458 [47022] main/101/master2.lua I> vinyl checkpoint done\n" -"2017-06-14 15:39:07.459 [47022] main/101/master2.lua I> ready to accept requests\n" -"2017-06-14 15:39:07.460 [47022] main C> entering the event loop\n" -"2017-06-14 15:39:08.072 [47022] main/103/main I> initial data sent.\n" -"2017-06-14 15:39:08.073 [47022] relay/[::ffff:192.168.0.102]:/101/main I> recover from `/Users/e.shebunyaeva/work/tarantool-test-repl/master2_dir/00000000000000000000.xlog'\n" -"2017-06-14 15:39:08.073 [47022] main/103/main I> final data sent.\n" -"2017-06-14 15:39:08.077 [47022] relay/[::ffff:192.168.0.102]:/101/main I> recover from `/Users/e.shebunyaeva/work/tarantool-test-repl/master2_dir/00000000000000000000.xlog'\n" -"2017-06-14 15:39:08.461 [47022] main/104/applier/replicator@192.168.0.10 I> authenticated" -msgstr "" -"$ # запуск мастера №2\n" -"$ tarantool master2.lua\n" -"2017-06-14 15:39:07.452 [47022] main/101/master2.lua C> version 1.7.4-52-g980d30092\n" -"2017-06-14 15:39:07.453 [47022] main/101/master2.lua C> log level 5\n" -"2017-06-14 15:39:07.453 [47022] main/101/master2.lua I> mapping 268435456 bytes for tuple arena...\n" -"2017-06-14 15:39:07.455 [47022] iproto/101/main I> binary: bound to [::]:3301\n" -"2017-06-14 15:39:07.455 [47022] main/104/applier/replicator@192.168.0.19 I> remote master is 1.7.4 at 192.168.0.101:3301\n" -"2017-06-14 15:39:07.455 [47022] main/105/applier/replicator@192.168.0.10 I> remote master is 1.7.4 at 192.168.0.102:3301\n" -"2017-06-14 15:39:07.455 [47022] main/101/master2.lua I> initializing an empty data directory\n" -"2017-06-14 15:39:07.457 [47022] snapshot/101/main I> saving snapshot `/Users/e.shebunyaeva/work/tarantool-test-repl/master2_dir/00000000000000000000.snap.inprogress'\n" -"2017-06-14 15:39:07.457 [47022] snapshot/101/main I> done\n" -"2017-06-14 15:39:07.458 [47022] main/101/master2.lua I> vinyl checkpoint done\n" -"2017-06-14 15:39:07.459 [47022] main/101/master2.lua I> ready to accept requests\n" -"2017-06-14 15:39:07.460 [47022] main C> entering the event loop\n" -"2017-06-14 15:39:08.072 [47022] main/103/main I> initial data sent.\n" -"2017-06-14 15:39:08.073 [47022] relay/[::ffff:192.168.0.102]:/101/main I> recover from `/Users/e.shebunyaeva/work/tarantool-test-repl/master2_dir/00000000000000000000.xlog'\n" -"2017-06-14 15:39:08.073 [47022] main/103/main I> final data sent.\n" -"2017-06-14 15:39:08.077 [47022] relay/[::ffff:192.168.0.102]:/101/main I> recover from `/Users/e.shebunyaeva/work/tarantool-test-repl/master2_dir/00000000000000000000.xlog'\n" -"2017-06-14 15:39:08.461 [47022] main/104/applier/replicator@192.168.0.10 I> authenticated" +msgid "Check that ``downstream.status`` is ``stopped`` for ``instance003``:" +msgstr "" + +msgid "" +"manual_leader:instance001> box.info.replication[3]\n" +"---\n" +"- id: 3\n" +" uuid: 9a3a1b9b-8a18-baf6-00b3-a6e5e11fd8b6\n" +" lsn: 0\n" +" downstream:\n" +" status: stopped\n" +" message: 'unexpected EOF when reading from socket, called on fd 27, aka 127.0.0.1:3301,\n" +" peer of 127.0.0.1:54185: Broken pipe'\n" +" system_message: Broken pipe\n" +" name: instance003\n" +"..." +msgstr "" + +msgid "Removing an instance from the configuration" +msgstr "" + +msgid "Remove ``instance003`` from the ``instances.yml`` file:" +msgstr "" + +msgid "Remove ``instance003`` from ``config.yaml``:" +msgstr "" + +msgid "" +"instances:\n" +" instance001:\n" +" iproto:\n" +" listen: 127.0.0.1:3301\n" +" instance002:\n" +" iproto:\n" +" listen: 127.0.0.1:3302\n" +msgstr "" + +msgid "Removing an instance from the '_cluster' space" +msgstr "" + +msgid "" +"To remove an instance from the replica set permanently, it should be removed" +" from the :ref:`box.space._cluster ` system space:" +msgstr "" + +msgid "Select all the tuples in the ``box.space._cluster`` system space:" +msgstr "" + +msgid "" +"manual_leader:instance002> box.space._cluster:select{}\n" +"---\n" +"- - [1, '9bb111c2-3ff5-36a7-00f4-2b9a573ea660', 'instance001']\n" +" - [2, '4cfa6e3c-625e-b027-00a7-29b2f2182f23', 'instance002']\n" +" - [3, '9a3a1b9b-8a18-baf6-00b3-a6e5e11fd8b6', 'instance003']\n" +"..." +msgstr "" + +msgid "Delete a tuple corresponding to ``instance003``:" +msgstr "" + +msgid "" +"manual_leader:instance002> box.space._cluster:delete(3)\n" +"---\n" +"- [3, '9a3a1b9b-8a18-baf6-00b3-a6e5e11fd8b6', 'instance003']\n" +"..." +msgstr "" + +msgid "Execute ``box.info.replication`` to check the health status:" +msgstr "" + +msgid "" +"manual_leader:instance002> box.info.replication\n" +"---\n" +"- 1:\n" +" id: 1\n" +" uuid: 9bb111c2-3ff5-36a7-00f4-2b9a573ea660\n" +" lsn: 21\n" +" upstream:\n" +" status: follow\n" +" idle: 0.73316000000159\n" +" peer: replicator@127.0.0.1:3301\n" +" lag: 0.00016212463378906\n" +" name: instance001\n" +" downstream:\n" +" status: follow\n" +" idle: 0.7269320000014\n" +" vclock: {2: 1, 1: 21}\n" +" lag: 0.00083398818969727\n" +" 2:\n" +" id: 2\n" +" uuid: 4cfa6e3c-625e-b027-00a7-29b2f2182f23\n" +" lsn: 1\n" +" name: instance002\n" +"..." +msgstr "" + +#~ msgid "Replication setup" +#~ msgstr "Первоначальная настройка репликации" + +#~ msgid "" +#~ "To enable :ref:`replication `, you need to specify two " +#~ "parameters in a ``box.cfg{}`` request:" +#~ msgstr "" +#~ "Чтобы включить репликацию, необходимо указать два параметра в запросе " +#~ "``box.cfg{}``:" + +#~ msgid "" +#~ ":ref:`replication ` which defines the " +#~ "replication source(s), and" +#~ msgstr "" +#~ ":ref:`replication `, который определяет " +#~ "источники репликации, и" + +#~ msgid "" +#~ ":ref:`read_only ` which is ``true`` for a replica and " +#~ "``false`` for a master." +#~ msgstr "" +#~ ":ref:`read_only ` со значением ``true`` для реплики и " +#~ "``false`` для мастера." + +#~ msgid "" +#~ "Both these parameters are \"dynamic\". This allows a replica to become a " +#~ "master and vice versa on the fly with the help of a ``box.cfg{}`` request." +#~ msgstr "" +#~ "\"Динамические\" параметры репликации можно менять на лету, что позволяет " +#~ "назначать реплику на роль мастера и наоборот. Для этого используется запрос " +#~ "``box.cfg{}``." + +#~ msgid "" +#~ "Let us first bootstrap a simple **master-replica** set containing two " +#~ "instances, each located on its own machine. For easier administration, we " +#~ "make the :ref:`instance files ` almost identical." +#~ msgstr "" +#~ "Сначала настроим простой набор **мастер-реплика** с двумя экземплярами, " +#~ "каждый из которых находится на отдельном сервере. Для удобства " +#~ "администрирования сделаем :ref:`файлы экземпляров ` " +#~ "практически одинаковыми." + +#~ msgid "Here is an example of the master's instance file:" +#~ msgstr "Ниже пример файла экземпляра для мастера:" + +#~ msgid "" +#~ "-- instance file for the master\n" +#~ "box.cfg{\n" +#~ " listen = 3301,\n" +#~ " replication = {'replicator:password@192.168.0.101:3301', -- master URI\n" +#~ " 'replicator:password@192.168.0.102:3301'}, -- replica URI\n" +#~ " read_only = false\n" +#~ "}\n" +#~ "box.once(\"schema\", function()\n" +#~ " box.schema.user.create('replicator', {password = 'password'})\n" +#~ " box.schema.user.grant('replicator', 'replication') -- grant replication role\n" +#~ " box.schema.space.create(\"test\")\n" +#~ " box.space.test:create_index(\"primary\")\n" +#~ " print('box.once executed on master')\n" +#~ "end)" +#~ msgstr "" +#~ "-- файл экземпляра для мастера\n" +#~ "box.cfg{\n" +#~ " listen = 3301,\n" +#~ " replication = {'replicator:password@192.168.0.101:3301', -- URI мастера\n" +#~ " 'replicator:password@192.168.0.102:3301'}, -- URI реплики\n" +#~ " read_only = false\n" +#~ "}\n" +#~ "box.once(\"schema\", function()\n" +#~ " box.schema.user.create('replicator', {password = 'password'})\n" +#~ " box.schema.user.grant('replicator', 'replication') -- настроить роль для репликации\n" +#~ " box.schema.space.create(\"test\")\n" +#~ " box.space.test:create_index(\"primary\")\n" +#~ " print('box.once executed on master')\n" +#~ "end)" + +#~ msgid "where:" +#~ msgstr "где:" + +#~ msgid "" +#~ "the ``box.cfg()`` :ref:`listen ` parameter defines a URI " +#~ "(port 3301 in our example), on which the master can accept connections from " +#~ "replicas." +#~ msgstr "" +#~ "параметр :ref:`listen ` в ``box.cfg{}`` определяет URI " +#~ "(порт 3301 в нашем примере), на котором мастер может принимать подключения " +#~ "от реплик." + +#~ msgid "" +#~ "the ``box.cfg()`` :ref:`replication ` parameter" +#~ " defines the URIs at which all instances in the replica set can accept " +#~ "connections. It includes the replica's URI as well, although the replica is " +#~ "not a replication source right now. This parameter is mandatory only for " +#~ "master-master or full-mesh cluster setups." +#~ msgstr "" +#~ "параметр :ref:`replication ` в ``box.cfg{}`` " +#~ "определяет URI, на которых все экземпляры в наборе реплик могут принимать " +#~ "подключения. Он включает в себя также URI реплики, хотя реплики в данном " +#~ "случае не является источником репликации. Этот параметр является " +#~ "обязательным только при настройке кластеров с конфигурацией master-master " +#~ "или full-mesh." + +#~ msgid "" +#~ "For security reasons, we recommend that administrators prevent unauthorized " +#~ "replication sources by associating a password with every user that has a " +#~ "replication :ref:`role `. That way, the :ref:`URI " +#~ "` for ``replication`` parameter must have the long form " +#~ "``username:password@host:port``." +#~ msgstr "" +#~ "Для целей безопасности рекомендуем администраторам не допускать репликацию " +#~ "из неавторизованных источников с помощью установки пароля для каждого " +#~ "пользователя, у которого есть :ref:`роль ` для " +#~ "репликации. Таким образом, :ref:`URI ` для параметра " +#~ "``replication`` должен иметь развернутый вид " +#~ "``username:password@host:port``." + +#~ msgid "" +#~ "the :ref:`read_only = false ` parameter setting enables" +#~ " data-change operations on the instance and makes the instance act as a " +#~ "master, not as a replica. *That is the only parameter setting in our " +#~ "instance files that will differ.*" +#~ msgstr "" +#~ "параметр :ref:`read_only = false ` разрешает операции " +#~ "по изменению данных на экземпляре и заставляет данный экземпляр работать в " +#~ "качестве мастера, а не реплики. *Это единственное значение параметра, " +#~ "которое отличается в наших файлах экземпляров.*" + +#~ msgid "" +#~ "the :doc:`box.once() ` function contains " +#~ "database initialization logic that should be executed only once during the " +#~ "replica set lifetime." +#~ msgstr "" +#~ "функция :doc:`box.once() ` содержит " +#~ "логику инициализации базы данных, которая должна выполняться однократно в " +#~ "течение срока работы набора реплик." + +#~ msgid "" +#~ "In this example, we create a space with a primary index, and a user for " +#~ "replication purposes. We also say ``print('box.once executed on master')`` " +#~ "so that it will later be visible on a console whether ``box.once()`` was " +#~ "executed." +#~ msgstr "" +#~ "В данном примере создаем спейс с первичным индексом и пользователя для целей" +#~ " репликации. Также выполним команду ``print('box.once executed on " +#~ "master')``, чтобы позднее увидеть в консоли, была ли выполнена функция " +#~ "``box.once()``." + +#~ msgid "" +#~ "Replication requires privileges. We can grant privileges for accessing " +#~ "spaces directly to the user who will start the instance. However, it is more" +#~ " usual to grant privileges for accessing spaces to a :ref:`role " +#~ "`, and then grant the role to the user who will start " +#~ "the replica." +#~ msgstr "" +#~ "Репликация требует настройки прав. Права на доступ к спейсам можно задать " +#~ "напрямую для пользователя, под чьим именем запущен экземпляр. Но обычно " +#~ "права на доступ к спейсам задаются с помощью :ref:`роли `, которая затем присваивается пользователю, под чьим именем запущена " +#~ "реплика." + +#~ msgid "" +#~ "Here we use Tarantool's predefined role named \"replication\" which by " +#~ "default grants \"read\" privileges for all database objects (\"universe\"), " +#~ "and we can change privileges for this role as required." +#~ msgstr "" +#~ "Здесь мы используем предварительно определенную роль Tarantool под названием" +#~ " \"replication\", которая по умолчанию предоставляет права на чтение всех " +#~ "объектов в базе данных (\"universe\"), а также сможем настроить необходимые " +#~ "права для этой роли." + +#~ msgid "" +#~ "In the replica's instance file, we set the ``read_only`` parameter to " +#~ "\"true\", and say ``print('box.once executed on replica')`` so that later it" +#~ " will be visible that ``box.once()`` was not executed more than once. " +#~ "Otherwise the replica's instance file is identical to the master's instance " +#~ "file." +#~ msgstr "" +#~ "В файле экземпляра для реплики устанавливаем значение \"true\" для параметра" +#~ " ``read_only`` и выполняем команду ``print('box.once executed on " +#~ "replica')``, чтобы позднее убедиться, что ``box.once()`` выполняется только " +#~ "однократно. В других отношениях файл экземпляра для реплики совпадает с " +#~ "файлом экземпляра для мастера." + +#~ msgid "" +#~ "-- instance file for the replica\n" +#~ "box.cfg{\n" +#~ " listen = 3301,\n" +#~ " replication = {'replicator:password@192.168.0.101:3301', -- master URI\n" +#~ " 'replicator:password@192.168.0.102:3301'}, -- replica URI\n" +#~ " read_only = true\n" +#~ "}\n" +#~ "box.once(\"schema\", function()\n" +#~ " box.schema.user.create('replicator', {password = 'password'})\n" +#~ " box.schema.user.grant('replicator', 'replication') -- grant replication role\n" +#~ " box.schema.space.create(\"test\")\n" +#~ " box.space.test:create_index(\"primary\")\n" +#~ " print('box.once executed on replica')\n" +#~ "end)" +#~ msgstr "" +#~ "-- файл экземпляра для реплики\n" +#~ "box.cfg{\n" +#~ " listen = 3301,\n" +#~ " replication = {'replicator:password@192.168.0.101:3301', -- URI мастера\n" +#~ " 'replicator:password@192.168.0.102:3301'}, -- URI реплики\n" +#~ " read_only = true\n" +#~ "}\n" +#~ "box.once(\"schema\", function()\n" +#~ " box.schema.user.create('replicator', {password = 'password'})\n" +#~ " box.schema.user.grant('replicator', 'replication') -- настроить роль для репликации\n" +#~ " box.schema.space.create(\"test\")\n" +#~ " box.space.test:create_index(\"primary\")\n" +#~ " print('box.once executed on replica')\n" +#~ "end)" + +#~ msgid "" +#~ "The replica does not inherit the master’s configuration parameters, such as " +#~ "those making the :ref:`checkpoint daemon ` run " +#~ "on the master. To get the same behavior, set the relevant parameters " +#~ "explicitly so that they are the same on both master and replica." +#~ msgstr "" +#~ "Реплика не берет конфигурационные параметры с мастера, например настройки " +#~ "запуска :ref:`фоновой программы для работы с контрольными точками " +#~ "` на мастере. Чтобы получить те же настройки на " +#~ "реплике, необходимо задать их явным образом." + +#~ msgid "Now we can launch the two instances. The master..." +#~ msgstr "Теперь можно запустить два экземпляра. Мастер..." + +#~ msgid "" +#~ "$ # launching the master\n" +#~ "$ tarantool master.lua\n" +#~ "2017-06-14 14:12:03.847 [18933] main/101/master.lua C> version 1.7.4-52-g980d30092\n" +#~ "2017-06-14 14:12:03.848 [18933] main/101/master.lua C> log level 5\n" +#~ "2017-06-14 14:12:03.849 [18933] main/101/master.lua I> mapping 268435456 bytes for tuple arena...\n" +#~ "2017-06-14 14:12:03.859 [18933] iproto/101/main I> binary: bound to [::]:3301\n" +#~ "2017-06-14 14:12:03.861 [18933] main/105/applier/replicator@192.168.0. I> can't connect to master\n" +#~ "2017-06-14 14:12:03.861 [18933] main/105/applier/replicator@192.168.0. coio.cc:105 !> SystemError connect, called on fd 14, aka 192.168.0.102:56736: Connection refused\n" +#~ "2017-06-14 14:12:03.861 [18933] main/105/applier/replicator@192.168.0. I> will retry every 1 second\n" +#~ "2017-06-14 14:12:03.861 [18933] main/104/applier/replicator@192.168.0. I> remote master is 1.7.4 at 192.168.0.101:3301\n" +#~ "2017-06-14 14:12:19.878 [18933] main/105/applier/replicator@192.168.0. I> remote master is 1.7.4 at 192.168.0.102:3301\n" +#~ "2017-06-14 14:12:19.879 [18933] main/101/master.lua I> initializing an empty data directory\n" +#~ "2017-06-14 14:12:19.908 [18933] snapshot/101/main I> saving snapshot `/var/lib/tarantool/master/00000000000000000000.snap.inprogress'\n" +#~ "2017-06-14 14:12:19.914 [18933] snapshot/101/main I> done\n" +#~ "2017-06-14 14:12:19.914 [18933] main/101/master.lua I> vinyl checkpoint done\n" +#~ "2017-06-14 14:12:19.917 [18933] main/101/master.lua I> ready to accept requests\n" +#~ "2017-06-14 14:12:19.918 [18933] main/105/applier/replicator@192.168.0. I> failed to authenticate\n" +#~ "2017-06-14 14:12:19.918 [18933] main/105/applier/replicator@192.168.0. xrow.cc:431 E> ER_LOADING: Instance bootstrap hasn't finished yet\n" +#~ "box.once executed on master\n" +#~ "2017-06-14 14:12:19.920 [18933] main C> entering the event loop" +#~ msgstr "" +#~ "$ # запуск мастера\n" +#~ "$ tarantool master.lua\n" +#~ "2017-06-14 14:12:03.847 [18933] main/101/master.lua C> version 1.7.4-52-g980d30092\n" +#~ "2017-06-14 14:12:03.848 [18933] main/101/master.lua C> log level 5\n" +#~ "2017-06-14 14:12:03.849 [18933] main/101/master.lua I> mapping 268435456 bytes for tuple arena...\n" +#~ "2017-06-14 14:12:03.859 [18933] iproto/101/main I> binary: bound to [::]:3301\n" +#~ "2017-06-14 14:12:03.861 [18933] main/105/applier/replicator@192.168.0. I> can't connect to master\n" +#~ "2017-06-14 14:12:03.861 [18933] main/105/applier/replicator@192.168.0. coio.cc:105 !> SystemError connect, called on fd 14, aka 192.168.0.102:56736: Connection refused\n" +#~ "2017-06-14 14:12:03.861 [18933] main/105/applier/replicator@192.168.0. I> will retry every 1 second\n" +#~ "2017-06-14 14:12:03.861 [18933] main/104/applier/replicator@192.168.0. I> remote master is 1.7.4 at 192.168.0.101:3301\n" +#~ "2017-06-14 14:12:19.878 [18933] main/105/applier/replicator@192.168.0. I> remote master is 1.7.4 at 192.168.0.102:3301\n" +#~ "2017-06-14 14:12:19.879 [18933] main/101/master.lua I> initializing an empty data directory\n" +#~ "2017-06-14 14:12:19.908 [18933] snapshot/101/main I> saving snapshot `/var/lib/tarantool/master/00000000000000000000.snap.inprogress'\n" +#~ "2017-06-14 14:12:19.914 [18933] snapshot/101/main I> done\n" +#~ "2017-06-14 14:12:19.914 [18933] main/101/master.lua I> vinyl checkpoint done\n" +#~ "2017-06-14 14:12:19.917 [18933] main/101/master.lua I> ready to accept requests\n" +#~ "2017-06-14 14:12:19.918 [18933] main/105/applier/replicator@192.168.0. I> failed to authenticate\n" +#~ "2017-06-14 14:12:19.918 [18933] main/105/applier/replicator@192.168.0. xrow.cc:431 E> ER_LOADING: Instance bootstrap hasn't finished yet\n" +#~ "box.once executed on master\n" +#~ "2017-06-14 14:12:19.920 [18933] main C> entering the event loop" + +#~ msgid "" +#~ "... (the display confirms that ``box.once()`` was executed on the master) --" +#~ " and the replica:" +#~ msgstr "" +#~ "... (выведенный результат подтверждает, что функция ``box.once()`` была " +#~ "выполнена на мастере) -- и реплику:" + +#~ msgid "" +#~ "$ # launching the replica\n" +#~ "$ tarantool replica.lua\n" +#~ "2017-06-14 14:12:19.486 [18934] main/101/replica.lua C> version 1.7.4-52-g980d30092\n" +#~ "2017-06-14 14:12:19.486 [18934] main/101/replica.lua C> log level 5\n" +#~ "2017-06-14 14:12:19.487 [18934] main/101/replica.lua I> mapping 268435456 bytes for tuple arena...\n" +#~ "2017-06-14 14:12:19.494 [18934] iproto/101/main I> binary: bound to [::]:3311\n" +#~ "2017-06-14 14:12:19.495 [18934] main/104/applier/replicator@192.168.0. I> remote master is 1.7.4 at 192.168.0.101:3301\n" +#~ "2017-06-14 14:12:19.495 [18934] main/105/applier/replicator@192.168.0. I> remote master is 1.7.4 at 192.168.0.102:3302\n" +#~ "2017-06-14 14:12:19.496 [18934] main/104/applier/replicator@192.168.0. I> failed to authenticate\n" +#~ "2017-06-14 14:12:19.496 [18934] main/104/applier/replicator@192.168.0. xrow.cc:431 E> ER_LOADING: Instance bootstrap hasn't finished yet" +#~ msgstr "" +#~ "$ # запуск реплики\n" +#~ "$ tarantool replica.lua\n" +#~ "2017-06-14 14:12:19.486 [18934] main/101/replica.lua C> version 1.7.4-52-g980d30092\n" +#~ "2017-06-14 14:12:19.486 [18934] main/101/replica.lua C> log level 5\n" +#~ "2017-06-14 14:12:19.487 [18934] main/101/replica.lua I> mapping 268435456 bytes for tuple arena...\n" +#~ "2017-06-14 14:12:19.494 [18934] iproto/101/main I> binary: bound to [::]:3311\n" +#~ "2017-06-14 14:12:19.495 [18934] main/104/applier/replicator@192.168.0. I> remote master is 1.7.4 at 192.168.0.101:3301\n" +#~ "2017-06-14 14:12:19.495 [18934] main/105/applier/replicator@192.168.0. I> remote master is 1.7.4 at 192.168.0.102:3302\n" +#~ "2017-06-14 14:12:19.496 [18934] main/104/applier/replicator@192.168.0. I> failed to authenticate\n" +#~ "2017-06-14 14:12:19.496 [18934] main/104/applier/replicator@192.168.0. xrow.cc:431 E> ER_LOADING: Instance bootstrap hasn't finished yet" + +#~ msgid "" +#~ "In both logs, there are messages saying that the replica was bootstrapped " +#~ "from the master:" +#~ msgstr "" +#~ "В обоих журналах есть сообщения о том, что реплика получила настройки от " +#~ "мастера:" + +#~ msgid "" +#~ "$ # bootstrapping the replica (from the master's log)\n" +#~ "<...>\n" +#~ "2017-06-14 14:12:20.503 [18933] main/106/main I> initial data sent.\n" +#~ "2017-06-14 14:12:20.505 [18933] relay/[::ffff:192.168.0.101]:/101/main I> recover from `/var/lib/tarantool/master/00000000000000000000.xlog'\n" +#~ "2017-06-14 14:12:20.505 [18933] main/106/main I> final data sent.\n" +#~ "2017-06-14 14:12:20.522 [18933] relay/[::ffff:192.168.0.101]:/101/main I> recover from `/Users/e.shebunyaeva/work/tarantool-test-repl/master_dir/00000000000000000000.xlog'\n" +#~ "2017-06-14 14:12:20.922 [18933] main/105/applier/replicator@192.168.0. I> authenticated" +#~ msgstr "" +#~ "$ # настройка реплики (из журнала мастера)\n" +#~ "<...>\n" +#~ "2017-06-14 14:12:20.503 [18933] main/106/main I> initial data sent.\n" +#~ "2017-06-14 14:12:20.505 [18933] relay/[::ffff:192.168.0.101]:/101/main I> recover from `/var/lib/tarantool/master/00000000000000000000.xlog'\n" +#~ "2017-06-14 14:12:20.505 [18933] main/106/main I> final data sent.\n" +#~ "2017-06-14 14:12:20.522 [18933] relay/[::ffff:192.168.0.101]:/101/main I> recover from `/Users/e.shebunyaeva/work/tarantool-test-repl/master_dir/00000000000000000000.xlog'\n" +#~ "2017-06-14 14:12:20.922 [18933] main/105/applier/replicator@192.168.0. I> authenticated" + +#~ msgid "" +#~ "$ # bootstrapping the replica (from the replica's log)\n" +#~ "<...>\n" +#~ "2017-06-14 14:12:20.498 [18934] main/104/applier/replicator@192.168.0. I> authenticated\n" +#~ "2017-06-14 14:12:20.498 [18934] main/101/replica.lua I> bootstrapping replica from 192.168.0.101:3301\n" +#~ "2017-06-14 14:12:20.512 [18934] main/104/applier/replicator@192.168.0. I> initial data received\n" +#~ "2017-06-14 14:12:20.512 [18934] main/104/applier/replicator@192.168.0. I> final data received\n" +#~ "2017-06-14 14:12:20.517 [18934] snapshot/101/main I> saving snapshot `/var/lib/tarantool/replica/00000000000000000005.snap.inprogress'\n" +#~ "2017-06-14 14:12:20.518 [18934] snapshot/101/main I> done\n" +#~ "2017-06-14 14:12:20.519 [18934] main/101/replica.lua I> vinyl checkpoint done\n" +#~ "2017-06-14 14:12:20.520 [18934] main/101/replica.lua I> ready to accept requests\n" +#~ "2017-06-14 14:12:20.520 [18934] main/101/replica.lua I> set 'read_only' configuration option to true\n" +#~ "2017-06-14 14:12:20.520 [18934] main C> entering the event loop" +#~ msgstr "" +#~ "$ # настройка реплики (из журнала реплики)\n" +#~ "<...>\n" +#~ "2017-06-14 14:12:20.498 [18934] main/104/applier/replicator@192.168.0. I> authenticated\n" +#~ "2017-06-14 14:12:20.498 [18934] main/101/replica.lua I> bootstrapping replica from 192.168.0.101:3301\n" +#~ "2017-06-14 14:12:20.512 [18934] main/104/applier/replicator@192.168.0. I> initial data received\n" +#~ "2017-06-14 14:12:20.512 [18934] main/104/applier/replicator@192.168.0. I> final data received\n" +#~ "2017-06-14 14:12:20.517 [18934] snapshot/101/main I> saving snapshot `/var/lib/tarantool/replica/00000000000000000005.snap.inprogress'\n" +#~ "2017-06-14 14:12:20.518 [18934] snapshot/101/main I> done\n" +#~ "2017-06-14 14:12:20.519 [18934] main/101/replica.lua I> vinyl checkpoint done\n" +#~ "2017-06-14 14:12:20.520 [18934] main/101/replica.lua I> ready to accept requests\n" +#~ "2017-06-14 14:12:20.520 [18934] main/101/replica.lua I> set 'read_only' configuration option to true\n" +#~ "2017-06-14 14:12:20.520 [18934] main C> entering the event loop" + +#~ msgid "" +#~ "Notice that ``box.once()`` was executed only at the master, although we " +#~ "added ``box.once()`` to both instance files." +#~ msgstr "" +#~ "Обратите внимание, что функция ``box.once()`` была выполнена только на " +#~ "мастере, хотя мы добавили ``box.once()`` в оба файла экземпляра." + +#~ msgid "We could as well launch the replica first:" +#~ msgstr "Также можно было сначала запустить реплику:" + +#~ msgid "" +#~ "$ # launching the replica\n" +#~ "$ tarantool replica.lua\n" +#~ "2017-06-14 14:35:36.763 [18952] main/101/replica.lua C> version 1.7.4-52-g980d30092\n" +#~ "2017-06-14 14:35:36.765 [18952] main/101/replica.lua C> log level 5\n" +#~ "2017-06-14 14:35:36.765 [18952] main/101/replica.lua I> mapping 268435456 bytes for tuple arena...\n" +#~ "2017-06-14 14:35:36.772 [18952] iproto/101/main I> binary: bound to [::]:3301\n" +#~ "2017-06-14 14:35:36.772 [18952] main/104/applier/replicator@192.168.0. I> can't connect to master\n" +#~ "2017-06-14 14:35:36.772 [18952] main/104/applier/replicator@192.168.0. coio.cc:105 !> SystemError connect, called on fd 13, aka 192.168.0.101:56820: Connection refused\n" +#~ "2017-06-14 14:35:36.772 [18952] main/104/applier/replicator@192.168.0. I> will retry every 1 second\n" +#~ "2017-06-14 14:35:36.772 [18952] main/105/applier/replicator@192.168.0. I> remote master is 1.7.4 at 192.168.0.102:3301" +#~ msgstr "" +#~ "$ # запуск реплики\n" +#~ "$ tarantool replica.lua\n" +#~ "2017-06-14 14:35:36.763 [18952] main/101/replica.lua C> version 1.7.4-52-g980d30092\n" +#~ "2017-06-14 14:35:36.765 [18952] main/101/replica.lua C> log level 5\n" +#~ "2017-06-14 14:35:36.765 [18952] main/101/replica.lua I> mapping 268435456 bytes for tuple arena...\n" +#~ "2017-06-14 14:35:36.772 [18952] iproto/101/main I> binary: bound to [::]:3301\n" +#~ "2017-06-14 14:35:36.772 [18952] main/104/applier/replicator@192.168.0. I> can't connect to master\n" +#~ "2017-06-14 14:35:36.772 [18952] main/104/applier/replicator@192.168.0. coio.cc:105 !> SystemError connect, called on fd 13, aka 192.168.0.101:56820: Connection refused\n" +#~ "2017-06-14 14:35:36.772 [18952] main/104/applier/replicator@192.168.0. I> will retry every 1 second\n" +#~ "2017-06-14 14:35:36.772 [18952] main/105/applier/replicator@192.168.0. I> remote master is 1.7.4 at 192.168.0.102:3301" + +#~ msgid "... and the master later:" +#~ msgstr "... а затем уже мастера:" + +#~ msgid "" +#~ "$ # launching the master\n" +#~ "$ tarantool master.lua\n" +#~ "2017-06-14 14:35:43.701 [18953] main/101/master.lua C> version 1.7.4-52-g980d30092\n" +#~ "2017-06-14 14:35:43.702 [18953] main/101/master.lua C> log level 5\n" +#~ "2017-06-14 14:35:43.702 [18953] main/101/master.lua I> mapping 268435456 bytes for tuple arena...\n" +#~ "2017-06-14 14:35:43.709 [18953] iproto/101/main I> binary: bound to [::]:3301\n" +#~ "2017-06-14 14:35:43.709 [18953] main/105/applier/replicator@192.168.0. I> remote master is 1.7.4 at 192.168.0.102:3301\n" +#~ "2017-06-14 14:35:43.709 [18953] main/104/applier/replicator@192.168.0. I> remote master is 1.7.4 at 192.168.0.101:3301\n" +#~ "2017-06-14 14:35:43.709 [18953] main/101/master.lua I> initializing an empty data directory\n" +#~ "2017-06-14 14:35:43.721 [18953] snapshot/101/main I> saving snapshot `/var/lib/tarantool/master/00000000000000000000.snap.inprogress'\n" +#~ "2017-06-14 14:35:43.722 [18953] snapshot/101/main I> done\n" +#~ "2017-06-14 14:35:43.723 [18953] main/101/master.lua I> vinyl checkpoint done\n" +#~ "2017-06-14 14:35:43.723 [18953] main/101/master.lua I> ready to accept requests\n" +#~ "2017-06-14 14:35:43.724 [18953] main/105/applier/replicator@192.168.0. I> failed to authenticate\n" +#~ "2017-06-14 14:35:43.724 [18953] main/105/applier/replicator@192.168.0. xrow.cc:431 E> ER_LOADING: Instance bootstrap hasn't finished yet\n" +#~ "box.once executed on master\n" +#~ "2017-06-14 14:35:43.726 [18953] main C> entering the event loop\n" +#~ "2017-06-14 14:35:43.779 [18953] main/103/main I> initial data sent.\n" +#~ "2017-06-14 14:35:43.780 [18953] relay/[::ffff:192.168.0.101]:/101/main I> recover from `/var/lib/tarantool/master/00000000000000000000.xlog'\n" +#~ "2017-06-14 14:35:43.780 [18953] main/103/main I> final data sent.\n" +#~ "2017-06-14 14:35:43.796 [18953] relay/[::ffff:192.168.0.102]:/101/main I> recover from `/var/lib/tarantool/master/00000000000000000000.xlog'\n" +#~ "2017-06-14 14:35:44.726 [18953] main/105/applier/replicator@192.168.0. I> authenticated" +#~ msgstr "" +#~ "$ # запуск мастера\n" +#~ "$ tarantool master.lua\n" +#~ "2017-06-14 14:35:43.701 [18953] main/101/master.lua C> version 1.7.4-52-g980d30092\n" +#~ "2017-06-14 14:35:43.702 [18953] main/101/master.lua C> log level 5\n" +#~ "2017-06-14 14:35:43.702 [18953] main/101/master.lua I> mapping 268435456 bytes for tuple arena...\n" +#~ "2017-06-14 14:35:43.709 [18953] iproto/101/main I> binary: bound to [::]:3301\n" +#~ "2017-06-14 14:35:43.709 [18953] main/105/applier/replicator@192.168.0. I> remote master is 1.7.4 at 192.168.0.102:3301\n" +#~ "2017-06-14 14:35:43.709 [18953] main/104/applier/replicator@192.168.0. I> remote master is 1.7.4 at 192.168.0.101:3301\n" +#~ "2017-06-14 14:35:43.709 [18953] main/101/master.lua I> initializing an empty data directory\n" +#~ "2017-06-14 14:35:43.721 [18953] snapshot/101/main I> saving snapshot `/var/lib/tarantool/master/00000000000000000000.snap.inprogress'\n" +#~ "2017-06-14 14:35:43.722 [18953] snapshot/101/main I> done\n" +#~ "2017-06-14 14:35:43.723 [18953] main/101/master.lua I> vinyl checkpoint done\n" +#~ "2017-06-14 14:35:43.723 [18953] main/101/master.lua I> ready to accept requests\n" +#~ "2017-06-14 14:35:43.724 [18953] main/105/applier/replicator@192.168.0. I> failed to authenticate\n" +#~ "2017-06-14 14:35:43.724 [18953] main/105/applier/replicator@192.168.0. xrow.cc:431 E> ER_LOADING: Instance bootstrap hasn't finished yet\n" +#~ "box.once executed on master\n" +#~ "2017-06-14 14:35:43.726 [18953] main C> entering the event loop\n" +#~ "2017-06-14 14:35:43.779 [18953] main/103/main I> initial data sent.\n" +#~ "2017-06-14 14:35:43.780 [18953] relay/[::ffff:192.168.0.101]:/101/main I> recover from `/var/lib/tarantool/master/00000000000000000000.xlog'\n" +#~ "2017-06-14 14:35:43.780 [18953] main/103/main I> final data sent.\n" +#~ "2017-06-14 14:35:43.796 [18953] relay/[::ffff:192.168.0.102]:/101/main I> recover from `/var/lib/tarantool/master/00000000000000000000.xlog'\n" +#~ "2017-06-14 14:35:44.726 [18953] main/105/applier/replicator@192.168.0. I> authenticated" + +#~ msgid "" +#~ "In this case, the replica would wait for the master to become available, so " +#~ "the launch order doesn't matter. Our ``box.once()`` logic would also be " +#~ "executed only once, at the master." +#~ msgstr "" +#~ "В данном случае реплика ожидает доступности мастера, поэтому порядок запуска" +#~ " не имеет значения. Наша функция ``box.once()`` также будет выполняться " +#~ "однократно, только на мастере." + +#~ msgid "" +#~ "$ # the replica has eventually connected to the master\n" +#~ "$ # and got bootstrapped (from the replica's log)\n" +#~ "2017-06-14 14:35:43.777 [18952] main/104/applier/replicator@192.168.0. I> remote master is 1.7.4 at 192.168.0.101:3301\n" +#~ "2017-06-14 14:35:43.777 [18952] main/104/applier/replicator@192.168.0. I> authenticated\n" +#~ "2017-06-14 14:35:43.777 [18952] main/101/replica.lua I> bootstrapping replica from 192.168.0.199:3310\n" +#~ "2017-06-14 14:35:43.788 [18952] main/104/applier/replicator@192.168.0. I> initial data received\n" +#~ "2017-06-14 14:35:43.789 [18952] main/104/applier/replicator@192.168.0. I> final data received\n" +#~ "2017-06-14 14:35:43.793 [18952] snapshot/101/main I> saving snapshot `/var/lib/tarantool/replica/00000000000000000005.snap.inprogress'\n" +#~ "2017-06-14 14:35:43.793 [18952] snapshot/101/main I> done\n" +#~ "2017-06-14 14:35:43.795 [18952] main/101/replica.lua I> vinyl checkpoint done\n" +#~ "2017-06-14 14:35:43.795 [18952] main/101/replica.lua I> ready to accept requests\n" +#~ "2017-06-14 14:35:43.795 [18952] main/101/replica.lua I> set 'read_only' configuration option to true\n" +#~ "2017-06-14 14:35:43.795 [18952] main C> entering the event loop" +#~ msgstr "" +#~ "$ # реплика в итоге подключена к мастеру\n" +#~ "$ # и получила настройки (из журнала реплики)\n" +#~ "2017-06-14 14:35:43.777 [18952] main/104/applier/replicator@192.168.0. I> remote master is 1.7.4 at 192.168.0.101:3301\n" +#~ "2017-06-14 14:35:43.777 [18952] main/104/applier/replicator@192.168.0. I> authenticated\n" +#~ "2017-06-14 14:35:43.777 [18952] main/101/replica.lua I> bootstrapping replica from 192.168.0.199:3310\n" +#~ "2017-06-14 14:35:43.788 [18952] main/104/applier/replicator@192.168.0. I> initial data received\n" +#~ "2017-06-14 14:35:43.789 [18952] main/104/applier/replicator@192.168.0. I> final data received\n" +#~ "2017-06-14 14:35:43.793 [18952] snapshot/101/main I> saving snapshot `/var/lib/tarantool/replica/00000000000000000005.snap.inprogress'\n" +#~ "2017-06-14 14:35:43.793 [18952] snapshot/101/main I> done\n" +#~ "2017-06-14 14:35:43.795 [18952] main/101/replica.lua I> vinyl checkpoint done\n" +#~ "2017-06-14 14:35:43.795 [18952] main/101/replica.lua I> ready to accept requests\n" +#~ "2017-06-14 14:35:43.795 [18952] main/101/replica.lua I> set 'read_only' configuration option to true\n" +#~ "2017-06-14 14:35:43.795 [18952] main C> entering the event loop" + +#~ msgid "Controlled failover" +#~ msgstr "Контролируемое восстановление после сбоя" + +#~ msgid "" +#~ "To perform a **controlled failover**, that is, swap the roles of the master " +#~ "and replica, all we need to do is to set ``read_only=true`` at the master, " +#~ "and ``read_only=false`` at the replica. The order of actions is important " +#~ "here. If a system is running in production, we do not want concurrent writes" +#~ " happening both at the replica and the master. Nor do we want the new " +#~ "replica to accept any writes until it has finished fetching all replication " +#~ "data from the old master. To compare replica and master state, we can use " +#~ ":ref:`box.info.signature `." +#~ msgstr "" +#~ "Чтобы провести **контролируемое восстановление после сбоя**, то есть " +#~ "поменять роли мастера и реплики, нужно лишь настроить параметры " +#~ "``read_only=true`` на мастере и ``read_only=false`` на реплике. Порядок " +#~ "действий в данном случае имеет значение. Если система принята в " +#~ "эксплуатацию, нам не нужна параллельная запись на реплике и на мастере. " +#~ "Нежелательно также, чтобы новая реплика принимала запись, пока не получит " +#~ "все реплицируемые данные со старого мастера. Чтобы сопоставить состояние " +#~ "реплики и мастера, можно использовать :ref:`box.info.signature " +#~ "`." + +#~ msgid "Set ``read_only=true`` at the master." +#~ msgstr "Настройте ``read_only=true`` на мастере." + +#~ msgid "" +#~ "# at the master\n" +#~ "tarantool> box.cfg{read_only=true}" +#~ msgstr "" +#~ "# на мастере\n" +#~ "tarantool> box.cfg{read_only=true}" + +#~ msgid "" +#~ "Record the master’s current position with ``box.info.signature``, containing" +#~ " the sum of all LSNs in the master’s vector clock." +#~ msgstr "" +#~ "Зарегистрируйте текущее состояние мастера с помощью ``box.info.signature``, " +#~ "которое содержит общее количество всех LSN в векторных часах мастера." + +#~ msgid "" +#~ "# at the master\n" +#~ "tarantool> box.info.signature" +#~ msgstr "" +#~ "# на мастере\n" +#~ "tarantool> box.info.signature" + +#~ msgid "Wait until the replica’s signature is the same as the master’s." +#~ msgstr "Подождите, пока сигнатура реплики не совпадет с сигнатурой мастера." + +#~ msgid "" +#~ "# at the replica\n" +#~ "tarantool> box.info.signature" +#~ msgstr "" +#~ "# на реплике\n" +#~ "tarantool> box.info.signature" + +#~ msgid "Set ``read_only=false`` at the replica to enable write operations." +#~ msgstr "" +#~ "Настройте ``read_only=false`` на реплике, чтобы запустить операции записи " +#~ "данных." + +#~ msgid "" +#~ "# at the replica\n" +#~ "tarantool> box.cfg{read_only=false}" +#~ msgstr "" +#~ "# на реплике\n" +#~ "tarantool> box.cfg{read_only=false}" + +#~ msgid "" +#~ "These four steps ensure that the replica doesn’t accept new writes until " +#~ "it’s done fetching writes from the master." +#~ msgstr "" +#~ "Эти шаги нужны для того, чтобы реплика гарантированно не принимала новые " +#~ "записи, пока не получит данные от мастера." + +#~ msgid "Master-master bootstrap" +#~ msgstr "Настройка репликации мастер-мастер" + +#~ msgid "" +#~ "Now let us bootstrap a two-instance **master-master** set. For easier " +#~ "administration, we make master#1 and master#2 instance files fully " +#~ "identical." +#~ msgstr "" +#~ "Теперь настроим набор с двумя экземплярами **мастер-мастер**. Для удобства " +#~ "управления сделаем файлы экземпляра для мастера №1 и мастера №2 практически " +#~ "одинаковыми." + +#~ msgid "" +#~ "We re-use the master's instance file from the :ref:`master-replica example " +#~ "` above." +#~ msgstr "" +#~ "Переиспользуем файл экземпляра для мастера из вышеописанного :ref:`примера " +#~ "мастер-реплика `." + +#~ msgid "" +#~ "-- instance file for any of the two masters\n" +#~ "box.cfg{\n" +#~ " listen = 3301,\n" +#~ " replication = {'replicator:password@192.168.0.101:3301', -- master1 URI\n" +#~ " 'replicator:password@192.168.0.102:3301'}, -- master2 URI\n" +#~ " read_only = false\n" +#~ "}\n" +#~ "box.once(\"schema\", function()\n" +#~ " box.schema.user.create('replicator', {password = 'password'})\n" +#~ " box.schema.user.grant('replicator', 'replication') -- grant replication role\n" +#~ " box.schema.space.create(\"test\")\n" +#~ " box.space.test:create_index(\"primary\")\n" +#~ " print('box.once executed on master #1')\n" +#~ "end)" +#~ msgstr "" +#~ "-- файл экземпляра для любого из двух мастеров\n" +#~ " box.cfg{\n" +#~ " listen = 3301,\n" +#~ " replication = {'replicator:password@192.168.0.101:3301', -- URI мастера 1\n" +#~ " 'replicator:password@192.168.0.102:3301'}, -- URI мастера 2\n" +#~ " read_only = false\n" +#~ "}\n" +#~ "box.once(\"schema\", function()\n" +#~ " box.schema.user.create('replicator', {password = 'password'})\n" +#~ " box.schema.user.grant('replicator', 'replication') -- настроить роль для репликации\n" +#~ " box.schema.space.create(\"test\")\n" +#~ " box.space.test:create_index(\"primary\")\n" +#~ " print('box.once executed on master #1')\n" +#~ "end)" + +#~ msgid "" +#~ "In the :ref:`replication ` parameter, we define" +#~ " the URIs of both masters in the replica set and say ``print('box.once " +#~ "executed on master #1')`` so it will be clear when and where the " +#~ "``box.once()`` logic is executed." +#~ msgstr "" +#~ "В параметре :ref:`replication ` определим URI " +#~ "обоих мастеров в наборе реплик и выполним команду ``print('box.once executed" +#~ " on master #1')``, чтобы увидеть, когда и где будет выполнена логика функции" +#~ " ``box.once()``." + +#~ msgid "" +#~ "Now we can launch the two masters. Again, the launch order doesn't matter. " +#~ "The ``box.once()`` logic will also be executed only once, at the master " +#~ "which is elected as the replica set :ref:`leader ` at " +#~ "bootstrap." +#~ msgstr "" +#~ "Теперь можно запустить оба мастера. Повторимся, что порядок запуска не имеет" +#~ " значения. Логика ``box.once()`` также будет выполняться лишь однократно на " +#~ "мастере, который будет выбран лидером (:ref:`leader `) в" +#~ " наборе реплик при настройке." + +#~ msgid "" +#~ "$ # launching master #1\n" +#~ "$ tarantool master1.lua\n" +#~ "2017-06-14 15:39:03.062 [47021] main/101/master1.lua C> version 1.7.4-52-g980d30092\n" +#~ "2017-06-14 15:39:03.062 [47021] main/101/master1.lua C> log level 5\n" +#~ "2017-06-14 15:39:03.063 [47021] main/101/master1.lua I> mapping 268435456 bytes for tuple arena...\n" +#~ "2017-06-14 15:39:03.065 [47021] iproto/101/main I> binary: bound to [::]:3301\n" +#~ "2017-06-14 15:39:03.065 [47021] main/105/applier/replicator@192.168.0.10 I> can't connect to master\n" +#~ "2017-06-14 15:39:03.065 [47021] main/105/applier/replicator@192.168.0.10 coio.cc:107 !> SystemError connect, called on fd 14, aka 192.168.0.102:57110: Connection refused\n" +#~ "2017-06-14 15:39:03.065 [47021] main/105/applier/replicator@192.168.0.10 I> will retry every 1 second\n" +#~ "2017-06-14 15:39:03.065 [47021] main/104/applier/replicator@192.168.0.10 I> remote master is 1.7.4 at 192.168.0.101:3301\n" +#~ "2017-06-14 15:39:08.070 [47021] main/105/applier/replicator@192.168.0.10 I> remote master is 1.7.4 at 192.168.0.102:3301\n" +#~ "2017-06-14 15:39:08.071 [47021] main/105/applier/replicator@192.168.0.10 I> authenticated\n" +#~ "2017-06-14 15:39:08.071 [47021] main/101/master1.lua I> bootstrapping replica from 192.168.0.102:3301\n" +#~ "2017-06-14 15:39:08.073 [47021] main/105/applier/replicator@192.168.0.10 I> initial data received\n" +#~ "2017-06-14 15:39:08.074 [47021] main/105/applier/replicator@192.168.0.10 I> final data received\n" +#~ "2017-06-14 15:39:08.074 [47021] snapshot/101/main I> saving snapshot `/Users/e.shebunyaeva/work/tarantool-test-repl/master1_dir/00000000000000000008.snap.inprogress'\n" +#~ "2017-06-14 15:39:08.074 [47021] snapshot/101/main I> done\n" +#~ "2017-06-14 15:39:08.076 [47021] main/101/master1.lua I> vinyl checkpoint done\n" +#~ "2017-06-14 15:39:08.076 [47021] main/101/master1.lua I> ready to accept requests\n" +#~ "box.once executed on master #1\n" +#~ "2017-06-14 15:39:08.077 [47021] main C> entering the event loop" +#~ msgstr "" +#~ "$ # запуск мастера №1\n" +#~ "$ tarantool master1.lua\n" +#~ "2017-06-14 15:39:03.062 [47021] main/101/master1.lua C> version 1.7.4-52-g980d30092\n" +#~ "2017-06-14 15:39:03.062 [47021] main/101/master1.lua C> log level 5\n" +#~ "2017-06-14 15:39:03.063 [47021] main/101/master1.lua I> mapping 268435456 bytes for tuple arena...\n" +#~ "2017-06-14 15:39:03.065 [47021] iproto/101/main I> binary: bound to [::]:3301\n" +#~ "2017-06-14 15:39:03.065 [47021] main/105/applier/replicator@192.168.0.10 I> can't connect to master\n" +#~ "2017-06-14 15:39:03.065 [47021] main/105/applier/replicator@192.168.0.10 coio.cc:107 !> SystemError connect, called on fd 14, aka 192.168.0.102:57110: Connection refused\n" +#~ "2017-06-14 15:39:03.065 [47021] main/105/applier/replicator@192.168.0.10 I> will retry every 1 second\n" +#~ "2017-06-14 15:39:03.065 [47021] main/104/applier/replicator@192.168.0.10 I> remote master is 1.7.4 at 192.168.0.101:3301\n" +#~ "2017-06-14 15:39:08.070 [47021] main/105/applier/replicator@192.168.0.10 I> remote master is 1.7.4 at 192.168.0.102:3301\n" +#~ "2017-06-14 15:39:08.071 [47021] main/105/applier/replicator@192.168.0.10 I> authenticated\n" +#~ "2017-06-14 15:39:08.071 [47021] main/101/master1.lua I> bootstrapping replica from 192.168.0.102:3301\n" +#~ "2017-06-14 15:39:08.073 [47021] main/105/applier/replicator@192.168.0.10 I> initial data received\n" +#~ "2017-06-14 15:39:08.074 [47021] main/105/applier/replicator@192.168.0.10 I> final data received\n" +#~ "2017-06-14 15:39:08.074 [47021] snapshot/101/main I> saving snapshot `/Users/e.shebunyaeva/work/tarantool-test-repl/master1_dir/00000000000000000008.snap.inprogress'\n" +#~ "2017-06-14 15:39:08.074 [47021] snapshot/101/main I> done\n" +#~ "2017-06-14 15:39:08.076 [47021] main/101/master1.lua I> vinyl checkpoint done\n" +#~ "2017-06-14 15:39:08.076 [47021] main/101/master1.lua I> ready to accept requests\n" +#~ "box.once executed on master #1\n" +#~ "2017-06-14 15:39:08.077 [47021] main C> entering the event loop" + +#~ msgid "" +#~ "$ # launching master #2\n" +#~ "$ tarantool master2.lua\n" +#~ "2017-06-14 15:39:07.452 [47022] main/101/master2.lua C> version 1.7.4-52-g980d30092\n" +#~ "2017-06-14 15:39:07.453 [47022] main/101/master2.lua C> log level 5\n" +#~ "2017-06-14 15:39:07.453 [47022] main/101/master2.lua I> mapping 268435456 bytes for tuple arena...\n" +#~ "2017-06-14 15:39:07.455 [47022] iproto/101/main I> binary: bound to [::]:3301\n" +#~ "2017-06-14 15:39:07.455 [47022] main/104/applier/replicator@192.168.0.19 I> remote master is 1.7.4 at 192.168.0.101:3301\n" +#~ "2017-06-14 15:39:07.455 [47022] main/105/applier/replicator@192.168.0.10 I> remote master is 1.7.4 at 192.168.0.102:3301\n" +#~ "2017-06-14 15:39:07.455 [47022] main/101/master2.lua I> initializing an empty data directory\n" +#~ "2017-06-14 15:39:07.457 [47022] snapshot/101/main I> saving snapshot `/Users/e.shebunyaeva/work/tarantool-test-repl/master2_dir/00000000000000000000.snap.inprogress'\n" +#~ "2017-06-14 15:39:07.457 [47022] snapshot/101/main I> done\n" +#~ "2017-06-14 15:39:07.458 [47022] main/101/master2.lua I> vinyl checkpoint done\n" +#~ "2017-06-14 15:39:07.459 [47022] main/101/master2.lua I> ready to accept requests\n" +#~ "2017-06-14 15:39:07.460 [47022] main C> entering the event loop\n" +#~ "2017-06-14 15:39:08.072 [47022] main/103/main I> initial data sent.\n" +#~ "2017-06-14 15:39:08.073 [47022] relay/[::ffff:192.168.0.102]:/101/main I> recover from `/Users/e.shebunyaeva/work/tarantool-test-repl/master2_dir/00000000000000000000.xlog'\n" +#~ "2017-06-14 15:39:08.073 [47022] main/103/main I> final data sent.\n" +#~ "2017-06-14 15:39:08.077 [47022] relay/[::ffff:192.168.0.102]:/101/main I> recover from `/Users/e.shebunyaeva/work/tarantool-test-repl/master2_dir/00000000000000000000.xlog'\n" +#~ "2017-06-14 15:39:08.461 [47022] main/104/applier/replicator@192.168.0.10 I> authenticated" +#~ msgstr "" +#~ "$ # запуск мастера №2\n" +#~ "$ tarantool master2.lua\n" +#~ "2017-06-14 15:39:07.452 [47022] main/101/master2.lua C> version 1.7.4-52-g980d30092\n" +#~ "2017-06-14 15:39:07.453 [47022] main/101/master2.lua C> log level 5\n" +#~ "2017-06-14 15:39:07.453 [47022] main/101/master2.lua I> mapping 268435456 bytes for tuple arena...\n" +#~ "2017-06-14 15:39:07.455 [47022] iproto/101/main I> binary: bound to [::]:3301\n" +#~ "2017-06-14 15:39:07.455 [47022] main/104/applier/replicator@192.168.0.19 I> remote master is 1.7.4 at 192.168.0.101:3301\n" +#~ "2017-06-14 15:39:07.455 [47022] main/105/applier/replicator@192.168.0.10 I> remote master is 1.7.4 at 192.168.0.102:3301\n" +#~ "2017-06-14 15:39:07.455 [47022] main/101/master2.lua I> initializing an empty data directory\n" +#~ "2017-06-14 15:39:07.457 [47022] snapshot/101/main I> saving snapshot `/Users/e.shebunyaeva/work/tarantool-test-repl/master2_dir/00000000000000000000.snap.inprogress'\n" +#~ "2017-06-14 15:39:07.457 [47022] snapshot/101/main I> done\n" +#~ "2017-06-14 15:39:07.458 [47022] main/101/master2.lua I> vinyl checkpoint done\n" +#~ "2017-06-14 15:39:07.459 [47022] main/101/master2.lua I> ready to accept requests\n" +#~ "2017-06-14 15:39:07.460 [47022] main C> entering the event loop\n" +#~ "2017-06-14 15:39:08.072 [47022] main/103/main I> initial data sent.\n" +#~ "2017-06-14 15:39:08.073 [47022] relay/[::ffff:192.168.0.102]:/101/main I> recover from `/Users/e.shebunyaeva/work/tarantool-test-repl/master2_dir/00000000000000000000.xlog'\n" +#~ "2017-06-14 15:39:08.073 [47022] main/103/main I> final data sent.\n" +#~ "2017-06-14 15:39:08.077 [47022] relay/[::ffff:192.168.0.102]:/101/main I> recover from `/Users/e.shebunyaeva/work/tarantool-test-repl/master2_dir/00000000000000000000.xlog'\n" +#~ "2017-06-14 15:39:08.461 [47022] main/104/applier/replicator@192.168.0.10 I> authenticated" diff --git a/locale/ru/LC_MESSAGES/how-to/replication/repl_bootstrap_auto.po b/locale/ru/LC_MESSAGES/how-to/replication/repl_bootstrap_auto.po new file mode 100644 index 0000000000..7407ee236f --- /dev/null +++ b/locale/ru/LC_MESSAGES/how-to/replication/repl_bootstrap_auto.po @@ -0,0 +1,532 @@ + +msgid "Master-replica: automated failover" +msgstr "" + +msgid "" +"**Example on GitHub**: `auto_leader " +"`_" +msgstr "" + +msgid "" +"This tutorial shows how to configure and work with a replica set with " +"automated failover." +msgstr "" + +msgid "Prerequisites" +msgstr "" + +msgid "Before starting this tutorial:" +msgstr "" + +msgid "Install the :ref:`tt ` utility." +msgstr "" + +msgid "" +"Create a tt environment in the current directory by executing the :ref:`tt " +"init ` command." +msgstr "" + +msgid "" +"Inside the ``instances.enabled`` directory of the created tt environment, " +"create the ``auto_leader`` directory." +msgstr "" + +msgid "" +"Inside ``instances.enabled/auto_leader``, create the ``instances.yml`` and " +"``config.yaml`` files:" +msgstr "" + +msgid "" +"``instances.yml`` specifies instances to :ref:`run ` in the current environment and should look like " +"this:" +msgstr "" + +msgid "" +"instance001:\n" +"instance002:\n" +"instance003:" +msgstr "" + +msgid "" +"The ``config.yaml`` file is intended to store a :ref:`replica set " +"configuration `." +msgstr "" + +msgid "Configuring a replica set" +msgstr "" + +msgid "" +"This section describes how to configure a replica set in ``config.yaml``." +msgstr "" + +msgid "Step 1: Configuring a failover mode" +msgstr "" + +msgid "" +"First, set the :ref:`replication.failover " +"` option to ``election``:" +msgstr "" + +msgid "" +"replication:\n" +" failover: election\n" +msgstr "" + +msgid "Step 2: Defining a replica set topology" +msgstr "" + +msgid "" +"Define a replica set topology inside the :ref:`groups " +"` section. The :ref:`iproto.listen " +"` option specifies an address used to" +" listen for incoming requests and allows replicas to communicate with each " +"other." +msgstr "" + +msgid "" +"groups:\n" +" group001:\n" +" replicasets:\n" +" replicaset001:\n" +" instances:\n" +" instance001:\n" +" iproto:\n" +" listen: 127.0.0.1:3301\n" +" instance002:\n" +" iproto:\n" +" listen: 127.0.0.1:3302\n" +" instance003:\n" +" iproto:\n" +" listen: 127.0.0.1:3303\n" +msgstr "" + +msgid "Step 3: Creating a user for replication" +msgstr "" + +msgid "" +"In the :ref:`credentials ` section, " +"create the ``replicator`` user with the ``replication`` role:" +msgstr "" + +msgid "" +"credentials:\n" +" users:\n" +" replicator:\n" +" password: 'topsecret'\n" +" roles: [replication]\n" +msgstr "" + +msgid "Step 4: Specifying advertise URIs" +msgstr "" + +msgid "" +"Set :ref:`iproto.advertise.peer " +"` to advertise the current " +"instance to other replica set members:" +msgstr "" + +msgid "" +"iproto:\n" +" advertise:\n" +" peer: replicator@\n" +msgstr "" + +msgid "Resulting configuration" +msgstr "" + +msgid "The resulting replica set configuration should look as follows:" +msgstr "" + +msgid "" +"credentials:\n" +" users:\n" +" replicator:\n" +" password: 'topsecret'\n" +" roles: [replication]\n" +"\n" +"iproto:\n" +" advertise:\n" +" peer: replicator@\n" +"\n" +"replication:\n" +" failover: election\n" +"\n" +"groups:\n" +" group001:\n" +" replicasets:\n" +" replicaset001:\n" +" instances:\n" +" instance001:\n" +" iproto:\n" +" listen: 127.0.0.1:3301\n" +" instance002:\n" +" iproto:\n" +" listen: 127.0.0.1:3302\n" +" instance003:\n" +" iproto:\n" +" listen: 127.0.0.1:3303\n" +msgstr "" + +msgid "Working with a replica set" +msgstr "" + +msgid "Starting instances" +msgstr "" + +msgid "" +"After configuring a replica set, execute the :ref:`tt start ` " +"command from the :ref:`tt environment directory `:" +msgstr "" + +msgid "" +"$ tt start auto_leader\n" +" • Starting an instance [auto_leader:instance001]...\n" +" • Starting an instance [auto_leader:instance002]...\n" +" • Starting an instance [auto_leader:instance003]..." +msgstr "" + +msgid "" +"Check that instances are in the ``RUNNING`` status using the :ref:`tt status" +" ` command:" +msgstr "" + +msgid "" +"$ tt status auto_leader\n" +"INSTANCE STATUS PID\n" +"auto_leader:instance001 RUNNING 24768\n" +"auto_leader:instance002 RUNNING 24769\n" +"auto_leader:instance003 RUNNING 24767" +msgstr "" + +msgid "Checking a replica set status" +msgstr "" + +msgid "Connect to ``instance001`` using :ref:`tt connect `:" +msgstr "" + +msgid "" +"$ tt connect auto_leader:instance001\n" +" • Connecting to the instance...\n" +" • Connected to auto_leader:instance001" +msgstr "" + +msgid "" +"Check the instance state in regard to :ref:`leader election " +"` using :ref:`box.info.election " +"`. The output below shows that ``instance001`` is a " +"follower while ``instance002`` is a replica set leader." +msgstr "" + +msgid "" +"auto_leader:instance001> box.info.election\n" +"---\n" +"- leader_idle: 0.77491499999815\n" +" leader_name: instance002\n" +" state: follower\n" +" vote: 0\n" +" term: 2\n" +" leader: 1\n" +"..." +msgstr "" + +msgid "Check that ``instance001`` is in read-only mode using ``box.info.ro``:" +msgstr "" + +msgid "" +"auto_leader:instance001> box.info.ro\n" +"---\n" +"- true\n" +"..." +msgstr "" + +msgid "" +"Execute ``box.info.replication`` to check a replica set status. Make sure " +"that ``upstream.status`` and ``downstream.status`` are ``follow`` for " +"``instance002`` and ``instance003``." +msgstr "" + +msgid "" +"auto_leader:instance001> box.info.replication\n" +"---\n" +"- 1:\n" +" id: 1\n" +" uuid: 4cfa6e3c-625e-b027-00a7-29b2f2182f23\n" +" lsn: 9\n" +" upstream:\n" +" status: follow\n" +" idle: 0.8257709999998\n" +" peer: replicator@127.0.0.1:3302\n" +" lag: 0.00012326240539551\n" +" name: instance002\n" +" downstream:\n" +" status: follow\n" +" idle: 0.81174199999805\n" +" vclock: {1: 9}\n" +" lag: 0\n" +" 2:\n" +" id: 2\n" +" uuid: 9bb111c2-3ff5-36a7-00f4-2b9a573ea660\n" +" lsn: 0\n" +" name: instance001\n" +" 3:\n" +" id: 3\n" +" uuid: 9a3a1b9b-8a18-baf6-00b3-a6e5e11fd8b6\n" +" lsn: 0\n" +" upstream:\n" +" status: follow\n" +" idle: 0.83125499999733\n" +" peer: replicator@127.0.0.1:3303\n" +" lag: 0.00010204315185547\n" +" name: instance003\n" +" downstream:\n" +" status: follow\n" +" idle: 0.83213399999659\n" +" vclock: {1: 9}\n" +" lag: 0\n" +"..." +msgstr "" + +msgid "Adding data" +msgstr "" + +msgid "" +"To check that replicas (``instance001`` and ``instance003``) get all updates" +" from the master (``instance002``), follow the steps below:" +msgstr "" + +msgid "Connect to ``instance002`` using ``tt connect``:" +msgstr "" + +msgid "" +"$ tt connect auto_leader:instance002\n" +" • Connecting to the instance...\n" +" • Connected to auto_leader:instance002" +msgstr "" + +msgid "" +"Create a space and add data as described in :ref:`CRUD operation examples " +"`." +msgstr "" + +msgid "" +"Use the ``select`` operation on ``instance001`` and ``instance003`` to make " +"sure data is replicated." +msgstr "" + +msgid "" +"Check that the ``1`` component of :ref:`box.info.vclock ` values are the same on all instances:" +msgstr "" + +msgid "``instance001``:" +msgstr "" + +msgid "" +"auto_leader:instance001> box.info.vclock\n" +"---\n" +"- {0: 1, 1: 32}\n" +"..." +msgstr "" + +msgid "``instance002``:" +msgstr "" + +msgid "" +"auto_leader:instance002> box.info.vclock\n" +"---\n" +"- {0: 1, 1: 32}\n" +"..." +msgstr "" + +msgid "``instance003``:" +msgstr "" + +msgid "" +"auto_leader:instance003> box.info.vclock\n" +"---\n" +"- {0: 1, 1: 32}\n" +"..." +msgstr "" + +msgid "" +"Note that a ``vclock`` value might include the ``0`` component that is " +"related to local space operations and might differ for different instances " +"in a replica set." +msgstr "" + +msgid "Testing automated failover" +msgstr "" + +msgid "" +"To test how automated failover works if the current master is stopped, " +"follow the steps below:" +msgstr "" + +msgid "" +"Stop the current master instance (``instance002``) using the ``tt stop`` " +"command:" +msgstr "" + +msgid "" +"$ tt stop auto_leader:instance002\n" +" • The Instance auto_leader:instance002 (PID = 24769) has been terminated." +msgstr "" + +msgid "" +"On ``instance001``, check ``box.info.election``. In this example, a new " +"replica set leader is ``instance001``." +msgstr "" + +msgid "" +"auto_leader:instance001> box.info.election\n" +"---\n" +"- leader_idle: 0\n" +" leader_name: instance001\n" +" state: leader\n" +" vote: 2\n" +" term: 3\n" +" leader: 2\n" +"..." +msgstr "" + +msgid "" +"Check replication status using ``box.info.replication`` for ``instance002``:" +msgstr "" + +msgid "``upstream.status`` is ``disconnected``." +msgstr "" + +msgid "``downstream.status`` is ``stopped``." +msgstr "" + +msgid "" +"auto_leader:instance001> box.info.replication\n" +"---\n" +"- 1:\n" +" id: 1\n" +" uuid: 4cfa6e3c-625e-b027-00a7-29b2f2182f23\n" +" lsn: 32\n" +" upstream:\n" +" peer: replicator@127.0.0.1:3302\n" +" lag: 0.00032305717468262\n" +" status: disconnected\n" +" idle: 48.352504000002\n" +" message: 'connect, called on fd 20, aka 127.0.0.1:62575: Connection refused'\n" +" system_message: Connection refused\n" +" name: instance002\n" +" downstream:\n" +" status: stopped\n" +" message: 'unexpected EOF when reading from socket, called on fd 32, aka 127.0.0.1:3301,\n" +" peer of 127.0.0.1:62204: Broken pipe'\n" +" system_message: Broken pipe\n" +" 2:\n" +" id: 2\n" +" uuid: 9bb111c2-3ff5-36a7-00f4-2b9a573ea660\n" +" lsn: 1\n" +" name: instance001\n" +" 3:\n" +" id: 3\n" +" uuid: 9a3a1b9b-8a18-baf6-00b3-a6e5e11fd8b6\n" +" lsn: 0\n" +" upstream:\n" +" status: follow\n" +" idle: 0.18620999999985\n" +" peer: replicator@127.0.0.1:3303\n" +" lag: 0.00012516975402832\n" +" name: instance003\n" +" downstream:\n" +" status: follow\n" +" idle: 0.19718099999955\n" +" vclock: {2: 1, 1: 32}\n" +" lag: 0.00051403045654297\n" +"..." +msgstr "" + +msgid "Start ``instance002`` back using ``tt start``:" +msgstr "" + +msgid "" +"$ tt start auto_leader:instance002\n" +" • Starting an instance [auto_leader:instance002]..." +msgstr "" + +msgid "Choosing a leader manually" +msgstr "" + +msgid "" +"Make sure that :ref:`box.info.vclock ` values " +"(except the ``0`` components) are the same on all instances:" +msgstr "" + +msgid "" +"auto_leader:instance001> box.info.vclock\n" +"---\n" +"- {0: 2, 1: 32, 2: 1}\n" +"..." +msgstr "" + +msgid "" +"auto_leader:instance002> box.info.vclock\n" +"---\n" +"- {0: 2, 1: 32, 2: 1}\n" +"..." +msgstr "" + +msgid "" +"auto_leader:instance003> box.info.vclock\n" +"---\n" +"- {0: 3, 1: 32, 2: 1}\n" +"..." +msgstr "" + +msgid "" +"On ``instance002``, run :ref:`box.ctl.promote() ` to choose" +" it as a new replica set leader:" +msgstr "" + +msgid "" +"auto_leader:instance002> box.ctl.promote()\n" +"---\n" +"..." +msgstr "" + +msgid "" +"Check ``box.info.election`` to make sure ``instance002`` is a leader now:" +msgstr "" + +msgid "" +"auto_leader:instance002> box.info.election\n" +"---\n" +"- leader_idle: 0\n" +" leader_name: instance002\n" +" state: leader\n" +" vote: 1\n" +" term: 4\n" +" leader: 1\n" +"..." +msgstr "" + +msgid "Adding and removing instances" +msgstr "" + +msgid "" +"The process of adding instances to a replica set and removing them is " +"similar for all failover modes. Learn how to do this from the :ref:`Master-" +"replica: manual failover ` tutorial:" +msgstr "" + +msgid ":ref:`Adding instances `" +msgstr "" + +msgid ":ref:`Removing instances `" +msgstr "" + +msgid "" +"Before removing an instance from a replica set with " +":ref:`replication.failover ` " +"set to ``election``, make sure this instance is in read-only mode. If the " +"instance is a master, choose a :ref:`new leader manually `." +msgstr "" diff --git a/locale/ru/LC_MESSAGES/how-to/replication/repl_bootstrap_master_master.po b/locale/ru/LC_MESSAGES/how-to/replication/repl_bootstrap_master_master.po new file mode 100644 index 0000000000..004ad0a9ef --- /dev/null +++ b/locale/ru/LC_MESSAGES/how-to/replication/repl_bootstrap_master_master.po @@ -0,0 +1,645 @@ + +msgid "Master-master" +msgstr "" + +msgid "" +"**Example on GitHub**: `master_master " +"`_" +msgstr "" + +msgid "" +"This tutorial shows how to configure and work with a master-master replica " +"set." +msgstr "" + +msgid "Prerequisites" +msgstr "" + +msgid "Before starting this tutorial:" +msgstr "" + +msgid "Install the :ref:`tt ` utility." +msgstr "" + +msgid "" +"Create a tt environment in the current directory by executing the :ref:`tt " +"init ` command." +msgstr "" + +msgid "" +"Inside the ``instances.enabled`` directory of the created tt environment, " +"create the ``master_master`` directory." +msgstr "" + +msgid "" +"Inside ``instances.enabled/master_master``, create the ``instances.yml`` and" +" ``config.yaml`` files:" +msgstr "" + +msgid "" +"``instances.yml`` specifies instances to :ref:`run ` in the current environment and should look like " +"this:" +msgstr "" + +msgid "" +"instance001:\n" +"instance002:" +msgstr "" + +msgid "" +"The ``config.yaml`` file is intended to store a :ref:`replica set " +"configuration `." +msgstr "" + +msgid "Configuring a replica set" +msgstr "" + +msgid "" +"This section describes how to configure a replica set in ``config.yaml``." +msgstr "" + +msgid "Step 1: Configuring a failover mode" +msgstr "" + +msgid "" +"First, set the :ref:`replication.failover " +"` option to ``off``:" +msgstr "" + +msgid "" +"replication:\n" +" failover: off\n" +msgstr "" + +msgid "Step 2: Defining a replica set topology" +msgstr "" + +msgid "" +"Define a replica set topology inside the :ref:`groups " +"` section:" +msgstr "" + +msgid "" +"The ``database.mode`` option should be set to ``rw`` to make instances work " +"in read-write mode." +msgstr "" + +msgid "" +"The :ref:`iproto.listen ` option " +"specifies an address used to listen for incoming requests and allows " +"replicas to communicate with each other." +msgstr "" + +msgid "" +"groups:\n" +" group001:\n" +" replicasets:\n" +" replicaset001:\n" +" instances:\n" +" instance001:\n" +" database:\n" +" mode: rw\n" +" iproto:\n" +" listen: 127.0.0.1:3301\n" +" instance002:\n" +" database:\n" +" mode: rw\n" +" iproto:\n" +" listen: 127.0.0.1:3302\n" +msgstr "" + +msgid "Step 3: Creating a user for replication" +msgstr "" + +msgid "" +"In the :ref:`credentials ` section, " +"create the ``replicator`` user with the ``replication`` role:" +msgstr "" + +msgid "" +"credentials:\n" +" users:\n" +" replicator:\n" +" password: 'topsecret'\n" +" roles: [replication]\n" +msgstr "" + +msgid "Step 4: Specifying advertise URIs" +msgstr "" + +msgid "" +"Set :ref:`iproto.advertise.peer " +"` to advertise the current " +"instance to other replica set members:" +msgstr "" + +msgid "" +"iproto:\n" +" advertise:\n" +" peer: replicator@\n" +msgstr "" + +msgid "Resulting configuration" +msgstr "" + +msgid "The resulting replica set configuration should look as follows:" +msgstr "" + +msgid "" +"credentials:\n" +" users:\n" +" replicator:\n" +" password: 'topsecret'\n" +" roles: [replication]\n" +"\n" +"iproto:\n" +" advertise:\n" +" peer: replicator@\n" +"\n" +"replication:\n" +" failover: off\n" +"\n" +"groups:\n" +" group001:\n" +" replicasets:\n" +" replicaset001:\n" +" instances:\n" +" instance001:\n" +" database:\n" +" mode: rw\n" +" iproto:\n" +" listen: 127.0.0.1:3301\n" +" instance002:\n" +" database:\n" +" mode: rw\n" +" iproto:\n" +" listen: 127.0.0.1:3302\n" +msgstr "" + +msgid "Working with a replica set" +msgstr "" + +msgid "Starting instances" +msgstr "" + +msgid "" +"After configuring a replica set, execute the :ref:`tt start ` " +"command from the :ref:`tt environment directory `:" +msgstr "" + +msgid "" +"$ tt start master_master\n" +" • Starting an instance [master_master:instance001]...\n" +" • Starting an instance [master_master:instance002]..." +msgstr "" + +msgid "" +"Check that instances are in the ``RUNNING`` status using the :ref:`tt status" +" ` command:" +msgstr "" + +msgid "" +"$ tt status master_master\n" +"INSTANCE STATUS PID\n" +"master_master:instance001 RUNNING 30818\n" +"master_master:instance002 RUNNING 30819" +msgstr "" + +msgid "Checking a replica set status" +msgstr "" + +msgid "" +"Connect to both instances using :ref:`tt connect `. Below is the" +" example for ``instance001``:" +msgstr "" + +msgid "" +"$ tt connect master_master:instance001\n" +" • Connecting to the instance...\n" +" • Connected to master_master:instance001" +msgstr "" + +msgid "Check that both instances are writable using ``box.info.ro``:" +msgstr "" + +msgid "``instance001``:" +msgstr "" + +msgid "" +"master_master:instance001> box.info.ro\n" +"---\n" +"- false\n" +"..." +msgstr "" + +msgid "``instance002``:" +msgstr "" + +msgid "" +"master_master:instance002> box.info.ro\n" +"---\n" +"- false\n" +"..." +msgstr "" + +msgid "" +"Execute ``box.info.replication`` to check a replica set status. For " +"``instance002``, ``upstream.status`` and ``downstream.status`` should be " +"``follow``." +msgstr "" + +msgid "" +"master_master:instance001> box.info.replication\n" +"---\n" +"- 1:\n" +" id: 1\n" +" uuid: 4cfa6e3c-625e-b027-00a7-29b2f2182f23\n" +" lsn: 7\n" +" upstream:\n" +" status: follow\n" +" idle: 0.21281599999929\n" +" peer: replicator@127.0.0.1:3302\n" +" lag: 0.00031614303588867\n" +" name: instance002\n" +" downstream:\n" +" status: follow\n" +" idle: 0.21800899999653\n" +" vclock: {1: 7}\n" +" lag: 0\n" +" 2:\n" +" id: 2\n" +" uuid: 9bb111c2-3ff5-36a7-00f4-2b9a573ea660\n" +" lsn: 0\n" +" name: instance001\n" +"..." +msgstr "" + +msgid "" +"Note that a ``vclock`` value might include the ``0`` component that is " +"related to local space operations and might differ for different instances " +"in a replica set." +msgstr "" + +msgid "Adding data" +msgstr "" + +msgid "" +"To check that both instances get updates from each other, follow the steps " +"below:" +msgstr "" + +msgid "" +"On ``instance001``, create a space, format it, and create a primary index:" +msgstr "" + +msgid "" +"box.schema.space.create('bands')\n" +"box.space.bands:format({\n" +" { name = 'id', type = 'unsigned' },\n" +" { name = 'band_name', type = 'string' },\n" +" { name = 'year', type = 'unsigned' }\n" +"})\n" +"box.space.bands:create_index('primary', { parts = { 'id' } })\n" +msgstr "" + +msgid "Then, add sample data to this space:" +msgstr "" + +msgid "" +"box.space.bands:insert { 1, 'Roxette', 1986 }\n" +"box.space.bands:insert { 2, 'Scorpions', 1965 }\n" +msgstr "" + +msgid "" +"On ``instance002``, use the ``select`` operation to make sure data is " +"replicated:" +msgstr "" + +msgid "" +"master_master:instance002> box.space.bands:select()\n" +"---\n" +"- - [1, 'Roxette', 1986]\n" +" - [2, 'Scorpions', 1965]\n" +"..." +msgstr "" + +msgid "Add more data to the created space on ``instance002``:" +msgstr "" + +msgid "" +"box.space.bands:insert { 3, 'Ace of Base', 1987 }\n" +"box.space.bands:insert { 4, 'The Beatles', 1960 }\n" +msgstr "" + +msgid "" +"Get back to ``instance001`` and use ``select`` to make sure new records are " +"replicated." +msgstr "" + +msgid "" +"Check that :ref:`box.info.vclock ` values are " +"the same on both instances:" +msgstr "" + +msgid "" +"master_master:instance001> box.info.vclock\n" +"---\n" +"- {2: 5, 1: 9}\n" +"..." +msgstr "" + +msgid "" +"master_master:instance002> box.info.vclock\n" +"---\n" +"- {2: 5, 1: 9}\n" +"..." +msgstr "" + +msgid "Resolving replication conflicts" +msgstr "" + +msgid "" +"To learn how to fix and prevent replication conflicts using trigger " +"functions, see :ref:`Resolving replication conflicts `." +msgstr "" + +msgid "Inserting conflicting records" +msgstr "" + +msgid "" +"To insert conflicting records to ``instance001`` and ``instance002``, follow" +" the steps below:" +msgstr "" + +msgid "Stop ``instance001`` using the ``tt stop`` command:" +msgstr "" + +msgid "$ tt stop master_master:instance001" +msgstr "" + +msgid "On ``instance002``, insert a new record:" +msgstr "" + +msgid "box.space.bands:insert { 5, 'incorrect data', 0 }" +msgstr "" + +msgid "Stop ``instance002`` using ``tt stop``:" +msgstr "" + +msgid "$ tt stop master_master:instance002" +msgstr "" + +msgid "Start ``instance001`` back:" +msgstr "" + +msgid "$ tt start master_master:instance001" +msgstr "" + +msgid "" +"Connect to ``instance001`` and insert a record that should conflict with a " +"record already inserted on ``instance002``:" +msgstr "" + +msgid "box.space.bands:insert { 5, 'Pink Floyd', 1965 }\n" +msgstr "" + +msgid "Start ``instance002`` back:" +msgstr "" + +msgid "$ tt start master_master:instance002" +msgstr "" + +msgid "" +"Then, check ``box.info.replication`` on ``instance001``. ``upstream.status``" +" should be ``stopped`` because of the ``Duplicate key exists`` error:" +msgstr "" + +msgid "" +"master_master:instance001> box.info.replication\n" +"---\n" +"- 1:\n" +" id: 1\n" +" uuid: 4cfa6e3c-625e-b027-00a7-29b2f2182f23\n" +" lsn: 9\n" +" upstream:\n" +" peer: replicator@127.0.0.1:3302\n" +" lag: 143.52251672745\n" +" status: stopped\n" +" idle: 3.9462469999999\n" +" message: Duplicate key exists in unique index \"primary\" in space \"bands\" with\n" +" old tuple - [5, \"Pink Floyd\", 1965] and new tuple - [5, \"incorrect data\", 0]\n" +" name: instance002\n" +" downstream:\n" +" status: stopped\n" +" message: 'unexpected EOF when reading from socket, called on fd 12, aka 127.0.0.1:3301,\n" +" peer of 127.0.0.1:59258: Broken pipe'\n" +" system_message: Broken pipe\n" +" 2:\n" +" id: 2\n" +" uuid: 9bb111c2-3ff5-36a7-00f4-2b9a573ea660\n" +" lsn: 6\n" +" name: instance001\n" +"..." +msgstr "" + +msgid "Reseeding a replica" +msgstr "" + +msgid "" +"To resolve a replication conflict, ``instance002`` should get the correct " +"data from ``instance001`` first. To achieve this, ``instance002`` should be " +"rebootstrapped:" +msgstr "" + +msgid "" +"In the ``config.yaml`` file, change ``database.mode`` of ``instance002`` to " +"``ro``:" +msgstr "" + +msgid "" +"instance002:\n" +" database:\n" +" mode: ro" +msgstr "" + +msgid "" +"Reload configurations on both instances using the ``reload()`` function " +"provided by the :ref:`config ` module:" +msgstr "" + +msgid "" +"master_master:instance001> require('config'):reload()\n" +"---\n" +"..." +msgstr "" + +msgid "" +"master_master:instance002> require('config'):reload()\n" +"---\n" +"..." +msgstr "" + +msgid "" +"Delete write-ahead logs and snapshots stored in the ``var/lib/instance002`` " +"directory." +msgstr "" + +msgid "" +"``var/lib`` is the default directory used by tt to store write-ahead logs " +"and snapshots. Learn more from :ref:`Configuration `." +msgstr "" + +msgid "" +"Restart ``instance002`` using the :ref:`tt restart ` command:" +msgstr "" + +msgid "$ tt restart master_master:instance002" +msgstr "" + +msgid "" +"Connect to ``instance002`` and make sure it received the correct data from " +"``instance001``:" +msgstr "" + +msgid "" +"master_master:instance002> box.space.bands:select()\n" +"---\n" +"- - [1, 'Roxette', 1986]\n" +" - [2, 'Scorpions', 1965]\n" +" - [3, 'Ace of Base', 1987]\n" +" - [4, 'The Beatles', 1960]\n" +" - [5, 'Pink Floyd', 1965]\n" +"..." +msgstr "" + +msgid "Restarting replication" +msgstr "" + +msgid "" +"After :ref:`reseeding a replica `," +" you need to resolve a replication conflict that keeps replication stopped:" +msgstr "" + +msgid "" +"Execute ``box.info.replication`` on ``instance001``. ``upstream.status`` is " +"still stopped:" +msgstr "" + +msgid "" +"master_master:instance001> box.info.replication\n" +"---\n" +"- 1:\n" +" id: 1\n" +" uuid: 4cfa6e3c-625e-b027-00a7-29b2f2182f23\n" +" lsn: 9\n" +" upstream:\n" +" peer: replicator@127.0.0.1:3302\n" +" lag: 143.52251672745\n" +" status: stopped\n" +" idle: 1309.943383\n" +" message: Duplicate key exists in unique index \"primary\" in space \"bands\" with\n" +" old tuple - [5, \"Pink Floyd\", 1965] and new tuple - [5, \"incorrect data\",\n" +" 0]\n" +" name: instance002\n" +" downstream:\n" +" status: follow\n" +" idle: 0.47881799999959\n" +" vclock: {2: 6, 1: 9}\n" +" lag: 0\n" +" 2:\n" +" id: 2\n" +" uuid: 9bb111c2-3ff5-36a7-00f4-2b9a573ea660\n" +" lsn: 6\n" +" name: instance001\n" +"..." +msgstr "" + +msgid "" +"In the ``config.yaml`` file, clear the ``iproto`` option for ``instance001``" +" by setting its value to ``{}`` to disconnect this instance from " +"``instance002``. Set ``database.mode`` to ``ro``:" +msgstr "" + +msgid "" +"instance001:\n" +" database:\n" +" mode: ro\n" +" iproto: {}" +msgstr "" + +msgid "Reload configuration on ``instance001`` only:" +msgstr "" + +msgid "" +"Change ``database.mode`` values back to ``rw`` for both instances and " +"restore ``iproto.listen`` for ``instance001``:" +msgstr "" + +msgid "" +"instance001:\n" +" database:\n" +" mode: rw\n" +" iproto:\n" +" listen: 127.0.0.1:3301\n" +"instance002:\n" +" database:\n" +" mode: rw\n" +" iproto:\n" +" listen: 127.0.0.1:3302\n" +msgstr "" + +msgid "Reload configurations on both instances one more time:" +msgstr "" + +msgid "Check ``box.info.replication``. ``upstream.status`` be ``follow`` now." +msgstr "" + +msgid "" +"master_master:instance001> box.info.replication\n" +"---\n" +"- 1:\n" +" id: 1\n" +" uuid: 4cfa6e3c-625e-b027-00a7-29b2f2182f23\n" +" lsn: 9\n" +" upstream:\n" +" status: follow\n" +" idle: 0.21281300000192\n" +" peer: replicator@127.0.0.1:3302\n" +" lag: 0.00031113624572754\n" +" name: instance002\n" +" downstream:\n" +" status: follow\n" +" idle: 0.035179000002245\n" +" vclock: {2: 6, 1: 9}\n" +" lag: 0\n" +" 2:\n" +" id: 2\n" +" uuid: 9bb111c2-3ff5-36a7-00f4-2b9a573ea660\n" +" lsn: 6\n" +" name: instance001\n" +"..." +msgstr "" + +msgid "Adding and removing instances" +msgstr "" + +msgid "" +"The process of adding instances to a replica set and removing them is " +"similar for all failover modes. Learn how to do this from the :ref:`Master-" +"replica: manual failover ` tutorial:" +msgstr "" + +msgid ":ref:`Adding instances `" +msgstr "" + +msgid ":ref:`Removing instances `" +msgstr "" + +msgid "" +"Before removing an instance from a replica set with " +":ref:`replication.failover ` " +"set to ``off``, make sure this instance is in read-only mode." +msgstr "" diff --git a/locale/ru/LC_MESSAGES/how-to/replication/repl_leader_elect.po b/locale/ru/LC_MESSAGES/how-to/replication/repl_leader_elect.po index b945cfd4ad..171e69f7f6 100644 --- a/locale/ru/LC_MESSAGES/how-to/replication/repl_leader_elect.po +++ b/locale/ru/LC_MESSAGES/how-to/replication/repl_leader_elect.po @@ -1,12 +1,24 @@ + +msgid "Managing leader elections" +msgstr "" + +msgid "" +"Starting from version :doc:`2.6.1 `, Tarantool has the " +"built-in functionality managing automated leader election in a replica set. " +"Learn more about the :ref:`concept of leader election `." +msgstr "" + msgid "Configuration" msgstr "Настройка" +#, fuzzy msgid "" "box.cfg({\n" " election_mode = ,\n" +" election_fencing_mode = ,\n" " election_timeout = ,\n" " replication_timeout = ,\n" -" replication_synchro_quorum = ,\n" +" replication_synchro_quorum = \n" "})" msgstr "" "box.cfg({\n" @@ -25,6 +37,17 @@ msgstr "" "Подробное :ref:`описание параметра ` " "приводится в справочнике по настройке." +#, fuzzy +msgid "" +"``election_fencing_mode`` -- specifies the :ref:`leader fencing mode " +"`. For the details, refer to the :ref:`option " +"description ` in the configuration " +"reference." +msgstr "" +"``election_mode`` — определяет роль узла в процессе выборов лидера. " +"Подробное :ref:`описание параметра ` " +"приводится в справочнике по настройке." + msgid "" "``election_timeout`` -- specifies the timeout between election rounds if the" " previous round ended up with a split vote. For the details, refer to the " @@ -36,14 +59,15 @@ msgstr "" "параметра ` приводится в справочнике по " "настройке." +#, fuzzy msgid "" "``replication_timeout`` -- reuse of the :ref:`replication_timeout " "` configuration option for the purpose " "of the leader election process. Heartbeats sent by an active leader have a " "timeout after which a new election starts. Heartbeats are sent once per " -" seconds. Default value is ``1``. The leader is " +" seconds. The default value is ``1``. The leader is " "considered dead if it hasn't sent any heartbeats for the period of " -"`` * 4``." +"``replication_timeout * 4``." msgstr "" "``replication_timeout`` — параметр репликации :ref:`replication_timeout " "`, используемый для выборов лидера. " @@ -53,12 +77,13 @@ msgstr "" "`` * 4`` секунд, он считается недоступным (dead) и " "начинаются новые выборы." +#, fuzzy msgid "" "``replication_synchro_quorum`` -- reuse of the " ":ref:`replication_synchro_quorum ` option for the purpose of configuring the " "election quorum. The default value is ``1``, meaning that each node becomes " -"a leader immediately after voting for itself. It is the best to set up this " +"a leader immediately after voting for itself. It is best to set up this " "option value to the ``( / 2) + 1``. Otherwise, there is no " "guarantee that there is only one leader at a time." msgstr "" @@ -71,27 +96,23 @@ msgstr "" "времени в кластере будет только один лидер." msgid "" -"Besides, it is important to know that being a leader is not the only " -"requirement for a node to be writable. A leader node should have its " -":ref:`read_only ` option set to ``false`` " -"(``box.cfg{read_only = false}``), and its :ref:`connectivity quorum " -"` should be satisfied " -"(``box.cfg{replication_connect_quorum = }``) or disabled " -"(``box.cfg{replication_connect_quorum = 0}``)." +"It is important to know that being a leader is not the only requirement for " +"a node to be writable. The leader should also satisfy the following " +"requirements:" msgstr "" -"Важно также понимать, что статус лидера — не единственное, что требуется " -"узлу, чтобы быть доступным для записи. Параметр :ref:`read_only ` на узле-лидере должен иметь значение ``false`` " -"(``box.cfg{read_only = false}``). Необходимо также, чтобы выполнялось " -"условие, заданное параметром :ref:`replication_connect_quorum " -"` " -"(``box.cfg{replication_connect_quorum = }``), или же этот параметр " -"должен быть отключен (``box.cfg{replication_connect_quorum = 0}``)." +msgid "The :ref:`read_only ` option is set to ``false``." +msgstr "" + +msgid "The leader shouldn't be in the orphan state." +msgstr "" + +#, fuzzy msgid "" -"Nothing prevents from setting the ``read_only`` option to ``true``, but the " -"leader just won't be writable then. The option doesn't affect the election " -"process itself, so a read-only instance can still vote and become a leader." +"Nothing prevents you from setting the ``read_only`` option to ``true``, but " +"the leader just won't be writable then. The option doesn't affect the " +"election process itself, so a read-only instance can still vote and become a" +" leader." msgstr "" "Ничто не мешает задать для параметра ``read_only`` значение ``true``, но это" " сделает лидера недоступным для записи. На сам процесс выборов параметр " @@ -130,10 +151,11 @@ msgstr "" " term: 1\n" "..." +#, fuzzy msgid "" "The Raft-based election implementation logs all its actions with the " "``RAFT:`` prefix. The actions are new Raft message handling, node state " -"changing, voting, term bumping, and so on." +"changing, voting, and term bumping." msgstr "" "Журнальные записи о выборах на основе алгоритма Raft отмечаются префиксом " "``RAFT:``. В журнал вносятся такие события, как обработка новых сообщений " @@ -142,21 +164,23 @@ msgstr "" msgid "Important notes" msgstr "Важные замечания" +#, fuzzy msgid "" -"Leader election won't work correctly if the election quorum is set to less " -"or equal than `` / 2`` because in that case, a split vote can " -"lead to a state when two leaders are elected at once." +"Leader election doesn't work correctly if the election quorum is set to less" +" or equal than `` / 2`` because in that case, a split vote can" +" lead to a state when two leaders are elected at once." msgstr "" "Механизм выборов лидера не будет корректно работать, если кворум меньше " "``<размер кластера> / 2`` или равен этому значению, поскольку в этом случае " "два лидера могут быть избраны одновременно." +#, fuzzy msgid "" -"For example, let's assume there are five nodes. When quorum is set to ``2``," -" ``node1`` and ``node2`` can both vote for ``node1``. ``node3`` and " -"``node4`` can both vote for ``node5``. In this case, ``node1`` and ``node5``" -" both win the election. When the quorum is set to the cluster majority, that" -" is ``( / 2) + 1`` or bigger, the split vote is not possible." +"For example, suppose there are five nodes. When the quorum is set to ``2``, " +"``node1`` and ``node2`` can both vote for ``node1``. ``node3`` and ``node4``" +" can both vote for ``node5``. In this case, ``node1`` and ``node5`` both win" +" the election. When the quorum is set to the cluster majority, that is " +"``( / 2) + 1`` or greater, the split vote is impossible." msgstr "" "Допустим, есть пять узлов. Если значение кворума — ``2``, то ``node1`` и " "``node2`` оба могут проголосовать за ``node1``. При этом ``node3`` и " @@ -174,17 +198,18 @@ msgstr "" "новый узел, рекомендуется обновить значение кворума на всех существующих " "экземплярах." +#, fuzzy msgid "" -"Also, the automated leader election won't bring many benefits in terms of " +"Also, the automated leader election doesn't bring many benefits in terms of " "data safety when used *without* :ref:`synchronous replication `. " "If the replication is asynchronous and a new leader gets elected, the old " "leader is still active and considers itself the leader. In such case, " "nothing stops it from accepting requests from clients and making " -"transactions. Non-synchronous transactions will be successfully committed " -"because they won't be checked against the quorum of replicas. Synchronous " -"transactions will fail because they won't be able to collect the quorum -- " -"most of the replicas will reject these old leader's transactions since it is" -" not a leader anymore." +"transactions. Non-synchronous transactions are successfully committed " +"because they are not checked against the quorum of replicas. Synchronous " +"transactions fail because they are not able to collect the quorum -- most of" +" the replicas reject these old leader's transactions since it is not a " +"leader anymore." msgstr "" "Если использовать автоматические выборы лидера *без* :ref:`синхронной " "репликации `, может наступить рассогласование данных. При " @@ -196,3 +221,21 @@ msgstr "" "поскольку для их коммита не удастся собрать кворум: большинство реплик будут" " отвергать транзакции, передаваемые прежним лидером, поскольку уже был " "избран новый." + +#~ msgid "" +#~ "Besides, it is important to know that being a leader is not the only " +#~ "requirement for a node to be writable. A leader node should have its " +#~ ":ref:`read_only ` option set to ``false`` " +#~ "(``box.cfg{read_only = false}``), and its :ref:`connectivity quorum " +#~ "` should be satisfied " +#~ "(``box.cfg{replication_connect_quorum = }``) or disabled " +#~ "(``box.cfg{replication_connect_quorum = 0}``)." +#~ msgstr "" +#~ "Важно также понимать, что статус лидера — не единственное, что требуется " +#~ "узлу, чтобы быть доступным для записи. Параметр :ref:`read_only ` на узле-лидере должен иметь значение ``false`` " +#~ "(``box.cfg{read_only = false}``). Необходимо также, чтобы выполнялось " +#~ "условие, заданное параметром :ref:`replication_connect_quorum " +#~ "` " +#~ "(``box.cfg{replication_connect_quorum = }``), или же этот параметр " +#~ "должен быть отключен (``box.cfg{replication_connect_quorum = 0}``)." diff --git a/locale/ru/LC_MESSAGES/how-to/replication/repl_remove_instances.po b/locale/ru/LC_MESSAGES/how-to/replication/repl_remove_instances.po index 14ab63cfe1..530d741664 100644 --- a/locale/ru/LC_MESSAGES/how-to/replication/repl_remove_instances.po +++ b/locale/ru/LC_MESSAGES/how-to/replication/repl_remove_instances.po @@ -261,9 +261,10 @@ msgid "" "..." msgstr "" +#, fuzzy msgid "" -"2. Check if the ``id`` and ``uuid`` of *instance2* are correct and remove " -"them from the cluster:" +"Check if the ``id`` and ``uuid`` of *instance2* are correct and remove them " +"from the cluster:" msgstr "" "2.Проверьте корректность ``id`` и ``uuid`` *instance2* и удалите их из " "кластера:" diff --git a/locale/ru/LC_MESSAGES/how-to/replication/repl_sync.po b/locale/ru/LC_MESSAGES/how-to/replication/repl_sync.po index f9306a8632..bf9f0915c2 100644 --- a/locale/ru/LC_MESSAGES/how-to/replication/repl_sync.po +++ b/locale/ru/LC_MESSAGES/how-to/replication/repl_sync.po @@ -3,8 +3,8 @@ msgid "Configuring synchronous replication" msgstr "Настройка синхронной репликации" msgid "" -"Since version :doc:`2.5.1 `, :ref:`synchronous replication ` can be " -"enabled per-space by using the ``is_sync`` option:" +"Since version :doc:`2.5.1 `, :ref:`synchronous replication " +"` can be enabled per-space by using the ``is_sync`` option:" msgstr "" "Начиная с версии Tarantool :doc:`2.5.1 `, синхронную " "репликацию можно включать для отдельных спейсов, используя параметр " @@ -31,15 +31,23 @@ msgstr "" msgid "box.cfg{replication_synchro_quorum = }" msgstr "box.cfg{replication_synchro_quorum = <количество экземпляров>}" +#, fuzzy +msgid "box.cfg{replication_synchro_quorum = \"N / 2 + 1\"}" +msgstr "box.cfg{replication_synchro_quorum = <количество экземпляров>}" + +#, fuzzy msgid "" "This option tells how many replicas should confirm the receipt of a " -"synchronous transaction before it is committed. Since version :doc:`2.10.0 `, " -"this option does not account for anonymous replicas. As a usage example, consider " -"this:" +"synchronous transaction before it is committed. Since version :doc:`2.5.3 " +"`, the parameter supports dynamic evaluation of the quorum " +"number (see :ref:`reference for the replication_synchro_quorum parameter " +"` for details). Since version " +":doc:`2.10.0 `, this option does not account for anonymous " +"replicas. As a usage example, consider this:" msgstr "" "Параметр указывает, сколько реплик должно подтвердить получение синхронной " -"транзакции, прежде чем она пройдет коммит. Начиная с версии :doc:`2.10.0 `, " -"анонимные реплики не учитываются. Пример:" +"транзакции, прежде чем она пройдет коммит. Начиная с версии :doc:`2.10.0 " +"`, анонимные реплики не учитываются. Пример:" msgid "" "-- Instance 1\n" diff --git a/locale/ru/LC_MESSAGES/how-to/sql/improving_mysql.po b/locale/ru/LC_MESSAGES/how-to/sql/improving_mysql.po index 5c75ece6e1..d437d80f96 100644 --- a/locale/ru/LC_MESSAGES/how-to/sql/improving_mysql.po +++ b/locale/ru/LC_MESSAGES/how-to/sql/improving_mysql.po @@ -154,9 +154,9 @@ msgid "" "this is the step that will involve the most tweaking):" msgstr "" "Откроем MySQL-консоль и обработаем данные для использования с репликатором " -"Tarantool (добавляем идентификатор, меняем имя поля во избежание конфликта" -" и сокращаем количество полей; обратите внимание, что для реальных данных " -"этот шаг потребует большого количества настроек):" +"Tarantool (добавляем идентификатор, меняем имя поля во избежание конфликта и" +" сокращаем количество полей; обратите внимание, что для реальных данных этот" +" шаг потребует большого количества настроек):" msgid "" "mysql -u root -p\n" @@ -306,14 +306,15 @@ msgid "" "ln -s /instances.available/example.lua instances.enabled" msgstr "" +#, fuzzy msgid "" -"Next we can start up our Lua program with ``tarantoolctl``, a wrapper for " -"systemd:" +"Next we can start up our Lua program with ``tt``, the Tarantool command-line" +" utility:" msgstr "" "Далее мы можем запустить Lua-программу с помощью ``tarantoolctl`` " "(надстройки для systemd):" -msgid "tarantoolctl start example.lua" +msgid "tt start example" msgstr "" msgid "" @@ -323,7 +324,7 @@ msgstr "" "Сейчас перейдем на наш экземпляр Tarantool, где можно проверить, что " "необходимые спейсы были успешно созданы:" -msgid "tarantoolctl enter example.lua" +msgid "tt connect example" msgstr "" msgid "tarantool> box.space._space:select()" @@ -401,8 +402,8 @@ msgid "" "Now we can enter our Tarantool instance and do a select on the “mysqldata” " "space. We will see the replicated content from MySQL:" msgstr "" -"Сейчас мы можем перейти на экземпляр Tarantool и выполнить выборку из " -"спейса “mysqldata”. Увидим реплицируемые данные из MySQL:" +"Сейчас мы можем перейти на экземпляр Tarantool и выполнить выборку из спейса" +" “mysqldata”. Увидим реплицируемые данные из MySQL:" msgid "" "tarantool> box.space.mysqldata:select()\n" @@ -442,3 +443,9 @@ msgstr "" msgid "You should see the replicated data in Tarantool!" msgstr "Вы увидите реплицируемые данные в Tarantool!" + +#~ msgid "tarantoolctl start example.lua" +#~ msgstr "" + +#~ msgid "tarantoolctl enter example.lua" +#~ msgstr "" diff --git a/locale/ru/LC_MESSAGES/how-to/sql/index.po b/locale/ru/LC_MESSAGES/how-to/sql/index.po new file mode 100644 index 0000000000..48cee6a7bc --- /dev/null +++ b/locale/ru/LC_MESSAGES/how-to/sql/index.po @@ -0,0 +1,8 @@ + +msgid "SQL guides" +msgstr "" + +msgid "" +"This section contains hands-on SQL guides. You might also want to read the " +"in-depth :ref:`SQL reference `." +msgstr "" diff --git a/locale/ru/LC_MESSAGES/how-to/sql/sql_beginners_guide.po b/locale/ru/LC_MESSAGES/how-to/sql/sql_beginners_guide.po index 56a16ccaee..e07584812a 100644 --- a/locale/ru/LC_MESSAGES/how-to/sql/sql_beginners_guide.po +++ b/locale/ru/LC_MESSAGES/how-to/sql/sql_beginners_guide.po @@ -19,7 +19,8 @@ msgstr "" "NoSQL и SQL в Tarantool. Большинство тем, изложенных в этом руководстве, " "будут знакомы тем, кто уже использовал реляционные базы данных." -msgid "**Sample Simple Table**" +#, fuzzy +msgid "Sample table" msgstr "**Пример простой таблицы**" msgid "" @@ -52,10 +53,11 @@ msgstr "" " Стрк3 | Стрк3, Стлб1 | Стрк3, Стлб2 | Стрк3, Стлб3 |\n" " +-----------------+----------------+----------------+" +#, fuzzy msgid "" -"but the labels are misleading -- we usually don't identify rows and columns " -"by their ordinal positions, we prefer to pick out specific items by their " -"contents. In that spirit, this is a table:" +"But the labels are misleading -- one usually doesn't identify rows and " +"columns by their ordinal positions, one prefers to pick out specific items " +"by their contents. In that spirit, this is a table:" msgstr "" "Но эти обозначения вводят в заблуждение. Обычно мы не обозначаем строки и " "столбцы порядковыми позициями, мы скорее будем искать элементы таблицы по их" @@ -82,27 +84,29 @@ msgstr "" "| crypto | 4 | Криптография |\n" "+-----------------+------+---------------------+" +#, fuzzy msgid "" -"so we do not use longitude/latitude navigation by talking about \"Row#2 " -"Column #2\", we use the contents of the Name column and the name of the Size" -" column by talking about \"the size, where the name is 'clock'\". To be more" -" exact, this is what we say:" +"So one does not use longitude/latitude navigation by talking about \"Row#2 " +"Column #2\", one uses the contents of the Name column and the name of the " +"Size column by talking about \"the size, where the name is 'clock'\". To be " +"more exact, this is what one says:" msgstr "" "Так что мы не используем навигацию по позиции, обращаясь к элементу \"Строка" " #2, столбец #2\"; мы используем содержимое колонок \"name\" (имя) и " "\"size\" (размер), и ищем значение \"size\" для элемента, для которого " "значение \"name\" совпадает с 'clock'. Если быть точнее, вот что мы говорим:" -msgid "``SELECT size FROM modules WHERE name = 'clock';``" +#, fuzzy +msgid "SELECT size FROM modules WHERE name = 'clock';" msgstr "``SELECT size FROM modules WHERE name = 'clock';``" msgid "" -"If you're familiar with Tarantool's architecture -- and we hope that you " -"read about that before coming to this chapter -- then you know that there is" -" a NoSQL way to get the same thing:" +"If you're familiar with Tarantool's architecture -- and ideally you read " +"about that before coming to this chapter -- then you know that there is a " +"NoSQL way to get the same thing:" msgstr "" -msgid "``box.space.MODULES:select()[2][2]``" +msgid "box.space.MODULES:select()[2][2]" msgstr "" msgid "" @@ -110,10 +114,10 @@ msgid "" " get data via an SQL statement, then you can get the same data via a NoSQL " "request. But the reverse is not true, because not all NoSQL tuple sets are " "definable as SQL tables. These restrictions apply for SQL that do not apply " -"for NoSQL: |br| 1. Every column must have a name. |br| 2. Every column must " -"have a scalar type (Tarantool is relaxed about which particular scalar type " -"you can have, but there is no way to index and search arrays, tables within " -"tables, or what MessagePack calls \"maps\".)" +"for NoSQL: |br| 1. Every column must have a name. |br| 2. Every column " +"should have a scalar type (Tarantool is relaxed about which particular " +"scalar type you can have, but there is no way to index and search arrays, " +"tables within tables, or what MessagePack calls \"maps\".)" msgstr "" msgid "Tarantool/NoSQL's \"format\" clause causes the same restrictions." @@ -125,15 +129,16 @@ msgid "" "fields within a tuple set\"." msgstr "" -msgid "**Creating a table**" +#, fuzzy +msgid "Creating a table" msgstr "**Создание таблицы**" msgid "This is how to create the modules table:" msgstr "" msgid "" -"``CREATE TABLE modules (name STRING, size INTEGER, purpose STRING, PRIMARY " -"KEY (name));``" +"CREATE TABLE modules (name STRING, size INTEGER, purpose STRING, PRIMARY KEY" +" (name));" msgstr "" msgid "" @@ -155,8 +160,9 @@ msgid "" "contents should be characters, the length is indefinite, the equivalent " "NoSQL type is 'string''\". INTEGER means \"the contents should be numbers " "without decimal points, the equivalent NoSQL type is 'integer'\". Tarantool " -"supports other data types but our example table has data types from the two " -"main groups, namely, data types for numbers and data types for strings." +"supports other data types but this section's example table has data types " +"from the two main groups, namely, data types for numbers and data types for " +"strings." msgstr "" msgid "" @@ -164,7 +170,7 @@ msgid "" " column used to identify the row." msgstr "" -msgid "**Nulls**" +msgid "Nulls" msgstr "" msgid "" @@ -172,9 +178,10 @@ msgid "" " be NULL. Typical situations are: the value is unknown, or the value is not " "applicable. For example, you might make a module as a placeholder but you " "don't want to say its size or purpose. If such things are possible, the " -"column is \"nullable\". Our name column cannot contain nulls, and it could " -"be defined explicitly as \"name STRING NOT NULL\", but in this case that's " -"unnecessary -- a column defined as PRIMARY KEY is automatically NOT NULL." +"column is \"nullable\". The example table's name column cannot contain " +"nulls, and it could be defined explicitly as \"name STRING NOT NULL\", but " +"in this case that's unnecessary -- a column defined as PRIMARY KEY is " +"automatically NOT NULL." msgstr "" msgid "" @@ -185,15 +192,16 @@ msgid "" " which is defined with that data type." msgstr "" -msgid "**Creating an index**" +#, fuzzy +msgid "Creating an index" msgstr "**Создание индекса**" msgid "This is how to create indexes for the modules table:" msgstr "" msgid "" -"``CREATE INDEX size ON modules (size);`` |br| ``CREATE UNIQUE INDEX purpose " -"ON modules (purpose);``" +"CREATE INDEX size ON modules (size);\n" +"CREATE UNIQUE INDEX purpose ON modules (purpose);" msgstr "" msgid "" @@ -213,7 +221,8 @@ msgid "" "duplicate values in that column." msgstr "" -msgid "**Data change**" +#, fuzzy +msgid "Data change" msgstr "**Изменение данных**" msgid "" @@ -227,38 +236,38 @@ msgid "This is how to insert, update, and delete a row in the modules table:" msgstr "" msgid "" -"``INSERT INTO modules VALUES ('json', 14, 'format functions for JSON');`` " -"|br| ``UPDATE modules SET size = 15 WHERE name = 'json';`` |br| ``DELETE " -"FROM modules WHERE name = 'json';``" +"INSERT INTO modules VALUES ('json', 14, 'format functions for JSON');\n" +"UPDATE modules SET size = 15 WHERE name = 'json';\n" +"DELETE FROM modules WHERE name = 'json';" msgstr "" msgid "The corresponding non-SQL Tarantool requests would be:" msgstr "" msgid "" -"``box.space.MODULES:insert{'json', 14, 'format functions for JSON'}`` |br| " -"``box.space.MODULES:update('json', {{'=', 2, 15}})`` |br| " -"``box.space.MODULES:delete{'json'}`` |br|" +"box.space.MODULES:insert{'json', 14, 'format functions for JSON'}\n" +"box.space.MODULES:update('json', {{'=', 2, 15}})\n" +"box.space.MODULES:delete{'json'}" msgstr "" msgid "" -"This is how we would populate the table with the values that we showed " +"This is how one would populate the table with the values that was shown " "earlier:" msgstr "" msgid "" -"``INSERT INTO modules VALUES ('box', 1432, 'Database Management');`` |br| " -"``INSERT INTO modules VALUES ('clock', 188, 'Seconds');`` |br| ``INSERT INTO" -" modules VALUES ('crypto', 4, 'Cryptography');`` |br|" +"INSERT INTO modules VALUES ('box', 1432, 'Database Management');\n" +"INSERT INTO modules VALUES ('clock', 188, 'Seconds');\n" +"INSERT INTO modules VALUES ('crypto', 4, 'Cryptography');" msgstr "" -msgid "**Constraints**" +msgid "Constraints" msgstr "" msgid "" "Some data-change statements are illegal due to something in the table's " -"definition. This is called \"constraining what can be done\". We have " -"already seen some types of constraints ..." +"definition. This is called \"constraining what can be done\". Some types of " +"constraints have already been shown ..." msgstr "" msgid "" @@ -332,8 +341,8 @@ msgid "Now try to insert a new row into this submodules table:" msgstr "" msgid "" -"``INSERT INTO submodules VALUES`` |br| |nbsp| |nbsp| ``('space', 'Box', " -"10000, 'insert etc.');``" +"INSERT INTO submodules VALUES\n" +" ('space', 'Box', 10000, 'insert etc.');" msgstr "" msgid "" @@ -344,15 +353,16 @@ msgid "" msgstr "" msgid "" -"``INSERT INTO submodules`` |br| |nbsp| |nbsp| ``VALUES ('space', 'box', " -"10000, 'insert etc.');``" +"INSERT INTO submodules\n" +" VALUES ('space', 'box', 10000, 'insert etc.');" msgstr "" msgid "Now try to delete the corresponding row from the modules table:" msgstr "Теперь попробуем удалить соответствующую строку из таблицы modules:" -msgid "``DELETE FROM modules WHERE name = 'box';``" -msgstr "" +#, fuzzy +msgid "DELETE FROM modules WHERE name = 'box';" +msgstr "``SELECT size FROM modules WHERE name = 'clock';``" msgid "" "The delete will fail because the second column (module_name) in the " @@ -372,10 +382,10 @@ msgid "" "your own rules." msgstr "" -msgid "**Table Relationships**" +msgid "Table relationships" msgstr "" -msgid "Think about the two tables that we have discussed so far:" +msgid "Think about the two tables that have been discussed so far:" msgstr "" msgid "" @@ -404,19 +414,35 @@ msgstr "" msgid "" "Table relationships are important, but beware: do not trust anyone who tells" " you that databases made with SQL are relational \"because there are " -"relationships between tables\". That is wrong. We will see why when we talk " -"about what makes a database relational, later." +"relationships between tables\". That is wrong, as will be clear in the " +"discussion about what makes a database relational, later." +msgstr "" + +msgid "Selecting with WHERE" msgstr "" -msgid "**Selecting with WHERE**" +msgid "" +"By default, Tarantool prohibits ``SELECT`` queries that scan table rows " +"instead of using indexes to avoid unwanted heavy load. For the purposes of " +"this tutorial, allow SQL scan queries in Tarantool by running the command:" +msgstr "" + +msgid "SET SESSION \"sql_seq_scan\" = true;" +msgstr "" + +msgid "" +"Alternatively, you can allow a specific query to perform a table scan by " +"adding the ``SEQSCAN`` keyword before the table name. Learn more about using" +" ``SEQSCAN`` in SQL scan queries in the :ref:`SQL FROM clause description " +"`." msgstr "" msgid "We gave a simple example of a SELECT statement earlier:" msgstr "" msgid "" -"The clause \"WHERE name = 'clock'\" is legal in other statements -- we have " -"seen it in UPDATE and DELETE -- but here we will only give examples with " +"The clause \"WHERE name = 'clock'\" is legal in other statements -- it is in" +" examples with UPDATE and DELETE -- but here the only examples will be with " "SELECT." msgstr "" @@ -425,8 +451,9 @@ msgid "" "at all, it is optional. So this statement would return all rows:" msgstr "" -msgid "``SELECT size FROM modules;``" -msgstr "" +#, fuzzy +msgid "SELECT size FROM modules;" +msgstr "``SELECT size FROM modules WHERE name = 'clock';``" msgid "" "The second variation is that the comparison operator does not have to be " @@ -438,8 +465,8 @@ msgid "" msgstr "" msgid "" -"``SELECT size FROM modules WHERE name >= '';`` |br| ``SELECT size FROM " -"modules WHERE name LIKE '%';``" +"SELECT size FROM modules WHERE name >= '';\n" +"SELECT size FROM modules WHERE name LIKE '%';" msgstr "" msgid "" @@ -454,8 +481,9 @@ msgid "" "there are no NULLs in the name column:" msgstr "" -msgid "``SELECT size FROM modules WHERE name IS NOT NULL;``" -msgstr "" +#, fuzzy +msgid "SELECT size FROM modules WHERE name IS NOT NULL;" +msgstr "``SELECT size FROM modules WHERE name = 'clock';``" msgid "" "The fourth variation is that conditions can be combined with AND / OR, and " @@ -490,7 +518,7 @@ msgstr "" msgid "The first variation is that one can specify any column in any order:" msgstr "" -msgid "``SELECT name, purpose, size FROM modules;``" +msgid "SELECT name, purpose, size FROM modules;" msgstr "" msgid "" @@ -501,8 +529,9 @@ msgid "" "operator ||. For example this statement will return 8, 'XY':" msgstr "" -msgid "``SELECT size * 2, 'X' || 'Y' FROM modules WHERE size = 4;``" -msgstr "" +#, fuzzy +msgid "SELECT size * 2, 'X' || 'Y' FROM modules WHERE size = 4;" +msgstr "``SELECT size FROM modules WHERE name = 'clock';``" msgid "" "The third variation is that one can add a clause [AS name] after every " @@ -512,8 +541,8 @@ msgid "" msgstr "" msgid "" -"``SELECT size * 2 AS double_size, 'X' || 'Y' AS concatenated_literals FROM " -"modules`` |br| |nbsp| |nbsp| ``WHERE size = 4;``" +"SELECT size * 2 AS double_size, 'X' || 'Y' AS concatenated_literals FROM modules\n" +" WHERE size = 4;" msgstr "" msgid "but displayed as a table the result will look like" @@ -540,13 +569,13 @@ msgid "" "example" msgstr "" -msgid "``SELECT * FROM modules;``" +msgid "SELECT * FROM modules;" msgstr "" msgid "This is the same thing as" msgstr "" -msgid "``SELECT name, size, purpose FROM modules;``" +msgid "SELECT name, size, purpose FROM modules;" msgstr "" msgid "" @@ -554,19 +583,19 @@ msgid "" "reader who has not memorized what the column names are. Also it is unstable," " because there is a way to change a table's definition (the ALTER statement," " which is an advanced topic). Nevertheless, although it might be bad to use " -"it for production, it is handy to use it for introduction, so we will use " -"``\"*\"`` in several examples." +"it for production, it is handy to use it for introduction, so ``\"*\"`` will" +" appear in some following examples." msgstr "" -msgid "**Select with subqueries**" +msgid "Select with subqueries" msgstr "" msgid "" -"Remember that we have a modules table and we have a submodules table. " -"Suppose that we want to list the submodules that refer to modules for which " -"the purpose is X. That is, this involves a search of one table using a value" -" in another table. This can be done by enclosing \"(SELECT ...)\" within the" -" WHERE clause. For example:" +"Remember that there is a modules table and there is a submodules table. " +"Suppose that there is a desire to list the submodules that refer to modules " +"for which the purpose is X. That is, this involves a search of one table " +"using a value in another table. This can be done by enclosing \"(SELECT " +"...)\" within the WHERE clause. For example:" msgstr "" msgid "" @@ -624,18 +653,22 @@ msgid "" "joins instead of subqueries." msgstr "" -msgid "**Select with Cartesian join**" +msgid "Select with Cartesian join" msgstr "" msgid "" -"Until now we have only used \"FROM modules\" or \"FROM submodules\" in our " -"SELECT statements. What if we used more than one table in the FROM clause? " -"For example" +"Until now only \"FROM modules\" or \"FROM submodules\" was used in SELECT " +"statements. What if there was more than one table in the FROM clause? For " +"example" msgstr "" -msgid "" -"``SELECT * FROM modules, submodules;`` |br| or ``SELECT * FROM modules JOIN " -"submodules;``" +msgid "SELECT * FROM modules, submodules;" +msgstr "" + +msgid "or" +msgstr "" + +msgid "SELECT * FROM modules JOIN submodules;" msgstr "" msgid "" @@ -671,10 +704,10 @@ msgstr "" msgid "" "It is handy to look at the above result, called a \"Cartesian join\" result," -" to see what we really want. Probably for this case the row that actually " -"makes sense is the one where the modules.name = submodules.module_name, and " -"we should make that clear in both the select list and the WHERE clause, " -"thus:" +" to see what would really be desirable. Probably for this case the row that " +"actually makes sense is the one where the modules.name = " +"submodules.module_name, and it's better to make that clear in both the " +"select list and the WHERE clause, thus:" msgstr "" msgid "" @@ -722,34 +755,35 @@ msgstr "" msgid "" "It is good to start by looking at Cartesian joins because they show the " "concept. Many people, though, prefer to use different syntaxes for joins " -"because they look better or clearer. We will look at those alternatives now." +"because they look better or clearer. So now those alternatives will be " +"shown." msgstr "" -msgid "**Select with join with ON clause**" +msgid "Select with join with ON clause" msgstr "" msgid "" -"The ON clause would have the same comparisons as the WHERE clause that we " -"illustrated for the previous section, but by using different syntax we would" -" be making it clear \"this is for the sake of the join\". Readers can see at" -" a glance that it is, in concept at least, an initial step before the result" -" rows are filtered. For example this" +"The ON clause would have the same comparisons as the WHERE clause that was " +"illustrated for the previous section, but the use of different syntax would " +"be making it clear \"this is for the sake of the join\". Readers can see at " +"a glance that it is, in concept at least, an initial step before the result " +"rows are filtered. For example this" msgstr "" msgid "" -"``SELECT * FROM modules JOIN submodules`` |br| |nbsp| |nbsp| ``ON " -"(modules.name = submodules.module_name);``" +"SELECT * FROM modules JOIN submodules\n" +" ON (modules.name = submodules.module_name);" msgstr "" msgid "is the same as" msgstr "" msgid "" -"``SELECT * FROM modules, submodules`` |br| |nbsp| |nbsp| ``WHERE " -"modules.name = submodules.module_name;``" +"SELECT * FROM modules, submodules\n" +" WHERE modules.name = submodules.module_name;" msgstr "" -msgid "**Select with join with USING clause**" +msgid "Select with join with USING clause" msgstr "" msgid "" @@ -758,24 +792,23 @@ msgid "" "those columns with '=' comparisons. For example," msgstr "" -msgid "``SELECT * FROM modules JOIN submodules USING (name);``" +msgid "SELECT * FROM modules JOIN submodules USING (name);" msgstr "" msgid "has the same effect as" msgstr "" msgid "" -"``SELECT * FROM modules JOIN submodules WHERE modules.name = " -"submodules.name;``" +"SELECT * FROM modules JOIN submodules WHERE modules.name = submodules.name;" msgstr "" msgid "" -"If we had created our table with a plan in advance to use USING clauses, " -"that would save time. But we did not. So, although the above example " -"\"works\", the results will not be sensible." +"If the table had been created with a plan in advance to use USING clauses, " +"that would save time. But that did not happen. So, although the above " +"example \"works\", the results will not be sensible." msgstr "" -msgid "**Select with natural join**" +msgid "Select with natural join" msgstr "" msgid "" @@ -785,12 +818,12 @@ msgid "" msgstr "" msgid "" -"If we had created our table with a plan in advance to use natural joins, " -"that would be very handy. But we did not. So, although the following example" -" \"works\", the results won't be sensible." +"If the table had been created with a plan in advance to use natural joins, " +"that would be very handy. But that did not happen. So, although the " +"following example \"works\", the results won't be sensible." msgstr "" -msgid "``SELECT * FROM modules NATURAL JOIN submodules;``" +msgid "SELECT * FROM modules NATURAL JOIN submodules;" msgstr "" msgid "" @@ -799,21 +832,22 @@ msgid "" "columns: name, module_name, size, purpose." msgstr "" -msgid "**Select with left join**" +msgid "Select with left join" msgstr "" msgid "" -"Now what if we want to join modules to submodules, but we want to be sure " -"that we get all the modules? In other words, we want to get modules even if " -"the condition submodules.module_name = modules.name is not true, because the" -" module has no submodules." +"Now what if there is a desire to join modules to submodules, but it's " +"necessary to be sure that all the modules are found? In other words, suppose" +" the requirement is to get modules even if the condition " +"submodules.module_name = modules.name is not true, because the module has no" +" submodules." msgstr "" msgid "" -"When that is what we want, the type of join is an \"outer join\" (as opposed" -" to the type we have used so far which is an \"inner join\"). Specifically " -"we will use LEFT [OUTER] JOIN because our main table, modules, is on the " -"left. For example:" +"When that is the requirement, the type of join is an \"outer join\" (as " +"opposed to the type that has been used so far which is an \"inner join\"). " +"Specifically the format will be LEFT [OUTER] JOIN because the main table, " +"modules, is on the left. For example:" msgstr "" msgid "" @@ -849,13 +883,14 @@ msgid "" "crypto module -- which do not exist -- there are NULLs in every column." msgstr "" -msgid "**Select with functions**" +msgid "Select with functions" msgstr "" msgid "" "A function can take any expression, including an expression that contains " "another function, and return a scalar value. There are many such functions. " -"We will just describe one, SUBSTR, which returns a substring of a string." +"Here will be a description of only one, SUBSTR, which returns a substring of" +" a string." msgstr "" msgid "Format: :samp:`SUBSTR({input-string}, {start-with} [, {length}])`" @@ -873,12 +908,13 @@ msgstr "" msgid "Select with aggregation, GROUP BY, and HAVING" msgstr "" -msgid "Remember that our modules table looks like this:" +msgid "Remember that the modules table looks like this:" msgstr "" +#, fuzzy msgid "" -"Suppose that we do not want to know all the individual size values, we just " -"want to know about their aggregation, that is, take the attributes of the " +"Suppose that there is no need to know all the individual size values, all " +"that is important is their aggregation, that is, take the attributes of the " "collection. SQL allows aggregation functions including: AVG (average), SUM, " "MIN (minimum), MAX (maximum), and COUNT. For example" msgstr "" @@ -889,8 +925,7 @@ msgstr "" "(число элементов). Пример:" msgid "" -"``SELECT AVG(size), SUM(size), MIN(size), MAX(size), COUNT(size) FROM " -"modules;``" +"SELECT AVG(size), SUM(size), MIN(size), MAX(size), COUNT(size) FROM modules;" msgstr "" msgid "" @@ -907,11 +942,11 @@ msgstr "" "+-----------+-----------+-----------+-----------+-----------+" msgid "" -"Suppose that we want aggregations, but aggregations of rows that have some " -"common characteristic. Supposing further, we want to divide the rows into " -"two groups, the ones whose names begin with 'b' and the ones whose names " -"begin with 'c'. This can be done by adding a clause [GROUP BY expression]. " -"For example," +"Suppose that the requirement is aggregations, but aggregations of rows that " +"have some common characteristic. Supposing further, the rows should be " +"divided into two groups, the ones whose names begin with 'b' and the ones " +"whose names begin with 'c'. This can be done by adding a clause [GROUP BY " +"expression]. For example," msgstr "" msgid "" @@ -935,7 +970,7 @@ msgstr "" "| c | 96 | 192 | 4 | 188 | 2 |\n" "+------------+--------------+-----------+-----------+-----------+-------------+" -msgid "**Select with common table expression**" +msgid "Select with common table expression" msgstr "" msgid "" @@ -943,22 +978,24 @@ msgid "" "usually within a SELECT statement, using a WITH clause. For example:" msgstr "" -msgid "``WITH tmp_table AS (SELECT x1 FROM t1) SELECT * FROM tmp_table;``" +msgid "WITH tmp_table AS (SELECT x1 FROM t1) SELECT * FROM tmp_table;" msgstr "" -msgid "**Select with order, limit, and offset clauses**" +msgid "Select with order, limit, and offset clauses" msgstr "" msgid "" -"Every time we have searched in the modules table, the rows have come out in " -"alphabetical order by name: 'box', then 'clock', then 'crypto'. However, if " -"we want to be sure about the order, or if we want a different order, we will" -" have to be explicit and add a clause: ``ORDER BY column-name [ASC|DESC]``. " -"(ASC stands for ASCending, DESC stands for DESCending.) For example:" +"So far, tor every search in the modules table, the rows have come out in " +"alphabetical order by name: 'box', then 'clock', then 'crypto'. However, to " +"really be sure about the order, or to ask for a different order, it is " +"necessary to be explicit and add a clause: ``ORDER BY column-name " +"[ASC|DESC]``. (ASC stands for ASCending, DESC stands for DESCending.) For " +"example:" msgstr "" -msgid "``SELECT * FROM modules ORDER BY name DESC;``" -msgstr "" +#, fuzzy +msgid "SELECT * FROM modules ORDER BY name DESC;" +msgstr "``SELECT size FROM modules WHERE name = 'clock';``" msgid "" "The result will be the usual rows, in descending alphabetical order: " @@ -966,28 +1003,30 @@ msgid "" msgstr "" msgid "" -"After the ORDER BY clause we can add a clause LIMIT n, where n is the " -"maximum number of rows that we want. For example:" +"After the ORDER BY clause there can be a clause LIMIT n, where n is the " +"maximum number of rows to retrieve. For example:" msgstr "" -msgid "``SELECT * FROM modules ORDER BY name DESC LIMIT 2;``" -msgstr "" +#, fuzzy +msgid "SELECT * FROM modules ORDER BY name DESC LIMIT 2;" +msgstr "``SELECT size FROM modules WHERE name = 'clock';``" msgid "The result will be the first two rows, 'crypto' and 'clock'." msgstr "" msgid "" -"After the ORDER BY clause and the LIMIT clause we can add a clause OFFSET n," -" where n is the row to start with. The first offset is 0. For example:" +"After the ORDER BY clause and the LIMIT clause there can be a clause OFFSET " +"n, where n is the row to start with. The first offset is 0. For example:" msgstr "" -msgid "``SELECT * FROM modules ORDER BY name DESC LIMIT 2 OFFSET 2;``" -msgstr "" +#, fuzzy +msgid "SELECT * FROM modules ORDER BY name DESC LIMIT 2 OFFSET 2;" +msgstr "``SELECT size FROM modules WHERE name = 'clock';``" msgid "The result will be the third row, 'box'." msgstr "" -msgid "**Views**" +msgid "Views" msgstr "" msgid "" @@ -1004,7 +1043,8 @@ msgid "" "SELECT * FROM v;" msgstr "" -msgid "**Transactions**" +#, fuzzy +msgid "Transactions" msgstr "**Транзакции**" msgid "" @@ -1053,7 +1093,7 @@ msgid "" "TRANSACTION." msgstr "" -msgid "**Implementing Tarantool's SQL On Top of NoSQL**" +msgid "Implementing Tarantool's SQL On Top of NoSQL" msgstr "" msgid "" @@ -1117,7 +1157,8 @@ msgid "" "used with SQL if and only if they are TREE indexes." msgstr "" -msgid "**Relational Databases**" +#, fuzzy +msgid "Relational databases" msgstr "**Реляционные базы данных**" msgid "" @@ -1127,8 +1168,8 @@ msgid "" msgstr "" msgid "" -"Although we do not advertise Tarantool as \"relational\", we claim that " -"Tarantool complies with these rules, with the following caveats and " +"Although Tarantool is not advertised as \"relational\", Tarantool comes with" +" a claim that it complies with these rules, with the following caveats and " "exceptions ..." msgstr "" @@ -1152,7 +1193,7 @@ msgstr "" msgid "" "The rules require that data must be physically independent (from underlying " "storage changes) and logically independent (from application program " -"changes). So far we do not have enough experience to make this guarantee." +"changes). So far there is not enough experience to make this guarantee." msgstr "" msgid "" @@ -1162,8 +1203,362 @@ msgstr "" msgid "" "The rules state that it should be impossible to use a low-level language to " -"bypass integrity as defined in the relational-level language. In our case, " -"this is not true, for example one can execute a request with Tarantool's " -"NoSQL to violate a foreign-key constraint that was defined with Tarantool's " -"SQL." -msgstr "" +"bypass integrity as defined in the relational-level language. In Tarantool's" +" case, this is not true, for example one can execute a request with " +"Tarantool's NoSQL to violate a foreign-key constraint that was defined with " +"Tarantool's SQL." +msgstr "" + +msgid "" +"To learn more about SQL in Tarantool, check the :ref:`reference " +"`." +msgstr "" + +#~ msgid "" +#~ "If you're familiar with Tarantool's architecture -- and we hope that you " +#~ "read about that before coming to this chapter -- then you know that there is" +#~ " a NoSQL way to get the same thing:" +#~ msgstr "" + +#~ msgid "``box.space.MODULES:select()[2][2]``" +#~ msgstr "" + +#~ msgid "" +#~ "Well, you can do that. One of the advantages of Tarantool is that if you can" +#~ " get data via an SQL statement, then you can get the same data via a NoSQL " +#~ "request. But the reverse is not true, because not all NoSQL tuple sets are " +#~ "definable as SQL tables. These restrictions apply for SQL that do not apply " +#~ "for NoSQL: |br| 1. Every column must have a name. |br| 2. Every column must " +#~ "have a scalar type (Tarantool is relaxed about which particular scalar type " +#~ "you can have, but there is no way to index and search arrays, tables within " +#~ "tables, or what MessagePack calls \"maps\".)" +#~ msgstr "" + +#~ msgid "" +#~ "``CREATE TABLE modules (name STRING, size INTEGER, purpose STRING, PRIMARY " +#~ "KEY (name));``" +#~ msgstr "" + +#~ msgid "" +#~ "The words \"STRING\" and \"INTEGER\" are \"data types\". STRING means \"the " +#~ "contents should be characters, the length is indefinite, the equivalent " +#~ "NoSQL type is 'string''\". INTEGER means \"the contents should be numbers " +#~ "without decimal points, the equivalent NoSQL type is 'integer'\". Tarantool " +#~ "supports other data types but our example table has data types from the two " +#~ "main groups, namely, data types for numbers and data types for strings." +#~ msgstr "" + +#~ msgid "**Nulls**" +#~ msgstr "" + +#~ msgid "" +#~ "Frequently it is necessary, at least temporarily, that a column value should" +#~ " be NULL. Typical situations are: the value is unknown, or the value is not " +#~ "applicable. For example, you might make a module as a placeholder but you " +#~ "don't want to say its size or purpose. If such things are possible, the " +#~ "column is \"nullable\". Our name column cannot contain nulls, and it could " +#~ "be defined explicitly as \"name STRING NOT NULL\", but in this case that's " +#~ "unnecessary -- a column defined as PRIMARY KEY is automatically NOT NULL." +#~ msgstr "" + +#~ msgid "" +#~ "``CREATE INDEX size ON modules (size);`` |br| ``CREATE UNIQUE INDEX purpose " +#~ "ON modules (purpose);``" +#~ msgstr "" + +#~ msgid "" +#~ "``INSERT INTO modules VALUES ('json', 14, 'format functions for JSON');`` " +#~ "|br| ``UPDATE modules SET size = 15 WHERE name = 'json';`` |br| ``DELETE " +#~ "FROM modules WHERE name = 'json';``" +#~ msgstr "" + +#~ msgid "" +#~ "``box.space.MODULES:insert{'json', 14, 'format functions for JSON'}`` |br| " +#~ "``box.space.MODULES:update('json', {{'=', 2, 15}})`` |br| " +#~ "``box.space.MODULES:delete{'json'}`` |br|" +#~ msgstr "" + +#~ msgid "" +#~ "This is how we would populate the table with the values that we showed " +#~ "earlier:" +#~ msgstr "" + +#~ msgid "" +#~ "``INSERT INTO modules VALUES ('box', 1432, 'Database Management');`` |br| " +#~ "``INSERT INTO modules VALUES ('clock', 188, 'Seconds');`` |br| ``INSERT INTO" +#~ " modules VALUES ('crypto', 4, 'Cryptography');`` |br|" +#~ msgstr "" + +#~ msgid "**Constraints**" +#~ msgstr "" + +#~ msgid "" +#~ "Some data-change statements are illegal due to something in the table's " +#~ "definition. This is called \"constraining what can be done\". We have " +#~ "already seen some types of constraints ..." +#~ msgstr "" + +#~ msgid "" +#~ "``INSERT INTO submodules VALUES`` |br| |nbsp| |nbsp| ``('space', 'Box', " +#~ "10000, 'insert etc.');``" +#~ msgstr "" + +#~ msgid "" +#~ "``INSERT INTO submodules`` |br| |nbsp| |nbsp| ``VALUES ('space', 'box', " +#~ "10000, 'insert etc.');``" +#~ msgstr "" + +#~ msgid "``DELETE FROM modules WHERE name = 'box';``" +#~ msgstr "" + +#~ msgid "**Table Relationships**" +#~ msgstr "" + +#~ msgid "Think about the two tables that we have discussed so far:" +#~ msgstr "" + +#~ msgid "" +#~ "Table relationships are important, but beware: do not trust anyone who tells" +#~ " you that databases made with SQL are relational \"because there are " +#~ "relationships between tables\". That is wrong. We will see why when we talk " +#~ "about what makes a database relational, later." +#~ msgstr "" + +#~ msgid "**Selecting with WHERE**" +#~ msgstr "" + +#~ msgid "" +#~ "The clause \"WHERE name = 'clock'\" is legal in other statements -- we have " +#~ "seen it in UPDATE and DELETE -- but here we will only give examples with " +#~ "SELECT." +#~ msgstr "" + +#~ msgid "``SELECT size FROM modules;``" +#~ msgstr "" + +#~ msgid "" +#~ "``SELECT size FROM modules WHERE name >= '';`` |br| ``SELECT size FROM " +#~ "modules WHERE name LIKE '%';``" +#~ msgstr "" + +#~ msgid "``SELECT size FROM modules WHERE name IS NOT NULL;``" +#~ msgstr "" + +#~ msgid "``SELECT name, purpose, size FROM modules;``" +#~ msgstr "" + +#~ msgid "``SELECT size * 2, 'X' || 'Y' FROM modules WHERE size = 4;``" +#~ msgstr "" + +#~ msgid "" +#~ "``SELECT size * 2 AS double_size, 'X' || 'Y' AS concatenated_literals FROM " +#~ "modules`` |br| |nbsp| |nbsp| ``WHERE size = 4;``" +#~ msgstr "" + +#~ msgid "``SELECT * FROM modules;``" +#~ msgstr "" + +#~ msgid "``SELECT name, size, purpose FROM modules;``" +#~ msgstr "" + +#~ msgid "" +#~ "Selecting with ``\"*\"`` saves time for the writer, but it is unclear to a " +#~ "reader who has not memorized what the column names are. Also it is unstable," +#~ " because there is a way to change a table's definition (the ALTER statement," +#~ " which is an advanced topic). Nevertheless, although it might be bad to use " +#~ "it for production, it is handy to use it for introduction, so we will use " +#~ "``\"*\"`` in several examples." +#~ msgstr "" + +#~ msgid "**Select with subqueries**" +#~ msgstr "" + +#~ msgid "" +#~ "Remember that we have a modules table and we have a submodules table. " +#~ "Suppose that we want to list the submodules that refer to modules for which " +#~ "the purpose is X. That is, this involves a search of one table using a value" +#~ " in another table. This can be done by enclosing \"(SELECT ...)\" within the" +#~ " WHERE clause. For example:" +#~ msgstr "" + +#~ msgid "**Select with Cartesian join**" +#~ msgstr "" + +#~ msgid "" +#~ "Until now we have only used \"FROM modules\" or \"FROM submodules\" in our " +#~ "SELECT statements. What if we used more than one table in the FROM clause? " +#~ "For example" +#~ msgstr "" + +#~ msgid "" +#~ "``SELECT * FROM modules, submodules;`` |br| or ``SELECT * FROM modules JOIN " +#~ "submodules;``" +#~ msgstr "" + +#~ msgid "" +#~ "It is handy to look at the above result, called a \"Cartesian join\" result," +#~ " to see what we really want. Probably for this case the row that actually " +#~ "makes sense is the one where the modules.name = submodules.module_name, and " +#~ "we should make that clear in both the select list and the WHERE clause, " +#~ "thus:" +#~ msgstr "" + +#~ msgid "" +#~ "It is good to start by looking at Cartesian joins because they show the " +#~ "concept. Many people, though, prefer to use different syntaxes for joins " +#~ "because they look better or clearer. We will look at those alternatives now." +#~ msgstr "" + +#~ msgid "**Select with join with ON clause**" +#~ msgstr "" + +#~ msgid "" +#~ "The ON clause would have the same comparisons as the WHERE clause that we " +#~ "illustrated for the previous section, but by using different syntax we would" +#~ " be making it clear \"this is for the sake of the join\". Readers can see at" +#~ " a glance that it is, in concept at least, an initial step before the result" +#~ " rows are filtered. For example this" +#~ msgstr "" + +#~ msgid "" +#~ "``SELECT * FROM modules JOIN submodules`` |br| |nbsp| |nbsp| ``ON " +#~ "(modules.name = submodules.module_name);``" +#~ msgstr "" + +#~ msgid "" +#~ "``SELECT * FROM modules, submodules`` |br| |nbsp| |nbsp| ``WHERE " +#~ "modules.name = submodules.module_name;``" +#~ msgstr "" + +#~ msgid "**Select with join with USING clause**" +#~ msgstr "" + +#~ msgid "``SELECT * FROM modules JOIN submodules USING (name);``" +#~ msgstr "" + +#~ msgid "" +#~ "``SELECT * FROM modules JOIN submodules WHERE modules.name = " +#~ "submodules.name;``" +#~ msgstr "" + +#~ msgid "" +#~ "If we had created our table with a plan in advance to use USING clauses, " +#~ "that would save time. But we did not. So, although the above example " +#~ "\"works\", the results will not be sensible." +#~ msgstr "" + +#~ msgid "**Select with natural join**" +#~ msgstr "" + +#~ msgid "" +#~ "If we had created our table with a plan in advance to use natural joins, " +#~ "that would be very handy. But we did not. So, although the following example" +#~ " \"works\", the results won't be sensible." +#~ msgstr "" + +#~ msgid "``SELECT * FROM modules NATURAL JOIN submodules;``" +#~ msgstr "" + +#~ msgid "**Select with left join**" +#~ msgstr "" + +#~ msgid "" +#~ "Now what if we want to join modules to submodules, but we want to be sure " +#~ "that we get all the modules? In other words, we want to get modules even if " +#~ "the condition submodules.module_name = modules.name is not true, because the" +#~ " module has no submodules." +#~ msgstr "" + +#~ msgid "" +#~ "When that is what we want, the type of join is an \"outer join\" (as opposed" +#~ " to the type we have used so far which is an \"inner join\"). Specifically " +#~ "we will use LEFT [OUTER] JOIN because our main table, modules, is on the " +#~ "left. For example:" +#~ msgstr "" + +#~ msgid "**Select with functions**" +#~ msgstr "" + +#~ msgid "" +#~ "A function can take any expression, including an expression that contains " +#~ "another function, and return a scalar value. There are many such functions. " +#~ "We will just describe one, SUBSTR, which returns a substring of a string." +#~ msgstr "" + +#~ msgid "Remember that our modules table looks like this:" +#~ msgstr "" + +#~ msgid "" +#~ "``SELECT AVG(size), SUM(size), MIN(size), MAX(size), COUNT(size) FROM " +#~ "modules;``" +#~ msgstr "" + +#~ msgid "" +#~ "Suppose that we want aggregations, but aggregations of rows that have some " +#~ "common characteristic. Supposing further, we want to divide the rows into " +#~ "two groups, the ones whose names begin with 'b' and the ones whose names " +#~ "begin with 'c'. This can be done by adding a clause [GROUP BY expression]. " +#~ "For example," +#~ msgstr "" + +#~ msgid "**Select with common table expression**" +#~ msgstr "" + +#~ msgid "``WITH tmp_table AS (SELECT x1 FROM t1) SELECT * FROM tmp_table;``" +#~ msgstr "" + +#~ msgid "**Select with order, limit, and offset clauses**" +#~ msgstr "" + +#~ msgid "" +#~ "Every time we have searched in the modules table, the rows have come out in " +#~ "alphabetical order by name: 'box', then 'clock', then 'crypto'. However, if " +#~ "we want to be sure about the order, or if we want a different order, we will" +#~ " have to be explicit and add a clause: ``ORDER BY column-name [ASC|DESC]``. " +#~ "(ASC stands for ASCending, DESC stands for DESCending.) For example:" +#~ msgstr "" + +#~ msgid "``SELECT * FROM modules ORDER BY name DESC;``" +#~ msgstr "" + +#~ msgid "" +#~ "After the ORDER BY clause we can add a clause LIMIT n, where n is the " +#~ "maximum number of rows that we want. For example:" +#~ msgstr "" + +#~ msgid "``SELECT * FROM modules ORDER BY name DESC LIMIT 2;``" +#~ msgstr "" + +#~ msgid "" +#~ "After the ORDER BY clause and the LIMIT clause we can add a clause OFFSET n," +#~ " where n is the row to start with. The first offset is 0. For example:" +#~ msgstr "" + +#~ msgid "``SELECT * FROM modules ORDER BY name DESC LIMIT 2 OFFSET 2;``" +#~ msgstr "" + +#~ msgid "**Views**" +#~ msgstr "" + +#~ msgid "**Implementing Tarantool's SQL On Top of NoSQL**" +#~ msgstr "" + +#~ msgid "" +#~ "Although we do not advertise Tarantool as \"relational\", we claim that " +#~ "Tarantool complies with these rules, with the following caveats and " +#~ "exceptions ..." +#~ msgstr "" + +#~ msgid "" +#~ "The rules require that data must be physically independent (from underlying " +#~ "storage changes) and logically independent (from application program " +#~ "changes). So far we do not have enough experience to make this guarantee." +#~ msgstr "" + +#~ msgid "" +#~ "The rules state that it should be impossible to use a low-level language to " +#~ "bypass integrity as defined in the relational-level language. In our case, " +#~ "this is not true, for example one can execute a request with Tarantool's " +#~ "NoSQL to violate a foreign-key constraint that was defined with Tarantool's " +#~ "SQL." +#~ msgstr "" diff --git a/locale/ru/LC_MESSAGES/how-to/sql/sql_tutorial.po b/locale/ru/LC_MESSAGES/how-to/sql/sql_tutorial.po index 8147507ba6..207b417b5c 100644 --- a/locale/ru/LC_MESSAGES/how-to/sql/sql_tutorial.po +++ b/locale/ru/LC_MESSAGES/how-to/sql/sql_tutorial.po @@ -3,20 +3,8 @@ msgid "SQL tutorial" msgstr "" msgid "" -"This tutorial is a demonstration of the SQL feature introduced in Tarantool " -"2.x series. There are two ways to go through this tutorial:" -msgstr "" - -msgid "read what we say the results are and take our word for it, or" -msgstr "" - -msgid "" -"copy and paste each section and see everything work with Tarantool 2.4." -msgstr "" - -msgid "" -"You will encounter all the functionality that you'd encounter in an " -"\"SQL-101\" course." +"This tutorial is a demonstration of the support for SQL in Tarantool. It " +"includes the functionality that you'd encounter in an \"SQL-101\" course." msgstr "" msgid "Starting up with a first table and SELECTs" @@ -26,22 +14,18 @@ msgid "Initialize" msgstr "Инициализация" msgid "" -"Requests will be done using Tarantool as a :ref:`client `. Start Tarantool and, optionally, enter the " -"Tarantool configuration request, for example:" +"In this tutorial, the requests are done in the Tarantool interactive " +"console. Start Tarantool and initialize it with :ref:`default settings " +"` by calling ``box.cfg{}``:" msgstr "" msgid "tarantool> box.cfg{}" msgstr "tarantool> box.cfg{}" -msgid "" -"Before Tarantool 2.0 you needed to say ``box.cfg{...}`` prior to performing " -"any database operations. Now you can start working with the database " -"outright. Tarantool initiates the database module and applies :ref:`default " -"settings `." +msgid "Now you can start working with the database." msgstr "" -msgid "\\set" +msgid "Switch to the SQL language" msgstr "" msgid "" @@ -50,7 +34,8 @@ msgid "" msgstr "" msgid "" -"Here we say: default language is SQL and statements end with semicolons." +"Run the following commands to set the console input language to SQL and use " +"semicolon as a delimiter:" msgstr "" msgid "" @@ -61,7 +46,7 @@ msgstr "" msgid "CREATE, INSERT, UPDATE, SELECT" msgstr "" -msgid "Start with simple SQL statements just to be sure they're there." +msgid "To get started, enter simple SQL statements:" msgstr "" msgid "" @@ -71,20 +56,35 @@ msgid "" "SELECT * FROM table1 WHERE column1 = 1;" msgstr "" -msgid "The result of the ``SELECT`` statement will look like this:" +msgid "The result of the ``SELECT`` statement looks like this:" msgstr "" msgid "" "tarantool> SELECT * FROM table1 WHERE column1 = 1;\n" "---\n" -"- - [1, 'B']\n" +"- metadata:\n" +" - name: COLUMN1\n" +" type: integer\n" +" - name: COLUMN2\n" +" type: string\n" +" rows:\n" +" - [1, 'B']\n" "..." msgstr "" +#, fuzzy +msgid "The result includes:" +msgstr "Получим следующий результат:" + +msgid "Metadata: the names and data types of each column" +msgstr "" + +msgid "Result rows" +msgstr "" + msgid "" -"Reality check: actually the result will include include initial fields " -"called \"metadata\", the names and data types of each column. For all SELECT" -" examples we show only the result rows without showing the metadata." +"For conciseness, metadata is skipped in query results in this tutorial. Only" +" the result rows are shown." msgstr "" msgid "CREATE TABLE" @@ -108,40 +108,97 @@ msgid "" " PRIMARY KEY (column1, column2));" msgstr "" -msgid "The result will be: \"``row_count: 1``\" (no error)." +msgid "The result is: ``row_count: 1``." msgstr "" msgid "INSERT" msgstr "INSERT" -msgid "Try to put 5 rows in the table:" +msgid "Put four rows in the table:" msgstr "" -msgid "The INTEGER and DOUBLE columns get numbers." +msgid "The INTEGER and DOUBLE columns get numbers" msgstr "" msgid "" "The VARCHAR and SCALAR columns get strings (the SCALAR strings are expressed" -" as hexadecimals)." +" as hexadecimals)" msgstr "" msgid "" "INSERT INTO table2 VALUES (1, 'AB', X'4142', 5.5);\n" "INSERT INTO table2 VALUES (1, 'CD', X'2020', 1E4);\n" -"INSERT INTO table2 VALUES (1, 'AB', X'A5', -5.5);\n" "INSERT INTO table2 VALUES (2, 'AB', X'2020', 12.34567);\n" "INSERT INTO table2 VALUES (-1000, '', X'', 0.0);" msgstr "" -msgid "The result will be:" -msgstr "Получим следующий результат:" +msgid "Then try to put another row:" +msgstr "" + +msgid "INSERT INTO table2 VALUES (1, 'AB', X'A5', -5.5);" +msgstr "" + +msgid "" +"This ``INSERT`` fails because of a primary-key violation: the row with the " +"primary key ``1, 'AB'`` already exists." +msgstr "" + +msgid "The SEQSCAN keyword" +msgstr "" + +msgid "" +"In Tarantool, ``SELECT`` SQL queries that perform sequential scans (that is," +" go through all the table rows instead of using indexes) are prohibited by " +"default. For example, this query leads to the error ``Scanning is not " +"allowed for 'table2'``:" +msgstr "" + +msgid "SELECT * FROM table2;" +msgstr "" + +msgid "" +"To execute a scan query, put the ``SEQSCAN`` keyword before the table name:" +msgstr "" + +msgid "SELECT * FROM SEQSCAN table2;" +msgstr "" + +msgid "Try to execute these queries that use indexed ``column1`` in filters:" +msgstr "" + +msgid "" +"SELECT * FROM table2 WHERE column1 = 1;\n" +"SELECT * FROM table2 WHERE column1 + 1 = 2;" +msgstr "" + +msgid "The result is:" +msgstr "" + +msgid "The first query returns rows:" +msgstr "" + +msgid "" +"- [1, 'AB', 'AB', 10.5]\n" +"- [1, 'CD', ' ', 10005]" +msgstr "" + +msgid "" +"The second query fails with the error ``Scanning is not allowed for " +"'TABLE2'``. Although ``column1`` is indexed, the expression ``column1 + 1`` " +"is not calculated from the index, which makes this ``SELECT`` a scan query." +msgstr "" msgid "" -"The third ``INSERT`` will fail because of a primary-key violation (``1, " -"'AB'`` is a duplication)." +"You can allow SQL scan queries without ``SEQSCAN`` for the current session " +"by running the command:" msgstr "" -msgid "The other four ``INSERT`` statements will succeed." +msgid "SET SESSION \"sql_seq_scan\" = true;" +msgstr "" + +msgid "" +"Learn more about using ``SEQSCAN`` in the :ref:`SQL FROM clause description " +"`." msgstr "" msgid "SELECT with ORDER BY clause" @@ -149,13 +206,17 @@ msgstr "" msgid "" "Retrieve the 4 rows in the table, in descending order by ``column2``, then " -"(where the ``column2`` values are the same) in ascending order by column4." +"(where the ``column2`` values are the same) in ascending order by " +"``column4``." msgstr "" -msgid "\"*\" is short for \"all columns\"." +msgid "``*`` is short for \"all columns\"." msgstr "" -msgid "SELECT * FROM table2 ORDER BY column2 DESC, column4 ASC;" +msgid "SELECT * FROM SEQSCAN table2 ORDER BY column2 DESC, column4 ASC;" +msgstr "" + +msgid "Tarantool has its own" msgstr "" msgid "" @@ -183,15 +244,16 @@ msgid "" msgstr "" msgid "" -"SELECT column1, column2, column1 * column4 FROM table2 WHERE column2\n" +"SELECT column1, column2, column1 * column4 FROM SEQSCAN table2 WHERE column2\n" "LIKE 'A%';\n" -"SELECT column1, column2, column3, column4 FROM table2\n" +"SELECT column1, column2, column3, column4 FROM SEQSCAN table2\n" " WHERE (column1 < 2 AND column4 < 10)\n" " OR column3 = X'2020';" msgstr "" -msgid "The results will be:" -msgstr "" +#, fuzzy +msgid "The results are:" +msgstr "Получим следующий результат:" msgid "" "- - [1, 'AB', 5.5]\n" @@ -208,7 +270,7 @@ msgid "" " - [2, 'AB', ' ', 12.34567]" msgstr "" -msgid "SELECT with GROUP BY and aggregating" +msgid "SELECT with GROUP BY and aggregate functions" msgstr "" msgid "Retrieve with grouping." @@ -221,7 +283,7 @@ msgstr "" msgid "" "SELECT column2, SUM(column4), COUNT(column4), AVG(column4)\n" -"FROM table2\n" +"FROM SEQSCAN table2\n" "GROUP BY column2;" msgstr "" @@ -237,12 +299,12 @@ msgstr "" msgid "NULLs" msgstr "" -msgid "Insert more rows, containing NULL values." +msgid "Insert rows that contain ``NULL`` values." msgstr "" msgid "" -"NULL is not the same as Lua nil; it commonly is used in SQL for unknown or " -"not-applicable." +"``NULL`` is not the same as Lua ``nil``; it commonly is used in SQL for " +"unknown or not-applicable." msgstr "" msgid "" @@ -252,17 +314,17 @@ msgid "" msgstr "" msgid "" -"The first ``INSERT`` will fail because NULL is not permitted for a column " +"The first ``INSERT`` fails because ``NULL`` is not permitted for a column " "that was defined with a ``PRIMARY KEY`` clause." msgstr "" -msgid "The other ``INSERT`` statements will succeed." +msgid "The other ``INSERT`` statements succeed." msgstr "" msgid "Indexes" msgstr "Индексы" -msgid "Make a new index on column4." +msgid "Create a new index on ``column4``." msgstr "" msgid "" @@ -275,27 +337,27 @@ msgstr "" msgid "CREATE UNIQUE INDEX i ON table2 (column4);" msgstr "" -msgid "The result will be: \"``rowcount: 1``\" (no error)." +msgid "The result is: ``rowcount: 1``." msgstr "" msgid "Create a subset table" msgstr "" msgid "" -"Make a table which will have some of the columns of ``table2``, and some of " -"the rows of ``table2``." +"Create a table ``table3``, which contains a subset of the ``table2`` columns" +" and a subset of the ``table2`` rows." msgstr "" msgid "" "You can do this by combining ``INSERT`` with ``SELECT``. Then select " -"everything in the resultant subset table." +"everything from the result table." msgstr "" msgid "" "CREATE TABLE table3 (column1 INTEGER, column2 VARCHAR(100), PRIMARY KEY\n" "(column2));\n" -"INSERT INTO table3 SELECT column1, column2 FROM table2 WHERE column1 <> 2;\n" -"SELECT * FROM table3;" +"INSERT INTO table3 SELECT column1, column2 FROM SEQSCAN table2 WHERE column1 <> 2;\n" +"SELECT * FROM SEQSCAN table3;" msgstr "" msgid "" @@ -313,18 +375,18 @@ msgid "A subquery is a query within a query." msgstr "" msgid "" -"Here we find all the rows in ``table2`` whose ``(column1, column2)`` values " -"are not in ``table3``." +"Find all the rows in ``table2`` whose ``(column1, column2)`` values are not " +"present in ``table3``." msgstr "" msgid "" -"SELECT * FROM table2 WHERE (column1, column2) NOT IN (SELECT column1,\n" -"column2 FROM table3);" +"SELECT * FROM SEQSCAN table2 WHERE (column1, column2) NOT IN (SELECT column1,\n" +"column2 FROM SEQSCAN table3);" msgstr "" msgid "" -"The result is, unsurprisingly, the single row which we deliberately excluded" -" when we inserted the rows in the ``INSERT ... SELECT`` statement:" +"The result is the single row that was excluded when inserting the rows with " +"the ``INSERT ... SELECT`` statement:" msgstr "" msgid "- - [2, 'AB', ' ', 12.34567]" @@ -335,16 +397,16 @@ msgstr "" msgid "" "A join is a combination of two tables. There is more than one way to do them" -" in Tarantool: \"Cartesian joins\", \"left outer joins\", etc." +" in Tarantool: \"Cartesian joins\", \"left outer joins\", and so on." msgstr "" msgid "" -"Here we're just showing the most typical case, where column values from one " -"table match column values from another table." +"This example shows the most typical case, where column values from one table" +" match column values from another table." msgstr "" msgid "" -"SELECT * FROM table2, table3\n" +"SELECT * FROM SEQSCAN table2, table3\n" " WHERE table2.column1 = table3.column1 AND table2.column2 = table3.column2\n" " ORDER BY table2.column4;" msgstr "" @@ -357,15 +419,15 @@ msgid "" " - [1, 'CD', ' ', 10000, 1, 'CD']" msgstr "" -msgid "Constraints affecting updates" +msgid "Constraints and foreign keys" msgstr "" -msgid "CREATE TABLE, with a CHECK clause" +msgid "CREATE TABLE with a CHECK clause" msgstr "" msgid "" -"First we make a table which includes a \"constraint\" that there must not be" -" any rows containing 13 in ``column2``. Then we try to insert such a row." +"Create a table which includes a constraint that there must not be any rows " +"containing ``13`` in ``column2``. Then try to insert such a row." msgstr "" msgid "" @@ -375,21 +437,16 @@ msgid "" msgstr "" msgid "" -"Result: the insert fails, as it should, with the message \"``'Check " -"constraint failed ''ck_unnamed_TABLE4_1'': column2 <> 13'``\"." -msgstr "" - -msgid "CREATE TABLE, with a FOREIGN KEY clause" +"Result: the insert fails, as it should, with the message ``Check constraint " +"'ck_unnamed_TABLE4_1' failed for tuple``." msgstr "" -msgid "" -"First we make a table which includes a \"constraint\" that there must not be" -" any rows containing values that do not appear in ``table2``." +msgid "CREATE TABLE with a FOREIGN KEY clause" msgstr "" msgid "" -"When we made ``table2``, we specified that its \"primary key\" columns were " -"``(column1, column2)``." +"Create a table which includes a constraint that there must not be any rows " +"containing values that do not appear in ``table2``." msgstr "" msgid "" @@ -409,24 +466,24 @@ msgid "" msgstr "" msgid "" -"The second INSERT statement, correctly, fails with the message \"``Failed to" -" execute SQL statement: FOREIGN KEY constraint failed``\"." +"The second ``INSERT`` statement, correctly, fails with the message ``Foreign" +" key constraint ''fk_unnamed_TABLE5_1'' failed: foreign tuple was not " +"found``." msgstr "" msgid "UPDATE" msgstr "UPDATE" msgid "" -"Due to earlier INSERT statements, these values are in ``table2 column4``: " -"``{0, NULL, NULL, 5.5, 10000, 12.34567}``. We will add 5 to every one of " -"them except the one with 0. (Adding 5 to NULL will result in NULL, as SQL " -"arithmetic requires.) Then we'll use ``SELECT`` to see what happened to " -"``column4``." +"Due to earlier ``INSERT`` statements, these values are in ``column4`` of " +"``table2``: ``{0, NULL, NULL, 5.5, 10000, 12.34567}``. Add ``5`` to each of " +"these values except ``0``. Adding ``5`` to ``NULL`` results in NULL, as SQL " +"arithmetic requires. Use ``SELECT`` to see what happened to ``column4``." msgstr "" msgid "" "UPDATE table2 SET column4 = column4 + 5 WHERE column4 <> 0;\n" -"SELECT column4 FROM table2 ORDER BY column4;" +"SELECT column4 FROM SEQSCAN table2 ORDER BY column4;" msgstr "" msgid "The result is: ``{NULL, NULL, 0, 10.5, 17.34567, 10005}``." @@ -435,8 +492,7 @@ msgstr "" msgid "DELETE" msgstr "DELETE" -msgid "" -"Due to earlier ``INSERT`` statements, there are now 6 rows in ``table2``:" +msgid "Due to earlier ``INSERT`` statements, there are 6 rows in ``table2``:" msgstr "" msgid "" @@ -448,36 +504,35 @@ msgid "" " - [2, 'AB', ' ', 17.34567]" msgstr "" -msgid "We will try to delete the last and first of these rows." +msgid "Try to delete the last and first of these rows:" msgstr "" msgid "" "DELETE FROM table2 WHERE column1 = 2;\n" "DELETE FROM table2 WHERE column1 = -1000;\n" -"SELECT COUNT(column1) FROM table2;" +"SELECT COUNT(column1) FROM SEQSCAN table2;" msgstr "" msgid "" -"The first ``DELETE`` statement causes an error message because (remember?) " -"there's a foreign-key constraint." +"The first ``DELETE`` statement causes an error because there's a foreign-key" +" constraint." msgstr "" msgid "The second ``DELETE`` statement succeeds." msgstr "" -msgid "" -"The ``SELECT`` statement shows that there are now only 5 rows remaining." +msgid "The ``SELECT`` statement shows that there are 5 rows remaining." msgstr "" -msgid "ALTER TABLE, with a FOREIGN KEY clause" +msgid "ALTER TABLE with a FOREIGN KEY clause" msgstr "" msgid "" -"Now we want to make another \"constraint\", that there must not be any rows " -"in ``table1`` containing values that do not appear in ``table5``. We " -"couldn't do this when we created ``table1`` because at that time ``table5`` " -"did not exist. But we can add constraints to existing tables with the ALTER " -"TABLE statement." +"Create another constraint that there must not be any rows in ``table1`` " +"containing values that do not appear in ``table5``. This was impossible " +"during the ``table1`` creation because at that time ``table5`` did not " +"exist. You can add constraints to existing tables with the ``ALTER TABLE`` " +"statement." msgstr "" msgid "" @@ -490,9 +545,9 @@ msgstr "" msgid "" "Result: the ``ALTER TABLE`` statement fails the first time because there is " -"a row in ``table1``, and ADD CONSTRAINT requires that the table be empty. " -"But after we delete that row, the ``ALTER TABLE`` statement succeeds the " -"second time. Thus we have set up a chain of references, from ``table1`` to " +"a row in ``table1``, and ``ADD CONSTRAINT`` requires that the table be " +"empty. After the row is deleted, the ``ALTER TABLE`` statement completes " +"successfully. Now there is a chain of references, from ``table1`` to " "``table5`` and from ``table5`` to ``table2``." msgstr "" @@ -506,10 +561,9 @@ msgid "" msgstr "" msgid "" -"There are many variants, the one we'll illustrate here is: just after doing " -"an update in ``table3``, do an update in ``table2``. We will specify this as" -" ``FOR EACH ROW``, so (since there are 5 rows in ``table3``) the trigger " -"will be activated 5 times." +"Set up the following trigger: when a update to ``table3`` is done, do an " +"update to ``table2``. Specify this as ``FOR EACH ROW``, so that the trigger " +"activates 5 times (since there are 5 rows in ``table3``)." msgstr "" msgid "" @@ -538,20 +592,19 @@ msgid "String operations" msgstr "" msgid "" -"You can manipulate string data (usually defined with CHAR or VARCHAR data " -"types) in many ways." -msgstr "" - -msgid "We'll illustrate here:" +"You can manipulate string data (usually defined with ``CHAR`` or ``VARCHAR``" +" data types) in many ways. For example:" msgstr "" -msgid "the ``||`` operator for concatenation and" +msgid "concatenate strings with the ``||`` operator" msgstr "" -msgid "the ``SUBSTR`` function for extraction." +msgid "extract substrings with the ``SUBSTR`` function" msgstr "" -msgid "SELECT column2, column2 || column2, SUBSTR(column2, 2, 1) FROM table2;" +msgid "" +"SELECT column2, column2 || column2, SUBSTR(column2, 2, 1) FROM SEQSCAN " +"table2;" msgstr "" msgid "" @@ -566,17 +619,18 @@ msgid "Number operations" msgstr "" msgid "" -"You can also manipulate number data (usually defined with INTEGER or DOUBLE " -"data types) in many ways." +"You can also manipulate number data (usually defined with ``INTEGER`` or " +"``DOUBLE`` data types) in many ways. For example:" msgstr "" -msgid "the ``<<`` operator for shift left and" +msgid "shift left with the ``<<`` operator" msgstr "" -msgid "the ``%`` operator for modulo." +msgid "get modulo with the ``%`` operator" msgstr "" -msgid "SELECT column1, column1 << 1, column1 << 2, column1 % 2 FROM table2;" +msgid "" +"SELECT column1, column1 << 1, column1 << 2, column1 % 2 FROM SEQSCAN table2;" msgstr "" msgid "" @@ -593,20 +647,18 @@ msgstr "" msgid "Tarantool can handle:" msgstr "" -msgid "integers anywhere in the 4-byte integer range," +msgid "integers anywhere in the 4-byte integer range" msgstr "" -msgid "approximate-numerics anywhere in the 8-byte IEEE floating point range," +msgid "approximate-numerics anywhere in the 8-byte IEEE floating point range" msgstr "" -msgid "" -"any Unicode characters, with UTF-8 encoding and a choice of collations." +msgid "any Unicode characters, with UTF-8 encoding and a choice of collations" msgstr "" msgid "" -"Here we will insert some such values in a new table, and see what happens " -"when we select them, with arithmetic on a number column and ordering by a " -"string column." +"Insert such values in a new table and see what happens when you select them " +"with arithmetic on a number column and ordering by a string column." msgstr "" msgid "" @@ -616,10 +668,7 @@ msgid "" "INSERT INTO t6 VALUES (+1234567890, 'GD', 1e30);\n" "INSERT INTO t6 VALUES (10, 'FADEW?', 0.000001);\n" "INSERT INTO t6 VALUES (5, 'ABCDEFG', NULL);\n" -"SELECT column1 + 1, column2, column4 * 2 FROM t6 ORDER BY column2;" -msgstr "" - -msgid "The result is:" +"SELECT column1 + 1, column2, column4 * 2 FROM SEQSCAN t6 ORDER BY column2;" msgstr "" msgid "" @@ -633,17 +682,16 @@ msgid "Views" msgstr "" msgid "" -"A view, or \"viewed table\", is virtual, that is, its rows aren't physically" -" in the database, their values are calculated from other tables." +"A view (or *viewed table*), is virtual, meaning that its rows aren't " +"physically in the database, their values are calculated from other tables." msgstr "" -msgid "" -"Here we'll create a view ``v3`` based on ``table3``, then we select from it." +msgid "Create a view ``v3`` based on ``table3`` and select from it:" msgstr "" msgid "" -"CREATE VIEW v3 AS SELECT SUBSTR(column2,1,2), column4 FROM t6 WHERE\n" -"column4 >= 0;\n" +"CREATE VIEW v3 AS SELECT SUBSTR(column2,1,2), column4 FROM SEQSCAN t6\n" +"WHERE column4 >= 0;\n" "SELECT * FROM v3;" msgstr "" @@ -657,21 +705,21 @@ msgid "Common table expressions" msgstr "" msgid "" -"By putting ``WITH`` + ``SELECT`` in front of a ``SELECT``, we can make a " -"sort of temporary view that lasts for the duration of the statement." +"By putting ``WITH`` + ``SELECT`` in front of a ``SELECT``, you can make a " +"temporary view that lasts for the duration of the statement." msgstr "" -msgid "Here we'll select from the sort of temporary view." +msgid "Create such a view and select from it:" msgstr "" msgid "" "WITH cte AS (\n" -" SELECT SUBSTR(column2,1,2), column4 FROM t6 WHERE column4\n" -" >= 0)\n" +" SELECT SUBSTR(column2,1,2), column4 FROM SEQSCAN t6\n" +" WHERE column4 >= 0)\n" "SELECT * FROM cte;" msgstr "" -msgid "Result: the same as the result we got with ``CREATE VIEW`` earlier:" +msgid "The result is the same as the ``CREATE VIEW`` result:" msgstr "" msgid "VALUES" @@ -683,15 +731,12 @@ msgid "" "standard statement ``VALUES (expression [, expression ...]);``." msgstr "" -msgid "Here we'll use both styles." -msgstr "" - msgid "" "SELECT 55 * 55, 'The rain in Spain';\n" "VALUES (55 * 55, 'The rain in Spain');" msgstr "" -msgid "The result of either statement will be:" +msgid "The result of both these statements is:" msgstr "" msgid "- - [3025, 'The rain in Spain']" @@ -700,71 +745,58 @@ msgstr "" msgid "Metadata" msgstr "" -msgid "What database objects have we created? We can find out about:" -msgstr "" - -msgid "tables with ``SELECT * FROM \"_space\";``" -msgstr "" - -msgid "indexes with ``SELECT * FROM \"_index\";``" +msgid "" +"To find out the internal structure of the Tarantool database with SQL, " +"select from the Tarantool system tables ``_space``, ``_index``, and " +"``_trigger``:" msgstr "" msgid "" -"triggers with ``SELECT * FROM \"_trigger\";`` (These names will be familiar " -"to old Tarantool users because we're actually selecting from NoSQL \"system " -"spaces\".)" +"SELECT * FROM SEQSCAN \"_space\";\n" +"SELECT * FROM SEQSCAN \"_index\";\n" +"SELECT * FROM SEQSCAN \"_trigger\";" msgstr "" -msgid "Here we will select from ``_space``." +msgid "Actually, these statements select from NoSQL \"system spaces\"." msgstr "" -msgid "SELECT \"id\", \"name\", \"owner\", \"engine\" FROM \"_space\" WHERE \"name\"='TABLE3';" +msgid "Select from ``_space`` by a table name:" msgstr "" -msgid "" -"The result is (we know we will get a row because we created ``table3`` " -"earlier):" +msgid "SELECT \"id\", \"name\", \"owner\", \"engine\" FROM \"_space\" WHERE \"name\"='TABLE3';" msgstr "" msgid "- - [517, 'TABLE3', 1, 'memtx']" msgstr "" -msgid "Calling from a host language to make a big table" +msgid "Using SQL from Lua" msgstr "" -msgid "box.execute()" +msgid "" +"You can execute SQL statements directly from the Lua code without switching " +"to the SQL input." msgstr "" msgid "" -"Now we will change the settings so that the console accepts statements " -"written in Lua instead of statements written in SQL. (More ways to switch " -"languages will exist in Tarantool clients in our next version.)" +"Change the settings so that the console accepts statements written in Lua " +"instead of statements written in SQL:" msgstr "" -msgid "" -"This doesn't mean we have left the SQL world though, because we can invoke " -"SQL statements using a Lua function: ``box.execute(string)``." +msgid "tarantool> \\set language lua" msgstr "" -msgid "" -"Here we'll switch languages, and ask to select again what's in ``table3``. " -"These statements must be entered separately." +msgid "box.execute()" msgstr "" msgid "" -"tarantool> \\set language lua\n" -"tarantool> box.execute([[SELECT * FROM table3;]]);" +"You can invoke SQL statements using the Lua function " +"``box.execute(string)``." msgstr "" -msgid "Showing both the statements and the results:" +msgid "tarantool> box.execute([[SELECT * FROM SEQSCAN table3;]]);" msgstr "" msgid "" -"tarantool> \\set language lua\n" -"---\n" -"...\n" -"tarantool> box.execute([[SELECT * FROM table3;]]);\n" -"---\n" "- - [-1000, '']\n" " - [0, '!!!']\n" " - [0, '!!@']\n" @@ -776,15 +808,13 @@ msgstr "" msgid "Create a million-row table" msgstr "" -msgid "" -"We've illustrated a lot of SQL, but does it scale? To answer that, let's " -"make a bigger table." +msgid "To see how the SQL in Tarantool scales, create a bigger table." msgstr "" msgid "" -"For this we are going to use Lua. We will not explain the Lua, because " -"that's in the Lua section of the Tarantool manual. Just copy-and-paste these" -" instructions and wait for about a minute." +"The following Lua code generates one million rows with random data and " +"inserts them into a table. Copy this code into the Tarantool console and " +"wait a bit:" msgstr "" msgid "" @@ -812,7 +842,7 @@ msgid "" "start_time = os.clock();\n" "main_function();\n" "end_time = os.clock();\n" -"'insert done in ' .. end_time - start_time .. ' seconds';" +"print('insert done in ' .. end_time - start_time .. ' seconds');" msgstr "" msgid "" @@ -823,46 +853,36 @@ msgstr "" msgid "Select from a million-row table" msgstr "" -msgid "" -"Now that we have something a bit larger to play with, let's see how long it " -"takes to SELECT." +msgid "Check how ``SELECT`` works on the million-row table:" msgstr "" -msgid "" -"The first query we'll do will automatically go via an index, because ``s1`` " -"is the primary key." +msgid "the first query goes by an index because ``s1`` is the primary key" msgstr "" -msgid "" -"The second query we'll do will not go via an index, because for ``s2`` we " -"didn't say ``CREATE INDEX xxxx ON tester (s2);``." +msgid "the second query does not go by an index" msgstr "" msgid "" "box.execute([[SELECT * FROM tester WHERE s1 = 73446;]]);\n" -"box.execute([[SELECT * FROM tester WHERE s2 LIKE 'QFML%';]]);" +"box.execute([[SELECT * FROM SEQSCAN tester WHERE s2 LIKE 'QFML%';]]);" msgstr "" -msgid "the first statement will finish instantaneously," +msgid "the first statement completes instantaneously" msgstr "" -msgid "" -"the second statement will be noticeably slower but still a fraction of a " -"second." +msgid "the second statement completed noticeably slower" msgstr "" msgid "Cleanup and exit" msgstr "" msgid "" -"We're done. We've shown that Tarantool 2.x has a very reasonable subset of " -"SQL, and it works." +"To cleanup all the objects created in this tutorial, switch to the SQL input" +" language again. Then run the ``DROP`` statements for all created tables, " +"views, and triggers." msgstr "" -msgid "" -"The rest of these commands will simply destroy all the database objects that" -" were created so that you can do the demonstration again. These statements " -"must be entered separately." +msgid "These statements must be entered separately." msgstr "" msgid "" @@ -879,3 +899,523 @@ msgid "" "tarantool> \\set language lua\n" "tarantool> os.exit();" msgstr "" + +#~ msgid "" +#~ "This tutorial is a demonstration of the SQL feature introduced in Tarantool " +#~ "2.x series. There are two ways to go through this tutorial:" +#~ msgstr "" + +#~ msgid "read what we say the results are and take our word for it, or" +#~ msgstr "" + +#~ msgid "" +#~ "copy and paste each section and see everything work with Tarantool 2.4." +#~ msgstr "" + +#~ msgid "" +#~ "You will encounter all the functionality that you'd encounter in an " +#~ "\"SQL-101\" course." +#~ msgstr "" + +#~ msgid "" +#~ "Requests will be done using Tarantool as a :ref:`client `. Start Tarantool and, optionally, enter the " +#~ "Tarantool configuration request, for example:" +#~ msgstr "" + +#~ msgid "" +#~ "Before Tarantool 2.0 you needed to say ``box.cfg{...}`` prior to performing " +#~ "any database operations. Now you can start working with the database " +#~ "outright. Tarantool initiates the database module and applies :ref:`default " +#~ "settings `." +#~ msgstr "" + +#~ msgid "\\set" +#~ msgstr "" + +#~ msgid "" +#~ "Here we say: default language is SQL and statements end with semicolons." +#~ msgstr "" + +#~ msgid "Start with simple SQL statements just to be sure they're there." +#~ msgstr "" + +#~ msgid "The result of the ``SELECT`` statement will look like this:" +#~ msgstr "" + +#~ msgid "" +#~ "tarantool> SELECT * FROM table1 WHERE column1 = 1;\n" +#~ "---\n" +#~ "- - [1, 'B']\n" +#~ "..." +#~ msgstr "" + +#~ msgid "" +#~ "Reality check: actually the result will include include initial fields " +#~ "called \"metadata\", the names and data types of each column. For all SELECT" +#~ " examples we show only the result rows without showing the metadata." +#~ msgstr "" + +#~ msgid "The result will be: \"``row_count: 1``\" (no error)." +#~ msgstr "" + +#~ msgid "Try to put 5 rows in the table:" +#~ msgstr "" + +#~ msgid "The INTEGER and DOUBLE columns get numbers." +#~ msgstr "" + +#~ msgid "" +#~ "The VARCHAR and SCALAR columns get strings (the SCALAR strings are expressed" +#~ " as hexadecimals)." +#~ msgstr "" + +#~ msgid "" +#~ "INSERT INTO table2 VALUES (1, 'AB', X'4142', 5.5);\n" +#~ "INSERT INTO table2 VALUES (1, 'CD', X'2020', 1E4);\n" +#~ "INSERT INTO table2 VALUES (1, 'AB', X'A5', -5.5);\n" +#~ "INSERT INTO table2 VALUES (2, 'AB', X'2020', 12.34567);\n" +#~ "INSERT INTO table2 VALUES (-1000, '', X'', 0.0);" +#~ msgstr "" + +#~ msgid "" +#~ "The third ``INSERT`` will fail because of a primary-key violation (``1, " +#~ "'AB'`` is a duplication)." +#~ msgstr "" + +#~ msgid "The other four ``INSERT`` statements will succeed." +#~ msgstr "" + +#~ msgid "" +#~ "Retrieve the 4 rows in the table, in descending order by ``column2``, then " +#~ "(where the ``column2`` values are the same) in ascending order by column4." +#~ msgstr "" + +#~ msgid "\"*\" is short for \"all columns\"." +#~ msgstr "" + +#~ msgid "SELECT * FROM table2 ORDER BY column2 DESC, column4 ASC;" +#~ msgstr "" + +#~ msgid "" +#~ "SELECT column1, column2, column1 * column4 FROM table2 WHERE column2\n" +#~ "LIKE 'A%';\n" +#~ "SELECT column1, column2, column3, column4 FROM table2\n" +#~ " WHERE (column1 < 2 AND column4 < 10)\n" +#~ " OR column3 = X'2020';" +#~ msgstr "" + +#~ msgid "The results will be:" +#~ msgstr "" + +#~ msgid "SELECT with GROUP BY and aggregating" +#~ msgstr "" + +#~ msgid "" +#~ "SELECT column2, SUM(column4), COUNT(column4), AVG(column4)\n" +#~ "FROM table2\n" +#~ "GROUP BY column2;" +#~ msgstr "" + +#~ msgid "Insert more rows, containing NULL values." +#~ msgstr "" + +#~ msgid "" +#~ "NULL is not the same as Lua nil; it commonly is used in SQL for unknown or " +#~ "not-applicable." +#~ msgstr "" + +#~ msgid "" +#~ "The first ``INSERT`` will fail because NULL is not permitted for a column " +#~ "that was defined with a ``PRIMARY KEY`` clause." +#~ msgstr "" + +#~ msgid "The other ``INSERT`` statements will succeed." +#~ msgstr "" + +#~ msgid "Make a new index on column4." +#~ msgstr "" + +#~ msgid "The result will be: \"``rowcount: 1``\" (no error)." +#~ msgstr "" + +#~ msgid "" +#~ "Make a table which will have some of the columns of ``table2``, and some of " +#~ "the rows of ``table2``." +#~ msgstr "" + +#~ msgid "" +#~ "You can do this by combining ``INSERT`` with ``SELECT``. Then select " +#~ "everything in the resultant subset table." +#~ msgstr "" + +#~ msgid "" +#~ "CREATE TABLE table3 (column1 INTEGER, column2 VARCHAR(100), PRIMARY KEY\n" +#~ "(column2));\n" +#~ "INSERT INTO table3 SELECT column1, column2 FROM table2 WHERE column1 <> 2;\n" +#~ "SELECT * FROM table3;" +#~ msgstr "" + +#~ msgid "" +#~ "Here we find all the rows in ``table2`` whose ``(column1, column2)`` values " +#~ "are not in ``table3``." +#~ msgstr "" + +#~ msgid "" +#~ "SELECT * FROM table2 WHERE (column1, column2) NOT IN (SELECT column1,\n" +#~ "column2 FROM table3);" +#~ msgstr "" + +#~ msgid "" +#~ "The result is, unsurprisingly, the single row which we deliberately excluded" +#~ " when we inserted the rows in the ``INSERT ... SELECT`` statement:" +#~ msgstr "" + +#~ msgid "" +#~ "A join is a combination of two tables. There is more than one way to do them" +#~ " in Tarantool: \"Cartesian joins\", \"left outer joins\", etc." +#~ msgstr "" + +#~ msgid "" +#~ "Here we're just showing the most typical case, where column values from one " +#~ "table match column values from another table." +#~ msgstr "" + +#~ msgid "" +#~ "SELECT * FROM table2, table3\n" +#~ " WHERE table2.column1 = table3.column1 AND table2.column2 = table3.column2\n" +#~ " ORDER BY table2.column4;" +#~ msgstr "" + +#~ msgid "Constraints affecting updates" +#~ msgstr "" + +#~ msgid "CREATE TABLE, with a CHECK clause" +#~ msgstr "" + +#~ msgid "" +#~ "First we make a table which includes a \"constraint\" that there must not be" +#~ " any rows containing 13 in ``column2``. Then we try to insert such a row." +#~ msgstr "" + +#~ msgid "" +#~ "Result: the insert fails, as it should, with the message \"``'Check " +#~ "constraint failed ''ck_unnamed_TABLE4_1'': column2 <> 13'``\"." +#~ msgstr "" + +#~ msgid "CREATE TABLE, with a FOREIGN KEY clause" +#~ msgstr "" + +#~ msgid "" +#~ "First we make a table which includes a \"constraint\" that there must not be" +#~ " any rows containing values that do not appear in ``table2``." +#~ msgstr "" + +#~ msgid "" +#~ "When we made ``table2``, we specified that its \"primary key\" columns were " +#~ "``(column1, column2)``." +#~ msgstr "" + +#~ msgid "" +#~ "The second INSERT statement, correctly, fails with the message \"``Failed to" +#~ " execute SQL statement: FOREIGN KEY constraint failed``\"." +#~ msgstr "" + +#~ msgid "" +#~ "Due to earlier INSERT statements, these values are in ``table2 column4``: " +#~ "``{0, NULL, NULL, 5.5, 10000, 12.34567}``. We will add 5 to every one of " +#~ "them except the one with 0. (Adding 5 to NULL will result in NULL, as SQL " +#~ "arithmetic requires.) Then we'll use ``SELECT`` to see what happened to " +#~ "``column4``." +#~ msgstr "" + +#~ msgid "" +#~ "UPDATE table2 SET column4 = column4 + 5 WHERE column4 <> 0;\n" +#~ "SELECT column4 FROM table2 ORDER BY column4;" +#~ msgstr "" + +#~ msgid "" +#~ "Due to earlier ``INSERT`` statements, there are now 6 rows in ``table2``:" +#~ msgstr "" + +#~ msgid "We will try to delete the last and first of these rows." +#~ msgstr "" + +#~ msgid "" +#~ "DELETE FROM table2 WHERE column1 = 2;\n" +#~ "DELETE FROM table2 WHERE column1 = -1000;\n" +#~ "SELECT COUNT(column1) FROM table2;" +#~ msgstr "" + +#~ msgid "" +#~ "The first ``DELETE`` statement causes an error message because (remember?) " +#~ "there's a foreign-key constraint." +#~ msgstr "" + +#~ msgid "" +#~ "The ``SELECT`` statement shows that there are now only 5 rows remaining." +#~ msgstr "" + +#~ msgid "ALTER TABLE, with a FOREIGN KEY clause" +#~ msgstr "" + +#~ msgid "" +#~ "Now we want to make another \"constraint\", that there must not be any rows " +#~ "in ``table1`` containing values that do not appear in ``table5``. We " +#~ "couldn't do this when we created ``table1`` because at that time ``table5`` " +#~ "did not exist. But we can add constraints to existing tables with the ALTER " +#~ "TABLE statement." +#~ msgstr "" + +#~ msgid "" +#~ "Result: the ``ALTER TABLE`` statement fails the first time because there is " +#~ "a row in ``table1``, and ADD CONSTRAINT requires that the table be empty. " +#~ "But after we delete that row, the ``ALTER TABLE`` statement succeeds the " +#~ "second time. Thus we have set up a chain of references, from ``table1`` to " +#~ "``table5`` and from ``table5`` to ``table2``." +#~ msgstr "" + +#~ msgid "" +#~ "There are many variants, the one we'll illustrate here is: just after doing " +#~ "an update in ``table3``, do an update in ``table2``. We will specify this as" +#~ " ``FOR EACH ROW``, so (since there are 5 rows in ``table3``) the trigger " +#~ "will be activated 5 times." +#~ msgstr "" + +#~ msgid "" +#~ "You can manipulate string data (usually defined with CHAR or VARCHAR data " +#~ "types) in many ways." +#~ msgstr "" + +#~ msgid "We'll illustrate here:" +#~ msgstr "" + +#~ msgid "the ``||`` operator for concatenation and" +#~ msgstr "" + +#~ msgid "the ``SUBSTR`` function for extraction." +#~ msgstr "" + +#~ msgid "SELECT column2, column2 || column2, SUBSTR(column2, 2, 1) FROM table2;" +#~ msgstr "" + +#~ msgid "" +#~ "You can also manipulate number data (usually defined with INTEGER or DOUBLE " +#~ "data types) in many ways." +#~ msgstr "" + +#~ msgid "the ``<<`` operator for shift left and" +#~ msgstr "" + +#~ msgid "the ``%`` operator for modulo." +#~ msgstr "" + +#~ msgid "SELECT column1, column1 << 1, column1 << 2, column1 % 2 FROM table2;" +#~ msgstr "" + +#~ msgid "integers anywhere in the 4-byte integer range," +#~ msgstr "" + +#~ msgid "approximate-numerics anywhere in the 8-byte IEEE floating point range," +#~ msgstr "" + +#~ msgid "" +#~ "any Unicode characters, with UTF-8 encoding and a choice of collations." +#~ msgstr "" + +#~ msgid "" +#~ "Here we will insert some such values in a new table, and see what happens " +#~ "when we select them, with arithmetic on a number column and ordering by a " +#~ "string column." +#~ msgstr "" + +#~ msgid "" +#~ "CREATE TABLE t6 (column1 INTEGER, column2 VARCHAR(10), column4 DOUBLE,\n" +#~ "PRIMARY KEY (column1));\n" +#~ "INSERT INTO t6 VALUES (-1234567890, 'АБВГД', 123456.123456);\n" +#~ "INSERT INTO t6 VALUES (+1234567890, 'GD', 1e30);\n" +#~ "INSERT INTO t6 VALUES (10, 'FADEW?', 0.000001);\n" +#~ "INSERT INTO t6 VALUES (5, 'ABCDEFG', NULL);\n" +#~ "SELECT column1 + 1, column2, column4 * 2 FROM t6 ORDER BY column2;" +#~ msgstr "" + +#~ msgid "" +#~ "A view, or \"viewed table\", is virtual, that is, its rows aren't physically" +#~ " in the database, their values are calculated from other tables." +#~ msgstr "" + +#~ msgid "" +#~ "Here we'll create a view ``v3`` based on ``table3``, then we select from it." +#~ msgstr "" + +#~ msgid "" +#~ "CREATE VIEW v3 AS SELECT SUBSTR(column2,1,2), column4 FROM t6 WHERE\n" +#~ "column4 >= 0;\n" +#~ "SELECT * FROM v3;" +#~ msgstr "" + +#~ msgid "" +#~ "By putting ``WITH`` + ``SELECT`` in front of a ``SELECT``, we can make a " +#~ "sort of temporary view that lasts for the duration of the statement." +#~ msgstr "" + +#~ msgid "Here we'll select from the sort of temporary view." +#~ msgstr "" + +#~ msgid "" +#~ "WITH cte AS (\n" +#~ " SELECT SUBSTR(column2,1,2), column4 FROM t6 WHERE column4\n" +#~ " >= 0)\n" +#~ "SELECT * FROM cte;" +#~ msgstr "" + +#~ msgid "Result: the same as the result we got with ``CREATE VIEW`` earlier:" +#~ msgstr "" + +#~ msgid "Here we'll use both styles." +#~ msgstr "" + +#~ msgid "The result of either statement will be:" +#~ msgstr "" + +#~ msgid "What database objects have we created? We can find out about:" +#~ msgstr "" + +#~ msgid "tables with ``SELECT * FROM \"_space\";``" +#~ msgstr "" + +#~ msgid "indexes with ``SELECT * FROM \"_index\";``" +#~ msgstr "" + +#~ msgid "" +#~ "triggers with ``SELECT * FROM \"_trigger\";`` (These names will be familiar " +#~ "to old Tarantool users because we're actually selecting from NoSQL \"system " +#~ "spaces\".)" +#~ msgstr "" + +#~ msgid "Here we will select from ``_space``." +#~ msgstr "" + +#~ msgid "" +#~ "The result is (we know we will get a row because we created ``table3`` " +#~ "earlier):" +#~ msgstr "" + +#~ msgid "Calling from a host language to make a big table" +#~ msgstr "" + +#~ msgid "" +#~ "Now we will change the settings so that the console accepts statements " +#~ "written in Lua instead of statements written in SQL. (More ways to switch " +#~ "languages will exist in Tarantool clients in our next version.)" +#~ msgstr "" + +#~ msgid "" +#~ "This doesn't mean we have left the SQL world though, because we can invoke " +#~ "SQL statements using a Lua function: ``box.execute(string)``." +#~ msgstr "" + +#~ msgid "" +#~ "Here we'll switch languages, and ask to select again what's in ``table3``. " +#~ "These statements must be entered separately." +#~ msgstr "" + +#~ msgid "" +#~ "tarantool> \\set language lua\n" +#~ "tarantool> box.execute([[SELECT * FROM table3;]]);" +#~ msgstr "" + +#~ msgid "Showing both the statements and the results:" +#~ msgstr "" + +#~ msgid "" +#~ "tarantool> \\set language lua\n" +#~ "---\n" +#~ "...\n" +#~ "tarantool> box.execute([[SELECT * FROM table3;]]);\n" +#~ "---\n" +#~ "- - [-1000, '']\n" +#~ " - [0, '!!!']\n" +#~ " - [0, '!!@']\n" +#~ " - [1, 'AB']\n" +#~ " - [1, 'CD']\n" +#~ "..." +#~ msgstr "" + +#~ msgid "" +#~ "We've illustrated a lot of SQL, but does it scale? To answer that, let's " +#~ "make a bigger table." +#~ msgstr "" + +#~ msgid "" +#~ "For this we are going to use Lua. We will not explain the Lua, because " +#~ "that's in the Lua section of the Tarantool manual. Just copy-and-paste these" +#~ " instructions and wait for about a minute." +#~ msgstr "" + +#~ msgid "" +#~ "box.execute(\"CREATE TABLE tester (s1 INT PRIMARY KEY, s2 VARCHAR(10))\");\n" +#~ "\n" +#~ "function string_function()\n" +#~ " local random_number\n" +#~ " local random_string\n" +#~ " random_string = \"\"\n" +#~ " for x = 1,10,1 do\n" +#~ " random_number = math.random(65, 90)\n" +#~ " random_string = random_string .. string.char(random_number)\n" +#~ " end\n" +#~ " return random_string\n" +#~ "end;\n" +#~ "\n" +#~ "function main_function()\n" +#~ " local string_value, t, sql_statement\n" +#~ " for i = 1,1000000,1 do\n" +#~ " string_value = string_function()\n" +#~ " sql_statement = \"INSERT INTO tester VALUES (\" .. i .. \",'\" .. string_value .. \"')\"\n" +#~ " box.execute(sql_statement)\n" +#~ " end\n" +#~ "end;\n" +#~ "start_time = os.clock();\n" +#~ "main_function();\n" +#~ "end_time = os.clock();\n" +#~ "'insert done in ' .. end_time - start_time .. ' seconds';" +#~ msgstr "" + +#~ msgid "" +#~ "Now that we have something a bit larger to play with, let's see how long it " +#~ "takes to SELECT." +#~ msgstr "" + +#~ msgid "" +#~ "The first query we'll do will automatically go via an index, because ``s1`` " +#~ "is the primary key." +#~ msgstr "" + +#~ msgid "" +#~ "The second query we'll do will not go via an index, because for ``s2`` we " +#~ "didn't say ``CREATE INDEX xxxx ON tester (s2);``." +#~ msgstr "" + +#~ msgid "" +#~ "box.execute([[SELECT * FROM tester WHERE s1 = 73446;]]);\n" +#~ "box.execute([[SELECT * FROM tester WHERE s2 LIKE 'QFML%';]]);" +#~ msgstr "" + +#~ msgid "the first statement will finish instantaneously," +#~ msgstr "" + +#~ msgid "" +#~ "the second statement will be noticeably slower but still a fraction of a " +#~ "second." +#~ msgstr "" + +#~ msgid "" +#~ "We're done. We've shown that Tarantool 2.x has a very reasonable subset of " +#~ "SQL, and it works." +#~ msgstr "" + +#~ msgid "" +#~ "The rest of these commands will simply destroy all the database objects that" +#~ " were created so that you can do the demonstration again. These statements " +#~ "must be entered separately." +#~ msgstr "" diff --git a/locale/ru/LC_MESSAGES/how-to/using_docker.po b/locale/ru/LC_MESSAGES/how-to/using_docker.po index 45a59ceffa..a5b6969b6c 100644 --- a/locale/ru/LC_MESSAGES/how-to/using_docker.po +++ b/locale/ru/LC_MESSAGES/how-to/using_docker.po @@ -199,10 +199,14 @@ msgstr "" " > parts = {'id'}\n" " > })" -msgid "This is a primary index based on the ``id`` field of each tuple. " -"``TREE`` is the most universal index type. To learn more, check the documentation on Tarantool :ref:`index types `." -msgstr "Это первичный индекс по полю ``id`` в каждом кортеже. " -"Тип индекса ``TREE`` --- самый универсальный. Подробная информация изложена в документации о :ref:`типах индексов в Tarantool `." +msgid "" +"This is a primary index based on the ``id`` field of each tuple. ``TREE`` is" +" the most universal index type. To learn more, check the documentation on " +"Tarantool :ref:`index types `." +msgstr "" +"Это первичный индекс по полю ``id`` в каждом кортеже. Тип индекса ``TREE`` " +"--- самый универсальный. Подробная информация изложена в документации о " +":ref:`типах индексов в Tarantool `." msgid "" "Insert three :ref:`tuples ` (our name for records) into the" diff --git a/locale/ru/LC_MESSAGES/how-to/vshard_quick.po b/locale/ru/LC_MESSAGES/how-to/vshard_quick.po index 6267338ff5..8692ddd392 100644 --- a/locale/ru/LC_MESSAGES/how-to/vshard_quick.po +++ b/locale/ru/LC_MESSAGES/how-to/vshard_quick.po @@ -48,8 +48,8 @@ msgstr "" "**второго** набора реплик" msgid "" -"All instances are managed using the ``tarantoolctl`` administrative utility " -"which comes with Tarantool." +"All instances are managed using the :ref:`tt ` administrative " +"utility." msgstr "" msgid "" @@ -61,92 +61,8 @@ msgstr "" msgid "" "$ cd example/\n" -"$ make\n" -"tarantoolctl stop storage_1_a # stop the first storage instance\n" -"Stopping instance storage_1_a...\n" -"tarantoolctl stop storage_1_b\n" -"<...>\n" -"rm -rf data/\n" -"tarantoolctl start storage_1_a # start the first storage instance\n" -"Starting instance storage_1_a...\n" -"Starting configuration of replica 8a274925-a26d-47fc-9e1b-af88ce939412\n" -"I am master\n" -"Taking on replicaset master role...\n" -"Run console at unix/:./data/storage_1_a.control\n" -"started\n" -"mkdir ./data/storage_1_a\n" -"<...>\n" -"tarantoolctl start router_1 # start the router\n" -"Starting instance router_1...\n" -"Starting router configuration\n" -"Calling box.cfg()...\n" -"<...>\n" -"Run console at unix/:./data/router_1.control\n" -"started\n" -"mkdir ./data/router_1\n" -"Waiting cluster to start\n" -"echo \"vshard.router.bootstrap()\" | tarantoolctl enter router_1\n" -"connected to unix/:./data/router_1.control\n" -"unix/:./data/router_1.control> vshard.router.bootstrap()\n" -"---\n" -"- true\n" -"...\n" -"unix/:./data/router_1.control>\n" -"tarantoolctl enter router_1 # enter the admin console\n" -"connected to unix/:./data/router_1.control\n" -"unix/:./data/router_1.control>" +"$ make" msgstr "" -"$ cd example/\n" -"$ make\n" -"tarantoolctl stop storage_1_a # stop the first storage instance\n" -"Stopping instance storage_1_a...\n" -"tarantoolctl stop storage_1_b\n" -"<...>\n" -"rm -rf data/\n" -"tarantoolctl start storage_1_a # start the first storage instance\n" -"Starting instance storage_1_a...\n" -"Starting configuration of replica 8a274925-a26d-47fc-9e1b-af88ce939412\n" -"I am master\n" -"Taking on replicaset master role...\n" -"Run console at unix/:./data/storage_1_a.control\n" -"started\n" -"mkdir ./data/storage_1_a\n" -"<...>\n" -"tarantoolctl start router_1 # start the router\n" -"Starting instance router_1...\n" -"Starting router configuration\n" -"Calling box.cfg()...\n" -"<...>\n" -"Run console at unix/:./data/router_1.control\n" -"started\n" -"mkdir ./data/router_1\n" -"Waiting cluster to start\n" -"echo \"vshard.router.bootstrap()\" | tarantoolctl enter router_1\n" -"connected to unix/:./data/router_1.control\n" -"unix/:./data/router_1.control> vshard.router.bootstrap()\n" -"---\n" -"- true\n" -"...\n" -"unix/:./data/router_1.control>\n" -"tarantoolctl enter router_1 # enter the admin console\n" -"connected to unix/:./data/router_1.control\n" -"unix/:./data/router_1.control>" - -msgid "Some ``tarantoolctl`` commands:" -msgstr "Некоторые команды ``tarantoolctl``:" - -msgid "``tarantoolctl start router_1`` – start the router instance" -msgstr "``tarantoolctl start router_1`` – запуск экземпляра роутера" - -msgid "``tarantoolctl enter router_1`` – enter the admin console" -msgstr "``tarantoolctl enter router_1`` – вход в административную консоль" - -msgid "" -"The full list of ``tarantoolctl`` commands for managing Tarantool instances " -"is available in the :ref:`tarantoolctl reference `." -msgstr "" -"Полный список команд ``tarantoolctl`` для управления экземплярами " -"Tarantool можно найти в :ref:`справочнике по tarantoolctl `." msgid "Essential ``make`` commands you need to know:" msgstr "Необходимо знать следующие команды ``make``:" @@ -273,10 +189,10 @@ msgstr "" "Конфигурация простого сегментированного кластера может выглядеть следующим " "образом:" +#, fuzzy msgid "" "local cfg = {\n" " memtx_memory = 100 * 1024 * 1024,\n" -" replication_connect_quorum = 0,\n" " bucket_count = 10000,\n" " rebalancer_disbalance_threshold = 10,\n" " rebalancer_max_receiving = 100,\n" @@ -416,3 +332,97 @@ msgstr "" "Образец конфигурации можно посмотреть в файлах ``router.lua`` и " "``storage.lua`` в директории ``example/`` `репозитория vshard " "`__." + +#~ msgid "" +#~ "All instances are managed using the ``tarantoolctl`` administrative utility " +#~ "which comes with Tarantool." +#~ msgstr "" + +#~ msgid "" +#~ "$ cd example/\n" +#~ "$ make\n" +#~ "tarantoolctl stop storage_1_a # stop the first storage instance\n" +#~ "Stopping instance storage_1_a...\n" +#~ "tarantoolctl stop storage_1_b\n" +#~ "<...>\n" +#~ "rm -rf data/\n" +#~ "tarantoolctl start storage_1_a # start the first storage instance\n" +#~ "Starting instance storage_1_a...\n" +#~ "Starting configuration of replica 8a274925-a26d-47fc-9e1b-af88ce939412\n" +#~ "I am master\n" +#~ "Taking on replicaset master role...\n" +#~ "Run console at unix/:./data/storage_1_a.control\n" +#~ "started\n" +#~ "mkdir ./data/storage_1_a\n" +#~ "<...>\n" +#~ "tarantoolctl start router_1 # start the router\n" +#~ "Starting instance router_1...\n" +#~ "Starting router configuration\n" +#~ "Calling box.cfg()...\n" +#~ "<...>\n" +#~ "Run console at unix/:./data/router_1.control\n" +#~ "started\n" +#~ "mkdir ./data/router_1\n" +#~ "Waiting cluster to start\n" +#~ "echo \"vshard.router.bootstrap()\" | tarantoolctl enter router_1\n" +#~ "connected to unix/:./data/router_1.control\n" +#~ "unix/:./data/router_1.control> vshard.router.bootstrap()\n" +#~ "---\n" +#~ "- true\n" +#~ "...\n" +#~ "unix/:./data/router_1.control>\n" +#~ "tarantoolctl enter router_1 # enter the admin console\n" +#~ "connected to unix/:./data/router_1.control\n" +#~ "unix/:./data/router_1.control>" +#~ msgstr "" +#~ "$ cd example/\n" +#~ "$ make\n" +#~ "tarantoolctl stop storage_1_a # stop the first storage instance\n" +#~ "Stopping instance storage_1_a...\n" +#~ "tarantoolctl stop storage_1_b\n" +#~ "<...>\n" +#~ "rm -rf data/\n" +#~ "tarantoolctl start storage_1_a # start the first storage instance\n" +#~ "Starting instance storage_1_a...\n" +#~ "Starting configuration of replica 8a274925-a26d-47fc-9e1b-af88ce939412\n" +#~ "I am master\n" +#~ "Taking on replicaset master role...\n" +#~ "Run console at unix/:./data/storage_1_a.control\n" +#~ "started\n" +#~ "mkdir ./data/storage_1_a\n" +#~ "<...>\n" +#~ "tarantoolctl start router_1 # start the router\n" +#~ "Starting instance router_1...\n" +#~ "Starting router configuration\n" +#~ "Calling box.cfg()...\n" +#~ "<...>\n" +#~ "Run console at unix/:./data/router_1.control\n" +#~ "started\n" +#~ "mkdir ./data/router_1\n" +#~ "Waiting cluster to start\n" +#~ "echo \"vshard.router.bootstrap()\" | tarantoolctl enter router_1\n" +#~ "connected to unix/:./data/router_1.control\n" +#~ "unix/:./data/router_1.control> vshard.router.bootstrap()\n" +#~ "---\n" +#~ "- true\n" +#~ "...\n" +#~ "unix/:./data/router_1.control>\n" +#~ "tarantoolctl enter router_1 # enter the admin console\n" +#~ "connected to unix/:./data/router_1.control\n" +#~ "unix/:./data/router_1.control>" + +#~ msgid "Some ``tarantoolctl`` commands:" +#~ msgstr "Некоторые команды ``tarantoolctl``:" + +#~ msgid "``tarantoolctl start router_1`` – start the router instance" +#~ msgstr "``tarantoolctl start router_1`` – запуск экземпляра роутера" + +#~ msgid "``tarantoolctl enter router_1`` – enter the admin console" +#~ msgstr "``tarantoolctl enter router_1`` – вход в административную консоль" + +#~ msgid "" +#~ "The full list of ``tarantoolctl`` commands for managing Tarantool instances " +#~ "is available in the :ref:`tarantoolctl reference `." +#~ msgstr "" +#~ "Полный список команд ``tarantoolctl`` для управления экземплярами Tarantool " +#~ "можно найти в :ref:`справочнике по tarantoolctl `." diff --git a/locale/ru/LC_MESSAGES/index.po b/locale/ru/LC_MESSAGES/index.po index 630b89c017..664ef11ff3 100644 --- a/locale/ru/LC_MESSAGES/index.po +++ b/locale/ru/LC_MESSAGES/index.po @@ -2,24 +2,25 @@ msgid "CRUD operations" msgstr "CRUD-операции" -msgid "Streams" -msgstr "Стримы" - -msgid "Tarantool --- Documentation" +#, fuzzy +msgid "Tarantool -- Documentation" msgstr "Документация по Tarantool" -msgid "|nbsp|" -msgstr "|nbsp|" +#~ msgid "Streams" +#~ msgstr "Стримы" + +#~ msgid "|nbsp|" +#~ msgstr "|nbsp|" -msgid "Tarantool documentation" -msgstr "Руководство по Tarantool" +#~ msgid "Tarantool documentation" +#~ msgstr "Руководство по Tarantool" -msgid "" -"This manual embraces all aspects of using Tarantool: from introductory " -"information and exercises for beginners -- to advanced instructions and " -"detailed references for power users and contributors." -msgstr "" -"Данное руководство охватывает все аспекты использования Tarantool: от " -"вводной информации и упражнений для начинающих -- до продвинутых инструкций " -"и подробных справочников для опытных пользователей и сторонних " -"разработчиков." +#~ msgid "" +#~ "This manual embraces all aspects of using Tarantool: from introductory " +#~ "information and exercises for beginners -- to advanced instructions and " +#~ "detailed references for power users and contributors." +#~ msgstr "" +#~ "Данное руководство охватывает все аспекты использования Tarantool: от " +#~ "вводной информации и упражнений для начинающих -- до продвинутых инструкций " +#~ "и подробных справочников для опытных пользователей и сторонних " +#~ "разработчиков." diff --git a/locale/ru/LC_MESSAGES/overview.po b/locale/ru/LC_MESSAGES/overview.po new file mode 100644 index 0000000000..16b7294b38 --- /dev/null +++ b/locale/ru/LC_MESSAGES/overview.po @@ -0,0 +1,171 @@ + +msgid "Overview" +msgstr "" + +msgid "What is Tarantool?" +msgstr "" + +msgid "" +"Tarantool combines an in-memory DBMS and a Lua server in a single platform " +"providing ACID-compliant storage. It comes in two :ref:`editions `: Community and Enterprise. The :ref:`use cases ` for Tarantool vary from ultra-fast cache to product data marts " +"and smart queue services." +msgstr "" + +msgid "Here are some of Tarantool's key characteristics:" +msgstr "" + +msgid "" +"**Easy handling of OLTP workloads**: processes hundreds of thousands RPS" +msgstr "" + +msgid "" +"**Data integrity**: :ref:`write-ahead log (WAL) ` and :ref:`data snapshots `" +msgstr "" + +msgid "" +"**Cooperative multitasking**: transactions are performed in " +":ref:`lightweight coroutines ` with no " +"interthread locking" +msgstr "" + +msgid "" +"**Advanced indexing**: :ref:`composite indexes `, :ref:`locale support `, indexing by " +":ref:`nested fields and arrays `" +msgstr "" + +msgid "" +"**Compute close to data**: :ref:`Lua server ` " +"and Just-In-Time compiler on board" +msgstr "" + +msgid "" +"**Durable distributed storage**: multiple failover modes and :ref:`RAFT-" +"based synchronous replication ` available" +msgstr "" + +msgid "" +"Tarantool allows executing code alongside data, which helps increase the " +"speed of operations. Developers can :ref:`implement any business logic with " +"Lua `, and a single Tarantool instance can also " +"receive :ref:`SQL requests `." +msgstr "" + +msgid "" +"Tarantool has a variety of compatible `modules " +"`__ (Lua rocks). You can pick " +"the ones that you need and install them manually." +msgstr "" + +msgid "" +"Tarantool runs on Linux (x86_64, aarch64), Mac OS X (x86_64, M1), and " +"FreeBSD (x86_64)." +msgstr "" + +msgid "" +"You can use Tarantool with a programming language you're familiar with. For " +"this purpose, a number of :ref:`connectors ` are" +" provided." +msgstr "" + +msgid "Editions" +msgstr "" + +msgid "" +"Tarantool comes in two editions: the open-source **Community Edition (CE)** " +"and the commercial **Enterprise Edition (EE)**." +msgstr "" + +msgid "" +"**Tarantool Community Edition** lets you develop applications and speed up a" +" system in operation. It features :ref:`synchronous replication " +"`, affords easy :ref:`scalability `, and includes tools" +" to develop efficient :ref:`applications `. The `Tarantool " +"community `__ helps with any practical questions " +"regarding the Community Edition." +msgstr "" + +msgid "" +"**Tarantool Enterprise Edition** `provides advanced tools " +"`__ for administration, deployment, " +"and security management, along with premium support services. This edition " +"includes all the Community Edition features and is more predictable in terms" +" of solution cost and maintenance. The Enterprise Edition is shipped as an " +"SDK and includes a number of closed-source modules. See the :ref:`Tarantool " +"Enterprise Edition ` documentation." +msgstr "" + +msgid "Use cases" +msgstr "" + +msgid "Fast first-class storage" +msgstr "" + +msgid "Primary storage" +msgstr "" + +msgid "No secondary storage required" +msgstr "" + +msgid "Tolerance to high write loads" +msgstr "" + +msgid "Support of relational approaches" +msgstr "" + +msgid "Composite secondary indexes" +msgstr "" + +msgid "Data access, data slices" +msgstr "" + +msgid "Predictable request latency" +msgstr "" + +msgid "Advanced cache" +msgstr "" + +msgid "Write-behind caching" +msgstr "" + +msgid "Secondary index support" +msgstr "" + +msgid "Complex invalidation algorithm support" +msgstr "" + +msgid "Smart queue" +msgstr "" + +msgid "Support of various identification techniques" +msgstr "" + +msgid "Advanced task lifecycle management" +msgstr "" + +msgid "Task scheduling" +msgstr "" + +msgid "Archiving of completed tasks" +msgstr "" + +msgid "Data-centric applications" +msgstr "" + +msgid "Arbitrary data flows from many sources" +msgstr "" + +msgid "Incoming data processing" +msgstr "" + +msgid "Storage" +msgstr "" + +msgid "Background cycle processing" +msgstr "" + +msgid "Scheduling support" +msgstr "" diff --git a/locale/ru/LC_MESSAGES/overview_index.po b/locale/ru/LC_MESSAGES/overview_index.po new file mode 100644 index 0000000000..b98d5c33a7 --- /dev/null +++ b/locale/ru/LC_MESSAGES/overview_index.po @@ -0,0 +1,3 @@ + +msgid "Overview" +msgstr "" diff --git a/locale/ru/LC_MESSAGES/pdf_toc.po b/locale/ru/LC_MESSAGES/pdf_toc.po new file mode 100644 index 0000000000..e7f773351d --- /dev/null +++ b/locale/ru/LC_MESSAGES/pdf_toc.po @@ -0,0 +1,3 @@ + +msgid "CRUD operations" +msgstr "" diff --git a/locale/ru/LC_MESSAGES/reference/configuration/configuration_reference.po b/locale/ru/LC_MESSAGES/reference/configuration/configuration_reference.po new file mode 100644 index 0000000000..35a5bc8868 --- /dev/null +++ b/locale/ru/LC_MESSAGES/reference/configuration/configuration_reference.po @@ -0,0 +1,1507 @@ + +msgid "Configuration reference" +msgstr "" + +msgid "" +"This topic describes all :ref:`configuration parameters ` " +"provided by Tarantool." +msgstr "" + +msgid "" +"Most of the configuration options described in this reference can be applied" +" to a specific instance, replica set, group, or to all instances globally. " +"To do so, you need to define the required option at the :ref:`specified " +"level `." +msgstr "" + +msgid "config" +msgstr "" + +msgid "" +"The ``config`` section defines various parameters related to centralized " +"configuration." +msgstr "" + +msgid "" +"``config`` can be defined in the global :ref:`scope ` " +"only." +msgstr "" + +msgid ":ref:`config.reload `" +msgstr "" + +msgid ":ref:`config.version `" +msgstr "" + +msgid ":ref:`config.etcd.* `" +msgstr "" + +msgid "**Since:** :doc:`3.0.0 `." +msgstr "" + +msgid "" +"Specify how the configuration is reloaded. This option accepts the following" +" values:" +msgstr "" + +msgid "``auto``: configuration is reloaded automatically when it is changed." +msgstr "" + +msgid "" +"``manual``: configuration should be reloaded manually. In this case, you can" +" reload the configuration in the application code using " +":ref:`config:reload() `." +msgstr "" + +msgid "" +"See also: :ref:`Reloading configuration `." +msgstr "" + +msgid "Type: string" +msgstr "" + +msgid "Possible values: 'auto', 'manual'" +msgstr "" + +msgid "Default: 'auto'" +msgstr "" + +msgid "Environment variable: TT_CONFIG_RELOAD" +msgstr "" + +msgid "A configuration version." +msgstr "" + +msgid "Default: nil" +msgstr "" + +msgid "Environment variable: TT_CONFIG_VERSION" +msgstr "" + +msgid "config.etcd.*" +msgstr "" + +msgid "Enterprise Edition" +msgstr "" + +msgid "" +"Storing configuration in etcd is supported by the `Enterprise Edition " +"`_ only." +msgstr "" + +msgid "" +"This section describes options related to :ref:`storing configuration in " +"etcd `." +msgstr "" + +msgid ":ref:`config.etcd.endpoints `" +msgstr "" + +msgid ":ref:`config.etcd.prefix `" +msgstr "" + +msgid ":ref:`config.etcd.username `" +msgstr "" + +msgid ":ref:`config.etcd.password `" +msgstr "" + +msgid ":ref:`config.etcd.ssl.ca_file `" +msgstr "" + +msgid ":ref:`config.etcd.ssl.ca_path `" +msgstr "" + +msgid ":ref:`config.etcd.ssl.ssl_key `" +msgstr "" + +msgid ":ref:`config.etcd.ssl.verify_host `" +msgstr "" + +msgid ":ref:`config.etcd.ssl.verify_peer `" +msgstr "" + +msgid "" +":ref:`config.etcd.http.request.timeout `" +msgstr "" + +msgid "" +":ref:`config.etcd.http.request.unix_socket " +"`" +msgstr "" + +msgid "The list of endpoints used to access an etcd server." +msgstr "" + +msgid "See also: :ref:`Local etcd configuration `." +msgstr "" + +msgid "Type: array" +msgstr "" + +msgid "Environment variable: TT_CONFIG_ETCD_ENDPOINTS" +msgstr "" + +msgid "" +"A key prefix used to search a configuration on an etcd server. Tarantool " +"searches keys by the following path: ``/config/*``. Note that " +"```` should start with a slash (``/``)." +msgstr "" + +msgid "Environment variable: TT_CONFIG_ETCD_PREFIX" +msgstr "" + +msgid "A username used for authentication." +msgstr "" + +msgid "Environment variable: TT_CONFIG_ETCD_USERNAME" +msgstr "" + +msgid "A password used for authentication." +msgstr "" + +msgid "Environment variable: TT_CONFIG_ETCD_PASSWORD" +msgstr "" + +msgid "A path to a trusted certificate authorities (CA) file." +msgstr "" + +msgid "Environment variable: TT_CONFIG_ETCD_SSL_CA_FILE" +msgstr "" + +msgid "A path to a directory holding certificates to verify the peer with." +msgstr "" + +msgid "Environment variable: TT_CONFIG_ETCD_SSL_CA_PATH" +msgstr "" + +msgid "A path to a private SSL key file." +msgstr "" + +msgid "Environment variable: TT_CONFIG_ETCD_SSL_SSL_KEY" +msgstr "" + +msgid "" +"Enable verification of the certificate's name (CN) against the specified " +"host." +msgstr "" + +msgid "Type: boolean" +msgstr "" + +msgid "Environment variable: TT_CONFIG_ETCD_SSL_VERIFY_HOST" +msgstr "" + +msgid "Enable verification of the peer's SSL certificate." +msgstr "" + +msgid "Environment variable: TT_CONFIG_ETCD_SSL_VERIFY_PEER" +msgstr "" + +msgid "" +"A time period required to process an HTTP request to an etcd server: from " +"sending a request to receiving a response." +msgstr "" + +msgid "Type: number" +msgstr "" + +msgid "Environment variable: TT_CONFIG_ETCD_HTTP_REQUEST_TIMEOUT" +msgstr "" + +msgid "A Unix domain socket used to connect to an etcd server." +msgstr "" + +msgid "Environment variable: TT_CONFIG_ETCD_HTTP_REQUEST_UNIX_SOCKET" +msgstr "" + +msgid "credentials" +msgstr "" + +msgid "" +"``credentials`` can be defined in any :ref:`scope `." +msgstr "" + +msgid ":ref:`credentials.roles.* `" +msgstr "" + +msgid ":ref:`credentials.users.* `" +msgstr "" + +msgid "" +":ref:`.privileges.* " +"`" +msgstr "" + +msgid "Type: map" +msgstr "" + +msgid "Environment variable: TT_CREDENTIALS_ROLES" +msgstr "" + +msgid "Environment variable: TT_CREDENTIALS_USERS" +msgstr "" + +msgid "credentials.roles.*" +msgstr "" + +msgid "" +"See :ref:`privileges `." +msgstr "" + +msgid "credentials.users.*" +msgstr "" + +msgid ".privileges.*" +msgstr "" + +msgid "database" +msgstr "" + +msgid "" +"The ``database`` section defines database-specific configuration parameters," +" such as an instance's read-write mode or transaction isolation level." +msgstr "" + +msgid "" +"``database`` can be defined in any :ref:`scope `." +msgstr "" + +msgid "" +":ref:`database.hot_standby `" +msgstr "" + +msgid "" +":ref:`database.instance_uuid " +"`" +msgstr "" + +msgid ":ref:`database.mode `" +msgstr "" + +msgid "" +":ref:`database.replicaset_uuid " +"`" +msgstr "" + +msgid "" +":ref:`database.txn_isolation " +"`" +msgstr "" + +msgid "" +":ref:`database.txn_timeout `" +msgstr "" + +msgid "" +":ref:`database.use_mvcc_engine " +"`" +msgstr "" + +msgid "Default: false" +msgstr "" + +msgid "Environment variable: TT_DATABASE_HOT_STANDBY" +msgstr "" + +msgid "An :ref:`instance UUID `." +msgstr "" + +msgid "" +"By default, instance UUIDs are generated automatically. " +"``database.instance_uuid`` can be used to specify an instance identifier " +"manually." +msgstr "" + +msgid "UUIDs should follow these rules:" +msgstr "" + +msgid "" +"The values must be true unique identifiers, not shared by other instances or" +" replica sets within the common infrastructure." +msgstr "" + +msgid "" +"The values must be used consistently, not changed after the initial setup. " +"The initial values are stored in :ref:`snapshot files ` and are checked whenever the system is restarted." +msgstr "" + +msgid "" +"The values must comply with `RFC 4122 " +"`_. The `nil UUID " +"`_ is not allowed." +msgstr "" + +msgid "" +"See also: :ref:`database.replicaset_uuid " +"`" +msgstr "" + +msgid "Default: :ref:`box.NULL `" +msgstr "" + +msgid "Environment variable: TT_DATABASE_INSTANCE_UUID" +msgstr "" + +msgid "" +"An instance's operating mode. This option is in effect if " +":ref:`replication.failover ` " +"is set to ``off``." +msgstr "" + +msgid "The following modes are available:" +msgstr "" + +msgid "``rw``: an instance is in read-write mode." +msgstr "" + +msgid "``ro``: an instance is in read-only mode." +msgstr "" + +msgid "" +"If not specified explicitly, the default value depends on the number of " +"instances in a replica set. For a single instance, the ``rw`` mode is used, " +"while for multiple instances, the ``ro`` mode is used." +msgstr "" + +msgid "**Example**" +msgstr "" + +msgid "" +"You can set the ``database.mode`` option to ``rw`` on all instances in a " +"replica set to make a :ref:`master-master ` " +"configuration. In this case, ``replication.failover`` should be set to " +"``off``." +msgstr "" + +msgid "" +"credentials:\n" +" users:\n" +" replicator:\n" +" password: 'topsecret'\n" +" roles: [replication]\n" +"\n" +"iproto:\n" +" advertise:\n" +" peer: replicator@\n" +"\n" +"replication:\n" +" failover: off\n" +"\n" +"groups:\n" +" group001:\n" +" replicasets:\n" +" replicaset001:\n" +" instances:\n" +" instance001:\n" +" database:\n" +" mode: rw\n" +" iproto:\n" +" listen: 127.0.0.1:3301\n" +" instance002:\n" +" database:\n" +" mode: rw\n" +" iproto:\n" +" listen: 127.0.0.1:3302\n" +"\n" +"# Load sample data\n" +"app:\n" +" file: 'myapp.lua'" +msgstr "" + +msgid "" +"Default: :ref:`box.NULL ` (the actual default value depends on the" +" number of instances in a replica set)" +msgstr "" + +msgid "Environment variable: TT_DATABASE_MODE" +msgstr "" + +msgid "A :ref:`replica set UUID `." +msgstr "" + +msgid "" +"By default, replica set UUIDs are generated automatically. " +"``database.replicaset_uuid`` can be used to specify a replica set identifier" +" manually." +msgstr "" + +msgid "" +"See also: :ref:`database.instance_uuid " +"`" +msgstr "" + +msgid "Environment variable: TT_DATABASE_REPLICASET_UUID" +msgstr "" + +msgid "A transaction :ref:`isolation level `." +msgstr "" + +msgid "Default: ``best-effort``" +msgstr "" + +msgid "" +"Possible values: ``best-effort``, ``read-committed``, ``read-confirmed``" +msgstr "" + +msgid "Environment variable: TT_DATABASE_TXN_ISOLATION" +msgstr "" + +msgid "A timeout (in seconds) after which the transaction is rolled back." +msgstr "" + +msgid "See also: :ref:`box.begin() `" +msgstr "" + +msgid "Default: 3153600000 (~100 years)" +msgstr "" + +msgid "Environment variable: TT_DATABASE_TXN_TIMEOUT" +msgstr "" + +msgid "" +"Whether the :ref:`transactional manager ` is " +"enabled." +msgstr "" + +msgid "Environment variable: TT_DATABASE_USE_MVCC_ENGINE" +msgstr "" + +msgid "iproto" +msgstr "" + +msgid "" +"The ``iproto`` section is used to configure parameters related to " +"communicating to and between cluster instances." +msgstr "" + +msgid "``iproto`` can be defined in any :ref:`scope `." +msgstr "" + +msgid "" +":ref:`iproto.advertise.client " +"`" +msgstr "" + +msgid "" +":ref:`iproto.advertise.peer `" +msgstr "" + +msgid "" +":ref:`iproto.advertise.sharding " +"`" +msgstr "" + +msgid ":ref:`iproto.listen `" +msgstr "" + +msgid ":ref:`iproto.net_msg_max `" +msgstr "" + +msgid ":ref:`iproto.readahead `" +msgstr "" + +msgid ":ref:`iproto.threads `" +msgstr "" + +msgid "An URI used to advertise the current instance to clients." +msgstr "" + +msgid "" +"The ``iproto.advertise.client`` option accepts an URI in the following " +"formats:" +msgstr "" + +msgid "An address: ``host:port``." +msgstr "" + +msgid "A Unix domain socket: ``unix/:``." +msgstr "" + +msgid "" +"Note that this option doesn't allow to set a username and password. If a " +"remote client needs this information, it should be delivered outside of the " +"cluster configuration." +msgstr "" + +msgid "" +"The ``host`` value cannot be ``0.0.0.0``/``[::]`` and the ``port`` value " +"cannot be ``0``." +msgstr "" + +msgid "Environment variable: TT_IPROTO_ADVERTISE_CLIENT" +msgstr "" + +msgid "" +"An URI used to advertise the current instance to other cluster members." +msgstr "" + +msgid "" +"The ``iproto.advertise.peer`` option accepts an URI in the following " +"formats:" +msgstr "" + +msgid "" +"User :ref:`credentials ` and an " +"address: ``username@host:port`` or ``username:password@host:port``." +msgstr "" + +msgid "" +"User credentials: ``username@`` or ``username:password@``. In this case, an " +"advertise address is taken from :ref:`iproto.listen " +"`." +msgstr "" + +msgid "" +"If ``password`` is missing, it is taken from :ref:`credentials " +"` for the specified ``username``." +msgstr "" + +msgid "" +"You can also use a Unix domain socket (``unix/:``) instead of ``host:port``." +msgstr "" + +msgid "" +"In the example below, the following configuration options are specified:" +msgstr "" + +msgid "" +"In the :ref:`credentials ` section, the" +" ``replicator`` user with the ``replication`` role is created." +msgstr "" + +msgid "" +"``iproto.advertise.peer`` specifies that other instances should connect to " +"an address defined in :ref:`iproto.listen " +"` using the ``replicator`` user." +msgstr "" + +msgid "" +"credentials:\n" +" users:\n" +" replicator:\n" +" password: 'topsecret'\n" +" roles: [replication]\n" +"\n" +"iproto:\n" +" advertise:\n" +" peer: replicator@\n" +"\n" +"replication:\n" +" failover: election\n" +"\n" +"groups:\n" +" group001:\n" +" replicasets:\n" +" replicaset001:\n" +" instances:\n" +" instance001:\n" +" iproto:\n" +" listen: 127.0.0.1:3301\n" +" instance002:\n" +" iproto:\n" +" listen: 127.0.0.1:3302\n" +" instance003:\n" +" iproto:\n" +" listen: 127.0.0.1:3303\n" +msgstr "" + +msgid "Environment variable: TT_IPROTO_ADVERTISE_PEER" +msgstr "" + +msgid "An advertise URI used by a router and rebalancer." +msgstr "" + +msgid "" +"The ``iproto.advertise.sharding`` option accepts an URI in the same formats " +"as :ref:`iproto.advertise.peer " +"`." +msgstr "" + +msgid "" +"In the :ref:`credentials ` section, the" +" ``replicator`` and ``storage`` users are created." +msgstr "" + +msgid "" +"``iproto.advertise.peer`` specifies that other instances should connect to " +"an address defined in :ref:`iproto.listen " +"` with the ``replicator`` user." +msgstr "" + +msgid "" +"``iproto.advertise.sharding`` specifies that a router should connect to " +"storages using an address defined in :ref:`iproto.listen " +"` with the ``storage`` user." +msgstr "" + +msgid "" +"credentials:\n" +" users:\n" +" replicator:\n" +" password: 'topsecret'\n" +" roles: [replication]\n" +" storage:\n" +" password: 'secret'\n" +" roles: [super]\n" +"\n" +"iproto:\n" +" advertise:\n" +" peer: replicator@\n" +" sharding: storage@\n" +msgstr "" + +msgid "Environment variable: TT_IPROTO_ADVERTISE_SHARDING" +msgstr "" + +msgid "" +"An address used to listen for incoming requests. This address is used for " +"different purposes, for example:" +msgstr "" + +msgid "Communicating between replica set peers or cluster members." +msgstr "" + +msgid "Remote administration using :ref:`tt connect `." +msgstr "" + +msgid "" +"Connecting to an instance using :ref:`connectors ` for" +" different languages." +msgstr "" + +msgid "" +"To grant the specified privileges for connecting to an instance, use the " +":ref:`credentials ` configuration " +"section." +msgstr "" + +msgid "" +"In the example below, ``iproto.listen`` is set explicitly for each instance " +"in a cluster:" +msgstr "" + +msgid "" +"groups:\n" +" group001:\n" +" replicasets:\n" +" replicaset001:\n" +" instances:\n" +" instance001:\n" +" iproto:\n" +" listen: 127.0.0.1:3301\n" +" instance002:\n" +" iproto:\n" +" listen: 127.0.0.1:3302\n" +" instance003:\n" +" iproto:\n" +" listen: 127.0.0.1:3303\n" +"\n" +msgstr "" + +msgid "" +"See also: :ref:`Connection settings `." +msgstr "" + +msgid "Environment variable: TT_IPROTO_LISTEN" +msgstr "" + +msgid "" +"To handle messages, Tarantool allocates :ref:`fibers `. To " +"prevent fiber overhead from affecting the whole system, Tarantool restricts " +"how many messages the fibers handle, so that some pending requests are " +"blocked." +msgstr "" + +msgid "" +"On powerful systems, increase ``net_msg_max``, and the scheduler starts " +"processing pending requests immediately." +msgstr "" + +msgid "" +"On weaker systems, decrease ``net_msg_max``, and the overhead may decrease. " +"Although this may take some time because the scheduler must wait until " +"already-running requests finish." +msgstr "" + +msgid "" +"When ``net_msg_max`` is reached, Tarantool suspends processing of incoming " +"packages until it has processed earlier messages. This is not a direct " +"restriction of the number of fibers that handle network messages, rather it " +"is a system-wide restriction of channel bandwidth. This in turn restricts " +"the number of incoming network messages that the :ref:`transaction processor" +" thread ` handles, and therefore indirectly affects the fibers" +" that handle network messages." +msgstr "" + +msgid "" +"The number of fibers is smaller than the number of messages because messages" +" can be released as soon as they are delivered, while incoming requests " +"might not be processed until some time after delivery." +msgstr "" + +msgid "Type: integer" +msgstr "" + +msgid "Default: 768" +msgstr "" + +msgid "Environment variable: TT_IPROTO_NET_MSG_MAX" +msgstr "" + +msgid "" +"The size of the read-ahead buffer associated with a client connection. The " +"larger the buffer, the more memory an active connection consumes, and the " +"more requests can be read from the operating system buffer in a single " +"system call." +msgstr "" + +msgid "" +"The recommendation is to make sure that the buffer can contain at least a " +"few dozen requests. Therefore, if a typical tuple in a request is large, " +"e.g. a few kilobytes or even megabytes, the read-ahead buffer size should be" +" increased. If batched request processing is not used, it’s prudent to leave" +" this setting at its default." +msgstr "" + +msgid "Default: 16320" +msgstr "" + +msgid "Environment variable: TT_IPROTO_READAHEAD" +msgstr "" + +#, python-format +msgid "" +"The number of :ref:`network threads `. There can be unusual " +"workloads where the network thread is 100% loaded and the transaction " +"processor thread is not, so the network thread is a bottleneck. In that " +"case, set ``iproto_threads`` to 2 or more. The operating system kernel " +"determines which connection goes to which thread." +msgstr "" + +msgid "Default: 1" +msgstr "" + +msgid "Environment variable: TT_IPROTO_THREADS" +msgstr "" + +msgid "groups" +msgstr "" + +msgid "" +"The ``groups`` section provides the ability to define the :ref:`full " +"topology of a Tarantool cluster `." +msgstr "" + +msgid "" +"``groups`` can be defined in the global :ref:`scope ` " +"only." +msgstr "" + +msgid ":ref:`groups.\\ `" +msgstr "" + +msgid "" +":ref:`groups.\\.replicasets " +"`" +msgstr "" + +msgid "" +":ref:`groups.\\.\\ " +"`" +msgstr "" + +msgid "A group name." +msgstr "" + +msgid "" +"Replica sets that belong to this group. See :ref:`replicasets " +"`." +msgstr "" + +msgid "" +"Any configuration parameter that can be defined in the group :ref:`scope " +"`. For example, :ref:`iproto " +"` and :ref:`database " +"` configuration parameters defined at the " +"group level are applied to all instances in this group." +msgstr "" + +msgid "replicasets" +msgstr "" + +msgid "" +"``replicasets`` can be defined in the group :ref:`scope " +"` only." +msgstr "" + +msgid "" +":ref:`replicasets.\\ " +"`" +msgstr "" + +msgid "" +":ref:`replicasets.\\.leader " +"`" +msgstr "" + +msgid "" +":ref:`replicasets.\\.bootstrap_leader " +"`" +msgstr "" + +msgid "" +":ref:`replicasets.\\.instances " +"`" +msgstr "" + +msgid "" +":ref:`replicasets.\\.\\ " +"`" +msgstr "" + +msgid "A replica set name." +msgstr "" + +msgid "" +"A replica set leader. This option can be used to set a replica set leader " +"when ``manual`` :ref:`replication.failover " +"` is used." +msgstr "" + +msgid "" +"To perform :ref:`controlled failover `, " +"``.leader`` can be temporarily removed or set to ``null``." +msgstr "" + +msgid "" +"replication:\n" +" failover: manual\n" +"\n" +"groups:\n" +" group001:\n" +" replicasets:\n" +" replicaset001:\n" +" leader: instance001\n" +" instances:\n" +" instance001:\n" +" iproto:\n" +" listen: 127.0.0.1:3301\n" +" instance002:\n" +" iproto:\n" +" listen: 127.0.0.1:3302\n" +" instance003:\n" +" iproto:\n" +" listen: 127.0.0.1:3303\n" +msgstr "" + +msgid "" +"A bootstrap leader for a replica set. To specify a bootstrap leader " +"manually, you need to set :ref:`replication.bootstrap_strategy " +"` to ``config``." +msgstr "" + +msgid "" +"groups:\n" +" group001:\n" +" replicasets:\n" +" replicaset001:\n" +" replication:\n" +" bootstrap_strategy: config\n" +" bootstrap_leader: instance001\n" +" instances:\n" +" instance001:\n" +" iproto:\n" +" listen: 127.0.0.1:3301\n" +" instance002:\n" +" iproto:\n" +" listen: 127.0.0.1:3302\n" +" instance003:\n" +" iproto:\n" +" listen: 127.0.0.1:3303" +msgstr "" + +msgid "" +"Instances that belong to this replica set. See :ref:`instances " +"`." +msgstr "" + +msgid "" +"Any configuration parameter that can be defined in the replica set " +":ref:`scope `. For example, :ref:`iproto " +"` and :ref:`database " +"` configuration parameters defined at the " +"replica set level are applied to all instances in this replica set." +msgstr "" + +msgid "instances" +msgstr "" + +msgid "" +"``instances`` can be defined in the replica set :ref:`scope " +"` only." +msgstr "" + +msgid "" +":ref:`instances.\\ " +"`" +msgstr "" + +msgid "" +":ref:`instances.\\.\\ " +"`" +msgstr "" + +msgid "An instance name." +msgstr "" + +msgid "" +"Any configuration parameter that can be defined in the instance :ref:`scope " +"`. For example, :ref:`iproto " +"` and :ref:`database " +"` configuration parameters defined at the " +"instance level are applied to this instance only." +msgstr "" + +msgid "replication" +msgstr "" + +msgid "" +"The ``replication`` section defines configuration parameters related to " +":ref:`replication `." +msgstr "" + +msgid ":ref:`replication.anon `" +msgstr "" + +msgid "" +":ref:`replication.bootstrap_strategy " +"`" +msgstr "" + +msgid "" +":ref:`replication.connect_timeout " +"`" +msgstr "" + +msgid "" +":ref:`replication.election_mode " +"`" +msgstr "" + +msgid "" +":ref:`replication.election_timeout " +"`" +msgstr "" + +msgid "" +":ref:`replication.election_fencing_mode " +"`" +msgstr "" + +msgid "" +":ref:`replication.failover `" +msgstr "" + +msgid ":ref:`replication.peers `" +msgstr "" + +msgid "" +":ref:`replication.skip_conflict " +"`" +msgstr "" + +msgid "" +":ref:`replication.sync_lag `" +msgstr "" + +msgid "" +":ref:`replication.sync_timeout " +"`" +msgstr "" + +msgid "" +":ref:`replication.synchro_quorum " +"`" +msgstr "" + +msgid "" +":ref:`replication.synchro_timeout " +"`" +msgstr "" + +msgid "" +":ref:`replication.threads `" +msgstr "" + +msgid "" +":ref:`replication.timeout `" +msgstr "" + +msgid "Default: ``false``" +msgstr "" + +msgid "Environment variable: TT_REPLICATION_ANON" +msgstr "" + +msgid "" +"Specifies a strategy used to bootstrap a :ref:`replica set `. The following strategies are available:" +msgstr "" + +msgid "" +"``auto``: a node doesn't boot if half or more of the other nodes in a " +"replica set are not connected. For example, if a replica set contains 2 or 3" +" nodes, a node requires 2 connected instances. In the case of 4 or 5 nodes, " +"at least 3 connected instances are required. Moreover, a bootstrap leader " +"fails to boot unless every connected node has chosen it as a bootstrap " +"leader." +msgstr "" + +msgid "" +"``config``: use the specified node to bootstrap a replica set. To specify " +"the bootstrap leader, use the :ref:`.bootstrap_leader " +"` option." +msgstr "" + +msgid "" +"``supervised``: a bootstrap leader isn't chosen automatically but should be " +"appointed using :ref:`box.ctl.make_bootstrap_leader() ` on the desired node." +msgstr "" + +msgid "" +"``legacy`` (deprecated since :doc:`2.11.0 `): a node " +"requires the :ref:`replication_connect_quorum ` number of other nodes to be connected. This " +"option is added to keep the compatibility with the current versions of " +"Cartridge and might be removed in the future." +msgstr "" + +msgid "Default: ``auto``" +msgstr "" + +msgid "Environment variable: TT_REPLICATION_BOOTSTRAP_STRATEGY" +msgstr "" + +msgid "" +"A timeout (in seconds) a replica waits when trying to connect to a master in" +" a cluster. See :ref:`orphan status ` for " +"details." +msgstr "" + +msgid "" +"This parameter is different from :ref:`replication.timeout " +"`, which a master uses to " +"disconnect a replica when the master receives no acknowledgments of " +"heartbeat messages." +msgstr "" + +msgid "Default: 30" +msgstr "" + +msgid "Environment variable: TT_REPLICATION_CONNECT_TIMEOUT" +msgstr "" + +msgid "" +"A role of a replica set node in the :ref:`leader election process " +"`." +msgstr "" + +msgid "The possible values are:" +msgstr "" + +msgid "``off``: a node doesn't participate in the election activities." +msgstr "" + +msgid "" +"``voter``: a node can participate in the election process but can't be a " +"leader." +msgstr "" + +msgid "``candidate``: a node should be able to become a leader." +msgstr "" + +msgid "" +"``manual``: allow to control which instance is the leader explicitly instead" +" of relying on automated leader election. By default, the instance acts like" +" a voter -- it is read-only and may vote for other candidate instances. Once" +" :ref:`box.ctl.promote() ` is called, the instance becomes " +"a candidate and starts a new election round. If the instance wins the " +"elections, it becomes a leader but won't participate in any new elections." +msgstr "" + +msgid "" +"Default: :ref:`box.NULL ` (the actual default value depends on " +":ref:`replication.failover `)" +msgstr "" + +msgid "Environment variable: TT_REPLICATION_ELECTION_MODE" +msgstr "" + +msgid "" +"Specifies the timeout (in seconds) between election rounds in the " +":ref:`leader election process ` if the previous round " +"ended up with a split vote." +msgstr "" + +msgid "" +"It is quite big, and for most of the cases, it can be lowered to 300-400 ms." +msgstr "" + +#, python-format +msgid "" +"To avoid the split vote repeat, the timeout is randomized on each node " +"during every new election, from 100% to 110% of the original timeout value. " +"For example, if the timeout is 300 ms and there are 3 nodes started the " +"election simultaneously in the same term, they can set their election " +"timeouts to 300, 310, and 320 respectively, or to 305, 302, and 324, and so " +"on. In that way, the votes will never be split because the election on " +"different nodes won't be restarted simultaneously." +msgstr "" + +msgid "Default: 5" +msgstr "" + +msgid "Environment variable: TT_REPLICATION_ELECTION_TIMEOUT" +msgstr "" + +msgid "" +"Specifies the :ref:`leader fencing mode ` that " +"affects the leader election process. When the parameter is set to ``soft`` " +"or ``strict``, the leader resigns its leadership if it has less than " +":ref:`replication.synchro_quorum " +"` of alive connections " +"to the cluster nodes. The resigning leader receives the status of a follower" +" in the current election term and becomes read-only." +msgstr "" + +msgid "" +"In ``soft`` mode, a connection is considered dead if there are no responses " +"for :ref:`4 * replication.timeout " +"` seconds both on the current " +"leader and the followers." +msgstr "" + +msgid "" +"In ``strict`` mode, a connection is considered dead if there are no " +"responses for :ref:`2 * replication.timeout " +"` seconds on the current leader" +" and :ref:`4 * replication.timeout " +"` seconds on the followers. " +"This improves the chances that there is only one leader at any time." +msgstr "" + +msgid "" +"Fencing applies to the instances that have the " +":ref:`replication.election_mode " +"` set to ``candidate`` or" +" ``manual``. To turn off leader fencing, set ``election_fencing_mode`` to " +"``off``." +msgstr "" + +msgid "Default: ``soft``" +msgstr "" + +msgid "Possible values: ``off``, ``soft``, ``strict``" +msgstr "" + +msgid "Environment variable: TT_REPLICATION_ELECTION_FENCING_MODE" +msgstr "" + +msgid "" +"A failover mode used to take over a master role when the current master " +"instance fails. The following modes are available:" +msgstr "" + +msgid "``off``" +msgstr "" + +msgid "" +"Leadership in a replica set is controlled using the :ref:`database.mode " +"` option. In this case, you can set " +"the ``database.mode`` option to ``rw`` on all instances in a replica set to " +"make a :ref:`master-master ` configuration." +msgstr "" + +msgid "" +"The default ``database.mode`` is determined as follows: ``rw`` if there is " +"one instance in a replica set; ``ro`` if there are several instances." +msgstr "" + +msgid "``manual``" +msgstr "" + +msgid "" +"Leadership in a replica set is controlled using the " +":ref:`.leader " +"` option. In this case, a " +":ref:`master-master ` configuration is forbidden." +msgstr "" + +msgid "" +"In the ``manual`` mode, the :ref:`database.mode " +"` option cannot be set explicitly. " +"The leader is configured in the read-write mode, all the other instances are" +" read-only." +msgstr "" + +msgid "``election``" +msgstr "" + +msgid "" +":ref:`Automated leader election ` is used to control " +"leadership in a replica set." +msgstr "" + +msgid "" +"In the ``election`` mode, :ref:`database.mode " +"` and :ref:`.leader " +"` shouldn't be set " +"explicitly." +msgstr "" + +msgid "" +"``supervised`` (`Enterprise Edition `_ " +"only)" +msgstr "" + +msgid "" +"Leadership in a replica set is controlled using an external failover agent." +msgstr "" + +msgid "" +"In the ``supervised`` mode, :ref:`database.mode " +"` and :ref:`.leader " +"` shouldn't be set " +"explicitly." +msgstr "" + +msgid "See also: :ref:`Replication tutorials `." +msgstr "" + +msgid "" +"``replication.failover`` can be defined in the global, group, and replica " +"set :ref:`scope `." +msgstr "" + +msgid "" +":ref:`iproto.advertise.peer `" +" specifies that other instances should connect to an address defined in " +":ref:`iproto.listen ` using the " +"``replicator`` user." +msgstr "" + +msgid "" +"``replication.failover`` specifies that a master instance should be set " +"manually." +msgstr "" + +msgid "" +":ref:`.leader " +"` sets ``instance001`` as a" +" replica set leader." +msgstr "" + +msgid "" +"credentials:\n" +" users:\n" +" replicator:\n" +" password: 'topsecret'\n" +" roles: [replication]\n" +"\n" +"iproto:\n" +" advertise:\n" +" peer: replicator@\n" +"\n" +"replication:\n" +" failover: manual\n" +"\n" +"groups:\n" +" group001:\n" +" replicasets:\n" +" replicaset001:\n" +" leader: instance001\n" +" instances:\n" +" instance001:\n" +" iproto:\n" +" listen: 127.0.0.1:3301\n" +" instance002:\n" +" iproto:\n" +" listen: 127.0.0.1:3302\n" +" instance003:\n" +" iproto:\n" +" listen: 127.0.0.1:3303\n" +"\n" +msgstr "" + +msgid "Default: ``off``" +msgstr "" + +msgid "Environment variable: TT_REPLICATION_FAILOVER" +msgstr "" + +msgid "" +"URIs of instances that constitute a replica set. These URIs are used by an " +"instance to connect to another instance as a replica." +msgstr "" + +msgid "" +"Alternatively, you can use :ref:`iproto.advertise.peer " +"` to specify a URI used to " +"advertise the current instance to other cluster members." +msgstr "" + +msgid "``replication.peers`` specifies URIs of replica set instances." +msgstr "" + +msgid "" +"credentials:\n" +" users:\n" +" replicator:\n" +" password: 'topsecret'\n" +" roles: [replication]\n" +"\n" +"replication:\n" +" peers:\n" +" - replicator:topsecret@127.0.0.1:3301\n" +" - replicator:topsecret@127.0.0.1:3302\n" +" - replicator:topsecret@127.0.0.1:3303\n" +msgstr "" + +msgid "Environment variable: TT_REPLICATION_PEERS" +msgstr "" + +msgid "" +"By default, if a replica adds a unique key that another replica has added, " +"replication :ref:`stops ` with the " +"``ER_TUPLE_FOUND`` :ref:`error `. If " +"``replication.skip_conflict`` is set to ``true``, such errors are ignored." +msgstr "" + +msgid "" +"Instead of saving the broken transaction to the write-ahead log, it is " +"written as ``NOP`` (No operation)." +msgstr "" + +msgid "Environment variable: TT_REPLICATION_SKIP_CONFLICT" +msgstr "" + +msgid "" +"The maximum delay (in seconds) between the time when data is written to the " +"master and the time when it is written to a replica. If " +"``replication.sync_lag`` is set to ``nil`` or 365 * 100 * 86400 " +"(``TIMEOUT_INFINITY``), a replica is always considered to be \"synced\"." +msgstr "" + +msgid "" +"This parameter is ignored during bootstrap. See :ref:`orphan status " +"` for details." +msgstr "" + +msgid "Default: 10" +msgstr "" + +msgid "Environment variable: TT_REPLICATION_SYNC_LAG" +msgstr "" + +msgid "" +"The timeout (in seconds) that a node waits when trying to sync with other " +"nodes in a replica set after connecting or during a :ref:`configuration " +"update `. This could fail indefinitely if " +":ref:`replication.sync_lag ` " +"is smaller than network latency, or if the replica cannot keep pace with " +"master updates. If ``replication.sync_timeout`` expires, the replica enters " +":ref:`orphan status `." +msgstr "" + +msgid "Default: 0" +msgstr "" + +msgid "Environment variable: TT_REPLICATION_SYNC_TIMEOUT" +msgstr "" + +msgid "" +"A number of replicas that should confirm the receipt of a :ref:`synchronous " +"` transaction before it can finish its commit." +msgstr "" + +msgid "" +"This option supports dynamic evaluation of the quorum number. For example, " +"the default value is ``N / 2 + 1`` where ``N`` is the current number of " +"replicas registered in a cluster. Once any replicas are added or removed, " +"the expression is re-evaluated automatically." +msgstr "" + +#, python-format +msgid "" +"Note that the default value (``at least 50% of the cluster size + 1``) " +"guarantees data reliability. Using a value less than the canonical one might" +" lead to unexpected results, including a :ref:`split-brain " +"`." +msgstr "" + +msgid "" +"``replication.synchro_quorum`` is not used on replicas. If the master fails," +" the pending synchronous transactions will be kept waiting on the replicas " +"until a new master is elected." +msgstr "" + +msgid "" +"``replication.synchro_quorum`` does not account for anonymous replicas." +msgstr "" + +msgid "Type: string, number" +msgstr "" + +msgid "Default: ``N / 2 + 1``" +msgstr "" + +msgid "Environment variable: TT_REPLICATION_SYNCHRO_QUORUM" +msgstr "" + +msgid "" +"For :ref:`synchronous replication ` only. Specify how many " +"seconds to wait for a synchronous transaction quorum replication until it is" +" declared failed and is rolled back." +msgstr "" + +msgid "" +"It is not used on replicas, so if the master fails, the pending synchronous " +"transactions will be kept waiting on the replicas until a new master is " +"elected." +msgstr "" + +msgid "Environment variable: TT_REPLICATION_SYNCHRO_TIMEOUT" +msgstr "" + +msgid "The number of threads spawned to decode the incoming replication data." +msgstr "" + +msgid "" +"In most cases, one thread is enough for all incoming data. Possible values " +"range from 1 to 1000. If there are multiple replication threads, connections" +" to serve are distributed evenly between the threads." +msgstr "" + +msgid "Environment variable: TT_REPLICATION_THREADS" +msgstr "" + +msgid "" +"A time interval (in seconds) used by a master to send heartbeat requests to " +"a replica when there are no updates to send to this replica. For each " +"request, a replica should return a heartbeat acknowledgment." +msgstr "" + +msgid "" +"If a master or replica gets no heartbeat message for ``4 * " +"replication.timeout`` seconds, a connection is dropped and a replica tries " +"to reconnect to the master." +msgstr "" + +msgid "See also: :ref:`Monitoring a replica set `." +msgstr "" + +msgid "Environment variable: TT_REPLICATION_TIMEOUT" +msgstr "" diff --git a/locale/ru/LC_MESSAGES/reference/configuration/index.po b/locale/ru/LC_MESSAGES/reference/configuration/index.po index 4a77855928..0b062345ec 100644 --- a/locale/ru/LC_MESSAGES/reference/configuration/index.po +++ b/locale/ru/LC_MESSAGES/reference/configuration/index.po @@ -1,285 +1,18 @@ -msgid "Configuration reference" +#, fuzzy +msgid "Configuration reference (box.cfg)" msgstr "Справочник по настройке" msgid "" -"This reference covers all options and parameters which can be set for " -"Tarantool on the command line or in an :ref:`initialization file `." +"Starting with the 3.0 version, the recommended way of configuring Tarantool " +"is using a :ref:`configuration file `. Configuring " +"Tarantool in code is considered a legacy approach." msgstr "" -"В данном справочнике рассматриваются все опции и параметры, которые можно " -"использовать в командной строке или в :ref:`файле инициализации `." - -msgid "Tarantool is started by entering either of the following command:" -msgstr "Tarantool можно запустить путем ввода одной из следующих команд:" - -msgid "" -"$ **tarantool**\n" -"\n" -"$ **tarantool** *options*\n" -"\n" -"$ **tarantool** *lua-initialization-file* **[** *arguments* **]**" -msgstr "" -"$ **tarantool**\n" -"\n" -"$ **tarantool** *options*\n" -"\n" -"$ **tarantool** *lua-initialization-file* **[** *arguments* **]**" - -msgid "Command options" -msgstr "Опции командной строки" - -msgid "Print an annotated list of all available options and exit." -msgstr "Вывод аннотированного списка всех доступных опций и выход." - -msgid "Print product name and version, for example:" -msgstr "Вывод названия и версии продукта, например:" - -msgid "" -"$ ./tarantool --version\n" -"Tarantool 2.6.2-0-g34d504d\n" -"Target: Darwin-x86_64-Release\n" -"..." -msgstr "" - -msgid "In this example:" -msgstr "В данном примере:" - -msgid "" -"“Tarantool” is the name of the reusable asynchronous networking programming " -"framework." -msgstr "" -"“Tarantool” -- это название многократно используемого асинхронного сетевого " -"фреймворка." - -msgid "" -":ref:`The 3-number version ` follows the standard ``--`` " -"scheme, in which ```` number is changed only rarely, ```` is " -"incremented for each new milestone and indicates possible incompatible " -"changes, and ```` stands for the number of bug fix releases made " -"after the start of the milestone. For non-released versions only, there may " -"be a commit number and commit SHA1 to indicate how much this particular " -"build has diverged from the last release." -msgstr "" -":ref:`Версия из 3 чисел ` создается по стандартной схеме " -"``<мажорная>-<минорная>-<патч-версия>``, где ``<мажорная>`` версия " -"изменяется редко, ``<минорная>`` последовательно увеличивается с каждым " -"новым выпущенным стабильным релизом и указывает на возможные несовместимые " -"изменения, а ``<патч-версия>`` означает количество версий с исправленными " -"ошибками с момента выхода стабильного релиза. Еще не вышедшие версии могут " -"также содержать номер коммита и коммит SHA1, чтобы показать, насколько " -"данная сборка отходит от последнего релиза." - -msgid "" -"“Target” is the platform tarantool was built on. Some platform-specific " -"details may follow this line." -msgstr "" -"“Target” -- это платформа, на которой собран Tarantool. Некоторые " -"платформенно-зависимые детали могут следовать за этой строкой." - -msgid "" -"Tarantool uses `git describe " -"`_ to " -"produce its version id, and this id can be used at any time to check out the" -" corresponding source from our `git repository " -"`_." -msgstr "" -"При выставлении номера версии Tarantool применяется `git describe " -"`_, и " -"этот номер версии можно в любое время использовать для проверки " -"соответствующего исходного кода в `репозитории git " -"`_." - -msgid "URI" -msgstr "Унифицированный идентификатор ресурса (URI)" - -msgid "" -"Some configuration parameters and some functions depend on a URI, or " -"\"Universal Resource Identifier\". The URI string format is similar to the " -"`generic syntax for a URI schema " -"`_. So it may contain (in" -" order) a user name for login, a password, a host name or host IP address, " -"and a port number. Only the port number is always mandatory. The password is" -" mandatory if the user name is specified, unless the user name is 'guest'. " -"So, formally, the URI syntax is ``[host:]port`` or " -"``[username:password@]host:port``. If host is omitted, then '0.0.0.0' or " -"'[::]' is assumed, meaning respectively any IPv4 address or any IPv6 " -"address, on the local machine. If username:password is omitted, then 'guest'" -" is assumed. Some examples:" -msgstr "" - -msgid "URI fragment" -msgstr "Фрагмент URI" - -msgid "Example" -msgstr "Пример" - -msgid "port" -msgstr "порт" - -msgid "3301" -msgstr "3301" - -msgid "host:port" -msgstr "хост:порт" - -msgid "127.0.0.1:3301" -msgstr "127.0.0.1:3301" - -msgid "username:password@host:port" -msgstr "имя-пользователя:пароль@хост:порт" - -msgid "notguest:sesame@mail.ru:3301" -msgstr "notguest:sesame@mail.ru:3301" - -msgid "" -"In certain circumstances a Unix domain socket may be used where a URI is " -"expected, for example \"unix/:/tmp/unix_domain_socket.sock\" or simply " -"\"/tmp/unix_domain_socket.sock\"." -msgstr "" -"В определенных обстоятельствах можно использовать доменный сокет Unix, когда" -" ожидается URI, например, ``unix/:/tmp/unix_domain_socket.sock`` или просто " -"``/tmp/unix_domain_socket.sock``." - -msgid "" -"A method for parsing URIs is illustrated in :ref:`Module uri `." -msgstr "" -"Метод разбора URI проиллюстрирован в справочнике по :ref:`модулю uri `." - -msgid "Initialization file" -msgstr "Файл инициализации" - -msgid "" -"If the command to start Tarantool includes :codeitalic:`lua-initialization-" -"file`, then Tarantool begins by invoking the Lua program in the file, which " -"by convention may have the name \"``script.lua``\". The Lua program may get " -"further arguments from the command line or may use operating-system " -"functions, such as ``getenv()``. The Lua program almost always begins by " -"invoking ``box.cfg()``, if the database server will be used or if ports need" -" to be opened. For example, suppose ``script.lua`` contains the lines" -msgstr "" -"Если команда запуска Tarantool включает в себя :codeitalic:`файл " -"инициализации`, то Tarantool запустится посредством вызова Lua-программы из " -"этого файла, который обычно называется \"``script.lua``\". В Lua-программу " -"можно добавить дополнительные аргументы из командной строки или функции " -"операционной системы, такие как ``getenv()``. Lua-программа практически " -"всегда запускается посредством вызова ``box.cfg()``, если будет " -"использоваться сервер базы данных или же необходимо открыть порты. Например," -" предположим, что файл ``script.lua`` содержит строки:" - -msgid "" -"#!/usr/bin/env tarantool\n" -"box.cfg{\n" -" listen = os.getenv(\"LISTEN_URI\"),\n" -" memtx_memory = 100000,\n" -" pid_file = \"tarantool.pid\",\n" -" wal_max_size = 2500\n" -"}\n" -"print('Starting ', arg[1])" -msgstr "" -"#!/usr/bin/env tarantool\n" -"box.cfg{\n" -" listen = os.getenv(\"LISTEN_URI\"),\n" -" memtx_memory = 100000,\n" -" pid_file = \"tarantool.pid\",\n" -" wal_max_size = 2500\n" -"}\n" -"print('Starting ', arg[1])" - -msgid "" -"and suppose the environment variable LISTEN_URI contains 3301, and suppose " -"the command line is ``~/tarantool/src/tarantool script.lua ARG``. Then the " -"screen might look like this:" -msgstr "" -"и предположим, что переменная окружения LISTEN_URI содержит значение 3301, а" -" также предположим, что в командной строке ``~/tarantool/src/tarantool " -"script.lua ARG``. Тогда вывод на экране может выглядеть следующим образом:" - -msgid "" -"$ export LISTEN_URI=3301\n" -"$ ~/tarantool/src/tarantool script.lua ARG\n" -"... main/101/script.lua C> version 1.7.0-1216-g73f7154\n" -"... main/101/script.lua C> log level 5\n" -"... main/101/script.lua I> mapping 107374184 bytes for a shared arena...\n" -"... main/101/script.lua I> recovery start\n" -"... main/101/script.lua I> recovering from './00000000000000000000.snap'\n" -"... main/101/script.lua I> primary: bound to 0.0.0.0:3301\n" -"... main/102/leave_local_hot_standby I> ready to accept requests\n" -"Starting ARG\n" -"... main C> entering the event loop" -msgstr "" -"$ export LISTEN_URI=3301\n" -"$ ~/tarantool/src/tarantool script.lua ARG\n" -"... main/101/script.lua C> version 1.7.0-1216-g73f7154\n" -"... main/101/script.lua C> log level 5\n" -"... main/101/script.lua I> mapping 107374184 bytes for a shared arena...... main/101/script.lua I> recovery start\n" -"... main/101/script.lua I> recovering from './00000000000000000000.snap'... main/101/script.lua I> primary: bound to 0.0.0.0:3301\n" -"... main/102/leave_local_hot_standby I> ready to accept requests\n" -"Starting ARG\n" -"... main C> entering the event loop" - -msgid "" -"If you wish to start an interactive session on the same terminal after " -"initialization is complete, you can use :ref:`console.start() `." -msgstr "" -"Если необходимо начать интерактивную сессию на том же терминале по окончании" -" инициализации, можно использовать :ref:`console.start() `." - -msgid "Configuration parameters" -msgstr "Конфигурационные параметры" - -msgid "Configuration parameters have the form:" -msgstr "Конфигурационные параметры выглядят так:" - -msgid "" -":extsamp:`{**{box.cfg}**}{[{*{key = value}*} [, {*{key = value ...}*}]]}`" -msgstr "" -":extsamp:`{**{box.cfg}**}{[{*{ключ = значение}*} [, {*{ключ = значение " -"...}*}]]}`" - -msgid "" -"Since ``box.cfg`` may contain many configuration parameters and since some " -"of the parameters (such as directory addresses) are semi-permanent, it's " -"best to keep ``box.cfg`` in a Lua file. Typically this Lua file is the " -"initialization file which is specified on the tarantool command line." -msgstr "" -"Поскольку в ``box.cfg`` может быть множество конфигурационных параметров, а " -"некоторые параметры (такие как адреса директорий) являются полупостоянными, " -"лучше всего хранить ``box.cfg`` в Lua-файле. Как правило, такой Lua-файл " -"представляет собой файл инициализации, который указан в командной строке " -"Tarantool." - -msgid "" -"Most configuration parameters are for allocating resources, opening ports, " -"and specifying database behavior. All parameters are optional. A few " -"parameters are dynamic, that is, they can be changed at runtime by calling " -"``box.cfg{}`` a second time." -msgstr "" -"Большинство конфигурационных параметров предназначены для распределения " -"ресурсов, открытия портом и указания поведения базы данных. Все параметры " -"необязательны. Некоторые параметры динамичны, то есть могут изменяться во " -"время исполнения кода посредством повторного вызова ``box.cfg{}``." - -msgid "" -"To see all the non-null parameters, say ``box.cfg`` (no parentheses). To see" -" a particular parameter, for example the listen address, say " -"``box.cfg.listen``." -msgstr "" -"Чтобы увидеть все ненулевые параметры, выполните ``box.cfg`` (без круглых " -"скобок). Чтобы увидеть определенный параметр, например, адрес для " -"прослушивания, выполните команду ``box.cfg.listen``." msgid "" -"The following sections describe all parameters for basic operation, for " -"storage, for binary logging and snapshots, for replication, for networking, " -"for logging, and for feedback." +"This topic describes all configuration parameters that can be specified " +":ref:`in code ` using the ``box.cfg`` API." msgstr "" -"В последующих разделах описаны все параметры для основных возможностей, для " -"хранения, для записи в бинарный журнал и создания снимков, для репликации, " -"для работы по сети, для журналирования и для обратной связи." msgid "Basic parameters" msgstr "Базовые параметры" @@ -344,6 +77,9 @@ msgstr "Тип: логический" msgid "Default: false" msgstr "По умолчанию: false (ложь)" +msgid "Environment variable: TT_BACKGROUND" +msgstr "" + msgid "Dynamic: no" msgstr "Динамический: нет" @@ -388,16 +124,22 @@ msgstr "Тип: строка" msgid "Default: null" msgstr "По умолчанию: null" +msgid "Environment variable: TT_CUSTOM_PROC_TITLE" +msgstr "" + msgid "Dynamic: yes" msgstr "Динамический: да" +msgid "Since version 1.6.4." +msgstr "" + +#, fuzzy msgid "" -"Since version 1.6.4. The read/write data port number or :ref:`URI ` (Universal Resource Identifier) string. Has no default value, so " -"**must be specified** if connections will occur from remote clients that do " -"not use the :ref:`“admin port” `. Connections made with " -":samp:`listen = {URI}` are called \"binary port\" or \"binary protocol\" " -"connections." +"The read/write data port number or :ref:`URI ` (Universal " +"Resource Identifier) string. Has no default value, so **must be specified** " +"if connections occur from the remote clients that don't use the " +":ref:`\"admin port\" `. Connections made with :samp:`listen " +"= {URI}` are called \"binary port\" or \"binary protocol\" connections." msgstr "" "Для версий от 1.6.4. и выше. Номер порта для чтения/записи данных или строка" " :ref:`URI ` (унифицированный идентификатор ресурса). Значение, " @@ -410,6 +152,12 @@ msgstr "" msgid "A typical value is 3301." msgstr "Как правило, используется значение 3301." +msgid "" +"box.cfg { listen = 3301 }\n" +"\n" +"box.cfg { listen = \"127.0.0.1:3301\" }" +msgstr "" + msgid "" "A replica also binds to this port, and accepts connections, but these " "connections can only serve reads until the replica becomes a master." @@ -418,9 +166,17 @@ msgstr "" "соединения служат только для чтения до тех пор, пока реплика не станет " "мастером." +msgid "" +"Starting from version 2.10.0, you can specify :ref:`several URIs `, and the port number is always stored as an integer value." +msgstr "" + msgid "Type: integer or string" msgstr "Тип: целое число или строка" +msgid "Environment variable: TT_LISTEN" +msgstr "" + msgid "" "Since version 1.7.4. A directory where memtx stores snapshot (.snap) files. " "Can be relative to :ref:`work_dir `. If not specified, " @@ -434,6 +190,9 @@ msgstr "" msgid "Default: \".\"" msgstr "По умолчанию: \".\"" +msgid "Environment variable: TT_MEMTX_DIR" +msgstr "" + msgid "" "Since version 1.4.9. Store the process id in this file. Can be relative to " ":ref:`work_dir `. A typical value is " @@ -443,6 +202,9 @@ msgstr "" "файле. Может относиться к :ref:`work_dir `. Как правило," " используется значение “:file:`tarantool.pid`”." +msgid "Environment variable: TT_PID_FILE" +msgstr "" + msgid "" "Since version 1.7.1. Say ``box.cfg{read_only=true...}`` to put the server " "instance in read-only mode. After this, any requests that try to change " @@ -465,9 +227,13 @@ msgstr "" " `, запись диагностической информации в :ref:`модуле log " "` все равно осуществляется." +msgid "Environment variable: TT_READ_ONLY" +msgstr "" + +#, fuzzy msgid "" "Setting ``read_only == true`` affects spaces differently depending on the " -":ref:`options ` that were used during " +":ref:`options ` that were used during " ":doc:`box.schema.space.create " "`, as summarized by this " "chart:" @@ -523,6 +289,9 @@ msgstr "Тип: число" msgid "Default: 5242880" msgstr "По умолчанию: 5242880" +msgid "Environment variable: TT_SQL_CACHE_SIZE" +msgstr "" + msgid "" "Since version 1.7.1. A directory where vinyl files or subdirectories will be" " stored. Can be relative to :ref:`work_dir `. If not " @@ -532,6 +301,9 @@ msgstr "" "поддиректории vinyl'а. Может относиться к :ref:`work_dir `. Если не указан, по умолчанию ``work_dir``." +msgid "Environment variable: TT_VINYL_DIR" +msgstr "" + msgid "" "Since version 1.7.5. The vinyl storage engine has a scheduler which does " "compaction. When vinyl is low on available memory, the compaction scheduler " @@ -556,11 +328,17 @@ msgstr "Тип: число с плавающей запятой" msgid "Default: 60" msgstr "По умолчанию: 60" +msgid "Environment variable: TT_VINYL_TIMEOUT" +msgstr "" + msgid "Since version 1.4.9. UNIX user name to switch to after start." msgstr "" "Для версий от 1.4.9. и выше. Имя пользователя в UNIX, на которое " "переключается система после запуска." +msgid "Environment variable: TT_USERNAME" +msgstr "" + msgid "" "Since version 1.6.2. A directory where write-ahead log (.xlog) files are " "stored. Can be relative to :ref:`work_dir `. Sometimes " @@ -574,6 +352,9 @@ msgstr "" "указываются разные значения, чтобы WAL-файлы и файлы снимков хранились на " "разных дисках. Если не указан, по умолчанию ``work_dir``." +msgid "Environment variable: TT_WAL_DIR" +msgstr "" + msgid "" "Since version 1.4.9. A directory where database working files will be " "stored. The server instance switches to ``work_dir`` with " @@ -609,6 +390,9 @@ msgstr "" "``/home/user/A/C``, а все остальные файлы или поддиректории в " "``/home/user/A``." +msgid "Environment variable: TT_WORK_DIR" +msgstr "" + msgid "" "Since version 1.7.5. The maximum number of threads to use during execution " "of certain internal processes (currently :ref:`socket.getaddrinfo() `. Enables :ref:`transactional " -"manager ` if set to ``true``." +"manager ` if set to ``true``." +msgstr "" + +msgid "Environment variable: TT_MEMTX_USE_MVCC_ENGINE" msgstr "" msgid "Configuring the storage" @@ -657,9 +450,17 @@ msgstr ":ref:`memtx_max_tuple_size `" msgid ":ref:`memtx_min_tuple_size `" msgstr ":ref:`memtx_min_tuple_size `" +#, fuzzy +msgid ":ref:`memtx_allocator `" +msgstr ":ref:`slab_alloc_factor `" + msgid ":ref:`slab_alloc_factor `" msgstr ":ref:`slab_alloc_factor `" +#, fuzzy +msgid ":ref:`slab_alloc_granularity `" +msgstr ":ref:`slab_alloc_factor `" + msgid ":ref:`vinyl_bloom_fpr `" msgstr ":ref:`vinyl_bloom_fpr `" @@ -715,6 +516,12 @@ msgstr "" msgid "Default: 256 * 1024 * 1024 = 268435456 bytes" msgstr "По умолчанию: 256 * 1024 * 1024 = 268435456 байтов" +msgid "Minimum: 33554432 bytes (32 MB)" +msgstr "" + +msgid "Environment variable: TT_MEMTX_MEMORY" +msgstr "" + msgid "Dynamic: **yes** but it cannot be decreased" msgstr "Динамический: **да**, но нельзя уменьшить" @@ -732,6 +539,12 @@ msgstr "" msgid "Default: 1024 * 1024 = 1048576 bytes" msgstr "По умолчанию: 1024 * 1024 = 1048576 байтов" +msgid "Environment variable: TT_MEMTX_MAX_TUPLE_SIZE" +msgstr "" + +msgid "Dynamic: **yes**" +msgstr "Динамический: **да**" + msgid "" "Since version 1.7.4. Size of the smallest allocation unit. It can be " "decreased if most of the tuples are very small. The value must be between 8 " @@ -744,6 +557,37 @@ msgstr "" msgid "Default: 16 bytes" msgstr "По умолчанию: 16 байтов" +msgid "Environment variable: TT_MEMTX_MIN_TUPLE_SIZE" +msgstr "" + +msgid "" +"Since version :doc:`2.10.0 `. Specifies the allocator used " +"for memtx tuples. The possible values are ``system`` and ``small``:" +msgstr "" + +msgid "" +"``system`` is based on the ``malloc`` function. This allocator allocates " +"memory as needed, checking that the quota is not exceeded." +msgstr "" + +msgid "" +"``small`` is a special `slab allocator " +"`_. Note that this allocator is prone to" +" unresolvable fragmentation on specific workloads, so you can switch to " +"``system`` in such cases." +msgstr "" + +#, fuzzy +msgid "Default: 'small'" +msgstr "По умолчанию: null" + +msgid "Environment variable: TT_MEMTX_ALLOCATOR" +msgstr "" + +#, fuzzy +msgid "Dynamic: No" +msgstr "Динамический: нет" + msgid "" "The multiplier for computing the sizes of memory chunks that tuples are " "stored in. A lower value may result in less wasted memory depending on the " @@ -755,8 +599,47 @@ msgstr "" " от общего объема доступной памяти и распределения размеров элементов. " "Допустимые значения: от 1 до 2." -msgid "Default: 1.1" -msgstr "По умолчанию: 1.1" +#, fuzzy +msgid "" +"See also: :ref:`slab_alloc_granularity `" +msgstr ":ref:`slab_alloc_factor `" + +#, fuzzy +msgid "Default: 1.05" +msgstr "По умолчанию: 1.0" + +msgid "Environment variable: TT_SLAB_ALLOC_FACTOR" +msgstr "" + +msgid "" +"Since version :doc:`2.8.1 `. Specifies the granularity (in " +"bytes) of memory allocation in the :ref:`small allocator `. The value of ``slab_alloc_granularity`` should be a power" +" of two and should be greater than or equal to 4. Below are few " +"recommendations on how to adjust the ``slab_alloc_granularity`` value:" +msgstr "" + +msgid "" +"To store small tuples of approximately the same size, set " +"``slab_alloc_granularity`` to 4 bytes to save memory." +msgstr "" + +msgid "" +"To store tuples of different sizes, you can increase the " +"``slab_alloc_granularity`` value. This results in allocating tuples from the" +" same ``mempool``." +msgstr "" + +#, fuzzy +msgid "See also: :ref:`slab_alloc_factor `" +msgstr ":ref:`slab_alloc_factor `" + +#, fuzzy +msgid "Default: 8 bytes" +msgstr "По умолчанию: 16 байтов" + +msgid "Environment variable: TT_SLAB_ALLOC_GRANULARITY" +msgstr "" msgid "" "Since version 1.7.4. Bloom filter false positive rate -- the suitable " @@ -776,6 +659,9 @@ msgstr "" msgid "Default: 0.05" msgstr "По умолчанию: 0.05" +msgid "Environment variable: TT_VINYL_BLOOM_FPR" +msgstr "" + msgid "" "Since version 1.7.4. The cache size for the vinyl storage engine. The cache " "can be resized dynamically." @@ -786,8 +672,8 @@ msgstr "" msgid "Default: 128 * 1024 * 1024 = 134217728 bytes" msgstr "По умолчанию: 128 * 1024 * 1024 = 134217728 байтов" -msgid "Dynamic: **yes**" -msgstr "Динамический: **да**" +msgid "Environment variable: TT_VINYL_CACHE" +msgstr "" msgid "" "Since version 1.7.5. Size of the largest allocation unit, for the vinyl " @@ -800,12 +686,18 @@ msgstr "" "хранении больших кортежей. См. также :ref:`memtx_max_tuple_size " "`." +msgid "Environment variable: TT_VINYL_MAX_TUPLE_SIZE" +msgstr "" + msgid "" "Since version 1.7.4. The maximum number of in-memory bytes that vinyl uses." msgstr "" "Для версий от 1.7.4. и выше. Максимальное количество байтов оперативной " "памяти, которые использует vinyl." +msgid "Environment variable: TT_VINYL_MEMORY" +msgstr "" + msgid "" "Since version 1.7.4. Page size. Page is a read/write unit for vinyl disk " "operations. The ``vinyl_page_size`` setting is a default value for one of " @@ -821,13 +713,16 @@ msgstr "" msgid "Default: 8 * 1024 = 8192 bytes" msgstr "По умолчанию: 8 * 1024 = 8192 байтов" +msgid "Environment variable: TT_VINYL_PAGE_SIZE" +msgstr "" + msgid "" -"Since version 1.7.4. The default maximum range size for a vinyl index, in bytes. The " -"maximum range size affects the decision whether to :ref:`split ` a range." +"Since version 1.7.4. The default maximum range size for a vinyl index, in " +"bytes. The maximum range size affects the decision whether to :ref:`split " +"` a range." msgstr "" -"Для версий от 1.7.4. и выше. Максимальный размер диапазона для индекса " -"vinyl в байтах. Максимальный размер диапазона влияет на принятие решения о " +"Для версий от 1.7.4. и выше. Максимальный размер диапазона для индекса vinyl" +" в байтах. Максимальный размер диапазона влияет на принятие решения о " ":ref:`разделении ` диапазона." msgid "" @@ -857,12 +752,15 @@ msgid "" "In Tarantool versions prior to 1.10.2, ``vinyl_range_size`` default value " "was 1073741824." msgstr "" -"До версии Tarantool 1.10.2 значение ``vinyl_range_size`` по умолчанию " -"было 1073741824." +"До версии Tarantool 1.10.2 значение ``vinyl_range_size`` по умолчанию было " +"1073741824." msgid "Default: nil" msgstr "По умолчанию: nil" +msgid "Environment variable: TT_VINYL_RANGE_SIZE" +msgstr "" + msgid "" "Since version 1.7.4. The maximal number of runs per level in vinyl LSM tree." " If this number is exceeded, a new level is created. The " @@ -879,6 +777,9 @@ msgstr "" msgid "Default: 2" msgstr "По умолчанию: 2" +msgid "Environment variable: TT_VINYL_RUN_COUNT_PER_LEVEL" +msgstr "" + msgid "" "Since version 1.7.4. Ratio between the sizes of different levels in the LSM " "tree. The ``vinyl_run_size_ratio`` setting is a default value for one of the" @@ -894,6 +795,9 @@ msgstr "" msgid "Default: 3.5" msgstr "По умолчанию: 3.5" +msgid "Environment variable: TT_VINYL_RUN_SIZE_RATIO" +msgstr "" + msgid "" "Since version 1.7.5. The maximum number of read threads that vinyl can use " "for some concurrent operations, such as I/O and compression." @@ -905,6 +809,9 @@ msgstr "" msgid "Default: 1" msgstr "По умолчанию: 1" +msgid "Environment variable: TT_VINYL_READ_THREADS" +msgstr "" + msgid "" "Since version 1.7.5. The maximum number of write threads that vinyl can use " "for some concurrent operations, such as I/O and compression." @@ -913,6 +820,9 @@ msgstr "" " vinyl может использовать в одновременных операциях, такие как ввод-вывод и " "компрессия." +msgid "Environment variable: TT_VINYL_WRITE_THREADS" +msgstr "" + msgid "Checkpoint daemon" msgstr "Демон создания контрольных точек" @@ -958,8 +868,8 @@ msgid "" "Lua objects, and distinct from a Tarantool garbage collector which " "specializes in :ref:`handling shard buckets `." msgstr "" -"Демон создания контрольных точек может запустить сборщик мусора Tarantool," -" который удаляет старые файлы. Такой сборщик мусора не отличается от " +"Демон создания контрольных точек может запустить сборщик мусора Tarantool, " +"который удаляет старые файлы. Такой сборщик мусора не отличается от " "`сборщика мусора в Lua `_, " "который предназначен для Lua-объектов, и от сборщика мусора, который " "специализируется на :ref:`обработке блоков шарда `." @@ -972,10 +882,10 @@ msgid "" "delete obsolete vinyl ``.run`` files." msgstr "" "Если демон создания контрольных точек удаляет старый файл снимка, сборщик " -"мусора Tarantool также удалит любые файлы :ref:`журнала упреждающей записи" -" (.xlog) ` старше файла снимка, содержащие информацию, " -"которая присутствует в файле снимка. Он также удаляет устаревшие файлы " -"``.run`` в vinyl'е." +"мусора Tarantool также удалит любые файлы :ref:`журнала упреждающей записи " +"(.xlog) ` старше файла снимка, содержащие информацию, которая" +" присутствует в файле снимка. Он также удаляет устаревшие файлы ``.run`` в " +"vinyl'е." msgid "" "The checkpoint daemon and the Tarantool garbage collector will not delete a " @@ -1050,6 +960,9 @@ msgstr "" msgid "Default: 3600 (one hour)" msgstr "По умолчанию: 3600 (один час)" +msgid "Environment variable: TT_CHECKPOINT_INTERVAL" +msgstr "" + msgid "" "Since version 1.7.4. The maximum number of snapshots that may exist on the " ":ref:`memtx_dir ` directory before the checkpoint " @@ -1092,8 +1005,8 @@ msgstr "" "выполняется репликация, и файл еще не был передан на реплику. Таким образом," " параметр ``checkpoint_count`` бесполезен, если какая-то реплика неактивна." -msgid "Default: 2" -msgstr "По умолчанию: 2" +msgid "Environment variable: TT_CHECKPOINT_COUNT" +msgstr "" msgid "" "Since version 2.1.2. The threshold for the total size in bytes of all WAL " @@ -1141,21 +1054,28 @@ msgid "" "Default: 10^18 (a large number so in effect there is no limit by default)" msgstr "По умолчанию: 10^18 (большое число: можно считать, что предела нет)" +msgid "Environment variable: TT_CHECKPOINT_WAL_THRESHOLD" +msgstr "" + msgid "Binary logging and snapshots" msgstr "Записи в бинарный журнал и создание снимков" -msgid ":ref:`force_recovery `," +#, fuzzy +msgid ":ref:`force_recovery `" msgstr ":ref:`force_recovery `," -msgid ":ref:`wal_max_size `," +#, fuzzy +msgid ":ref:`wal_max_size `" msgstr ":ref:`wal_max_size `," +#, fuzzy msgid "" -":ref:`snap_io_rate_limit `," +":ref:`snap_io_rate_limit `" msgstr "" ":ref:`snap_io_rate_limit `," -msgid ":ref:`wal_mode `," +#, fuzzy +msgid ":ref:`wal_mode `" msgstr ":ref:`wal_mode `," msgid "" @@ -1165,6 +1085,18 @@ msgstr "" ":ref:`wal_dir_rescan_delay `" +#, fuzzy +msgid "" +":ref:`wal_queue_max_size `" +msgstr ":ref:`wal_max_size `," + +#, fuzzy +msgid "" +":ref:`wal_cleanup_delay `" +msgstr "" +":ref:`wal_dir_rescan_delay `" + msgid "" "Since version 1.7.4. If ``force_recovery`` equals true, Tarantool tries to " "continue if there is an error while reading a :ref:`snapshot file` on INSERT/UPDATE/DELETE performance" @@ -1225,15 +1163,20 @@ msgstr "" "` относительно скорости записи " "дампов в файлы формата .run и .index." +msgid "Environment variable: TT_SNAP_IO_RATE_LIMIT" +msgstr "" + msgid "Since version 1.6.2. Specify fiber-WAL-disk synchronization mode as:" msgstr "" "Для версий от 1.6.2. и выше. Определение синхронизации работы файбера с " "журналом упреждающей записи:" -msgid "``none``: write-ahead log is not maintained." -" A node with ``wal_mode = none`` can't be replication master;" -msgstr "``none``: журнал упреждающей записи не поддерживается. " -"Узел с ``wal_mode = none`` при репликации не может быть мастером;" +msgid "" +"``none``: write-ahead log is not maintained. A node with ``wal_mode = none``" +" can't be replication master;" +msgstr "" +"``none``: журнал упреждающей записи не поддерживается. Узел с ``wal_mode = " +"none`` при репликации не может быть мастером;" msgid "" "``write``: :ref:`fibers ` wait for their data to be written to" @@ -1252,6 +1195,9 @@ msgstr "" msgid "Default: \"write\"" msgstr "По умолчанию: \"write\"" +msgid "Environment variable: TT_WAL_MODE" +msgstr "" + msgid "" "Since version 1.6.2. Number of seconds between periodic scans of the write-" "ahead-log file directory, when checking for changes to write-ahead-log files" @@ -1263,6 +1209,59 @@ msgstr "" "целей :ref:`репликации ` или :ref:`горячего резервирования " "`." +msgid "Environment variable: TT_WAL_DIR_RESCAN_DELAY" +msgstr "" + +msgid "" +"Since version :doc:`2.8.1 `. The size of the queue (in " +"bytes) used by a :ref:`replica ` to submit new " +"transactions to a :ref:`write-ahead log` (WAL). This option " +"helps limit the rate at which a replica submits transactions to the WAL. " +"Limiting the queue size might be useful when a replica is trying to sync " +"with a master and reads new transactions faster than writing them to the " +"WAL." +msgstr "" + +msgid "" +"You might consider increasing the ``wal_queue_max_size`` value in case of " +"large tuples (approximately one megabyte or larger)." +msgstr "" + +#, fuzzy +msgid "Default: 16777216 bytes" +msgstr "По умолчанию: 16 байтов" + +msgid "Environment variable: TT_WAL_QUEUE_MAX_SIZE" +msgstr "" + +msgid "" +"Since version :doc:`2.6.3 `. The delay (in seconds) used to " +"prevent the :ref:`Tarantool garbage collector ` from immediately removing :ref:`write-ahead " +"log` files after a node restart. This delay eliminates " +"possible erroneous situations when the master deletes WALs needed by " +":ref:`replicas ` after restart. As a consequence, " +"replicas sync with the master faster after its restart and don't need to " +"download all the data again." +msgstr "" + +msgid "" +"Once all the nodes in the replica set are up and running, automatic cleanup " +"is started again even if ``wal_cleanup_delay`` has not expired." +msgstr "" + +msgid "" +"The ``wal_cleanup_delay`` option has no effect on nodes running as " +":ref:`anonymous replicas`." +msgstr "" + +#, fuzzy +msgid "Default: 14400 seconds" +msgstr "По умолчанию: 16 байтов" + +msgid "Environment variable: TT_WAL_CLEANUP_DELAY" +msgstr "" + msgid "Hot standby" msgstr "Горячее резервирование" @@ -1369,6 +1368,9 @@ msgstr "" "`; работает с движком " "memtx ``engine = 'memtx'``." +msgid "Environment variable: TT_HOT_STANDBY" +msgstr "" + msgid "Replication" msgstr "Репликация" @@ -1378,6 +1380,10 @@ msgstr ":ref:`replication `" msgid ":ref:`replication_anon `" msgstr ":ref:`replication_anon `" +#, fuzzy +msgid ":ref:`bootstrap_strategy `" +msgstr ":ref:`replication `" + msgid "" ":ref:`replication_connect_timeout `" @@ -1428,12 +1434,22 @@ msgstr "" ":ref:`replication_synchro_timeout `" +#, fuzzy +msgid "" +":ref:`replication_threads `" +msgstr ":ref:`replication_anon `" + msgid ":ref:`election_mode `" msgstr "" msgid ":ref:`election_timeout `" msgstr "" +#, fuzzy +msgid ":ref:`election_fencing_mode `" +msgstr "" +":ref:`replication_sync_timeout `" + msgid "" "Since version 1.7.4. If ``replication`` is not an empty string, the instance" " is considered to be a Tarantool :ref:`replica `. The replica " @@ -1459,12 +1475,17 @@ msgstr "" msgid ":extsamp:`box.cfg{ replication = { {*{'uri1'}*}, {*{'uri2'}*} } }`" msgstr ":extsamp:`box.cfg{ replication = { {*{'uri1'}*}, {*{'uri2'}*} } }`" +msgid "" +"Starting from version 2.10.0, there is a number of other ways for specifying" +" several URIs. See :ref:`syntax examples `." +msgstr "" + +#, fuzzy msgid "" "If one of the URIs is \"self\" -- that is, if one of the URIs is for the " -"instance where ``box.cfg{}`` is being executed on -- then it is ignored. " -"Thus it is possible to use the same ``replication`` specification on " -"multiple server instances, as shown in :ref:`these examples `." +"instance where ``box.cfg{}`` is being executed -- then it is ignored. Thus, " +"it is possible to use the same ``replication`` specification on multiple " +"server instances, as shown in :ref:`these examples `." msgstr "" "Если один из URI \"свой\" -- то есть один URI принадлежит экземпляру, где " "выполняется ``box.cfg{}`` -- он не принимается во внимание. Таким образом, " @@ -1493,7 +1514,10 @@ msgstr "" msgid ":extsamp:`box.cfg{ replication = {*{new-value}*} }`" msgstr ":extsamp:`box.cfg{ replication = {*{новое-значение}*} }`" -msgid "" +msgid "Environment variable: TT_REPLICATION" +msgstr "" + +msgid "" "Since version 2.3.1. A Tarantool replica can be anonymous. This type of " "replica is read-only (but you still can write to temporary and replica-local" " spaces), and it isn't present in the ``_cluster`` table." @@ -1689,6 +1713,41 @@ msgstr "" "какого-то экземпляра, открытого на запись, иначе он не может быть добавлен в" " таблицу ``_cluster``." +msgid "Environment variable: TT_REPLICATION_ANON" +msgstr "" + +msgid "Since :doc:`2.11.0 `." +msgstr "" + +msgid "" +"Specifies a strategy used to bootstrap a :ref:`replica set `. The following strategies are available:" +msgstr "" + +msgid "" +"``auto``: a node doesn't boot if a half or more of other nodes in a replica " +"set are not connected. For example, if the :ref:`replication " +"` parameter contains 2 or 3 nodes, a node " +"requires 2 connected instances. In the case of 4 or 5 nodes, at least 3 " +"connected instances are required. Moreover, a bootstrap leader fails to boot" +" unless every connected node has chosen it as a bootstrap leader." +msgstr "" + +msgid "" +"``legacy`` (deprecated since :doc:`2.11.0 `): a node " +"requires the :ref:`replication_connect_quorum ` number of other nodes to be connected. This " +"option is added to keep the compatibility with the current versions of " +"Cartridge and might be removed in the future." +msgstr "" + +#, fuzzy +msgid "Default: auto" +msgstr "По умолчанию: 5" + +msgid "Environment variable: TT_BOOTSTRAP_STRATEGY" +msgstr "" + msgid "" "Since version 1.9.0. The number of seconds that a replica will wait when " "trying to connect to a master in a cluster. See :ref:`orphan status " @@ -1707,29 +1766,22 @@ msgstr "" msgid "Default: 30" msgstr "По умолчанию: 30" -msgid "" -"Since version 1.9.0. By default a replica will try to connect to all the " -"masters, or it will not start. (The default is recommended so that all " -"replicas will receive the same replica set UUID.)" +msgid "Environment variable: TT_REPLICATION_CONNECT_TIMEOUT" msgstr "" -"Для версий от 1.9.0. и выше. По умолчанию, реплика попытается подключиться " -"ко всем мастерам или не запустится. (По умолчанию, рекомендуется, чтобы у " -"всех реплик был одинаковый UUID набора реплик)." msgid "" -"However, by specifying ``replication_connect_quorum = N``, where N is a " -"number greater than or equal to zero, users can state that the replica only " -"needs to connect to N masters." +"Deprecated since :doc:`2.11.0 `. This option is in effect " +"if :ref:`bootstrap_strategy ` is set to " +"``legacy``." msgstr "" -"Однако, если указать ``replication_connect_quorum = N``, где N означает " -"число больше или равное нулю, это будет означать, что реплике нужно " -"подключиться к N количеству мастеров." +#, fuzzy msgid "" -"This parameter has effect during bootstrap and during :ref:`configuration " -"update `. Setting " -"``replication_connect_quorum = 0`` makes Tarantool require no immediate " -"reconnect only in case of recovery. See :ref:`orphan status ` or " +":ref:`configuration update `. Setting " +"``replication_connect_quorum`` to ``0`` makes Tarantool require no immediate" +" reconnect only in case of recovery. See :ref:`Orphan status ` for details." msgstr "" "Данный параметр используется во время настройки и :ref:`обновления " @@ -1741,7 +1793,12 @@ msgstr "" msgid "Example:" msgstr "Пример:" -msgid "box.cfg{replication_connect_quorum=2}" +#, fuzzy +msgid "box.cfg { replication_connect_quorum = 2 }" +msgstr "box.cfg{replication_connect_quorum=2}" + +#, fuzzy +msgid "Environment variable: TT_REPLICATION_CONNECT_QUORUM" msgstr "box.cfg{replication_connect_quorum=2}" msgid "" @@ -1766,6 +1823,9 @@ msgstr "" msgid "box.cfg{replication_skip_conflict=true}" msgstr "box.cfg{replication_skip_conflict=true}" +msgid "Environment variable: TT_REPLICATION_SKIP_CONFLICT" +msgstr "" + msgid "" "``replication_skip_conflict = true`` is recommended to be used only for " "manual replication recovery." @@ -1814,13 +1874,17 @@ msgstr "" msgid "Default: 10" msgstr "По умолчанию: 10" +msgid "Environment variable: TT_REPLICATION_SYNC_LAG" +msgstr "" + +#, fuzzy msgid "" -"Since version 1.10.2. The number of seconds that a replica will wait when " -"trying to sync with a master in a cluster, or a :ref:`quorum " -"` of masters, after connecting " -"or during :ref:`configuration update `. " -"This could fail indefinitely if ``replication_sync_lag`` is smaller than " -"network latency, or if the replica cannot keep pace with master updates. If " +"Since version 1.10.2. The number of seconds that a node waits when trying to" +" sync with other nodes in a replica set (see :ref:`bootstrap_strategy " +"`), after connecting or during " +":ref:`configuration update `. This could " +"fail indefinitely if ``replication_sync_lag`` is smaller than network " +"latency, or if the replica cannot keep pace with master updates. If " "``replication_sync_timeout`` expires, the replica enters :ref:`orphan status" " `." msgstr "" @@ -1836,6 +1900,17 @@ msgstr "" msgid "Default: 300" msgstr "По умолчанию: 300" +msgid "Environment variable: TT_REPLICATION_SYNC_TIMEOUT" +msgstr "" + +msgid "" +"The default ``replication_sync_timeout`` value is going to be changed in " +"future versions from ``300`` to ``0``. You can learn the reasoning behind " +"this decision from the :ref:`Default value for replication_sync_timeout " +"` topic, which also describes how to try " +"the new behavior in the current version." +msgstr "" + msgid "" "Since version 1.7.5. If the master has no updates to send to the replicas, " "it sends heartbeat messages every ``replication_timeout`` seconds, and each " @@ -1860,8 +1935,8 @@ msgstr "" "См. дополнительную информацию в разделе :ref:`Мониторинг набора реплик " "`." -msgid "Default: 1" -msgstr "По умолчанию: 1" +msgid "Environment variable: TT_REPLICATION_TIMEOUT" +msgstr "" msgid "" "Since version 1.9.0. As described in section :ref:`\"Replication " @@ -1941,6 +2016,9 @@ msgstr "" msgid "box.cfg{replicaset_uuid='7b853d13-508b-4b8e-82e6-806f088ea6e9'}" msgstr "box.cfg{replicaset_uuid='7b853d13-508b-4b8e-82e6-806f088ea6e9'}" +msgid "Environment variable: TT_REPLICASET_UUID" +msgstr "" + msgid "" "Since version 1.9.0. For replication administration purposes, it is possible" " to set the `universally unique identifiers " @@ -1964,17 +2042,52 @@ msgstr "" msgid "box.cfg{instance_uuid='037fec43-18a9-4e12-a684-a42b716fcd02'}" msgstr "box.cfg{instance_uuid='037fec43-18a9-4e12-a684-a42b716fcd02'}" +msgid "Environment variable: TT_INSTANCE_UUID" +msgstr "" + msgid "" "Since version :doc:`2.5.1 `. For :ref:`synchronous " "replication ` only. This option tells how many replicas should " "confirm the receipt of a synchronous transaction before it can finish its " -"commit. So far this option accounts all replicas, including anonymous." +"commit." msgstr "" msgid "" -"The default value for this parameter is ``N / 2 + 1``." +"Since version :doc:`2.5.3 `, the option supports dynamic " +"evaluation of the quorum number. That is, the number of quorum can be " +"specified not as a constant number, but as a function instead. In this case," +" the option returns the formula evaluated. The result is treated as an " +"integer number. Once any replicas are added or removed, the expression is " +"re-evaluated automatically." msgstr "" -"По умолчанию значение параметра равно ``N / 2 + 1``." + +#, fuzzy +msgid "For example," +msgstr "Пример:" + +#, fuzzy +msgid "box.cfg{replication_synchro_quorum = \"N / 2 + 1\"}" +msgstr "box.cfg{replication_connect_quorum=2}" + +msgid "Where `N` is a current number of registered replicas in a cluster." +msgstr "" + +#, python-format +msgid "" +"Keep in mind that the example above represents a canonical quorum " +"definition. The formula ``at least 50% of the cluster size + 1`` guarantees " +"data reliability. Using a value less than the canonical one might lead to " +"unexpected results, including a :ref:`split-brain " +"`." +msgstr "" + +msgid "" +"Since version :doc:`2.10.0 `, this option does not account " +"for anonymous replicas." +msgstr "" + +msgid "The default value for this parameter is ``N / 2 + 1``." +msgstr "По умолчанию значение параметра равно ``N / 2 + 1``." msgid "" "It is not used on replicas, so if the master dies, the pending synchronous " @@ -1986,12 +2099,21 @@ msgstr "" "выбран новый мастер." msgid "" -"If the value for this option is set to ``1``, the synchronous transactions work like asynchronous when " -"not configured. `1` means that successful WAL write to the master is enough to commit." +"If the value for this option is set to ``1``, the synchronous transactions " +"work like asynchronous when not configured. `1` means that successful WAL " +"write to the master is enough to commit." msgstr "" "Если значение параметра равно `1`, синхронные транзакции работают как " -"асинхронные, пока они не настроены. `1` означает, что для коммита достаточно " -"успешной записи в WAL на мастере." +"асинхронные, пока они не настроены. `1` означает, что для коммита достаточно" +" успешной записи в WAL на мастере." + +msgid "" +"Default: N / 2 + 1 (before version :doc:`2.10.0 `, the " +"default value was 1)" +msgstr "" + +msgid "Environment variable: TT_REPLICATION_SYNCHRO_QUORUM" +msgstr "" msgid "" "Since version :doc:`2.5.1 `. For :ref:`synchronous " @@ -2003,6 +2125,36 @@ msgstr "" msgid "Default: 5" msgstr "По умолчанию: 5" +msgid "Environment variable: TT_REPLICATION_SYNCHRO_TIMEOUT" +msgstr "" + +msgid "" +"Since version :doc:`2.10.0 `. The number of threads spawned" +" to decode the incoming replication data." +msgstr "" + +msgid "" +"The default value is `1`. It means that a single separate thread handles all" +" the incoming replication streams. In most cases, one thread is enough for " +"all incoming data. Therefore, it is likely that the user will not need to " +"set this configuration option." +msgstr "" + +msgid "" +"Possible values range from 1 to 1000. If there are multiple replication " +"threads, connections to serve are distributed evenly between the threads." +msgstr "" + +msgid "Possible values: from 1 to 1000" +msgstr "" + +msgid "Environment variable: TT_REPLICATION_THREADS" +msgstr "" + +#, fuzzy +msgid "Dynamic: **no**" +msgstr "Динамический: нет" + msgid "" "Since version :doc:`2.6.1 `. Specifies the role of a replica" " set node in the :ref:`leader election process `." @@ -2017,18 +2169,25 @@ msgstr "" msgid "voter" msgstr "" -msgid "candidate." +msgid "candidate" +msgstr "" + +msgid "manual." msgstr "" msgid "" "Participation of a replica set node in the automated leader election can be " -"turned on and off by this option. The default value is ``off``. All nodes " -"that have values other than ``off`` run the Raft state machine internally " -"talking to other nodes according to the Raft leader election protocol. When " -"the option is ``off``, the node accepts Raft messages from other nodes, but " -"it doesn't participate in the election activities, and this doesn't affect " -"the node's state. So, for example, if a node is not a leader but it has " -"``election_mode = 'off'``, it is writable anyway." +"turned on and off by this option." +msgstr "" + +msgid "" +"The default value is ``off``. All nodes that have values other than ``off`` " +"run the Raft state machine internally talking to other nodes according to " +"the Raft leader election protocol. When the option is ``off``, the node " +"accepts Raft messages from other nodes, but it doesn't participate in the " +"election activities, and this doesn't affect the node's state. So, for " +"example, if a node is not a leader but it has ``election_mode = 'off'``, it " +"is writable anyway." msgstr "" msgid "" @@ -2044,9 +2203,35 @@ msgid "" "'candidate'``." msgstr "" +msgid "" +"Since version :doc:`2.8.2 `, the manual election mode is " +"introduced. It may be used when a user wants to control which instance is " +"the leader explicitly instead of relying on the Raft election algorithm." +msgstr "" + +msgid "" +"When an instance is configured with the ``election_mode='manual'``, it " +"behaves as follows:" +msgstr "" + +msgid "" +"By default, the instance acts like a voter -- it is read-only and may vote " +"for other instances that are candidates." +msgstr "" + +msgid "" +"Once :ref:`box.ctl.promote() ` is called, the instance " +"becomes a candidate and starts a new election round. If the instance wins " +"the elections, it becomes a leader, but won't participate in any new " +"elections." +msgstr "" + msgid "Default: 'off'" msgstr "" +msgid "Environment variable: TT_ELECTION_MODE" +msgstr "" + msgid "" "Since version :doc:`2.6.1 `. Specifies the timeout between " "election rounds in the :ref:`leader election process ` if" @@ -2065,28 +2250,83 @@ msgid "" "``box.cfg{election_timeout = 0.3}``)." msgstr "" +#, python-format msgid "" "To avoid the split vote repeat, the timeout is randomized on each node " "during every new election, from 100% to 110% of the original timeout value. " "For example, if the timeout is 300 ms and there are 3 nodes started the " "election simultaneously in the same term, they can set their election " -"timeouts to 300, 310, 320 respectively, or to 305, 302, 324, and so on. In " -"that way, the votes will never be split because the election on different " -"nodes won't be restarted simultaneously." +"timeouts to 300, 310, and 320 respectively, or to 305, 302, and 324, and so " +"on. In that way, the votes will never be split because the election on " +"different nodes won't be restarted simultaneously." +msgstr "" + +msgid "Environment variable: TT_ELECTION_TIMEOUT" +msgstr "" + +msgid "" +"Since version :doc:`2.11.0 `. In earlier Tarantool " +"versions, use :ref:`election_fencing_enabled ` instead." +msgstr "" + +msgid "" +"Specifies the :ref:`leader fencing mode ` that " +"affects the leader election process. When the parameter is set to ``soft`` " +"or ``strict``, the leader resigns its leadership if it has less than " +":ref:`replication_synchro_quorum ` of alive connections to the cluster nodes. The " +"resigning leader receives the status of a :ref:`follower " +"` in the current election term and becomes read-only." +msgstr "" + +msgid "" +"In ``soft`` mode, a connection is considered dead if there are no responses " +"for :ref:`4*replication_timeout ` " +"seconds both on the current leader and the followers." +msgstr "" + +msgid "" +"In ``strict`` mode, a connection is considered dead if there are no " +"responses for :ref:`2*replication_timeout ` seconds on the current leader and " +":ref:`4*replication_timeout ` seconds " +"on the followers. This improves chances that there is only one leader at any" +" time." +msgstr "" + +msgid "" +"Fencing applies to the instances that have the :ref:`election_mode " +"` set to ``candidate`` or ``manual``. To turn" +" off :ref:`leader fencing `, set " +"``election_fencing_mode`` to ``off``." +msgstr "" + +#, fuzzy +msgid "Default: 'soft'" +msgstr "По умолчанию: 5" + +msgid "Environment variable: TT_ELECTION_FENCING_MODE" msgstr "" msgid "Networking" msgstr "Работа с сетями" -msgid ":ref:`io_collect_interval `," +#, fuzzy +msgid ":ref:`io_collect_interval `" msgstr ":ref:`io_collect_interval `," msgid ":ref:`net_msg_max `" msgstr ":ref:`net_msg_max `" -msgid ":ref:`readahead `," +#, fuzzy +msgid ":ref:`readahead `" msgstr ":ref:`readahead `," +#, fuzzy +msgid ":ref:`iproto_threads `" +msgstr ":ref:`worker_pool_threads `" + msgid "" "Since version 1.4.9. The instance will sleep for io_collect_interval seconds" " between iterations of the event loop. Can be used to reduce CPU load in " @@ -2100,6 +2340,9 @@ msgstr "" "количество клиентских соединений, но нечастыми запросами (например, каждое " "соединение передает лишь небольшое количество запросов в секунду)." +msgid "Environment variable: TT_IO_COLLECT_INTERVAL" +msgstr "" + msgid "" "Since version 1.10.1. To handle messages, Tarantool allocates fibers. To " "prevent fiber overhead from affecting the whole system, Tarantool restricts " @@ -2127,17 +2370,18 @@ msgstr "" "загрузку, хотя это и займет некоторое время, поскольку планировщик будет " "ожидать завершения уже запущенных запросов." +#, fuzzy msgid "" "When ``net_msg_max`` is reached, Tarantool suspends processing of incoming " "packages until it has processed earlier messages. This is not a direct " "restriction of the number of fibers that handle network messages, rather it " "is a system-wide restriction of channel bandwidth. This in turn causes " "restriction of the number of incoming network messages that the " -":ref:`transaction processor thread ` handles, " -"and therefore indirectly affects the fibers that handle network messages. " -"(The number of fibers is smaller than the number of messages because " -"messages can be released as soon as they are delivered, while incoming " -"requests might not be processed until some time after delivery.)" +":ref:`transaction processor thread ` handles, and therefore " +"indirectly affects the fibers that handle network messages. (The number of " +"fibers is smaller than the number of messages because messages can be " +"released as soon as they are delivered, while incoming requests might not be" +" processed until some time after delivery.)" msgstr "" "По достижении значения ``net_msg_max`` Tarantool приостанавливает обработку " "входящих пакетов до тех пор, пока не обработает ранее полученные сообщения. " @@ -2158,6 +2402,9 @@ msgstr "" msgid "Default: 768" msgstr "По умолчанию: 768" +msgid "Environment variable: TT_NET_MSG_MAX" +msgstr "" + msgid "" "Since version 1.6.2. The size of the read-ahead buffer associated with a " "client connection. The larger the buffer, the more memory an active " @@ -2182,21 +2429,34 @@ msgstr "" msgid "Default: 16320" msgstr "По умолчанию: 16320" +msgid "Environment variable: TT_READAHEAD" +msgstr "" + +#, python-format msgid "" "Since version :doc:`2.8.1 `. The number of :ref:`network " -"threads `. There can be unusual workloads " -"where the network thread is 100% loaded and the transaction processor thread" -" is not, so the network thread is a bottleneck. In that case set " -"``iproto_threads`` to 2 or more. The operating system kernel will determine " -"which connection goes to which thread." +"threads `. There can be unusual workloads where the network " +"thread is 100% loaded and the transaction processor thread is not, so the " +"network thread is a bottleneck. In that case set ``iproto_threads`` to 2 or " +"more. The operating system kernel will determine which connection goes to " +"which thread." msgstr "" msgid "On typical systems, the default value (1) is correct." msgstr "" +msgid "Environment variable: TT_IPROTO_THREADS" +msgstr "" + msgid "Logging" msgstr "Запись в журнал" +msgid "" +"This section provides information on how to configure options related to " +"logging. You can also use the :ref:`log module ` to configure " +"logging in your application." +msgstr "" + msgid ":ref:`log_level `" msgstr ":ref:`log_level `" @@ -2212,9 +2472,14 @@ msgstr ":ref:`too_long_threshold `" msgid ":ref:`log_format `" msgstr ":ref:`log_format `" +#, fuzzy +msgid ":ref:`log_modules `" +msgstr ":ref:`log_level `" + +#, fuzzy msgid "" -"Since version 1.6.2. What level of detail the :ref:`log ` will " -"have. There are seven levels:" +"Since version 1.6.2. Specifies the level of detail the :ref:`log ` has. There are seven levels:" msgstr "" "Для версий от 1.6.2. и выше. Уровень детализации записей :ref:`журнала " "`. Есть 7 уровней:" @@ -2240,41 +2505,56 @@ msgstr "6 – ``VERBOSE``" msgid "7 – ``DEBUG``" msgstr "7 – ``DEBUG``" +#, fuzzy msgid "" -"By setting log_level, one can enable logging of all classes below or equal " -"to the given level. Tarantool prints its logs to the standard error stream " -"by default, but this can be changed with the :ref:`log ` " -"configuration parameter." +"By setting ``log_level``, you can enable logging of all events with " +"severities above or equal to the given level. Tarantool prints logs to the " +"standard error stream by default. This can be changed with the :ref:`log " +"` configuration parameter." msgstr "" "Задав значение параметра log_level, можно включить запись в журнал всех " "событий заданного уровня или ниже. По умолчанию, Tarantool выводит записи в " "стандартный поток сообщений об ошибках, но это можно изменить с помощью " "конфигурационного параметра :ref:`log `." +msgid "Environment variable: TT_LOG_LEVEL" +msgstr "" + +#, fuzzy msgid "" -"Warning: prior to Tarantool 1.7.5 there were only six levels and ``DEBUG`` " -"was level 6. Starting with Tarantool 1.7.5 ``VERBOSE`` is level 6 and " -"``DEBUG`` is level 7. ``VERBOSE`` is a new level for monitoring repetitive " -"events which would cause too much log writing if ``INFO`` were used instead." +"Prior to Tarantool 1.7.5 there were only six levels and ``DEBUG`` was level " +"6. Starting with Tarantool 1.7.5, ``VERBOSE`` is level 6 and ``DEBUG`` is " +"level 7. ``VERBOSE`` is a new level for monitoring repetitive events which " +"would cause too much log writing if ``INFO`` were used instead." msgstr "" -"Внимание: до версии Tarantool 1.7.5 было только 6 уровней, из них шестым " -"был уровень ``DEBUG``. Начиная с версии Tarantool 1.7.5 ``VERBOSE`` " -"становится уровнем 6, а ``DEBUG`` -- уровнем 7. ``VERBOSE`` представляет " -"собой новый уровень для мониторинга повторяющихся событий, которые бы " -"привели к слишком большому количеству записей журнала при использовании " -"уровня ``INFO``." +"Внимание: до версии Tarantool 1.7.5 было только 6 уровней, из них шестым был" +" уровень ``DEBUG``. Начиная с версии Tarantool 1.7.5 ``VERBOSE`` становится " +"уровнем 6, а ``DEBUG`` -- уровнем 7. ``VERBOSE`` представляет собой новый " +"уровень для мониторинга повторяющихся событий, которые бы привели к слишком " +"большому количеству записей журнала при использовании уровня ``INFO``." +#, fuzzy msgid "" "Since version 1.7.4. By default, Tarantool sends the log to the standard " -"error stream (``stderr``). If ``log`` is specified, Tarantool sends the log " -"to a file, or to a pipe, or to the system logger." +"error stream (``stderr``). If ``log`` is specified, Tarantool can send the " +"log to a:" msgstr "" "Для версий от 1.7.4. и выше. По умолчанию, Tarantool выводит записи в " "стандартный поток сообщений об ошибках (``stderr``). Если задан параметр " "``log``, Tarantool отправит записи журнала в файл, в конвейер или в " "системный журнал syslog." -msgid "Example setting for sending the log to a file:" +msgid "file" +msgstr "" + +msgid "pipe" +msgstr "" + +msgid "system logger" +msgstr "" + +#, fuzzy +msgid "Example 1: sending the log to the ``tarantool.log`` file." msgstr "Пример настройки для отправки журнала в файл:" msgid "" @@ -2286,33 +2566,36 @@ msgstr "" "-- или\n" "box.cfg{log = 'file:tarantool.log'}" +#, fuzzy msgid "" -"This will open the file ``tarantool.log`` for output on the server’s default" -" directory. If the ``log`` string has no prefix or has the prefix \"file:\"," -" then the string is interpreted as a file path." +"This opens the file ``tarantool.log`` for output on the server's default " +"directory. If the ``log`` string has no prefix or has the prefix \"file:\", " +"then the string is interpreted as a file path." msgstr "" "Откроется файл ``tarantool.log`` для вывода в директории сервера, " "используемой по умолчанию. Если в строке ``log`` нет префикса или есть " "префикс \"file:\", то строка считается путем к файлу." -msgid "Example setting for sending the log to a pipe:" +#, fuzzy +msgid "Example 2: sending the log to a pipe." msgstr "Пример настройки для отправки журнала в конвейер:" +#, fuzzy msgid "" "box.cfg{log = '| cronolog tarantool.log'}\n" "-- or\n" -"box.cfg{log = 'pipe: cronolog tarantool.log'}'" +"box.cfg{log = 'pipe: cronolog tarantool.log'}" msgstr "" "box.cfg{log = '| cronolog tarantool.log'}\n" "-- или\n" "box.cfg{log = 'pipe: cronolog tarantool.log'}'" +#, fuzzy msgid "" -"This will start the program `cronolog " -"`_ when the server starts, and will " -"send all log messages to the standard input (``stdin``) of cronolog. If the " -"``log`` string begins with '|' or has the prefix \"pipe:\", then the string " -"is interpreted as a Unix `pipeline " +"This starts the program `cronolog `_ " +"when the server starts, and sends all log messages to the standard input " +"(``stdin``) of ``cronolog``. If the ``log`` string begins with '|' or has " +"the prefix \"pipe:\", then the string is interpreted as a Unix `pipeline " "`_." msgstr "" "Запустится программа `cronolog `_ при " @@ -2321,7 +2604,8 @@ msgstr "" "'|' или содержит префикс \"pipe:\", то строка считается Unix-`конвейером " "`_." -msgid "Example setting for sending the log to syslog:" +#, fuzzy +msgid "Example 3: sending the log to syslog." msgstr "Пример настройки для отправки журнала в системный журнал syslog:" msgid "" @@ -2341,12 +2625,13 @@ msgstr "" "-- или\n" "box.cfg{log = 'syslog:server=unix:/dev/log'}" +#, fuzzy msgid "" "If the ``log`` string begins with \"syslog:\", then it is interpreted as a " -"message for the `syslogd `_ " -"program which normally is running in the background of any Unix-like " -"platform. The setting can be 'syslog:', 'syslog:facility=...', " -"'syslog:identity=...', 'syslog:server=...', or a combination." +"message for the `syslogd `_ program, " +"which normally is running in the background on any Unix-like platform. The " +"setting can be ``syslog:``, ``syslog:facility=...``, " +"``syslog:identity=...``, ``syslog:server=...``, or a combination." msgstr "" "Если строка ``log`` начинается с \"syslog:\", это считается сообщением для " "программы `syslogd `_, которая, " @@ -2354,9 +2639,10 @@ msgstr "" "'syslog:', 'syslog:facility=...', 'syslog:identity=...', " "'syslog:server=...', или их комбинация." +#, fuzzy msgid "" -"The ``syslog:identity`` setting is an arbitrary string which will be placed " -"at the beginning of all messages. The default value is: tarantool." +"The ``syslog:identity`` setting is an arbitrary string, which is placed at " +"the beginning of all messages. The default value is \"tarantool\"." msgstr "" "Настройка ``syslog:identity`` представляет собой произвольную строку, " "которая размещается в начале всех сообщений. По умолчанию: tarantool." @@ -2378,34 +2664,40 @@ msgstr "" "local0, local1, local2, local3, local4, local5, local6, local7. По " "умолчанию: user." +#, fuzzy msgid "" "The ``syslog:server`` setting is the locator for the syslog server. It can " "be a Unix socket path beginning with \"unix:\", or an ipv4 port number. The " -"default socket value is: dev/log (on Linux) or /var/run/syslog (on Mac OS). " -"The default port value is: 514, the UDP port." +"default socket value is: ``dev/log`` (on Linux) or ``/var/run/syslog`` (on " +"macOS). The default port value is: 514, the UDP port." msgstr "" "Настройка ``syslog:server`` -- это указатель для сервера syslog. Это может " "быть путь к сокету Unix, который начинается с \"unix:\", или же номер " "IPv4-порта. Значение по умолчанию для сокета: dev/log (в Linux) или " "/var/run/syslog (в Mac OS). Значение по умолчанию для порта: 514, UDP-порт." +#, fuzzy msgid "" "When logging to a file, Tarantool reopens the log on `SIGHUP " -"`_. When log is a program, its pid is " -"saved in the :ref:`log.logger_pid ` variable. You need to " -"send it a signal to rotate logs." +"`_. When log is a program, its PID is " +"saved in the :ref:`log.pid ` variable. You need to send it a signal" +" to rotate logs." msgstr "" "При записи в файл Tarantool повторно открывает журнал при сигнале `SIGHUP " "`_. Если журнал является программой, " "его PID сохраняется в переменной :ref:`log.logger_pid `. " "Необходимо отправить сигнал для ротации файлов журнала." +msgid "Environment variable: TT_LOG" +msgstr "" + +#, fuzzy msgid "" -"Since version 1.7.4. If ``log_nonblock`` equals true, Tarantool does not " -"block during logging when the system is not ready for writing, and drops the" -" message instead. If :ref:`log_level ` is high, and " -"many messages go to the log, setting ``log_nonblock`` to true may improve " -"logging performance at the cost of some log messages getting lost." +"Since version 1.7.4. If ``log_nonblock`` equals **true**, Tarantool does not" +" block during logging when the system is not ready for writing, and drops " +"the message instead. If :ref:`log_level ` is high, " +"and many messages go to the log, setting ``log_nonblock`` to **true** may " +"improve logging performance at the cost of some log messages getting lost." msgstr "" "Для версий от 1.7.4. и выше. Если значение ``log_nonblock`` равно true " "(правда), Tarantool не блокирует дескриптор файла журнала, когда он не готов" @@ -2415,31 +2707,36 @@ msgstr "" "производительность ценой потери некоторых сообщений журнала." msgid "" -"This parameter has effect only if the output is going to \"syslog:\" or " -"\"pipe:\". Setting ``log_nonblock`` to true is illegal if the output is " -"going to a file." +"This parameter has effect only if :ref:`log ` is configured" +" to send logs to a pipe or system logger. The default ``log_nonblock`` value" +" is **nil**, which means that blocking behavior corresponds to the logger " +"type:" msgstr "" -"Данный параметр сработает, только если вывод производится в системный журнал" -" ``syslog`` или в конвейер. Недопустимо устанавливать ``log_nonblock`` в " -"``true``, если вывод идет в файл." +msgid "**false** for ``stderr`` and file loggers." +msgstr "" + +msgid "**true** for a pipe and system logger." +msgstr "" + +#, fuzzy msgid "" -"The default ``log_nonblock`` value is nil, which means that blocking " -"behavior corresponds to the type of logger. This is a behavior change: in " -"earlier versions of the Tarantool server, the default value was true." +"This is a behavior change: in earlier versions of the Tarantool server, the " +"default value was **true**." msgstr "" "Значение по умолчанию ``log_nonblock`` равно ``nil``, что означает, что " "поведение блокировки соответствует типу логгера. Это изменение в поведении: " "в более ранних версиях сервера Tarantool значение по умолчанию было " "``true``." -msgid "Default: nil" -msgstr "По умолчанию: nil" +msgid "Environment variable: TT_LOG_NONBLOCK" +msgstr "" +#, fuzzy msgid "" "Since version 1.6.2. If processing a request takes longer than the given " "value (in seconds), warn about it in the log. Has effect only if " -":ref:`log_level ` is more than or equal to 4 " +":ref:`log_level ` is greater than or equal to 4 " "(WARNING)." msgstr "" "Для версий от 1.6.2. и выше. Если обработка запроса занимает дольше времени," @@ -2450,6 +2747,9 @@ msgstr "" msgid "Default: 0.5" msgstr "По умолчанию: 0.5" +msgid "Environment variable: TT_TOO_LONG_THRESHOLD" +msgstr "" + msgid "Since version 1.7.6. Log entries have two possible formats:" msgstr "" "Для версий от 1.7.6. и выше. Данные в журнал записываются в двух форматах:" @@ -2460,8 +2760,9 @@ msgstr "'plain' (по умолчанию) или" msgid "'json' (with more detail and with JSON labels)." msgstr "'json' (более детально с JSON-метками)." +#, fuzzy msgid "" -"Here is what a log entry looks like after ``box.cfg{log_format='plain'}``:" +"Here is what a log entry looks like if ``box.cfg{log_format='plain'}``:" msgstr "" "Вот как будет выглядеть запись в журнале после выполнения " "``box.cfg{log_format='plain'}``:" @@ -2473,8 +2774,8 @@ msgstr "" "2017-10-16 11:36:01.508 [18081] main/101/interactive I> set 'log_format' " "configuration option to \"plain\"" -msgid "" -"Here is what a log entry looks like after ``box.cfg{log_format='json'}``:" +#, fuzzy +msgid "Here is what a log entry looks like if ``box.cfg{log_format='json'}``:" msgstr "" "Вот как будет выглядеть запись в журнале после выполнения " "``box.cfg{log_format='json'}``:" @@ -2500,8 +2801,9 @@ msgstr "" "\"file\": \"builtin\\/box\\/load_cfg.lua\",\n" "\"line\": 317}" +#, fuzzy msgid "" -"The ``log_format='plain'`` entry has time, process id, cord name, " +"The ``log_format='plain'`` entry has a time value, process ID, cord name, " ":ref:`fiber_id `, :ref:`fiber_name `, :ref:`log level `, and message." msgstr "" @@ -2510,44 +2812,248 @@ msgstr "" "`, имя файбера :ref:`fiber_name `, " ":ref:`уровень записи в журнал ` и сообщение." +#, fuzzy msgid "" -"The ``log_format='json'`` entry has the same things along with their labels," +"The ``log_format='json'`` entry has the same fields along with their labels," " and in addition has the file name and line number of the Tarantool source." msgstr "" "В JSON-формате (``log_format='json'``) запись содержит все вышеперечисленное" " с соответствующими метками, а также имя файла и номер строки Tarantool-" "источника." +msgid "Default: 'plain'" +msgstr "По умолчанию: 'plain'" + +msgid "Environment variable: TT_LOG_FORMAT" +msgstr "" + msgid "" -"Setting ``log_format`` to 'json' is illegal if the output is going to " -"\"syslog:\"." +"Since version :doc:`2.11.0 `. Configure the specified log " +"levels (:ref:`log_level `) for different modules." msgstr "" -"Недопустимо устанавливать значение 'json' для ``log_format``, если вывод " -"идет \"syslog:\"." -msgid "Default: 'plain'" +msgid "You can specify a logging level for the following module types:" +msgstr "" + +msgid "" +"Modules (files) that use the default logger. Example: :ref:`Set log levels " +"for files that use the default logger `." +msgstr "" + +msgid "" +"Modules that use custom loggers created using the :ref:`log.new() `" +" function. Example: :ref:`Set log levels for modules that use custom loggers" +" `." +msgstr "" + +msgid "" +"The ``tarantool`` module that enables you to configure the logging level for" +" Tarantool core messages. Specifically, it configures the logging level for " +"messages logged from non-Lua code, including C modules. Example: :ref:`Set a" +" log level for C modules `." +msgstr "" + +#, fuzzy +msgid "Type: table" +msgstr "Тип: логический" + +#, fuzzy +msgid "Default: blank" msgstr "По умолчанию: 'plain'" +msgid "Environment variable: TT_LOG_MODULES" +msgstr "" + +msgid "**Example 1: Set log levels for files that use the default logger**" +msgstr "" + +msgid "" +"Suppose you have two identical modules placed by the following paths: " +"``test/logging/module1.lua`` and ``test/logging/module2.lua``. These modules" +" use the default logger and look as follows:" +msgstr "" + +msgid "" +"return {\n" +" say_hello = function()\n" +" local log = require('log')\n" +" log.info('Info message from module1')\n" +" end\n" +"}\n" +msgstr "" + +msgid "" +"To load these modules in your application, you need to add the corresponding" +" ``require`` directives:" +msgstr "" + +msgid "" +"module1 = require('test.logging.module1')\n" +"module2 = require('test.logging.module2')\n" +msgstr "" + +msgid "" +"To configure logging levels, you need to provide module names corresponding " +"to paths to these modules. In the example below, the ``box_cfg`` variable " +"contains logging settings that can be passed to the ``box.cfg()`` function:" +msgstr "" + +msgid "" +"box_cfg = { log_modules = {\n" +" ['test.logging.module1'] = 'verbose',\n" +" ['test.logging.module2'] = 'error' }\n" +"}\n" +msgstr "" + +msgid "" +"Given that ``module1`` has the ``verbose`` logging level and ``module2`` has" +" the ``error`` level, calling ``module1.say_hello()`` shows a message but " +"``module2.say_hello()`` is swallowed:" +msgstr "" + +msgid "" +"-- Prints 'info' messages --\n" +"module1.say_hello()\n" +"--[[\n" +"[92617] main/103/interactive/test.logging.module1 I> Info message from module1\n" +"---\n" +"...\n" +"--]]\n" +"\n" +"-- Swallows 'info' messages --\n" +"module2.say_hello()\n" +"--[[\n" +"---\n" +"...\n" +"--]]\n" +msgstr "" + +msgid "**Example 2: Set log levels for modules that use custom loggers**" +msgstr "" + +msgid "" +"In the example below, the ``box_cfg`` variable contains logging settings " +"that can be passed to the ``box.cfg()`` function. This example shows how to " +"set the ``verbose`` level for ``module1`` and the ``error`` level for " +"``module2``:" +msgstr "" + +msgid "" +"box_cfg = { log_level = 'warn',\n" +" log_modules = {\n" +" module1 = 'verbose',\n" +" module2 = 'error' }\n" +"}\n" +msgstr "" + +msgid "" +"To create custom loggers, call the :ref:`log.new() ` function:" +msgstr "" + +msgid "" +"-- Creates new loggers --\n" +"module1_log = require('log').new('module1')\n" +"module2_log = require('log').new('module2')\n" +msgstr "" + +msgid "" +"Given that ``module1`` has the ``verbose`` logging level and ``module2`` has" +" the ``error`` level, calling ``module1_log.info()`` shows a message but " +"``module2_log.info()`` is swallowed:" +msgstr "" + +msgid "" +"-- Prints 'info' messages --\n" +"module1_log.info('Info message from module1')\n" +"--[[\n" +"[16300] main/103/interactive/module1 I> Info message from module1\n" +"---\n" +"...\n" +"--]]\n" +"\n" +"-- Swallows 'debug' messages --\n" +"module1_log.debug('Debug message from module1')\n" +"--[[\n" +"---\n" +"...\n" +"--]]\n" +"\n" +"-- Swallows 'info' messages --\n" +"module2_log.info('Info message from module2')\n" +"--[[\n" +"---\n" +"...\n" +"--]]\n" +msgstr "" + +msgid "**Example 3: Set a log level for C modules**" +msgstr "" + +msgid "" +"In the example below, the ``box_cfg`` variable contains logging settings " +"that can be passed to the ``box.cfg()`` function. This example shows how to " +"set the ``info`` level for the ``tarantool`` module:" +msgstr "" + +msgid "" +"box_cfg = { log_level = 'warn',\n" +" log_modules = { tarantool = 'info' } }\n" +msgstr "" + +msgid "The specified level affects messages logged from C modules:" +msgstr "" + +msgid "" +"ffi = require('ffi')\n" +"\n" +"-- Prints 'info' messages --\n" +"ffi.C._say(ffi.C.S_INFO, nil, 0, nil, 'Info message from C module')\n" +"--[[\n" +"[6024] main/103/interactive I> Info message from C module\n" +"---\n" +"...\n" +"--]]\n" +"\n" +"-- Swallows 'debug' messages --\n" +"ffi.C._say(ffi.C.S_DEBUG, nil, 0, nil, 'Debug message from C module')\n" +"--[[\n" +"---\n" +"...\n" +"--]]\n" +msgstr "" + +msgid "" +"The example above uses the `LuaJIT ffi library " +"`_ to call C functions provided by the " +"``say`` module." +msgstr "" + msgid "Logging example" msgstr "Пример записи в журнал" +#, fuzzy msgid "" -"This will illustrate how \"rotation\" works, that is, what happens when the " -"server instance is writing to a log and signals are used when archiving it." +"This example illustrates how \"rotation\" works, that is, what happens when " +"the server instance is writing to a log and signals are used when archiving " +"it." msgstr "" "Данный пример проиллюстрирует ротацию файлов журнала, то есть что " "происходит, когда экземпляр сервера производит запись в журнал? а при " "архивировании используются сигналы." -msgid "Start with two terminal shells, Terminal #1 and Terminal #2." +#, fuzzy +msgid "Start with two terminal shells: Terminal #1 and Terminal #2." msgstr "Запустите две оболочки, терминал №1 и терминал №2." +#, fuzzy msgid "" -"On Terminal #1: start an interactive Tarantool session, then say the logging" -" will go to `Log_file`, then put a message \"Log Line #1\" in the log file:" +"In Terminal #1, start an interactive Tarantool session. Then, use the " +"``log`` property to send logs to `Log_file` and call ``log.info`` to put a " +"message in the log file." msgstr "" -"На терминале №1 запустите интерактивную сессию Tarantool, затем укажите, " -"что запись в журнал ведется в файл `Log_file`, а затем поместите сообщение " +"На терминале №1 запустите интерактивную сессию Tarantool, затем укажите, что" +" запись в журнал ведется в файл `Log_file`, а затем поместите сообщение " "\"Log Line #1\" в файл журнала:" msgid "" @@ -2560,24 +3066,26 @@ msgstr "" "log.info('Log Line #1')" msgid "" -"On Terminal #2: use ``mv`` so the log file is now named `Log_file.bak`. The " -"result of this is: the next log message will go to `Log_file.bak`." +"In Terminal #2, use the ``mv`` command to rename the log file to " +"`Log_file.bak`." msgstr "" -"На терминале №2 используйте команду ``mv``, чтобы файл журнала назывался " -"`Log_file.bak`. Результатом будет то, что следующее сообщение журнала пойдет" -" в файл `Log_file.bak`." msgid "mv Log_file Log_file.bak" msgstr "mv Log_file Log_file.bak" -msgid "On Terminal #1: put a message \"Log Line #2\" in the log file." +msgid "As a result, the next log message will go to `Log_file.bak`." +msgstr "" + +#, fuzzy +msgid "Go back to Terminal #1 and put a message \"Log Line #2\" in the log file." msgstr "На терминале №1 поместите сообщение \"Log Line #2\" в файл журнала." msgid "log.info('Log Line #2')" msgstr "log.info('Log Line #2')" +#, fuzzy msgid "" -"On Terminal #2: use ``ps`` to find the process ID of the Tarantool instance." +"In Terminal #2, use ``ps`` to find the process ID of the Tarantool instance." msgstr "" "На терминале №2 используйте команду ``ps``, чтобы найти ID процесса " "экземпляра Tarantool." @@ -2585,11 +3093,11 @@ msgstr "" msgid "ps -A | grep tarantool" msgstr "ps -A | grep tarantool" +#, fuzzy msgid "" -"On Terminal #2: use ``kill -HUP`` to send a SIGHUP signal to the Tarantool " -"instance. The result of this is: Tarantool will open `Log_file` again, and " -"the next log message will go to `Log_file`. (The same effect could be " -"accomplished by executing log.rotate() on the instance.)" +"In Terminal #2, execute ``kill -HUP`` to send a SIGHUP signal to the " +"Tarantool instance. Tarantool will open `Log_file` again, and the next log " +"message will go to `Log_file`." msgstr "" "На терминале №2 используйте команду ``kill -HUP`` для отправки сигнала " "SIGHUP на экземпляр Tarantool. Результат: Tarantool снова откроет " @@ -2600,16 +3108,22 @@ msgstr "" msgid "kill -HUP *process_id*" msgstr "kill -HUP *process_id*" -msgid "On Terminal #1: put a message \"Log Line #3\" in the log file." +msgid "" +"The same effect could be accomplished by calling :ref:`log.rotate `." +msgstr "" + +#, fuzzy +msgid "In Terminal #1, put a message \"Log Line #3\" in the log file." msgstr "На терминале №1 поместите сообщение \"Log Line #3\" в файл журнала." msgid "log.info('Log Line #3')" msgstr "log.info('Log Line #3')" +#, fuzzy msgid "" -"On Terminal #2: use ``less`` to examine files. `Log_file.bak` will have " -"these lines, except that the date and time will depend on when the example " -"is done:" +"In Terminal #2, use ``less`` to examine files. `Log_file.bak` will have the " +"following lines ..." msgstr "" "На терминале №2 используйте команду ``less`` для просмотра файлов. " "`Log_file.bak` будет содержать следующие строки, но дата и время будут " @@ -2622,7 +3136,8 @@ msgstr "" "2015-11-30 15:13:06.373 [27469] main/101/interactive I> Log Line #1`\n" "2015-11-30 15:14:25.973 [27469] main/101/interactive I> Log Line #2`" -msgid "and `Log_file` will have" +#, fuzzy +msgid "... and `Log_file` will look like this:" msgstr "а `Log_file` будет содержать" msgid "" @@ -2645,7 +3160,7 @@ msgid ":ref:`feedback_interval `" msgstr ":ref:`feedback_interval `" msgid "" -"By default a Tarantool daemon sends a small packet once per hour, to " +"By default, a Tarantool daemon sends a small packet once per hour, to " "``https://feedback.tarantool.io``. The packet contains three values from " ":ref:`box.info `: ``box.info.version``, " "``box.info.uuid``, and ``box.info.cluster_uuid``. By changing the feedback " @@ -2662,6 +3177,9 @@ msgstr "" "Если задано значение ``true``, обратная связь будет отправлена, как описано " "выше. Если задано значение ``false``, обратная связь не отправляется." +msgid "Environment variable: TT_FEEDBACK_ENABLED" +msgstr "" + msgid "" "Since version 1.10.1. The address to which the packet is sent. Usually the " "recipient is Tarantool, but it can be any URL." @@ -2672,6 +3190,9 @@ msgstr "" msgid "Default: ``https://feedback.tarantool.io``" msgstr "" +msgid "Environment variable: TT_FEEDBACK_HOST" +msgstr "" + msgid "" "Since version 1.10.1. The number of seconds between sendings, usually 3600 " "(1 hour)." @@ -2682,6 +3203,9 @@ msgstr "" msgid "Default: 3600" msgstr "По умолчанию: 3600" +msgid "Environment variable: TT_FEEDBACK_INTERVAL" +msgstr "" + msgid "Deprecated parameters" msgstr "Устаревшие параметры" @@ -2741,6 +3265,13 @@ msgstr "" msgid ":ref:`rows_per_wal `" msgstr ":ref:`rows_per_wal `," +#, fuzzy +msgid "" +":ref:`election_fencing_enabled `" +msgstr "" +":ref:`replication_source `" + msgid "**Deprecated**, do not use." msgstr "**Устаревший**, не использовать." @@ -2860,3 +3391,396 @@ msgid "" "wal_max_size>`. The parameter does not allow to properly limit size of WAL " "logs." msgstr "" + +msgid "" +"**Deprecated** in Tarantool v2.11 in favor of :ref:`election_fencing_mode " +"`." +msgstr "" + +msgid "" +"The parameter does not allow using the ``strict`` fencing mode. Setting to " +"``true`` is equivalent to setting the ``soft`` :ref:`election_fencing_mode " +"`. Setting to ``false`` is equivalent" +" to setting the ``off`` :ref:`election_fencing_mode `." +msgstr "" + +msgid "Environment variable: TT_ELECTION_FENCING_ENABLED" +msgstr "" + +#~ msgid "" +#~ "This reference covers all options and parameters which can be set for " +#~ "Tarantool on the command line or in an :ref:`initialization file `." +#~ msgstr "" +#~ "В данном справочнике рассматриваются все опции и параметры, которые можно " +#~ "использовать в командной строке или в :ref:`файле инициализации `." + +#~ msgid "Tarantool is started by entering either of the following command:" +#~ msgstr "Tarantool можно запустить путем ввода одной из следующих команд:" + +#~ msgid "" +#~ "$ **tarantool**\n" +#~ "\n" +#~ "$ **tarantool** *options*\n" +#~ "\n" +#~ "$ **tarantool** *lua-initialization-file* **[** *arguments* **]**" +#~ msgstr "" +#~ "$ **tarantool**\n" +#~ "\n" +#~ "$ **tarantool** *options*\n" +#~ "\n" +#~ "$ **tarantool** *lua-initialization-file* **[** *arguments* **]**" + +#~ msgid "Command options" +#~ msgstr "Опции командной строки" + +#~ msgid "Print an annotated list of all available options and exit." +#~ msgstr "Вывод аннотированного списка всех доступных опций и выход." + +#~ msgid "Print product name and version, for example:" +#~ msgstr "Вывод названия и версии продукта, например:" + +#~ msgid "" +#~ "$ ./tarantool --version\n" +#~ "Tarantool 2.6.2-0-g34d504d\n" +#~ "Target: Darwin-x86_64-Release\n" +#~ "..." +#~ msgstr "" + +#~ msgid "In this example:" +#~ msgstr "В данном примере:" + +#~ msgid "" +#~ "“Tarantool” is the name of the reusable asynchronous networking programming " +#~ "framework." +#~ msgstr "" +#~ "“Tarantool” -- это название многократно используемого асинхронного сетевого " +#~ "фреймворка." + +#~ msgid "" +#~ ":ref:`The 3-number version ` follows the standard " +#~ "``--`` scheme, in which ```` number is changed " +#~ "only rarely, ```` is incremented for each new milestone and indicates" +#~ " possible incompatible changes, and ```` stands for the number of bug" +#~ " fix releases made after the start of the milestone. For non-released " +#~ "versions only, there may be a commit number and commit SHA1 to indicate how " +#~ "much this particular build has diverged from the last release." +#~ msgstr "" +#~ ":ref:`Версия из 3 чисел ` создается по стандартной схеме " +#~ "``<мажорная>-<минорная>-<патч-версия>``, где ``<мажорная>`` версия " +#~ "изменяется редко, ``<минорная>`` последовательно увеличивается с каждым " +#~ "новым выпущенным стабильным релизом и указывает на возможные несовместимые " +#~ "изменения, а ``<патч-версия>`` означает количество версий с исправленными " +#~ "ошибками с момента выхода стабильного релиза. Еще не вышедшие версии могут " +#~ "также содержать номер коммита и коммит SHA1, чтобы показать, насколько " +#~ "данная сборка отходит от последнего релиза." + +#~ msgid "" +#~ "“Target” is the platform tarantool was built on. Some platform-specific " +#~ "details may follow this line." +#~ msgstr "" +#~ "“Target” -- это платформа, на которой собран Tarantool. Некоторые " +#~ "платформенно-зависимые детали могут следовать за этой строкой." + +#~ msgid "" +#~ "Tarantool uses `git describe " +#~ "`_ to " +#~ "produce its version id, and this id can be used at any time to check out the" +#~ " corresponding source from our `git repository " +#~ "`_." +#~ msgstr "" +#~ "При выставлении номера версии Tarantool применяется `git describe " +#~ "`_, и " +#~ "этот номер версии можно в любое время использовать для проверки " +#~ "соответствующего исходного кода в `репозитории git " +#~ "`_." + +#~ msgid "URI" +#~ msgstr "Унифицированный идентификатор ресурса (URI)" + +#~ msgid "" +#~ "Some configuration parameters and some functions depend on a URI, or " +#~ "\"Universal Resource Identifier\". The URI string format is similar to the " +#~ "`generic syntax for a URI schema " +#~ "`_. So it may contain (in" +#~ " order) a user name for login, a password, a host name or host IP address, " +#~ "and a port number. Only the port number is always mandatory. The password is" +#~ " mandatory if the user name is specified, unless the user name is 'guest'. " +#~ "So, formally, the URI syntax is ``[host:]port`` or " +#~ "``[username:password@]host:port``. If host is omitted, then '0.0.0.0' or " +#~ "'[::]' is assumed, meaning respectively any IPv4 address or any IPv6 " +#~ "address, on the local machine. If username:password is omitted, then 'guest'" +#~ " is assumed. Some examples:" +#~ msgstr "" + +#~ msgid "URI fragment" +#~ msgstr "Фрагмент URI" + +#~ msgid "Example" +#~ msgstr "Пример" + +#~ msgid "port" +#~ msgstr "порт" + +#~ msgid "3301" +#~ msgstr "3301" + +#~ msgid "host:port" +#~ msgstr "хост:порт" + +#~ msgid "127.0.0.1:3301" +#~ msgstr "127.0.0.1:3301" + +#~ msgid "username:password@host:port" +#~ msgstr "имя-пользователя:пароль@хост:порт" + +#~ msgid "notguest:sesame@mail.ru:3301" +#~ msgstr "notguest:sesame@mail.ru:3301" + +#~ msgid "" +#~ "In certain circumstances a Unix domain socket may be used where a URI is " +#~ "expected, for example \"unix/:/tmp/unix_domain_socket.sock\" or simply " +#~ "\"/tmp/unix_domain_socket.sock\"." +#~ msgstr "" +#~ "В определенных обстоятельствах можно использовать доменный сокет Unix, когда" +#~ " ожидается URI, например, ``unix/:/tmp/unix_domain_socket.sock`` или просто " +#~ "``/tmp/unix_domain_socket.sock``." + +#~ msgid "" +#~ "A method for parsing URIs is illustrated in :ref:`Module uri `." +#~ msgstr "" +#~ "Метод разбора URI проиллюстрирован в справочнике по :ref:`модулю uri `." + +#~ msgid "Initialization file" +#~ msgstr "Файл инициализации" + +#~ msgid "" +#~ "If the command to start Tarantool includes :codeitalic:`lua-initialization-" +#~ "file`, then Tarantool begins by invoking the Lua program in the file, which " +#~ "by convention may have the name \"``script.lua``\". The Lua program may get " +#~ "further arguments from the command line or may use operating-system " +#~ "functions, such as ``getenv()``. The Lua program almost always begins by " +#~ "invoking ``box.cfg()``, if the database server will be used or if ports need" +#~ " to be opened. For example, suppose ``script.lua`` contains the lines" +#~ msgstr "" +#~ "Если команда запуска Tarantool включает в себя :codeitalic:`файл " +#~ "инициализации`, то Tarantool запустится посредством вызова Lua-программы из " +#~ "этого файла, который обычно называется \"``script.lua``\". В Lua-программу " +#~ "можно добавить дополнительные аргументы из командной строки или функции " +#~ "операционной системы, такие как ``getenv()``. Lua-программа практически " +#~ "всегда запускается посредством вызова ``box.cfg()``, если будет " +#~ "использоваться сервер базы данных или же необходимо открыть порты. Например," +#~ " предположим, что файл ``script.lua`` содержит строки:" + +#~ msgid "" +#~ "#!/usr/bin/env tarantool\n" +#~ "box.cfg{\n" +#~ " listen = os.getenv(\"LISTEN_URI\"),\n" +#~ " memtx_memory = 100000,\n" +#~ " pid_file = \"tarantool.pid\",\n" +#~ " wal_max_size = 2500\n" +#~ "}\n" +#~ "print('Starting ', arg[1])" +#~ msgstr "" +#~ "#!/usr/bin/env tarantool\n" +#~ "box.cfg{\n" +#~ " listen = os.getenv(\"LISTEN_URI\"),\n" +#~ " memtx_memory = 100000,\n" +#~ " pid_file = \"tarantool.pid\",\n" +#~ " wal_max_size = 2500\n" +#~ "}\n" +#~ "print('Starting ', arg[1])" + +#~ msgid "" +#~ "and suppose the environment variable LISTEN_URI contains 3301, and suppose " +#~ "the command line is ``~/tarantool/src/tarantool script.lua ARG``. Then the " +#~ "screen might look like this:" +#~ msgstr "" +#~ "и предположим, что переменная окружения LISTEN_URI содержит значение 3301, а" +#~ " также предположим, что в командной строке ``~/tarantool/src/tarantool " +#~ "script.lua ARG``. Тогда вывод на экране может выглядеть следующим образом:" + +#~ msgid "" +#~ "$ export LISTEN_URI=3301\n" +#~ "$ ~/tarantool/src/tarantool script.lua ARG\n" +#~ "... main/101/script.lua C> version 1.7.0-1216-g73f7154\n" +#~ "... main/101/script.lua C> log level 5\n" +#~ "... main/101/script.lua I> mapping 107374184 bytes for a shared arena...\n" +#~ "... main/101/script.lua I> recovery start\n" +#~ "... main/101/script.lua I> recovering from './00000000000000000000.snap'\n" +#~ "... main/101/script.lua I> primary: bound to 0.0.0.0:3301\n" +#~ "... main/102/leave_local_hot_standby I> ready to accept requests\n" +#~ "Starting ARG\n" +#~ "... main C> entering the event loop" +#~ msgstr "" +#~ "$ export LISTEN_URI=3301\n" +#~ "$ ~/tarantool/src/tarantool script.lua ARG\n" +#~ "... main/101/script.lua C> version 1.7.0-1216-g73f7154\n" +#~ "... main/101/script.lua C> log level 5\n" +#~ "... main/101/script.lua I> mapping 107374184 bytes for a shared arena...... main/101/script.lua I> recovery start\n" +#~ "... main/101/script.lua I> recovering from './00000000000000000000.snap'... main/101/script.lua I> primary: bound to 0.0.0.0:3301\n" +#~ "... main/102/leave_local_hot_standby I> ready to accept requests\n" +#~ "Starting ARG\n" +#~ "... main C> entering the event loop" + +#~ msgid "" +#~ "If you wish to start an interactive session on the same terminal after " +#~ "initialization is complete, you can use :ref:`console.start() `." +#~ msgstr "" +#~ "Если необходимо начать интерактивную сессию на том же терминале по окончании" +#~ " инициализации, можно использовать :ref:`console.start() `." + +#~ msgid "Configuration parameters" +#~ msgstr "Конфигурационные параметры" + +#~ msgid "Configuration parameters have the form:" +#~ msgstr "Конфигурационные параметры выглядят так:" + +#~ msgid "" +#~ ":extsamp:`{**{box.cfg}**}{[{*{key = value}*} [, {*{key = value ...}*}]]}`" +#~ msgstr "" +#~ ":extsamp:`{**{box.cfg}**}{[{*{ключ = значение}*} [, {*{ключ = значение " +#~ "...}*}]]}`" + +#~ msgid "" +#~ "Since ``box.cfg`` may contain many configuration parameters and since some " +#~ "of the parameters (such as directory addresses) are semi-permanent, it's " +#~ "best to keep ``box.cfg`` in a Lua file. Typically this Lua file is the " +#~ "initialization file which is specified on the tarantool command line." +#~ msgstr "" +#~ "Поскольку в ``box.cfg`` может быть множество конфигурационных параметров, а " +#~ "некоторые параметры (такие как адреса директорий) являются полупостоянными, " +#~ "лучше всего хранить ``box.cfg`` в Lua-файле. Как правило, такой Lua-файл " +#~ "представляет собой файл инициализации, который указан в командной строке " +#~ "Tarantool." + +#~ msgid "" +#~ "Most configuration parameters are for allocating resources, opening ports, " +#~ "and specifying database behavior. All parameters are optional. A few " +#~ "parameters are dynamic, that is, they can be changed at runtime by calling " +#~ "``box.cfg{}`` a second time." +#~ msgstr "" +#~ "Большинство конфигурационных параметров предназначены для распределения " +#~ "ресурсов, открытия портом и указания поведения базы данных. Все параметры " +#~ "необязательны. Некоторые параметры динамичны, то есть могут изменяться во " +#~ "время исполнения кода посредством повторного вызова ``box.cfg{}``." + +#~ msgid "" +#~ "To see all the non-null parameters, say ``box.cfg`` (no parentheses). To see" +#~ " a particular parameter, for example the listen address, say " +#~ "``box.cfg.listen``." +#~ msgstr "" +#~ "Чтобы увидеть все ненулевые параметры, выполните ``box.cfg`` (без круглых " +#~ "скобок). Чтобы увидеть определенный параметр, например, адрес для " +#~ "прослушивания, выполните команду ``box.cfg.listen``." + +#~ msgid "" +#~ "The following sections describe all parameters for basic operation, for " +#~ "storage, for binary logging and snapshots, for replication, for networking, " +#~ "for logging, and for feedback." +#~ msgstr "" +#~ "В последующих разделах описаны все параметры для основных возможностей, для " +#~ "хранения, для записи в бинарный журнал и создания снимков, для репликации, " +#~ "для работы по сети, для журналирования и для обратной связи." + +#~ msgid "" +#~ "Since version :doc:`2.6.1 `. Enables :ref:`transactional " +#~ "manager ` if set to ``true``." +#~ msgstr "" + +#~ msgid "Default: 1.1" +#~ msgstr "По умолчанию: 1.1" + +#~ msgid "" +#~ "Since version 1.9.0. By default a replica will try to connect to all the " +#~ "masters, or it will not start. (The default is recommended so that all " +#~ "replicas will receive the same replica set UUID.)" +#~ msgstr "" +#~ "Для версий от 1.9.0. и выше. По умолчанию, реплика попытается подключиться " +#~ "ко всем мастерам или не запустится. (По умолчанию, рекомендуется, чтобы у " +#~ "всех реплик был одинаковый UUID набора реплик)." + +#~ msgid "" +#~ "However, by specifying ``replication_connect_quorum = N``, where N is a " +#~ "number greater than or equal to zero, users can state that the replica only " +#~ "needs to connect to N masters." +#~ msgstr "" +#~ "Однако, если указать ``replication_connect_quorum = N``, где N означает " +#~ "число больше или равное нулю, это будет означать, что реплике нужно " +#~ "подключиться к N количеству мастеров." + +#~ msgid "" +#~ "Since version :doc:`2.5.1 `. For :ref:`synchronous " +#~ "replication ` only. This option tells how many replicas should " +#~ "confirm the receipt of a synchronous transaction before it can finish its " +#~ "commit. So far this option accounts all replicas, including anonymous." +#~ msgstr "" + +#~ msgid "candidate." +#~ msgstr "" + +#~ msgid "" +#~ "Participation of a replica set node in the automated leader election can be " +#~ "turned on and off by this option. The default value is ``off``. All nodes " +#~ "that have values other than ``off`` run the Raft state machine internally " +#~ "talking to other nodes according to the Raft leader election protocol. When " +#~ "the option is ``off``, the node accepts Raft messages from other nodes, but " +#~ "it doesn't participate in the election activities, and this doesn't affect " +#~ "the node's state. So, for example, if a node is not a leader but it has " +#~ "``election_mode = 'off'``, it is writable anyway." +#~ msgstr "" + +#~ msgid "" +#~ "To avoid the split vote repeat, the timeout is randomized on each node " +#~ "during every new election, from 100% to 110% of the original timeout value. " +#~ "For example, if the timeout is 300 ms and there are 3 nodes started the " +#~ "election simultaneously in the same term, they can set their election " +#~ "timeouts to 300, 310, 320 respectively, or to 305, 302, 324, and so on. In " +#~ "that way, the votes will never be split because the election on different " +#~ "nodes won't be restarted simultaneously." +#~ msgstr "" + +#~ msgid "" +#~ "Since version :doc:`2.8.1 `. The number of :ref:`network " +#~ "threads `. There can be unusual workloads " +#~ "where the network thread is 100% loaded and the transaction processor thread" +#~ " is not, so the network thread is a bottleneck. In that case set " +#~ "``iproto_threads`` to 2 or more. The operating system kernel will determine " +#~ "which connection goes to which thread." +#~ msgstr "" + +#~ msgid "" +#~ "This parameter has effect only if the output is going to \"syslog:\" or " +#~ "\"pipe:\". Setting ``log_nonblock`` to true is illegal if the output is " +#~ "going to a file." +#~ msgstr "" +#~ "Данный параметр сработает, только если вывод производится в системный журнал" +#~ " ``syslog`` или в конвейер. Недопустимо устанавливать ``log_nonblock`` в " +#~ "``true``, если вывод идет в файл." + +#~ msgid "" +#~ "Setting ``log_format`` to 'json' is illegal if the output is going to " +#~ "\"syslog:\"." +#~ msgstr "" +#~ "Недопустимо устанавливать значение 'json' для ``log_format``, если вывод " +#~ "идет \"syslog:\"." + +#~ msgid "" +#~ "On Terminal #2: use ``mv`` so the log file is now named `Log_file.bak`. The " +#~ "result of this is: the next log message will go to `Log_file.bak`." +#~ msgstr "" +#~ "На терминале №2 используйте команду ``mv``, чтобы файл журнала назывался " +#~ "`Log_file.bak`. Результатом будет то, что следующее сообщение журнала пойдет" +#~ " в файл `Log_file.bak`." + +#~ msgid "" +#~ "By default a Tarantool daemon sends a small packet once per hour, to " +#~ "``https://feedback.tarantool.io``. The packet contains three values from " +#~ ":ref:`box.info `: ``box.info.version``, " +#~ "``box.info.uuid``, and ``box.info.cluster_uuid``. By changing the feedback " +#~ "configuration parameters, users can adjust or turn off this feature." +#~ msgstr "" diff --git a/locale/ru/LC_MESSAGES/reference/reference_lua/box_cfg.po b/locale/ru/LC_MESSAGES/reference/reference_lua/box_cfg.po index ff4c71ced8..a0acbffd93 100644 --- a/locale/ru/LC_MESSAGES/reference/reference_lua/box_cfg.po +++ b/locale/ru/LC_MESSAGES/reference/reference_lua/box_cfg.po @@ -13,12 +13,13 @@ msgid "To view the current configuration, say ``box.cfg`` without braces:" msgstr "" "Чтобы посмотреть текущую конфигурацию, вызовите ``box.cfg`` без скобок:" +#, fuzzy msgid "" "tarantool> box.cfg\n" "---\n" "- checkpoint_count: 2\n" " too_long_threshold: 0.5\n" -" slab_alloc_factor: 1.1\n" +" slab_alloc_factor: 1.05\n" " memtx_max_tuple_size: 1048576\n" " background: false\n" " <...>\n" @@ -94,7 +95,6 @@ msgid "" " replicaset_uuid = nil -- generated automatically\n" " replication = nil\n" " replication_anon = false\n" -" replication_connect_quorum = nil\n" " replication_connect_timeout = 30\n" " replication_skip_conflict = false\n" " replication_sync_lag = 10\n" @@ -140,3 +140,69 @@ msgstr "" "Команда ``box.cfg{...}`` также перезагружает :ref:`файлы с данными " "длительного хранения ` в оперативную память при " "перезапуске после получения данных." + +#~ msgid "" +#~ "tarantool> box.cfg{}\n" +#~ "tarantool> box.cfg -- sorted in the alphabetic order\n" +#~ "---\n" +#~ "- background = false\n" +#~ " checkpoint_count = 2\n" +#~ " checkpoint_interval = 3600\n" +#~ " checkpoint_wal_threshold = 1000000000000000000\n" +#~ " coredump = false\n" +#~ " custom_proc_title = nil\n" +#~ " feedback_enabled = true\n" +#~ " feedback_host = 'https://feedback.tarantool.io'\n" +#~ " feedback_interval = 3600\n" +#~ " force_recovery = false\n" +#~ " hot_standby = false\n" +#~ " instance_uuid = nil -- generated automatically\n" +#~ " io_collect_interval = nil\n" +#~ " iproto_threads = 1\n" +#~ " listen = nil\n" +#~ " log = nil\n" +#~ " log_format = plain\n" +#~ " log_level = 5\n" +#~ " log_nonblock = true\n" +#~ " memtx_dir = '.'\n" +#~ " memtx_max_tuple_size = 1024 * 1024\n" +#~ " memtx_memory = 256 * 1024 *1024\n" +#~ " memtx_min_tuple_size = 16\n" +#~ " net_msg_max = 768\n" +#~ " pid_file = nil\n" +#~ " readahead = 16320\n" +#~ " read_only = false\n" +#~ " replicaset_uuid = nil -- generated automatically\n" +#~ " replication = nil\n" +#~ " replication_anon = false\n" +#~ " replication_connect_quorum = nil\n" +#~ " replication_connect_timeout = 30\n" +#~ " replication_skip_conflict = false\n" +#~ " replication_sync_lag = 10\n" +#~ " replication_sync_timeout = 300\n" +#~ " replication_timeout = 1\n" +#~ " slab_alloc_factor = 1.05\n" +#~ " snap_io_rate_limit = nil\n" +#~ " sql_cache_size = 5242880\n" +#~ " strip_core = true\n" +#~ " too_long_threshold = 0.5\n" +#~ " username = nil\n" +#~ " vinyl_bloom_fpr = 0.05\n" +#~ " vinyl_cache = 128 * 1024 * 1024\n" +#~ " vinyl_dir = '.'\n" +#~ " vinyl_max_tuple_size = 1024 * 1024* 1024 * 1024\n" +#~ " vinyl_memory = 128 * 1024 * 1024\n" +#~ " vinyl_page_size = 8 * 1024\n" +#~ " vinyl_range_size = nil\n" +#~ " vinyl_read_threads = 1\n" +#~ " vinyl_run_count_per_level = 2\n" +#~ " vinyl_run_size_ratio = 3.5\n" +#~ " vinyl_timeout = 60\n" +#~ " vinyl_write_threads = 4\n" +#~ " wal_dir = '.'\n" +#~ " wal_dir_rescan_delay = 2\n" +#~ " wal_max_size = 256 * 1024 * 1024\n" +#~ " wal_mode = 'write'\n" +#~ " worker_pool_threads = 4\n" +#~ " work_dir = nil" +#~ msgstr "" diff --git a/locale/ru/LC_MESSAGES/reference/reference_lua/box_ctl.po b/locale/ru/LC_MESSAGES/reference/reference_lua/box_ctl.po index 0abe54cde2..330a4ccca6 100644 --- a/locale/ru/LC_MESSAGES/reference/reference_lua/box_ctl.po +++ b/locale/ru/LC_MESSAGES/reference/reference_lua/box_ctl.po @@ -2,16 +2,16 @@ msgid "Submodule box.ctl" msgstr "Вложенный модуль box.ctl" -msgid "The ``wait_ro`` (wait until read-only) and ``wait_rw`` (wait until read-write) functions " -"are useful during server initialization." +#, fuzzy +msgid "" +"The ``wait_ro`` (wait until read-only) and ``wait_rw`` (wait until read-" +"write) functions are useful during server initialization. To see whether a " +"function is already in read-only or read-write mode, check :ref:`box.info.ro" +" `." msgstr "" -"При инициализации сервера будут полезны следующие функции вложенного модуля ``box.ctl``: ``wait_ro`` " -"(дождаться режима только для чтения) и ``wait_rw`` (дождаться режима чтения " -"и записи)." - -msgid "To see whether a function is already in read-only or read-write mode, check :ref:`box.info.ro `." -msgstr "Чтобы проверить режим функции --- только для чтения или чтение и запись, " -"используйте :ref:`box.info.ro `." +"При инициализации сервера будут полезны следующие функции вложенного модуля " +"``box.ctl``: ``wait_ro`` (дождаться режима только для чтения) и ``wait_rw`` " +"(дождаться режима чтения и записи)." msgid "" "A particular use is for :doc:`box.once() " @@ -65,6 +65,29 @@ msgstr "" msgid "Create a \"shutdown trigger\"" msgstr "Создать \"shutdown триггер\"" +msgid ":doc:`./box_ctl/on_recovery_state`" +msgstr "" + +msgid "" +"Create a trigger executed on different stages of a node recovery or initial " +"configuration" +msgstr "" + +msgid ":doc:`./box_ctl/on_election`" +msgstr "" + +msgid "" +"Create a :ref:`trigger ` executed every time the current state of " +"a replica set node in regard to :ref:`leader election ` " +"changes" +msgstr "" + +msgid ":doc:`./box_ctl/set_on_shutdown_timeout`" +msgstr "" + +msgid "Set a timeout in seconds for the ``on_shutdown`` trigger" +msgstr "" + msgid ":doc:`./box_ctl/is_recovery_finished`" msgstr "" @@ -76,3 +99,22 @@ msgstr "" msgid "Wait, then choose replication leader" msgstr "" + +msgid ":doc:`./box_ctl/demote`" +msgstr "" + +msgid "Revoke the leader role from the instance" +msgstr "" + +msgid ":doc:`./box_ctl/make_bootstrap_leader`" +msgstr "" + +msgid "Make the instance a bootstrap leader of a replica set" +msgstr "" + +#~ msgid "" +#~ "To see whether a function is already in read-only or read-write mode, check " +#~ ":ref:`box.info.ro `." +#~ msgstr "" +#~ "Чтобы проверить режим функции --- только для чтения или чтение и запись, " +#~ "используйте :ref:`box.info.ro `." diff --git a/locale/ru/LC_MESSAGES/reference/reference_lua/box_ctl/demote.po b/locale/ru/LC_MESSAGES/reference/reference_lua/box_ctl/demote.po new file mode 100644 index 0000000000..a6f408c213 --- /dev/null +++ b/locale/ru/LC_MESSAGES/reference/reference_lua/box_ctl/demote.po @@ -0,0 +1,41 @@ + +msgid "box.ctl.demote()" +msgstr "" + +msgid "Since version :doc:`2.10.0 `." +msgstr "" + +msgid "Revoke the leader role from the instance." +msgstr "" + +msgid "" +"On :ref:`synchronous transaction queue owner `, the " +"function works in the following way:" +msgstr "" + +msgid "" +"If :ref:`box.cfg.election_mode ` is ``off``, " +"the function writes a ``DEMOTE`` request to WAL. The ``DEMOTE`` request " +"clears the ownership of the synchronous transaction queue, while the " +"``PROMOTE`` request assigns it to a new instance." +msgstr "" + +msgid "" +"If :ref:`box.cfg.election_mode ` is enabled " +"in any mode, then the function makes the instance start a new term and give " +"up the leader role." +msgstr "" + +msgid "" +"On instances that are not queue owners, the function does nothing and " +"returns immediately." +msgstr "" + +msgid "Parameters: none" +msgstr "" + +msgid "return" +msgstr "" + +msgid "nil" +msgstr "" diff --git a/locale/ru/LC_MESSAGES/reference/reference_lua/box_ctl/is_recovery_finished.po b/locale/ru/LC_MESSAGES/reference/reference_lua/box_ctl/is_recovery_finished.po index f62ac1823b..aba0973a44 100644 --- a/locale/ru/LC_MESSAGES/reference/reference_lua/box_ctl/is_recovery_finished.po +++ b/locale/ru/LC_MESSAGES/reference/reference_lua/box_ctl/is_recovery_finished.po @@ -2,6 +2,9 @@ msgid "box.ctl.is_recovery_finished()" msgstr "" +msgid "Since version :doc:`2.5.3 `." +msgstr "" + msgid "" "Check whether the :ref:`recovery process ` has " "finished. Until it has finished, space changes such as ``insert`` or " @@ -20,5 +23,5 @@ msgstr "возвращаемое значение" msgid "boolean" msgstr "boolean (логический)" -msgid "Added in release :doc:`2.5.3 `." -msgstr "" +#~ msgid "Added in release :doc:`2.5.3 `." +#~ msgstr "" diff --git a/locale/ru/LC_MESSAGES/reference/reference_lua/box_ctl/make_bootstrap_leader.po b/locale/ru/LC_MESSAGES/reference/reference_lua/box_ctl/make_bootstrap_leader.po new file mode 100644 index 0000000000..cff9f4cfb8 --- /dev/null +++ b/locale/ru/LC_MESSAGES/reference/reference_lua/box_ctl/make_bootstrap_leader.po @@ -0,0 +1,27 @@ + +msgid "box.ctl.make_bootstrap_leader()" +msgstr "" + +msgid "**Since:** :doc:`3.0.0 `." +msgstr "" + +msgid "Make the instance a bootstrap leader of a replica set." +msgstr "" + +msgid "" +"To be able to make the instance a bootstrap leader manually, the " +":ref:`replication.bootstrap_strategy " +"` configuration " +"option should be set to ``supervised``. In this case, the instances do not " +"choose a bootstrap leader automatically but wait for it to be appointed " +"manually. Configuration fails if no bootstrap leader is appointed during a " +":ref:`replication.connect_timeout " +"`." +msgstr "" + +msgid "" +"When a new instance joins a replica set configured with the ``supervised`` " +"bootstrap strategy, this instance doesn't choose the bootstrap leader " +"automatically but joins to the instance on which " +"``box.ctl.make_bootstrap_leader()`` was executed last time." +msgstr "" diff --git a/locale/ru/LC_MESSAGES/reference/reference_lua/box_ctl/on_election.po b/locale/ru/LC_MESSAGES/reference/reference_lua/box_ctl/on_election.po new file mode 100644 index 0000000000..914b81bb2b --- /dev/null +++ b/locale/ru/LC_MESSAGES/reference/reference_lua/box_ctl/on_election.po @@ -0,0 +1,30 @@ + +msgid "box.ctl.on_election()" +msgstr "" + +msgid "**Since:** :doc:`2.10.0 `" +msgstr "" + +msgid "" +"Create a :ref:`trigger ` executed every time the current state of " +"a replica set node in regard to :ref:`leader election ` " +"changes. The current state is available in the :ref:`box.info.election " +"` table." +msgstr "" + +msgid "" +"The trigger doesn't accept any parameters. You can see the changes in " +"``box.info.election`` and :ref:`box.info.synchro `." +msgstr "" + +msgid "Parameters" +msgstr "" + +msgid "a trigger function" +msgstr "" + +msgid "return" +msgstr "" + +msgid "``nil`` or a function pointer" +msgstr "" diff --git a/locale/ru/LC_MESSAGES/reference/reference_lua/box_ctl/on_recovery_state.po b/locale/ru/LC_MESSAGES/reference/reference_lua/box_ctl/on_recovery_state.po new file mode 100644 index 0000000000..7634ff345a --- /dev/null +++ b/locale/ru/LC_MESSAGES/reference/reference_lua/box_ctl/on_recovery_state.po @@ -0,0 +1,81 @@ + +msgid "box.ctl.on_recovery_state()" +msgstr "" + +msgid "**Since:** :doc:`2.11.0 `" +msgstr "" + +msgid "" +"Create a :ref:`trigger ` executed on different stages of a node " +":ref:`recovery ` or initial configuration. Note " +"that you need to set the ``box.ctl.on_recovery_state`` trigger before the " +"initial :ref:`box.cfg ` call." +msgstr "" + +msgid "Parameters" +msgstr "" + +msgid "a trigger function" +msgstr "" + +msgid "return" +msgstr "" + +msgid "``nil`` or a function pointer" +msgstr "" + +msgid "" +"A registered trigger function is run on each of the supported recovery state" +" and receives the state name as a parameter:" +msgstr "" + +msgid "``snapshot_recovered``: the node has recovered the snapshot files." +msgstr "" + +msgid "``wal_recovered``: the node has recovered the WAL files." +msgstr "" + +msgid "" +"``indexes_built``: the node has built secondary indexes for memtx spaces. " +"This stage might come before any actual data is recovered. This means that " +"the indexes are available right after the first tuple is recovered." +msgstr "" + +msgid "" +"``synced``: the node has synced with enough remote peers. This means that " +"the node changes the state from :ref:`orphan ` to ``running``." +msgstr "" + +msgid "" +"All these states are passed during the initial ``box.cfg`` call when " +"recovering from the snapshot and WAL files. Note that the ``synced`` state " +"might be reached after the initial ``box.cfg`` call finishes. For example, " +"if :ref:`replication_sync_timeout ` is set to 0, the node finishes ``box.cfg`` " +"without reaching ``synced`` and stays ``orphan``. Once the node is synced " +"with enough remote peers, the ``synced`` state is reached." +msgstr "" + +msgid "" +"When bootstrapping a fresh cluster with no data, all the instances in this " +"cluster execute triggers on the same stages for consistency. For example, " +"``snapshot_recovered`` and ``wal_recovered`` run when the node finishes a " +"cluster's bootstrap or finishes joining to an existing cluster." +msgstr "" + +msgid "**Example:**" +msgstr "" + +msgid "" +"The example below shows how to :ref:`log ` a specified message " +"when each state is reached." +msgstr "" + +msgid "" +"local log = require('log')\n" +"local log_recovery_state = function(state)\n" +" log.info(state .. ' state reached')\n" +"end\n" +"box.ctl.on_recovery_state(log_recovery_state)\n" +msgstr "" diff --git a/locale/ru/LC_MESSAGES/reference/reference_lua/box_ctl/on_shutdown.po b/locale/ru/LC_MESSAGES/reference/reference_lua/box_ctl/on_shutdown.po index 0d51fb9ae0..81f81c2b0a 100644 --- a/locale/ru/LC_MESSAGES/reference/reference_lua/box_ctl/on_shutdown.po +++ b/locale/ru/LC_MESSAGES/reference/reference_lua/box_ctl/on_shutdown.po @@ -2,13 +2,6 @@ msgid "box.ctl.on_shutdown()" msgstr "" -msgid "" -"Details about trigger characteristics are in the :ref:`triggers ` section." -msgstr "" -"Подробная информация о характеристиках триггера находится в разделе " -":ref:`Триггеры `." - msgid "" "Create a \"shutdown :ref:`trigger `\". The ``trigger-function`` " "will be executed whenever :ref:`os.exit() ` happens, or when the " @@ -45,8 +38,15 @@ msgstr "" "удален." msgid "" -"If you want to set a timeout for this trigger, " -"use the :ref:`set_on_shutdown_timeout ` function." +"If you want to set a timeout for this trigger, use the " +":ref:`set_on_shutdown_timeout ` function." msgstr "" -"Если вы хотите установить таймаут для этого триггера, " -"используйте функцию :ref:`set_on_shutdown_timeout `." +"Если вы хотите установить таймаут для этого триггера, используйте функцию " +":ref:`set_on_shutdown_timeout `." + +#~ msgid "" +#~ "Details about trigger characteristics are in the :ref:`triggers ` section." +#~ msgstr "" +#~ "Подробная информация о характеристиках триггера находится в разделе " +#~ ":ref:`Триггеры `." diff --git a/locale/ru/LC_MESSAGES/reference/reference_lua/box_ctl/promote.po b/locale/ru/LC_MESSAGES/reference/reference_lua/box_ctl/promote.po index 206438e2c8..9812b597ca 100644 --- a/locale/ru/LC_MESSAGES/reference/reference_lua/box_ctl/promote.po +++ b/locale/ru/LC_MESSAGES/reference/reference_lua/box_ctl/promote.po @@ -2,16 +2,21 @@ msgid "box.ctl.promote()" msgstr "" +msgid "" +"Since version :doc:`2.6.2 `. Renamed in release :doc:`2.6.3 " +"`." +msgstr "" + msgid "Wait, then choose new replication leader." msgstr "" msgid "" -"For :ref:`synchronous transactions ` it is " -"possible that a new leader will be chosen but the transactions of the old " -"leader have not been completed. Therefore to finalize the transaction, the " -"function ``box.ctl.promote()`` should be called, as mentioned in the notes " -"for :ref:`leader election `. The old name for " -"this function is ``box.ctl.clear_synchro_queue()``." +"For :ref:`synchronous transactions ` it is possible that a new " +"leader will be chosen but the transactions of the old leader have not been " +"completed. Therefore to finalize the transaction, the function " +"``box.ctl.promote()`` should be called, as mentioned in the notes for " +":ref:`leader election `. The old name for this " +"function is ``box.ctl.clear_synchro_queue()``." msgstr "" msgid "" @@ -27,7 +32,16 @@ msgstr "возвращает" msgid "nil or function pointer" msgstr "nil или указатель функции" -msgid "" -"Added in release :doc:`2.6.2 `. Renamed in release " -":doc:`2.6.3 `." -msgstr "" +#~ msgid "" +#~ "For :ref:`synchronous transactions ` it is possible that a" +#~ " new leader will be chosen but the transactions of the old leader have not " +#~ "been completed. Therefore to finalize the transaction, the function " +#~ "``box.ctl.promote()`` should be called, as mentioned in the notes for " +#~ ":ref:`leader election `. The old name for this " +#~ "function is ``box.ctl.clear_synchro_queue()``." +#~ msgstr "" + +#~ msgid "" +#~ "Added in release :doc:`2.6.2 `. Renamed in release " +#~ ":doc:`2.6.3 `." +#~ msgstr "" diff --git a/locale/ru/LC_MESSAGES/reference/reference_lua/box_ctl/set_on_shutdown_timeout.po b/locale/ru/LC_MESSAGES/reference/reference_lua/box_ctl/set_on_shutdown_timeout.po new file mode 100644 index 0000000000..69a0ddc0d4 --- /dev/null +++ b/locale/ru/LC_MESSAGES/reference/reference_lua/box_ctl/set_on_shutdown_timeout.po @@ -0,0 +1,23 @@ + +msgid "box.ctl.set_on_shutdown_timeout()" +msgstr "" + +msgid "" +"Set a timeout for the :ref:`on_shutdown ` trigger. If " +"the timeout has expired, the server stops immediately regardless of whether " +"any ``on_shutdown`` triggers are left unexecuted." +msgstr "" + +msgid "Parameters" +msgstr "" + +msgid "" +"time to wait for the trigger to be completed. The default value is 3 " +"seconds." +msgstr "" + +msgid "return" +msgstr "" + +msgid "nil" +msgstr "" diff --git a/locale/ru/LC_MESSAGES/reference/reference_lua/box_error.po b/locale/ru/LC_MESSAGES/reference/reference_lua/box_error.po index bffb9e978c..d986238d83 100644 --- a/locale/ru/LC_MESSAGES/reference/reference_lua/box_error.po +++ b/locale/ru/LC_MESSAGES/reference/reference_lua/box_error.po @@ -3,11 +3,17 @@ msgid "Submodule box.error" msgstr "Вложенный модуль box.error" msgid "" -"The ``box.error`` function is for raising an error. The difference between " -"this function and Lua's built-in `error `_" -" function is that when the error reaches the client, its error code is " -"preserved. In contrast, a Lua error would always be presented to the client " -"as :errcode:`ER_PROC_LUA`." +"The ``box.error`` submodule can be used to work with errors in your " +"application. For example, you can get the information about the last error " +"raised by Tarantool or raise custom errors manually." +msgstr "" + +#, fuzzy +msgid "" +"The difference between raising an error using ``box.error`` and a Lua's " +"built-in `error `_ function is that when " +"the error reaches the client, its error code is preserved. In contrast, a " +"Lua error would always be presented to the client as :errcode:`ER_PROC_LUA`." msgstr "" "Функция ``box.error`` предназначена для вызова ошибки. Разница между этой " "функцией и встроенной Lua-функцией `error " @@ -15,7 +21,390 @@ msgstr "" "ошибку, код ошибки сохраняется. В отличие от этого, ошибки в Lua всегда " "передаются на клиент в виде :errcode:`ER_PROC_LUA`." -msgid "Below is a list of all ``box.error`` functions." +msgid "" +"To learn how to handle errors in your application, see the :ref:`Handling " +"errors ` section." +msgstr "" + +#, fuzzy +msgid "Creating an error" +msgstr "Выдача ошибки" + +msgid "" +"You can create an error object using the :ref:`box.error.new() ` function. The created object can be passed to :ref:`box.error() " +"` to raise the error. You can also raise the error using " +":ref:`error_object:raise() `." +msgstr "" + +msgid "" +"The example below shows how to create and raise the error with the specified" +" code and reason." +msgstr "" + +msgid "" +"local custom_error = box.error.new({ code = 500,\n" +" reason = 'Internal server error' })\n" +"\n" +"box.error(custom_error)\n" +"--[[\n" +"---\n" +"- error: Internal server error\n" +"...\n" +"--]]\n" +msgstr "" + +msgid "" +"``box.error.new()`` provides different overloads for creating an error " +"object with different parameters. These overloads are similar to the " +"``box.error()`` overloads described in the :ref:`next section " +"`." +msgstr "" + +#, fuzzy +msgid "Raising an error" +msgstr "Выдача ошибки" + +msgid "" +"To raise an error, call the :ref:`box.error() ` function. " +"This function can accept the specified error parameters or an error object " +":ref:`created using box.error.new() `. In both " +"cases, you can use ``box.error()`` to raise the following error types:" +msgstr "" + +msgid "A custom error with the specified reason, code, and type." +msgstr "" + +msgid "A predefined Tarantool error." +msgstr "" + +#, fuzzy +msgid "Custom error" +msgstr "Создание пользовательского типа ошибок" + +msgid "" +"The following ``box.error()`` overloads are available for raising a custom " +"error:" +msgstr "" + +msgid "" +":ref:`box.error({ reason = string[, code = number, type = string] }) " +"` accepts a Lua table containing the error reason, " +"code, and type." +msgstr "" + +msgid "" +":ref:`box.error(type, reason[, args]) ` accepts the " +"error type, its reason, and optional arguments passed to a reason's string." +msgstr "" + +msgid "" +"The same overloads are available for :ref:`box.error.new() `." +msgstr "" + +msgid "box.error({ reason = string[, ...] })" +msgstr "" + +msgid "" +"In the example below, ``box.error()`` accepts a Lua table with the specified" +" error code and reason:" +msgstr "" + +msgid "" +"box.error { code = 500,\n" +" reason = 'Custom server error' }\n" +"--[[\n" +"---\n" +"- error: Custom server error\n" +"...\n" +"--]]\n" +msgstr "" + +msgid "The next example shows how to specify a custom error type:" +msgstr "" + +msgid "" +"box.error { code = 500,\n" +" reason = 'Internal server error',\n" +" type = 'CustomInternalError' }\n" +"--[[\n" +"---\n" +"- error: Internal server error\n" +"...\n" +"--]]\n" +msgstr "" + +msgid "" +"When a custom type is specified, it is returned in the " +":ref:`error_object.type ` attribute. When it is not " +"specified, ``error_object.type`` returns one of the built-in errors, such as" +" ``ClientError`` or ``OutOfMemory``." +msgstr "" + +msgid "box.error(type, reason[, ...])" +msgstr "" + +msgid "" +"This example shows how to raise an error with the type and reason specified " +"in the ``box.error()`` arguments:" +msgstr "" + +msgid "" +"box.error('CustomConnectionError', 'cannot connect to the given port')\n" +"--[[\n" +"---\n" +"- error: cannot connect to the given port\n" +"...\n" +"--]]\n" +msgstr "" + +msgid "You can also use a format string to compose an error reason:" +msgstr "" + +#, python-format +msgid "" +"box.error('CustomConnectionError', '%s cannot connect to the port %u', 'client', 8080)\n" +"--[[\n" +"---\n" +"- error: client cannot connect to the port 8080\n" +"...\n" +"--]]\n" +msgstr "" + +#, fuzzy +msgid "Tarantool error" +msgstr "Выдача ошибки" + +msgid "" +"The :ref:`box.error(code[, ...]) ` overload " +"raises a predefined :ref:`Tarantool error ` specified by its " +"identifier. The error code defines the error message format and the number " +"of required arguments. In the example below, no arguments are passed for the" +" ``box.error.READONLY`` error code:" +msgstr "" + +msgid "" +"box.error(box.error.READONLY)\n" +"--[[\n" +"---\n" +"- error: Can't modify data on a read-only instance\n" +"...\n" +"--]]\n" +msgstr "" + +msgid "" +"For the ``box.error.NO_SUCH_USER`` error code, you need to pass one " +"argument:" +msgstr "" + +msgid "" +"box.error(box.error.NO_SUCH_USER, 'John')\n" +"--[[\n" +"---\n" +"- error: User 'John' is not found\n" +"...\n" +"--]]\n" +msgstr "" + +msgid "``box.error.CREATE_SPACE`` requires two arguments:" +msgstr "" + +msgid "" +"box.error(box.error.CREATE_SPACE, 'my_space', 'the space already exists')\n" +"--[[\n" +"---\n" +"- error: 'Failed to create space ''my_space'': the space already exists'\n" +"...\n" +"--]]\n" +msgstr "" + +#, fuzzy +msgid "Getting the last error" +msgstr "Получение описания последней ошибки" + +msgid "" +"To get the last raised error, call :ref:`box.error.last() `:" +msgstr "" + +msgid "" +"box.error.last()\n" +"--[[\n" +"---\n" +"- error: Internal server error\n" +"...\n" +"--]]\n" +msgstr "" + +msgid "Obtaining error details" +msgstr "" + +msgid "" +"To get error details, call the :ref:`error_object.unpack() `. Error details may include an error code, type, message, and trace." +msgstr "" + +msgid "" +"box.error.last():unpack()\n" +"--[[\n" +"---\n" +"- code: 500\n" +" base_type: CustomError\n" +" type: CustomInternalError\n" +" custom_type: CustomInternalError\n" +" message: Internal server error\n" +" trace:\n" +" - file: '[string \"custom_error = box.error.new({ code = 500,...\"]'\n" +" line: 1\n" +"...\n" +"--]]\n" +msgstr "" + +#, fuzzy +msgid "Setting the last error" +msgstr "Получение описания последней ошибки" + +msgid "" +"You can set the last error explicitly by calling :ref:`box.error.set() " +"`:" +msgstr "" + +msgid "" +"-- Create two errors --\n" +"local error1 = box.error.new({ code = 500, reason = 'Custom error 1' })\n" +"local error2 = box.error.new({ code = 505, reason = 'Custom error 2' })\n" +"\n" +"-- Raise the first error --\n" +"box.error(error1)\n" +"--[[\n" +"---\n" +"- error: Custom error 1\n" +"...\n" +"--]]\n" +"\n" +"-- Get the last error --\n" +"box.error.last()\n" +"--[[\n" +"---\n" +"- Custom error 1\n" +"...\n" +"--]]\n" +"\n" +"-- Set the second error as the last error --\n" +"box.error.set(error2)\n" +"--[[\n" +"---\n" +"...\n" +"--]]\n" +"\n" +"-- Get the last error --\n" +"box.error.last()\n" +"--[[\n" +"---\n" +"- Custom error 2\n" +"...\n" +"--]]\n" +msgstr "" + +msgid "Error lists" +msgstr "" + +msgid "" +":ref:`error_object ` provides the API for organizing" +" errors into lists. To set and get the previous error, use the " +":ref:`error_object:set_prev() ` method and " +":ref:`error_object.prev ` attribute." +msgstr "" + +msgid "" +"local base_server_error = box.error.new({ code = 500,\n" +" reason = 'Base server error',\n" +" type = 'BaseServerError' })\n" +"local storage_server_error = box.error.new({ code = 507,\n" +" reason = 'Not enough storage',\n" +" type = 'StorageServerError' })\n" +"\n" +"base_server_error:set_prev(storage_server_error)\n" +"--[[\n" +"---\n" +"...\n" +"--]]\n" +"\n" +"box.error(base_server_error)\n" +"--[[\n" +"---\n" +"- error: Base server error\n" +"...\n" +"--]]\n" +"\n" +"box.error.last().prev:unpack()\n" +"--[[\n" +"---\n" +"- code: 507\n" +" base_type: CustomError\n" +" type: StorageServerError\n" +" custom_type: StorageServerError\n" +" message: Not enough storage\n" +" trace:\n" +" - file: '[string \"storage_server_error = box.error.new({ code =...\"]'\n" +" line: 1\n" +"...\n" +"--]]\n" +msgstr "" + +msgid "Cycles are not allowed for error lists:" +msgstr "" + +msgid "" +"storage_server_error:set_prev(base_server_error)\n" +"--[[\n" +"---\n" +"- error: 'builtin/error.lua:120: Cycles are not allowed'\n" +"...\n" +"--]]" +msgstr "" + +msgid "Setting the previous error does not erase its own previous members:" +msgstr "" + +msgid "" +"-- e1 -> e2 -> e3 -> e4\n" +"e1:set_prev(e2)\n" +"e2:set_prev(e3)\n" +"e3:set_prev(e4)\n" +"e2:set_prev(e5)\n" +"-- Now there are two lists: e1 -> e2 -> e5 and e3 -> e4" +msgstr "" + +msgid "" +"IPROTO also supports stacked diagnostics. See details in :ref:`MessagePack " +"extensions -- The ERROR type `." +msgstr "" + +msgid "Clearing errors" +msgstr "" + +msgid "To clear the errors, call :ref:`box.error.clear() `." +msgstr "" + +msgid "" +"box.error.clear()\n" +"--[[\n" +"---\n" +"...\n" +"--]]\n" +"box.error.last()\n" +"--[[\n" +"---\n" +"- null\n" +"...\n" +"--]]\n" +msgstr "" + +msgid "API Reference" +msgstr "" + +#, fuzzy +msgid "Below is a list of ``box.error`` functions and related objects." msgstr "Ниже приведен перечень всех функций модуля ``box.error``." msgid "Name" @@ -27,41 +416,47 @@ msgstr "Назначение" msgid ":doc:`./box_error/error`" msgstr "" -msgid "Throw an error" -msgstr "Выдача ошибки" +msgid "Raise the last error or the error defined by the specified parameters" +msgstr "" msgid ":doc:`./box_error/last`" msgstr "" -msgid "Get a description of the last error" +#, fuzzy +msgid "Get the last raised error" msgstr "Получение описания последней ошибки" msgid ":doc:`./box_error/clear`" msgstr "" -msgid "Clear the record of errors" +#, fuzzy +msgid "Clear the errors" msgstr "Очистка записи об ошибках" msgid ":doc:`./box_error/new`" msgstr "" -msgid "Create an error but do not throw" +#, fuzzy +msgid "Create the error but do not raise it" msgstr "Создание ошибки без выдачи" msgid ":doc:`./box_error/set`" msgstr "" -msgid "Set an error as ``box.error.last()``" -msgstr "Запись ошибки в ``box.error.last()``" +msgid "Set the specified error as the last system error explicitly" +msgstr "" msgid ":doc:`./box_error/error_object`" msgstr "" -msgid "Error object methods" -msgstr "Методы объекта ошибки" - -msgid ":doc:`./box_error/custom_type`" +msgid "An object that defines an error" msgstr "" -msgid "Create a custom error type" -msgstr "Создание пользовательского типа ошибок" +#~ msgid "Set an error as ``box.error.last()``" +#~ msgstr "Запись ошибки в ``box.error.last()``" + +#~ msgid "Error object methods" +#~ msgstr "Методы объекта ошибки" + +#~ msgid ":doc:`./box_error/custom_type`" +#~ msgstr "" diff --git a/locale/ru/LC_MESSAGES/reference/reference_lua/box_error/clear.po b/locale/ru/LC_MESSAGES/reference/reference_lua/box_error/clear.po index 9741ac6aa7..ffe9eb23bb 100644 --- a/locale/ru/LC_MESSAGES/reference/reference_lua/box_error/clear.po +++ b/locale/ru/LC_MESSAGES/reference/reference_lua/box_error/clear.po @@ -2,26 +2,44 @@ msgid "box.error.clear()" msgstr "" -msgid "" -"Clear the record of errors, so functions like ``box.error()`` or " -"``box.error.last()`` will have no effect." +msgid "Clear the errors." msgstr "" -"Очистка записи об ошибках, то есть функции ``box.error()`` или " -"``box.error.last()`` не сработают." -msgid "**Example:**" +#, fuzzy +msgid "**Example**" msgstr "**Пример:**" msgid "" -"tarantool> box.error.last()\n" -"---\n" -"- Invalid identifier '' (expected printable symbols only or it is too long)\n" -"...\n" -"tarantool> box.error.clear()\n" +"box.error.clear()\n" +"--[[\n" "---\n" "...\n" -"tarantool> box.error.last()\n" +"--]]\n" +"box.error.last()\n" +"--[[\n" "---\n" "- null\n" -"..." +"...\n" +"--]]\n" msgstr "" + +#~ msgid "" +#~ "Clear the record of errors, so functions like ``box.error()`` or " +#~ "``box.error.last()`` will have no effect." +#~ msgstr "" +#~ "Очистка записи об ошибках, то есть функции ``box.error()`` или " +#~ "``box.error.last()`` не сработают." + +#~ msgid "" +#~ "tarantool> box.error.last()\n" +#~ "---\n" +#~ "- Invalid identifier '' (expected printable symbols only or it is too long)\n" +#~ "...\n" +#~ "tarantool> box.error.clear()\n" +#~ "---\n" +#~ "...\n" +#~ "tarantool> box.error.last()\n" +#~ "---\n" +#~ "- null\n" +#~ "..." +#~ msgstr "" diff --git a/locale/ru/LC_MESSAGES/reference/reference_lua/box_error/error.po b/locale/ru/LC_MESSAGES/reference/reference_lua/box_error/error.po index bb69170e82..25c6425860 100644 --- a/locale/ru/LC_MESSAGES/reference/reference_lua/box_error/error.po +++ b/locale/ru/LC_MESSAGES/reference/reference_lua/box_error/error.po @@ -2,111 +2,262 @@ msgid "box.error()" msgstr "" -msgid "" -"When called without arguments, ``box.error()`` re-throws whatever the last " -"error was." +msgid "Raise the last error." +msgstr "" + +msgid "**See also:** :ref:`box.error.last() `" msgstr "" -"При вызове без аргументов ``box.error()`` повторно вызывает последнюю " -"ошибку." msgid "" -"Throw an error. When called with a Lua-table argument, the code and reason " -"have any user-desired values. The result will be those values." +"Raise the error defined by :ref:`error_object `." msgstr "" -"Выдача ошибки. При вызове с аргументом из Lua-таблицы значения параметров " -"code и reason будут любыми по желанию пользователя. Результатом будут эти " -"значения." msgid "Parameters" msgstr "Параметры" -msgid "description of an error, defined by user" -msgstr "(строка) описание ошибки, задается пользователем" +msgid "an error object" +msgstr "" -msgid "numeric code for this error, defined by user" -msgstr "(целое число) числовой код ошибки, задается пользователем" +#, fuzzy +msgid "**Example**" +msgstr "**Пример:**" msgid "" -"Throw an error. This method emulates a request error, with text based on one" -" of the pre-defined Tarantool errors defined in the file `errcode.h " -"`_ in the" -" source tree. Lua constants which correspond to those Tarantool errors are " -"defined as members of ``box.error``, for example ``box.error.NO_SUCH_USER ==" -" 45``." +"local custom_error = box.error.new({ code = 500,\n" +" reason = 'Internal server error' })\n" +"\n" +"box.error(custom_error)\n" +"--[[\n" +"---\n" +"- error: Internal server error\n" +"...\n" +"--]]\n" msgstr "" -"Выдача ошибки. Моделирование ошибки запроса с текстом на основе одной из " -"ошибок Tarantool, заданных в файле `errcode.h " -"`_ в " -"исходном дереве. Lua-постоянные, которые соответствуют этим ошибкам в " -"Tarantool, определяются как элементы ``box.error``, например " -"``box.error.NO_SUCH_USER == 45``." -msgid "number of a pre-defined error" -msgstr "номер предварительно заданной ошибки" +msgid "Raise the error defined by the specified parameters." +msgstr "" -msgid "part of the message which will accompany the error" -msgstr "часть сообщения, которое сопровождает ошибку" +msgid "an error description" +msgstr "" -msgid "For example:" -msgstr "Пример:" +#, fuzzy +msgid "(optional) a numeric code for this error" +msgstr "(целое число) числовой код ошибки, задается пользователем" -msgid "" -"the ``NO_SUCH_USER`` message is \"``User '%s' is not found``\" -- it " -"includes one \"``%s``\" component which will be replaced with errtext. Thus " -"a call to ``box.error(box.error.NO_SUCH_USER, 'joe')`` or ``box.error(45, " -"'joe')`` will result in an error with the accompanying message \"``User " -"'joe' is not found``\"." +msgid "(optional) an error type" msgstr "" -"сообщение ``NO_SUCH_USER`` = \"``User '%s' is not found``\" (пользователь не" -" найден) -- оно включает в себя компонент \"``%s``\", который будет заменен " -"значением параметра errtext. Таким образом, вызов " -"``box.error(box.error.NO_SUCH_USER, 'joe')`` или ``box.error(45, 'joe')`` " -"приведет к ошибке с сообщением \"``User 'joe' is not found``\" (пользователь" -" 'joe' не найден)." -msgid "except" -msgstr "Исключение" +#, fuzzy +msgid "**Example 1**" +msgstr "**Пример:**" -msgid "whatever is specified in errcode-number." -msgstr "то, что указано в номере errcode." +msgid "" +"box.error { code = 500,\n" +" reason = 'Custom server error' }\n" +"--[[\n" +"---\n" +"- error: Custom server error\n" +"...\n" +"--]]\n" +msgstr "" -msgid "``box.error()`` accepts two sets of arguments:" -msgstr "``box.error()`` может принимать два типа аргументов:" +#, fuzzy +msgid "**Example 2: custom type**" +msgstr "**Пример:**" msgid "" -"error code and reason/errtext (``box.error{code = 555, reason = 'Arbitrary " -"message'}``), or" +"box.error { code = 500,\n" +" reason = 'Internal server error',\n" +" type = 'CustomInternalError' }\n" +"--[[\n" +"---\n" +"- error: Internal server error\n" +"...\n" +"--]]\n" msgstr "" -"код ошибки и ее причину/текст (``box.error{code = 555, reason = 'Arbitrary " -"message'}``)," -msgid "error object (``box.error(err)``)." -msgstr "либо объект ошибки (``box.error(err)``)." +msgid "Raise the error defined by the specified type and description." +msgstr "" -msgid "In both cases the error is promoted as the last error." -msgstr "В обоих случаях ошибка будет записана как последняя системная ошибка." +msgid "an error type" +msgstr "" -msgid "**Example:**" -msgstr "**Пример:**" +msgid "description arguments" +msgstr "" + +msgid "**Example 1: without arguments**" +msgstr "" msgid "" -"tarantool> e1 = box.error.new({code = 111, reason = 'Сause'})\n" +"box.error('CustomConnectionError', 'cannot connect to the given port')\n" +"--[[\n" "---\n" +"- error: cannot connect to the given port\n" "...\n" -"tarantool> box.error(e1)\n" +"--]]\n" +msgstr "" + +msgid "**Example 2: with arguments**" +msgstr "" + +#, python-format +msgid "" +"box.error('CustomConnectionError', '%s cannot connect to the port %u', 'client', 8080)\n" +"--[[\n" "---\n" -"- error: Сause\n" +"- error: client cannot connect to the port 8080\n" "...\n" -"tarantool> box.error{code = 555, reason = 'Arbitrary message'}\n" +"--]]\n" +msgstr "" + +msgid "" +"Raise a predefined :ref:`Tarantool error ` specified by its " +"identifier. You can see all Tarantool errors in the `errcode.h " +"`_ " +"file." +msgstr "" + +msgid "" +"a pre-defined error identifier; Lua constants that correspond to those " +"Tarantool errors are defined as members of ``box.error``, for example, " +"``box.error.NO_SUCH_USER == 45``" +msgstr "" + +#, fuzzy +msgid "**Example 1: no arguments**" +msgstr "**Пример:**" + +msgid "" +"box.error(box.error.READONLY)\n" +"--[[\n" "---\n" -"- error: Arbitrary message\n" +"- error: Can't modify data on a read-only instance\n" "...\n" -"tarantool> box.error()\n" +"--]]\n" +msgstr "" + +#, fuzzy +msgid "**Example 2: one argument**" +msgstr "**Пример:**" + +msgid "" +"box.error(box.error.NO_SUCH_USER, 'John')\n" +"--[[\n" "---\n" -"- error: Arbitrary message\n" +"- error: User 'John' is not found\n" "...\n" -"tarantool> box.error(box.error.FUNCTION_ACCESS_DENIED, 'A', 'B', 'C')\n" +"--]]\n" +msgstr "" + +#, fuzzy +msgid "**Example 3: two arguments**" +msgstr "**Пример:**" + +msgid "" +"box.error(box.error.CREATE_SPACE, 'my_space', 'the space already exists')\n" +"--[[\n" "---\n" -"- error: A access denied for user 'B' to function 'C'\n" -"..." +"- error: 'Failed to create space ''my_space'': the space already exists'\n" +"...\n" +"--]]\n" msgstr "" + +#~ msgid "" +#~ "When called without arguments, ``box.error()`` re-throws whatever the last " +#~ "error was." +#~ msgstr "" +#~ "При вызове без аргументов ``box.error()`` повторно вызывает последнюю " +#~ "ошибку." + +#~ msgid "" +#~ "Throw an error. When called with a Lua-table argument, the code and reason " +#~ "have any user-desired values. The result will be those values." +#~ msgstr "" +#~ "Выдача ошибки. При вызове с аргументом из Lua-таблицы значения параметров " +#~ "code и reason будут любыми по желанию пользователя. Результатом будут эти " +#~ "значения." + +#~ msgid "description of an error, defined by user" +#~ msgstr "(строка) описание ошибки, задается пользователем" + +#~ msgid "" +#~ "Throw an error. This method emulates a request error, with text based on one" +#~ " of the pre-defined Tarantool errors defined in the file `errcode.h " +#~ "`_ in " +#~ "the source tree. Lua constants which correspond to those Tarantool errors " +#~ "are defined as members of ``box.error``, for example " +#~ "``box.error.NO_SUCH_USER == 45``." +#~ msgstr "" +#~ "Выдача ошибки. Моделирование ошибки запроса с текстом на основе одной из " +#~ "ошибок Tarantool, заданных в файле `errcode.h " +#~ "`_ в " +#~ "исходном дереве. Lua-постоянные, которые соответствуют этим ошибкам в " +#~ "Tarantool, определяются как элементы ``box.error``, например " +#~ "``box.error.NO_SUCH_USER == 45``." + +#~ msgid "number of a pre-defined error" +#~ msgstr "номер предварительно заданной ошибки" + +#~ msgid "part of the message which will accompany the error" +#~ msgstr "часть сообщения, которое сопровождает ошибку" + +#~ msgid "For example:" +#~ msgstr "Пример:" + +#~ msgid "" +#~ "the ``NO_SUCH_USER`` message is \"``User '%s' is not found``\" -- it " +#~ "includes one \"``%s``\" component which will be replaced with errtext. Thus " +#~ "a call to ``box.error(box.error.NO_SUCH_USER, 'joe')`` or ``box.error(45, " +#~ "'joe')`` will result in an error with the accompanying message \"``User " +#~ "'joe' is not found``\"." +#~ msgstr "" +#~ "сообщение ``NO_SUCH_USER`` = \"``User '%s' is not found``\" (пользователь не" +#~ " найден) -- оно включает в себя компонент \"``%s``\", который будет заменен " +#~ "значением параметра errtext. Таким образом, вызов " +#~ "``box.error(box.error.NO_SUCH_USER, 'joe')`` или ``box.error(45, 'joe')`` " +#~ "приведет к ошибке с сообщением \"``User 'joe' is not found``\" (пользователь" +#~ " 'joe' не найден)." + +#~ msgid "except" +#~ msgstr "Исключение" + +#~ msgid "whatever is specified in errcode-number." +#~ msgstr "то, что указано в номере errcode." + +#~ msgid "``box.error()`` accepts two sets of arguments:" +#~ msgstr "``box.error()`` может принимать два типа аргументов:" + +#~ msgid "" +#~ "error code and reason/errtext (``box.error{code = 555, reason = 'Arbitrary " +#~ "message'}``), or" +#~ msgstr "" +#~ "код ошибки и ее причину/текст (``box.error{code = 555, reason = 'Arbitrary " +#~ "message'}``)," + +#~ msgid "error object (``box.error(err)``)." +#~ msgstr "либо объект ошибки (``box.error(err)``)." + +#~ msgid "In both cases the error is promoted as the last error." +#~ msgstr "В обоих случаях ошибка будет записана как последняя системная ошибка." + +#~ msgid "" +#~ "tarantool> e1 = box.error.new({code = 111, reason = 'Сause'})\n" +#~ "---\n" +#~ "...\n" +#~ "tarantool> box.error(e1)\n" +#~ "---\n" +#~ "- error: Сause\n" +#~ "...\n" +#~ "tarantool> box.error{code = 555, reason = 'Arbitrary message'}\n" +#~ "---\n" +#~ "- error: Arbitrary message\n" +#~ "...\n" +#~ "tarantool> box.error()\n" +#~ "---\n" +#~ "- error: Arbitrary message\n" +#~ "...\n" +#~ "tarantool> box.error(box.error.FUNCTION_ACCESS_DENIED, 'A', 'B', 'C')\n" +#~ "---\n" +#~ "- error: A access denied for user 'B' to function 'C'\n" +#~ "..." +#~ msgstr "" diff --git a/locale/ru/LC_MESSAGES/reference/reference_lua/box_error/error_object.po b/locale/ru/LC_MESSAGES/reference/reference_lua/box_error/error_object.po index 6c6b9d5bf7..b5d2757242 100644 --- a/locale/ru/LC_MESSAGES/reference/reference_lua/box_error/error_object.po +++ b/locale/ru/LC_MESSAGES/reference/reference_lua/box_error/error_object.po @@ -3,66 +3,246 @@ msgid "error_object" msgstr "" msgid "" -"Since version :doc:`2.4.1 `. Errors can be organized into " -"lists. To achieve this, a Lua table representing an error object has " -"``.prev`` field and ``e:set_prev(err)`` method." +"An object that defines an error. ``error_object`` is returned by the " +"following methods:" msgstr "" -msgid "Return a previous error, if any." -msgstr "Возврат предыдущей ошибки, если она существует." +msgid ":ref:`box.error.new() `" +msgstr "" + +msgid ":ref:`box.error.last() `" +msgstr "" msgid "" -"Set an error as the previous error. Accepts an ``error object`` or ``nil``." +"Get error details that may include an error code, type, message, and trace." msgstr "" -"Установка ошибки в качестве предыдущей. Принимает объект ошибки или ``nil``." -msgid "**Example:**" +#, fuzzy +msgid "**Example**" msgstr "**Пример:**" msgid "" -"tarantool> e1 = box.error.new({code = 111, reason = 'some cause'})\n" -"---\n" -"...\n" -"tarantool> e2 = box.error.new({code = 111, reason = 'cause of cause'})\n" +"box.error.last():unpack()\n" +"--[[\n" "---\n" +"- code: 500\n" +" base_type: CustomError\n" +" type: CustomInternalError\n" +" custom_type: CustomInternalError\n" +" message: Internal server error\n" +" trace:\n" +" - file: '[string \"custom_error = box.error.new({ code = 500,...\"]'\n" +" line: 1\n" "...\n" -"tarantool> e1:set_prev(e2)\n" -"---\n" -"...\n" -"tarantool> e1.prev\n" -"---\n" -"- cause of cause\n" -"..." +"--]]\n" +msgstr "" + +msgid "" +"Depending on the error type, error details may include other attributes, " +"such as :ref:`errno ` or :ref:`reason `." +msgstr "" + +msgid "Raise the current error." +msgstr "" + +msgid "**See also:** :ref:`Raising an error `" +msgstr "" + +msgid "**Since:** :doc:`2.4.1 `" +msgstr "" + +#, fuzzy +msgid "Set the previous error for the current one." +msgstr "Возврат предыдущей ошибки, если она существует." + +msgid "Parameters" msgstr "" -msgid "Cycles are not allowed for error lists:" -msgstr "Циклы для списков ошибок недопустимы:" +msgid "an error object" +msgstr "" + +msgid "**See also:** :ref:`Error lists `" +msgstr "" + +#, fuzzy +msgid "Get the previous error for the current one." +msgstr "Возврат предыдущей ошибки, если она существует." + +msgid "rtype" +msgstr "" msgid "" -"tarantool> e2:set_prev(e1)\n" -"---\n" -"- error: 'builtin/error.lua:147: Cycles are not allowed'\n" -"..." +"The error code. This attribute may return a :ref:`custom error " +"` code or a :ref:`Tarantool error " +"` code." +msgstr "" + +msgid "number" +msgstr "" + +msgid "The error type." +msgstr "" + +msgid "string" msgstr "" -msgid "Setting the previous error does not erase its own previous members:" +msgid "**See also:** :ref:`Custom error `" +msgstr "" + +msgid "The error message." +msgstr "" + +msgid "The error trace." +msgstr "" + +msgid "table" msgstr "" -"Установка предыдущей ошибки подтягивает за ней ее собственные предыдущие " -"ошибки:" msgid "" -"-- e1 -> e2 -> e3 -> e4\n" -"e1:set_prev(e2)\n" -"e2:set_prev(e3)\n" -"e3:set_prev(e4)\n" -"e2:set_prev(e5)\n" -"-- Now there are two lists: e1->e2->e5 and e3->e4" +"If the error is a system error (for example, a socket or file IO failure), " +"returns a C standard error number." +msgstr "" + +msgid "**Since:** :doc:`2.10.0 `" msgstr "" msgid "" -"The iProto protocol also supports stacked diagnostics. See details in " -":ref:`MessagePack extensions -- The ERROR type `." +"Returns the :ref:`box.info.ro_reason ` value at " +"the moment of throwing the ``box.error.READONLY`` error." msgstr "" -"Протокол IProto тоже поддерживает диагностику с помощью стека ошибок. " -"Подробнее в разделе :ref:`Дополнительные типы MessagePack -- Тип ERROR " -"`." + +msgid "The following values may be returned:" +msgstr "" + +msgid "" +"``election`` if the instance has :ref:`box.cfg.election_mode " +"` set to a value other than ``off`` and this " +"instance is not a leader. In this case, ``error_object`` may include the " +"following attributes: ``state``, ``leader_id``, ``leader_uuid``, and " +"``term``." +msgstr "" + +msgid "" +"``synchro`` if the synchronous queue has an owner that is not the given " +"instance. This error usually happens if :ref:`synchronous replication " +"` is used and another instance is called :ref:`box.ctl.promote() " +"`. In this case, ``error_object`` may include the " +"``queue_owner_id``, ``queue_owner_uuid``, and ``term`` attributes." +msgstr "" + +msgid "" +"``config`` if the :ref:`box.cfg.read_only ` is set to " +"``true``." +msgstr "" + +msgid "" +"``orphan`` if the instance is in the :ref:`orphan ` state." +msgstr "" + +msgid "" +"If multiple reasons are true at the same time, then only one is returned in " +"the following order of preference: ``election``, ``synchro``, ``config``, " +"``orphan``." +msgstr "" + +msgid "" +"For the ``box.error.READONLY`` error, returns the current state of a replica" +" set node in regards to leader election (see :ref:`box.info.election.state " +"`). This attribute presents if the :ref:`error reason " +"` is ``election``." +msgstr "" + +msgid "" +"For the ``box.error.READONLY`` error, returns a numeric identifier " +"(:ref:`box.info.id `) of the replica set leader." +" This attribute may present if the :ref:`error reason ` is" +" ``election``." +msgstr "" + +msgid "" +"For the ``box.error.READONLY`` error, returns a globally unique identifier " +"(:ref:`box.info.uuid `) of the replica set " +"leader. This attribute may present if the :ref:`error reason ` is ``election``." +msgstr "" + +msgid "" +"For the ``box.error.READONLY`` error, returns a numeric identifier " +"(:ref:`box.info.id `) of the synchronous queue " +"owner. This attribute may present if the :ref:`error reason ` is ``synchro``." +msgstr "" + +msgid "" +"For the ``box.error.READONLY`` error, returns a globally unique identifier " +"(:ref:`box.info.uuid `) of the synchronous queue" +" owner. This attribute may present if the :ref:`error reason ` is ``synchro``." +msgstr "" + +msgid "" +"For the ``box.error.READONLY`` error, returns the current election term (see" +" :ref:`box.info.election.term `). This attribute may " +"present if the :ref:`error reason ` is ``election`` or " +"``synchro``." +msgstr "" + +#~ msgid "" +#~ "Since version :doc:`2.4.1 `. Errors can be organized into " +#~ "lists. To achieve this, a Lua table representing an error object has " +#~ "``.prev`` field and ``e:set_prev(err)`` method." +#~ msgstr "" + +#~ msgid "" +#~ "Set an error as the previous error. Accepts an ``error object`` or ``nil``." +#~ msgstr "" +#~ "Установка ошибки в качестве предыдущей. Принимает объект ошибки или ``nil``." + +#~ msgid "" +#~ "tarantool> e1 = box.error.new({code = 111, reason = 'some cause'})\n" +#~ "---\n" +#~ "...\n" +#~ "tarantool> e2 = box.error.new({code = 111, reason = 'cause of cause'})\n" +#~ "---\n" +#~ "...\n" +#~ "tarantool> e1:set_prev(e2)\n" +#~ "---\n" +#~ "...\n" +#~ "tarantool> e1.prev\n" +#~ "---\n" +#~ "- cause of cause\n" +#~ "..." +#~ msgstr "" + +#~ msgid "Cycles are not allowed for error lists:" +#~ msgstr "Циклы для списков ошибок недопустимы:" + +#~ msgid "" +#~ "tarantool> e2:set_prev(e1)\n" +#~ "---\n" +#~ "- error: 'builtin/error.lua:147: Cycles are not allowed'\n" +#~ "..." +#~ msgstr "" + +#~ msgid "Setting the previous error does not erase its own previous members:" +#~ msgstr "" +#~ "Установка предыдущей ошибки подтягивает за ней ее собственные предыдущие " +#~ "ошибки:" + +#~ msgid "" +#~ "-- e1 -> e2 -> e3 -> e4\n" +#~ "e1:set_prev(e2)\n" +#~ "e2:set_prev(e3)\n" +#~ "e3:set_prev(e4)\n" +#~ "e2:set_prev(e5)\n" +#~ "-- Now there are two lists: e1->e2->e5 and e3->e4" +#~ msgstr "" + +#~ msgid "" +#~ "The iProto protocol also supports stacked diagnostics. See details in " +#~ ":ref:`MessagePack extensions -- The ERROR type `." +#~ msgstr "" +#~ "Протокол IProto тоже поддерживает диагностику с помощью стека ошибок. " +#~ "Подробнее в разделе :ref:`Дополнительные типы MessagePack -- Тип ERROR " +#~ "`." diff --git a/locale/ru/LC_MESSAGES/reference/reference_lua/box_error/last.po b/locale/ru/LC_MESSAGES/reference/reference_lua/box_error/last.po index 047a4789c7..2cdfe956d2 100644 --- a/locale/ru/LC_MESSAGES/reference/reference_lua/box_error/last.po +++ b/locale/ru/LC_MESSAGES/reference/reference_lua/box_error/last.po @@ -2,80 +2,105 @@ msgid "box.error.last()" msgstr "box.error.last()" +msgid "Get the last raised error." +msgstr "" + +msgid "return" +msgstr "" + msgid "" -"Return a description of the last error, as a Lua table with four members:" +"an :ref:`error_object ` representing the last error" msgstr "" -"Получение описания последней ошибки в виде Lua-таблицы с 4 компонентами:" -msgid "\"code\" (number) error’s number" -msgstr "\"code\" (number) номер ошибки" +msgid "**Example**" +msgstr "" -msgid "\"type\" (string) error’s C++ class" -msgstr "\"type\" (string) C++ класс ошибки" +msgid "" +"box.error.last()\n" +"--[[\n" +"---\n" +"- error: Internal server error\n" +"...\n" +"--]]\n" +msgstr "" -msgid "\"message\" (string) error’s message" -msgstr "\"message\" (string) сообщение ошибки" +msgid "**See also:** :ref:`error_object:unpack() `" +msgstr "" -msgid "\"trace\" (table) with 2 members:" -msgstr "\"trace\" (table) с 2 компонентами:" +#~ msgid "" +#~ "Return a description of the last error, as a Lua table with four members:" +#~ msgstr "" +#~ "Получение описания последней ошибки в виде Lua-таблицы с 4 компонентами:" -msgid "\"line\" (number) Tarantool source file line number" -msgstr "\"line\" (number) номер строки в исходном файле Tarantool" +#~ msgid "\"code\" (number) error’s number" +#~ msgstr "\"code\" (number) номер ошибки" -msgid "\"file\" (string) Tarantool source file" -msgstr "\"file\" (string) исходный файл Tarantool" +#~ msgid "\"type\" (string) error’s C++ class" +#~ msgstr "\"type\" (string) C++ класс ошибки" -msgid "" -"Additionally, if the error is a system error (for example due to a failure " -"in socket or file io), there may be a fifth member: \"errno\" (number) C " -"standard error number." -msgstr "" -"Также, если ошибка является системной (например, из-за сбоя в сокете или в " -"файловых операциях ввода/вывода), может добавиться пятый компонент: " -"\"errno\" (number) номер ошибки в стандарте C." +#~ msgid "\"message\" (string) error’s message" +#~ msgstr "\"message\" (string) сообщение ошибки" -msgid "rtype" -msgstr "тип возвращаемого значения" +#~ msgid "\"trace\" (table) with 2 members:" +#~ msgstr "\"trace\" (table) с 2 компонентами:" -msgid "table" -msgstr "таблица" +#~ msgid "\"line\" (number) Tarantool source file line number" +#~ msgstr "\"line\" (number) номер строки в исходном файле Tarantool" -msgid "To show the table, use ``unpack()``:" -msgstr "Для вывода таблицы используйте ``unpack()``:" +#~ msgid "\"file\" (string) Tarantool source file" +#~ msgstr "\"file\" (string) исходный файл Tarantool" -msgid "" -"tarantool> box.schema.space.create('')\n" -"---\n" -"- error: Invalid identifier '' (expected printable symbols only or it is too long)\n" -"...\n" -"tarantool> box.error.last()\n" -"---\n" -"- Invalid identifier '' (expected printable symbols only or it is too long)\n" -"...\n" -"tarantool> box.error.last():unpack()\n" -"---\n" -"- type: ClientError\n" -" code: 70\n" -" message: Invalid identifier '' (expected printable symbols only or it is too long)\n" -" trace:\n" -" - file: /tmp/tarantool-20200109-43082-1pv0594/tarantool-2.3.1.1/src/box/identifier.c\n" -" line: 68\n" -"..." -msgstr "" -"tarantool> box.schema.space.create('')\n" -"---\n" -"- error: Invalid identifier '' (expected printable symbols only or it is too long)\n" -"...\n" -"tarantool> box.error.last()\n" -"---\n" -"- Invalid identifier '' (expected printable symbols only or it is too long)\n" -"...\n" -"tarantool> box.error.last():unpack()\n" -"---\n" -"- type: ClientError\n" -" code: 70\n" -" message: Invalid identifier '' (expected printable symbols only or it is too long)\n" -" trace:\n" -" - file: /tmp/tarantool-20200109-43082-1pv0594/tarantool-2.3.1.1/src/box/identifier.c\n" -" line: 68\n" -"..." +#~ msgid "" +#~ "Additionally, if the error is a system error (for example due to a failure " +#~ "in socket or file io), there may be a fifth member: \"errno\" (number) C " +#~ "standard error number." +#~ msgstr "" +#~ "Также, если ошибка является системной (например, из-за сбоя в сокете или в " +#~ "файловых операциях ввода/вывода), может добавиться пятый компонент: " +#~ "\"errno\" (number) номер ошибки в стандарте C." + +#~ msgid "rtype" +#~ msgstr "тип возвращаемого значения" + +#~ msgid "table" +#~ msgstr "таблица" + +#~ msgid "To show the table, use ``unpack()``:" +#~ msgstr "Для вывода таблицы используйте ``unpack()``:" + +#~ msgid "" +#~ "tarantool> box.schema.space.create('')\n" +#~ "---\n" +#~ "- error: Invalid identifier '' (expected printable symbols only or it is too long)\n" +#~ "...\n" +#~ "tarantool> box.error.last()\n" +#~ "---\n" +#~ "- Invalid identifier '' (expected printable symbols only or it is too long)\n" +#~ "...\n" +#~ "tarantool> box.error.last():unpack()\n" +#~ "---\n" +#~ "- type: ClientError\n" +#~ " code: 70\n" +#~ " message: Invalid identifier '' (expected printable symbols only or it is too long)\n" +#~ " trace:\n" +#~ " - file: /tmp/tarantool-20200109-43082-1pv0594/tarantool-2.3.1.1/src/box/identifier.c\n" +#~ " line: 68\n" +#~ "..." +#~ msgstr "" +#~ "tarantool> box.schema.space.create('')\n" +#~ "---\n" +#~ "- error: Invalid identifier '' (expected printable symbols only or it is too long)\n" +#~ "...\n" +#~ "tarantool> box.error.last()\n" +#~ "---\n" +#~ "- Invalid identifier '' (expected printable symbols only or it is too long)\n" +#~ "...\n" +#~ "tarantool> box.error.last():unpack()\n" +#~ "---\n" +#~ "- type: ClientError\n" +#~ " code: 70\n" +#~ " message: Invalid identifier '' (expected printable symbols only or it is too long)\n" +#~ " trace:\n" +#~ " - file: /tmp/tarantool-20200109-43082-1pv0594/tarantool-2.3.1.1/src/box/identifier.c\n" +#~ " line: 68\n" +#~ "..." diff --git a/locale/ru/LC_MESSAGES/reference/reference_lua/box_error/new.po b/locale/ru/LC_MESSAGES/reference/reference_lua/box_error/new.po index b02da60a63..f6e2a413a5 100644 --- a/locale/ru/LC_MESSAGES/reference/reference_lua/box_error/new.po +++ b/locale/ru/LC_MESSAGES/reference/reference_lua/box_error/new.po @@ -2,62 +2,171 @@ msgid "box.error.new()" msgstr "" -msgid "" -"Create an error object, but not throw it as " -":doc:`/reference/reference_lua/box_error/error` does. This is useful when " -"error information should be saved for later retrieval. Since version " -":doc:`2.4.1 `, to set an error as the last explicitly use " -":doc:`/reference/reference_lua/box_error/set`." +msgid "Create an error object with the specified parameters." msgstr "" msgid "Parameters" msgstr "Параметры" -msgid "number of a pre-defined error" -msgstr "номер предварительно заданной ошибки" +msgid "an error description" +msgstr "" + +msgid "(optional) a numeric code for this error" +msgstr "" + +msgid "(optional) an error type" +msgstr "" -msgid "part of the message which will accompany the error" -msgstr "часть сообщения, которое сопровождает ошибку" +#, fuzzy +msgid "**Example 1**" +msgstr "**Пример:**" + +msgid "" +"local custom_error = box.error.new({ code = 500,\n" +" reason = 'Internal server error' })\n" +"\n" +"box.error(custom_error)\n" +"--[[\n" +"---\n" +"- error: Internal server error\n" +"...\n" +"--]]\n" +msgstr "" -msgid "**Example:**" +#, fuzzy +msgid "**Example 2: custom type**" msgstr "**Пример:**" msgid "" -"tarantool> e=box.error.new{code=5,reason='A',type='B'}\n" +"local custom_error = box.error.new({ code = 500,\n" +" reason = 'Internal server error',\n" +" type = 'CustomInternalError' })\n" +"\n" +"box.error(custom_error)\n" +"--[[\n" "---\n" +"- error: Internal server error\n" "...\n" -"tarantool> e:unpack()\n" +"--]]\n" +msgstr "" + +msgid "Create an error object with the specified type and description." +msgstr "" + +msgid "an error type" +msgstr "" + +msgid "description arguments" +msgstr "" + +#, fuzzy +msgid "**Example**" +msgstr "**Пример:**" + +msgid "" +"local custom_error = box.error.new('CustomInternalError', 'Internal server error')\n" +"\n" +"box.error(custom_error)\n" +"--[[\n" "---\n" -"- code: 5\n" -" base_type: CustomError\n" -" type: B\n" -" custom_type: B\n" -" message: A\n" -" trace:\n" -" - file: '[string \"e=box.error.new{code=5,reason=''A'',type=''B''}\"]'\n" -" line: 1\n" +"- error: Internal server error\n" "...\n" -"tarantool> box.error.last()\n" +"--]]\n" +msgstr "" + +msgid "" +"Create a predefined :ref:`Tarantool error ` specified by its " +"identifier. You can see all Tarantool errors in the `errcode.h " +"`_ " +"file." +msgstr "" + +msgid "" +"a pre-defined error identifier; Lua constants that correspond to those " +"Tarantool errors are defined as members of ``box.error``, for example, " +"``box.error.NO_SUCH_USER == 45``" +msgstr "" + +#, fuzzy +msgid "**Example 1: one argument**" +msgstr "**Пример:**" + +msgid "" +"local custom_error = box.error.new(box.error.NO_SUCH_USER, 'John')\n" +"\n" +"box.error(custom_error)\n" +"--[[\n" "---\n" -"- null" +"- error: User 'John' is not found\n" +"...\n" +"--]]\n" msgstr "" +#, fuzzy +msgid "**Example 2: two arguments**" +msgstr "**Пример:**" + msgid "" -"Since version :doc:`2.4.1 `, there is a " -":ref:`session_settings ` setting which affects " -"the structure of error objects. If ``error_marshaling_enabled`` is changed " -"to ``true``, then the object will have the MP_EXT type and the MP_ERROR " -"subtype. Using the :ref:`binary protocol `, in the " -"body of a packet that the server could send in response to " -"``box.error.new()``, one will see: the encoding of MP_EXT according to the " -"`MessagePack specification " -"`_ (usually 0xc7), " -"followed by the encoding of MP_ERROR (0x03), followed by the encoding of " -"MP_ERROR_STACK (0x81), followed by all of the MP_ERROR_STACK components " -"(MP_ARRAY which contains MP_MAP which contains keys MP_ERROR_MESSAGE, " -"MP_ERROR_CODE, etc.) that are described and illustrated in section " -":ref:`MessagePack extensions -- The ERROR type `. The map" -" field for error object \"type\" will have key = MP_ERROR_TYPE, the map " -"field for error object \"code\" will have key = MP_ERROR_CODE, the map field" -" for error object \"message\" will have key = MP_ERROR_MESSAGE." +"local custom_error = box.error.new(box.error.CREATE_SPACE, 'my_space', 'the space already exists')\n" +"\n" +"box.error(custom_error)\n" +"--[[\n" +"---\n" +"- error: 'Failed to create space ''my_space'': the space already exists'\n" +"...\n" +"--]]\n" msgstr "" + +#~ msgid "" +#~ "Create an error object, but not throw it as " +#~ ":doc:`/reference/reference_lua/box_error/error` does. This is useful when " +#~ "error information should be saved for later retrieval. Since version " +#~ ":doc:`2.4.1 `, to set an error as the last explicitly use " +#~ ":doc:`/reference/reference_lua/box_error/set`." +#~ msgstr "" + +#~ msgid "number of a pre-defined error" +#~ msgstr "номер предварительно заданной ошибки" + +#~ msgid "part of the message which will accompany the error" +#~ msgstr "часть сообщения, которое сопровождает ошибку" + +#~ msgid "" +#~ "tarantool> e=box.error.new{code=5,reason='A',type='B'}\n" +#~ "---\n" +#~ "...\n" +#~ "tarantool> e:unpack()\n" +#~ "---\n" +#~ "- code: 5\n" +#~ " base_type: CustomError\n" +#~ " type: B\n" +#~ " custom_type: B\n" +#~ " message: A\n" +#~ " trace:\n" +#~ " - file: '[string \"e=box.error.new{code=5,reason=''A'',type=''B''}\"]'\n" +#~ " line: 1\n" +#~ "...\n" +#~ "tarantool> box.error.last()\n" +#~ "---\n" +#~ "- null" +#~ msgstr "" + +#~ msgid "" +#~ "Since version :doc:`2.4.1 `, there is a " +#~ ":ref:`session_settings ` setting which affects " +#~ "the structure of error objects. If ``error_marshaling_enabled`` is changed " +#~ "to ``true``, then the object will have the MP_EXT type and the MP_ERROR " +#~ "subtype. Using the :ref:`binary protocol `, in the " +#~ "body of a packet that the server could send in response to " +#~ "``box.error.new()``, one will see: the encoding of MP_EXT according to the " +#~ "`MessagePack specification " +#~ "`_ (usually 0xc7), " +#~ "followed by the encoding of MP_ERROR (0x03), followed by the encoding of " +#~ "MP_ERROR_STACK (0x81), followed by all of the MP_ERROR_STACK components " +#~ "(MP_ARRAY which contains MP_MAP which contains keys MP_ERROR_MESSAGE, " +#~ "MP_ERROR_CODE, etc.) that are described and illustrated in section " +#~ ":ref:`MessagePack extensions -- The ERROR type `. The map" +#~ " field for error object \"type\" will have key = MP_ERROR_TYPE, the map " +#~ "field for error object \"code\" will have key = MP_ERROR_CODE, the map field" +#~ " for error object \"message\" will have key = MP_ERROR_MESSAGE." +#~ msgstr "" diff --git a/locale/ru/LC_MESSAGES/reference/reference_lua/box_error/set.po b/locale/ru/LC_MESSAGES/reference/reference_lua/box_error/set.po index 87fd2e1a9c..39302516ba 100644 --- a/locale/ru/LC_MESSAGES/reference/reference_lua/box_error/set.po +++ b/locale/ru/LC_MESSAGES/reference/reference_lua/box_error/set.po @@ -2,29 +2,81 @@ msgid "box.error.set()" msgstr "" +msgid "**Since:** :doc:`2.4.1 `" +msgstr "" + msgid "" -"Since version :doc:`2.4.1 `. Set an error as the last system" -" error explicitly. Accepts an error object and makes it available via " -":doc:`/reference/reference_lua/box_error/last`." +"Set the specified error as the last system error explicitly. This error is " +"returned by :doc:`/reference/reference_lua/box_error/last`." msgstr "" -msgid "**Example:**" +msgid "Parameters" +msgstr "" + +msgid "an error object" +msgstr "" + +#, fuzzy +msgid "**Example**" msgstr "**Пример:**" msgid "" -"tarantool> err = box.error.new({code = 111, reason = 'cause'})\n" +"-- Create two errors --\n" +"local error1 = box.error.new({ code = 500, reason = 'Custom error 1' })\n" +"local error2 = box.error.new({ code = 505, reason = 'Custom error 2' })\n" +"\n" +"-- Raise the first error --\n" +"box.error(error1)\n" +"--[[\n" "---\n" +"- error: Custom error 1\n" "...\n" -"tarantool> box.error.last()\n" +"--]]\n" +"\n" +"-- Get the last error --\n" +"box.error.last()\n" +"--[[\n" "---\n" -"- error: '[string \"return tarantool> box.error.last()\"]:1: attempt to compare two\n" -" nil values'\n" +"- Custom error 1\n" "...\n" -"tarantool> box.error.set(err)\n" +"--]]\n" +"\n" +"-- Set the second error as the last error --\n" +"box.error.set(error2)\n" +"--[[\n" "---\n" "...\n" -"tarantool> box.error.last()\n" +"--]]\n" +"\n" +"-- Get the last error --\n" +"box.error.last()\n" +"--[[\n" "---\n" -"- cause\n" -"..." +"- Custom error 2\n" +"...\n" +"--]]\n" msgstr "" + +#~ msgid "" +#~ "Since version :doc:`2.4.1 `. Set an error as the last system" +#~ " error explicitly. Accepts an error object and makes it available via " +#~ ":doc:`/reference/reference_lua/box_error/last`." +#~ msgstr "" + +#~ msgid "" +#~ "tarantool> err = box.error.new({code = 111, reason = 'cause'})\n" +#~ "---\n" +#~ "...\n" +#~ "tarantool> box.error.last()\n" +#~ "---\n" +#~ "- error: '[string \"return tarantool> box.error.last()\"]:1: attempt to compare two\n" +#~ " nil values'\n" +#~ "...\n" +#~ "tarantool> box.error.set(err)\n" +#~ "---\n" +#~ "...\n" +#~ "tarantool> box.error.last()\n" +#~ "---\n" +#~ "- cause\n" +#~ "..." +#~ msgstr "" diff --git a/locale/ru/LC_MESSAGES/reference/reference_lua/box_events.po b/locale/ru/LC_MESSAGES/reference/reference_lua/box_events.po new file mode 100644 index 0000000000..9069170608 --- /dev/null +++ b/locale/ru/LC_MESSAGES/reference/reference_lua/box_events.po @@ -0,0 +1,104 @@ + +msgid "Event watchers" +msgstr "" + +msgid "Since :doc:`2.10.0 `." +msgstr "" + +msgid "" +"The ``box`` module contains some features related to event subscriptions, " +"also known as :term:`watchers `. The subscriptions are used to " +"inform the client about server-side :term:`events `. Each event " +"subscription is defined by a certain key." +msgstr "" + +msgid "Event" +msgstr "" + +msgid "" +"An event is a state change or a system update that triggers the action of " +"other systems. To read more about built-in events in Tarantool, check the " +":doc:`system events ` " +"section." +msgstr "" + +msgid "State" +msgstr "" + +msgid "" +"A state is an internally stored key-value pair. The key is a string. The " +"value is an arbitrary type that can be encoded as MsgPack. To update a " +"state, use the ``box.broadcast()`` function." +msgstr "" + +msgid "Watcher" +msgstr "" + +msgid "" +"A watcher is a :doc:`callback ` that is invoked when a " +"state change occurs. To register a local watcher, use the ``box.watch()`` " +"function. To create a remote watcher, use the ``watch()`` function from the " +"``net.box`` module. Note that it is possible to register more than one " +"watcher for the same key." +msgstr "" + +msgid "How a watcher works" +msgstr "" + +msgid "" +"First, you register a watcher. After that, the watcher callback is invoked " +"for the first time. In this case, the callback is triggered whether or not " +"the key has already been broadcast. All subsequent invocations are triggered" +" with :doc:`box.broadcast() `" +" called on the remote host. If a watcher is subscribed for a key that has " +"not been broadcast yet, the callback is triggered only once, after the " +"registration of the watcher." +msgstr "" + +msgid "" +"The watcher callback takes two arguments. The first argument is the name of " +"the key for which it was registered. The second one contains current key " +"data. The callback is always invoked in a new fiber. It means that it is " +"allowed to yield in it. A watcher callback is never executed in parallel " +"with itself. If the key is updated while the watcher callback is running, " +"the callback will be invoked again with the new value as soon as it returns." +msgstr "" + +msgid "" +"``box.watch`` and ``box.broadcast`` functions can be used before " +":doc:`box.cfg `." +msgstr "" + +msgid "" +"Below is a list of all functions and pages related to watchers or events." +msgstr "" + +msgid "Name" +msgstr "" + +msgid "Use" +msgstr "" + +msgid ":doc:`./box_events/watch`" +msgstr "" + +msgid "Create a local watcher." +msgstr "" + +msgid ":ref:`conn:watch() `" +msgstr "" + +msgid "Create a watcher for the remote host." +msgstr "" + +msgid ":doc:`./box_events/broadcast`" +msgstr "" + +msgid "Update a state." +msgstr "" + +msgid ":ref:`Built-in events `" +msgstr "" + +msgid "Predefined events in Tarantool" +msgstr "" diff --git a/locale/ru/LC_MESSAGES/reference/reference_lua/box_events/broadcast.po b/locale/ru/LC_MESSAGES/reference/reference_lua/box_events/broadcast.po new file mode 100644 index 0000000000..ccecf04a8f --- /dev/null +++ b/locale/ru/LC_MESSAGES/reference/reference_lua/box_events/broadcast.po @@ -0,0 +1,40 @@ + +msgid "box.broadcast()" +msgstr "" + +msgid "" +"Update the value of a particular key and notify all key watchers of the " +"update." +msgstr "" + +msgid "Parameters" +msgstr "" + +msgid "key name of the event to subscribe to" +msgstr "" + +msgid "any data that can be encoded in MsgPack" +msgstr "" + +msgid "return" +msgstr "" + +msgid "none" +msgstr "" + +msgid "**Possible errors:**" +msgstr "" + +msgid "The value can't be encoded as MsgPack." +msgstr "" + +msgid "The key refers to a ``box.`` system event" +msgstr "" + +msgid "**Example:**" +msgstr "" + +msgid "" +"-- Broadcast value 42 for the 'foo' key.\n" +"box.broadcast('foo', 42)" +msgstr "" diff --git a/locale/ru/LC_MESSAGES/reference/reference_lua/box_events/system_events.po b/locale/ru/LC_MESSAGES/reference/reference_lua/box_events/system_events.po new file mode 100644 index 0000000000..d8ea04fcd3 --- /dev/null +++ b/locale/ru/LC_MESSAGES/reference/reference_lua/box_events/system_events.po @@ -0,0 +1,197 @@ + +msgid "System events" +msgstr "" + +msgid "Since :doc:`2.10.0 `." +msgstr "" + +msgid "" +"Predefined events have a special naming schema -- theirs names always start " +"with the reserved ``box.`` prefix. It means that you cannot create new " +"events with it." +msgstr "" + +msgid "The system processes the following events:" +msgstr "" + +msgid "``box.id``" +msgstr "" + +msgid "``box.status``" +msgstr "" + +msgid "``box.election``" +msgstr "" + +msgid "``box.schema``" +msgstr "" + +msgid "``box.shutdown``" +msgstr "" + +msgid "" +"In response to each event, the server sends back certain ``IPROTO`` fields." +msgstr "" + +msgid "" +"The events are available from the beginning as non-:ref:`MP_NIL " +"`. If a watcher subscribes to a system event before " +"it has been broadcast, it receives an empty table for the event value." +msgstr "" + +msgid "" +"The event is generated when there is a change in any of the values listed in" +" the event. For example, see the parameters in the ``box.id`` event below --" +" ``id``, ``instance_uuid``, and ``replicaset_uuid``. Suppose the ``ìd`` " +"value (``box.info.id``) has changed. This triggers the ``box.info`` event, " +"which states that the value of ``box.info.id`` has changed, while " +"``box.info.uuid`` and ``box.info.cluster.uuid`` remain the same." +msgstr "" + +msgid "box.id" +msgstr "" + +msgid "" +"Contains :ref:`identification ` of the instance. Value " +"changes are rare." +msgstr "" + +msgid "" +"``id``: the numeric instance ID is unknown before the registration. For " +"anonymous replicas, the value is ``0`` until they are officially registered." +msgstr "" + +msgid "" +"``instance_uuid``: the UUID of the instance never changes after the first " +":doc:`box.cfg `. The value is unknown " +"before the ``box.cfg`` call." +msgstr "" + +msgid "" +"``replicaset_uuid``: the value is unknown until the instance joins a " +"replicaset or boots a new one." +msgstr "" + +msgid "" +"-- box.id value\n" +"{\n" +"MP_STR “id”: MP_UINT; box.info.id,\n" +"MP_STR “instance_uuid”: MP_UUID; box.info.uuid,\n" +"MP_STR “replicaset_uuid”: MP_UUID box.info.cluster.uuid,\n" +"}" +msgstr "" + +msgid "box.status" +msgstr "" + +msgid "Contains generic information about the instance status." +msgstr "" + +msgid "" +"``is_ro``: :ref:`indicates the read-only mode ` " +"or the ``orphan`` status." +msgstr "" + +msgid "" +"``is_ro_cfg``: indicates the :ref:`read_only ` mode for" +" the instance." +msgstr "" + +msgid "``status``: shows the status of an instance." +msgstr "" + +msgid "" +"{\n" +"MP_STR “is_ro”: MP_BOOL box.info.ro,\n" +"MP_STR “is_ro_cfg”: MP_BOOL box.cfg.read_only,\n" +"MP_STR “status”: MP_STR box.info.status,\n" +"}" +msgstr "" + +msgid "box.election" +msgstr "" + +msgid "" +"Contains fields of :doc:`box.info.election " +"` that are necessary to find out" +" the most recent writable leader." +msgstr "" + +msgid "``term``: shows the current election term." +msgstr "" + +msgid "" +"``role``: indicates the election state of the node -- ``leader``, " +"``follower``, or ``candidate``." +msgstr "" + +msgid "``leader``: shows the leader node ID in the current term." +msgstr "" + +msgid "" +"{\n" +"MP_STR “term”: MP_UINT box.info.election.term,\n" +"MP_STR “role”: MP_STR box.info.election.state,\n" +"MP_STR “is_ro”: MP_BOOL box.info.ro,\n" +"MP_STR “leader”: MP_UINT box.info.election.leader,\n" +"}" +msgstr "" + +msgid "box.schema" +msgstr "" + +msgid "Contains schema-related data." +msgstr "" + +msgid "``version``: shows the schema version." +msgstr "" + +msgid "" +"{\n" +"MP_STR “version”: MP_UINT schema_version,\n" +"}" +msgstr "" + +msgid "box.shutdown" +msgstr "" + +msgid "" +"Contains a boolean value which indicates whether there is an active shutdown" +" request." +msgstr "" + +msgid "" +"The event is generated when the server receives a shutdown request " +"(``os.exit()`` command or :ref:`SIGTERM ` signal)." +msgstr "" + +msgid "" +"The ``box.shutdown`` event is applied for the graceful shutdown protocol. It" +" is a feature which is available since :doc:`2.10.0 `. This" +" protocol is supposed to be used with connectors to signal a client about " +"the upcoming server shutdown and close active connections without broken " +"requests. For more information, refer to the :ref:`graceful shutdown " +"protocol ` section." +msgstr "" + +msgid "Usage example" +msgstr "" + +#, python-format +msgid "" +"local conn = net.box.connect(URI)\n" +"local log = require('log')\n" +"-- Subscribe to updates of key 'box.id'\n" +"local w = conn:watch('box.id', function(key, value)\n" +" assert(key == 'box.id')\n" +" log.info(\"The box.id value is '%s'\", value)\n" +"end)" +msgstr "" + +msgid "" +"If you want to unregister the watcher when it's no longer needed, use the " +"following command:" +msgstr "" + +msgid "w:unregister()" +msgstr "" diff --git a/locale/ru/LC_MESSAGES/reference/reference_lua/box_events/watch.po b/locale/ru/LC_MESSAGES/reference/reference_lua/box_events/watch.po new file mode 100644 index 0000000000..a0b22072f6 --- /dev/null +++ b/locale/ru/LC_MESSAGES/reference/reference_lua/box_events/watch.po @@ -0,0 +1,59 @@ + +msgid "box.watch()" +msgstr "" + +msgid "Subscribe to events broadcast by a local host." +msgstr "" + +msgid "Parameters" +msgstr "" + +msgid "key name of the event to subscribe to" +msgstr "" + +msgid "callback to invoke when the key value is updated" +msgstr "" + +msgid "return" +msgstr "" + +msgid "" +"a watcher handle. The handle consists of one method -- ``unregister()``, " +"which unregisters the watcher." +msgstr "" + +msgid "" +"To read more about watchers, see the :ref:`Functions for watchers ` section." +msgstr "" + +msgid "" +"Keep in mind that garbage collection of a watcher handle doesn't lead to the" +" watcher's destruction. In this case, the watcher remains registered. It is " +"okay to discard the result of ``watch`` function if the watcher will never " +"be unregistered." +msgstr "" + +msgid "**Example:**" +msgstr "" + +#, python-format +msgid "" +"-- Broadcast value 42 for the 'foo' key.\n" +"box.broadcast('foo', 42)\n" +"\n" +"local log = require('log')\n" +"-- Subscribe to updates of the 'foo' key.\n" +"local w = box.watch('foo', function(key, value)\n" +" assert(key == 'foo')\n" +" log.info(\"The box.id value is '%d'\", value)\n" +"end)" +msgstr "" + +msgid "" +"If you don't need the watcher anymore, you can unregister it using the " +"command below:" +msgstr "" + +msgid "w:unregister()" +msgstr "" diff --git a/locale/ru/LC_MESSAGES/reference/reference_lua/box_index.po b/locale/ru/LC_MESSAGES/reference/reference_lua/box_index.po index ad10aa134d..cce24ad804 100644 --- a/locale/ru/LC_MESSAGES/reference/reference_lua/box_index.po +++ b/locale/ru/LC_MESSAGES/reference/reference_lua/box_index.po @@ -145,6 +145,14 @@ msgstr "" msgid "Remove unused index space" msgstr "Удаление неиспользуемого пространства индекса" +#, fuzzy +msgid ":doc:`./box_index/tuple_pos`" +msgstr ":doc:`./box_space/create_index`" + +#, fuzzy +msgid "Return a tuple's position for an index" +msgstr "Выбор кортежа по индексу" + msgid ":doc:`./box_index/user_defined`" msgstr "" diff --git a/locale/ru/LC_MESSAGES/reference/reference_lua/box_index/alter.po b/locale/ru/LC_MESSAGES/reference/reference_lua/box_index/alter.po index 0604bd70c1..292ebece3a 100644 --- a/locale/ru/LC_MESSAGES/reference/reference_lua/box_index/alter.po +++ b/locale/ru/LC_MESSAGES/reference/reference_lua/box_index/alter.po @@ -21,14 +21,8 @@ msgstr "Параметры" msgid "an :ref:`object reference `." msgstr ":ref:`ссылка на объект `." -msgid "" -"options list, same as the options list for ``create_index``, see the chart " -"named :ref:`Options for space_object:create_index() `." +msgid "index options (see :ref:`index_opts `)" msgstr "" -"список параметров, аналогичный списку параметров для ``create_index``, см. " -"таблицу под названием :ref:`Параметры для space_object:create_index() " -"`." msgid "return" msgstr "возвращает" @@ -39,17 +33,20 @@ msgstr "nil" msgid "**Possible errors:**" msgstr "**Возможные ошибки:**" -msgid "index does not exist," +#, fuzzy +msgid "index does not exist" msgstr "индекс не существует," -msgid "the primary-key index cannot be changed to ``{unique = false}``." +#, fuzzy +msgid "the primary-key index cannot be changed to ``{unique = false}``" msgstr "" "индекс по первичному ключу не может быть неуникальным, то есть нельзя задать" " ``{unique = false}``." +#, fuzzy msgid "" -"**Note re storage engine:** vinyl does not support ``alter()`` of a primary-" -"key index unless the space is empty." +"Vinyl does not support ``alter()`` of a primary-key index unless the space " +"is empty." msgstr "" "**Примечание про движок базы данных:** vinyl не поддерживает ``alter()`` для" " первичного индекса, если спейс содержит данные." @@ -100,3 +97,12 @@ msgid "" "---\n" "..." msgstr "" + +#~ msgid "" +#~ "options list, same as the options list for ``create_index``, see the chart " +#~ "named :ref:`Options for space_object:create_index() `." +#~ msgstr "" +#~ "список параметров, аналогичный списку параметров для ``create_index``, см. " +#~ "таблицу под названием :ref:`Параметры для space_object:create_index() " +#~ "`." diff --git a/locale/ru/LC_MESSAGES/reference/reference_lua/box_index/count.po b/locale/ru/LC_MESSAGES/reference/reference_lua/box_index/count.po index c70005dbc9..badc21eeda 100644 --- a/locale/ru/LC_MESSAGES/reference/reference_lua/box_index/count.po +++ b/locale/ru/LC_MESSAGES/reference/reference_lua/box_index/count.po @@ -37,12 +37,48 @@ msgid "**Example:**" msgstr "**Пример:**" msgid "" -"tarantool> box.space.tester.index.primary:count(999)\n" +"Below are few examples of using ``count``. To try out these examples, you " +"need to bootstrap a Tarantool database as described in :ref:`Using data " +"operations `." +msgstr "" + +msgid "" +"-- Insert test data --\n" +"box.space.bands:insert { 1, 'Roxette', 1986 }\n" +"box.space.bands:insert { 2, 'Scorpions', 1965 }\n" +"box.space.bands:insert { 3, 'Ace of Base', 1987 }\n" +"box.space.bands:insert { 4, 'The Beatles', 1960 }\n" +"box.space.bands:insert { 5, 'Pink Floyd', 1965 }\n" +"box.space.bands:insert { 6, 'The Rolling Stones', 1962 }\n" +"box.space.bands:insert { 7, 'The Doors', 1965 }\n" +"box.space.bands:insert { 8, 'Nirvana', 1987 }\n" +"box.space.bands:insert { 9, 'Led Zeppelin', 1968 }\n" +"box.space.bands:insert { 10, 'Queen', 1970 }\n" +"\n" +"-- Count the number of tuples that match the full key value\n" +"count = box.space.bands.index.year:count(1965)\n" +"--[[\n" "---\n" -"- 0\n" +"- 3\n" "...\n" -"tarantool> box.space.tester.index.primary:count('Alpha!', { iterator = 'LE' })\n" +"--]]\n" +"\n" +"-- Count the number of tuples that match the partial key value\n" +"count_partial = box.space.bands.index.year_band:count(1965)\n" +"--[[\n" "---\n" -"- 1\n" -"..." +"- 3\n" +"...\n" +"--]]\n" msgstr "" + +#~ msgid "" +#~ "tarantool> box.space.tester.index.primary:count(999)\n" +#~ "---\n" +#~ "- 0\n" +#~ "...\n" +#~ "tarantool> box.space.tester.index.primary:count('Alpha!', { iterator = 'LE' })\n" +#~ "---\n" +#~ "- 1\n" +#~ "..." +#~ msgstr "" diff --git a/locale/ru/LC_MESSAGES/reference/reference_lua/box_index/delete.po b/locale/ru/LC_MESSAGES/reference/reference_lua/box_index/delete.po index 9d1d85bd37..6cb6ab4c87 100644 --- a/locale/ru/LC_MESSAGES/reference/reference_lua/box_index/delete.po +++ b/locale/ru/LC_MESSAGES/reference/reference_lua/box_index/delete.po @@ -35,9 +35,10 @@ msgstr "тип возвращаемого значения" msgid "tuple" msgstr "кортеж" +#, fuzzy msgid "" -"**Note re storage engine:** vinyl will return `nil`, rather than the deleted" -" tuple." +"**Note regarding storage engine:** vinyl will return `nil`, rather than the " +"deleted tuple." msgstr "" "**Примечание про движок базы данных:** vinyl вернет `nil`, а не удаленный " "кортеж." diff --git a/locale/ru/LC_MESSAGES/reference/reference_lua/box_index/get.po b/locale/ru/LC_MESSAGES/reference/reference_lua/box_index/get.po index 9776273e28..21852c1682 100644 --- a/locale/ru/LC_MESSAGES/reference/reference_lua/box_index/get.po +++ b/locale/ru/LC_MESSAGES/reference/reference_lua/box_index/get.po @@ -2,9 +2,10 @@ msgid "index_object:get()" msgstr "" +#, fuzzy msgid "" -"Search for a tuple via the given index, as described :ref:`earlier " -"`." +"Search for a tuple via the given index, as described in the :ref:`select " +"` topic." msgstr "" "Поиск кортежа по заданному индексу, как описано :ref:`выше `." diff --git a/locale/ru/LC_MESSAGES/reference/reference_lua/box_index/max.po b/locale/ru/LC_MESSAGES/reference/reference_lua/box_index/max.po index 038d45de75..11988cad04 100644 --- a/locale/ru/LC_MESSAGES/reference/reference_lua/box_index/max.po +++ b/locale/ru/LC_MESSAGES/reference/reference_lua/box_index/max.po @@ -19,14 +19,16 @@ msgstr "возвращает" msgid "" "the tuple for the last key in the index. If the optional ``key`` value is " -"supplied, returns the last key that is less than or equal to ``key``." -" Starting with :doc:`Tarantool 2.0.4 `, ``index_object:max(key)``" -" returns nothing if ``key`` doesn't match any value in the index." +"supplied, returns the last key that is less than or equal to ``key``. " +"Starting with :doc:`Tarantool 2.0.4 `, " +"``index_object:max(key)`` returns nothing if ``key`` doesn't match any value" +" in the index." msgstr "" "кортеж для последнего ключа в индексе. Если указано необязательное значение " "ключа ``key``, будет выведен последний ключ, который меньше или равен " -"значению ключа ``key``. Начиная с версии :doc:`Tarantool 2.0.4 `," -" ``index:max(key)`` не возвращает ничего, если индекс не содержит значения ``key``." +"значению ключа ``key``. Начиная с версии :doc:`Tarantool 2.0.4 " +"`, ``index:max(key)`` не возвращает ничего, если индекс не " +"содержит значения ``key``." msgid "rtype" msgstr "тип возвращаемого значения" @@ -41,8 +43,8 @@ msgid "Index is not of type 'TREE'." msgstr "Тип индекса не 'TREE'." msgid "" -":errcode:`ER_TRANSACTION_CONFLICT` if a transaction conflict is detected in the " -":ref:`MVCC transaction mode `." +":errcode:`ER_TRANSACTION_CONFLICT` if a transaction conflict is detected in " +"the :ref:`MVCC transaction mode `." msgstr "" ":errcode:`ER_TRANSACTION_CONFLICT`, если транзакция стала конфликтной в " ":ref:`транзакционном режиме MVCC `." @@ -54,8 +56,44 @@ msgid "**Example:**" msgstr "**Пример:**" msgid "" -"tarantool> box.space.tester.index.primary:max()\n" +"Below are few examples of using ``max``. To try out these examples, you need" +" to bootstrap a Tarantool database as described in :ref:`Using data " +"operations `." +msgstr "" + +msgid "" +"-- Insert test data --\n" +"box.space.bands:insert { 1, 'Roxette', 1986 }\n" +"box.space.bands:insert { 2, 'Scorpions', 1965 }\n" +"box.space.bands:insert { 3, 'Ace of Base', 1987 }\n" +"box.space.bands:insert { 4, 'The Beatles', 1960 }\n" +"box.space.bands:insert { 5, 'Pink Floyd', 1965 }\n" +"box.space.bands:insert { 6, 'The Rolling Stones', 1962 }\n" +"box.space.bands:insert { 7, 'The Doors', 1965 }\n" +"box.space.bands:insert { 8, 'Nirvana', 1987 }\n" +"box.space.bands:insert { 9, 'Led Zeppelin', 1968 }\n" +"box.space.bands:insert { 10, 'Queen', 1970 }\n" +"\n" +"-- Find the maximum value in the specified index\n" +"max = box.space.bands.index.year:max()\n" +"--[[\n" "---\n" -"- ['Gamma!', 55, 'This is the third tuple!']\n" -"..." +"- [8, 'Nirvana', 1987]\n" +"...\n" +"--]]\n" +"\n" +"-- Find the maximum value that matches the partial key value\n" +"max_partial = box.space.bands.index.year_band:max(1965)\n" +"--[[\n" +"---\n" +"- [7, 'The Doors', 1965]\n" +"...\n" +"--]]\n" msgstr "" + +#~ msgid "" +#~ "tarantool> box.space.tester.index.primary:max()\n" +#~ "---\n" +#~ "- ['Gamma!', 55, 'This is the third tuple!']\n" +#~ "..." +#~ msgstr "" diff --git a/locale/ru/LC_MESSAGES/reference/reference_lua/box_index/min.po b/locale/ru/LC_MESSAGES/reference/reference_lua/box_index/min.po index fc85461515..37e0a63722 100644 --- a/locale/ru/LC_MESSAGES/reference/reference_lua/box_index/min.po +++ b/locale/ru/LC_MESSAGES/reference/reference_lua/box_index/min.po @@ -20,13 +20,15 @@ msgstr "возвращает" msgid "" "the tuple for the first key in the index. If the optional ``key`` value is " "supplied, returns the first key that is greater than or equal to ``key``. " -"Starting with :doc:`Tarantool 2.0.4 `, ``index_object:min(key)`` " -"returns nothing if ``key`` doesn't match any value in the index." +"Starting with :doc:`Tarantool 2.0.4 `, " +"``index_object:min(key)`` returns nothing if ``key`` doesn't match any value" +" in the index." msgstr "" "кортеж для первого ключа в индексе. Если указано необязательное значение " "ключа ``key``, будет выведен первый ключ, который больше или равен значению " -"ключа ``key``. Начиная с версии :doc:`Tarantool 2.0.4 `, ``index:min(key)``" -" не вернет ничего, если индекс не содержит значения ``key``." +"ключа ``key``. Начиная с версии :doc:`Tarantool 2.0.4 `, " +"``index:min(key)`` не вернет ничего, если индекс не содержит значения " +"``key``." msgid "rtype" msgstr "тип возвращаемого значения" @@ -41,8 +43,8 @@ msgid "Index is not of type 'TREE'." msgstr "Тип индекса не 'TREE'." msgid "" -":errcode:`ER_TRANSACTION_CONFLICT` if a transaction conflict is detected in the " -":ref:`MVCC transaction mode `." +":errcode:`ER_TRANSACTION_CONFLICT` if a transaction conflict is detected in " +"the :ref:`MVCC transaction mode `." msgstr "" ":errcode:`ER_TRANSACTION_CONFLICT`, если транзакция стала конфликтной в " ":ref:`транзакционном режиме MVCC `." @@ -54,8 +56,44 @@ msgid "**Example:**" msgstr "**Пример:**" msgid "" -"tarantool> box.space.tester.index.primary:min()\n" +"Below are few examples of using ``min``. To try out these examples, you need" +" to bootstrap a Tarantool database as described in :ref:`Using data " +"operations `." +msgstr "" + +msgid "" +"-- Insert test data --\n" +"box.space.bands:insert { 1, 'Roxette', 1986 }\n" +"box.space.bands:insert { 2, 'Scorpions', 1965 }\n" +"box.space.bands:insert { 3, 'Ace of Base', 1987 }\n" +"box.space.bands:insert { 4, 'The Beatles', 1960 }\n" +"box.space.bands:insert { 5, 'Pink Floyd', 1965 }\n" +"box.space.bands:insert { 6, 'The Rolling Stones', 1962 }\n" +"box.space.bands:insert { 7, 'The Doors', 1965 }\n" +"box.space.bands:insert { 8, 'Nirvana', 1987 }\n" +"box.space.bands:insert { 9, 'Led Zeppelin', 1968 }\n" +"box.space.bands:insert { 10, 'Queen', 1970 }\n" +"\n" +"-- Find the minimum value in the specified index\n" +"min = box.space.bands.index.year:min()\n" +"--[[\n" "---\n" -"- ['Alpha!', 55, 'This is the first tuple!']\n" -"..." +"- [4, 'The Beatles', 1960]\n" +"...\n" +"--]]\n" +"\n" +"-- Find the minimum value that matches the partial key value\n" +"min_partial = box.space.bands.index.year_band:min(1965)\n" +"--[[\n" +"---\n" +"- [5, 'Pink Floyd', 1965]\n" +"...\n" +"--]]\n" msgstr "" + +#~ msgid "" +#~ "tarantool> box.space.tester.index.primary:min()\n" +#~ "---\n" +#~ "- ['Alpha!', 55, 'This is the first tuple!']\n" +#~ "..." +#~ msgstr "" diff --git a/locale/ru/LC_MESSAGES/reference/reference_lua/box_index/pairs.po b/locale/ru/LC_MESSAGES/reference/reference_lua/box_index/pairs.po index 453772d5bb..cbe490a189 100644 --- a/locale/ru/LC_MESSAGES/reference/reference_lua/box_index/pairs.po +++ b/locale/ru/LC_MESSAGES/reference/reference_lua/box_index/pairs.po @@ -2,9 +2,11 @@ msgid "index_object:pairs()" msgstr "" +#, fuzzy msgid "" "Search for a tuple or a set of tuples via the given index, and allow " -"iterating over one tuple at a time." +"iterating over one tuple at a time. To search by the primary index in the " +"specified space, use the :ref:`box_space-pairs` method." msgstr "" "Поиск кортежа или набора кортежей по заданному индексу и итерация по одному " "кортежу за раз." @@ -34,14 +36,15 @@ msgstr "" "все кортежи в порядке по возрастанию или по убыванию, начиная с указанного " "ключа. Однако другие типы индексов не поддерживают упорядочивание." +#, fuzzy msgid "" "To understand consistency of tuples returned by an iterator, it's essential " "to know the principles of the Tarantool transaction processing subsystem. An" " iterator in Tarantool does not own a consistent read view. Instead, each " "procedure is granted exclusive access to all tuples and spaces until there " "is a \"context switch\": which may happen due to :ref:`the implicit yield " -"rules `, or by an explicit call to :ref:`fiber.yield" -" `. When the execution flow returns to the yielded procedure, " +"rules `, or by an explicit call to :ref:`fiber.yield " +"`. When the execution flow returns to the yielded procedure, " "the data set could have changed significantly. Iteration, resumed after a " "yield point, does not preserve the read view, but continues with the new " "content of the database. The tutorial :ref:`Indexed pattern search " @@ -63,8 +66,9 @@ msgstr "" "демонстрируется один из способов одновременного использования итераторов и " "передачи управления." +#, fuzzy msgid "" -"For information about iterators' internal structures see the `\"Lua " +"For information about iterators' internal structures, see the `\"Lua " "Functional library\" `_ documentation." msgstr "" "Для получения информации о внутренней структуре итераторов см. документацию " @@ -77,38 +81,58 @@ msgstr "Параметры" msgid "an :ref:`object reference `." msgstr ":ref:`ссылка на объект `." -msgid "value to be matched against the index key, which may be multi-part" +#, fuzzy +msgid "value to be matched against the index key, which may be multi-part." msgstr "" "значение должно совпасть с индексным ключом, который может быть составным" -msgid "as defined in tables below. The default iterator type is 'EQ'" +#, fuzzy +msgid "as defined in tables below. The default iterator type is 'EQ'." msgstr "" "как определено в таблицах ниже. По умолчанию используется итератор 'EQ'" +msgid "" +"a tuple or the position of a tuple (:ref:`tuple_pos `) " +"after which ``pairs`` starts the search. You can pass an empty string or " +":ref:`box.NULL ` to this option to start the search from the first" +" tuple." +msgstr "" + msgid "return" msgstr "возвращает" +#, fuzzy msgid "" -"`iterator `_ which can be used in a " -"``for/end`` loop or with `totable() " -"`_" +"The `iterator `_, which can be" +" used in a ``for/end`` loop or with `totable() " +"`_." msgstr "" -"`итератор `_, который может использовать в" -" цикле for/end или с функцией `totable() " +"`итератор `_, который может " +"использовать в цикле for/end или с функцией `totable() " "`_" msgid "**Possible errors:**" msgstr "**Возможные ошибки:**" -msgid "no such space; wrong type;" +#, fuzzy +msgid "no such space" msgstr "спейс отсутствует; неправильный тип;" -msgid "selected iteration type is not supported for the index type;" +#, fuzzy +msgid "wrong type" +msgstr "Тип итератора" + +#, fuzzy +msgid "selected iteration type is not supported for the index type" msgstr "выбранный тип итерации не поддерживается для данного типа индекса;" -msgid "key is not supported for the iteration type." +#, fuzzy +msgid "key is not supported for the iteration type" msgstr "ключ не поддерживается для данного типа итерации." +msgid "iterator position is invalid" +msgstr "" + msgid "" "**Complexity factors:** Index size, Index type; Number of tuples accessed." msgstr "" @@ -249,8 +273,8 @@ msgstr "" "Ключ индекса состоит из одной или более частей, например, {1}, " "{1,2,3},{1,2,3}. Ключ поиска может содержать нулевое значение nil (но не " "msgpack.NULL, этот тип не будет правильным). Ключ индекса не может содержать" -" nil или msgpack.NULL, хотя в последующих версиях правила работы Tarantool" -" будут другие -- поведение поиска с nil может измениться. Возможные " +" nil или msgpack.NULL, хотя в последующих версиях правила работы Tarantool " +"будут другие -- поведение поиска с nil может измениться. Возможные " "итераторы: LT, LE, EQ, REQ, GE, GT. Считается, что ключ поиска соответствует" " ключу индекса, если следующие операторы, которые представляют собой " "псевдокод для операции сопоставления, возвращают TRUE." @@ -314,23 +338,6 @@ msgstr "" "значению, получим совпадение. Количество найденных кортежей будет 0 или 1. " "Этот тип используется по умолчанию." -msgid "" -"The comparison operator is '>' (greater than). If a hash of an index key is " -"greater than a hash of a search value, it matches. Tuples are returned in " -"ascending order by hash of index key, which will appear to be random. " -"Provided that the space is not being updated, one can retrieve all the " -"tuples in a space, N tuples at a time, by using {iterator='GT', limit=N} in " -"each search, and using the last returned value from the previous result as " -"the start search value for the next search." -msgstr "" -"Оператором сравнения будет '>' (больше чем). Если хеш ключа индекса больше, " -"чем хеш искомого значения, получим совпадение. Найденные кортежи упорядочены" -" по возрастанию по хешу ключа индекса, который будет выглядеть случайным. " -"При условии, что спейс не обновляется, можно получить все кортежи в спейсе, " -"N кортежей за раз, используя {iterator='GT', limit=N} в каждом поиске и " -"последнее найденное значение из предыдущего результата поиска в качестве " -"начального значения для следующего поиска." - msgid "**Iterator types for BITSET indexes**" msgstr "**Типы итераторов для BITSET-индексов**" @@ -472,165 +479,258 @@ msgstr "" "получим совпадение. Найденные кортежи упорядочены следующим образом: сначала" " ближайший сосед." -msgid "**First example of index pairs():**" -msgstr "**Первый пример pairs():**" +msgid "**Examples:**" +msgstr "" -msgid "Default 'TREE' Index and ``pairs()`` function:" -msgstr "'TREE'-индекс, используемый по умолчанию, и функция ``pairs()``:" +msgid "" +"Below are few examples of using ``pairs`` with different parameters. To try " +"out these examples, you need to bootstrap a Tarantool instance as described " +"in :ref:`Using data operations `." +msgstr "" msgid "" -"tarantool> s = box.schema.space.create('space17')\n" -"---\n" -"...\n" -"tarantool> s:create_index('primary', {\n" -" > parts = {1, 'string', 2, 'string'}\n" -" > })\n" -"---\n" -"...\n" -"tarantool> s:insert{'C', 'C'}\n" -"---\n" -"- ['C', 'C']\n" -"...\n" -"tarantool> s:insert{'B', 'A'}\n" +"-- Insert test data --\n" +"tarantool> bands:insert{1, 'Roxette', 1986}\n" +" bands:insert{2, 'Scorpions', 1965}\n" +" bands:insert{3, 'Ace of Base', 1987}\n" +" bands:insert{4, 'The Beatles', 1960}\n" +" bands:insert{5, 'Pink Floyd', 1965}\n" +" bands:insert{6, 'The Rolling Stones', 1962}\n" +" bands:insert{7, 'The Doors', 1965}\n" +" bands:insert{8, 'Nirvana', 1987}\n" +" bands:insert{9, 'Led Zeppelin', 1968}\n" +" bands:insert{10, 'Queen', 1970}\n" "---\n" -"- ['B', 'A']\n" "...\n" -"tarantool> s:insert{'C', '!'}\n" +"\n" +"-- Select all tuples by the primary index --\n" +"tarantool> for _, tuple in bands.index.primary:pairs() do\n" +" print(tuple)\n" +" end\n" +"[1, 'Roxette', 1986]\n" +"[2, 'Scorpions', 1965]\n" +"[3, 'Ace of Base', 1987]\n" +"[4, 'The Beatles', 1960]\n" +"[5, 'Pink Floyd', 1965]\n" +"[6, 'The Rolling Stones', 1962]\n" +"[7, 'The Doors', 1965]\n" +"[8, 'Nirvana', 1987]\n" +"[9, 'Led Zeppelin', 1968]\n" +"[10, 'Queen', 1970]\n" "---\n" -"- ['C', '!']\n" "...\n" -"tarantool> s:insert{'A', 'C'}\n" +"\n" +"-- Select all tuples whose secondary key values start with the specified string --\n" +"tarantool> for _, tuple in bands.index.band:pairs(\"The\", {iterator = \"GE\"}) do\n" +" if (string.sub(tuple[2], 1, 3) ~= \"The\") then break end\n" +" print(tuple)\n" +" end\n" +"[4, 'The Beatles', 1960]\n" +"[7, 'The Doors', 1965]\n" +"[6, 'The Rolling Stones', 1962]\n" "---\n" -"- ['A', 'C']\n" "...\n" -"tarantool> function example()\n" -" > for _, tuple in\n" -" > s.index.primary:pairs(nil, {\n" -" > iterator = box.index.ALL}) do\n" -" > print(tuple)\n" -" > end\n" -" > end\n" +"\n" +"-- Select all tuples whose secondary key values are between 1965 and 1970 --\n" +"tarantool> for _, tuple in bands.index.year:pairs(1965, {iterator = \"GE\"}) do\n" +" if (tuple[3] > 1970) then break end\n" +" print(tuple)\n" +" end\n" +"[2, 'Scorpions', 1965]\n" +"[5, 'Pink Floyd', 1965]\n" +"[7, 'The Doors', 1965]\n" +"[9, 'Led Zeppelin', 1968]\n" +"[10, 'Queen', 1970]\n" "---\n" "...\n" -"tarantool> example()\n" -"['A', 'C']\n" -"['B', 'A']\n" -"['C', '!']\n" -"['C', 'C']\n" -"---\n" -"...\n" -"tarantool> s:drop()\n" +"\n" +"-- Select all tuples after the specified tuple --\n" +"tarantool> for _, tuple in bands.index.primary:pairs({}, {after={7, 'The Doors', 1965}}) do\n" +" print(tuple)\n" +" end\n" +"[8, 'Nirvana', 1987]\n" +"[9, 'Led Zeppelin', 1968]\n" +"[10, 'Queen', 1970]\n" "---\n" "..." msgstr "" -"tarantool> s = box.schema.space.create('space17')\n" -"---\n" -"...\n" -"tarantool> s:create_index('primary', {\n" -" > parts = {1, 'string', 2, 'string'}\n" -" > })\n" -"---\n" -"...\n" -"tarantool> s:insert{'C', 'C'}\n" -"---\n" -"- ['C', 'C']\n" -"...\n" -"tarantool> s:insert{'B', 'A'}\n" -"---\n" -"- ['B', 'A']\n" -"...\n" -"tarantool> s:insert{'C', '!'}\n" -"---\n" -"- ['C', '!']\n" -"...\n" -"tarantool> s:insert{'A', 'C'}\n" -"---\n" -"- ['A', 'C']\n" -"...\n" -"tarantool> function example()\n" -" > for _, tuple in\n" -" > s.index.primary:pairs(nil, {\n" -" > iterator = box.index.ALL}) do\n" -" > print(tuple)\n" -" > end\n" -" > end\n" -"---\n" -"...\n" -"tarantool> example()\n" -"['A', 'C']\n" -"['B', 'A']\n" -"['C', '!']\n" -"['C', 'C']\n" -"---\n" -"...\n" -"tarantool> s:drop()\n" -"---\n" -"..." -msgid "**Second example of index pairs():**" -msgstr "**Второй пример pairs():**" - -msgid "" -"This Lua code finds all the tuples whose primary key values begin with 'XY'." -" The assumptions include that there is a one-part primary-key TREE index on " -"the first field, which must be a string. The iterator loop ensures that the " -"search will return tuples where the first value is greater than or equal to " -"'XY'. The conditional statement within the loop ensures that the looping " -"will stop when the first two letters are not 'XY'." -msgstr "" -"Данный код на Lua найдет все кортежи, значения первичного ключа в которых " -"начинаются с 'XY'. Рабочие предположения заключаются в следующем: есть " -"однокомпонентный первичный TREE-индекс по первому полю, которое должно " -"представлять собой строку. Цикл с итератором обеспечивает поиск кортежей, в " -"которых первое значение больше или равно 'XY'. Условный оператор в цикле " -"служит для того, чтобы цикл останавливался, если первые две буквы не 'XY'." - -msgid "" -"for _, tuple in\n" -"box.space.t.index.primary:pairs(\"XY\",{iterator = \"GE\"}) do\n" -" if (string.sub(tuple[1], 1, 2) ~= \"XY\") then break end\n" -" print(tuple)\n" -"end" -msgstr "" -"for _, tuple in\n" -"box.space.t.index.primary:pairs(\"XY\",{iterator = \"GE\"}) do\n" -" if (string.sub(tuple[1], 1, 2) ~= \"XY\") then break end\n" -" print(tuple)\n" -"end" - -msgid "**Third example of index pairs():**" -msgstr "**Третий пример pairs():**" - -msgid "" -"This Lua code finds all the tuples whose primary key values are greater than" -" or equal to 1000, and less than or equal to 1999 (this type of request is " -"sometimes called a \"range search\" or a \"between search\"). The " -"assumptions include that there is a one-part primary-key TREE index on the " -"first field, which must be a :ref:`number `. The iterator " -"loop ensures that the search will return tuples where the first value is " -"greater than or equal to 1000. The conditional statement within the loop " -"ensures that the looping will stop when the first value is greater than " -"1999." -msgstr "" -"Данный код на Lua найдет все кортежи, значения первичного ключа которых " -"равны или больше 1000 и меньше или равны 1999 (такой тип запроса иногда " -"называют поиском по диапазону или поиском в заданных пределах). Рабочие " -"предположения заключаются в следующем: есть однокомпонентный первичный TREE-" -"индекс по первому полю, которое должно представлять собой :ref:`число " -"`. Цикл с итератором обеспечивает поиск кортежей, в " -"которых первое значение больше или равно 1000. Условный оператор в цикле " -"служит для того, чтобы цикл останавливался, если первое значение больше " -"1999." - -msgid "" -"for _, tuple in\n" -"box.space.t2.index.primary:pairs(1000,{iterator = \"GE\"}) do\n" -" if (tuple[1] > 1999) then break end\n" -" print(tuple)\n" -"end" -msgstr "" -"for _, tuple in\n" -"box.space.t2.index.primary:pairs(1000,{iterator = \"GE\"}) do\n" -" if (tuple[1] > 1999) then break end\n" -" print(tuple)\n" -"end" +#~ msgid "" +#~ "The comparison operator is '>' (greater than). If a hash of an index key is " +#~ "greater than a hash of a search value, it matches. Tuples are returned in " +#~ "ascending order by hash of index key, which will appear to be random. " +#~ "Provided that the space is not being updated, one can retrieve all the " +#~ "tuples in a space, N tuples at a time, by using {iterator='GT', limit=N} in " +#~ "each search, and using the last returned value from the previous result as " +#~ "the start search value for the next search." +#~ msgstr "" +#~ "Оператором сравнения будет '>' (больше чем). Если хеш ключа индекса больше, " +#~ "чем хеш искомого значения, получим совпадение. Найденные кортежи упорядочены" +#~ " по возрастанию по хешу ключа индекса, который будет выглядеть случайным. " +#~ "При условии, что спейс не обновляется, можно получить все кортежи в спейсе, " +#~ "N кортежей за раз, используя {iterator='GT', limit=N} в каждом поиске и " +#~ "последнее найденное значение из предыдущего результата поиска в качестве " +#~ "начального значения для следующего поиска." + +#~ msgid "**First example of index pairs():**" +#~ msgstr "**Первый пример pairs():**" + +#~ msgid "Default 'TREE' Index and ``pairs()`` function:" +#~ msgstr "'TREE'-индекс, используемый по умолчанию, и функция ``pairs()``:" + +#~ msgid "" +#~ "tarantool> s = box.schema.space.create('space17')\n" +#~ "---\n" +#~ "...\n" +#~ "tarantool> s:create_index('primary', {\n" +#~ " > parts = {1, 'string', 2, 'string'}\n" +#~ " > })\n" +#~ "---\n" +#~ "...\n" +#~ "tarantool> s:insert{'C', 'C'}\n" +#~ "---\n" +#~ "- ['C', 'C']\n" +#~ "...\n" +#~ "tarantool> s:insert{'B', 'A'}\n" +#~ "---\n" +#~ "- ['B', 'A']\n" +#~ "...\n" +#~ "tarantool> s:insert{'C', '!'}\n" +#~ "---\n" +#~ "- ['C', '!']\n" +#~ "...\n" +#~ "tarantool> s:insert{'A', 'C'}\n" +#~ "---\n" +#~ "- ['A', 'C']\n" +#~ "...\n" +#~ "tarantool> function example()\n" +#~ " > for _, tuple in\n" +#~ " > s.index.primary:pairs(nil, {\n" +#~ " > iterator = box.index.ALL}) do\n" +#~ " > print(tuple)\n" +#~ " > end\n" +#~ " > end\n" +#~ "---\n" +#~ "...\n" +#~ "tarantool> example()\n" +#~ "['A', 'C']\n" +#~ "['B', 'A']\n" +#~ "['C', '!']\n" +#~ "['C', 'C']\n" +#~ "---\n" +#~ "...\n" +#~ "tarantool> s:drop()\n" +#~ "---\n" +#~ "..." +#~ msgstr "" +#~ "tarantool> s = box.schema.space.create('space17')\n" +#~ "---\n" +#~ "...\n" +#~ "tarantool> s:create_index('primary', {\n" +#~ " > parts = {1, 'string', 2, 'string'}\n" +#~ " > })\n" +#~ "---\n" +#~ "...\n" +#~ "tarantool> s:insert{'C', 'C'}\n" +#~ "---\n" +#~ "- ['C', 'C']\n" +#~ "...\n" +#~ "tarantool> s:insert{'B', 'A'}\n" +#~ "---\n" +#~ "- ['B', 'A']\n" +#~ "...\n" +#~ "tarantool> s:insert{'C', '!'}\n" +#~ "---\n" +#~ "- ['C', '!']\n" +#~ "...\n" +#~ "tarantool> s:insert{'A', 'C'}\n" +#~ "---\n" +#~ "- ['A', 'C']\n" +#~ "...\n" +#~ "tarantool> function example()\n" +#~ " > for _, tuple in\n" +#~ " > s.index.primary:pairs(nil, {\n" +#~ " > iterator = box.index.ALL}) do\n" +#~ " > print(tuple)\n" +#~ " > end\n" +#~ " > end\n" +#~ "---\n" +#~ "...\n" +#~ "tarantool> example()\n" +#~ "['A', 'C']\n" +#~ "['B', 'A']\n" +#~ "['C', '!']\n" +#~ "['C', 'C']\n" +#~ "---\n" +#~ "...\n" +#~ "tarantool> s:drop()\n" +#~ "---\n" +#~ "..." + +#~ msgid "**Second example of index pairs():**" +#~ msgstr "**Второй пример pairs():**" + +#~ msgid "" +#~ "This Lua code finds all the tuples whose primary key values begin with 'XY'." +#~ " The assumptions include that there is a one-part primary-key TREE index on " +#~ "the first field, which must be a string. The iterator loop ensures that the " +#~ "search will return tuples where the first value is greater than or equal to " +#~ "'XY'. The conditional statement within the loop ensures that the looping " +#~ "will stop when the first two letters are not 'XY'." +#~ msgstr "" +#~ "Данный код на Lua найдет все кортежи, значения первичного ключа в которых " +#~ "начинаются с 'XY'. Рабочие предположения заключаются в следующем: есть " +#~ "однокомпонентный первичный TREE-индекс по первому полю, которое должно " +#~ "представлять собой строку. Цикл с итератором обеспечивает поиск кортежей, в " +#~ "которых первое значение больше или равно 'XY'. Условный оператор в цикле " +#~ "служит для того, чтобы цикл останавливался, если первые две буквы не 'XY'." + +#~ msgid "" +#~ "for _, tuple in\n" +#~ "box.space.t.index.primary:pairs(\"XY\",{iterator = \"GE\"}) do\n" +#~ " if (string.sub(tuple[1], 1, 2) ~= \"XY\") then break end\n" +#~ " print(tuple)\n" +#~ "end" +#~ msgstr "" +#~ "for _, tuple in\n" +#~ "box.space.t.index.primary:pairs(\"XY\",{iterator = \"GE\"}) do\n" +#~ " if (string.sub(tuple[1], 1, 2) ~= \"XY\") then break end\n" +#~ " print(tuple)\n" +#~ "end" + +#~ msgid "**Third example of index pairs():**" +#~ msgstr "**Третий пример pairs():**" + +#~ msgid "" +#~ "This Lua code finds all the tuples whose primary key values are greater than" +#~ " or equal to 1000, and less than or equal to 1999 (this type of request is " +#~ "sometimes called a \"range search\" or a \"between search\"). The " +#~ "assumptions include that there is a one-part primary-key TREE index on the " +#~ "first field, which must be a :ref:`number `. The iterator " +#~ "loop ensures that the search will return tuples where the first value is " +#~ "greater than or equal to 1000. The conditional statement within the loop " +#~ "ensures that the looping will stop when the first value is greater than " +#~ "1999." +#~ msgstr "" +#~ "Данный код на Lua найдет все кортежи, значения первичного ключа которых " +#~ "равны или больше 1000 и меньше или равны 1999 (такой тип запроса иногда " +#~ "называют поиском по диапазону или поиском в заданных пределах). Рабочие " +#~ "предположения заключаются в следующем: есть однокомпонентный первичный TREE-" +#~ "индекс по первому полю, которое должно представлять собой :ref:`число " +#~ "`. Цикл с итератором обеспечивает поиск кортежей, в " +#~ "которых первое значение больше или равно 1000. Условный оператор в цикле " +#~ "служит для того, чтобы цикл останавливался, если первое значение больше " +#~ "1999." + +#~ msgid "" +#~ "for _, tuple in\n" +#~ "box.space.t2.index.primary:pairs(1000,{iterator = \"GE\"}) do\n" +#~ " if (tuple[1] > 1999) then break end\n" +#~ " print(tuple)\n" +#~ "end" +#~ msgstr "" +#~ "for _, tuple in\n" +#~ "box.space.t2.index.primary:pairs(1000,{iterator = \"GE\"}) do\n" +#~ " if (tuple[1] > 1999) then break end\n" +#~ " print(tuple)\n" +#~ "end" diff --git a/locale/ru/LC_MESSAGES/reference/reference_lua/box_index/parts.po b/locale/ru/LC_MESSAGES/reference/reference_lua/box_index/parts.po index d926633f7e..d96469bfa9 100644 --- a/locale/ru/LC_MESSAGES/reference/reference_lua/box_index/parts.po +++ b/locale/ru/LC_MESSAGES/reference/reference_lua/box_index/parts.po @@ -2,12 +2,8 @@ msgid "index_object:parts" msgstr "" -msgid "" -"An array describing the index fields. To learn more about the index field " -"types, refer to :ref:`this table `." +msgid "The index's key parts." msgstr "" -"Массив, описывающий поля индекса. Чтобы узнать больше о типах полей индекса," -" обращайтесь к :ref:`этой таблице `." msgid "rtype" msgstr "тип возвращаемого значения" @@ -15,20 +11,30 @@ msgstr "тип возвращаемого значения" msgid "table" msgstr "таблица" -msgid "**Example:**" -msgstr "**Пример:**" - -msgid "" -"tarantool> box.space.tester.index.primary\n" -"---\n" -"- unique: true\n" -" parts:\n" -" - type: unsigned\n" -" is_nullable: false\n" -" fieldno: 1\n" -" id: 0\n" -" space_id: 513\n" -" name: primary\n" -" type: TREE\n" -"..." +msgid "**See also:** :ref:`index_opts.parts `" msgstr "" + +#~ msgid "" +#~ "An array describing the index fields. To learn more about the index field " +#~ "types, refer to :ref:`this table `." +#~ msgstr "" +#~ "Массив, описывающий поля индекса. Чтобы узнать больше о типах полей индекса," +#~ " обращайтесь к :ref:`этой таблице `." + +#~ msgid "**Example:**" +#~ msgstr "**Пример:**" + +#~ msgid "" +#~ "tarantool> box.space.tester.index.primary\n" +#~ "---\n" +#~ "- unique: true\n" +#~ " parts:\n" +#~ " - type: unsigned\n" +#~ " is_nullable: false\n" +#~ " fieldno: 1\n" +#~ " id: 0\n" +#~ " space_id: 513\n" +#~ " name: primary\n" +#~ " type: TREE\n" +#~ "..." +#~ msgstr "" diff --git a/locale/ru/LC_MESSAGES/reference/reference_lua/box_index/random.po b/locale/ru/LC_MESSAGES/reference/reference_lua/box_index/random.po index 82d6417030..d8fbbef296 100644 --- a/locale/ru/LC_MESSAGES/reference/reference_lua/box_index/random.po +++ b/locale/ru/LC_MESSAGES/reference/reference_lua/box_index/random.po @@ -35,7 +35,9 @@ msgstr "tuple" msgid "**Complexity factors:** Index size, Index type." msgstr "**Факторы сложности:** Размер индекса, тип индекса" -msgid "**Note re storage engine:** vinyl does not support ``random()``." +#, fuzzy +msgid "" +"**Note regarding storage engine:** vinyl does not support ``random()``." msgstr "" "**Примечание про движок базы данных:** vinyl не поддерживает ``random()``." diff --git a/locale/ru/LC_MESSAGES/reference/reference_lua/box_index/select.po b/locale/ru/LC_MESSAGES/reference/reference_lua/box_index/select.po index f99f398f15..3eff075b71 100644 --- a/locale/ru/LC_MESSAGES/reference/reference_lua/box_index/select.po +++ b/locale/ru/LC_MESSAGES/reference/reference_lua/box_index/select.po @@ -3,9 +3,9 @@ msgid "index_object:select()" msgstr "" msgid "" -"This is an alternative to :ref:`box.space...select() ` " -"which goes via a particular index and can make use of additional parameters " -"that specify the iterator type, and the limit, and the offset." +"Search for a tuple or a set of tuples by the current index. To search by the" +" primary index in the specified space, use the :ref:`box_space-select` " +"method." msgstr "" msgid "Parameters" @@ -14,124 +14,192 @@ msgstr "Параметры" msgid "an :ref:`object reference `." msgstr ":ref:`ссылка на объект `." -msgid "values to be matched against the index key" +#, fuzzy +msgid "a value to be matched against the index key, which may be multi-part." msgstr "значения для сопоставления с ключом индекса" msgid "" -"none, any, or all of the following parameters: * ``iterator`` -- type of " -"iterator * ``limit`` -- maximum number of tuples * ``offset`` -- start tuple" -" number (do not use it. See :ref:`warning `)" +"none, any, or all of the following parameters: * ``iterator`` -- the " +":ref:`iterator type `. The default iterator type " +"is 'EQ'. * ``limit`` -- the maximum number of tuples. * ``offset`` -- the " +"number of tuples to skip (use this parameter carefully when scanning " +":ref:`large data sets `). * ``options.after`` -- a tuple or " +"the position of a tuple (:ref:`tuple_pos `) after which" +" ``select`` starts the search. You can pass an empty string or " +":ref:`box.NULL ` to this option to start the search from the first" +" tuple. * ``options.fetch_pos`` -- if **true**, the ``select`` method " +"returns the position of the last selected tuple as the second value. .. " +"NOTE:: The ``after`` and ``fetch_pos`` options are supported for the " +"``TREE`` :ref:`index ` only." msgstr "" msgid "none, any, or all of the following parameters:" msgstr "ни один, любой или все следующие параметры:" -msgid "``iterator`` -- type of iterator" -msgstr "``iterator`` -- тип итератора" +msgid "" +"``iterator`` -- the :ref:`iterator type `. The " +"default iterator type is 'EQ'." +msgstr "" -msgid "``limit`` -- maximum number of tuples" +#, fuzzy +msgid "``limit`` -- the maximum number of tuples." msgstr "``limit`` -- максимальное количество кортежей" msgid "" -"``offset`` -- start tuple number (do not use it. See :ref:`warning `)" +"``offset`` -- the number of tuples to skip (use this parameter carefully " +"when scanning :ref:`large data sets `)." msgstr "" -msgid "return" -msgstr "возвращает" +msgid "" +"``options.after`` -- a tuple or the position of a tuple (:ref:`tuple_pos " +"`) after which ``select`` starts the search. You can " +"pass an empty string or :ref:`box.NULL ` to this option to start " +"the search from the first tuple." +msgstr "" -msgid "the tuple or tuples that match the field values." -msgstr "кортеж или кортежи, которые совпадают со значениями поля." +msgid "" +"``options.fetch_pos`` -- if **true**, the ``select`` method returns the " +"position of the last selected tuple as the second value." +msgstr "" -msgid "rtype" -msgstr "тип возвращаемого значения" +msgid "" +"The ``after`` and ``fetch_pos`` options are supported for the ``TREE`` " +":ref:`index ` only." +msgstr "" -msgid "array of tuples" -msgstr "массив кортежей" +msgid "return" +msgstr "возвращает" -msgid "" -"We do not recommend using the ``offset`` option for scanning large values " -"because it linearly increases the number of scanned tuples and leads to the " -"full scan of the space." +msgid "This function might return one or two values:" msgstr "" msgid "" -"For unique indexes you can build cursors with :doc:`pairs() " -"`:" +"The tuples whose fields are equal to the fields of the passed key. If the " +"number of passed fields is less than the number of fields in the current " +"key, then only the passed fields are compared, so ``select{1,2}`` matches a " +"tuple whose primary key is ``{1,2,3}``." msgstr "" -msgid "index_obj:pairs(key, {iterator = 'GT'})" +msgid "" +"(Optionally) If ``options.fetch_pos`` is set to **true**, returns a " +"base64-encoded string representing the position of the last selected tuple " +"as the second value. If no tuples are fetched, returns ``nil``." msgstr "" -msgid "**Example:**" -msgstr "**Пример:**" +msgid "rtype" +msgstr "тип возвращаемого значения" -msgid "" -"-- Create a space named tester.\n" -"tarantool> sp = box.schema.space.create('tester')\n" -"-- Create a unique index 'primary'\n" -"-- which won't be needed for this example.\n" -"tarantool> sp:create_index('primary', {parts = {1, 'unsigned' }})\n" -"-- Create a non-unique index 'secondary'\n" -"-- with an index on the second field.\n" -"tarantool> sp:create_index('secondary', {\n" -" > type = 'tree',\n" -" > unique = false,\n" -" > parts = {2, 'string'}\n" -" > })\n" -"-- Insert three tuples, values in field[2]\n" -"-- equal to 'X', 'Y', and 'Z'.\n" -"tarantool> sp:insert{1, 'X', 'Row with field[2]=X'}\n" -"tarantool> sp:insert{2, 'Y', 'Row with field[2]=Y'}\n" -"tarantool> sp:insert{3, 'Z', 'Row with field[2]=Z'}\n" -"-- Select all tuples where the secondary index\n" -"-- keys are greater than 'X'.\n" -"tarantool> sp.index.secondary:select({'X'}, {\n" -" > iterator = 'GT',\n" -" > limit = 1000\n" -" > })" -msgstr "" - -msgid "The result will be a table of tuple and will look like this:" -msgstr "Результатом будет следующая таблица кортежа:" +msgid "array of tuples" +msgstr "массив кортежей" -msgid "" -"---\n" -"- - [2, 'Y', 'Row with field[2]=Y']\n" -" - [3, 'Z', 'Row with field[2]=Z']\n" -"..." +msgid "(Optionally) string" msgstr "" msgid "" -"The arguments are optional. If you call :samp:`box.space.{space-" -"name}:select{}`, then every key in the index is considered to be a match, " -"regardless of the iterator type. Therefore, for the example above, " -"``box.space.tester:select{}`` will select every tuple in the ``tester`` " -"space via the first (primary-key) index." -msgstr "" -"Аргументы необязательны. Если вы вызываете :samp:`box.space.{имя-" -"спейса}:select{}`, то каждый ключ в индексе считается совпадающим, " -"независимо от типа итератора. Таким образом, в приведённом выше примере, " -"``box.space.tester:select{}`` выберет каждый кортеж в спейсе ``tester`` по " -"первому индексу (первичный ключ)." +"Use the ``offset`` option carefully when scanning large data sets as it " +"linearly increases the number of scanned tuples and leads to a full space " +"scan. Instead, you can use the ``after`` and ``fetch_pos`` options." +msgstr "" + +#, fuzzy +msgid "**Examples:**" +msgstr "**Пример:**" msgid "" -":samp:`index.{index-name}` is optional. If it is omitted, then the assumed " -"index is the first (primary-key) index. Therefore, for the example above, " -"``box.space.tester:select({1}, {iterator = 'GT'})`` would have returned the " -"same two rows, via the 'primary' index." +"Below are few examples of using ``select`` with different parameters. To try" +" out these examples, you need to bootstrap a Tarantool database as described" +" in :ref:`Using data operations `." msgstr "" -"Параметр :samp:`index.{имя-индекса}` необязателен. Если он пропущен, то " -"подразумевается первый индекс (первичный ключ). Таким образом, для примера " -"выше, ``box.space.tester:select({1}, {iterator = 'GT'})`` вернет две " -"одинаковых строки по первичному индексу 'primary'." msgid "" -":samp:`iterator = {iterator-type}` is optional. If it is omitted, then " -"``iterator = 'EQ'`` is assumed." +"-- Insert test data --\n" +"box.space.bands:insert { 1, 'Roxette', 1986 }\n" +"box.space.bands:insert { 2, 'Scorpions', 1965 }\n" +"box.space.bands:insert { 3, 'Ace of Base', 1987 }\n" +"box.space.bands:insert { 4, 'The Beatles', 1960 }\n" +"box.space.bands:insert { 5, 'Pink Floyd', 1965 }\n" +"box.space.bands:insert { 6, 'The Rolling Stones', 1962 }\n" +"box.space.bands:insert { 7, 'The Doors', 1965 }\n" +"box.space.bands:insert { 8, 'Nirvana', 1987 }\n" +"box.space.bands:insert { 9, 'Led Zeppelin', 1968 }\n" +"box.space.bands:insert { 10, 'Queen', 1970 }\n" +"\n" +"-- Select a tuple by the specified primary key value --\n" +"select_primary = bands.index.primary:select { 1 }\n" +"--[[\n" +"---\n" +"- - [1, 'Roxette', 1986]\n" +"...\n" +"--]]\n" +"\n" +"-- Select a tuple by the specified secondary key value --\n" +"select_secondary = bands.index.band:select { 'The Doors' }\n" +"--[[\n" +"---\n" +"- - [7, 'The Doors', 1965]\n" +"...\n" +"--]]\n" +"\n" +"-- Select a tuple by the specified multi-part secondary key value --\n" +"select_multipart = bands.index.year_band:select { 1960, 'The Beatles' }\n" +"--[[\n" +"---\n" +"- - [4, 'The Beatles', 1960]\n" +"...\n" +"--]]\n" +"\n" +"-- Select tuples by the specified partial key value --\n" +"select_multipart_partial = bands.index.year_band:select { 1965 }\n" +"--[[\n" +"---\n" +"- - [5, 'Pink Floyd', 1965]\n" +" - [2, 'Scorpions', 1965]\n" +" - [7, 'The Doors', 1965]\n" +"...\n" +"--]]\n" +"\n" +"-- Select maximum 3 tuples by the specified secondary index --\n" +"select_limit = bands.index.band:select({}, { limit = 3 })\n" +"--[[\n" +"---\n" +"- - [3, 'Ace of Base', 1987]\n" +" - [9, 'Led Zeppelin', 1968]\n" +" - [8, 'Nirvana', 1987]\n" +"...\n" +"--]]\n" +"\n" +"-- Select maximum 3 tuples with the key value greater than 1965 --\n" +"select_greater = bands.index.year:select({ 1965 }, { iterator = 'GT', limit = 3 })\n" +"--[[\n" +"---\n" +"- - [9, 'Led Zeppelin', 1968]\n" +" - [10, 'Queen', 1970]\n" +" - [1, 'Roxette', 1986]\n" +"...\n" +"--]]\n" +"\n" +"-- Select maximum 3 tuples after the specified tuple --\n" +"select_after_tuple = bands.index.primary:select({}, { after = { 4, 'The Beatles', 1960 }, limit = 3 })\n" +"--[[\n" +"---\n" +"- - [5, 'Pink Floyd', 1965]\n" +" - [6, 'The Rolling Stones', 1962]\n" +" - [7, 'The Doors', 1965]\n" +"...\n" +"--]]\n" +"\n" +"-- Select first 3 tuples and fetch a last tuple's position --\n" +"result, position = bands.index.primary:select({}, { limit = 3, fetch_pos = true })\n" +"-- Then, pass this position as the 'after' parameter --\n" +"select_after_position = bands.index.primary:select({}, { limit = 3, after = position })\n" +"--[[\n" +"---\n" +"- - [4, 'The Beatles', 1960]\n" +" - [5, 'Pink Floyd', 1965]\n" +" - [6, 'The Rolling Stones', 1962]\n" +"...\n" +"--]]\n" msgstr "" -"Параметр типа итератора :samp:`iterator = {тип-итератора}` необязателен. " -"Если он пропущен, то подразумевается, что ``iterator = 'EQ'``." msgid "" ":samp:`box.space.{space-name}.index.{index-name}:select(...)[1]`. can be " @@ -146,3 +214,107 @@ msgstr "" "получения первого кортежа в наборе кортежей, который был бы выведен по " "запросу ``select``. Однако, если в наборе кортежей больше одного кортежа, " "``get`` завершится с ошибкой." + +#~ msgid "" +#~ "This is an alternative to :ref:`box.space...select() ` " +#~ "which goes via a particular index and can make use of additional parameters " +#~ "that specify the iterator type, and the limit, and the offset." +#~ msgstr "" + +#~ msgid "" +#~ "none, any, or all of the following parameters: * ``iterator`` -- type of " +#~ "iterator * ``limit`` -- maximum number of tuples * ``offset`` -- start tuple" +#~ " number (do not use it. See :ref:`warning `)" +#~ msgstr "" + +#~ msgid "``iterator`` -- type of iterator" +#~ msgstr "``iterator`` -- тип итератора" + +#~ msgid "" +#~ "``offset`` -- start tuple number (do not use it. See :ref:`warning `)" +#~ msgstr "" + +#~ msgid "the tuple or tuples that match the field values." +#~ msgstr "кортеж или кортежи, которые совпадают со значениями поля." + +#~ msgid "" +#~ "We do not recommend using the ``offset`` option for scanning large values " +#~ "because it linearly increases the number of scanned tuples and leads to the " +#~ "full scan of the space." +#~ msgstr "" + +#~ msgid "" +#~ "For unique indexes you can build cursors with :doc:`pairs() " +#~ "`:" +#~ msgstr "" + +#~ msgid "index_obj:pairs(key, {iterator = 'GT'})" +#~ msgstr "" + +#~ msgid "" +#~ "-- Create a space named tester.\n" +#~ "tarantool> sp = box.schema.space.create('tester')\n" +#~ "-- Create a unique index 'primary'\n" +#~ "-- which won't be needed for this example.\n" +#~ "tarantool> sp:create_index('primary', {parts = {1, 'unsigned' }})\n" +#~ "-- Create a non-unique index 'secondary'\n" +#~ "-- with an index on the second field.\n" +#~ "tarantool> sp:create_index('secondary', {\n" +#~ " > type = 'tree',\n" +#~ " > unique = false,\n" +#~ " > parts = {2, 'string'}\n" +#~ " > })\n" +#~ "-- Insert three tuples, values in field[2]\n" +#~ "-- equal to 'X', 'Y', and 'Z'.\n" +#~ "tarantool> sp:insert{1, 'X', 'Row with field[2]=X'}\n" +#~ "tarantool> sp:insert{2, 'Y', 'Row with field[2]=Y'}\n" +#~ "tarantool> sp:insert{3, 'Z', 'Row with field[2]=Z'}\n" +#~ "-- Select all tuples where the secondary index\n" +#~ "-- keys are greater than 'X'.\n" +#~ "tarantool> sp.index.secondary:select({'X'}, {\n" +#~ " > iterator = 'GT',\n" +#~ " > limit = 1000\n" +#~ " > })" +#~ msgstr "" + +#~ msgid "The result will be a table of tuple and will look like this:" +#~ msgstr "Результатом будет следующая таблица кортежа:" + +#~ msgid "" +#~ "---\n" +#~ "- - [2, 'Y', 'Row with field[2]=Y']\n" +#~ " - [3, 'Z', 'Row with field[2]=Z']\n" +#~ "..." +#~ msgstr "" + +#~ msgid "" +#~ "The arguments are optional. If you call :samp:`box.space.{space-" +#~ "name}:select{}`, then every key in the index is considered to be a match, " +#~ "regardless of the iterator type. Therefore, for the example above, " +#~ "``box.space.tester:select{}`` will select every tuple in the ``tester`` " +#~ "space via the first (primary-key) index." +#~ msgstr "" +#~ "Аргументы необязательны. Если вы вызываете :samp:`box.space.{имя-" +#~ "спейса}:select{}`, то каждый ключ в индексе считается совпадающим, " +#~ "независимо от типа итератора. Таким образом, в приведённом выше примере, " +#~ "``box.space.tester:select{}`` выберет каждый кортеж в спейсе ``tester`` по " +#~ "первому индексу (первичный ключ)." + +#~ msgid "" +#~ ":samp:`index.{index-name}` is optional. If it is omitted, then the assumed " +#~ "index is the first (primary-key) index. Therefore, for the example above, " +#~ "``box.space.tester:select({1}, {iterator = 'GT'})`` would have returned the " +#~ "same two rows, via the 'primary' index." +#~ msgstr "" +#~ "Параметр :samp:`index.{имя-индекса}` необязателен. Если он пропущен, то " +#~ "подразумевается первый индекс (первичный ключ). Таким образом, для примера " +#~ "выше, ``box.space.tester:select({1}, {iterator = 'GT'})`` вернет две " +#~ "одинаковых строки по первичному индексу 'primary'." + +#~ msgid "" +#~ ":samp:`iterator = {iterator-type}` is optional. If it is omitted, then " +#~ "``iterator = 'EQ'`` is assumed." +#~ msgstr "" +#~ "Параметр типа итератора :samp:`iterator = {тип-итератора}` необязателен. " +#~ "Если он пропущен, то подразумевается, что ``iterator = 'EQ'``." diff --git a/locale/ru/LC_MESSAGES/reference/reference_lua/box_index/stat.po b/locale/ru/LC_MESSAGES/reference/reference_lua/box_index/stat.po index 0a59397037..f6c7579f27 100644 --- a/locale/ru/LC_MESSAGES/reference/reference_lua/box_index/stat.po +++ b/locale/ru/LC_MESSAGES/reference/reference_lua/box_index/stat.po @@ -81,9 +81,10 @@ msgstr "" "которое необходимо для запуска значительного слияния в любом диапазоне LSM-" "дерева." +#, fuzzy msgid "" "Summary index statistics are also available via :ref:`box.stat.vinyl() " -"`." +"`." msgstr "" "С помощью :ref:`box.stat.vinyl() `" " можно получить сводную статистику по индексу." diff --git a/locale/ru/LC_MESSAGES/reference/reference_lua/box_index/tuple_pos.po b/locale/ru/LC_MESSAGES/reference/reference_lua/box_index/tuple_pos.po new file mode 100644 index 0000000000..f6e6dbff80 --- /dev/null +++ b/locale/ru/LC_MESSAGES/reference/reference_lua/box_index/tuple_pos.po @@ -0,0 +1,77 @@ + +msgid "index_object:tuple_pos()" +msgstr "" + +msgid "" +"Return a tuple's position for an index. This value can be passed to the " +"``after`` option of the ``select`` and ``pairs`` methods:" +msgstr "" + +msgid "" +":ref:`index_object:select ` and :ref:`space_object:select " +"`" +msgstr "" + +msgid "" +":ref:`index_object:pairs ` and :ref:`space_object:pairs " +"`" +msgstr "" + +msgid "" +"Note that ``tuple_pos`` does not work with :ref:`functional ` and multikey indexes." +msgstr "" + +msgid "Parameters" +msgstr "" + +msgid "an :ref:`object reference `" +msgstr "" + +msgid "a tuple whose position should be found" +msgstr "" + +msgid "return" +msgstr "" + +msgid "a tuple's position in a space" +msgstr "" + +msgid "rtype" +msgstr "" + +msgid "base64-encoded string" +msgstr "" + +msgid "**Example:**" +msgstr "" + +msgid "" +"To try out this example, you need to bootstrap a Tarantool instance as " +"described in :ref:`Using data operations `." +msgstr "" + +msgid "" +"-- Insert test data --\n" +"tarantool> bands:insert{1, 'Roxette', 1986}\n" +" bands:insert{2, 'Scorpions', 1965}\n" +" bands:insert{3, 'Ace of Base', 1987}\n" +" bands:insert{4, 'The Beatles', 1960}\n" +" bands:insert{5, 'Pink Floyd', 1965}\n" +" bands:insert{6, 'The Rolling Stones', 1962}\n" +"---\n" +"...\n" +"\n" +"-- Get a tuple's position --\n" +"tarantool> position = bands.index.primary:tuple_pos({3, 'Ace of Base', 1987})\n" +"---\n" +"...\n" +"-- Pass the tuple's position as the 'after' parameter --\n" +"tarantool> bands:select({}, {limit = 3, after = position})\n" +"---\n" +"- - [4, 'The Beatles', 1960]\n" +" - [5, 'Pink Floyd', 1965]\n" +" - [6, 'The Rolling Stones', 1962]\n" +"..." +msgstr "" diff --git a/locale/ru/LC_MESSAGES/reference/reference_lua/box_index/type.po b/locale/ru/LC_MESSAGES/reference/reference_lua/box_index/type.po index c8a834b712..334e1d5cfd 100644 --- a/locale/ru/LC_MESSAGES/reference/reference_lua/box_index/type.po +++ b/locale/ru/LC_MESSAGES/reference/reference_lua/box_index/type.po @@ -2,5 +2,17 @@ msgid "index_object.type" msgstr "" -msgid "Index type, 'TREE' or 'HASH' or 'BITSET' or 'RTREE'." -msgstr "Тип индекса: 'TREE' или 'HASH' или 'BITSET' или 'RTREE'." +msgid "The :ref:`index type `." +msgstr "" + +msgid "rtype" +msgstr "" + +msgid "string" +msgstr "" + +msgid "**See also:** :ref:`index_opts.type `" +msgstr "" + +#~ msgid "Index type, 'TREE' or 'HASH' or 'BITSET' or 'RTREE'." +#~ msgstr "Тип индекса: 'TREE' или 'HASH' или 'BITSET' или 'RTREE'." diff --git a/locale/ru/LC_MESSAGES/reference/reference_lua/box_index/unique.po b/locale/ru/LC_MESSAGES/reference/reference_lua/box_index/unique.po index 024932466e..baef7379c4 100644 --- a/locale/ru/LC_MESSAGES/reference/reference_lua/box_index/unique.po +++ b/locale/ru/LC_MESSAGES/reference/reference_lua/box_index/unique.po @@ -2,7 +2,8 @@ msgid "index_object.unique" msgstr "" -msgid "True if the index is unique, false if the index is not unique." +#, fuzzy +msgid "``true`` if the index is unique, ``false`` if the index is not unique." msgstr "Если индекс уникальный -- true, если индекс не уникален -- false." msgid "rtype" @@ -10,3 +11,6 @@ msgstr "тип возвращаемого значения" msgid "boolean" msgstr "boolean (логический)" + +msgid "**See also:** :ref:`index_opts.unique `" +msgstr "" diff --git a/locale/ru/LC_MESSAGES/reference/reference_lua/box_index/user_defined.po b/locale/ru/LC_MESSAGES/reference/reference_lua/box_index/user_defined.po index f7dd8b6df2..f5d9311aba 100644 --- a/locale/ru/LC_MESSAGES/reference/reference_lua/box_index/user_defined.po +++ b/locale/ru/LC_MESSAGES/reference/reference_lua/box_index/user_defined.po @@ -2,8 +2,7 @@ msgid "index_object extensions" msgstr "" -msgid "" -"You can extend ``index_object`` with custom functions as follows:" +msgid "You can extend ``index_object`` with custom functions as follows:" msgstr "" "Пользователи могут сами определять любые желаемые функции и связывать их с " "индексами: фактически они могут создавать собственные методы для работы с " @@ -13,13 +12,15 @@ msgid "Create a Lua function." msgstr "создать Lua-функцию," msgid "" -"Add the function name to a predefined global variable, which has the ``table`` type." +"Add the function name to a predefined global variable, which has the " +"``table`` type." msgstr "" "добавить имя функции в заданную глобальную переменную с типом \"таблица\" " "(table)," msgid "" -"Call the function on the ``index_object``: ``index_object:function-name([parameters])``." +"Call the function on the ``index_object``: ``index_object:function-" +"name([parameters])``." msgstr "" "впоследствии в любое время, пока работает сервер, вызвать функцию с помощью " "``объект_индекса:имя-функции([параметры])``." @@ -27,82 +28,144 @@ msgstr "" msgid "There are three predefined global variables:" msgstr "Есть три заданные глобальные переменные:" +#, fuzzy msgid "" -"Adding to ``box_schema.index_mt`` makes the method available for all indexes." +"Adding to ``box_schema.index_mt`` makes the function available for all " +"indexes." msgstr "" -"Метод, добавленный в ``box_schema.index_mt``, будет доступен для всех индексов." +"Метод, добавленный в ``box_schema.index_mt``, будет доступен для всех " +"индексов." +#, fuzzy msgid "" -"Adding to ``box_schema.memtx_index_mt`` makes the method available for all memtx indexes." +"Adding to ``box_schema.memtx_index_mt`` makes the function available for all" +" memtx indexes." msgstr "" -"Метод, добавленный в ``box_schema.memtx_index_mt``, будет доступен для всех индексов в memtx'е." +"Метод, добавленный в ``box_schema.memtx_index_mt``, будет доступен для всех " +"индексов в memtx'е." +#, fuzzy msgid "" -"Adding to ``box_schema.vinyl_index_mt`` makes the method available for all vinyl indexes." +"Adding to ``box_schema.vinyl_index_mt`` makes the function available for all" +" vinyl indexes." msgstr "" -"Метод, добавленный в ``box_schema.vinyl_index_mt``, будет доступен для всех индексов в vinyl'е." +"Метод, добавленный в ``box_schema.vinyl_index_mt``, будет доступен для всех " +"индексов в vinyl'е." msgid "" -"Alternatively, you can make a user-defined function available for only one index " -"by calling ``getmetatable(index_object)`` and then adding the function name to the " -"meta table." +"Alternatively, you can make a user-defined function available for only one " +"index by calling ``getmetatable(index_object)`` and then adding the function" +" name to the meta table." msgstr "" "Можно также сделать задаваемый пользователем метод доступным только для " "одного индекса путем вызова ``getmetatable(объект_индекса)`` и последующего " "добавления имени функции в метатаблицу." -msgid "Parameters" -msgstr "Параметры" +#, fuzzy +msgid "**Example 1:**" +msgstr "**Пример:**" -msgid "an :ref:`object reference `." -msgstr ":ref:`ссылка на объект `." +msgid "" +"The example below shows how to extend all memtx indexes with the custom " +"function:" +msgstr "" -msgid "whatever the user defines" -msgstr "то, что определяет пользователь" +msgid "" +"box.schema.space.create('tester1', { engine = 'memtx' })\n" +"box.space.tester1:create_index('index1')\n" +"global_counter = 5\n" +"\n" +"-- Create a custom function.\n" +"function increase_global_counter()\n" +" global_counter = global_counter + 1\n" +"end\n" +"\n" +"-- Extend all memtx indexes with the created function.\n" +"box.schema.memtx_index_mt.increase_global_counter = increase_global_counter\n" +"\n" +"-- Call the 'increase_global_counter' function on 'index1'\n" +"-- to change the 'global_counter' value from 5 to 6.\n" +"box.space.tester1.index.index1:increase_global_counter()\n" +msgstr "" -msgid "**Example:**" +#, fuzzy +msgid "**Example 2:**" msgstr "**Пример:**" msgid "" -"-- Visible to any index of a memtx space, no parameters.\n" -"-- After these requests, the value of global_variable will be 6.\n" -"box.schema.space.create('t', {engine='memtx'})\n" -"box.space.t:create_index('i')\n" -"global_variable = 5\n" -"function f() global_variable = global_variable + 1 end\n" -"box.schema.memtx_index_mt.counter = f\n" -"box.space.t.index.i:counter()" +"The example below shows how to extend the specified index with the custom " +"function with parameters:" msgstr "" -"-- Доступный для любого индекса спейса memtx, без параметров.\n" -"-- После таких запросов значение глобальной переменной global_variable будет 6.\n" -"box.schema.space.create('t', {engine='memtx'})\n" -"box.space.t:create_index('i')\n" -"global_variable = 5\n" -"function f() global_variable = global_variable + 1 end\n" -"box.schema.memtx_index_mt.counter = f\n" -"box.space.t.index.i:counter()" msgid "" -"-- Visible to index box.space.t.index.i only, 1 parameter.\n" -"-- After these requests, the value of X will be 1005.\n" -"box.schema.space.create('t', {engine='memtx', id = 1000})\n" -"box.space.t:create_index('i')\n" -"X = 0\n" -"i = box.space.t.index.i\n" -"function f(i_arg, param) X = X + param + i_arg.space_id end\n" -"box.schema.memtx_index_mt.counter = f\n" -"meta = getmetatable(i)\n" -"meta.counter = f\n" -"i:counter(5)" +"box.schema.space.create('tester2', { engine = 'memtx', id = 1000 })\n" +"box.space.tester2:create_index('index2')\n" +"local_counter = 0\n" +"\n" +"-- Create a custom function.\n" +"function increase_local_counter(i_arg, param)\n" +" local_counter = local_counter + param + i_arg.space_id\n" +"end\n" +"\n" +"-- Extend only the 'index2' index with the created function.\n" +"box.schema.memtx_index_mt.increase_local_counter = increase_local_counter\n" +"meta = getmetatable(box.space.tester2.index.index2)\n" +"meta.increase_local_counter = increase_local_counter\n" +"\n" +"-- Call the 'increase_local_counter' function on 'index2'\n" +"-- to change the 'local_counter' value from 0 to 1005.\n" +"box.space.tester2.index.index2:increase_local_counter(5)\n" msgstr "" -"-- Доступный только для индекса box.space.t.index.i, 1 параметр.\n" -"-- После таких запросов значение X будет 1005.\n" -"box.schema.space.create('t', {engine='memtx', id = 1000})\n" -"box.space.t:create_index('i')\n" -"X = 0\n" -"i = box.space.t.index.i\n" -"function f(i_arg, param) X = X + param + i_arg.space_id end\n" -"box.schema.memtx_index_mt.counter = f\n" -"meta = getmetatable(i)\n" -"meta.counter = f\n" -"i:counter(5)" + +#~ msgid "Parameters" +#~ msgstr "Параметры" + +#~ msgid "an :ref:`object reference `." +#~ msgstr ":ref:`ссылка на объект `." + +#~ msgid "whatever the user defines" +#~ msgstr "то, что определяет пользователь" + +#~ msgid "" +#~ "-- Visible to any index of a memtx space, no parameters.\n" +#~ "-- After these requests, the value of global_variable will be 6.\n" +#~ "box.schema.space.create('t', {engine='memtx'})\n" +#~ "box.space.t:create_index('i')\n" +#~ "global_variable = 5\n" +#~ "function f() global_variable = global_variable + 1 end\n" +#~ "box.schema.memtx_index_mt.counter = f\n" +#~ "box.space.t.index.i:counter()" +#~ msgstr "" +#~ "-- Доступный для любого индекса спейса memtx, без параметров.\n" +#~ "-- После таких запросов значение глобальной переменной global_variable будет 6.\n" +#~ "box.schema.space.create('t', {engine='memtx'})\n" +#~ "box.space.t:create_index('i')\n" +#~ "global_variable = 5\n" +#~ "function f() global_variable = global_variable + 1 end\n" +#~ "box.schema.memtx_index_mt.counter = f\n" +#~ "box.space.t.index.i:counter()" + +#~ msgid "" +#~ "-- Visible to index box.space.t.index.i only, 1 parameter.\n" +#~ "-- After these requests, the value of X will be 1005.\n" +#~ "box.schema.space.create('t', {engine='memtx', id = 1000})\n" +#~ "box.space.t:create_index('i')\n" +#~ "X = 0\n" +#~ "i = box.space.t.index.i\n" +#~ "function f(i_arg, param) X = X + param + i_arg.space_id end\n" +#~ "box.schema.memtx_index_mt.counter = f\n" +#~ "meta = getmetatable(i)\n" +#~ "meta.counter = f\n" +#~ "i:counter(5)" +#~ msgstr "" +#~ "-- Доступный только для индекса box.space.t.index.i, 1 параметр.\n" +#~ "-- После таких запросов значение X будет 1005.\n" +#~ "box.schema.space.create('t', {engine='memtx', id = 1000})\n" +#~ "box.space.t:create_index('i')\n" +#~ "X = 0\n" +#~ "i = box.space.t.index.i\n" +#~ "function f(i_arg, param) X = X + param + i_arg.space_id end\n" +#~ "box.schema.memtx_index_mt.counter = f\n" +#~ "meta = getmetatable(i)\n" +#~ "meta.counter = f\n" +#~ "i:counter(5)" diff --git a/locale/ru/LC_MESSAGES/reference/reference_lua/box_info.po b/locale/ru/LC_MESSAGES/reference/reference_lua/box_info.po index 444d330199..a68433c6c8 100644 --- a/locale/ru/LC_MESSAGES/reference/reference_lua/box_info.po +++ b/locale/ru/LC_MESSAGES/reference/reference_lua/box_info.po @@ -59,8 +59,9 @@ msgstr "" "**pid** – идентификатор процесса. Это значение также отображается с помощью " "модуля :ref:`tarantool ` и по команде ``ps -A`` в Linux." +#, fuzzy msgid "" -"**ro** is ``true`` if the instance is in \"read-only\" mode (same as " +"**ro** is ``true`` if the instance is in read-only mode (same as " ":ref:`read_only ` in ``box.cfg{}``), or if status is " "'orphan'." msgstr "" @@ -68,6 +69,13 @@ msgstr "" " для чтения \"read-only\" (как :ref:`read_only ` в " "``box.cfg{}``), или в статусе 'orphan' (одиночный)." +msgid "" +"**ro_reason** is ``nil`` if the instance is in writable mode. When the field" +" is not ``nil``, it contains the reason why the instance is read-only. " +"Possible error reasons: ``election``, ``synchro``, ``config``, and " +"``orphan`` (see :ref:`box.info.ro_reason ` for details)." +msgstr "" + msgid "" "**signature** is the sum of all ``lsn`` values from each :ref:`vector clock " "` (**vclock**) for all instances in the replica set." @@ -140,8 +148,8 @@ msgid "" "**version** is the Tarantool version. This value is also shown by " ":ref:`tarantool -V `." msgstr "" -"**version** -- это версия Tarantool. Данное значение также можно " -"отобразить с помощью команды :ref:`tarantool -V `." +"**version** -- это версия Tarantool. Данное значение также можно отобразить " +"с помощью команды :ref:`tarantool -V `." msgid "" "**vinyl()** returns runtime statistics for the vinyl storage engine. This " @@ -157,7 +165,8 @@ msgid "" "election (see :doc:`here `)." msgstr "" -msgid "Below is a list of all ``box.info`` functions." +#, fuzzy +msgid "Below is a list of all ``box.info`` functions and members." msgstr "Ниже приведен перечень всех функций модуля ``box.info``." msgid "Name" @@ -208,3 +217,21 @@ msgstr "" msgid "" "Show the current state of a replica set node in regards to leader election" msgstr "" + +msgid ":doc:`./box_info/synchro`" +msgstr "" + +msgid "Show the current state of synchronous replication" +msgstr "" + +msgid ":doc:`./box_info/ro_reason`" +msgstr "" + +msgid "Show the current mode of an instance (writable or read-only)" +msgstr "" + +msgid ":doc:`./box_info/schema_version`" +msgstr "" + +msgid "Show the database schema version" +msgstr "" diff --git a/locale/ru/LC_MESSAGES/reference/reference_lua/box_info/election.po b/locale/ru/LC_MESSAGES/reference/reference_lua/box_info/election.po index d0bd5ec20e..8489981501 100644 --- a/locale/ru/LC_MESSAGES/reference/reference_lua/box_info/election.po +++ b/locale/ru/LC_MESSAGES/reference/reference_lua/box_info/election.po @@ -2,42 +2,100 @@ msgid "box.info.election" msgstr "" +msgid "Since version :doc:`2.6.1 `." +msgstr "" + msgid "" -"Since version :doc:`2.6.1 `. Show the current state of a " -"replica set node in regards to :ref:`leader election `, " -"namely, election state (mode), election term, vote in the current term, and " -"the leader ID of the current term." +"Show the current state of a replica set node in regards to :ref:`leader " +"election `. The following information is provided:" msgstr "" -msgid "**Example:**" -msgstr "**Пример:**" +msgid "" +"``state`` -- the election state (mode) of the node. Possible values are " +"``leader``, ``follower``, or ``candidate``. For more details, refer to " +"description of the :ref:`leader election process " +"`. When :ref:`replication.failover " +"` is set to ``election``, the " +"node is writable only in the ``leader`` state." +msgstr "" + +msgid "``term`` -- the current election term." +msgstr "" msgid "" -"tarantool> box.info.election\n" -"---\n" -"- state: follower\n" -" vote: 0\n" -" leader: 0\n" -" term: 1\n" -"..." +"``vote`` -- the ID of a node the current node votes for. If the value is " +"``0``, it means the node hasn't voted in the current term yet." msgstr "" msgid "" -"IDs in the ``box.info.election`` output are the replica IDs visible in the " -"``box.info.id`` output on each node and in the ``_cluster`` space." +"``leader`` -- a leader node ID in the current term. If the value is ``0``, " +"it means the node doesn't know which node is the leader in the current term." msgstr "" msgid "" -"State can be ``leader``, ``follower``, or ``candidate``. For more details, " -"refer to description of the :ref:`leader election process " -"`. When election is enabled, the node is writable" -" only in the ``leader`` state." +"``leader_name`` -- a leader name. Returns ``nil`` if there is no leader in a" +" cluster or :ref:`box.NULL ` if a leader does not have a name. " +"Since version :doc:`3.0.0 `." msgstr "" -msgid "``vote`` equals ``0`` means the node didn't vote in the current term." +msgid "" +"``leader_idle`` -- time in seconds since the last interaction with the known" +" leader. Since version :doc:`2.10.0 `." msgstr "" msgid "" -"``leader`` equals ``0`` means the node doesn't know who a leader in the " -"current term is." +"IDs in the ``box.info.election`` output are the replica IDs visible in the " +"``box.info.id`` output on each node and in the ``_cluster`` space." msgstr "" + +msgid "**Example:**" +msgstr "**Пример:**" + +msgid "" +"auto_leader:instance001> box.info.election\n" +"---\n" +"- leader_idle: 0\n" +" leader_name: instance001\n" +" state: leader\n" +" vote: 2\n" +" term: 3\n" +" leader: 2\n" +"..." +msgstr "" + +msgid "" +"See also: :ref:`Master-replica: automated failover `." +msgstr "" + +#~ msgid "" +#~ "Since version :doc:`2.6.1 `. Show the current state of a " +#~ "replica set node in regards to :ref:`leader election `, " +#~ "namely, election state (mode), election term, vote in the current term, and " +#~ "the leader ID of the current term." +#~ msgstr "" + +#~ msgid "" +#~ "tarantool> box.info.election\n" +#~ "---\n" +#~ "- state: follower\n" +#~ " vote: 0\n" +#~ " leader: 0\n" +#~ " term: 1\n" +#~ "..." +#~ msgstr "" + +#~ msgid "" +#~ "State can be ``leader``, ``follower``, or ``candidate``. For more details, " +#~ "refer to description of the :ref:`leader election process " +#~ "`. When election is enabled, the node is writable" +#~ " only in the ``leader`` state." +#~ msgstr "" + +#~ msgid "``vote`` equals ``0`` means the node didn't vote in the current term." +#~ msgstr "" + +#~ msgid "" +#~ "``leader`` equals ``0`` means the node doesn't know who a leader in the " +#~ "current term is." +#~ msgstr "" diff --git a/locale/ru/LC_MESSAGES/reference/reference_lua/box_info/gc.po b/locale/ru/LC_MESSAGES/reference/reference_lua/box_info/gc.po index 19460de7b5..9ca2b0ce10 100644 --- a/locale/ru/LC_MESSAGES/reference/reference_lua/box_info/gc.po +++ b/locale/ru/LC_MESSAGES/reference/reference_lua/box_info/gc.po @@ -11,8 +11,8 @@ msgid "" "collector has not removed old WAL files, or show what it may soon remove." msgstr "" "Функция **gc** в ``box.info`` дает пользователю ``admin`` полное " -"представление о факторах, которые влияют на :ref:`сборщик мусора Tarantool" -" `. Сборщик мусора сопоставляет " +"представление о факторах, которые влияют на :ref:`сборщик мусора Tarantool " +"`. Сборщик мусора сопоставляет " "значения vclock (:ref:`векторные часы `) пользователей и" " контрольных точек, поэтому взглянув на ``box.info.gc()``, можно понять, " "почему сборщик мусора не удалил старые WAL-файлы или что он может вскоре " diff --git a/locale/ru/LC_MESSAGES/reference/reference_lua/box_info/replication.po b/locale/ru/LC_MESSAGES/reference/reference_lua/box_info/replication.po index f73b0170ce..1d2a132d2c 100644 --- a/locale/ru/LC_MESSAGES/reference/reference_lua/box_info/replication.po +++ b/locale/ru/LC_MESSAGES/reference/reference_lua/box_info/replication.po @@ -2,19 +2,21 @@ msgid "box.info.replication" msgstr "box.info.replication" +#, fuzzy msgid "" -"The **replication** section of ``box.info()`` is a table array with " -"statistics for all instances in the replica set that the current instance " -"belongs to (see also :ref:`\"Monitoring a replica set\" `):" +"The **replication** section of ``box.info()`` is a table with statistics for" +" all instances in the replica set that the current instance belongs to. To " +"see the example, refer to :ref:`Monitoring a replica set `." msgstr "" "Раздел **replication** (репликация) во вложенном модуле ``box.info()`` " "содержит статистику по всем экземплярам в наборе реплик относительно " "текущего экземпляра (см. также :ref:`\"Мониторинг набора реплик\" " "`):" +#, fuzzy msgid "" -"In the following, *n* is the index number of one table item, for example " +"In the following, *n* is the index number of one table item, for example, " ":samp:`replication[1]`, which has data about server instance number 1, which" " may or may not be the same as the current instance (the \"current " "instance\" is what is responding to ``box.info``)." @@ -42,17 +44,19 @@ msgstr "" "экземпляра. Данное значение хранится в системном спейсе " ":ref:`box.space._cluster `." +#, fuzzy msgid "" ":samp:`replication[{n}].lsn` is the :ref:`log sequence number ` (LSN) for the latest entry in instance *n*'s :ref:`write ahead " +"mechanism>` (LSN) for the latest entry in instance *n*'s :ref:`write-ahead " "log ` (WAL)." msgstr "" ":samp:`replication[{n}].lsn` -- это :ref:`номер в журнале ` (LSN) для последней записи в :ref:`журнале упреждающей записи " "` (WAL) экземпляра *n*." +#, fuzzy msgid "" -":samp:`replication[{n}].upstream` appears (is not nil) if the current " +":samp:`replication[{n}].upstream` appears (is not ``nil``) if the current " "instance is following or intending to follow instance *n*, which ordinarily " "means :samp:`replication[{n}].upstream.status` = ``follow``, " ":samp:`replication[{n}].upstream.peer` = url of instance *n* which is being " @@ -74,58 +78,83 @@ msgstr "" "``box.cfg{replication={...}}``, поэтому он показан в " ":ref:`box.cfg.replication `." +#, fuzzy msgid "" ":samp:`replication[{n}].upstream.status` is the replication status of the " -"connection with instance *n*:" +"connection with the instance *n*:" msgstr "" ":samp:`replication[{n}].upstream.status` -- это репликационный статус " "экземпляра:" -msgid "" -"``auth`` means that :ref:`authentication ` is happening." +msgid "``connect``: an instance is connecting to the master." +msgstr "" + +#, fuzzy +msgid "``auth``: :ref:`authentication ` is being performed." msgstr "" "``auth`` означает, что экземпляр проходит :ref:`аутентификацию " "`." -msgid "``connecting`` means that connection is happening." -msgstr "``connecting`` означает, что происходит подключение." +msgid "" +"``wait_snapshot``: an instance is receiving metadata from the master. If " +"join fails with a non-critical :ref:`error ` at this stage (for" +" example, ``ER_READONLY``, ``ER_ACCESS_DENIED``, or a network-related " +"issue), an instance tries to find a new master to join." +msgstr "" msgid "" -"``disconnected`` means that it is not connected to the replica set (due to " -"network problems, not replication errors)." +"``fetch_snapshot``: an instance is receiving data from the master's " +"``.snap`` files." +msgstr "" + +msgid "" +"``final_join``: an instance is receiving new data added during " +"``fetch_snapshot``." msgstr "" -"``disconnected`` означает, что экземпляр не подключен к набору реплик (по " -"причине проблем в сети, а не ошибок репликации)." +#, fuzzy msgid "" -"``follow`` means that the current instance's role is \"replica\" (read-only," -" or not read-only but acting as a replica for this remote peer in a master-" -"master configuration), and is receiving or able to receive data from " -"instance *n*'s (upstream) master." +"``sync``: the master and replica are synchronizing to have the same data." +msgstr "" +"``sync`` означает, что мастер и реплика в данный момент синхронизируются для" +" получения одинакового набора данных." + +#, fuzzy +msgid "" +"``follow``: the current instance's role is **replica**. This means that the " +"instance is read-only or acts as a replica for this remote peer in " +":ref:`master-master ` configuration. The instance is " +"receiving or able to receive data from the instance *n*'s (upstream) master." msgstr "" "``follow`` означает, что текущий экземпляр является репликой (только для " "чтения, или не только для чтения, но ведет себя как реплика для этого " "удаленного URI в конфигурации master-master) и получает или может получать " "данные от мастера экземпляра *n* (upstream)." +#, fuzzy msgid "" -"``stopped`` means that replication was stopped due to a replication error " -"(for example :ref:`duplicate key `)." +"``stopped``: replication is stopped due to a replication error (for example," +" :ref:`duplicate key `)." msgstr "" "``stopped`` означает, что репликация остановилась по причине ошибки " "репликации (например, :ref:`повторяющийся ключ `)." +#, fuzzy msgid "" -"``sync`` means that the master and replica are synchronizing to have the " -"same data." +"``disconnected``: an instance is not connected to the replica set (for " +"example, due to network issues, not replication errors)." msgstr "" -"``sync`` означает, что мастер и реплика в данный момент синхронизируются для" -" получения одинакового набора данных." +"``disconnected`` означает, что экземпляр не подключен к набору реплик (по " +"причине проблем в сети, а не ошибок репликации)." +msgid "Learn more from :ref:`Replication stages `." +msgstr "" + +#, fuzzy msgid "" ":samp:`replication[{n}].upstream.idle` is the time (in seconds) since the " "last event was received. This is the primary indicator of replication " -"health. See more in :ref:`Monitoring a replica set `." msgstr "" ":samp:`replication[{n}].upstream.idle` -- это время (в секундах) с момента " @@ -133,20 +162,22 @@ msgstr "" "репликации. Подробности в :ref:`Monitoring a replica set `." +#, fuzzy msgid "" ":samp:`replication[{n}].upstream.peer` contains instance *n*'s :ref:`URI " -"` for example 127.0.0.1:3302. See more in :ref:`Monitoring a " -"replica set `." +"`, for example, 127.0.0.1:3302. Learn more from :ref:`Monitoring " +"a replica set `." msgstr "" ":samp:`replication[{n}].upstream.peer` содержит :ref:`URI ` " "экземпляра *n*, например 127.0.0.1:3302. Более подробную информацию см. в " "разделе :ref:`Мониторинг набора реплик `." +#, fuzzy msgid "" ":samp:`replication[{n}].upstream.lag` is the time difference between the " "local time of instance *n*, recorded when the event was received, and the " "local time at another master recorded when the event was written to the " -":ref:`write ahead log ` on that master. See more in " +":ref:`write-ahead log ` on that master. Learn more from " ":ref:`Monitoring a replica set `." msgstr "" ":samp:`replication[{n}].upstream.lag` -- это разница во времени между " @@ -156,29 +187,34 @@ msgstr "" "Более подробную информацию см. в разделе :ref:`Мониторинг набора реплик " "`." +#, fuzzy msgid "" ":samp:`replication[{n}].upstream.message` contains an error message in case " -"of a :ref:`degraded state `, otherwise it is nil." +"of a :ref:`degraded state `; otherwise, it is ``nil``." msgstr "" ":samp:`replication[{n}].upstream.message` содержит сообщение об ошибке в " "случае :ref:`системного сбоя `, в противном случае -- " "nil." +#, fuzzy msgid "" -":samp:`replication[{n}].downstream` appears (is not nil) with data about an " -"instance that is following instance *n* or is intending to follow it, which " -"ordinarily means :samp:`replication[{n}].downstream.status` = ``follow``," +":samp:`replication[{n}].downstream` appears (is not ``nil``) with data about" +" an instance that is following instance *n* or is intending to follow it, " +"which ordinarily means :samp:`replication[{n}].downstream.status` = " +"``follow``." msgstr "" ":samp:`replication[{n}].downstream` появляется (т.е. не nil), когда имеются " "данные об экземпляре, который принимает данные от экземпляра *n* или " "намеревается это делать,что обычно означает " ":samp:`replication[{n}].downstream.status` = ``follow``," +#, fuzzy msgid "" ":samp:`replication[{n}].downstream.vclock` contains the :ref:`vector clock " "`, which is a table of '**id**, **lsn**' pairs, for " -"example :code:`vclock: {1: 3054773, 4: 8938827, 3: 285902018}`. (Notice that" -" the table may have multiple pairs although ``vclock`` is a singular name)." +"example, :code:`vclock: {1: 3054773, 4: 8938827, 3: 285902018}`. (Notice " +"that the table may have multiple pairs although ``vclock`` is a singular " +"name)." msgstr "" ":samp:`replication[{n}].downstream.vclock` содержит :ref:`векторные часы " "`, которые представляют собой таблицу из пар '**id**, " @@ -212,9 +248,10 @@ msgstr "" "информацию об изменении на реплику (включая векторные часы мастера), и " "реплика отвечает тем, что находится в ее таблице векторных часов." +#, fuzzy msgid "" -"Also the replica sends its entire vector clock table in response to a " -"master's heartbeat message, see the heartbeat-message examples in section " +"A replica also sends its entire vector clock table in response to a master's" +" heartbeat message, see the heartbeat-message examples in the section " ":ref:`Binary protocol -- replication `." msgstr "" "Также реплика отправляет всю свою таблицу векторных часов в ответ на " @@ -246,9 +283,26 @@ msgstr "" "``follow`` означает, что downstream-репликация находится в процессе " "(экземпляр *n* готов принимать данные от мастера или уже делает это)." +#, fuzzy +msgid "" +":samp:`replication[{n}].downstream.lag` is the time difference between the " +"local time at the master node, recorded when a particular transaction was " +"written to the :ref:`write-ahead log `, and the local time " +"recorded when it receives an acknowledgment for this transaction from a " +"replica. Since version :doc:`2.10.0 `. See more in " +":ref:`Monitoring a replica set `." +msgstr "" +":samp:`replication[{n}].upstream.lag` -- это разница во времени между " +"локальным временем на экземпляре *n*, зарегистрированным при получении " +"события, и локальное время на другом мастере, зарегистрированное при записи " +"события в :ref:`журнал упреждающей записи ` на этом мастере. " +"Более подробную информацию см. в разделе :ref:`Мониторинг набора реплик " +"`." + +#, fuzzy msgid "" ":samp:`replication[{n}].downstream.message` and " -":samp:`replication[{n}].downstream.system_message` will be nil unless a " +":samp:`replication[{n}].downstream.system_message` will be ``nil`` unless a " "problem occurs with the connection. For example, if instance *n* goes down, " "then one may see ``status = 'stopped'``, ``message = 'unexpected EOF when " "reading from socket'``, and ``system_message = 'Broken pipe'``. See also " @@ -260,3 +314,12 @@ msgstr "" "можно будет увидеть ``status = 'stopped'``, ``message = 'unexpected EOF when" " read from socket'``, и ``system_message = 'broken pipe'``. См. также " ":ref:`\"сбой\" `." + +msgid "" +"For better understanding, see the following diagram illustrating the " +"``upstream`` and ``downstream`` connections within the replica set of three " +"instances:" +msgstr "" + +#~ msgid "``connecting`` means that connection is happening." +#~ msgstr "``connecting`` означает, что происходит подключение." diff --git a/locale/ru/LC_MESSAGES/reference/reference_lua/box_info/ro_reason.po b/locale/ru/LC_MESSAGES/reference/reference_lua/box_info/ro_reason.po new file mode 100644 index 0000000000..5f6525a92d --- /dev/null +++ b/locale/ru/LC_MESSAGES/reference/reference_lua/box_info/ro_reason.po @@ -0,0 +1,50 @@ + +msgid "box.info.ro_reason" +msgstr "" + +msgid "" +"Since :doc:`2.10.0 `. Show the current mode of an instance " +"(writable or read-only). Contains ``nil`` if the instance is in writable " +"mode. When the field is not ``nil``, reports the reason why the instance is " +"read-only." +msgstr "" + +msgid "Possible error reasons:" +msgstr "" + +msgid "" +"``election`` -- the instance is not the leader. That is, " +"``box.cfg.election_mode`` is not ``off``. See :ref:`box.info.election " +"` for details." +msgstr "" + +msgid "" +"``synchro`` -- the instance is not the owner of the synchronous transaction " +"queue. For details, see :ref:`box.info.synchro `." +msgstr "" + +msgid "" +"``config`` -- the server instance is in read-only mode. That is, " +":ref:`box.cfg.read_only ` is ``true``." +msgstr "" + +msgid "" +"``orphan`` -- the instance is in ``orphan`` state. For details, see " +":ref:`the orphan status page `." +msgstr "" + +msgid "rtype" +msgstr "" + +msgid "string" +msgstr "" + +msgid "**Example:**" +msgstr "" + +msgid "" +"tarantool> box.info.ro_reason\n" +"---\n" +"- null\n" +"..." +msgstr "" diff --git a/locale/ru/LC_MESSAGES/reference/reference_lua/box_info/schema_version.po b/locale/ru/LC_MESSAGES/reference/reference_lua/box_info/schema_version.po new file mode 100644 index 0000000000..1ebd033991 --- /dev/null +++ b/locale/ru/LC_MESSAGES/reference/reference_lua/box_info/schema_version.po @@ -0,0 +1,33 @@ + +msgid "box.info.schema_version" +msgstr "" + +msgid "" +"Since :doc:`2.11.0 `. Show the database schema version. A " +"schema version is a number that indicates whether the :ref:`database schema " +"` is changed. For example, the " +"``schema_version`` value grows if a :ref:`space ` or " +":ref:`index ` is added or deleted, or a space, index, or " +"field name is changed." +msgstr "" + +msgid "rtype" +msgstr "" + +msgid "number" +msgstr "" + +msgid "**Example:**" +msgstr "" + +msgid "" +"tarantool> box.info.schema_version\n" +"---\n" +"- 84\n" +"..." +msgstr "" + +msgid "" +"See also: :ref:`IPROTO_SCHEMA_VERSION `" +msgstr "" diff --git a/locale/ru/LC_MESSAGES/reference/reference_lua/box_info/synchro.po b/locale/ru/LC_MESSAGES/reference/reference_lua/box_info/synchro.po new file mode 100644 index 0000000000..e6fd871a09 --- /dev/null +++ b/locale/ru/LC_MESSAGES/reference/reference_lua/box_info/synchro.po @@ -0,0 +1,171 @@ + +msgid "box.info.synchro" +msgstr "" + +msgid "Since version :doc:`2.8.1 `." +msgstr "" + +msgid "Show the current state of synchronous replication." +msgstr "" + +msgid "" +"In :ref:`synchronous replication `, transaction is considered " +"committed only after achieving the required quorum number. While " +"transactions are collecting confirmations from remote nodes, these " +"transactions are waiting in the queue." +msgstr "" + +msgid "The following information is provided:" +msgstr "" + +msgid "``queue``:" +msgstr "" + +msgid "" +"``owner`` (since version :doc:`2.10.0 `) -- ID of the " +"replica that owns the synchronous transaction queue. Once an owner instance " +"appears, all other instances become read-only. If the ``owner`` field is " +"``0``, then every instance may be writable, but they can't create any " +"synchronous transactions. To claim or reclaim the queue, use " +":ref:`box.ctl.promote() ` on the instance that you want to " +"promote. With elections enabled, an instance runs ``box.ctl.promote()`` " +"command automatically after winning the elections. To clear the ownership, " +"call :ref:`box.ctl.demote() ` on the synchronous queue " +"owner." +msgstr "" + +msgid "" +"``term`` (since version :doc:`2.10.0 `) -- current queue " +"term. It contains the term of the last ``PROMOTE`` request. Usually, it is " +"equal to :ref:`box.info.election.term `. However, the " +"queue term value may be less than the election term. It can happen when a " +"new round of elections has started, but no instance has been promoted yet." +msgstr "" + +msgid "" +"``len`` -- the number of entries that are currently waiting in the queue." +msgstr "" + +msgid "" +"``busy`` (since version :doc:`2.10.0 `) -- the boolean " +"value is ``true`` when the instance is processing or writing some system " +"request that modifies the queue (for example, ``PROMOTE``, ``CONFIRM``, or " +"``ROLLBACK``). Until the request is complete, any other incoming synchronous" +" transactions and system requests will be delayed." +msgstr "" + +msgid "" +"``quorum`` -- the resulting value of the :ref:`replication_synchro_quorum " +"` configuration option. Since " +"version :doc:`2.5.3 `, the option can be set as a dynamic " +"formula. In this case, the value of the ``quorum`` member depends on the " +"current number of replicas." +msgstr "" + +msgid "**Example 1:**" +msgstr "" + +msgid "" +"In this example, the ``quorum`` field is equal to ``1``. That is, " +"synchronous transactions work like asynchronous ones. `1` means that a " +"successful WAL writing to the master is enough to commit." +msgstr "" + +msgid "" +"tarantool> box.info.synchro\n" +"---\n" +"- queue:\n" +" owner: 1\n" +" term: 2\n" +" len: 0\n" +" busy: false\n" +" quorum: 1\n" +"..." +msgstr "" + +msgid "**Example 2:**" +msgstr "" + +msgid "" +"First, set a quorum number and a timeout for synchronous replication using " +"the following command:" +msgstr "" + +msgid "" +"tarantool> box.cfg{\n" +" > replication_synchro_quorum=2,\n" +" > replication_synchro_timeout=1000\n" +" > }" +msgstr "" + +msgid "Next, check the current state of synchronous replication:" +msgstr "" + +msgid "" +"tarantool> box.info.synchro\n" +"---\n" +"- queue:\n" +" owner: 1\n" +" term: 2\n" +" len: 0\n" +" busy: false\n" +" quorum: 2\n" +"..." +msgstr "" + +msgid "" +"Create a space called ``sync`` and enable synchronous replication on this " +"space. Then, create an index." +msgstr "" + +msgid "" +"tarantool> s = box.schema.space.create(\"sync\", {is_sync=true})\n" +"tarantool> _ = s:create_index('pk')" +msgstr "" + +msgid "After that, use ``box.ctl.promote()`` function to claim a queue:" +msgstr "" + +msgid "tarantool> box.ctl.promote()" +msgstr "" + +msgid "Next, perform data manipulations:" +msgstr "" + +msgid "" +"tarantool> require('fiber').new(function() box.space.sync:replace{1} end)\n" +"---\n" +"- status: suspended\n" +" name: lua\n" +" id: 119\n" +"...\n" +"tarantool> require('fiber').new(function() box.space.sync:replace{1} end)\n" +"---\n" +"- status: suspended\n" +" name: lua\n" +" id: 120\n" +"...\n" +"tarantool> require('fiber').new(function() box.space.sync:replace{1} end)\n" +"---\n" +"- status: suspended\n" +" name: lua\n" +" id: 121\n" +"..." +msgstr "" + +msgid "" +"If you call the ``box.info.synchro`` command again, you will see that now " +"there are 3 transactions waiting in the queue:" +msgstr "" + +msgid "" +"tarantool> box.info.synchro\n" +"---\n" +"- queue:\n" +" owner: 1\n" +" term: 2\n" +" len: 3\n" +" busy: false\n" +" quorum: 2\n" +"..." +msgstr "" diff --git a/locale/ru/LC_MESSAGES/reference/reference_lua/box_iproto.po b/locale/ru/LC_MESSAGES/reference/reference_lua/box_iproto.po new file mode 100644 index 0000000000..063e417a96 --- /dev/null +++ b/locale/ru/LC_MESSAGES/reference/reference_lua/box_iproto.po @@ -0,0 +1,230 @@ + +msgid "Submodule box.iproto" +msgstr "" + +msgid "Since :doc:`2.11.0 `." +msgstr "" + +msgid "" +"The ``box.iproto`` submodule provides the ability to work with the network " +"subsystem of Tarantool. It allows you to extend the :ref:`IPROTO " +"` functionality from Lua. With this submodule, you can:" +msgstr "" + +msgid "" +":ref:`parse unknown IPROTO request types `" +msgstr "" + +msgid ":ref:`send arbitrary IPROTO packets `" +msgstr "" + +msgid "" +":ref:`override the behavior ` of the " +"existing and unknown request types in the binary protocol" +msgstr "" + +msgid "" +"The submodule exports all IPROTO :ref:`constants ` " +"and :ref:`features ` to Lua." +msgstr "" + +msgid "IPROTO constants" +msgstr "" + +msgid "" +"IPROTO constants in the ``box.iproto`` namespace are written in uppercase " +"letters without the ``IPROTO_`` prefix. The constants are divided into " +"several groups:" +msgstr "" + +msgid "" +":ref:`key `. Example: :ref:`IPROTO_SYNC " +"`." +msgstr "" + +msgid "" +":ref:`request type `. Example: " +":ref:`IPROTO_OK `." +msgstr "" + +msgid "" +":ref:`flag `. Example: :ref:`IPROTO_COMMIT " +"`." +msgstr "" + +msgid "" +":ref:`ballot key `. Example: " +":ref:`IPROTO_FLAG_COMMIT `." +msgstr "" + +msgid "" +":ref:`metadata key `. Example: " +":ref:`IPROTO_FIELD_IS_NULLABLE `." +msgstr "" + +msgid "" +":ref:`RAFT key `. Example: :ref:`IPROTO_TERM " +"`." +msgstr "" + +msgid "" +"Each group is located in the corresponding subnamespace without the prefix. " +"For example:" +msgstr "" + +msgid "" +"box.iproto.key.SYNC = 0x01\n" +"-- ...\n" +"box.iproto.type.SELECT = 1\n" +"-- ...\n" +"box.iproto.flag.COMMIT = 1\n" +"-- ...\n" +"box.iproto.ballot_key.VCLOCK = 2\n" +"-- ...\n" +"box.iproto.metadata_key.IS_NULLABLE = 3\n" +"-- ...\n" +"box.iproto.raft_key.TERM = 0\n" +"-- ..." +msgstr "" + +msgid "IPROTO features" +msgstr "" + +msgid "The submodule exports:" +msgstr "" + +msgid "" +"the current IPROTO protocol version (:ref:`box.iproto.protocol_version " +"`)" +msgstr "" + +msgid "" +"the set of IPROTO protocol features supported by the server " +"(:ref:`box.iproto.protocol_features `)" +msgstr "" + +msgid "" +"IPROTO protocol features with the corresponding code " +"(:ref:`box.iproto.feature `)" +msgstr "" + +msgid "**Example**" +msgstr "" + +msgid "" +"The example converts the feature names from ``box.iproto.protocol_features``" +" set into codes:" +msgstr "" + +msgid "" +"-- Features supported by the server\n" +"box.iproto.protocol_features = {\n" +" streams = true,\n" +" transactions = true,\n" +" error_extension = true,\n" +" watchers = true,\n" +" pagination = true,\n" +"}\n" +"\n" +"-- Convert the feature names into codes\n" +"features = {}\n" +"for name in pairs(box.iproto.protocol_features) do\n" +" table.insert(features, box.iproto.feature[name])\n" +"end\n" +"return features -- [0, 1, 2, 3, 4]" +msgstr "" + +msgid "Handling the unknown IPROTO request types" +msgstr "" + +msgid "" +"Every IPROTO request has a static handler. That is, before version " +":doc:`2.11.0 `, any unknown request raised an error. Since " +":doc:`2.11.0 `, a new request type is introduced -- " +":ref:`IPROTO_UNKNOWN `. This type is used to " +"override the handlers of the unknown IPROTO request types. For details, see " +":ref:`box.iproto.override() ` and " +":ref:`box_iproto_override ` functions." +msgstr "" + +msgid "API reference" +msgstr "" + +msgid "The table lists all available functions and data of the submodule:" +msgstr "" + +msgid "Name" +msgstr "" + +msgid "Use" +msgstr "" + +msgid ":doc:`./box_iproto/key`" +msgstr "" + +msgid "Request keys" +msgstr "" + +msgid ":doc:`./box_iproto/request_type`" +msgstr "" + +msgid "Request types" +msgstr "" + +msgid ":doc:`./box_iproto/flag`" +msgstr "" + +msgid "Flags from the :ref:`IPROTO_FLAGS ` key" +msgstr "" + +msgid ":doc:`./box_iproto/ballot`" +msgstr "" + +msgid "Keys from the :ref:`IPROTO_BALLOT ` requests" +msgstr "" + +msgid ":doc:`./box_iproto/metadata`" +msgstr "" + +msgid "" +"Keys nested in the :ref:`IPROTO_METADATA ` " +"key" +msgstr "" + +msgid ":doc:`./box_iproto/raft`" +msgstr "" + +msgid "Keys from the ``IPROTO_RAFT_`` requests" +msgstr "" + +msgid ":doc:`./box_iproto/protocol_version`" +msgstr "" + +msgid "The current IPROTO protocol version" +msgstr "" + +msgid ":doc:`./box_iproto/protocol_features`" +msgstr "" + +msgid "The set of supported IPROTO protocol features" +msgstr "" + +msgid ":doc:`./box_iproto/feature`" +msgstr "" + +msgid "IPROTO protocol :ref:`features `" +msgstr "" + +msgid ":doc:`./box_iproto/override`" +msgstr "" + +msgid "Set a new IPROTO request handler callback for the given request type" +msgstr "" + +msgid ":doc:`./box_iproto/send`" +msgstr "" + +msgid "Send an IPROTO packet over the session's socket" +msgstr "" diff --git a/locale/ru/LC_MESSAGES/reference/reference_lua/box_iproto/ballot.po b/locale/ru/LC_MESSAGES/reference/reference_lua/box_iproto/ballot.po new file mode 100644 index 0000000000..88ab81202d --- /dev/null +++ b/locale/ru/LC_MESSAGES/reference/reference_lua/box_iproto/ballot.po @@ -0,0 +1,23 @@ + +msgid "box.iproto.ballot_key" +msgstr "" + +msgid "" +"Contains the keys from the :ref:`IPROTO_BALLOT ` " +"requests. Learn more: :ref:`IPROTO_BALLOT keys `." +msgstr "" + +msgid "**Example**" +msgstr "" + +msgid "" +"tarantool> box.iproto.ballot_key.IS_RO_CFG\n" +"---\n" +"- 1\n" +"...\n" +"tarantool> box.iproto.ballot_key.VCLOCK\n" +"---\n" +"- 2\n" +"..." +msgstr "" diff --git a/locale/ru/LC_MESSAGES/reference/reference_lua/box_iproto/feature.po b/locale/ru/LC_MESSAGES/reference/reference_lua/box_iproto/feature.po new file mode 100644 index 0000000000..84324c7903 --- /dev/null +++ b/locale/ru/LC_MESSAGES/reference/reference_lua/box_iproto/feature.po @@ -0,0 +1,32 @@ + +msgid "box.iproto.feature" +msgstr "" + +msgid "" +"Contains the IPROTO protocol features that are supported by the server. Each" +" feature is mapped to its corresponding code. Learn more: " +":ref:`IPROTO_FEATURES `." +msgstr "" + +msgid "The features in the namespace are written" +msgstr "" + +msgid "in lowercase letters" +msgstr "" + +msgid "without the ``IPROTO_FEATURE_`` prefix" +msgstr "" + +msgid "**Example**" +msgstr "" + +msgid "" +"tarantool> box.iproto.feature.streams\n" +"---\n" +"- 0\n" +"...\n" +"tarantool> box.iproto.feature.transactions\n" +"---\n" +"- 1\n" +"..." +msgstr "" diff --git a/locale/ru/LC_MESSAGES/reference/reference_lua/box_iproto/flag.po b/locale/ru/LC_MESSAGES/reference/reference_lua/box_iproto/flag.po new file mode 100644 index 0000000000..a14921d02e --- /dev/null +++ b/locale/ru/LC_MESSAGES/reference/reference_lua/box_iproto/flag.po @@ -0,0 +1,22 @@ + +msgid "box.iproto.flag" +msgstr "" + +msgid "" +"Contains the flags from the ``IPROTO_FLAGS`` key. Learn more: " +":ref:`IPROTO_FLAGS key `." +msgstr "" + +msgid "**Example**" +msgstr "" + +msgid "" +"tarantool> box.iproto.flag.COMMIT\n" +"---\n" +"- 1\n" +"...\n" +"tarantool> box.iproto.flag.WAIT_SYNC\n" +"---\n" +"- 2\n" +"..." +msgstr "" diff --git a/locale/ru/LC_MESSAGES/reference/reference_lua/box_iproto/key.po b/locale/ru/LC_MESSAGES/reference/reference_lua/box_iproto/key.po new file mode 100644 index 0000000000..1f9a5b4002 --- /dev/null +++ b/locale/ru/LC_MESSAGES/reference/reference_lua/box_iproto/key.po @@ -0,0 +1,20 @@ + +msgid "box.iproto.key" +msgstr "" + +msgid "" +"Contains all available request keys, except :ref:`raft `, :ref:`metadata `, and " +":ref:`ballot ` keys. Learn more: :ref:`Keys" +" used in requests and responses `." +msgstr "" + +msgid "**Example**" +msgstr "" + +msgid "" +"tarantool> box.iproto.key.SYNC\n" +"---\n" +"- 1\n" +"..." +msgstr "" diff --git a/locale/ru/LC_MESSAGES/reference/reference_lua/box_iproto/metadata.po b/locale/ru/LC_MESSAGES/reference/reference_lua/box_iproto/metadata.po new file mode 100644 index 0000000000..5f4b339075 --- /dev/null +++ b/locale/ru/LC_MESSAGES/reference/reference_lua/box_iproto/metadata.po @@ -0,0 +1,22 @@ + +msgid "box.iproto.metadata_key" +msgstr "" + +msgid "" +"Contains the ``IPROTO_FIELD_*`` keys, which are nested in the " +":ref:`IPROTO_METADATA ` key." +msgstr "" + +msgid "**Example**" +msgstr "" + +msgid "" +"tarantool> box.iproto.metadata_key.NAME\n" +"---\n" +"- 0\n" +"...\n" +"tarantool> box.iproto.metadata_key.TYPE\n" +"---\n" +"- 1\n" +"..." +msgstr "" diff --git a/locale/ru/LC_MESSAGES/reference/reference_lua/box_iproto/override.po b/locale/ru/LC_MESSAGES/reference/reference_lua/box_iproto/override.po new file mode 100644 index 0000000000..5da123335a --- /dev/null +++ b/locale/ru/LC_MESSAGES/reference/reference_lua/box_iproto/override.po @@ -0,0 +1,150 @@ + +msgid "box.iproto.override()" +msgstr "" + +msgid "" +"Since version :doc:`2.11.0 `. Set a new IPROTO request " +"handler callback for the given request type." +msgstr "" + +msgid "Parameters" +msgstr "" + +msgid "" +"a request type code. Possible values: * a type code from " +":ref:`box.iproto.type ` (except " +"``box.iproto.type.UNKNOWN``) -- override the existing request type handler." +" * ``box.iproto.type.UNKNOWN`` -- override the handler of unknown request" +" types." +msgstr "" + +msgid "a request type code. Possible values:" +msgstr "" + +msgid "" +"a type code from :ref:`box.iproto.type ` " +"(except ``box.iproto.type.UNKNOWN``) -- override the existing request type " +"handler." +msgstr "" + +msgid "" +"``box.iproto.type.UNKNOWN`` -- override the handler of unknown request " +"types." +msgstr "" + +msgid "" +"IPROTO request handler. The signature of a handler function: ``function(sid," +" header, body)``, where * ``header`` (userdata): a request header encoded " +"as a :ref:`msgpack_object ` * ``body`` (userdata): " +"a request body encoded as a :ref:`msgpack_object ` " +"Returns ``true`` on success, otherwise ``false``. On ``false``, there is a " +"fallback to the default handler. Also, you can indicate an error by throwing" +" an exception. In this case, the return value is ``false``, but this does " +"not always mean a failure. To reset the request handler, set the " +"``handler`` parameter to ``nil``." +msgstr "" + +msgid "" +"IPROTO request handler. The signature of a handler function: ``function(sid," +" header, body)``, where" +msgstr "" + +msgid "" +"``header`` (userdata): a request header encoded as a :ref:`msgpack_object " +"`" +msgstr "" + +msgid "" +"``body`` (userdata): a request body encoded as a :ref:`msgpack_object " +"`" +msgstr "" + +msgid "" +"Returns ``true`` on success, otherwise ``false``. On ``false``, there is a " +"fallback to the default handler. Also, you can indicate an error by throwing" +" an exception. In this case, the return value is ``false``, but this does " +"not always mean a failure." +msgstr "" + +msgid "" +"To reset the request handler, set the ``handler`` parameter to ``nil``." +msgstr "" + +msgid "return" +msgstr "" + +msgid "none" +msgstr "" + +msgid "**Possible errors:**" +msgstr "" + +msgid "" +"If a Lua handler throws an exception, the behavior is similar to that of a " +"remote procedure call. The following errors are returned to the client over " +"IPROTO (see `src/lua/utils.h " +"`__):" +msgstr "" + +msgid "" +":errcode:`ER_PROC_LUA` -- an exception is thrown from a Lua handler, " +"diagnostic is not set." +msgstr "" + +msgid "" +"diagnostics from ``src/box/errcode.h`` -- an exception is thrown, diagnostic" +" is set." +msgstr "" + +msgid "" +"For details, see `src/box/errcode.h " +"`__." +msgstr "" + +msgid "" +"When using ``box.iproto.override()``, it is important that you follow the " +"wire protocol. That is, the server response should match the return value " +"types of the corresponding request type. Otherwise, it could lead to peer " +"breakdown or undefined behavior." +msgstr "" + +msgid "**Example:**" +msgstr "" + +msgid "" +"Define a handler function for the ``box.iproto.type.SELECT`` request type:" +msgstr "" + +msgid "" +"local function iproto_select_handler_lua(header, body)\n" +" if body.space_id == 512 then\n" +" box.iproto.send(box.session.id(),\n" +" { request_type = box.iproto.type.OK,\n" +" sync = header.SYNC,\n" +" schema_version = box.info.schema_version },\n" +" { data = { 1, 2, 3 } })\n" +" return true\n" +" end\n" +" return false\n" +"end" +msgstr "" + +msgid "Override ``box.iproto.type.SELECT`` handler:" +msgstr "" + +msgid "box.iproto.override(box.iproto.type.SELECT, iproto_select_handler_lua)" +msgstr "" + +msgid "Reset ``box.iproto.type.SELECT`` handler:" +msgstr "" + +msgid "box.iproto.override(box.iproto.type.SELECT, nil)" +msgstr "" + +msgid "Override a handler function for the unknown request type:" +msgstr "" + +msgid "" +"box.iproto.override(box.iproto.type.UNKNOWN, " +"iproto_unknown_request_handler_lua)" +msgstr "" diff --git a/locale/ru/LC_MESSAGES/reference/reference_lua/box_iproto/protocol_features.po b/locale/ru/LC_MESSAGES/reference/reference_lua/box_iproto/protocol_features.po new file mode 100644 index 0000000000..04fff0b301 --- /dev/null +++ b/locale/ru/LC_MESSAGES/reference/reference_lua/box_iproto/protocol_features.po @@ -0,0 +1,25 @@ + +msgid "box.iproto.protocol_features" +msgstr "" + +msgid "" +"The set of IPROTO protocol features supported by the server. Learn more: " +":ref:`net.box features `, `src/box/iproto_features.h " +"`__," +" and `iproto_features_resolve() " +"`__." +msgstr "" + +msgid "**Example**" +msgstr "" + +msgid "" +"tarantool> box.iproto.protocol_features\n" +"---\n" +"- transactions: true\n" +" watchers: true\n" +" error_extension: true\n" +" streams: true\n" +" pagination: true\n" +"..." +msgstr "" diff --git a/locale/ru/LC_MESSAGES/reference/reference_lua/box_iproto/protocol_version.po b/locale/ru/LC_MESSAGES/reference/reference_lua/box_iproto/protocol_version.po new file mode 100644 index 0000000000..382edeee5f --- /dev/null +++ b/locale/ru/LC_MESSAGES/reference/reference_lua/box_iproto/protocol_version.po @@ -0,0 +1,18 @@ + +msgid "box.iproto.protocol_version" +msgstr "" + +msgid "" +"The current IPROTO protocol version of the server. Learn more: " +":ref:`IPROTO_ID `." +msgstr "" + +msgid "**Example**" +msgstr "" + +msgid "" +"tarantool> box.iproto.protocol_version\n" +"---\n" +"- 4\n" +"..." +msgstr "" diff --git a/locale/ru/LC_MESSAGES/reference/reference_lua/box_iproto/raft.po b/locale/ru/LC_MESSAGES/reference/reference_lua/box_iproto/raft.po new file mode 100644 index 0000000000..fbe3242593 --- /dev/null +++ b/locale/ru/LC_MESSAGES/reference/reference_lua/box_iproto/raft.po @@ -0,0 +1,23 @@ + +msgid "box.iproto.raft" +msgstr "" + +msgid "" +"Contains the keys from the ``IPROTO_RAFT_*`` requests. Learn more: " +":ref:`Synchronous replication keys `." +msgstr "" + +msgid "**Example**" +msgstr "" + +msgid "" +"tarantool> box.iproto.raft_key.TERM\n" +"---\n" +"- 0\n" +"...\n" +"tarantool> box.iproto.raft_key.VOTE\n" +"---\n" +"- 1\n" +"..." +msgstr "" diff --git a/locale/ru/LC_MESSAGES/reference/reference_lua/box_iproto/request_type.po b/locale/ru/LC_MESSAGES/reference/reference_lua/box_iproto/request_type.po new file mode 100644 index 0000000000..a1bf04d63d --- /dev/null +++ b/locale/ru/LC_MESSAGES/reference/reference_lua/box_iproto/request_type.po @@ -0,0 +1,22 @@ + +msgid "box.iproto.type" +msgstr "" + +msgid "" +"Contains all available request types. Learn more about the requests: " +":ref:`Client-server requests and responses `." +msgstr "" + +msgid "**Example**" +msgstr "" + +msgid "" +"tarantool> box.iproto.type.UNKNOWN\n" +"---\n" +"- -1\n" +"...\n" +"tarantool> box.iproto.type.CHUNK\n" +"---\n" +"- 128\n" +"..." +msgstr "" diff --git a/locale/ru/LC_MESSAGES/reference/reference_lua/box_iproto/send.po b/locale/ru/LC_MESSAGES/reference/reference_lua/box_iproto/send.po new file mode 100644 index 0000000000..5e8610989a --- /dev/null +++ b/locale/ru/LC_MESSAGES/reference/reference_lua/box_iproto/send.po @@ -0,0 +1,106 @@ + +msgid "box.iproto.send()" +msgstr "" + +msgid "" +"Since version :doc:`2.11.0 `. Send an :ref:`IPROTO " +"` packet over the session's socket with the given " +"MsgPack header and body. The header and body contain exported IPROTO " +"constants from the :ref:`box.iproto() ` submodule. Possible " +"IPROTO constant formats:" +msgstr "" + +msgid "" +"a lowercase constant without the ``IPROTO_`` prefix (``schema_version``, " +"``request_type``)" +msgstr "" + +msgid "" +"a constant from the corresponding :ref:`box.iproto ` " +"subnamespace (``box.iproto.SCHEMA_VERSION``, ``box.iproto.REQUEST_TYPE``)" +msgstr "" + +msgid "" +"The function works for binary sessions only. For details, see " +":ref:`box.session.type() `." +msgstr "" + +msgid "Parameters" +msgstr "" + +msgid "" +"the IPROTO session identifier (see :ref:`box.session.id() `)" +msgstr "" + +msgid "a request header encoded as MsgPack" +msgstr "" + +msgid "a request body encoded as MsgPack" +msgstr "" + +msgid "return" +msgstr "" + +msgid "0 on success, otherwise an error is raised" +msgstr "" + +msgid "rtype" +msgstr "" + +msgid "number" +msgstr "" + +msgid "**Possible errors:**" +msgstr "" + +msgid ":errcode:`ER_SESSION_CLOSED` -- the session is closed." +msgstr "" + +msgid ":errcode:`ER_NO_SUCH_SESSION` -- the session does not exist." +msgstr "" + +msgid ":errcode:`ER_MEMORY_ISSUE` -- out-of-memory limit has been reached." +msgstr "" + +msgid ":errcode:`ER_WRONG_SESSION_TYPE` -- the session type is not binary." +msgstr "" + +msgid "" +"For details, see `src/box/errcode.h " +"`__." +msgstr "" + +msgid "**Examples:**" +msgstr "" + +msgid "Send a packet using Lua tables and string IPROTO constants as keys:" +msgstr "" + +msgid "" +"box.iproto.send(box.session.id(),\n" +" { request_type = box.iproto.type.OK,\n" +" sync = 10,\n" +" schema_version = box.info.schema_version },\n" +" { data = 1 })" +msgstr "" + +msgid "Send a packet using Lua tables and numeric IPROTO constants:" +msgstr "" + +msgid "" +"box.iproto.send(box.session.id(),\n" +" { [box.iproto.key.REQUEST_TYPE] = box.iproto.type.OK,\n" +" [box.iproto.key.SYNC] = 10,\n" +" [box.iproto.key.SCHEMA_VERSION] = box.info.schema_version },\n" +" { [box.iproto.key.DATA] = 1 })" +msgstr "" + +msgid "Send a packet that contains only the header:" +msgstr "" + +msgid "" +"box.iproto.send(box.session.id(),\n" +" { request_type = box.iproto.type.OK,\n" +" sync = 10,\n" +" schema_version = box.info.schema_version })" +msgstr "" diff --git a/locale/ru/LC_MESSAGES/reference/reference_lua/box_null.po b/locale/ru/LC_MESSAGES/reference/reference_lua/box_null.po index ec3d7625e7..035745379f 100644 --- a/locale/ru/LC_MESSAGES/reference/reference_lua/box_null.po +++ b/locale/ru/LC_MESSAGES/reference/reference_lua/box_null.po @@ -5,14 +5,15 @@ msgstr "Константа box.NULL" msgid "" "There are some major problems with using Lua **nil** values in tables. For " "example: you can't correctly assess the length of a table that is not a " -"sequence. (Learn more about data types in `Lua `__ " -"and `LuaJIT `__.)" +"sequence. (Learn more about data types in `Lua " +"`__ and `LuaJIT " +"`__.)" msgstr "" "Имеется целый ряд серьезных проблем при использовании значения **nil** из " "Lua в таблицах. Например: вы не можете корректно оценить длину таблицы, не " "являющейся последовательностью. (Узнайте больше о типах данных в `Lua " -"`__ " -"и `LuaJIT `__.)" +"`__ и `LuaJIT " +"`__.)" msgid "**Example:**" msgstr "**Пример:**" @@ -66,9 +67,10 @@ msgid "Using box.NULL" msgstr "Использование box.NULL" msgid "" -"``box.NULL`` is a value of the `cdata `__ type representing a NULL pointer. It is" -" similar to ``msgpack.NULL``, ``json.NULL`` and ``yaml.NULL``. So it is some" -" not **nil** value, even if it is a pointer to NULL." +"``box.NULL`` is a value of the `cdata " +"`__ type representing a NULL " +"pointer. It is similar to ``msgpack.NULL``, ``json.NULL`` and ``yaml.NULL``." +" So it is some not **nil** value, even if it is a pointer to NULL." msgstr "" "``box.NULL`` является значением типа cdata, представляющим нулевой указатель" " (NULL pointer). Оно подобно ``msgpack.NULL``, ``json.NULL`` и " @@ -147,7 +149,8 @@ msgstr "" "всегда будет выполнять функцию ``func()`` (потому, что условие ``box.NULL`` " "всегда будет не **false** (ложь) и не **nil** (ничто))." -msgid "Distinction of nil and `box.NULL`" +#, fuzzy +msgid "Distinction of nil and box.NULL" msgstr "Различение nil и `box.NULL`" msgid "" diff --git a/locale/ru/LC_MESSAGES/reference/reference_lua/box_read_view.po b/locale/ru/LC_MESSAGES/reference/reference_lua/box_read_view.po new file mode 100644 index 0000000000..bb96ec81bd --- /dev/null +++ b/locale/ru/LC_MESSAGES/reference/reference_lua/box_read_view.po @@ -0,0 +1,18 @@ + +msgid "Submodule box.read_view" +msgstr "" + +msgid "The box.read_view submodule contains functions related to read views." +msgstr "" + +msgid "Name" +msgstr "" + +msgid "Use" +msgstr "" + +msgid ":doc:`./box_read_view/list`" +msgstr "" + +msgid "Return an array of all active database read views." +msgstr "" diff --git a/locale/ru/LC_MESSAGES/reference/reference_lua/box_read_view/list.po b/locale/ru/LC_MESSAGES/reference/reference_lua/box_read_view/list.po new file mode 100644 index 0000000000..6b8c8f4361 --- /dev/null +++ b/locale/ru/LC_MESSAGES/reference/reference_lua/box_read_view/list.po @@ -0,0 +1,55 @@ + +msgid "box.read_view.list()" +msgstr "" + +msgid "" +"Return an array of all active database read views. This array might include " +"the following read view types:" +msgstr "" + +msgid "" +":ref:`read views ` created by application code (Enterprise " +"Edition only)" +msgstr "" + +msgid "" +"system read views (used, for example, to make a :ref:`checkpoint " +"` or join a new :ref:`replica `)" +msgstr "" + +msgid "" +"Read views created by application code also have the ``space`` field. The " +"field lists all spaces available in a read view, and may be used like a read" +" view object returned by ``box.read_view.open()``." +msgstr "" + +msgid "" +"``read_view.list()`` also contains read views created using the :ref:`C API " +"` (:ref:`box_raw_read_view_new() " +"`). Note that you cannot access database spaces " +"included in such views from Lua." +msgstr "" + +msgid "**Example:**" +msgstr "" + +msgid "" +"tarantool> box.read_view.list()\n" +"---\n" +"- - timestamp: 1138.98706933\n" +" signature: 47\n" +" is_system: false\n" +" status: open\n" +" vclock: &0 {1: 47}\n" +" name: read_view1\n" +" id: 1\n" +" - timestamp: 1172.202995842\n" +" signature: 49\n" +" is_system: false\n" +" status: open\n" +" vclock: &1 {1: 49}\n" +" name: read_view2\n" +" id: 2\n" +"..." +msgstr "" diff --git a/locale/ru/LC_MESSAGES/reference/reference_lua/box_schema.po b/locale/ru/LC_MESSAGES/reference/reference_lua/box_schema.po index b474c5d8b9..169be3fbee 100644 --- a/locale/ru/LC_MESSAGES/reference/reference_lua/box_schema.po +++ b/locale/ru/LC_MESSAGES/reference/reference_lua/box_schema.po @@ -30,6 +30,28 @@ msgstr "" msgid "Upgrade a database" msgstr "Обновить базу данных" +#, fuzzy +msgid ":doc:`./box_schema/downgrade`" +msgstr ":doc:`./box_schema/space_create`" + +#, fuzzy +msgid "Downgrade a database" +msgstr "Обновить базу данных" + +#, fuzzy +msgid ":doc:`./box_schema/downgrade_issues`" +msgstr ":doc:`./box_schema/space_create`" + +msgid "List downgrade issues for the specified Tarantool version" +msgstr "" + +#, fuzzy +msgid ":doc:`./box_schema/downgrade_versions`" +msgstr ":doc:`./box_schema/space_create`" + +msgid "List Tarantool versions available for downgrade" +msgstr "" + msgid ":doc:`./box_schema/user_create`" msgstr "" diff --git a/locale/ru/LC_MESSAGES/reference/reference_lua/box_schema/downgrade.po b/locale/ru/LC_MESSAGES/reference/reference_lua/box_schema/downgrade.po new file mode 100644 index 0000000000..51538e2c1a --- /dev/null +++ b/locale/ru/LC_MESSAGES/reference/reference_lua/box_schema/downgrade.po @@ -0,0 +1,52 @@ + +msgid "box.schema.downgrade()" +msgstr "" + +msgid "" +"Allows you to downgrade a database to the specified Tarantool version. This " +"might be useful if you need to run a database on older Tarantool versions." +msgstr "" + +msgid "" +"To prepare a database for using it on an older Tarantool instance, call " +"``box.schema.downgrade`` and pass the desired Tarantool version:" +msgstr "" + +msgid "tarantool> box.schema.downgrade('2.8.4')" +msgstr "" + +msgid "" +"The Tarantool's downgrade procedure is similar to the upgrade process that " +"is described in the :ref:`Upgrades ` topic. You need to run " +"``box.schema.downgrade()`` only on master and execute `box.shapshot()` on " +"every instance in a replica set before restart to an older version." +msgstr "" + +msgid "" +"To see Tarantool versions available for downgrade, call " +":ref:`box.schema.downgrade_versions() `. The " +"oldest release available for downgrade is ``2.8.2``." +msgstr "" + +msgid "" +"Note that the downgrade process might fail if the database enables specific " +"features not supported in the target Tarantool version. You can see all such" +" issues using the :ref:`box.schema.downgrade_issues() ` method, which accepts the target version. For example, " +"``downgrade`` to the ``2.8.4`` version fails if you use :ref:`tuple " +"compression ` or field :ref:`constraints ` in your database:" +msgstr "" + +msgid "" +"tarantool> box.schema.downgrade_issues('2.8.4')\n" +"---\n" +"- - Tuple compression is found in space 'bands', field 'band_name'. It is supported\n" +" starting from version 2.10.0.\n" +" - Field constraint is found in space 'bands', field 'year'. It is supported starting\n" +" from version 2.10.0.\n" +"..." +msgstr "" + +msgid "See also: :ref:`box.schema.upgrade() `" +msgstr "" diff --git a/locale/ru/LC_MESSAGES/reference/reference_lua/box_schema/downgrade_issues.po b/locale/ru/LC_MESSAGES/reference/reference_lua/box_schema/downgrade_issues.po new file mode 100644 index 0000000000..c5f92deb1f --- /dev/null +++ b/locale/ru/LC_MESSAGES/reference/reference_lua/box_schema/downgrade_issues.po @@ -0,0 +1,21 @@ + +msgid "box.schema.downgrade_issues()" +msgstr "" + +msgid "" +"Return a list of downgrade issues for the specified Tarantool version. To " +"learn how to downgrade a database to the specified Tarantool version, see " +":ref:`box.schema.downgrade() `." +msgstr "" + +msgid "return" +msgstr "" + +msgid "a list of downgrade issues" +msgstr "" + +msgid "rtype" +msgstr "" + +msgid "table" +msgstr "" diff --git a/locale/ru/LC_MESSAGES/reference/reference_lua/box_schema/downgrade_versions.po b/locale/ru/LC_MESSAGES/reference/reference_lua/box_schema/downgrade_versions.po new file mode 100644 index 0000000000..f5c149e321 --- /dev/null +++ b/locale/ru/LC_MESSAGES/reference/reference_lua/box_schema/downgrade_versions.po @@ -0,0 +1,21 @@ + +msgid "box.schema.downgrade_versions()" +msgstr "" + +msgid "" +"Return a list of Tarantool versions available for downgrade. To learn how to" +" downgrade a database to the specified Tarantool version, see " +":ref:`box.schema.downgrade() `." +msgstr "" + +msgid "return" +msgstr "" + +msgid "a list of Tarantool versions" +msgstr "" + +msgid "rtype" +msgstr "" + +msgid "table" +msgstr "" diff --git a/locale/ru/LC_MESSAGES/reference/reference_lua/box_schema/func_create.po b/locale/ru/LC_MESSAGES/reference/reference_lua/box_schema/func_create.po index e16d45e999..b34d57f47b 100644 --- a/locale/ru/LC_MESSAGES/reference/reference_lua/box_schema/func_create.po +++ b/locale/ru/LC_MESSAGES/reference/reference_lua/box_schema/func_create.po @@ -3,62 +3,31 @@ msgid "box.schema.func.create()" msgstr "" msgid "" -"Create a function :ref:`tuple `. without including the " -"``body`` option. (For functions created with the ``body`` option, see " -":ref:`box.schema.func.create(func-name [, {options-with-body}]) `." +"Create a function. The created function can be used in different usage " +"scenarios, for example, in :ref:`field or tuple constraints ` or :ref:`functional indexes `." msgstr "" msgid "" -"This is called a \"not persistent\" function because functions without " -"bodies are not persistent. This does not create the function itself -- that " -"is done with Lua -- but if it is necessary to grant privileges for a " -"function, box.schema.func.create must be done first. For explanation of how " -"Tarantool maintains function data, see the reference for the " -":ref:`box.space._func ` space." +"Using the :ref:`body ` option, you can make a " +"function *persistent*. In this case, the function is \"persistent\" because " +"its definition is stored in a snapshot (the :ref:`box.space._func " +"` system space) and can be recovered if the server restarts." msgstr "" -msgid "The possible options are:" -msgstr "Возможны следующие опции:" - -msgid "" -"``if_not_exists`` = ``true|false`` (default = ``false``) - boolean; ``true``" -" means there should be no error if the ``_func`` tuple already exists." -msgstr "" -"``if_not_exists`` (если отсутствует) = ``true|false`` (правда/ложь, по " -"умолчанию ложь) - логическое значение boolean; ``true`` (правда) означает, " -"что ошибка не выпадет, если кортеж в ``_func`` уже существует." - -msgid "" -"``setuid`` = ``true|false`` (default = false) - with ``true`` to make " -"Tarantool treat the function’s caller as the function’s creator, with full " -"privileges. Remember that SETUID works only over :ref:`binary ports `. SETUID doesn't work if you invoke a function via an :ref:`admin " -"console ` or inside a Lua script." -msgstr "" -"``setuid`` = ``true|false`` (по умолчанию, false) -- значение ``true`` " -"(правда) заставит Tarantool рассматривать пользователя, вызвавшего функцию, " -"в качестве владельца функции с полными правами. Следует помнить, что SETUID " -"работает только по :ref:`бинарным портам `. SETUID не " -"сработает, если вызвать функцию через :ref:`административную консоль ` или в Lua-скрипте." - -msgid "``language`` = 'LUA'|'C' (default = ‘LUA’)." -msgstr "" -"``language`` = 'LUA'|'C' (выбор языка из Lua и C; по умолчанию, ‘LUA’)." - msgid "Parameters" msgstr "Параметры" +#, fuzzy msgid "" -"name of function, which should conform to the :ref:`rules for object names " -"`" +"a name of the function, which should conform to the :ref:`rules for object " +"names `" msgstr "" "имя функции, которое должно соответствовать :ref:`правилам именования " "объектов `" -msgid "``if_not_exists``, ``setuid``, ``language``." -msgstr "``if_not_exists``, ``setuid``, ``language``." +msgid "see :ref:`function_options `" +msgstr "" msgid "return" msgstr "возвращает" @@ -67,14 +36,15 @@ msgid "nil" msgstr "nil" msgid "" -"These functions can be called with :samp:`{function-" -"object}:call({arguments})`; however, unlike the case with ordinary " -"functions, array arguments will not be correctly recognized unless they are " -"enclosed in braces." +":ref:`box.schema.user.grant() ` can be used to allow " +"the specified user or role to execute the created function." +msgstr "" + +msgid "**Example 1: a non-persistent Lua function**" msgstr "" -msgid "**Example:**" -msgstr "**Пример:**" +msgid "The example below shows how to create a non-persistent Lua function:" +msgstr "" msgid "" "box.schema.func.create('calculate')\n" @@ -83,82 +53,155 @@ msgid "" "box.schema.func.create('calculate', {language = 'LUA'})" msgstr "" +msgid "**Example 2: a persistent Lua function**" +msgstr "" + +msgid "" +"The example below shows how to create a persistent Lua function, show its " +"definition using ``box.func.{func-name}``, and call this function using " +"``box.func.{func-name}:call([parameters])``:" +msgstr "" + +msgid "" +"tarantool> lua_code = [[function(a, b) return a + b end]]\n" +"tarantool> box.schema.func.create('sum', {body = lua_code})\n" +"\n" +"tarantool> box.func.sum\n" +"---\n" +"- is_sandboxed: false\n" +" is_deterministic: false\n" +" id: 2\n" +" setuid: false\n" +" body: function(a, b) return a + b end\n" +" name: sum\n" +" language: LUA\n" +"...\n" +"\n" +"tarantool> box.func.sum:call({1, 2})\n" +"---\n" +"- 3\n" +"..." +msgstr "" + +msgid "" +"To call functions using ``net.box``, use :ref:`net_box:call() `." +msgstr "" + +msgid "**Example 3: a persistent SQL expression used in a tuple constraint**" +msgstr "" + +msgid "" +"The code snippet below defines a function that checks a tuple's data using " +"the SQL expression:" +msgstr "" + msgid "" -"Create a function :ref:`tuple `. including the ``body`` " -"option. (For functions created without the ``body`` option, see " -":ref:`box.schema.func.create(func-name [, {options-without-body}]) " -"`." +"box.schema.func.create('check_person', {\n" +" language = 'SQL_EXPR',\n" +" is_deterministic = true,\n" +" body = [[\"age\" > 21 AND \"name\" != 'Admin']]\n" +"})\n" msgstr "" msgid "" -"This is called a \"persistent\" function because only functions with bodies " -"are persistent. This does create the function itself, the body is a function" -" definition. For explanation of how Tarantool maintains function data, see " -"the reference for the :ref:`box.space._func ` space." +"Then, this function is used to create a tuple :ref:`constraint `:" msgstr "" msgid "" -"``if_not_exists`` = ``true|false`` (default = ``false``) - boolean; same as " -"for :ref:`box.schema.func.create(func-name [, {options-without-body}]) " -"`." +"local customers = box.schema.space.create('customers', { constraint = 'check_person' })\n" +"customers:format({\n" +" { name = 'id', type = 'number' },\n" +" { name = 'name', type = 'string' },\n" +" { name = 'age', type = 'number' },\n" +"})\n" +"customers:create_index('primary', { parts = { 1 } })\n" msgstr "" msgid "" -"``setuid`` = ``true|false`` (default = ``false``) - boolean; same as for " -":ref:`box.schema.func.create(func-name [, {options-without-body}]) " -"`." +"On an attempt to insert a tuple that doesn't meet the required criteria, an " +"error is raised:" msgstr "" msgid "" -"``language`` = 'LUA'|'C' (default = ‘LUA’) - string. same as for " -":ref:`box.schema.func.create(func-name [, {options-without-body}]) " -"`." +"customers:insert { 2, \"Bob\", 18 }\n" +"-- error: Check constraint 'check_person' failed for tuple\n" +msgstr "" + +msgid "function_options" msgstr "" msgid "" -"``is_sandboxed`` = ``true|false`` (default = ``false``) - boolean; whether " -"the function should be executed in a sandbox." +"A table containing options passed to the :ref:`box.schema.func.create(func-" +"name [, function_options]) ` function." msgstr "" msgid "" -"``is_deterministic`` = ``true|false`` (default = ``false``) - boolean; " -"``true`` means that the function should be deterministic, ``false`` means " -"that the function may or may not be deterministic." +"Specify whether there should be no error if the function already exists." +msgstr "" + +msgid "Type: boolean" +msgstr "" + +msgid "Default: ``false``" +msgstr "" + +#, fuzzy +msgid "" +"Make Tarantool treat the function's caller as the function's creator, with " +"full privileges. Note that ``setuid`` works only over :ref:`binary ports " +"`. ``setuid`` doesn't work if you invoke a function using " +"the :ref:`admin console ` or inside a Lua script." +msgstr "" +"``setuid`` = ``true|false`` (по умолчанию, false) -- значение ``true`` " +"(правда) заставит Tarantool рассматривать пользователя, вызвавшего функцию, " +"в качестве владельца функции с полными правами. Следует помнить, что SETUID " +"работает только по :ref:`бинарным портам `. SETUID не " +"сработает, если вызвать функцию через :ref:`административную консоль ` или в Lua-скрипте." + +msgid "Specify the function language. The possible values are:" msgstr "" msgid "" -"``body`` = function definition (default = nil) - string; the function " -"definition." +"``LUA``: define a Lua function in the :ref:`body ` " +"attribute." msgstr "" msgid "" -"Additional options for SQL = See :ref:`Calling Lua routines from SQL " -"`." +"``SQL_EXPR``: define an :ref:`SQL expression ` in the " +":ref:`body ` attribute. An SQL expression can only be" +" used as a field or tuple :ref:`constraint `." msgstr "" msgid "" -"``if_not_exists``, ``setuid``, ``language``, ``is_sandboxed``, " -"``is_deterministic``, ``body``." +"``C``: import a C function using its name from a ``.so`` file. Learn how to " +"call C code from Lua in the :ref:`C tutorial `." msgstr "" msgid "" -"C functions are imported from .so files, Lua functions can be defined within" -" ``body``. We will only describe Lua functions in this section." +"To reload a C module with all its functions without restarting the server, " +"call :ref:`box.schema.func.reload() `." +msgstr "" + +msgid "Type: string" +msgstr "" + +msgid "Default: ``LUA``" msgstr "" msgid "" -"A function tuple with a body is \"persistent\" because the tuple is stored " -"in a snapshot and is recoverable if the server restarts. All of the option " -"values described in this section are visible in the :ref:`box.space._func " -"` system space." +"Whether the function should be executed in an isolated environment. This " +"means that any operation that accesses the world outside the sandbox is " +"forbidden or has no effect. Therefore, a sandboxed function can only use " +"modules and functions that cannot affect isolation:" msgstr "" msgid "" -"If ``is_sandboxed`` is true, then the function will be executed in an " -"isolated environment: any operation that accesses the world outside the " -"sandbox will be forbidden or will have no effect. Therefore, a sandboxed " -"function can only use modules and functions which cannot affect isolation: " -"`assert `_, `error " +"`assert `_, `assert " +"`_, `error " "`_, `ipairs " "`_, `math.* " "`_, `next " @@ -172,52 +215,267 @@ msgid "" "`_, `tostring " "`_, `type " "`_, `unpack " -"`_, :ref:`utf8.* " -"`, `xpcall `_. Also a sandboxed function cannot refer to global variables -- " -"they will be treated as local variables because the sandbox is established " -"with `setfenv `_. So" -" a sandboxed function will happen to be stateless and deterministic." +"`_, `xpcall " +"`_, :ref:`utf8.* " +"`." msgstr "" msgid "" -"If ``is_deterministic`` is true, there is no immediate effect. Tarantool " -"plans to use the is_deterministic value in a future version. A function is " -"deterministic if it always returns the same outputs given the same inputs. " -"It is the function creator's responsibility to ensure that a function is " -"truly deterministic." +"Also, a sandboxed function cannot refer to global variables -- they are " +"treated as local variables because the sandbox is established with `setfenv " +"`_. So, a sandboxed " +"function is stateless and deterministic." msgstr "" -msgid "**Using a persistent Lua function**" +msgid "Specify whether a function should be deterministic." msgstr "" msgid "" -"After a persistent Lua function is created, it can be found in the " -":ref:`box.space._func ` system space, and it can be shown " -"with |br| :samp:`box.func.{func-name}` |br| and it can be invoked by any " -"user with :ref:`authorization ` to " -"'execute' it. The syntax for invoking is: |br| :samp:`box.func.{func-" -"name}:call([parameters])` |br| or, if the connection is remote, the syntax " -"is as in :ref:`net_box:call() `." +"If ``true`` is set in the function definition for a functional index, the " +"function returns multiple keys. For details, see the :ref:`example " +"`." msgstr "" msgid "" -"tarantool> lua_code = [[function(a, b) return a + b end]]\n" -"tarantool> box.schema.func.create('sum', {body = lua_code})\n" -"\n" -"tarantool> box.func.sum\n" -"---\n" -"- is_sandboxed: false\n" -" is_deterministic: false\n" -" id: 2\n" -" setuid: false\n" -" body: function(a, b) return a + b end\n" -" name: sum\n" -" language: LUA\n" -"...\n" -"\n" -"tarantool> box.func.sum:call({1, 2})\n" -"---\n" -"- 3\n" -"..." +"Specify a function body. You can set a function's language using the " +":ref:`language ` attribute." +msgstr "" + +msgid "" +"The code snippet below defines a :ref:`constraint ` " +"function that checks a tuple's data using a Lua function:" +msgstr "" + +msgid "" +"box.schema.func.create('check_person', {\n" +" language = 'LUA',\n" +" is_deterministic = true,\n" +" body = 'function(t, c) return (t.age >= 0 and #(t.name) > 3) end'\n" +"})\n" +msgstr "" + +msgid "" +"In the following example, an SQL expression is used to check a tuple's data:" +msgstr "" + +msgid "" +"Example: :ref:`A persistent SQL expression used in a tuple constraint " +"`" +msgstr "" + +msgid "Default: ``nil``" +msgstr "" + +msgid "**Since:** :doc:`2.10.0 `" +msgstr "" + +msgid "" +"If set to ``true`` for a Lua function and the function is called via " +"``net.box`` (:ref:`conn:call() `) or by ``box.func.:call()``, the function arguments are passed being wrapped in a " +":ref:`MsgPack object `:" +msgstr "" + +msgid "" +"local msgpack = require('msgpack')\n" +"box.schema.func.create('my_func', {takes_raw_args = true})\n" +"local my_func = function(mp)\n" +" assert(msgpack.is_object(mp))\n" +" local args = mp:decode() -- array of arguments\n" +"end" +msgstr "" + +msgid "" +"If a function forwards most of its arguments to another Tarantool instance " +"or writes them to a database, the usage of this option can improve " +"performance because it skips the MsgPack data decoding in Lua." +msgstr "" + +msgid "Specify the languages that can call the function." msgstr "" + +msgid "Example: ``exports = {'LUA', 'SQL'}``" +msgstr "" + +msgid "See also: :ref:`Calling Lua routines from SQL `" +msgstr "" + +msgid "Type: table" +msgstr "" + +msgid "Default: ``{'LUA'}``" +msgstr "" + +msgid "Specify the Lua type names for each parameter of the function." +msgstr "" + +msgid "Example: ``param_list = {'number', 'number'}``" +msgstr "" + +msgid "Specify the Lua type name for a function's return value." +msgstr "" + +msgid "Example: ``returns = 'number'``" +msgstr "" + +#~ msgid "" +#~ "Create a function :ref:`tuple `. without including the " +#~ "``body`` option. (For functions created with the ``body`` option, see " +#~ ":ref:`box.schema.func.create(func-name [, {options-with-body}]) `." +#~ msgstr "" + +#~ msgid "" +#~ "This is called a \"not persistent\" function because functions without " +#~ "bodies are not persistent. This does not create the function itself -- that " +#~ "is done with Lua -- but if it is necessary to grant privileges for a " +#~ "function, box.schema.func.create must be done first. For explanation of how " +#~ "Tarantool maintains function data, see the reference for the " +#~ ":ref:`box.space._func ` space." +#~ msgstr "" + +#~ msgid "The possible options are:" +#~ msgstr "Возможны следующие опции:" + +#~ msgid "" +#~ "``if_not_exists`` = ``true|false`` (default = ``false``) - boolean; ``true``" +#~ " means there should be no error if the ``_func`` tuple already exists." +#~ msgstr "" +#~ "``if_not_exists`` (если отсутствует) = ``true|false`` (правда/ложь, по " +#~ "умолчанию ложь) - логическое значение boolean; ``true`` (правда) означает, " +#~ "что ошибка не выпадет, если кортеж в ``_func`` уже существует." + +#~ msgid "``language`` = 'LUA'|'C' (default = ‘LUA’)." +#~ msgstr "" +#~ "``language`` = 'LUA'|'C' (выбор языка из Lua и C; по умолчанию, ‘LUA’)." + +#~ msgid "``if_not_exists``, ``setuid``, ``language``." +#~ msgstr "``if_not_exists``, ``setuid``, ``language``." + +#~ msgid "" +#~ "These functions can be called with :samp:`{function-" +#~ "object}:call({arguments})`; however, unlike the case with ordinary " +#~ "functions, array arguments will not be correctly recognized unless they are " +#~ "enclosed in braces." +#~ msgstr "" + +#~ msgid "**Example:**" +#~ msgstr "**Пример:**" + +#~ msgid "" +#~ "Create a function :ref:`tuple `. including the ``body`` " +#~ "option. (For functions created without the ``body`` option, see " +#~ ":ref:`box.schema.func.create(func-name [, {options-without-body}]) " +#~ "`." +#~ msgstr "" + +#~ msgid "" +#~ "This is called a \"persistent\" function because only functions with bodies " +#~ "are persistent. This does create the function itself, the body is a function" +#~ " definition. For explanation of how Tarantool maintains function data, see " +#~ "the reference for the :ref:`box.space._func ` space." +#~ msgstr "" + +#~ msgid "" +#~ "``if_not_exists`` = ``true|false`` (default = ``false``) - boolean; same as " +#~ "for :ref:`box.schema.func.create(func-name [, {options-without-body}]) " +#~ "`." +#~ msgstr "" + +#~ msgid "" +#~ "``setuid`` = ``true|false`` (default = ``false``) - boolean; same as for " +#~ ":ref:`box.schema.func.create(func-name [, {options-without-body}]) " +#~ "`." +#~ msgstr "" + +#~ msgid "" +#~ "``language`` = 'LUA'|'C' (default = ‘LUA’) - string. same as for " +#~ ":ref:`box.schema.func.create(func-name [, {options-without-body}]) " +#~ "`." +#~ msgstr "" + +#~ msgid "" +#~ "``is_sandboxed`` = ``true|false`` (default = ``false``) - boolean; whether " +#~ "the function should be executed in a sandbox." +#~ msgstr "" + +#~ msgid "" +#~ "``is_deterministic`` = ``true|false`` (default = ``false``) - boolean; " +#~ "``true`` means that the function should be deterministic, ``false`` means " +#~ "that the function may or may not be deterministic." +#~ msgstr "" + +#~ msgid "" +#~ "``body`` = function definition (default = nil) - string; the function " +#~ "definition." +#~ msgstr "" + +#~ msgid "" +#~ "Additional options for SQL = See :ref:`Calling Lua routines from SQL " +#~ "`." +#~ msgstr "" + +#~ msgid "" +#~ "``if_not_exists``, ``setuid``, ``language``, ``is_sandboxed``, " +#~ "``is_deterministic``, ``body``." +#~ msgstr "" + +#~ msgid "" +#~ "C functions are imported from .so files, Lua functions can be defined within" +#~ " ``body``. We will only describe Lua functions in this section." +#~ msgstr "" + +#~ msgid "" +#~ "A function tuple with a body is \"persistent\" because the tuple is stored " +#~ "in a snapshot and is recoverable if the server restarts. All of the option " +#~ "values described in this section are visible in the :ref:`box.space._func " +#~ "` system space." +#~ msgstr "" + +#~ msgid "" +#~ "If ``is_sandboxed`` is true, then the function will be executed in an " +#~ "isolated environment: any operation that accesses the world outside the " +#~ "sandbox will be forbidden or will have no effect. Therefore, a sandboxed " +#~ "function can only use modules and functions which cannot affect isolation: " +#~ "`assert `_, `error " +#~ "`_, `ipairs " +#~ "`_, `math.* " +#~ "`_, `next " +#~ "`_, `pairs " +#~ "`_, `pcall " +#~ "`_, `print " +#~ "`_, `select " +#~ "`_, `string.* " +#~ "`_, `table.* " +#~ "`_, `tonumber " +#~ "`_, `tostring " +#~ "`_, `type " +#~ "`_, `unpack " +#~ "`_, :ref:`utf8.* " +#~ "`, `xpcall `_. Also a sandboxed function cannot refer to global variables -- " +#~ "they will be treated as local variables because the sandbox is established " +#~ "with `setfenv `_. So" +#~ " a sandboxed function will happen to be stateless and deterministic." +#~ msgstr "" + +#~ msgid "" +#~ "If ``is_deterministic`` is true, there is no immediate effect. Tarantool " +#~ "plans to use the is_deterministic value in a future version. A function is " +#~ "deterministic if it always returns the same outputs given the same inputs. " +#~ "It is the function creator's responsibility to ensure that a function is " +#~ "truly deterministic." +#~ msgstr "" + +#~ msgid "**Using a persistent Lua function**" +#~ msgstr "" + +#~ msgid "" +#~ "After a persistent Lua function is created, it can be found in the " +#~ ":ref:`box.space._func ` system space, and it can be shown " +#~ "with |br| :samp:`box.func.{func-name}` |br| and it can be invoked by any " +#~ "user with :ref:`authorization ` to " +#~ "'execute' it. The syntax for invoking is: |br| :samp:`box.func.{func-" +#~ "name}:call([parameters])` |br| or, if the connection is remote, the syntax " +#~ "is as in :ref:`net_box:call() `." +#~ msgstr "" diff --git a/locale/ru/LC_MESSAGES/reference/reference_lua/box_schema/role_create.po b/locale/ru/LC_MESSAGES/reference/reference_lua/box_schema/role_create.po index c01fc414ea..dc4ac56ed9 100644 --- a/locale/ru/LC_MESSAGES/reference/reference_lua/box_schema/role_create.po +++ b/locale/ru/LC_MESSAGES/reference/reference_lua/box_schema/role_create.po @@ -7,8 +7,7 @@ msgid "" "section :ref:`Roles `." msgstr "" "Создание роли. Чтобы получить информацию о том, как происходит управление " -"данными о ролях в Tarantool, см. раздел :ref:`Роли `." +"данными о ролях в Tarantool, см. раздел :ref:`Роли `." msgid "Parameters" msgstr "Параметры" diff --git a/locale/ru/LC_MESSAGES/reference/reference_lua/box_schema/role_drop.po b/locale/ru/LC_MESSAGES/reference/reference_lua/box_schema/role_drop.po index 6642c98188..a7a10f61df 100644 --- a/locale/ru/LC_MESSAGES/reference/reference_lua/box_schema/role_drop.po +++ b/locale/ru/LC_MESSAGES/reference/reference_lua/box_schema/role_drop.po @@ -7,8 +7,7 @@ msgid "" "section :ref:`Roles `." msgstr "" "Удаление роли. Чтобы получить информацию о том, как происходит управление " -"данными о ролях в Tarantool, см. раздел :ref:`Роли `." +"данными о ролях в Tarantool, см. раздел :ref:`Роли `." msgid "Parameters" msgstr "Параметры" diff --git a/locale/ru/LC_MESSAGES/reference/reference_lua/box_schema/space_create.po b/locale/ru/LC_MESSAGES/reference/reference_lua/box_schema/space_create.po index 03cf07bf8f..b1592fb959 100644 --- a/locale/ru/LC_MESSAGES/reference/reference_lua/box_schema/space_create.po +++ b/locale/ru/LC_MESSAGES/reference/reference_lua/box_schema/space_create.po @@ -2,8 +2,38 @@ msgid "box.schema.space.create()" msgstr "" -msgid "Create a :ref:`space `." -msgstr "Создание :ref:`спейса `." +#, fuzzy +msgid "" +"Create a :ref:`space `. You can use either syntax. For " +"example, ``s = box.schema.space.create('tester')`` has the same effect as " +"``s = box.schema.create_space('tester')``." +msgstr "" +"Можно использовать любой вариант синтаксиса. Например, ``s = " +"box.schema.space.create('tester')`` эквивалентно ``s = " +"box.schema.create_space('tester')``." + +#, fuzzy +msgid "" +"There are :ref:`three syntax variations ` for " +"object references targeting space objects, for example " +":samp:`box.schema.space.drop({space-id})` drops a space. However, the common" +" approach is to use functions attached to the space objects, for example " +":ref:`space_object:drop() `." +msgstr "" +"Существуют три :ref:`варианта синтаксиса ` для " +"ссылок на объекты спейса, например, :samp:`box.schema.space.drop({id-" +"спейса})` удалит спейс. Однако общий подход заключается в использовании " +"функций, прикрепленных к объектам спейса, например :ref:`space_object:drop()" +" `." + +msgid "" +"After a space is created, usually the next step is to :ref:`create an index " +"` for it, and then it is available for insert, " +"select, and all the other :ref:`box.space ` functions." +msgstr "" +"Следующим шагом после создания спейса будет :ref:`создание индекса " +"` для него, после чего можно будет выполнять " +"вставку, выборку и другие функции :ref:`box.space `." msgid "Parameters" msgstr "Параметры" @@ -15,8 +45,8 @@ msgstr "" "имя спейса, которое должно соответствовать :ref:`правилам именования " "объектов `" -msgid "see \"Options for box.schema.space.create\" chart, below" -msgstr "см. таблицу \"Параметры для box.schema.space.create\" ниже" +msgid "space options (see :ref:`space_opts `)" +msgstr "" msgid "return" msgstr "возвращает" @@ -30,65 +60,94 @@ msgstr "тип возвращаемого значения" msgid "userdata" msgstr "пользовательские данные" +#, fuzzy +msgid "space_opts" +msgstr "объект спейса" + msgid "" -"You can use either syntax. For example, ``s = " -"box.schema.space.create('tester')`` has the same effect as ``s = " -"box.schema.create_space('tester')``." +"Space options that include the space id, format, field count, constraints " +"and foreign keys, and so on. These options are passed to the " +":ref:`box.schema.space.create() ` method." msgstr "" -"Можно использовать любой вариант синтаксиса. Например, ``s = " -"box.schema.space.create('tester')`` эквивалентно ``s = " -"box.schema.create_space('tester')``." -msgid "**Options for box.schema.space.create**" -msgstr "**Параметры для box.schema.space.create**" +msgid "" +"These options are also passed to " +":doc:`/reference/reference_lua/box_space/alter`." +msgstr "" -msgid "Name" -msgstr "Имя" +#, fuzzy +msgid "" +"Create a space only if a space with the same name does not exist already. " +"Otherwise, do nothing but do not cause an error." +msgstr "" +"спейс создается, только если спейса с таким же именем нет в базе данных, в " +"противном случае эффект отсутствует, но ошибка не выдается" -msgid "Effect" -msgstr "Эффект" +#, fuzzy +msgid "Type: boolean" +msgstr "boolean (логический)" -msgid "Type" -msgstr "Тип" +msgid "Default: ``false``" +msgstr "" -msgid "Default" -msgstr "Значение по умолчанию" +msgid "A :ref:`storage engine `." +msgstr "" -msgid "engine" -msgstr "engine (движок)" +#, fuzzy +msgid "Type: string" +msgstr "string (строка)" -msgid "'memtx' or 'vinyl'" -msgstr "'memtx' или 'vinyl'" +#, fuzzy +msgid "Default: `memtx`" +msgstr "Значение по умолчанию" -msgid "string" -msgstr "string (строка)" +msgid "Possible values: ``memtx``, ``vinyl``" +msgstr "" + +#, fuzzy +msgid "" +"A unique numeric identifier of the space: users can refer to spaces with " +"this id instead of the name." +msgstr "" +"уникальный идентификатор: пользователи могут ссылаться на спейсы посредством" +" идентификатора вместо имени" -msgid "'memtx'" -msgstr "'memtx'" +#, fuzzy +msgid "Type: number" +msgstr "число" -msgid "field_count" -msgstr "field_count (количество полей)" +#, fuzzy +msgid "Default: last space's ID + 1" +msgstr "идентификатор последнего спейса +1" +#, fuzzy msgid "" -"fixed count of :ref:`fields `: for example if " -"field_count=5, it is illegal to insert a tuple with fewer than or more than " -"5 fields" +"A fixed count of :ref:`fields `. For example, if " +"``field_count=5``, it is illegal to insert a tuple with fewer than or more " +"than 5 fields." msgstr "" "заданное количество :ref:`полей `: например, если " "field_count=5, нельзя вставить кортеж с количеством полей, большим или " "меньшим, чем 5" -msgid "number" -msgstr "число" +msgid "Default: ``0`` (not fixed)" +msgstr "" -msgid "0 i.e. not fixed" -msgstr "0, то есть не задано" +#, fuzzy +msgid "" +"The name of the user who is considered to be the space's :ref:`owner " +"` for authorization purposes." +msgstr "" +"имя пользователя, который считается :ref:`владельцем ` спейса, для целей авторизации" -msgid "format" -msgstr "format (формат)" +#, fuzzy +msgid "Default: current user's name" +msgstr "имя текущего пользователя" +#, fuzzy msgid "" -"field names and types: See the illustrations of format clauses in the " +"Field names and types. See the illustrations of format clauses in the " ":ref:`space_object:format() ` description and in the " ":ref:`box.space._space ` example. Optional and usually not " "specified." @@ -97,45 +156,17 @@ msgstr "" ":ref:`space_object:format() ` и в :ref:`box.space._space " "`. Необязательный параметр, обычно значение не указывается." -msgid "table" +#, fuzzy +msgid "Type: table" msgstr "таблица" -msgid "(blank)" -msgstr "(пустое)" - -msgid "id" -msgstr "id" - -msgid "" -"unique identifier: users can refer to spaces with the id instead of the name" -msgstr "" -"уникальный идентификатор: пользователи могут ссылаться на спейсы посредством" -" идентификатора вместо имени" - -msgid "last space's id, +1" -msgstr "идентификатор последнего спейса +1" - -msgid "if_not_exists" -msgstr "if_not_exists (если отсутствует)" - -msgid "" -"create space only if a space with the same name does not exist already, " -"otherwise do nothing but do not cause an error" -msgstr "" -"спейс создается, только если спейса с таким же именем нет в базе данных, в " -"противном случае эффект отсутствует, но ошибка не выдается" - -msgid "boolean" -msgstr "boolean (логический)" - -msgid "false" -msgstr "false (ложь)" - -msgid "is_local" -msgstr "is_local" +#, fuzzy +msgid "Default: blank" +msgstr "Значение по умолчанию" +#, fuzzy msgid "" -"space contents are :ref:`replication-local `: changes are" +"Space contents are :ref:`replication-local `: changes are" " stored in the :ref:`write-ahead log ` of the local node but " "there is no :ref:`replication `." msgstr "" @@ -143,37 +174,65 @@ msgstr "" "изменения сохраняются в :ref:`журнале упреждающей записи ` " "локального узла, но не происходит :ref:`репликация `." -msgid "is_sync" -msgstr "" - -msgid "any transaction doing a DML request on this space becomes synchronous" -msgstr "" - -msgid "temporary" -msgstr "temporary (временный)" - +#, fuzzy msgid "" -"space contents are temporary: changes are not stored in the :ref:`write-" +"Space contents are temporary: changes are not stored in the :ref:`write-" "ahead log ` and there is no :ref:`replication `." -" Note re storage engine: vinyl does not support temporary spaces." msgstr "" "содержимое спейса хранится временно: изменения не хранятся в :ref:`журнале " "упреждающей записи `, и не проводится :ref:`репликация " "`. Примечание по движку базы данных: vinyl не поддерживает " "временные спейсы." -msgid "user" -msgstr "user (пользователь)" +msgid "Vinyl does not support temporary spaces." +msgstr "" msgid "" -"name of the user who is considered to be the space's :ref:`owner " -"` for authorization purposes" +"Any transaction doing a DML request on this space becomes :ref:`synchronous " +"`." msgstr "" -"имя пользователя, который считается :ref:`владельцем ` спейса, для целей авторизации" -msgid "current user's name" -msgstr "имя текущего пользователя" +msgid "**Example:**" +msgstr "**Пример:**" + +msgid "box.schema.space.create('bands', { is_sync = true })\n" +msgstr "" + +msgid "" +"The :ref:`constraints ` that space tuples must satisfy." +msgstr "" + +msgid "" +"-- Define a tuple constraint function --\n" +"box.schema.func.create('check_person', {\n" +" language = 'LUA',\n" +" is_deterministic = true,\n" +" body = 'function(t, c) return (t.age >= 0 and #(t.name) > 3) end'\n" +"})\n" +"\n" +"-- Create a space with a tuple constraint --\n" +"customers = box.schema.space.create('customers', {constraint = 'check_person'})\n" +msgstr "" + +msgid "The :ref:`foreign keys ` for space fields." +msgstr "" + +msgid "" +"-- Create a space with a tuple foreign key --\n" +"box.schema.space.create(\"orders\", {\n" +" foreign_key = {\n" +" space = 'customers',\n" +" field = {customer_id = 'id', customer_name = 'name'}\n" +" }\n" +"})\n" +"\n" +"box.space.orders:format({\n" +" {name = \"id\", type = \"number\"},\n" +" {name = \"customer_id\" },\n" +" {name = \"customer_name\"},\n" +" {name = \"price_total\", type = \"number\"},\n" +"})\n" +msgstr "" msgid "" "Saying ``box.cfg{read_only=true...}`` during :ref:`configuration ` for " -"object references targeting space objects, for example " -":samp:`box.schema.space.drop({space-id})` will drop a space. However, the " -"common approach is to use functions attached to the space objects, for " -"example :ref:`space_object:drop() `." -msgstr "" -"Существуют три :ref:`варианта синтаксиса ` для " -"ссылок на объекты спейса, например, :samp:`box.schema.space.drop({id-" -"спейса})` удалит спейс. Однако общий подход заключается в использовании " -"функций, прикрепленных к объектам спейса, например :ref:`space_object:drop()" -" `." +msgid "temporary" +msgstr "temporary (временный)" -msgid "**Example:**" -msgstr "**Пример:**" +msgid "is_local" +msgstr "is_local" msgid "" "tarantool> s = box.schema.space.create('space55')\n" @@ -242,11 +291,59 @@ msgid "" "..." msgstr "" -msgid "" -"After a space is created, usually the next step is to :ref:`create an index " -"` for it, and then it is available for insert, " -"select, and all the other :ref:`box.space ` functions." -msgstr "" -"Следующим шагом после создания спейса будет :ref:`создание индекса " -"` для него, после чего можно будет выполнять " -"вставку, выборку и другие функции :ref:`box.space `." +#~ msgid "Create a :ref:`space `." +#~ msgstr "Создание :ref:`спейса `." + +#~ msgid "see \"Options for box.schema.space.create\" chart, below" +#~ msgstr "см. таблицу \"Параметры для box.schema.space.create\" ниже" + +#~ msgid "**Options for box.schema.space.create**" +#~ msgstr "**Параметры для box.schema.space.create**" + +#~ msgid "Name" +#~ msgstr "Имя" + +#~ msgid "Effect" +#~ msgstr "Эффект" + +#~ msgid "Type" +#~ msgstr "Тип" + +#~ msgid "engine" +#~ msgstr "engine (движок)" + +#~ msgid "'memtx' or 'vinyl'" +#~ msgstr "'memtx' или 'vinyl'" + +#~ msgid "'memtx'" +#~ msgstr "'memtx'" + +#~ msgid "field_count" +#~ msgstr "field_count (количество полей)" + +#~ msgid "0 i.e. not fixed" +#~ msgstr "0, то есть не задано" + +#~ msgid "format" +#~ msgstr "format (формат)" + +#~ msgid "(blank)" +#~ msgstr "(пустое)" + +#~ msgid "id" +#~ msgstr "id" + +#~ msgid "if_not_exists" +#~ msgstr "if_not_exists (если отсутствует)" + +#~ msgid "false" +#~ msgstr "false (ложь)" + +#~ msgid "is_sync" +#~ msgstr "" + +#~ msgid "any transaction doing a DML request on this space becomes synchronous" +#~ msgstr "" + +#~ msgid "user" +#~ msgstr "user (пользователь)" diff --git a/locale/ru/LC_MESSAGES/reference/reference_lua/box_schema/upgrade.po b/locale/ru/LC_MESSAGES/reference/reference_lua/box_schema/upgrade.po index b7e048d130..2765da20df 100644 --- a/locale/ru/LC_MESSAGES/reference/reference_lua/box_schema/upgrade.po +++ b/locale/ru/LC_MESSAGES/reference/reference_lua/box_schema/upgrade.po @@ -2,6 +2,43 @@ msgid "box.schema.upgrade()" msgstr "" -msgid "See :ref:`Upgrading a Tarantool database `." +msgid "" +"If you created a database with an older Tarantool version and have now " +"installed a newer version, make the request ``box.schema.upgrade()``. This " +"updates Tarantool system spaces to match the currently installed version of " +"Tarantool. You can learn about the general upgrade process from the " +":ref:`Upgrades ` topic." msgstr "" -"Смотрите в разделе :ref:`Обновление базы данных Tarantool `." + +msgid "" +"For example, here is what happens when you run ``box.schema.upgrade()`` with" +" a database created with Tarantool version 1.6.4 to version 1.7.2 (only a " +"small part of the output is shown):" +msgstr "" + +msgid "" +"tarantool> box.schema.upgrade()\n" +"alter index primary on _space set options to {\"unique\":true}, parts to [[0,\"unsigned\"]]\n" +"alter space _schema set options to {}\n" +"create view _vindex...\n" +"grant read access to 'public' role for _vindex view\n" +"set schema version to 1.7.0\n" +"---\n" +"..." +msgstr "" + +msgid "" +"You can also put the request ``box.schema.upgrade()`` inside a " +":doc:`box.once() ` function in your " +"Tarantool :ref:`initialization file `. On startup, this " +"will create new system spaces, update data type names (for example, ``num`` " +"-> ``unsigned``, ``str`` -> ``string``) and options in Tarantool system " +"spaces." +msgstr "" + +msgid "See also: :ref:`box.schema.downgrade() `" +msgstr "" + +#~ msgid "See :ref:`Upgrading a Tarantool database `." +#~ msgstr "" +#~ "Смотрите в разделе :ref:`Обновление базы данных Tarantool `." diff --git a/locale/ru/LC_MESSAGES/reference/reference_lua/box_schema/user_create.po b/locale/ru/LC_MESSAGES/reference/reference_lua/box_schema/user_create.po index 4f9a73d6bc..56fd840fbb 100644 --- a/locale/ru/LC_MESSAGES/reference/reference_lua/box_schema/user_create.po +++ b/locale/ru/LC_MESSAGES/reference/reference_lua/box_schema/user_create.po @@ -8,8 +8,8 @@ msgid "" "` space." msgstr "" "Создание пользователя. Чтобы получить информацию о том, как происходит " -"управление данными пользователя в Tarantool, см. раздел :ref:`Пользователи" -" ` и справочник по спейсу :ref:`_user ` и справочник по спейсу :ref:`_user `." msgid "The possible options are:" @@ -38,8 +38,9 @@ msgstr "Максимальное количество пользователей msgid "Parameters" msgstr "Параметры" +#, fuzzy msgid "" -"name of user, which should conform to the :ref:`rules for object names " +"a user name, which should conform to the :ref:`rules for object names " "`" msgstr "" "имя пользователя, которое должно соответствовать :ref:`правилам именования " @@ -58,7 +59,13 @@ msgid "**Examples:**" msgstr "**Примеры:**" msgid "" -"box.schema.user.create('Lena')\n" -"box.schema.user.create('Lena', {password = 'X'})\n" -"box.schema.user.create('Lena', {if_not_exists = false})" +"box.schema.user.create('testuser')\n" +"box.schema.user.create('testuser', {password = 'foobar'})\n" +"box.schema.user.create('testuser', {if_not_exists = false})" msgstr "" + +#~ msgid "" +#~ "box.schema.user.create('Lena')\n" +#~ "box.schema.user.create('Lena', {password = 'X'})\n" +#~ "box.schema.user.create('Lena', {if_not_exists = false})" +#~ msgstr "" diff --git a/locale/ru/LC_MESSAGES/reference/reference_lua/box_schema/user_drop.po b/locale/ru/LC_MESSAGES/reference/reference_lua/box_schema/user_drop.po index 92a70336dd..56a55bfd86 100644 --- a/locale/ru/LC_MESSAGES/reference/reference_lua/box_schema/user_drop.po +++ b/locale/ru/LC_MESSAGES/reference/reference_lua/box_schema/user_drop.po @@ -8,8 +8,8 @@ msgid "" "` space." msgstr "" "Удаление пользователя. Чтобы получить информацию о том, как происходит " -"управление данными пользователя в Tarantool, см. раздел :ref:`Пользователи" -" ` и справочник по спейсу :ref:`_user ` и справочник по спейсу :ref:`_user `." msgid "Parameters" diff --git a/locale/ru/LC_MESSAGES/reference/reference_lua/box_schema/user_grant.po b/locale/ru/LC_MESSAGES/reference/reference_lua/box_schema/user_grant.po index a05150ccac..ca1beab875 100644 --- a/locale/ru/LC_MESSAGES/reference/reference_lua/box_schema/user_grant.po +++ b/locale/ru/LC_MESSAGES/reference/reference_lua/box_schema/user_grant.po @@ -12,28 +12,28 @@ msgstr "" msgid "Parameters" msgstr "Параметры" -msgid "the name of the user." -msgstr "имя пользователя" +msgid "the name of a user to grant privileges to" +msgstr "" msgid "" -"'read' or 'write' or 'execute' or 'create' or 'alter' or 'drop' or a " -"combination." +"one or more privileges to grant to the user (for example, `read` or " +"`read,write`)" msgstr "" -"'read' или 'write' или 'execute' или 'create' или 'alter' или 'drop' или их " -"комбинация." -msgid "'space' or 'function' or 'sequence' or 'role'." +msgid "" +"a database object type to grant privileges to (for example, `space`, `role`," +" or `function`)" msgstr "" -"'space' (спейс) или 'function' (функция), или 'sequence' " -"(последовательность), или 'role' (роль)." -msgid "name of object to grant permissions for." +#, fuzzy +msgid "the name of a database object to grant privileges to" msgstr "имя объекта, для которого выдаются права." -msgid "name of role to grant to user." +#, fuzzy +msgid "the name of a role to grant to the user" msgstr "имя роли, которая выдается пользователю." -msgid "``grantor``, ``if_not_exists``." +msgid "``grantor``, ``if_not_exists``" msgstr "" msgid "" @@ -93,5 +93,32 @@ msgid "" "box.schema.user.grant('Lena', 'read,write', 'universe')\n" "box.schema.user.grant('Lena', 'Accountant')\n" "box.schema.user.grant('Lena', 'read,write,execute', 'universe')\n" -"box.schema.user.grant('X', 'read', 'universe', nil, {if_not_exists=true}))" +"box.schema.user.grant('X', 'read', 'universe', nil, {if_not_exists=true})" msgstr "" + +#~ msgid "the name of the user." +#~ msgstr "имя пользователя" + +#~ msgid "" +#~ "'read' or 'write' or 'execute' or 'create' or 'alter' or 'drop' or a " +#~ "combination." +#~ msgstr "" +#~ "'read' или 'write' или 'execute' или 'create' или 'alter' или 'drop' или их " +#~ "комбинация." + +#~ msgid "'space' or 'function' or 'sequence' or 'role'." +#~ msgstr "" +#~ "'space' (спейс) или 'function' (функция), или 'sequence' " +#~ "(последовательность), или 'role' (роль)." + +#~ msgid "``grantor``, ``if_not_exists``." +#~ msgstr "" + +#~ msgid "" +#~ "box.schema.user.grant('Lena', 'read', 'space', 'tester')\n" +#~ "box.schema.user.grant('Lena', 'execute', 'function', 'f')\n" +#~ "box.schema.user.grant('Lena', 'read,write', 'universe')\n" +#~ "box.schema.user.grant('Lena', 'Accountant')\n" +#~ "box.schema.user.grant('Lena', 'read,write,execute', 'universe')\n" +#~ "box.schema.user.grant('X', 'read', 'universe', nil, {if_not_exists=true}))" +#~ msgstr "" diff --git a/locale/ru/LC_MESSAGES/reference/reference_lua/box_schema/user_passwd.po b/locale/ru/LC_MESSAGES/reference/reference_lua/box_schema/user_passwd.po index 3366c7e18e..ce90c9037d 100644 --- a/locale/ru/LC_MESSAGES/reference/reference_lua/box_schema/user_passwd.po +++ b/locale/ru/LC_MESSAGES/reference/reference_lua/box_schema/user_passwd.po @@ -2,24 +2,21 @@ msgid "box.schema.user.passwd()" msgstr "box.schema.user.passwd()" -msgid "" -"Associate a password with the user who is currently logged in, or with the " -"user specified by user-name. The user must exist and must not be 'guest'." +msgid "Sets a password for a currently logged in or a specified user:" msgstr "" -"Ассоциация пароля с авторизованным пользователем или с указанным именем " -"пользователя. Такой пользователь должен существовать и не быть пользователем" -" 'guest'." +#, fuzzy msgid "" -"Users who wish to change their own passwords should use " -"``box.schema.user.passwd(password)`` syntax." +"A currently logged in user can change their password using " +"``box.schema.user.passwd(new_password)``." msgstr "" "Если пользователь хочет поменять свой пароль, ему следует использовать " "синтаксис ``box.schema.user.passwd(password)``." +#, fuzzy msgid "" -"Administrators who wish to change passwords of other users should use " -"``box.schema.user.passwd(user-name, password)`` syntax." +"An administrator can change the password of another user with " +"``box.schema.user.passwd(name, new_password)``." msgstr "" "Если администратор хочет поменять пароль других пользователей, ему следует " "использовать синтаксис ``box.schema.user.passwd(user-name, password)``." @@ -27,16 +24,31 @@ msgstr "" msgid "Parameters" msgstr "Параметры" -msgid "user-name" +#, fuzzy +msgid "name" msgstr "имя пользователя" -msgid "password" +#, fuzzy +msgid "new_password" msgstr "пароль" msgid "**Example:**" msgstr "**Пример:**" msgid "" -"box.schema.user.passwd('ЛЕНА')\n" -"box.schema.user.passwd('Lena', 'ЛЕНА')" +"box.schema.user.passwd('foobar')\n" +"box.schema.user.passwd('testuser', 'foobar')" msgstr "" + +#~ msgid "" +#~ "Associate a password with the user who is currently logged in, or with the " +#~ "user specified by user-name. The user must exist and must not be 'guest'." +#~ msgstr "" +#~ "Ассоциация пароля с авторизованным пользователем или с указанным именем " +#~ "пользователя. Такой пользователь должен существовать и не быть пользователем" +#~ " 'guest'." + +#~ msgid "" +#~ "box.schema.user.passwd('ЛЕНА')\n" +#~ "box.schema.user.passwd('Lena', 'ЛЕНА')" +#~ msgstr "" diff --git a/locale/ru/LC_MESSAGES/reference/reference_lua/box_schema/user_password.po b/locale/ru/LC_MESSAGES/reference/reference_lua/box_schema/user_password.po index 72603b10e6..ac70e674f6 100644 --- a/locale/ru/LC_MESSAGES/reference/reference_lua/box_schema/user_password.po +++ b/locale/ru/LC_MESSAGES/reference/reference_lua/box_schema/user_password.po @@ -67,5 +67,6 @@ msgstr "string" msgid "**Example:**" msgstr "**Пример:**" -msgid "box.schema.user.password('ЛЕНА')" +#, fuzzy +msgid "box.schema.user.password('foobar')" msgstr "box.schema.user.password('ЛЕНА')" diff --git a/locale/ru/LC_MESSAGES/reference/reference_lua/box_session/id.po b/locale/ru/LC_MESSAGES/reference/reference_lua/box_session/id.po index 644a7e112b..8bfc416985 100644 --- a/locale/ru/LC_MESSAGES/reference/reference_lua/box_session/id.po +++ b/locale/ru/LC_MESSAGES/reference/reference_lua/box_session/id.po @@ -2,15 +2,17 @@ msgid "box.session.id()" msgstr "" +#, fuzzy +msgid "Return the unique identifier (ID) for the current session." +msgstr "" +"уникальный идентификатор (ID) для текущей сессии. Результатом может быть 0 " +"или -1, что означает, что сессии нет." + msgid "return" msgstr "возвращает" -msgid "" -"the unique identifier (ID) for the current session. The result can be 0 or " -"-1 meaning there is no session." +msgid "the session identifier; 0 or -1 if there is no session" msgstr "" -"уникальный идентификатор (ID) для текущей сессии. Результатом может быть 0 " -"или -1, что означает, что сессии нет." msgid "rtype" msgstr "тип возвращаемого значения" diff --git a/locale/ru/LC_MESSAGES/reference/reference_lua/box_session/push.po b/locale/ru/LC_MESSAGES/reference/reference_lua/box_session/push.po index 0f5887ae77..766e418b47 100644 --- a/locale/ru/LC_MESSAGES/reference/reference_lua/box_session/push.po +++ b/locale/ru/LC_MESSAGES/reference/reference_lua/box_session/push.po @@ -35,12 +35,13 @@ msgid "" "Tarantool version :doc:`2.4.2 `, ``sync`` is **deprecated** " "and its use will cause a warning. Since version 2.5.1, its use will cause an" " error." -msgstr "необязательный аргумент, указывающий на сессию. Этот аргумент " -"берётся из предшествующего вызова :doc:`/reference/reference_lua/box_session/sync`." -" Если аргумент опущен, применяется значение по умолчанию --- " -"текущее значение ``box.session.sync()``. Аргумент признан устаревшим " -"в версии Tarantool :doc:`2.4.2 `, а начиная с версии 2.5.1 " -"его использование приводит к ошибке." +msgstr "" +"необязательный аргумент, указывающий на сессию. Этот аргумент берётся из " +"предшествующего вызова :doc:`/reference/reference_lua/box_session/sync`. " +"Если аргумент опущен, применяется значение по умолчанию --- текущее значение" +" ``box.session.sync()``. Аргумент признан устаревшим в версии Tarantool " +":doc:`2.4.2 `, а начиная с версии 2.5.1 его использование " +"приводит к ошибке." msgid "rtype" msgstr "тип возвращаемого значения" @@ -61,16 +62,16 @@ msgstr "" "Если результатом будет не ошибка, то вернется логическое значение ``true`` " "(правда)." +#, fuzzy msgid "" "When the return is ``true``, the message has gone to the network buffer as a" -" :ref:`packet ` " -"with a different :ref:`header code ` " +" :ref:`packet ` with a different header code " "so the client can distinguish from an ordinary Okay response." msgstr "" "Если возвращается ``true``, сообщение отправлено в буфер сети в виде " -":ref:`пакета ` " -"с другим :ref:`кодом заголовка `, " -"и клиент может отличить такой ответ от обычного подтверждения." +":ref:`пакета ` с другим :ref:`кодом заголовка " +"`, и клиент может отличить такой ответ " +"от обычного подтверждения." msgid "" "The server's sole job is to call ``box.session.push()``, there is no " diff --git a/locale/ru/LC_MESSAGES/reference/reference_lua/box_session/su.po b/locale/ru/LC_MESSAGES/reference/reference_lua/box_session/su.po index 4d21e854f6..1818f886a5 100644 --- a/locale/ru/LC_MESSAGES/reference/reference_lua/box_session/su.po +++ b/locale/ru/LC_MESSAGES/reference/reference_lua/box_session/su.po @@ -6,8 +6,8 @@ msgid "" "Change Tarantool's :ref:`current user ` -- this is " "analogous to the Unix command ``su``." msgstr "" -"Изменение :ref:`текущего пользователя ` Tarantool --" -" аналогично Unix-команде ``su``." +"Изменение :ref:`текущего пользователя ` Tarantool -- " +"аналогично Unix-команде ``su``." msgid "" "Or, if function-to-execute is specified, change Tarantool's :ref:`current " @@ -15,8 +15,8 @@ msgid "" "this is analogous to the Unix command ``sudo``." msgstr "" "Или, если указана выполняемая функция (function-to-execute), временное " -"изменение :ref:`текущего пользователя ` Tarantool во" -" время выполнения функции – аналогично Unix-команде ``sudo``." +"изменение :ref:`текущего пользователя ` Tarantool во " +"время выполнения функции – аналогично Unix-команде ``sudo``." msgid "Parameters" msgstr "Параметры" diff --git a/locale/ru/LC_MESSAGES/reference/reference_lua/box_slab/runtime_info.po b/locale/ru/LC_MESSAGES/reference/reference_lua/box_slab/runtime_info.po index d473439174..6ce0746659 100644 --- a/locale/ru/LC_MESSAGES/reference/reference_lua/box_slab/runtime_info.po +++ b/locale/ru/LC_MESSAGES/reference/reference_lua/box_slab/runtime_info.po @@ -3,36 +3,38 @@ msgid "box.runtime.info()" msgstr "" msgid "Show runtime memory usage report in bytes." -msgstr "" -"Отображение отчета по использованию runtime-памяти в байтах." +msgstr "Отображение отчета по использованию runtime-памяти в байтах." msgid "Show runtime memory usage report in bytes." -msgstr "" -"Отображение отчета по использованию runtime-памяти в байтах." +msgstr "Отображение отчета по использованию runtime-памяти в байтах." -msgid "The runtime memory encompasses internal Lua memory as well as the runtime arena. " -"The Lua memory stores Lua objects. " -"The runtime arena stores Tarantool-specific objects -- for example, runtime tuples, network buffers " +msgid "" +"The runtime memory encompasses internal Lua memory as well as the runtime " +"arena. The Lua memory stores Lua objects. The runtime arena stores " +"Tarantool-specific objects -- for example, runtime tuples, network buffers " "and other objects associated with the application server subsystem." -msgstr "Runtime-память включает в себя внутреннюю память Lua и runtime-арену. " -"В памяти Lua хранятся объекты Lua. " -"На runtime-арене хранятся объекты, специфичные для Tarantool: временные пользовательские кортежи, сетевые буферы " -"и прочие объекты, связанные с подсистемой сервера приложений." +msgstr "" +"Runtime-память включает в себя внутреннюю память Lua и runtime-арену. В " +"памяти Lua хранятся объекты Lua. На runtime-арене хранятся объекты, " +"специфичные для Tarantool: временные пользовательские кортежи, сетевые " +"буферы и прочие объекты, связанные с подсистемой сервера приложений." msgid "return" msgstr "возвращает" -msgid "``lua`` is the size of the Lua heap that is controlled by the Lua garbage collector." -msgstr "``lua`` -- размер динамической памяти Lua, контролируемой сборщиком мусора в Lua;" - msgid "" -"``maxalloc`` is the maximum size of the runtime memory." +"``lua`` is the size of the Lua heap that is controlled by the Lua garbage " +"collector." msgstr "" -"``maxalloc`` -- максимальный размер " -"runtime-памяти;" +"``lua`` -- размер динамической памяти Lua, контролируемой сборщиком мусора в" +" Lua;" + +msgid "``maxalloc`` is the maximum size of the runtime memory." +msgstr "``maxalloc`` -- максимальный размер runtime-памяти;" msgid "``used`` is the current number of bytes used by the runtime memory." -msgstr "``used`` -- объем памяти, используемый runtime-памятью в данный момент." +msgstr "" +"``used`` -- объем памяти, используемый runtime-памятью в данный момент." msgid "rtype" msgstr "тип возвращаемого значения" diff --git a/locale/ru/LC_MESSAGES/reference/reference_lua/box_snapshot.po b/locale/ru/LC_MESSAGES/reference/reference_lua/box_snapshot.po index fa0f74b19a..d5884fc1bc 100644 --- a/locale/ru/LC_MESSAGES/reference/reference_lua/box_snapshot.po +++ b/locale/ru/LC_MESSAGES/reference/reference_lua/box_snapshot.po @@ -69,9 +69,9 @@ msgid "" msgstr "" "**Обновление:** До версии 1.6.6 Tarantool процесс создания снимка вызывал " "клонирование системного процесса (fork), что могло привести к скачкам " -"задержки отклика. Начиная с версии 1.6.6 Tarantool, процесс создания " -"снимка создает вид постоянного просмотра, который и записывается в файл " -"снимка с помощью отдельного потока (поток упреждающей записи в журнал)." +"задержки отклика. Начиная с версии 1.6.6 Tarantool, процесс создания снимка " +"создает вид постоянного просмотра, который и записывается в файл снимка с " +"помощью отдельного потока (поток упреждающей записи в журнал)." msgid "" "Although ``box.snapshot()`` does not cause a fork, there is a separate fiber" diff --git a/locale/ru/LC_MESSAGES/reference/reference_lua/box_space.po b/locale/ru/LC_MESSAGES/reference/reference_lua/box_space.po index b285f3fff0..6bb8eb67c9 100644 --- a/locale/ru/LC_MESSAGES/reference/reference_lua/box_space.po +++ b/locale/ru/LC_MESSAGES/reference/reference_lua/box_space.po @@ -18,12 +18,6 @@ msgstr "Имя" msgid "Use" msgstr "Использование" -msgid ":doc:`./box_space/examples`" -msgstr ":doc:`./box_space/examples`" - -msgid "Some useful examples" -msgstr "Несколько полезных примеров" - msgid ":doc:`./box_schema/space_create`" msgstr ":doc:`./box_schema/space_create`" @@ -258,6 +252,24 @@ msgstr ":doc:`./box_space/_vspace`" msgid "(Metadata) List of spaces accessible for the current user" msgstr "(Метаданные) Список спейсов, доступных текущему пользователю" +#, fuzzy +msgid ":doc:`./box_space/_space_sequence`" +msgstr ":doc:`./box_space/_sequence`" + +#, fuzzy +msgid "(Metadata) List of connections between spaces and sequences" +msgstr "(Метаданные) Список кортежей с функциями" + +#, fuzzy +msgid ":doc:`./box_space/_vspace_sequence`" +msgstr ":doc:`./box_space/_sequence`" + +#, fuzzy +msgid "" +"(Metadata) List of connections between spaces and sequences accessible for " +"the current user" +msgstr "(Метаданные) Список спейсов, доступных текущему пользователю" + msgid ":doc:`./box_space/_user`" msgstr ":doc:`./box_space/_user`" @@ -301,5 +313,15 @@ msgid "(Metadata) List of settings affecting behavior of the current session" msgstr "" "(Метаданные) Список настроек, которые влияют на поведение текущего сеанса" -msgid "To see examples, visit the :ref:`how-to guide on CRUD operations `." -msgstr "См. также :ref:`практические примеры работы с CRUD-операциями `." +msgid "" +"To see examples, visit the :ref:`how-to guide on CRUD operations " +"`." +msgstr "" +"См. также :ref:`практические примеры работы с CRUD-операциями " +"`." + +#~ msgid ":doc:`./box_space/examples`" +#~ msgstr ":doc:`./box_space/examples`" + +#~ msgid "Some useful examples" +#~ msgstr "Несколько полезных примеров" diff --git a/locale/ru/LC_MESSAGES/reference/reference_lua/box_space/_func.po b/locale/ru/LC_MESSAGES/reference/reference_lua/box_space/_func.po index 6883ac112f..3040aee71a 100644 --- a/locale/ru/LC_MESSAGES/reference/reference_lua/box_space/_func.po +++ b/locale/ru/LC_MESSAGES/reference/reference_lua/box_space/_func.po @@ -3,142 +3,12 @@ msgid "box.space._func" msgstr "box.space._func" msgid "" -"``_func`` is a system space with function tuples made by " -":ref:`box.schema.func.create() ` or " -":ref:`box.schema.func.create(func-name [, {options-with-body}]) `." +"A system space containing functions created using " +":ref:`box.schema.func.create() `. If a function's " +"definition is specified in the :ref:`body ` option, " +"this function is *persistent*. In this case, its definition is stored in a " +"snapshot and can be recovered if the server restarts." msgstr "" -"``_func`` -- это системный спейс, который содержит кортежи с функциями, " -"созданными с помощью :ref:`box.schema.func.create() ` или :ref:`box.schema.func.create(func-name [, {options-with-" -"body}]) `." - -msgid "Tuples in this space contain the following fields:" -msgstr "Кортежи в данном спейсе включают в себя следующие поля:" - -msgid "id (integer identifier)" -msgstr "id (идентификатор типа integer)" - -msgid "owner (integer identifier)" -msgstr "owner (идентификатор типа integer)" - -msgid "the function name" -msgstr "имя функции" - -msgid "the setuid flag" -msgstr "флаг ``setuid``" - -msgid "a language name (optional): 'LUA' (default) or 'C'" -msgstr "название языка (необязательно): 'LUA' (по умолчанию) или 'C'" - -msgid "the body" -msgstr "body (тело функции)" - -msgid "the is_deterministic flag" -msgstr "флаг ``is_deterministic``" - -msgid "the is_sandboxed flag" -msgstr "флаг ``is_sandboxed``" - -msgid "options." -msgstr "опции" - -msgid "" -"If the function tuple was made in the older way without specification of " -"``body``, then the ``_func`` space will contain default values for the body " -"and the is_deterministic flag and the is_sandboxed flag. Such function " -"tuples are called \"not persistent\". You continue to create Lua functions " -"in the usual way, by saying ``function function_name () ... end``, without " -"adding anything in the ``_func`` space. The ``_func`` space only exists for " -"storing function tuples so that their names can be used within " -":ref:`grant/revoke ` functions." -msgstr "" -"Если кортеж с функцией был создан старым способом без указания ``body``, то " -"в спейсе ``_func`` будут указаны значения body, флага ``is_deterministic`` и" -" флага ``is_sandboxed``, которые используются по умолчанию. Такие кортежи с " -"функцией называются \"непостоянными\". Lua-функции по-прежнему создаются с " -"помощью ``function function_name () ... end`` без каких-либо добавлений в " -"спейс ``_func``. Спейс ``_func`` предназначен лишь для хранения кортежей с " -"функциями так, чтобы их имена могли использоваться в функциях :ref:`выдачи /" -" отмены прав `." - -msgid "" -"If the function tuple was made the newer way with specification of ``body``," -" then all the fields may contain non-default values. Such functions are " -"called \"persistent\". They should be invoked with :samp:`box.func.{func-" -"name}:call([parameters])`." -msgstr "" -"Если же кортеж с функцией был создан новым способом с указанием тела функции" -" ``body``, то все поля могут содержать нестандартные значения. Такие функции" -" называются \"постоянными\". Их следует вызывать, используя " -":samp:`box.func.{func-name}:call([parameters])`." - -msgid "You can:" -msgstr "Доступны следующие операции:" - -msgid "" -"Create a ``_func`` tuple with " -":doc:`/reference/reference_lua/box_schema/func_create`." -msgstr "" -"Создание кортежа в ``_func`` с помощью " -":doc:`/reference/reference_lua/box_schema/func_create`." - -msgid "" -"Drop a ``_func`` tuple with " -":doc:`/reference/reference_lua/box_schema/func_drop`." -msgstr "" -"Удаление кортежа в ``_func`` с помощью " -":doc:`/reference/reference_lua/box_schema/func_drop`." - -msgid "" -"Check whether a ``_func`` tuple exists with " -":doc:`/reference/reference_lua/box_schema/func_exists`." -msgstr "" -"Проверка наличия кортежа в ``_func`` с помощью " -":doc:`/reference/reference_lua/box_schema/func_exists`." - -msgid "**Example:**" -msgstr "**Пример:**" - -msgid "" -"In the following example, we create a function named ‘f7’, put it into " -"Tarantool's ``_func`` space and grant 'execute' privilege for this function " -"to 'guest' user." -msgstr "" -"В следующем примере создадим функцию с именем ‘f7’, поместим ее в спейс " -"``_func`` в Tarantool и выдадим права на 'выполнение' этой функции " -"пользователю 'guest'." - -msgid "" -"tarantool> function f7()\n" -" > box.session.uid()\n" -" > end\n" -"---\n" -"...\n" -"tarantool> box.schema.func.create('f7')\n" -"---\n" -"...\n" -"tarantool> box.schema.user.grant('guest', 'execute', 'function', 'f7')\n" -"---\n" -"...\n" -"tarantool> box.schema.user.revoke('guest', 'execute', 'function', 'f7')\n" -"---\n" -"..." -msgstr "" -"tarantool> function f7()\n" -" > box.session.uid()\n" -" > end\n" -"---\n" -"...\n" -"tarantool> box.schema.func.create('f7')\n" -"---\n" -"...\n" -"tarantool> box.schema.user.grant('guest', 'execute', 'function', 'f7')\n" -"---\n" -"...\n" -"tarantool> box.schema.user.revoke('guest', 'execute', 'function', 'f7')\n" -"---\n" -"..." msgid "" "The :ref:`system space view ` for ``_func`` is " @@ -146,3 +16,141 @@ msgid "" msgstr "" ":ref:`Представление системного спейса ` ``_func`` --- " "``_vfunc``." + +#~ msgid "" +#~ "``_func`` is a system space with function tuples made by " +#~ ":ref:`box.schema.func.create() ` or " +#~ ":ref:`box.schema.func.create(func-name [, {options-with-body}]) `." +#~ msgstr "" +#~ "``_func`` -- это системный спейс, который содержит кортежи с функциями, " +#~ "созданными с помощью :ref:`box.schema.func.create() ` или :ref:`box.schema.func.create(func-name [, {options-with-" +#~ "body}]) `." + +#~ msgid "Tuples in this space contain the following fields:" +#~ msgstr "Кортежи в данном спейсе включают в себя следующие поля:" + +#~ msgid "id (integer identifier)" +#~ msgstr "id (идентификатор типа integer)" + +#~ msgid "owner (integer identifier)" +#~ msgstr "owner (идентификатор типа integer)" + +#~ msgid "the function name" +#~ msgstr "имя функции" + +#~ msgid "the setuid flag" +#~ msgstr "флаг ``setuid``" + +#~ msgid "a language name (optional): 'LUA' (default) or 'C'" +#~ msgstr "название языка (необязательно): 'LUA' (по умолчанию) или 'C'" + +#~ msgid "the body" +#~ msgstr "body (тело функции)" + +#~ msgid "the is_deterministic flag" +#~ msgstr "флаг ``is_deterministic``" + +#~ msgid "the is_sandboxed flag" +#~ msgstr "флаг ``is_sandboxed``" + +#~ msgid "options." +#~ msgstr "опции" + +#~ msgid "" +#~ "If the function tuple was made in the older way without specification of " +#~ "``body``, then the ``_func`` space will contain default values for the body " +#~ "and the is_deterministic flag and the is_sandboxed flag. Such function " +#~ "tuples are called \"not persistent\". You continue to create Lua functions " +#~ "in the usual way, by saying ``function function_name () ... end``, without " +#~ "adding anything in the ``_func`` space. The ``_func`` space only exists for " +#~ "storing function tuples so that their names can be used within " +#~ ":ref:`grant/revoke ` functions." +#~ msgstr "" +#~ "Если кортеж с функцией был создан старым способом без указания ``body``, то " +#~ "в спейсе ``_func`` будут указаны значения body, флага ``is_deterministic`` и" +#~ " флага ``is_sandboxed``, которые используются по умолчанию. Такие кортежи с " +#~ "функцией называются \"непостоянными\". Lua-функции по-прежнему создаются с " +#~ "помощью ``function function_name () ... end`` без каких-либо добавлений в " +#~ "спейс ``_func``. Спейс ``_func`` предназначен лишь для хранения кортежей с " +#~ "функциями так, чтобы их имена могли использоваться в функциях :ref:`выдачи /" +#~ " отмены прав `." + +#~ msgid "" +#~ "If the function tuple was made the newer way with specification of ``body``," +#~ " then all the fields may contain non-default values. Such functions are " +#~ "called \"persistent\". They should be invoked with :samp:`box.func.{func-" +#~ "name}:call([parameters])`." +#~ msgstr "" +#~ "Если же кортеж с функцией был создан новым способом с указанием тела функции" +#~ " ``body``, то все поля могут содержать нестандартные значения. Такие функции" +#~ " называются \"постоянными\". Их следует вызывать, используя " +#~ ":samp:`box.func.{func-name}:call([parameters])`." + +#~ msgid "You can:" +#~ msgstr "Доступны следующие операции:" + +#~ msgid "" +#~ "Create a ``_func`` tuple with " +#~ ":doc:`/reference/reference_lua/box_schema/func_create`." +#~ msgstr "" +#~ "Создание кортежа в ``_func`` с помощью " +#~ ":doc:`/reference/reference_lua/box_schema/func_create`." + +#~ msgid "" +#~ "Drop a ``_func`` tuple with " +#~ ":doc:`/reference/reference_lua/box_schema/func_drop`." +#~ msgstr "" +#~ "Удаление кортежа в ``_func`` с помощью " +#~ ":doc:`/reference/reference_lua/box_schema/func_drop`." + +#~ msgid "" +#~ "Check whether a ``_func`` tuple exists with " +#~ ":doc:`/reference/reference_lua/box_schema/func_exists`." +#~ msgstr "" +#~ "Проверка наличия кортежа в ``_func`` с помощью " +#~ ":doc:`/reference/reference_lua/box_schema/func_exists`." + +#~ msgid "**Example:**" +#~ msgstr "**Пример:**" + +#~ msgid "" +#~ "In the following example, we create a function named ‘f7’, put it into " +#~ "Tarantool's ``_func`` space and grant 'execute' privilege for this function " +#~ "to 'guest' user." +#~ msgstr "" +#~ "В следующем примере создадим функцию с именем ‘f7’, поместим ее в спейс " +#~ "``_func`` в Tarantool и выдадим права на 'выполнение' этой функции " +#~ "пользователю 'guest'." + +#~ msgid "" +#~ "tarantool> function f7()\n" +#~ " > box.session.uid()\n" +#~ " > end\n" +#~ "---\n" +#~ "...\n" +#~ "tarantool> box.schema.func.create('f7')\n" +#~ "---\n" +#~ "...\n" +#~ "tarantool> box.schema.user.grant('guest', 'execute', 'function', 'f7')\n" +#~ "---\n" +#~ "...\n" +#~ "tarantool> box.schema.user.revoke('guest', 'execute', 'function', 'f7')\n" +#~ "---\n" +#~ "..." +#~ msgstr "" +#~ "tarantool> function f7()\n" +#~ " > box.session.uid()\n" +#~ " > end\n" +#~ "---\n" +#~ "...\n" +#~ "tarantool> box.schema.func.create('f7')\n" +#~ "---\n" +#~ "...\n" +#~ "tarantool> box.schema.user.grant('guest', 'execute', 'function', 'f7')\n" +#~ "---\n" +#~ "...\n" +#~ "tarantool> box.schema.user.revoke('guest', 'execute', 'function', 'f7')\n" +#~ "---\n" +#~ "..." diff --git a/locale/ru/LC_MESSAGES/reference/reference_lua/box_space/_session_settings.po b/locale/ru/LC_MESSAGES/reference/reference_lua/box_space/_session_settings.po index 8b03372d77..d6a05cad27 100644 --- a/locale/ru/LC_MESSAGES/reference/reference_lua/box_space/_session_settings.po +++ b/locale/ru/LC_MESSAGES/reference/reference_lua/box_space/_session_settings.po @@ -3,73 +3,150 @@ msgid "box.space._session_settings" msgstr "box.space._session_settings" msgid "" -"``_session_settings`` is a temporary system space with a list of settings " -"that may affect behavior, particularly SQL behavior, for the current " -"session. It uses a special engine named 'service'. Every 'service' tuple is " -"created on the fly, that is, new tuples are made every time " -"``_session_settings`` is accessed. Every settings tuple has two fields: " -"``name`` (the primary key) and ``value``. The tuples' names and default " -"values are: |br| ``error_marshaling_enabled``: whether :doc:`error objects " -"` have a special structure. Default " -"= false. |br| ``sql_default_engine``: default :ref:`storage engine ` for new SQL tables. Default = 'memtx'. |br| " -"``sql_defer_foreign_keys``: whether foreign-key checks can wait till commit." -" Default = false. |br| ``sql_full_column_names``: no effect at this time. " -"Default = false. |br| ``sql_full_metadata``: whether :ref:`SQL result set " -"metadata ` will have more than just name and type. " -"Default = false. |br| ``sql_parser_debug``: whether to show parser steps for" -" following statements. Default = false. |br| ``sql_recursive_triggers``: " -"whether a triggered statement can activate a :ref:`trigger " -"`. Default = true. |br| " -"``sql_reverse_unordered_selects``: whether result rows are usually in " -"reverse order if there is no :ref:`ORDER BY clause `. Default " -"= false. |br| ``sql_select_debug``: whether to show execution steps during " -":ref:`SELECT `. Default = false. |br| ``sql_vdbe_debug``: for " -"use by Tarantool's developers. Default = false. |br| Three requests are " -"possible: :doc:`select ` and " -":doc:`get ` and :doc:`update " +"A temporary system space with settings that affect behavior, particularly " +"SQL behavior, for the current session. It uses a special engine named " +"'service'. Every 'service' tuple is created on the fly, that is, new tuples " +"are made every time ``_session_settings`` is accessed. Every settings tuple " +"has two fields: ``name`` (the primary key) and ``value``. The tuples' names " +"and default values are:" +msgstr "" + +msgid "" +"``sql_default_engine``: default :ref:`storage engine ` for " +"new SQL tables. Default: ``memtx``." +msgstr "" + +msgid "" +"``sql_full_column_names``: use full column names in :ref:`SQL result set " +"metadata `. Default: ``false``." +msgstr "" + +msgid "" +"``sql_full_metadata``: whether :ref:`SQL result set metadata ` includes more than just name and type. Default:``false``." +msgstr "" + +msgid "" +"``sql_parser_debug``: show parser steps for following statements. Default: " +"``false``." +msgstr "" + +msgid "" +"``sql_recursive_triggers``: whether a triggered statement can activate a " +":ref:`trigger `. Default: ``true``." +msgstr "" + +msgid "" +"``sql_reverse_unordered_selects``: return result rows in reverse order if " +"there is no :ref:`ORDER BY clause `. Default: ``false``." +msgstr "" + +msgid "" +"``sql_select_debug``: show execution steps during :ref:`SELECT " +"`. Default:``false``." +msgstr "" + +msgid "" +"``sql_seq_scan``: allow sequential scans in SQL :ref:`SELECT `. " +"Default: ``true``." +msgstr "" + +msgid "``sql_vdbe_debug``: for internal use. Default:``false``." +msgstr "" + +msgid "" +"``sql_defer_foreign_keys`` (removed in :doc:`2.11.0 `): " +"whether foreign-key checks can wait till commit. Default: ``false``." +msgstr "" + +msgid "" +"``error_marshaling_enabled`` (removed in :doc:`2.10.0 `): " +"whether :doc:`error objects ` have a" +" special structure. Default: ``false``." +msgstr "" + +msgid "" +"Three requests are possible: :doc:`select " +"`, :doc:`get " +"` and :doc:`update " "`. For example, after ``s = " "box.space._session_settings``, ``s:select('sql_default_engine')`` probably " "returns ``{'sql_default_engine', 'memtx'}``, and " "``s:update('sql_default_engine', {{'=', 'value', 'vinyl'}})`` changes the " "default engine to 'vinyl'. |br| Updating ``sql_parser_debug`` or " "``sql_select_debug`` or ``sql_vdbe_debug`` has no effect unless Tarantool " -"was built with -DCMAKE_BUILD_TYPE=Debug. To check if this is so, look at " -"``require('tarantool').build.target``." +"was built with ``-DCMAKE_BUILD_TYPE=Debug``. To check if this is so, look at" +" ``require('tarantool').build.target``." msgstr "" -"``_session_settings`` — это временный системный спейс со списком настроек, " -"которые во время текущего сеанса могут повлиять на поведение системы, в " -"частности поведение SQL. Здесь используется специальный механизм под " -"названием 'service'. Каждый кортеж 'service' создается на лету, то есть при " -"каждом обращении к ``_session_settings`` создается кортеж. В каждом кортеже " -"с настройками есть два поля: ``name`` (первичный ключ) и ``value``. Далее " -"указаны имена кортежей и значения, которые используются по умолчанию: |br| " -"``error_marshaling_enabled``: есть ли особая структура для :doc:`объектов " -"ошибок `. По умолчанию стоит false. " -"|br| ``sql_default_engine``: :ref:`движок базы данных `, " -"который используется по умолчанию для создания SQL-таблиц. По умолчанию " -"используется memtx. |br| ``sql_defer_foreign_keys``: откладывается ли " -"проверка ограничений внешнего ключа до коммита. По умолчанию стоит false. " -"|br| ``sql_full_column_names``: на данный момент никакого действия нет. По " -"умолчанию стоит false. |br| ``sql_full_metadata``: будут ли :ref:`метаданные" -" результирующего набора SQL ` содержать другие данные, " -"помимо имени и типа. По умолчанию стоит false. |br| ``sql_parser_debug``: " -"показывать ли шаги работы анализатора для последующих выражений. По " -"умолчанию стоит false. |br| ``sql_recursive_triggers``: может ли сработавший" -" оператор активировать :ref:`триггер `. По умолчанию " -"стоит true. |br| ``sql_reverse_unordered_selects``: находятся ли строки " -"результата обычно в обратном порядке, если нет :ref:`оператора ORDER BY " -"`. По умолчанию стоит false. |br| ``sql_select_debug``: " -"показывать ли шаги выполнения во время :ref:`SELECT `. По " -"умолчанию стоит false. |br| ``sql_vdbe_debug``: используется разработчиками " -"Tarantool. По умолчанию стоит false. |br| Доступны 3 запроса: :doc:`select " -"`, :doc:`get " -"` и :doc:`update " -"`. Например, после вызова ``s = " -"box.space._session_settings`` ``s:select('sql_default_engine')`` вероятно " -"вернет ``{'sql_default_engine', 'memtx'}``, а " -"``s:update('sql_default_engine', {{'=', 'value', 'vinyl'}})`` изменит движок" -" базы данных, который используется по умолчанию, на 'vinyl'. |br| Значения " -"``sql_parser_debug``, ``sql_select_debug`` или ``sql_vdbe_debug`` обновятся," -" только если Tarantool был собран с DCMAKE_BUILD_TYPE=Debug. Чтобы это " -"проверить, используйте ``require('tarantool').build.target``." + +#~ msgid "" +#~ "``_session_settings`` is a temporary system space with a list of settings " +#~ "that may affect behavior, particularly SQL behavior, for the current " +#~ "session. It uses a special engine named 'service'. Every 'service' tuple is " +#~ "created on the fly, that is, new tuples are made every time " +#~ "``_session_settings`` is accessed. Every settings tuple has two fields: " +#~ "``name`` (the primary key) and ``value``. The tuples' names and default " +#~ "values are: |br| ``error_marshaling_enabled``: whether :doc:`error objects " +#~ "` have a special structure. Default " +#~ "= false. |br| ``sql_default_engine``: default :ref:`storage engine ` for new SQL tables. Default = 'memtx'. |br| " +#~ "``sql_defer_foreign_keys``: whether foreign-key checks can wait till commit." +#~ " Default = false. |br| ``sql_full_column_names``: no effect at this time. " +#~ "Default = false. |br| ``sql_full_metadata``: whether :ref:`SQL result set " +#~ "metadata ` will have more than just name and type. " +#~ "Default = false. |br| ``sql_parser_debug``: whether to show parser steps for" +#~ " following statements. Default = false. |br| ``sql_recursive_triggers``: " +#~ "whether a triggered statement can activate a :ref:`trigger " +#~ "`. Default = true. |br| " +#~ "``sql_reverse_unordered_selects``: whether result rows are usually in " +#~ "reverse order if there is no :ref:`ORDER BY clause `. Default " +#~ "= false. |br| ``sql_select_debug``: whether to show execution steps during " +#~ ":ref:`SELECT `. Default = false. |br| ``sql_vdbe_debug``: for " +#~ "use by Tarantool's developers. Default = false. |br| Three requests are " +#~ "possible: :doc:`select ` and " +#~ ":doc:`get ` and :doc:`update " +#~ "`. For example, after ``s = " +#~ "box.space._session_settings``, ``s:select('sql_default_engine')`` probably " +#~ "returns ``{'sql_default_engine', 'memtx'}``, and " +#~ "``s:update('sql_default_engine', {{'=', 'value', 'vinyl'}})`` changes the " +#~ "default engine to 'vinyl'. |br| Updating ``sql_parser_debug`` or " +#~ "``sql_select_debug`` or ``sql_vdbe_debug`` has no effect unless Tarantool " +#~ "was built with -DCMAKE_BUILD_TYPE=Debug. To check if this is so, look at " +#~ "``require('tarantool').build.target``." +#~ msgstr "" +#~ "``_session_settings`` — это временный системный спейс со списком настроек, " +#~ "которые во время текущего сеанса могут повлиять на поведение системы, в " +#~ "частности поведение SQL. Здесь используется специальный механизм под " +#~ "названием 'service'. Каждый кортеж 'service' создается на лету, то есть при " +#~ "каждом обращении к ``_session_settings`` создается кортеж. В каждом кортеже " +#~ "с настройками есть два поля: ``name`` (первичный ключ) и ``value``. Далее " +#~ "указаны имена кортежей и значения, которые используются по умолчанию: |br| " +#~ "``error_marshaling_enabled``: есть ли особая структура для :doc:`объектов " +#~ "ошибок `. По умолчанию стоит false. " +#~ "|br| ``sql_default_engine``: :ref:`движок базы данных `, " +#~ "который используется по умолчанию для создания SQL-таблиц. По умолчанию " +#~ "используется memtx. |br| ``sql_defer_foreign_keys``: откладывается ли " +#~ "проверка ограничений внешнего ключа до коммита. По умолчанию стоит false. " +#~ "|br| ``sql_full_column_names``: на данный момент никакого действия нет. По " +#~ "умолчанию стоит false. |br| ``sql_full_metadata``: будут ли :ref:`метаданные" +#~ " результирующего набора SQL ` содержать другие данные, " +#~ "помимо имени и типа. По умолчанию стоит false. |br| ``sql_parser_debug``: " +#~ "показывать ли шаги работы анализатора для последующих выражений. По " +#~ "умолчанию стоит false. |br| ``sql_recursive_triggers``: может ли сработавший" +#~ " оператор активировать :ref:`триггер `. По умолчанию " +#~ "стоит true. |br| ``sql_reverse_unordered_selects``: находятся ли строки " +#~ "результата обычно в обратном порядке, если нет :ref:`оператора ORDER BY " +#~ "`. По умолчанию стоит false. |br| ``sql_select_debug``: " +#~ "показывать ли шаги выполнения во время :ref:`SELECT `. По " +#~ "умолчанию стоит false. |br| ``sql_vdbe_debug``: используется разработчиками " +#~ "Tarantool. По умолчанию стоит false. |br| Доступны 3 запроса: :doc:`select " +#~ "`, :doc:`get " +#~ "` и :doc:`update " +#~ "`. Например, после вызова ``s = " +#~ "box.space._session_settings`` ``s:select('sql_default_engine')`` вероятно " +#~ "вернет ``{'sql_default_engine', 'memtx'}``, а " +#~ "``s:update('sql_default_engine', {{'=', 'value', 'vinyl'}})`` изменит движок" +#~ " базы данных, который используется по умолчанию, на 'vinyl'. |br| Значения " +#~ "``sql_parser_debug``, ``sql_select_debug`` или ``sql_vdbe_debug`` обновятся," +#~ " только если Tarantool был собран с DCMAKE_BUILD_TYPE=Debug. Чтобы это " +#~ "проверить, используйте ``require('tarantool').build.target``." diff --git a/locale/ru/LC_MESSAGES/reference/reference_lua/box_space/_space_sequence.po b/locale/ru/LC_MESSAGES/reference/reference_lua/box_space/_space_sequence.po new file mode 100644 index 0000000000..00b0c3003a --- /dev/null +++ b/locale/ru/LC_MESSAGES/reference/reference_lua/box_space/_space_sequence.po @@ -0,0 +1,65 @@ + +msgid "box.space._space_sequence" +msgstr "" + +msgid "" +"``_space_sequence`` is a system space. It contains connections between " +"spaces and sequences." +msgstr "" + +msgid "Tuples in this space contain the following fields:" +msgstr "" + +msgid "``id`` (``unsigned``) -- space id" +msgstr "" + +msgid "``sequence_id`` (``unsigned``) -- id of the attached sequence" +msgstr "" + +msgid "" +"``is_generated`` (``boolean``) -- ``true`` if the sequence was created " +"automatically via a ``space:create_index('pk', {sequence = true})`` call" +msgstr "" + +msgid "" +"``field`` (``unsigned``) -- id of the space field to which the sequence is " +"attached." +msgstr "" + +msgid "" +"``path`` (``string``) -- path to the data within the field that is set using" +" the attached sequence." +msgstr "" + +msgid "" +"The :ref:`system space view ` for ``_space_sequence`` is" +" ``_vspace_sequence``." +msgstr "" + +msgid "**Example**" +msgstr "" + +msgid "" +"-- Create a sequence --\n" +"box.schema.sequence.create('id_seq',{min=1000, start=1000})\n" +"-- Create a space --\n" +"box.schema.space.create('customers')\n" +"\n" +"-- Create an index that uses the sequence --\n" +"box.space.customers:create_index('primary',{ sequence = 'id_seq' })\n" +"\n" +"-- Create a space --\n" +"box.schema.space.create('orders')\n" +"\n" +"-- Create an index that uses an auto sequence --\n" +"box.space.orders:create_index( 'primary', { sequence = true })\n" +"\n" +"-- Check the connections between spaces and sequences\n" +"box.space._space_sequence:select{}\n" +"--[[\n" +"---\n" +"- - [512, 1, false, 0, '']\n" +" - [513, 2, true, 0, '']\n" +"...\n" +"--]]\n" +msgstr "" diff --git a/locale/ru/LC_MESSAGES/reference/reference_lua/box_space/_user.po b/locale/ru/LC_MESSAGES/reference/reference_lua/box_space/_user.po index 5d720cd2ce..1f903377cd 100644 --- a/locale/ru/LC_MESSAGES/reference/reference_lua/box_space/_user.po +++ b/locale/ru/LC_MESSAGES/reference/reference_lua/box_space/_user.po @@ -11,21 +11,32 @@ msgstr "" msgid "Tuples in this space contain the following fields:" msgstr "Кортежи в данном спейсе включают в себя следующие поля:" -msgid "the numeric id of the tuple (\"id\")," +#, fuzzy +msgid "a numeric id of the tuple (\"id\")" msgstr "числовой идентификатор кортежа (\"id\")," -msgid "the numeric id of the tuple’s creator," +#, fuzzy +msgid "a numeric id of the tuple’s creator" msgstr "числовой идентификатор создателя кортежа," -msgid "the name," -msgstr "имя," +#, fuzzy +msgid "a name" +msgstr "Имя" -msgid "the type: 'user' or 'role'," +#, fuzzy +msgid "a type: 'user' or 'role'" msgstr "тип: 'user' (пользователь) или 'role' (роль)," -msgid "optional password." +#, fuzzy +msgid "(optional) a password hash" msgstr "пароль по желанию" +msgid "(optional) an array of previous authentication data" +msgstr "" + +msgid "(optional) a timestamp of the last password update" +msgstr "" + msgid "" "There are five special tuples in the ``_user`` space: 'guest', 'admin', " "'public', 'replication', and 'super'." @@ -54,8 +65,9 @@ msgstr "0" msgid "user" msgstr "user (пользователь)" +#, fuzzy msgid "" -"Default user when connecting remotely. Usually an untrusted user with few " +"Default user when connecting remotely. Usually, an untrusted user with few " "privileges." msgstr "" "Пользователь, который используется по умолчанию при удаленном подключении. " @@ -68,13 +80,14 @@ msgstr "admin" msgid "1" msgstr "1" +#, fuzzy msgid "" -"Default user when using Tarantool as a console. Usually an " +"Default user when using Tarantool as a console. Usually, an " ":ref:`administrative user ` with all " "privileges." msgstr "" -"Пользователь, который используется по умолчанию при работе с Tarantool " -"как с консолью. Как правило, это :ref:`административный пользователь " +"Пользователь, который используется по умолчанию при работе с Tarantool как с" +" консолью. Как правило, это :ref:`административный пользователь " "` со всеми правами." msgid "public" @@ -129,11 +142,11 @@ msgstr "" "роли 'super' такие права выданы на 'universe': чтение, запись, выполнение, " "создание, удаление, изменение." +#, fuzzy msgid "" "To select a tuple from the ``_user`` space, use " -"``box.space._user:select()``. For example, here is what happens with a " -"select for user id = 0, which is the 'guest' user, which by default has no " -"password:" +"``box.space._user:select()``. In the example below, ``select`` is executed " +"for a user with id = 0. This is the 'guest' user that has no password." msgstr "" "Чтобы выбрать кортеж из спейса ``_user``, используйте " "``box.space._user:select()``. Например, при выборке от пользователя с id = " @@ -151,10 +164,11 @@ msgstr "" "- - [0, 1, 'guest', 'user']\n" "..." +#, fuzzy msgid "" "To change tuples in the ``_user`` space, do not use ordinary ``box.space`` " -"functions for insert or update or delete. The ``_user`` space is special, so" -" there are special functions which have appropriate error checking." +"functions for insert, update, or delete. The ``_user`` space is special, so " +"there are special functions that have appropriate error checking.\\" msgstr "" "Чтобы изменить кортежи в спейсе ``_user``, не пользуйтесь стандартными " "функциями ``box.space`` для вставки, обновления или удаления. Речь идет об " @@ -177,9 +191,10 @@ msgstr "" "box.schema.user.create(*user-name*, {if_not_exists = true})\n" "box.schema.user.create(*user-name*, {password = *password*})" +#, fuzzy msgid "" "To change the user's password, use " -":doc:`/reference/reference_lua/box_schema/user_password`:" +":doc:`/reference/reference_lua/box_schema/user_passwd`:" msgstr "" "Чтобы изменить пароль пользователя, воспользуйтесь " ":doc:`/reference/reference_lua/box_schema/user_password`:" @@ -273,3 +288,6 @@ msgid "" msgstr "" ":ref:`Представление системного спейса ` ``_user`` --- " "``_vuser``." + +#~ msgid "the name," +#~ msgstr "имя," diff --git a/locale/ru/LC_MESSAGES/reference/reference_lua/box_space/_vspace_sequence.po b/locale/ru/LC_MESSAGES/reference/reference_lua/box_space/_vspace_sequence.po new file mode 100644 index 0000000000..8c531cf108 --- /dev/null +++ b/locale/ru/LC_MESSAGES/reference/reference_lua/box_space/_vspace_sequence.po @@ -0,0 +1,8 @@ + +msgid "box.space._vspace_sequence" +msgstr "" + +msgid "" +"``_vspace_sequence`` is the :ref:`system space view ` " +"for :ref:`_space `." +msgstr "" diff --git a/locale/ru/LC_MESSAGES/reference/reference_lua/box_space/alter.po b/locale/ru/LC_MESSAGES/reference/reference_lua/box_space/alter.po index 249b8a7b30..d208e20239 100644 --- a/locale/ru/LC_MESSAGES/reference/reference_lua/box_space/alter.po +++ b/locale/ru/LC_MESSAGES/reference/reference_lua/box_space/alter.po @@ -12,10 +12,11 @@ msgstr "" msgid "Parameters" msgstr "Параметры" +#, fuzzy msgid "" -"``field_count``, ``user``, ``format``, ``temporary``, ``is_sync``, and " -"``name`` -- the meaning of these parameters is the same as in " -":doc:`/reference/reference_lua/box_schema/space_create`" +"the space options such as ``field_count``, ``user``, ``format``, ``name``, " +"and other. The full list of these options with descriptions parameters is " +"provided in :doc:`/reference/reference_lua/box_schema/space_create`" msgstr "" "``field_count``, ``user``, ``format``, ``temporary``, ``is_sync``, и " "``name`` -- эти параметры имеют то же значение, что и параметры в " diff --git a/locale/ru/LC_MESSAGES/reference/reference_lua/box_space/bsize.po b/locale/ru/LC_MESSAGES/reference/reference_lua/box_space/bsize.po index f90982e0a7..b4ccb1cbd8 100644 --- a/locale/ru/LC_MESSAGES/reference/reference_lua/box_space/bsize.po +++ b/locale/ru/LC_MESSAGES/reference/reference_lua/box_space/bsize.po @@ -18,8 +18,8 @@ msgid "" ":doc:`/reference/reference_lua/box_index/bsize`." msgstr "" "Количество байтов в спейсе. Это число, которое хранится во внутренней памяти" -" Tarantool, представляет собой общее количество байтов во всех кортежах, " -"не включая ключи индекса. Для получения информации об измерении размера " +" Tarantool, представляет собой общее количество байтов во всех кортежах, не " +"включая ключи индекса. Для получения информации об измерении размера " "индекса, см. :doc:`/reference/reference_lua/box_index/bsize`." msgid "**Example:**" diff --git a/locale/ru/LC_MESSAGES/reference/reference_lua/box_space/count.po b/locale/ru/LC_MESSAGES/reference/reference_lua/box_space/count.po index 83b3a26909..d7c86df8a8 100644 --- a/locale/ru/LC_MESSAGES/reference/reference_lua/box_space/count.po +++ b/locale/ru/LC_MESSAGES/reference/reference_lua/box_space/count.po @@ -36,8 +36,8 @@ msgid "**Possible errors:**" msgstr "**Возможные ошибки:**" msgid "" -":errcode:`ER_TRANSACTION_CONFLICT` if a transaction conflict is detected in the " -":ref:`MVCC transaction mode `." +":errcode:`ER_TRANSACTION_CONFLICT` if a transaction conflict is detected in " +"the :ref:`MVCC transaction mode `." msgstr "" ":errcode:`ER_TRANSACTION_CONFLICT`, если транзакция стала конфликтной в " ":ref:`транзакционном режиме MVCC `." diff --git a/locale/ru/LC_MESSAGES/reference/reference_lua/box_space/create_check_constraint.po b/locale/ru/LC_MESSAGES/reference/reference_lua/box_space/create_check_constraint.po index 97a00e06c9..c6e4bb17b1 100644 --- a/locale/ru/LC_MESSAGES/reference/reference_lua/box_space/create_check_constraint.po +++ b/locale/ru/LC_MESSAGES/reference/reference_lua/box_space/create_check_constraint.po @@ -2,6 +2,12 @@ msgid "box.space.create_check_constraint()" msgstr "box.space.create_check_constraint()" +msgid "" +"This function was removed in :doc:`2.11.0 `. The check " +"constraint mechanism is replaced with the new tuple constraints. Learn more " +"about tuple constraints in :ref:`Constraints `." +msgstr "" + msgid "" "Create a check constraint. A check constraint is a requirement that must be " "met when a tuple is inserted or updated in a space. Check constraints " diff --git a/locale/ru/LC_MESSAGES/reference/reference_lua/box_space/create_index.po b/locale/ru/LC_MESSAGES/reference/reference_lua/box_space/create_index.po index 5e51281184..e800ec344f 100644 --- a/locale/ru/LC_MESSAGES/reference/reference_lua/box_space/create_index.po +++ b/locale/ru/LC_MESSAGES/reference/reference_lua/box_space/create_index.po @@ -2,45 +2,6 @@ msgid "space_object:create_index()" msgstr "space_object:create_index()" -msgid "On this page:" -msgstr "На этой странице:" - -msgid ":ref:`create_index() description `" -msgstr ":ref:`Описание create_index() `" - -msgid "" -":ref:`Details about index field types `" -msgstr "" -":ref:`Описание типов индексируемых полей `" - -msgid ":ref:`Allowing null for an indexed key `" -msgstr "" -":ref:`Использование null для индексируемого ключа `" - -msgid "" -":ref:`Creating an index using field names instead of field numbers " -"`" -msgstr "" -":ref:`Создание индекса с использованием имен полей вместо номеров полей " -"`" - -msgid "" -":ref:`Creating an index using the path option for map fields (JSON-path " -"indexes) `" -msgstr "" -":ref:`Создание индекса с использованием пути для полей с ассоциативными " -"массивами (индексы по пути JSON) `" - -msgid "" -":ref:`Creating an multikey index using the path option with [*] `" -msgstr "" -":ref:`Создание индекса по массивам (multikey) с использованием опции path с " -"символом [*] `" - -msgid ":ref:`Creating a functional index `" -msgstr ":ref:`Создание функционального индекса `" - msgid "Create an :ref:`index `." msgstr "Создание :ref:`индекса `." @@ -67,8 +28,8 @@ msgstr "" "имя индекса, которое должно соответствовать :ref:`правилам именования " "объектов `" -msgid "see \"Options for space_object:create_index()\", below" -msgstr "см. \"Параметры для space_object:create_index()\" ниже" +msgid "index options (see :ref:`index_opts `)" +msgstr "" msgid "return" msgstr "возвращает" @@ -85,21 +46,24 @@ msgstr "index_object" msgid "**Possible errors:**" msgstr "**Возможные ошибки:**" -msgid "too many parts;" +#, fuzzy +msgid "too many parts" msgstr "слишком много частей;" -msgid "index '...' already exists;" +#, fuzzy +msgid "index '...' already exists" msgstr "индекс '...' уже существует;" -msgid "primary key must be unique." +#, fuzzy +msgid "primary key must be unique" msgstr "первичный ключ должен быть уникальным." +#, fuzzy msgid "" "Building or rebuilding a large index will cause occasional :ref:`yields " -"` so that other requests will not be " -"blocked. If the other requests cause an illegal situation such as a " -"duplicate key in a unique index, building or rebuilding such index will " -"fail." +"` so that other requests will not be blocked. " +"If the other requests cause an illegal situation such as a duplicate key in " +"a unique index, building or rebuilding such index will fail." msgstr "" "Сборка или пересборка большого индекса будет периодически вызывать " ":ref:`передачу управления `, чтобы не " @@ -107,255 +71,127 @@ msgstr "" " повторяющийся ключ в уникальном индексе, сборка или пересборка такого " "индекса не выполнится." -msgid "**Options for space_object:create_index()**" -msgstr "**Параметры для space_object:create_index()**" +msgid "**Example:**" +msgstr "**Пример:**" -msgid "Name" -msgstr "Имя" +msgid "" +"-- Create a space --\n" +"bands = box.schema.space.create('bands')\n" +"\n" +"-- Specify field names and types --\n" +"box.space.bands:format({\n" +" { name = 'id', type = 'unsigned' },\n" +" { name = 'band_name', type = 'string' },\n" +" { name = 'year', type = 'unsigned' }\n" +"})\n" +"\n" +"-- Create a primary index --\n" +"box.space.bands:create_index('primary', { parts = { 'id' } })\n" +"\n" +"-- Create a unique secondary index --\n" +"box.space.bands:create_index('band', { parts = { 'band_name' } })\n" +"\n" +"-- Create a non-unique secondary index --\n" +"box.space.bands:create_index('year', { parts = { { 'year' } }, unique = false })\n" +"\n" +"-- Create a multi-part index --\n" +"box.space.bands:create_index('year_band', { parts = { { 'year' }, { 'band_name' } } })\n" +msgstr "" -msgid "Effect" -msgstr "Описание" +#, fuzzy +msgid "index_opts" +msgstr "index_object" -msgid "Type" -msgstr "Тип" +msgid "" +"Index options that include the index name, type, identifiers of key fields, " +"and so on. These options are passed to the :ref:`space_object.create_index()" +" ` method." +msgstr "" -msgid "Default" -msgstr "Значение по умолчанию" +#, fuzzy +msgid "" +"These options are also passed to " +":doc:`/reference/reference_lua/box_index/alter`." +msgstr "" +"Параметры из вышеприведенной таблицы также могут использоваться в " +":doc:`/reference/reference_lua/box_index/alter`." -msgid "type" -msgstr "type" +#, fuzzy +msgid "The :ref:`index type `." +msgstr "Создание :ref:`индекса `." -msgid "type of index" -msgstr "тип индекса" +#, fuzzy +msgid "Type: string" +msgstr "string" -msgid "" -"string ('HASH' or 'TREE' or 'BITSET' or 'RTREE') Note re storage engine: " -"vinyl only supports 'TREE'" +msgid "Default: ``TREE``" msgstr "" -"string ('HASH', или 'TREE', или 'BITSET', или 'RTREE') Примечание про движок" -" базы данных: vinyl поддерживает только 'TREE'" -msgid "'TREE'" -msgstr "'TREE'" - -msgid "id" -msgstr "id" +msgid "Possible values: ``TREE``, ``HASH``, ``RTREE``, ``BITSET``" +msgstr "" -msgid "unique identifier" -msgstr "уникальный идентификатор" +msgid "" +"A unique numeric identifier of the index, which is generated automatically." +msgstr "" -msgid "number" +#, fuzzy +msgid "Type: number" msgstr "number" -msgid "last index's id, +1" +#, fuzzy +msgid "Default: last index's ID + 1" msgstr "идентификатор последнего индекса +1" -msgid "unique" -msgstr "unique" - -msgid "index is unique" -msgstr "индекс уникален" +msgid "" +"Specify whether an index may be unique. When ``true``, the index cannot " +"contain the same key value twice." +msgstr "" -msgid "boolean" +#, fuzzy +msgid "Type: boolean" msgstr "boolean" -msgid "``true``" +#, fuzzy +msgid "Default: ``true``" msgstr "``true``" -msgid "if_not_exists" -msgstr "if_not_exists" - -msgid "no error if duplicate name" -msgstr "ошибки нет, если имя дублируется" - -msgid "``false``" -msgstr "``false``" - -msgid "parts" -msgstr "parts" - -msgid "field-numbers + types" -msgstr "номера поля + типы" - msgid "" -"{field_no, ``'unsigned'`` or ``'string'`` or ``'integer'`` or ``'number'`` " -"or ``'double'`` or ``'decimal'`` or ``'boolean'`` or ``'varbinary'`` or " -"``'uuid'`` or ``'array'`` or ``'scalar'``, and optional collation or " -"is_nullable value or path}" -msgstr "" -"{field_no, ``'unsigned'``, или ``'string'``, или ``'integer'``, или " -"``'number'``, или ``'double'``, или ``'decimal'``, или ``'boolean'``, или " -"``'varbinary'``, или ``'uuid'``, или ``'array'``, или ``'scalar'``, и " -"дополнительная сортировка, или значение is_nullable, или путь}" - -msgid "``{1, 'unsigned'}``" -msgstr "``{1, 'unsigned'}``" - -msgid "dimension" -msgstr "dimension" - -msgid "affects :ref:`RTREE ` only" -msgstr "только для :ref:`RTREE `" - -msgid "2" -msgstr "2" - -msgid "distance" -msgstr "distance" - -msgid "affects RTREE only" -msgstr "только для RTREE" - -msgid "string ('euclid' or 'manhattan')" +"-- Create a non-unique secondary index --\n" +"box.space.bands:create_index('year', { parts = { { 'year' } }, unique = false })\n" msgstr "" -"строка ('euclid', то есть Евклидова метрика; или 'manhattan', то есть " -"расстояние городских кварталов)" - -msgid "'euclid'" -msgstr "'euclid'" - -msgid "bloom_fpr" -msgstr "bloom_fpr" - -msgid "affects vinyl only" -msgstr "только для vinyl" - -msgid "``vinyl_bloom_fpr``" -msgstr "``vinyl_bloom_fpr``" - -msgid "page_size" -msgstr "page_size" - -msgid "``vinyl_page_size``" -msgstr "``vinyl_page_size``" - -msgid "range_size" -msgstr "range_size" - -msgid "``vinyl_range_size``" -msgstr "``vinyl_range_size``" - -msgid "run_count_per_level" -msgstr "run_count_per_level" - -msgid "``vinyl_run_count_per_level``" -msgstr "``vinyl_run_count_per_level``" - -msgid "run_size_ratio" -msgstr "run_size_ratio" - -msgid "``vinyl_run_size_ratio``" -msgstr "``vinyl_run_size_ratio``" - -msgid "sequence" -msgstr "sequence" msgid "" -"see section regarding :ref:`specifying a sequence in create_index() " -"`" +"Specify whether to swallow an error on an attempt to create an index with a " +"duplicated name." msgstr "" -"см. раздел об :ref:`указании последовательности для create_index() " -"`" - -msgid "string or number" -msgstr "строка или число" - -msgid "not present" -msgstr "отсутствует" - -msgid "func" -msgstr "func" - -msgid ":ref:`functional index `" -msgstr ":ref:`функциональный индекс `" -msgid "string" -msgstr "string" - -msgid "hint (since version :doc:`2.6.1 `)" -msgstr "hint (с версии :doc:`2.6.1 `)" +#, fuzzy +msgid "Default: ``false``" +msgstr "``false``" -msgid "" -"affects TREE only. ``true`` makes an index work faster, ``false`` -- an " -"index size is reduced by half" +msgid "Specify the index's key parts." msgstr "" -"только для TREE. ``true`` заставит индекс работать быстрее, ``false`` — " -"размер индекса будет уменьшен наполовину" -msgid "" -"The options in the above chart are also applicable for " -":doc:`/reference/reference_lua/box_index/alter`." +msgid "Type: a table of :ref:`key_part ` values" msgstr "" -"Параметры из вышеприведенной таблицы также могут использоваться в " -":doc:`/reference/reference_lua/box_index/alter`." -msgid "" -"**Note re storage engine:** vinyl has extra options which by default are " -"based on configuration parameters :ref:`vinyl_bloom_fpr `, :ref:`vinyl_page_size `, " -":ref:`vinyl_range_size `, " -":ref:`vinyl_run_count_per_level `, " -"and :ref:`vinyl_run_size_ratio ` -- see " -"the description of those parameters. The current values can be seen by " -"selecting from :doc:`/reference/reference_lua/box_space/_index`." -msgstr "" -"**Примечание про движок базы данных:** в vinyl есть дополнительные " -"параметры, которые по умолчанию основаны на конфигурационных параметрах " -":ref:`vinyl_bloom_fpr `, :ref:`vinyl_page_size " -"`, :ref:`vinyl_range_size `, :ref:`vinyl_run_count_per_level ` и :ref:`vinyl_run_size_ratio `, см. описание этих параметров. Текущие значения можно" -" увидеть, сделав выборку из " -":doc:`/reference/reference_lua/box_space/_index`." - -msgid "**Example:**" -msgstr "**Пример:**" +#, fuzzy +msgid "Default: ``{1, ‘unsigned’}``" +msgstr "``{1, 'unsigned'}``" msgid "" -"tarantool> my_space = box.schema.space.create('tester')\n" -"---\n" -"...\n" -"tarantool> my_space:create_index('primary', {unique = true, parts = {\n" -" > {field = 1, type = 'unsigned'},\n" -" > {field = 2, type = 'string'}\n" -" > }})\n" -"---\n" -"- unique: true\n" -" parts:\n" -" - type: unsigned\n" -" is_nullable: false\n" -" fieldno: 1\n" -" - type: string\n" -" is_nullable: false\n" -" fieldno: 2\n" -" id: 0\n" -" space_id: 512\n" -" type: TREE\n" -" name: primary\n" -"..." +"-- Create a primary index --\n" +"box.space.bands:create_index('primary', { parts = { 'id' } })\n" +"\n" +"-- Create a unique secondary index --\n" +"box.space.bands:create_index('band', { parts = { 'band_name' } })\n" +"\n" +"-- Create a non-unique secondary index --\n" +"box.space.bands:create_index('year', { parts = { { 'year' } }, unique = false })\n" +"\n" +"-- Create a multi-part index --\n" +"box.space.bands:create_index('year_band', { parts = { { 'year' }, { 'band_name' } } })\n" msgstr "" -"tarantool> my_space = box.schema.space.create('tester')\n" -"---\n" -"...\n" -"tarantool> my_space:create_index('primary', {unique = true, parts = {\n" -" > {field = 1, type = 'unsigned'},\n" -" > {field = 2, type = 'string'}\n" -" > }})\n" -"---\n" -"- unique: true\n" -" parts:\n" -" - type: unsigned\n" -" is_nullable: false\n" -" fieldno: 1\n" -" - type: string\n" -" is_nullable: false\n" -" fieldno: 2\n" -" id: 0\n" -" space_id: 512\n" -" type: TREE\n" -" name: primary\n" -"..." msgid "**Alternative way to declare index parts**" msgstr "**Другой способ объявления оператора parts**" @@ -400,245 +236,191 @@ msgstr "" "-- без дополнительных фигурных скобок\n" "my_space:create_index('one_part_idx', {parts = {1, 'unsigned', is_nullable=true}})" -msgid "Details about index field types" -msgstr "Описание типов индексируемых полей" - -msgid "" -"Index field types differ depending on what values are allowed, and what " -"index types are allowed." +msgid "The RTREE index dimension." msgstr "" -"В зависимости от допустимых типов индексов и допустимых значений " -"используются различные типы индексируемых полей." - -msgid "Index field type" -msgstr "Тип поля для индексирования" -msgid "What can be in it" -msgstr "Чем может быть" +#, fuzzy +msgid "Default: 2" +msgstr "Значение по умолчанию" -msgid "Where it is legal" -msgstr "Где использовать" +msgid "The RTREE index distance type." +msgstr "" -msgid "Examples" -msgstr "Примеры" +msgid "Default: ``euclid``" +msgstr "" -msgid "``unsigned``" -msgstr "``unsigned``" +msgid "Possible values: ``euclid``, ``manhattan``" +msgstr "" +#, fuzzy msgid "" -"unsigned integers between 0 and 18446744073709551615, about 18 quintillion. " -"May also be called 'uint' or 'num', but 'num' is deprecated" +"Create a generator for indexes using a sequence object. Learn more from " +":ref:`specifying a sequence in create_index() `." msgstr "" -"беззнаковые целые числа от 0 до 18 446 744 073 709 551 615, то есть примерно" -" 18 квинтиллионов. Также может называться 'uint' или 'num', но 'num' " -"объявлен устаревшим" - -msgid "memtx TREE or HASH indexes;" -msgstr "индексы типа TREE или HASH в memtx;" +"см. раздел об :ref:`указании последовательности для create_index() " +"`" -msgid "vinyl TREE indexes" -msgstr "TREE-индексы в vinyl" +#, fuzzy +msgid "Type: string or number" +msgstr "строка или число" -msgid "123456" -msgstr "123456" +#, fuzzy +msgid "" +"Specify the identifier of the :ref:`functional index `" +" function." +msgstr ":ref:`функциональный индекс `" -msgid "``string``" -msgstr "``string``" +#, fuzzy +msgid "**Since:** :doc:`2.6.1 `" +msgstr "hint (с версии :doc:`2.6.1 `)" -msgid "" -"any set of octets, up to the :ref:`maximum length " -"`. May also be called 'str'. A string may " -"have a :ref:`collation `" +msgid "Specify whether hint optimization is enabled for the TREE index:" msgstr "" -"любая последовательность октетов до :ref:`максимальной длины " -"`. Также может называться 'str'. В строке " -"может быть :ref:`сортировка `" -msgid "memtx TREE or HASH or BITSET indexes;" -msgstr "индексы типа TREE, HASH или BITSET в memtx;" +msgid "If ``true``, the index works faster." +msgstr "" -msgid "'A B C'" -msgstr "'A B C'" +msgid "If ``false``, the index size is reduced by half." +msgstr "" -msgid "'\\\\65 \\\\66 \\\\67'" -msgstr "'\\\\65 \\\\66 \\\\67'" +#, fuzzy +msgid "**Vinyl only**" +msgstr "только для vinyl" -msgid "``varbinary``" -msgstr "``varbinary``" +msgid "Specify the bloom filter's false positive rate." +msgstr "" -msgid "" -"any set of octets, up to the :ref:`maximum length " -"`. A varbinary byte sequence does not have a" -" :ref:`collation ` because its contents are not UTF-8 " -"characters" +msgid "Default: :ref:`vinyl_bloom_fpr `" msgstr "" -"любая последовательность октетов до :ref:`максимальной длины " -"`. Последовательность байтов varbinary не " -"содержит символы UTF-8, поэтому в ней нет :ref:`сортировки `" -msgid "" -"memtx TREE, HASH or BITSET (since version :doc:`2.7.1 `) " -"indexes;" +msgid "Specify the size of a page used for read and write disk operations." msgstr "" -"индексы типа TREE, HASH или BITSET в memtx (начиная с версии :doc:`2.7.1 " -"`);" -msgid "``integer``" -msgstr "``integer``" +msgid "Default: :ref:`vinyl_page_size `" +msgstr "" -msgid "" -"integers between -9223372036854775808 and 18446744073709551615. May also be " -"called 'int'" +msgid "Specify the default maximum range size (in bytes) for a vinyl index." msgstr "" -"целые числа от -9 223 372 036 854 775 808 до 18 446 744 073 709 551 615. " -"Может также называться 'int'" -msgid "-2^63" -msgstr "-2^63" +msgid "Default: :ref:`vinyl_range_size `" +msgstr "" -msgid "``number``" -msgstr "``number``" +msgid "Specify the maximum number of runs per level in the LSM tree." +msgstr "" msgid "" -"integers between -9223372036854775808 and 18446744073709551615, single-" -"precision floating point numbers, or double-precision floating point " -"numbers, or exact numbers" +"Default: :ref:`vinyl_run_count_per_level `" msgstr "" -"целые числа от -9 223 372 036 854 775 808 до 18 446 744 073 709 551 615, " -"числа одинарной точности с плавающей запятой, числа двойной точности с " -"плавающей запятой или точные числа" - -msgid "1.234" -msgstr "1.234" - -msgid "-44" -msgstr "-44" - -msgid "1.447e+44" -msgstr "1.447e+44" - -msgid "``double``" -msgstr "``double``" - -msgid "double-precision floating point numbers" -msgstr "числа двойной точности с плавающей запятой" - -msgid "``boolean``" -msgstr "``boolean``" - -msgid "true or false" -msgstr "true или false" - -msgid "false" -msgstr "false" - -msgid "``decimal``" -msgstr "``decimal``" msgid "" -"exact number returned from a function in the :ref:`decimal ` module" +"Specify the ratio between the sizes of different levels in the LSM tree." msgstr "" -"точное число, которая возвращает функция из модуля :ref:`decimal `" - -msgid "decimal.new(1.2)" -msgstr "decimal.new(1.2)" - -msgid "``uuid`` (since :doc:`2.4.1 `)" -msgstr "``uuid`` (с версии :doc:`2.4.1 `)" msgid "" -"a 128-bit quantity sequence of lower-case hexadecimal digits, representing " -"Universally Unique Identifiers (UUID)" +"Default: :ref:`vinyl_run_size_ratio `" msgstr "" -"128-разрядная последовательность шестнадцатеричных чисел нижнего регистра, " -"которая представляет собой Универсальный уникальный идентификатор (UUID)" -msgid "uuid.fromstr('64d22e4d-ac92-4a23-899a-e59f34af5479')" -msgstr "uuid.fromstr('64d22e4d-ac92-4a23-899a-e59f34af5479')" +#, fuzzy +msgid "key_part" +msgstr "parts" -msgid "``array``" -msgstr "``array``" +msgid "" +"A descriptor of a single part in a multipart key. A table of parts is passed" +" to the :ref:`index_opts.parts ` option." +msgstr "" -msgid "array of numbers" -msgstr "массив чисел" +msgid "Specify the field number or name." +msgstr "" -msgid "memtx :ref:`RTREE ` indexes" -msgstr "индексы типа :ref:`RTREE ` в memtx" +msgid "" +"To create a key part by a field name, you need to specify " +":ref:`space_object:format() ` first." +msgstr "" -msgid "{10, 11}" -msgstr "{10, 11}" +#, fuzzy +msgid "" +"**Examples:** :ref:`Creating an index using field names and numbers " +"`" +msgstr "" +":ref:`Создание индекса с использованием имен полей вместо номеров полей " +"`" -msgid "{3, 5, 9, 10}" -msgstr "{3, 5, 9, 10}" +msgid "" +"Specify the field type. If the field type is specified in " +":ref:`space_object:format() `, ``key_part.type`` inherits " +"this value." +msgstr "" -msgid "``scalar``" +#, fuzzy +msgid "Default: ``scalar``" msgstr "``scalar``" msgid "" -"null (input with ``msgpack.NULL`` or ``yaml.NULL`` or ``json.NULL``), " -"booleans (true or false), or integers between -9223372036854775808 and " -"18446744073709551615, or single-precision floating point numbers, or double-" -"precision floating point numbers, or exact numbers, or strings, or " -"(varbinary) byte arrays, or uuids. When there is a mix of types, the key " -"order is: null, then booleans, then numbers, then strings, then byte arrays," -" then uuids." +"Possible values: listed in :ref:`Indexed field types `" msgstr "" -"null (вводится через ``msgpack.NULL``, ``yaml.NULL`` или ``json.NULL``), " -"логические значения (``true`` или ``false``), целые числа от −9 223 372 036 " -"854 775 808 до 18 446 744 073 709 551 615, числа одинарной и двойной " -"точности с плавающей запятой, точные числа, строки, байтовые массивы " -"(varbinary) или идентификаторы UUID. Если используется несколько типов, " -"порядок ключей следующий: null, логические значения, числа, строки, байтовые" -" массивы, идентификаторы UUID." - -msgid "null" -msgstr "null" - -msgid "true" -msgstr "true" -msgid "-1" -msgstr "-1" - -msgid "''" -msgstr "''" - -msgid "'ру'" -msgstr "'ру'" +msgid "" +"Specify the :ref:`collation ` used to compare field values." +" If the field collation is specified in :ref:`space_object:format() " +"`, ``key_part.collation`` inherits this value." +msgstr "" -msgid "``nil``" -msgstr "``nil``" +msgid "" +"Possible values: listed in the :ref:`box.space._collation ` system space" +msgstr "" msgid "" -"Additionally, `nil` is allowed with any index field type if " -":ref:`is_nullable=true ` is specified" +"-- Create a space --\n" +"box.schema.space.create('tester')\n" +"\n" +"-- Use the 'unicode' collation --\n" +"box.space.tester:create_index('unicode', { parts = { { field = 1,\n" +" type = 'string',\n" +" collation = 'unicode' } } })\n" +"\n" +"-- Use the 'unicode_ci' collation --\n" +"box.space.tester:create_index('unicode_ci', { parts = { { field = 1,\n" +" type = 'string',\n" +" collation = 'unicode_ci' } } })\n" +"\n" +"-- Insert test data --\n" +"box.space.tester:insert { 'ЕЛЕ' }\n" +"box.space.tester:insert { 'елейный' }\n" +"box.space.tester:insert { 'ёлка' }\n" +"\n" +"-- Returns nil --\n" +"select_unicode = box.space.tester.index.unicode:select({ 'ЁлКа' })\n" +"-- Returns 'ёлка' --\n" +"select_unicode_ci = box.space.tester.index.unicode_ci:select({ 'ЁлКа' })\n" msgstr "" -"Кроме того, допускается использовать `nil` с любым типом индексируемого " -"поля, если указать :ref:`is_nullable=true `" -msgid "Allowing null for an indexed key" -msgstr "Использование null в ключе индекса" +msgid "" +"Specify whether ``nil`` (or its equivalent such as ``msgpack.NULL``) can be " +"used as a field value. If the ``is_nullable`` option is specified in " +":ref:`space_object:format() `, ``key_part.is_nullable`` " +"inherits this value." +msgstr "" -msgid "is_nullable parts option" -msgstr "is_nullable в операторе parts" +msgid "You can set this option to ``true`` if:" +msgstr "" -msgid "" -"If the index type is TREE, and the index is not the primary index, then the " -"``parts={...}`` clause may include ``is_nullable=true`` or " -"``is_nullable=false`` (the default)." +msgid "the index type is TREE" msgstr "" -"Если тип индекса — TREE, а индекс не является первичным, то в оператор " -"``parts={...}`` можно включить ``is_nullable=true`` или " -"``is_nullable=false`` (по умолчанию)." +#, fuzzy +msgid "the index is not the primary index" +msgstr "Функциональные индексы не должны быть по первичному ключу." + +#, fuzzy msgid "" -"If ``is_nullable`` is true, then it is legal to insert ``nil`` or an " -"equivalent such as ``msgpack.NULL``. It is also legal to insert nothing at " -"all when using trailing nullable fields. Within indexes, such null values " -"are always treated as equal to other null values, and are always treated as " -"less than non-null values. Nulls may appear multiple times even in a unique " -"index. Example:" +"It is also legal to insert nothing at all when using trailing nullable " +"fields. Within indexes, such null values are always treated as equal to " +"other null values and are always treated as less than non-null values. Nulls" +" may appear multiple times even in a unique index." msgstr "" "Если ``is_nullable=true``, то можно вставить ``nil`` или его эквивалент, " "например ``msgpack.NULL``. Если завершающие поля допускают null, в них можно" @@ -647,6 +429,10 @@ msgstr "" "значения. Null может встречаться несколько раз даже в уникальном индексе. " "Пример:" +#, fuzzy +msgid "Default: false" +msgstr "Значение по умолчанию" + msgid "" "box.space.tester:create_index('I', {unique = true, parts = {{field = 2, type" " = 'number', is_nullable = true}}})" @@ -654,9 +440,10 @@ msgstr "" "box.space.tester:create_index('I', {unique = true, parts = {{field = 2, type" " = 'number', is_nullable = true}}})" +#, fuzzy msgid "" "It is legal to create multiple indexes for the same field with different " -"``is_nullable`` values, or to call " +"``is_nullable`` values or to call " ":doc:`/reference/reference_lua/box_space/format` with a different " "``is_nullable`` value from what is used for an index. When there is a " "contradiction, the rule is: null is illegal unless ``is_nullable=true`` for " @@ -669,23 +456,20 @@ msgstr "" " наличии несоответствий правило такое: запрещается использовать null, кроме " "случаев, когда ``is_nullable=true`` для всех индексов и формата спейса." -msgid "exclude_null parts option" -msgstr "exclude_null в операторе parts" +#, fuzzy +msgid "**Since:** :doc:`2.8.2 `" +msgstr "``uuid`` (с версии :doc:`2.4.1 `)" msgid "" -"Since version 2.8.2 an index part definition may include option " -"``exclude_null``, which allows an index to skip tuples with null at this " -"part." +"Specify whether an index can skip tuples with null at this key part. You can" +" set this option to ``true`` if:" msgstr "" -"Начиная с версии 2.8.2, при описании индекса можно указать параметр " -"``exclude_null``, чтобы индекс пропускал кортежи со значением null в этой " -"части." +#, fuzzy msgid "" -"By default, the option is set to ``false``. When ``exclude_null`` is turned " -"on, the ``is_nullable=true`` option will be set automatically. It can't be " -"used for the primary key. This option can be changed dynamically: in this " -"case the index is rebuilt." +"If ``exclude_null`` is set to ``true``, ``is_nullable`` is set to ``true`` " +"automatically. Note that this option can be changed dynamically. In this " +"case, the index is rebuilt." msgstr "" "Значение этого параметра по умолчанию — ``false``. Если включить " "``exclude_null``, то ``is_nullable=true`` будет указано автоматически. Для " @@ -699,86 +483,60 @@ msgstr "" "Такие индексы вообще не хранят отфильтрованные кортежи, поэтому " "индексирование будет выполняться быстрее." -msgid "" -"``exclude_null`` and ``is_nullable`` are connected, so this table describes " -"the result of combining them:" +msgid "Specify the path string for a map field." msgstr "" -"``exclude_null`` и ``is_nullable`` взаимосвязаны, поэтому ниже приводится " -"таблица допустимых сочетаний значений этих параметров:" - -msgid "**exclude_null/is_nullable**" -msgstr "**exclude_null/is_nullable**" -msgid "**false**" -msgstr "**false**" +msgid "See the examples below:" +msgstr "" -msgid "**true**" -msgstr "**true**" +#, fuzzy +msgid "" +":ref:`Creating an index using the path option for map fields `" +msgstr "" +":ref:`Создание индекса с использованием пути для полей с ассоциативными " +"массивами (индексы по пути JSON) `" -msgid "ok" -msgstr "допускается" +#, fuzzy +msgid "" +":ref:`Creating a multikey index using the path option with [*] `" +msgstr "" +":ref:`Создание индекса по массивам (multikey) с использованием опции path с " +"символом [*] `" -msgid "not allowed" -msgstr "не допускается" +msgid "Examples" +msgstr "Примеры" -msgid "Creating an index using field names instead of field numbers" +#, fuzzy +msgid "Creating an index using field names and numbers" msgstr "Создание индекса с использованием имен полей вместо номеров полей" +#, fuzzy msgid "" -"``create_index()`` can use field names and/or field types described by the " -"optional :doc:`/reference/reference_lua/box_space/format` clause." -msgstr "" -"``create_index()`` может использовать имена полей и / или номера полей, " -"которые описаны в необязательном операторе " -":doc:`/reference/reference_lua/box_space/format`." +"``create_index()`` can use field names or field numbers to define key parts." +msgstr "Создание индекса с использованием имен полей вместо номеров полей" -msgid "" -"In the following example, we show ``format()`` for a space that has two " -"columns named 'x' and 'y', and then we show five variations of the " -"``parts={}`` clause of ``create_index()``, first for the 'x' column, second " -"for both the 'x' and 'y' columns. The variations include omitting the type, " -"using numbers, and adding extra braces." +#, fuzzy +msgid "**Example 1 (field names):**" +msgstr "**Пример:**" + +msgid "**Example 2 (field numbers):**" msgstr "" -"В следующем примере мы покажем использование ``format()`` для спейса с двумя" -" столбцами 'x' и 'y', а затем — пять вариантов использования оператора " -"``parts={}`` в ``create_index()`` сначала для столбца 'x', затем для " -"столбцов 'x' и 'y'. Эти варианты включают в себя пропуск типа, использование" -" чисел и дополнительных скобок." msgid "" -"box.space.tester:format({{name = 'x', type = 'scalar'}, {name = 'y', type = 'integer'}})\n" -"\n" -"box.space.tester:create_index('I2', {parts = {{'x', 'scalar'}}})\n" -"box.space.tester:create_index('I3', {parts = {{'x', 'scalar'}, {'y', 'integer'}}})\n" +"-- Create a primary index --\n" +"box.space.bands:create_index('primary', { parts = { 1 } })\n" "\n" -"box.space.tester:create_index('I4', {parts = {{1, 'scalar'}}})\n" -"box.space.tester:create_index('I5', {parts = {{1, 'scalar'}, {2, 'integer'}}})\n" +"-- Create a unique secondary index --\n" +"box.space.bands:create_index('band', { parts = { 2 } })\n" "\n" -"box.space.tester:create_index('I6', {parts = {1}})\n" -"box.space.tester:create_index('I7', {parts = {1, 2}})\n" +"-- Create a non-unique secondary index --\n" +"box.space.bands:create_index('year', { parts = { { 3 } }, unique = false })\n" "\n" -"box.space.tester:create_index('I8', {parts = {'x'}})\n" -"box.space.tester:create_index('I9', {parts = {'x', 'y'}})\n" -"\n" -"box.space.tester:create_index('I10', {parts = {{'x'}}})\n" -"box.space.tester:create_index('I11', {parts = {{'x'}, {'y'}}})" +"-- Create a multi-part index --\n" +"box.space.bands:create_index('year_band', { parts = { 3, 2 } })\n" msgstr "" -"box.space.tester:format({{name = 'x', type = 'scalar'}, {name = 'y', type = 'integer'}})\n" -"\n" -"box.space.tester:create_index('I2', {parts = {{'x', 'scalar'}}})\n" -"box.space.tester:create_index('I3', {parts = {{'x', 'scalar'}, {'y', 'integer'}}})\n" -"\n" -"box.space.tester:create_index('I4', {parts = {{1, 'scalar'}}})\n" -"box.space.tester:create_index('I5', {parts = {{1, 'scalar'}, {2, 'integer'}}})\n" -"\n" -"box.space.tester:create_index('I6', {parts = {1}})\n" -"box.space.tester:create_index('I7', {parts = {1, 2}})\n" -"\n" -"box.space.tester:create_index('I8', {parts = {'x'}})\n" -"box.space.tester:create_index('I9', {parts = {'x', 'y'}})\n" -"\n" -"box.space.tester:create_index('I10', {parts = {{'x'}}})\n" -"box.space.tester:create_index('I11', {parts = {{'x'}, {'y'}}})" msgid "" "Creating an index using the path option for map fields (JSON-path indexes)" @@ -811,13 +569,14 @@ msgstr "" msgid "**Example 1 -- The simplest use of path:**" msgstr "**Пример 1 — Простое использование пути:**" +#, fuzzy msgid "" -"tarantool> box.schema.space.create('T')\n" -"tarantool> box.space.T:create_index('I',{parts = {{field = 1, type = 'scalar', path = 'age'}}})\n" -"tarantool> box.space.T:insert({{age = 44}})\n" -"tarantool> box.space.T:select(44)\n" -"---\n" -"- [{'age': 44}]" +"box.schema.space.create('space1')\n" +"box.space.space1:create_index('primary', { parts = { { field = 1,\n" +" type = 'scalar',\n" +" path = 'age' } } })\n" +"box.space.space1:insert({ { age = 44 } })\n" +"box.space.space1:select(44)\n" msgstr "" "tarantool> box.schema.space.create('T')\n" "tarantool> box.space.T:create_index('I',{parts = {{field = 1, type = 'scalar', path = 'age'}}})\n" @@ -832,30 +591,13 @@ msgstr "" "JSON-синтаксисом:**" msgid "" -"tarantool> my_space = box.schema.space.create('T')\n" -"tarantool> format = {{'id', 'unsigned'}, {'data', 'map'}}\n" -"tarantool> my_space:format(format)\n" -"tarantool> parts = {{'data.FIO[\"firstname\"]', 'str'}, {'data.FIO[\"surname\"]', 'str'}}\n" -"tarantool> my_index = my_space:create_index('info', {parts = parts})\n" -"tarantool> my_space:insert({1, {FIO = {firstname = 'Ahmed', surname = 'Xi'}}})\n" -"---\n" -"- [1, {'FIO': {'surname': 'Xi', 'firstname': 'Ahmed'}}]" -msgstr "" -"tarantool> my_space = box.schema.space.create('T')\n" -"tarantool> format = {{'id', 'unsigned'}, {'data', 'map'}}\n" -"tarantool> my_space:format(format)\n" -"tarantool> parts = {{'data.FIO[\"firstname\"]', 'str'}, {'data.FIO[\"surname\"]', 'str'}}\n" -"tarantool> my_index = my_space:create_index('info', {parts = parts})\n" -"tarantool> my_space:insert({1, {FIO = {firstname = 'Ahmed', surname = 'Xi'}}})\n" -"---\n" -"- [1, {'FIO': {'surname': 'Xi', 'firstname': 'Ahmed'}}]" - -msgid "" -"**Note re storage engine:** vinyl supports only the TREE index type, and " -"vinyl secondary indexes must be created before tuples are inserted." +"box.schema.space.create('space2')\n" +"box.space.space2:format({ { 'id', 'unsigned' }, { 'data', 'map' } })\n" +"box.space.space2:create_index('info', { parts = { { 'data.full_name[\"firstname\"]', 'str' },\n" +" { 'data.full_name[\"surname\"]', 'str' } } })\n" +"box.space.space2:insert({ 1, { full_name = { firstname = 'John', surname = 'Doe' } } })\n" +"box.space.space2:select { 'John' }\n" msgstr "" -"**Примечание про движок базы данных:** vinyl поддерживает только TREE-" -"индексы, и следует создать в vinyl'е вторичные индексы до вставки кортежей." msgid "Creating a multikey index using the path option with [*]" msgstr "" @@ -890,10 +632,11 @@ msgstr "" "Тогда кортежи с именами можно быстро получить с помощью " "``index_object:select({key-value})``." +#, fuzzy msgid "" -"In fact a single field can have multiple keys, as in this example which " -"retrieves the same tuple twice because there are two keys 'A' and 'B' which " -"both match the request:" +"A single field can have multiple keys, as in this example which retrieves " +"the same tuple twice because there are two keys 'A' and 'B' which both match" +" the request:" msgstr "" "На самом деле в одном поле может быть несколько ключей, как в примере ниже, " "который выводит один и тот же кортеж дважды, потому что оба ключа 'A' и 'B' " @@ -934,7 +677,8 @@ msgstr "" "- [1, {'data': [{'name': 'A'}, {'name': 'B'}], 'extra_field': 1}]\n" "..." -msgid "Some restrictions exist:" +#, fuzzy +msgid "The following restrictions exist:" msgstr "Есть некоторые ограничения:" msgid "``[*]`` must be alone or must be at the end of a name in the path." @@ -970,12 +714,13 @@ msgstr "" "определении пути, или значение поля должно быть nil (nil не индексируется)." msgid "" -"In a space with multikey indexes, any tuple cannot contain " -":ref:`more than ~8,000 elements ` indexed that way." +"In a space with multikey indexes, any tuple cannot contain :ref:`more than " +"~8,000 elements ` indexed that " +"way." msgstr "" -"В спейсе с индексами по массивам можно хранить не более " -":ref:`~8000 элементов `, " -"проиндексированных таким образом." +"В спейсе с индексами по массивам можно хранить не более :ref:`~8000 " +"элементов `, проиндексированных " +"таким образом." msgid "Creating a functional index" msgstr "Создание функционального индекса" @@ -995,19 +740,21 @@ msgstr "" msgid "There are several recommendations for building functional indexes:" msgstr "Ниже приведены рекомендации по созданию функциональных индексов:" +#, fuzzy msgid "" "The function definition must expect a tuple, which has the contents of " -"fields at the time a data-change request happens and must return a tuple, " -"which has the contents that will actually be put in the index." +"fields at the time a data-change request happens, and must return a tuple, " +"which has the contents that will be put in the index." msgstr "" "Функция должна принимать кортеж с содержимым полей на момент запроса на " "изменение данных и возвращать кортеж с содержимым, которое будет фактически " "помещено в индекс." +#, fuzzy msgid "" -"The ``create_index`` definition must include specification of all key parts," -" and the custom function must return a table which has the same number of " -"key parts with the same types." +"The ``create_index`` definition must include the specification of all key " +"parts, and the custom function must return a table that has the same number " +"of key parts with the same types." msgstr "" "Описание ``create_index`` должно включать в себя определение всех частей " "ключа, а пользовательская функция должна возвращать таблицу, которая " @@ -1062,53 +809,61 @@ msgstr "" "Создайте спейс. В спейсе должно быть поле с первичным ключом, которое не " "будет полем для функционального индекса:" +#, fuzzy msgid "" -"box.schema.space.create('tester', {engine = 'memtx'})\n" -"box.space.tester:create_index('i',{parts={{field = 1, type = 'string'}}})" +"box.schema.space.create('tester')\n" +"box.space.tester:create_index('i', { parts = { { field = 1, type = 'string' } } })\n" msgstr "" "box.schema.space.create('tester', {engine = 'memtx'})\n" "box.space.tester:create_index('i',{parts={{field = 1, type = 'string'}}})" msgid "" -"Create a function. The function expects a tuple. In this example, it will work " -"on tuple[2] because the key source is field number 2 in what we will insert." -" Use ``string.sub()`` from the ``string`` module to get the first character:" +"Create a function. The function expects a tuple. In this example, it will " +"work on tuple[2] because the key source is field number 2 in what we will " +"insert. Use ``string.sub()`` from the ``string`` module to get the first " +"character:" msgstr "" "Создайте функцию. Функция принимает кортеж. В этом примере она работает на " "кортеже tuple[2], поскольку источник ключа — поле номер 2, в которое мы " "вставляем данные. Используйте ``string.sub()`` из модуля ``string``, чтобы " "получить первый символ:" -msgid "lua_code = [[function(tuple) return {string.sub(tuple[2],1,1)} end]]" +#, fuzzy +msgid "" +"function_code = [[function(tuple) return {string.sub(tuple[2],1,1)} end]]\n" msgstr "lua_code = [[function(tuple) return {string.sub(tuple[2],1,1)} end]]" msgid "" "Make the function persistent using the ``box.schema.func.create`` function:" msgstr "Сделайте функцию персистентной с помощью ``box.schema.create``:" +#, fuzzy msgid "" "box.schema.func.create('my_func',\n" -" {body = lua_code, is_deterministic = true, is_sandboxed = true})" +" { body = function_code, is_deterministic = true, is_sandboxed = true })\n" msgstr "" "box.schema.func.create('my_func',\n" " {body = lua_code, is_deterministic = true, is_sandboxed = true})" +#, fuzzy msgid "" -"Make a functional index. Specify the fields whose values will be passed to " -"the function. Specify the function:" +"Create a functional index. Specify the fields whose values will be passed to" +" the function. Specify the function:" msgstr "" "Создайте функциональный индекс. Укажите поля, значения которых будут " "передаваться в функцию. Укажите функцию:" +#, fuzzy msgid "" -"box.space.tester:create_index('func_idx',{parts={{field = 1, type = " -"'string'}},func = 'my_func'})" +"box.space.tester:create_index('func_index', { parts = { { field = 1, type = 'string' } },\n" +" func = 'my_func' })\n" msgstr "" "box.space.tester:create_index('func_idx',{parts={{field = 1, type = " "'string'}},func = 'my_func'})" +#, fuzzy msgid "" -"Test. Insert a few tuples. Select using only the first letter, it will work " +"Insert a few tuples. Select using only the first letter, it will work " "because that is the key. Or, select using the same function as was used for " "insertion:" msgstr "" @@ -1116,11 +871,12 @@ msgstr "" "используя только первую букву, — сработает, потому что это и есть ключ. Или " "выберите, используя ту же функцию, что была использована для вставки:" +#, fuzzy msgid "" -"box.space.tester:insert({'a', 'wombat'})\n" -"box.space.tester:insert({'b', 'rabbit'})\n" -"box.space.tester.index.func_idx:select('w')\n" -"box.space.tester.index.func_idx:select(box.func.my_func:call({{'tester', 'wombat'}}));" +"box.space.tester:insert({ 'a', 'wombat' })\n" +"box.space.tester:insert({ 'b', 'rabbit' })\n" +"box.space.tester.index.func_index:select('w')\n" +"box.space.tester.index.func_index:select(box.func.my_func:call({ { 'tester', 'wombat' } }))\n" msgstr "" "box.space.tester:insert({'a', 'wombat'})\n" "box.space.tester:insert({'b', 'rabbit'})\n" @@ -1130,12 +886,13 @@ msgstr "" msgid "The results of the two ``select`` requests will look like this:" msgstr "Результаты двух запросов ``select`` будут выглядеть так:" +#, fuzzy msgid "" -"tarantool> box.space.tester.index.func_idx:select('w')\n" +"tarantool> box.space.tester.index.func_index:select('w')\n" "---\n" "- - ['a', 'wombat']\n" "...\n" -"tarantool> box.space.tester.index.func_idx:select(box.func.my_func:call({{'tester','wombat'}}));\n" +"tarantool> box.space.tester.index.func_index:select(box.func.my_func:call({{'tester','wombat'}}));\n" "---\n" "- - ['a', 'wombat']\n" "..." @@ -1152,17 +909,19 @@ msgstr "" msgid "Here is the full code of the example:" msgstr "Вот пример кода полностью:" +#, fuzzy msgid "" -"box.schema.space.create('tester', {engine = 'memtx'})\n" -"box.space.tester:create_index('i',{parts={{field = 1, type = 'string'}}})\n" -"lua_code = [[function(tuple) return {string.sub(tuple[2],1,1)} end]]\n" +"box.schema.space.create('tester')\n" +"box.space.tester:create_index('i', { parts = { { field = 1, type = 'string' } } })\n" +"function_code = [[function(tuple) return {string.sub(tuple[2],1,1)} end]]\n" "box.schema.func.create('my_func',\n" -" {body = lua_code, is_deterministic = true, is_sandboxed = true})\n" -"box.space.tester:create_index('func_idx',{parts={{field = 1, type = 'string'}},func = 'my_func'})\n" -"box.space.tester:insert({'a', 'wombat'})\n" -"box.space.tester:insert({'b', 'rabbit'})\n" -"box.space.tester.index.func_idx:select('w')\n" -"box.space.tester.index.func_idx:select(box.func.my_func:call({{'tester', 'wombat'}}));" +" { body = function_code, is_deterministic = true, is_sandboxed = true })\n" +"box.space.tester:create_index('func_index', { parts = { { field = 1, type = 'string' } },\n" +" func = 'my_func' })\n" +"box.space.tester:insert({ 'a', 'wombat' })\n" +"box.space.tester:insert({ 'b', 'rabbit' })\n" +"box.space.tester.index.func_index:select('w')\n" +"box.space.tester.index.func_index:select(box.func.my_func:call({ { 'tester', 'wombat' } }))\n" msgstr "" "box.schema.space.create('tester', {engine = 'memtx'})\n" "box.space.tester:create_index('i',{parts={{field = 1, type = 'string'}}})\n" @@ -1182,41 +941,43 @@ msgstr "" "Функции для функциональных индексов могут возвращать **множество ключей**. " "Такие функции называют \"мультиключевыми\" (multikey)." +#, fuzzy msgid "" -"The ``box.func.create`` options must include ``opts = {is_multikey = " -"true}``. The return value must be a table of tuples. If a multikey function " -"returns N tuples, then N keys will be added to the index." +"To create a multikey function, the options of ``box.schema.func.create()`` " +"must include ``is_multikey = true``. The return value must be a table of " +"tuples. If a multikey function returns N tuples, then N keys will be added " +"to the index." msgstr "" "В таком случае в ``box.func.create`` надо включить ``opts = {is_multikey = " "true}``. Возвращается таблица с кортежами. Если мультиключевая функция " "возвращает N кортежей, то в индекс добавятся N ключей." -msgid "" -"s = box.schema.space.create('withdata')\n" -"s:format({{name = 'name', type = 'string'},\n" -" {name = 'address', type = 'string'}})\n" -"pk = s:create_index('name', {parts = {{field = 1, type = 'string'}}})\n" -"lua_code = [[function(tuple)\n" -" local address = string.split(tuple[2])\n" -" local ret = {}\n" -" for _, v in pairs(address) do\n" -" table.insert(ret, {utf8.upper(v)})\n" -" end\n" -" return ret\n" -" end]]\n" +#, fuzzy +msgid "" +"tester = box.schema.space.create('withdata')\n" +"tester:format({ { name = 'name', type = 'string' },\n" +" { name = 'address', type = 'string' } })\n" +"name_index = tester:create_index('name', { parts = { { field = 1, type = 'string' } } })\n" +"function_code = [[function(tuple)\n" +" local address = string.split(tuple[2])\n" +" local ret = {}\n" +" for _, v in pairs(address) do\n" +" table.insert(ret, {utf8.upper(v)})\n" +" end\n" +" return ret\n" +" end]]\n" "box.schema.func.create('address',\n" -" {body = lua_code,\n" -" is_deterministic = true,\n" -" is_sandboxed = true,\n" -" opts = {is_multikey = true}})\n" -"idx = s:create_index('addr', {unique = false,\n" -" func = 'address',\n" -" parts = {{field = 1, type = 'string',\n" -" collation = 'unicode_ci'}}})\n" -"s:insert({\"James\", \"SIS Building Lambeth London UK\"})\n" -"s:insert({\"Sherlock\", \"221B Baker St Marylebone London NW1 6XE UK\"})\n" -"idx:select('Uk')\n" -"-- Both tuples will be returned." +" { body = function_code,\n" +" is_deterministic = true,\n" +" is_sandboxed = true,\n" +" is_multikey = true })\n" +"addr_index = tester:create_index('addr', { unique = false,\n" +" func = 'address',\n" +" parts = { { field = 1, type = 'string',\n" +" collation = 'unicode_ci' } } })\n" +"tester:insert({ \"James\", \"SIS Building Lambeth London UK\" })\n" +"tester:insert({ \"Sherlock\", \"221B Baker St Marylebone London NW1 6XE UK\" })\n" +"addr_index:select('Uk')\n" msgstr "" "s = box.schema.space.create('withdata')\n" "s:format({{name = 'name', type = 'string'},\n" @@ -1243,3 +1004,557 @@ msgstr "" "s:insert({\"Sherlock\", \"221B Baker St Marylebone London NW1 6XE UK\"})\n" "idx:select('Uk')\n" "-- Вернутся оба кортежа." + +#~ msgid "On this page:" +#~ msgstr "На этой странице:" + +#~ msgid ":ref:`create_index() description `" +#~ msgstr ":ref:`Описание create_index() `" + +#~ msgid "" +#~ ":ref:`Details about index field types `" +#~ msgstr "" +#~ ":ref:`Описание типов индексируемых полей `" + +#~ msgid ":ref:`Allowing null for an indexed key `" +#~ msgstr "" +#~ ":ref:`Использование null для индексируемого ключа `" + +#~ msgid ":ref:`Creating a functional index `" +#~ msgstr ":ref:`Создание функционального индекса `" + +#~ msgid "see \"Options for space_object:create_index()\", below" +#~ msgstr "см. \"Параметры для space_object:create_index()\" ниже" + +#~ msgid "**Options for space_object:create_index()**" +#~ msgstr "**Параметры для space_object:create_index()**" + +#~ msgid "Name" +#~ msgstr "Имя" + +#~ msgid "Effect" +#~ msgstr "Описание" + +#~ msgid "Type" +#~ msgstr "Тип" + +#~ msgid "type" +#~ msgstr "type" + +#~ msgid "type of index" +#~ msgstr "тип индекса" + +#~ msgid "" +#~ "string ('HASH' or 'TREE' or 'BITSET' or 'RTREE') Note re storage engine: " +#~ "vinyl only supports 'TREE'" +#~ msgstr "" +#~ "string ('HASH', или 'TREE', или 'BITSET', или 'RTREE') Примечание про движок" +#~ " базы данных: vinyl поддерживает только 'TREE'" + +#~ msgid "'TREE'" +#~ msgstr "'TREE'" + +#~ msgid "id" +#~ msgstr "id" + +#~ msgid "unique identifier" +#~ msgstr "уникальный идентификатор" + +#~ msgid "unique" +#~ msgstr "unique" + +#~ msgid "index is unique" +#~ msgstr "индекс уникален" + +#~ msgid "if_not_exists" +#~ msgstr "if_not_exists" + +#~ msgid "no error if duplicate name" +#~ msgstr "ошибки нет, если имя дублируется" + +#~ msgid "field-numbers + types" +#~ msgstr "номера поля + типы" + +#~ msgid "" +#~ "{field_no, ``'unsigned'`` or ``'string'`` or ``'integer'`` or ``'number'`` " +#~ "or ``'double'`` or ``'decimal'`` or ``'boolean'`` or ``'varbinary'`` or " +#~ "``'uuid'`` or ``'array'`` or ``'scalar'``, and optional collation or " +#~ "is_nullable value or path}" +#~ msgstr "" +#~ "{field_no, ``'unsigned'``, или ``'string'``, или ``'integer'``, или " +#~ "``'number'``, или ``'double'``, или ``'decimal'``, или ``'boolean'``, или " +#~ "``'varbinary'``, или ``'uuid'``, или ``'array'``, или ``'scalar'``, и " +#~ "дополнительная сортировка, или значение is_nullable, или путь}" + +#~ msgid "dimension" +#~ msgstr "dimension" + +#~ msgid "affects :ref:`RTREE ` only" +#~ msgstr "только для :ref:`RTREE `" + +#~ msgid "2" +#~ msgstr "2" + +#~ msgid "distance" +#~ msgstr "distance" + +#~ msgid "affects RTREE only" +#~ msgstr "только для RTREE" + +#~ msgid "string ('euclid' or 'manhattan')" +#~ msgstr "" +#~ "строка ('euclid', то есть Евклидова метрика; или 'manhattan', то есть " +#~ "расстояние городских кварталов)" + +#~ msgid "'euclid'" +#~ msgstr "'euclid'" + +#~ msgid "bloom_fpr" +#~ msgstr "bloom_fpr" + +#~ msgid "``vinyl_bloom_fpr``" +#~ msgstr "``vinyl_bloom_fpr``" + +#~ msgid "page_size" +#~ msgstr "page_size" + +#~ msgid "``vinyl_page_size``" +#~ msgstr "``vinyl_page_size``" + +#~ msgid "range_size" +#~ msgstr "range_size" + +#~ msgid "``vinyl_range_size``" +#~ msgstr "``vinyl_range_size``" + +#~ msgid "run_count_per_level" +#~ msgstr "run_count_per_level" + +#~ msgid "``vinyl_run_count_per_level``" +#~ msgstr "``vinyl_run_count_per_level``" + +#~ msgid "run_size_ratio" +#~ msgstr "run_size_ratio" + +#~ msgid "``vinyl_run_size_ratio``" +#~ msgstr "``vinyl_run_size_ratio``" + +#~ msgid "sequence" +#~ msgstr "sequence" + +#~ msgid "not present" +#~ msgstr "отсутствует" + +#~ msgid "func" +#~ msgstr "func" + +#~ msgid "" +#~ "affects TREE only. ``true`` makes an index work faster, ``false`` -- an " +#~ "index size is reduced by half" +#~ msgstr "" +#~ "только для TREE. ``true`` заставит индекс работать быстрее, ``false`` — " +#~ "размер индекса будет уменьшен наполовину" + +#~ msgid "" +#~ "**Note re storage engine:** vinyl has extra options which by default are " +#~ "based on configuration parameters :ref:`vinyl_bloom_fpr `, :ref:`vinyl_page_size `, " +#~ ":ref:`vinyl_range_size `, " +#~ ":ref:`vinyl_run_count_per_level `, " +#~ "and :ref:`vinyl_run_size_ratio ` -- see " +#~ "the description of those parameters. The current values can be seen by " +#~ "selecting from :doc:`/reference/reference_lua/box_space/_index`." +#~ msgstr "" +#~ "**Примечание про движок базы данных:** в vinyl есть дополнительные " +#~ "параметры, которые по умолчанию основаны на конфигурационных параметрах " +#~ ":ref:`vinyl_bloom_fpr `, :ref:`vinyl_page_size " +#~ "`, :ref:`vinyl_range_size `, :ref:`vinyl_run_count_per_level ` и :ref:`vinyl_run_size_ratio `, см. описание этих параметров. Текущие значения можно" +#~ " увидеть, сделав выборку из " +#~ ":doc:`/reference/reference_lua/box_space/_index`." + +#~ msgid "" +#~ "tarantool> my_space = box.schema.space.create('tester')\n" +#~ "---\n" +#~ "...\n" +#~ "tarantool> my_space:create_index('primary', {unique = true, parts = {\n" +#~ " > {field = 1, type = 'unsigned'},\n" +#~ " > {field = 2, type = 'string'}\n" +#~ " > }})\n" +#~ "---\n" +#~ "- unique: true\n" +#~ " parts:\n" +#~ " - type: unsigned\n" +#~ " is_nullable: false\n" +#~ " fieldno: 1\n" +#~ " - type: string\n" +#~ " is_nullable: false\n" +#~ " fieldno: 2\n" +#~ " id: 0\n" +#~ " space_id: 512\n" +#~ " type: TREE\n" +#~ " name: primary\n" +#~ "..." +#~ msgstr "" +#~ "tarantool> my_space = box.schema.space.create('tester')\n" +#~ "---\n" +#~ "...\n" +#~ "tarantool> my_space:create_index('primary', {unique = true, parts = {\n" +#~ " > {field = 1, type = 'unsigned'},\n" +#~ " > {field = 2, type = 'string'}\n" +#~ " > }})\n" +#~ "---\n" +#~ "- unique: true\n" +#~ " parts:\n" +#~ " - type: unsigned\n" +#~ " is_nullable: false\n" +#~ " fieldno: 1\n" +#~ " - type: string\n" +#~ " is_nullable: false\n" +#~ " fieldno: 2\n" +#~ " id: 0\n" +#~ " space_id: 512\n" +#~ " type: TREE\n" +#~ " name: primary\n" +#~ "..." + +#~ msgid "Details about index field types" +#~ msgstr "Описание типов индексируемых полей" + +#~ msgid "" +#~ "Index field types differ depending on what values are allowed, and what " +#~ "index types are allowed." +#~ msgstr "" +#~ "В зависимости от допустимых типов индексов и допустимых значений " +#~ "используются различные типы индексируемых полей." + +#~ msgid "Index field type" +#~ msgstr "Тип поля для индексирования" + +#~ msgid "What can be in it" +#~ msgstr "Чем может быть" + +#~ msgid "Where it is legal" +#~ msgstr "Где использовать" + +#~ msgid "``unsigned``" +#~ msgstr "``unsigned``" + +#~ msgid "" +#~ "unsigned integers between 0 and 18446744073709551615, about 18 quintillion. " +#~ "May also be called 'uint' or 'num', but 'num' is deprecated" +#~ msgstr "" +#~ "беззнаковые целые числа от 0 до 18 446 744 073 709 551 615, то есть примерно" +#~ " 18 квинтиллионов. Также может называться 'uint' или 'num', но 'num' " +#~ "объявлен устаревшим" + +#~ msgid "memtx TREE or HASH indexes;" +#~ msgstr "индексы типа TREE или HASH в memtx;" + +#~ msgid "vinyl TREE indexes" +#~ msgstr "TREE-индексы в vinyl" + +#~ msgid "123456" +#~ msgstr "123456" + +#~ msgid "``string``" +#~ msgstr "``string``" + +#~ msgid "" +#~ "any set of octets, up to the :ref:`maximum length " +#~ "`. May also be called 'str'. A string may " +#~ "have a :ref:`collation `" +#~ msgstr "" +#~ "любая последовательность октетов до :ref:`максимальной длины " +#~ "`. Также может называться 'str'. В строке " +#~ "может быть :ref:`сортировка `" + +#~ msgid "memtx TREE or HASH or BITSET indexes;" +#~ msgstr "индексы типа TREE, HASH или BITSET в memtx;" + +#~ msgid "'A B C'" +#~ msgstr "'A B C'" + +#~ msgid "'\\\\65 \\\\66 \\\\67'" +#~ msgstr "'\\\\65 \\\\66 \\\\67'" + +#~ msgid "``varbinary``" +#~ msgstr "``varbinary``" + +#~ msgid "" +#~ "any set of octets, up to the :ref:`maximum length " +#~ "`. A varbinary byte sequence does not have a" +#~ " :ref:`collation ` because its contents are not UTF-8 " +#~ "characters" +#~ msgstr "" +#~ "любая последовательность октетов до :ref:`максимальной длины " +#~ "`. Последовательность байтов varbinary не " +#~ "содержит символы UTF-8, поэтому в ней нет :ref:`сортировки `" + +#~ msgid "" +#~ "memtx TREE, HASH or BITSET (since version :doc:`2.7.1 `) " +#~ "indexes;" +#~ msgstr "" +#~ "индексы типа TREE, HASH или BITSET в memtx (начиная с версии :doc:`2.7.1 " +#~ "`);" + +#~ msgid "``integer``" +#~ msgstr "``integer``" + +#~ msgid "" +#~ "integers between -9223372036854775808 and 18446744073709551615. May also be " +#~ "called 'int'" +#~ msgstr "" +#~ "целые числа от -9 223 372 036 854 775 808 до 18 446 744 073 709 551 615. " +#~ "Может также называться 'int'" + +#~ msgid "-2^63" +#~ msgstr "-2^63" + +#~ msgid "``number``" +#~ msgstr "``number``" + +#~ msgid "" +#~ "integers between -9223372036854775808 and 18446744073709551615, single-" +#~ "precision floating point numbers, or double-precision floating point " +#~ "numbers, or exact numbers" +#~ msgstr "" +#~ "целые числа от -9 223 372 036 854 775 808 до 18 446 744 073 709 551 615, " +#~ "числа одинарной точности с плавающей запятой, числа двойной точности с " +#~ "плавающей запятой или точные числа" + +#~ msgid "1.234" +#~ msgstr "1.234" + +#~ msgid "-44" +#~ msgstr "-44" + +#~ msgid "1.447e+44" +#~ msgstr "1.447e+44" + +#~ msgid "``double``" +#~ msgstr "``double``" + +#~ msgid "double-precision floating point numbers" +#~ msgstr "числа двойной точности с плавающей запятой" + +#~ msgid "``boolean``" +#~ msgstr "``boolean``" + +#~ msgid "true or false" +#~ msgstr "true или false" + +#~ msgid "false" +#~ msgstr "false" + +#~ msgid "``decimal``" +#~ msgstr "``decimal``" + +#~ msgid "" +#~ "exact number returned from a function in the :ref:`decimal ` module" +#~ msgstr "" +#~ "точное число, которая возвращает функция из модуля :ref:`decimal `" + +#~ msgid "decimal.new(1.2)" +#~ msgstr "decimal.new(1.2)" + +#~ msgid "" +#~ "a 128-bit quantity sequence of lower-case hexadecimal digits, representing " +#~ "Universally Unique Identifiers (UUID)" +#~ msgstr "" +#~ "128-разрядная последовательность шестнадцатеричных чисел нижнего регистра, " +#~ "которая представляет собой Универсальный уникальный идентификатор (UUID)" + +#~ msgid "uuid.fromstr('64d22e4d-ac92-4a23-899a-e59f34af5479')" +#~ msgstr "uuid.fromstr('64d22e4d-ac92-4a23-899a-e59f34af5479')" + +#~ msgid "``array``" +#~ msgstr "``array``" + +#~ msgid "array of numbers" +#~ msgstr "массив чисел" + +#~ msgid "memtx :ref:`RTREE ` indexes" +#~ msgstr "индексы типа :ref:`RTREE ` в memtx" + +#~ msgid "{10, 11}" +#~ msgstr "{10, 11}" + +#~ msgid "{3, 5, 9, 10}" +#~ msgstr "{3, 5, 9, 10}" + +#~ msgid "" +#~ "null (input with ``msgpack.NULL`` or ``yaml.NULL`` or ``json.NULL``), " +#~ "booleans (true or false), or integers between -9223372036854775808 and " +#~ "18446744073709551615, or single-precision floating point numbers, or double-" +#~ "precision floating point numbers, or exact numbers, or strings, or " +#~ "(varbinary) byte arrays, or uuids. When there is a mix of types, the key " +#~ "order is: null, then booleans, then numbers, then strings, then byte arrays," +#~ " then uuids." +#~ msgstr "" +#~ "null (вводится через ``msgpack.NULL``, ``yaml.NULL`` или ``json.NULL``), " +#~ "логические значения (``true`` или ``false``), целые числа от −9 223 372 036 " +#~ "854 775 808 до 18 446 744 073 709 551 615, числа одинарной и двойной " +#~ "точности с плавающей запятой, точные числа, строки, байтовые массивы " +#~ "(varbinary) или идентификаторы UUID. Если используется несколько типов, " +#~ "порядок ключей следующий: null, логические значения, числа, строки, байтовые" +#~ " массивы, идентификаторы UUID." + +#~ msgid "null" +#~ msgstr "null" + +#~ msgid "true" +#~ msgstr "true" + +#~ msgid "-1" +#~ msgstr "-1" + +#~ msgid "''" +#~ msgstr "''" + +#~ msgid "'ру'" +#~ msgstr "'ру'" + +#~ msgid "``nil``" +#~ msgstr "``nil``" + +#~ msgid "" +#~ "Additionally, `nil` is allowed with any index field type if " +#~ ":ref:`is_nullable=true ` is specified" +#~ msgstr "" +#~ "Кроме того, допускается использовать `nil` с любым типом индексируемого " +#~ "поля, если указать :ref:`is_nullable=true `" + +#~ msgid "Allowing null for an indexed key" +#~ msgstr "Использование null в ключе индекса" + +#~ msgid "is_nullable parts option" +#~ msgstr "is_nullable в операторе parts" + +#~ msgid "" +#~ "If the index type is TREE, and the index is not the primary index, then the " +#~ "``parts={...}`` clause may include ``is_nullable=true`` or " +#~ "``is_nullable=false`` (the default)." +#~ msgstr "" +#~ "Если тип индекса — TREE, а индекс не является первичным, то в оператор " +#~ "``parts={...}`` можно включить ``is_nullable=true`` или " +#~ "``is_nullable=false`` (по умолчанию)." + +#~ msgid "exclude_null parts option" +#~ msgstr "exclude_null в операторе parts" + +#~ msgid "" +#~ "Since version 2.8.2 an index part definition may include option " +#~ "``exclude_null``, which allows an index to skip tuples with null at this " +#~ "part." +#~ msgstr "" +#~ "Начиная с версии 2.8.2, при описании индекса можно указать параметр " +#~ "``exclude_null``, чтобы индекс пропускал кортежи со значением null в этой " +#~ "части." + +#~ msgid "" +#~ "``exclude_null`` and ``is_nullable`` are connected, so this table describes " +#~ "the result of combining them:" +#~ msgstr "" +#~ "``exclude_null`` и ``is_nullable`` взаимосвязаны, поэтому ниже приводится " +#~ "таблица допустимых сочетаний значений этих параметров:" + +#~ msgid "**exclude_null/is_nullable**" +#~ msgstr "**exclude_null/is_nullable**" + +#~ msgid "**false**" +#~ msgstr "**false**" + +#~ msgid "**true**" +#~ msgstr "**true**" + +#~ msgid "ok" +#~ msgstr "допускается" + +#~ msgid "not allowed" +#~ msgstr "не допускается" + +#~ msgid "" +#~ "``create_index()`` can use field names and/or field types described by the " +#~ "optional :doc:`/reference/reference_lua/box_space/format` clause." +#~ msgstr "" +#~ "``create_index()`` может использовать имена полей и / или номера полей, " +#~ "которые описаны в необязательном операторе " +#~ ":doc:`/reference/reference_lua/box_space/format`." + +#~ msgid "" +#~ "In the following example, we show ``format()`` for a space that has two " +#~ "columns named 'x' and 'y', and then we show five variations of the " +#~ "``parts={}`` clause of ``create_index()``, first for the 'x' column, second " +#~ "for both the 'x' and 'y' columns. The variations include omitting the type, " +#~ "using numbers, and adding extra braces." +#~ msgstr "" +#~ "В следующем примере мы покажем использование ``format()`` для спейса с двумя" +#~ " столбцами 'x' и 'y', а затем — пять вариантов использования оператора " +#~ "``parts={}`` в ``create_index()`` сначала для столбца 'x', затем для " +#~ "столбцов 'x' и 'y'. Эти варианты включают в себя пропуск типа, использование" +#~ " чисел и дополнительных скобок." + +#~ msgid "" +#~ "box.space.tester:format({{name = 'x', type = 'scalar'}, {name = 'y', type = 'integer'}})\n" +#~ "\n" +#~ "box.space.tester:create_index('I2', {parts = {{'x', 'scalar'}}})\n" +#~ "box.space.tester:create_index('I3', {parts = {{'x', 'scalar'}, {'y', 'integer'}}})\n" +#~ "\n" +#~ "box.space.tester:create_index('I4', {parts = {{1, 'scalar'}}})\n" +#~ "box.space.tester:create_index('I5', {parts = {{1, 'scalar'}, {2, 'integer'}}})\n" +#~ "\n" +#~ "box.space.tester:create_index('I6', {parts = {1}})\n" +#~ "box.space.tester:create_index('I7', {parts = {1, 2}})\n" +#~ "\n" +#~ "box.space.tester:create_index('I8', {parts = {'x'}})\n" +#~ "box.space.tester:create_index('I9', {parts = {'x', 'y'}})\n" +#~ "\n" +#~ "box.space.tester:create_index('I10', {parts = {{'x'}}})\n" +#~ "box.space.tester:create_index('I11', {parts = {{'x'}, {'y'}}})" +#~ msgstr "" +#~ "box.space.tester:format({{name = 'x', type = 'scalar'}, {name = 'y', type = 'integer'}})\n" +#~ "\n" +#~ "box.space.tester:create_index('I2', {parts = {{'x', 'scalar'}}})\n" +#~ "box.space.tester:create_index('I3', {parts = {{'x', 'scalar'}, {'y', 'integer'}}})\n" +#~ "\n" +#~ "box.space.tester:create_index('I4', {parts = {{1, 'scalar'}}})\n" +#~ "box.space.tester:create_index('I5', {parts = {{1, 'scalar'}, {2, 'integer'}}})\n" +#~ "\n" +#~ "box.space.tester:create_index('I6', {parts = {1}})\n" +#~ "box.space.tester:create_index('I7', {parts = {1, 2}})\n" +#~ "\n" +#~ "box.space.tester:create_index('I8', {parts = {'x'}})\n" +#~ "box.space.tester:create_index('I9', {parts = {'x', 'y'}})\n" +#~ "\n" +#~ "box.space.tester:create_index('I10', {parts = {{'x'}}})\n" +#~ "box.space.tester:create_index('I11', {parts = {{'x'}, {'y'}}})" + +#~ msgid "" +#~ "tarantool> my_space = box.schema.space.create('T')\n" +#~ "tarantool> format = {{'id', 'unsigned'}, {'data', 'map'}}\n" +#~ "tarantool> my_space:format(format)\n" +#~ "tarantool> parts = {{'data.FIO[\"firstname\"]', 'str'}, {'data.FIO[\"surname\"]', 'str'}}\n" +#~ "tarantool> my_index = my_space:create_index('info', {parts = parts})\n" +#~ "tarantool> my_space:insert({1, {FIO = {firstname = 'Ahmed', surname = 'Xi'}}})\n" +#~ "---\n" +#~ "- [1, {'FIO': {'surname': 'Xi', 'firstname': 'Ahmed'}}]" +#~ msgstr "" +#~ "tarantool> my_space = box.schema.space.create('T')\n" +#~ "tarantool> format = {{'id', 'unsigned'}, {'data', 'map'}}\n" +#~ "tarantool> my_space:format(format)\n" +#~ "tarantool> parts = {{'data.FIO[\"firstname\"]', 'str'}, {'data.FIO[\"surname\"]', 'str'}}\n" +#~ "tarantool> my_index = my_space:create_index('info', {parts = parts})\n" +#~ "tarantool> my_space:insert({1, {FIO = {firstname = 'Ahmed', surname = 'Xi'}}})\n" +#~ "---\n" +#~ "- [1, {'FIO': {'surname': 'Xi', 'firstname': 'Ahmed'}}]" + +#~ msgid "" +#~ "**Note re storage engine:** vinyl supports only the TREE index type, and " +#~ "vinyl secondary indexes must be created before tuples are inserted." +#~ msgstr "" +#~ "**Примечание про движок базы данных:** vinyl поддерживает только TREE-" +#~ "индексы, и следует создать в vinyl'е вторичные индексы до вставки кортежей." diff --git a/locale/ru/LC_MESSAGES/reference/reference_lua/box_space/delete.po b/locale/ru/LC_MESSAGES/reference/reference_lua/box_space/delete.po index 818f2e9637..6de788510f 100644 --- a/locale/ru/LC_MESSAGES/reference/reference_lua/box_space/delete.po +++ b/locale/ru/LC_MESSAGES/reference/reference_lua/box_space/delete.po @@ -2,7 +2,8 @@ msgid "space_object:delete()" msgstr "space_object:delete()" -msgid "Delete a tuple identified by a primary key." +#, fuzzy +msgid "Delete a tuple identified by the primary key." msgstr "Удаление кортежа по первичному ключу." msgid "Parameters" @@ -33,8 +34,8 @@ msgid "**Possible errors:**" msgstr "**Возможные ошибки:**" msgid "" -":errcode:`ER_TRANSACTION_CONFLICT` if a transaction conflict is detected in the " -":ref:`MVCC transaction mode `." +":errcode:`ER_TRANSACTION_CONFLICT` if a transaction conflict is detected in " +"the :ref:`MVCC transaction mode `." msgstr "" ":errcode:`ER_TRANSACTION_CONFLICT`, если транзакция стала конфликтной в " ":ref:`транзакционном режиме MVCC `." @@ -42,9 +43,10 @@ msgstr "" msgid "**Complexity factors:** Index size, Index type" msgstr "**Факторы сложности:** Размер индекса, тип индекса" +#, fuzzy msgid "" -"**Note re storage engine:** vinyl will return ``nil``, rather than the " -"deleted tuple." +"**Note regarding storage engine:** vinyl will return ``nil``, rather than " +"the deleted tuple." msgstr "" "**Примечание про движок базы данных:** vinyl вернет ``nil``, а не удаленный " "кортеж." diff --git a/locale/ru/LC_MESSAGES/reference/reference_lua/box_space/format.po b/locale/ru/LC_MESSAGES/reference/reference_lua/box_space/format.po index 911c2a679a..58b436e933 100644 --- a/locale/ru/LC_MESSAGES/reference/reference_lua/box_space/format.po +++ b/locale/ru/LC_MESSAGES/reference/reference_lua/box_space/format.po @@ -23,13 +23,16 @@ msgstr "``nil``, если не указан оператор формата" msgid "**Possible errors:**" msgstr "**Возможные ошибки:**" -msgid "``space_object`` does not exist;" +#, fuzzy +msgid "``space_object`` does not exist" msgstr "``space_object`` не существует," -msgid "field names are duplicated;" +#, fuzzy +msgid "field names are duplicated" msgstr "дублируются имена полей;" -msgid "type is not legal." +#, fuzzy +msgid "type is not legal" msgstr "тип не поддерживается." msgid "" @@ -59,15 +62,17 @@ msgstr "" "Оператор формата для каждого поля содержит определение в фигурных скобках: " "``{name='...',type='...'[,is_nullable=...]}``, где:" +#, fuzzy msgid "" -"the ``name`` value may be any string, provided that two fields do not have " -"the same name;" +"The ``name`` value may be any string, provided that two fields do not have " +"the same name." msgstr "" "значение ``name`` может представлять собой любую строку при условии, что у " "двух полей не будет одинаковых имен;" +#, fuzzy msgid "" -"the ``type`` value may be any of allowed types: any | unsigned | string | " +"The ``type`` value may be any of allowed types: any | unsigned | string | " "integer | number | varbinary | boolean | double | decimal | uuid | array | " "map | scalar, but for creating an index use only :ref:`indexed fields " "`;" @@ -78,16 +83,26 @@ msgstr "" ":ref:`индексируемые типы `; " msgid "" -"the optional ``is_nullable`` value may be either ``true`` or ``false`` (the " -"same as the requirement in :ref:`\"Options for space_object:create_index\" " -"`). See also the warning notice in section " -":ref:`Allowing null for an indexed key `." +"(Optional) The ``is_nullable`` boolean value specifies whether ``nil`` can " +"be used as a field value. See also: :ref:`key_part.is_nullable " +"`." +msgstr "" + +msgid "" +"(Optional) The ``collation`` string value specifies the :ref:`collation " +"` used to compare field values. See also: " +":ref:`key_part.collation `." +msgstr "" + +msgid "" +"(Optional) The ``constraint`` table specifies the :ref:`constraints ` that the field value must satisfy." +msgstr "" + +msgid "" +"(Optional) The ``foreign_key`` table specifies the :ref:`foreign keys " +"` for the field." msgstr "" -"значение необязательного параметра ``is_nullable`` может быть ``true`` или " -"``false`` (такое же требование, как для :ref:`\"Параметров для " -"space_object:create_index\" `). См. также " -"предупреждение в разделе :ref:`Разрешение использования нулевых значений для" -" индексируемого ключа`." msgid "" "It is not legal for tuples to contain values that have the wrong type. The " @@ -408,11 +423,12 @@ msgstr "" "Например, после ``box.space.tester:format({{'x','scalar'}})``, " "``box.space.tester:format()`` вернет ``[{'name': 'x', 'type': 'scalar'}]``." +#, fuzzy msgid "" "Formatting or reformatting a large space will cause occasional :ref:`yields " -"` so that other requests will not be " -"blocked. If the other requests cause an illegal situation such as a field " -"value of the wrong type, the formatting or reformatting will fail." +"` so that other requests will not be blocked. If the other " +"requests cause an illegal situation such as a field value of the wrong type," +" the formatting or reformatting will fail." msgstr "" "Форматирование или преобразование формата большого спейса будет периодически" " вызывать :ref:`передачу управления `, " @@ -420,9 +436,22 @@ msgstr "" " например, значение поля будет неподходящего типа, форматирование или " "преобразование формата не выполнится." +#, fuzzy msgid "" -"**Note re storage engine:** vinyl supports formatting of non-empty spaces. " -"Primary index definition cannot be formatted." +"**Note regarding storage engine:** vinyl supports formatting of non-empty " +"spaces. Primary index definition cannot be formatted." msgstr "" "**Примечание про движок базы данных:** vinyl поддерживает форматирование не " "пустых спейсов. Определение первичного индекса форматировать нельзя." + +#~ msgid "" +#~ "the optional ``is_nullable`` value may be either ``true`` or ``false`` (the " +#~ "same as the requirement in :ref:`\"Options for space_object:create_index\" " +#~ "`). See also the warning notice in section " +#~ ":ref:`Allowing null for an indexed key `." +#~ msgstr "" +#~ "значение необязательного параметра ``is_nullable`` может быть ``true`` или " +#~ "``false`` (такое же требование, как для :ref:`\"Параметров для " +#~ "space_object:create_index\" `). См. также " +#~ "предупреждение в разделе :ref:`Разрешение использования нулевых значений для" +#~ " индексируемого ключа`." diff --git a/locale/ru/LC_MESSAGES/reference/reference_lua/box_space/get.po b/locale/ru/LC_MESSAGES/reference/reference_lua/box_space/get.po index 1c20ce31dd..ae2861a00e 100644 --- a/locale/ru/LC_MESSAGES/reference/reference_lua/box_space/get.po +++ b/locale/ru/LC_MESSAGES/reference/reference_lua/box_space/get.po @@ -34,8 +34,8 @@ msgid "``space_object`` does not exist." msgstr "``space_object`` не существует." msgid "" -":errcode:`ER_TRANSACTION_CONFLICT` if a transaction conflict is detected in the " -":ref:`MVCC transaction mode `." +":errcode:`ER_TRANSACTION_CONFLICT` if a transaction conflict is detected in " +"the :ref:`MVCC transaction mode `." msgstr "" ":errcode:`ER_TRANSACTION_CONFLICT`, если транзакция стала конфликтной в " ":ref:`транзакционном режиме MVCC `." diff --git a/locale/ru/LC_MESSAGES/reference/reference_lua/box_space/insert.po b/locale/ru/LC_MESSAGES/reference/reference_lua/box_space/insert.po index 00473c5ee5..ae7ff7dd97 100644 --- a/locale/ru/LC_MESSAGES/reference/reference_lua/box_space/insert.po +++ b/locale/ru/LC_MESSAGES/reference/reference_lua/box_space/insert.po @@ -30,15 +30,15 @@ msgid "**Possible errors:**" msgstr "**Возможные ошибки:**" msgid "" -":errcode:`ER_TUPLE_FOUND` if a tuple with the same " -"unique-key value already exists." +":errcode:`ER_TUPLE_FOUND` if a tuple with the same unique-key value already " +"exists." msgstr "" -":errcode:`ER_TUPLE_FOUND`, если уже существует " -"кортеж с тем же уникальным значением ключа." +":errcode:`ER_TUPLE_FOUND`, если уже существует кортеж с тем же уникальным " +"значением ключа." msgid "" -":errcode:`ER_TRANSACTION_CONFLICT` if a transaction conflict is detected in the " -":ref:`MVCC transaction mode `." +":errcode:`ER_TRANSACTION_CONFLICT` if a transaction conflict is detected in " +"the :ref:`MVCC transaction mode `." msgstr "" ":errcode:`ER_TRANSACTION_CONFLICT`, если транзакция стала конфликтной в " ":ref:`транзакционном режиме MVCC `." diff --git a/locale/ru/LC_MESSAGES/reference/reference_lua/box_space/len.po b/locale/ru/LC_MESSAGES/reference/reference_lua/box_space/len.po index f707a9da5e..8c6b617cee 100644 --- a/locale/ru/LC_MESSAGES/reference/reference_lua/box_space/len.po +++ b/locale/ru/LC_MESSAGES/reference/reference_lua/box_space/len.po @@ -27,8 +27,8 @@ msgid "**Possible errors:**" msgstr "**Возможные ошибки:**" msgid "" -":errcode:`ER_TRANSACTION_CONFLICT` if a transaction conflict is detected in the " -":ref:`MVCC transaction mode `." +":errcode:`ER_TRANSACTION_CONFLICT` if a transaction conflict is detected in " +"the :ref:`MVCC transaction mode `." msgstr "" ":errcode:`ER_TRANSACTION_CONFLICT`, если транзакция стала конфликтной в " ":ref:`транзакционном режиме MVCC `." @@ -47,9 +47,10 @@ msgstr "" "- 2\n" "..." +#, fuzzy msgid "" -"**Note re storage engine:** vinyl supports ``len()`` but the result may be " -"approximate. If an exact result is necessary then use :doc:`count() " +"**Note regarding storage engine:** vinyl supports ``len()`` but the result " +"may be approximate. If an exact result is necessary then use :doc:`count() " "` or :doc:`pairs():length() " "`." msgstr "" diff --git a/locale/ru/LC_MESSAGES/reference/reference_lua/box_space/on_replace.po b/locale/ru/LC_MESSAGES/reference/reference_lua/box_space/on_replace.po index 6ccd766674..c604b737b7 100644 --- a/locale/ru/LC_MESSAGES/reference/reference_lua/box_space/on_replace.po +++ b/locale/ru/LC_MESSAGES/reference/reference_lua/box_space/on_replace.po @@ -70,13 +70,13 @@ msgid "**Example 1:**" msgstr "**Пример 1:**" msgid "" -"tarantool> x = 0\n" +"tarantool> x = 0\n" " > function f ()\n" " > x = x + 1\n" " > end\n" "tarantool> box.space.my_space_name:on_replace(f)" msgstr "" -"tarantool> x = 0\n" +"tarantool> x = 0\n" " > function f ()\n" " > x = x + 1\n" " > end\n" @@ -178,7 +178,8 @@ msgstr "" msgid "transactions," msgstr "транзакции," -msgid "yield-operations (:ref:`explicit ` or not)," +#, fuzzy +msgid "yield-operations (:ref:`explicit ` or not)," msgstr "" "операции, передающие управление (yield-operations, :ref:`явные ` или нет)," diff --git a/locale/ru/LC_MESSAGES/reference/reference_lua/box_space/pairs.po b/locale/ru/LC_MESSAGES/reference/reference_lua/box_space/pairs.po index 94341c1dfd..0bc9c16344 100644 --- a/locale/ru/LC_MESSAGES/reference/reference_lua/box_space/pairs.po +++ b/locale/ru/LC_MESSAGES/reference/reference_lua/box_space/pairs.po @@ -2,9 +2,11 @@ msgid "space_object:pairs()" msgstr "space_object:pairs()" +#, fuzzy msgid "" "Search for a tuple or a set of tuples in the given space, and allow " -"iterating over one tuple at a time." +"iterating over one tuple at a time. To search by the specific index, use the" +" :ref:`box_index-pairs` method." msgstr "" "Поиск кортежа или набора кортежей в заданном спейсе и итерация по одному " "кортежу за раз." @@ -19,109 +21,191 @@ msgid "value to be matched against the index key, which may be multi-part" msgstr "" "значение должно совпасть с индексным ключом, который может быть составным" -msgid "see :doc:`/reference/reference_lua/box_index/pairs`" -msgstr "см. :doc:`/reference/reference_lua/box_index/pairs`" +msgid "" +"the :ref:`iterator type `. The default iterator " +"type is 'EQ'" +msgstr "" + +msgid "" +"a tuple or the position of a tuple (:ref:`tuple_pos `) " +"after which ``pairs`` starts the search. You can pass an empty string or " +":ref:`box.NULL ` to this option to start the search from the first" +" tuple." +msgstr "" msgid "return" msgstr "возвращает" +#, fuzzy msgid "" -"`iterator `_ which can be used in a " -"``for/end`` loop or with `totable() " -"`_" +"The `iterator `_, which can be" +" used in a ``for/end`` loop or with `totable() " +"`_." msgstr "" -"`итератор `_, который может использовать в" -" цикле for/end или с функцией `totable() " +"`итератор `_, который может " +"использовать в цикле for/end или с функцией `totable() " "`_" msgid "**Possible errors:**" msgstr "**Возможные ошибки:**" -msgid "No such space." +#, fuzzy +msgid "no such space" msgstr "Нет такого спейса." -msgid "Wrong type." +#, fuzzy +msgid "wrong type" msgstr "Неправильный тип." +#, fuzzy msgid "" -":errcode:`ER_TRANSACTION_CONFLICT` if a transaction conflict is detected in the " -":ref:`MVCC transaction mode `." +":errcode:`ER_TRANSACTION_CONFLICT` if a transaction conflict is detected in " +"the :ref:`MVCC transaction mode `" msgstr "" ":errcode:`ER_TRANSACTION_CONFLICT`, если транзакция стала конфликтной в " ":ref:`транзакционном режиме MVCC `." +msgid "iterator position is invalid" +msgstr "" + msgid "**Complexity factors:** Index size, Index type." msgstr "**Факторы сложности:** Размер индекса, тип индекса." +#, fuzzy msgid "" -"For examples of complex ``pairs`` requests, where one can specify which " -"index to search and what condition to use (for example \"greater than\" " -"instead of \"equal to\"), see the later section " -":doc:`/reference/reference_lua/box_index/pairs`." -msgstr "" -"Чтобы посмотреть примеры сложных запросов ``pairs``, где можно указать " -"индекс для поиска и используемое условие (например, \"больше чем\" вместо " -"\"равен\"), см. раздел далее по тексту " -":doc:`/reference/reference_lua/box_index/pairs`." - -msgid "" -"For information about iterators' internal structures see the `\"Lua " +"For information about iterators' internal structures, see the `\"Lua " "Functional library\" `_ documentation." msgstr "" "Для получения информации о внутренней структуре итераторов см. документацию " "по библиотеке для функционального программирования в Lua `\"Lua Functional " "library\" `_." -msgid "**Example:**" +#, fuzzy +msgid "**Examples:**" msgstr "**Пример:**" msgid "" -"tarantool> s = box.schema.space.create('space33')\n" -"---\n" -"...\n" -"tarantool> -- index 'X' has default parts {1, 'unsigned'}\n" -"tarantool> s:create_index('X', {})\n" -"---\n" -"...\n" -"tarantool> s:insert{0, 'Hello my '}, s:insert{1, 'Lua world'}\n" -"---\n" -"- [0, 'Hello my ']\n" -"- [1, 'Lua world']\n" -"...\n" -"tarantool> tmp = ''\n" -"---\n" -"...\n" -"tarantool> for k, v in s:pairs() do\n" -" > tmp = tmp .. v[2]\n" -" > end\n" -"---\n" -"...\n" -"tarantool> tmp\n" -"---\n" -"- Hello my Lua world\n" -"..." +"Below are few examples of using ``pairs`` with different parameters. To try " +"out these examples, you need to bootstrap a Tarantool instance as described " +"in :ref:`Using data operations `." msgstr "" -"tarantool> s = box.schema.space.create('space33')\n" -"---\n" -"...\n" -"tarantool> -- в индексе 'X' количество частей по умолчанию {1, 'unsigned'}\n" -"tarantool> s:create_index('X', {})\n" -"---\n" -"...\n" -"tarantool> s:insert{0, 'Hello my '}, s:insert{1, 'Lua world'}\n" + +msgid "" +"-- Insert test data --\n" +"tarantool> bands:insert{1, 'Roxette', 1986}\n" +" bands:insert{2, 'Scorpions', 1965}\n" +" bands:insert{3, 'Ace of Base', 1987}\n" +" bands:insert{4, 'The Beatles', 1960}\n" +" bands:insert{5, 'Pink Floyd', 1965}\n" +" bands:insert{6, 'The Rolling Stones', 1962}\n" +" bands:insert{7, 'The Doors', 1965}\n" +" bands:insert{8, 'Nirvana', 1987}\n" +" bands:insert{9, 'Led Zeppelin', 1968}\n" +" bands:insert{10, 'Queen', 1970}\n" "---\n" -"- [0, 'Hello my ']\n" -"- [1, 'Lua world']\n" "...\n" -"tarantool> tmp = ''\n" +"\n" +"-- Select all tuples by the primary index --\n" +"tarantool> for _, tuple in bands:pairs() do\n" +" print(tuple)\n" +" end\n" +"[1, 'Roxette', 1986]\n" +"[2, 'Scorpions', 1965]\n" +"[3, 'Ace of Base', 1987]\n" +"[4, 'The Beatles', 1960]\n" +"[5, 'Pink Floyd', 1965]\n" +"[6, 'The Rolling Stones', 1962]\n" +"[7, 'The Doors', 1965]\n" +"[8, 'Nirvana', 1987]\n" +"[9, 'Led Zeppelin', 1968]\n" +"[10, 'Queen', 1970]\n" "---\n" "...\n" -"tarantool> for k, v in s:pairs() do\n" -" > tmp = tmp .. v[2]\n" -" > end\n" +"\n" +"-- Select all tuples whose primary key values are between 3 and 6 --\n" +"tarantool> for _, tuple in bands:pairs(3, {iterator = \"GE\"}) do\n" +" if (tuple[1] > 6) then break end\n" +" print(tuple)\n" +" end\n" +"[3, 'Ace of Base', 1987]\n" +"[4, 'The Beatles', 1960]\n" +"[5, 'Pink Floyd', 1965]\n" +"[6, 'The Rolling Stones', 1962]\n" "---\n" "...\n" -"tarantool> tmp\n" +"\n" +"-- Select all tuples after the specified tuple --\n" +"tarantool> for _, tuple in bands:pairs({}, {after={7, 'The Doors', 1965}}) do\n" +" print(tuple)\n" +" end\n" +"[8, 'Nirvana', 1987]\n" +"[9, 'Led Zeppelin', 1968]\n" +"[10, 'Queen', 1970]\n" "---\n" -"- Hello my Lua world\n" "..." +msgstr "" + +#~ msgid "see :doc:`/reference/reference_lua/box_index/pairs`" +#~ msgstr "см. :doc:`/reference/reference_lua/box_index/pairs`" + +#~ msgid "" +#~ "For examples of complex ``pairs`` requests, where one can specify which " +#~ "index to search and what condition to use (for example \"greater than\" " +#~ "instead of \"equal to\"), see the later section " +#~ ":doc:`/reference/reference_lua/box_index/pairs`." +#~ msgstr "" +#~ "Чтобы посмотреть примеры сложных запросов ``pairs``, где можно указать " +#~ "индекс для поиска и используемое условие (например, \"больше чем\" вместо " +#~ "\"равен\"), см. раздел далее по тексту " +#~ ":doc:`/reference/reference_lua/box_index/pairs`." + +#~ msgid "" +#~ "tarantool> s = box.schema.space.create('space33')\n" +#~ "---\n" +#~ "...\n" +#~ "tarantool> -- index 'X' has default parts {1, 'unsigned'}\n" +#~ "tarantool> s:create_index('X', {})\n" +#~ "---\n" +#~ "...\n" +#~ "tarantool> s:insert{0, 'Hello my '}, s:insert{1, 'Lua world'}\n" +#~ "---\n" +#~ "- [0, 'Hello my ']\n" +#~ "- [1, 'Lua world']\n" +#~ "...\n" +#~ "tarantool> tmp = ''\n" +#~ "---\n" +#~ "...\n" +#~ "tarantool> for k, v in s:pairs() do\n" +#~ " > tmp = tmp .. v[2]\n" +#~ " > end\n" +#~ "---\n" +#~ "...\n" +#~ "tarantool> tmp\n" +#~ "---\n" +#~ "- Hello my Lua world\n" +#~ "..." +#~ msgstr "" +#~ "tarantool> s = box.schema.space.create('space33')\n" +#~ "---\n" +#~ "...\n" +#~ "tarantool> -- в индексе 'X' количество частей по умолчанию {1, 'unsigned'}\n" +#~ "tarantool> s:create_index('X', {})\n" +#~ "---\n" +#~ "...\n" +#~ "tarantool> s:insert{0, 'Hello my '}, s:insert{1, 'Lua world'}\n" +#~ "---\n" +#~ "- [0, 'Hello my ']\n" +#~ "- [1, 'Lua world']\n" +#~ "...\n" +#~ "tarantool> tmp = ''\n" +#~ "---\n" +#~ "...\n" +#~ "tarantool> for k, v in s:pairs() do\n" +#~ " > tmp = tmp .. v[2]\n" +#~ " > end\n" +#~ "---\n" +#~ "...\n" +#~ "tarantool> tmp\n" +#~ "---\n" +#~ "- Hello my Lua world\n" +#~ "..." diff --git a/locale/ru/LC_MESSAGES/reference/reference_lua/box_space/replace.po b/locale/ru/LC_MESSAGES/reference/reference_lua/box_space/replace.po index 439f40f705..4095aa8824 100644 --- a/locale/ru/LC_MESSAGES/reference/reference_lua/box_space/replace.po +++ b/locale/ru/LC_MESSAGES/reference/reference_lua/box_space/replace.po @@ -38,17 +38,19 @@ msgstr "tuple" msgid "**Possible errors:**" msgstr "**Возможные ошибки:**" + msgid "" -":errcode:`ER_TUPLE_FOUND` if a different tuple with the" -" same unique-key value already exists. (This will only happen if there is a unique secondary index.)" +":errcode:`ER_TUPLE_FOUND` if a different tuple with the same unique-key " +"value already exists. (This will only happen if there is a unique secondary " +"index.)" msgstr "" -":errcode:`ER_TUPLE_FOUND`, если уже существует " -"другой кортеж с тем же уникальным значением ключа (это произойдет только в том случае, " -"если есть уникальный вторичный индекс)." +":errcode:`ER_TUPLE_FOUND`, если уже существует другой кортеж с тем же " +"уникальным значением ключа (это произойдет только в том случае, если есть " +"уникальный вторичный индекс)." msgid "" -":errcode:`ER_TRANSACTION_CONFLICT` if a transaction conflict is detected in the " -":ref:`MVCC transaction mode `." +":errcode:`ER_TRANSACTION_CONFLICT` if a transaction conflict is detected in " +"the :ref:`MVCC transaction mode `." msgstr "" ":errcode:`ER_TRANSACTION_CONFLICT`, если транзакция стала конфликтной в " ":ref:`транзакционном режиме MVCC `." diff --git a/locale/ru/LC_MESSAGES/reference/reference_lua/box_space/select.po b/locale/ru/LC_MESSAGES/reference/reference_lua/box_space/select.po index cfd132d8a2..736f5487a9 100644 --- a/locale/ru/LC_MESSAGES/reference/reference_lua/box_space/select.po +++ b/locale/ru/LC_MESSAGES/reference/reference_lua/box_space/select.po @@ -3,9 +3,15 @@ msgid "space_object:select()" msgstr "space_object:select()" msgid "" -"Search for a tuple or a set of tuples in the given space. This method " -"doesn't yield (for details see :ref:`Cooperative multitasking `)." +"Search for a tuple or a set of tuples in the given space by the primary key." +" To search by the specific index, use the " +":doc:`/reference/reference_lua/box_index/select` method." +msgstr "" + +#, fuzzy +msgid "" +"Note that this method doesn't yield. For details, see :ref:`Cooperative " +"multitasking `." msgstr "" "Поиск кортежа или набора кортежей в заданном спейсе. Этот метод не передает " "управление (детали можно найти в разделе :ref:`Кооперативная многозадачность" @@ -14,228 +20,344 @@ msgstr "" msgid "Parameters" msgstr "Параметры" -msgid "an :ref:`object reference `" +#, fuzzy +msgid "an :ref:`object reference `." msgstr ":ref:`ссылка на объект `" -msgid "value to be matched against the index key, which may be multi-part." +#, fuzzy +msgid "a value to be matched against the index key, which may be multi-part." msgstr "" "значение должно совпасть с индексным ключом, который может быть составным." msgid "" -"none, any or all of the same options that " +"none, any, or all of the same options that " ":doc:`/reference/reference_lua/box_index/select` allows: * " -"``options.iterator`` (:ref:`type of iterator `) * " -"``options.limit`` (maximum number of tuples) * ``options.offset`` (number of" -" tuples to skip)" +"``options.iterator`` -- the :ref:`iterator type `." +" The default iterator type is 'EQ'. * ``options.limit`` -- the maximum " +"number of tuples. * ``options.offset`` -- the number of tuples to skip. * " +"``options.after`` -- a tuple or the position of a tuple (:ref:`tuple_pos " +"`) after which ``select`` starts the search. You can " +"pass an empty string or :ref:`box.NULL ` to this option to start " +"the search from the first tuple. * ``options.fetch_pos`` -- if **true**, the" +" ``select`` method returns the position of the last selected tuple as the " +"second value. .. NOTE:: The ``after`` and ``fetch_pos`` options " +"are supported for the ``TREE`` :ref:`index ` only." msgstr "" -"ни один, любой или все параметры, которые допускает " -":doc:`/reference/reference_lua/box_index/select`: * ``options.iterator`` " -"(:ref:`тип итератора `) * ``options.limit`` " -"(максимальное количество кортежей) * ``options.offset`` (количество " -"пропускаемых кортежей)" +#, fuzzy msgid "" -"none, any or all of the same options that " +"none, any, or all of the same options that " ":doc:`/reference/reference_lua/box_index/select` allows:" msgstr "" "ни один, любой или все параметры, которые допускает " ":doc:`/reference/reference_lua/box_index/select`:" +#, fuzzy msgid "" -"``options.iterator`` (:ref:`type of iterator `)" +"``options.iterator`` -- the :ref:`iterator type `." +" The default iterator type is 'EQ'." msgstr "" "``options.iterator`` (:ref:`тип итератора `)" -msgid "``options.limit`` (maximum number of tuples)" +#, fuzzy +msgid "``options.limit`` -- the maximum number of tuples." msgstr "``options.limit`` (максимальное количество кортежей)" -msgid "``options.offset`` (number of tuples to skip)" +#, fuzzy +msgid "``options.offset`` -- the number of tuples to skip." msgstr "``options.offset`` (количество пропускаемых кортежей)" +msgid "" +"``options.after`` -- a tuple or the position of a tuple (:ref:`tuple_pos " +"`) after which ``select`` starts the search. You can " +"pass an empty string or :ref:`box.NULL ` to this option to start " +"the search from the first tuple." +msgstr "" + +msgid "" +"``options.fetch_pos`` -- if **true**, the ``select`` method returns the " +"position of the last selected tuple as the second value." +msgstr "" + +msgid "" +"The ``after`` and ``fetch_pos`` options are supported for the ``TREE`` " +":ref:`index ` only." +msgstr "" + msgid "return" msgstr "возвращает" +msgid "This function might return one or two values:" +msgstr "" + +#, fuzzy msgid "" -"the tuples whose primary-key fields are equal to the fields of the passed " +"The tuples whose primary-key fields are equal to the fields of the passed " "key. If the number of passed fields is less than the number of fields in the" " primary key, then only the passed fields are compared, so ``select{1,2}`` " -"will match a tuple whose primary key is ``{1,2,3}``." +"matches a tuple whose primary key is ``{1,2,3}``." msgstr "" "кортежи, поля первичного ключа в которых равны полям переданного ключа. Если" " количество переданных полей меньшей количества полей первичного ключа, " "сопоставляются только переданные поля, то есть для ``select{1,2}`` " "совпадением будет кортеж с первичным ключом ``{1,2,3}``." +msgid "" +"(Optionally) If ``options.fetch_pos`` is set to **true**, returns a " +"base64-encoded string representing the position of the last selected tuple " +"as the second value. If no tuples are fetched, returns ``nil``." +msgstr "" + msgid "rtype" msgstr "тип возвращаемого значения" msgid "array of tuples" msgstr "массив кортежей" -msgid "" -"A ``select`` request can also be done with a specific index and index " -"options, which are the subject of " -":doc:`/reference/reference_lua/box_index/select`." +msgid "(Optionally) string" msgstr "" -"Запрос выборки ``select`` также можно выполнить со специальными параметрами " -"индекса, которые указаны в :doc:`/reference/reference_lua/box_index/select`." msgid "**Possible errors:**" msgstr "**Возможные ошибки:**" -msgid "No such space." +#, fuzzy +msgid "no such space" msgstr "Нет такого спейса." -msgid "Wrong type." +#, fuzzy +msgid "wrong type" msgstr "Неверный тип." +#, fuzzy msgid "" -":errcode:`ER_TRANSACTION_CONFLICT` if a transaction conflict is detected in the " -":ref:`MVCC transaction mode `." +":errcode:`ER_TRANSACTION_CONFLICT` if a transaction conflict is detected in " +"the :ref:`MVCC transaction mode `" msgstr "" ":errcode:`ER_TRANSACTION_CONFLICT`, если транзакция стала конфликтной в " ":ref:`транзакционном режиме MVCC `." +msgid "iterator position is invalid" +msgstr "" + msgid "**Complexity factors:** Index size, Index type." msgstr "**Факторы сложности:** Размер индекса, тип индекса" -msgid "**Example:**" +#, fuzzy +msgid "**Examples:**" msgstr "**Пример:**" msgid "" -"tarantool> s = box.schema.space.create('tmp', {temporary=true})\n" -"---\n" -"...\n" -"tarantool> s:create_index('primary',{parts = { {field = 1, type = 'unsigned'}, {field = 2, type = 'string'}} })\n" -"---\n" -"...\n" -"tarantool> s:insert{1,'A'}\n" -"---\n" -"- [1, 'A']\n" -"...\n" -"tarantool> s:insert{1,'B'}\n" -"---\n" -"- [1, 'B']\n" -"...\n" -"tarantool> s:insert{1,'C'}\n" -"---\n" -"- [1, 'C']\n" -"...\n" -"tarantool> s:insert{2,'D'}\n" -"---\n" -"- [2, 'D']\n" -"...\n" -"tarantool> -- must equal both primary-key fields\n" -"tarantool> s:select{1,'B'}\n" -"---\n" -"- - [1, 'B']\n" -"...\n" -"tarantool> -- must equal only one primary-key field\n" -"tarantool> s:select{1}\n" -"---\n" -"- - [1, 'A']\n" -" - [1, 'B']\n" -" - [1, 'C']\n" -"...\n" -"tarantool> -- must equal 0 fields, so returns all tuples\n" -"tarantool> s:select{}\n" -"---\n" -"- - [1, 'A']\n" -" - [1, 'B']\n" -" - [1, 'C']\n" -" - [2, 'D']\n" -"...\n" -"tarantool> -- the first field must be greater than 0, and\n" -"tarantool> -- skip the first tuple, and return up to\n" -"tarantool> -- 2 tuples. This example's options all\n" -"tarantool> -- depend on index characteristics so see\n" -"tarantool> -- more explanation in index_object:select().\n" -"tarantool> s:select({0},{iterator='GT',offset=1,limit=2})\n" -"---\n" -"- - [1, 'B']\n" -" - [1, 'C']\n" -"..." +"Below are few examples of using ``select`` with different parameters. To try" +" out these examples, you need to bootstrap a Tarantool instance as described" +" in :ref:`Using data operations `." msgstr "" -"tarantool> s = box.schema.space.create('tmp', {temporary=true})\n" -"---\n" -"...\n" -"tarantool> s:create_index('primary',{parts = { {field = 1, type = 'unsigned'}, {field = 2, type = 'string'}} })\n" -"---\n" -"...\n" -"tarantool> s:insert{1,'A'}\n" -"---\n" -"- [1, 'A']\n" -"...\n" -"tarantool> s:insert{1,'B'}\n" -"---\n" -"- [1, 'B']\n" -"...\n" -"tarantool> s:insert{1,'C'}\n" + +msgid "" +"-- Insert test data --\n" +"tarantool> bands:insert{1, 'Roxette', 1986}\n" +" bands:insert{2, 'Scorpions', 1965}\n" +" bands:insert{3, 'Ace of Base', 1987}\n" +" bands:insert{4, 'The Beatles', 1960}\n" +" bands:insert{5, 'Pink Floyd', 1965}\n" +" bands:insert{6, 'The Rolling Stones', 1962}\n" +" bands:insert{7, 'The Doors', 1965}\n" +" bands:insert{8, 'Nirvana', 1987}\n" +" bands:insert{9, 'Led Zeppelin', 1968}\n" +" bands:insert{10, 'Queen', 1970}\n" "---\n" -"- [1, 'C']\n" "...\n" -"tarantool> s:insert{2,'D'}\n" +"\n" +"-- Select a tuple by the specified primary key --\n" +"tarantool> bands:select(4)\n" "---\n" -"- [2, 'D']\n" +"- - [4, 'The Beatles', 1960]\n" "...\n" -"tarantool> -- необходимо совпадение с двумя полями первичного ключа\n" -"tarantool> s:select{1,'B'}\n" +"\n" +"-- Select maximum 3 tuples with the primary key value greater than 3 --\n" +"tarantool> bands:select({3}, {iterator='GT', limit = 3})\n" "---\n" -"- - [1, 'B']\n" +"- - [4, 'The Beatles', 1960]\n" +" - [5, 'Pink Floyd', 1965]\n" +" - [6, 'The Rolling Stones', 1962]\n" "...\n" -"tarantool> -- необходимо совпадение только одного поля первичного ключа\n" -"tarantool> s:select{1}\n" +"\n" +"-- Select maximum 3 tuples after the specified tuple --\n" +"tarantool> bands:select({}, {after = {4, 'The Beatles', 1960}, limit = 3})\n" "---\n" -"- - [1, 'A']\n" -" - [1, 'B']\n" -" - [1, 'C']\n" +"- - [5, 'Pink Floyd', 1965]\n" +" - [6, 'The Rolling Stones', 1962]\n" +" - [7, 'The Doors', 1965]\n" "...\n" -"tarantool> -- необходимо совпадение с 0 полей, поэтому возвращает все кортежи\n" -"tarantool> s:select{}\n" +"\n" +"-- Select first 3 tuples and fetch a last tuple's position --\n" +"tarantool> result, position = bands:select({}, {limit = 3, fetch_pos = true})\n" "---\n" -"- - [1, 'A']\n" -" - [1, 'B']\n" -" - [1, 'C']\n" -" - [2, 'D']\n" "...\n" -"tarantool> -- первое поле должно быть больше 0,\n" -"tarantool> -- пропуск первого кортежа и возврат до\n" -"tarantool> -- 2 кортежей. Все параметры в данном примере\n" -"tarantool> -- зависят от характеристик индекса, поэтому см.\n" -"tarantool> -- более подробное описание в index_object:select().\n" -"tarantool> s:select({0},{iterator='GT',offset=1,limit=2})\n" +"-- Then, pass this position as the 'after' parameter --\n" +"tarantool> bands:select({}, {limit = 3, after = position})\n" "---\n" -"- - [1, 'B']\n" -" - [1, 'C']\n" +"- - [4, 'The Beatles', 1960]\n" +" - [5, 'Pink Floyd', 1965]\n" +" - [6, 'The Rolling Stones', 1962]\n" "..." +msgstr "" +#, fuzzy msgid "" -"As the last request in the above example shows: to make complex ``select`` " -"requests, where you can specify which index to search and what condition to " -"use (for example \"greater than\" instead of \"equal to\") and how many " -"tuples to return, it will be necessary to become familiar with " -":doc:`/reference/reference_lua/box_index/select`." -msgstr "" -"Как показано в последнем запросе вышеприведенного примера, чтобы выполнять " -"сложные запросы выборки ``select``, где можно указать, в каком индексе " -"производится поиск и с какими условиями (например, \"больше, чем\" вместо " -"\"равный\"), а также необходимое количество возвращаемых кортежей, " -"необходимо ознакомиться с :doc:`/reference/reference_lua/box_index/select`." - -msgid "" -"Remember that you can get a field from a tuple both by field number and by " -"field name which is more convenient. See example: :ref:`using field names " -"instead of field numbers `." +"You can get a field from a tuple both by the field number and field name. " +"See example: :ref:`using field names instead of field numbers `." msgstr "" "Помните, что из кортежа можно получить поле как по номеру поля, так и по " "имени поля, что более удобно. См. пример: :ref:`использование имен вместо " "номеров полей `." -msgid "" -"For more usage scenarios and typical errors see :ref:`Example: using data " -"operations ` further in this " -"section." -msgstr "" -"Для получения дополнительной информации о сценариях использования и типичных" -" ошибках, см. :ref:`Пример: использование операций с данными ` далее в разделе." +#~ msgid "" +#~ "none, any or all of the same options that " +#~ ":doc:`/reference/reference_lua/box_index/select` allows: * " +#~ "``options.iterator`` (:ref:`type of iterator `) * " +#~ "``options.limit`` (maximum number of tuples) * ``options.offset`` (number of" +#~ " tuples to skip)" +#~ msgstr "" +#~ "ни один, любой или все параметры, которые допускает " +#~ ":doc:`/reference/reference_lua/box_index/select`: * ``options.iterator`` " +#~ "(:ref:`тип итератора `) * ``options.limit`` " +#~ "(максимальное количество кортежей) * ``options.offset`` (количество " +#~ "пропускаемых кортежей)" + +#~ msgid "" +#~ "A ``select`` request can also be done with a specific index and index " +#~ "options, which are the subject of " +#~ ":doc:`/reference/reference_lua/box_index/select`." +#~ msgstr "" +#~ "Запрос выборки ``select`` также можно выполнить со специальными параметрами " +#~ "индекса, которые указаны в :doc:`/reference/reference_lua/box_index/select`." + +#~ msgid "" +#~ "tarantool> s = box.schema.space.create('tmp', {temporary=true})\n" +#~ "---\n" +#~ "...\n" +#~ "tarantool> s:create_index('primary',{parts = { {field = 1, type = 'unsigned'}, {field = 2, type = 'string'}} })\n" +#~ "---\n" +#~ "...\n" +#~ "tarantool> s:insert{1,'A'}\n" +#~ "---\n" +#~ "- [1, 'A']\n" +#~ "...\n" +#~ "tarantool> s:insert{1,'B'}\n" +#~ "---\n" +#~ "- [1, 'B']\n" +#~ "...\n" +#~ "tarantool> s:insert{1,'C'}\n" +#~ "---\n" +#~ "- [1, 'C']\n" +#~ "...\n" +#~ "tarantool> s:insert{2,'D'}\n" +#~ "---\n" +#~ "- [2, 'D']\n" +#~ "...\n" +#~ "tarantool> -- must equal both primary-key fields\n" +#~ "tarantool> s:select{1,'B'}\n" +#~ "---\n" +#~ "- - [1, 'B']\n" +#~ "...\n" +#~ "tarantool> -- must equal only one primary-key field\n" +#~ "tarantool> s:select{1}\n" +#~ "---\n" +#~ "- - [1, 'A']\n" +#~ " - [1, 'B']\n" +#~ " - [1, 'C']\n" +#~ "...\n" +#~ "tarantool> -- must equal 0 fields, so returns all tuples\n" +#~ "tarantool> s:select{}\n" +#~ "---\n" +#~ "- - [1, 'A']\n" +#~ " - [1, 'B']\n" +#~ " - [1, 'C']\n" +#~ " - [2, 'D']\n" +#~ "...\n" +#~ "tarantool> -- the first field must be greater than 0, and\n" +#~ "tarantool> -- skip the first tuple, and return up to\n" +#~ "tarantool> -- 2 tuples. This example's options all\n" +#~ "tarantool> -- depend on index characteristics so see\n" +#~ "tarantool> -- more explanation in index_object:select().\n" +#~ "tarantool> s:select({0},{iterator='GT',offset=1,limit=2})\n" +#~ "---\n" +#~ "- - [1, 'B']\n" +#~ " - [1, 'C']\n" +#~ "..." +#~ msgstr "" +#~ "tarantool> s = box.schema.space.create('tmp', {temporary=true})\n" +#~ "---\n" +#~ "...\n" +#~ "tarantool> s:create_index('primary',{parts = { {field = 1, type = 'unsigned'}, {field = 2, type = 'string'}} })\n" +#~ "---\n" +#~ "...\n" +#~ "tarantool> s:insert{1,'A'}\n" +#~ "---\n" +#~ "- [1, 'A']\n" +#~ "...\n" +#~ "tarantool> s:insert{1,'B'}\n" +#~ "---\n" +#~ "- [1, 'B']\n" +#~ "...\n" +#~ "tarantool> s:insert{1,'C'}\n" +#~ "---\n" +#~ "- [1, 'C']\n" +#~ "...\n" +#~ "tarantool> s:insert{2,'D'}\n" +#~ "---\n" +#~ "- [2, 'D']\n" +#~ "...\n" +#~ "tarantool> -- необходимо совпадение с двумя полями первичного ключа\n" +#~ "tarantool> s:select{1,'B'}\n" +#~ "---\n" +#~ "- - [1, 'B']\n" +#~ "...\n" +#~ "tarantool> -- необходимо совпадение только одного поля первичного ключа\n" +#~ "tarantool> s:select{1}\n" +#~ "---\n" +#~ "- - [1, 'A']\n" +#~ " - [1, 'B']\n" +#~ " - [1, 'C']\n" +#~ "...\n" +#~ "tarantool> -- необходимо совпадение с 0 полей, поэтому возвращает все кортежи\n" +#~ "tarantool> s:select{}\n" +#~ "---\n" +#~ "- - [1, 'A']\n" +#~ " - [1, 'B']\n" +#~ " - [1, 'C']\n" +#~ " - [2, 'D']\n" +#~ "...\n" +#~ "tarantool> -- первое поле должно быть больше 0,\n" +#~ "tarantool> -- пропуск первого кортежа и возврат до\n" +#~ "tarantool> -- 2 кортежей. Все параметры в данном примере\n" +#~ "tarantool> -- зависят от характеристик индекса, поэтому см.\n" +#~ "tarantool> -- более подробное описание в index_object:select().\n" +#~ "tarantool> s:select({0},{iterator='GT',offset=1,limit=2})\n" +#~ "---\n" +#~ "- - [1, 'B']\n" +#~ " - [1, 'C']\n" +#~ "..." + +#~ msgid "" +#~ "As the last request in the above example shows: to make complex ``select`` " +#~ "requests, where you can specify which index to search and what condition to " +#~ "use (for example \"greater than\" instead of \"equal to\") and how many " +#~ "tuples to return, it will be necessary to become familiar with " +#~ ":doc:`/reference/reference_lua/box_index/select`." +#~ msgstr "" +#~ "Как показано в последнем запросе вышеприведенного примера, чтобы выполнять " +#~ "сложные запросы выборки ``select``, где можно указать, в каком индексе " +#~ "производится поиск и с какими условиями (например, \"больше, чем\" вместо " +#~ "\"равный\"), а также необходимое количество возвращаемых кортежей, " +#~ "необходимо ознакомиться с :doc:`/reference/reference_lua/box_index/select`." + +#~ msgid "" +#~ "For more usage scenarios and typical errors see :ref:`Example: using data " +#~ "operations ` further in this " +#~ "section." +#~ msgstr "" +#~ "Для получения дополнительной информации о сценариях использования и типичных" +#~ " ошибках, см. :ref:`Пример: использование операций с данными ` далее в разделе." diff --git a/locale/ru/LC_MESSAGES/reference/reference_lua/box_space/system_views.po b/locale/ru/LC_MESSAGES/reference/reference_lua/box_space/system_views.po index fdd7a104dd..cbb5106764 100644 --- a/locale/ru/LC_MESSAGES/reference/reference_lua/box_space/system_views.po +++ b/locale/ru/LC_MESSAGES/reference/reference_lua/box_space/system_views.po @@ -9,6 +9,7 @@ msgstr "" "Представление системного спейса (или 'sysview') --- копия системного спейса " "с доступом только для чтения." +#, fuzzy msgid "" "The system space views and the system spaces that they are associated with " "are: |br| ``_vcollation``, a view of :ref:`_collation `, |br| ``_vpriv``, a " "view of :ref:`_priv `, |br| ``_vsequence``, a view of " ":ref:`_sequence `, |br| ``_vspace``, a view of " -":ref:`_space `, |br| ``_vuser``, a view of :ref:`_user " -"`." +":ref:`_space `, |br| ``_vspace_sequence``, a view of " +":ref:`_space_sequence `, |br| ``_vuser``, a view " +"of :ref:`_user `." msgstr "" "Представления системных спейсов и связанные с ними системные спейсы: |br| " "``_vcollation`` --- представление спейса :ref:`_collation `." +":errcode:`ER_TRANSACTION_CONFLICT` if a transaction conflict is detected in " +"the :ref:`MVCC transaction mode `." msgstr "" ":errcode:`ER_TRANSACTION_CONFLICT`, если транзакция стала конфликтной в " ":ref:`транзакционном режиме MVCC `." msgid "**Possible errors:**" msgstr "**Возможные ошибки:**" + msgid "" "**Complexity factors:** Index size, Index type, number of indexes accessed, " "WAL settings." diff --git a/locale/ru/LC_MESSAGES/reference/reference_lua/box_space/upsert.po b/locale/ru/LC_MESSAGES/reference/reference_lua/box_space/upsert.po index 2172f31ca8..ce8c62c857 100644 --- a/locale/ru/LC_MESSAGES/reference/reference_lua/box_space/upsert.po +++ b/locale/ru/LC_MESSAGES/reference/reference_lua/box_space/upsert.po @@ -65,8 +65,8 @@ msgstr "" "вторичный индекс." msgid "" -":errcode:`ER_TRANSACTION_CONFLICT` if a transaction conflict is detected in the " -":ref:`MVCC transaction mode `." +":errcode:`ER_TRANSACTION_CONFLICT` if a transaction conflict is detected in " +"the :ref:`MVCC transaction mode `." msgstr "" ":errcode:`ER_TRANSACTION_CONFLICT`, если транзакция стала конфликтной в " ":ref:`транзакционном режиме MVCC `." diff --git a/locale/ru/LC_MESSAGES/reference/reference_lua/box_space/user_defined.po b/locale/ru/LC_MESSAGES/reference/reference_lua/box_space/user_defined.po index 09c58a373c..7295647502 100644 --- a/locale/ru/LC_MESSAGES/reference/reference_lua/box_space/user_defined.po +++ b/locale/ru/LC_MESSAGES/reference/reference_lua/box_space/user_defined.po @@ -1,58 +1,45 @@ -msgid "space_object:user_defined()" +#, fuzzy +msgid "space_object extensions" msgstr "space_object:user_defined()" -msgid "" -"Users can define any functions they want, and associate them with spaces: in" -" effect they can make their own space methods. They do this by:" +msgid "You can extend ``space_object`` with custom functions as follows:" msgstr "" -"Пользователи могут сами определять любые желаемые функции и связывать их со " -"спейсами: фактически они могут создавать собственные методы для работы со " -"спейсом. Это можно сделать так:" -msgid "creating a Lua function," +#, fuzzy +msgid "Create a Lua function." msgstr "создать Lua-функцию," +#, fuzzy msgid "" -"adding the function name to a predefined global variable which has type = " -"table, and" +"Add the function name to a predefined global variable " +"``box.schema.space_mt``, which has the ``table`` type. Adding to " +"``box.schema.space_mt`` makes the function available for all spaces." msgstr "" -"добавить имя функции в заданную глобальную переменную с типом \"таблица\" " -"(table)," +"Задана глобальная переменная ``box.schema.space_mt``. Метод, добавленный в " +"``box.schema.space_mt``, будет доступен для всех спейсов." +#, fuzzy msgid "" -"invoking the function any time thereafter, as long as the server is up, by " -"saying ``space_object:function-name([parameters])``." +"Call the function on the ``space_object``: ``space_object:function-" +"name([parameters])``." msgstr "" "впоследствии в любое время, пока работает сервер, вызвать функцию с помощью " "``объект_спейса:имя-функции([параметры])``." +#, fuzzy msgid "" -"The predefined global variable is ``box.schema.space_mt``. Adding to " -"``box.schema.space_mt`` makes the method available for all spaces." -msgstr "" -"Задана глобальная переменная ``box.schema.space_mt``. Метод, добавленный в " -"``box.schema.space_mt``, будет доступен для всех спейсов." - -msgid "" -"Alternatively, user-defined methods can be made available for only one " -"space, by calling ``getmetatable(space_object)`` and then adding the " -"function name to the meta table. See also the example for " -":doc:`/reference/reference_lua/box_index/user_defined`." +"Alternatively, you can make a user-defined function available for only one " +"space by calling ``getmetatable(space_object)`` and then adding the function" +" name to the meta table." msgstr "" "Можно также сделать задаваемый пользователем метод доступным только для " "одного индекса путем вызова ``getmetatable(объект_спейса)`` и последующего " "добавления имени функции в метатаблицу. См. также пример для " ":doc:`/reference/reference_lua/box_index/user_defined`." -msgid "Parameters" -msgstr "Параметры" - -msgid "an :ref:`object reference `." -msgstr ":ref:`ссылка на объект `." - -msgid "whatever the user defines" -msgstr "то, что определяет пользователь" +msgid "See also: :doc:`/reference/reference_lua/box_index/user_defined`." +msgstr "" msgid "**Example:**" msgstr "**Пример:**" @@ -75,3 +62,27 @@ msgstr "" "function f(space_arg) global_variable = global_variable + 1 end\n" "box.schema.space_mt.counter = f\n" "box.space.t:counter()" + +#~ msgid "" +#~ "Users can define any functions they want, and associate them with spaces: in" +#~ " effect they can make their own space methods. They do this by:" +#~ msgstr "" +#~ "Пользователи могут сами определять любые желаемые функции и связывать их со " +#~ "спейсами: фактически они могут создавать собственные методы для работы со " +#~ "спейсом. Это можно сделать так:" + +#~ msgid "" +#~ "adding the function name to a predefined global variable which has type = " +#~ "table, and" +#~ msgstr "" +#~ "добавить имя функции в заданную глобальную переменную с типом \"таблица\" " +#~ "(table)," + +#~ msgid "Parameters" +#~ msgstr "Параметры" + +#~ msgid "an :ref:`object reference `." +#~ msgstr ":ref:`ссылка на объект `." + +#~ msgid "whatever the user defines" +#~ msgstr "то, что определяет пользователь" diff --git a/locale/ru/LC_MESSAGES/reference/reference_lua/box_sql/execute.po b/locale/ru/LC_MESSAGES/reference/reference_lua/box_sql/execute.po index 2480fe31a2..e3bc8f7fc4 100644 --- a/locale/ru/LC_MESSAGES/reference/reference_lua/box_sql/execute.po +++ b/locale/ru/LC_MESSAGES/reference/reference_lua/box_sql/execute.po @@ -2,7 +2,8 @@ msgid "box.execute()" msgstr "box.execute()" -msgid "Execute the SQL statement contained in the sql-statement parameter." +msgid "" +"Execute the SQL statement contained in the ``sql-statement`` parameter." msgstr "" msgid "Parameters" @@ -22,36 +23,69 @@ msgstr "возвращает" msgid "depends on statement" msgstr "" -msgid "There are two ways to pass extra parameters for ``box.execute()``:" +msgid "There are two ways to pass extra parameters to ``box.execute()``:" msgstr "" msgid "" "The first way, which is the preferred way, is to put placeholders in the " -"string, and pass a second argument, an *extra-parameters* table. A " +"string, and pass a second argument, an ``extra-parameters`` table. A " "placeholder is either a question mark \"?\", or a colon \":\" followed by a " -"name. An extra parameter is any Lua expression. If placeholders are question" -" marks, then they will be replaced by extra-parameter values in " -"corresponding positions, that is, the first ? will be replaced by the first " -"extra parameter, the second ? will be replaced by the second extra " -"parameter, and so on. If placeholders are :names, then they will be replaced" -" by extra-parameter values with corresponding names. For example this " -"request which contains literal values 1 and 'x': |br| ``box.execute([[INSERT" -" INTO tt VALUES (1, 'x');]]);`` |br| is the same as this request which " -"contains two question-mark placeholders (``?`` and ``?``) and a two-element " -"extra-parameters table: |br| ``x = {1,'x'}`` |br| ``box.execute([[INSERT " -"INTO tt VALUES (?, ?);]], x);`` |br| and is the same as this request which " -"contains two :name placeholders (``:a`` and ``:b``) and a two-element extra-" -"parameters table with elements named \"a\" and \"b\": |br| " -"``box.execute([[INSERT INTO tt VALUES (:a, :b);]], " -"{{[':a']=1},{[':b']='x'}})`` |br|" -msgstr "" - -msgid "" -"The second way is to concatenate strings. For example, this Lua script will " -"insert 10 rows with different primary-key values into table t: |br| ``for " -"i=1,10,1 do`` |br| |nbsp| |nbsp| ``box.execute(\"insert into t values (\" .." -" i .. \")\")`` |br| ``end`` |br| When creating SQL statements based on user " -"input, application developers should beware of `SQL injection " +"name. An extra parameter is any Lua expression." +msgstr "" + +msgid "" +"If placeholders are question marks, then they are replaced by ``extra-" +"parameters`` values in corresponding positions. That is, the first ``?`` is " +"replaced by the first extra parameter, the second ``?`` is replaced by the " +"second extra parameter, and so on." +msgstr "" + +msgid "" +"If placeholders are ``:names``, then they are replaced by ``extra-" +"parameters`` values with corresponding names." +msgstr "" + +msgid "" +"For example, this request that contains literal values ``1`` and ``'x'``:" +msgstr "" + +msgid "box.execute([[INSERT INTO tt VALUES (1, 'x');]]);" +msgstr "" + +msgid "" +"... is the same as the request below containing two question-mark " +"placeholders (``?`` and ``?``) and a two-element ``extra-parameters`` table:" +msgstr "" + +msgid "" +"x = {1,'x'}\n" +"box.execute([[INSERT INTO tt VALUES (?, ?);]], x);" +msgstr "" + +msgid "" +"... and is the same as this request containing two ``:name`` placeholders " +"(``:a`` and ``:b``) and a two-element ``extra-parameters`` table with " +"elements named \"a\" and \"b\":" +msgstr "" + +msgid "" +"box.execute([[INSERT INTO tt VALUES (:a, :b);]], {{[':a']=1},{[':b']='x'}})" +msgstr "" + +msgid "" +"The second way is to concatenate strings. For example, the Lua script below " +"inserts 10 rows with different primary-key values into table ``t``:" +msgstr "" + +msgid "" +"for i=1,10,1 do\n" +" box.execute(\"insert into t values (\" .. i .. \")\")\n" +"end" +msgstr "" + +msgid "" +"When creating SQL statements based on user input, application developers " +"should beware of `SQL injection " "`_." msgstr "" @@ -61,8 +95,8 @@ msgid "" msgstr "" msgid "" -"For some statements the returned value will contain a field named " -"\"rowcount\". For example;" +"For some statements the returned value contains a field named ``rowcount``, " +"for example:" msgstr "" msgid "" @@ -78,20 +112,20 @@ msgstr "" msgid "" "For statements that cause generation of values for PRIMARY KEY AUTOINCREMENT" -" columns, there will also be a field named \"autoincrement_ids\"." +" columns, there is a field named ``autoincrement_id``." msgstr "" msgid "" -"For SELECT or PRAGMA statements, the returned value will be a *result set*, " -"containing a field named \"metadata\" (a table with column names and " -"Tarantool/NoSQL type names) and a field named \"rows\" (a table with the " +"For SELECT or PRAGMA statements, the returned value is a *result set*, " +"containing a field named ``metadata`` (a table with column names and " +"Tarantool/NoSQL type names) and a field named ``rows`` (a table with the " "contents of each row)." msgstr "" msgid "" "For example, for a statement ``SELECT \"x\" FROM t WHERE \"x\"=5;`` where " "``\"x\"`` is an INTEGER column and there is one row, a display on the " -"Tarantool client will look like this:" +"Tarantool client might look like this:" msgstr "" msgid "" @@ -139,15 +173,15 @@ msgstr "" msgid "" "``span`` (always present) = the original expression in a select list, which " -"will often be the same as ``name`` if the select list specifies a column " -"name and nothing else, but otherwise will differ, for example after ``SELECT" -" x+55 AS x FROM t;`` the ``name`` is X and the ``span`` is x+55. If ``span``" -" and ``name`` are the same then the content is MP_NIL." +"often is the same as ``name`` if the select list specifies a column name and" +" nothing else, but otherwise differs, for example, after ``SELECT x+55 AS x " +"FROM t;`` the ``name`` is X and the ``span`` is x+55. If ``span`` and " +"``name`` are the same then the content is MP_NIL." msgstr "" msgid "" "Alternative: if you are using the Tarantool server as a client, you can " -"switch languages thus:" +"switch languages as follows:" msgstr "" msgid "" @@ -161,7 +195,85 @@ msgid "" msgstr "" msgid "" -"There is also an ``execute()`` function available via :ref:`module net.box " -"`, for example after ``conn = net_box.connect(url-string)`` " -"one can say ``conn:execute(sql-statement])``." +"There is also an ``execute()`` function available in :ref:`module net.box " +"`. For example, you can execute ``conn:execute(sql-" +"statement])`` after ``conn = net_box.connect(url-string)``." msgstr "" + +#~ msgid "Execute the SQL statement contained in the sql-statement parameter." +#~ msgstr "" + +#~ msgid "There are two ways to pass extra parameters for ``box.execute()``:" +#~ msgstr "" + +#~ msgid "" +#~ "The first way, which is the preferred way, is to put placeholders in the " +#~ "string, and pass a second argument, an *extra-parameters* table. A " +#~ "placeholder is either a question mark \"?\", or a colon \":\" followed by a " +#~ "name. An extra parameter is any Lua expression. If placeholders are question" +#~ " marks, then they will be replaced by extra-parameter values in " +#~ "corresponding positions, that is, the first ? will be replaced by the first " +#~ "extra parameter, the second ? will be replaced by the second extra " +#~ "parameter, and so on. If placeholders are :names, then they will be replaced" +#~ " by extra-parameter values with corresponding names. For example this " +#~ "request which contains literal values 1 and 'x': |br| ``box.execute([[INSERT" +#~ " INTO tt VALUES (1, 'x');]]);`` |br| is the same as this request which " +#~ "contains two question-mark placeholders (``?`` and ``?``) and a two-element " +#~ "extra-parameters table: |br| ``x = {1,'x'}`` |br| ``box.execute([[INSERT " +#~ "INTO tt VALUES (?, ?);]], x);`` |br| and is the same as this request which " +#~ "contains two :name placeholders (``:a`` and ``:b``) and a two-element extra-" +#~ "parameters table with elements named \"a\" and \"b\": |br| " +#~ "``box.execute([[INSERT INTO tt VALUES (:a, :b);]], " +#~ "{{[':a']=1},{[':b']='x'}})`` |br|" +#~ msgstr "" + +#~ msgid "" +#~ "The second way is to concatenate strings. For example, this Lua script will " +#~ "insert 10 rows with different primary-key values into table t: |br| ``for " +#~ "i=1,10,1 do`` |br| |nbsp| |nbsp| ``box.execute(\"insert into t values (\" .." +#~ " i .. \")\")`` |br| ``end`` |br| When creating SQL statements based on user " +#~ "input, application developers should beware of `SQL injection " +#~ "`_." +#~ msgstr "" + +#~ msgid "" +#~ "For some statements the returned value will contain a field named " +#~ "\"rowcount\". For example;" +#~ msgstr "" + +#~ msgid "" +#~ "For statements that cause generation of values for PRIMARY KEY AUTOINCREMENT" +#~ " columns, there will also be a field named \"autoincrement_ids\"." +#~ msgstr "" + +#~ msgid "" +#~ "For SELECT or PRAGMA statements, the returned value will be a *result set*, " +#~ "containing a field named \"metadata\" (a table with column names and " +#~ "Tarantool/NoSQL type names) and a field named \"rows\" (a table with the " +#~ "contents of each row)." +#~ msgstr "" + +#~ msgid "" +#~ "For example, for a statement ``SELECT \"x\" FROM t WHERE \"x\"=5;`` where " +#~ "``\"x\"`` is an INTEGER column and there is one row, a display on the " +#~ "Tarantool client will look like this:" +#~ msgstr "" + +#~ msgid "" +#~ "``span`` (always present) = the original expression in a select list, which " +#~ "will often be the same as ``name`` if the select list specifies a column " +#~ "name and nothing else, but otherwise will differ, for example after ``SELECT" +#~ " x+55 AS x FROM t;`` the ``name`` is X and the ``span`` is x+55. If ``span``" +#~ " and ``name`` are the same then the content is MP_NIL." +#~ msgstr "" + +#~ msgid "" +#~ "Alternative: if you are using the Tarantool server as a client, you can " +#~ "switch languages thus:" +#~ msgstr "" + +#~ msgid "" +#~ "There is also an ``execute()`` function available via :ref:`module net.box " +#~ "`, for example after ``conn = net_box.connect(url-string)`` " +#~ "one can say ``conn:execute(sql-statement])``." +#~ msgstr "" diff --git a/locale/ru/LC_MESSAGES/reference/reference_lua/box_stat.po b/locale/ru/LC_MESSAGES/reference/reference_lua/box_stat.po index 418fddcbea..ccf5b5c15a 100644 --- a/locale/ru/LC_MESSAGES/reference/reference_lua/box_stat.po +++ b/locale/ru/LC_MESSAGES/reference/reference_lua/box_stat.po @@ -6,557 +6,590 @@ msgid "" "The ``box.stat`` submodule provides access to request and network " "statistics." msgstr "" -"Вложенный модуль ``box.stat`` предоставляет доступ к статистике Tarantool " -"по запросам и использованию сети." +"Вложенный модуль ``box.stat`` предоставляет доступ к статистике Tarantool по" +" запросам и использованию сети." -msgid "" -"Use ``box.stat()`` to show the average number of requests per second, and " -"the total number of requests since startup, broken down by request type." +msgid "Below is a list of all ``box.stat`` functions." msgstr "" -"Используйте ``box.stat()``, чтобы узнать среднее количество запросов в " -"секунду и общее количество запросов с момента запуска с разбивкой по типу " -"запроса." -msgid "" -"Use ``box.stat.net()`` to see network activity: the number of bytes sent and" -" received, the number of connections, and the number of active requests " -"(current, average, and total)." +msgid "Name" msgstr "" -"Используйте ``box.stat.net()``, чтобы просмотреть статистику сетевой " -"активности: количество отправленных и полученных байтов, количество " -"соединений, а также количество активных запросов (текущее, среднее, общее)." -msgid "" -"Use ``box.stat.vinyl()`` to see vinyl-storage-engine activity, for example " -"``box.stat.vinyl().tx`` has the number of commits and rollbacks. See details" -" at :ref:`the end of this section `." +msgid "Use" msgstr "" -"Используйте ``box.stat.vinyl()``, чтобы просмотреть данные по работе движка " -"базы данных vinyl, например: ``box.stat.vinyl().tx`` содержит количество " -"коммитов и откатов. Более подробную информацию см. в :ref:`конце раздела " -"`." -msgid "" -"Use ``box.stat.reset()`` to reset the statistics of ``box.stat()``, " -"``box.stat.net()``, ``box.stat.vinyl()`` and :ref:`box.space.index " -"`." +msgid ":doc:`./box_stat/stat`" msgstr "" -"Используйте ``box.stat.reset()``, чтобы сбросить статистику ``box.stat()``, " -"``box.stat.net()``, ``box.stat.vinyl()`` и :ref:`box.space.index `." -msgid "In the tables that ``box.stat()`` returns:" -msgstr "В таблицах, которые возвращает ``box.stat()``:" - -msgid "" -"``total`` stands for \"total number of requests processed per second since " -"the server started\"," +msgid "Show request statistics" msgstr "" -"``total`` обозначает \"общее число запросов, обработанных в секунду, с " -"момента запуска сервера\"," -msgid "" -"``rps`` stands for \"average number of requests per second in the last 5 " -"seconds\"." +msgid ":doc:`./box_stat/net`" msgstr "" -"``rps`` обозначает \"среднее число запросов в секунду за последние 5 " -"секунд\"." -msgid "\"ERROR\" is the count of requests that resulted in an error." -msgstr "\"ERROR\" -- это счетчик запросов, которые завершились с ошибкой." - -msgid "In the tables that ``box.stat.net()`` returns:" -msgstr "В таблицах, которые возвращает ``box.stat.net()``:" - -msgid "" -"``SENT.rps`` and ``RECEIVED.rps`` -- average number of bytes sent/received " -"per second in the last 5 seconds" +msgid "Show network activity" msgstr "" -"``SENT.rps`` и ``RECEIVED.rps`` -- это среднее количество " -"отправленных/полученных байтов в секунду за последние 5 секунд" -msgid "" -"``SENT.total`` and ``RECEIVED.total`` -- total number of bytes sent/received" -" since the server started" +msgid ":doc:`./box_stat/vinyl`" msgstr "" -"``SENT.total`` и ``RECEIVED.total`` -- общее число байтов, " -"отправленных/полученных с момента запуска сервера" -msgid "" -"``CONNECTIONS.rps`` -- number of connections opened per second in the last 5" -" seconds" +msgid "Show vinyl-storage-engine activity" msgstr "" -"``CONNECTIONS.rps`` -- количество подключений, открытых в секунду, за " -"последние 5 секунд" -msgid "" -"``CONNECTIONS.total`` -- total number of connections opened since the server" -" started" +msgid ":doc:`./box_stat/reset`" msgstr "" -"``CONNECTIONS.total`` -- общее количество подключений, открытых с момента " -"запуска сервера" -msgid "" -"``REQUESTS.current`` -- number of requests in progress, which can be limited" -" by :ref:`box.cfg.net_msg_max `" +msgid "Reset the statistics" msgstr "" -"``REQUESTS.current`` -- количество запросов, находящихся в обработке, " -"которое может быть ограничено с помощью :ref:`box.cfg.net_msg_max " -"`" -msgid "" -"``REQUESTS.rps`` -- number of requests processed per second in the last 5 " -"seconds" -msgstr "" -"``REQUESTS.rps`` -- число запросов, обработанных в секунду, за последние 5 " -"секунд" - -msgid "``REQUESTS.total`` -- total number of requests processed since startup" -msgstr "" -"``REQUESTS.total`` -- общее число запросов, обработанных с момента запуска " -"сервера" +#~ msgid "" +#~ "Use ``box.stat()`` to show the average number of requests per second, and " +#~ "the total number of requests since startup, broken down by request type." +#~ msgstr "" +#~ "Используйте ``box.stat()``, чтобы узнать среднее количество запросов в " +#~ "секунду и общее количество запросов с момента запуска с разбивкой по типу " +#~ "запроса." -msgid "" -"tarantool> box.stat() -- return 11 tables\n" -"---\n" -"- DELETE:\n" -" total: 1873949\n" -" rps: 123\n" -" SELECT:\n" -" total: 1237723\n" -" rps: 4099\n" -" INSERT:\n" -" total: 0\n" -" rps: 0\n" -" EVAL:\n" -" total: 0\n" -" rps: 0\n" -" CALL:\n" -" total: 0\n" -" rps: 0\n" -" REPLACE:\n" -" total: 1239123\n" -" rps: 7849\n" -" UPSERT:\n" -" total: 0\n" -" rps: 0\n" -" AUTH:\n" -" total: 0\n" -" rps: 0\n" -" ERROR:\n" -" total: 0\n" -" rps: 0\n" -" EXECUTE:\n" -" total: 0\n" -" rps: 0\n" -" UPDATE:\n" -" total: 0\n" -" rps: 0\n" -"...\n" -"tarantool> box.stat().DELETE -- total + requests per second from one table\n" -"---\n" -"- total: 0\n" -" rps: 0\n" -"...\n" -"tarantool> box.stat.net() -- 4 tables\n" -"---\n" -"- SENT:\n" -" total: 0\n" -" rps: 0\n" -" CONNECTIONS:\n" -" current: 0\n" -" rps: 0\n" -" total: 0\n" -" REQUESTS:\n" -" current: 0\n" -" rps: 0\n" -" total: 0\n" -" RECEIVED:\n" -" total: 0\n" -" rps: 0\n" -"...\n" -"tarantool> box.stat.vinyl().tx.commit -- one item of the vinyl table\n" -"---\n" -"- 1047632\n" -"..." -msgstr "" -"tarantool> box.stat() -- вернуть 10 таблиц\n" -"---\n" -"- DELETE:\n" -" total: 1873949\n" -" rps: 123\n" -" SELECT:\n" -" total: 1237723\n" -" rps: 4099\n" -" INSERT:\n" -" total: 0\n" -" rps: 0\n" -" EVAL:\n" -" total: 0\n" -" rps: 0\n" -" CALL:\n" -" total: 0\n" -" rps: 0\n" -" REPLACE:\n" -" total: 1239123\n" -" rps: 7849\n" -" UPSERT:\n" -" total: 0\n" -" rps: 0\n" -" AUTH:\n" -" total: 0\n" -" rps: 0\n" -" ERROR:\n" -" total: 0\n" -" rps: 0\n" -" UPDATE:\n" -" total: 0\n" -" rps: 0\n" -"...\n" -"tarantool> box.stat().DELETE -- всего + запросов в секунду из одной таблицы\n" -"---\n" -"- total: 0\n" -" rps: 0\n" -"...\n" -"tarantool> box.stat.net() -- 4 таблицы\n" -"---\n" -"- SENT:\n" -" total: 0\n" -" rps: 0\n" -" CONNECTIONS:\n" -" current: 0\n" -" rps: 0\n" -" total: 0\n" -" REQUESTS:\n" -" current: 0\n" -" rps: 0\n" -" total: 0\n" -" RECEIVED:\n" -" total: 0\n" -" rps: 0\n" -"...\n" -"tarantool> box.stat.vinyl().tx.commit -- один пункт из таблицы vinyl\n" -"---\n" -"- 1047632\n" -"..." - -msgid "Here are details about the ``box.stat.vinyl()`` items." -msgstr "" -"Ниже приводится подробная информация о пунктах в ``box.stat.vinyl()``." - -msgid "" -"**Details about box.stat.vinyl().regulator:** The vinyl regulator decides " -"when to take or delay actions for disk IO, grouping activity in batches so " -"that it is consistent and efficient. The regulator is invoked by the vinyl " -"scheduler, once per second, and updates related variables whenever it is " -"invoked." -msgstr "" -"**Подробная информация о box.stat.vinyl().regulator:** Регулятор vinyl'а " -"определяет, когда следует предпринимать или отложить действия по дисковому " -"вводу-выводу, путем группировки действий в пакеты так, чтобы обеспечить " -"согласованность и эффективность. Регулятор вызывается планировщиком vinyl'а " -"раз в секунду и обновляет соответствующие переменные при каждом вызове." - -msgid "" -"``box.stat.vinyl().regulator.dump_bandwidth`` is the estimated average rate " -"at which dumps are done. Initially this will appear as 10485760 (10 " -"megabytes per second). Only significant dumps (larger than one megabyte) are" -" used for estimating." -msgstr "" -"``box.stat.vinyl().regulator.dump_bandwidth`` представляет собой " -"предполагаемую среднюю скорость создания дампов. Изначально она составляет " -"10 485 760 (10 мегабайтов в секунду). Только значительные дампы (более " -"одного мегабайта) используются при оценке." +#~ msgid "" +#~ "Use ``box.stat.net()`` to see network activity: the number of bytes sent and" +#~ " received, the number of connections, and the number of active requests " +#~ "(current, average, and total)." +#~ msgstr "" +#~ "Используйте ``box.stat.net()``, чтобы просмотреть статистику сетевой " +#~ "активности: количество отправленных и полученных байтов, количество " +#~ "соединений, а также количество активных запросов (текущее, среднее, общее)." -msgid "" -"``box.stat.vinyl().regulator.dump_watermark`` is the point when dumping must" -" occur. The value is slightly smaller than the amount of memory that is " -"allocated for vinyl trees, which is the :ref:`vinyl_memory ` parameter." -msgstr "" -"``box.stat.vinyl().regulator.dump_watermark`` -- это точка, когда должно " -"произойти создание дампа. Это значение несколько меньше объема памяти, " -"выделенного для деревьев в vinyl'е, которое указано в параметре " -":ref:`vinyl_memory `." - -msgid "" -"``box.stat.vinyl().regulator.write_rate`` is the actual average rate at " -"which recent writes to disk are done. Averaging is done over a 5-second time" -" window, so if there has been no activity for 5 seconds then " -"``regulator.write_rate = 0``. The ``write_rate`` may be slowed when a dump " -"is in progress or when the user has set :ref:`snap_io_rate_limit " -"`." -msgstr "" -"``box.stat.vinyl().regulator.write_rate`` представляет собой действительную " -"среднюю скорость записи последних данных на диск. Средняя скорость " -"вычисляется в течение 5-секундного интервала, поэтому если за последние 5 " -"секунд ничего не происходило, то ``regulator.write_rate = 0``. Скорость " -"``write_rate`` может замедлиться во время создания дампа, или если " -"пользователь задал предел :ref:`snap_io_rate_limit " -"`." - -msgid "" -"``box.stat.vinyl().regulator.rate_limit`` is the write rate limit, in bytes " -"per second, imposed on transactions by the regulator based on the observed " -"dump/compaction performance." -msgstr "" -"``box.stat.vinyl().regulator.rate_limit`` -- это предел скорости записи в " -"байтах в секунду, который налагается регулятором на основании установленной " -"производительности создания дампов / слияния." - -msgid "" -"**Details about box.stat.vinyl().disk:** Since vinyl is an on-disk storage " -"engine (unlike memtx which is an in-memory storage engine), it can handle " -"large databases -- but if a database is larger than the amount of memory " -"that is allocated for vinyl, then there will be more disk activity." -msgstr "" -"**Подробная информация о box.stat.vinyl().disk:** Поскольку vinyl является " -"дисковым движком базы данных (в отличие от memtx'а, который представляет " -"собой in-memory движок), он может обрабатывать большие базы данных -- однако" -" если база данных больше объема памяти, выделенного для vinyl'а, дисковых " -"операций будет больше." - -msgid "" -"``box.stat.vinyl().disk.data`` and ``box.stat.vinyl().disk.index`` are the " -"amount of data that has gone into files in a subdirectory of :ref:`vinyl_dir" -" `, with names like ``{lsn}.run`` and ``{lsn}.index``. " -"The size of the run will be related to the output of ``scheduler.dump_*``." -msgstr "" -"``box.stat.vinyl().disk.data`` и ``box.stat.vinyl().disk.index`` содержат " -"объем данных, который поступил в файлы во вложенной директории " -":ref:`vinyl_dir ` с именами вида ``{lsn}.run`` и " -"``{lsn}.index``. Размер файла run зависит от вывода ``scheduler.dump_*``." - -msgid "" -"``box.stat.vinyl().disk.data_compacted`` Sum size of data stored at the last" -" LSM tree level, in bytes, without taking disk compression into account. It " -"can be thought of as the size of disk space that the user data would occupy " -"if there were no compression, indexing, or space increase caused by the LSM " -"tree design." -msgstr "" -"``box.stat.vinyl().disk.data_compacted`` представляет собой общий размер " -"данных, которые хранятся на последнем уровне LSM-дерева, в байтах. При этом " -"не учитывается сжатие диска. Его можно рассматривать как размер места на " -"диске, которое заняли бы пользовательские данные, если бы не было " -"компрессии, индексирования или увеличения спейса, вызванного конструкцией " -"LSM-дерева." - -msgid "" -"**Details about box.stat.vinyl().memory:** Although the vinyl storage engine" -" is not \"in-memory\", Tarantool does need to have memory for write buffers " -"and for caches:" -msgstr "" -"**Подробная информация о box.stat.vinyl().memory:** Хотя движок базы данных " -"vinyl не является \"in-memory\", Tarantool всё же требуется память для " -"записи буфера и для кэша:" - -msgid "" -"``box.stat.vinyl().memory.tuple_cache`` is the number of bytes that are " -"being used for tuples (data)." -msgstr "" -"``box.stat.vinyl().memory.tuple_cache`` содержит количество байтов, " -"используемых для кортежей (данные)." - -msgid "" -"``box.stat.vinyl().memory.tx`` is transactional memory. This will usually be" -" 0." -msgstr "" -"``box.stat.vinyl().memory.tx`` -- это транзакционная память, как правило, " -"равная 0." - -msgid "" -"``box.stat.vinyl().memory.level0`` is the \"level0\" memory area, sometimes " -"abbreviated \"L0\", which is the area that vinyl can use for in-memory " -"storage of an LSM tree." -msgstr "" -"``box.stat.vinyl().memory.level0`` -- это объем памяти уровня 0 \"level0\", " -"который иногда сокращается до \"L0\" и представляет собой область, которую " -"vinyl может использовать для хранения данных в оперативной памяти в LSM-" -"дереве." - -msgid "" -"Therefore we can say that \"L0 is becoming full\" when the amount in " -"``memory.level0`` is close to the maximum, which is " -":ref:`regulator.dump_watermark `. We can expect that \"L0 = 0\" immediately after " -"a dump. ``box.stat.vinyl().memory.page_index`` and " -"``box.stat.vinyl().memory.bloom_filter`` have the current amount being used " -"for index-related structures. The size is a function of the number and size " -"of keys, plus :ref:`vinyl_page_size `, plus " -":ref:`vinyl_bloom_fpr `. This is not a count of" -" bloom filter \"hits\" (the number of reads that could be avoided because " -"the bloom filter predicts their presence in a run file) -- that statistic " -"can be found with :doc:`/reference/reference_lua/box_index/stat`." -msgstr "" -"Таким образом, можно сказать, что \"L0 заполняется\", когда объем данных в " -"``memory.level0`` приближается к максимальному, а именно " -":ref:`regulator.dump_watermark `. Можно ожидать, что \"L0 = 0\" сразу после " -"создания дампа. Текущий объем в ``box.stat.vinyl().memory.page_index`` и " -"``box.stat.vinyl().memory.bloom_filter`` используется для структур, " -"связанных с индексами. Размер -- это количество и размер ключей плюс " -":ref:`vinyl_page_size ` плюс " -":ref:`vinyl_bloom_fpr `. Это не счетчик " -"совпадений по фильтру Блума (количество чтений, которых можно избежать, " -"поскольку фильтра Блума предсказывает их наличие в файле типа run) -- эта " -"статистика указана в :doc:`/reference/reference_lua/box_index/stat`." - -msgid "" -"**Details about box.stat.vinyl().tx:** This is about requests that affect " -"transactional activity (\"tx\" is used here as an abbreviation for " -"\"transaction\"):" -msgstr "" -"**Подробная информация о box.stat.vinyl().tx:** Информация о запросах, " -"которые влияют на операции транзакций (\"tx\" используется в качестве " -"сокращения слова \"транзакция\"):" - -msgid "" -"``box.stat.vinyl().tx.conflict`` counts conflicts that caused a transaction " -"to roll back." -msgstr "" -"``box.stat.vinyl().tx.conflict`` содержит счетчик конфликтов, которые " -"вызвали откат транзакции." - -msgid "" -"``box.stat.vinyl().tx.commit`` is the count of commits (successful " -"transaction ends). It includes implicit commits, for example any insert " -"causes a commit unless it is within a begin-end block." -msgstr "" -"``box.stat.vinyl().tx.commit`` -- это счетчик коммитов (успешно завершенных " -"транзакций). Он включает в себя неявные коммиты, например, любая вставка " -"вызывает коммит, если она не входит в блок begin-end." - -msgid "" -"``box.stat.vinyl().tx.rollback`` is the count of rollbacks (unsuccessful " -"transaction ends). This is not merely a count of explicit " -":doc:`/reference/reference_lua/box_txn_management/rollback` requests -- it " -"includes requests that ended in errors. For example, after an attempted " -"insert request that causes a \"Duplicate key exists in unique index\" error," -" ``tx.rollback`` is incremented." -msgstr "" -"``box.stat.vinyl().tx.rollback`` -- это счетчик откатов (невыполненные " -"транзакции). Это не просто счетчик явных запросов " -":doc:`/reference/reference_lua/box_txn_management/rollback`, он также " -"включает в себя запросы, которые привели к ошибке. Например, после попытки " -"вставки, в результате которой была выведена ошибка наличия дубликата ключа " -"\"Duplicate key exists in unique index\", значение счетчика ``tx.rollback`` " -"увеличивается." - -msgid "``box.stat.vinyl().tx.statements`` will usually be 0." -msgstr "``box.stat.vinyl().tx.statements``, как правило, будет равен 0." - -msgid "" -"``box.stat.vinyl().tx.transactions`` is the number of transactions that are " -"currently running." -msgstr "" -"``box.stat.vinyl().tx.transactions`` содержит количество текущих транзакций." - -msgid "" -"``box.stat.vinyl().tx.gap_locks`` is the number of gap locks that are " -"outstanding during execution of a request. For a low-level description of " -"Tarantool's implementation of gap locking, see `Gap locks in Vinyl " -"transaction manager `_." -msgstr "" -"``box.stat.vinyl().tx.gap_locks`` представляет собой число блокировок " -"разрывов во время выполнения запроса. Чтобы получить низкоуровневое описание" -" имплементации блокировки разрывов в Tarantool, см. `Блокировка разрывов в" -" менеджере транзакций Vinyl'а " -"`_." - -msgid "" -"``box.stat.vinyl().tx.read_views`` shows whether a transaction has entered a" -" read-only state to avoid conflict temporarily. This will usually be 0." -msgstr "" -"``box.stat.vinyl().tx.read_views`` показывает, получила ли транзакция статус" -" только для чтения, во избежание временного конфликта. Как правило, 0." - -msgid "" -"**Details about box.stat.vinyl().scheduler:** This primarily has counters " -"related to tasks that the scheduler has arranged for dumping or compaction: " -"(most of these items are reset to 0 when the server restarts or when " -":ref:`box.stat.reset() ` occurs):" -msgstr "" -"**Подробная информация о box.stat.vinyl().scheduler:** В основном содержит " -"счетчики, связанные с задачами планировщика по созданию дампов или слиянию: " -"(большинство сбрасываются на 0 при перезапуске сервера или вызове " -":ref:`box.stat.reset() `):" - -msgid "" -"``box.stat.vinyl().scheduler.compaction_*`` is the amount of data from " -"recent changes that has been :doc:`compacted " -"`. This is divided into " -"``scheduler.compaction_input`` (the amount that is being compacted), " -"``scheduler.compaction_queue`` (the amount that is waiting to be compacted)," -" ``scheduler.compaction_time`` (total time spent by all worker threads " -"performing compaction, in seconds), and ``scheduler.compaction_output`` (the" -" amount that has been compacted, which is presumably smaller than " -"``scheduler.compaction_input``)." -msgstr "" -"``box.stat.vinyl().scheduler.compaction_*`` содержит объем данных из " -"последних изменений, для которых было произведено :doc:`compacted " -"`. Он подразделяется на " -"``scheduler.compaction_input`` (объем данных текущего слияния), " -"``scheduler.compaction_queue`` (объем данных в ожидании слияния), " -"``scheduler.compaction_time`` (общее время, затраченное рабочими потоками на" -" слияние, в секундах) и ``scheduler.compaction_output`` (объем данных после " -"слияния, который, предположительно, меньше ``scheduler.compaction_input``)." - -msgid "" -"``box.stat.vinyl().scheduler.tasks_*`` is about dump/compaction tasks, in " -"three categories, ``scheduler.tasks_inprogress`` (currently running), " -"``scheduler.tasks_completed`` (successfully completed) " -"``scheduler.tasks_failed`` (aborted due to errors)." -msgstr "" -"``box.stat.vinyl().scheduler.tasks_*`` содержит информацию о задачах по " -"созданию дампов или слиянию, разделенную на три категории: " -"``scheduler.tasks_inprogress`` (текущие), ``scheduler.tasks_completed`` " -"(успешно завершенные) ``scheduler.tasks_failed`` (прерванные из-за ошибки)." - -msgid "" -"``box.stat.vinyl().scheduler.dump_*`` has the amount of data from recent " -"changes that has been dumped, including ``dump_time`` (total time spent by " -"all worker threads performing dumps, in seconds), and ``dump_count`` (the " -"count of completed dumps), ``dump_input`` and ``dump_output``." -msgstr "" -"``box.stat.vinyl().scheduler.dump_*`` содержит объем данных из последних " -"изменений, для которых был создан дамп, включая ``dump_time`` (общее время, " -"затраченное рабочими потоками на создание дампов, в секундах) и " -"``dump_count`` (счетчик созданных дампов), ``dump_input`` и ``dump_output``." - -msgid "" -"A \"dump\" is explained in section :ref:`Storing data with vinyl `:" -msgstr "" -"Понятие \"дамп\" (dump) объясняется в разделе :ref:`Хранение данных с " -"помощью vinyl `:" - -msgid "" -"Sooner or later the number of elements in an LSM tree exceeds the L0 size " -"and that is when L0 gets written to a file on disk (called a 'run') and then" -" cleared for storing new elements. This operation is called a 'dump'." -msgstr "" -"Рано или поздно количество элементов в дереве превысит размер L0. Тогда L0 " -"записывается в файл на диске (который называется забегом -- 'run') и " -"освобождается под новые элементы. Эта операция называется 'дамп' (dump)." - -msgid "" -"Thus it can be predicted that a dump will occur if the size of L0 (which is " -":ref:`memory.level0 `) is " -"approaching the maximum (which is :ref:`regulator.dump_watermark " -"`) and a dump is not already in " -"progress. In fact Tarantool will try to arrange a dump before this hard " -"limit is reached." -msgstr "" -"Таким образом, можно предсказать создание дампа, если размер L0 (указан в " -":ref:`memory.level0 `) приближается" -" к максимальному (указан в :ref:`regulator.dump_watermark " -"`), и создание дампа еще не " -"началось. На самом деле Tarantool планирует дамп до достижения предела." - -msgid "" -"A dump will also occur during a :doc:`snapshot " -"` operation." -msgstr "" -"Дамп также создается во время операции создания :doc:`снимка " -"`." +#~ msgid "" +#~ "Use ``box.stat.vinyl()`` to see vinyl-storage-engine activity, for example " +#~ "``box.stat.vinyl().tx`` has the number of commits and rollbacks. See details" +#~ " at :ref:`the end of this section `." +#~ msgstr "" +#~ "Используйте ``box.stat.vinyl()``, чтобы просмотреть данные по работе движка " +#~ "базы данных vinyl, например: ``box.stat.vinyl().tx`` содержит количество " +#~ "коммитов и откатов. Более подробную информацию см. в :ref:`конце раздела " +#~ "`." + +#~ msgid "" +#~ "Use ``box.stat.reset()`` to reset the statistics of ``box.stat()``, " +#~ "``box.stat.net()``, ``box.stat.vinyl()`` and :ref:`box.space.index " +#~ "`." +#~ msgstr "" +#~ "Используйте ``box.stat.reset()``, чтобы сбросить статистику ``box.stat()``, " +#~ "``box.stat.net()``, ``box.stat.vinyl()`` и :ref:`box.space.index `." + +#~ msgid "In the tables that ``box.stat()`` returns:" +#~ msgstr "В таблицах, которые возвращает ``box.stat()``:" + +#~ msgid "" +#~ "``total`` stands for \"total number of requests processed per second since " +#~ "the server started\"," +#~ msgstr "" +#~ "``total`` обозначает \"общее число запросов, обработанных в секунду, с " +#~ "момента запуска сервера\"," + +#~ msgid "" +#~ "``rps`` stands for \"average number of requests per second in the last 5 " +#~ "seconds\"." +#~ msgstr "" +#~ "``rps`` обозначает \"среднее число запросов в секунду за последние 5 " +#~ "секунд\"." + +#~ msgid "\"ERROR\" is the count of requests that resulted in an error." +#~ msgstr "\"ERROR\" -- это счетчик запросов, которые завершились с ошибкой." + +#~ msgid "In the tables that ``box.stat.net()`` returns:" +#~ msgstr "В таблицах, которые возвращает ``box.stat.net()``:" + +#~ msgid "" +#~ "``SENT.rps`` and ``RECEIVED.rps`` -- average number of bytes sent/received " +#~ "per second in the last 5 seconds" +#~ msgstr "" +#~ "``SENT.rps`` и ``RECEIVED.rps`` -- это среднее количество " +#~ "отправленных/полученных байтов в секунду за последние 5 секунд" + +#~ msgid "" +#~ "``SENT.total`` and ``RECEIVED.total`` -- total number of bytes sent/received" +#~ " since the server started" +#~ msgstr "" +#~ "``SENT.total`` и ``RECEIVED.total`` -- общее число байтов, " +#~ "отправленных/полученных с момента запуска сервера" + +#~ msgid "" +#~ "``CONNECTIONS.rps`` -- number of connections opened per second in the last 5" +#~ " seconds" +#~ msgstr "" +#~ "``CONNECTIONS.rps`` -- количество подключений, открытых в секунду, за " +#~ "последние 5 секунд" + +#~ msgid "" +#~ "``CONNECTIONS.total`` -- total number of connections opened since the server" +#~ " started" +#~ msgstr "" +#~ "``CONNECTIONS.total`` -- общее количество подключений, открытых с момента " +#~ "запуска сервера" + +#~ msgid "" +#~ "``REQUESTS.current`` -- number of requests in progress, which can be limited" +#~ " by :ref:`box.cfg.net_msg_max `" +#~ msgstr "" +#~ "``REQUESTS.current`` -- количество запросов, находящихся в обработке, " +#~ "которое может быть ограничено с помощью :ref:`box.cfg.net_msg_max " +#~ "`" + +#~ msgid "" +#~ "``REQUESTS.rps`` -- number of requests processed per second in the last 5 " +#~ "seconds" +#~ msgstr "" +#~ "``REQUESTS.rps`` -- число запросов, обработанных в секунду, за последние 5 " +#~ "секунд" + +#~ msgid "``REQUESTS.total`` -- total number of requests processed since startup" +#~ msgstr "" +#~ "``REQUESTS.total`` -- общее число запросов, обработанных с момента запуска " +#~ "сервера" + +#~ msgid "" +#~ "tarantool> box.stat() -- return 11 tables\n" +#~ "---\n" +#~ "- DELETE:\n" +#~ " total: 1873949\n" +#~ " rps: 123\n" +#~ " SELECT:\n" +#~ " total: 1237723\n" +#~ " rps: 4099\n" +#~ " INSERT:\n" +#~ " total: 0\n" +#~ " rps: 0\n" +#~ " EVAL:\n" +#~ " total: 0\n" +#~ " rps: 0\n" +#~ " CALL:\n" +#~ " total: 0\n" +#~ " rps: 0\n" +#~ " REPLACE:\n" +#~ " total: 1239123\n" +#~ " rps: 7849\n" +#~ " UPSERT:\n" +#~ " total: 0\n" +#~ " rps: 0\n" +#~ " AUTH:\n" +#~ " total: 0\n" +#~ " rps: 0\n" +#~ " ERROR:\n" +#~ " total: 0\n" +#~ " rps: 0\n" +#~ " EXECUTE:\n" +#~ " total: 0\n" +#~ " rps: 0\n" +#~ " UPDATE:\n" +#~ " total: 0\n" +#~ " rps: 0\n" +#~ "...\n" +#~ "tarantool> box.stat().DELETE -- total + requests per second from one table\n" +#~ "---\n" +#~ "- total: 0\n" +#~ " rps: 0\n" +#~ "...\n" +#~ "tarantool> box.stat.net() -- 4 tables\n" +#~ "---\n" +#~ "- SENT:\n" +#~ " total: 0\n" +#~ " rps: 0\n" +#~ " CONNECTIONS:\n" +#~ " current: 0\n" +#~ " rps: 0\n" +#~ " total: 0\n" +#~ " REQUESTS:\n" +#~ " current: 0\n" +#~ " rps: 0\n" +#~ " total: 0\n" +#~ " RECEIVED:\n" +#~ " total: 0\n" +#~ " rps: 0\n" +#~ "...\n" +#~ "tarantool> box.stat.vinyl().tx.commit -- one item of the vinyl table\n" +#~ "---\n" +#~ "- 1047632\n" +#~ "..." +#~ msgstr "" +#~ "tarantool> box.stat() -- вернуть 10 таблиц\n" +#~ "---\n" +#~ "- DELETE:\n" +#~ " total: 1873949\n" +#~ " rps: 123\n" +#~ " SELECT:\n" +#~ " total: 1237723\n" +#~ " rps: 4099\n" +#~ " INSERT:\n" +#~ " total: 0\n" +#~ " rps: 0\n" +#~ " EVAL:\n" +#~ " total: 0\n" +#~ " rps: 0\n" +#~ " CALL:\n" +#~ " total: 0\n" +#~ " rps: 0\n" +#~ " REPLACE:\n" +#~ " total: 1239123\n" +#~ " rps: 7849\n" +#~ " UPSERT:\n" +#~ " total: 0\n" +#~ " rps: 0\n" +#~ " AUTH:\n" +#~ " total: 0\n" +#~ " rps: 0\n" +#~ " ERROR:\n" +#~ " total: 0\n" +#~ " rps: 0\n" +#~ " UPDATE:\n" +#~ " total: 0\n" +#~ " rps: 0\n" +#~ "...\n" +#~ "tarantool> box.stat().DELETE -- всего + запросов в секунду из одной таблицы\n" +#~ "---\n" +#~ "- total: 0\n" +#~ " rps: 0\n" +#~ "...\n" +#~ "tarantool> box.stat.net() -- 4 таблицы\n" +#~ "---\n" +#~ "- SENT:\n" +#~ " total: 0\n" +#~ " rps: 0\n" +#~ " CONNECTIONS:\n" +#~ " current: 0\n" +#~ " rps: 0\n" +#~ " total: 0\n" +#~ " REQUESTS:\n" +#~ " current: 0\n" +#~ " rps: 0\n" +#~ " total: 0\n" +#~ " RECEIVED:\n" +#~ " total: 0\n" +#~ " rps: 0\n" +#~ "...\n" +#~ "tarantool> box.stat.vinyl().tx.commit -- один пункт из таблицы vinyl\n" +#~ "---\n" +#~ "- 1047632\n" +#~ "..." + +#~ msgid "Here are details about the ``box.stat.vinyl()`` items." +#~ msgstr "" +#~ "Ниже приводится подробная информация о пунктах в ``box.stat.vinyl()``." + +#~ msgid "" +#~ "**Details about box.stat.vinyl().regulator:** The vinyl regulator decides " +#~ "when to take or delay actions for disk IO, grouping activity in batches so " +#~ "that it is consistent and efficient. The regulator is invoked by the vinyl " +#~ "scheduler, once per second, and updates related variables whenever it is " +#~ "invoked." +#~ msgstr "" +#~ "**Подробная информация о box.stat.vinyl().regulator:** Регулятор vinyl'а " +#~ "определяет, когда следует предпринимать или отложить действия по дисковому " +#~ "вводу-выводу, путем группировки действий в пакеты так, чтобы обеспечить " +#~ "согласованность и эффективность. Регулятор вызывается планировщиком vinyl'а " +#~ "раз в секунду и обновляет соответствующие переменные при каждом вызове." + +#~ msgid "" +#~ "``box.stat.vinyl().regulator.dump_bandwidth`` is the estimated average rate " +#~ "at which dumps are done. Initially this will appear as 10485760 (10 " +#~ "megabytes per second). Only significant dumps (larger than one megabyte) are" +#~ " used for estimating." +#~ msgstr "" +#~ "``box.stat.vinyl().regulator.dump_bandwidth`` представляет собой " +#~ "предполагаемую среднюю скорость создания дампов. Изначально она составляет " +#~ "10 485 760 (10 мегабайтов в секунду). Только значительные дампы (более " +#~ "одного мегабайта) используются при оценке." + +#~ msgid "" +#~ "``box.stat.vinyl().regulator.dump_watermark`` is the point when dumping must" +#~ " occur. The value is slightly smaller than the amount of memory that is " +#~ "allocated for vinyl trees, which is the :ref:`vinyl_memory ` parameter." +#~ msgstr "" +#~ "``box.stat.vinyl().regulator.dump_watermark`` -- это точка, когда должно " +#~ "произойти создание дампа. Это значение несколько меньше объема памяти, " +#~ "выделенного для деревьев в vinyl'е, которое указано в параметре " +#~ ":ref:`vinyl_memory `." + +#~ msgid "" +#~ "``box.stat.vinyl().regulator.write_rate`` is the actual average rate at " +#~ "which recent writes to disk are done. Averaging is done over a 5-second time" +#~ " window, so if there has been no activity for 5 seconds then " +#~ "``regulator.write_rate = 0``. The ``write_rate`` may be slowed when a dump " +#~ "is in progress or when the user has set :ref:`snap_io_rate_limit " +#~ "`." +#~ msgstr "" +#~ "``box.stat.vinyl().regulator.write_rate`` представляет собой действительную " +#~ "среднюю скорость записи последних данных на диск. Средняя скорость " +#~ "вычисляется в течение 5-секундного интервала, поэтому если за последние 5 " +#~ "секунд ничего не происходило, то ``regulator.write_rate = 0``. Скорость " +#~ "``write_rate`` может замедлиться во время создания дампа, или если " +#~ "пользователь задал предел :ref:`snap_io_rate_limit " +#~ "`." + +#~ msgid "" +#~ "``box.stat.vinyl().regulator.rate_limit`` is the write rate limit, in bytes " +#~ "per second, imposed on transactions by the regulator based on the observed " +#~ "dump/compaction performance." +#~ msgstr "" +#~ "``box.stat.vinyl().regulator.rate_limit`` -- это предел скорости записи в " +#~ "байтах в секунду, который налагается регулятором на основании установленной " +#~ "производительности создания дампов / слияния." + +#~ msgid "" +#~ "**Details about box.stat.vinyl().disk:** Since vinyl is an on-disk storage " +#~ "engine (unlike memtx which is an in-memory storage engine), it can handle " +#~ "large databases -- but if a database is larger than the amount of memory " +#~ "that is allocated for vinyl, then there will be more disk activity." +#~ msgstr "" +#~ "**Подробная информация о box.stat.vinyl().disk:** Поскольку vinyl является " +#~ "дисковым движком базы данных (в отличие от memtx'а, который представляет " +#~ "собой in-memory движок), он может обрабатывать большие базы данных -- однако" +#~ " если база данных больше объема памяти, выделенного для vinyl'а, дисковых " +#~ "операций будет больше." + +#~ msgid "" +#~ "``box.stat.vinyl().disk.data`` and ``box.stat.vinyl().disk.index`` are the " +#~ "amount of data that has gone into files in a subdirectory of :ref:`vinyl_dir" +#~ " `, with names like ``{lsn}.run`` and ``{lsn}.index``. " +#~ "The size of the run will be related to the output of ``scheduler.dump_*``." +#~ msgstr "" +#~ "``box.stat.vinyl().disk.data`` и ``box.stat.vinyl().disk.index`` содержат " +#~ "объем данных, который поступил в файлы во вложенной директории " +#~ ":ref:`vinyl_dir ` с именами вида ``{lsn}.run`` и " +#~ "``{lsn}.index``. Размер файла run зависит от вывода ``scheduler.dump_*``." + +#~ msgid "" +#~ "``box.stat.vinyl().disk.data_compacted`` Sum size of data stored at the last" +#~ " LSM tree level, in bytes, without taking disk compression into account. It " +#~ "can be thought of as the size of disk space that the user data would occupy " +#~ "if there were no compression, indexing, or space increase caused by the LSM " +#~ "tree design." +#~ msgstr "" +#~ "``box.stat.vinyl().disk.data_compacted`` представляет собой общий размер " +#~ "данных, которые хранятся на последнем уровне LSM-дерева, в байтах. При этом " +#~ "не учитывается сжатие диска. Его можно рассматривать как размер места на " +#~ "диске, которое заняли бы пользовательские данные, если бы не было " +#~ "компрессии, индексирования или увеличения спейса, вызванного конструкцией " +#~ "LSM-дерева." + +#~ msgid "" +#~ "**Details about box.stat.vinyl().memory:** Although the vinyl storage engine" +#~ " is not \"in-memory\", Tarantool does need to have memory for write buffers " +#~ "and for caches:" +#~ msgstr "" +#~ "**Подробная информация о box.stat.vinyl().memory:** Хотя движок базы данных " +#~ "vinyl не является \"in-memory\", Tarantool всё же требуется память для " +#~ "записи буфера и для кэша:" + +#~ msgid "" +#~ "``box.stat.vinyl().memory.tuple_cache`` is the number of bytes that are " +#~ "being used for tuples (data)." +#~ msgstr "" +#~ "``box.stat.vinyl().memory.tuple_cache`` содержит количество байтов, " +#~ "используемых для кортежей (данные)." + +#~ msgid "" +#~ "``box.stat.vinyl().memory.tx`` is transactional memory. This will usually be" +#~ " 0." +#~ msgstr "" +#~ "``box.stat.vinyl().memory.tx`` -- это транзакционная память, как правило, " +#~ "равная 0." + +#~ msgid "" +#~ "``box.stat.vinyl().memory.level0`` is the \"level0\" memory area, sometimes " +#~ "abbreviated \"L0\", which is the area that vinyl can use for in-memory " +#~ "storage of an LSM tree." +#~ msgstr "" +#~ "``box.stat.vinyl().memory.level0`` -- это объем памяти уровня 0 \"level0\", " +#~ "который иногда сокращается до \"L0\" и представляет собой область, которую " +#~ "vinyl может использовать для хранения данных в оперативной памяти в LSM-" +#~ "дереве." + +#~ msgid "" +#~ "Therefore we can say that \"L0 is becoming full\" when the amount in " +#~ "``memory.level0`` is close to the maximum, which is " +#~ ":ref:`regulator.dump_watermark `. We can expect that \"L0 = 0\" immediately after " +#~ "a dump. ``box.stat.vinyl().memory.page_index`` and " +#~ "``box.stat.vinyl().memory.bloom_filter`` have the current amount being used " +#~ "for index-related structures. The size is a function of the number and size " +#~ "of keys, plus :ref:`vinyl_page_size `, plus " +#~ ":ref:`vinyl_bloom_fpr `. This is not a count of" +#~ " bloom filter \"hits\" (the number of reads that could be avoided because " +#~ "the bloom filter predicts their presence in a run file) -- that statistic " +#~ "can be found with :doc:`/reference/reference_lua/box_index/stat`." +#~ msgstr "" +#~ "Таким образом, можно сказать, что \"L0 заполняется\", когда объем данных в " +#~ "``memory.level0`` приближается к максимальному, а именно " +#~ ":ref:`regulator.dump_watermark `. Можно ожидать, что \"L0 = 0\" сразу после " +#~ "создания дампа. Текущий объем в ``box.stat.vinyl().memory.page_index`` и " +#~ "``box.stat.vinyl().memory.bloom_filter`` используется для структур, " +#~ "связанных с индексами. Размер -- это количество и размер ключей плюс " +#~ ":ref:`vinyl_page_size ` плюс " +#~ ":ref:`vinyl_bloom_fpr `. Это не счетчик " +#~ "совпадений по фильтру Блума (количество чтений, которых можно избежать, " +#~ "поскольку фильтра Блума предсказывает их наличие в файле типа run) -- эта " +#~ "статистика указана в :doc:`/reference/reference_lua/box_index/stat`." + +#~ msgid "" +#~ "**Details about box.stat.vinyl().tx:** This is about requests that affect " +#~ "transactional activity (\"tx\" is used here as an abbreviation for " +#~ "\"transaction\"):" +#~ msgstr "" +#~ "**Подробная информация о box.stat.vinyl().tx:** Информация о запросах, " +#~ "которые влияют на операции транзакций (\"tx\" используется в качестве " +#~ "сокращения слова \"транзакция\"):" + +#~ msgid "" +#~ "``box.stat.vinyl().tx.conflict`` counts conflicts that caused a transaction " +#~ "to roll back." +#~ msgstr "" +#~ "``box.stat.vinyl().tx.conflict`` содержит счетчик конфликтов, которые " +#~ "вызвали откат транзакции." + +#~ msgid "" +#~ "``box.stat.vinyl().tx.commit`` is the count of commits (successful " +#~ "transaction ends). It includes implicit commits, for example any insert " +#~ "causes a commit unless it is within a begin-end block." +#~ msgstr "" +#~ "``box.stat.vinyl().tx.commit`` -- это счетчик коммитов (успешно завершенных " +#~ "транзакций). Он включает в себя неявные коммиты, например, любая вставка " +#~ "вызывает коммит, если она не входит в блок begin-end." + +#~ msgid "" +#~ "``box.stat.vinyl().tx.rollback`` is the count of rollbacks (unsuccessful " +#~ "transaction ends). This is not merely a count of explicit " +#~ ":doc:`/reference/reference_lua/box_txn_management/rollback` requests -- it " +#~ "includes requests that ended in errors. For example, after an attempted " +#~ "insert request that causes a \"Duplicate key exists in unique index\" error," +#~ " ``tx.rollback`` is incremented." +#~ msgstr "" +#~ "``box.stat.vinyl().tx.rollback`` -- это счетчик откатов (невыполненные " +#~ "транзакции). Это не просто счетчик явных запросов " +#~ ":doc:`/reference/reference_lua/box_txn_management/rollback`, он также " +#~ "включает в себя запросы, которые привели к ошибке. Например, после попытки " +#~ "вставки, в результате которой была выведена ошибка наличия дубликата ключа " +#~ "\"Duplicate key exists in unique index\", значение счетчика ``tx.rollback`` " +#~ "увеличивается." + +#~ msgid "``box.stat.vinyl().tx.statements`` will usually be 0." +#~ msgstr "``box.stat.vinyl().tx.statements``, как правило, будет равен 0." + +#~ msgid "" +#~ "``box.stat.vinyl().tx.transactions`` is the number of transactions that are " +#~ "currently running." +#~ msgstr "" +#~ "``box.stat.vinyl().tx.transactions`` содержит количество текущих транзакций." + +#~ msgid "" +#~ "``box.stat.vinyl().tx.gap_locks`` is the number of gap locks that are " +#~ "outstanding during execution of a request. For a low-level description of " +#~ "Tarantool's implementation of gap locking, see `Gap locks in Vinyl " +#~ "transaction manager `_." +#~ msgstr "" +#~ "``box.stat.vinyl().tx.gap_locks`` представляет собой число блокировок " +#~ "разрывов во время выполнения запроса. Чтобы получить низкоуровневое описание" +#~ " имплементации блокировки разрывов в Tarantool, см. `Блокировка разрывов в " +#~ "менеджере транзакций Vinyl'а " +#~ "`_." + +#~ msgid "" +#~ "``box.stat.vinyl().tx.read_views`` shows whether a transaction has entered a" +#~ " read-only state to avoid conflict temporarily. This will usually be 0." +#~ msgstr "" +#~ "``box.stat.vinyl().tx.read_views`` показывает, получила ли транзакция статус" +#~ " только для чтения, во избежание временного конфликта. Как правило, 0." + +#~ msgid "" +#~ "**Details about box.stat.vinyl().scheduler:** This primarily has counters " +#~ "related to tasks that the scheduler has arranged for dumping or compaction: " +#~ "(most of these items are reset to 0 when the server restarts or when " +#~ ":ref:`box.stat.reset() ` occurs):" +#~ msgstr "" +#~ "**Подробная информация о box.stat.vinyl().scheduler:** В основном содержит " +#~ "счетчики, связанные с задачами планировщика по созданию дампов или слиянию: " +#~ "(большинство сбрасываются на 0 при перезапуске сервера или вызове " +#~ ":ref:`box.stat.reset() `):" + +#~ msgid "" +#~ "``box.stat.vinyl().scheduler.compaction_*`` is the amount of data from " +#~ "recent changes that has been :doc:`compacted " +#~ "`. This is divided into " +#~ "``scheduler.compaction_input`` (the amount that is being compacted), " +#~ "``scheduler.compaction_queue`` (the amount that is waiting to be compacted)," +#~ " ``scheduler.compaction_time`` (total time spent by all worker threads " +#~ "performing compaction, in seconds), and ``scheduler.compaction_output`` (the" +#~ " amount that has been compacted, which is presumably smaller than " +#~ "``scheduler.compaction_input``)." +#~ msgstr "" +#~ "``box.stat.vinyl().scheduler.compaction_*`` содержит объем данных из " +#~ "последних изменений, для которых было произведено :doc:`compacted " +#~ "`. Он подразделяется на " +#~ "``scheduler.compaction_input`` (объем данных текущего слияния), " +#~ "``scheduler.compaction_queue`` (объем данных в ожидании слияния), " +#~ "``scheduler.compaction_time`` (общее время, затраченное рабочими потоками на" +#~ " слияние, в секундах) и ``scheduler.compaction_output`` (объем данных после " +#~ "слияния, который, предположительно, меньше ``scheduler.compaction_input``)." + +#~ msgid "" +#~ "``box.stat.vinyl().scheduler.tasks_*`` is about dump/compaction tasks, in " +#~ "three categories, ``scheduler.tasks_inprogress`` (currently running), " +#~ "``scheduler.tasks_completed`` (successfully completed) " +#~ "``scheduler.tasks_failed`` (aborted due to errors)." +#~ msgstr "" +#~ "``box.stat.vinyl().scheduler.tasks_*`` содержит информацию о задачах по " +#~ "созданию дампов или слиянию, разделенную на три категории: " +#~ "``scheduler.tasks_inprogress`` (текущие), ``scheduler.tasks_completed`` " +#~ "(успешно завершенные) ``scheduler.tasks_failed`` (прерванные из-за ошибки)." + +#~ msgid "" +#~ "``box.stat.vinyl().scheduler.dump_*`` has the amount of data from recent " +#~ "changes that has been dumped, including ``dump_time`` (total time spent by " +#~ "all worker threads performing dumps, in seconds), and ``dump_count`` (the " +#~ "count of completed dumps), ``dump_input`` and ``dump_output``." +#~ msgstr "" +#~ "``box.stat.vinyl().scheduler.dump_*`` содержит объем данных из последних " +#~ "изменений, для которых был создан дамп, включая ``dump_time`` (общее время, " +#~ "затраченное рабочими потоками на создание дампов, в секундах) и " +#~ "``dump_count`` (счетчик созданных дампов), ``dump_input`` и ``dump_output``." + +#~ msgid "" +#~ "A \"dump\" is explained in section :ref:`Storing data with vinyl `:" +#~ msgstr "" +#~ "Понятие \"дамп\" (dump) объясняется в разделе :ref:`Хранение данных с " +#~ "помощью vinyl `:" + +#~ msgid "" +#~ "Sooner or later the number of elements in an LSM tree exceeds the L0 size " +#~ "and that is when L0 gets written to a file on disk (called a 'run') and then" +#~ " cleared for storing new elements. This operation is called a 'dump'." +#~ msgstr "" +#~ "Рано или поздно количество элементов в дереве превысит размер L0. Тогда L0 " +#~ "записывается в файл на диске (который называется забегом -- 'run') и " +#~ "освобождается под новые элементы. Эта операция называется 'дамп' (dump)." + +#~ msgid "" +#~ "Thus it can be predicted that a dump will occur if the size of L0 (which is " +#~ ":ref:`memory.level0 `) is " +#~ "approaching the maximum (which is :ref:`regulator.dump_watermark " +#~ "`) and a dump is not already in " +#~ "progress. In fact Tarantool will try to arrange a dump before this hard " +#~ "limit is reached." +#~ msgstr "" +#~ "Таким образом, можно предсказать создание дампа, если размер L0 (указан в " +#~ ":ref:`memory.level0 `) приближается" +#~ " к максимальному (указан в :ref:`regulator.dump_watermark " +#~ "`), и создание дампа еще не " +#~ "началось. На самом деле Tarantool планирует дамп до достижения предела." + +#~ msgid "" +#~ "A dump will also occur during a :doc:`snapshot " +#~ "` operation." +#~ msgstr "" +#~ "Дамп также создается во время операции создания :doc:`снимка " +#~ "`." diff --git a/locale/ru/LC_MESSAGES/reference/reference_lua/box_stat/net.po b/locale/ru/LC_MESSAGES/reference/reference_lua/box_stat/net.po new file mode 100644 index 0000000000..3d28667914 --- /dev/null +++ b/locale/ru/LC_MESSAGES/reference/reference_lua/box_stat/net.po @@ -0,0 +1,235 @@ + +msgid "box.stat.net()" +msgstr "" + +msgid "" +"Shows network activity: the number of bytes sent and received, the number of" +" connections, streams, and requests (current, average, and total)." +msgstr "" + +msgid "return" +msgstr "" + +msgid "in the tables that ``box.stat.net()`` returns:" +msgstr "" + +msgid "" +"``SENT.rps`` and ``RECEIVED.rps`` -- average number of bytes sent/received " +"per second in the last 5 seconds" +msgstr "" + +msgid "" +"``SENT.total`` and ``RECEIVED.total`` -- total number of bytes sent/received" +" since the server started" +msgstr "" + +msgid "``CONNECTIONS.current`` -- number of open connections" +msgstr "" + +msgid "" +"``CONNECTIONS.rps`` -- average number of connections opened per second in " +"the last 5 seconds" +msgstr "" + +msgid "" +"``CONNECTIONS.total`` -- total number of connections opened since the server" +" started" +msgstr "" + +msgid "" +"``REQUESTS.current`` -- number of requests in progress, which can be limited" +" by :ref:`box.cfg.net_msg_max `" +msgstr "" + +msgid "" +"``REQUESTS.rps`` -- average number of requests processed per second in the " +"last 5 seconds" +msgstr "" + +msgid "" +"``REQUESTS.total`` -- total number of requests processed since the server " +"started" +msgstr "" + +msgid "" +"``REQUESTS_IN_PROGRESS.current`` -- number of requests being currently " +"processed by the :ref:`TX thread `" +msgstr "" + +msgid "" +"``REQUESTS_IN_PROGRESS.rps`` -- average number of requests processed by the " +"TX thread per second in the last 5 seconds" +msgstr "" + +msgid "" +"``REQUESTS_IN_PROGRESS.total`` -- total number of requests processed by the " +"TX thread since the server started" +msgstr "" + +msgid "" +"``STREAMS.current`` -- number of active :ref:`streams `" +msgstr "" + +msgid "" +"``STREAMS.rps`` -- average number of streams opened per second in the last 5" +" seconds" +msgstr "" + +msgid "" +"``STREAMS.total`` -- total number of streams opened since the server started" +msgstr "" + +msgid "" +"``REQUESTS_IN_STREAM_QUEUE.current`` -- number of requests waiting in stream" +" queues" +msgstr "" + +msgid "" +"``REQUESTS_IN_STREAM_QUEUE.rps`` -- average number of requests in stream " +"queues per second in the last 5 seconds" +msgstr "" + +msgid "" +"``REQUESTS_IN_STREAM_QUEUE.total`` -- total number of requests placed in " +"stream queues since the server started" +msgstr "" + +msgid "**Example:**" +msgstr "" + +msgid "" +"tarantool> box.stat.net() -- 5 tables\n" +"---\n" +"- CONNECTIONS:\n" +" current: 1\n" +" rps: 0\n" +" total: 1\n" +" REQUESTS:\n" +" current: 0\n" +" rps: 0\n" +" total: 8\n" +" REQUESTS_IN_PROGRESS:\n" +" current: 0\n" +" rps: 0\n" +" total: 7\n" +" SENT:\n" +" total: 19579\n" +" rps: 0\n" +" REQUESTS_IN_STREAM_QUEUE:\n" +" current: 0\n" +" rps: 0\n" +" total: 0\n" +" STREAMS:\n" +" current: 0\n" +" rps: 0\n" +" total: 0\n" +" RECEIVED:\n" +" total: 197\n" +" rps\n" +"..." +msgstr "" + +msgid "" +"Shows network activity per :ref:`network thread `: the number " +"of bytes sent and received, the number of connections, streams, and requests" +" (current, average, and total)." +msgstr "" + +msgid "" +"When called with an index (``box.stat.net.thread[1]``), shows network " +"statistics for a single network thread." +msgstr "" + +msgid "" +"Same network activity metrics as :ref:`box.stat.net() ` for each network thread" +msgstr "" + +msgid "" +"tarantool> box.stat.net.thread() -- iproto_threads = 2\n" +"- - CONNECTIONS:\n" +" current: 0\n" +" rps: 0\n" +" total: 0\n" +" REQUESTS:\n" +" current: 0\n" +" rps: 0\n" +" total: 0\n" +" REQUESTS_IN_PROGRESS:\n" +" current: 0\n" +" rps: 0\n" +" total: 0\n" +" SENT:\n" +" total: 0\n" +" rps: 0\n" +" REQUESTS_IN_STREAM_QUEUE:\n" +" current: 0\n" +" rps: 0\n" +" total: 0\n" +" STREAMS:\n" +" current: 0\n" +" rps: 0\n" +" total: 0\n" +" RECEIVED:\n" +" total: 0\n" +" rps: 0\n" +" - CONNECTIONS:\n" +" current: 1\n" +" rps: 0\n" +" total: 1\n" +" REQUESTS:\n" +" current: 0\n" +" rps: 0\n" +" total: 8\n" +" REQUESTS_IN_PROGRESS:\n" +" current: 0\n" +" rps: 0\n" +" total: 7\n" +" SENT:\n" +" total: 19579\n" +" rps: 0\n" +" REQUESTS_IN_STREAM_QUEUE:\n" +" current: 0\n" +" rps: 0\n" +" total: 0\n" +" STREAMS:\n" +" current: 0\n" +" rps: 0\n" +" total: 0\n" +" RECEIVED:\n" +" total: 197\n" +" rps: 0\n" +"..." +msgstr "" + +msgid "" +"tarantool> box.stat.net.thread[1] -- first network thread\n" +"- - CONNECTIONS:\n" +" current: 1\n" +" rps: 0\n" +" total: 1\n" +" REQUESTS:\n" +" current: 0\n" +" rps: 0\n" +" total: 8\n" +" REQUESTS_IN_PROGRESS:\n" +" current: 0\n" +" rps: 0\n" +" total: 7\n" +" SENT:\n" +" total: 19579\n" +" rps: 0\n" +" REQUESTS_IN_STREAM_QUEUE:\n" +" current: 0\n" +" rps: 0\n" +" total: 0\n" +" STREAMS:\n" +" current: 0\n" +" rps: 0\n" +" total: 0\n" +" RECEIVED:\n" +" total: 197\n" +" rps: 0\n" +"..." +msgstr "" diff --git a/locale/ru/LC_MESSAGES/reference/reference_lua/box_stat/reset.po b/locale/ru/LC_MESSAGES/reference/reference_lua/box_stat/reset.po new file mode 100644 index 0000000000..ba597c6e01 --- /dev/null +++ b/locale/ru/LC_MESSAGES/reference/reference_lua/box_stat/reset.po @@ -0,0 +1,8 @@ + +msgid "box.stat.reset()" +msgstr "" + +msgid "" +"Resets the statistics of ``box.stat()``, ``box.stat.net()``, " +"``box.stat.vinyl()``, and :ref:`box.space.index `." +msgstr "" diff --git a/locale/ru/LC_MESSAGES/reference/reference_lua/box_stat/stat.po b/locale/ru/LC_MESSAGES/reference/reference_lua/box_stat/stat.po new file mode 100644 index 0000000000..0182ba0c6b --- /dev/null +++ b/locale/ru/LC_MESSAGES/reference/reference_lua/box_stat/stat.po @@ -0,0 +1,85 @@ + +msgid "box.stat()" +msgstr "" + +msgid "" +"Shows the total number of requests since startup and the average number of " +"requests per second, broken down by request type." +msgstr "" + +msgid "return" +msgstr "" + +msgid "in the tables that ``box.stat()`` returns:" +msgstr "" + +msgid "" +"``total``: total number of requests processed per second since the server " +"started" +msgstr "" + +msgid "``rps``: average number of requests per second in the last 5 seconds." +msgstr "" + +msgid "``ERROR`` is the count of requests that resulted in an error." +msgstr "" + +msgid "**Example:**" +msgstr "" + +msgid "" +"tarantool> box.stat() -- return 15 tables\n" +"---\n" +"- DELETE:\n" +" total: 0\n" +" rps: 0\n" +" COMMIT:\n" +" total: 0\n" +" rps: 0\n" +" SELECT:\n" +" total: 12\n" +" rps: 0\n" +" ROLLBACK:\n" +" total: 0\n" +" rps: 0\n" +" INSERT:\n" +" total: 6\n" +" rps: 0\n" +" EVAL:\n" +" total: 0\n" +" rps: 0\n" +" ERROR:\n" +" total: 0\n" +" rps: 0\n" +" CALL:\n" +" total: 0\n" +" rps: 0\n" +" BEGIN:\n" +" total: 0\n" +" rps: 0\n" +" PREPARE:\n" +" total: 0\n" +" rps: 0\n" +" REPLACE:\n" +" total: 0\n" +" rps: 0\n" +" UPSERT:\n" +" total: 0\n" +" rps: 0\n" +" AUTH:\n" +" total: 0\n" +" rps: 0\n" +" EXECUTE:\n" +" total: 0\n" +" rps: 0\n" +" UPDATE:\n" +" total: 2\n" +" rps: 0\n" +"...\n" +"\n" +"tarantool> box.stat().DELETE -- total + requests per second from one table\n" +"---\n" +"- total: 0\n" +" rps: 0\n" +"..." +msgstr "" diff --git a/locale/ru/LC_MESSAGES/reference/reference_lua/box_stat/vinyl.po b/locale/ru/LC_MESSAGES/reference/reference_lua/box_stat/vinyl.po new file mode 100644 index 0000000000..8ab0898eb8 --- /dev/null +++ b/locale/ru/LC_MESSAGES/reference/reference_lua/box_stat/vinyl.po @@ -0,0 +1,236 @@ + +msgid "box.stat.vinyl()" +msgstr "" + +msgid "" +"Shows vinyl-storage-engine activity, for example ``box.stat.vinyl().tx`` has" +" the number of commits and rollbacks." +msgstr "" + +msgid "**Example:**" +msgstr "" + +msgid "" +"tarantool> box.stat.vinyl().tx.commit -- one item of the vinyl table\n" +"---\n" +"- 1047632\n" +"..." +msgstr "" + +msgid "box.stat.vinyl().regulator" +msgstr "" + +msgid "" +"The vinyl regulator decides when to take or delay actions for disk IO, " +"grouping activity in batches so that it is consistent and efficient. The " +"regulator is invoked by the vinyl scheduler, once per second, and updates " +"related variables whenever it is invoked." +msgstr "" + +msgid "" +"``box.stat.vinyl().regulator.dump_bandwidth`` is the estimated average rate " +"at which dumps are done. Initially this will appear as 10485760 (10 " +"megabytes per second). Only significant dumps (larger than one megabyte) are" +" used for estimating." +msgstr "" + +msgid "" +"``box.stat.vinyl().regulator.dump_watermark`` is the point when dumping must" +" occur. The value is slightly smaller than the amount of memory that is " +"allocated for vinyl trees, which is the :ref:`vinyl_memory ` parameter." +msgstr "" + +msgid "" +"``box.stat.vinyl().regulator.write_rate`` is the actual average rate at " +"which recent writes to disk are done. Averaging is done over a 5-second time" +" window, so if there has been no activity for 5 seconds then " +"``regulator.write_rate = 0``. The ``write_rate`` may be slowed when a dump " +"is in progress or when the user has set :ref:`snap_io_rate_limit " +"`." +msgstr "" + +msgid "" +"``box.stat.vinyl().regulator.rate_limit`` is the write rate limit, in bytes " +"per second, imposed on transactions by the regulator based on the observed " +"dump/compaction performance." +msgstr "" + +msgid "" +"``box.stat.vinyl().regulator.blocked_writers`` is the number of fibers " +"currently blocked waiting for vinyl :ref:`L0 memory ` quota." +msgstr "" + +msgid "box.stat.vinyl().disk" +msgstr "" + +msgid "" +"Since vinyl is an on-disk storage engine (unlike memtx which is an in-memory" +" storage engine), it can handle large databases -- but if a database is " +"larger than the amount of memory that is allocated for vinyl, then there " +"will be more disk activity." +msgstr "" + +msgid "" +"``box.stat.vinyl().disk.data`` and ``box.stat.vinyl().disk.index`` are the " +"amount of data that has gone into files in a subdirectory of :ref:`vinyl_dir" +" `, with names like ``{lsn}.run`` and ``{lsn}.index``. " +"The size of the run will be related to the output of ``scheduler.dump_*``." +msgstr "" + +msgid "" +"``box.stat.vinyl().disk.data_compacted`` Sum size of data stored at the last" +" LSM tree level, in bytes, without taking disk compression into account. It " +"can be thought of as the size of disk space that the user data would occupy " +"if there were no compression, indexing, or space increase caused by the LSM " +"tree design." +msgstr "" + +msgid "box.stat.vinyl().memory" +msgstr "" + +msgid "" +"Although the vinyl storage engine is not \"in-memory\", Tarantool does need " +"to have memory for write buffers and for caches:" +msgstr "" + +msgid "" +"``box.stat.vinyl().memory.tuple_cache`` is the number of bytes that are " +"being used for tuples (data)." +msgstr "" + +msgid "" +"``box.stat.vinyl().memory.tx`` is transactional memory. This will usually be" +" 0." +msgstr "" + +msgid "" +"``box.stat.vinyl().memory.level0`` is the \"level0\" memory area, sometimes " +"abbreviated \"L0\", which is the area that vinyl can use for in-memory " +"storage of an LSM tree." +msgstr "" + +msgid "" +"Therefore we can say that \"L0 is becoming full\" when the amount in " +"``memory.level0`` is close to the maximum, which is " +":ref:`regulator.dump_watermark `. We can expect that \"L0 = 0\" immediately after " +"a dump. ``box.stat.vinyl().memory.page_index`` and " +"``box.stat.vinyl().memory.bloom_filter`` have the current amount being used " +"for index-related structures. The size is a function of the number and size " +"of keys, plus :ref:`vinyl_page_size `, plus " +":ref:`vinyl_bloom_fpr `. This is not a count of" +" bloom filter \"hits\" (the number of reads that could be avoided because " +"the bloom filter predicts their presence in a run file) -- that statistic " +"can be found with :doc:`/reference/reference_lua/box_index/stat`." +msgstr "" + +msgid "box.stat.vinyl().tx" +msgstr "" + +msgid "" +"This is about requests that affect transactional activity (\"tx\" is used " +"here as an abbreviation for \"transaction\"):" +msgstr "" + +msgid "" +"``box.stat.vinyl().tx.conflict`` counts conflicts that caused a transaction " +"to roll back." +msgstr "" + +msgid "" +"``box.stat.vinyl().tx.commit`` is the count of commits (successful " +"transaction ends). It includes implicit commits, for example any insert " +"causes a commit unless it is within a begin-end block." +msgstr "" + +msgid "" +"``box.stat.vinyl().tx.rollback`` is the count of rollbacks (unsuccessful " +"transaction ends). This is not merely a count of explicit " +":doc:`/reference/reference_lua/box_txn_management/rollback` requests -- it " +"includes requests that ended in errors. For example, after an attempted " +"insert request that causes a \"Duplicate key exists in unique index\" error," +" ``tx.rollback`` is incremented." +msgstr "" + +msgid "``box.stat.vinyl().tx.statements`` will usually be 0." +msgstr "" + +msgid "" +"``box.stat.vinyl().tx.transactions`` is the number of transactions that are " +"currently running." +msgstr "" + +msgid "" +"``box.stat.vinyl().tx.gap_locks`` is the number of gap locks that are " +"outstanding during execution of a request. For a low-level description of " +"Tarantool's implementation of gap locking, see `Gap locks in Vinyl " +"transaction manager `_." +msgstr "" + +msgid "" +"``box.stat.vinyl().tx.read_views`` shows whether a transaction has entered a" +" read-only state to avoid conflict temporarily. This will usually be 0." +msgstr "" + +msgid "box.stat.vinyl().scheduler" +msgstr "" + +msgid "" +"This primarily has counters related to tasks that the scheduler has arranged" +" for dumping or compaction: (most of these items are reset to 0 when the " +"server restarts or when :ref:`box.stat.reset() ` occurs):" +msgstr "" + +msgid "" +"``box.stat.vinyl().scheduler.compaction_*`` is the amount of data from " +"recent changes that has been :doc:`compacted " +"`. This is divided into " +"``scheduler.compaction_input`` (the amount that is being compacted), " +"``scheduler.compaction_queue`` (the amount that is waiting to be compacted)," +" ``scheduler.compaction_time`` (total time spent by all worker threads " +"performing compaction, in seconds), and ``scheduler.compaction_output`` (the" +" amount that has been compacted, which is presumably smaller than " +"``scheduler.compaction_input``)." +msgstr "" + +msgid "" +"``box.stat.vinyl().scheduler.tasks_*`` is about dump/compaction tasks, in " +"three categories, ``scheduler.tasks_inprogress`` (currently running), " +"``scheduler.tasks_completed`` (successfully completed) " +"``scheduler.tasks_failed`` (aborted due to errors)." +msgstr "" + +msgid "" +"``box.stat.vinyl().scheduler.dump_*`` has the amount of data from recent " +"changes that has been dumped, including ``dump_time`` (total time spent by " +"all worker threads performing dumps, in seconds), and ``dump_count`` (the " +"count of completed dumps), ``dump_input`` and ``dump_output``." +msgstr "" + +msgid "" +"A \"dump\" is explained in section :ref:`Storing data with vinyl `:" +msgstr "" + +msgid "" +"Sooner or later the number of elements in an LSM tree exceeds the L0 size " +"and that is when L0 gets written to a file on disk (called a 'run') and then" +" cleared for storing new elements. This operation is called a 'dump'." +msgstr "" + +msgid "" +"Thus it can be predicted that a dump will occur if the size of L0 (which is " +":ref:`memory.level0 `) is " +"approaching the maximum (which is :ref:`regulator.dump_watermark " +"`) and a dump is not already in " +"progress. In fact Tarantool will try to arrange a dump before this hard " +"limit is reached." +msgstr "" + +msgid "" +"A dump will also occur during a :doc:`snapshot " +"` operation." +msgstr "" diff --git a/locale/ru/LC_MESSAGES/reference/reference_lua/box_tuple/field_path.po b/locale/ru/LC_MESSAGES/reference/reference_lua/box_tuple/field_path.po index a5491426ff..b6fd82f274 100644 --- a/locale/ru/LC_MESSAGES/reference/reference_lua/box_tuple/field_path.po +++ b/locale/ru/LC_MESSAGES/reference/reference_lua/box_tuple/field_path.po @@ -44,11 +44,12 @@ msgstr "" "При указании пути Tarantool воспользуется им для поиска по телу кортежа и " "вернет только тот компонент кортежа, который действительно необходим." +#, fuzzy msgid "" "In the following example, a tuple named ``t`` is returned from ``replace`` " "and then only the relevant part (in this case, matching a name) of a " -"relevant field is returned. Namely: the second field, the sixth part, the " -"value following 'value='." +"relevant field is returned. Namely: the second field, its third item, the " +"value following 'key='." msgstr "" "В следующем примере кортеж под названием ``t`` возвращается после операции " "замены, а затем возвращается только необходимый компонент (в данном случае " @@ -65,26 +66,54 @@ msgid "" "tarantool> format[2] = {name = 'field2', type = 'array'}\n" "---\n" "...\n" -"tarantool> format[3] = {name = 'field4', type = 'string' }\n" -"---\n" -"...\n" -"tarantool> format[4] = {name = \"[2][6]['пw']['Я']\", type = 'string'}\n" -"---\n" -"...\n" "tarantool> s = box.schema.space.create('test', {format = format})\n" "---\n" "...\n" "tarantool> pk = s:create_index('pk')\n" "---\n" "...\n" -"tarantool> field2 = {1, 2, 3, \"4\", {5,6,7}, {пw={Я=\"п\"}, key=\"V!\", value=\"K!\"}}\n" +"tarantool> field2_value = {1, \"ABC\", {key=\"Hello\", value=\"world\"}}\n" "---\n" "...\n" -"tarantool> t = s:replace{1, field2, \"123456\", \"Not K!\"}\n" +"tarantool> t = s:replace{1, field2_value}\n" "---\n" "...\n" -"tarantool> t[\"[2][6]['value']\"]\n" +"tarantool> t[\"[2][3]['key']\"]\n" "---\n" -"- K!\n" +"- Hello\n" "..." msgstr "" + +#~ msgid "" +#~ "tarantool> format = {}\n" +#~ "---\n" +#~ "...\n" +#~ "tarantool> format[1] = {name = 'field1', type = 'unsigned'}\n" +#~ "---\n" +#~ "...\n" +#~ "tarantool> format[2] = {name = 'field2', type = 'array'}\n" +#~ "---\n" +#~ "...\n" +#~ "tarantool> format[3] = {name = 'field4', type = 'string' }\n" +#~ "---\n" +#~ "...\n" +#~ "tarantool> format[4] = {name = \"[2][6]['пw']['Я']\", type = 'string'}\n" +#~ "---\n" +#~ "...\n" +#~ "tarantool> s = box.schema.space.create('test', {format = format})\n" +#~ "---\n" +#~ "...\n" +#~ "tarantool> pk = s:create_index('pk')\n" +#~ "---\n" +#~ "...\n" +#~ "tarantool> field2 = {1, 2, 3, \"4\", {5,6,7}, {пw={Я=\"п\"}, key=\"V!\", value=\"K!\"}}\n" +#~ "---\n" +#~ "...\n" +#~ "tarantool> t = s:replace{1, field2, \"123456\", \"Not K!\"}\n" +#~ "---\n" +#~ "...\n" +#~ "tarantool> t[\"[2][6]['value']\"]\n" +#~ "---\n" +#~ "- K!\n" +#~ "..." +#~ msgstr "" diff --git a/locale/ru/LC_MESSAGES/reference/reference_lua/box_txn_management.po b/locale/ru/LC_MESSAGES/reference/reference_lua/box_txn_management.po index 1c56746f1b..090e68cfb4 100644 --- a/locale/ru/LC_MESSAGES/reference/reference_lua/box_txn_management.po +++ b/locale/ru/LC_MESSAGES/reference/reference_lua/box_txn_management.po @@ -2,8 +2,9 @@ msgid "Functions for transaction management" msgstr "Управление экземплярами" +#, fuzzy msgid "" -"For general information and examples, see section :ref:`Transaction control " +"For general information and examples, see section :ref:`Transactions " "`." msgstr "" "Чтобы получить общую информацию и взглянуть на примеры использования, см. " diff --git a/locale/ru/LC_MESSAGES/reference/reference_lua/box_txn_management/atomic.po b/locale/ru/LC_MESSAGES/reference/reference_lua/box_txn_management/atomic.po index b781c3f47a..db2c8e547f 100644 --- a/locale/ru/LC_MESSAGES/reference/reference_lua/box_txn_management/atomic.po +++ b/locale/ru/LC_MESSAGES/reference/reference_lua/box_txn_management/atomic.po @@ -16,10 +16,39 @@ msgstr "" "после успешного выполнения или же заканчивается неявным вызовом " ":ref:`box.rollback() ` в случае ошибки." +msgid "Parameters" +msgstr "" + +msgid "" +"(optional) transaction options: * ``txn_isolation`` -- the " +":ref:`transaction isolation level ` * ``timeout`` " +"-- a timeout (in seconds), after which the transaction is rolled back" +msgstr "" + +msgid "(optional) transaction options:" +msgstr "" + +msgid "" +"``txn_isolation`` -- the :ref:`transaction isolation level `" +msgstr "" + +msgid "" +"``timeout`` -- a timeout (in seconds), after which the transaction is rolled" +" back" +msgstr "" + +msgid "the function name" +msgstr "" + +msgid "(optional) arguments passed to the function" +msgstr "" + msgid "return" msgstr "возвращает" -msgid "the result of the function passed to ``atomic()`` as an argument." +#, fuzzy +msgid "the result of the function passed to ``atomic()`` as an argument" msgstr "" "результат функции, которая передается в ``atomic()`` в качестве аргумента." @@ -29,8 +58,38 @@ msgstr "**Возможные ошибки:**" msgid "error and abort the transaction in case of a conflict." msgstr "ошибка и прерывание транзакции в случае конфликта." +#, fuzzy +msgid "error and abort the transaction if the timeout is exceeded." +msgstr "ошибка и прерывание транзакции в случае конфликта." + msgid "error if the operation fails to write to disk." msgstr "ошибка, если операция не может выполнить запись на диск." msgid "error if for some reason memory cannot be allocated." msgstr "ошибка, если по какой-либо причине нельзя выделить память." + +msgid "**Example**" +msgstr "" + +msgid "" +"-- Create an index with the specified sequence --\n" +"box.schema.sequence.create('id_sequence', { min = 1 })\n" +"box.space.bands:create_index('primary', { parts = { 'id' }, sequence = 'id_sequence' })\n" +"\n" +"-- Insert test data --\n" +"box.space.bands:insert { 1, 'Roxette', 1986 }\n" +"box.space.bands:insert { 2, 'Scorpions', 1965 }\n" +"box.space.bands:insert { 3, 'Ace of Base', 1987 }\n" +"\n" +"-- Define a function --\n" +"local function insert_band(band_name, year)\n" +" box.space.bands:insert { nil, band_name, year }\n" +"end\n" +"\n" +"-- Begin and commit the transaction implicitly --\n" +"box.atomic(insert_band, 'The Beatles', 1960)\n" +"\n" +"-- Begin the transaction with the specified isolation level --\n" +"box.atomic({ txn_isolation = 'read-committed' },\n" +" insert_band, 'The Rolling Stones', 1962)\n" +msgstr "" diff --git a/locale/ru/LC_MESSAGES/reference/reference_lua/box_txn_management/begin.po b/locale/ru/LC_MESSAGES/reference/reference_lua/box_txn_management/begin.po index 572c3e2791..76832ca64d 100644 --- a/locale/ru/LC_MESSAGES/reference/reference_lua/box_txn_management/begin.po +++ b/locale/ru/LC_MESSAGES/reference/reference_lua/box_txn_management/begin.po @@ -3,11 +3,11 @@ msgid "box.begin()" msgstr "" msgid "" -"Begin the transaction. Disable :ref:`implicit yields ` until the transaction ends. Signal that writes to the :ref:`write-" -"ahead log ` will be deferred until the transaction ends. In " -"effect the fiber which executes ``box.begin()`` is starting an \"active " -"multi-request transaction\", blocking all other fibers." +"Begin the transaction. Disable :ref:`implicit yields ` " +"until the transaction ends. Signal that writes to the :ref:`write-ahead log " +"` will be deferred until the transaction ends. In effect the " +"fiber which executes ``box.begin()`` is starting an \"active multi-request " +"transaction\", blocking all other fibers." msgstr "" "Начало транзакции. Отключение :ref:`неявной передачи управления ` до окончания транзакции. Сигнал о записи в :ref:`журнал " @@ -16,6 +16,28 @@ msgstr "" "\"активную транзакцию со множеством запросов\" с блокировкой всех остальных " "файберов." +msgid "Parameters" +msgstr "" + +msgid "" +"(optional) transaction options: * ``txn_isolation`` -- the " +":ref:`transaction isolation level ` * ``timeout`` " +"-- a timeout (in seconds), after which the transaction is rolled back" +msgstr "" + +msgid "(optional) transaction options:" +msgstr "" + +msgid "" +"``txn_isolation`` -- the :ref:`transaction isolation level `" +msgstr "" + +msgid "" +"``timeout`` -- a timeout (in seconds), after which the transaction is rolled" +" back" +msgstr "" + msgid "**Possible errors:**" msgstr "**Возможные ошибки:** " @@ -28,3 +50,28 @@ msgstr "" msgid "error if for some reason memory cannot be allocated." msgstr "ошибка, если по какой-либо причине нельзя выделить память." + +msgid "error and abort the transaction if the timeout is exceeded." +msgstr "" + +msgid "**Example**" +msgstr "" + +msgid "" +"-- Insert test data --\n" +"box.space.bands:insert { 1, 'Roxette', 1986 }\n" +"box.space.bands:insert { 2, 'Scorpions', 1965 }\n" +"box.space.bands:insert { 3, 'Ace of Base', 1987 }\n" +"\n" +"-- Begin and commit the transaction explicitly --\n" +"box.begin()\n" +"box.space.bands:insert { 4, 'The Beatles', 1960 }\n" +"box.space.bands:replace { 1, 'Pink Floyd', 1965 }\n" +"box.commit()\n" +"\n" +"-- Begin the transaction with the specified isolation level --\n" +"box.begin({ txn_isolation = 'read-committed' })\n" +"box.space.bands:insert { 5, 'The Rolling Stones', 1962 }\n" +"box.space.bands:replace { 1, 'The Doors', 1965 }\n" +"box.commit()\n" +msgstr "" diff --git a/locale/ru/LC_MESSAGES/reference/reference_lua/box_txn_management/commit.po b/locale/ru/LC_MESSAGES/reference/reference_lua/box_txn_management/commit.po index b5cd7cd9e9..8baeec5820 100644 --- a/locale/ru/LC_MESSAGES/reference/reference_lua/box_txn_management/commit.po +++ b/locale/ru/LC_MESSAGES/reference/reference_lua/box_txn_management/commit.po @@ -19,3 +19,25 @@ msgstr "ошибка, если операция не может выполнит msgid "error if for some reason memory cannot be allocated." msgstr "ошибка, если по какой-либо причине нельзя выделить память." + +msgid "**Example**" +msgstr "" + +msgid "" +"-- Insert test data --\n" +"box.space.bands:insert { 1, 'Roxette', 1986 }\n" +"box.space.bands:insert { 2, 'Scorpions', 1965 }\n" +"box.space.bands:insert { 3, 'Ace of Base', 1987 }\n" +"\n" +"-- Begin and commit the transaction explicitly --\n" +"box.begin()\n" +"box.space.bands:insert { 4, 'The Beatles', 1960 }\n" +"box.space.bands:replace { 1, 'Pink Floyd', 1965 }\n" +"box.commit()\n" +"\n" +"-- Begin the transaction with the specified isolation level --\n" +"box.begin({ txn_isolation = 'read-committed' })\n" +"box.space.bands:insert { 5, 'The Rolling Stones', 1962 }\n" +"box.space.bands:replace { 1, 'The Doors', 1965 }\n" +"box.commit()\n" +msgstr "" diff --git a/locale/ru/LC_MESSAGES/reference/reference_lua/box_txn_management/on_commit.po b/locale/ru/LC_MESSAGES/reference/reference_lua/box_txn_management/on_commit.po index 2c1ae2ab79..7062ad9982 100644 --- a/locale/ru/LC_MESSAGES/reference/reference_lua/box_txn_management/on_commit.po +++ b/locale/ru/LC_MESSAGES/reference/reference_lua/box_txn_management/on_commit.po @@ -3,8 +3,8 @@ msgid "box.on_commit()" msgstr "" msgid "" -"Define a trigger for execution when a transaction ends due to an event " -"such as :doc:`/reference/reference_lua/box_txn_management/commit`." +"Define a trigger for execution when a transaction ends due to an event such " +"as :doc:`/reference/reference_lua/box_txn_management/commit`." msgstr "" "Определения триггера, выполняемого в случае окончания транзакции в связи с " ":doc:`/reference/reference_lua/box_txn_management/commit`." @@ -65,84 +65,149 @@ msgstr "" "Подробная информация о характеристиках триггера находится в разделе " ":ref:`Триггеры `." -msgid "**Simple and useless example:** this will display 'commit happened':" -msgstr "**Элементарный пример** покажет, что произошел коммит:" +msgid "**Example 1**" +msgstr "" msgid "" -"function f()\n" -"function f() print('commit happened') end\n" -"box.begin() box.on_commit(f) box.commit()" +"-- Insert test data --\n" +"box.space.bands:insert { 1, 'Roxette', 1986 }\n" +"box.space.bands:insert { 2, 'Scorpions', 1965 }\n" +"box.space.bands:insert { 3, 'Ace of Base', 1987 }\n" +"\n" +"-- Define a function called on commit --\n" +"function print_commit_result()\n" +" print('Commit happened')\n" +"end\n" +"\n" +"-- Commit the transaction --\n" +"box.begin()\n" +"box.space.bands:insert { 4, 'The Beatles', 1960 }\n" +"box.on_commit(print_commit_result)\n" +"box.commit()\n" msgstr "" -msgid "" -"But of course there is more to it: the function parameter can be an " -"ITERATOR." -msgstr "Но, конечно, это еще не всё: параметр функции может быть ИТЕРАТОРОМ." +msgid "**Example 2**" +msgstr "" +#, fuzzy msgid "" -"The iterator goes through the effects of every request that changed a space " -"during the transaction." +"The function parameter can be an iterator. The iterator goes through the " +"effects of every request that changed a space during the transaction." msgstr "" "Итератор проходит по результатам каждого запроса изменения спейса в пределах" " транзакции." -msgid "The iterator will have:" +#, fuzzy +msgid "The iterator has:" msgstr "Итератор будет содержать:" -msgid "an ordinal request number," +#, fuzzy +msgid "an ordinal request number" msgstr "порядковый номер запроса," +#, fuzzy msgid "" -"the old value of the tuple before the request (this will be nil for an " -"insert request)," +"the old value of the tuple before the request (``nil`` for an ``insert`` " +"request)" msgstr "" "старое значение кортежа до запроса (для запросов вставки это будет нулевое " "значение nil)," +#, fuzzy msgid "" -"the new value of the tuple after the request (this will be nil for a delete " -"request)," +"the new value of the tuple after the request (``nil`` for a ``delete`` " +"request)" msgstr "" "новое значение кортежа после запроса (для запросов удаления это будет " "нулевое значение nil)," -msgid "and the id of the space." +#, fuzzy +msgid "the ID of the space" msgstr "и идентификатор спейса." -msgid "" -"**Less simple more useful example:** this will display the effects of two " -"replace requests:" +#, fuzzy +msgid "The example below displays the effects of two ``replace`` requests:" msgstr "" "**Более сложный и более полезный пример:** покажет результат двух запросов " "замены:" msgid "" -"box.space.test:drop()\n" -"s = box.schema.space.create('test')\n" -"i = box.space.test:create_index('i')\n" -"function f(iterator)\n" -" for request_number, old_tuple, new_tuple, space_id in iterator() do\n" -" print('request_number ' .. tostring(request_number))\n" -" print(' old_tuple ' .. tostring(old_tuple[1]) .. ' ' .. old_tuple[2])\n" -" print(' new_tuple ' .. tostring(new_tuple[1]) .. ' ' .. new_tuple[2])\n" -" print(' space_id ' .. tostring(space_id))\n" -" end\n" +"-- Insert test data --\n" +"box.space.bands:insert { 1, 'Roxette', 1986 }\n" +"box.space.bands:insert { 2, 'Scorpions', 1965 }\n" +"box.space.bands:insert { 3, 'Ace of Base', 1987 }\n" +"\n" +"-- Define a function called on commit --\n" +"function print_replace_details(iterator)\n" +" for request_number, old_tuple, new_tuple, space_id in iterator() do\n" +" print('request_number: ' .. tostring(request_number))\n" +" print('old_tuple: ' .. tostring(old_tuple))\n" +" print('new_tuple: ' .. tostring(new_tuple))\n" +" print('space_id: ' .. tostring(space_id))\n" +" end\n" "end\n" -"s:insert{1,'-'}\n" -"box.begin() s:replace{1,'x'} s:replace{1,'y'} box.on_commit(f) box.commit()" +"\n" +"-- Commit the transaction --\n" +"box.begin()\n" +"box.space.bands:replace { 1, 'The Beatles', 1960 }\n" +"box.space.bands:replace { 2, 'The Rolling Stones', 1965 }\n" +"box.on_commit(print_replace_details)\n" +"box.commit()\n" msgstr "" -msgid "The result will look like this:" +#, fuzzy +msgid "The output might look like this:" msgstr "Результат будет выглядеть следующим образом:" msgid "" -"tarantool> box.begin() s:replace{1,'x'} s:replace{1,'y'} box.on_commit(f) box.commit()\n" -"request_number 1\n" -" old_tuple 1 -\n" -" new_tuple 1 x\n" -" space_id 517\n" -"request_number 2\n" -" old_tuple 1 x\n" -" new_tuple 1 y\n" -" space_id 517" +"request_number: 1\n" +"old_tuple: [1, 'Roxette', 1986]\n" +"new_tuple: [1, 'The Beatles', 1960]\n" +"space_id: 512\n" +"request_number: 2\n" +"old_tuple: [2, 'Scorpions', 1965]\n" +"new_tuple: [2, 'The Rolling Stones', 1965]\n" +"space_id: 512" msgstr "" + +#~ msgid "**Simple and useless example:** this will display 'commit happened':" +#~ msgstr "**Элементарный пример** покажет, что произошел коммит:" + +#~ msgid "" +#~ "function f()\n" +#~ "function f() print('commit happened') end\n" +#~ "box.begin() box.on_commit(f) box.commit()" +#~ msgstr "" + +#~ msgid "" +#~ "But of course there is more to it: the function parameter can be an " +#~ "ITERATOR." +#~ msgstr "Но, конечно, это еще не всё: параметр функции может быть ИТЕРАТОРОМ." + +#~ msgid "" +#~ "box.space.test:drop()\n" +#~ "s = box.schema.space.create('test')\n" +#~ "i = box.space.test:create_index('i')\n" +#~ "function f(iterator)\n" +#~ " for request_number, old_tuple, new_tuple, space_id in iterator() do\n" +#~ " print('request_number ' .. tostring(request_number))\n" +#~ " print(' old_tuple ' .. tostring(old_tuple[1]) .. ' ' .. old_tuple[2])\n" +#~ " print(' new_tuple ' .. tostring(new_tuple[1]) .. ' ' .. new_tuple[2])\n" +#~ " print(' space_id ' .. tostring(space_id))\n" +#~ " end\n" +#~ "end\n" +#~ "s:insert{1,'-'}\n" +#~ "box.begin() s:replace{1,'x'} s:replace{1,'y'} box.on_commit(f) box.commit()" +#~ msgstr "" + +#~ msgid "" +#~ "tarantool> box.begin() s:replace{1,'x'} s:replace{1,'y'} box.on_commit(f) box.commit()\n" +#~ "request_number 1\n" +#~ " old_tuple 1 -\n" +#~ " new_tuple 1 x\n" +#~ " space_id 517\n" +#~ "request_number 2\n" +#~ " old_tuple 1 x\n" +#~ " new_tuple 1 y\n" +#~ " space_id 517" +#~ msgstr "" diff --git a/locale/ru/LC_MESSAGES/reference/reference_lua/box_txn_management/rollback.po b/locale/ru/LC_MESSAGES/reference/reference_lua/box_txn_management/rollback.po index 9a58a76d10..744f0da6f0 100644 --- a/locale/ru/LC_MESSAGES/reference/reference_lua/box_txn_management/rollback.po +++ b/locale/ru/LC_MESSAGES/reference/reference_lua/box_txn_management/rollback.po @@ -12,3 +12,19 @@ msgstr "" "данных. Явный вызов функций не из модуля ``box.space``, которые всегда " "передают управление, например :ref:`fiber.sleep() ` или " ":ref:`fiber.yield() `, приведет к тому же результату." + +msgid "**Example**" +msgstr "" + +msgid "" +"-- Insert test data --\n" +"box.space.bands:insert { 1, 'Roxette', 1986 }\n" +"box.space.bands:insert { 2, 'Scorpions', 1965 }\n" +"box.space.bands:insert { 3, 'Ace of Base', 1987 }\n" +"\n" +"-- Rollback the transaction --\n" +"box.begin()\n" +"box.space.bands:insert { 4, 'The Beatles', 1960 }\n" +"box.space.bands:replace { 1, 'Pink Floyd', 1965 }\n" +"box.rollback()\n" +msgstr "" diff --git a/locale/ru/LC_MESSAGES/reference/reference_lua/box_txn_management/rollback_to_savepoint.po b/locale/ru/LC_MESSAGES/reference/reference_lua/box_txn_management/rollback_to_savepoint.po index 0a9e5b4545..aa3c36d347 100644 --- a/locale/ru/LC_MESSAGES/reference/reference_lua/box_txn_management/rollback_to_savepoint.po +++ b/locale/ru/LC_MESSAGES/reference/reference_lua/box_txn_management/rollback_to_savepoint.po @@ -21,24 +21,40 @@ msgstr "" msgid "**Possible errors:** error if the savepoint does not exist." msgstr "**Возможные ошибки:** ошибка, если отсутствует точка сохранения." -msgid "**Example:**" +#, fuzzy +msgid "**Example**" msgstr "**Пример:**" msgid "" -"function f()\n" -" box.begin() -- start transaction\n" -" box.space.t:insert{1} -- this will not be rolled back\n" -" local s = box.savepoint()\n" -" box.space.t:insert{2} -- this will be rolled back\n" -" box.rollback_to_savepoint(s)\n" -" box.commit() -- end transaction\n" -"end" +"-- Insert test data --\n" +"box.space.bands:insert { 1, 'Roxette', 1986 }\n" +"box.space.bands:insert { 2, 'Scorpions', 1965 }\n" +"box.space.bands:insert { 3, 'Ace of Base', 1987 }\n" +"\n" +"-- Rollback the transaction to a savepoint --\n" +"box.begin()\n" +"box.space.bands:insert { 4, 'The Beatles', 1960 }\n" +"save1 = box.savepoint()\n" +"box.space.bands:replace { 1, 'Pink Floyd', 1965 }\n" +"box.rollback_to_savepoint(save1)\n" +"box.commit()\n" msgstr "" -"function f()\n" -" box.begin() -- начало транзакции\n" -" box.space.t:insert{1} -- это не отменится\n" -" local s = box.savepoint()\n" -" box.space.t:insert{2} -- это отменится\n" -" box.rollback_to_savepoint(s)\n" -" box.commit() -- конец транзакции\n" -"end" + +#~ msgid "" +#~ "function f()\n" +#~ " box.begin() -- start transaction\n" +#~ " box.space.t:insert{1} -- this will not be rolled back\n" +#~ " local s = box.savepoint()\n" +#~ " box.space.t:insert{2} -- this will be rolled back\n" +#~ " box.rollback_to_savepoint(s)\n" +#~ " box.commit() -- end transaction\n" +#~ "end" +#~ msgstr "" +#~ "function f()\n" +#~ " box.begin() -- начало транзакции\n" +#~ " box.space.t:insert{1} -- это не отменится\n" +#~ " local s = box.savepoint()\n" +#~ " box.space.t:insert{2} -- это отменится\n" +#~ " box.rollback_to_savepoint(s)\n" +#~ " box.commit() -- конец транзакции\n" +#~ "end" diff --git a/locale/ru/LC_MESSAGES/reference/reference_lua/box_txn_management/savepoint.po b/locale/ru/LC_MESSAGES/reference/reference_lua/box_txn_management/savepoint.po index a98e126a2a..6ca11a56e1 100644 --- a/locale/ru/LC_MESSAGES/reference/reference_lua/box_txn_management/savepoint.po +++ b/locale/ru/LC_MESSAGES/reference/reference_lua/box_txn_management/savepoint.po @@ -37,3 +37,21 @@ msgid "" msgstr "" "**Возможные ошибки:** ошибка, если по какой-либо причине нельзя выделить " "память." + +msgid "**Example**" +msgstr "" + +msgid "" +"-- Insert test data --\n" +"box.space.bands:insert { 1, 'Roxette', 1986 }\n" +"box.space.bands:insert { 2, 'Scorpions', 1965 }\n" +"box.space.bands:insert { 3, 'Ace of Base', 1987 }\n" +"\n" +"-- Rollback the transaction to a savepoint --\n" +"box.begin()\n" +"box.space.bands:insert { 4, 'The Beatles', 1960 }\n" +"save1 = box.savepoint()\n" +"box.space.bands:replace { 1, 'Pink Floyd', 1965 }\n" +"box.rollback_to_savepoint(save1)\n" +"box.commit()\n" +msgstr "" diff --git a/locale/ru/LC_MESSAGES/reference/reference_lua/checks.po b/locale/ru/LC_MESSAGES/reference/reference_lua/checks.po new file mode 100644 index 0000000000..a79100f29a --- /dev/null +++ b/locale/ru/LC_MESSAGES/reference/reference_lua/checks.po @@ -0,0 +1,727 @@ + +msgid "Module checks" +msgstr "" + +msgid "**Since:** :doc:`2.11.0 `" +msgstr "" + +msgid "" +"The ``checks`` module provides the ability to check the types of arguments " +"passed to a Lua function. You need to call the :ref:`checks(type_1, ...) " +"` function inside the target Lua function and pass :ref:`one " +"or more ` type qualifiers to check the " +"corresponding argument types. There are two types of type qualifiers:" +msgstr "" + +msgid "" +"A :ref:`string type qualifier ` checks whether" +" a function's argument conforms to the specified type. Example: " +"``'string'``." +msgstr "" + +msgid "" +"A :ref:`table type qualifier ` checks whether " +"the values of a table passed as an argument conform to the specified types. " +"Example: ``{ 'string', 'number' }``." +msgstr "" + +msgid "" +"For earlier versions, you can install the ``checks`` module from the " +"`Tarantool rocks repository `_." +msgstr "" + +msgid "Loading checks" +msgstr "" + +msgid "" +"In Tarantool :doc:`2.11.0 ` and later versions, the " +":ref:`checks API ` is available in a script without " +"loading the module." +msgstr "" + +msgid "" +"For earlier versions, you need to install the ``checks`` module from the " +"Tarantool rocks repository and load the module using the ``require()`` " +"directive:" +msgstr "" + +msgid "local checks = require('checks')" +msgstr "" + +msgid "Number of arguments to check" +msgstr "" + +msgid "" +"For each argument to check, you need to specify its own type qualifier in " +"the :ref:`checks(type_1, ...) ` function." +msgstr "" + +msgid "One argument" +msgstr "" + +msgid "" +"In the example below, the ``checks`` function accepts a ``string`` type " +"qualifier to verify that only a string value can be passed to the ``greet`` " +"function. Otherwise, an error is raised." +msgstr "" + +msgid "" +"function greet(name)\n" +" checks('string')\n" +" return 'Hello, ' .. name\n" +"end\n" +"--[[\n" +"greet('John')\n" +"-- returns 'Hello, John'\n" +"\n" +"greet(123)\n" +"-- raises an error: bad argument #1 to nil (string expected, got number)\n" +"--]]\n" +"\n" +msgstr "" + +msgid "Multiple arguments" +msgstr "" + +msgid "" +"To check the types of several arguments, you need to pass the corresponding " +"type qualifiers to the ``checks`` function. In the example below, both " +"arguments should be string values." +msgstr "" + +msgid "" +"function greet_fullname(firstname, lastname)\n" +" checks('string', 'string')\n" +" return 'Hello, ' .. firstname .. ' ' .. lastname\n" +"end\n" +"--[[\n" +"greet_fullname('John', 'Smith')\n" +"-- returns 'Hello, John Smith'\n" +"\n" +"greet_fullname('John', 1)\n" +"-- raises an error: bad argument #2 to nil (string expected, got number)\n" +"--]]\n" +"\n" +msgstr "" + +msgid "" +"To skip checking specific arguments, use the :ref:`? placeholder " +"`." +msgstr "" + +msgid "Variable number of arguments" +msgstr "" + +msgid "" +"You can check the types of explicitly specified arguments for functions that" +" accept a variable number of arguments." +msgstr "" + +msgid "" +"function extra_arguments_num(a, b, ...)\n" +" checks('string', 'number')\n" +" return select('#', ...)\n" +"end\n" +"--[[\n" +"extra_arguments_num('a', 2, 'c')\n" +"-- returns 1\n" +"\n" +"extra_arguments_num('a', 'b', 'c')\n" +"-- raises an error: bad argument #1 to nil (string expected, got number)\n" +"--]]\n" +"\n" +msgstr "" + +msgid "String type qualifier" +msgstr "" + +msgid "" +"This section describes how to check a specific argument type using a string " +"type qualifier:" +msgstr "" + +msgid "" +"The :ref:`Supported types ` section describes" +" all the types supported by the ``checks`` module." +msgstr "" + +msgid "" +"If required, you can make a :ref:`union type ` to allow " +"an argument to accept several types." +msgstr "" + +msgid "" +"You can make any of the supported types :ref:`optional " +"`." +msgstr "" + +msgid "Supported types" +msgstr "" + +msgid "Lua types" +msgstr "" + +msgid "" +"A string type qualifier can accept any of the `Lua types " +"`_, for example, ``string``, ``number``, " +"``table``, or ``nil``. In the example below, the ``checks`` function accepts" +" ``string`` to validate that only a string value can be passed to the " +"``greet`` function." +msgstr "" + +msgid "Tarantool types" +msgstr "" + +msgid "" +"You can use :ref:`Tarantool-specific types ` " +"in a string qualifier. The example below shows how to check that a function " +"argument is a decimal value." +msgstr "" + +msgid "" +"local decimal = require('decimal')\n" +"function sqrt(value)\n" +" checks('decimal')\n" +" return decimal.sqrt(value)\n" +"end\n" +"--[[\n" +"sqrt(decimal.new(16))\n" +"-- returns 4\n" +"\n" +"sqrt(16)\n" +"-- raises an error: bad argument #1 to nil (decimal expected, got number)\n" +"--]]\n" +"\n" +msgstr "" + +msgid "This table lists all the checks available for Tarantool types:" +msgstr "" + +msgid "Check" +msgstr "" + +msgid "Description" +msgstr "" + +msgid "See also" +msgstr "" + +msgid "``checks('datetime')``" +msgstr "" + +msgid "" +"Check whether the specified value is :ref:`datetime_object `" +msgstr "" + +msgid ":ref:`checkers.datetime(value) `" +msgstr "" + +msgid "``checks('decimal')``" +msgstr "" + +msgid "" +"Check whether the specified value has the :ref:`decimal ` type" +msgstr "" + +msgid ":ref:`checkers.decimal(value) `" +msgstr "" + +msgid "``checks('error')``" +msgstr "" + +msgid "" +"Check whether the specified value is :ref:`error_object `" +msgstr "" + +msgid ":ref:`checkers.error(value) `" +msgstr "" + +msgid "``checks('int64')``" +msgstr "" + +msgid "Check whether the specified value is an ``int64`` value" +msgstr "" + +msgid ":ref:`checkers.int64(value) `" +msgstr "" + +msgid "``checks('interval')``" +msgstr "" + +msgid "" +"Check whether the specified value is :ref:`interval_object `" +msgstr "" + +msgid ":ref:`checkers.interval(value) `" +msgstr "" + +msgid "``checks('tuple')``" +msgstr "" + +msgid "Check whether the specified value is a :ref:`tuple `" +msgstr "" + +msgid ":ref:`checkers.tuple(value) `" +msgstr "" + +msgid "``checks('uint64')``" +msgstr "" + +msgid "Check whether the specified value is a ``uint64`` value" +msgstr "" + +msgid ":ref:`checkers.uint64(value) `" +msgstr "" + +msgid "``checks('uuid')``" +msgstr "" + +msgid "Check whether the specified value is :ref:`uuid_object `" +msgstr "" + +msgid ":ref:`checkers.uuid(value) `" +msgstr "" + +msgid "``checks('uuid_bin')``" +msgstr "" + +msgid "" +"Check whether the specified value is :ref:`uuid ` represented " +"by a 16-byte binary string" +msgstr "" + +msgid ":ref:`checkers.uuid_bin(value) `" +msgstr "" + +msgid "``checks('uuid_str')``" +msgstr "" + +msgid "" +"Check whether the specified value is :ref:`uuid ` represented " +"by a 36-byte hexadecimal string" +msgstr "" + +msgid ":ref:`checkers.uuid_str(value) `" +msgstr "" + +msgid "Custom function" +msgstr "" + +msgid "" +"A string type qualifier can accept the name of a custom function that " +"performs arbitrary validations. To achieve this, create a function returning" +" ``true`` if the value is valid and add this function to the :ref:`checkers " +"` table." +msgstr "" + +msgid "" +"The example below shows how to use the ``positive`` function to check that " +"an argument value is a positive number." +msgstr "" + +msgid "" +"function checkers.positive(value)\n" +" return (type(value) == 'number') and (value > 0)\n" +"end\n" +"\n" +"function get_doubled_number(value)\n" +" checks('positive')\n" +" return value * 2\n" +"end\n" +"--[[\n" +"get_doubled_number(10)\n" +"-- returns 20\n" +"\n" +"get_doubled_number(-5)\n" +"-- raises an error: bad argument #1 to nil (positive expected, got number)\n" +"--]]\n" +"\n" +msgstr "" + +msgid "Metatable type" +msgstr "" + +msgid "" +"A string qualifier can accept a value stored in the ``__type`` field of the " +"argument `metatable `_." +msgstr "" + +msgid "" +"local blue = setmetatable({ 0, 0, 255 }, { __type = 'color' })\n" +"function get_blue_value(color)\n" +" checks('color')\n" +" return color[3]\n" +"end\n" +"--[[\n" +"get_blue_value(blue)\n" +"-- returns 255\n" +"\n" +"get_blue_value({0, 0, 255})\n" +"-- raises an error: bad argument #1 to nil (color expected, got table)\n" +"--]]\n" +"\n" +msgstr "" + +msgid "Union types" +msgstr "" + +msgid "" +"To allow an argument to accept several types (a union type), concatenate " +"type names with a pipe (``|``). In the example below, the argument can be " +"both a ``number`` and ``string`` value." +msgstr "" + +msgid "" +"function get_argument_type(value)\n" +" checks('number|string')\n" +" return type(value)\n" +"end\n" +"--[[\n" +"get_argument_type(1)\n" +"-- returns 'number'\n" +"\n" +"get_argument_type('key1')\n" +"-- returns 'string'\n" +"\n" +"get_argument_type(true)\n" +"-- raises an error: bad argument #1 to nil (number|string expected, got boolean)\n" +"--]]\n" +"\n" +msgstr "" + +msgid "Optional types" +msgstr "" + +msgid "" +"To make any of the supported types optional, prefix its name with a question" +" mark (``?``). In the example below, the ``name`` argument is optional. This" +" means that the ``greet`` function can accept ``string`` and ``nil`` values." +msgstr "" + +msgid "" +"function greet(name)\n" +" checks('?string')\n" +" if name ~= nil then\n" +" return 'Hello, ' .. name\n" +" else\n" +" return 'Hello from Tarantool'\n" +" end\n" +"end\n" +"--[[\n" +"greet('John')\n" +"-- returns 'Hello, John'\n" +"\n" +"greet()\n" +"-- returns 'Hello from Tarantool'\n" +"\n" +"greet(123)\n" +"-- raises an error: bad argument #1 to nil (string expected, got number)\n" +"--]]\n" +"\n" +msgstr "" + +msgid "" +"As for a specific type, you can make a :ref:`union type `" +" value optional: ``?number|string``." +msgstr "" + +msgid "Skipping argument checking" +msgstr "" + +msgid "" +"You can skip checking of the specified arguments using the question mark " +"(``?``) placeholder. In this case, the argument can be any type." +msgstr "" + +msgid "" +"function greet_fullname_any(firstname, lastname)\n" +" checks('string', '?')\n" +" return 'Hello, ' .. firstname .. ' ' .. tostring(lastname)\n" +"end\n" +"--[[\n" +"greet_fullname_any('John', 'Doe')\n" +"-- returns 'Hello, John Doe'\n" +"\n" +"greet_fullname_any('John', 1)\n" +"-- returns 'Hello, John 1'\n" +"--]]\n" +"\n" +msgstr "" + +msgid "Table type qualifier" +msgstr "" + +msgid "" +"A table type qualifier checks whether the values of a table passed as an " +"argument conform to the specified types. In this case, the following checks " +"are made:" +msgstr "" + +msgid "" +"The argument is checked to conform to the ``?table`` type, and its content " +"is validated." +msgstr "" + +msgid "" +"Table values are validated against the specified :ref:`string type " +"qualifiers `." +msgstr "" + +msgid "" +"Table keys missing in ``checks`` are validated against the ``nil`` type." +msgstr "" + +msgid "" +"The code below checks that the first and second table values have the " +"``string`` and ``number`` types." +msgstr "" + +msgid "" +"function configure_connection(options)\n" +" checks({ 'string', 'number' })\n" +" local ip_address = options[1] or '127.0.0.1'\n" +" local port = options[2] or 3301\n" +" return ip_address .. ':' .. port\n" +"end\n" +"--[[\n" +"configure_connection({'0.0.0.0', 3303})\n" +"-- returns '0.0.0.0:3303'\n" +"\n" +"configure_connection({'0.0.0.0', '3303'})\n" +"-- raises an error: bad argument options[2] to nil (number expected, got string)\n" +"--]]\n" +"\n" +msgstr "" + +msgid "In the next example, the same checks are made for the specified keys." +msgstr "" + +msgid "" +"function configure_connection_opts(options)\n" +" checks({ ip_address = 'string', port = 'number' })\n" +" local ip_address = options.ip_address or '127.0.0.1'\n" +" local port = options.port or 3301\n" +" return ip_address .. ':' .. port\n" +"end\n" +"--[[\n" +"configure_connection_opts({ip_address = '0.0.0.0', port = 3303})\n" +"-- returns '0.0.0.0:3303'\n" +"\n" +"configure_connection_opts({ip_address = '0.0.0.0', port = '3303'})\n" +"-- raises an error: bad argument options.port to nil (number expected, got string)\n" +"\n" +"configure_connection_opts({login = 'testuser', ip_address = '0.0.0.0', port = 3303})\n" +"-- raises an error: unexpected argument options.login to nil\n" +"--]]\n" +"\n" +msgstr "" + +msgid "Table qualifiers can be nested and use tables, too." +msgstr "" + +msgid "API Reference" +msgstr "" + +msgid "**Members**" +msgstr "" + +msgid ":ref:`checks() `" +msgstr "" + +msgid "" +"When called inside a function, checks that the function's arguments conform " +"to the specified types" +msgstr "" + +msgid ":ref:`checkers `" +msgstr "" + +msgid "A global variable that provides access to checkers for different types" +msgstr "" + +msgid "checks()" +msgstr "" + +msgid "" +"When called inside a function, checks that the function's arguments conform " +"to the specified types." +msgstr "" + +msgid "Parameters" +msgstr "" + +msgid "" +"a :ref:`string ` or :ref:`table " +"` type qualifier used to check the argument " +"type" +msgstr "" + +msgid "" +"optional type qualifiers used to check the types of :ref:`other arguments " +"`" +msgstr "" + +msgid "checkers" +msgstr "" + +msgid "" +"The ``checkers`` global variable provides access to checkers for different " +"types. You can use this variable to add a :ref:`custom checker " +"` that performs arbitrary validations." +msgstr "" + +msgid "" +"The ``checkers`` variable also provides access to checkers for Tarantool-" +"specific types. These checkers can be used in a custom checker." +msgstr "" + +msgid "" +"Check whether the specified value is :ref:`datetime_object `." +msgstr "" + +msgid "the value to check the type for" +msgstr "" + +msgid "return" +msgstr "" + +msgid "" +"``true`` if the specified value is ``datetime_object``; otherwise, ``false``" +msgstr "" + +msgid "rtype" +msgstr "" + +msgid "boolean" +msgstr "" + +msgid "**Example**" +msgstr "" + +msgid "" +"local datetime = require('datetime')\n" +"local is_datetime = checkers.datetime(datetime.new { day = 1, month = 6, year = 2023 })\n" +"local is_interval = checkers.interval(datetime.interval.new { day = 1 })\n" +msgstr "" + +msgid "" +"Check whether the specified value has the :ref:`decimal ` type." +msgstr "" + +msgid "" +"``true`` if the specified value has the ``decimal`` type; otherwise, " +"``false``" +msgstr "" + +msgid "" +"local decimal = require('decimal')\n" +"local is_decimal = checkers.decimal(decimal.new(16))\n" +msgstr "" + +msgid "" +"Check whether the specified value is :ref:`error_object `." +msgstr "" + +msgid "" +"``true`` if the specified value is ``error_object``; otherwise, ``false``" +msgstr "" + +msgid "" +"local server_error = box.error.new({ code = 500, reason = 'Server error' })\n" +"local is_error = checkers.error(server_error)\n" +msgstr "" + +msgid "" +"Check whether the specified value is one of the following ``int64`` values:" +msgstr "" + +msgid "a Lua number in a range from -2^53+1 to 2^53-1 (inclusive)" +msgstr "" + +msgid "Lua cdata ``ctype`` in a range from 0 to ``LLONG_MAX``" +msgstr "" + +msgid "Lua cdata ``ctype``" +msgstr "" + +msgid "" +"``true`` if the specified value is an ``int64`` value; otherwise, ``false``" +msgstr "" + +msgid "" +"local is_int64 = checkers.int64(-1024)\n" +"local is_uint64 = checkers.uint64(2048)\n" +msgstr "" + +msgid "" +"Check whether the specified value is :ref:`interval_object `." +msgstr "" + +msgid "" +"``true`` if the specified value is ``interval_object``; otherwise, ``false``" +msgstr "" + +msgid "Check whether the specified value is a :ref:`tuple `." +msgstr "" + +msgid "``true`` if the specified value is a tuple; otherwise, ``false``" +msgstr "" + +msgid "local is_tuple = checkers.tuple(box.tuple.new(1, 'The Beatles', 1960))\n" +msgstr "" + +msgid "" +"Check whether the specified value is one of the following ``uint64`` values:" +msgstr "" + +msgid "a Lua number in a range from 0 to 2^53-1 (inclusive)" +msgstr "" + +msgid "Lua cdata ``ctype``" +msgstr "" + +msgid "Lua cdata ``ctype`` in range from 0 to ``LLONG_MAX``" +msgstr "" + +msgid "" +"``true`` if the specified value is an ``uint64`` value; otherwise, ``false``" +msgstr "" + +msgid "Check whether the specified value is :ref:`uuid_object `." +msgstr "" + +msgid "" +"``true`` if the specified value is ``uuid_object``; otherwise, ``false``" +msgstr "" + +msgid "" +"local uuid = require('uuid')\n" +"local is_uuid = checkers.uuid(uuid())\n" +"local is_uuid_bin = checkers.uuid_bin(uuid.bin())\n" +"local is_uuid_str = checkers.uuid_str(uuid.str())\n" +msgstr "" + +msgid "" +"Check whether the specified value is :ref:`uuid ` represented " +"by a 16-byte binary string." +msgstr "" + +msgid "" +"``true`` if the specified value is ``uuid`` represented by a 16-byte binary " +"string; otherwise, ``false``" +msgstr "" + +msgid "**See also:** :ref:`uuid(value) `" +msgstr "" + +msgid "" +"Check whether the specified value is :ref:`uuid ` represented " +"by a 36-byte hexadecimal string." +msgstr "" + +msgid "" +"``true`` if the specified value is ``uuid`` represented by a 36-byte " +"hexadecimal string; otherwise, ``false``" +msgstr "" diff --git a/locale/ru/LC_MESSAGES/reference/reference_lua/clock.po b/locale/ru/LC_MESSAGES/reference/reference_lua/clock.po index eb6066ce2e..f655bda037 100644 --- a/locale/ru/LC_MESSAGES/reference/reference_lua/clock.po +++ b/locale/ru/LC_MESSAGES/reference/reference_lua/clock.po @@ -89,7 +89,8 @@ msgid "Measure the time a function takes within a processor" msgstr "Измерение времени, которое функция проводит в процессоре" msgid "" -"The wall clock time. Derived from C function ``clock_gettime(CLOCK_REALTIME)``." +"The wall clock time. Derived from C function " +"``clock_gettime(CLOCK_REALTIME)``." msgstr "" "Физическое время в секундах. Получено из C-функции " "``clock_gettime(CLOCK_REALTIME)``." @@ -105,8 +106,8 @@ msgstr "" msgid "rtype" msgstr "тип возвращаемого значения" -msgid "number or number64" -msgstr "число или 64-разрядное число" +msgid "number or cdata (ctype)" +msgstr "" msgid "**Example:**" msgstr "**Пример:**" @@ -127,15 +128,17 @@ msgstr "" "См. также :ref:`fiber.time64 ` и стандартную Lua-функцию " "`os.clock `_." +#, fuzzy msgid "" -"The monotonic time. Derived from C function ``clock_gettime(CLOCK_MONOTONIC)```. " -"Monotonic time is similar to wall clock time but is not affected by changes " -"to or from daylight saving time, or by changes done by a user. This is the " -"best function to use with benchmarks that need to calculate elapsed time." +"The monotonic time. Derived from C function " +"``clock_gettime(CLOCK_MONOTONIC)``. Monotonic time is similar to wall clock " +"time but is not affected by changes to or from daylight saving time, or by " +"changes done by a user. This is the best function to use with benchmarks " +"that need to calculate elapsed time." msgstr "" -"Монотонное время. Получено из C-функции ``clock_gettime(CLOCK_MONOTONIC)```. " -"Монотонное время похоже на физическое время, но на него не влияют изменения " -"для перехода на летнее время или изменения, сделанные пользователем. Такую " +"Монотонное время. Получено из C-функции ``clock_gettime(CLOCK_MONOTONIC)```." +" Монотонное время похоже на физическое время, но на него не влияют изменения" +" для перехода на летнее время или изменения, сделанные пользователем. Такую " "функцию лучше всего использовать для эталонного тестирования, где необходимо" " рассчитать затраченное время." @@ -248,3 +251,6 @@ msgstr "" " return 88\n" "end\n" "clock.bench(f, 10)" + +#~ msgid "number or number64" +#~ msgstr "число или 64-разрядное число" diff --git a/locale/ru/LC_MESSAGES/reference/reference_lua/compat.po b/locale/ru/LC_MESSAGES/reference/reference_lua/compat.po new file mode 100644 index 0000000000..a45ba9d6f6 --- /dev/null +++ b/locale/ru/LC_MESSAGES/reference/reference_lua/compat.po @@ -0,0 +1,114 @@ + +msgid "Module compat" +msgstr "" + +msgid "Module ``compat`` is introduced since version 2.11.0-rc." +msgstr "" + +msgid "" +"The usual way to handle compatibility problems is to introduce an option for" +" a new behavior and leave the old one by default. It is not always the " +"perfect way." +msgstr "" + +msgid "" +"Sometimes developers want to keep the old behavior for existing applications" +" and offer the new behavior by default for the new ones. For example, the " +"old behavior is known to be problematic, or less safe, or it doesn't " +"correspond to user expectations. In contrast, the user doesn't always read " +"all the documentation and often assumes good defaults. It was decided to " +"introduce a compatibility module to provide a direct way to deprecate " +"unwanted behavior." +msgstr "" + +msgid "" +"The ``compat`` module is basically a global table of options with additional" +" verbose interface and helper functions. There are three stages of changing " +"behavior:" +msgstr "" + +msgid "Old behavior by default." +msgstr "" + +msgid "New behavior by default." +msgstr "" + +msgid "New behavior is frozen and the old behavior is removed." +msgstr "" + +msgid "" +"During the first two stages, a user can toggle options via the interface and" +" change the behavior according to one's needs. At the last stage, the old " +"behavior is removed from the codebase, and the option is marked as obsolete." +" Because ``compat`` is a global instance, options can be hardcoded into it " +"or added in runtime, for example, by external module." +msgstr "" + +msgid "" +"Options are switched to the next stage in major releases. In this way, " +"developers are able to adapt to the new standard behavior and test it before" +" switching to the next release. If something is broken by a new Tarantool " +"version, a developer can still have a way to fix it by a simple config " +"change, that is, explicitly select the old behavior." +msgstr "" + +msgid "Consider example below:" +msgstr "" + +msgid "" +"The option ``json_esc_slash`` is introduced in the 2.11 minor release. " +"Default is set to 'old', but a developer can utilize the new behavior or " +"test the updated behavior by switching it manually to 'new'." +msgstr "" + +msgid "" +"In release 3.0, the next major release, ``json_esc_slash`` default is " +"switched to 'new'. Now, developers who don't manage to adapt to the new " +"behavior, are able to switch the option to 'old' and fix their module in the" +" future." +msgstr "" + +msgid "" +"In release 4.0, ``json_esc_slash`` is marked as obsolete, and the old " +"behavior is no longer accessible. Developers are forced to use the new " +"behavior." +msgstr "" + +msgid "Basic usage" +msgstr "" + +msgid "" +"If you want to explicitly secure every behavior in ``compat``, you can do it" +" manually, and then call ``compat.dump()`` to get a Lua command that sets up" +" the ``compat`` with all the options selected. You should place this " +"commands at the beginning of code in your ``init.lua`` file. In this way, " +"you are guaranteed to get the same behavior on any other Tarantool version. " +"See a :doc:`tutorial on using compat <./compat/compat_tutorial>` for more " +"examples." +msgstr "" + +msgid "Options" +msgstr "" + +msgid "Below are the available ``compat`` options:" +msgstr "" + +msgid ":doc:`json_escape_forward_slash <./compat/json_escape_forward_slash>`" +msgstr "" + +msgid ":doc:`yaml_pretty_multiline <./compat/yaml_pretty_multiline>`" +msgstr "" + +msgid ":doc:`fiber_channel_close_mode <./compat/fiber_channel_close_mode>`" +msgstr "" + +msgid "" +":doc:`box_cfg_replication_sync_timeout " +"<./compat/box_cfg_replication_sync_timeout>`" +msgstr "" + +msgid ":doc:`sql_seq_scan_default <./compat/sql_seq_scan_default>`" +msgstr "" + +msgid ":doc:`fiber_slice_default <./compat/fiber_slice_default>`" +msgstr "" diff --git a/locale/ru/LC_MESSAGES/reference/reference_lua/compat/box_cfg_replication_sync_timeout.po b/locale/ru/LC_MESSAGES/reference/reference_lua/compat/box_cfg_replication_sync_timeout.po new file mode 100644 index 0000000000..48312becc5 --- /dev/null +++ b/locale/ru/LC_MESSAGES/reference/reference_lua/compat/box_cfg_replication_sync_timeout.po @@ -0,0 +1,92 @@ + +msgid "Default value for replication_sync_timeout" +msgstr "" + +#, python-format +msgid "" +"Having a non-zero :ref:`replication_sync_timeout ` gives a user the false assumption that the " +"``box.cfg{replication = ...}`` call returns only when the configured node is" +" synced with all the other nodes. This is mostly true for the big " +"``replication_sync_timeout`` values, but it is not 100% guaranteed. In other" +" words, a user still has to check if the node is synced, or the sync just " +"timed out. Besides, while ``replication_sync_timeout`` is ticking, you " +"cannot reconfigure ``box`` with another ``box.cfg`` call, which hardens " +"reconfiguration." +msgstr "" + +msgid "" +"It is decided to set the ``replication_sync_timeout`` to zero by default." +msgstr "" + +msgid "Old and new behavior" +msgstr "" + +msgid "The ``compat`` module allows you to choose between" +msgstr "" + +msgid "" +"the old behavior: ``box.cfg.replication_sync_timeout`` is 300 seconds by " +"default" +msgstr "" + +msgid "" +"and the new behavior:``box.cfg.replication_sync_timeout`` is 0 by default." +msgstr "" + +msgid "" +"It is important to set the desired behavior before the initial ``box.cfg{}``" +" call to take effect for it." +msgstr "" + +msgid "" +"tarantool> compat.box_cfg_replication_sync_timeout = 'new'\n" +"---\n" +"...\n" +"tarantool> box.cfg{}\n" +"---\n" +"...\n" +"tarantool> box.cfg.replication_sync_timeout\n" +"---\n" +"- 0\n" +"...\n" +"tarantool> compat.box_cfg_replication_sync_timeout = 'old'\n" +"---\n" +"- error: 'builtin/box/load_cfg.lua:253: The compat option ''box_cfg_replication_sync_timeout''\n" +" takes effect only before the initial box.cfg() call'\n" +"..." +msgstr "" + +msgid "A fresh Tarantool run:" +msgstr "" + +msgid "" +"tarantool> compat.box_cfg_replication_sync_timeout = 'old'\n" +"---\n" +"...\n" +"tarantool> box.cfg{}\n" +"---\n" +"...\n" +"tarantool> box.cfg.replication_sync_timeout\n" +"---\n" +"- 300\n" +"..." +msgstr "" + +msgid "Known compatibility issues" +msgstr "" + +msgid "At this point, no incompatible modules are known." +msgstr "" + +msgid "Detecting issues in your codebase" +msgstr "" + +msgid "" +"We expect issues with a user assuming that the node is not in the orphan " +"state (``box.info.status ~= \"orphan\"``) after the " +"``box.cfg{replication=...}`` call returns. This is not true with the new " +"behaviour. To simulate the old behavior, one may add a ``box.ctl.wait_rw()``" +" call after the ``box.cfg{}`` call. ``box.ctl.wait_rw()`` returns only when " +"the node becomes writable, and hence is not an orphan." +msgstr "" diff --git a/locale/ru/LC_MESSAGES/reference/reference_lua/compat/compat_tutorial.po b/locale/ru/LC_MESSAGES/reference/reference_lua/compat/compat_tutorial.po new file mode 100644 index 0000000000..8aed8afc12 --- /dev/null +++ b/locale/ru/LC_MESSAGES/reference/reference_lua/compat/compat_tutorial.po @@ -0,0 +1,289 @@ + +msgid "Tutorial: Module compat" +msgstr "" + +msgid "" +"This tutorial covers the following ``compat`` module API and its usage:" +msgstr "" + +msgid "Listing options" +msgstr "" + +msgid "" +"The options list is serialized in the interactive console with additional " +"details for user convenience:" +msgstr "" + +msgid "All non-obsolete options in order new > old > default." +msgstr "" + +msgid "" +"Serialization returns array-like table with tables ``{