/** * Starts the profile of a SQL sentence * * @param string $sqlStatement * @return Phalcon\Db\Profiler */ PHP_METHOD(Phalcon_Db_Profiler, startProfile){ zval *sql_statement, *active_profile, *micro; zval *time; PHALCON_MM_GROW(); phalcon_fetch_params(1, 1, 0, &sql_statement); PHALCON_INIT_VAR(active_profile); object_init_ex(active_profile, phalcon_db_profiler_item_ce); phalcon_call_method_p1_noret(active_profile, "setsqlstatement", sql_statement); PHALCON_INIT_VAR(micro); ZVAL_BOOL(micro, 1); PHALCON_INIT_VAR(time); phalcon_call_func_p1(time, "microtime", micro); phalcon_call_method_p1_noret(active_profile, "setinitialtime", time); if (phalcon_method_exists_ex(this_ptr, SS("beforestartprofile") TSRMLS_CC) == SUCCESS) { phalcon_call_method_p1_noret(this_ptr, "beforestartprofile", active_profile); } phalcon_update_property_this(this_ptr, SL("_activeProfile"), active_profile TSRMLS_CC); RETURN_THIS(); }
/** * Reads parsed annotations from XCache * * @param string $key * @return Phalcon\Annotations\Reflection */ PHP_METHOD(Phalcon_Annotations_Adapter_Xcache, read){ zval *key, *prefixed_key, *prefixed_lower, *serialized; zval *data; PHALCON_MM_GROW(); phalcon_fetch_params(1, 1, 0, &key); PHALCON_INIT_VAR(prefixed_key); PHALCON_CONCAT_SV(prefixed_key, "_PHAN", key); PHALCON_INIT_VAR(prefixed_lower); phalcon_fast_strtolower(prefixed_lower, prefixed_key); PHALCON_INIT_VAR(serialized); phalcon_call_func_p1(serialized, "xcache_get", prefixed_lower); if (Z_TYPE_P(serialized) == IS_STRING) { PHALCON_INIT_VAR(data); phalcon_unserialize(data, serialized TSRMLS_CC); if (Z_TYPE_P(data) == IS_OBJECT) { RETURN_CTOR(data); } } RETURN_MM_NULL(); }
/** * Returns cached content * * @param string $keyName * @param long $lifetime * @return mixed */ PHP_METHOD(Phalcon_Cache_Backend_Xcache, get){ zval *key_name, *lifetime = NULL, *frontend, *prefix, *prefixed_key; zval *cached_content, *processed; PHALCON_MM_GROW(); phalcon_fetch_params(1, 1, 1, &key_name, &lifetime); if (!lifetime) { PHALCON_INIT_VAR(lifetime); } PHALCON_OBS_VAR(frontend); phalcon_read_property_this(&frontend, this_ptr, SL("_frontend"), PH_NOISY_CC); PHALCON_OBS_VAR(prefix); phalcon_read_property_this(&prefix, this_ptr, SL("_prefix"), PH_NOISY_CC); PHALCON_INIT_VAR(prefixed_key); PHALCON_CONCAT_SVV(prefixed_key, "_PHCX", prefix, key_name); phalcon_update_property_this(this_ptr, SL("_lastKey"), prefixed_key TSRMLS_CC); PHALCON_INIT_VAR(cached_content); phalcon_call_func_p1(cached_content, "xcache_get", prefixed_key); if (Z_TYPE_P(cached_content) == IS_NULL) { RETURN_MM_NULL(); } PHALCON_INIT_VAR(processed); phalcon_call_method_p1(processed, frontend, "afterretrieve", cached_content); RETURN_CCTOR(processed); }
/** * Closes the logger * * @return boolean */ PHP_METHOD(Phalcon_Logger_Adapter_File, close){ zval *file_handler; PHALCON_MM_GROW(); PHALCON_OBS_VAR(file_handler); phalcon_read_property_this(&file_handler, this_ptr, SL("_fileHandler"), PH_NOISY_CC); phalcon_call_func_p1(return_value, "fclose", file_handler); RETURN_MM(); }
/** * Generates a pseudo random token key to be used as input's name in a CSRF check * * @param int $numberBytes * @return string */ PHP_METHOD(Phalcon_Security, getTokenKey){ zval *number_bytes = NULL, *random_bytes, *base64bytes; zval *safe_bytes, *dependency_injector, *service; zval *session, *key; PHALCON_MM_GROW(); phalcon_fetch_params(1, 0, 1, &number_bytes); if (!number_bytes) { PHALCON_INIT_VAR(number_bytes); ZVAL_LONG(number_bytes, 12); } if (phalcon_function_exists_ex(SS("openssl_random_pseudo_bytes") TSRMLS_CC) == FAILURE) { PHALCON_THROW_EXCEPTION_STR(phalcon_security_exception_ce, "Openssl extension must be loaded"); return; } PHALCON_INIT_VAR(random_bytes); phalcon_call_func_p1(random_bytes, "openssl_random_pseudo_bytes", number_bytes); PHALCON_INIT_VAR(base64bytes); phalcon_base64_encode(base64bytes, random_bytes); PHALCON_INIT_VAR(safe_bytes); phalcon_filter_alphanum(safe_bytes, base64bytes); PHALCON_OBS_VAR(dependency_injector); phalcon_read_property_this(&dependency_injector, this_ptr, SL("_dependencyInjector"), PH_NOISY_CC); if (Z_TYPE_P(dependency_injector) != IS_OBJECT) { PHALCON_THROW_EXCEPTION_STR(phalcon_flash_exception_ce, "A dependency injection container is required to access the 'session' service"); return; } PHALCON_INIT_VAR(service); ZVAL_STRING(service, "session", 1); PHALCON_INIT_VAR(session); phalcon_call_method_p1(session, dependency_injector, "getshared", service); PHALCON_VERIFY_INTERFACE(session, phalcon_session_adapterinterface_ce); PHALCON_INIT_VAR(key); ZVAL_STRING(key, "$PHALCON/CSRF/KEY$", 1); phalcon_call_method_p2_noret(session, "set", key, safe_bytes); RETURN_CTOR(safe_bytes); }
/** * Gets decoded JSON HTTP raw request body * * @return string */ PHP_METHOD(Phalcon_Http_Request, getJsonRawBody){ zval *raw_body, *json_raw_body; PHALCON_MM_GROW(); PHALCON_INIT_VAR(raw_body); phalcon_call_method(raw_body, this_ptr, "getrawbody"); if (Z_TYPE_P(raw_body) == IS_STRING) { PHALCON_INIT_VAR(json_raw_body); phalcon_call_func_p1(json_raw_body, "json_decode", raw_body); RETURN_CCTOR(json_raw_body); } PHALCON_MM_RESTORE(); }
/** * Sets an attached file to be sent at the end of the request * * @param string $filePath * @param string $attachmentName */ PHP_METHOD(Phalcon_Http_Response, setFileToSend){ zval *file_path, *attachment_name = NULL, *attachment = NULL, *base_path = NULL; zval *headers, *content_description, *content_disposition; zval *content_transfer; PHALCON_MM_GROW(); phalcon_fetch_params(1, 1, 2, &file_path, &attachment_name, &attachment); if (!attachment_name) { PHALCON_INIT_VAR(attachment_name); } if (!attachment) { PHALCON_INIT_VAR(attachment); ZVAL_BOOL(attachment, 1); } if (Z_TYPE_P(attachment_name) != IS_STRING) { PHALCON_INIT_VAR(base_path); phalcon_call_func_p1(base_path, "basename", file_path); } else { PHALCON_CPY_WRT(base_path, attachment_name); } if (zend_is_true(attachment)) { PHALCON_INIT_VAR(headers); phalcon_call_method(headers, this_ptr, "getheaders"); PHALCON_INIT_VAR(content_description); ZVAL_STRING(content_description, "Content-Description: File Transfer", 1); phalcon_call_method_p1_noret(headers, "setraw", content_description); PHALCON_INIT_VAR(content_disposition); PHALCON_CONCAT_SV(content_disposition, "Content-Disposition: attachment; filename=", base_path); phalcon_call_method_p1_noret(headers, "setraw", content_disposition); PHALCON_INIT_VAR(content_transfer); ZVAL_STRING(content_transfer, "Content-Transfer-Encoding: binary", 1); phalcon_call_method_p1_noret(headers, "setraw", content_transfer); } phalcon_update_property_this(this_ptr, SL("_file"), file_path TSRMLS_CC); RETURN_THIS(); }
/** * Gets active server address IP * * @return string */ PHP_METHOD(Phalcon_Http_Request, getServerAddress){ zval *server = NULL, *_SERVER, *server_addr, *localhost; PHALCON_MM_GROW(); phalcon_get_global(&_SERVER, SS("_SERVER") TSRMLS_CC); PHALCON_CPY_WRT(server, _SERVER); if (phalcon_array_isset_string(server, SS("SERVER_ADDR"))) { PHALCON_OBS_VAR(server_addr); phalcon_array_fetch_string(&server_addr, server, SL("SERVER_ADDR"), PH_NOISY); RETURN_CCTOR(server_addr); } PHALCON_INIT_VAR(localhost); ZVAL_STRING(localhost, "localhost", 1); phalcon_call_func_p1(return_value, "gethostbyname", localhost); RETURN_MM(); }
/** * Uppercases a string, this function makes use of the mbstring extension if available * * @param string $str * @return string */ PHP_METHOD(Phalcon_Text, upper) { zval *str; PHALCON_MM_GROW(); phalcon_fetch_params(1, 1, 0, &str); /** * 'upper' checks for the mbstring extension to make a correct lowercase * transformation */ if (phalcon_function_exists_ex(SS("mb_strtoupper") TSRMLS_CC) == SUCCESS) { phalcon_call_func_p1(return_value, "mb_strtoupper", str); RETURN_MM(); } phalcon_fast_strtoupper(return_value, str); RETURN_MM(); }
/** * Returns the complete location where the resource must be written * * @param string $basePath * @return string */ PHP_METHOD(Phalcon_Assets_Resource, getRealTargetPath){ zval *base_path = NULL, *target_path = NULL, *local, *complete_path; PHALCON_MM_GROW(); phalcon_fetch_params(1, 0, 1, &base_path); if (!base_path) { PHALCON_INIT_VAR(base_path); } PHALCON_OBS_VAR(target_path); phalcon_read_property_this(&target_path, this_ptr, SL("_targetPath"), PH_NOISY_CC); if (PHALCON_IS_EMPTY(target_path)) { PHALCON_OBS_NVAR(target_path); phalcon_read_property_this(&target_path, this_ptr, SL("_path"), PH_NOISY_CC); } PHALCON_OBS_VAR(local); phalcon_read_property_this(&local, this_ptr, SL("_local"), PH_NOISY_CC); if (zend_is_true(local)) { /** * A base path for resources can be set in the assets manager */ PHALCON_INIT_VAR(complete_path); PHALCON_CONCAT_VV(complete_path, base_path, target_path); /** * Get the real template path, the target path can optionally don't exist */ if (phalcon_file_exists(complete_path TSRMLS_CC) == SUCCESS) { phalcon_call_func_p1(return_value, "realpath", complete_path); RETURN_MM(); } RETURN_CTOR(complete_path); } RETURN_CCTOR(target_path); }
/** * Generate a >22-length pseudo random string to be used as salt for passwords * * @return string */ PHP_METHOD(Phalcon_Security, getSaltBytes){ zval *number_bytes, *random_bytes = NULL, *base64bytes = NULL; zval *safe_bytes = NULL, *bytes_length = NULL; PHALCON_MM_GROW(); if (phalcon_function_exists_ex(SS("openssl_random_pseudo_bytes") TSRMLS_CC) == FAILURE) { PHALCON_THROW_EXCEPTION_STR(phalcon_security_exception_ce, "Openssl extension must be loaded"); return; } PHALCON_OBS_VAR(number_bytes); phalcon_read_property_this(&number_bytes, this_ptr, SL("_numberBytes"), PH_NOISY_CC); while (1) { PHALCON_INIT_NVAR(random_bytes); phalcon_call_func_p1(random_bytes, "openssl_random_pseudo_bytes", number_bytes); PHALCON_INIT_NVAR(base64bytes); phalcon_base64_encode(base64bytes, random_bytes); PHALCON_INIT_NVAR(safe_bytes); phalcon_filter_alphanum(safe_bytes, base64bytes); if (!zend_is_true(safe_bytes)) { continue; } PHALCON_INIT_NVAR(bytes_length); phalcon_fast_strlen(bytes_length, safe_bytes); if (PHALCON_LT_LONG(bytes_length, 22)) { continue; } break; } RETURN_CTOR(safe_bytes); }
/** * Reads metadata from XCache * * @param string $key * @return array */ PHP_METHOD(Phalcon_Mvc_Model_MetaData_Xcache, read){ zval *key, *prefix, *xc_key, *data; PHALCON_MM_GROW(); phalcon_fetch_params(1, 1, 0, &key); PHALCON_OBS_VAR(prefix); phalcon_read_property_this(&prefix, this_ptr, SL("_prefix"), PH_NOISY_CC); PHALCON_INIT_VAR(xc_key); PHALCON_CONCAT_SVV(xc_key, "$PMM$", prefix, key); PHALCON_INIT_VAR(data); phalcon_call_func_p1(data, "xcache_get", xc_key); if (Z_TYPE_P(data) == IS_ARRAY) { RETURN_CCTOR(data); } RETURN_MM_NULL(); }
/** * Returns the complete location where the resource is located * * @param string $basePath * @return string */ PHP_METHOD(Phalcon_Assets_Resource, getRealSourcePath){ zval *base_path = NULL, *source_path = NULL, *local, *complete_path; PHALCON_MM_GROW(); phalcon_fetch_params(1, 0, 1, &base_path); if (!base_path) { PHALCON_INIT_VAR(base_path); } PHALCON_OBS_VAR(source_path); phalcon_read_property_this(&source_path, this_ptr, SL("_sourcePath"), PH_NOISY_CC); if (PHALCON_IS_EMPTY(source_path)) { PHALCON_OBS_NVAR(source_path); phalcon_read_property_this(&source_path, this_ptr, SL("_path"), PH_NOISY_CC); } PHALCON_OBS_VAR(local); phalcon_read_property_this(&local, this_ptr, SL("_local"), PH_NOISY_CC); if (zend_is_true(local)) { /** * A base path for resources can be set in the assets manager */ PHALCON_INIT_VAR(complete_path); PHALCON_CONCAT_VV(complete_path, base_path, source_path); /** * Get the real template path */ phalcon_call_func_p1(return_value, "realpath", complete_path); RETURN_MM(); } RETURN_CCTOR(source_path); }
/** * Stops the active profile * * @return Phalcon\Db\Profiler */ PHP_METHOD(Phalcon_Db_Profiler, stopProfile){ zval *micro, *final_time, *active_profile, *initial_time; zval *diference, *total_seconds, *new_total_seconds; PHALCON_MM_GROW(); PHALCON_INIT_VAR(micro); ZVAL_BOOL(micro, 1); PHALCON_INIT_VAR(final_time); phalcon_call_func_p1(final_time, "microtime", micro); PHALCON_OBS_VAR(active_profile); phalcon_read_property_this(&active_profile, this_ptr, SL("_activeProfile"), PH_NOISY_CC); phalcon_call_method_p1_noret(active_profile, "setfinaltime", final_time); PHALCON_INIT_VAR(initial_time); phalcon_call_method(initial_time, active_profile, "getinitialtime"); PHALCON_INIT_VAR(diference); sub_function(diference, final_time, initial_time TSRMLS_CC); PHALCON_OBS_VAR(total_seconds); phalcon_read_property_this(&total_seconds, this_ptr, SL("_totalSeconds"), PH_NOISY_CC); PHALCON_INIT_VAR(new_total_seconds); phalcon_add_function(new_total_seconds, total_seconds, diference TSRMLS_CC); phalcon_update_property_this(this_ptr, SL("_totalSeconds"), new_total_seconds TSRMLS_CC); phalcon_update_property_array_append(this_ptr, SL("_allProfiles"), active_profile TSRMLS_CC); if (phalcon_method_exists_ex(this_ptr, SS("afterendprofile") TSRMLS_CC) == SUCCESS) { phalcon_call_method_p1_noret(this_ptr, "afterendprofile", active_profile); } RETURN_THIS(); }
/** * Produces an string representation of a variable * * @param mixed $variable * @return string */ PHP_METHOD(Phalcon_Debug, _getVarDump){ zval *variable, *escaped_string, *class_name; zval *dumped_object, *array_dump = NULL, *dump = NULL, *type; PHALCON_MM_GROW(); phalcon_fetch_params(1, 1, 0, &variable); if (PHALCON_IS_SCALAR(variable)) { /** * Boolean variables are represented as 'true'/'false' */ if (Z_TYPE_P(variable) == IS_BOOL) { if (zend_is_true(variable)) { PHALCON_MM_RESTORE(); RETURN_STRING("true", 1); } else { PHALCON_MM_RESTORE(); RETURN_STRING("false", 1); } } /** * String variables are escaped to avoid XSS injections */ if (Z_TYPE_P(variable) == IS_STRING) { PHALCON_INIT_VAR(escaped_string); phalcon_call_method_p1(escaped_string, this_ptr, "_escapestring", variable); RETURN_CCTOR(escaped_string); } /** * Other scalar variables are just converted to strings */ RETURN_CCTOR(variable); } /** * If the variable is an object print its class name */ if (Z_TYPE_P(variable) == IS_OBJECT) { PHALCON_INIT_VAR(class_name); phalcon_get_class(class_name, variable, 0 TSRMLS_CC); /** * Try to check for a 'dump' method, this surely produces a better printable * representation */ if (phalcon_method_exists_ex(variable, SS("dump") TSRMLS_CC) == SUCCESS) { PHALCON_INIT_VAR(dumped_object); phalcon_call_method(dumped_object, variable, "dump"); /** * dump() must return an array, generate a recursive representation using * getArrayDump */ PHALCON_INIT_VAR(array_dump); phalcon_call_method_p1(array_dump, this_ptr, "_getarraydump", dumped_object); PHALCON_INIT_VAR(dump); PHALCON_CONCAT_SVSVS(dump, "Object(", class_name, ": ", array_dump, ")"); } else { /** * If dump() is not available just print the class name */ PHALCON_INIT_NVAR(dump); PHALCON_CONCAT_SVS(dump, "Object(", class_name, ")</span>"); } RETURN_CTOR(dump); } /** * Recursively process the array and enclose it in Array() */ if (Z_TYPE_P(variable) == IS_ARRAY) { PHALCON_INIT_NVAR(array_dump); phalcon_call_method_p1(array_dump, this_ptr, "_getarraydump", variable); PHALCON_INIT_NVAR(dump); PHALCON_CONCAT_SVS(dump, "Array(", array_dump, ")"); RETURN_CTOR(dump); } /** * Null variables are represented as 'null' */ if (Z_TYPE_P(variable) == IS_NULL) { PHALCON_MM_RESTORE(); RETURN_STRING("null", 1); } /** * Other types are represented by its type */ PHALCON_INIT_VAR(type); phalcon_call_func_p1(type, "gettype", variable); RETURN_CCTOR(type); }
/** * Shows a backtrace item * * @param int $n * @param array $trace */ PHP_METHOD(Phalcon_Debug, showTraceItem){ zval *n, *trace, *space, *two_spaces, *underscore; zval *minus, *html, *class_name, *pattern, *is_phalcon_class; zval *namespace_separator, *prepare_uri_class; zval *class_reflection, *is_internal = NULL, *lower_class_name; zval *prepare_internal_class, *type, *function_name = NULL; zval *function_reflection, *prepared_function_name; zval *trace_args, *arguments, *argument = NULL, *dumped_argument = NULL; zval *span_argument = NULL, *joined_arguments, *one; zval *file, *line, *show_files, *lines, *number_lines; zval *show_file_fragment, *seven, *before_line; zval *first_line = NULL, *five, *after_line, *last_line = NULL; zval *comment_pattern, *utf8, *ent_compat, *tab; zval *comment, *i = NULL, *line_position = NULL, *current_line = NULL; zval *trimmed = NULL, *is_comment = NULL, *spaced_current_line = NULL; zval *escaped_line = NULL; HashTable *ah0; HashPosition hp0; zval **hd; zend_class_entry *ce0, *ce1; PHALCON_MM_GROW(); phalcon_fetch_params(1, 2, 0, &n, &trace); PHALCON_INIT_VAR(space); ZVAL_STRING(space, " ", 1); PHALCON_INIT_VAR(two_spaces); ZVAL_STRING(two_spaces, " ", 1); PHALCON_INIT_VAR(underscore); ZVAL_STRING(underscore, "_", 1); PHALCON_INIT_VAR(minus); ZVAL_STRING(minus, "-", 1); /** * Every trace in the backtrace have a unique number */ PHALCON_INIT_VAR(html); PHALCON_CONCAT_SVS(html, "<tr><td align=\"right\" valign=\"top\" class=\"error-number\">#", n, "</td><td>"); if (phalcon_array_isset_string(trace, SS("class"))) { PHALCON_OBS_VAR(class_name); phalcon_array_fetch_string(&class_name, trace, SL("class"), PH_NOISY); PHALCON_INIT_VAR(pattern); ZVAL_STRING(pattern, "/^Phalcon/", 1); PHALCON_INIT_VAR(is_phalcon_class); phalcon_preg_match(is_phalcon_class, pattern, class_name, NULL TSRMLS_CC); /** * We assume that classes starting by Phalcon are framework's classes */ if (zend_is_true(is_phalcon_class)) { PHALCON_INIT_VAR(namespace_separator); ZVAL_STRING(namespace_separator, "\\", 1); /** * Prepare the class name according to the Phalcon's conventions */ PHALCON_INIT_VAR(prepare_uri_class); phalcon_fast_str_replace(prepare_uri_class, namespace_separator, underscore, class_name); /** * Generate a link to the official docs */ PHALCON_SCONCAT_SVSVS(html, "<span class=\"error-class\"><a target=\"_new\" href=\"http://docs.phalconphp.com/en/latest/api/", prepare_uri_class, ".html\">", class_name, "</a></span>"); } else { ce0 = zend_fetch_class(SL("ReflectionClass"), ZEND_FETCH_CLASS_AUTO TSRMLS_CC); PHALCON_INIT_VAR(class_reflection); object_init_ex(class_reflection, ce0); if (phalcon_has_constructor(class_reflection TSRMLS_CC)) { phalcon_call_method_p1_noret(class_reflection, "__construct", class_name); } /** * Check if classes are PHP's classes */ PHALCON_INIT_VAR(is_internal); phalcon_call_method(is_internal, class_reflection, "isinternal"); if (zend_is_true(is_internal)) { PHALCON_INIT_VAR(lower_class_name); phalcon_fast_strtolower(lower_class_name, class_name); PHALCON_INIT_VAR(prepare_internal_class); phalcon_fast_str_replace(prepare_internal_class, underscore, minus, lower_class_name); /** * Generate a link to the official docs */ PHALCON_SCONCAT_SVSVS(html, "<span class=\"error-class\"><a target=\"_new\" href=\"http://php.net/manual/en/class.", prepare_internal_class, ".php\">", class_name, "</a></span>"); } else { PHALCON_SCONCAT_SVS(html, "<span class=\"error-class\">", class_name, "</span>"); } } /** * Object access operator: static/instance */ PHALCON_OBS_VAR(type); phalcon_array_fetch_string(&type, trace, SL("type"), PH_NOISY); phalcon_concat_self(&html, type TSRMLS_CC); } /** * Normally the backtrace contains only classes */ if (phalcon_array_isset_string(trace, SS("class"))) { PHALCON_OBS_VAR(function_name); phalcon_array_fetch_string(&function_name, trace, SL("function"), PH_NOISY); PHALCON_SCONCAT_SVS(html, "<span class=\"error-function\">", function_name, "</span>"); } else { PHALCON_OBS_NVAR(function_name); phalcon_array_fetch_string(&function_name, trace, SL("function"), PH_NOISY); /** * Check if the function exists */ if (phalcon_function_exists(function_name TSRMLS_CC) == SUCCESS) { ce1 = zend_fetch_class(SL("ReflectionFunction"), ZEND_FETCH_CLASS_AUTO TSRMLS_CC); PHALCON_INIT_VAR(function_reflection); object_init_ex(function_reflection, ce1); if (phalcon_has_constructor(function_reflection TSRMLS_CC)) { phalcon_call_method_p1_noret(function_reflection, "__construct", function_name); } PHALCON_INIT_NVAR(is_internal); phalcon_call_method(is_internal, function_reflection, "isinternal"); /** * Internal functions links to the PHP documentation */ if (zend_is_true(is_internal)) { /** * Prepare function's name according to the conventions in the docs */ PHALCON_INIT_VAR(prepared_function_name); phalcon_fast_str_replace(prepared_function_name, underscore, minus, function_name); PHALCON_SCONCAT_SVSVS(html, "<span class=\"error-function\"><a target=\"_new\" href=\"http://php.net/manual/en/function.", prepared_function_name, ".php\">", function_name, "</a></span>"); } else { PHALCON_SCONCAT_SVS(html, "<span class=\"error-function\">", function_name, "</span>"); } } else { PHALCON_SCONCAT_SVS(html, "<span class=\"error-function\">", function_name, "</span>"); } } /** * Check for arguments in the function */ if (phalcon_array_isset_string(trace, SS("args"))) { PHALCON_OBS_VAR(trace_args); phalcon_array_fetch_string(&trace_args, trace, SL("args"), PH_NOISY); if (phalcon_fast_count_ev(trace_args TSRMLS_CC)) { PHALCON_INIT_VAR(arguments); array_init(arguments); phalcon_is_iterable(trace_args, &ah0, &hp0, 0, 0); while (zend_hash_get_current_data_ex(ah0, (void**) &hd, &hp0) == SUCCESS) { PHALCON_GET_HVALUE(argument); /** * Every argument is generated using _getVarDump */ PHALCON_INIT_NVAR(dumped_argument); phalcon_call_method_p1(dumped_argument, this_ptr, "_getvardump", argument); PHALCON_INIT_NVAR(span_argument); PHALCON_CONCAT_SVS(span_argument, "<span class=\"error-parameter\">", dumped_argument, "</span>"); /** * Append the HTML generated to the argument's list */ phalcon_array_append(&arguments, span_argument, PH_SEPARATE); zend_hash_move_forward_ex(ah0, &hp0); } /** * Join all the arguments */ PHALCON_INIT_VAR(joined_arguments); phalcon_fast_join_str(joined_arguments, SL(", "), arguments TSRMLS_CC); PHALCON_SCONCAT_SVS(html, "(", joined_arguments, ")"); } else { phalcon_concat_self_str(&html, SL("()") TSRMLS_CC); } } /** * When 'file' is present, it usually means the function is provided by the user */ if (phalcon_array_isset_string(trace, SS("file"))) { PHALCON_INIT_VAR(one); ZVAL_LONG(one, 1); PHALCON_OBS_VAR(file); phalcon_array_fetch_string(&file, trace, SL("file"), PH_NOISY); PHALCON_OBS_VAR(line); phalcon_array_fetch_string(&line, trace, SL("line"), PH_NOISY); /** * Realpath to the file and its line using a special header */ PHALCON_SCONCAT_SVSVS(html, "<br/><div class=\"error-file\">", file, " (", line, ")</div>"); PHALCON_OBS_VAR(show_files); phalcon_read_property_this(&show_files, this_ptr, SL("_showFiles"), PH_NOISY_CC); /** * The developer can change if the files must be opened or not */ if (zend_is_true(show_files)) { /** * Open the file to an array using 'file', this respects the openbase-dir directive */ PHALCON_INIT_VAR(lines); phalcon_call_func_p1(lines, "file", file); PHALCON_INIT_VAR(number_lines); phalcon_fast_count(number_lines, lines TSRMLS_CC); PHALCON_OBS_VAR(show_file_fragment); phalcon_read_property_this(&show_file_fragment, this_ptr, SL("_showFileFragment"), PH_NOISY_CC); /** * File fragments just show a piece of the file where the exception is located */ if (zend_is_true(show_file_fragment)) { /** * Take seven lines back to the current exception's line, @TODO add an option for * this */ PHALCON_INIT_VAR(seven); ZVAL_LONG(seven, 7); PHALCON_INIT_VAR(before_line); sub_function(before_line, line, seven TSRMLS_CC); /** * Check for overflows */ if (PHALCON_LT_LONG(before_line, 1)) { PHALCON_CPY_WRT(first_line, one); } else { PHALCON_CPY_WRT(first_line, before_line); } /** * Take five lines after the current exception's line, @TODO add an option for this */ PHALCON_INIT_VAR(five); ZVAL_LONG(five, 5); PHALCON_INIT_VAR(after_line); phalcon_add_function(after_line, line, five TSRMLS_CC); /** * Check for overflows */ if (PHALCON_GT(after_line, number_lines)) { PHALCON_CPY_WRT(last_line, number_lines); } else { PHALCON_CPY_WRT(last_line, after_line); } PHALCON_SCONCAT_SVSVSVS(html, "<pre class='prettyprint highlight:", first_line, ":", line, " linenums:", first_line, "'>"); } else { PHALCON_CPY_WRT(first_line, one); PHALCON_CPY_WRT(last_line, number_lines); PHALCON_SCONCAT_SVSVS(html, "<pre class='prettyprint highlight:", first_line, ":", line, " linenums error-scroll'>"); } PHALCON_INIT_VAR(comment_pattern); ZVAL_STRING(comment_pattern, "#\\*\\/$#", 1); /** * We assume the file is utf-8 encoded, @TODO add an option for this */ PHALCON_INIT_VAR(utf8); ZVAL_STRING(utf8, "UTF-8", 1); /** * Don't escape quotes */ PHALCON_INIT_VAR(ent_compat); ZVAL_LONG(ent_compat, 2); PHALCON_INIT_VAR(tab); ZVAL_STRING(tab, "\t", 1); PHALCON_INIT_VAR(comment); ZVAL_STRING(comment, "* /", 1); PHALCON_CPY_WRT(i, first_line); while (1) { if (PHALCON_LE(i, last_line)) { } else { break; } /** * Current line in the file */ PHALCON_INIT_NVAR(line_position); sub_function(line_position, i, one TSRMLS_CC); /** * Current line content in the piece of file */ PHALCON_OBS_NVAR(current_line); phalcon_array_fetch(¤t_line, lines, line_position, PH_NOISY); /** * File fragments are cleaned, removing tabs and comments */ if (zend_is_true(show_file_fragment)) { if (PHALCON_IS_EQUAL(i, first_line)) { PHALCON_INIT_NVAR(trimmed); phalcon_fast_trim(trimmed, current_line, PHALCON_TRIM_RIGHT TSRMLS_CC); PHALCON_INIT_NVAR(is_comment); phalcon_preg_match(is_comment, comment_pattern, current_line, NULL TSRMLS_CC); if (zend_is_true(is_comment)) { PHALCON_INIT_NVAR(spaced_current_line); phalcon_fast_str_replace(spaced_current_line, comment, space, current_line); PHALCON_CPY_WRT(current_line, spaced_current_line); } } } /** * Print a non break space if the current line is a line break, this allows to show * the html zebra properly */ if (PHALCON_IS_STRING(current_line, "\n")) { phalcon_concat_self_str(&html, SL(" \n") TSRMLS_CC); } else { if (PHALCON_IS_STRING(current_line, "\r\n")) { phalcon_concat_self_str(&html, SL(" \n") TSRMLS_CC); } else { PHALCON_INIT_NVAR(spaced_current_line); phalcon_fast_str_replace(spaced_current_line, tab, two_spaces, current_line); PHALCON_INIT_NVAR(escaped_line); phalcon_call_func_p3(escaped_line, "htmlentities", spaced_current_line, ent_compat, utf8); phalcon_concat_self(&html, escaped_line TSRMLS_CC); } } PHALCON_SEPARATE(i); phalcon_increment(i); } phalcon_concat_self_str(&html, SL("</pre>") TSRMLS_CC); } } phalcon_concat_self_str(&html, SL("</td></tr>") TSRMLS_CC); RETURN_CTOR(html); }
/** * Returns a slice of the resultset to show in the pagination * * @return stdClass */ PHP_METHOD(Phalcon_Paginator_Adapter_Model, getPaginate){ zval *one, *zero, *show, *config, *items, *page_number = NULL; zval *n, *page, *last_show_page, *start; zval *possible_pages = NULL, *total_pages, *page_items; zval *i, *valid = NULL, *current = NULL, *maximum_pages, *next = NULL, *additional_page; zval *before = NULL, *remainder, *pages_total = NULL; zval *r0 = NULL; PHALCON_MM_GROW(); PHALCON_INIT_VAR(one); ZVAL_LONG(one, 1); PHALCON_INIT_VAR(zero); ZVAL_LONG(zero, 0); PHALCON_OBS_VAR(show); phalcon_read_property_this(&show, this_ptr, SL("_limitRows"), PH_NOISY_CC); PHALCON_OBS_VAR(config); phalcon_read_property_this(&config, this_ptr, SL("_config"), PH_NOISY_CC); PHALCON_OBS_VAR(items); phalcon_array_fetch_string(&items, config, SL("data"), PH_NOISY); PHALCON_OBS_VAR(page_number); phalcon_read_property_this(&page_number, this_ptr, SL("_page"), PH_NOISY_CC); if (Z_TYPE_P(page_number) == IS_NULL) { PHALCON_CPY_WRT(page_number, one); } if (PHALCON_LT(show, zero)) { PHALCON_THROW_EXCEPTION_STR(phalcon_paginator_exception_ce, "The start page number is zero or less"); return; } PHALCON_INIT_VAR(n); phalcon_fast_count(n, items TSRMLS_CC); PHALCON_INIT_VAR(page); object_init(page); PHALCON_INIT_VAR(last_show_page); sub_function(last_show_page, page_number, one TSRMLS_CC); PHALCON_INIT_VAR(start); mul_function(start, show, last_show_page TSRMLS_CC); PHALCON_INIT_VAR(possible_pages); div_function(possible_pages, n, show TSRMLS_CC); PHALCON_INIT_VAR(total_pages); phalcon_call_func_p1(total_pages, "ceil", possible_pages); if (Z_TYPE_P(items) != IS_OBJECT) { PHALCON_THROW_EXCEPTION_STR(phalcon_paginator_exception_ce, "Invalid data for paginator"); return; } if (!zend_is_true(page_number)) { PHALCON_CPY_WRT(page_number, one); } PHALCON_INIT_VAR(page_items); array_init(page_items); if (PHALCON_GT(n, zero)) { /** * Seek to the desired position */ if (PHALCON_LE(start, n)) { phalcon_call_method_p1_noret(items, "seek", start); } else { phalcon_call_method_p1_noret(items, "seek", one); PHALCON_CPY_WRT(page_number, one); } /** * The record must be iterable */ PHALCON_INIT_VAR(i); ZVAL_LONG(i, 1); while (1) { PHALCON_INIT_NVAR(r0); phalcon_call_method(r0, items, "valid"); PHALCON_CPY_WRT(valid, r0); if (PHALCON_IS_NOT_FALSE(valid)) { } else { break; } PHALCON_INIT_NVAR(current); phalcon_call_method(current, items, "current"); phalcon_array_append(&page_items, current, PH_SEPARATE); if (PHALCON_GE(i, show)) { break; } phalcon_increment(i); } } phalcon_update_property_zval(page, SL("items"), page_items TSRMLS_CC); PHALCON_INIT_VAR(maximum_pages); phalcon_add_function(maximum_pages, start, show TSRMLS_CC); if (PHALCON_LT(maximum_pages, n)) { PHALCON_INIT_VAR(next); phalcon_add_function(next, page_number, one TSRMLS_CC); } else { if (PHALCON_IS_EQUAL(maximum_pages, n)) { PHALCON_CPY_WRT(next, n); } else { div_function(possible_pages, n, show TSRMLS_CC); PHALCON_INIT_VAR(additional_page); phalcon_add_function(additional_page, possible_pages, one TSRMLS_CC); PHALCON_INIT_NVAR(next); ZVAL_LONG(next, phalcon_get_intval(additional_page)); } } if (PHALCON_GT(next, total_pages)) { PHALCON_CPY_WRT(next, total_pages); } phalcon_update_property_zval(page, SL("next"), next TSRMLS_CC); if (PHALCON_GT(page_number, one)) { PHALCON_INIT_VAR(before); sub_function(before, page_number, one TSRMLS_CC); } else { PHALCON_CPY_WRT(before, one); } phalcon_update_property_zval(page, SL("first"), one TSRMLS_CC); phalcon_update_property_zval(page, SL("before"), before TSRMLS_CC); phalcon_update_property_zval(page, SL("current"), page_number TSRMLS_CC); PHALCON_INIT_VAR(remainder); mod_function(remainder, n, show TSRMLS_CC); PHALCON_INIT_NVAR(possible_pages); div_function(possible_pages, n, show TSRMLS_CC); if (!PHALCON_IS_LONG(remainder, 0)) { PHALCON_INIT_NVAR(next); phalcon_add_function(next, possible_pages, one TSRMLS_CC); PHALCON_INIT_VAR(pages_total); ZVAL_LONG(pages_total, phalcon_get_intval(next)); } else { PHALCON_CPY_WRT(pages_total, possible_pages); } phalcon_update_property_zval(page, SL("last"), pages_total TSRMLS_CC); phalcon_update_property_zval(page, SL("total_pages"), pages_total TSRMLS_CC); phalcon_update_property_zval(page, SL("total_items"), n TSRMLS_CC); RETURN_CTOR(page); }
/** * Stores cached content into the XCache backend and stops the frontend * * @param string $keyName * @param string $content * @param long $lifetime * @param boolean $stopBuffer */ PHP_METHOD(Phalcon_Cache_Backend_Xcache, save){ zval *key_name = NULL, *content = NULL, *lifetime = NULL, *stop_buffer = NULL; zval *last_key = NULL, *prefix, *frontend, *cached_content = NULL; zval *prepared_content, *ttl = NULL, *success, *is_buffering; zval *options, *special_key, *keys = NULL, *zero; PHALCON_MM_GROW(); phalcon_fetch_params(1, 0, 4, &key_name, &content, &lifetime, &stop_buffer); if (!key_name) { PHALCON_INIT_VAR(key_name); } if (!content) { PHALCON_INIT_VAR(content); } if (!lifetime) { PHALCON_INIT_VAR(lifetime); } else { PHALCON_SEPARATE_PARAM(lifetime); } if (!stop_buffer) { PHALCON_INIT_VAR(stop_buffer); ZVAL_BOOL(stop_buffer, 1); } if (Z_TYPE_P(key_name) == IS_NULL) { PHALCON_OBS_VAR(last_key); phalcon_read_property_this(&last_key, this_ptr, SL("_lastKey"), PH_NOISY_CC); } else { PHALCON_OBS_VAR(prefix); phalcon_read_property_this(&prefix, this_ptr, SL("_prefix"), PH_NOISY_CC); PHALCON_INIT_NVAR(last_key); PHALCON_CONCAT_SVV(last_key, "_PHCX", prefix, key_name); } if (!zend_is_true(last_key)) { PHALCON_THROW_EXCEPTION_STR(phalcon_cache_exception_ce, "The cache must be started first"); return; } PHALCON_OBS_VAR(frontend); phalcon_read_property_this(&frontend, this_ptr, SL("_frontend"), PH_NOISY_CC); if (Z_TYPE_P(content) == IS_NULL) { PHALCON_INIT_VAR(cached_content); phalcon_call_method(cached_content, frontend, "getcontent"); } else { PHALCON_CPY_WRT(cached_content, content); } PHALCON_INIT_VAR(prepared_content); phalcon_call_method_p1(prepared_content, frontend, "beforestore", cached_content); /** * Take the lifetime from the frontend or read it from the set in start() */ if (Z_TYPE_P(lifetime) == IS_NULL) { PHALCON_OBS_NVAR(lifetime); phalcon_read_property_this(&lifetime, this_ptr, SL("_lastLifetime"), PH_NOISY_CC); if (Z_TYPE_P(lifetime) == IS_NULL) { PHALCON_INIT_VAR(ttl); phalcon_call_method(ttl, frontend, "getlifetime"); } else { PHALCON_CPY_WRT(ttl, lifetime); } } else { PHALCON_CPY_WRT(ttl, lifetime); } /** * Call xcache_set in the PHP userland since most of the time it isn't available at * compile time */ PHALCON_INIT_VAR(success); phalcon_call_func_p3(success, "xcache_set", last_key, prepared_content, ttl); PHALCON_INIT_VAR(is_buffering); phalcon_call_method(is_buffering, frontend, "isbuffering"); if (PHALCON_IS_TRUE(stop_buffer)) { phalcon_call_method_noret(frontend, "stop"); } if (PHALCON_IS_TRUE(is_buffering)) { zend_print_zval(cached_content, 0); } phalcon_update_property_bool(this_ptr, SL("_started"), 0 TSRMLS_CC); /** * xcache_set() could fail because of Out of Memory condition. I don't think it is * appropriate to throw an exception here (like * Phalcon\Cache\Backend\Memcache::save() does): first, to be consistent with * Phalcon\Cache\Backend\Apc::save(), second, because xCache is usually given much * less RAM than memcached */ if (zend_is_true(success)) { PHALCON_OBS_VAR(options); phalcon_read_property_this(&options, this_ptr, SL("_options"), PH_NOISY_CC); PHALCON_OBS_VAR(special_key); phalcon_array_fetch_string(&special_key, options, SL("statsKey"), PH_NOISY_CC); /** * xcache_list() is available only to the administrator (unless XCache was * patched). We have to update the list of the stored keys. */ PHALCON_INIT_VAR(keys); phalcon_call_func_p1(keys, "xcache_get", special_key); if (Z_TYPE_P(keys) != IS_ARRAY) { PHALCON_INIT_NVAR(keys); array_init(keys); } if (!zend_is_true(keys)) { phalcon_array_update_zval(&keys, last_key, &ttl, PH_COPY | PH_SEPARATE TSRMLS_CC); PHALCON_INIT_VAR(zero); ZVAL_LONG(zero, 0); phalcon_call_func_p3_noret("xcache_set", special_key, keys, zero); } } PHALCON_MM_RESTORE(); }
/** * Returns a cached content * * @param int|string $keyName * @param long $lifetime * @return mixed */ PHP_METHOD(Phalcon_Cache_Backend_File, get){ zval *key_name, *lifetime = NULL, *options, *prefix, *prefixed_key; zval *cache_dir, *cache_file, *frontend, *timestamp; zval *ttl = NULL, *modified_time, *difference, *not_expired; zval *cached_content, *exception_message; PHALCON_MM_GROW(); phalcon_fetch_params(1, 1, 1, &key_name, &lifetime); if (!lifetime) { PHALCON_INIT_VAR(lifetime); } else { PHALCON_SEPARATE_PARAM(lifetime); } PHALCON_OBS_VAR(options); phalcon_read_property_this(&options, this_ptr, SL("_options"), PH_NOISY_CC); PHALCON_OBS_VAR(prefix); phalcon_read_property_this(&prefix, this_ptr, SL("_prefix"), PH_NOISY_CC); PHALCON_INIT_VAR(prefixed_key); PHALCON_CONCAT_VV(prefixed_key, prefix, key_name); phalcon_update_property_this(this_ptr, SL("_lastKey"), prefixed_key TSRMLS_CC); PHALCON_OBS_VAR(cache_dir); phalcon_array_fetch_string(&cache_dir, options, SL("cacheDir"), PH_NOISY); PHALCON_INIT_VAR(cache_file); PHALCON_CONCAT_VV(cache_file, cache_dir, prefixed_key); if (phalcon_file_exists(cache_file TSRMLS_CC) == SUCCESS) { PHALCON_OBS_VAR(frontend); phalcon_read_property_this(&frontend, this_ptr, SL("_frontend"), PH_NOISY_CC); /** * Check if the file has expired */ PHALCON_INIT_VAR(timestamp); ZVAL_LONG(timestamp, (long) time(NULL)); /** * Take the lifetime from the frontend or read it from the set in start() */ if (Z_TYPE_P(lifetime) == IS_NULL) { PHALCON_OBS_NVAR(lifetime); phalcon_read_property_this(&lifetime, this_ptr, SL("_lastLifetime"), PH_NOISY_CC); if (Z_TYPE_P(lifetime) == IS_NULL) { PHALCON_INIT_VAR(ttl); phalcon_call_method(ttl, frontend, "getlifetime"); } else { PHALCON_CPY_WRT(ttl, lifetime); } } else { PHALCON_CPY_WRT(ttl, lifetime); } PHALCON_INIT_VAR(modified_time); phalcon_call_func_p1(modified_time, "filemtime", cache_file); PHALCON_INIT_VAR(difference); sub_function(difference, timestamp, ttl TSRMLS_CC); PHALCON_INIT_VAR(not_expired); is_smaller_function(not_expired, difference, modified_time TSRMLS_CC); /** * The content is only retrieved if the content has not expired */ if (PHALCON_IS_TRUE(not_expired)) { /** * Use file-get-contents to control that the openbase_dir can't be skipped */ PHALCON_INIT_VAR(cached_content); phalcon_file_get_contents(cached_content, cache_file TSRMLS_CC); if (PHALCON_IS_FALSE(cached_content)) { PHALCON_INIT_VAR(exception_message); PHALCON_CONCAT_SVS(exception_message, "Cache file ", cache_file, " could not be opened"); PHALCON_THROW_EXCEPTION_ZVAL(phalcon_cache_exception_ce, exception_message); return; } /** * Use the frontend to process the content of the cache */ phalcon_call_method_p1(return_value, frontend, "afterretrieve", cached_content); RETURN_MM(); } } RETURN_MM_NULL(); }
/** * Handles uncaught exceptions * * @param \Exception $exception * @return boolean */ PHP_METHOD(Phalcon_Debug, onUncaughtException){ zval *exception, *ob_level, *is_active = NULL, *message = NULL; zval *class_name, *css_sources, *escaped_message = NULL; zval *html, *version, *file, *line, *show_back_trace; zval *data_vars, *trace, *trace_item = NULL, *n = NULL, *html_item = NULL; zval *_REQUEST, *value = NULL, *key_request = NULL, *_SERVER; zval *key_server = NULL, *files, *key_file = NULL, *true_usage; zval *memory, *data_var = NULL, *key_var = NULL, *variable = NULL, *dumped_argument = NULL; zval *js_sources; HashTable *ah0, *ah1, *ah2, *ah3, *ah4; HashPosition hp0, hp1, hp2, hp3, hp4; zval **hd; PHALCON_MM_GROW(); phalcon_fetch_params(1, 1, 0, &exception); PHALCON_INIT_VAR(ob_level); phalcon_call_func(ob_level, "ob_get_level"); /** * Cancel the output buffer if active */ if (PHALCON_GT_LONG(ob_level, 0)) { phalcon_ob_end_clean(TSRMLS_C); } PHALCON_OBS_VAR(is_active); phalcon_read_static_property(&is_active, SL("phalcon\\debug"), SL("_isActive") TSRMLS_CC); /** * Avoid that multiple exceptions being showed */ if (zend_is_true(is_active)) { PHALCON_INIT_VAR(message); phalcon_call_method(message, exception, "getmessage"); zend_print_zval(message, 0); } PHALCON_INIT_NVAR(is_active); ZVAL_BOOL(is_active, 1); /** * Globally block the debug component to avoid other exceptions must be shown */ phalcon_update_static_property(SL("phalcon\\debug"), SL("_isActive"), is_active TSRMLS_CC); PHALCON_INIT_VAR(class_name); phalcon_get_class(class_name, exception, 0 TSRMLS_CC); PHALCON_INIT_NVAR(message); phalcon_call_method(message, exception, "getmessage"); /** * CSS static sources to style the error presentation */ PHALCON_INIT_VAR(css_sources); phalcon_call_method(css_sources, this_ptr, "getcsssources"); /** * Escape the exception's message avoiding possible XSS injections? */ PHALCON_CPY_WRT(escaped_message, message); /** * Use the exception info as document's title */ PHALCON_INIT_VAR(html); PHALCON_CONCAT_SVSVS(html, "<html><head><title>", class_name, ": ", escaped_message, "</title>"); PHALCON_SCONCAT_VS(html, css_sources, "</head><body>"); /** * Get the version link */ PHALCON_INIT_VAR(version); phalcon_call_method(version, this_ptr, "getversion"); phalcon_concat_self(&html, version TSRMLS_CC); PHALCON_INIT_VAR(file); phalcon_call_method(file, exception, "getfile"); PHALCON_INIT_VAR(line); phalcon_call_method(line, exception, "getline"); /** * Main exception info */ phalcon_concat_self_str(&html, SL("<div align=\"center\"><div class=\"error-main\">") TSRMLS_CC); PHALCON_SCONCAT_SVSVS(html, "<h1>", class_name, ": ", escaped_message, "</h1>"); PHALCON_SCONCAT_SVSVS(html, "<span class=\"error-file\">", file, " (", line, ")</span>"); phalcon_concat_self_str(&html, SL("</div>") TSRMLS_CC); PHALCON_OBS_VAR(show_back_trace); phalcon_read_property_this(&show_back_trace, this_ptr, SL("_showBackTrace"), PH_NOISY_CC); /** * Check if the developer wants to show the backtrace or not */ if (zend_is_true(show_back_trace)) { PHALCON_OBS_VAR(data_vars); phalcon_read_property_this(&data_vars, this_ptr, SL("_data"), PH_NOISY_CC); /** * Create the tabs in the page */ phalcon_concat_self_str(&html, SL("<div class=\"error-info\"><div id=\"tabs\"><ul>") TSRMLS_CC); phalcon_concat_self_str(&html, SL("<li><a href=\"#error-tabs-1\">Backtrace</a></li>") TSRMLS_CC); phalcon_concat_self_str(&html, SL("<li><a href=\"#error-tabs-2\">Request</a></li>") TSRMLS_CC); phalcon_concat_self_str(&html, SL("<li><a href=\"#error-tabs-3\">Server</a></li>") TSRMLS_CC); phalcon_concat_self_str(&html, SL("<li><a href=\"#error-tabs-4\">Included Files</a></li>") TSRMLS_CC); phalcon_concat_self_str(&html, SL("<li><a href=\"#error-tabs-5\">Memory</a></li>") TSRMLS_CC); if (Z_TYPE_P(data_vars) == IS_ARRAY) { phalcon_concat_self_str(&html, SL("<li><a href=\"#error-tabs-6\">Variables</a></li>") TSRMLS_CC); } phalcon_concat_self_str(&html, SL("</ul>") TSRMLS_CC); /** * Print backtrace */ phalcon_concat_self_str(&html, SL("<div id=\"error-tabs-1\"><table cellspacing=\"0\" align=\"center\" width=\"100%\">") TSRMLS_CC); PHALCON_INIT_VAR(trace); phalcon_call_method(trace, exception, "gettrace"); phalcon_is_iterable(trace, &ah0, &hp0, 0, 0); while (zend_hash_get_current_data_ex(ah0, (void**) &hd, &hp0) == SUCCESS) { PHALCON_GET_HKEY(n, ah0, hp0); PHALCON_GET_HVALUE(trace_item); /** * Every line in the trace is rendered using 'showTraceItem' */ PHALCON_INIT_NVAR(html_item); phalcon_call_method_p2(html_item, this_ptr, "showtraceitem", n, trace_item); phalcon_concat_self(&html, html_item TSRMLS_CC); zend_hash_move_forward_ex(ah0, &hp0); } phalcon_concat_self_str(&html, SL("</table></div>") TSRMLS_CC); /** * Print _REQUEST superglobal */ phalcon_concat_self_str(&html, SL("<div id=\"error-tabs-2\"><table cellspacing=\"0\" align=\"center\" class=\"superglobal-detail\">") TSRMLS_CC); phalcon_concat_self_str(&html, SL("<tr><th>Key</th><th>Value</th></tr>") TSRMLS_CC); phalcon_get_global(&_REQUEST, SS("_REQUEST") TSRMLS_CC); phalcon_is_iterable(_REQUEST, &ah1, &hp1, 0, 0); while (zend_hash_get_current_data_ex(ah1, (void**) &hd, &hp1) == SUCCESS) { PHALCON_GET_HKEY(key_request, ah1, hp1); PHALCON_GET_HVALUE(value); PHALCON_SCONCAT_SVSVS(html, "<tr><td class=\"key\">", key_request, "</td><td>", value, "</td></tr>"); zend_hash_move_forward_ex(ah1, &hp1); } phalcon_concat_self_str(&html, SL("</table></div>") TSRMLS_CC); /** * Print _SERVER superglobal */ phalcon_concat_self_str(&html, SL("<div id=\"error-tabs-3\"><table cellspacing=\"0\" align=\"center\" class=\"superglobal-detail\">") TSRMLS_CC); phalcon_concat_self_str(&html, SL("<tr><th>Key</th><th>Value</th></tr>") TSRMLS_CC); phalcon_get_global(&_SERVER, SS("_SERVER") TSRMLS_CC); phalcon_is_iterable(_SERVER, &ah2, &hp2, 0, 0); while (zend_hash_get_current_data_ex(ah2, (void**) &hd, &hp2) == SUCCESS) { PHALCON_GET_HKEY(key_server, ah2, hp2); PHALCON_GET_HVALUE(value); PHALCON_SCONCAT_SVSVS(html, "<tr><td class=\"key\">", key_server, "</td><td>", value, "</td></tr>"); zend_hash_move_forward_ex(ah2, &hp2); } phalcon_concat_self_str(&html, SL("</table></div>") TSRMLS_CC); /** * Show included files */ PHALCON_INIT_VAR(files); phalcon_call_func(files, "get_included_files"); phalcon_concat_self_str(&html, SL("<div id=\"error-tabs-4\"><table cellspacing=\"0\" align=\"center\" class=\"superglobal-detail\">") TSRMLS_CC); phalcon_concat_self_str(&html, SL("<tr><th>#</th><th>Path</th></tr>") TSRMLS_CC); phalcon_is_iterable(files, &ah3, &hp3, 0, 0); while (zend_hash_get_current_data_ex(ah3, (void**) &hd, &hp3) == SUCCESS) { PHALCON_GET_HKEY(key_file, ah3, hp3); PHALCON_GET_HVALUE(value); PHALCON_SCONCAT_SVSVS(html, "<tr><td>", key_file, "</th><td>", value, "</td></tr>"); zend_hash_move_forward_ex(ah3, &hp3); } phalcon_concat_self_str(&html, SL("</table></div>") TSRMLS_CC); /** * Memory usage */ PHALCON_INIT_VAR(true_usage); ZVAL_BOOL(true_usage, 1); PHALCON_INIT_VAR(memory); phalcon_call_func_p1(memory, "memory_get_usage", true_usage); phalcon_concat_self_str(&html, SL("<div id=\"error-tabs-5\"><table cellspacing=\"0\" align=\"center\" class=\"superglobal-detail\">") TSRMLS_CC); PHALCON_SCONCAT_SVS(html, "<tr><th colspan=\"2\">Memory</th></tr><tr><td>Usage</td><td>", memory, "</td></tr>"); phalcon_concat_self_str(&html, SL("</table></div>") TSRMLS_CC); /** * Print extra variables passed to the component */ if (Z_TYPE_P(data_vars) == IS_ARRAY) { phalcon_concat_self_str(&html, SL("<div id=\"error-tabs-6\"><table cellspacing=\"0\" align=\"center\" class=\"superglobal-detail\">") TSRMLS_CC); phalcon_concat_self_str(&html, SL("<tr><th>Key</th><th>Value</th></tr>") TSRMLS_CC); phalcon_is_iterable(data_vars, &ah4, &hp4, 0, 0); while (zend_hash_get_current_data_ex(ah4, (void**) &hd, &hp4) == SUCCESS) { PHALCON_GET_HKEY(key_var, ah4, hp4); PHALCON_GET_HVALUE(data_var); PHALCON_OBS_NVAR(variable); phalcon_array_fetch_long(&variable, data_var, 0, PH_NOISY_CC); PHALCON_INIT_NVAR(dumped_argument); phalcon_call_method_p1(dumped_argument, this_ptr, "_getvardump", variable); PHALCON_SCONCAT_SVSVS(html, "<tr><td class=\"key\">", key_var, "</td><td>", dumped_argument, "</td></tr>"); zend_hash_move_forward_ex(ah4, &hp4); } phalcon_concat_self_str(&html, SL("</table></div>") TSRMLS_CC); } phalcon_concat_self_str(&html, SL("</div>") TSRMLS_CC); } /** * Get Javascript sources */ PHALCON_INIT_VAR(js_sources); phalcon_call_method(js_sources, this_ptr, "getjssources"); PHALCON_SCONCAT_VS(html, js_sources, "</div></body></html>"); /** * Print the HTML, @TODO, add an option to store the html */ zend_print_zval(html, 0); PHALCON_INIT_NVAR(is_active); ZVAL_BOOL(is_active, 0); /** * Unlock the exception renderer */ phalcon_update_static_property(SL("phalcon\\debug"), SL("_isActive"), is_active TSRMLS_CC); RETURN_MM_TRUE; }
/** * Executes the validation * * @param Phalcon\Validation $validator * @param string $attribute * @return boolean */ PHP_METHOD(Phalcon_Validation_Validator_StringLength, validate){ zval *validator, *attribute, *option = NULL, *is_set_min; zval *is_set_max, *value, *length = NULL, *invalid_maximum = NULL; zval *invalid_minimum = NULL, *maximum, *message_str = NULL; zval *type = NULL, *message = NULL, *minimum; PHALCON_MM_GROW(); phalcon_fetch_params(1, 2, 0, &validator, &attribute); /** * At least one of 'min' or 'max' must be set */ PHALCON_INIT_VAR(option); ZVAL_STRING(option, "min", 1); PHALCON_INIT_VAR(is_set_min); phalcon_call_method_p1(is_set_min, this_ptr, "issetoption", option); PHALCON_INIT_NVAR(option); ZVAL_STRING(option, "max", 1); PHALCON_INIT_VAR(is_set_max); phalcon_call_method_p1(is_set_max, this_ptr, "issetoption", option); if (!zend_is_true(is_set_min)) { if (!zend_is_true(is_set_max)) { PHALCON_THROW_EXCEPTION_STR(phalcon_mvc_model_exception_ce, "A minimum or maximum must be set"); return; } } PHALCON_INIT_VAR(value); phalcon_call_method_p1(value, validator, "getvalue", attribute); /** * Check if mbstring is available to calculate the correct length */ if (phalcon_function_exists_ex(SS("mb_strlen") TSRMLS_CC) == SUCCESS) { PHALCON_INIT_VAR(length); phalcon_call_func_p1(length, "mb_strlen", value); } else { PHALCON_INIT_NVAR(length); phalcon_fast_strlen(length, value); } PHALCON_INIT_VAR(invalid_maximum); ZVAL_BOOL(invalid_maximum, 0); PHALCON_INIT_VAR(invalid_minimum); ZVAL_BOOL(invalid_minimum, 0); /** * Maximum length */ if (zend_is_true(is_set_max)) { PHALCON_INIT_NVAR(option); ZVAL_STRING(option, "max", 1); PHALCON_INIT_VAR(maximum); phalcon_call_method_p1(maximum, this_ptr, "getoption", option); is_smaller_function(invalid_maximum, maximum, length TSRMLS_CC); if (PHALCON_IS_TRUE(invalid_maximum)) { /** * Check if the developer has defined a custom message */ PHALCON_INIT_NVAR(option); ZVAL_STRING(option, "messageMaximum", 1); PHALCON_INIT_VAR(message_str); phalcon_call_method_p1(message_str, this_ptr, "getoption", option); if (!zend_is_true(message_str)) { PHALCON_INIT_NVAR(message_str); PHALCON_CONCAT_SVSVS(message_str, "Value of field '", attribute, "' exceeds the maximum ", maximum, " characters"); } PHALCON_INIT_VAR(type); ZVAL_STRING(type, "TooLong", 1); PHALCON_INIT_VAR(message); object_init_ex(message, phalcon_validation_message_ce); phalcon_call_method_p3_noret(message, "__construct", message_str, attribute, type); phalcon_call_method_p1_noret(validator, "appendmessage", message); RETURN_MM_FALSE; } } /** * Minimum length */ if (zend_is_true(is_set_min)) { PHALCON_INIT_NVAR(option); ZVAL_STRING(option, "min", 1); PHALCON_INIT_VAR(minimum); phalcon_call_method_p1(minimum, this_ptr, "getoption", option); is_smaller_function(invalid_minimum, length, minimum TSRMLS_CC); if (PHALCON_IS_TRUE(invalid_minimum)) { /** * Check if the developer has defined a custom message */ PHALCON_INIT_NVAR(option); ZVAL_STRING(option, "messageMinimum", 1); PHALCON_INIT_NVAR(message_str); phalcon_call_method_p1(message_str, this_ptr, "getoption", option); if (!zend_is_true(message_str)) { PHALCON_INIT_NVAR(message_str); PHALCON_CONCAT_SVSVS(message_str, "Value of field '", attribute, "' is less than the minimum ", minimum, " characters"); } PHALCON_INIT_NVAR(type); ZVAL_STRING(type, "TooShort", 1); PHALCON_INIT_NVAR(message); object_init_ex(message, phalcon_validation_message_ce); phalcon_call_method_p3_noret(message, "__construct", message_str, attribute, type); phalcon_call_method_p1_noret(validator, "appendmessage", message); RETURN_MM_FALSE; } } RETURN_MM_TRUE; }
/** * Listens for notifications from the models manager * * @param string $type * @param Phalcon\Mvc\ModelInterface $model */ PHP_METHOD(Phalcon_Mvc_Model_Behavior_Timestampable, notify){ zval *type, *model, *take_action, *options, *timestamp = NULL; zval *format, *generator, *field, *single_field = NULL; HashTable *ah0; HashPosition hp0; zval **hd; PHALCON_MM_GROW(); phalcon_fetch_params(1, 2, 0, &type, &model); /** * Check if the developer decided to take action here */ PHALCON_INIT_VAR(take_action); phalcon_call_method_p1(take_action, this_ptr, "musttakeaction", type); if (PHALCON_IS_NOT_TRUE(take_action)) { RETURN_MM_NULL(); } PHALCON_INIT_VAR(options); phalcon_call_method_p1(options, this_ptr, "getoptions", type); if (Z_TYPE_P(options) == IS_ARRAY) { /** * The field name is required in this behavior */ if (!phalcon_array_isset_string(options, SS("field"))) { PHALCON_THROW_EXCEPTION_STR(phalcon_mvc_model_exception_ce, "The option 'field' is required"); return; } PHALCON_INIT_VAR(timestamp); if (phalcon_array_isset_string(options, SS("format"))) { /** * Format is a format for date() */ PHALCON_OBS_VAR(format); phalcon_array_fetch_string(&format, options, SL("format"), PH_NOISY_CC); phalcon_call_func_p1(timestamp, "date", format); } else { if (phalcon_array_isset_string(options, SS("generator"))) { /** * A generator is a closure that produce the correct timestamp value */ PHALCON_OBS_VAR(generator); phalcon_array_fetch_string(&generator, options, SL("generator"), PH_NOISY_CC); if (Z_TYPE_P(generator) == IS_OBJECT) { if (phalcon_is_instance_of(generator, SL("Closure") TSRMLS_CC)) { PHALCON_INIT_NVAR(timestamp); PHALCON_CALL_USER_FUNC(timestamp, generator); } } } } /** * Last resort call time() */ if (Z_TYPE_P(timestamp) == IS_NULL) { PHALCON_INIT_NVAR(timestamp); ZVAL_LONG(timestamp, (long) time(NULL)); } PHALCON_OBS_VAR(field); phalcon_array_fetch_string(&field, options, SL("field"), PH_NOISY_CC); /** * Assign the value to the field, use writeattribute if the property is protected */ if (unlikely(Z_TYPE_P(field) == IS_ARRAY)) { phalcon_is_iterable(field, &ah0, &hp0, 0, 0); while (zend_hash_get_current_data_ex(ah0, (void**) &hd, &hp0) == SUCCESS) { PHALCON_GET_HVALUE(single_field); phalcon_call_method_p2_noret(model, "writeattribute", single_field, timestamp); zend_hash_move_forward_ex(ah0, &hp0); } } else { phalcon_call_method_p2_noret(model, "writeattribute", field, timestamp); } } PHALCON_MM_RESTORE(); }