[ http://issues.apache.org/jira/browse/MODPYTHON-128?page=all ]

Graham Dumpleton updated MODPYTHON-128:

    Fix Version/s: 3.3

Another item which it would be nice to get resolved for mod_python 3.3.

My latest thinking on this is that we need an actual C based Python object 
which wraps an instance of a apr_finfo_t structure. This object would be what 
is returned when req.finfo is accessed. The Python object would need to 
preserve the existing means of accessing attributes by assuming object is a 
tuple and accessing values by using special index keys defined in 
mod_python.apache file. This means of access though would be seen as being 
obsolete and supported for backward compatibility only. Instead, going forward 
code should be converted to use attribute style access, thus we would have:

  OLD --> req.finfo[mod_python.apache.FINFO_FILETYPE] 
  NEW -->req.finfo.filetype

As much as makes sense of the apr_finfo_t object would be made accessible.

In respect of the original problem of how to update req.finfo when req.filename 
is changed, two new functions would be added to mod_python.apache. This would 

  mod_python.apache.stat(fname, wanted)
  mod_python.apache.lstat(fname, wanted)

The 'wanted' argument would be replaced with bitwise or of new global constants 
defined in mod_python equivalent to:

#define         APR_FINFO_LINK   0x00000001 /**< Stat the link not the file 
itself if it is a link */
#define         APR_FINFO_MTIME   0x00000010 /**< Modification Time */
#define         APR_FINFO_CTIME   0x00000020 /**< Creation or inode-changed 
time */
#define         APR_FINFO_ATIME   0x00000040 /**< Access Time */
#define         APR_FINFO_SIZE   0x00000100 /**< Size of the file */
#define         APR_FINFO_CSIZE   0x00000200 /**< Storage size consumed by the 
file */
#define         APR_FINFO_DEV   0x00001000 /**< Device */
#define         APR_FINFO_INODE   0x00002000 /**< Inode */
#define         APR_FINFO_NLINK   0x00004000 /**< Number of links */
#define         APR_FINFO_TYPE   0x00008000 /**< Type */
#define         APR_FINFO_USER   0x00010000 /**< User */
#define         APR_FINFO_GROUP   0x00020000 /**< Group */
#define         APR_FINFO_UPROT   0x00100000 /**< User protection bits */
#define         APR_FINFO_GPROT   0x00200000 /**< Group protection bits */
#define         APR_FINFO_WPROT   0x00400000 /**< World protection bits */
#define         APR_FINFO_ICASE   0x01000000 /**< if dev is case insensitive */
#define         APR_FINFO_NAME   0x02000000 /**< ->name in proper case */
#define         APR_FINFO_MIN   0x00008170 /**< type, mtime, ctime, atime, size 
#define         APR_FINFO_IDENT   0x00003000 /**< dev and inode */
#define         APR_FINFO_OWNER   0x00030000 /**< user and group */
#define         APR_FINFO_PROT   0x00700000 /**< all protections */
#define         APR_FINFO_NORM   0x0073b170 /**< an atomic unix apr_stat() */
#define         APR_FINFO_DIRENT   0x02000000 /**< an atomic unix 
apr_dir_read() */

The result of the stat() and lstat() functions would be an instance of the 
Python object wrapping the apr_finfo_t structure.

Finally, the req.finfo attribute would be made such that it could be assigned 
to by an instance of the Python object wrapping an apr_finfo_t structure. Thus:

  req.filename = newfile
  req.finfo = mod_python.apache.stat(newfile, mod_python.apache.APR_FINFO_MIN)

The affect of the assignment would be that the finfo attribute in the 
underlying request_rec structure would be updated from that held in the Python 
wrapper object for the apr_finfo_t structure instance returned by the stat() 

This should all be quite doable and the similarity to the Apache API is 

> Have assigning req.filename automatically update req.finfo.
> -----------------------------------------------------------
>                 Key: MODPYTHON-128
>                 URL: http://issues.apache.org/jira/browse/MODPYTHON-128
>             Project: mod_python
>          Issue Type: Improvement
>          Components: core
>    Affects Versions: 3.3
>            Reporter: Graham Dumpleton
>         Assigned To: Graham Dumpleton
>             Fix For: 3.3
>         Attachments: MP128_20060423_grahamd_1.diff
> Although it is possible to assign a new value to "req.filename", it is not 
> possible to update "req.finfo" based on the new filename.
> Suggest that if "req.filename" is assigned a new value, that apr_stat() be 
> automatically called to update "req.finfo". Ie., internally mod_python would 
> do something like:
>   apr_stat(&r->finfo, r->filename, APR_FINFO_MIN, r->pool);
> I believe that mod_perl supports a similar feature, but would need to confirm 
> this.
> Related to "req.filename", the "req.canonical_filename" should also be 
> writable as when changing "req.filename" the latter should also by rights be 
> updated as well.

This message is automatically generated by JIRA.
If you think it was sent incorrectly contact one of the administrators: 
For more information on JIRA, see: http://www.atlassian.com/software/jira


Reply via email to