summaryrefslogtreecommitdiff
path: root/src/deck_io.adb
diff options
context:
space:
mode:
Diffstat (limited to 'src/deck_io.adb')
-rw-r--r--src/deck_io.adb74
1 files changed, 71 insertions, 3 deletions
diff --git a/src/deck_io.adb b/src/deck_io.adb
index c0dd38c..9e5b4b7 100644
--- a/src/deck_io.adb
+++ b/src/deck_io.adb
@@ -4,8 +4,10 @@ with
Ada.Characters.Latin_1,
Ada.Directories,
+ Ada.Strings.Fixed,
Ada.Strings.Maps,
Ada.Text_IO,
+ CSV,
GNAT.Regpat,
GNATCOLL.JSON,
UnZip;
@@ -20,6 +22,7 @@ package body Deck_IO is
package Latin renames Ada.Characters.Latin_1;
package FD renames Ada.Directories;
+ package Strfix renames Ada.Strings.Fixed;
package Strmap renames Ada.Strings.Maps;
package Pat renames GNAT.Regpat;
package JS renames GNATCOLL.JSON;
@@ -36,6 +39,21 @@ package body Deck_IO is
renames SU.To_String;
+ function To_Unbounded_String
+ (Item : in Field_ID)
+ return SU.Unbounded_String is
+ begin
+ return SU.Unbounded_String (Item);
+ end To_Unbounded_String;
+
+ function To_Unbounded_String
+ (Item : in Field)
+ return SU.Unbounded_String is
+ begin
+ return SU.Unbounded_String (Item);
+ end To_Unbounded_String;
+
+
procedure Finalize
@@ -299,29 +317,79 @@ package body Deck_IO is
Current_Note.Model := Model_ID (Raw_Model);
Tokenize_Fields (Statement.Column (1), Current_Note.Fields);
Notes.Append (Current_Note);
+ Current_Note.Fields.Clear;
end loop;
end Query_Notes;
+ function Compose_Name
+ (Directory : in String;
+ Basename : in String;
+ Extension : in String;
+ Model_Num : in Positive)
+ return SU.Unbounded_String
+ is
+ Result : SU.Unbounded_String := +FD.Compose (Directory, Basename);
+ begin
+ if Model_Num > 1 then
+ SU.Append (Result, "-" & Strfix.Trim (Integer'Image (Model_Num), Ada.Strings.Left));
+ end if;
+ SU.Append (Result, "." & Extension);
+ return Result;
+ end Compose_Name;
+
+
+
+
procedure Write_CSV
(Directory : in String;
Basename : in String;
Models : in Model_Maps.Map;
- Notes : in Note_Vectors.Vector)
+ Notes : in Note_Vectors.Vector;
+ Overwrite : in Boolean := False)
is
+ package My_CSV is new CSV;
+ procedure Put_Header is new My_CSV.Put_Row (Field_Ordinal, Field_ID, Field_ID_Vectors);
+ procedure Put_Row is new My_CSV.Put_Row (Field_Ordinal, Field, Field_Vectors);
+
+ Counter : Positive := 1;
+ Outname : SU.Unbounded_String;
+ File_Handle : File_Type;
+ Row_Size : Positive;
begin
- null;
+ for C in Models.Iterate loop
+ Outname := Compose_Name (Directory, Basename, "csv", Counter);
+ if FD.Exists (-Outname) then
+ if not Overwrite then
+ raise FD.Name_Error;
+ else
+ FD.Delete_File (-Outname);
+ end if;
+ end if;
+ Create (File_Handle, Out_File, -Outname);
+ Row_Size := Positive (Model_Maps.Element (C).Fields.Length);
+ Put_Header (File_Handle, Model_Maps.Element (C).Fields, Row_Size);
+ for N of Notes loop
+ if N.Model = Model_Maps.Key (C) then
+ Put_Row (File_Handle, N.Fields, Row_Size);
+ end if;
+ end loop;
+ Close (File_Handle);
+ end loop;
end Write_CSV;
+
+
procedure Write_FMD
(Directory : in String;
Basename : in String;
Models : in Model_Maps.Map;
Notes : in Note_Vectors.Vector;
- Media : in Media_Maps.Map)
+ Media : in Media_Maps.Map;
+ Overwrite : in Boolean := False)
is
begin
null;