homme.io
Clean.Precise.Quick.
..
PAX ROMANA
SAKURA
Фотография
Философия
Искусство
История
C/C++
DBMS
Oracle
Спорт
Linux
Lua
IT

Infinitum.Aeterna
2024.Китай
Иран в лицах
2023.Иран
2023.06.Москва
2023.Стамбул
2023.ЗИМА
2022.11.Турция
2022.ОСЕНЬ
2022.08.Зубовка
2022.07.Турция
2022.Раменское
2022.ЛЕТО
2022.Архангельское
2022.Парк 50-летия Октября
2022.Санкт-Петербург
2022.Ярославль
2022.03.Зубовка
2022.Кокошкино
2022.Сочи
2022.ВЕСНА
2022.02.Царицыно
2022.Стамбул
2022.02.Коломенское
2022.ЗИМА
2021.Зубовка
2021.ОСЕНЬ
2021.Египет
2021.Раменское
2021.ЛЕТО
2021.Дивеево
2021.Азов
2021.02.Зоопарк
2021.Карелия
2020.Санкт-Петербург
2020.Турция
2020.Аносино
2020.Азов
2020.Верея
2020.Арктика
2020.Греция
2019.Турция
2019.Зубовка
2019.Дагестан
2019.Дагестан+
2019.Египет
2019.Италия
2019.Куликово поле
2019.Калуга
2019.02.Танцы
2019.Байкал
2018.Переславль
2018.Плес
2018.Березка
2018.Крым
2018.Азов
2018.Калининград
2018.Санкт-Петербург
2018.Эльбрус
2017.Турция
2015.Египет
2013.Египет
2013.Рим
Разное

regent (REGistry of ENTerprises)

Ниже приведен код на С++, который с помощью open-source библиотеки RapidXML парсит данные ЕГРЮЛ из xml-файлов в указанной папке и помещает эти данные в связанную структуру в БД Oracle, где центральной сущностью этой связки является юридическое лицо. 
#include "iostream"
#include "string"
#include "cstring"
#include "filesystem"
#include "fstream"
#include "vector"
#include "cpp/rapidxml-1.13/rapidxml.hpp"
#include "occi.h"
#include "exception"
#include "thread"
#include "sys/time.h"
#include "cmath"

using std::cout;
using std::string;
using std::endl;
using std::filesystem::directory_iterator;
using std::filesystem::path;
using std::ifstream;
using std::vector;
using std::istreambuf_iterator;
using rapidxml::xml_document;
using rapidxml::xml_node;
using rapidxml::xml_attribute;
using std::cerr;
using std::thread;
using std::move;
using oracle::occi::Environment;
using oracle::occi::Connection;
using oracle::occi::Statement;
using oracle::occi::SQLException;
using std::exception;
using oracle::occi::StatelessConnectionPool;
using oracle::occi::ConnectionPool;
using oracle::occi::Date;
using oracle::occi::Type;


#define TH_CNT 1000

Environment              *env;
StatelessConnectionPool  *scp;
string                   tag = "mc";

size_t number_of_files_in_directory(path path)
{
    return std::distance(directory_iterator(path), directory_iterator{});
}

bool is_digits(const std::string &str)
{
    return str.find_first_not_of("0123456789") == std::string::npos;
}


void labora_file(string file_name, int r_loading){

 Connection   *conn;
 Statement    *stmt;
 Statement    *stmt_1;
 Statement    *stmt_2;
 Statement    *stmt_3;
 Statement    *stmt_4;
 Statement    *stmt_5;
 int          r_loading_details;
 int          ent_i = 0;


 Date         sv_date;
 Date         reg_date;
 Date         pfr_date;
 Date         fss_date;
 Date         okved_date;
 Date         record_date;
 Date         doc_date;
 Date         edate(env,2222,12,31);
 string       fio = "";
 string       address = "";
 string       address_tail = "";


 try{
  conn = scp->getConnection(tag);
 }
 catch (exception &excp)
 {
  cerr << excp.what() << endl;
  exit(EXIT_FAILURE);
 }

 stmt = conn->createStatement("INSERT INTO st_egrul_loading_details(n, r_st_egrul_loading, file_name, start_date, " \
	   "finish_date, status) VALUES (sq$st_egrul_loading_details.nextval,:1,:2,sysdate,null,1) RETURNING n INTO :3");
 stmt->setInt(1,r_loading);
 stmt->setString(2,file_name);
 stmt->setInt(3,0);
 stmt->executeUpdate();
 r_loading_details = stmt->getInt(3);
 conn->terminateStatement(stmt);

 conn->commit();

 //ent
 stmt_1 = conn->createStatement("INSERT INTO st_egrul_enterprise(short_name, full_name, inn, kpp, ogrn, reg_org_code, reg_org_name, reg_org_date, " \
 "pfr_no, pfr_date, pfr_name, fss_no, fss_date, fss_name, uk_title, uk_sum, gm_fio, gm_inn, gm_title, email, r_st_egrul_loading_details, " \
 "address, rec_date, n) VALUES(:1, :2, :3, :4, :5, :6, :7, :8, :9, :10, :11, :12, :13, :14, :15, :16, :17, :18, :19, :20, :21, :22, :23, :24)");

 //okveds
 stmt_2 = conn->createStatement("INSERT INTO st_egrul_enterprise_okveds(r_st_egrul_enterprise, okved_code, is_main, r_st_egrul_loading_details, " \
                                "okved_title, rec_date) VALUES (:1, :2, :3, :4, :5, :6)");
 stmt_2->setMaxIterations(1000);
 stmt_2->setMaxParamSize(2,40);
 stmt_2->setMaxParamSize(5,4000);

 //founders
 stmt_3 = conn->createStatement("INSERT INTO st_egrul_enterprise_founders(r_st_egrul_enterprise, r_st_egrul_loading_details, " \
                                "uch_name, uch_inn, uch_rate, uch_rate_percent) VALUES (:1,:2,:3,:4,:5,:6)");
 stmt_3->setMaxIterations(1000);
 stmt_3->setMaxParamSize(3,1000);
 stmt_3->setMaxParamSize(4,10);
 stmt_3->setMaxParamSize(5,15);
 stmt_3->setMaxParamSize(6,3);

 //egrul records
 stmt_4 = conn->createStatement("INSERT INTO st_egrul_enterprise_records(r_st_egrul_enterprise, r_st_egrul_loading_details, " \
                                "rec_date, rec_grn, rec_content, rec_org, n) VALUES (:1,:2,:3,:4,:5,:6, :7)");
 stmt_4->setMaxIterations(1000);
 stmt_4->setMaxParamSize(4,20);
 stmt_4->setMaxParamSize(5,250);
 stmt_4->setMaxParamSize(6,250);

 //record docs
 stmt_5 = conn->createStatement("INSERT INTO st_egrul_enterprise_record_docs(r_st_egrul_enterprise_record, r_st_egrul_enterprise, " \
                                "r_st_egrul_loading_details, doc_name, doc_date) VALUES (:1,:2,:3,:4,:5)");
 stmt_5->setMaxIterations(1000);
 stmt_5->setMaxParamSize(4,250);



 xml_document<> doc;
 ifstream theFile(file_name);
 vector buffer((istreambuf_iterator(theFile)), istreambuf_iterator());
 buffer.push_back('\0');
 doc.parse<0>(&buffer[0]);


 xml_node<> *node;
 xml_node<> *node2;
 xml_node<> *node3;
 xml_attribute<> *atr;
 xml_node<> *egrul_node = doc.first_node("EGRUL");
 if (egrul_node){
  xml_node<> *ul_node = egrul_node->first_node("СвЮЛ");
  while (ul_node){

   //sv_date
   atr = ul_node->first_attribute("ДатаВып");
   if (atr){
    sv_date.fromText(atr->value(), "YYYY-MM-DD", "", env);
    stmt_1->setDate(23, sv_date);
   }else{
    break;
   }
   ent_i++;
   stmt_1->setInt(24, ent_i);

   //inn
   atr = ul_node->first_attribute("ИНН");
   if (atr){
    stmt_1->setString(3, atr->value());
   }else{
    stmt_1->setString(3, "");
   }

   //kpp
   atr = ul_node->first_attribute("КПП");
   if (atr){
    stmt_1->setString(4, atr->value());
   }else{
    stmt_1->setString(4, "");
   }

   //ogrn
   atr = ul_node->first_attribute("ОГРН");
   if (atr){
    stmt_1->setString(5, atr->value());
   }else{
    stmt_1->setString(5, "");
   }

   //name of Ur Litso
   node = ul_node->first_node("СвНаимЮЛ");
   if(node){
    //full_name
    atr = node->first_attribute("НаимЮЛПолн");
    if (atr){
      stmt_1->setString(2, atr->value());
    }else{
     stmt_1->setString(2, "");
    }

    //short_name
    node = node->first_node("СвНаимЮЛСокр");
    if(node){
     atr = node->first_attribute("НаимСокр");
     if (atr){
      stmt_1->setString(1, atr->value());
     }else{
      stmt_1->setString(1, "");
     }
    }else{
     stmt_1->setString(1, "");
    }
   }else{
     stmt_1->setString(1, "");
     stmt_1->setString(2, "");
   }//end of СвНаимЮЛ

   //Reg Organization
   node = ul_node->first_node("СвРегОрг");
   if(node){
    //Cod
    atr = node->first_attribute("КодНО");
    if (atr){
     stmt_1->setString(6, atr->value());
    }else{
     stmt_1->setString(6, "");
    }
    //Name
    atr = node->first_attribute("НаимНО");
    if (atr){
     stmt_1->setString(7, atr->value());
    }else{
     stmt_1->setString(7, "");
    }
    //Date
    node = node->first_node("ГРНДата");
    if(node){
     atr = node->first_attribute("ДатаЗаписи");
     if (atr){
      reg_date.fromText(atr->value(), "YYYY-MM-DD", "", env);
      stmt_1->setDate(8, reg_date);
     }else{
      stmt_1->setDate(8, edate);
      ////stmt_1->setString(8, "");
      ////stmt_1->setNull(8, (Type)SQLT_INT);
     }
    }else{
     stmt_1->setDate(8, edate);
     ////stmt_1->setString(8, "");
    }
     //// stmt_1->setString(8, "");
   }else{
    stmt_1->setString(6, "");
    stmt_1->setString(7, "");
    stmt_1->setDate(8, edate);
    ////stmt_1->setString(8, "");
   }//end of Reg_org

   //PFR
   node = ul_node->first_node("СвРегПФ");
   if(node){
    //No
    atr = node->first_attribute("РегНомПФ");
    if (atr){
     stmt_1->setString(9, atr->value());
    }else{
     stmt_1->setString(9, "");
    }
    //Date
    atr = node->first_attribute("ДатаРег");
    if (atr){
     pfr_date.fromText(atr->value(), "YYYY-MM-DD", "", env);
     stmt_1->setDate(10, pfr_date);
    }else{
     stmt_1->setDate(10, edate);
     ////stmt_1->setString(10, "");
    }
    //Name
    node = node->first_node("СвОргПФ");
    if(node){
     atr = node->first_attribute("НаимПФ");
     if (atr){
      stmt_1->setString(11, atr->value());
     }else{
      stmt_1->setString(11, "");
     }
    }else{
     stmt_1->setString(11, "");
    }
   }else{
    stmt_1->setString(9, "");
    stmt_1->setDate(10, edate);
    ////stmt_1->setString(10, "");
    stmt_1->setString(11, "");
   }//end of PFR


   //FSS
   node = ul_node->first_node("СвРегФСС");
   if(node){
    //No
    atr = node->first_attribute("РегНомФСС");
    if (atr){
     stmt_1->setString(12, atr->value());
    }else{
     stmt_1->setString(12, "");
    }
    //Date
    atr = node->first_attribute("ДатаРег");
    if (atr){
     fss_date.fromText(atr->value(), "YYYY-MM-DD", "", env);
     stmt_1->setDate(13, fss_date);
    }else{
     stmt_1->setDate(13, edate);
     ////stmt_1->setString(10, "");
    }
    //Name
    node = node->first_node("СвОргФСС");
    if(node){
     atr = node->first_attribute("НаимФСС");
     if (atr){
      stmt_1->setString(14, atr->value());
     }else{
      stmt_1->setString(14, "");
     }
    }else{
     stmt_1->setString(14, "");
    }
   }else{
    stmt_1->setString(12, "");
    stmt_1->setDate(13, edate);
    ////stmt_1->setString(10, "");
    stmt_1->setString(14, "");
   }//end of FSS


   //UK
   node = ul_node->first_node("СвУстКап");
   if(node){
    //Naim
    atr = node->first_attribute("НаимВидКап");
    if (atr){
     stmt_1->setString(15, atr->value());
    }else{
     stmt_1->setString(15, "");
    }
    //Summa
    atr = node->first_attribute("СумКап");
    if (atr){
     stmt_1->setString(16, atr->value());
    }else{
     stmt_1->setString(16, "");
    }
   }else{
     stmt_1->setString(15, "");
     stmt_1->setString(16, "");
   }//end of UK

   //GM
   node = ul_node->first_node("СведДолжнФЛ");
   if(node){
    //fio+inn
    node2 = node->first_node("СвФЛ");
    if (node2){
     fio = "";
     atr = node2->first_attribute("Фамилия");
     if (atr){
      fio = fio + atr->value() + " ";
     }
     atr = node2->first_attribute("Имя");
     if (atr){
      fio = fio + atr->value() + " ";
     }
     atr = node2->first_attribute("Отчество");
     if (atr){
      fio = fio + atr->value() + " ";
     }
     stmt_1->setString(17, fio);
     atr = node2->first_attribute("ИННФЛ");
     if (atr){
      stmt_1->setString(18, atr->value());
     }else{
      stmt_1->setString(18, "");
     }
    }else{
     stmt_1->setString(17, "");
     stmt_1->setString(18, "");
    }
    //title
    node3 = node->first_node("СвДолжн");
    if (node3){
     atr = node3->first_attribute("НаимДолжн");
     if (atr){
      stmt_1->setString(19, atr->value());
     }else{
      stmt_1->setString(19, "");
     }
    }else{
     stmt_1->setString(19, "");
    }
   }else{
    stmt_1->setString(17, "");
    stmt_1->setString(18, "");
    stmt_1->setString(19, "");
   }//end of GM

   //email
   node = ul_node->first_node("СвАдрЭлПочты");
   if(node){
    atr = node->first_attribute("E-mail");
    if (atr){
     stmt_1->setString(20, atr->value());
    }else{
     stmt_1->setString(20, "");
    }
   }else{
    stmt_1->setString(20, "");
   }//end of email

   //set r_loading_details
   stmt_1->setInt(21, r_loading_details);

   //address
   node = ul_node->first_node("СвАдресЮЛ");
   if(node){
    address = "";
    node2 = node->first_node("СвАдрЮЛФИАС");
    if (node2){
     atr = node2->first_attribute("Индекс");
     if (atr){
      address = address + atr->value() + ", ";
     }
     node3 = node2->first_node("НаимРегион");
     if (node3){
      address = address + node3->value() + ", ";
     }
     node3 = node2->first_node("НаселенПункт");
     if (node3){
      atr = node3->first_attribute("Вид");
      if (atr){
       address = address + atr->value() + " ";
      }
      atr = node3->first_attribute("Наим");
      if (atr){
       address = address + atr->value() + ", ";
      }
     }

     node3 = node2->first_node("ЭлУлДорСети");
     if (node3){
      atr = node3->first_attribute("Тип");
      if (atr){
       address = address + atr->value() + " ";
      }
      atr = node3->first_attribute("Наим");
      if (atr){
       address = address + atr->value() + ", ";
      }
     }

     node3 = node2->first_node("Здание");
     while (node3){
      atr = node3->first_attribute("Тип");
      if (atr){
       address = address + atr->value() + " ";
      }
      atr = node3->first_attribute("Номер");
      if (atr){
       address = address + atr->value() + ", ";
      }
      node3 = node3->next_sibling("Здание");
     }//end while

     node3 = node2->first_node("ПомещЗдания");
     if (node3){
      atr = node3->first_attribute("Тип");
      if (atr){
       address = address + atr->value() + " ";
      }
      atr = node3->first_attribute("Номер");
      if (atr){
       address = address + atr->value() + ", ";
      }
     }

     node3 = node2->first_node("ПомещКвартиры");
     if (node3){
      atr = node3->first_attribute("Тип");
      if (atr){
       address = address + atr->value() + " ";
      }
      atr = node3->first_attribute("Номер");
      if (atr){
       address = address + atr->value() + ", ";
      }
     }

     stmt_1->setString(22, address);

    }else{
     node2 = node->first_node("АдресРФ");
     if (node2){
      atr = node2->first_attribute("Индекс");
      if (atr){
       address = address + atr->value() + ", ";
      }
      address_tail = "";

      atr = node2->first_attribute("Дом");
      if (atr){
       string s1;
       s1 = atr->value();
       if (is_digits(s1)){
        s1 = "Д. " + s1;
       }
       address_tail = address_tail + s1 + ", ";
      }

      atr = node2->first_attribute("Корпус");
      if (atr){
       address_tail = address_tail + "КОРП. " +atr->value() + ", ";
      }

      atr = node2->first_attribute("Кварт");
      if (atr){
       string s1;
       s1 = atr->value();
       if (is_digits(s1)){
        s1 = "КВ. " + s1;
       }
       address_tail = address_tail + s1;
      }
      node3 = node2->first_node("Регион");
      if (node3){
       string name = "";
       atr = node3->first_attribute("НаимРегион");
       if (atr){
        name =  atr->value();
       }
       atr = node3->first_attribute("ТипРегион");
       if (atr){
        string s1;
        s1 = atr->value();
        if (s1.compare("ГОРОД")==0){
         name = "Г. " + name;
        }else{
         if (s1.compare("РЕСПУБЛИКА")==0){
          name = "РЕСПУБЛИКА " + name;
         }else{
          name = name + " " + s1;
         }
        }
       }
       address = address + name + ", ";
      }

      node3 = node2->first_node("Район");
      if (node3){
       atr = node3->first_attribute("ТипРайон");
       if (atr){
        address = address + atr->value() + " ";
       }
       atr = node3->first_attribute("НаимРайон");
       if (atr){
        address = address + atr->value() + ", ";
       }
      }

      node3 = node2->first_node("НаселПункт");
      if (node3){
       atr = node3->first_attribute("ТипНаселПункт");
       if (atr){
        address = address + atr->value() + " ";
       }
       atr = node3->first_attribute("НаимНаселПункт");
       if (atr){
        address = address + atr->value() + ", ";
       }
      }

      node3 = node2->first_node("Город");
      if (node3){
       atr = node3->first_attribute("ТипГород");
       if (atr){
        address = address + atr->value() + " ";
       }
       atr = node3->first_attribute("НаимГород");
       if (atr){
        address = address + atr->value() + ", ";
       }
      }

      node3 = node2->first_node("Улица");
      if (node3){
       atr = node3->first_attribute("ТипУлица");
       if (atr){
        address = address + atr->value() + " ";
       }
       atr = node3->first_attribute("НаимУлица");
       if (atr){
        address = address + atr->value() + ", ";
       }
      }


      address = address + address_tail;
      stmt_1->setString(22, address);
     }else{
      stmt_1->setString(22, "");
     }
    }
   }else{
    stmt_1->setString(22, "");
   }//end of address


   //insert record about Ur Litso
   stmt_1->executeUpdate();


   //OKVEDS
   stmt_2->setInt(1, ent_i);
   stmt_2->setInt(4, r_loading_details);
   node = ul_node->first_node("СвОКВЭД");
   if(node){
    node2 = node->first_node("СвОКВЭДОсн");
    if(node2){
     atr = node2->first_attribute("КодОКВЭД");
     if (atr){
      stmt_2->setString(2, atr->value());
     }else{
      stmt_2->setString(2, "0");
     }
     atr = node2->first_attribute("НаимОКВЭД");
     if (atr){
      stmt_2->setString(5, atr->value());
     }else{
      stmt_2->setString(5, "NO_NAME");
     }
     //
     node3 = node2->first_node("ГРНДата");
     if(node3){
      atr = node3->first_attribute("ДатаЗаписи");
      if(atr){
       okved_date.fromText(atr->value(), "YYYY-MM-DD", "", env);
       stmt_2->setDate(6, okved_date);
      }else{
       stmt_2->setDate(6, edate);
      }
     }else{
      stmt_2->setDate(6, edate);
     }
     //
    }else{
     stmt_2->setString(2, "0");
     stmt_2->setString(5, "NO_NAME");
     stmt_2->setDate(6, edate);
    }
    stmt_2->setInt(3, 1);

    //DOPs
    node2 = node->first_node("СвОКВЭДДоп");
    while(node2){
     stmt_2->addIteration();
     stmt_2->setInt(1, ent_i);
     stmt_2->setInt(4, r_loading_details);
     atr = node2->first_attribute("КодОКВЭД");
     if (atr){
      stmt_2->setString(2, atr->value());
     }else{
      stmt_2->setString(2, "0");
     }
     stmt_2->setInt(3, 0);
     atr = node2->first_attribute("НаимОКВЭД");
     if (atr){
      stmt_2->setString(5, atr->value());
     }else{
      stmt_2->setString(5, "NO_NAME");
     }
     //
     node3 = node2->first_node("ГРНДата");
     if(node3){
      atr = node3->first_attribute("ДатаЗаписи");
      if(atr){
       okved_date.fromText(atr->value(), "YYYY-MM-DD", "", env);
       stmt_2->setDate(6, okved_date);
      }else{
       stmt_2->setDate(6, edate);
      }
     }else{
      stmt_2->setDate(6, edate);
     }
     //

     //next
     node2 = node2->next_sibling("СвОКВЭДДоп");
    }//end while Dop Kods
   }else{
    stmt_2->setString(2, "0");
    stmt_2->setInt(3, 1);
    stmt_2->setString(5, "NO_NAME");
    stmt_2->setDate(6, edate);
   }
   stmt_2->executeUpdate();
   //end of OKVEDS



   //FOUNDERS
   node = ul_node->first_node("СвУчредит");
   if(node){
    //FL
    node2 = node->first_node("УчрФЛ");
    while(node2){
     stmt_3->setInt(1, ent_i);
     stmt_3->setInt(2, r_loading_details);
     node3 = node2->first_node("СвФЛ");
     if (node3){
      fio = "";
      atr = node3->first_attribute("Фамилия");
      if (atr){
       fio = fio + atr->value() + " ";
      }
      atr = node3->first_attribute("Имя");
      if (atr){
       fio = fio + atr->value() + " ";
      }
      atr = node3->first_attribute("Отчество");
      if (atr){
       fio = fio + atr->value() + " ";
      }
      stmt_3->setString(3, fio);

      atr = node3->first_attribute("ИННФЛ");
      if (atr){
       stmt_3->setString(4, atr->value());
      }else{
       stmt_3->setString(4, "");
      }
     }


     //capital
     node3 = node2->first_node("ДоляУстКап");
     if(node3){
      atr = node3->first_attribute("НоминСтоим");
      if (atr){
       stmt_3->setString(5, atr->value());
       stmt_3->setString(6, "");
      }else{
       stmt_3->setString(5, "");
       stmt_3->setString(6, "");
      }
     }else{
      stmt_3->setString(5, "");
      stmt_3->setString(6, "");
     }

     //next
     node2 = node2->next_sibling("УчрФЛ");
     if(node2){stmt_3->addIteration();}
    }//end while



    //UL-Ros
    node2 = node->first_node("УчрЮЛРос");
    while(node2){
     stmt_3->setInt(1, ent_i);
     stmt_3->setInt(2, r_loading_details);
     node3 = node2->first_node("НаимИННЮЛ");
     if (node3){
      atr = node3->first_attribute("НаимЮЛПолн");
      if (atr){
       stmt_3->setString(3, atr->value());
      }else{
       stmt_3->setString(3, "");
      }
      atr = node3->first_attribute("ИНН");
      if (atr){
       stmt_3->setString(4, atr->value());
      }else{
       stmt_3->setString(4, "");
      }
     }

     //capital
     node3 = node2->first_node("ДоляУстКап");
     if(node3){
      atr = node3->first_attribute("НоминСтоим");
      if (atr){
       stmt_3->setString(5, atr->value());
       stmt_3->setString(6, "");
      }else{
       stmt_3->setString(5, "");
       stmt_3->setString(6, "");
      }
     }else{
      stmt_3->setString(5, "");
      stmt_3->setString(6, "");
     }

     //next
     node2 = node2->next_sibling("УчрФЛ");
     if(node2){stmt_3->addIteration();}
    }//end while



    //UL-In
    node2 = node->first_node("УчрЮЛИн");
    while(node2){
     stmt_3->setInt(1, ent_i);
     stmt_3->setInt(2, r_loading_details);
     node3 = node2->first_node("НаимИННЮЛ");
     if (node3){
      atr = node3->first_attribute("НаимЮЛПолн");
      if (atr){
       stmt_3->setString(3, atr->value());
      }else{
       stmt_3->setString(3, "");
      }
      atr = node3->first_attribute("ИНН");
      if (atr){
       stmt_3->setString(4, atr->value());
      }else{
       stmt_3->setString(4, "");
      }
     }

     //capital
     node3 = node2->first_node("ДоляУстКап");
     if(node3){
      atr = node3->first_attribute("НоминСтоим");
      if (atr){
       stmt_3->setString(5, atr->value());
       stmt_3->setString(6, "");
      }else{
       stmt_3->setString(5, "");
       stmt_3->setString(6, "");
      }
     }else{
      stmt_3->setString(5, "");
      stmt_3->setString(6, "");
     }

     //next
     node2 = node2->next_sibling("УчрФЛ");
     if(node2){stmt_3->addIteration();}
    }//end while


    //UL-Sub'ekt of Ros Federation
    node2 = node->first_node("УчрРФСубМО");
    while(node2){
     stmt_3->setInt(1, ent_i);
     stmt_3->setInt(2, r_loading_details);
     node3 = node2->first_node("ВидНаимУчр");
     if (node3){
      atr = node3->first_attribute("КодУчрРФСубМО");
      if (atr){
       string s1 = atr->value();
       if (s1.compare("1")==0) {
        stmt_3->setString(3, "РОССИЙСКАЯ ФЕДЕРАЦИЯ");
       }else{
        stmt_3->setString(3, s1);
       }
      }else{
       stmt_3->setString(3, "");
      }
     }
     stmt_3->setString(4, "");

     //capital
     node3 = node2->first_node("ДоляУстКап");
     if(node3){
      atr = node3->first_attribute("НоминСтоим");
      if (atr){
       stmt_3->setString(5, atr->value());
       stmt_3->setString(6, "");
      }else{
       stmt_3->setString(5, "");
       stmt_3->setString(6, "");
      }
     }else{
      stmt_3->setString(5, "");
      stmt_3->setString(6, "");
     }

     //next
     node2 = node2->next_sibling("УчрРФСубМО");
     if (node2) {stmt_3->addIteration();}
    }//end while


    stmt_3->executeUpdate();
   }//end of FOUNDERS


   //EGRUL records
   int record_i = 0;
   node = ul_node->first_node("СвЗапЕГРЮЛ");
   while(node){
    record_i++;
    stmt_4->setInt(1, ent_i);
    stmt_4->setInt(2, r_loading_details);
    atr = node->first_attribute("ДатаЗап");
    if (atr){
     record_date.fromText(atr->value(), "YYYY-MM-DD", "", env);
     stmt_4->setDate(3, record_date);
    }else{
     stmt_4->setDate(3, edate);
    }

    atr = node->first_attribute("ГРН");
    if (atr){
     stmt_4->setString(4, atr->value());
    }else{
     stmt_4->setString(4, "");
    }

    node2 = node->first_node("ВидЗап");
    if(node2){
     atr = node2->first_attribute("НаимВидЗап");
     if (atr){
      stmt_4->setString(5, atr->value());
     }else{
      stmt_4->setString(5, "");
     }
    }else{
     stmt_4->setString(5, "");
    }

    node2 = node->first_node("СвРегОрг");
    if(node2){
     atr = node2->first_attribute("НаимНО");
     if (atr){
      stmt_4->setString(6, atr->value());
     }else{
      stmt_4->setString(6, "");
     }
    }else{
     stmt_4->setString(6, "");
    }

    stmt_4->setInt(7, record_i);


    //RECORD_DOCS

    node2 = node->first_node("СведПредДок");
    while(node2){
     stmt_5->setInt(1, record_i);
     stmt_5->setInt(2, ent_i);
     stmt_5->setInt(3, r_loading_details);

     node3 = node2->first_node("НаимДок");
     if(node3){
      stmt_5->setString(4, node3->value());
     }else{
      stmt_5->setString(4, "");
     }

     node3 = node2->first_node("ДатаДок");
     if(node3){
      doc_date.fromText(node3->value(), "YYYY-MM-DD", "", env);
      stmt_5->setDate(5, doc_date);
     }else{
      stmt_5->setDate(5, edate);
     }

     node2 = node2->next_sibling("СведПредДок");
     stmt_5->addIteration();
    }//end while
    //end od record_docs

    node = node->next_sibling("СвЗапЕГРЮЛ");
    if (node) {stmt_4->addIteration();}
   }//end while

   stmt_5->executeUpdate();
   stmt_4->executeUpdate();

   //next Ur Litso
   ul_node = ul_node->next_sibling("СвЮЛ");
  }//end while ULs
 }





 conn->terminateStatement(stmt_5);
 conn->terminateStatement(stmt_4);
 conn->terminateStatement(stmt_3);
 conn->terminateStatement(stmt_2);
 conn->terminateStatement(stmt_1);

 stmt = conn->createStatement("UPDATE st_egrul_loading_details SET finish_date = sysdate, status = 2, ent_cnt = :1 WHERE n = :2");
 stmt->setInt(1,ent_i);
 stmt->setInt(2,r_loading_details);
 stmt->executeUpdate();
 conn->terminateStatement(stmt);

 conn->commit();
 scp->releaseConnection(conn, tag);

 cout << file_name << endl;


 return;

}



int main(int argc, char* argv[]){

 struct timeval start, finish;
 gettimeofday(&start, NULL);

 if (argc < 2){
  cerr << "Path is empty" << endl;
  exit(EXIT_FAILURE);
 }
 string path = argv[1];

 ///cout << number_of_files_in_directory(path) << endl;

 try{
  env = Environment::createEnvironment(Environment::THREADED_MUTEXED);
  scp = env->createStatelessConnectionPool(
         "regent", "regent", "localhost:1521/orclcdb", 1000, 5, 10,
         StatelessConnectionPool::HOMOGENEOUS );

 }
 catch (exception &excp)
 {
  cerr << excp.what() << endl;
  return -1;
 }

 Connection   *conn;
 Statement    *stmt;
 int          loading;

 try{
  conn = scp->getConnection(tag);
 }
 catch (exception &excp)
 {
  cerr << excp.what() << endl;
  exit(EXIT_FAILURE);
 }

 stmt = conn->createStatement("INSERT INTO st_egrul_loading(n, start_date, finish_date, status) VALUES (sq$st_egrul_loading.nextval,sysdate,null,1) RETURNING n INTO :1");
 stmt->setInt(1,0);
 stmt->executeUpdate();
 loading = stmt->getInt(1);
 conn->terminateStatement(stmt);
 conn->commit();


 vector threads;
 int i=0;
 for (const auto & file : directory_iterator(path)){
  thread thr(labora_file, file.path(), loading);
  threads.emplace_back(move(thr));
  i++;
  if (i == TH_CNT){
   cout << "Limit of Threads = " << TH_CNT << " is reached\n";
   break;
  }
 }

 for(auto & thr : threads) {
  thr.join();
 }


 stmt = conn->createStatement("UPDATE st_egrul_loading SET finish_date = sysdate, status = 2 WHERE n = :1");
 stmt->setInt(1,loading);
 stmt->executeUpdate();
 conn->terminateStatement(stmt);
 conn->commit();

 try{
  scp->terminateConnection(conn);
  env->terminateStatelessConnectionPool(scp);
  Environment::terminateEnvironment(env);
 }
 catch (exception &excp)
 {
  cerr << excp.what() << endl;
  return -1;
 }

 gettimeofday(&finish, NULL);
 float delta = ((finish.tv_sec*1000000+finish.tv_usec)-(start.tv_sec*1000000 + start.tv_usec))/1000000.0;
 cout << "\n\033[1;31m" << ceil(delta * 100.0) / 100.0 << "s\033[0m\n" << endl;

 return 0;

}


sdmrnv, 2023-01-19 [0.419ms, s]