author | František Kučera <franta-hg@frantovo.cz> |
Sat, 14 Dec 2019 14:00:36 +0100 | |
branch | v_0 |
changeset 24 | 884ece10575d |
parent 16 | 3c51a2c32c86 |
child 34 | 24c05e69d68f |
permissions | -rw-r--r-- |
0 | 1 |
/** |
2 |
* Relational pipes |
|
3 |
* Copyright © 2019 František Kučera (Frantovo.cz, GlobalCode.info) |
|
4 |
* |
|
5 |
* This program is free software: you can redistribute it and/or modify |
|
6 |
* it under the terms of the GNU General Public License as published by |
|
10
7da7173d84b0
fix license version: GNU GPLv3
František Kučera <franta-hg@frantovo.cz>
parents:
5
diff
changeset
|
7 |
* the Free Software Foundation, version 3. |
0 | 8 |
* |
9 |
* This program is distributed in the hope that it will be useful, |
|
10 |
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
11 |
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|
12 |
* GNU General Public License for more details. |
|
13 |
* |
|
14 |
* You should have received a copy of the GNU General Public License |
|
15 |
* along with this program. If not, see <http://www.gnu.org/licenses/>. |
|
16 |
*/ |
|
17 |
#pragma once |
|
18 |
||
19 |
#include <relpipe/writer/AttributeMetadata.h> |
|
20 |
#include <relpipe/writer/typedefs.h> |
|
21 |
||
22 |
namespace relpipe { |
|
23 |
namespace tr { |
|
24 |
namespace sql { |
|
25 |
||
2
362f2689cb87
configuration and CLI parser
František Kučera <franta-hg@frantovo.cz>
parents:
0
diff
changeset
|
26 |
class Parameter { |
0 | 27 |
public: |
28 |
||
29 |
relpipe::writer::string_t value; |
|
2
362f2689cb87
configuration and CLI parser
František Kučera <franta-hg@frantovo.cz>
parents:
0
diff
changeset
|
30 |
// TODO: relpipe::writer::TypeId type; |
0 | 31 |
}; |
32 |
||
24
884ece10575d
add --type-cast to allow explicit specification of type for given output attributes
František Kučera <franta-hg@frantovo.cz>
parents:
16
diff
changeset
|
33 |
class TypeCast { |
884ece10575d
add --type-cast to allow explicit specification of type for given output attributes
František Kučera <franta-hg@frantovo.cz>
parents:
16
diff
changeset
|
34 |
public: |
884ece10575d
add --type-cast to allow explicit specification of type for given output attributes
František Kučera <franta-hg@frantovo.cz>
parents:
16
diff
changeset
|
35 |
|
884ece10575d
add --type-cast to allow explicit specification of type for given output attributes
František Kučera <franta-hg@frantovo.cz>
parents:
16
diff
changeset
|
36 |
relpipe::writer::string_t name; |
884ece10575d
add --type-cast to allow explicit specification of type for given output attributes
František Kučera <franta-hg@frantovo.cz>
parents:
16
diff
changeset
|
37 |
relpipe::writer::string_t type; |
884ece10575d
add --type-cast to allow explicit specification of type for given output attributes
František Kučera <franta-hg@frantovo.cz>
parents:
16
diff
changeset
|
38 |
}; |
884ece10575d
add --type-cast to allow explicit specification of type for given output attributes
František Kučera <franta-hg@frantovo.cz>
parents:
16
diff
changeset
|
39 |
|
2
362f2689cb87
configuration and CLI parser
František Kučera <franta-hg@frantovo.cz>
parents:
0
diff
changeset
|
40 |
class Statement { |
0 | 41 |
public: |
42 |
||
2
362f2689cb87
configuration and CLI parser
František Kučera <franta-hg@frantovo.cz>
parents:
0
diff
changeset
|
43 |
virtual ~Statement() { |
0 | 44 |
} |
45 |
||
46 |
/** |
|
2
362f2689cb87
configuration and CLI parser
František Kučera <franta-hg@frantovo.cz>
parents:
0
diff
changeset
|
47 |
* output relation name; |
362f2689cb87
configuration and CLI parser
František Kučera <franta-hg@frantovo.cz>
parents:
0
diff
changeset
|
48 |
* if empty, the SQL code (DML, DDL) will be executed, but no relational output will be generated |
0 | 49 |
*/ |
2
362f2689cb87
configuration and CLI parser
František Kučera <franta-hg@frantovo.cz>
parents:
0
diff
changeset
|
50 |
relpipe::writer::string_t relation; |
0 | 51 |
/** |
2
362f2689cb87
configuration and CLI parser
František Kučera <franta-hg@frantovo.cz>
parents:
0
diff
changeset
|
52 |
* SQL code, usually some SELECT; |
362f2689cb87
configuration and CLI parser
František Kučera <franta-hg@frantovo.cz>
parents:
0
diff
changeset
|
53 |
* might be also DML or DDL |
0 | 54 |
*/ |
2
362f2689cb87
configuration and CLI parser
František Kučera <franta-hg@frantovo.cz>
parents:
0
diff
changeset
|
55 |
relpipe::writer::string_t sql; |
24
884ece10575d
add --type-cast to allow explicit specification of type for given output attributes
František Kučera <franta-hg@frantovo.cz>
parents:
16
diff
changeset
|
56 |
/** |
884ece10575d
add --type-cast to allow explicit specification of type for given output attributes
František Kučera <franta-hg@frantovo.cz>
parents:
16
diff
changeset
|
57 |
* Explicitly defined types of particular attributes. |
884ece10575d
add --type-cast to allow explicit specification of type for given output attributes
František Kučera <franta-hg@frantovo.cz>
parents:
16
diff
changeset
|
58 |
* SQLite uses dynamic typing, so it is often impossible to obtain the proper types from the result set. |
884ece10575d
add --type-cast to allow explicit specification of type for given output attributes
František Kučera <franta-hg@frantovo.cz>
parents:
16
diff
changeset
|
59 |
*/ |
884ece10575d
add --type-cast to allow explicit specification of type for given output attributes
František Kučera <franta-hg@frantovo.cz>
parents:
16
diff
changeset
|
60 |
std::vector<TypeCast> typeCasts; |
884ece10575d
add --type-cast to allow explicit specification of type for given output attributes
František Kučera <franta-hg@frantovo.cz>
parents:
16
diff
changeset
|
61 |
/** |
884ece10575d
add --type-cast to allow explicit specification of type for given output attributes
František Kučera <franta-hg@frantovo.cz>
parents:
16
diff
changeset
|
62 |
* Query parameters |
884ece10575d
add --type-cast to allow explicit specification of type for given output attributes
František Kučera <franta-hg@frantovo.cz>
parents:
16
diff
changeset
|
63 |
*/ |
2
362f2689cb87
configuration and CLI parser
František Kučera <franta-hg@frantovo.cz>
parents:
0
diff
changeset
|
64 |
std::vector<Parameter> parameters; |
0 | 65 |
}; |
66 |
||
12
0b38339b871b
improve --keep-file option: default is auto = file will be kept, if it was present before the transformation
František Kučera <franta-hg@frantovo.cz>
parents:
10
diff
changeset
|
67 |
enum class KeepFile { |
0b38339b871b
improve --keep-file option: default is auto = file will be kept, if it was present before the transformation
František Kučera <franta-hg@frantovo.cz>
parents:
10
diff
changeset
|
68 |
/** The file will be kept even if it was created during this transformation, so all the input data will stay on the disk. */ |
0b38339b871b
improve --keep-file option: default is auto = file will be kept, if it was present before the transformation
František Kučera <franta-hg@frantovo.cz>
parents:
10
diff
changeset
|
69 |
Always, |
0b38339b871b
improve --keep-file option: default is auto = file will be kept, if it was present before the transformation
František Kučera <franta-hg@frantovo.cz>
parents:
10
diff
changeset
|
70 |
/** The file will be deleted at the end of this transformation – even if the file already existed. This is potentially dangerous, because we can unintentionally delete a database file. */ |
0b38339b871b
improve --keep-file option: default is auto = file will be kept, if it was present before the transformation
František Kučera <franta-hg@frantovo.cz>
parents:
10
diff
changeset
|
71 |
Never, |
0b38339b871b
improve --keep-file option: default is auto = file will be kept, if it was present before the transformation
František Kučera <franta-hg@frantovo.cz>
parents:
10
diff
changeset
|
72 |
/** The file will be kept only if it was already present before the transformation. */ |
0b38339b871b
improve --keep-file option: default is auto = file will be kept, if it was present before the transformation
František Kučera <franta-hg@frantovo.cz>
parents:
10
diff
changeset
|
73 |
Automatic |
0b38339b871b
improve --keep-file option: default is auto = file will be kept, if it was present before the transformation
František Kučera <franta-hg@frantovo.cz>
parents:
10
diff
changeset
|
74 |
}; |
0b38339b871b
improve --keep-file option: default is auto = file will be kept, if it was present before the transformation
František Kučera <franta-hg@frantovo.cz>
parents:
10
diff
changeset
|
75 |
|
16
3c51a2c32c86
rename --dump to --copy + add option --copy-renamed + allow multiple copy/copy-renamed commands
František Kučera <franta-hg@frantovo.cz>
parents:
15
diff
changeset
|
76 |
/** |
3c51a2c32c86
rename --dump to --copy + add option --copy-renamed + allow multiple copy/copy-renamed commands
František Kučera <franta-hg@frantovo.cz>
parents:
15
diff
changeset
|
77 |
* Allows copying relations from the input stream to the output stream. |
3c51a2c32c86
rename --dump to --copy + add option --copy-renamed + allow multiple copy/copy-renamed commands
František Kučera <franta-hg@frantovo.cz>
parents:
15
diff
changeset
|
78 |
* Such relations are specified by a regular expression. |
3c51a2c32c86
rename --dump to --copy + add option --copy-renamed + allow multiple copy/copy-renamed commands
František Kučera <franta-hg@frantovo.cz>
parents:
15
diff
changeset
|
79 |
* We can also specify the regex replacement string and rename such relations. |
3c51a2c32c86
rename --dump to --copy + add option --copy-renamed + allow multiple copy/copy-renamed commands
František Kučera <franta-hg@frantovo.cz>
parents:
15
diff
changeset
|
80 |
*/ |
3c51a2c32c86
rename --dump to --copy + add option --copy-renamed + allow multiple copy/copy-renamed commands
František Kučera <franta-hg@frantovo.cz>
parents:
15
diff
changeset
|
81 |
class CopyRelations { |
3c51a2c32c86
rename --dump to --copy + add option --copy-renamed + allow multiple copy/copy-renamed commands
František Kučera <franta-hg@frantovo.cz>
parents:
15
diff
changeset
|
82 |
public: |
3c51a2c32c86
rename --dump to --copy + add option --copy-renamed + allow multiple copy/copy-renamed commands
František Kučera <franta-hg@frantovo.cz>
parents:
15
diff
changeset
|
83 |
|
3c51a2c32c86
rename --dump to --copy + add option --copy-renamed + allow multiple copy/copy-renamed commands
František Kučera <franta-hg@frantovo.cz>
parents:
15
diff
changeset
|
84 |
CopyRelations(const relpipe::writer::string_t pattern, const relpipe::writer::string_t replacement, const relpipe::writer::boolean_t replace) : pattern(pattern), replacement(replacement), replace(replace) { |
3c51a2c32c86
rename --dump to --copy + add option --copy-renamed + allow multiple copy/copy-renamed commands
František Kučera <franta-hg@frantovo.cz>
parents:
15
diff
changeset
|
85 |
} |
3c51a2c32c86
rename --dump to --copy + add option --copy-renamed + allow multiple copy/copy-renamed commands
František Kučera <franta-hg@frantovo.cz>
parents:
15
diff
changeset
|
86 |
|
3c51a2c32c86
rename --dump to --copy + add option --copy-renamed + allow multiple copy/copy-renamed commands
František Kučera <franta-hg@frantovo.cz>
parents:
15
diff
changeset
|
87 |
virtual ~CopyRelations() { |
3c51a2c32c86
rename --dump to --copy + add option --copy-renamed + allow multiple copy/copy-renamed commands
František Kučera <franta-hg@frantovo.cz>
parents:
15
diff
changeset
|
88 |
} |
3c51a2c32c86
rename --dump to --copy + add option --copy-renamed + allow multiple copy/copy-renamed commands
František Kučera <franta-hg@frantovo.cz>
parents:
15
diff
changeset
|
89 |
|
3c51a2c32c86
rename --dump to --copy + add option --copy-renamed + allow multiple copy/copy-renamed commands
František Kučera <franta-hg@frantovo.cz>
parents:
15
diff
changeset
|
90 |
const relpipe::writer::string_t pattern; |
3c51a2c32c86
rename --dump to --copy + add option --copy-renamed + allow multiple copy/copy-renamed commands
František Kučera <franta-hg@frantovo.cz>
parents:
15
diff
changeset
|
91 |
const relpipe::writer::string_t replacement; |
3c51a2c32c86
rename --dump to --copy + add option --copy-renamed + allow multiple copy/copy-renamed commands
František Kučera <franta-hg@frantovo.cz>
parents:
15
diff
changeset
|
92 |
const relpipe::writer::boolean_t replace; |
3c51a2c32c86
rename --dump to --copy + add option --copy-renamed + allow multiple copy/copy-renamed commands
František Kučera <franta-hg@frantovo.cz>
parents:
15
diff
changeset
|
93 |
}; |
3c51a2c32c86
rename --dump to --copy + add option --copy-renamed + allow multiple copy/copy-renamed commands
František Kučera <franta-hg@frantovo.cz>
parents:
15
diff
changeset
|
94 |
|
0 | 95 |
class Configuration { |
96 |
public: |
|
97 |
||
5
cbc7817a3346
add option to create DB in a file and to keep that file
František Kučera <franta-hg@frantovo.cz>
parents:
2
diff
changeset
|
98 |
|
cbc7817a3346
add option to create DB in a file and to keep that file
František Kučera <franta-hg@frantovo.cz>
parents:
2
diff
changeset
|
99 |
/** |
cbc7817a3346
add option to create DB in a file and to keep that file
František Kučera <franta-hg@frantovo.cz>
parents:
2
diff
changeset
|
100 |
* By default, this transformation runs in-memory. |
cbc7817a3346
add option to create DB in a file and to keep that file
František Kučera <franta-hg@frantovo.cz>
parents:
2
diff
changeset
|
101 |
* If 'file' is not empty, this transformation will operate on an .sqlite file. |
cbc7817a3346
add option to create DB in a file and to keep that file
František Kučera <franta-hg@frantovo.cz>
parents:
2
diff
changeset
|
102 |
* The file will be created if it does not exist. |
cbc7817a3346
add option to create DB in a file and to keep that file
František Kučera <franta-hg@frantovo.cz>
parents:
2
diff
changeset
|
103 |
*/ |
cbc7817a3346
add option to create DB in a file and to keep that file
František Kučera <franta-hg@frantovo.cz>
parents:
2
diff
changeset
|
104 |
relpipe::writer::string_t file; |
cbc7817a3346
add option to create DB in a file and to keep that file
František Kučera <franta-hg@frantovo.cz>
parents:
2
diff
changeset
|
105 |
|
cbc7817a3346
add option to create DB in a file and to keep that file
František Kučera <franta-hg@frantovo.cz>
parents:
2
diff
changeset
|
106 |
/** |
12
0b38339b871b
improve --keep-file option: default is auto = file will be kept, if it was present before the transformation
František Kučera <franta-hg@frantovo.cz>
parents:
10
diff
changeset
|
107 |
* see KeepFile documentation |
5
cbc7817a3346
add option to create DB in a file and to keep that file
František Kučera <franta-hg@frantovo.cz>
parents:
2
diff
changeset
|
108 |
*/ |
12
0b38339b871b
improve --keep-file option: default is auto = file will be kept, if it was present before the transformation
František Kučera <franta-hg@frantovo.cz>
parents:
10
diff
changeset
|
109 |
KeepFile keepFile = KeepFile::Automatic; |
5
cbc7817a3346
add option to create DB in a file and to keep that file
František Kučera <franta-hg@frantovo.cz>
parents:
2
diff
changeset
|
110 |
|
2
362f2689cb87
configuration and CLI parser
František Kučera <franta-hg@frantovo.cz>
parents:
0
diff
changeset
|
111 |
std::vector<Statement> statements; |
15
0ecde5272f8e
process SQL input in the relpipe-in-sql mode
František Kučera <franta-hg@frantovo.cz>
parents:
14
diff
changeset
|
112 |
|
0ecde5272f8e
process SQL input in the relpipe-in-sql mode
František Kučera <franta-hg@frantovo.cz>
parents:
14
diff
changeset
|
113 |
/** |
0ecde5272f8e
process SQL input in the relpipe-in-sql mode
František Kučera <franta-hg@frantovo.cz>
parents:
14
diff
changeset
|
114 |
* SQL script to be executed before the relational input. |
0ecde5272f8e
process SQL input in the relpipe-in-sql mode
František Kučera <franta-hg@frantovo.cz>
parents:
14
diff
changeset
|
115 |
*/ |
0ecde5272f8e
process SQL input in the relpipe-in-sql mode
František Kučera <franta-hg@frantovo.cz>
parents:
14
diff
changeset
|
116 |
std::wistream* sqlBeforeRelational = nullptr; |
16
3c51a2c32c86
rename --dump to --copy + add option --copy-renamed + allow multiple copy/copy-renamed commands
František Kučera <franta-hg@frantovo.cz>
parents:
15
diff
changeset
|
117 |
|
15
0ecde5272f8e
process SQL input in the relpipe-in-sql mode
František Kučera <franta-hg@frantovo.cz>
parents:
14
diff
changeset
|
118 |
/** |
0ecde5272f8e
process SQL input in the relpipe-in-sql mode
František Kučera <franta-hg@frantovo.cz>
parents:
14
diff
changeset
|
119 |
* SQL script to be executed after the relational input. |
0ecde5272f8e
process SQL input in the relpipe-in-sql mode
František Kučera <franta-hg@frantovo.cz>
parents:
14
diff
changeset
|
120 |
*/ |
0ecde5272f8e
process SQL input in the relpipe-in-sql mode
František Kučera <franta-hg@frantovo.cz>
parents:
14
diff
changeset
|
121 |
std::wistream* sqlAfterRelational = nullptr; |
0ecde5272f8e
process SQL input in the relpipe-in-sql mode
František Kučera <franta-hg@frantovo.cz>
parents:
14
diff
changeset
|
122 |
|
16
3c51a2c32c86
rename --dump to --copy + add option --copy-renamed + allow multiple copy/copy-renamed commands
František Kučera <franta-hg@frantovo.cz>
parents:
15
diff
changeset
|
123 |
std::vector<CopyRelations> copyRelations; |
0 | 124 |
|
125 |
virtual ~Configuration() { |
|
126 |
} |
|
127 |
}; |
|
128 |
||
129 |
} |
|
130 |
} |
|
2
362f2689cb87
configuration and CLI parser
František Kučera <franta-hg@frantovo.cz>
parents:
0
diff
changeset
|
131 |
} |