31 #include <sys/types.h> 51 #define SHARD_QUERY_BUFFER_SIZE 1024 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" 57 #define DEFAULT_NUM_USER 1 58 #define DEFAULT_NUM_KEY 1 59 #define DEFAULT_NUM_CONN 4 70 #if defined(CAS_FOR_ORACLE) || defined(CAS_FOR_MYSQL) 102 fprintf (fp,
"========================================" "========================================\n");
110 fprintf (fp,
"----------------------------------------" "----------------------------------------\n");
131 SHARD_INF (
"<USERINFO> [%d] db_name:[%s], " "db_user:[%s], db_password:[%s]\n", 0, user_p->
db_name, user_p->
db_user,
144 int idx_key, idx_range, max_key;
146 char line[LINE_MAX], *
p;
147 char section[LINE_MAX];
161 file = fopen (path,
"r");
171 idx_key = idx_range = 0;
172 key_column[0] =
'\0';
173 while (fgets (line, LINE_MAX - 1, file) !=
NULL)
177 p = strchr (line,
'#');
183 len = (int)
strlen (line);
184 if (line[0] ==
'\0' || len <= 0)
188 else if (line[0] ==
'[' && line[len - 1] ==
']')
190 nargs = sscanf (line,
"[%%%[^]]", section);
210 shard_metadata_key_resize (&shm_key_p, max_key);
211 if (shm_key_p ==
NULL)
221 if (key_column[0] ==
'\0')
226 key_p = &(shm_key_p->
shard_key[idx_key]);
236 nargs = sscanf (line,
"%d %d %d", &range_p->
min, &range_p->
max, &range_p->
shard_id);
246 SHARD_INF (
"<KEYINFO> [%d:%d] key_column:%s, " "min:%d, max:%d, shard_id:%d. \n", idx_key, idx_range,
267 int idx_conn, max_conn;
268 char line[LINE_MAX], *
p;
280 file = fopen (path,
"r");
291 while (fgets (line, LINE_MAX - 1, file) !=
NULL)
295 p = strchr (line,
'#');
301 len = (int)
strlen (line);
322 SHARD_INF (
"<CONNINFO> [%d] shard_id:%d, db_name:<%s>, db_conn_info:<%s>.\n", idx_conn, conn_p->
shard_id,
345 if (arg1->
min > arg2->
min)
349 else if (arg1->
min == arg2->
min)
451 fprintf (stderr,
"failed to read metadata key [%s]\n", br_info->
name);
456 #if defined(SHARD_VERBOSE_DEBUG) 463 fprintf (stderr,
"failed to read metadata connection [%s]\n", br_info->
name);
468 #if defined(SHARD_VERBOSE_DEBUG) 478 fprintf (stderr,
"failed to metadata validate check [%s]\n", br_info->
name);
494 fprintf (fp,
"%s=%d\n",
"NUM_SHARD_USER", shm_user_p->
num_shard_user);
496 fprintf (fp,
" %-15s %-20s\n",
"DB_NAME",
"DB_USER");
502 fprintf (fp,
"[%-3d] %-15s %-20s\n", i, user_p->
db_name, user_p->
db_user);
505 fprintf (fp,
"\n\n");
520 fprintf (fp,
"%s=%d\n",
"NUM_SHARD_KEY", shm_key_p->
num_shard_key);
522 fprintf (fp,
" %-30s %-5s %-5s %-10s\n",
"KEY",
"MIN",
"MAX",
"SHARD_ID");
531 fprintf (fp,
"[%-3d|%-3d] %-30s %-5d %-5d %-10d\n", i, j, key_p->
key_column, range_p->
min, range_p->
max,
536 fprintf (fp,
"\n\n");
550 fprintf (fp,
"%s=%d\n",
"NUM_SHARD_CONN", shm_conn_p->
num_shard_conn);
552 fprintf (fp,
" %-10s %-20s %-30s\n",
"SHARD_ID",
"DB_NAME",
"DB_CONN_INFO");
560 fprintf (fp,
"\n\n");
601 if (shm_proxy_p ==
NULL)
603 SHARD_ERR (
"failed to uw_shm_open(shmid:%x). \n", shmid);
657 if (shm_user_p ==
NULL)
670 int prv_range_max = -1;
678 if (num_shard_conn < 0)
686 range_p = &(key_p->
range[
i]);
687 if (range_p->
min > range_p->
max)
693 if (range_p->
min != prv_range_max + 1)
699 for (j = 0; j < num_shard_conn; j++)
706 if (j >= num_shard_conn)
712 prv_range_max = range_p->
max;
715 if ((modular >= 1) && (prv_range_max > modular))
717 SHARD_ERR (
"%s: shard range max (%d, modular %d) is invalid.\n", key_p->
key_column, range_p->
max, modular);
731 if (shm_key_p ==
NULL)
752 prev_key_p = curr_key_p;
763 if (shm_conn_p ==
NULL)
789 SHARD_ERR (
"user defined function [%s:%s] is invalid.\n", library_name, function_name);
809 mid = (min +
max) / 2;
811 result = strcasecmp (keycolumn, key_p->
key_column);
842 mid = (min +
max) / 2;
843 range_p = &(key_p->
range[mid]);
846 if ((
int) hash_res < range_p->
min)
850 else if (hash_res > (
unsigned int) range_p->
max)
898 if (shm_user_p ==
NULL)
912 handle = LoadLibrary (library_name);
914 handle = dlopen (library_name, RTLD_NOW | RTLD_GLOBAL);
char shard_key_library_name[BROKER_INFO_NAME_MAX]
char shard_key_function_name[BROKER_INFO_NAME_MAX]
T_SHARD_CONN shard_conn[MAX_SHARD_CONN]
static T_BROKER_INFO * br_info_p
#define SHARD_ERR(f, a...)
T_SHARD_KEY_RANGE range[SHARD_KEY_RANGE_MAX]
static T_SHM_PROXY * shm_proxy_p
#define SHARD_KEY_COLUMN_LEN
char shard_db_name[SRV_CON_DBNAME_SIZE]
char db_password[SRV_CON_DBPASSWD_SIZE]
char db_name[SRV_CON_DBNAME_SIZE]
T_SHM_SHARD_USER shm_shard_user
int(* FN_GET_SHARD_KEY)(const char *shard_key, T_SHARD_U_TYPE type, const void *val, int val_size)
char shard_key_file[BROKER_INFO_PATH_MAX]
void uw_shm_detach(void *p)
T_SHM_SHARD_KEY * shm_key_p
#define SHARD_KEY_RANGE_MAX
T_SHM_SHARD_USER * shm_user_p
#define strncpy_bufsize(buf, str)
char db_conn_info[MAX_CONN_INFO_LENGTH]
T_SHM_SHARD_CONN shm_shard_conn
static void error(const char *msg)
#define SHARD_INF(f, a...)
char shard_db_password[SRV_CON_DBPASSWD_SIZE]
T_SHARD_KEY shard_key[MAX_SHARD_KEY]
T_SHARD_USER shard_user[1]
char shard_db_user[SRV_CON_DBUSER_SIZE]
char key_column[SHARD_KEY_COLUMN_LEN]
char name[BROKER_NAME_LEN]
char shard_connection_file[BROKER_INFO_PATH_MAX]
char db_user[SRV_CON_DBUSER_SIZE]
void * uw_shm_open(int shm_key, int which_shm, T_SHM_MODE shm_mode)
T_SHM_SHARD_KEY shm_shard_key
T_SHM_SHARD_CONN * shm_conn_p
char db_name[MAX_DBNAME_LENGTH]
char * envvar_confdir_file(char *path, size_t size, const char *filename)