2023-01-30 21:59:35 +08:00
|
|
|
/*
|
|
|
|
|
**********************************************************************************************
|
|
|
|
|
* File: maat_virtual.cpp
|
|
|
|
|
* Description:
|
|
|
|
|
* Authors: Liu WenTan <liuwentan@geedgenetworks.com>
|
|
|
|
|
* Date: 2022-10-31
|
|
|
|
|
* Copyright: (c) 2018-2022 Geedge Networks, Inc. All rights reserved.
|
|
|
|
|
***********************************************************************************************
|
|
|
|
|
*/
|
|
|
|
|
|
2023-02-07 11:25:31 +08:00
|
|
|
#include <assert.h>
|
|
|
|
|
|
2023-01-30 21:59:35 +08:00
|
|
|
#include "maat_kv.h"
|
|
|
|
|
#include "maat_utils.h"
|
|
|
|
|
#include "log/log.h"
|
|
|
|
|
#include "maat_virtual.h"
|
2023-02-07 11:25:31 +08:00
|
|
|
#include "maat_rule.h"
|
|
|
|
|
#include "maat_table.h"
|
2023-01-30 21:59:35 +08:00
|
|
|
|
|
|
|
|
#define MODULE_VIRTUAL module_name_str("maat.virtual")
|
|
|
|
|
|
|
|
|
|
struct virtual_schema {
|
2023-02-20 10:57:40 +08:00
|
|
|
char physical_tables[MAX_PHYSICAL_TABLE_NUM][NAME_MAX];
|
|
|
|
|
size_t n_physical_table;
|
2023-02-03 17:28:14 +08:00
|
|
|
int table_id;
|
2023-02-09 22:13:15 +08:00
|
|
|
struct table_manager *ref_tbl_mgr;
|
2023-01-30 21:59:35 +08:00
|
|
|
};
|
|
|
|
|
|
2023-02-03 17:28:14 +08:00
|
|
|
void *virtual_schema_new(cJSON *json, struct table_manager *tbl_mgr,
|
|
|
|
|
const char *table_name, struct log_handle *logger)
|
2023-01-30 21:59:35 +08:00
|
|
|
{
|
2023-02-20 10:57:40 +08:00
|
|
|
struct virtual_schema *schema = ALLOC(struct virtual_schema, 1);
|
|
|
|
|
schema->ref_tbl_mgr = tbl_mgr;
|
|
|
|
|
|
|
|
|
|
cJSON *item = cJSON_GetObjectItem(json, "table_id");
|
|
|
|
|
if (NULL == item || item->type != cJSON_Number) {
|
|
|
|
|
log_error(logger, MODULE_VIRTUAL,
|
|
|
|
|
"virtual table %s has no table_id column", table_name);
|
|
|
|
|
goto error;
|
|
|
|
|
}
|
|
|
|
|
schema->table_id = item->valueint;
|
|
|
|
|
|
|
|
|
|
item = cJSON_GetObjectItem(json, "physical_table");
|
2023-01-30 21:59:35 +08:00
|
|
|
if (NULL == item || item->type != cJSON_Array) {
|
2023-02-03 17:28:14 +08:00
|
|
|
log_error(logger, MODULE_VIRTUAL,
|
|
|
|
|
"virtual table %s has no physical_table column", table_name);
|
2023-02-20 10:57:40 +08:00
|
|
|
goto error;
|
2023-01-30 21:59:35 +08:00
|
|
|
}
|
2023-01-31 20:39:53 +08:00
|
|
|
|
2023-01-30 21:59:35 +08:00
|
|
|
int cnt = cJSON_GetArraySize(item);
|
|
|
|
|
for (int i = 0; i < cnt; i++) {
|
|
|
|
|
cJSON *tmp_item = cJSON_GetArrayItem(item, i);
|
|
|
|
|
if (tmp_item != NULL && tmp_item->type == cJSON_String) {
|
2023-02-20 10:57:40 +08:00
|
|
|
memcpy(schema->physical_tables[i], tmp_item->valuestring,
|
|
|
|
|
strlen(tmp_item->valuestring));
|
2023-01-30 21:59:35 +08:00
|
|
|
}
|
|
|
|
|
}
|
2023-02-20 10:57:40 +08:00
|
|
|
schema->n_physical_table = cnt;
|
2023-01-30 21:59:35 +08:00
|
|
|
|
2023-02-20 10:57:40 +08:00
|
|
|
return schema;
|
|
|
|
|
error:
|
|
|
|
|
FREE(schema);
|
|
|
|
|
return NULL;
|
2023-01-30 21:59:35 +08:00
|
|
|
}
|
2023-01-31 20:39:53 +08:00
|
|
|
|
|
|
|
|
void virtual_schema_free(void *virtual_schema)
|
|
|
|
|
{
|
|
|
|
|
FREE(virtual_schema);
|
2023-02-07 11:25:31 +08:00
|
|
|
}
|
|
|
|
|
|
2023-02-20 10:57:40 +08:00
|
|
|
int virtual_table_get_id(void *virtual_schema)
|
|
|
|
|
{
|
|
|
|
|
if (NULL == virtual_schema) {
|
|
|
|
|
return -1;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
struct virtual_schema *schema = (struct virtual_schema *)virtual_schema;
|
|
|
|
|
return schema->table_id;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
size_t virtual_table_get_physical_table_id(void *virtual_schema, int physical_table_ids[])
|
2023-02-07 11:25:31 +08:00
|
|
|
{
|
|
|
|
|
if (NULL == virtual_schema) {
|
2023-02-22 15:08:52 +08:00
|
|
|
return 0;
|
2023-02-07 11:25:31 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
struct virtual_schema *schema = (struct virtual_schema *)virtual_schema;
|
2023-02-20 10:57:40 +08:00
|
|
|
|
|
|
|
|
for (size_t i = 0; i < schema->n_physical_table; i++) {
|
|
|
|
|
int table_id = table_manager_get_table_id(schema->ref_tbl_mgr, schema->physical_tables[i]);
|
|
|
|
|
physical_table_ids[i] = table_id;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return schema->n_physical_table;
|
2023-01-31 20:39:53 +08:00
|
|
|
}
|