CUBRID Engine  latest
shard_metadata.c
Go to the documentation of this file.
1 /*
2  * Copyright 2008 Search Solution Corporation
3  * Copyright 2016 CUBRID Corporation
4  *
5  * Licensed under the Apache License, Version 2.0 (the "License");
6  * you may not use this file except in compliance with the License.
7  * You may obtain a copy of the License at
8  *
9  * http://www.apache.org/licenses/LICENSE-2.0
10  *
11  * Unless required by applicable law or agreed to in writing, software
12  * distributed under the License is distributed on an "AS IS" BASIS,
13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14  * See the License for the specific language governing permissions and
15  * limitations under the License.
16  *
17  */
18 
19 
20 /*
21  * shard_metadata.c -
22  */
23 
24 #ident "$Id$"
25 
26 
27 #include <stdio.h>
28 #include <stdlib.h>
29 #include <string.h>
30 #include <time.h>
31 #include <sys/types.h>
32 #include <sys/stat.h>
33 #include <assert.h>
34 
35 #if defined(WINDOWS)
36 #include <direct.h>
37 #endif /* WINDOWS */
38 
39 #include "dbi.h"
40 
41 #if !defined(WINDOWS)
42 #include "dlfcn.h"
43 #endif /* WINDOWS */
44 
45 #include "cas_common.h"
46 #include "broker_filename.h"
47 #include "broker_admin_pub.h"
48 #include "broker_util.h"
49 #include "shard_metadata.h"
50 
51 #define SHARD_QUERY_BUFFER_SIZE 1024
52 
53 #define SHARD_METADATA_USER_TABLE_NAME "shard_user"
54 #define SHARD_METADATA_KEY_RANGE_TABLE_NAME "shard_range"
55 #define SHARD_METADATA_CONN_TABLE_NAME "shard_conn"
56 
57 #define DEFAULT_NUM_USER 1
58 #define DEFAULT_NUM_KEY 1
59 #define DEFAULT_NUM_CONN 4
60 
61 
63 
64 #if defined(WINDOWS)
65 HMODULE handle = NULL;
66 #else
67 void *handle = NULL;
68 #endif
69 
70 #if defined(CAS_FOR_ORACLE) || defined(CAS_FOR_MYSQL)
71 extern char *envvar_confdir_file (char *path, size_t size, const char *filename);
72 #endif /* CAS_FOR_ORACLE || CAS_FOR_MYSQL */
73 
74 static void shard_println_1 (FILE * fp);
75 static void shard_println_2 (FILE * fp);
76 
77 static int shard_metadata_read_user (T_SHM_PROXY * shm_proxy_p, char *db_name, char *db_user, char *db_password);
78 static int shard_metadata_read_key (const char *filename, T_SHM_PROXY * shm_proxy_p);
79 static int shard_metadata_read_conn (const char *filename, T_SHM_PROXY * shm_proxy_p);
80 static int shard_metadata_key_range_comp (const void *p1, const void *p2);
81 static int shard_metadata_conn_comp (const void *p1, const void *p2);
84 
85 
86 static void shard_metadata_dump_user (FILE * fp, T_SHM_SHARD_USER * shm_user_p);
87 static void shard_metadata_dump_key (FILE * fp, T_SHM_SHARD_KEY * shm_key_p);
88 static void shard_metadata_dump_conn (FILE * fp, T_SHM_SHARD_CONN * shm_conn_p);
94 
95 static int shard_metadata_validate_key_function (const char *library_name, const char *function_name);
96 
97 static void
98 shard_println_1 (FILE * fp)
99 {
100  assert (fp);
101 
102  fprintf (fp, "========================================" "========================================\n");
103 }
104 
105 static void
106 shard_println_2 (FILE * fp)
107 {
108  assert (fp);
109 
110  fprintf (fp, "----------------------------------------" "----------------------------------------\n");
111 }
112 
113 static int
114 shard_metadata_read_user (T_SHM_PROXY * shm_proxy_p, char *db_name, char *db_user, char *db_password)
115 {
116  int max_user;
117 
119  T_SHARD_USER *user_p = NULL;
120 
121  shm_user_p = shard_metadata_get_user (shm_proxy_p);
122 
123  max_user = 1; /* only one user */
124  shm_user_p->num_shard_user = max_user;
125 
126  user_p = &(shm_user_p->shard_user[0]);
127  strncpy_bufsize (user_p->db_name, db_name);
128  strncpy_bufsize (user_p->db_user, db_user);
129  strncpy_bufsize (user_p->db_password, db_password);
130 
131  SHARD_INF ("<USERINFO> [%d] db_name:[%s], " "db_user:[%s], db_password:[%s]\n", 0, user_p->db_name, user_p->db_user,
132  user_p->db_password);
133 
134  return 0;
135 }
136 
137 /*
138  * return :key_column count
139  */
140 static int
142 {
143  int nargs;
144  int idx_key, idx_range, max_key;
145  char path[BROKER_PATH_MAX];
146  char line[LINE_MAX], *p;
147  char section[LINE_MAX];
148  int len;
149  FILE *file = NULL;
150 
151  char key_column[SHARD_KEY_COLUMN_LEN];
152 
154  T_SHARD_KEY *key_p = NULL;
155  T_SHARD_KEY_RANGE *range_p = NULL;
156 
157  shm_key_p = shard_metadata_get_key (shm_proxy_p);
158 
159  envvar_confdir_file (path, BROKER_PATH_MAX, filename);
160 
161  file = fopen (path, "r");
162  if (file == NULL)
163  {
164  goto error_return;
165  }
166 
167  max_key = DEFAULT_NUM_KEY;
168 
169  shm_key_p->num_shard_key = 0;
170 
171  idx_key = idx_range = 0;
172  key_column[0] = '\0';
173  while (fgets (line, LINE_MAX - 1, file) != NULL)
174  {
175  trim (line);
176 
177  p = strchr (line, '#');
178  if (p)
179  {
180  *p = '\0';
181  }
182 
183  len = (int) strlen (line);
184  if (line[0] == '\0' || len <= 0)
185  {
186  continue;
187  }
188  else if (line[0] == '[' && line[len - 1] == ']')
189  {
190  nargs = sscanf (line, "[%%%[^]]", section);
191  if (nargs == 1)
192  {
193  trim (section);
194  if (strncasecmp (section, key_column, SHARD_KEY_COLUMN_LEN) != 0)
195  {
196  strncpy_bufsize (key_column, section);
197 
198  shm_key_p->num_shard_key++;
199  idx_key = shm_key_p->num_shard_key - 1;
200  idx_range = 0;
201  }
202  }
203  continue;
204  }
205 
206  if (shm_key_p->num_shard_key > max_key)
207  {
208 #if 0 /* multiple shard key hint : not implemented yet */
209  max_key += DEFAULT_NUM_KEY;
210  shard_metadata_key_resize (&shm_key_p, max_key);
211  if (shm_key_p == NULL)
212  {
213  goto error_return;
214  }
215 #else
216  shm_key_p->num_shard_key = max_key;
217  break;
218 #endif
219  }
220 
221  if (key_column[0] == '\0')
222  {
223  continue;
224  }
225 
226  key_p = &(shm_key_p->shard_key[idx_key]);
227  strncpy_bufsize (key_p->key_column, key_column);
228 
229  if (idx_range >= SHARD_KEY_RANGE_MAX)
230  {
231  continue;
232  }
233 
234  assert (idx_range >= 0 && idx_range < SHARD_KEY_RANGE_MAX);
235  range_p = (T_SHARD_KEY_RANGE *) (&key_p->range[idx_range]);
236  nargs = sscanf (line, "%d %d %d", &range_p->min, &range_p->max, &range_p->shard_id);
237 
238  range_p->key_index = idx_key;
239  range_p->range_index = idx_range;
240 
241  if (nargs != 3)
242  {
243  continue;
244  }
245 
246  SHARD_INF ("<KEYINFO> [%d:%d] key_column:%s, " "min:%d, max:%d, shard_id:%d. \n", idx_key, idx_range,
247  key_p->key_column, range_p->min, range_p->max, range_p->shard_id);
248 
249  key_p->num_key_range = ++idx_range;
250  }
251 
252  return 0;
253 
254 error_return:
255  if (file != NULL)
256  {
257  fclose (file);
258  }
259 
260  return -1;
261 }
262 
263 static int
265 {
266  int nargs;
267  int idx_conn, max_conn;
268  char line[LINE_MAX], *p;
269  char path[BROKER_PATH_MAX];
270  int len;
271  FILE *file = NULL;
272 
274  T_SHARD_CONN *conn_p = NULL;
275 
276  shm_conn_p = shard_metadata_get_conn (shm_proxy_p);
277 
278  envvar_confdir_file (path, BROKER_PATH_MAX, filename);
279 
280  file = fopen (path, "r");
281  if (file == NULL)
282  {
283  goto error_return;
284  }
285 
286  max_conn = DEFAULT_NUM_CONN;
287 
288  shm_conn_p->num_shard_conn = 0;
289 
290  idx_conn = 0;
291  while (fgets (line, LINE_MAX - 1, file) != NULL)
292  {
293  trim (line);
294 
295  p = strchr (line, '#');
296  if (p)
297  {
298  *p = '\0';
299  }
300 
301  len = (int) strlen (line);
302  if (line[0] == '\0')
303  {
304  continue;
305  }
306 
307  if (idx_conn >= MAX_SHARD_CONN)
308  {
309  goto error_return;
310  }
311 
312  assert (idx_conn >= 0);
313  conn_p = &(shm_conn_p->shard_conn[idx_conn]);
314  nargs = sscanf (line, "%d %s %[^\n]", &conn_p->shard_id, conn_p->db_name, conn_p->db_conn_info);
315  if (nargs != 3)
316  {
317  continue;
318  }
319 
320  trim (conn_p->db_conn_info);
321 
322  SHARD_INF ("<CONNINFO> [%d] shard_id:%d, db_name:<%s>, db_conn_info:<%s>.\n", idx_conn, conn_p->shard_id,
323  conn_p->db_name, conn_p->db_conn_info);
324 
325  shm_conn_p->num_shard_conn = ++idx_conn;
326  }
327 
328  return 0;
329 
330 error_return:
331  if (file != NULL)
332  {
333  fclose (file);
334  }
335 
336  return -1;
337 }
338 
339 static int
340 shard_metadata_key_range_comp (const void *p1, const void *p2)
341 {
342  T_SHARD_KEY_RANGE *arg1 = (T_SHARD_KEY_RANGE *) p1;
343  T_SHARD_KEY_RANGE *arg2 = (T_SHARD_KEY_RANGE *) p2;
344 
345  if (arg1->min > arg2->min)
346  {
347  return 1;
348  }
349  else if (arg1->min == arg2->min)
350  {
351  return 0;
352  }
353  else
354  {
355  return -1;
356  }
357 }
358 
359 static int
360 shard_metadata_conn_comp (const void *p1, const void *p2)
361 {
362  T_SHARD_CONN *arg1 = (T_SHARD_CONN *) p1;
363  T_SHARD_CONN *arg2 = (T_SHARD_CONN *) p2;
364 
365  if (arg1->shard_id > arg2->shard_id)
366  {
367  return 1;
368  }
369  else if (arg1->shard_id == arg2->shard_id)
370  {
371  return 0;
372  }
373  else
374  {
375  return -1;
376  }
377 }
378 
379 static void
381 {
382  int i;
383  T_SHARD_KEY *key_p;
384 
385  for (i = 0; i < shm_key_p->num_shard_key; i++)
386  {
387  key_p = &shm_key_p->shard_key[i];
388  qsort ((void *) key_p->range, key_p->num_key_range, sizeof (T_SHARD_KEY_RANGE), shard_metadata_key_range_comp);
389  }
390  return;
391 }
392 
393 static void
395 {
396  qsort ((void *) shm_conn_p->shard_conn, shm_conn_p->num_shard_conn, sizeof (T_SHARD_CONN), shard_metadata_conn_comp);
397  return;
398 }
399 
400 
403 {
405 
406  assert (shm_proxy_p);
407 
408  shm_user_p = &shm_proxy_p->shm_shard_user;
409 
410  return (shm_user_p);
411 }
412 
415 {
417 
418  assert (shm_proxy_p);
419 
420  shm_key_p = &shm_proxy_p->shm_shard_key;
421 
422  return (shm_key_p);
423 }
424 
427 {
429 
430  assert (shm_proxy_p);
431 
432  shm_conn_p = &shm_proxy_p->shm_shard_conn;
433 
434  return (shm_conn_p);
435 }
436 
437 int
439 {
440  int res = 0;
441 
442  assert (br_info);
443  assert (shm_proxy_p);
444 
445  res =
446  shard_metadata_read_user (shm_proxy_p, br_info->shard_db_name, br_info->shard_db_user, br_info->shard_db_password);
447 
448  res = shard_metadata_read_key (br_info->shard_key_file, shm_proxy_p);
449  if (res < 0)
450  {
451  fprintf (stderr, "failed to read metadata key [%s]\n", br_info->name);
452  return res;
453  }
454 
455  shard_metadata_sort_key (&shm_proxy_p->shm_shard_key);
456 #if defined(SHARD_VERBOSE_DEBUG)
457  shard_metadata_dump_key (stdout, &shm_proxy_p->shm_shard_key);
458 #endif
459 
460  res = shard_metadata_read_conn (br_info->shard_connection_file, shm_proxy_p);
461  if (res < 0)
462  {
463  fprintf (stderr, "failed to read metadata connection [%s]\n", br_info->name);
464  return res;
465  }
466 
468 #if defined(SHARD_VERBOSE_DEBUG)
469  shard_metadata_dump_conn (stdout, &shm_proxy_p->shm_shard_conn);
470 #endif
471 
472  SHARD_INF ("num USER:[%d], num KEY:[%d], num CONN:[%d].\n", shm_user_p->num_shard_user, shm_key_p->num_shard_key,
474 
475  res = shard_metadata_validate (br_info, shm_proxy_p);
476  if (res < 0)
477  {
478  fprintf (stderr, "failed to metadata validate check [%s]\n", br_info->name);
479  return res;
480  }
481 
482  return res;
483 }
484 
485 static void
487 {
488  int i;
489  T_SHARD_USER *user_p;
490 
491  assert (fp);
492  assert (shm_user_p);
493 
494  fprintf (fp, "%s=%d\n", "NUM_SHARD_USER", shm_user_p->num_shard_user);
495  shard_println_1 (fp);
496  fprintf (fp, " %-15s %-20s\n", "DB_NAME", "DB_USER");
497  shard_println_2 (fp);
498 
499  for (i = 0; i < shm_user_p->num_shard_user; i++)
500  {
501  user_p = (T_SHARD_USER *) (&(shm_user_p->shard_user[i]));
502  fprintf (fp, "[%-3d] %-15s %-20s\n", i, user_p->db_name, user_p->db_user);
503  }
504  shard_println_1 (fp);
505  fprintf (fp, "\n\n");
506 
507  return;
508 }
509 
510 static void
512 {
513  int i, j;
514  T_SHARD_KEY *key_p;
515  T_SHARD_KEY_RANGE *range_p;
516 
517  assert (fp);
518  assert (shm_key_p);
519 
520  fprintf (fp, "%s=%d\n", "NUM_SHARD_KEY", shm_key_p->num_shard_key);
521  shard_println_1 (fp);
522  fprintf (fp, " %-30s %-5s %-5s %-10s\n", "KEY", "MIN", "MAX", "SHARD_ID");
523  shard_println_2 (fp);
524  for (i = 0; i < shm_key_p->num_shard_key; i++)
525  {
526  key_p = (T_SHARD_KEY *) (&(shm_key_p->shard_key[i]));
527  for (j = 0; j < key_p->num_key_range; j++)
528  {
529  range_p = (T_SHARD_KEY_RANGE *) (&(key_p->range[j]));
530 
531  fprintf (fp, "[%-3d|%-3d] %-30s %-5d %-5d %-10d\n", i, j, key_p->key_column, range_p->min, range_p->max,
532  range_p->shard_id);
533  }
534  }
535  shard_println_1 (fp);
536  fprintf (fp, "\n\n");
537 
538  return;
539 }
540 
541 static void
543 {
544  int i;
545  T_SHARD_CONN *conn_p;
546 
547  assert (fp);
548  assert (shm_conn_p);
549 
550  fprintf (fp, "%s=%d\n", "NUM_SHARD_CONN", shm_conn_p->num_shard_conn);
551  shard_println_1 (fp);
552  fprintf (fp, " %-10s %-20s %-30s\n", "SHARD_ID", "DB_NAME", "DB_CONN_INFO");
553  shard_println_2 (fp);
554  for (i = 0; i < shm_conn_p->num_shard_conn; i++)
555  {
556  conn_p = (T_SHARD_CONN *) (&(shm_conn_p->shard_conn[i]));
557  fprintf (fp, "[%-3d] %-10d %-20s %-30s\n", i, conn_p->shard_id, conn_p->db_name, conn_p->db_conn_info);
558  }
559  shard_println_1 (fp);
560  fprintf (fp, "\n\n");
561 
562  return;
563 }
564 
565 void
567 {
571 
572  assert (shm_proxy_p);
573 
574  shm_user_p = shard_metadata_get_user (shm_proxy_p);
575  if (shm_user_p)
576  {
577  shard_metadata_dump_user (fp, shm_user_p);
578  }
579 
580  shm_key_p = shard_metadata_get_key (shm_proxy_p);
581  if (shm_key_p)
582  {
583  shard_metadata_dump_key (fp, shm_key_p);
584  }
585 
586  shm_conn_p = shard_metadata_get_conn (shm_proxy_p);
587  if (shm_conn_p)
588  {
589  shard_metadata_dump_conn (fp, shm_conn_p);
590  }
591 
592  return;
593 }
594 
595 void
596 shard_metadata_dump (FILE * fp, int shmid)
597 {
599 
600  shm_proxy_p = (T_SHM_PROXY *) uw_shm_open (shmid, SHM_PROXY, SHM_MODE_MONITOR);
601  if (shm_proxy_p == NULL)
602  {
603  SHARD_ERR ("failed to uw_shm_open(shmid:%x). \n", shmid);
604  return;
605  }
606 
607  shard_metadata_dump_internal (fp, shm_proxy_p);
608 
609  uw_shm_detach (shm_proxy_p);
610 
611  return;
612 }
613 
614 static int
616 {
617  int error = 0;
618  int modular = 0;
619 
621  if (error < 0)
622  {
623  return error;
624  }
625 
627  if (error < 0)
628  {
629  return error;
630  }
631 
632 
633  if (br_info_p->shard_key_library_name[0] == 0)
634  {
635  modular = br_info_p->shard_key_modular;
636  }
637  else
638  {
639  modular = 0;
640 
641  error =
643  if (error < 0)
644  {
645  return error;
646  }
647  }
648  error =
649  shard_metadata_validate_key (shard_metadata_get_key (shm_proxy_p), shard_metadata_get_conn (shm_proxy_p), modular);
650 
651  return error;
652 }
653 
654 static int
656 {
657  if (shm_user_p == NULL)
658  {
659  assert (false);
660  return -1;
661  }
662 
663  return 0;
664 }
665 
666 static int
668 {
669  int i = 0, j = 0;
670  int prv_range_max = -1;
671  int num_shard_conn;
672  T_SHARD_KEY_RANGE *range_p = NULL;
673 
674  assert (key_p);
675  assert (shm_conn_p);
676 
677  num_shard_conn = shm_conn_p->num_shard_conn;
678  if (num_shard_conn < 0)
679  {
680  SHARD_ERR ("%s: num shard connection is invalid.\n", key_p->key_column);
681  return -1;
682  }
683 
684  for (; i < key_p->num_key_range; i++)
685  {
686  range_p = &(key_p->range[i]);
687  if (range_p->min > range_p->max)
688  {
689  SHARD_ERR ("%s : shard range (%d, %d) is invalid.\n", key_p->key_column, range_p->min, range_p->max);
690  return -1;
691  }
692 
693  if (range_p->min != prv_range_max + 1)
694  {
695  SHARD_ERR ("%s : shard range (%d, %d) is invalid.\n", key_p->key_column, range_p->min, range_p->max);
696  return -1;
697  }
698 
699  for (j = 0; j < num_shard_conn; j++)
700  {
701  if (range_p->shard_id == shm_conn_p->shard_conn[j].shard_id)
702  {
703  break;
704  }
705  }
706  if (j >= num_shard_conn)
707  {
708  SHARD_ERR ("%s: shard range shard_id (%d) is invalid.\n", key_p->key_column, range_p->shard_id);
709  return -1;
710  }
711 
712  prv_range_max = range_p->max;
713  }
714 
715  if ((modular >= 1) && (prv_range_max > modular))
716  {
717  SHARD_ERR ("%s: shard range max (%d, modular %d) is invalid.\n", key_p->key_column, range_p->max, modular);
718  return -1;
719  }
720 
721  return 0;
722 }
723 
724 static int
726 {
727  int error, i;
728  T_SHARD_KEY *curr_key_p;
729  T_SHARD_KEY *prev_key_p = NULL;
730 
731  if (shm_key_p == NULL)
732  {
733  assert (false);
734  return -1;
735  }
736 
737  for (i = 0; i < shm_key_p->num_shard_key; i++)
738  {
739  curr_key_p = &(shm_key_p->shard_key[i]);
740  if (prev_key_p && strcasecmp (curr_key_p->key_column, prev_key_p->key_column) == 0)
741  {
742  SHARD_ERR ("key column [%s] is duplicated.\n", curr_key_p->key_column);
743  return -1;
744  }
745 
746  error = shard_metadata_validate_key_range_internal (curr_key_p, shm_conn_p, modular);
747  if (error < 0)
748  {
749  return error;
750  }
751 
752  prev_key_p = curr_key_p;
753  }
754 
755  return 0;
756 }
757 
758 static int
760 {
761  int i;
762 
763  if (shm_conn_p == NULL)
764  {
765  assert (false);
766  return -1;
767  }
768 
769  for (i = 0; i < shm_conn_p->num_shard_conn; i++)
770  {
771  if (shm_conn_p->shard_conn[i].shard_id != i)
772  {
773  SHARD_ERR ("shard id (%d, %d) is invalid.\n", shm_conn_p->shard_conn[i].shard_id, i);
774  return -1;
775  }
776  }
777 
778  return 0;
779 }
780 
781 static int
782 shard_metadata_validate_key_function (const char *library_name, const char *function_name)
783 {
784  int ret;
785 
786  ret = load_shard_key_function (library_name, function_name);
787  if (ret < 0)
788  {
789  SHARD_ERR ("user defined function [%s:%s] is invalid.\n", library_name, function_name);
791  return -1;
792  }
794  return 0;
795 }
796 
797 T_SHARD_KEY *
799 {
800  int min, mid, max;
801  int result;
802  T_SHARD_KEY *key_p;
803 
804  min = 0;
805  max = shm_key_p->num_shard_key - 1;
806 
807  do
808  {
809  mid = (min + max) / 2;
810  key_p = &(shm_key_p->shard_key[mid]);
811  result = strcasecmp (keycolumn, key_p->key_column);
812 
813  if (result < 0)
814  {
815  max = mid - 1;
816  }
817  else if (result > 0)
818  {
819  min = mid + 1;
820  }
821  else
822  {
823  return key_p;
824  }
825  }
826  while (min <= max);
827 
828  return NULL;
829 }
830 
832 shard_metadata_bsearch_range (T_SHARD_KEY * key_p, unsigned int hash_res)
833 {
834  int min, mid, max;
835  T_SHARD_KEY_RANGE *range_p;
836 
837  min = 0;
838  max = key_p->num_key_range - 1;
839 
840  do
841  {
842  mid = (min + max) / 2;
843  range_p = &(key_p->range[mid]);
844 
845  /* SHARD TODO : if min=-1, max=-1 ??? */
846  if ((int) hash_res < range_p->min)
847  {
848  max = mid - 1;
849  }
850  else if (hash_res > (unsigned int) range_p->max)
851  {
852  min = mid + 1;
853  }
854  else
855  {
856  return range_p;
857  }
858  }
859  while (min <= max);
860 
861  return NULL;
862 }
863 
865 shard_metadata_find_shard_range (T_SHM_SHARD_KEY * shm_key_p, const char *key, unsigned int hash_res)
866 {
867  T_SHARD_KEY *key_p = shard_metadata_bsearch_key (shm_key_p, key);
868  if (key_p == NULL)
869  {
870  return NULL;
871  }
872 
873  return shard_metadata_bsearch_range (key_p, hash_res);
874 }
875 
876 T_SHARD_USER *
878 {
879  T_SHARD_USER *shard_user_p = NULL;
880 
881  assert (shm_user_p);
882  assert (shm_user_p->num_shard_user == 1);
883 
884  shard_user_p = &(shm_user_p->shard_user[0]);
885  return shard_user_p;
886 }
887 
888 T_SHARD_USER *
890 {
892  T_SHARD_USER *shard_user_p = NULL;
893 
894  assert (shm_proxy_p);
895 
896  shm_user_p = shard_metadata_get_user (shm_proxy_p);
897 
898  if (shm_user_p == NULL)
899  {
900  assert (false);
901  return NULL;
902  }
903 
904  shard_user_p = &(shm_user_p->shard_user[0]);
905  return shard_user_p;
906 }
907 
908 int
909 load_shard_key_function (const char *library_name, const char *function_name)
910 {
911 #if defined(WINDOWS)
912  handle = LoadLibrary (library_name);
913 #else
914  handle = dlopen (library_name, RTLD_NOW | RTLD_GLOBAL);
915 #endif
916  if (handle == NULL)
917  {
918  return -1;
919  }
920 #if defined(WINDOWS)
921  fn_get_shard_key = (FN_GET_SHARD_KEY) GetProcAddress ((HMODULE) handle, function_name);
922 #else
923  dlerror ();
924  fn_get_shard_key = (FN_GET_SHARD_KEY) dlsym (handle, function_name);
925 #endif
926  if (fn_get_shard_key == NULL)
927  {
928  return -1;
929  }
930  return 0;
931 }
932 
933 void
935 {
937  if (handle != NULL)
938  {
939 #if defined(WINDOWS)
940  FreeLibrary (handle);
941 #else
942  dlclose (handle);
943 #endif
944  }
945  handle = NULL;
946 }
static int shard_metadata_conn_comp(const void *p1, const void *p2)
char shard_key_library_name[BROKER_INFO_NAME_MAX]
void * handle
static int shard_metadata_validate_key_range_internal(T_SHARD_KEY *key_p, T_SHM_SHARD_CONN *shm_conn_p, int modular)
char * trim(char *str)
Definition: porting.c:2260
static int shard_metadata_validate_key(T_SHM_SHARD_KEY *shm_key_p, T_SHM_SHARD_CONN *shm_conn_p, int modular)
static int shard_metadata_read_conn(const char *filename, T_SHM_PROXY *shm_proxy_p)
char shard_key_function_name[BROKER_INFO_NAME_MAX]
T_SHARD_CONN shard_conn[MAX_SHARD_CONN]
Definition: broker_shm.h:286
#define BROKER_PATH_MAX
Definition: broker_config.h:91
T_SHARD_KEY * shard_metadata_bsearch_key(T_SHM_SHARD_KEY *shm_key_p, const char *keycolumn)
static int shard_metadata_read_key(const char *filename, T_SHM_PROXY *shm_proxy_p)
static T_BROKER_INFO * br_info_p
Definition: broker.c:312
FN_GET_SHARD_KEY fn_get_shard_key
T_SHARD_KEY_RANGE * shard_metadata_bsearch_range(T_SHARD_KEY *key_p, unsigned int hash_res)
#define SHARD_ERR(f, a...)
#define SHM_PROXY
Definition: broker_shm.h:65
T_SHARD_KEY_RANGE range[SHARD_KEY_RANGE_MAX]
Definition: broker_shm.h:263
int num_key_range
Definition: broker_shm.h:262
static T_SHM_PROXY * shm_proxy_p
Definition: broker.c:313
T_SHARD_KEY_RANGE * shard_metadata_find_shard_range(T_SHM_SHARD_KEY *shm_key_p, const char *key, unsigned int hash_res)
T_SHM_SHARD_CONN * shard_metadata_get_conn(T_SHM_PROXY *shm_proxy_p)
#define DEFAULT_NUM_KEY
static int shard_metadata_validate(T_BROKER_INFO *br_info_p, T_SHM_PROXY *shm_proxy_p)
T_SHM_SHARD_USER * shard_metadata_get_user(T_SHM_PROXY *shm_proxy_p)
int load_shard_key_function(const char *library_name, const char *function_name)
#define SHARD_KEY_COLUMN_LEN
Definition: broker_shm.h:147
char shard_db_name[SRV_CON_DBNAME_SIZE]
char db_password[SRV_CON_DBPASSWD_SIZE]
Definition: broker_shm.h:236
static int shard_metadata_validate_user(T_SHM_SHARD_USER *shm_user_p)
char db_name[SRV_CON_DBNAME_SIZE]
Definition: broker_shm.h:234
static void shard_metadata_sort_key(T_SHM_SHARD_KEY *shm_key_p)
static int shard_metadata_key_range_comp(const void *p1, const void *p2)
static void shard_metadata_dump_conn(FILE *fp, T_SHM_SHARD_CONN *shm_conn_p)
#define assert(x)
T_SHM_SHARD_USER shm_shard_user
Definition: broker_shm.h:541
static int shard_metadata_validate_key_function(const char *library_name, const char *function_name)
int(* FN_GET_SHARD_KEY)(const char *shard_key, T_SHARD_U_TYPE type, const void *val, int val_size)
Definition: shard_key.h:93
char shard_key_file[BROKER_INFO_PATH_MAX]
void uw_shm_detach(void *p)
Definition: broker_shm.c:700
T_SHM_SHARD_KEY * shm_key_p
Definition: shard_proxy.c:51
#define SHARD_KEY_RANGE_MAX
Definition: broker_shm.h:148
#define min(a, b)
T_SHM_SHARD_USER * shm_user_p
Definition: shard_proxy.c:50
#define NULL
Definition: freelistheap.h:34
#define strncpy_bufsize(buf, str)
Definition: porting.h:340
T_SHARD_USER * shard_metadata_get_shard_user(T_SHM_SHARD_USER *shm_user_p)
char db_conn_info[MAX_CONN_INFO_LENGTH]
Definition: broker_shm.h:279
static int shard_metadata_read_user(T_SHM_PROXY *shm_proxy_p, char *db_name, char *db_user, char *db_password)
static int shard_metadata_validate_conn(T_SHM_SHARD_CONN *shm_conn_p)
T_SHM_SHARD_KEY * shard_metadata_get_key(T_SHM_PROXY *shm_proxy_p)
static void shard_println_1(FILE *fp)
char * db_name
T_SHM_SHARD_CONN shm_shard_conn
Definition: broker_shm.h:542
#define max(a, b)
T_SHARD_USER * shard_metadata_get_shard_user_from_shm(T_SHM_PROXY *shm_proxy_p)
static void shard_println_2(FILE *fp)
static void error(const char *msg)
Definition: gencat.c:331
void shard_metadata_dump(FILE *fp, int shmid)
#define SHARD_INF(f, a...)
char shard_db_password[SRV_CON_DBPASSWD_SIZE]
T_SHARD_KEY shard_key[MAX_SHARD_KEY]
Definition: broker_shm.h:270
static void shard_metadata_dump_user(FILE *fp, T_SHM_SHARD_USER *shm_user_p)
#define MAX_SHARD_CONN
Definition: broker_shm.h:145
T_SHARD_USER shard_user[1]
Definition: broker_shm.h:243
#define strlen(s1)
Definition: intl_support.c:43
char shard_db_user[SRV_CON_DBUSER_SIZE]
char key_column[SHARD_KEY_COLUMN_LEN]
Definition: broker_shm.h:261
#define DEFAULT_NUM_CONN
char name[BROKER_NAME_LEN]
char shard_connection_file[BROKER_INFO_PATH_MAX]
int i
Definition: dynamic_load.c:954
static void shard_metadata_sort_conn(T_SHM_SHARD_CONN *shm_conn_p)
char db_user[SRV_CON_DBUSER_SIZE]
Definition: broker_shm.h:235
void shard_metadata_dump_internal(FILE *fp, T_SHM_PROXY *shm_proxy_p)
void * uw_shm_open(int shm_key, int which_shm, T_SHM_MODE shm_mode)
Definition: broker_shm.c:139
T_SHM_SHARD_KEY shm_shard_key
Definition: broker_shm.h:543
T_SHM_SHARD_CONN * shm_conn_p
Definition: shard_proxy.c:52
const char ** p
Definition: dynamic_load.c:945
static void shard_metadata_dump_key(FILE *fp, T_SHM_SHARD_KEY *shm_key_p)
char db_name[MAX_DBNAME_LENGTH]
Definition: broker_shm.h:278
int shard_metadata_initialize(T_BROKER_INFO *br_info, T_SHM_PROXY *shm_proxy_p)
void close_shard_key_function(void)
char * envvar_confdir_file(char *path, size_t size, const char *filename)