Skip to content

Commit

Permalink
Добавлена проверка выгрузки конфигураций ИБ
Browse files Browse the repository at this point in the history
Добавлена проверка, что выгрузка конфигураций по командам
-dc, ddc, -dvc, -dac производится из информационной базы, а не
хранилища.

fix e8tools#128
  • Loading branch information
ava57r committed Jan 26, 2018
1 parent c60bceb commit f041a4b
Show file tree
Hide file tree
Showing 12 changed files with 147 additions and 69 deletions.
19 changes: 17 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -23,59 +23,74 @@ sudo apt-get install ctool1cd
## Использование

`-l, -logfile <файл>`

записывать все сообщения программы в текстовый лог-файл. Если файл существует, он перезаписывается. Кодировка файла UTF8

`-ne, -NotExclusively`

открыть базу не монопольно (Это небезопасно, возможны ошибки!).

`-eax, -ExportAllToXML <путь>`

экспортировать по указанному пути все таблицы в XML.

`-ex, -ExportToXML <путь> <список>`

экспортировать по указанному пути указанные таблицы в XML.
В списке через запятую, точку с запятой или пробел указывается список имен экспортируемых таблиц. Можно использовать знаки подстановки * и ?
Если в списке содержатся пробелы, список необходимо заключать в кавычки.

`-bf, -BlobToFile [yes/no]`

при экспорте в XML выгружать BLOB в отдельные файлы.
По умолчанию BLOB в отдельные файлы не выгружается.

`-pb, -ParseBlob [yes/no]`

при экспорте в XML и выгрузке BLOB в отдельные файлы по-возможности распаковывать данные BLOB.
По умолчанию BLOB при выгрузке в отдельные файлы распаковываются.

`-dc, -DumpConfig <путь>`
Выгрузить основную конфигурацию по указанному пути.

Выгрузить основную конфигурацию информационной базы по указанному пути.

`-ddc, -DumpDBConfig <путь>`
Выгрузить конфигурацию базы данных по указанному пути.

Выгрузить конфигурацию базы данных информационной базы по указанному пути.

`-dvc, -DumpVendorsConfigs <путь>`

Выгрузить конфигурации поставщиков информационной базы по указанному пути.

`-dac, -DumpAllConfigs <путь>`

Выгрузить все конфигурации информационной базы по указанному пути.

`-drc, -DumpDepotConfig <номер версии> <путь>`

Выгрузить конфигурацию хранилища заданной версии по указанному пути.
Номер версии - это целое число. 1, 2, 3 и т.д. - выгрузить конфигурацию указанной версии, 0 - выгрузить последнюю версию, -1 - предпоследнюю и т.д.

`-dpc, -DumpPartDepotConfig <номер версии>[:<номер версии>] <путь>`

Выгрузить частично файлы конфигурации хранилища заданной версии (или заданного диапазона версий) по указанному пути.
Номер версии - это целое число. 1, 2, 3 и т.д. - выгрузить файлы указанной версии, 0 - выгрузить файлы последней версии, -1 - предпоследней и т.д.

`-eb, -ExportToBinary <путь> <список>`

Экспортировать по указанному пути указанные таблицы.
В списке через запятую, точку с запятой или пробел указывается список имён экспортируемых таблиц. Можно использовать знаки подстановки * и ?
Если в списке содержатся пробелы, список необходимо заключать в кавычки.

`-ib, -ImportFromBinary <путь> <список>`

Импортировать по указанному пути указанные таблицы.
В списке через запятую, точку с запятой или пробел указывается список имён импортируемых таблиц. Можно использовать знаки подстановки * и ?
Если в списке содержатся пробелы, список необходимо заключать в кавычки.
Таблицы должны существовать в базе, новые таблицы не создаются.

`-slo, -SaveLostObjects <путь>`

Найти потерянные объекты и сохранить.

Если в пути содержатся пробелы, его необходимо заключать в кавычки. Пути следует указывать без завершающего слеша `/` и бэкслеша `\`
Expand Down
109 changes: 75 additions & 34 deletions src/ctool1cd/App.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,16 @@ extern Registrator msreg_g;
using namespace std;
using namespace System;

// Константы

const string GENERAL_CONFIG_DEFAULT_NAME() {
return std::string("cf") + CF_STR;
}

const string DATABASE_CONFIG_DEFAULT_NAME() {
return std::string("dbcf") + CF_STR;
}

App::App(char **szArglist, int nArgs, Messenger &mess)
: comm(szArglist, nArgs), mess(mess)
{}
Expand Down Expand Up @@ -250,48 +260,78 @@ void App::import_from_binary(const ParsedCommand &pc)

} // import_from_binary

// save_config
void App::save_config(const ParsedCommand &pc)
void App::save_config(const boost::filesystem::path& param_path)
{
boost::filesystem::path cfpath(static_cast<string>(pc.param1));
if (!boost::iequals(cfpath.extension().string(), str_cf)) {
if(!is_infobase()) {
return;
}

boost::filesystem::path cfpath = param_path;

if (!boost::iequals(cfpath.extension().string(), CF_STR)) {
if (!directory_exists(cfpath)) {
return;
}
cfpath /= "dbcf.cf"; // FIXME: заменить "dbcf.cf" константой
cfpath /= DATABASE_CONFIG_DEFAULT_NAME();
}
if (base1CD->save_config(cfpath.string())) {

if (base1CD->save_config(cfpath)) {
msreg_g.AddMessage_("Сохранение конфигурации базы данных завершено.", MessageState::Succesfull, "Файл",
cfpath.string());
cfpath.string());
} else {
msreg_g.AddMessage_("Не удалось сохранить конфигурацию базы данных.", MessageState::Error, "Файл",
cfpath.string());
cfpath.string());
}

} // save_config
}

// save_configsave
void App::save_configsave(const ParsedCommand &pc)
// save_config
void App::save_config(const ParsedCommand &pc)
{
boost::filesystem::path cfpath(static_cast<string>(pc.param1));
if (!boost::iequals(cfpath.extension().string(), str_cf)) {

save_config(cfpath);

} // save_config

void App::save_configsave(const boost::filesystem::path& param_path)
{
if(!is_infobase()) {
return;
}

boost::filesystem::path cfpath = param_path;
if (!boost::iequals(cfpath.extension().string(), CF_STR)) {
if (!directory_exists(cfpath)) {
return;
}
cfpath /= "cf.cf"; // FIXME: заменить "cf.cf" константой
cfpath /= GENERAL_CONFIG_DEFAULT_NAME();
}
if (base1CD->save_configsave(cfpath.string()))
if (base1CD->save_configsave(param_path))
msreg_g.AddMessage_("Сохранение основной конфигурации завершено.", MessageState::Succesfull, "Файл",
cfpath.string());
cfpath.string());
else
msreg_g.AddMessage_("Не удалось сохранить основную конфигурацию.", MessageState::Error, "Файл",
cfpath.string());
cfpath.string());

}

// save_configsave
void App::save_configsave(const ParsedCommand &pc)
{
boost::filesystem::path cfpath(static_cast<string>(pc.param1));
save_configsave(cfpath);

} // save_configsave

void App::save_vendors_configs(const boost::filesystem::path& param_path) {

if(!is_infobase()) {
return;
}

for (auto& supplier_config : base1CD->supplier_configs()) {
String file_name = supplier_config->name() + " " + supplier_config->version() + str_cf;
String file_name = supplier_config->name() + " " + supplier_config->version() + CF_STR;
boost::filesystem::path cfpath = param_path / static_cast<string>(file_name);
if ( supplier_config->save_to_file(cfpath) ) {
msreg_g.AddMessage_("Сохранение конфигурации поставщика завершено.", MessageState::Succesfull, "Файл",
Expand Down Expand Up @@ -323,23 +363,15 @@ void App::save_all_configs(const ParsedCommand &pc)
return;
}

boost::filesystem::path dbpath = param_path / "dbcf.cf"; // FIXME: заменить "dbcf.cf" константой
if (base1CD->save_config(dbpath.string())) {
msreg_g.AddMessage_("Сохранение конфигурации базы данных завершено.", MessageState::Succesfull, "Файл",
dbpath.string());
} else {
msreg_g.AddMessage_("Не удалось сохранить конфигурацию базы данных.", MessageState::Error, "Файл",
dbpath.string());
if(!is_infobase()) {
return;
}

boost::filesystem::path cfpath = param_path / "cf.cf"; // FIXME: заменить "cf.cf" константой
if (base1CD->save_configsave(cfpath.string())) {
msreg_g.AddMessage_("Сохранение основной конфигурации завершено.", MessageState::Succesfull, "Файл",
cfpath.string());
} else {
msreg_g.AddMessage_("Не удалось сохранить основную конфигурацию.", MessageState::Error, "Файл",
cfpath.string());
}
boost::filesystem::path dbpath = param_path / DATABASE_CONFIG_DEFAULT_NAME();
save_config(dbpath);

boost::filesystem::path cfpath = param_path / GENERAL_CONFIG_DEFAULT_NAME();
save_configsave(cfpath);

save_vendors_configs(param_path);
} // save_all_configs
Expand Down Expand Up @@ -370,11 +402,11 @@ void App::save_depot_config(const ParsedCommand &pc)

cfpath = boost::filesystem::absolute(cfpath);

if (!boost::iequals(cfpath.extension().string(), str_cf)) {
if (!boost::iequals(cfpath.extension().string(), CF_STR)) {
if (!directory_exists(cfpath)) {
return;
}
cfpath /= static_cast<string>(String(string("v") + version_number + string(str_cf)));
cfpath /= static_cast<string>(String(string("v") + version_number + string(CF_STR)));
}
if (base1CD->save_depot_config(cfpath.string(), version_number))
msreg_g.AddMessage_("Сохранение конфигурации хранилища завершено.", MessageState::Succesfull, "Файл",
Expand Down Expand Up @@ -580,3 +612,12 @@ int App::Run()

return 0;
}

inline bool App::is_infobase() const {
if(!base1CD->is_infobase()) {
msreg_g.AddError("Попытка выгрузки конфигурации из файла не являющегося информационной базой!");
return false;
}

return true;
}
6 changes: 6 additions & 0 deletions src/ctool1cd/App.h
Original file line number Diff line number Diff line change
Expand Up @@ -35,8 +35,12 @@ class App {
void export_to_binary(const ParsedCommand& pc);
void import_from_binary(const ParsedCommand& pc);

void save_config(const boost::filesystem::path& param_path);
void save_config(const ParsedCommand& pc);

void save_configsave(const boost::filesystem::path& param_path);
void save_configsave(const ParsedCommand& pc);

void save_vendors_configs(const boost::filesystem::path& param_path);
void save_vendors_configs(const ParsedCommand& pc);
void save_all_configs(const ParsedCommand& pc);
Expand All @@ -46,6 +50,8 @@ class App {

void find_and_save_lost_objects(const ParsedCommand& pc);

inline bool is_infobase() const;

};

#endif
4 changes: 2 additions & 2 deletions src/tests/tool1cd/test_depotv5.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -33,8 +33,8 @@ TEST_CASE("Работа с хранилищем версии 5", "[tool1cd][Clas
}
}

WHEN ("обращаемся к полю is_infobase") {
bool result = base1CD.is_infobase;
WHEN ("вызываем is_infobase") {
bool result = base1CD.is_infobase();
THEN ("получаем 'false'") {
REQUIRE( result == false );
}
Expand Down
4 changes: 2 additions & 2 deletions src/tests/tool1cd/test_depotv6.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -33,8 +33,8 @@ TEST_CASE("Работа с хранилищем версии 6", "[tool1cd][Clas
}
}

WHEN ("обращаемся к полю is_infobase") {
bool result = base1CD.is_infobase;
WHEN ("вызываем is_infobase") {
bool result = base1CD.is_infobase();
THEN ("получаем 'false'") {
REQUIRE( result == false );
}
Expand Down
4 changes: 2 additions & 2 deletions src/tests/tool1cd/test_depotv7.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -33,8 +33,8 @@ TEST_CASE("Работа с хранилищем версии 7", "[tool1cd][Clas
}
}

WHEN ("обращаемся к полю is_infobase") {
bool result = base1CD.is_infobase;
WHEN ("вызываем is_infobase") {
bool result = base1CD.is_infobase();
THEN ("получаем 'false'") {
REQUIRE( result == false );
}
Expand Down
32 changes: 22 additions & 10 deletions src/tool1cd/Class_1CD.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -153,7 +153,7 @@ void T_1CD::init()
supplier_configs_defined = false;
locale = nullptr;

is_infobase = false;
_is_infobase = false;
is_depot = false;

pagemap = nullptr;
Expand Down Expand Up @@ -450,7 +450,7 @@ T_1CD::T_1CD(String _filename, MessageRegistrator* mess, bool _monopoly)
}
else
{
is_infobase = true;
_is_infobase = true;
if(!table_config) msreg_m.AddError("Отсутствует таблица CONFIG");
if(!table_configsave) msreg_m.AddError("Отсутствует таблица CONFIGSAVE");
if(!table_params) msreg_m.AddError("Отсутствует таблица PARAMS");
Expand All @@ -476,19 +476,31 @@ db_ver T_1CD::getversion()
}

//---------------------------------------------------------------------------
bool T_1CD::save_config(String _filename) // TODO: переписать сохранение конфигурации базы данных на boost::filesystem
bool T_1CD::save_config(const boost::filesystem::path& file_name)
{
if(!cs_config) cs_config = new ConfigStorageTableConfig(get_files_config());
if(!cs_config->getready()) return false;
return cs_config->save_config(_filename);
if(!cs_config) {
cs_config = new ConfigStorageTableConfig(get_files_config());
}

if(!cs_config->getready()) {
return false;
}

return cs_config->save_config(file_name);
}

//---------------------------------------------------------------------------
bool T_1CD::save_configsave(String _filename) // TODO: переписать сохранение основной конфигурации на boost::filesystem
bool T_1CD::save_configsave(const boost::filesystem::path& file_name)
{
if(!cs_configsave) cs_configsave = new ConfigStorageTableConfigSave(get_files_config(), get_files_configsave());
if(!cs_configsave->getready()) return false;
return cs_configsave->save_config(_filename);
if(!cs_configsave) {
cs_configsave = new ConfigStorageTableConfigSave(get_files_config(), get_files_configsave());
}

if(!cs_configsave->getready()) {
return false;
}

return cs_configsave->save_config(file_name);
}

//---------------------------------------------------------------------------
Expand Down
8 changes: 5 additions & 3 deletions src/tool1cd/Class_1CD.h
Original file line number Diff line number Diff line change
Expand Up @@ -159,7 +159,7 @@ friend Field;

static bool recoveryMode;
char* locale; // код языка базы
bool is_infobase; // признак информационной базы
inline bool is_infobase() const { return _is_infobase; }
bool is_depot; // признак хранилища конфигурации

// Таблицы информационной базы
Expand Down Expand Up @@ -198,8 +198,8 @@ friend Field;
Table* gettable(int32_t numtable);
db_ver getversion();

bool save_config(String filename);
bool save_configsave(String filename);
bool save_config(const boost::filesystem::path &file_name);
bool save_configsave(const boost::filesystem::path &file_name);
bool save_depot_config(const String& _filename, int32_t ver = 0);
bool save_part_depot_config(const String& _filename, int32_t ver_begin, int32_t ver_end);
int32_t get_ver_depot_config(int32_t ver); // Получение номера версии конфигурации (0 - последняя, -1 - предпоследняя и т.д.)
Expand Down Expand Up @@ -244,6 +244,8 @@ friend Field;
bool supplier_configs_defined {false}; // признак, что был произведен поиск конфигураций поставщика
void find_supplier_configs();

bool _is_infobase; // признак информационной базы

TableFiles* _files_config;
TableFiles* _files_configsave;
TableFiles* _files_params;
Expand Down
Loading

0 comments on commit f041a4b

Please sign in to comment.