# Пример UDF Sphinx

Многие базы данных и поисковые системы позволяют настраивать ваши запросы с помощью так называемых "пользовательских определенных функций" или UDF. Sphinx и Manticore не являются исключением. В документации есть длинный раздел об этом - https://manual.manticoresearch.com/Extensions/UDFs_and_Plugins/UDF#UDF

Здесь я хочу привести лишь быстрый пример того, как вы можете создать UDF, который включает некоторую функциональность, которая может быть действительно полезной в некоторых случаях, но отсутствует из коробки - функция sleep().

Прежде всего создайте код вашего UDF на C:

```bash
[snikolaev@dev01 ~]$ cat sleep.c
#include </home/snikolaev/./manticore_gitlab/src/sphinxudf.h>

int sleep_ver() {
	return SPH_UDF_VERSION;
}

sphinx_int64_t sleep ( SPH_UDF_INIT * init, SPH_UDF_ARGS * args, char * error_flag ) {
	usleep(*args->arg_values[0] * 1000000);
}


```
Как вы можете видеть, он имеет только 2 функции:
- `sleep_ver()`, возвращающая текущий `SPH_UDF_VERSION` из включенного `sphinxudf.h`
- и `sleep()`, которая выполняет задачу - заставляет спать на количество секунд, указанное в аргументе #1

**ПОДСКАЗКА: Убедитесь, что ваш файл имеет расширение ".c", а не ".cpp", иначе он может не работать.**

Далее вам нужно собрать вашу библиотеку:

```bash
[snikolaev@dev01 ~]$ gcc sleep.c -shared -o sleep.so -g -fPIC
[snikolaev@dev01 ~]$
```

Теперь у вас есть `sleep.so`, который включает вашу функцию:

```bash
[snikolaev@dev01 ~]$ ls -la sleep.so
-rwx--x--x 1 snikolaev snikolaev 8209 Sep 10 04:37 sleep.so
```

Далее убедитесь, что вы указали в вашем конфиге, где searchd должен искать UDF, используя директиву [plugin\_dir](https://docs.manticoresearch.com/latest/html/conf_options_reference/common_section_configuration_options.html#plugin-dir):


```bash
common {
    plugin_dir = /home/snikolaev
}
```

Теперь запустите searchd и создайте функцию:

```sql
mysql> create function sleep returns int soname 'sleep.so';
Query OK, 0 rows affected (0.00 sec)
```

**ПОДСКАЗКА: если вы не хотите делать это каждый раз при запуске searchd, вы можете поместить команду в файл:**


```bash
[snikolaev@dev01 ~]$ cat state.sql
CREATE FUNCTION sleep RETURNS INT SONAME 'sleep.so';
```

и использовать

```bash
sphinxql_state = state.sql
```

*в разделе searchd вашего конфига, чтобы команда выполнялась при запуске.*

Как только вы зарегистрировали функцию в searchd, вы можете использовать ее:

```bash
mysql> select sleep(1);
+----------+
| sleep(1) |
+----------+
| 0 |
+----------+
1 row in set (1.00 sec)
```

Если у вас есть какие-либо вопросы о Sphinx UDF, не стесняйтесь спрашивать нас на нашем [форуме](https://forum.manticoresearch.com/) или в нашем [публичном канале Slack](https://slack.manticoresearch.com/).
