forked from philip-stoev/RQG
-
Notifications
You must be signed in to change notification settings - Fork 1
/
gensql.pl
executable file
·122 lines (104 loc) · 3.37 KB
/
gensql.pl
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
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
#!/usr/bin/perl
# Copyright (C) 2008-2009 Sun Microsystems, Inc. All rights reserved.
# Use is subject to license terms.
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; version 2 of the License.
#
# This program is distributed in the hope that it will be useful, but
# WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
# General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301
# USA
use lib 'lib';
use lib "$ENV{RQG_HOME}/lib";
use strict;
use GenTest;
use GenTest::Constants;
use GenTest::Properties;
use GenTest::Generator::FromGrammar;
use GenTest::Executor;
use Getopt::Long;
my $DEFAULT_QUERIES = 1000;
my @ARGV_saved = @ARGV;
my $options = {};
my $opt_result = GetOptions($options,
'config=s',
'grammar=s',
'queries=i',
'help',
'seed=s',
'mask=i',
'mask-level=i',
'dsn=s',
'starting-rule=s');
help() if !$opt_result;
my $config = GenTest::Properties->new(options => $options,
defaults => {seed => 1,
queries=> $DEFAULT_QUERIES},
legal => ['config',
'queries',
'help',
'seed',
'mask',
'mask-level',
'dsn',
'starting-rule'],
required => ['grammar'],
help => \&help);
my $seed = $config->seed;
if ($seed eq 'time') {
$seed = time();
say("Converting --seed=time to --seed=$seed");
}
my $generator = GenTest::Generator::FromGrammar->new(
grammar_file => $config->grammar,
seed => $seed,
mask => $config->mask,
mask_level => $config->property('mask-level'),
starting_rule => $config->property('starting-rule')
);
return STATUS_ENVIRONMENT_FAILURE if not defined $generator;
my $executor;
if (defined $config->dsn) {
$executor = GenTest::Executor->newFromDSN($config->dsn);
exit (STATUS_ENVIRONMENT_FAILURE) if not defined $executor;
}
if (defined $executor) {
my $init_result = $executor->init();
exit ($init_result) if $init_result > STATUS_OK;
$executor->cacheMetaData();
}
foreach my $i (1..$config->queries) {
my $queries = $generator->next([$executor]);
if (
(not defined $queries) ||
($queries->[0] eq '')
) {
say("Grammar produced an empty query. Terminating.");
exit(STATUS_ENVIRONMENT_FAILURE);
}
my $sql = join('; ',@$queries);
print $sql.";\n";
}
exit(0);
sub help {
print <<EOF
$0 - Generate random queries from an SQL grammar and pipe them to STDOUT
--grammar : Grammar file to use for generating the queries (REQUIRED);
--starting-rule: Custom starting rule for generating queries
--seed : Seed for the pseudo-random generator
--queries : Numer of queries to generate (default $DEFAULT_QUERIES);
--dsn : The DSN of the database that will be used to resolve rules such as _table , _field
--mask : A seed to a random mask used to mask (reeduce) the grammar.
--mask-level: How many levels deep the mask is applied (default 1)
--help : This help message
EOF
;
exit(1);
}