Многопользовательский доступ

Автор Kadet, 12 февраля 2019, 11:20

0 Пользователи и 1 гость просматривают эту тему.

Kadet

Однако подключил свою БД к внешней FB, только получилось это через задний проход.
Напрямую функционал LO то ли корявый и недоработаный при подключении БД Firebird, то ли мы многого не знаем. В общем напрямую подключиться с полными возможностями так и не удалось. Таблицы есть, даже править их можно (сами таблицы, а не данные), а вот доступа к данным я так и не получил. Запрос пароль научился выводить, но это ничего не дало. Любой запрос к таблицам, попытка открыть таблицу для просмотра выдаёт ошибку прав доступа, даже если входишь под SYSDBA (творец-создатель всемогущий).

Однако, сам Firebird предлагает возможность подключаться к нему черед драйвер ODBC.
В общем, скачал с сайта Firebird драйвер ODBC, установил его, настроил на свою внешнюю БД (как настраивать достаточно доходчиво расписано в инете) и уже в LO подключил базу через ODBC.
И заработало.
Несколько нюансов при настройке источника данных ODBC. Логин и пароль при настройке драйвера лучше не устанавливать. Тогда при входе будет запрос пароля и можно входить под разными логинами. Хотя, драйвер настраивается на каждой машине персонально и при этом можно и установить пароль железно прямо в драйвер. Для каждой PC свой. Но можно оставить и пустым. Тогда будет запрашивать.
И ещё, обязательно установите кодировку UTF-8. Иначе с кириллицей могут быть проблемы. Хотя и так все кириллические названия таблиц выводятся абракадаброй, но запросы к этим таблицам выполняются нормально и внутри нормально представляются все кириллические слова.

Теперь разбираюсь с сетевыми нюансами и правами доступа. Чё-то у меня сама FB никак не хочет давать права админа никому, кроме SYSDBA, а это нужно.
И ещё. Пользуемся "домашней сетью" и сервера нет поэтому общую БД ставлю на одну из машин (на подключённом через USB к роутеру внешнем жёстком диске сервер Firebird работать не будет). И при настройке драйверов ODBC через сеть - позникают проблемы с доступом. Видимо проблемы в самой сети. Разбираюсь.

Kadet

#16
Продолжу. Авось кому поможет и уменьшит их мытарства.
Уточню - кодировку нужно ставить - WIN-1251. Тогда кириллица всюду нормально воспринимается.
Для того, чтобы нормально читать данные из базы данных в настройках драйвера пришлось ставить роль - RDB$ADMIN. Даже если логин и пароль оставлять пустым роль нужно ставить иначе данные даже не читаются.

Нужно правильно прописывать путь к сетевой БД. То, что выдаёт по кнопочке "выбрать" (обзор) не работает. Нужно полностью прописывать хост (пример - 192.168.1.146 в моём случае или имя-алиас хоста, но он должен прописан в hosts), затем ":" и потом полный путь к файлу БД начиная с имени диска на компе-сервере.
Пример: 192.168.1.124:C:/Users/Public/DataBase/Firebird_3_0/examples/empbuild/FIREBIRD.FDB

"Клиента" пришлось выбирать файл fbclient.dll на компьютере клиента, а не сервера, а для этого и у клиента пришлось устанавливать сервер FB. Сервереый fbclient.dll отказывается брать. Причём, у меня W10x64, а клиента пришлось брать как 32-битного. Как ни пытался подключить fbclient.dll из папки WOW64 что на сервере FB выдаёт failed load или я чего-то недопонял в их разложении файлов.

Сеть работает, база по сети открывается, данные читаются. Однако,.. в общем месяц трудов и поисков, а вернулся туда, откуда начал. База читается, результаты выдаёт, а вот редактировать не даётся. Так же было и в простой-встроенной БД - первый вошедший имеет полный доступ, все остальные - только почитать. Так теперь по сети - ВСЕ только почитать. Причем, весьма странно. Таблицы создавать или удалять можно, добавлять и удалять поля можно, а вот редактировать и форматы полей и данные в таблицах - нельзя. И это одинаково и в SQL-запросах (макросах) и в режиме редактирования (т.е. - открыть таблицу и пытаться).
В общем - если это read-only, то какой-то неполный.
Непонятная ситуация одним словом.

Kadet

#17
Закончил. Хочу оставить краткое описание своих нелёгких мытарств, чтобы облегчить путь тем, кто пойдёт по этому же пути. Людям будет легче, а мне не жалко.
БД окончательно была закончена на LO Версия: 6.2.0.3 со встроенной БД Firebird.
Встроенная LO Base не предоставляет многопользовательский доступ. Это мне подсказали и здесь и это же конкретно прописано в Help самого LO (я потом нашёл). Следовательно нужно создавать внешний сервер и коннектиться к нему.
Первое, что нужно сделать, это вытащить файл БД из LO и сделать его внешним, ибо жалко уже потраченных трудов на его создание и делать всё заново. Сразу оговорюсь, что файл БД хранит только таблицы. Всё остальное – формы, отчёты, запросы нужно будет переносить из встроенной БД.odb, в котором создавалась БД, в новую, но это просто.
Выше я описывал способ, как вытащить этот файл из БД, посредством папки temp при открытой базе, но этот метод я бы назвал дилетантским. Лучше просто открыть свою БД.odb zip-ом и вытащить из папки database файл firebird.fbk. Это и есть сама БД. Однако, *.fbk – это запакованный архив, и прежде чем им пользоваться его нужно распаковать. Это делается с помощь утилиты gbak.exe, которая входит в комплект сервера Firebird. Команды для распаковки и запаковки в командной строке:
Распаковать:
C:\FireBird\gbak.exe -c -mo read_write C:\FIREBIRD.fbk C:\FIREBIRD.fdb -user SYSDBA -pass 'masterkey'
Запаковать:
C:\FireBird\gbak.exe -b C:\FIREBIRD.fdb C:\firebird.fbk -user SYSDBA -pass 'masterkey'

-mo[de] read_write при распаковке мне кажется будет не лишней, ибо вполне вероятно, что внутри LO БД архивируют как read_only. Получаемый файл можно обозвать как вам угодно. Это не важно.
Кстати, так же можно и обратно засунуть БД и сделать её внутренней (запаковать и всунуть в архив, открытый zip-ом).

Сразу уточню, что напрямую прикручивать полученный файл БД к LO и бесполезно и у меня не получилось. Встроенная в LO функция подключения к БД Firebird работает как-то коряво. С помощью кнопки «Выбрать» можно выбрать файл БД, но при этом в начале полученного пути LO автоматом добавляет некое «file:///» и при этом при тестировании и попытке подключиться ругается на домен, к которому не может подключиться, даже если всё находится на этом же компьютере. Никакие «танцы с бубном» с прописанием всяких разностей в файл Hosts, как это рекомендуют в инете при появлении этой ошибки, не помогают.
Однако к этому файлу можно таки подключиться если удалить в строке пути это пресловутое «file:///». Но тут «следующие грабли». Файл коннектится успешно, но ничего не открывается. Доступа нет. Постоянно требует логин и пароль. Даже если заставить LO спрашивать их всё равно не получаешь доступ. Предположив, что в самом файле БД нет данных о юзерах, ибо классическая БД FB для этого имеет отдельную специальную БД - security.db (security2.fdb, security3.fdb), я перенаправлял функцию хранения данных о юзерах на саму свою БД (есть такая возможность) прописывал юзеров уже там и потом пытался подключить этот файл к LO через встроенную функцию. Ничего не получилось. Прописывание логина и пароля в строке пути тоже ничего не дало.
К тому же, ведь сам файл БД не даёт самой возможности разделённого доступа. Многопользовательские возможности даёт сервер, а не файл. Поэтому, подключать сам файл к LO Base просто бесполезно для этой цели.

Сервер можно подключить посредством драйвера ODBC.
В общем, скачиваем сервер Firebird, скачиваем драйвер ODBC для Firebird и устанавливаем всё это на все компьютеры, которые будут использовать эту БД. Рекомендация – не устанавливайте Firebird по умолчанию в папку «Program Files», иногда могут возникать проблемы с доступом из-за пробела в пути. Создайте отдельную папку. Если делаете на машине в домашней сети, которую планируете сделать сервером – установите её в папку C:\Users\Public (Пользователи\Общая) и расшарьте её для общего доступа. В папку \Firebird_3_0\examples\empbuild\ положите полученный из LO файл базы данных.
Далее, с помощью Firebird ISQL Tool (устанавливается в комплекте с сервером Firebird), подключаемся к вытащенной из LO базе данных и прописываем всех пользователей, которые будут иметь возможность пользоваться БД. Как это делать лучше почитать в руководстве Firebird в интернете, но как пример:
CONNECT "C:\Users\Public\Firebird_3_0\examples\empbuild\FIREBIRD.FDB "  user 'SYSDBA' password 'masterkey';
CREATE USER USERNAME PASSWORD '12345' GRANT ADMIN ROLE;
GRANT RDB$ADMIN TO USERNAME;
CREATE GLOBAL MAPPING TRUSTED_AUTH USING PLUGIN SRP FROM ANY USER TO USER;
ALTER ROLE RDB$ADMIN SET AUTO ADMIN MAPPING;

* /Создаём клиента, прописываем ему роль в БД (ADMIN и RDB$ADMIN – немного разное, поэтому лучше прописать оба). Создаём глобальные MAP для ролей ADMIN.

Прописываем драйвер ODBC. В принципе в инете много инфы, как это делать, но я столкнулся с некоторыми специфическими нюансами, упоминаний о которых практически нигде нет.
Итак, в поиске (по кнопке «Пуск») пишем «Источники данных (ODBC)». Выбираем свою версию разрядности (х64 или х32). В открывшемся окне выбираем вкладку «Системный DNS». Конечно, для персональной машины можно настроить и персональный DNS и законнектиться через него, но тогда никто с другим логином на этой машине просто не войдёт в БД, поэтому лучше настроить «Системный». Давим кнопку «Добавить» и выбираем из списка драйвер «Firebird».
*Имя источника данных (DNS) – называем как хотим наш драйвер. Лучше латиницей. Это имя и будет светиться в LO при подключении.
*Примечание – необязательное или выставляем описание БД (памятку).
*База данных – прописываем путь к БД. Наверное, это одно из самых главных полей, но как его правильно заполнять, опять же, мало где есть. НЕ ПОЛЬЗУЙТЕСЬ КНОПКОЙ «Открыть» при подключении к удалённой БД. Этой кнопкой можно пользоваться ТОЛЬКО ЕСЛИ БД находится на вашей локальной машине. Прописывайте полный путь к БД на другой машине ТАК, КАК ОН ПРОПИСАН НА САМОЙ УДАЛЁННОЙ МАШИНЕ и перед этим путём просто добавьте имя хоста (HostServer – например, имя компьютера сети) или его IP во внутренней сети и между этим и путём нужно поставить «:».
Пример: HostServer:C:\Users\Public\Firebird_3_0\examples\empbuild\FIREBIRD.FDB.
Или: 192.168.1.146:C:\Users\Public\Firebird_3_0\examples\empbuild\FIREBIRD.FDB.

Если вы не пропишете название диска (C:\), то получите ошибку.
Если использовать наименование сервера или машин в сети (HostServer) то в файле hosts (C:\Windows\System32\drivers\etc\) на каждой PC сети, которые будут использовать эту БД, нужно прописать соответствие IP - host. Пример:
192.168.1.146    HostServer
*Клиент – Прописываем пусть к файлу C:\Windows\System32\FBCLIENT.DLL (при установке сервера Firebird он там появляется). Этот путь для каждой машине будет одинаковым. На каждой машине к СВОЕЙ System32, а не к серверной.
*Пользователь и пароль – для проверки ставим SYSDBA и masterkey (или свой пароль, если вы его меняли). Однако, уже при работе с БД рекомендую оставить эти поля пустыми, чтобы драйвер сам спрашивал логин и пароль при входе в БД.
*Роль – здесь засада. Во всех описаниях рекомендуют оставить это поле пустым, но если так, то в базе данных LO даже читать  (открыть) таблицы будет невозможно, даже под логином создателя – SYSDBA. Поэтому в этом поле следует поставить - RDB$ADMIN. Тогда каждый пользователь, которому в самой БД даны такие права, будет входить в БД с правами администратора.
*Галочку read (по умолчанию write) оставляем отключенной иначе будет только для чтения.
Всё... Проверяем успешный коннект и сохраняем. ODBC настроен.

Далее, открываем свою БД LO и создаём новую базу (Файл/Создать/Базу данных или просто Ctrl+N).
Выбор базы данных – Соединиться с существующей базой данных. Выбираем ODBC и Далее.
Обзор – выбираем ту БД, которую мы создали в ODBC. Далее.
Вписываем логин (один из зарегистрированных в БД) и ставим галочку «требовать пароль». Далее.
Регистрируем и сохраняем новую БД.
Далее можно войти в дополнительные настройки (Правка/Базы данных/Расширенные настройки) и выбрать вкладку «Специальные настройки» и побаловаться с галочками дополнительных настройках, но особого эффекта от этого я не заметил.
Формы, запросы и Отчёты можно просто перетащить из старой БД в новую открыв обе одновременно.
Всё. Можно работать.

И вот мы подошли к САМОЙ БОЛЬШОЙ засаде нового LO. При любой попытке изменения данных БД, будь то в таблице напрямую или через формы для создания или изменения данных мы получаем неизменное - [ODBC Firebird Driver]Driver does not support this function ([Драйвер ODBC Firebird]драйвер не поддерживает эту функцию). При этом – удалять и создавать новые таблицы мы можем. Добавлять и удалять поля в таблицах мы тоже можем. Мы даже можем загонять и изменять данные с помощью SQL запросов (Сервис/SQL). При этом, если проверить права доступа (в Сервис/SQL загнать запрос - SELECT CURRENT_USER, CURRENT_ROLE FROM RDB$DATABASE; (не забудьте поставить галочку на «Показывать вывод операторов SELECT», чтобы видеть результаты)) то можно увидеть, что вы – полный админ, но при этом... ЗАСАДА.
Поначалу думал, что какие-то проблемы с доступом, но оказалось нет.
Всё дело в том, что новый LO использует инструкции, функции и атрибуты ODBC уже версии 3.х, а для Firebird на официальном сайте последний ODBC только версии 2.х, и как оказалось – это большая разница. Последнее обновление было ещё в 17-м году и не известно когда будет следующее. К примеру у MySQL и SQL-server уже в ходу 6-е и даже 8-е версии ODBC.

Однако, не стоит отчаиваться. В этой ситуации есть три возможных выхода:
Первый – самому дописать Firebird_ODBC до версии 3.х (что мною пока ещё не освоено);
Второй – поменять все формы для записи или изменения данных в таблицах на пустышки (т.е. не выполняющие эти функции по-умолчанию) и изменения в таблицы вносить с помощью макросов по кнопочке или при закрытии. Это – работает, но при этом в таблицы вручную никаких изменений внести невозможно и сами таблицы (форматы полей и т.п.) изменить нельзя, кроме как удалять или добавлять.
И третий - более простой, но самый надёжный способ – откатить LO к старой версии. Все последние версии не проверял, но на 5.4.7.2 – всё прекрасно работает. Работает ВСЁ и как надо. А, если есть желание таки перейти на новый LO, придётся терпеливо ждать когда же разработчики Firebird соблаговолят создать более современный ODBC-драйвер.
Ну, вот. Где-то так.

kompilainenn

Цитата: Kadet от  2 марта 2019, 18:02Всё дело в том, что новый LO использует инструкции, функции и атрибуты ODBC уже версии 3.х, а для Firebird на официальном сайте последний ODBC только версии 2.х, и как оказалось – это большая разница. Последнее обновление было ещё в 17-м году и не известно когда будет следующее. К примеру у MySQL и SQL-server уже в ходу 6-е и даже 8-е версии ODBC.
Мааайк, может об этом написать багу?
А вот это вообще просто сказка:
Цитата: Kadet от  2 марта 2019, 18:02Все последние версии не проверял, но на 5.4.7.2 – всё прекрасно работает. Работает ВСЁ и как надо. А, если есть желание таки перейти на новый LO, придётся терпеливо ждать когда же разработчики Firebird соблаговолят создать более современный ODBC-драйвер.

Kadet, огромное спасибо за изыскания и собирание граблей в этом вопросе
Поддержать разработчиков LibreOffice можно тут, а наш форум вот тут

mikekaganski

Нууууу.... багу написать - это конечно здорово... только вот сначала проверить источники сведений.

А то в релизнотах к ODBC-драйверу FB *стандарт* ODBC 3.0 мелькает ещё в 2008. И читая "К примеру у MySQL и SQL-server уже в ходу 6-е и даже 8-е версии ODBC", *кажется*, что перепутаны версии драйвера (которые могут быть любыми, хоть 125) и версии стандарта (у которого до сих пор 4.0 ещё не вышел, не говоря о 6-ых и 8-ых). Так что не всё очевидно.
С уважением,
Михаил Каганский

Kadet

Ну, я конечно могу запутался в версиях самой основы драйвера ODBC 3.x и версиях драйверов для конкретного приложения, но... "шо вижу, то пою" (вложения).

mikekaganski

Kadet: номера версий драйверов не имеют *никакого* значения. Хотя, конечно, может статься, что все проблемы совместимости с DOC(X) у нас просто потому, что версия Word уже 2019, а у нас только 6...

Важно понять, откуда сведения, что "Всё дело в том, что новый LO использует инструкции, функции и атрибуты ODBC уже версии 3.х, а для Firebird на официальном сайте последний ODBC только версии 2.х, и как оказалось – это большая разница".
С уважением,
Михаил Каганский

Kadet

В Firebird_ODBC - точно версия драйвера 2.х. Как говорится, на граблях проверено. У других не проверял.

Я так думаю, что разработчики новой LO заточили всё под ODBC 3.х потому, что он уже используется практически во всех основных БД (MySQL, PostgreSQL и пр., а так же в SQL-server). И, видимо, они даже не заморочились проверить работу на внешней Firebird.

Багзилу можно сообщить, но сам это не хочу. Там слишком замороченные правила подачи заявок.
Можно в Firebird написать с просьбой ускорить разработку Firebird_ODBC 3.х. Вот это я, наверное, сделаю.

Kadet

#23
Метод нахождения этой ошибки.
Включаю трассировку ODBC-драйвера (в Настройках драйвера есть). Запускаю базу LO и тыкаю во всякие проблемные места, намерено вызываю ошибки. Во всех случаях ошибка по сути одна:
[ODBC Firebird Driver]Driver does not support this function
([Драйвер ODBC Firebird]драйвер не поддерживает эту функцию)


Закрываю базу LO. Выключаю трассировку.
Открываю созданный при трассировке файл SQL.log и внимательно его изучаю. Нахожу упоминания об ошибке и проверяю все предшествующие ей функции.
В моём случае была найдена функция SQLBulkOperations, вызывающая эти ошибки.
Строка 16550:   Desktop"        35dc-940 EXIT  SQLBulkOperations  with return code -1 (SQL_ERROR)Нахожу в инете описание функции. Ищу в описании код моей ошибки (в моём случае это - IM001, это я из логов высмотрел) и там читаю:
IM001 Драйвер не поддерживает эту функцию Драйвер (DM), связанные с StatementHandle не поддерживает функцию.
В описании функции читаю, что эта функция появилась в ODBC-драйвере только с 3-й версии и в прежних её не было, следовательно со 2-й версией драйвера она просто несовместима, поэтому 2-я версия драйвера эту функцию и не поддерживает, как гласит сообщение об ошибке.

Для проверки специалистами моих изысканий выкладываю лог трансляции ODBC-драйвера.

mikekaganski

SQLBulkOperations реализован в FB ODBC Driver уже 11 лет (https://github.com/FirebirdSQL/firebird-odbc-driver/commit/ccf6232395baf5ed6c10e7f0c853bdac3720708a). В ЛО версия стандарта ODBC была выставлена в 3.51 уже в 2002 году (https://git.libreoffice.org/core/+/84039ba3f9daf4d9948f123f7decf0b63e3a8a96%5E%21/). Я сильно сомневаюсь, что тут всё правильно настроено, если возникают такие проблемы.
С уважением,
Михаил Каганский

Kadet

#25
mikekaganski, я искал драйвера на оф.сайтах. То, что предоставили вы не находил.
Цитата: mikekaganski от  2 марта 2019, 21:02В ЛО версия стандарта ODBC была выставлена в 3.51 уже в 2002 году (https://git.libreoffice.org/core/+/84039ba3f9daf4d9948f123f7decf0b63e3a8a96%5E%21/)
В этом коде, по моему конкретная заточка под Unix, иначе что за упоминание в заглавиях кода: add: unixODBC header files. У меня Windows. К тому же - с чего понятно, что это ODBC 3.х, а не какой-нибудь наидревнейший (2002 год).
И в описаниях по первой ссылке конкретно указано: Firebird ODBC driver 2.1 version или Fix for ODBC-99. ODBC driver 2.0 RC2 crashes in SQLFreeHandle и так ко многим папкам и файлам. Или я чего-то не понимаю.

К тому же, не знаю, что с этим делать, как устанавливать. Уже давным давно не работал в c++ и как установить и проверить драйвер из первой ссылки пока ума не приложу.

Цитата: mikekaganski от  2 марта 2019, 21:02Я сильно сомневаюсь, что тут всё правильно настроено, если возникают такие проблемы.
Все свои настройки я подробно описал в большом посте. Ничего не утаил. Спокойно можно скачать и установить сервер и драйвер, подключиться к тестовой БД, который автоматом создаётся при установке сервера (у неё есть уже готовый набор таблиц) и протестировать - попробовать открыть любую таблицу и поменять там что-нибудь или добавить новую запись. Даже пользователей создавать не нужно ибо SYSDBA (админ-творец) с паролем masterkey создаётся автоматом. У меня не получилось. К тому же, мои исследования проводились как минимум на 4-х разных машинах, на Win7x32 и Win10x64 с разными настройками. И везде результат один.

Однако убеждать не буду. Просто рассказал что делал, на какие грабли наступал и как это преодолевал.
У меня уже всё работает. Я нашёл то, что искал.

mikekaganski

Цитата: Kadet от  2 марта 2019, 22:01Все свои настройки я подробно описал в большом посте
И это очень здорово - спасибо. Попробую протестировать - как появится возможость...
С уважением,
Михаил Каганский

Kadet

Поискал в инете драйвера ODBC_3 для FB. Нашёл несколько платных.
В частности - Devart_ODBC_Firebird.

Но... все разочаровали. Представленный выше работает лучше других, но весьма странно. При первом обращении к таблице или открытии формы - даёт ошибку:

Невозможно загрузить данные.
Состояние SQL: HY000
[Devart][ODBC][Firebird]Cursor is not open


При повторном открытии этой таблицы или формы - уже работает нормально. Данные меняет.
В общем, как-то избирательно работает. По счётчику.

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

Глубоко исследовать не стал ибо версия демо и дороговатая. Проще и дешевле на старой версии LO работать. Там работает без проблем. Кстати, и этот драйвер (Devart_ODBC_Firebird) тоже работает без проблем. Так может всё-таки, есть таки какая-то проблема в самом новом LO.

Кстати, протестировал. Уже начиная с первых с LO 6.0 odbc перестаёт нормально работать.

Kadet

Итак, народ, я таки нашёл самую суть этой проблемы.
В расширенных настройках базы данных (Правка/Базы_данных/Расширенные_настройки) во кладке "Специальные настройки" в этом "рояле" из галочек есть самая нижняя - "Тип результирующего набора из драйвера базы данных". Чтобы база нормально работала с Firebird_ODBC она должна быть отключена. Так вот - в старой LO_5 - она отключается, а вот в новой LO_6 - нет. Сколько её не тыкай - после перезагрузки она снова включается. Если её отключить и не перегружая продолжать работать - всё работает и в 5-й и в 6-й. Однако после перезагрузки в 5-й она сохраняет отключенное состояние, а в 6-й снова самопроизвольно включается.

Это, конечно можно обойти макросом. В частности при загрузке самой БД на событие "Открытие файла" (в головной форме - Сервис/Настройка/События) у меня стоит макрос, где я отлавливаю в глобальную переменную объект головной БД  - ThisDatabaseDocument. Вот там можно макросом снять эту самую галочку:
ThisDatabaseDocument = ThisComponent
ThisDatabaseDocument.DataSource.Settings.RespectDriverResultSetType = false


Кстати, в этих расширенных настройках не только эта галочка не держит заданного состояния. Половина из них возвращается в состояние по-умолчанию самопроизвольно, т.е. не держат заданных им параметров. Если так задумано авторами, так нафига тогда этот "рояль" нужен, если он всё равно не настраивается как хочешь?
Однако - это всё-таки глюки LO_6.x. Обойти то их можно с помощью макросов, но зачем "козе баян". LO нужно ремонтировать.

mikekaganski

С уважением,
Михаил Каганский