1 | #ifndef READ_QUERY_INSTRUCTIONS
2 | #define READ_QUERY_INSTRUCTIONS
3 |
4 | /***************************************
5 | $Revision: 1.21 $
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 "rxroutines.h"
33 | #include "iproutines.h"
34 | #include "mysql_driver.h"
35 | #include "query_command.h"
36 | #include "defs.h"
37 | #include "which_keytypes.h"
38 |
39 | #include "access_control.h"
40 |
41 |
42 | /* RIPE3 version.
43 | #define Q_OBJECTS "SELECT last.serial, last.prev_serial, last.object FROM last, %s WHERE last.serial=%s.id GROUP BY last.serial"
44 | */
45 | /* RIPE4
46 | #define Q_OBJECTS "SELECT last.object_id, last.sequence_id, last.object FROM last, %s WHERE last.object_id=%s.id AND last.object_type != 100 GROUP BY last.object_id"
47 | */
48 | /* RIPE 6 */
49 | #define Q_OBJECTS "SELECT last.object_id, last.sequence_id, last.object ,last.object_type FROM last, %s WHERE last.object_id=%s.id AND last.object_type != 100 GROUP BY last.object_id"
50 |
51 | #define Q_REC "INSERT INTO %s_R SELECT pe_ro_id FROM %s, %s WHERE object_id = %s.id"
52 |
53 | /* XXX This takes too long. :-(
54 | #define Q_REC_OBJECTS "SELECT last.serial, last.prev_serial, last.object FROM last, %s_R, %s WHERE last.serial=%s_R.id AND %s.id != %s_R.id GROUP BY last.serial"
55 |
56 | --- snipped from http://www.tcx.se/Manual/manual.html ---
57 |
58 | 5.3 Functionality missing from MySQL
59 |
60 | 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
61 | 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).
62 |
63 | 5.3.1 Sub-selects
64 |
65 | The following will not yet work in MySQL:
66 |
67 | SELECT * FROM table1 WHERE id IN (SELECT id FROM table2);
68 | SELECT * FROM table1 WHERE id NOT IN (SELECT id FROM table2);
69 |
70 | However, in many cases you can rewrite the query without a sub select:
71 |
72 | SELECT table1.* FROM table1,table2 WHERE table1.id=table2.id;
73 | SELECT table1.* FROM table1 LEFT JOIN table2 ON table1.id=table2.id where table2.id IS NULL
74 |
75 | For more complicated sub queries you can create temporary tables to hold the sub query.
76 |
77 | 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
78 | contexts, however.
79 |
80 | --- end snip ---
81 |
82 | Ie. Try using a LEFT JOIN to do the "NOT IN"/ "MINUS" equivalent.
83 |
84 | */
85 | /* RIPE3 version.
86 | #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"
87 | */
88 | /* RIPE4 version
89 | #define Q_REC_OBJECTS "SELECT last.object_id, last.sequence_id, last.object FROM last, %s_R WHERE last.object_id=%s_R.id AND last.object_type != 100 GROUP BY last.object_id"
90 | */
91 | /* RIPE6 version */
92 | #define Q_REC_OBJECTS "SELECT last.object_id, last.sequence_id, last.object,last.object_type FROM last, %s_R WHERE last.object_id=%s_R.id AND last.object_type != 100 GROUP BY last.object_id"
93 |
94 |
95 |
96 | /* RIPE3 version
97 | #define Q_NO_OBJECTS "SELECT serial, prev_serial, object FROM last WHERE serial = 0"
98 | */
99 | #define Q_NO_OBJECTS "SELECT object_id, sequence_id, object FROM last WHERE object_id = 0"
100 |
101 | #define MAX_INSTRUCTIONS 100
102 |
103 | typedef enum _R_Type_t {
104 | R_SQL=0,
105 | R_RADIX,
106 | R_END
107 | } R_Type_t;
108 |
109 | typedef enum _Q_Type_t {
110 | Q_LOOKUP=0,
111 | Q_INVERSE,
112 | } Q_Type_t;
113 |
114 | typedef enum _S_Type_t {
115 | IPv4,
116 | IPv6
117 | } S_Type_t;
118 |
119 | typedef struct Query_instruction_t {
120 | R_Type_t search_type;
121 | int queryindex;/* index into the Query table showing origin of this entry */
122 | char *query_str;
123 | char *rx_keys;
124 | unsigned int rx_srch_mode;
125 | unsigned int rx_par_a;
126 | ip_space_t space;
127 | rx_fam_t family;
128 | } Query_instruction;
129 |
130 | typedef struct Query_instructions_t {
131 | Query_instruction *instruction[MAX_INSTRUCTIONS];
132 | unsigned int filtered;
133 | unsigned int fast;
134 | unsigned int recursive;
135 | const Query_command *qc; /* pointer to the Query_command structure of this query */
136 | } Query_instructions;
137 |
138 |
139 | void QI_execute(void *database_voidptr, Query_instructions *qis, Query_environ *qe, acc_st *acc_credit, acl_st *acl);
140 | void QI_free(Query_instructions *qis);
141 | Query_instructions *QI_new(const Query_command *qc, const Query_environ *qe);
142 |
143 | #endif /* READ_QUERY_INSTRUCTIONS */