Re: Patch: Add INTERNALDATE to imap_ap pend()
| From: | Nick Fortenberry | Date: | Wed, 21 Oct 2009 15:37:23 +0000 |
| Subject: | Re: Patch: Add INTERNALDATE to imap_ap pend() | ||
| References: | 1 2 | Groups: | php.internals |
| Request: | Send a blank email to internals+get-45856@lists.php.net to get a copy of this message | ||
Hey Jani,
We looked through the date library but it doesn't look like there are any functions to verify
that a date is in a certain format. Unless we are mistaken, it looks like the only way to verify
this would be to use a regex.
Also, we read through CODING_STANDARDS and it said to be generous with whitespace and brackets.
Were you referring to something in particular with regards to whitespace?
Thanks,
Nick
-----Original Message-----
From: "Jani Taskinen" <jani.taskinen@iki.fi>
Sent: Wednesday, October 21, 2009 2:55am
To: "Nick Fortenberry" <nick@mailtrust.com>
Cc: internals@lists.php.net
Subject: Re: [PHP-DEV] Patch: Add INTERNALDATE to imap_append()
On 10/21/2009 01:10 AM, Nick Fortenberry wrote:
> Hey everyone,
>
> Jake Levitt and I created this patch which adds the option to set a message's INTERNALDATE
> when appending it to a mail server using imap. Any chance we can get this included into the php 5.3
> and 6 development branches? The diff below was done against the php-src/branches/PHP_5_3 branch.
> If you guys need me to apply the changes to a different branch or snapshot, please let me know.
>
> Here's the svn diff (done in my repo).. if you need something else please let me know:
>
There are several problems with it. Whitespace and C++ comments being
the least. :) We have ext/date which is always there, I suggest you use
those functions to handle dates instead of flaky regexps.
--Jani
>
> Index: ext/imap/php_imap.c
> ===================================================================
> --- ext/imap/php_imap.c (revision 3405)
> +++ ext/imap/php_imap.c (revision 3406)
> @@ -41,6 +41,7 @@
> #include "ext/standard/info.h"
> #include "ext/standard/file.h"
> #include "ext/standard/php_smart_str.h"
> +#include "ext/pcre/php_pcre.h"
>
> #ifdef ERROR
> #undef ERROR
> @@ -118,6 +119,7 @@
> ZEND_ARG_INFO(0, folder)
> ZEND_ARG_INFO(0, message)
> ZEND_ARG_INFO(0, options)
> + ZEND_ARG_INFO(0, date)
> ZEND_END_ARG_INFO()
>
> ZEND_BEGIN_ARG_INFO_EX(arginfo_imap_num_msg, 0, 0, 1)
> @@ -1270,20 +1272,43 @@
> PHP_FUNCTION(imap_append)
> {
> zval *streamind;
> - char *folder, *message, *flags = NULL;
> - int folder_len, message_len, flags_len = 0;
> + char *folder, *message, *date = NULL, *flags = NULL;
> + int folder_len, message_len, date_len = 0, flags_len = 0;
> pils *imap_le_struct;
> STRING st;
>
> - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC,
> "rss|s",&streamind,&folder,&folder_len,&message,&message_len,&flags,&flags_len)
> == FAILURE) {
> + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC,
> "rss|ss",&streamind,&folder,&folder_len,&message,&message_len,&flags,&flags_len,&date,&date_len)
> == FAILURE) {
> return;
> }
>
> + char* regex = "/[
> 0-3][0-9]-((Jan)|(Feb)|(Mar)|(Apr)|(May)|(Jun)|(Jul)|(Aug)|(Sep)|(Oct)|(Nov)|(Dec))-[0-9]{4}
> [0-2][0-9]:[0-5][0-9]:[0-5][0-9] [+-][0-9]{4}/";
> + int regex_len = strlen(regex);
> + pcre_cache_entry *pce; //Compiled regex
> + zval *subpats = NULL; //Parts (not used)
> + long regex_flags = 0; //Flags (not used)
> + long start_offset = 0; //Start offset (not used)
> + int global = 0;
> +
> + if (date) {
> + //Make sure the given date string matches the RFC specified format
> + if ((pce = pcre_get_compiled_regex_cache(regex, regex_len TSRMLS_CC)) == NULL)
> {
> + RETURN_FALSE;
> + }
> +
> + php_pcre_match_impl(pce, date, date_len, return_value, subpats, global,
> + 0, regex_flags, start_offset TSRMLS_CC);
> +
> + if (!Z_LVAL_P(return_value)) {
> + php_error_docref(NULL TSRMLS_CC, E_WARNING, "internal date not
> correctly formatted");
> + date = NULL;
> + }
> + }
> +
> ZEND_FETCH_RESOURCE(imap_le_struct, pils *,&streamind, -1, "imap",
> le_imap);
>
> INIT (&st, mail_string, (void *) message, message_len);
>
> - if (mail_append_full(imap_le_struct->imap_stream, folder, (flags ? flags : NIL),
> NIL,&st)) {
> + if (mail_append_full(imap_le_struct->imap_stream, folder, (flags ? flags : NIL),
> (date ? date : NIL),&st)) {
> RETURN_TRUE;
> } else {
> RETURN_FALSE;
>
>
>
> Thanks,
>
> - Nick Fortenberry
>
>
>