* Change get_multi to also return missing items
get_multi is not used anywhere and this makes it easier to use.
* Use get_multi for report requests
* Add get_all to BaseCollection
This can be used for optimization on multifilesystem.
* Use iterator for files
* Remove unnecessary checks
This never happens and would be an error.
* Don't raise exception when calling get with colliding name
This behavior is wrong, it should be handled as if the file doesn't exist.
* Use get_all and get_multi to skip unnecessary checks
Collision checks are slow on big collections.
* Use exception instead of existence checks
It's a bit faster.
* Use os.scandir instead of os.listdir
It's faster and doesn't load all files at once.
* Cache metadata when storage is read-only
Metadata is queried a lot during a request. It's quiet slow to load and parse the file every time.
* Cache the etag when the storage is read-only
The etag is calculated twice for GET requests on collections.
* Add helper method for cleaning caches
* Use item etags to calculate collection etag
It's very slow and unnecessary to parse all files with VObject and serialize them again.
* Cache serialized collections in file system
Serialization is very slow for big collections. This caches the result in a file.
* Add helper function for prefilters
The simplify_prefilters functions converts XML filters to a simple tag and time range, which can be easily matched against the tag and time range that are extracted from vobject_items by the function find_tag_and_time_range.
* Add ability to cache etag and serialization of item
Parsing items with vobject is very slow and not required for many requests.
Caching can be used to speed it up.
* Cache metadata and serialization from items in file system
Store the serialized text and the tag and time range from vobject_items in the cache.
The metadata is used for prefilters.
* Remove the cache for the serialization of collections
* Serialize calendars without vobject
Merge the calendar components manually. This is much faster and requires less memory. Caching of the result is not required anymore.
* Allow pre_filtered_list to indicate that filters match
The storage backend can indicate that it evaluated the filters completely.
* Skip filtering with vobject if prefiltering is sufficient
``simplify_prefilters`` indicates if the simplified condition is identical to ``filters``.
This is used in the multifilesystem backend to detect if prefiltering is sufficient.
* Make constants global
* Use generator expressions
* Only extract elements from inside of VCALENDAR
This is unnecessary at the moment, the text representation should never contain anything but VCALENDAR.
* Improve comments
* restore backward compatiblity
* Small improvements for fastbackend
Previously it was silently ignored, which is dangerous when multiple instances of Radicale are running.
A configuration option to disable locking was added.
* Check the configuration file for errors (check option names and basic type checking).
* Perform basic type checking on command line arguments.
* Only print stack traces in debug mode.
* Include much more information in error messages (e.g. include the path of invalid files).
* Send Bad Request to clients for invalid XML requests or iCalendar data.
* Change the log level of some messages.
* Move parsing/serialization of XML requests/responses from ``xmlutils.py`` to ``__init__.py``.
* Log XML requests/responses in pretty-printed form.
* Previously only the responses were logged in readable form. This is useful for debugging.
* The XML documents are only converted for pretty-printing if debugging is enabled (it's expensive)
* Send XML responses in minimized form to clients.
* Add **encoding** attribute to XML declaration in XML response.
* Only decode XML requests once. (Previously they were decoded, encoded and decoded again.)
If a configuration file is passed with a command line argument and the file is not found, Radicale shows a warning and continues with the default configuration.
There is no reason for doing this, Radicale should just fail.
Instead, this PR allows passing an empty string like ``--config ""``. Radicale will use the default configuration in this case, without trying to load the configuration from the common paths. Previously you had to do specify a path that doesn't exist like ``--config /does/not/exist``, which looks a bit ugly and showed a warning message.
Radicale always tries to load the system-wide configuration file. To turn this off, the logging-config option has to be added to all configuration files and command line arguments. It's easier to disable it by default and only add it once to the system-wide config file.