That has always been part of the design. See the "max. component #" table. On Jul 9, 2014 10:40 PM, "Elias Mårtenson" <[email protected]> wrote:
> Oh, and one more thing: > > There is unfortunately no standard for getting the id of autoincrement > columns. For maximum flexibility, I'd suggest the standard approach of > having a separate table holding the "next" ID. Such table is usually > designed as a two-column "next_id" table, where one column holds the object > type (or table name) and the other column holds the next id. > > Regards, > Elias > > > On 10 July 2014 13:38, Elias Mårtenson <[email protected]> wrote: > >> Thank you for looking into this. >> >> Since the SQL API is database-agnostic, it would make sense to make your >> library the same. Instead of trying to make sense of the file >> specification, why don't you just pass it along to the SQL API? In other >> words, just pass the database type (currently only "sqlite" or >> "postgresql", but who knows what other databases we might want to support >> in the future?) and the connect parameters to the SQL library without >> looking at them? >> >> Or, even easier, you might not want to call SQL∆Connect at all, and >> simply accept an already-opened database handle? >> >> As for the "files" concept, wouldn't it make more sense to allow multiple >> files in a single database. The files index would then be stored in a >> separate table, which would be linked to a column in the datastore. Listing >> the files would then be a simple SELECT from the file-list-table. >> >> Regards, >> Elias >> >> >> On 10 July 2014 13:30, David B. Lamkins <[email protected]> wrote: >> >>> Well, it seems simple enough, but I have zero experience with PostgreSQL >>> and it's going to take me a while to ramp up... >>> >>> Therefore: Please apply the attached experimental patch and see whether >>> you can get something working. >>> >>> Here's the gist of the change as implemented in this patch: >>> >>> CF_OPEN takes either a file name (no path separator; .cf extension) or a >>> PostgreSQL URI. In the former case, you get a SQLite database file with >>> the given name. In the latter case, lib_sql passes the URI through to >>> the PostgreSQL server. >>> >>> Once you have a database handle (and - in the case of the PostgreSQL >>> connection, I'd guess - a properly configured database) then everything >>> else should work exactly the same. (Or maybe not... While proofreading >>> this message, I realized that I depend upon SQLite's implict oid >>> support; this may not be the same on PostgreSQL. But that's a small >>> matter of either making a table definition that'll work in both cases, >>> or creating a separate case for each SQL variant.) >>> >>> Elias, INSERT INTO should be valid in both SQLite and PostgreSQL. At >>> least, that's what my quick search of the documentation suggests. >>> >>> Of course, the ISO component file APIs that are tied to *files* won't do >>> anything useful for a PostgreSQL connection. This includes CF_ERASE, >>> CF_RENAME and CF_CREATE; the first two for the obvious reasons and the >>> last because (for now, until I figure out or someone tells me otherwise) >>> I'm assuming that the PostgreSQL database passed to CF_OPEN will have >>> been created by a database administrator. If we can prove basic >>> operation, I'll take care of making the the file APIs do something >>> reasonable (probably just signal a domain error) when passed a >>> PostgreSQL URI. >>> >>> The alternate (non-URI) form of PostgreSQL connection string is not >>> presently recognized. It may be tricky to distinguish between a >>> poorly-formed file name and a properly-formed non-URI connection string. >>> >>> Guys: I'm willing to pursue this, but don't yet have the PostgreSQL >>> knowledge to enable me to proceed. If you want to provide patches, >>> that'd be great. If you're willing to talk me through setting up >>> PostgreSQL (It's installed; I just haven't figured out how to create >>> roles and databases yet...) that'd be even better. >>> >>> I'll mention in passing that this seems like a bit of an abuse of the >>> component *file* concept since there's no readily-accessible (to the >>> application programmer, anyhow) file in the case of the PostgreSQL >>> database. >>> >>> On the other hand, the ability to host a component file abstraction on a >>> database server seems like an interesting and possibly useful >>> "conforming extension". I imagine that this could be a relatively easy >>> way to implement multiuser access, as well. (I'm assuming that >>> PostgreSQL handles multiple clients and can do The Right Thing w.r.t. >>> locking.) >>> >>> Let's see where this goes. I'm looking forward to your feedback and >>> help... >>> >>> >>> On Thu, 2014-07-10 at 12:56 +0800, Elias Mårtenson wrote: >>> > Yes, that's how I work too. My home server contains a Postgres >>> > instance that I use for pretty much everything. It's quite convenient. >>> > >>> > >>> > Regards, >>> > Elias >>> > >>> > >>> > On 10 July 2014 12:53, Blake McBride <[email protected]> wrote: >>> > Greetings, >>> > >>> > >>> > PostgreSQL is very important to, at least, me. I do a lot of >>> > production work in PostgreSQL. I like SQLite too, but I would >>> > only use it when the data didn't relate to anything but APL. >>> > Here is what I propose. Since your component file system >>> > rides on top of SQL, and the standard doesn't know or care >>> > about anything below the APL level, we should add a function >>> > that allows the user to specify the database information >>> > (dbname, user, password, etc.). That call would be made as >>> > sort of a setup step. Once that setup step is specified, all >>> > of the standard API should work as described. >>> > >>> > >>> > This will give us a totally standard API. If someone wants to >>> > switch to GNU APL, all they have to do is add one function to >>> > specify the database. Not too much to ask. >>> > >>> > >>> > We kind of have to do this. Even with SQLite, you still have >>> > to specify the database name (I presume one database contains >>> > many component files). >>> > >>> > >>> > Thanks. >>> > >>> > >>> > Blake >>> > >>> > >>> > >>> > >>> > On Wed, Jul 9, 2014 at 9:44 PM, David B. Lamkins >>> > <[email protected]> wrote: >>> > I'm certainly willing to consider alternatives. IIUC, >>> > lib_sql also >>> > supports PostgreSQL. Anything else? >>> > >>> > How do I tell lib_sql to use a PostgreSQL server? >>> > >>> > The argument in favor of SQLite, of course, is that >>> > it's serverless. No >>> > additional setup (beyond the installation of the >>> > library) required. >>> > >>> > Would there be any additional benefits or concerns >>> > when connecting to a >>> > PostgreSQL server? >>> > >>> > As you've no doubt noticed, there's nothing in the >>> > code (or in the >>> > standard API) to acknowledge or support the notion of >>> > multiple users. >>> > Again: point in favor of SQLite... >>> > >>> > >>> > On Thu, 2014-07-10 at 10:25 +0800, Elias Mårtenson >>> > wrote: >>> > > I was looking at your code, and I noticed that it's >>> > SQLite-specific. >>> > > WOuldn't it make sense to make it >>> > SQL-implementation-agnostic? >>> > > >>> > > >>> > > Based on what I can see, the only SQLite-specific >>> > SQL you have in >>> > > there is "replace into" which I had never heard >>> > about before. >>> > > >>> > > >>> > > Regards, >>> > > Elias >>> > > >>> > > >>> > > On 9 July 2014 01:22, David Lamkins >>> > <[email protected]> wrote: >>> > > I haven't yet written test scripts, but I've >>> > informally tested >>> > > all of the functions and am reasonably >>> > confident that the >>> > > component file API is complete and correct. >>> > > >>> > > >>> > > If you'd like to try out the API while I'm >>> > working on scripted >>> > > test cases, the repo is: >>> > > >>> > > https://github.com/TieDyedDevil/iso-apl-cf >>> > > >>> > > >>> > > You'll find documentation is in the comments >>> > and in Annex A of >>> > > the ISO 13751 standard. >>> > > >>> > > >>> > > The standard "specifies a minimal set of >>> > functions which a >>> > > conforming implementation must provide"; >>> > I've implemented all >>> > > of these. I've also added several useful >>> > functions not >>> > > mentioned in the standard, including >>> > component inquiry, >>> > > component drop, and transaction support. >>> > > >>> > > >>> > > >>> > > Note that the code is not packaged for my >>> > package manager; I >>> > > assume that the component file >>> > implementation would become an >>> > > L3 library in the event it's adopted for >>> > inclusion in GNU APL. >>> > > >>> > > >>> > > Júergen, I've specified the GPLv3 license >>> > since that's what >>> > > GNU APL uses. If there's a more appropriate >>> > choice of license >>> > > for this library, please let me know. >>> > > >>> > > -- >>> > > "The secret to creativity is knowing how to >>> > hide your >>> > > sources." >>> > > Albert Einstein >>> > > >>> > > >>> > > http://soundcloud.com/davidlamkins >>> > > http://reverbnation.com/lamkins >>> > > http://reverbnation.com/lcw >>> > > http://lamkins-guitar.com/ >>> > > http://lamkins.net/ >>> > > http://successful-lisp.com/ >>> > > >>> > > >>> > >>> > >>> > >>> > >>> > >>> > >>> > >>> > >>> >>> >> >
