1 #include "dynamic_ids.h"
2
cmp_string(const void * id1,const void * id2)3 int cmp_string(const void *id1, const void *id2)
4 {
5 return strcmp((char *) id1, (char *) id2);
6 }
7
cmp_ulong(const void * id1,const void * id2)8 int cmp_ulong(const void *id1, const void *id2)
9 {
10 return ((*(ulong *) id1) - (* (ulong *)id2));
11 }
12
Dynamic_ids(size_t param_size)13 Dynamic_ids::Dynamic_ids(size_t param_size): size(param_size)
14 {
15 my_init_dynamic_array(&dynamic_ids, size, 16, 16);
16 }
17
~Dynamic_ids()18 Dynamic_ids::~Dynamic_ids()
19 {
20 delete_dynamic(&dynamic_ids);
21 }
22
do_unpack_dynamic_ids(char * param_dynamic_ids)23 bool Server_ids::do_unpack_dynamic_ids(char *param_dynamic_ids)
24 {
25 char *token= NULL, *last= NULL;
26 uint num_items= 0;
27
28 DBUG_ENTER("Server_ids::unpack_dynamic_ids");
29
30 token= strtok_r((char *)const_cast<const char*>(param_dynamic_ids),
31 " ", &last);
32
33 if (token == NULL)
34 DBUG_RETURN(TRUE);
35
36 num_items= atoi(token);
37 for (uint i=0; i < num_items; i++)
38 {
39 token= strtok_r(NULL, " ", &last);
40 if (token == NULL)
41 DBUG_RETURN(TRUE);
42 else
43 {
44 ulong val= atol(token);
45 insert_dynamic(&dynamic_ids, (uchar *) &val);
46 }
47 }
48 DBUG_RETURN(FALSE);
49 }
50
do_pack_dynamic_ids(String * buffer)51 bool Server_ids::do_pack_dynamic_ids(String *buffer)
52 {
53 DBUG_ENTER("Server_ids::pack_dynamic_ids");
54
55 if (buffer->set_int(dynamic_ids.elements, FALSE, &my_charset_bin))
56 DBUG_RETURN(TRUE);
57
58 for (ulong i= 0;
59 i < dynamic_ids.elements; i++)
60 {
61 ulong s_id;
62 get_dynamic(&dynamic_ids, (uchar*) &s_id, i);
63 if (buffer->append(" ") ||
64 buffer->append_ulonglong(s_id))
65 DBUG_RETURN(TRUE);
66 }
67
68 DBUG_RETURN(FALSE);
69 }
70
do_search_id(const void * id)71 bool Server_ids::do_search_id(const void *id)
72 {
73 return (bsearch((ulong *) id, dynamic_ids.buffer,
74 dynamic_ids.elements, size,
75 (int (*) (const void*, const void*))
76 cmp_ulong) != NULL);
77 }
78
79
do_unpack_dynamic_ids(char * param_dynamic_ids)80 bool Database_ids::do_unpack_dynamic_ids(char *param_dynamic_ids)
81 {
82 char *token= NULL, *last= NULL;
83 uint num_items= 0;
84
85 DBUG_ENTER("Server_ids::unpack_dynamic_ids");
86
87 token= strtok_r((char *)const_cast<const char*>(param_dynamic_ids),
88 " ", &last);
89
90 if (token == NULL)
91 DBUG_RETURN(TRUE);
92
93 num_items= atoi(token);
94 for (uint i=0; i < num_items; i++)
95 {
96 token= strtok_r(NULL, " ", &last);
97 if (token == NULL)
98 DBUG_RETURN(TRUE);
99 else
100 {
101 size_t size= strlen(token);
102 if (token[size - 1] == '\n')
103 {
104 /*
105 Remove \n as there may be one when reading from file.
106 After improving init_dynarray_intvar_from_file we can
107 remove this.
108 */
109 token[size -1]= '\0';
110 }
111 insert_dynamic(&dynamic_ids, (uchar *) token);
112 }
113 }
114 DBUG_RETURN(FALSE);
115 }
116
do_pack_dynamic_ids(String * buffer)117 bool Database_ids::do_pack_dynamic_ids(String *buffer)
118 {
119 char token[2000];
120
121 DBUG_ENTER("Server_ids::pack_dynamic_ids");
122
123 if (buffer->set_int(dynamic_ids.elements, FALSE, &my_charset_bin))
124 DBUG_RETURN(TRUE);
125
126 for (ulong i= 0;
127 i < dynamic_ids.elements; i++)
128 {
129 get_dynamic(&dynamic_ids, (uchar*) token, i);
130 if (buffer->append(" ") ||
131 buffer->append(token))
132 DBUG_RETURN(TRUE);
133 }
134
135 DBUG_RETURN(FALSE);
136 }
137
do_search_id(const void * id)138 bool Database_ids::do_search_id(const void *id)
139 {
140 return (bsearch((const char *) id, dynamic_ids.buffer,
141 dynamic_ids.elements, size,
142 (int (*) (const void*, const void*))
143 cmp_string) != NULL);
144 }
145