├── .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 |
--------------------------------------------------------------------------------