return profile;
}
+char *generate_sql_entry_for_user(switch_core_session_t *session, switch_xml_t ut, switch_bool_t use_number_alias) {
+ char *sql = NULL;
+
+ int name_visible = 1;
+ int exten_visible = 1;
+ const char *id = switch_xml_attr_soft(ut, "id");
+ const char *number_alias = switch_xml_attr_soft(ut, "number-alias");
+ const char *extension = NULL;
+ char *fullName = NULL;
+ char *caller_name = NULL;
+ char *caller_name_override = NULL;
+ char *firstName = NULL;
+ char *lastName = NULL;
+ char *fullNameDigit = NULL;
+ char *firstNameDigit = NULL;
+ char *lastNameDigit = NULL;
+ switch_xml_t x_params, x_param, x_vars, x_var;
+
+ /* Check all the user params */
+ if ((x_params = switch_xml_child(ut, "params"))) {
+ for (x_param = switch_xml_child(x_params, "param"); x_param; x_param = x_param->next) {
+ const char *var = switch_xml_attr_soft(x_param, "name");
+ const char *val = switch_xml_attr_soft(x_param, "value");
+ if (!strcasecmp(var, "directory-visible")) {
+ name_visible = switch_true(val);
+ }
+ if (!strcasecmp(var, "directory-exten-visible")) {
+ exten_visible = switch_true(val);
+ }
+
+ }
+ }
+ /* Check all the user variables */
+ if ((x_vars = switch_xml_child(ut, "variables"))) {
+ for (x_var = switch_xml_child(x_vars, "variable"); x_var; x_var = x_var->next) {
+ const char *var = switch_xml_attr_soft(x_var, "name");
+ const char *val = switch_xml_attr_soft(x_var, "value");
+ if (!strcasecmp(var, "effective_caller_id_name")) {
+ caller_name = switch_core_session_strdup(session, val);
+ }
+ if (!strcasecmp(var, "directory_full_name")) {
+ caller_name_override = switch_core_session_strdup(session, val);
+ }
+ }
+ }
+ if (caller_name_override) {
+ fullName = caller_name_override;
+ } else {
+ fullName = caller_name;
+ }
+ if (zstr(fullName)) {
+ goto end;
+ }
+ firstName = switch_core_session_strdup(session, fullName);
+
+ if ((lastName = strrchr(firstName, ' '))) {
+ *lastName++ = '\0';
+ } else {
+ lastName = switch_core_session_strdup(session, firstName);
+ }
+
+ /* switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, "FullName %s firstName [%s] lastName [%s]\n", fullName, firstName, lastName); */
+ if (use_number_alias == SWITCH_TRUE && !zstr(number_alias)) {
+ extension = number_alias;
+ } else {
+ extension = id;
+ }
+
+ /* Generate Digits key mapping */
+ fullNameDigit = string_to_keypad_digit(fullName);
+ lastNameDigit = string_to_keypad_digit(lastName);
+ firstNameDigit = string_to_keypad_digit(firstName);
+
+ /* add user into DB */
+ sql = switch_mprintf("insert into directory_search values('%q','%q','%q','%q','%q','%q','%q','%q','%q','%d','%d')",
+ globals.hostname, switch_core_session_get_uuid(session), extension, fullName, fullNameDigit, firstName, firstNameDigit,
+ lastName, lastNameDigit, name_visible, exten_visible);
+
+ switch_safe_free(fullNameDigit);
+ switch_safe_free(lastNameDigit);
+ switch_safe_free(firstNameDigit);
+
+end:
+
+ return sql;
+}
static switch_status_t populate_database(switch_core_session_t *session, dir_profile_t *profile, const char *domain_name)
{
switch_status_t status = SWITCH_STATUS_SUCCESS;
char *sql = NULL;
char *sqlvalues = NULL;
char *sqltmp = NULL;
+ switch_channel_t *channel = switch_core_session_get_channel(session);
+ const char *group_selection = switch_channel_get_variable(channel, "directory_group_selection");
int count = 0;
switch_xml_t xml_root = NULL, x_domain;
switch_xml_t ut;
switch_event_t *xml_params = NULL;
- switch_xml_t group = NULL, groups = NULL, users = NULL, x_params = NULL, x_param = NULL, x_vars = NULL, x_var = NULL;
+ switch_xml_t group = NULL, groups = NULL, users = NULL;
switch_event_create(&xml_params, SWITCH_EVENT_REQUEST_PARAMS);
switch_assert(xml_params);
if ((groups = switch_xml_child(x_domain, "groups"))) {
for (group = switch_xml_child(groups, "group"); group; group = group->next) {
+ const char *gname = switch_xml_attr_soft(group, "name");
+
+ if (group_selection && strcasecmp(gname, group_selection)) {
+ continue;
+ }
+
if ((users = switch_xml_child(group, "users"))) {
for (ut = switch_xml_child(users, "user"); ut; ut = ut->next) {
- int name_visible = 1;
- int exten_visible = 1;
+ const char *uname = switch_xml_attr_soft(ut, "id");
const char *type = switch_xml_attr_soft(ut, "type");
- const char *id = switch_xml_attr_soft(ut, "id");
- const char *number_alias = switch_xml_attr_soft(ut, "number-alias");
- const char *extension = NULL;
- char *fullName = NULL;
- char *caller_name = NULL;
- char *caller_name_override = NULL;
- char *firstName = NULL;
- char *lastName = NULL;
- char *fullNameDigit = NULL;
- char *firstNameDigit = NULL;
- char *lastNameDigit = NULL;
if (!strcasecmp(type, "pointer")) {
- continue;
- }
- /* Check all the user params */
- if ((x_params = switch_xml_child(ut, "params"))) {
- for (x_param = switch_xml_child(x_params, "param"); x_param; x_param = x_param->next) {
- const char *var = switch_xml_attr_soft(x_param, "name");
- const char *val = switch_xml_attr_soft(x_param, "value");
- if (!strcasecmp(var, "directory-visible")) {
- name_visible = switch_true(val);
- }
- if (!strcasecmp(var, "directory-exten-visible")) {
- exten_visible = switch_true(val);
- }
+ switch_xml_t ux;
+ if (switch_xml_locate_user_merged("id", uname, domain_name, NULL, &ux, NULL) != SWITCH_STATUS_SUCCESS) {
+ switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_WARNING, "Can't find user [%s@%s] from pointer\n", uname, domain_name);
+ } else {
+ sql = generate_sql_entry_for_user(session, ux, profile->use_number_alias);
+ switch_xml_free(ux);
}
- }
- /* Check all the user variables */
- if ((x_vars = switch_xml_child(ut, "variables"))) {
- for (x_var = switch_xml_child(x_vars, "variable"); x_var; x_var = x_var->next) {
- const char *var = switch_xml_attr_soft(x_var, "name");
- const char *val = switch_xml_attr_soft(x_var, "value");
- if (!strcasecmp(var, "effective_caller_id_name")) {
- caller_name = switch_core_session_strdup(session, val);
- }
- if (!strcasecmp(var, "directory_full_name")) {
- caller_name_override = switch_core_session_strdup(session, val);
- }
- }
- }
- if (caller_name_override) {
- fullName = caller_name_override;
+
} else {
- fullName = caller_name;
+ sql = generate_sql_entry_for_user(session, ut, profile->use_number_alias);
}
- if (zstr(fullName)) {
- continue;
- }
- firstName = switch_core_session_strdup(session, fullName);
-
- if ((lastName = strrchr(firstName, ' '))) {
- *lastName++ = '\0';
- } else {
- lastName = switch_core_session_strdup(session, firstName);
- }
-
- /* switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, "FullName %s firstName [%s] lastName [%s]\n", fullName, firstName, lastName); */
-
- /* user number-alias instead of id if profile allows it */
- if (profile->use_number_alias == SWITCH_TRUE && !zstr(number_alias)) {
- extension = number_alias;
- } else {
- extension = id;
- }
-
- /* Generate Digits key mapping */
- fullNameDigit = string_to_keypad_digit(fullName);
- lastNameDigit = string_to_keypad_digit(lastName);
- firstNameDigit = string_to_keypad_digit(firstName);
- /* add user into DB */
- sql = switch_mprintf("insert into directory_search values('%q','%q','%q','%q','%q','%q','%q','%q','%q','%d','%d')",
- globals.hostname, switch_core_session_get_uuid(session), extension, fullName, fullNameDigit, firstName, firstNameDigit,
- lastName, lastNameDigit, name_visible, exten_visible);
-
- if (sqlvalues) {
- sqltmp = sqlvalues;
- sqlvalues = switch_mprintf("%s;%s", sqlvalues, sql);
- switch_safe_free(sqltmp);
- } else {
- sqlvalues = sql;
- sql = NULL;
+ if (sql) {
+ if (sqlvalues) {
+ sqltmp = sqlvalues;
+ sqlvalues = switch_mprintf("%s;%s", sqltmp, sql);
+ switch_safe_free(sqltmp);
+ switch_safe_free(sql);
+ } else {
+ sqlvalues = sql;
+ sql = NULL;
+ }
}
- switch_safe_free(sql);
- switch_safe_free(fullNameDigit);
- switch_safe_free(lastNameDigit);
- switch_safe_free(firstNameDigit);
if (++count >= 100) {
count = 0;
globals.hostname, switch_core_session_get_uuid(session), (params->search_by == SEARCH_BY_LAST_NAME ? "last_name_digit" : "first_name_digit"), params->digits);
}
- sql = switch_mprintf("select count(*) from directory_search where %s", sql_where);
+ sql = switch_mprintf("select count(*) from directory_search where %s group by last_name, first_name, extension", sql_where);
directory_execute_sql_callback(globals.mutex, sql, sql2str_callback, &cbt);
switch_safe_free(sql);
memset(&listing_cbt, 0, sizeof(listing_cbt));
listing_cbt.params = params;
- sql = switch_mprintf("select extension, full_name, last_name, first_name, name_visible, exten_visible from directory_search where %s order by last_name, first_name", sql_where);
+ sql = switch_mprintf("select extension, full_name, last_name, first_name, name_visible, exten_visible from directory_search where %s group by extension, full_name, last_name, first_name, name_visible, exten_visible order by last_name, first_name", sql_where);
for (cur_entry = 0; cur_entry < result_count; cur_entry++) {
listing_cbt.index = 0;