annotate shelltools/query-pr/query.py @ 48:3d5adf5a59d0

Fix python2.7 syntax errors.
author David A. Holland
date Sat, 02 Apr 2022 18:05:27 -0400
parents bcd1d06838fd
children 4b7f0ee35994
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
7
c013fb703183 Empty placeholder scripts so the build will run.
David A. Holland
parents:
diff changeset
1 #!@PYTHON@
33
298c8a7f5181 begin hacking
David A. Holland
parents: 7
diff changeset
2
48
3d5adf5a59d0 Fix python2.7 syntax errors.
David A. Holland
parents: 47
diff changeset
3 import sys
33
298c8a7f5181 begin hacking
David A. Holland
parents: 7
diff changeset
4 import argparse
298c8a7f5181 begin hacking
David A. Holland
parents: 7
diff changeset
5 import psycopg2
298c8a7f5181 begin hacking
David A. Holland
parents: 7
diff changeset
6
298c8a7f5181 begin hacking
David A. Holland
parents: 7
diff changeset
7 program_description = """
298c8a7f5181 begin hacking
David A. Holland
parents: 7
diff changeset
8 Search for and retrieve problem reports.
298c8a7f5181 begin hacking
David A. Holland
parents: 7
diff changeset
9 """
298c8a7f5181 begin hacking
David A. Holland
parents: 7
diff changeset
10 program_version = "@VERSION@"
298c8a7f5181 begin hacking
David A. Holland
parents: 7
diff changeset
11
298c8a7f5181 begin hacking
David A. Holland
parents: 7
diff changeset
12 ############################################################
298c8a7f5181 begin hacking
David A. Holland
parents: 7
diff changeset
13 # settings
298c8a7f5181 begin hacking
David A. Holland
parents: 7
diff changeset
14
298c8a7f5181 begin hacking
David A. Holland
parents: 7
diff changeset
15 outfile = sys.stdout
298c8a7f5181 begin hacking
David A. Holland
parents: 7
diff changeset
16 outmaterial = "headers"
298c8a7f5181 begin hacking
David A. Holland
parents: 7
diff changeset
17 outformat = "text"
298c8a7f5181 begin hacking
David A. Holland
parents: 7
diff changeset
18
298c8a7f5181 begin hacking
David A. Holland
parents: 7
diff changeset
19 ############################################################
47
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
20 # database field access
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
21
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
22 #
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
23 # Fields of PRs that we might search are spread across a number of
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
24 # tables and require varying joins to get them. And, because of
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
25 # classication schemes, the set of fields isn't static and we can't
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
26 # just assemble a massive view with one column for each field.
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
27 #
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
28 # The QueryBuilder class knows how to arrange for all known fields to
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
29 # be present.
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
30 #
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
31
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
32 class QueryBuilder:
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
33 # these fields are in the PRs table
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
34 prtable_fields = [
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
35 "id", "synopsis", "confidential", "state", "locked",
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
36 "timeout_date", "timeout_state",
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
37 "arrival_schemaversion", "arrival_date", "modified_date",
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
38 "closed_date",
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
39 "release", "environment"
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
40 ]
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
41
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
42 # these fields are aliases for others
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
43 alias_fields = {
48
3d5adf5a59d0 Fix python2.7 syntax errors.
David A. Holland
parents: 47
diff changeset
44 "number" : "id",
3d5adf5a59d0 Fix python2.7 syntax errors.
David A. Holland
parents: 47
diff changeset
45 "date" : "arrival_date",
47
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
46 }
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
47
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
48 def __init__(self):
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
49 self.present = {}
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
50 self.joined = {}
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
51 self.fromitems = []
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
52 self.whereitems = []
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
53 self.order = None
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
54
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
55 def setorder(self, order):
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
56 self.order = order
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
57
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
58 # add to present{} and return the value for convenience (internal)
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
59 def makepresent(self, field, name):
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
60 self.present[field] = name
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
61 return name
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
62
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
63 # add a join item (once only) (internal)
48
3d5adf5a59d0 Fix python2.7 syntax errors.
David A. Holland
parents: 47
diff changeset
64 def addjoin(self, table, as_ = None):
3d5adf5a59d0 Fix python2.7 syntax errors.
David A. Holland
parents: 47
diff changeset
65 if as_ is not None:
3d5adf5a59d0 Fix python2.7 syntax errors.
David A. Holland
parents: 47
diff changeset
66 key = table + "-" + as_
3d5adf5a59d0 Fix python2.7 syntax errors.
David A. Holland
parents: 47
diff changeset
67 val = table + " AS " + as_
47
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
68 else:
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
69 key = table
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
70 val = table
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
71 if key not in self.joined:
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
72 self.joined[key] = True
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
73 self.fromitems.append(val)
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
74
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
75 # returns a sql expression for the field
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
76 def getfield(self, field):
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
77 # already-fetched fields
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
78 if field in self.present:
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
79 return self.present[field]
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
80
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
81 # aliases for other fields
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
82 if field in alias_fields:
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
83 return self.getfield(alias_fields[field])
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
84
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
85 # simple fields directly in the PRs table
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
86 if field in prtable_fields:
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
87 self.addjoin("PRs")
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
88 return self.makepresent(field, "PRs." + field)
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
89
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
90 # now it gets more interesting...
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
91 if field == "closed":
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
92 self.addjoin("PRs")
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
93 self.addjoin("states")
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
94 self.addwhere("PRs.state = states.name")
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
95 return self.makepresent(field, "states.closed")
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
96
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
97 # XXX let's pick one set of names and use them everywhere
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
98 # (e.g. change "posttime" in the schema to "message_date"
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
99 # or something)
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
100 if field == "comment_date" or field == "posttime":
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
101 self.addjoin("PRs")
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
102 self.addjoin("messages")
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
103 self.addwhere("PRs.id = messages.pr")
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
104 return self.makepresent(field, "messages.posttime")
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
105
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
106 if field == "comment" or field == "message" or field == "post":
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
107 self.addjoin("PRs")
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
108 self.addjoin("messages")
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
109 self.addwhere("PRs.id = messages.pr")
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
110 return self.makepresent(field, "messages.body")
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
111
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
112 if field == "attachment":
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
113 self.addjoin("PRs")
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
114 self.addjoin("messages")
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
115 self.addjoin("attachments")
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
116 self.addwhere("PRs.id = messages.pr")
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
117 self.addwhere("messages.id = attachments.msgid")
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
118 return self.makepresent(field, "attachments.body")
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
119
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
120 if field == "patch":
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
121 self.addjoin("PRs")
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
122 self.addjoin("messages")
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
123 self.addjoin("attachments", "patches")
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
124 self.addwhere("PRs.id = messages.pr")
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
125 self.addwhere("messages.id = patches.msgid")
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
126 self.addwhere("patches.mimetype = " +
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
127 "'application/x-patch'")
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
128 return self.makepresent(field, "patches.body")
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
129
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
130 if field == "mimetype":
48
3d5adf5a59d0 Fix python2.7 syntax errors.
David A. Holland
parents: 47
diff changeset
131 subquery = "((SELECT mtmessages1.pr as pr, " + \
3d5adf5a59d0 Fix python2.7 syntax errors.
David A. Holland
parents: 47
diff changeset
132 "mtmessages1.mimetype as mimetype " + \
3d5adf5a59d0 Fix python2.7 syntax errors.
David A. Holland
parents: 47
diff changeset
133 "FROM messages as mtmessages1) " + \
3d5adf5a59d0 Fix python2.7 syntax errors.
David A. Holland
parents: 47
diff changeset
134 "UNION " + \
3d5adf5a59d0 Fix python2.7 syntax errors.
David A. Holland
parents: 47
diff changeset
135 "(SELECT mtmessages2.pr as pr, " + \
3d5adf5a59d0 Fix python2.7 syntax errors.
David A. Holland
parents: 47
diff changeset
136 "mtattach2.mimetype as mimetype " + \
3d5adf5a59d0 Fix python2.7 syntax errors.
David A. Holland
parents: 47
diff changeset
137 "FROM messages as mtmessages2, " + \
3d5adf5a59d0 Fix python2.7 syntax errors.
David A. Holland
parents: 47
diff changeset
138 " attachments as mtattach2 " + \
47
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
139 "WHERE mtmessages2.id = mtattach2.msgid))"
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
140 self.addjoin("PRs")
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
141 self.addjoin(subquery, "mimetypes")
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
142 self.addwhere("PRs.id = mimetypes.pr")
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
143 return self.makepresent(field, "mimetypes.mimetype")
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
144
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
145 # XXX: need view userstrings
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
146 # select (id, username as name) from users
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
147 # union select (id, realname as name) from users
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
148 # (allow searching emails? ugh)
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
149 if field == "originator" or field == "submitter":
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
150 self.addjoin("PRs")
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
151 self.addjoin("userstrings", "originators")
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
152 self.addwhere("PRs.originator = originators.id")
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
153 return self.makepresent(field, "originators.name")
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
154
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
155 if field == "reporter" or field == "respondent":
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
156 self.addjoin("PRs")
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
157 self.addjoin("subscriptions")
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
158 self.addjoin("userstrings", "reporters")
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
159 self.addwhere("subscriptions.userid = reporters.id")
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
160 self.addwhere("subscriptions.reporter")
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
161 return self.makepresent(field, "reporters.name")
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
162
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
163 if field == "responsible":
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
164 self.addjoin("PRs")
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
165 self.addjoin("subscriptions")
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
166 self.addjoin("userstrings", "responsibles")
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
167 self.addwhere("subscriptions.userid = responsibles.id")
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
168 self.addwhere("subscriptions.responsible")
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
169 return self.makepresent(field, "responsibles.name")
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
170
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
171 if field in hierclasses:
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
172 col = field + "_data"
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
173 self.addjoin("PRs")
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
174 self.addjoin("hierclass_data", col)
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
175 self.addwhere("PRs.id = %s.pr" % col)
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
176 self.addwhere("%s.scheme = '%s'" % (col, field))
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
177 return self.makepresent(field, "%s.value" % col)
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
178
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
179 if field in flatclasses:
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
180 col = field + "_data"
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
181 self.addjoin("PRs")
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
182 self.addjoin("flatclass_data", col)
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
183 self.addwhere("PRs.id = %s.pr" % col)
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
184 self.addwhere("%s.scheme = '%s'" % (col, field))
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
185 return self.makepresent(field, "%s.value" % col)
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
186
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
187 if field in textclasses:
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
188 col = field + "_data"
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
189 self.addjoin("PRs")
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
190 self.addjoin("textclass_data", col)
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
191 self.addwhere("PRs.id = %s.pr" % col)
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
192 self.addwhere("%s.scheme = '%s'" % (col, field))
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
193 return self.makepresent(field, "%s.value" % col)
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
194
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
195 if field in tagclasses:
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
196 col = field + "_data"
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
197 self.addjoin("PRs")
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
198 self.addjoin("tagclass_data", col)
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
199 self.addwhere("PRs.id = %s.pr" % col)
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
200 self.addwhere("%s.scheme = '%s'" % (col, field))
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
201 return self.makepresent(field, "%s.value" % col)
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
202
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
203 sys.stderr.write("Unknown field %s" % field)
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
204 exit(1)
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
205 # end getfield
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
206
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
207 # emit sql
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
208 def build(self, sels):
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
209 s = ", ".join(sels)
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
210 f = ", ".join(self.fromitems)
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
211 w = " and ".join(self.whereitems)
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
212 q = "SELECT %s\nFROM %s\nWHERE %s\n" % (s, f, w)
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
213 if self.order is not None:
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
214 q = q + "ORDER BY " + self.order + "\n"
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
215 return q
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
216 # endif
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
217
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
218 # end class QueryBuilder
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
219
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
220 # XXX we need to add dynamically:
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
221 # hierclass_names.name to hierclasses[]
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
222 # flatclass_names.name to flatclasses[]
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
223 # textclass_names.name to textclasses[]
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
224 # tagclass_names.name to tagclasses[]
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
225
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
226 ############################################################
33
298c8a7f5181 begin hacking
David A. Holland
parents: 7
diff changeset
227 # database
298c8a7f5181 begin hacking
David A. Holland
parents: 7
diff changeset
228
298c8a7f5181 begin hacking
David A. Holland
parents: 7
diff changeset
229 dblink = None
298c8a7f5181 begin hacking
David A. Holland
parents: 7
diff changeset
230
298c8a7f5181 begin hacking
David A. Holland
parents: 7
diff changeset
231 def opendb():
298c8a7f5181 begin hacking
David A. Holland
parents: 7
diff changeset
232 global dblink
298c8a7f5181 begin hacking
David A. Holland
parents: 7
diff changeset
233
298c8a7f5181 begin hacking
David A. Holland
parents: 7
diff changeset
234 host = "localhost"
298c8a7f5181 begin hacking
David A. Holland
parents: 7
diff changeset
235 user = "swallowtail"
298c8a7f5181 begin hacking
David A. Holland
parents: 7
diff changeset
236 database = "swallowtail"
298c8a7f5181 begin hacking
David A. Holland
parents: 7
diff changeset
237 dblink = psycopg2.connect("host=%s user=%s dbname=%s" %
298c8a7f5181 begin hacking
David A. Holland
parents: 7
diff changeset
238 (host, user, database))
298c8a7f5181 begin hacking
David A. Holland
parents: 7
diff changeset
239 # end opendb
298c8a7f5181 begin hacking
David A. Holland
parents: 7
diff changeset
240
298c8a7f5181 begin hacking
David A. Holland
parents: 7
diff changeset
241 def closedb():
298c8a7f5181 begin hacking
David A. Holland
parents: 7
diff changeset
242 global dblink
298c8a7f5181 begin hacking
David A. Holland
parents: 7
diff changeset
243
298c8a7f5181 begin hacking
David A. Holland
parents: 7
diff changeset
244 dblink.close()
298c8a7f5181 begin hacking
David A. Holland
parents: 7
diff changeset
245 dblink = None
298c8a7f5181 begin hacking
David A. Holland
parents: 7
diff changeset
246 # end closedb
298c8a7f5181 begin hacking
David A. Holland
parents: 7
diff changeset
247
298c8a7f5181 begin hacking
David A. Holland
parents: 7
diff changeset
248 def querydb(qtext, args):
298c8a7f5181 begin hacking
David A. Holland
parents: 7
diff changeset
249 print "Executing this query:"
298c8a7f5181 begin hacking
David A. Holland
parents: 7
diff changeset
250 print qtext
298c8a7f5181 begin hacking
David A. Holland
parents: 7
diff changeset
251 print "Args are:"
298c8a7f5181 begin hacking
David A. Holland
parents: 7
diff changeset
252 print args
298c8a7f5181 begin hacking
David A. Holland
parents: 7
diff changeset
253
298c8a7f5181 begin hacking
David A. Holland
parents: 7
diff changeset
254 cursor = dblink.cursor()
298c8a7f5181 begin hacking
David A. Holland
parents: 7
diff changeset
255 cursor.execute(qtext, args)
298c8a7f5181 begin hacking
David A. Holland
parents: 7
diff changeset
256 result = cursor.fetchall()
298c8a7f5181 begin hacking
David A. Holland
parents: 7
diff changeset
257 cursor.close()
298c8a7f5181 begin hacking
David A. Holland
parents: 7
diff changeset
258 return result
298c8a7f5181 begin hacking
David A. Holland
parents: 7
diff changeset
259 # end querydb
298c8a7f5181 begin hacking
David A. Holland
parents: 7
diff changeset
260
298c8a7f5181 begin hacking
David A. Holland
parents: 7
diff changeset
261 ############################################################
298c8a7f5181 begin hacking
David A. Holland
parents: 7
diff changeset
262 # query class for searches
47
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
263 # XXX: obsolete, remove
33
298c8a7f5181 begin hacking
David A. Holland
parents: 7
diff changeset
264
298c8a7f5181 begin hacking
David A. Holland
parents: 7
diff changeset
265 class Query:
48
3d5adf5a59d0 Fix python2.7 syntax errors.
David A. Holland
parents: 47
diff changeset
266 def __init__(self):
33
298c8a7f5181 begin hacking
David A. Holland
parents: 7
diff changeset
267 self.selections = []
298c8a7f5181 begin hacking
David A. Holland
parents: 7
diff changeset
268 self.tables = []
298c8a7f5181 begin hacking
David A. Holland
parents: 7
diff changeset
269 self.constraints = []
298c8a7f5181 begin hacking
David A. Holland
parents: 7
diff changeset
270 self.args = []
298c8a7f5181 begin hacking
David A. Holland
parents: 7
diff changeset
271 prtables = ["PRs"]
298c8a7f5181 begin hacking
David A. Holland
parents: 7
diff changeset
272 prconstraints = []
298c8a7f5181 begin hacking
David A. Holland
parents: 7
diff changeset
273
298c8a7f5181 begin hacking
David A. Holland
parents: 7
diff changeset
274 def select(self, s):
298c8a7f5181 begin hacking
David A. Holland
parents: 7
diff changeset
275 self.selections.append(s)
298c8a7f5181 begin hacking
David A. Holland
parents: 7
diff changeset
276
298c8a7f5181 begin hacking
David A. Holland
parents: 7
diff changeset
277 def addtable(self, t):
298c8a7f5181 begin hacking
David A. Holland
parents: 7
diff changeset
278 assert(t not in self.tables)
298c8a7f5181 begin hacking
David A. Holland
parents: 7
diff changeset
279 self.tables.append(t)
298c8a7f5181 begin hacking
David A. Holland
parents: 7
diff changeset
280
298c8a7f5181 begin hacking
David A. Holland
parents: 7
diff changeset
281 def constrain(self, expr):
298c8a7f5181 begin hacking
David A. Holland
parents: 7
diff changeset
282 self.constraints.append(t)
298c8a7f5181 begin hacking
David A. Holland
parents: 7
diff changeset
283
298c8a7f5181 begin hacking
David A. Holland
parents: 7
diff changeset
284 def internval(self, val):
298c8a7f5181 begin hacking
David A. Holland
parents: 7
diff changeset
285 num = len(self.args)
298c8a7f5181 begin hacking
David A. Holland
parents: 7
diff changeset
286 self.args[num] = val
298c8a7f5181 begin hacking
David A. Holland
parents: 7
diff changeset
287 return "$%d" % num
298c8a7f5181 begin hacking
David A. Holland
parents: 7
diff changeset
288
298c8a7f5181 begin hacking
David A. Holland
parents: 7
diff changeset
289 def textify(self):
298c8a7f5181 begin hacking
David A. Holland
parents: 7
diff changeset
290 s = "SELECT %s\n" % ",".join(self.selections)
298c8a7f5181 begin hacking
David A. Holland
parents: 7
diff changeset
291 f = "FROM %s\n" % ",".join(self.tables)
298c8a7f5181 begin hacking
David A. Holland
parents: 7
diff changeset
292 w = "WHERE %s\n" % " AND ".join(self.constraints)
298c8a7f5181 begin hacking
David A. Holland
parents: 7
diff changeset
293 return s + f + w
298c8a7f5181 begin hacking
David A. Holland
parents: 7
diff changeset
294 # end class Query
298c8a7f5181 begin hacking
David A. Holland
parents: 7
diff changeset
295
298c8a7f5181 begin hacking
David A. Holland
parents: 7
diff changeset
296 def regexp_constraint(q, field, value):
298c8a7f5181 begin hacking
David A. Holland
parents: 7
diff changeset
297 cleanval = q.internval(value)
298c8a7f5181 begin hacking
David A. Holland
parents: 7
diff changeset
298 if not isregexp(value):
298c8a7f5181 begin hacking
David A. Holland
parents: 7
diff changeset
299 return "%s = %s" % (field, cleanval)
298c8a7f5181 begin hacking
David A. Holland
parents: 7
diff changeset
300 else:
298c8a7f5181 begin hacking
David A. Holland
parents: 7
diff changeset
301 # XXX what's the right operator again?
298c8a7f5181 begin hacking
David A. Holland
parents: 7
diff changeset
302 return "%s ~= %s" % (field, cleanval)
298c8a7f5181 begin hacking
David A. Holland
parents: 7
diff changeset
303 # end regexp_constraint
298c8a7f5181 begin hacking
David A. Holland
parents: 7
diff changeset
304
298c8a7f5181 begin hacking
David A. Holland
parents: 7
diff changeset
305 def intrange_constraint(q, field, value):
298c8a7f5181 begin hacking
David A. Holland
parents: 7
diff changeset
306 (lower, upper) = args.number
298c8a7f5181 begin hacking
David A. Holland
parents: 7
diff changeset
307 if lower is not None:
298c8a7f5181 begin hacking
David A. Holland
parents: 7
diff changeset
308 assert(typeof(lower) == int)
298c8a7f5181 begin hacking
David A. Holland
parents: 7
diff changeset
309 prq.constrain("%s >= %d" % (field, lower))
298c8a7f5181 begin hacking
David A. Holland
parents: 7
diff changeset
310 if upper is not None:
298c8a7f5181 begin hacking
David A. Holland
parents: 7
diff changeset
311 assert(typeof(upper) == int)
298c8a7f5181 begin hacking
David A. Holland
parents: 7
diff changeset
312 prq.constrain("%s <= %d" % (field, upper))
298c8a7f5181 begin hacking
David A. Holland
parents: 7
diff changeset
313 # end intrange_constraint
298c8a7f5181 begin hacking
David A. Holland
parents: 7
diff changeset
314
298c8a7f5181 begin hacking
David A. Holland
parents: 7
diff changeset
315 def daterange_constraint(q, field, value):
298c8a7f5181 begin hacking
David A. Holland
parents: 7
diff changeset
316 # XXX
298c8a7f5181 begin hacking
David A. Holland
parents: 7
diff changeset
317 assert(0)
298c8a7f5181 begin hacking
David A. Holland
parents: 7
diff changeset
318 # end daterange_constraint
298c8a7f5181 begin hacking
David A. Holland
parents: 7
diff changeset
319
298c8a7f5181 begin hacking
David A. Holland
parents: 7
diff changeset
320 ############################################################
298c8a7f5181 begin hacking
David A. Holland
parents: 7
diff changeset
321
47
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
322 # this is old code that needs to be merged or deleted into the new stuff
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
323 def oldstuff():
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
324
33
298c8a7f5181 begin hacking
David A. Holland
parents: 7
diff changeset
325 # If we're doing something other than a search, do it now
298c8a7f5181 begin hacking
David A. Holland
parents: 7
diff changeset
326 if args.attach is not None:
298c8a7f5181 begin hacking
David A. Holland
parents: 7
diff changeset
327 get_attachment(args.attach)
298c8a7f5181 begin hacking
David A. Holland
parents: 7
diff changeset
328 exit(0)
298c8a7f5181 begin hacking
David A. Holland
parents: 7
diff changeset
329 if args.message is not None:
298c8a7f5181 begin hacking
David A. Holland
parents: 7
diff changeset
330 get_message(args.message)
298c8a7f5181 begin hacking
David A. Holland
parents: 7
diff changeset
331 exit(0)
298c8a7f5181 begin hacking
David A. Holland
parents: 7
diff changeset
332
298c8a7f5181 begin hacking
David A. Holland
parents: 7
diff changeset
333 if args.prs is not None and len(args.prs) > 0:
298c8a7f5181 begin hacking
David A. Holland
parents: 7
diff changeset
334 show_prs(args.prs)
298c8a7f5181 begin hacking
David A. Holland
parents: 7
diff changeset
335 exit(0)
298c8a7f5181 begin hacking
David A. Holland
parents: 7
diff changeset
336
298c8a7f5181 begin hacking
David A. Holland
parents: 7
diff changeset
337 #
298c8a7f5181 begin hacking
David A. Holland
parents: 7
diff changeset
338 # Collect up the search constraints
298c8a7f5181 begin hacking
David A. Holland
parents: 7
diff changeset
339 #
298c8a7f5181 begin hacking
David A. Holland
parents: 7
diff changeset
340
298c8a7f5181 begin hacking
David A. Holland
parents: 7
diff changeset
341 # 1. Constraints on the PRs table
298c8a7f5181 begin hacking
David A. Holland
parents: 7
diff changeset
342 checkprtable = False
298c8a7f5181 begin hacking
David A. Holland
parents: 7
diff changeset
343 prq = Query()
298c8a7f5181 begin hacking
David A. Holland
parents: 7
diff changeset
344 prq.select("PRs.id as id")
298c8a7f5181 begin hacking
David A. Holland
parents: 7
diff changeset
345 prq.addtable("PRs")
298c8a7f5181 begin hacking
David A. Holland
parents: 7
diff changeset
346 if not args.closed:
298c8a7f5181 begin hacking
David A. Holland
parents: 7
diff changeset
347 checkprtable = True
298c8a7f5181 begin hacking
David A. Holland
parents: 7
diff changeset
348 prq.addtable("states")
298c8a7f5181 begin hacking
David A. Holland
parents: 7
diff changeset
349 prq.constrain("PRs.state = states.name")
298c8a7f5181 begin hacking
David A. Holland
parents: 7
diff changeset
350 prq.constrain("states.closed = FALSE")
298c8a7f5181 begin hacking
David A. Holland
parents: 7
diff changeset
351 if args.public:
298c8a7f5181 begin hacking
David A. Holland
parents: 7
diff changeset
352 checkprtable = True
298c8a7f5181 begin hacking
David A. Holland
parents: 7
diff changeset
353 prq.constrain("NOT PRs.confidential")
298c8a7f5181 begin hacking
David A. Holland
parents: 7
diff changeset
354 if args.number is not None:
298c8a7f5181 begin hacking
David A. Holland
parents: 7
diff changeset
355 checkprtable = True
298c8a7f5181 begin hacking
David A. Holland
parents: 7
diff changeset
356 intrange_constraint(prq, "PRs.id", args.number)
298c8a7f5181 begin hacking
David A. Holland
parents: 7
diff changeset
357 if args.synopsis is not None:
298c8a7f5181 begin hacking
David A. Holland
parents: 7
diff changeset
358 checkprtable = True
298c8a7f5181 begin hacking
David A. Holland
parents: 7
diff changeset
359 regexp_constraint(prq, "PRs.synopsis", args.synopsis)
298c8a7f5181 begin hacking
David A. Holland
parents: 7
diff changeset
360 if args.confidential is not None:
298c8a7f5181 begin hacking
David A. Holland
parents: 7
diff changeset
361 checkprtable = True
298c8a7f5181 begin hacking
David A. Holland
parents: 7
diff changeset
362 assert(typeof(args.confidential) == bool)
298c8a7f5181 begin hacking
David A. Holland
parents: 7
diff changeset
363 if args.confidential:
298c8a7f5181 begin hacking
David A. Holland
parents: 7
diff changeset
364 prq.constrain("PRs.confidential")
298c8a7f5181 begin hacking
David A. Holland
parents: 7
diff changeset
365 else:
298c8a7f5181 begin hacking
David A. Holland
parents: 7
diff changeset
366 prq.constrain("not PRs.confidential")
298c8a7f5181 begin hacking
David A. Holland
parents: 7
diff changeset
367 if args.state is not None:
298c8a7f5181 begin hacking
David A. Holland
parents: 7
diff changeset
368 checkprtable = True
298c8a7f5181 begin hacking
David A. Holland
parents: 7
diff changeset
369 regexp_constraint(prq, "PRs.state", args.state)
298c8a7f5181 begin hacking
David A. Holland
parents: 7
diff changeset
370 if args.locked is not None:
298c8a7f5181 begin hacking
David A. Holland
parents: 7
diff changeset
371 checkprtable = True
298c8a7f5181 begin hacking
David A. Holland
parents: 7
diff changeset
372 assert(typeof(args.locked) == bool)
298c8a7f5181 begin hacking
David A. Holland
parents: 7
diff changeset
373 if args.locked:
298c8a7f5181 begin hacking
David A. Holland
parents: 7
diff changeset
374 prq.constrain("PRs.locked")
298c8a7f5181 begin hacking
David A. Holland
parents: 7
diff changeset
375 else:
298c8a7f5181 begin hacking
David A. Holland
parents: 7
diff changeset
376 prq.constrain("not PRs.locked")
298c8a7f5181 begin hacking
David A. Holland
parents: 7
diff changeset
377 if args.arrival_schemaversion is not None:
298c8a7f5181 begin hacking
David A. Holland
parents: 7
diff changeset
378 checkprtable = True
298c8a7f5181 begin hacking
David A. Holland
parents: 7
diff changeset
379 intrange_constraint(prq, "PRs.arrival_schemaversion",
298c8a7f5181 begin hacking
David A. Holland
parents: 7
diff changeset
380 args.arrival_schemaversion)
298c8a7f5181 begin hacking
David A. Holland
parents: 7
diff changeset
381 if args.arrival_date is not None:
298c8a7f5181 begin hacking
David A. Holland
parents: 7
diff changeset
382 checkprtable = True
298c8a7f5181 begin hacking
David A. Holland
parents: 7
diff changeset
383 daterange_constraint(prq, "PRs.arrival_date",
298c8a7f5181 begin hacking
David A. Holland
parents: 7
diff changeset
384 args.arrival_date)
298c8a7f5181 begin hacking
David A. Holland
parents: 7
diff changeset
385 if args.closed_date is not None:
298c8a7f5181 begin hacking
David A. Holland
parents: 7
diff changeset
386 checkprtable = True
298c8a7f5181 begin hacking
David A. Holland
parents: 7
diff changeset
387 daterange_constraint(prq, "PRs.closed_date",
298c8a7f5181 begin hacking
David A. Holland
parents: 7
diff changeset
388 args.closed_date)
298c8a7f5181 begin hacking
David A. Holland
parents: 7
diff changeset
389 if args.last_modified is not None:
298c8a7f5181 begin hacking
David A. Holland
parents: 7
diff changeset
390 checkprtable = True
298c8a7f5181 begin hacking
David A. Holland
parents: 7
diff changeset
391 daterange_constraint(prq, "PRs.last_modified",
298c8a7f5181 begin hacking
David A. Holland
parents: 7
diff changeset
392 args.last_modified)
298c8a7f5181 begin hacking
David A. Holland
parents: 7
diff changeset
393 if args.release is not None:
298c8a7f5181 begin hacking
David A. Holland
parents: 7
diff changeset
394 checkprtable = True
298c8a7f5181 begin hacking
David A. Holland
parents: 7
diff changeset
395 regexp_constraint(prq, "PRs.release", args.release)
298c8a7f5181 begin hacking
David A. Holland
parents: 7
diff changeset
396 if args.environment is not None:
298c8a7f5181 begin hacking
David A. Holland
parents: 7
diff changeset
397 checkprtable = True
298c8a7f5181 begin hacking
David A. Holland
parents: 7
diff changeset
398 regexp_constraint(prq, "PRs.environment", args.environment)
298c8a7f5181 begin hacking
David A. Holland
parents: 7
diff changeset
399
48
3d5adf5a59d0 Fix python2.7 syntax errors.
David A. Holland
parents: 47
diff changeset
400 if args.originator_name is not None or \
33
298c8a7f5181 begin hacking
David A. Holland
parents: 7
diff changeset
401 args.originator_email is not None:
298c8a7f5181 begin hacking
David A. Holland
parents: 7
diff changeset
402 prq.addtable("usermail as originator")
298c8a7f5181 begin hacking
David A. Holland
parents: 7
diff changeset
403 prq.constrain("PRs.originator = originator.id")
298c8a7f5181 begin hacking
David A. Holland
parents: 7
diff changeset
404 if args.originator_name is not None:
298c8a7f5181 begin hacking
David A. Holland
parents: 7
diff changeset
405 checkprtable = True
298c8a7f5181 begin hacking
David A. Holland
parents: 7
diff changeset
406 regexp_constraint(prq, "originator.realname",
298c8a7f5181 begin hacking
David A. Holland
parents: 7
diff changeset
407 args.originator_name)
298c8a7f5181 begin hacking
David A. Holland
parents: 7
diff changeset
408 if args.originator_email is not None:
298c8a7f5181 begin hacking
David A. Holland
parents: 7
diff changeset
409 checkprtable = True
298c8a7f5181 begin hacking
David A. Holland
parents: 7
diff changeset
410 regexp_constraint(prq, "originator.email",
298c8a7f5181 begin hacking
David A. Holland
parents: 7
diff changeset
411 args.originator_name)
298c8a7f5181 begin hacking
David A. Holland
parents: 7
diff changeset
412 if args.originator_id is not None:
298c8a7f5181 begin hacking
David A. Holland
parents: 7
diff changeset
413 checkprtable = True
298c8a7f5181 begin hacking
David A. Holland
parents: 7
diff changeset
414 intrange_constraint(prq, "PRs.originator", args.originator_id)
298c8a7f5181 begin hacking
David A. Holland
parents: 7
diff changeset
415
298c8a7f5181 begin hacking
David A. Holland
parents: 7
diff changeset
416 queries = []
298c8a7f5181 begin hacking
David A. Holland
parents: 7
diff changeset
417 if checkprtable:
298c8a7f5181 begin hacking
David A. Holland
parents: 7
diff changeset
418 queries.append(prq)
298c8a7f5181 begin hacking
David A. Holland
parents: 7
diff changeset
419
298c8a7f5181 begin hacking
David A. Holland
parents: 7
diff changeset
420 if args.responsible is not None:
298c8a7f5181 begin hacking
David A. Holland
parents: 7
diff changeset
421 sq = Query()
298c8a7f5181 begin hacking
David A. Holland
parents: 7
diff changeset
422 sq.select("subscriptions.pr as id")
298c8a7f5181 begin hacking
David A. Holland
parents: 7
diff changeset
423 sq.addtable("subscriptions")
298c8a7f5181 begin hacking
David A. Holland
parents: 7
diff changeset
424 sq.addtable("users")
298c8a7f5181 begin hacking
David A. Holland
parents: 7
diff changeset
425 sq.constrain("subscriptions.userid = users.id")
298c8a7f5181 begin hacking
David A. Holland
parents: 7
diff changeset
426 regexp_constraint(sq, "users.realname", args.responsible)
298c8a7f5181 begin hacking
David A. Holland
parents: 7
diff changeset
427 sq.constrain("subscriptions.responsible")
298c8a7f5181 begin hacking
David A. Holland
parents: 7
diff changeset
428 queries.append(sq)
298c8a7f5181 begin hacking
David A. Holland
parents: 7
diff changeset
429 if args.respondent is not None:
298c8a7f5181 begin hacking
David A. Holland
parents: 7
diff changeset
430 sq = Query()
298c8a7f5181 begin hacking
David A. Holland
parents: 7
diff changeset
431 sq.select("subscriptions.pr as id")
298c8a7f5181 begin hacking
David A. Holland
parents: 7
diff changeset
432 sq.addtable("subscriptions")
298c8a7f5181 begin hacking
David A. Holland
parents: 7
diff changeset
433 sq.addtable("users as subscribed")
298c8a7f5181 begin hacking
David A. Holland
parents: 7
diff changeset
434 sq.constrain("subscriptions.userid = users.id")
298c8a7f5181 begin hacking
David A. Holland
parents: 7
diff changeset
435 regexp_constraint(sq, "users.realname", args.respondent)
298c8a7f5181 begin hacking
David A. Holland
parents: 7
diff changeset
436 sq.constrain("subscriptions.reporter")
298c8a7f5181 begin hacking
David A. Holland
parents: 7
diff changeset
437 queries.append(sq)
298c8a7f5181 begin hacking
David A. Holland
parents: 7
diff changeset
438 if args.subscribed is not None:
298c8a7f5181 begin hacking
David A. Holland
parents: 7
diff changeset
439 sq = Query()
298c8a7f5181 begin hacking
David A. Holland
parents: 7
diff changeset
440 sq.select("subscriptions.pr as id")
298c8a7f5181 begin hacking
David A. Holland
parents: 7
diff changeset
441 sq.addtable("subscriptions")
298c8a7f5181 begin hacking
David A. Holland
parents: 7
diff changeset
442 sq.addtable("users as subscribed")
298c8a7f5181 begin hacking
David A. Holland
parents: 7
diff changeset
443 sq.constrain("subscriptions.userid = users.id")
298c8a7f5181 begin hacking
David A. Holland
parents: 7
diff changeset
444 regexp_constraint(sq, "users.realname", args.subscribed)
298c8a7f5181 begin hacking
David A. Holland
parents: 7
diff changeset
445 queries.append(sq)
298c8a7f5181 begin hacking
David A. Holland
parents: 7
diff changeset
446
298c8a7f5181 begin hacking
David A. Holland
parents: 7
diff changeset
447 if args.messages is not None:
298c8a7f5181 begin hacking
David A. Holland
parents: 7
diff changeset
448 mq = Query()
298c8a7f5181 begin hacking
David A. Holland
parents: 7
diff changeset
449 mq.select("messages.pr as id")
298c8a7f5181 begin hacking
David A. Holland
parents: 7
diff changeset
450 mq.addtable("messages")
298c8a7f5181 begin hacking
David A. Holland
parents: 7
diff changeset
451 regexp_constraint(sq, "messages.text", args.messages)
298c8a7f5181 begin hacking
David A. Holland
parents: 7
diff changeset
452 queries.append(mq)
298c8a7f5181 begin hacking
David A. Holland
parents: 7
diff changeset
453
298c8a7f5181 begin hacking
David A. Holland
parents: 7
diff changeset
454 if args.adminlog is not None:
298c8a7f5181 begin hacking
David A. Holland
parents: 7
diff changeset
455 aq = Query()
298c8a7f5181 begin hacking
David A. Holland
parents: 7
diff changeset
456 aq.select("adminlog.pr as id")
298c8a7f5181 begin hacking
David A. Holland
parents: 7
diff changeset
457 aq.addtable("adminlog")
298c8a7f5181 begin hacking
David A. Holland
parents: 7
diff changeset
458 regexp_constraint(sq, "adminlog.change", args.adminlog)
298c8a7f5181 begin hacking
David A. Holland
parents: 7
diff changeset
459 regexp_constraint(sq, "adminlog.comment", args.adminlog)
298c8a7f5181 begin hacking
David A. Holland
parents: 7
diff changeset
460 assert(len(aq.constraints) == 2)
298c8a7f5181 begin hacking
David A. Holland
parents: 7
diff changeset
461 x = "%s OR %s" % (aq.constraints[0], aq.constraints[1])
298c8a7f5181 begin hacking
David A. Holland
parents: 7
diff changeset
462 aq.constraints = [x]
298c8a7f5181 begin hacking
David A. Holland
parents: 7
diff changeset
463 queries.append(aq)
298c8a7f5181 begin hacking
David A. Holland
parents: 7
diff changeset
464
298c8a7f5181 begin hacking
David A. Holland
parents: 7
diff changeset
465 if args.anytext is not None:
298c8a7f5181 begin hacking
David A. Holland
parents: 7
diff changeset
466 choke("--anytext isn't supported yet")
298c8a7f5181 begin hacking
David A. Holland
parents: 7
diff changeset
467
298c8a7f5181 begin hacking
David A. Holland
parents: 7
diff changeset
468 for scheme in classification_schemes:
298c8a7f5181 begin hacking
David A. Holland
parents: 7
diff changeset
469 if args[scheme] is not None:
298c8a7f5181 begin hacking
David A. Holland
parents: 7
diff changeset
470 schemetype = classification_schemetypes[scheme]
298c8a7f5181 begin hacking
David A. Holland
parents: 7
diff changeset
471 tbl = "%sclass_data" % schemetype
298c8a7f5181 begin hacking
David A. Holland
parents: 7
diff changeset
472 cq = Query()
298c8a7f5181 begin hacking
David A. Holland
parents: 7
diff changeset
473 cq.select("scheme.pr as id")
298c8a7f5181 begin hacking
David A. Holland
parents: 7
diff changeset
474 cq.addtable("%s as scheme" % schemetype)
298c8a7f5181 begin hacking
David A. Holland
parents: 7
diff changeset
475 cq.constrain("scheme.scheme = '%s'" % scheme)
298c8a7f5181 begin hacking
David A. Holland
parents: 7
diff changeset
476 regexp_constraint(cq, "scheme.value", args[scheme])
298c8a7f5181 begin hacking
David A. Holland
parents: 7
diff changeset
477 queries.append(cq)
298c8a7f5181 begin hacking
David A. Holland
parents: 7
diff changeset
478 # end loop
298c8a7f5181 begin hacking
David A. Holland
parents: 7
diff changeset
479
298c8a7f5181 begin hacking
David A. Holland
parents: 7
diff changeset
480 querytexts = [q.textify() for q in queries]
298c8a7f5181 begin hacking
David A. Holland
parents: 7
diff changeset
481 return "INTERSECT\n".join(querytexts)
46
73e6dac29391 new stuff (checkpoint when moved between machines)
David A. Holland
parents: 33
diff changeset
482
47
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
483 ############################################################
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
484 # printing
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
485
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
486 class PrintText:
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
487 def __init__(self, output):
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
488 self.lines = (output == "RAW" or output == "LIST")
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
489 def printheader(self, row):
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
490 # nothing
48
3d5adf5a59d0 Fix python2.7 syntax errors.
David A. Holland
parents: 47
diff changeset
491 pass
47
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
492 def printrow(self, row):
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
493 # XXX
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
494 print row
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
495 def printfooter(self, row):
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
496 # nothing
48
3d5adf5a59d0 Fix python2.7 syntax errors.
David A. Holland
parents: 47
diff changeset
497 pass
47
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
498 # end class PrintText
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
499
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
500 class PrintCsv:
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
501 def __init__(self, output):
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
502 # nothing
48
3d5adf5a59d0 Fix python2.7 syntax errors.
David A. Holland
parents: 47
diff changeset
503 pass
47
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
504 def printheader(self, row):
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
505 # XXX
48
3d5adf5a59d0 Fix python2.7 syntax errors.
David A. Holland
parents: 47
diff changeset
506 pass
47
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
507 def printrow(self, row):
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
508 # XXX
48
3d5adf5a59d0 Fix python2.7 syntax errors.
David A. Holland
parents: 47
diff changeset
509 pass
47
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
510 def printfooter(self, row):
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
511 # nothing
48
3d5adf5a59d0 Fix python2.7 syntax errors.
David A. Holland
parents: 47
diff changeset
512 pass
47
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
513 # end class PrintCsv
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
514
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
515 class PrintXml:
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
516 def __init__(self, output):
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
517 # nothing
48
3d5adf5a59d0 Fix python2.7 syntax errors.
David A. Holland
parents: 47
diff changeset
518 pass
47
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
519 def printheader(self, row):
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
520 # XXX
48
3d5adf5a59d0 Fix python2.7 syntax errors.
David A. Holland
parents: 47
diff changeset
521 pass
47
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
522 def printrow(self, row):
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
523 # XXX
48
3d5adf5a59d0 Fix python2.7 syntax errors.
David A. Holland
parents: 47
diff changeset
524 pass
47
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
525 def printfooter(self, row):
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
526 # XXX
48
3d5adf5a59d0 Fix python2.7 syntax errors.
David A. Holland
parents: 47
diff changeset
527 pass
47
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
528 # end class PrintXml
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
529
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
530 class PrintJson:
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
531 def __init__(self, output):
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
532 # nothing
48
3d5adf5a59d0 Fix python2.7 syntax errors.
David A. Holland
parents: 47
diff changeset
533 pass
47
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
534 def printheader(self, row):
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
535 # XXX
48
3d5adf5a59d0 Fix python2.7 syntax errors.
David A. Holland
parents: 47
diff changeset
536 pass
47
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
537 def printrow(self, row):
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
538 # XXX
48
3d5adf5a59d0 Fix python2.7 syntax errors.
David A. Holland
parents: 47
diff changeset
539 pass
47
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
540 def printfooter(self, row):
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
541 # XXX
48
3d5adf5a59d0 Fix python2.7 syntax errors.
David A. Holland
parents: 47
diff changeset
542 pass
47
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
543 # end class PrintJson
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
544
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
545 class PrintRdf:
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
546 def __init__(self, output):
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
547 # nothing
48
3d5adf5a59d0 Fix python2.7 syntax errors.
David A. Holland
parents: 47
diff changeset
548 pass
47
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
549 def printheader(self, row):
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
550 # XXX
48
3d5adf5a59d0 Fix python2.7 syntax errors.
David A. Holland
parents: 47
diff changeset
551 pass
47
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
552 def printrow(self, row):
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
553 # XXX
48
3d5adf5a59d0 Fix python2.7 syntax errors.
David A. Holland
parents: 47
diff changeset
554 pass
47
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
555 def printfooter(self, row):
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
556 # XXX
48
3d5adf5a59d0 Fix python2.7 syntax errors.
David A. Holland
parents: 47
diff changeset
557 pass
47
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
558 # end class PrintRdf
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
559
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
560 class PrintRdflike:
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
561 def __init__(self, output):
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
562 # nothing
48
3d5adf5a59d0 Fix python2.7 syntax errors.
David A. Holland
parents: 47
diff changeset
563 pass
47
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
564 def printheader(self, row):
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
565 # XXX
48
3d5adf5a59d0 Fix python2.7 syntax errors.
David A. Holland
parents: 47
diff changeset
566 pass
47
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
567 def printrow(self, row):
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
568 # XXX
48
3d5adf5a59d0 Fix python2.7 syntax errors.
David A. Holland
parents: 47
diff changeset
569 pass
47
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
570 def printfooter(self, row):
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
571 # XXX
48
3d5adf5a59d0 Fix python2.7 syntax errors.
David A. Holland
parents: 47
diff changeset
572 pass
47
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
573 # end class PrintRdflike
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
574
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
575 def print_prs(ids):
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
576 if sel.outformat == "TEXT":
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
577 mkprinter = PrintText
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
578 elif sel.outformat == "CSV":
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
579 mkprinter = PrintCsv
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
580 elif sel.outformat == "XML":
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
581 mkprinter = PrintXml
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
582 elif sel.outformat == "JSON":
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
583 mkprinter = PrintJson
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
584 elif sel.outformat == "RDF":
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
585 mkprinter = PrintRdf
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
586 elif sel.outformat == "RDFLIKE":
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
587 mkprinter = PrintRdflike
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
588 else:
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
589 assert(False)
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
590
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
591 # reset the printer
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
592 printer = mkprinter(sel.output)
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
593
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
594 if sel.output == "RAW":
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
595 printer.printheader(ids[0])
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
596 for id in ids:
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
597 printer(id)
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
598 printer.printfooter(ids[0])
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
599 return
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
600 elif sel.output == "LIST":
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
601 # XXX is there a clean way to do this passing the
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
602 # whole list of ids at once?
48
3d5adf5a59d0 Fix python2.7 syntax errors.
David A. Holland
parents: 47
diff changeset
603 query = "SELECT id, synopsis\n" + \
3d5adf5a59d0 Fix python2.7 syntax errors.
David A. Holland
parents: 47
diff changeset
604 "FROM PRs\n" + \
47
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
605 "WHERE id = $1"
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
606 elif sel.output == "HEADERS":
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
607 query = None # XXX
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
608 elif sel.output == "META":
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
609 query = None # XXX
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
610 elif sel.output == "FULL":
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
611 query = None # XXX
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
612 else:
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
613 assert(False)
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
614
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
615 first = True
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
616 for id in ids:
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
617 results = querydb(query, [id])
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
618 if first:
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
619 printer.printheader(results[0])
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
620 first = False
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
621 for r in results:
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
622 printer.printrow(r)
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
623 printer.printfooter(results[0])
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
624 # end print_prs
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
625
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
626 # XXX if in public mode we need to check if the PR is public
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
627 def print_message(pr, msgnum):
48
3d5adf5a59d0 Fix python2.7 syntax errors.
David A. Holland
parents: 47
diff changeset
628 query = "SELECT users.username AS username,\n" + \
3d5adf5a59d0 Fix python2.7 syntax errors.
David A. Holland
parents: 47
diff changeset
629 " users.realname AS realname,\n" + \
3d5adf5a59d0 Fix python2.7 syntax errors.
David A. Holland
parents: 47
diff changeset
630 " messages.id AS id, parent_id,\n" + \
3d5adf5a59d0 Fix python2.7 syntax errors.
David A. Holland
parents: 47
diff changeset
631 " posttime, mimetype, body\n" + \
3d5adf5a59d0 Fix python2.7 syntax errors.
David A. Holland
parents: 47
diff changeset
632 "FROM messages, users\n" + \
3d5adf5a59d0 Fix python2.7 syntax errors.
David A. Holland
parents: 47
diff changeset
633 "WHERE messages.who = users.id\n" + \
3d5adf5a59d0 Fix python2.7 syntax errors.
David A. Holland
parents: 47
diff changeset
634 " AND messages.pr = $1\n" + \
47
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
635 " AND messages.number_in_pr = $2\n"
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
636 # Note that while pr is safe, msgnum came from the commandline
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
637 # and may not be.
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
638 results = querydb(query, [pr, msgnum])
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
639 [result] = results
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
640 (username, realname, id, parent_id, posttime, mimetype, body) = result
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
641 # XXX honor mimetype
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
642 # XXX honor output format (e.g. html)
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
643 sys.stdout.write("From swallowtail@%s %s\n" % (organization,posttime))
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
644 sys.stdout.write("From: %s (%s)\n" % (username, realname))
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
645 sys.stdout.write("References: %s\n" % parent_id)
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
646 sys.stdout.write("Date: %s\n" % posttime)
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
647 sys.stdout.write("Content-Type: %s\n" % mimetype)
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
648 sys.stdout.write("\n")
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
649 sys.stdout.write(body)
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
650 # end print_message
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
651
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
652 # XXX if in public mode we need to check if the PR is public
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
653 def print_attachment(pr, attachnum):
48
3d5adf5a59d0 Fix python2.7 syntax errors.
David A. Holland
parents: 47
diff changeset
654 query = "SELECT a.mimetype as mimetype, a.body as body\n" + \
3d5adf5a59d0 Fix python2.7 syntax errors.
David A. Holland
parents: 47
diff changeset
655 "FROM messages, attachments as a\n" + \
3d5adf5a59d0 Fix python2.7 syntax errors.
David A. Holland
parents: 47
diff changeset
656 "WHERE messages.pr = $1\n" + \
3d5adf5a59d0 Fix python2.7 syntax errors.
David A. Holland
parents: 47
diff changeset
657 " AND messages.id = a.msgid\n" + \
47
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
658 " AND a.number_in_pr = $2\n"
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
659 # Note that while pr is safe, attachnum came from the
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
660 # commandline and may not be.
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
661 results = querydb(query, [pr, msgnum])
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
662 [result] = results
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
663 (mimetype, body) = result
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
664 # XXX honor mimetype
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
665 # XXX need an http output mode so we can send the mimetype!
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
666 sys.stdout.write(body)
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
667 # end print_attachment
46
73e6dac29391 new stuff (checkpoint when moved between machines)
David A. Holland
parents: 33
diff changeset
668
73e6dac29391 new stuff (checkpoint when moved between machines)
David A. Holland
parents: 33
diff changeset
669 ############################################################
47
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
670 # AST for query
46
73e6dac29391 new stuff (checkpoint when moved between machines)
David A. Holland
parents: 33
diff changeset
671
73e6dac29391 new stuff (checkpoint when moved between machines)
David A. Holland
parents: 33
diff changeset
672 class Invocation:
47
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
673 class Query:
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
674 Q_TERM = 1 # XXX unused so far
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
675 Q_SQL = 2
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
676 Q_AND = 3
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
677 Q_OR = 4
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
678 Q_TSTRING = 5
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
679 Q_QSTRING = 6
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
680
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
681 def __init__(self, type):
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
682 self.type = type
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
683 def doterm(term):
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
684 self = Query(Q_TERM)
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
685 self.term = term
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
686 return self
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
687 def dosql(s):
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
688 self = Query(Q_SQL)
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
689 self.sql = s
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
690 return self
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
691 def doand(qs):
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
692 self = Query(Q_AND)
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
693 self.args = qs
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
694 return self
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
695 def door(qs):
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
696 self = Query(Q_OR)
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
697 self.args = qs
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
698 return self
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
699 # query term string
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
700 def dotstring(q):
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
701 self = Query(Q_TSTRING)
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
702 self.string = q
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
703 return self
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
704 # whole query string
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
705 def doqstring(q):
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
706 self = Query(Q_QSTRING)
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
707 self.string = q
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
708 return self
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
709 # end class Query
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
710
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
711 class Order:
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
712 def __init__(self, field, rev = False):
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
713 self.field = field
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
714 self.rev = rev
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
715 def dooldest(ign):
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
716 return Order("number")
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
717 def donewest(ign):
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
718 return Order("number", True)
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
719 def dostaleness(ign):
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
720 return Order("modified_date", True)
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
721 def dofield(field):
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
722 return Order(field)
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
723 def dorevfield(field):
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
724 return Order(field, True)
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
725 # end class Order
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
726
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
727 class Search:
48
3d5adf5a59d0 Fix python2.7 syntax errors.
David A. Holland
parents: 47
diff changeset
728 def __init__(self, qs, openonly, publiconly, os):
47
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
729 self.queries = qs
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
730 self.openonly = openonly
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
731 self.publiconly = publiconly
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
732 self.orders = os
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
733 # end class Search
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
734
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
735 class Selection:
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
736 S_PR = 1
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
737 S_MESSAGE = 2
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
738 S_ATTACHMENT = 3
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
739
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
740 def __init__(self, type):
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
741 self.type = type
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
742 def dopr(output, outformat):
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
743 self = Selection(S_PR)
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
744 self.output = output
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
745 self.outformat = outformat
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
746 return self
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
747 def domessage(arg):
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
748 self = Selection(S_MESSAGE)
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
749 self.message = arg
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
750 return self
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
751 def doattachment(arg):
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
752 self = Selection(S_ATTACHMENT)
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
753 self.attachment = arg
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
754 return self
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
755 # end class Selection
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
756
46
73e6dac29391 new stuff (checkpoint when moved between machines)
David A. Holland
parents: 33
diff changeset
757 class Op:
73e6dac29391 new stuff (checkpoint when moved between machines)
David A. Holland
parents: 33
diff changeset
758 # operation codes
73e6dac29391 new stuff (checkpoint when moved between machines)
David A. Holland
parents: 33
diff changeset
759 OP_FIELDS = 1
73e6dac29391 new stuff (checkpoint when moved between machines)
David A. Holland
parents: 33
diff changeset
760 OP_SHOW = 2
73e6dac29391 new stuff (checkpoint when moved between machines)
David A. Holland
parents: 33
diff changeset
761 OP_RANGE = 3
73e6dac29391 new stuff (checkpoint when moved between machines)
David A. Holland
parents: 33
diff changeset
762 OP_SEARCH = 4
73e6dac29391 new stuff (checkpoint when moved between machines)
David A. Holland
parents: 33
diff changeset
763
47
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
764 def __init__(self, type):
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
765 self.type = type
46
73e6dac29391 new stuff (checkpoint when moved between machines)
David A. Holland
parents: 33
diff changeset
766
73e6dac29391 new stuff (checkpoint when moved between machines)
David A. Holland
parents: 33
diff changeset
767 def dofields():
73e6dac29391 new stuff (checkpoint when moved between machines)
David A. Holland
parents: 33
diff changeset
768 return Op(OP_FIELDS)
73e6dac29391 new stuff (checkpoint when moved between machines)
David A. Holland
parents: 33
diff changeset
769 def doshow(field):
73e6dac29391 new stuff (checkpoint when moved between machines)
David A. Holland
parents: 33
diff changeset
770 self = Op(OP_SHOW)
73e6dac29391 new stuff (checkpoint when moved between machines)
David A. Holland
parents: 33
diff changeset
771 self.field = field
73e6dac29391 new stuff (checkpoint when moved between machines)
David A. Holland
parents: 33
diff changeset
772 return self
73e6dac29391 new stuff (checkpoint when moved between machines)
David A. Holland
parents: 33
diff changeset
773 def dorange(field):
73e6dac29391 new stuff (checkpoint when moved between machines)
David A. Holland
parents: 33
diff changeset
774 self = Op(OP_RANGE)
73e6dac29391 new stuff (checkpoint when moved between machines)
David A. Holland
parents: 33
diff changeset
775 self.field = field
73e6dac29391 new stuff (checkpoint when moved between machines)
David A. Holland
parents: 33
diff changeset
776 return self
47
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
777 def dosearch(s, sels):
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
778 self = Op(OP_SEARCH)
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
779 self.search = s
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
780 self.sels = sels
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
781 return self
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
782 # end class Op
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
783
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
784 def __init__(self, ops):
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
785 self.ops = ops
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
786 # end class Invocation
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
787
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
788 ############################################################
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
789 # run (eval the SQL and print the results)
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
790
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
791 def run_sel(sel, ids):
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
792 if sel.type == S_PR:
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
793 if ids == []:
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
794 sys.stderr.write("No PRs matched.\n")
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
795 exit(1)
46
73e6dac29391 new stuff (checkpoint when moved between machines)
David A. Holland
parents: 33
diff changeset
796
47
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
797 print_prs(ids)
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
798 elif sel.type == S_MESSAGE:
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
799 if len(ids) <> 1:
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
800 sys.stderr.write("Cannot retrieve messages " +
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
801 "from multiple PRs.")
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
802 exit(1)
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
803 print_message(ids[0], sel.message)
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
804 elif sel.type == S_ATTACHMENT:
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
805 if len(ids) <> 1:
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
806 sys.stderr.write("Cannot retrieve attachments " +
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
807 "from multiple PRs.")
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
808 exit(1)
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
809 print_message(ids[0], sel.attachment)
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
810 else:
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
811 assert(False)
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
812
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
813 def run_op(op):
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
814 if op.type == OP_FIELDS:
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
815 list_fields()
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
816 elif op.type == OP_SHOW:
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
817 describe_field(op.field)
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
818 elif op.type == OP_RANGE:
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
819 print_field_range(op.field)
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
820 elif op.type == OP_SEARCH:
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
821 sql = op.search
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
822 args = op.args # XXX not there!
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
823 ids = querydb(op.search, args)
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
824 for s in op.sels:
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
825 run_sel(s, ids)
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
826 else:
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
827 assert(False)
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
828
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
829 def run(ast):
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
830 for op in ast.ops:
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
831 run_op(op)
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
832
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
833 ############################################################
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
834 # compile (convert the AST so the searches are pure SQL)
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
835
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
836 #
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
837 # XXX this doesn't work, we need to keep the interned strings
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
838 # on return from compile_query.
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
839 #
46
73e6dac29391 new stuff (checkpoint when moved between machines)
David A. Holland
parents: 33
diff changeset
840
48
3d5adf5a59d0 Fix python2.7 syntax errors.
David A. Holland
parents: 47
diff changeset
841 def matches(s, rx):
3d5adf5a59d0 Fix python2.7 syntax errors.
David A. Holland
parents: 47
diff changeset
842 # XXX
3d5adf5a59d0 Fix python2.7 syntax errors.
David A. Holland
parents: 47
diff changeset
843 return True
3d5adf5a59d0 Fix python2.7 syntax errors.
David A. Holland
parents: 47
diff changeset
844
47
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
845 def compile_query(q):
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
846 if q.type == Q_QSTRING:
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
847 # XXX should use a split that honors quotes
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
848 terms = q.string.split()
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
849 terms = [dotstring(t) for t in terms]
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
850 return compile_query(doand(terms))
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
851 if q.type == Q_TSTRING:
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
852 qb = QueryBuilder()
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
853 s = q.string
48
3d5adf5a59d0 Fix python2.7 syntax errors.
David A. Holland
parents: 47
diff changeset
854 if matches(s, "^[0-9]+$"):
47
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
855 f = qb.getfield("number")
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
856 # Note: s is user-supplied but clean to insert directly
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
857 qb.addwhere("%s = %s" % (f, s))
48
3d5adf5a59d0 Fix python2.7 syntax errors.
David A. Holland
parents: 47
diff changeset
858 elif matches(s, "^[0-9]+-[0-9]+$"):
47
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
859 f = qb.getfield("number")
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
860 ss = s.split("-")
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
861 # Note: ss[] is user-supplied but clean
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
862 qb.addwhere("%s >= %s" % (f, ss[0]))
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
863 qb.addwhere("%s <= %s" % (f, ss[1]))
48
3d5adf5a59d0 Fix python2.7 syntax errors.
David A. Holland
parents: 47
diff changeset
864 elif matches(s, "^[0-9]+-$"):
47
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
865 f = qb.getfield("number")
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
866 ss = s.split("-")
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
867 # Note: ss[] is user-supplied but clean
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
868 qb.addwhere("%s >= %s" % (f, ss[0]))
48
3d5adf5a59d0 Fix python2.7 syntax errors.
David A. Holland
parents: 47
diff changeset
869 elif matches(s, "^-[0-9]+$"):
47
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
870 f = qb.getfield("number")
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
871 ss = s.split("-")
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
872 # Note: ss[] is user-supplied but clean
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
873 qb.addwhere("%s <= %s" % (f, ss[1]))
48
3d5adf5a59d0 Fix python2.7 syntax errors.
David A. Holland
parents: 47
diff changeset
874 elif matches(s, "^[^:]+:[^:]+$"):
47
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
875 # XXX honor quoted terms
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
876 # XXX = or LIKE?
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
877 ss = s.split(":")
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
878 # ss[0] is not clean but if it's crap it won't match
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
879 f = qb.getfield(ss[0])
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
880 # ss[1] is not clean, so intern it for safety
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
881 s = qb.intern(ss[1])
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
882 qb.addwhere("%s = %s" % (f, s))
48
3d5adf5a59d0 Fix python2.7 syntax errors.
David A. Holland
parents: 47
diff changeset
883 elif matches(s, "^-[^:]+:[^:]+$"):
47
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
884 # XXX honor quoted terms
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
885 # XXX <> or NOT LIKE?
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
886 ss = s.split(":")
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
887 # ss[0] is not clean but if it's crap it won't match
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
888 f = qb.getfield(ss[0])
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
889 # ss[1] is not clean, so intern it for safety
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
890 s = qb.intern(ss[1])
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
891 qb.addwhere("%s <> %s" % (f, s))
48
3d5adf5a59d0 Fix python2.7 syntax errors.
David A. Holland
parents: 47
diff changeset
892 elif matches(s, "^-"):
47
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
893 # XXX <> or NOT LIKE?
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
894 f = qb.getfield("alltext")
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
895 # s is not clean, so intern it for safety
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
896 s = qb.intern(s)
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
897 qb.addwhere("%s <> %s" % (f, s))
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
898 else:
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
899 # XXX = or LIKE?
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
900 f = qb.getfield("alltext")
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
901 # s is not clean, so intern it for safety
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
902 s = qb.intern(s)
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
903 qb.addwhere("%s = %s" % (f, s))
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
904
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
905 # XXX also does not handle:
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
906 #
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
907 # field: with no string (supposed to use a default
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
908 # search string)
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
909 #
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
910 # generated search fields that parse dates:
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
911 # {arrived,closed,modified,etc.}-{before,after}:date
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
912 #
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
913 # stale:time
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
914
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
915 return qb.build("PRs.id")
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
916 # end Q_TSTRING case
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
917 if q.type == Q_OR:
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
918 subqueries = ["(" + compile_query(sq) + ")" for sq in q.args]
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
919 return " UNION ".join(subqueries)
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
920 if q.type == Q_AND:
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
921 subqueries = ["(" + compile_query(sq) + ")" for sq in q.args]
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
922 return " INTERSECT ".join(subqueries)
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
923 if q.type == Q_SQL:
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
924 return q.sql
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
925 assert(False)
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
926 # end compile_query
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
927
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
928 def compile_order(qb, o):
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
929 str = qb.getfield(o.field)
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
930 if o.rev:
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
931 str = str + " DESCENDING"
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
932 return str
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
933
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
934 def compile_search(s):
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
935 qb2 = QueryBuilder()
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
936
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
937 # multiple query strings are treated as OR
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
938 query = door(s.queries)
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
939 query = compile_query(q)
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
940
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
941 if s.openonly:
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
942 qb2.addwhere("not %s" % qb.getfield("closed"))
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
943 if s.publiconly:
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
944 qb2.addwhere("not %s" % qb.getfield("confidential"))
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
945
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
946 orders = [compile_order(qb2, o) for o in s.orders]
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
947 order = ", ".join(orders)
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
948 if order <> "":
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
949 qb2.setorder(order)
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
950
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
951 if qb2.nonempty():
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
952 qb2.addjoin(query, "search")
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
953 qb2.addjoin("PRs")
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
954 qb2.addwhere("search = PRs.id")
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
955 query = qb2.build(["search"])
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
956
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
957 return query
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
958 # end compile_search
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
959
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
960 def compile_op(op):
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
961 if op.type == OP_SEARCH:
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
962 op.search = compile_search(op.search)
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
963 return op
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
964
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
965 def compile(ast):
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
966 ast.ops = [compile_op(op) for op in ast.ops]
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
967
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
968 ############################################################
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
969 # arg handling
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
970
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
971 #
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
972 # I swear, all getopt interfaces suck.
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
973 #
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
974 # Provide an argparse action for constructing something out of the
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
975 # argument value and appending that somewhere, since it can't do this
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
976 # on its own.
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
977 #
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
978 # The way you use this:
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
979 # p.add_argument("--foo", action = CtorAppend, dest = 'mylist',
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
980 # const = ctor)
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
981 # where ctor is a function taking the option arg(s) and producing
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
982 # a value to append to mylist.
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
983 #
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
984 # This itself is mangy even for what it is -- it seems like we should
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
985 # be able to pass action=CtorAppend(ctor), but since it has to be a
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
986 # class that doesn't work... unless you make a new class for every
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
987 # ctor you want to use, which seems completely insane.
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
988 #
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
989 class CtorAppend(argparse.Action):
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
990 def __call__(self, parser, namespace, values, option_string=None):
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
991 items = getattr(namespace, self.dest)
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
992 item = self.const(values)
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
993 items.append(item)
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
994 setattr(namespace, self.dest, items)
46
73e6dac29391 new stuff (checkpoint when moved between machines)
David A. Holland
parents: 33
diff changeset
995
73e6dac29391 new stuff (checkpoint when moved between machines)
David A. Holland
parents: 33
diff changeset
996 def getargs():
73e6dac29391 new stuff (checkpoint when moved between machines)
David A. Holland
parents: 33
diff changeset
997 p = argparse.ArgumentParser(program_description)
73e6dac29391 new stuff (checkpoint when moved between machines)
David A. Holland
parents: 33
diff changeset
998
73e6dac29391 new stuff (checkpoint when moved between machines)
David A. Holland
parents: 33
diff changeset
999 # note: -h/--help is built in by default
73e6dac29391 new stuff (checkpoint when moved between machines)
David A. Holland
parents: 33
diff changeset
1000 p.add_argument("-v", "--version",
73e6dac29391 new stuff (checkpoint when moved between machines)
David A. Holland
parents: 33
diff changeset
1001 action='version', version=program_version,
73e6dac29391 new stuff (checkpoint when moved between machines)
David A. Holland
parents: 33
diff changeset
1002 help="Print program version and exit")
73e6dac29391 new stuff (checkpoint when moved between machines)
David A. Holland
parents: 33
diff changeset
1003
73e6dac29391 new stuff (checkpoint when moved between machines)
David A. Holland
parents: 33
diff changeset
1004 p.add_argument("--show", nargs=1,
47
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
1005 action=CtorAppend, dest='ops',
48
3d5adf5a59d0 Fix python2.7 syntax errors.
David A. Holland
parents: 47
diff changeset
1006 const=Invocation.Op.doshow,
47
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
1007 help="Show description of field")
46
73e6dac29391 new stuff (checkpoint when moved between machines)
David A. Holland
parents: 33
diff changeset
1008 p.add_argument("--range", nargs=1,
47
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
1009 action=CtorAppend, dest='ops',
48
3d5adf5a59d0 Fix python2.7 syntax errors.
David A. Holland
parents: 47
diff changeset
1010 const=Invocation.Op.dorange,
47
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
1011 help="Show range of extant values for field")
46
73e6dac29391 new stuff (checkpoint when moved between machines)
David A. Holland
parents: 33
diff changeset
1012
73e6dac29391 new stuff (checkpoint when moved between machines)
David A. Holland
parents: 33
diff changeset
1013 p.add_argument("--search", nargs=1,
47
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
1014 action=CtorAppend, dest='queries',
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
1015 const=Invocation.Query.doqstring,
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
1016 help="Force string to be read as a search string")
46
73e6dac29391 new stuff (checkpoint when moved between machines)
David A. Holland
parents: 33
diff changeset
1017 p.add_argument("-s", "--sql", nargs=1,
47
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
1018 action=CtorAppend, dest='queries',
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
1019 const=Invocation.Query.dosql,
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
1020 help="Supply explicit sql query as search")
46
73e6dac29391 new stuff (checkpoint when moved between machines)
David A. Holland
parents: 33
diff changeset
1021
73e6dac29391 new stuff (checkpoint when moved between machines)
David A. Holland
parents: 33
diff changeset
1022 p.add_argument("--open",
47
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
1023 action='store_const', dest='openonly', const="True",
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
1024 help="Exclude closed PRs (default)")
46
73e6dac29391 new stuff (checkpoint when moved between machines)
David A. Holland
parents: 33
diff changeset
1025 p.add_argument("--closed",
47
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
1026 action='store_const', dest='openonly', const="False",
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
1027 help="Include closed PRs in search")
46
73e6dac29391 new stuff (checkpoint when moved between machines)
David A. Holland
parents: 33
diff changeset
1028 p.add_argument("--public",
47
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
1029 action='store_const', dest='publiconly', const="True",
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
1030 help="Exclude confidential PRs")
46
73e6dac29391 new stuff (checkpoint when moved between machines)
David A. Holland
parents: 33
diff changeset
1031 p.add_argument("--privileged",
47
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
1032 action='store_const', dest='publiconly', const="False",
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
1033 help="Allow confidential PRs (default)")
46
73e6dac29391 new stuff (checkpoint when moved between machines)
David A. Holland
parents: 33
diff changeset
1034
73e6dac29391 new stuff (checkpoint when moved between machines)
David A. Holland
parents: 33
diff changeset
1035 p.add_argument("--oldest",
47
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
1036 action=CtorAppend, dest='orders',
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
1037 const=Invocation.Order.dooldest,
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
1038 help="Sort output with oldest PRs first")
46
73e6dac29391 new stuff (checkpoint when moved between machines)
David A. Holland
parents: 33
diff changeset
1039 p.add_argument("--newest",
47
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
1040 action=CtorAppend, dest='orders',
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
1041 const=Invocation.Order.donewest,
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
1042 help="Sort output with newest PRs first")
46
73e6dac29391 new stuff (checkpoint when moved between machines)
David A. Holland
parents: 33
diff changeset
1043 p.add_argument("--staleness",
47
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
1044 action=CtorAppend, dest='orders',
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
1045 const=Invocation.Order.dostaleness,
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
1046 help="Sort output by time since last modification")
46
73e6dac29391 new stuff (checkpoint when moved between machines)
David A. Holland
parents: 33
diff changeset
1047 p.add_argument("--orderby", nargs=1,
47
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
1048 action=CtorAppend, dest='orders',
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
1049 const=Invocation.Order.dofield,
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
1050 help="Sort output by specific field")
46
73e6dac29391 new stuff (checkpoint when moved between machines)
David A. Holland
parents: 33
diff changeset
1051 p.add_argument("--revorderby", nargs=1,
47
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
1052 action=CtorAppend, dest='orders',
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
1053 const=Invocation.Order.dorevfield,
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
1054 help="Sort output by specific field, reversed")
46
73e6dac29391 new stuff (checkpoint when moved between machines)
David A. Holland
parents: 33
diff changeset
1055
73e6dac29391 new stuff (checkpoint when moved between machines)
David A. Holland
parents: 33
diff changeset
1056 p.add_argument("-m", "--message", nargs=1,
47
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
1057 action=CtorAppend, dest='selections',
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
1058 const=Invocation.Selection.domessage,
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
1059 help="Print selected message (single PR only)")
46
73e6dac29391 new stuff (checkpoint when moved between machines)
David A. Holland
parents: 33
diff changeset
1060 p.add_argument("-a", "--attachment", nargs=1,
47
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
1061 action=CtorAppend, dest='selections',
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
1062 const=Invocation.Selection.doattachment,
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
1063 help="Print selected attachment (single PR only)")
46
73e6dac29391 new stuff (checkpoint when moved between machines)
David A. Holland
parents: 33
diff changeset
1064
73e6dac29391 new stuff (checkpoint when moved between machines)
David A. Holland
parents: 33
diff changeset
1065 p.add_argument("-r", "--raw",
47
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
1066 action = 'store_const', const="RAW",
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
1067 dest = 'output',
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
1068 help="Print exactly what the database returns")
46
73e6dac29391 new stuff (checkpoint when moved between machines)
David A. Holland
parents: 33
diff changeset
1069 p.add_argument("-l", "--list",
47
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
1070 action = 'store_const', const="LIST",
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
1071 dest = 'output',
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
1072 help="Print in list form (default)")
46
73e6dac29391 new stuff (checkpoint when moved between machines)
David A. Holland
parents: 33
diff changeset
1073 p.add_argument("--headers",
47
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
1074 action = 'store_const', const="HEADERS",
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
1075 dest = 'output',
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
1076 help="Print header information only")
46
73e6dac29391 new stuff (checkpoint when moved between machines)
David A. Holland
parents: 33
diff changeset
1077 p.add_argument("--meta",
47
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
1078 action = 'store_const', const="META",
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
1079 dest = 'output',
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
1080 help="Print all metadata")
46
73e6dac29391 new stuff (checkpoint when moved between machines)
David A. Holland
parents: 33
diff changeset
1081 p.add_argument("--metadata",
47
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
1082 action = 'store_const', const="META",
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
1083 dest = 'output')
46
73e6dac29391 new stuff (checkpoint when moved between machines)
David A. Holland
parents: 33
diff changeset
1084 p.add_argument("-f", "--full",
47
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
1085 action = 'store_const', const="FULL",
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
1086 dest = 'output',
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
1087 help="Print everything")
46
73e6dac29391 new stuff (checkpoint when moved between machines)
David A. Holland
parents: 33
diff changeset
1088
73e6dac29391 new stuff (checkpoint when moved between machines)
David A. Holland
parents: 33
diff changeset
1089 p.add_argument("--text",
47
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
1090 action = 'store_const', const="TEXT",
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
1091 dest = 'outformat',
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
1092 help="Print in text format (default)")
46
73e6dac29391 new stuff (checkpoint when moved between machines)
David A. Holland
parents: 33
diff changeset
1093 p.add_argument("--csv",
47
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
1094 action = 'store_const', const="CSV",
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
1095 dest = 'outformat',
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
1096 help="Print a CSV file")
46
73e6dac29391 new stuff (checkpoint when moved between machines)
David A. Holland
parents: 33
diff changeset
1097 p.add_argument("--xml",
47
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
1098 action = 'store_const', const="XML",
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
1099 dest = 'outformat',
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
1100 help="Print in XML")
46
73e6dac29391 new stuff (checkpoint when moved between machines)
David A. Holland
parents: 33
diff changeset
1101 p.add_argument("--json",
47
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
1102 action = 'store_const', const="JSON",
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
1103 dest = 'outformat',
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
1104 help="Print in JSON")
46
73e6dac29391 new stuff (checkpoint when moved between machines)
David A. Holland
parents: 33
diff changeset
1105 p.add_argument("--rdf",
47
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
1106 action = 'store_const', const="RDF",
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
1107 dest = 'outbformat',
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
1108 help="Print in RDF")
46
73e6dac29391 new stuff (checkpoint when moved between machines)
David A. Holland
parents: 33
diff changeset
1109 p.add_argument("--rdflike",
47
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
1110 action = 'store_const', const="RDFLIKE",
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
1111 dest = 'outformat',
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
1112 help="Print RDF-like text")
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
1113
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
1114 p.add_argument("TERM", nargs='*',
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
1115 action=CtorAppend, dest='queries',
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
1116 const=Invocation.Query.doqstring,
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
1117 help="Search term")
46
73e6dac29391 new stuff (checkpoint when moved between machines)
David A. Holland
parents: 33
diff changeset
1118
73e6dac29391 new stuff (checkpoint when moved between machines)
David A. Holland
parents: 33
diff changeset
1119 args = p.parse_args()
73e6dac29391 new stuff (checkpoint when moved between machines)
David A. Holland
parents: 33
diff changeset
1120
47
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
1121 ops = args.ops
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
1122 if ops is None:
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
1123 ops = []
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
1124 queries = args.queries
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
1125 if queries is not None:
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
1126 openonly = args.openonly
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
1127 if openonly is None:
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
1128 openonly = True
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
1129 publiconly = args.publiconly
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
1130 if publiconly is None:
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
1131 publiconly = False
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
1132 orders = args.orders
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
1133 if orders is None:
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
1134 orders = [Invocation.Order.dooldest(None)]
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
1135 output = args.output
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
1136 if output is None:
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
1137 output = "LIST"
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
1138 outformat = args.outformat
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
1139 if outformat is None:
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
1140 outformat = "TEXT"
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
1141 selections = args.selections
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
1142 if selections is None:
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
1143 sel = Invocation.Selection.dopr(output, outformat)
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
1144 selections = [sel]
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
1145 search = Search(queries, openonly, publiconly, orders)
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
1146 op = dosearch(search, selections)
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
1147 ops.append(op)
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
1148 # endif
46
73e6dac29391 new stuff (checkpoint when moved between machines)
David A. Holland
parents: 33
diff changeset
1149
47
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
1150 return Invocation(ops)
33
298c8a7f5181 begin hacking
David A. Holland
parents: 7
diff changeset
1151 # end getargs
298c8a7f5181 begin hacking
David A. Holland
parents: 7
diff changeset
1152
298c8a7f5181 begin hacking
David A. Holland
parents: 7
diff changeset
1153 ############################################################
298c8a7f5181 begin hacking
David A. Holland
parents: 7
diff changeset
1154 # main
298c8a7f5181 begin hacking
David A. Holland
parents: 7
diff changeset
1155
47
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
1156 todo = getargs()
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
1157 opendb()
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
1158 fetch_classifications()
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
1159 todo = compile(todo)
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
1160 run(todo)
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
1161 closedb()
bcd1d06838fd more better stuff
David A. Holland
parents: 46
diff changeset
1162 exit(0)
46
73e6dac29391 new stuff (checkpoint when moved between machines)
David A. Holland
parents: 33
diff changeset
1163