MySQL 5.6.14 Source Code Document
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
dynamic_ids.cc
1 #include "dynamic_ids.h"
2 
3 int cmp_string(const void *id1, const void *id2)
4 {
5  return strcmp((char *) id1, (char *) id2);
6 }
7 
8 int cmp_ulong(const void *id1, const void *id2)
9 {
10  return ((*(ulong *) id1) - (* (ulong *)id2));
11 }
12 
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 
18 Dynamic_ids::~Dynamic_ids()
19 {
20  delete_dynamic(&dynamic_ids);
21 }
22 
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 
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 
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 
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 
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 
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 }