1    | #ifndef READ_QUERY_INSTRUCTIONS
2    | #define READ_QUERY_INSTRUCTIONS
3    | 
4    | /***************************************
5    |   $Revision: 1.11 $
6    | 
7    |   Query instruction module (qi)
8    |   config module.
9    | 
10   |   Status: NOT REVUED, NOT TESTED
11   | 
12   |   ******************/ /******************
13   |   Copyright (c) 1999                              RIPE NCC
14   |  
15   |   All Rights Reserved
16   |   
17   |   Permission to use, copy, modify, and distribute this software and its
18   |   documentation for any purpose and without fee is hereby granted,
19   |   provided that the above copyright notice appear in all copies and that
20   |   both that copyright notice and this permission notice appear in
21   |   supporting documentation, and that the name of the author not be
22   |   used in advertising or publicity pertaining to distribution of the
23   |   software without specific, written prior permission.
24   |   
25   |   THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
26   |   ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS; IN NO EVENT SHALL
27   |   AUTHOR BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY
28   |   DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN
29   |   AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
30   |   OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
31   |   ***************************************/
32   | #include "mysql_driver.h"
33   | #include "query_command.h"
34   | 
35   | #define MAX_INSTRUCTIONS 100
36   | 
37   | /* SQL queries for the RIPE database */
38   | #define Q_PRI_NAME          "SELECT N00.pe_ro_id FROM %s              WHERE  %s              "                    /* whois NAME            */
39   | #define Q_INV_NAME          "SELECT %s.object_id FROM %s, %%s         WHERE  %s.pe_ro_id = N00.pe_ro_id AND %%s"  /* whois -iac,tc,zc NAME */
40   |                             
41   | #define Q_PRI_NICHDL        "SELECT pe_ro_id     FROM person_role     WHERE person_role.nic_hdl = '%s'"                                          /* whois NICHDL            */
42   | #define Q_INV_NICHDL        "SELECT %s.object_id FROM person_role, %s WHERE person_role.nic_hdl = '%s' AND person_role.pe_ro_id = %s.pe_ro_id"   /* whois -iac,tc,zc NICHDL */
43   |                             
44   | #define Q_PRI_EMAIL         "SELECT object_id    FROM e_mail          WHERE e_mail     = '%s'"  /* whois EMAIL      */
45   | #define Q_INV_EMAIL         "SELECT object_id    FROM notify          WHERE notify     = '%s'"  /* whois -iny EMAIL */
46   |                             
47   | #define Q_PRI_MAINT         "SELECT mnt_id       FROM mntner          WHERE mntner     = '%s'"  /* whois MAINT      */
48   | #define Q_INV_MAINT         "SELECT object_id    FROM mnt_by          WHERE mntner     = '%s'"  /* whois -imb MAINT */
49   |                             
50   | #define Q_PRI_KEYCERT       "SELECT key_cert_id  FROM key_cert        WHERE key_cert   = '%s'"  /* whois KEYCERT */
51   | #define Q_INV_KEYCERT       NULL
52   | 
53   | #define Q_PRI_IPRANGE       "SELECT in_id        FROM inetnum         WHERE inetnum    = '%s'"  /* whois IPRANGE */
54   | #define Q_INV_IPRANGE       NULL
55   | 
56   | #define Q_PRI_IP6RANGE      "SELECT i6_id        FROM inet6num        WHERE inetnum    = '%s'"  /* whois IP6RANGE */
57   | #define Q_INV_IP6RANGE      NULL
58   |                             
59   | #define Q_PRI_NETNAME       "SELECT in_id        FROM inetnum         WHERE netname    = '%s'"  /* whois NETNAME */
60   | #define Q_INV_NETNAME       NULL
61   |                             
62   | #define Q_PRI_ASNUM         "SELECT an_id        FROM aut_num         WHERE aut_num    = '%s'"  /* whois ASNUM */
63   | #define Q_INV_ASNUM         "SELECT rt_id        FROM route           WHERE origin     = '%s'"  /* whois -ior ASNUM */
64   | 
65   | #define Q_PRI_ASSETNAME     "SELECT as_id        FROM as_set          WHERE as_set     = '%s'"  /* whois ASSETNAME */
66   | #define Q_INV_ASSETNAME     NULL
67   | 
68   | #define Q_PRI_ROUTESETNAME  "SELECT rs_id        FROM route_set       WHERE route_set  = '%s'"  /* whois ROUTESETNAME */
69   | #define Q_INV_ROUTESETNAME  NULL
70   | 
71   | #define Q_PRI_DOMNAME       "SELECT dn_id        FROM domain          WHERE domain     = '%s'"  /* whois DOMNAME */
72   | #define Q_INV_DOMNAME       "SELECT dn_id        FROM dn_sub_dom      WHERE domain     = '%s'"  /* whois -isd DOMNAME */
73   | 
74   | #define Q_PRI_HOSTNAME      NULL                                                                /* whois HOSTNAME */
75   | #define Q_INV_HOSTNAME      NULL
76   | 
77   | #define Q_PRI_LIMERICKNAME  "SELECT li_id        FROM limerick        WHERE limerick   = '%s'"  /* whois LIMERICKNAME */
78   | #define Q_INV_LIMERICKNAME  NULL
79   | 
80   | 
81   | #define Q_OBJECTS     "SELECT last.serial, last.prev_serial, last.object FROM last, %s WHERE last.serial=%s.id GROUP BY last.serial"
82   | 
83   | #define Q_REC         "INSERT INTO %s_R SELECT pe_ro_id FROM %s, %s WHERE object_id = %s.id"
84   | 
85   | /* XXX This takes too long.  :-(
86   | #define Q_REC_OBJECTS "SELECT last.serial, last.prev_serial, last.object FROM last, %s, %s_R WHERE last.serial=%s_R.id AND %s.id != %s_R.id GROUP BY last.serial"
87   | 
88   | --- snipped from http://www.tcx.se/Manual/manual.html ---
89   | 
90   | 5.3 Functionality missing from MySQL
91   | 
92   | The following functionality is missing in the current version of MySQL. For a prioritized list indicating when new extensions may be added to MySQL, you should consult the
93   | online MySQL TODO list. That is the latest version of the TODO list in this manual. See section F List of things we want to add to MySQL in the future (The TODO). 
94   | 
95   | 5.3.1 Sub-selects
96   | 
97   | The following will not yet work in MySQL: 
98   | 
99   | SELECT * FROM table1 WHERE id IN (SELECT id FROM table2);
100  | SELECT * FROM table1 WHERE id NOT IN (SELECT id FROM table2);
101  | 
102  | However, in many cases you can rewrite the query without a sub select: 
103  | 
104  | SELECT table1.* FROM table1,table2 WHERE table1.id=table2.id;
105  | SELECT table1.* FROM table1 LEFT JOIN table2 ON table1.id=table2.id where table2.id IS NULL
106  | 
107  | For more complicated sub queries you can create temporary tables to hold the sub query. 
108  | 
109  | MySQL only supports INSERT ... SELECT ... and REPLACE ... SELECT ... Independent sub-selects will be probably be available in 3.24.0. You can now use the function IN() in other
110  | contexts, however. 
111  | 
112  | --- end snip ---
113  | 
114  | Ie. Try using a LEFT JOIN to do the "NOT IN"/ "MINUS" equivalent.
115  | 
116  | */
117  | #define Q_REC_OBJECTS "SELECT last.serial, last.prev_serial, last.object FROM last, %s_R WHERE last.serial=%s_R.id GROUP BY last.serial"
118  | 
119  | #define Q_NO_OBJECTS  "SELECT serial, prev_serial, object FROM last WHERE serial = 0"
120  | 
121  | 
122  | typedef enum QI_Type_t {
123  |   QI_SQL=0,
124  |   QI_RADIX,
125  |   QI_RADIX_IN,
126  |   QI_RADIX_RT,
127  |   QI_END
128  | } QI_Type;
129  | 
130  | 
131  | typedef struct Query_instruction_t {
132  |   QI_Type search_type;
133  |   char *query_str;
134  |   char *rx_keys;
135  |   unsigned int rx_srch_mode;
136  |   unsigned int rx_par_a;
137  | } Query_instruction;
138  | 
139  | typedef struct Query_instructions_t {
140  |   Query_instruction *instruction[MAX_INSTRUCTIONS];
141  |   unsigned int sock;
142  |   unsigned int recursive;
143  | } Query_instructions;
144  | 
145  | 
146  | void QI_execute(void *database_voidptr, void *qis_voidptr);
147  | void QI_free(Query_instructions *qis);
148  | Query_instructions *QI_new(const Query_command *qc, unsigned int sock);
149  | 
150  | #endif /* READ_QUERY_INSTRUCTIONS */