1 | #ifndef ITEM_XMLFUNC_INCLUDED |
2 | #define ITEM_XMLFUNC_INCLUDED |
3 | |
4 | /* Copyright (c) 2000-2007 MySQL AB, 2009 Sun Microsystems, Inc. |
5 | Use is subject to license terms. |
6 | |
7 | This program is free software; you can redistribute it and/or modify |
8 | it under the terms of the GNU General Public License as published by |
9 | the Free Software Foundation; version 2 of the License. |
10 | |
11 | This program is distributed in the hope that it will be useful, |
12 | but WITHOUT ANY WARRANTY; without even the implied warranty of |
13 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
14 | GNU General Public License for more details. |
15 | |
16 | You should have received a copy of the GNU General Public License |
17 | along with this program; if not, write to the Free Software |
18 | Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ |
19 | |
20 | |
21 | /* This file defines all XML functions */ |
22 | |
23 | |
24 | typedef struct my_xml_node_st MY_XML_NODE; |
25 | |
26 | |
27 | class Item_xml_str_func: public Item_str_func |
28 | { |
29 | protected: |
30 | /* |
31 | A helper class to store raw and parsed XML. |
32 | */ |
33 | class XML |
34 | { |
35 | bool m_cached; |
36 | String *m_raw_ptr; // Pointer to text representation |
37 | String m_raw_buf; // Cached text representation |
38 | String m_parsed_buf; // Array of MY_XML_NODEs, pointing to raw_buffer |
39 | bool parse(); |
40 | void reset() |
41 | { |
42 | m_cached= false; |
43 | m_raw_ptr= (String *) 0; |
44 | } |
45 | public: |
46 | XML() { reset(); } |
47 | void set_charset(CHARSET_INFO *cs) { m_parsed_buf.set_charset(cs); } |
48 | String *raw() { return m_raw_ptr; } |
49 | String *parsed() { return &m_parsed_buf; } |
50 | const MY_XML_NODE *node(uint idx); |
51 | bool cached() { return m_cached; } |
52 | bool parse(String *raw, bool cache); |
53 | bool parse(Item *item, bool cache) |
54 | { |
55 | String *res; |
56 | if (!(res= item->val_str(&m_raw_buf))) |
57 | { |
58 | m_raw_ptr= (String *) 0; |
59 | m_cached= cache; |
60 | return true; |
61 | } |
62 | return parse(res, cache); |
63 | } |
64 | }; |
65 | String m_xpath_query; // XPath query text |
66 | Item *nodeset_func; |
67 | XML xml; |
68 | bool get_xml(XML *xml_arg, bool cache= false) |
69 | { |
70 | if (!cache && xml_arg->cached()) |
71 | return xml_arg->raw() == 0; |
72 | return xml_arg->parse(args[0], cache); |
73 | } |
74 | public: |
75 | Item_xml_str_func(THD *thd, Item *a, Item *b): Item_str_func(thd, a, b) |
76 | { |
77 | maybe_null= TRUE; |
78 | } |
79 | Item_xml_str_func(THD *thd, Item *a, Item *b, Item *c): |
80 | Item_str_func(thd, a, b, c) |
81 | { |
82 | maybe_null= TRUE; |
83 | } |
84 | bool fix_fields(THD *thd, Item **ref); |
85 | void fix_length_and_dec(); |
86 | bool const_item() const |
87 | { |
88 | return const_item_cache && (!nodeset_func || nodeset_func->const_item()); |
89 | } |
90 | }; |
91 | |
92 | |
93 | class : public Item_xml_str_func |
94 | { |
95 | public: |
96 | (THD *thd, Item *a, Item *b): |
97 | Item_xml_str_func(thd, a, b) {} |
98 | const char *() const { return "extractvalue" ; } |
99 | String *(String *); |
100 | Item *(THD *thd) |
101 | { return get_item_copy<Item_func_xml_extractvalue>(thd, this); } |
102 | }; |
103 | |
104 | |
105 | class Item_func_xml_update: public Item_xml_str_func |
106 | { |
107 | String tmp_value2, tmp_value3; |
108 | bool collect_result(String *str, |
109 | const MY_XML_NODE *cut, |
110 | const String *replace); |
111 | public: |
112 | Item_func_xml_update(THD *thd, Item *a, Item *b, Item *c): |
113 | Item_xml_str_func(thd, a, b, c) {} |
114 | const char *func_name() const { return "updatexml" ; } |
115 | String *val_str(String *); |
116 | Item *get_copy(THD *thd) |
117 | { return get_item_copy<Item_func_xml_update>(thd, this); } |
118 | }; |
119 | |
120 | #endif /* ITEM_XMLFUNC_INCLUDED */ |
121 | |