/******************************************************************************
ProjectName: cro2sql
FileName: messages.hpp
Subj: ╤юфхЁцшЄ ёююс∙хэш , т√фртрхь√х юёэютэ√ь ьюфєыхь яЁюуЁрьь√.
Author: Nosov Yuri
*******************************************************************************
  (c) Copyright 2008 Nosov Yuri (cro2sql@ggmail.com)

  The contents of this file are subject to the cro2sql License (the "License");
  you may not use this file except in compliance with the License.  You may
  obtain a copy of the License in the 'LICENSE' file which must have been
  distributed along with this file.

  This software, distributed under the License, is distributed on an "AS IS"
  basis, WITHOUT WARRANTY OF ANY KIND, either express or implied.  See the
  License for the specific language governing rights and limitations
  under the License.
******************************************************************************/

#ifndef __MESSAGES__
#define __MESSAGES__ 1


#include <string>

// OD - Option description
const char * OD_MODE =          "Установить путь к конфигурационному файлу (см. Конфигурационный файл).";
const char * OD_AUTO =          "Установить путь к файлу экспорта списка банков данных ИСУБД CronosPlus и имя транслируемого банка данных, разделенные \";\".";
const char * OD_OUTPUT =        "Сохранить файлы с SQL-выражениями в указанную папку.";
const char * OD_SILENT =        "Не выдавать ничего в стандартный поток вывода.";
const char * I_HEADER =         "cro2sql - транслятор банков данных из экспорта ИСУБД CronosPlus в SQL\nВсе права защищены (c) Носов Юрий (hoxnox@gmail.com)";
const char * I_FOOTER =         "Воспользуйтесь -h или --help для получения справки";
const char * E_AUTO_MANUAL =    "Использование ключей -m (--manual) и -a (--auto) одновременно запрещено";
const char * E_UNKNOWN_OPT =    "Неизвестная опция";
const char * E_OPT =            "Не все обязательные параметры были заполнены.";
const char * E_WRONG_ARG =      "Неверный агрумент опции";
const char * E_PARSE_ERROR =    "Возникла ошибка при разборе файла, содержащего информацию о структуре транслируемого банка данных.\nСообщение парсера: ";
const char * E_DATA_PARSE =     "Возникла ошибка при разборе файла данных. Сообщение парсера данных : ";
const char * E_FILE_NOT_FOUND = "Файл не найден.";
const char * E_FILE_OPEN_ERROR ="Ошибка при открытии файла настройки под СУБД";
const char * E_TUNE_FILE =      "Файл настройки СУБД имеет неправильную структуру";
const char * E_EXT_LINES_RANGE ="Неверное значение параметра -m (--extended).";
const char * E_LIST_ERROR =     "Обнаружена ошибка в файле, содержащим информацию о структуре транслируемого банка данных:\n";
const char * E_PREFIX =         "ERROR  : ";
const char * W_PREFIX =         "WARNING: ";
const char * M_PREFIX =         "         ";


string GetFullHelp()
{
  stringstream output;
  output << "CRO2SQL(1)                                                           CRO2SQL(1)\n\
\n\
(c) 2008 Носов Юрий Александрович (hoxnox@gmail.com)\n\
Все вопросы по работе приложения направлять cro2sql@gmail.com\n\
\n\
NAME\n\
  cro2sql - транслятор банков данных из экспорта ИСУБД CronosPlus в SQL\n\
\n\
SYNOPSIS\n\
  cro2sql [-d<sep>|-t<conf>|-m<count>|-s] -c<struct_file>[;<bank_name>] \n\
          -e<data> -o<path>\n\
    struct_file - Путь к файлу, содержащему описание структуры банка данных.\n\
                  Подробней смотри ниже, в разделе \"Файл,  содержащий структуру\n\
                  банка данных\".\n\
    bank_name   - В  случае,  если  файл,  содержащий  структуру  банка  данных\n\
                  описывает несколько банков данных  (является экспортом списка\n\
                  банков  данных из  ИСУБД CronosPlus),  необходимо указыть имя\n\
                  банка, который собираемся транслировать.\n\
    data_exp    - Путь к  папке,  содержащей  файлы  экспорта  данных  из ИСУБД\n\
                  CronosPlus.\n\
    \n\
DESCRIPTION\n\
  Общие сведения \n\
    Транслятор cro2sql  служит для быстрого  преобразования банка данных  ИСУБД\n\
    CronosPlus  в реляционную базу данных формата SQL. На вход cro2sql подается\n\
    информация  о  структуре  банка  данных  формата  ИСУБД CronosPlus и  файлы\n\
    экспорта  данных (полученные  с помощью функциональности  \"экспорт в текст\"\n\
    ИСУБД).   Транслятор  на  основе  информации  о  структуре  генерирует  SQL\n\
    инструкции, с помощью которых в реляционной СУБД  можно  восстановить  базу\n\
    данных.\n\
\n\
  Файл, содержащий структуру банка данных.\n\
    Представляет собой txt-файл в кодировке windows-1251,  содержащий  сведения\n\
    о  структуре  банка данных. Формат  файла  соответствует  формату  экспорта\n\
    списка банков из ИСУБД CronosPlus, содержащего как минимум:\n\
      Наименование банка, \n\
      Перечень баз, их свойства,\n\
      Перечень полей, их свойства.\n\
    Для получения подобного файла,  следует  в  ИСУБД CronosPlus выбрать  меню:\n\
    Банк=>\"Список файлов\".  В появившемся окне  нажать кнопку  \"В текст ...\". В\n\
    появившемся окне, отметить галочками сответствующие пункты,  указать  адрес\n\
    в поле  \"Файл отчета\" и нажать выполнить.  Файл, содержащий структуру банка\n\
    данных будет сгенерирован.  Транслятор для  именования таблиц и полей будет\n\
    использовать   названия  соответствующих  баз  и  полей   ИСУБД CronosPlus.\n\
    Существует  возможность  задать  свои  названия  баз  и  полей  - см раздел\n\
    \"Управление трансляцией\".\n\
      \n\
      Пример файла структуры:\n\
      ******************Содержание файла структуры банка***********************\n\
        Наименование банка:  Тестовый банк\n\
\n\
\n\
        Список баз:\n\
        N|Название базы|Имя|Тип|Кол-во наборов|Поле кода|Кол-во записей\n\
        1|Лицо|ЛЦ|1|0||223\n\
        2|Адрес|АД|1|0||142\n\
\n\
        База  :Лицо\n\
        Состав полей базы\n\
        N поля| Название поля|Тип|Длина поля|Словарь|Статус|Связь с базами\n\
        0|Системный номер|Ц|10|||\n\
        6|Пол|С||Пол||\n\
        1|Фамилия|Т|100000|||\n\
        2|Имя|Т|100000|||\n\
        3|Отчество|Т|100000|||\n\
        4|Место жительства|П|||МН|АД2\n\
\n\
\n\
        ==========================\n\
\n\
        База  :Адрес\n\
        Состав полей базы\n\
        N поля| Название поля|Тип|Длина поля|Словарь|Статус|Связь с базами\n\
        0|Системный номер|Ц|10|||\n\
        1|Город|Т|100000|||\n\
        2|Проживает|О|||МН|ЛЦ4\n\
      *************************************************************************\n\
  \n\
  Трансляция.\n\
    1. Преобразование идентификаторов.\n\
      - приведение к нижнему регистру\n\
      - замена всех символов, отличных от цифр, символов нижнего регистра \n\
        латинского алфавита и символа \"_\" на символы \"_\"\n\
      - сворачивание повторяющихся символов \"_\"\n\
      - замена символов кириллицы латинницей по правилам:\n\
         'а'=\"a\"  'ё'=\"e\"   'м'=\"m\" 'т'=\"t\"   'ш'=\"sh\"  'ю'=\"yu\"\n\
         'б'=\"b\"  'ж'=\"zh\"  'н'=\"n\" 'у'=\"u\"   'щ'=\"sh\"  'я'=\"ya\"\n\
         'в'=\"v\"  'з'=\"z\"   'о'=\"o\" 'ф'=\"f\"   'ъ'=\"j\"\n\
         'г'=\"g\"  'и'=\"i\"   'п'=\"p\" 'х'=\"h\"   'ы'=\"i\"\n\
         'д'=\"d\"  'к'=\"k\"   'р'=\"r\" 'ц'=\"c\"   'ь'=\"j\"\n\
         'е'=\"e\"  'л'=\"l\"   'с'=\"s\" 'ч'=\"ch\"  'э'=\"e\"\n\
      - удаление  (от начала) всех  символов,  отличных от символов  латинского\n\
        алфавита.\n\
      - в случае, если преобразование невозможно, используем \"invalid_name\"\n\
      ЗАМЕЧАНИЕ:\n\
        В тех случаях, когда необходимо добиться уникальности имен, применяется\n\
        следующий метод:\n\
          Если позволяет длина, дописываем вконец _N или N.\n\
          Если длина не позволяет,меняем последние символы идентификатора на N.\n\
          В случае, если получившийся идентификатор уже используется, \n\
          увеличиваем N.\n\
            N - строка символов,содержащая цифры и символы латинского алфавита.\n\
            Меняется по увеличивается образом:\n\
            0, 1, ... , 9, a, b, ..., z, 10, 11, ..., 19, 1a, ..., 1z, 2z, ...\n\
    2. Преобразование типов\n\
      Существуют  существенные  различия  между  реализациями стандарта SQL'99.\n\
      Поумолчанию был выбран стандарт, используемый MySQL.  Преобразование типа\n\
      неоднозначно и зависит от данных.\n\
        Т - VARCHAR или TEXT\n\
        Ц - INTEGER или FLOAT\n\
      Для множественных полей строится дополнительная таблица, следующего вида:\n\
        имя: mv_<имя таблицы>_<имя поля>\n\
        имеет два поля: id -  числовой  тип и  value -  тип множественного поля\n\
        ИСУБД CronosPlus.  Каждое  из  значений  множественного  поля заносится\n\
        в рассмотренную  выше дополнительную  таблицу, id этих записей вносится\n\
        в таблицу SQL.\n\
        Например:\n\
          Лицо                                  person\n\
          Имя: Иванов                           name: Иванов\n\
          Гражданство: Россия;Германия          citizenship: 1\n\
                                                Дополнительная таблица:\n\
                                                mv_person_citizenship\n\
                                                id: 1 value: Россия\n\
                                                id: 1 value: Германия\n\
    3. Преобразование связей\n\
      Все связи ИСУБД CronosPlus, по рекомендациям  разработчика,  должны  быть\n\
      множественными, поэтому все  соответствующие  связи SQL будут  \"многие ко\n\
      многим\".  Будьте внимательны.  Транслятор может  некорректно  работать  с\n\
      базами, мнемокоды которых содержат символы \"|\".\n\
      \n\
  Управление трансляцией.\n\
    В случаях, когда необходимо  определить  названия  или  типы таблиц и полей\n\
    вручную, можно изменить файл структуры следующим образом:\n\
    В описании баз добавить в заголовок \"SQL имя\", и изменить описания. \n\
      Пример:\n\
        N|Название базы|Имя|Тип|Кол-во наборов|Поле кода|Кол-во записей|SQL имя\n\
        1|Лицо|ЛЦ|1|0||223|person\n\
        2|Адрес|АД|1|0||142|\n\
      В данном случае,  соответствующая таблица для базы \"Лицо\" будет иметь имя\n\
      \"person\", а для базы \"Адрес\" имя будет получено в автоматическом режиме.\n\
    Аналогично для полей.:\n\
        База  :Лицо\n\
        Состав полей базы\n\
        N поля| Название по        ...     зами|SQL имя|SQL тип\n\
        0|Системный номер|Ц|10|||ID|INTEGER\n\
        6|Пол|С||Пол||SEX|\n\
        1|Фамилия|Т|100000||||VARCHAR(80)\n\
        2|Имя|Т|100000||||VARCHAR(50)\n\
        3|Отчество|Т|100000||||VARCHAR(80)\n\
        4|Место жительства|П|||МН|АД2|LIVING|\n\
    Как видно из примера, для полей существует возможность жестко  задавать тип\n\
    данных.  При этом  контроль  соответствия файлов экспорта типам возлагается\n\
    на пользователя.\n\
    Для ссылочных полей задание типа данных невозможно и будет проигнорировано.\n\
    При задании  типа  данных  учитывайте длину. Если данные окажутся  длиннее,\n\
    чем длина  заданного  для  этого поля типа, они будут усечены.  Если данные\n\
    и  тип  несогласуются,  данные  игнорируются.  Кроме  того,  приложение  не\n\
    осуществляет проверку на правильность указания SQL типа.\n\
    Если  в  заголовок  были  добавлены  \"SQL имя|SQL тип\"  вы должны  добавить\n\
    дополнительные  разделители  \"|\"  всем  полям,   даже  если  \"SQL имя\"  или\n\
    \"SQL тип\" не указаны.\n\
\n\
Файл настройки базы данных\n\
  Стандарт SQL'99  различным образом  реализован в современных СУБД.  Например,\n\
  длинные символьные строки в  ORACLE  будут иметь тип CLOB, а  в MySQL - TEXT.\n\
  Для точной корректировки  работы транслятора  для  данной  СУБД  используются\n\
  файлы  настройки  базы  данных.  Файл настройки -  текстовый файл,  кодировки\n\
  windows-1251 следующей структуры (в скобках указаны значения поумолчанию):\n\
    1 строка - максимальное количество символов в названии таблицы (20)\n\
    2 строка - максимальное количество символов в названии поля (30)\n\
    3 строка - максимальное количество символов в поле типа VARCHAR (VARCHAR)\n\
    4 строка - символ, отвечающий за экранирование (чаще всего \"'\") (\"'\")\n\
    5 строка - символы, которые должны бать экранированы (\"'\")\n\
    6 cтрока - тип, отвечающий за хранение данных INTEGER (INTEGER)\n\
    7 cтрока - тип, отвечающий за хранение данных LONG (LONG)\n\
    8 cтрока - тип, отвечающий за хранение данных FLOAT (FLOAT)\n\
    9 cтрока - тип, отвечающий за хранение данных CLOB (TEXT)\n\
    10 cтрока - тип, отвечающий за хранение данных VARCHAR (VARCHAR)\n\
    11 cтрока - тип, отвечающий за хранение данных DATE (DATE)\n\
    12 cтрока - тип, отвечающий за хранение данных TIME (TIME)    \n\
  Например файл настройки для СУБД ORACLE может выглядить, так:\n\
    ***************************************************************************\n\
    20\n\
    30\n\
    4000\n\
    '\n\
    '\n\
    NUMBER(11)\n\
    NUMBER(38)\n\
    NUMBER\n\
    CLOB\n\
    VARCHAR2\n\
    DATE\n\
    VARCHAR2(5)\n\
    ***************************************************************************\n\
\n\
OPTIONS\n\
  -c, --config<=struct_file> - Указывает приложению путь к  файлу,  содержащему\n\
                               сведения  о  структуре  банка  данных. В случае,\n\
                               если  файл,  содержащий структуру  банка  данных\n\
                               описывает  несколько   банков  данных  (является\n\
                               экспортом    списка    банков    данных    ИСУБД\n\
                               CronosPlus), необходимо  через  точку с  запятой\n\
                               указыть    имя    банка,   который    собираемся\n\
                               транслировать.\n\
  -d, --delimiter<=sep>      - Установить разделитель строк  в  файлах экспорта\n\
                               данных ИСУБД CronosPlus. Поумолчанию \"|\".\n\
  -e, --export<data_export>  - Указывает путь к папке с файлами экспорта данных\n\
                               ИСУБД CronosPlus.\n\
  -o, --output<=path>        - Сохранить файлы с  SQL-выражениями  в  указанную\n\
                               папку.\n\
  -t, --tune<conf>           - Использовать  файл  настроки  базы  данных.  См.\n\
                               раздел \"Файл настройки базы данных\".\n\
  -m, --extended<count>      - Сообщает транслятору  о возможности использовать\n\
                               расширенные   вставки   (метод   сокращения  sql\n\
                               insert-выражений). \n\
                               Например:\n\
                                     INSERT INTO Tab(a, b) VALUES\\\n\
                                     (1, 2),\n\
                                     (2, 3),\n\
                                     (3, 4);\n\
                               <count> - сообщает какое количество строк  можно\n\
                               вставить  с  одним  заголовком (поумолчанию 50).\n\
                               Параметр    count    должен    быть    ненулевым\n\
                               положительным числом.\n\
  -s, --silent               - Не выдавать ничего в консоль.\n\
  -h, --help                 - Показать это сообщение.\n\
  \n\
EXAMPLES\n\
  cro2sql -с\"C:\\BankList.txt\";\"Тестовый банк\" -eC:\\EXPORT -s -oC:\\SQL\n\
    На  основе  файла   описания   структуры   \"Список  банков.txt\"  осуществит\n\
    трансляцию банка данных  \"Тестовый банк\" ИСУБД  CronosPlus,  экспорт данных\n\
    которого расположен по адресу C:\\EXPORT.  SQL файлы будут сохранены в папке\n\
    C:\\SQL, в stdout выдано ничего не будет.\n\
";

  return output.str();
}


string GetErrorMsg(string err_message)
{
  stringstream output;
  output << I_HEADER << endl << endl
    << E_PREFIX << err_message << endl << endl
    << I_FOOTER;
  return output.str();
}

string GetWarningMsg(string warn_message)
{ return ""; }

#endif // __MESSAGES__
