Commit graph

56 commits

Author SHA1 Message Date
Yorhel
cbebc3a21e Validate: Rework API, ->validate() now throws error instead of result object
This is a slight simplification and removes the need to pass around
partially normalized data. I've never found a use for the unsafe_data()
method.
2025-03-05 15:35:23 +01:00
Yorhel
f09a103c53 Some test portability fixes again + minor changes 2025-03-02 10:10:35 +01:00
Yorhel
15954f4ad5 Pg: Add "$hex" pseudo-type 2025-02-28 13:49:07 +01:00
Yorhel
baf0f90bd5 Pg: Add "time" type, change default format of "date" type but support "$date_str"
Using a consistent numeric interpretation for timestamps, dates and
times simplifies a bunch of operations. It certainly simplifies
conversion between the Postgres formats.
2025-02-28 13:03:16 +01:00
Yorhel
0734bc4991 Pg: Skip query preparation when we can 2025-02-28 12:33:30 +01:00
Yorhel
4686097d00 Pg: Support custom type overrides with callbacks 2025-02-28 11:23:42 +01:00
Yorhel
327fd9ea50 Pg: Support type override configuration 2025-02-27 18:24:14 +01:00
Yorhel
de36b90cde Fixes for longdouble perl builds
Mostly test fixes, but the Pg 'timestamp' type did have a small
conversion bug.
2025-02-27 09:35:15 +01:00
Yorhel
7b0ba45346 Docs, compatibility fixes again, 0.1 release 2025-02-25 17:02:33 +01:00
Yorhel
69262992ca FU::Validate: Add module + integrate with FU
Copied from TUWF::Validate with a few small changes. I have a few more
features planned, but let's see how this goes first.

It's been an incredibly useful module in the past, I'm not sure right
now if I had ideas for potential improvements at some point, will need
to check notes.
2025-02-25 14:31:38 +01:00
Yorhel
c7a3415485 Util: Add to_bool() and use it for JSON, Pg & query encoding
To improve interop with legacy modules.
2025-02-25 09:33:33 +01:00
Yorhel
06e2f950fe Add fu->redirect, change $st->row behavior on 0 results, minor fixes
And with this, I have a working rewrite of the manned.org backend into
FU. \o/

The $st->row methods are very useful even for queries that may not
return anything, so their old behavior was unhelpful. Interestingly
enough, the error-on-multiple-rows did catch an actual bug in
Manned.org, so I'm keeping that behavior.
2025-02-24 15:55:27 +01:00
Yorhel
fbbaa23842 pg: Add date type & httpdate tests
...I was hoping not to have to implement the date type, because date
conversions suck, but it turns out manned.org actually needs it.
(Only to then convert it into a Unix timestamp again, hmm, maybe this
string conversion isn't useful at all?)
2025-02-24 11:54:37 +01:00
Yorhel
18e642290d Some fixes and framework docs 2025-02-23 14:05:43 +01:00
Yorhel
b2d676b1ed pg: Add query tracing & prepare/execute time measurements
What I'd really like, in addition to this, is a way to extract a query
from an $st object that can be run in the psql CLI. VNDB has a debugging
feature for that, but it's less trivial to make that work with binary
query parameters.
2025-02-22 15:15:16 +01:00
Yorhel
6f1583ddad pg: timestamp(tz) types + more docs 2025-02-21 12:58:24 +01:00
Yorhel
8036b8f0bf SQL: Doc and test adjustments 2025-02-21 10:22:33 +01:00
Yorhel
145d086bea Add FU::SQL
Somewhat experimental, need to test this approach on a real site.
Looking pretty promising so far, though.
2025-02-20 15:45:55 +01:00
Yorhel
9014e2900c Add FU::XMLWriter
And remove UTF-8 check in JSON writer. It honestly feels kind of silly
to do that validation there while I've never done similar validations in
any other output routines - including this XML writer.

FU::XMLWriter is a copy of TUWF::XMLXS with a bunch of improvements
applied: now uses refcounts to determine the current output instance,
auto-generates XS functions and has faster escaped string output -
inspired by the JSON writer.

TODO:
- Integrate into FU
- Do something with bool attribute values
- Benchmarks
- Should $content be optional for all tags? The reason they weren't in
  TUWF::XMLXS is because TUWF::XML supports opening tags without closing
  them, but that idea turned out to suck and isn't supported anymore.

This is hopefully the last XS module for the FU framework. The only C
code being written now should be bug fixes and extending FU::Pg with
some planned features. Already ended up with more C than I had
planned...
2025-02-19 12:01:24 +01:00
Yorhel
67e6d99f01 Add query string encoding & decoding functions 2025-02-18 14:08:23 +01:00
Yorhel
90cfd66069 FU: Some FastCGI fixes; FU::Util: utf8_decode & URI escaping 2025-02-18 10:27:58 +01:00
Yorhel
d9fba4e8d8 FU: Add FastCGI support + bunch of fixes
I initially planned to only implement the bare minimum to support
FastCGI under nginx, but ended up implementing the full protocol
instead. This is more code than I had expected and the code is also less
trivial than I had hoped. Will need to do more testing, pretty sure
there's bugs left.

Also TODO: test under alternative process managers + document
FU_LISTEN_PROTO.

I've also removed the max_request_body setting, this is something that
really ought to be configured in the web server instead.
2025-02-17 15:15:38 +01:00
Yorhel
3e84a4f4d3 FU: Implement --monitor, add some docs; FU::Util: add fdpass functions 2025-02-15 15:09:56 +01:00
Yorhel
d5401674f9 pg: Minor docs + tests 2025-02-13 08:50:40 +01:00
Yorhel
867543267f Fixes for perl 5.36 with multiplicity + memleak in $st->kv methods
I always keep messing up the aTHX_ and pTHX_ stuff because my system
perl isn't built with multiplicity, and I still haven't found a
satisfactory way of finding SV leaks. Valgrind can't track those :(
2025-02-13 06:26:58 +01:00
Yorhel
1f7e2de9a0 pg: Add prepared statement caching
The tests are not as thourough as I would like. There's many ways to
mess this up.

I was initially planning to drop the ref on the prepared statement
immediately after executing the query, so that the $st object can be
kept around for introspection without consuming excess resources.
Unfortunately, PQcopyResult does not copy over information about bind
parameters, so we need another way to keep that information alive. I
ended up going for the simple solution: keep the ref on the prepared
statement...
2025-02-12 17:19:20 +01:00
Yorhel
87d99e412b pg: Add support for record/composite types
This is simply magical. \o/

Vendored in khashl.h. I wouldn't have used it if this were the only
place where I'd need a custom hash table, but it should come in handy
for other tasks as well, especially when I get to implementing an LRU
for prepared statement caching.

(Can all be done with Perl HV's, but they're less efficient and more
cumbersome for these tasks)
2025-02-11 16:04:10 +01:00
Yorhel
33fe0d98a8 pg: Module rename + more docs 2025-02-11 11:04:03 +01:00
Yorhel
ccc2f1dbf0 pg: Some refactoring + more result fetching methods 2025-02-10 15:48:08 +01:00
Yorhel
d95ff76d43 pg: Add support for domain types
+ refactor things a bit so that send & recv functions use the same
context struct, because the way they're setup is pretty much the same
for both. This also adds recursive type resolution for bind parameters.
2025-02-10 14:27:39 +01:00
Yorhel
7515032261 pgtypes: Support uuid and xid8 2025-02-10 11:41:22 +01:00
Yorhel
7076714296 pgtypes: Support cidr and inet 2025-02-10 10:54:25 +01:00
Yorhel
7d71e446d0 pg: Support array types
That wasn't quite as painful as I had anticipated. \o/
2025-02-09 17:20:48 +01:00
Yorhel
7b76d94719 pg: Add dynamic type loading & support enum types
Least efficient way to support enums, really. *shrug*
2025-02-08 17:24:52 +01:00
Yorhel
2aaec6a218 pg: Add json, jsonb, jsonpath support
NOW we're really getting to the part where this module is more awesome
than DBD::Pg.

(When I started working on this module I was expecting that the Postgres
binary protocol would send jsonb in a binary format as well and that I'd
be duplicating parts of the JSON parser/formatter to make that work, but
it turns out that Postgres just uses plain json for exchange. Saves me
some trouble, I guess)
2025-02-08 15:16:47 +01:00
Yorhel
7f1c48e0cf pg: Add send/recv support for a few more easy types 2025-02-08 14:03:35 +01:00
Yorhel
30b457d2b8 pg: Support binary bind params 2025-02-08 10:35:43 +01:00
Yorhel
166744dd51 pg: Rework txn implementation + statement config API
I liked the Perl implementation of transactions, but managing state
between Perl and C is a bit cumbersome, so I've moved the whole thing
into C.

Also added a few statement configuration methods that currently don't do
anything yet.
2025-02-07 18:30:36 +01:00
Yorhel
8f94dd0921 pg: Initial support for receiving binary results
Just the initial framework stuff and a few types to test with.
2025-02-07 15:18:45 +01:00
Yorhel
171afc0268 pg: Add transaction & subtransaction support
Was expecting the implementation of this to get overly complicated and
brittle, but using a counter-based cookie and doing parts of it in Perl
made it pretty easy actually.  Pretty happy with how this turned out so
far.

TODO: documentation -.-
2025-02-06 19:12:52 +01:00
Yorhel
9d5905e3b4 pg: Add a few result fetching methods
I'm not sure if these are free from memory leaks, need to find a way to
test for that.
2025-02-06 13:38:07 +01:00
Yorhel
711300b227 pg: Statement execution + better error reporting 2025-02-06 09:05:05 +01:00
Yorhel
187417f160 pg: Statement preparing + inspection; less wonky object handling? 2025-02-05 11:49:22 +01:00
Yorhel
c51b5f3598 pg: Better error reporting + basic exec() method 2025-02-03 16:59:18 +01:00
Yorhel
b242176071 pg: Adventures in writing a new postgresql client 2025-02-02 16:22:15 +01:00
Yorhel
13eaeb1d4a jsonparse: Add max_depth, max_size and offset options
This completes all the functionality that I wanted from the JSON parser.
2025-02-01 11:01:49 +01:00
Yorhel
abfbba3c10 Add some tests and move some docs 2025-02-01 07:00:09 +01:00
Yorhel
ebe84167e7 jsonparse: A bunch of performance improvements
Turrns out JSON::XS had some pretty good ideas that I could borrow.
2025-01-31 18:42:21 +01:00
Yorhel
7cdc02e399 jsonparse: Add basic JSON parser
Some TODO's left and this needs benchmarking.
2025-01-31 07:29:06 +01:00
Yorhel
aebe5a93dc jsonfmt: Add pretty option
That completes the json_format() function for now. At least, it now does
everything I had planned for it.

Ended up at a bit over 300 LOC. That's larger than I had expected, but
still alright.
2025-01-30 09:11:34 +01:00