├── .gitattributes ├── .gitignore ├── GarLoader.Core.Gui ├── Form1.Designer.cs ├── Form1.cs ├── Form1.resx ├── GarLoader.Core.Gui.csproj ├── Program.cs ├── icons8-address-96.ico ├── Индексы.sql ├── Патч после загрузки.sql └── Первичные ключи.sql ├── GarLoader.Core.Lib ├── Commons.cs ├── GarLoader.Core.Lib.csproj ├── GarLoader.Core.Lib.sln ├── GetTablesNames.cs ├── ProccessXSD.cs ├── TableDefinition.cs ├── WriteData.cs └── XSD2PGTypes.cs └── README.md /.gitattributes: -------------------------------------------------------------------------------- 1 | ############################################################################### 2 | # Set default behavior to automatically normalize line endings. 3 | ############################################################################### 4 | * text=auto 5 | 6 | ############################################################################### 7 | # Set default behavior for command prompt diff. 8 | # 9 | # This is need for earlier builds of msysgit that does not have it on by 10 | # default for csharp files. 11 | # Note: This is only used by command line 12 | ############################################################################### 13 | #*.cs diff=csharp 14 | 15 | ############################################################################### 16 | # Set the merge driver for project and solution files 17 | # 18 | # Merging from the command prompt will add diff markers to the files if there 19 | # are conflicts (Merging from VS is not affected by the settings below, in VS 20 | # the diff markers are never inserted). Diff markers may cause the following 21 | # file extensions to fail to load in VS. An alternative would be to treat 22 | # these files as binary and thus will always conflict and require user 23 | # intervention with every merge. To do so, just uncomment the entries below 24 | ############################################################################### 25 | #*.sln merge=binary 26 | #*.csproj merge=binary 27 | #*.vbproj merge=binary 28 | #*.vcxproj merge=binary 29 | #*.vcproj merge=binary 30 | #*.dbproj merge=binary 31 | #*.fsproj merge=binary 32 | #*.lsproj merge=binary 33 | #*.wixproj merge=binary 34 | #*.modelproj merge=binary 35 | #*.sqlproj merge=binary 36 | #*.wwaproj merge=binary 37 | 38 | ############################################################################### 39 | # behavior for image files 40 | # 41 | # image files are treated as binary by default. 42 | ############################################################################### 43 | #*.jpg binary 44 | #*.png binary 45 | #*.gif binary 46 | 47 | ############################################################################### 48 | # diff behavior for common document formats 49 | # 50 | # Convert binary document formats to text before diffing them. This feature 51 | # is only available from the command line. Turn it on by uncommenting the 52 | # entries below. 53 | ############################################################################### 54 | #*.doc diff=astextplain 55 | #*.DOC diff=astextplain 56 | #*.docx diff=astextplain 57 | #*.DOCX diff=astextplain 58 | #*.dot diff=astextplain 59 | #*.DOT diff=astextplain 60 | #*.pdf diff=astextplain 61 | #*.PDF diff=astextplain 62 | #*.rtf diff=astextplain 63 | #*.RTF diff=astextplain 64 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | ## Ignore Visual Studio temporary files, build results, and 2 | ## files generated by popular Visual Studio add-ons. 3 | ## 4 | ## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore 5 | 6 | # User-specific files 7 | *.rsuser 8 | *.suo 9 | *.user 10 | *.userosscache 11 | *.sln.docstates 12 | 13 | # User-specific files (MonoDevelop/Xamarin Studio) 14 | *.userprefs 15 | 16 | # Build results 17 | [Dd]ebug/ 18 | [Dd]ebugPublic/ 19 | [Rr]elease/ 20 | [Rr]eleases/ 21 | x64/ 22 | x86/ 23 | [Aa][Rr][Mm]/ 24 | [Aa][Rr][Mm]64/ 25 | bld/ 26 | [Bb]in/ 27 | [Oo]bj/ 28 | [Ll]og/ 29 | 30 | # Visual Studio 2015/2017 cache/options directory 31 | .vs/ 32 | # Uncomment if you have tasks that create the project's static files in wwwroot 33 | #wwwroot/ 34 | 35 | # Visual Studio 2017 auto generated files 36 | Generated\ Files/ 37 | 38 | # MSTest test Results 39 | [Tt]est[Rr]esult*/ 40 | [Bb]uild[Ll]og.* 41 | 42 | # NUNIT 43 | *.VisualState.xml 44 | TestResult.xml 45 | 46 | # Build Results of an ATL Project 47 | [Dd]ebugPS/ 48 | [Rr]eleasePS/ 49 | dlldata.c 50 | 51 | # Benchmark Results 52 | BenchmarkDotNet.Artifacts/ 53 | 54 | # .NET Core 55 | project.lock.json 56 | project.fragment.lock.json 57 | artifacts/ 58 | 59 | # StyleCop 60 | StyleCopReport.xml 61 | 62 | # Files built by Visual Studio 63 | *_i.c 64 | *_p.c 65 | *_h.h 66 | *.ilk 67 | *.meta 68 | *.obj 69 | *.iobj 70 | *.pch 71 | *.pdb 72 | *.ipdb 73 | *.pgc 74 | *.pgd 75 | *.rsp 76 | *.sbr 77 | *.tlb 78 | *.tli 79 | *.tlh 80 | *.tmp 81 | *.tmp_proj 82 | *_wpftmp.csproj 83 | *.log 84 | *.vspscc 85 | *.vssscc 86 | .builds 87 | *.pidb 88 | *.svclog 89 | *.scc 90 | 91 | # Chutzpah Test files 92 | _Chutzpah* 93 | 94 | # Visual C++ cache files 95 | ipch/ 96 | *.aps 97 | *.ncb 98 | *.opendb 99 | *.opensdf 100 | *.sdf 101 | *.cachefile 102 | *.VC.db 103 | *.VC.VC.opendb 104 | 105 | # Visual Studio profiler 106 | *.psess 107 | *.vsp 108 | *.vspx 109 | *.sap 110 | 111 | # Visual Studio Trace Files 112 | *.e2e 113 | 114 | # TFS 2012 Local Workspace 115 | $tf/ 116 | 117 | # Guidance Automation Toolkit 118 | *.gpState 119 | 120 | # ReSharper is a .NET coding add-in 121 | _ReSharper*/ 122 | *.[Rr]e[Ss]harper 123 | *.DotSettings.user 124 | 125 | # JustCode is a .NET coding add-in 126 | .JustCode 127 | 128 | # TeamCity is a build add-in 129 | _TeamCity* 130 | 131 | # DotCover is a Code Coverage Tool 132 | *.dotCover 133 | 134 | # AxoCover is a Code Coverage Tool 135 | .axoCover/* 136 | !.axoCover/settings.json 137 | 138 | # Visual Studio code coverage results 139 | *.coverage 140 | *.coveragexml 141 | 142 | # NCrunch 143 | _NCrunch_* 144 | .*crunch*.local.xml 145 | nCrunchTemp_* 146 | 147 | # MightyMoose 148 | *.mm.* 149 | AutoTest.Net/ 150 | 151 | # Web workbench (sass) 152 | .sass-cache/ 153 | 154 | # Installshield output folder 155 | [Ee]xpress/ 156 | 157 | # DocProject is a documentation generator add-in 158 | DocProject/buildhelp/ 159 | DocProject/Help/*.HxT 160 | DocProject/Help/*.HxC 161 | DocProject/Help/*.hhc 162 | DocProject/Help/*.hhk 163 | DocProject/Help/*.hhp 164 | DocProject/Help/Html2 165 | DocProject/Help/html 166 | 167 | # Click-Once directory 168 | publish/ 169 | 170 | # Publish Web Output 171 | *.[Pp]ublish.xml 172 | *.azurePubxml 173 | # Note: Comment the next line if you want to checkin your web deploy settings, 174 | # but database connection strings (with potential passwords) will be unencrypted 175 | *.pubxml 176 | *.publishproj 177 | 178 | # Microsoft Azure Web App publish settings. Comment the next line if you want to 179 | # checkin your Azure Web App publish settings, but sensitive information contained 180 | # in these scripts will be unencrypted 181 | PublishScripts/ 182 | 183 | # NuGet Packages 184 | *.nupkg 185 | # The packages folder can be ignored because of Package Restore 186 | **/[Pp]ackages/* 187 | # except build/, which is used as an MSBuild target. 188 | !**/[Pp]ackages/build/ 189 | # Uncomment if necessary however generally it will be regenerated when needed 190 | #!**/[Pp]ackages/repositories.config 191 | # NuGet v3's project.json files produces more ignorable files 192 | *.nuget.props 193 | *.nuget.targets 194 | 195 | # Microsoft Azure Build Output 196 | csx/ 197 | *.build.csdef 198 | 199 | # Microsoft Azure Emulator 200 | ecf/ 201 | rcf/ 202 | 203 | # Windows Store app package directories and files 204 | AppPackages/ 205 | BundleArtifacts/ 206 | Package.StoreAssociation.xml 207 | _pkginfo.txt 208 | *.appx 209 | 210 | # Visual Studio cache files 211 | # files ending in .cache can be ignored 212 | *.[Cc]ache 213 | # but keep track of directories ending in .cache 214 | !?*.[Cc]ache/ 215 | 216 | # Others 217 | ClientBin/ 218 | ~$* 219 | *~ 220 | *.dbmdl 221 | *.dbproj.schemaview 222 | *.jfm 223 | *.pfx 224 | *.publishsettings 225 | orleans.codegen.cs 226 | 227 | # Including strong name files can present a security risk 228 | # (https://github.com/github/gitignore/pull/2483#issue-259490424) 229 | #*.snk 230 | 231 | # Since there are multiple workflows, uncomment next line to ignore bower_components 232 | # (https://github.com/github/gitignore/pull/1529#issuecomment-104372622) 233 | #bower_components/ 234 | 235 | # RIA/Silverlight projects 236 | Generated_Code/ 237 | 238 | # Backup & report files from converting an old project file 239 | # to a newer Visual Studio version. Backup files are not needed, 240 | # because we have git ;-) 241 | _UpgradeReport_Files/ 242 | Backup*/ 243 | UpgradeLog*.XML 244 | UpgradeLog*.htm 245 | ServiceFabricBackup/ 246 | *.rptproj.bak 247 | 248 | # SQL Server files 249 | *.mdf 250 | *.ldf 251 | *.ndf 252 | 253 | # Business Intelligence projects 254 | *.rdl.data 255 | *.bim.layout 256 | *.bim_*.settings 257 | *.rptproj.rsuser 258 | *- Backup*.rdl 259 | 260 | # Microsoft Fakes 261 | FakesAssemblies/ 262 | 263 | # GhostDoc plugin setting file 264 | *.GhostDoc.xml 265 | 266 | # Node.js Tools for Visual Studio 267 | .ntvs_analysis.dat 268 | node_modules/ 269 | 270 | # Visual Studio 6 build log 271 | *.plg 272 | 273 | # Visual Studio 6 workspace options file 274 | *.opt 275 | 276 | # Visual Studio 6 auto-generated workspace file (contains which files were open etc.) 277 | *.vbw 278 | 279 | # Visual Studio LightSwitch build output 280 | **/*.HTMLClient/GeneratedArtifacts 281 | **/*.DesktopClient/GeneratedArtifacts 282 | **/*.DesktopClient/ModelManifest.xml 283 | **/*.Server/GeneratedArtifacts 284 | **/*.Server/ModelManifest.xml 285 | _Pvt_Extensions 286 | 287 | # Paket dependency manager 288 | .paket/paket.exe 289 | paket-files/ 290 | 291 | # FAKE - F# Make 292 | .fake/ 293 | 294 | # JetBrains Rider 295 | .idea/ 296 | *.sln.iml 297 | 298 | # CodeRush personal settings 299 | .cr/personal 300 | 301 | # Python Tools for Visual Studio (PTVS) 302 | __pycache__/ 303 | *.pyc 304 | 305 | # Cake - Uncomment if you are using it 306 | # tools/** 307 | # !tools/packages.config 308 | 309 | # Tabs Studio 310 | *.tss 311 | 312 | # Telerik's JustMock configuration file 313 | *.jmconfig 314 | 315 | # BizTalk build output 316 | *.btp.cs 317 | *.btm.cs 318 | *.odx.cs 319 | *.xsd.cs 320 | 321 | # OpenCover UI analysis results 322 | OpenCover/ 323 | 324 | # Azure Stream Analytics local run output 325 | ASALocalRun/ 326 | 327 | # MSBuild Binary and Structured Log 328 | *.binlog 329 | 330 | # NVidia Nsight GPU debugger configuration file 331 | *.nvuser 332 | 333 | # MFractors (Xamarin productivity tool) working folder 334 | .mfractor/ 335 | 336 | # Local History for Visual Studio 337 | .localhistory/ 338 | 339 | # BeatPulse healthcheck temp database 340 | healthchecksdb -------------------------------------------------------------------------------- /GarLoader.Core.Gui/Form1.Designer.cs: -------------------------------------------------------------------------------- 1 |  2 | namespace GarLoader.Core.Gui 3 | { 4 | partial class Form1 5 | { 6 | /// 7 | /// Required designer variable. 8 | /// 9 | private System.ComponentModel.IContainer components = null; 10 | 11 | /// 12 | /// Clean up any resources being used. 13 | /// 14 | /// true if managed resources should be disposed; otherwise, false. 15 | protected override void Dispose(bool disposing) 16 | { 17 | if (disposing && (components != null)) 18 | { 19 | components.Dispose(); 20 | } 21 | base.Dispose(disposing); 22 | } 23 | 24 | #region Windows Form Designer generated code 25 | 26 | /// 27 | /// Required method for Designer support - do not modify 28 | /// the contents of this method with the code editor. 29 | /// 30 | private void InitializeComponent() 31 | { 32 | System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(Form1)); 33 | this.progressBar1 = new System.Windows.Forms.ProgressBar(); 34 | this.FolderSelectButton = new System.Windows.Forms.Button(); 35 | this.textBox1 = new System.Windows.Forms.TextBox(); 36 | this.CreatTablesButt = new System.Windows.Forms.Button(); 37 | this.label1 = new System.Windows.Forms.Label(); 38 | this.targetSchemaBox = new System.Windows.Forms.TextBox(); 39 | this.SelectXsdButton = new System.Windows.Forms.Button(); 40 | this.SearchSubFoldersBox = new System.Windows.Forms.CheckBox(); 41 | this.SuspendLayout(); 42 | // 43 | // progressBar1 44 | // 45 | this.progressBar1.ForeColor = System.Drawing.Color.Maroon; 46 | this.progressBar1.Location = new System.Drawing.Point(12, 97); 47 | this.progressBar1.Name = "progressBar1"; 48 | this.progressBar1.Size = new System.Drawing.Size(668, 30); 49 | this.progressBar1.Step = 1; 50 | this.progressBar1.Style = System.Windows.Forms.ProgressBarStyle.Continuous; 51 | this.progressBar1.TabIndex = 2; 52 | // 53 | // FolderSelectButton 54 | // 55 | this.FolderSelectButton.Enabled = false; 56 | this.FolderSelectButton.Location = new System.Drawing.Point(166, 7); 57 | this.FolderSelectButton.Name = "FolderSelectButton"; 58 | this.FolderSelectButton.Size = new System.Drawing.Size(128, 43); 59 | this.FolderSelectButton.TabIndex = 3; 60 | this.FolderSelectButton.Text = "Выбрать папку с XML"; 61 | this.FolderSelectButton.UseVisualStyleBackColor = true; 62 | this.FolderSelectButton.Click += new System.EventHandler(this.SelectFolder_Click); 63 | // 64 | // textBox1 65 | // 66 | this.textBox1.Location = new System.Drawing.Point(12, 56); 67 | this.textBox1.Multiline = true; 68 | this.textBox1.Name = "textBox1"; 69 | this.textBox1.Size = new System.Drawing.Size(668, 36); 70 | this.textBox1.TabIndex = 4; 71 | this.textBox1.TextChanged += new System.EventHandler(this.textBox1_TextChanged); 72 | // 73 | // CreatTablesButt 74 | // 75 | this.CreatTablesButt.Enabled = false; 76 | this.CreatTablesButt.Location = new System.Drawing.Point(300, 7); 77 | this.CreatTablesButt.Name = "CreatTablesButt"; 78 | this.CreatTablesButt.Size = new System.Drawing.Size(125, 43); 79 | this.CreatTablesButt.TabIndex = 5; 80 | this.CreatTablesButt.Text = "Создать таблицы"; 81 | this.CreatTablesButt.UseVisualStyleBackColor = true; 82 | this.CreatTablesButt.Click += new System.EventHandler(this.CreatTablesButt_Click); 83 | // 84 | // label1 85 | // 86 | this.label1.AutoSize = true; 87 | this.label1.Location = new System.Drawing.Point(428, 8); 88 | this.label1.Name = "label1"; 89 | this.label1.Size = new System.Drawing.Size(42, 15); 90 | this.label1.TabIndex = 6; 91 | this.label1.Text = "Схема"; 92 | this.label1.TextAlign = System.Drawing.ContentAlignment.MiddleRight; 93 | // 94 | // targetSchemaBox 95 | // 96 | this.targetSchemaBox.Location = new System.Drawing.Point(476, 5); 97 | this.targetSchemaBox.Name = "targetSchemaBox"; 98 | this.targetSchemaBox.PlaceholderText = "fias"; 99 | this.targetSchemaBox.Size = new System.Drawing.Size(204, 23); 100 | this.targetSchemaBox.TabIndex = 7; 101 | // 102 | // SelectXsdButton 103 | // 104 | this.SelectXsdButton.Enabled = false; 105 | this.SelectXsdButton.Location = new System.Drawing.Point(12, 7); 106 | this.SelectXsdButton.Name = "SelectXsdButton"; 107 | this.SelectXsdButton.Size = new System.Drawing.Size(148, 43); 108 | this.SelectXsdButton.TabIndex = 8; 109 | this.SelectXsdButton.Text = "Выбрать папку со схемами"; 110 | this.SelectXsdButton.UseVisualStyleBackColor = true; 111 | this.SelectXsdButton.Click += new System.EventHandler(this.SelectXsdButton_Click); 112 | // 113 | // SearchSubFoldersBox 114 | // 115 | this.SearchSubFoldersBox.AutoSize = true; 116 | this.SearchSubFoldersBox.Location = new System.Drawing.Point(459, 33); 117 | this.SearchSubFoldersBox.Name = "SearchSubFoldersBox"; 118 | this.SearchSubFoldersBox.Size = new System.Drawing.Size(188, 19); 119 | this.SearchSubFoldersBox.TabIndex = 9; 120 | this.SearchSubFoldersBox.Text = "Искать во вложенных папках"; 121 | this.SearchSubFoldersBox.UseVisualStyleBackColor = true; 122 | // 123 | // Form1 124 | // 125 | this.AutoScaleDimensions = new System.Drawing.SizeF(7F, 15F); 126 | this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; 127 | this.ClientSize = new System.Drawing.Size(688, 139); 128 | this.Controls.Add(this.SearchSubFoldersBox); 129 | this.Controls.Add(this.SelectXsdButton); 130 | this.Controls.Add(this.targetSchemaBox); 131 | this.Controls.Add(this.label1); 132 | this.Controls.Add(this.CreatTablesButt); 133 | this.Controls.Add(this.textBox1); 134 | this.Controls.Add(this.FolderSelectButton); 135 | this.Controls.Add(this.progressBar1); 136 | this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle; 137 | this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); 138 | this.Name = "Form1"; 139 | this.Text = "Загрузка ГАР"; 140 | this.Load += new System.EventHandler(this.Form1_Load); 141 | this.ResumeLayout(false); 142 | this.PerformLayout(); 143 | 144 | } 145 | 146 | #endregion 147 | private System.Windows.Forms.ProgressBar progressBar1; 148 | private System.Windows.Forms.Button FolderSelectButton; 149 | private System.Windows.Forms.TextBox textBox1; 150 | private System.Windows.Forms.Button CreatTablesButt; 151 | private System.Windows.Forms.Label label1; 152 | private System.Windows.Forms.TextBox targetSchemaBox; 153 | private System.Windows.Forms.Button SelectXsdButton; 154 | private System.Windows.Forms.CheckBox SearchSubFoldersBox; 155 | } 156 | } 157 | 158 | -------------------------------------------------------------------------------- /GarLoader.Core.Gui/Form1.cs: -------------------------------------------------------------------------------- 1 | using GarLoader.Core.Lib; 2 | using System; 3 | using System.Collections.Generic; 4 | using System.Linq; 5 | using System.Windows.Forms; 6 | 7 | namespace GarLoader.Core.Gui 8 | { 9 | public partial class Form1 : Form 10 | { 11 | string _cs; 12 | 13 | const string doneText = "Загружено"; 14 | 15 | string xsdFolder = null; 16 | 17 | string xmlFolder = null; 18 | 19 | public Form1() 20 | { 21 | InitializeComponent(); 22 | } 23 | 24 | public string TargetSchema 25 | { 26 | get 27 | { 28 | if (string.IsNullOrWhiteSpace(targetSchemaBox.Text)) 29 | { 30 | return targetSchemaBox.PlaceholderText; 31 | } 32 | else 33 | { 34 | return targetSchemaBox.Text; 35 | } 36 | } 37 | } 38 | 39 | 40 | private void Form1_Load(object sender, EventArgs e) 41 | { 42 | ResetProgressBar(); 43 | textBox1.Enabled = true; 44 | } 45 | 46 | /// 47 | /// Сбросить програссбар 48 | /// 49 | void ResetProgressBar() 50 | { 51 | progressBar1.Maximum = 100; 52 | progressBar1.Value = 0; 53 | progressBar1.Step = 1; 54 | } 55 | 56 | private async void SelectFolder_Click(object sender, EventArgs e) 57 | { 58 | FolderBrowserDialog dlg = new FolderBrowserDialog(); 59 | if (dlg.ShowDialog() == DialogResult.OK) 60 | { 61 | xmlFolder = dlg.SelectedPath; 62 | await BurnDaHausAsync(SearchSubFoldersBox.Enabled); 63 | } 64 | } 65 | 66 | /// 67 | /// TODO: переименовать во что-то более осмысленное 68 | /// 69 | /// 70 | /// 71 | private async System.Threading.Tasks.Task BurnDaHausAsync(bool searchSubdirectories) 72 | { 73 | string xmlPath = xmlFolder; 74 | string xsdPath = xsdFolder; 75 | string originalText = Text; 76 | Dictionary tables = GetTablesNames.GetTables(xsdPath); 77 | 78 | System.IO.SearchOption searchOption = 79 | (System.IO.SearchOption)Convert.ToInt32(searchSubdirectories); 80 | 81 | foreach (KeyValuePair table in tables.AsEnumerable()) 82 | { 83 | ResetProgressBar(); 84 | Text = table.Value; 85 | Action progress = new Action(ProgressChanged); 86 | string[] files = GetXMLSBySchema(table.Value, xmlPath, SearchSubFoldersBox.Enabled); 87 | 88 | 89 | 90 | ProccessXSD proc = new ProccessXSD(); 91 | TableDefinition def = proc.XSDToTableDefinition(table.Key, TargetSchema); 92 | if (def.TableName == "as_param") 93 | { 94 | ResetProgressBar(); 95 | Action localProgress = new Action(ProgressChanged); 96 | string[] paramXmls = System.IO.Directory.GetFiles(xmlPath, "AS_*_PARAMS_*.xml", searchOption); 97 | foreach (string paramXml in paramXmls) 98 | { 99 | textBox1.Text = paramXml; 100 | WriteData paramWrt = new WriteData(def, paramXml, _cs, 50000, showMessage); 101 | await paramWrt.ReadXmlAsync(localProgress); 102 | } 103 | continue; 104 | } 105 | 106 | if (files.Count() < 1) 107 | { 108 | continue; 109 | } 110 | 111 | foreach (string xmlfile in files) 112 | { 113 | textBox1.Text = xmlfile; 114 | WriteData wrt = new WriteData(def, xmlfile, _cs, 50000, showMessage); 115 | await wrt.ReadXmlAsync(progress); 116 | } 117 | } 118 | textBox1.Text = doneText; 119 | Text = originalText; 120 | ResetProgressBar(); 121 | } 122 | 123 | private string[] GetXMLSBySchema(string schemaName, string folder, bool searchSubs) 124 | { 125 | string[] xmls; 126 | System.IO.SearchOption searchOption = 127 | (System.IO.SearchOption)Convert.ToInt32(searchSubs); 128 | xmls = System.IO.Directory.GetFiles(folder, 129 | schemaName + "_2*.xml", searchOption); 130 | return xmls; 131 | } 132 | 133 | private void ProgressChanged(int smth) 134 | { 135 | reportProgressInt(smth, progressBar1); 136 | } 137 | 138 | private delegate void reportProgressInvoker(int smth, ProgressBar bar); 139 | 140 | private void reportProgressInt(int smth, ProgressBar bar) 141 | { 142 | if (bar.InvokeRequired) 143 | bar.Invoke(new reportProgressInvoker(reportProgressInt), smth, bar); 144 | else 145 | { 146 | bar.Value = smth; 147 | } 148 | } 149 | 150 | private void showMessage(string message) 151 | { 152 | MessageBox.Show(message); 153 | } 154 | 155 | private void CreatTablesButt_Click(object sender, EventArgs e) 156 | { 157 | string xsdPath = xsdFolder; 158 | string ConnectionString = _cs; 159 | Npgsql.NpgsqlConnection _conn = new Npgsql.NpgsqlConnection(ConnectionString); 160 | _conn.Open(); 161 | 162 | 163 | Dictionary xsdFiles = GetTablesNames.GetTables(xsdPath); 164 | foreach (KeyValuePair _filePath in xsdFiles) 165 | { 166 | ProccessXSD proc = new ProccessXSD(); 167 | TableDefinition def = proc.XSDToTableDefinition(_filePath.Key, TargetSchema); 168 | Console.WriteLine(def.SQLtable()); 169 | Npgsql.NpgsqlCommand _cmd = new Npgsql.NpgsqlCommand(def.SQLtable(), _conn); 170 | _cmd.ExecuteNonQuery(); 171 | 172 | ///Запись sql в файл для каждой таблицы 173 | #if Debug 174 | string file = System.IO.Path.Combine(System.IO.Directory.GetParent(_filePath.Key).FullName, _filePath.Value + ".sql"); 175 | System.IO.StreamWriter wrt = new System.IO.StreamWriter(file); 176 | wrt.WriteLine(def.SQLtable()); 177 | wrt.Flush(); 178 | wrt.Close(); 179 | #endif 180 | 181 | } 182 | _conn.Close(); 183 | } 184 | 185 | private void textBox1_TextChanged(object sender, EventArgs e) 186 | { 187 | string[] mustHaves = { "Server", "MinPoolSize", "MaxPoolSize", "Port", "Database", "Userid" }; 188 | try 189 | { 190 | if (textBox1.Text.Length < 90) 191 | { 192 | return; 193 | } 194 | 195 | foreach (string musthave in mustHaves) 196 | { 197 | bool checkPoint = textBox1.Text.Contains(musthave); 198 | if (!checkPoint) 199 | { 200 | return; 201 | } 202 | } 203 | 204 | Npgsql.NpgsqlConnection conn = new(textBox1.Text); 205 | 206 | conn.Open(); 207 | _cs = textBox1.Text; 208 | conn.Close(); 209 | textBox1.Text = default; 210 | textBox1.Enabled = false; 211 | SelectXsdButton.Enabled = true; 212 | 213 | 214 | string[] specialValues = { "192.168.2.145", "192.168.1.42", "avalon.geo-volodarsk.com" }; 215 | foreach (string specialV in specialValues) 216 | { 217 | if (_cs.Contains(specialV)) 218 | { 219 | string newName = System 220 | .Text.Encoding 221 | .UTF8.GetString(Convert 222 | .FromBase64String("0KHQvtC30LTQsNGC0Ywg0YHRgNCw0L3Ri9C1INGC0LDQsdC70LjRhtGL")); 223 | CreatTablesButt.Text = newName; 224 | } 225 | } 226 | } 227 | catch(Exception exc) 228 | { 229 | Console.WriteLine(exc.Message); 230 | } 231 | 232 | 233 | } 234 | 235 | private void SelectXsdButton_Click(object sender, EventArgs e) 236 | { 237 | FolderBrowserDialog dlg = new FolderBrowserDialog(); 238 | if (dlg.ShowDialog() == DialogResult.OK) 239 | { 240 | xsdFolder = dlg.SelectedPath; 241 | CreatTablesButt.Enabled = true; 242 | FolderSelectButton.Enabled = true; 243 | } 244 | } 245 | } 246 | } 247 | -------------------------------------------------------------------------------- /GarLoader.Core.Gui/Form1.resx: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | text/microsoft-resx 50 | 51 | 52 | 2.0 53 | 54 | 55 | System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 56 | 57 | 58 | System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 59 | 60 | 61 | 62 | 63 | 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 527 | 528 | 529 | -------------------------------------------------------------------------------- /GarLoader.Core.Gui/GarLoader.Core.Gui.csproj: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | WinExe 5 | net7.0-windows 6 | true 7 | icons8-address-96.ico 8 | GarLoader.Core.Gui.Program 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /GarLoader.Core.Gui/Program.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | using System.Threading.Tasks; 5 | using System.Windows.Forms; 6 | 7 | namespace GarLoader.Core.Gui 8 | { 9 | static class Program 10 | { 11 | /// 12 | /// The main entry point for the application. 13 | /// 14 | [STAThread] 15 | static void Main() 16 | { 17 | Application.SetHighDpiMode(HighDpiMode.SystemAware); 18 | Application.EnableVisualStyles(); 19 | Application.SetCompatibleTextRenderingDefault(false); 20 | Application.Run(new Form1()); 21 | } 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /GarLoader.Core.Gui/icons8-address-96.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CharonExpress/GarLoader/b71d0d0cbb42a834bc48b430e8dbc82a311500a4/GarLoader.Core.Gui/icons8-address-96.ico -------------------------------------------------------------------------------- /GarLoader.Core.Gui/Индексы.sql: -------------------------------------------------------------------------------- 1 | SET search_path TO fias; 2 | CREATE EXTENSION pg_trgm; 3 | --as_addr_obj_id 4 | 5 | -- DROP INDEX IF EXISTS fias.as_addr_obj_id_idx; 6 | 7 | CREATE INDEX IF NOT EXISTS as_addr_obj_id_idx 8 | ON fias.as_addr_obj USING btree 9 | (id ASC NULLS LAST) 10 | TABLESPACE pg_default; 11 | -- Index: as_addr_obj_isactive_idx 12 | 13 | -- DROP INDEX IF EXISTS fias.as_addr_obj_isactive_idx; 14 | 15 | CREATE INDEX IF NOT EXISTS as_addr_obj_isactive_idx 16 | ON fias.as_addr_obj USING btree 17 | (isactive ASC NULLS LAST) 18 | TABLESPACE pg_default; 19 | -- Index: as_addr_obj_isactual_idx 20 | 21 | -- DROP INDEX IF EXISTS fias.as_addr_obj_isactual_idx; 22 | 23 | CREATE INDEX IF NOT EXISTS as_addr_obj_isactual_idx 24 | ON fias.as_addr_obj USING btree 25 | (isactual ASC NULLS LAST) 26 | TABLESPACE pg_default; 27 | -- Index: as_addr_obj_level_idx 28 | 29 | -- DROP INDEX IF EXISTS fias.as_addr_obj_level_idx; 30 | 31 | CREATE INDEX IF NOT EXISTS as_addr_obj_level_idx 32 | ON fias.as_addr_obj USING btree 33 | (level ASC NULLS LAST) 34 | TABLESPACE pg_default; 35 | -- Index: as_addr_obj_objectguid_idx 36 | 37 | -- DROP INDEX IF EXISTS fias.as_addr_obj_objectguid_idx; 38 | 39 | CREATE INDEX IF NOT EXISTS as_addr_obj_objectguid_idx 40 | ON fias.as_addr_obj USING btree 41 | (objectguid ASC NULLS LAST) 42 | TABLESPACE pg_default; 43 | -- Index: as_addr_obj_objectid_idx 44 | 45 | -- DROP INDEX IF EXISTS fias.as_addr_obj_objectid_idx; 46 | 47 | CREATE INDEX IF NOT EXISTS as_addr_obj_objectid_idx 48 | ON fias.as_addr_obj USING btree 49 | (objectid ASC NULLS LAST) 50 | TABLESPACE pg_default; 51 | 52 | 53 | -- Index: as_addr_obj_types_id_idx 54 | 55 | -- DROP INDEX IF EXISTS fias.as_addr_obj_types_id_idx; 56 | 57 | CREATE INDEX IF NOT EXISTS as_addr_obj_types_id_idx 58 | ON fias.as_addr_obj_types USING btree 59 | (id ASC NULLS LAST) 60 | TABLESPACE pg_default; 61 | 62 | -- Index: as_addr_obj_name_idx 63 | 64 | -- DROP INDEX IF EXISTS fias.as_addr_obj_name_idx; 65 | 66 | CREATE INDEX IF NOT EXISTS as_addr_obj_name_idx 67 | ON as_addr_obj USING gin 68 | (name COLLATE pg_catalog."default" gin_trgm_ops) 69 | TABLESPACE pg_default; 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | -- Index: as_adm_hierarchy_id_idx 78 | 79 | -- DROP INDEX IF EXISTS fias.as_adm_hierarchy_id_idx; 80 | 81 | CREATE INDEX IF NOT EXISTS as_adm_hierarchy_id_idx 82 | ON fias.as_adm_hierarchy USING btree 83 | (id ASC NULLS LAST) 84 | TABLESPACE pg_default; 85 | -- Index: as_adm_hierarchy_isactive_idx 86 | 87 | -- DROP INDEX IF EXISTS fias.as_adm_hierarchy_isactive_idx; 88 | 89 | CREATE INDEX IF NOT EXISTS as_adm_hierarchy_isactive_idx 90 | ON fias.as_adm_hierarchy USING btree 91 | (isactive ASC NULLS LAST) 92 | TABLESPACE pg_default; 93 | -- Index: as_adm_hierarchy_objectid_idx 94 | 95 | -- DROP INDEX IF EXISTS fias.as_adm_hierarchy_objectid_idx; 96 | 97 | CREATE INDEX IF NOT EXISTS as_adm_hierarchy_objectid_idx 98 | ON fias.as_adm_hierarchy USING btree 99 | (objectid ASC NULLS LAST) 100 | TABLESPACE pg_default; 101 | -- Index: as_adm_hierarchy_parentobjid_idx 102 | 103 | -- DROP INDEX IF EXISTS fias.as_adm_hierarchy_parentobjid_idx; 104 | 105 | CREATE INDEX IF NOT EXISTS as_adm_hierarchy_parentobjid_idx 106 | ON fias.as_adm_hierarchy USING btree 107 | (parentobjid ASC NULLS LAST) 108 | TABLESPACE pg_default; 109 | -- Index: as_adm_hierarchy_region_idx 110 | 111 | -- DROP INDEX IF EXISTS fias.as_adm_hierarchy_region_idx; 112 | 113 | CREATE INDEX IF NOT EXISTS as_adm_hierarchy_region_idx 114 | ON fias.as_adm_hierarchy USING btree 115 | (regioncode ASC NULLS LAST) 116 | TABLESPACE pg_default; 117 | 118 | 119 | 120 | 121 | 122 | 123 | 124 | 125 | 126 | -- Index: as_apartments_id_idx 127 | 128 | -- DROP INDEX IF EXISTS fias.as_apartments_id_idx; 129 | 130 | CREATE INDEX IF NOT EXISTS as_apartments_id_idx 131 | ON fias.as_apartments USING btree 132 | (id ASC NULLS LAST) 133 | TABLESPACE pg_default; 134 | -- Index: as_apartments_isactive_idx 135 | 136 | -- DROP INDEX IF EXISTS fias.as_apartments_isactive_idx; 137 | 138 | CREATE INDEX IF NOT EXISTS as_apartments_isactive_idx 139 | ON fias.as_apartments USING btree 140 | (isactive ASC NULLS LAST) 141 | TABLESPACE pg_default; 142 | -- Index: as_apartments_isactual_idx 143 | 144 | -- DROP INDEX IF EXISTS fias.as_apartments_isactual_idx; 145 | 146 | CREATE INDEX IF NOT EXISTS as_apartments_isactual_idx 147 | ON fias.as_apartments USING btree 148 | (isactual ASC NULLS LAST) 149 | TABLESPACE pg_default; 150 | -- Index: as_apartments_objectguid_idx 151 | 152 | -- DROP INDEX IF EXISTS fias.as_apartments_objectguid_idx; 153 | 154 | CREATE INDEX IF NOT EXISTS as_apartments_objectguid_idx 155 | ON fias.as_apartments USING btree 156 | (objectguid ASC NULLS LAST) 157 | TABLESPACE pg_default; 158 | -- Index: as_apartments_objectid_idx 159 | 160 | -- DROP INDEX IF EXISTS fias.as_apartments_objectid_idx; 161 | 162 | CREATE INDEX IF NOT EXISTS as_apartments_objectid_idx 163 | ON fias.as_apartments USING btree 164 | (objectid ASC NULLS LAST) 165 | TABLESPACE pg_default; 166 | 167 | 168 | 169 | 170 | 171 | 172 | 173 | 174 | -- Index: as_carplaces_id_idx 175 | 176 | -- DROP INDEX IF EXISTS fias.as_carplaces_id_idx; 177 | 178 | CREATE INDEX IF NOT EXISTS as_carplaces_id_idx 179 | ON fias.as_carplaces USING btree 180 | (id ASC NULLS LAST) 181 | TABLESPACE pg_default; 182 | -- Index: as_carplaces_isactive_idx 183 | 184 | -- DROP INDEX IF EXISTS fias.as_carplaces_isactive_idx; 185 | 186 | CREATE INDEX IF NOT EXISTS as_carplaces_isactive_idx 187 | ON fias.as_carplaces USING btree 188 | (isactive ASC NULLS LAST) 189 | TABLESPACE pg_default; 190 | -- Index: as_carplaces_isactual_idx 191 | 192 | -- DROP INDEX IF EXISTS fias.as_carplaces_isactual_idx; 193 | 194 | CREATE INDEX IF NOT EXISTS as_carplaces_isactual_idx 195 | ON fias.as_carplaces USING btree 196 | (isactual ASC NULLS LAST) 197 | TABLESPACE pg_default; 198 | -- Index: as_carplaces_objectguid_idx 199 | 200 | -- DROP INDEX IF EXISTS fias.as_carplaces_objectguid_idx; 201 | 202 | CREATE INDEX IF NOT EXISTS as_carplaces_objectguid_idx 203 | ON fias.as_carplaces USING btree 204 | (objectguid ASC NULLS LAST) 205 | TABLESPACE pg_default; 206 | -- Index: as_carplaces_objectid_idx 207 | 208 | -- DROP INDEX IF EXISTS fias.as_carplaces_objectid_idx; 209 | 210 | CREATE INDEX IF NOT EXISTS as_carplaces_objectid_idx 211 | ON fias.as_carplaces USING btree 212 | (objectid ASC NULLS LAST) 213 | TABLESPACE pg_default; 214 | 215 | 216 | 217 | 218 | 219 | 220 | -- Index: as_houses_id_idx 221 | 222 | -- DROP INDEX IF EXISTS fias.as_houses_id_idx; 223 | 224 | CREATE INDEX IF NOT EXISTS as_houses_id_idx 225 | ON fias.as_houses USING btree 226 | (id ASC NULLS LAST) 227 | TABLESPACE pg_default; 228 | -- Index: as_houses_isactive_idx 229 | 230 | -- DROP INDEX IF EXISTS fias.as_houses_isactive_idx; 231 | 232 | CREATE INDEX IF NOT EXISTS as_houses_isactive_idx 233 | ON fias.as_houses USING btree 234 | (isactive ASC NULLS LAST) 235 | TABLESPACE pg_default; 236 | -- Index: as_houses_isactual_idx 237 | 238 | -- DROP INDEX IF EXISTS fias.as_houses_isactual_idx; 239 | 240 | CREATE INDEX IF NOT EXISTS as_houses_isactual_idx 241 | ON fias.as_houses USING btree 242 | (isactual ASC NULLS LAST) 243 | TABLESPACE pg_default; 244 | -- Index: as_houses_objectguid_idx 245 | 246 | -- DROP INDEX IF EXISTS fias.as_houses_objectguid_idx; 247 | 248 | CREATE INDEX IF NOT EXISTS as_houses_objectguid_idx 249 | ON fias.as_houses USING btree 250 | (objectguid ASC NULLS LAST) 251 | TABLESPACE pg_default; 252 | -- Index: as_houses_objectid_idx 253 | 254 | -- DROP INDEX IF EXISTS fias.as_houses_objectid_idx; 255 | 256 | CREATE INDEX IF NOT EXISTS as_houses_objectid_idx 257 | ON fias.as_houses USING btree 258 | (objectid ASC NULLS LAST) 259 | TABLESPACE pg_default; 260 | 261 | 262 | 263 | 264 | 265 | 266 | 267 | 268 | 269 | 270 | -- Index: as_steads_id_idx 271 | 272 | -- DROP INDEX IF EXISTS fias.as_steads_id_idx; 273 | 274 | CREATE INDEX IF NOT EXISTS as_steads_id_idx 275 | ON fias.as_steads USING btree 276 | (id ASC NULLS LAST) 277 | TABLESPACE pg_default; 278 | -- Index: as_steads_isactive_idx 279 | 280 | -- DROP INDEX IF EXISTS fias.as_steads_isactive_idx; 281 | 282 | CREATE INDEX IF NOT EXISTS as_steads_isactive_idx 283 | ON fias.as_steads USING btree 284 | (isactive ASC NULLS LAST) 285 | TABLESPACE pg_default; 286 | -- Index: as_steads_isactual_idx 287 | 288 | -- DROP INDEX IF EXISTS fias.as_steads_isactual_idx; 289 | 290 | CREATE INDEX IF NOT EXISTS as_steads_isactual_idx 291 | ON fias.as_steads USING btree 292 | (isactual ASC NULLS LAST) 293 | TABLESPACE pg_default; 294 | -- Index: as_steads_objectguid_idx 295 | 296 | -- DROP INDEX IF EXISTS fias.as_steads_objectguid_idx; 297 | 298 | CREATE INDEX IF NOT EXISTS as_steads_objectguid_idx 299 | ON fias.as_steads USING btree 300 | (objectguid ASC NULLS LAST) 301 | TABLESPACE pg_default; 302 | -- Index: as_steads_objectid_idx 303 | 304 | -- DROP INDEX IF EXISTS fias.as_steads_objectid_idx; 305 | 306 | CREATE INDEX IF NOT EXISTS as_steads_objectid_idx 307 | ON fias.as_steads USING btree 308 | (objectid ASC NULLS LAST) 309 | TABLESPACE pg_default; 310 | 311 | 312 | 313 | 314 | 315 | 316 | 317 | 318 | 319 | 320 | 321 | -- Index: as_rooms_id_idx 322 | 323 | -- DROP INDEX IF EXISTS fias.as_rooms_id_idx; 324 | 325 | CREATE INDEX IF NOT EXISTS as_rooms_id_idx 326 | ON fias.as_rooms USING btree 327 | (id ASC NULLS LAST) 328 | TABLESPACE pg_default; 329 | -- Index: as_rooms_isactive_idx 330 | 331 | -- DROP INDEX IF EXISTS fias.as_rooms_isactive_idx; 332 | 333 | CREATE INDEX IF NOT EXISTS as_rooms_isactive_idx 334 | ON fias.as_rooms USING btree 335 | (isactive ASC NULLS LAST) 336 | TABLESPACE pg_default; 337 | -- Index: as_rooms_isactual_idx 338 | 339 | -- DROP INDEX IF EXISTS fias.as_rooms_isactual_idx; 340 | 341 | CREATE INDEX IF NOT EXISTS as_rooms_isactual_idx 342 | ON fias.as_rooms USING btree 343 | (isactual ASC NULLS LAST) 344 | TABLESPACE pg_default; 345 | -- Index: as_rooms_objectguid_idx 346 | 347 | -- DROP INDEX IF EXISTS fias.as_rooms_objectguid_idx; 348 | 349 | CREATE INDEX IF NOT EXISTS as_rooms_objectguid_idx 350 | ON fias.as_rooms USING btree 351 | (objectguid ASC NULLS LAST) 352 | TABLESPACE pg_default; 353 | -- Index: as_rooms_objectid_idx 354 | 355 | -- DROP INDEX IF EXISTS fias.as_rooms_objectid_idx; 356 | 357 | CREATE INDEX IF NOT EXISTS as_rooms_objectid_idx 358 | ON fias.as_rooms USING btree 359 | (objectid ASC NULLS LAST) 360 | TABLESPACE pg_default; 361 | 362 | 363 | 364 | 365 | 366 | 367 | -- Index: as_reestr_objects_isactive_idx 368 | 369 | -- DROP INDEX IF EXISTS fias.as_reestr_objects_isactive_idx; 370 | 371 | CREATE INDEX IF NOT EXISTS as_reestr_objects_isactive_idx 372 | ON fias.as_reestr_objects USING btree 373 | (isactive ASC NULLS LAST) 374 | TABLESPACE pg_default; 375 | 376 | -- Index: as_reestr_objects_objectguid_idx 377 | 378 | -- DROP INDEX IF EXISTS fias.as_reestr_objects_objectguid_idx; 379 | 380 | CREATE INDEX IF NOT EXISTS as_reestr_objects_objectguid_idx 381 | ON fias.as_reestr_objects USING btree 382 | (objectguid ASC NULLS LAST) 383 | TABLESPACE pg_default; 384 | -- Index: as_reestr_objects_objectid_idx 385 | 386 | -- DROP INDEX IF EXISTS fias.as_reestr_objects_objectid_idx; 387 | 388 | CREATE INDEX IF NOT EXISTS as_reestr_objects_objectid_idx 389 | ON fias.as_reestr_objects USING btree 390 | (objectid ASC NULLS LAST) 391 | TABLESPACE pg_default; 392 | 393 | 394 | 395 | 396 | 397 | 398 | 399 | 400 | 401 | 402 | -- Index: as_mun_hierarchy_id_idx 403 | 404 | -- DROP INDEX IF EXISTS fias.as_mun_hierarchy_id_idx; 405 | 406 | CREATE INDEX IF NOT EXISTS as_mun_hierarchy_id_idx 407 | ON fias.as_mun_hierarchy USING btree 408 | (id ASC NULLS LAST) 409 | TABLESPACE pg_default; 410 | -- Index: as_mun_hierarchy_isactive_idx 411 | 412 | -- DROP INDEX IF EXISTS fias.as_mun_hierarchy_isactive_idx; 413 | 414 | CREATE INDEX IF NOT EXISTS as_mun_hierarchy_isactive_idx 415 | ON fias.as_mun_hierarchy USING btree 416 | (isactive ASC NULLS LAST) 417 | TABLESPACE pg_default; 418 | -- Index: as_mun_hierarchy_objectid_idx 419 | 420 | -- DROP INDEX IF EXISTS fias.as_mun_hierarchy_objectid_idx; 421 | 422 | CREATE INDEX IF NOT EXISTS as_mun_hierarchy_objectid_idx 423 | ON fias.as_mun_hierarchy USING btree 424 | (objectid ASC NULLS LAST) 425 | TABLESPACE pg_default; 426 | -- Index: as_mun_hierarchy_parentobjid_idx 427 | 428 | -- DROP INDEX IF EXISTS fias.as_mun_hierarchy_parentobjid_idx; 429 | 430 | CREATE INDEX IF NOT EXISTS as_mun_hierarchy_parentobjid_idx 431 | ON fias.as_mun_hierarchy USING btree 432 | (parentobjid ASC NULLS LAST) 433 | TABLESPACE pg_default; 434 | 435 | -- Index: as_param_value_idx 436 | 437 | -- DROP INDEX IF EXISTS fias.as_param_value_idx; 438 | 439 | CREATE INDEX IF NOT EXISTS as_param_value_idx 440 | ON fias.as_param USING gin 441 | (value COLLATE pg_catalog."default" gin_trgm_ops) 442 | TABLESPACE pg_default; 443 | SET search_path TO public; -------------------------------------------------------------------------------- /GarLoader.Core.Gui/Патч после загрузки.sql: -------------------------------------------------------------------------------- 1 | SET search_path TO fias; 2 | --Очистка от неактивных и неактуальных объектов 3 | DELETE FROM as_addr_obj WHERE isactive = 0 OR isactual = 0 or id IS NULL; 4 | DELETE FROM as_addr_obj_division WHERE id IS NULL; 5 | DELETE FROM as_addr_obj_types WHERE id IS NULL; 6 | DELETE FROM as_adm_hierarchy WHERE isactive = 0 OR id IS NULL; 7 | DELETE FROM as_apartment_types WHERE id IS NULL; 8 | DELETE FROM as_apartments WHERE isactive = 0 OR isactual = 0 OR id IS NULL; 9 | DELETE FROM as_carplaces WHERE isactive = 0 OR isactual = 0 OR id IS NULL; 10 | DELETE FROM as_change_history WHERE changeid IS NULL; 11 | DELETE FROM as_house_types WHERE id IS NULL; 12 | DELETE FROM as_houses WHERE isactive = 0 OR isactual = 0 OR id IS NULL; 13 | DELETE FROM as_mun_hierarchy WHERE isactive = 0 OR id IS NULL; 14 | DELETE FROM as_normative_docs WHERE id IS NULL; 15 | DELETE FROM as_normative_docs_kinds WHERE id IS NULL; 16 | DELETE FROM as_normative_docs_types WHERE id IS NULL; 17 | DELETE FROM as_object_levels WHERE level IS NULL; 18 | DELETE FROM as_operation_types WHERE id IS NULL; 19 | DELETE FROM as_param WHERE id IS NULL; 20 | DELETE FROM as_param_types WHERE id IS NULL; 21 | DELETE FROM as_reestr_objects WHERE isactive = 0 OR objectid IS NULL; 22 | DELETE FROM as_room_types WHERE id IS NULL; 23 | DELETE FROM as_rooms WHERE isactive = 0 OR isactual = 0 OR id IS NULL; 24 | DELETE FROM as_steads WHERE isactive = 0 OR isactual = 0 OR id IS NULL; 25 | 26 | --фикс типов колонок 27 | --as_addr_obj 28 | ALTER TABLE as_addr_obj 29 | ALTER COLUMN level TYPE smallint 30 | USING level::smallint; 31 | 32 | --as_adm_hierarchy 33 | ALTER TABLE as_adm_hierarchy 34 | ALTER COLUMN regioncode TYPE smallint 35 | USING regioncode::smallint; 36 | 37 | --as_steads 38 | ALTER TABLE as_steads 39 | ALTER COLUMN opertypeid TYPE smallint 40 | USING opertypeid::smallint; 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | CREATE INDEX as_addr_obj_level_index 59 | ON fias.as_addr_obj USING btree 60 | (level ASC NULLS LAST) 61 | TABLESPACE pg_default; 62 | CREATE INDEX as_addr_obj_name_idx 63 | ON fias.as_addr_obj USING gist 64 | (name COLLATE pg_catalog."default" gist_trgm_ops) 65 | TABLESPACE pg_default; 66 | CREATE INDEX as_addr_obj_objectid_idx 67 | ON fias.as_addr_obj USING btree 68 | (objectid ASC NULLS LAST) 69 | TABLESPACE pg_default; 70 | CREATE INDEX as_addr_obj_name_idx 71 | ON fias.as_addr_obj USING gist 72 | (name gist_trgm_ops); 73 | ALTER TABLE fias.as_addr_obj 74 | ADD CONSTRAINT as_addr_obj_pkey PRIMARY KEY (id); 75 | 76 | 77 | --as_addr_obj_division_pkey 78 | ALTER TABLE fias.as_addr_obj_division 79 | ADD CONSTRAINT as_addr_obj_division_pkey PRIMARY KEY (id); 80 | 81 | --as_addr_obj_types_pkey 82 | ALTER TABLE fias.as_addr_obj_types 83 | ADD CONSTRAINT as_addr_obj_types_pkey PRIMARY KEY (id); 84 | 85 | --as_adm_hierarchy_idx, pkey 86 | CREATE INDEX as_adm_hierarchy_objectid_idx 87 | ON fias.as_adm_hierarchy USING btree 88 | (objectid ASC NULLS LAST) 89 | TABLESPACE pg_default; 90 | CREATE INDEX as_adm_hierarchy_parentobjid_idx 91 | ON fias.as_adm_hierarchy USING btree 92 | (parentobjid ASC NULLS LAST) 93 | TABLESPACE pg_default; 94 | ALTER TABLE fias.as_adm_hierarchy 95 | ADD CONSTRAINT as_adm_hierarchy_pkey PRIMARY KEY (id); 96 | 97 | --as_apartment_types_pkey 98 | ALTER TABLE fias.as_apartment_types 99 | ADD CONSTRAINT as_apartment_types_pkey PRIMARY KEY (id); 100 | 101 | --as_apartments_idx, pkey 102 | CREATE INDEX as_apartments_objectid_idx 103 | ON fias.as_apartments USING btree 104 | (objectid ASC NULLS LAST); 105 | ALTER TABLE fias.as_apartments 106 | ADD CONSTRAINT as_apartments_pkey PRIMARY KEY (id); 107 | 108 | --as_carplaces_idx, pkey 109 | CREATE INDEX as_carplaces_objectid_idx 110 | ON fias.as_carplaces USING btree 111 | (objectid ASC NULLS LAST); 112 | ALTER TABLE fias.as_carplaces 113 | ADD CONSTRAINT as_carplaces_pkey PRIMARY KEY (id); 114 | 115 | --as_house_types_pkey 116 | ALTER TABLE fias.as_house_types 117 | ADD CONSTRAINT as_house_types_pkey PRIMARY KEY (id); 118 | 119 | 120 | --as_houses_idx, pkey 121 | CREATE INDEX as_houses_objectid_idx 122 | ON fias.as_houses USING btree 123 | (objectid ASC NULLS LAST); 124 | ALTER TABLE fias.as_houses 125 | ADD CONSTRAINT as_houses_pkey PRIMARY KEY (id); 126 | 127 | --as_mun_hierarchy_idx, pkey 128 | CREATE INDEX as_mun_hiererchy_objectid_idx 129 | ON fias.as_mun_hierarchy USING btree 130 | (objectid ASC NULLS LAST); 131 | CREATE INDEX as_mun_hiererchy_parentobjid_idx 132 | ON fias.as_mun_hierarchy USING btree 133 | (parentobjid ASC NULLS LAST) 134 | TABLESPACE pg_default; 135 | ALTER TABLE fias.as_mun_hierarchy 136 | ADD CONSTRAINT as_mun_hierarchy_pkey PRIMARY KEY (id); 137 | 138 | --as_object_levels 139 | ALTER TABLE fias.as_object_levels 140 | ADD CONSTRAINT as_object_levels_pkey PRIMARY KEY (level); 141 | 142 | --as_param_idx, pkey 143 | CREATE INDEX as_param_objectid_idx 144 | ON fias.as_param USING btree 145 | (objectid ASC NULLS LAST); 146 | ALTER TABLE fias.as_param 147 | ADD CONSTRAINT as_param_pkey PRIMARY KEY (id); 148 | 149 | --as_param_types 150 | ALTER TABLE fias.as_param_types 151 | ADD CONSTRAINT as_param_types_pkey PRIMARY KEY (id); 152 | CREATE INDEX as_param_typeid_idx 153 | ON fias.as_param USING btree 154 | (typeid ASC NULLS LAST) 155 | TABLESPACE pg_default; 156 | 157 | --as_reestr_objects_idx, pkey 158 | CREATE INDEX as_reestr_objects_idx 159 | ON fias.as_reestr_objects USING btree 160 | (objectid ASC NULLS LAST); 161 | ALTER TABLE fias.as_reestr_objects 162 | ADD CONSTRAINT as_reestr_objects_pkey PRIMARY KEY (objectid); 163 | 164 | --as_room_types_pkey 165 | ALTER TABLE fias.as_room_types 166 | ADD CONSTRAINT as_room_types_pkey PRIMARY KEY (id); 167 | 168 | --as_rooms_idx, pkey 169 | CREATE INDEX as_rooms_objectid_idx 170 | ON fias.as_rooms USING btree 171 | (objectid ASC NULLS LAST); 172 | ALTER TABLE fias.as_rooms 173 | ADD CONSTRAINT as_rooms_pkey PRIMARY KEY (id); 174 | 175 | --as_steads_idx, pkey 176 | CREATE INDEX as_steads_objectid_idx 177 | ON fias.as_steads USING btree 178 | (objectid ASC NULLS LAST); 179 | ALTER TABLE fias.as_steads 180 | ADD CONSTRAINT as_steads_pkey PRIMARY KEY (id); 181 | SET search_path TO public; -------------------------------------------------------------------------------- /GarLoader.Core.Gui/Первичные ключи.sql: -------------------------------------------------------------------------------- 1 | SET search_path TO fias; 2 | --Первичные ключи 3 | --as_addr_obj 4 | ALTER TABLE IF EXISTS as_addr_obj 5 | ADD CONSTRAINT as_addr_obj_pkey PRIMARY KEY (id); 6 | 7 | --as_addr_obj_division 8 | ALTER TABLE IF EXISTS as_addr_obj_division 9 | ADD CONSTRAINT as_addr_obj_division_pkey PRIMARY KEY (id); 10 | 11 | --as_addr_obj_types 12 | ALTER TABLE IF EXISTS as_addr_obj_types 13 | ADD CONSTRAINT as_addr_obj_types_pkey PRIMARY KEY (id); 14 | 15 | --as_adm_hierarchy 16 | ALTER TABLE IF EXISTS as_adm_hierarchy 17 | ADD CONSTRAINT as_adm_hierarchy_pkey PRIMARY KEY (id); 18 | 19 | --as_apartment_types 20 | ALTER TABLE IF EXISTS as_apartment_types 21 | ADD CONSTRAINT as_apartment_types_pkey PRIMARY KEY (id); 22 | 23 | --as_apartments 24 | ALTER TABLE IF EXISTS as_apartments 25 | ADD CONSTRAINT as_apartments_pkey PRIMARY KEY (id); 26 | 27 | --as_carplaces 28 | ALTER TABLE IF EXISTS as_carplaces 29 | ADD CONSTRAINT as_carplaces_pkey PRIMARY KEY (id); 30 | 31 | --as_change_history 32 | ALTER TABLE IF EXISTS as_change_history 33 | ADD CONSTRAINT as_change_history_pkey PRIMARY KEY (changeid); 34 | 35 | --as_house_types 36 | ALTER TABLE IF EXISTS as_house_types 37 | ADD CONSTRAINT as_house_types_pkey PRIMARY KEY (id); 38 | 39 | --as_houses 40 | ALTER TABLE IF EXISTS as_houses 41 | ADD CONSTRAINT as_houses_pkey PRIMARY KEY (id); 42 | 43 | --as_mun_hierarchy 44 | ALTER TABLE IF EXISTS as_mun_hierarchy 45 | ADD CONSTRAINT as_mun_hierarchy_pkey PRIMARY KEY (id); 46 | 47 | --as_normative_docs 48 | ALTER TABLE IF EXISTS as_normative_docs 49 | ADD CONSTRAINT as_normative_docs_pkey PRIMARY KEY (id); 50 | 51 | 52 | --as_normative_docs_kinds 53 | ALTER TABLE IF EXISTS as_normative_docs_kinds 54 | ADD CONSTRAINT as_normative_docs_kinds_pkey PRIMARY KEY (id); 55 | 56 | --as_normative_docs_types 57 | ALTER TABLE IF EXISTS as_normative_docs_types 58 | ADD CONSTRAINT as_normative_docs_types_pkey PRIMARY KEY (id); 59 | 60 | --as_object_levels 61 | ALTER TABLE IF EXISTS as_object_levels 62 | ADD CONSTRAINT as_object_levels_pkey PRIMARY KEY (level); 63 | 64 | --as_operation_types 65 | ALTER TABLE IF EXISTS as_operation_types 66 | ADD CONSTRAINT as_operation_types_pkey PRIMARY KEY (id); 67 | 68 | --as_param 69 | ALTER TABLE IF EXISTS as_param 70 | ADD CONSTRAINT as_param_pkey PRIMARY KEY (id); 71 | 72 | --as_param_types 73 | ALTER TABLE IF EXISTS as_param_types 74 | ADD CONSTRAINT as_param_types_pkey PRIMARY KEY (id); 75 | 76 | --as_reestr_objects 77 | ALTER TABLE IF EXISTS as_reestr_objects 78 | ADD CONSTRAINT as_reestr_objects_pkey PRIMARY KEY (objectid); 79 | 80 | --as_room_types 81 | ALTER TABLE IF EXISTS as_room_types 82 | ADD CONSTRAINT as_room_types_pkey PRIMARY KEY (id); 83 | 84 | --as_rooms 85 | ALTER TABLE IF EXISTS as_rooms 86 | ADD CONSTRAINT as_rooms_pkey PRIMARY KEY (id); 87 | 88 | --as_steads 89 | ALTER TABLE IF EXISTS as_steads 90 | ADD CONSTRAINT as_steads_pkey PRIMARY KEY (id); 91 | SET search_path TO public; -------------------------------------------------------------------------------- /GarLoader.Core.Lib/Commons.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | 3 | namespace GarLoader.Core.Lib 4 | { 5 | public class Commons 6 | { 7 | // Стырено https://stackoverflow.com/questions/393731/generic-conversion-function-doesnt-seem-to-work-with-guids и немного доработано 8 | public static object ChangeType(object value, Type type) 9 | { 10 | if (type == typeof(bool)) 11 | { 12 | if (value.GetType() == typeof(string)) 13 | { 14 | int r; 15 | if (int.TryParse((string)value, out r) == true) 16 | { 17 | return ChangeType(r, typeof(bool)); 18 | } 19 | } 20 | } 21 | 22 | if (value == null) 23 | return null; 24 | if (type == value.GetType()) 25 | return value; 26 | 27 | if (type.IsEnum) 28 | { 29 | if (value is string) 30 | return Enum.Parse(type, value as string); 31 | else 32 | return Enum.ToObject(type, value); 33 | } 34 | 35 | if (!type.IsInterface && type.IsGenericType) 36 | { 37 | Type innerType = type.GetGenericArguments()[0]; 38 | object innerValue = ChangeType(value, innerType); 39 | return Activator.CreateInstance(type, new object[] { innerValue }); 40 | } 41 | 42 | if (value is string && type == typeof(Guid)) 43 | return new Guid(value as string); 44 | if (value is string && type == typeof(Version)) 45 | return new Version(value as string); 46 | if (!(value is IConvertible)) 47 | return value; 48 | return Convert.ChangeType(value, type); 49 | } 50 | 51 | } 52 | } 53 | -------------------------------------------------------------------------------- /GarLoader.Core.Lib/GarLoader.Core.Lib.csproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | net7.0 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /GarLoader.Core.Lib/GarLoader.Core.Lib.sln: -------------------------------------------------------------------------------- 1 |  2 | Microsoft Visual Studio Solution File, Format Version 12.00 3 | # Visual Studio Version 16 4 | VisualStudioVersion = 16.0.30717.126 5 | MinimumVisualStudioVersion = 10.0.40219.1 6 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "GarLoader.Core.Lib", "GarLoader.Core.Lib.csproj", "{A9725F76-83A2-4342-9B51-14277890B064}" 7 | EndProject 8 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "GarLoader.Core.Lib.Tests", "..\GarLoader.Core.Lib.Tests\GarLoader.Core.Lib.Tests.csproj", "{F75B06E2-A588-454A-A7F5-93C9D815393A}" 9 | EndProject 10 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "GarLoader.Core.Gui", "..\GarLoader.Core.Gui\GarLoader.Core.Gui.csproj", "{8D3268DC-FF3D-4F92-8AA7-07DA64043889}" 11 | EndProject 12 | Global 13 | GlobalSection(SolutionConfigurationPlatforms) = preSolution 14 | Debug|Any CPU = Debug|Any CPU 15 | Release|Any CPU = Release|Any CPU 16 | EndGlobalSection 17 | GlobalSection(ProjectConfigurationPlatforms) = postSolution 18 | {A9725F76-83A2-4342-9B51-14277890B064}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 19 | {A9725F76-83A2-4342-9B51-14277890B064}.Debug|Any CPU.Build.0 = Debug|Any CPU 20 | {A9725F76-83A2-4342-9B51-14277890B064}.Release|Any CPU.ActiveCfg = Release|Any CPU 21 | {A9725F76-83A2-4342-9B51-14277890B064}.Release|Any CPU.Build.0 = Release|Any CPU 22 | {F75B06E2-A588-454A-A7F5-93C9D815393A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 23 | {F75B06E2-A588-454A-A7F5-93C9D815393A}.Debug|Any CPU.Build.0 = Debug|Any CPU 24 | {F75B06E2-A588-454A-A7F5-93C9D815393A}.Release|Any CPU.ActiveCfg = Release|Any CPU 25 | {F75B06E2-A588-454A-A7F5-93C9D815393A}.Release|Any CPU.Build.0 = Release|Any CPU 26 | {8D3268DC-FF3D-4F92-8AA7-07DA64043889}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 27 | {8D3268DC-FF3D-4F92-8AA7-07DA64043889}.Debug|Any CPU.Build.0 = Debug|Any CPU 28 | {8D3268DC-FF3D-4F92-8AA7-07DA64043889}.Release|Any CPU.ActiveCfg = Release|Any CPU 29 | {8D3268DC-FF3D-4F92-8AA7-07DA64043889}.Release|Any CPU.Build.0 = Release|Any CPU 30 | EndGlobalSection 31 | GlobalSection(SolutionProperties) = preSolution 32 | HideSolutionNode = FALSE 33 | EndGlobalSection 34 | GlobalSection(ExtensibilityGlobals) = postSolution 35 | SolutionGuid = {2217A55D-2603-4105-9CD7-C7F78876D180} 36 | EndGlobalSection 37 | EndGlobal 38 | -------------------------------------------------------------------------------- /GarLoader.Core.Lib/GetTablesNames.cs: -------------------------------------------------------------------------------- 1 | using System.Collections.Generic; 2 | using System.IO; 3 | using System.Linq; 4 | using System.Text.RegularExpressions; 5 | 6 | namespace GarLoader.Core.Lib 7 | { 8 | public class GetTablesNames 9 | { 10 | public static Dictionary GetTables(string XsdPath) 11 | { 12 | Dictionary FilesTables = new Dictionary(); 13 | List xsdFiles = Directory. 14 | GetFiles(XsdPath, "*.xsd", 15 | SearchOption.TopDirectoryOnly).ToList(); 16 | 17 | foreach (string _filePath in xsdFiles) 18 | { 19 | string fileName = Path.GetFileNameWithoutExtension(_filePath); 20 | string fileNameWOnumbers = Regex.Replace(fileName, @"[\d-]", string.Empty); 21 | string tableName = Regex.Replace(fileNameWOnumbers, @"([_])\1+", string.Empty).ToLower(); 22 | FilesTables.Add(_filePath, tableName); 23 | } 24 | return FilesTables; 25 | } 26 | 27 | public static string GetTableName(string XsdPath) 28 | { 29 | string fileName = Path.GetFileNameWithoutExtension(XsdPath); 30 | string fileNameWOnumbers = Regex.Replace(fileName, @"[\d-]", string.Empty); 31 | string tableName = Regex.Replace(fileNameWOnumbers, @"([_])\1+", string.Empty).ToLower(); 32 | return tableName; 33 | } 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /GarLoader.Core.Lib/ProccessXSD.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | using System.Xml; 5 | 6 | namespace GarLoader.Core.Lib 7 | { 8 | public class ProccessXSD 9 | { 10 | public TableDefinition XSDToTableDefinition(string XsdPath, string schemaName = "fias") 11 | { 12 | string _tableName = GetTablesNames.GetTableName(XsdPath); 13 | return XSDToTableDefinition(XsdPath, _tableName, schemaName); 14 | } 15 | private TableDefinition XSDToTableDefinition(string XsdPath, 16 | string TableName, string schemaName = "fias") 17 | { 18 | XmlDocument doc = new(); 19 | doc.Load(XsdPath); 20 | XmlNamespaceManager nsMan = new(doc.NameTable); 21 | nsMan.AddNamespace("xs", "http://www.w3.org/2001/XMLSchema"); 22 | 23 | string tableComment; 24 | try 25 | { 26 | tableComment = doc. 27 | SelectSingleNode("xs:schema/xs:element/xs:complexType/xs:sequence/xs:element/xs:annotation/xs:documentation", nsMan). 28 | InnerText; 29 | } 30 | catch (Exception q) 31 | { 32 | tableComment = q.Message; 33 | } 34 | 35 | TableDefinition table = new(schemaName.ToLower(), TableName.ToLower(), 36 | tableComment); 37 | 38 | XmlNodeList xsdColumns = doc.SelectNodes(".//xs:attribute", nsMan); 39 | 40 | List typesConversion = (new XSD2PGTypes()).Types; 41 | 42 | // Список столбцов 43 | for (int i = 0; i <= xsdColumns.Count - 1; i++) 44 | { 45 | XmlNode _c = xsdColumns[i]; 46 | string colName = _c.SelectSingleNode("@name", nsMan).Value.ToLower(); 47 | string colComment = _c.SelectSingleNode("xs:annotation/xs:documentation", nsMan). 48 | InnerText; 49 | string xsdcolType; 50 | XmlNode requiredNode = _c.SelectSingleNode("@use"); 51 | bool required = requiredNode != null && requiredNode.Value == "Required"; 52 | XmlNode xsdcolTypeNode = _c.SelectSingleNode("@type|xs:simpleType/xs:restriction/@base", 53 | nsMan); 54 | xsdcolType = xsdcolTypeNode != null ? xsdcolTypeNode.Value : "xs:string"; 55 | 56 | #if DEBUG 57 | Console.WriteLine(xsdcolType); 58 | #endif 59 | XSD2PGTypes.XSD2PGType columnType; 60 | 61 | #region "GUID костыль" 62 | if (colComment.Contains("UUID") || colComment.Contains("GUID")) 63 | { 64 | columnType = typesConversion.Where(x => x.netType == typeof(Guid)).Single(); 65 | } 66 | else 67 | { 68 | columnType = typesConversion.Where(x => x.xsdType == xsdcolType).Single(); 69 | } 70 | #endregion 71 | 72 | NpgsqlTypes.NpgsqlDbType npgSqlType = columnType.NpgsqlDbType; 73 | 74 | table.Columns.Add(new(colName, columnType, colComment, required)); 75 | } 76 | return table; 77 | } 78 | } 79 | } 80 | -------------------------------------------------------------------------------- /GarLoader.Core.Lib/TableDefinition.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | using static GarLoader.Core.Lib.XSD2PGTypes; 5 | 6 | namespace GarLoader.Core.Lib 7 | { 8 | public class TableDefinition 9 | { 10 | /// 11 | /// Комментарий таблицы 12 | /// 13 | string Comment { get; } 14 | 15 | /// 16 | /// Имя схемы 17 | /// 18 | public string SchemaName { get; } 19 | 20 | /// 21 | /// Имя таблицы 22 | /// 23 | public string TableName { get; } 24 | 25 | /// 26 | /// Колонки 27 | /// 28 | public List Columns; 29 | 30 | public TableDefinition(string schemaName, string tableName, string comment = null) 31 | { 32 | TableName = tableName; 33 | Comment = comment; 34 | SchemaName = schemaName; 35 | Columns = new List(); 36 | } 37 | 38 | /// 39 | /// SQL скрипт комментария таблицы 40 | /// 41 | public string SQLtableComment => string.Format("COMMENT ON TABLE {0}.{1} IS '{2}';", SchemaName, TableName, Comment); 42 | 43 | /// 44 | /// SQL создания колонок 45 | /// 46 | public string SQLcolumns => string.Join(",", Columns.Select(x => x.SQLcolumn).ToArray()); 47 | 48 | /// 49 | /// SQL комментариев колонок 50 | /// 51 | public string SQLcolumnsComment => string.Join(Environment.NewLine, Columns.Select(x => x.SQLcolumnComment(SchemaName, TableName)).ToArray()); 52 | 53 | /// 54 | /// Полный SQL скрипт таблицы 55 | /// 56 | /// 57 | public string SQLtable() 58 | { 59 | string template = "CREATE SCHEMA IF NOT EXISTS {2}; CREATE TABLE {2}.{1} ({0});"; 60 | return string.Format(template, SQLcolumns, TableName, SchemaName) + SQLcolumnsComment + SQLtableComment; 61 | } 62 | } 63 | 64 | public class ColumnDefinition 65 | { 66 | /// 67 | /// Имя колонки 68 | /// 69 | public string ColumnName { get; } 70 | 71 | /// 72 | /// PostgreSQL тип колонки 73 | /// 74 | public string ColumnType { get; } 75 | 76 | /// 77 | /// Комментарий 78 | /// 79 | string Comment { get; } 80 | 81 | /// 82 | /// NOT NULL 83 | /// 84 | public bool Required { get; } = false; 85 | 86 | /// 87 | /// Npgsql тип 88 | /// 89 | public NpgsqlTypes.NpgsqlDbType NpgsqlDbType { get; } 90 | 91 | public Type NetType { get; } 92 | 93 | public ColumnDefinition(string columnName, XSD2PGType xSD2PGType, 94 | string comment = null, bool required = false) 95 | { 96 | ColumnName = columnName; 97 | Comment = comment; 98 | Required = required; 99 | NetType = xSD2PGType.netType; 100 | ColumnType = xSD2PGType.pgType; 101 | NpgsqlDbType = xSD2PGType.NpgsqlDbType; 102 | } 103 | 104 | public string SQLcolumn => DBcolumn + " " + ColumnType + (Required ? " NOT NULL" : "") ; 105 | 106 | /// 107 | /// Имя колонки в БД 108 | /// 109 | public string DBcolumn 110 | { 111 | get 112 | { 113 | if (ColumnName == "desc") 114 | { 115 | return (char)34 + ColumnName + (char)34; 116 | } 117 | else 118 | { 119 | return ColumnName; 120 | } 121 | } 122 | } 123 | 124 | /// 125 | /// SQL скрип комментария для колонки 126 | /// 127 | /// Имя схемы 128 | /// Имя таблицы 129 | /// 130 | public string SQLcolumnComment(string schemaName, string tableName) 131 | { 132 | return string.Format("COMMENT ON COLUMN {0}.{1}.{2} IS '{3}';", schemaName, tableName, ColumnName, Comment); 133 | } 134 | } 135 | } -------------------------------------------------------------------------------- /GarLoader.Core.Lib/WriteData.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using NpgsqlTypes; 4 | using System.Linq; 5 | using System.Threading; 6 | 7 | namespace GarLoader.Core.Lib 8 | { 9 | public class WriteData 10 | { 11 | TableDefinition tableDefinition; 12 | private Npgsql.NpgsqlConnection _conn; 13 | Npgsql.NpgsqlBinaryImporter _wrt; 14 | int bulkSize; 15 | string _dbTableName, _dbColumns, xmlFile; 16 | public int percentage; 17 | string ConnectionString; 18 | private readonly Action logger; 19 | public WriteData(TableDefinition TableDefinition, 20 | string InputXml, 21 | string connString, 22 | int BulkSize = 50000, 23 | Action loggerAction = null) 24 | { 25 | tableDefinition = TableDefinition; 26 | ConnectionString = connString; 27 | logger = loggerAction; 28 | // Задаю соединение 29 | _conn = new Npgsql.NpgsqlConnection(ConnectionString); 30 | _conn.Open(); 31 | 32 | // Открываем операцию копирования 33 | _dbTableName = tableDefinition.SchemaName + "." + tableDefinition.TableName; 34 | Console.WriteLine(tableDefinition.SchemaName); 35 | _dbColumns = string.Join(",", tableDefinition.Columns.Select(c => c.DBcolumn).ToArray()); 36 | string copyCommand = string.Format("COPY {0} ({1}) FROM STDIN (FORMAT BINARY)", _dbTableName, _dbColumns); 37 | _wrt = _conn.BeginBinaryImport(copyCommand); 38 | xmlFile = InputXml; 39 | 40 | bulkSize = BulkSize; 41 | } 42 | 43 | public async System.Threading.Tasks.Task ReadXmlAsync(Action percentProgress) 44 | { 45 | string xmlPath = xmlFile; 46 | 47 | // Счетчик элементов 48 | int i = 0; 49 | 50 | // Инициализация XMLReader 51 | System.IO.FileStream sr = new System.IO.FileStream(xmlPath, System.IO.FileMode.Open, System.IO.FileAccess.Read); 52 | System.Xml.XmlReaderSettings _settings = new System.Xml.XmlReaderSettings() { Async = true }; 53 | System.Xml.XmlReader rdr = System.Xml.XmlReader.Create(sr, _settings); 54 | long lastPosition = 0; 55 | while (await rdr.ReadAsync()) 56 | { 57 | rdr.MoveToContent(); 58 | 59 | // Новая строка 60 | BulkData _pair = new BulkData(tableDefinition); 61 | 62 | // Чтение элемента 63 | while (rdr.MoveToNextAttribute()) 64 | { 65 | 66 | if (rdr.NodeType == System.Xml.XmlNodeType.Attribute) 67 | _pair.InsertCell(rdr.Name.ToLower(), rdr.Value); 68 | } 69 | i += 1; 70 | 71 | percentage = (int)Math.Round((double)(sr.Position / sr.Length), 2) * 100; 72 | 73 | if (lastPosition != sr.Position) 74 | { 75 | lastPosition = sr.Position; 76 | 77 | percentage = (int)(100.0 * lastPosition / sr.Length); 78 | percentProgress(percentage); 79 | } 80 | 81 | // Вставка 82 | CancellationTokenSource source = new CancellationTokenSource(); 83 | CancellationToken token = source.Token; 84 | 85 | //Changed from NpgsqlBinaryImporter.WriteRow to Write 86 | if (_pair.HasData && _pair.IsValid) 87 | { 88 | await _wrt.StartRowAsync(token); 89 | var columns = _pair.GetColumns(); 90 | foreach (var column in columns) 91 | { 92 | if (column.Item2 == null) 93 | { 94 | await _wrt.WriteNullAsync(token); 95 | } 96 | else 97 | { 98 | await _wrt.WriteAsync(column.Item1, column.Item2.Value, token); 99 | } 100 | } 101 | } 102 | 103 | if (!_pair.IsValid && logger != null) logger. 104 | Invoke($"В данных для таблицы {tableDefinition.TableName} " + 105 | $"присутствует строка с обязательным, " + 106 | $"но пустым значением. " + 107 | $"Строка содержит {_pair.GetColumns(). 108 | Select(val => val.Item1.ToString())} "); 109 | 110 | 111 | //Проверяем достигнут ли максимальный размер списка 112 | if (i == bulkSize) 113 | { 114 | await _wrt.CompleteAsync(); 115 | await _wrt.CloseAsync(); 116 | i = 0; 117 | _wrt = _conn.BeginBinaryImport(string.Format("COPY {0} ({1}) FROM STDIN (FORMAT BINARY)", _dbTableName, _dbColumns)); 118 | if (percentProgress != null) 119 | { 120 | percentProgress(percentage); 121 | } 122 | } 123 | } 124 | 125 | await _wrt.CompleteAsync(); 126 | if (percentProgress != null) 127 | { 128 | percentProgress(percentage); 129 | } 130 | await _wrt.CloseAsync(); 131 | await _conn.CloseAsync(); 132 | } 133 | 134 | class BulkData 135 | { 136 | TableDefinition tableDefinition; 137 | public List Data { get; } 138 | 139 | /// 140 | /// Проверка если колонка NOT NULL но при этом в XML отсутствует значение 141 | /// 142 | public bool IsValid { get; private set; } = true; 143 | 144 | public bool HasData => Data.Count > 0; 145 | public BulkData(TableDefinition TableDefinition) 146 | { 147 | Data = new List(); 148 | tableDefinition = TableDefinition; 149 | } 150 | 151 | public void InsertCell(string ColumnName, object Value) 152 | { 153 | var columnDefinition = tableDefinition.Columns. 154 | Where(y => y.ColumnName == ColumnName).FirstOrDefault(); 155 | 156 | Type targetNetType = columnDefinition.NetType; 157 | 158 | object targetValue = null; 159 | 160 | if (Value != null && Value.ToString().Length > 0) 161 | { 162 | targetValue = Commons.ChangeType(Value, targetNetType); 163 | } 164 | 165 | if (Value == null && columnDefinition.Required) IsValid = false; 166 | 167 | Data.Add(new BulkRecord(ColumnName, targetValue, columnDefinition.NpgsqlDbType)); 168 | } 169 | 170 | public IEnumerable> GetColumns() 171 | { 172 | List> items = new(); 173 | foreach (ColumnDefinition columnDefinition in tableDefinition.Columns) 174 | { 175 | var column = Data.Where(data => data.ColumnName == 176 | columnDefinition.ColumnName); 177 | if (column.Count() > 0) 178 | { 179 | object objectValue = column.FirstOrDefault().ObjectValue; 180 | 181 | NpgsqlDbType npgsqlDbType = columnDefinition.NpgsqlDbType; 182 | items.Add(new(objectValue, npgsqlDbType)); 183 | } 184 | else 185 | { 186 | items.Add(new(null, null)); 187 | } 188 | } 189 | return items; 190 | } 191 | } 192 | 193 | class BulkRecord 194 | { 195 | public string ColumnName { get; set; } 196 | 197 | public object ObjectValue { get; set; } 198 | 199 | public NpgsqlDbType NpgsqlDbType { get; set; } 200 | 201 | public BulkRecord(string columnName, object value, NpgsqlDbType npgsqlDbType) 202 | { 203 | ColumnName = columnName; 204 | ObjectValue = value; 205 | NpgsqlDbType = npgsqlDbType; 206 | } 207 | } 208 | } 209 | } -------------------------------------------------------------------------------- /GarLoader.Core.Lib/XSD2PGTypes.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using NpgsqlTypes; 4 | 5 | namespace GarLoader.Core.Lib 6 | { 7 | public class XSD2PGTypes 8 | { 9 | public List Types = new List(); 10 | public XSD2PGTypes() 11 | { 12 | Types.Add(new XSD2PGType("xs:string", typeof(string), "text", NpgsqlDbType.Text)); 13 | Types.Add(new XSD2PGType("xs:none", typeof(Guid), "uuid", NpgsqlDbType.Uuid)); 14 | Types.Add(new XSD2PGType("xs:date", typeof(DateTime), "date", NpgsqlDbType.Date)); 15 | Types.Add(new XSD2PGType("xs:integer", typeof(Int32), "integer", NpgsqlDbType.Integer)); 16 | Types.Add(new XSD2PGType("xs:byte", typeof(short), "smallint", NpgsqlDbType.Smallint)); 17 | Types.Add(new XSD2PGType("xs:int", typeof(Int32), "integer", NpgsqlDbType.Integer)); 18 | Types.Add(new XSD2PGType("xs:boolean", typeof(bool), "boolean", NpgsqlDbType.Boolean)); 19 | Types.Add(new XSD2PGType("xs:long", typeof(Int64), "bigint", NpgsqlDbType.Bigint)); 20 | } 21 | 22 | public class XSD2PGType 23 | { 24 | public string xsdType; 25 | 26 | public Type netType; 27 | 28 | public string pgType; 29 | 30 | public NpgsqlDbType NpgsqlDbType; 31 | public XSD2PGType(string _xsdType, 32 | Type _netType, 33 | string _pgType, 34 | NpgsqlDbType npgsqlDbType) 35 | { 36 | xsdType = _xsdType; 37 | netType = _netType; 38 | pgType = _pgType; 39 | NpgsqlDbType = npgsqlDbType; 40 | } 41 | } 42 | } 43 | 44 | 45 | } 46 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # GarLoader 2 | Простой загрузчик сведений ФИАС в формате ГАР в PostgreSQL. 3 | Ввод строки подключения в форме и название схемы (по умолчанию fias). 4 | Сведения о структуре берутся из XSD схем ФНС, далее в таблицы вносятся все найденные XML ГАР 5 | --------------------------------------------------------------------------------