Инструменты пользователя

Инструменты сайта


databases:tarantool

Различия

Показаны различия между двумя версиями страницы.

Ссылка на это сравнение

Предыдущая версия справа и слева Предыдущая версия
Следующая версия
Предыдущая версия
databases:tarantool [2021/12/24 12:24]
admin
databases:tarantool [2021/12/29 10:52] (текущий)
admin [Примеры]
Строка 243: Строка 243:
 Интерпретатор скриптов: "/usr/bin/evn tarantool", с помощью его можно иcполнить любой скрипт на lua.\\ Интерпретатор скриптов: "/usr/bin/evn tarantool", с помощью его можно иcполнить любой скрипт на lua.\\
 Можно просто дать скрипт аргументом процессу он его выполнить и завершится: "tarantool my-script.lua"\\ Можно просто дать скрипт аргументом процессу он его выполнить и завершится: "tarantool my-script.lua"\\
 +
 +Вызов функции внутри **pcall()**- обеспечивает безопасное поведение в случае ошибки.\\
 +
 +
 +
  
  
Строка 321: Строка 326:
  
 <details> <details>
-<summary> :!: Пример: "Вставка 1 млн кортежей с помощью хранимой процедуры" </summary>+<summary> :!: "**Вставка 1 млн кортежей** с помощью хранимой процедуры" </summary>
 Серверное приложение, создание одного спейса, пара функций, генерация рандомной символьной строки, вставка таких строк в цикле, + показан пример замера времени работы скрипта Серверное приложение, создание одного спейса, пара функций, генерация рандомной символьной строки, вставка таких строк в цикле, + показан пример замера времени работы скрипта
  
Строка 394: Строка 399:
 tarantool> 'insert done in ' .. end_time - start_time .. ' seconds' tarantool> 'insert done in ' .. end_time - start_time .. ' seconds'
 tarantool> box.space.tester:select{1}</code> tarantool> box.space.tester:select{1}</code>
 +</details>
 +
 +
 +
 +<details>
 +<summary> :!: **Подсчет значений поля** в пространстве </summary>
 +
 +Подсчет происходит в этой функции\\
 +"Pairs()" типа массив всех строк, по которым и делаем цикл\\
 +
 +
 +<code lua>
 +json= require('json')
 +function sum_json_field(field_name)
 +        local v, t, sum, field_value, is_valid_json, lua_table
 +        sum= 0
 +        for v, t in box.space.tester:pairs() do
 +                is_valid_json, lua_table= pcall(json.decode, t[2])
 +                if is_valid_json then
 +                        field_value= lua_table[field_name]
 +                        if type(field_value)== "number" then sum= sum + field_value end
 +                end
 +        end
 +        return sum
 +end
 +</code>
 +
 +В двух записях намерено допущены ошибки, эти строки пропускаются
 +<code lua>
 +-- Создание/Заполнение пространства
 +box.space.tester:drop()
 +box.schema.space.create('tester')
 +box.space.tester:create_index('primary', {parts = {1, 'unsigned'}})
 +
 +box.space.tester:insert{445, '{"Item": "widget", "Quantity": 7}'}
 +box.space.tester:insert{446, '{"Item": "golf club", "Quantity": "sunshine"}'}
 +box.space.tester:insert{447, '{"Item": "waffle iron", "Quantit": 3}'}
 +
 +-- Вызов ф-ции
 +sum_json_field("Quantity")
 +</code>
 +</details>
 +
 +
 +
 +<details>
 +<summary> :!: **Хранимые процедуры на С** </summary>
 +Проверьте наличие пакета "tarantool-dev"\\
 +
 +Создайте и скомпилируйте следующий модуль (easy.c):
 +<code c>
 +#include "module.h"
 +int easy(box_function_ctx_t *ctx, const char *args, const char *args_end)
 +{
 +        printf("hello world\n");
 +        return 0;
 +}
 +
 +int easy2(box_function_ctx_t *ctx, const char *args, const char * args_end)
 +{
 +        printf("hello world -- easy2\n");
 +        return 0;
 +}
 +</code>
 +
 +Скомпилировать можно командой:
 +<code bash>$ gcc -shared -o easy.so -fPIC easy.c</code>
 +
 +Далее откройте клиент tarantool в интерактивном режиме:
 +<code bash>
 +box.cfg{listen=3306}
 +box.schema.space.create('capi_test')
 +box.space.capi_test:create_index('primary')
 +net_box = require('net.box')
 +capi_connection = net_box:new(3306)
 +
 +box.schema.func.create('easy', {language = 'C'})
 +box.schema.user.grant('guest', 'execute', 'function', 'easy')
 +capi_connection:call('easy')
 +</code>
 +
 +Находясь в той же директории где скомпилирован модуль С, тарантул находит указанные файлы.\\
 +Если название функции отличается он файла, то нужно указывать его:
 +<code bash>
 +box.schema.func.create('easy.easy2', {language = 'C'})
 +box.schema.user.grant('guest', 'execute', 'function', 'easy.easy2')
 +capi_connection:call('easy.easy2')
 +</code>
 +</details>
 +
 +
 +
 +<details>
 +<summary> :!: **Еще пример использования С** </summary>
 +
 +В основном используются API функции [[https://github.com/tarantool/msgpuck|модуля msgpuck]]\\
 +
 +
 +"hardest.c"
 +<code c>
 +#include "/usr/include/tarantool/module.h"
 +#include "/var/msgpuck/msgpuck.h"
 +
 +int hardest(box_function_ctx_t *ctx, const char *args, const char *args_end)
 +{
 +        uint32_t space_id= box_space_id_by_name("capi_test", strlen("capi_test"));
 +        char tuple[1024];
 +        char *tuple_pointer= tuple;
 +        tuple_pointer= mp_encode_array(tuple_pointer, 2);
 +        tuple_pointer= mp_encode_uint(tuple_pointer, 10000);
 +        tuple_pointer= mp_encode_str(tuple_pointer, "String 2", 8);
 +        int n= box_insert(space_id, tuple, tuple_pointer, NULL);
 +        return n;
 +}
 +</code>
 +
 +После компиляции модуля выполните в терминале тарантула:
 +<code lua>
 +box.schema.func.create('hardest', {language = "C"})
 +box.schema.user.grant('guest', 'execute', 'function', 'hardest')
 +box.schema.user.grant('guest', 'read,write', 'space', 'capi_test')
 +capi_connection:call('hardest')
 +
 +-- Выполнение
 +box.space.capi_test:select()
 +</code>
 +</details>
 +
 +
 +<details>
 +<summary> :!: **Использование SQL** </summary>
 +
 +Подключаемся к консоли, двумя командами задаем язык и разделитель команд:\\
 +<code bash>
 +tarantool> \set language sql
 +tarantool> \set delimiter ;
 +</code>
 +
 +Далее выполняем команды в формате SQL
 +<code sql>
 +tarantool> create table table1 (column1 integer primary key, column2 varchar(100));
 +tarantool> insert into table1 values (1, 'A'); insert into table1 values (2, 'B'); 
 +tarantool> update table1 set column2='AB' where column1='2';
 +tarantool> select * from table1;
 +</code>
 +Результат аналогичен использованию команд типа "box.space..."\\
 +Здесь создается пространство "table1", и вставка пары кортежей (записей).\\
 </details> </details>
  
databases/tarantool.1640348688.txt.gz · Последнее изменение: 2021/12/24 12:24 — admin