/** * Load config file * * @param string $filePath */ PHP_METHOD(Phalcon_Config_Adapter_Ini, read){ zval *file_path, *absolute_path = NULL, *scanner_mode = NULL, config_dir_path = {}, base_path = {}, ini_config = {}, config = {}, *directives; zend_string *str_key; ulong idx; phalcon_fetch_params(0, 1, 2, &file_path, &absolute_path, &scanner_mode); PHALCON_ENSURE_IS_STRING(file_path); if (!absolute_path) { absolute_path = &PHALCON_GLOBAL(z_false); } if (zend_is_true(absolute_path)) { PHALCON_CPY_WRT_CTOR(&config_dir_path, file_path); } else { phalcon_return_static_property_ce(&base_path, phalcon_config_adapter_ce, SL("_basePath")); PHALCON_CONCAT_VV(&config_dir_path, &base_path, file_path); } /** * Use the standard parse_ini_file */ if (scanner_mode && Z_TYPE_P(scanner_mode) == IS_LONG) { PHALCON_CALL_FUNCTIONW(&ini_config, "parse_ini_file", &config_dir_path, &PHALCON_GLOBAL(z_true), scanner_mode); } else { PHALCON_CALL_FUNCTIONW(&ini_config, "parse_ini_file", &config_dir_path, &PHALCON_GLOBAL(z_true)); } /** * Check if the file had errors */ if (Z_TYPE(ini_config) != IS_ARRAY) { zend_throw_exception_ex(phalcon_config_exception_ce, 0, "Configuration file '%s' cannot be read", Z_STRVAL(config_dir_path)); return; } array_init(&config); ZEND_HASH_FOREACH_KEY_VAL(Z_ARRVAL(ini_config), idx, str_key, directives) { zval section = {}, *value; if (str_key) { ZVAL_STR(§ion, str_key); } else { ZVAL_LONG(§ion, idx); } if (unlikely(Z_TYPE_P(directives) != IS_ARRAY) || zend_hash_num_elements(Z_ARRVAL_P(directives)) == 0) { phalcon_array_update_zval(&config, §ion, directives, PH_COPY); } else { ZEND_HASH_FOREACH_KEY_VAL(Z_ARRVAL_P(directives), idx, str_key, value) { zval key = {}, directive_parts = {}; if (str_key) { ZVAL_STR(&key, str_key); } else { ZVAL_LONG(&key, idx); } if (str_key && memchr(Z_STRVAL(key), '.', Z_STRLEN(key))) { phalcon_fast_explode_str(&directive_parts, SL("."), &key); phalcon_config_adapter_ini_update_zval_directive(&config, §ion, &directive_parts, value); } else { phalcon_array_update_multi_2(&config, §ion, &key, value, PH_COPY); } } ZEND_HASH_FOREACH_END(); }
/** * Phalcon\Config\Adapter\Ini constructor * * @param string $filePath */ PHP_METHOD(Phalcon_Config_Adapter_Ini, __construct){ zval *file_path, *process_sections, *ini_config; zval *exception_message, *config, *directives = NULL; zval *section = NULL, *value = NULL, *key = NULL, *directive_parts = NULL; HashTable *ah0, *ah1; HashPosition hp0, hp1; zval **hd; PHALCON_MM_GROW(); phalcon_fetch_params(1, 1, 0, &file_path); PHALCON_INIT_VAR(process_sections); ZVAL_BOOL(process_sections, 1); /** * Use the standard parse_ini_file */ PHALCON_INIT_VAR(ini_config); phalcon_call_func_p2(ini_config, "parse_ini_file", file_path, process_sections); /** * Check if the file had errors */ if (PHALCON_IS_FALSE(ini_config)) { PHALCON_INIT_VAR(exception_message); PHALCON_CONCAT_SVS(exception_message, "Configuration file ", file_path, " can't be loaded"); PHALCON_THROW_EXCEPTION_ZVAL(phalcon_config_exception_ce, exception_message); return; } PHALCON_INIT_VAR(config); array_init(config); phalcon_is_iterable(ini_config, &ah0, &hp0, 0, 0); while (zend_hash_get_current_data_ex(ah0, (void**) &hd, &hp0) == SUCCESS) { PHALCON_GET_HKEY(section, ah0, hp0); PHALCON_GET_HVALUE(directives); if (unlikely(Z_TYPE_P(directives) != IS_ARRAY)) { Z_ADDREF_P(directives); if (phalcon_array_update_zval(&config, section, &directives, 0) != SUCCESS) { Z_DELREF_P(directives); } zend_hash_move_forward_ex(ah0, &hp0); continue; } phalcon_is_iterable(directives, &ah1, &hp1, 0, 0); if (zend_hash_num_elements(ah1) == 0) { Z_ADDREF_P(directives); phalcon_array_update_zval(&config, section, &directives, 0); zend_hash_move_forward_ex(ah0, &hp0); continue; } while (zend_hash_get_current_data_ex(ah1, (void**) &hd, &hp1) == SUCCESS) { PHALCON_GET_HKEY(key, ah1, hp1); PHALCON_GET_HVALUE(value); if (phalcon_memnstr_str(key, SL("."))) { PHALCON_INIT_NVAR(directive_parts); phalcon_fast_explode_str(directive_parts, SL("."), key); phalcon_config_adapter_ini_update_zval_directive(&config, section, directive_parts, &value, 0 TSRMLS_CC); } else { phalcon_array_update_multi_2(&config, section, key, &value, 0); } zend_hash_move_forward_ex(ah1, &hp1); } zend_hash_move_forward_ex(ah0, &hp0); } /** * Calls the Phalcon\Config constructor */ PHALCON_CALL_PARENT_PARAMS_1_NORETURN(this_ptr, "Phalcon\\Config\\Adapter\\Ini", "__construct", config); PHALCON_MM_RESTORE(); }