Packages: fss_duckdb, fss_postgres, fss_sqlite, fss. All packages now share one version number. fss_mysql is retired and not published.
- BUG: fss_duckdb
InsertOne/InsertManynever worked: the column metadata query returned nothing, generated SQL used:p1parameters that DuckDB rejects, and opening a database file containing a primary key threwInvalidCastException. Metadata now comes fromduckdb_columns()andduckdb_constraints(). - BUG: fss_duckdb gave each pooled connection to
:memory:its own private database. Pooled connections now share one. - BUG: fss_sqlite threw on every connection after the move to Microsoft.Data.Sqlite (
GetSchema("Columns")is not supported there). Metadata now comes frompragma_table_info. - BUG:
Querytook a pooled connection before the sequence was enumerated, leaking it if the sequence was never read and breaking re-enumeration. - BUG: an exception partway through
InsertManyleft its transaction open and the connection checked out of the pool. It now rolls back and releases the connection. - BUG:
Pool.Releaseof an item that was already free looped forever while holding the pool lock (Release builds). It now throwsInvalidOperationException. The pool also no longer loses wakeups under contention. - BUG: the stored-procedure operator
conn?procreturned a command that had already been disposed. - BUG: the keep-alive thread was a foreground thread, so a forgotten
Disposestopped the process from exiting. It never runs for DuckDB or SQLite. - BUG: templates evaluated
a and b and casa and c. - BUG: web server: a
Response.Cookiewas sent as aCookieheader instead ofSet-Cookie; error responses never terminated their headers, so keep-alive clients hung;halt()threw on .NET 5+ (Thread.Abort); and the accept loop grew the stack by one frame per connection. - BUG:
Cookie.formatCookieDateprinted the month in the minutes field. - BUG: multipart parsing failed when the closing boundary had no trailing CRLF.
- BUG: fss_mysql
Querybuilt a record after every field instead of once per row.
- SEC:
Sec.genRandKeyusedSystem.Random(predictable, not thread-safe). It now usesRandomNumberGenerator. - SEC: the web server rejects CR/LF in response headers (response splitting), and the default error page HTML-encodes exception text.
- SEC: documented that
Cookie.checkCookieis not safe for authentication and that templates don't escape output.
- FEA: parameterised queries:
Query,ExecuteScalarand the newExecuteNonQuerytake[ "name", box value ]. - FEA:
Query<'T>maps to tuples (by position) and single values (Query<int64> "select count(*) ...", alsodecimal,DateTime,Guid, options, ...), not only records (fixes #1). Option fields missing from the result becomeNone. - FEA: values are converted between compatible types (e.g. int64 → int, 0/1 → bool, HUGEINT → int64, DATE ↔ DateOnly, text → Guid / F# enum, BLOB stream → byte[]), with clear errors naming the column.
- FEA: inserts accept schema-qualified table names (
table = "sales.orders"), and a table created after the connection opened is found without callingReload(). - FEA: fss_postgres
registerDataSourceconfigures Npgsql type mappings (enums, plugins), replacing theMapEnumGloballythat Npgsql removed.
Query's optional arguments are now(sql, ?parameters, ?transProvided). Code passingtransProvidedby name is unaffected.ISqlConnection.Query/ExecuteScalargained an optionalparametersargument, andISqlConnectiongainedExecuteNonQuery. Only custom implementations ofISqlConnectionneed changes.Customization(the dialect interface) gainedopenConnectionandparameterPrefix.- Reading NULL into a non-option value-type field now throws a descriptive error instead of an
ArgumentException.
- MNT: .NET 10 only, NuGet Central Package Management; Paket and FAKE removed;
fss.slnxsolution. - MNT: updated dependencies: DuckDB.NET 1.5.6.1, Npgsql 10, Microsoft.Data.Sqlite 10, NUnit 5. Removed the unused Newtonsoft.Json dependency.
- MNT: SourceLink, deterministic builds, symbol packages, package readmes, and the license as an SPDX expression.
- MNT: GitHub Actions CI (Linux with Postgres, Windows, macOS) and NuGet Trusted Publishing for releases.
- TST: DuckDB test suite; Postgres/MySQL tests skip unless
FSS_TEST_POSTGRES/FSS_TEST_MYSQLare set. - DOC: new documentation in
docs/, samples insamples/,MAINTAINERS.md.
- MNT: ported to net8
- FEA: duckdb support
- MNT: ported to netcore and fake5
- ENH: improvements to error handler
- FEA: optional error handler for server
- FEA: added secure UD implementation
- BUG: post requests did not handle ? style arguments gracefully
- BUG: rare race condition between dispose and keep alive could throw exception
- MNT: updated project files to build under VS2017 on command line cleanly
- MNT: updated to FSharp.Core 4.4.1.0
- BUG: postgres db reopening could throw error and die previously
- LNT: cleaned up fslint recommendations for template.fs
- FEA: moved exposed calculation routines in template to make them useful for external applications
- MNT: update to 3.1.9.0 Npgsl
- ORM: fss_postgres reconnect stability improvements
- ORM: mapping metadata to lowercase as sqlite does not match postgres behavior
- ORM: specified explicit schema now for insertMany
- ORM: support for sqlite solid
- ORM: support for postgres enums solid
- ORM: support for postgres schemas / search_path
- ORM: support for sqlite added
- ORM: small cleanup issue in keepalive thread fixed
- ORM: caching schema information at first load for postgres
- ORM: better NULL/ Nullable support
- ORM: int16,decimal support
- templates: expression legal in for loop iter RHS value
- templates: elseif implementation
- ORM: fss-mysql implementation
- ORM: decimal null support
- templates: BUG: includes with internal variables mixed with extends werenot expanded properly
- server: BUG empty multipart form parts where triggering assertions incorrectly
- server: BUG: rewrote multipart header parser to be tail recursive
- Freql: methods added directly to transaction object to make it behave more like a connection
- Freql: premature release of transaction connection fixed
- Server: reexposed Fss.Server.version string
- templates: if x.y case fixed and tested
- Freql: bug in Query led to delayed connection pool release for incomplete seq consumption
- templates: ENH - range expressions for for loops implemented
- templates: ENH - expressions allowed within double parenthesis substitution blocks
- templates: ENH - array indices implemented for expressions
- templates: ENH - <= and >= implemented
- templates: overhaul of operator precedence to implement boolean expressions correctly
- Freql: handling nullable date fields implemented.
- templates: bug in double quoted string parsing fixed string hello not recognized :(
- templates: != operator implemented for '{% if %}'
- test: additional unit tests for string , != operations
- templates: == instead of = for equals comparison (for consistency with standard jinja2 docs)
- templates: single variable to if '{% if foo %}' will test whether variable is set or has a non false value ('""' and [||] considered false)
- fss: added support for 302, 303, 304, and 307 response codes and http303 redirect helper
- fss: added overridable preCheckFailed to UD and ability to modify url path within precheck
- Freql: Support for null fields in tables, mapped onto option fields in records
- templates: changed extends -> include in jinja2 clone to correctly reflect jinja semantics
- templates: implemented jinja2 blocks
- templates: implemented jinja2 extend
- templates: fixed empty for/if blocks
- Added unit tests for pg_db.fs
- Added unit tests for template extends and blocks cases
- Bug fix for premature dbconnection returning to pool
- Added logging for queries (optionally conditional on runtime)
- Added logging for connection pool usage
- Killed bug due to premature release of db connection
- Added support for ignoredColumns argument to InsertMany for db supplied column values
- Added external transaction support to FreQL InsertMany
- Added error message for table not found on FreqInsert
- Added typed URL dispatch functions to catch errors at edit time
- Instead of box myFunc , use D0 myFunc (or D1 myFunc if it takes 1 param etc, D2.. D7 are defined)
- Added FreQL - F# Record / SQL support under Fss.Data.Postgres
- Fixed bug with returning unicode text strings that was causing a discrepancy in content length and actual # of bytes.
- Added /index.html page to ease access to example cases.
- Added mutex around thread tracking to prevent concurrent thread addition during iteration for shutdown
- Cleaned up some critical network/streamwriter buffer flushing bugs that could under some circumstances create issues
- Added Stop() method to shut down server
- Recursive application of variable expansion for included header files
- Fixes to form argument parsing
- Added simple pooling system to help apps manage connection pools etc
- replaces error message with "none" for null values in template fields
- fix for post streams lingering on auth failure
- int64 ICONST64 template implementation
- '{% else %}' implemented
- not operator implemented
- template extensions working - see /template1 example in FssExample
- Bug fix for dot notation references in local variables
- Better logging for error reporting
- Fixes for single '{ and }' characters in templates
- Major clean up of template library, bug fixes and addition of many tests
- Added GET member and parsing of ? arguments after GET calls.
- Hook added to allow security/session implementations on top of Fss.UD
- Prototype JSON library included, allows deserialization,
- objects not implemented yet
- AddDispatcher method added to UD to allow later addition to the dispatch URLS
- Template system moved into Template module from Playground, basically working
- removed non tail recursive code in main dispatch loop
- extended experimental templating system to parse and handle for loops. Not complete yet.
- added support for user addition of custom headers and a JPEGResponse type. Added example imgDownload() method
- added ReadPostAsBytes() ReadPostAsString() methods to assist pulling back post data.
- added assertion example
- basic web server framework released