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