Mailing List Archive: 49091 messages
  • Home
  • Script library
  • AltME Archive
  • Mailing list
  • Articles Index
  • Site search

[REBOL] [DEV] dbms3.r 01

From: g::santilli::tiscalinet::it at: 13-Jan-2002 15:36

PROJECT NAME: dbms3.r (temporary) PURPOSE: writing a small and simple relational database management system in REBOL, for use with applications that don't need a full blown separate DBMS such as MySQL. With respect to dbms.r, it will be more efficient in the data storage to be usable with much more rows per table, and possibly will have a more powerful/abstracted interface. DEVELOPMENT, part 1 let's start with the low level functions to handle tables on disk. table on memory could be useful too, but should be easier to implement. we can then adapt dbms.r to use the new format, to have an usable system in less time. we'll need a better way to store rows, maybe in blocks or all in one file. the problem with using one single file for the data is that currently rebol does not allow for easy seeking on direct ports. subdividing the table in blocks of 100 or 1000 rows and having a file per block might be more efficient - maybe someone wants to run some benchmarks. if we use one file, we need a file to index the rows in the file since i expect to have dynamic sized rows as in dbms.r. the index can be kept in memory too, since it will be a block of integers, so about 16 bytes per row. we're not targetting 1'000'000 rows per table so that does not seem a problem. i think we can proceed this way: let's create all three kinds of tables, then we can let the user choose. let's start with tables on memory, that can be simply represented with blocks. our interface should include ways to: append a new row, pick a row, change a row, remove a row. -- ; brett, i like your idea. :) memory-table-funcs: context memory-table-funcs-code -- ; i like joel's style, but i'll stick with the standard here memory-table-funcs: context [ ; memory-table-funcs-code row-append: func row-append-spec row-append-code row-pick: func row-pick-spec row-pick-code row-change: func row-change-spec row-change-code row-remove: func row-remove-spec row-remove-code ] -- memory-table-funcs: context [ ; memory-table-funcs-code row-append: func [ "Append a row to an on-memory table" table [object!] row [object!] ; returns the row-id of the new row ] row-append-code row-pick: func [ "Pick a row from an on-memory table" table [object!] row-id [integer!] ; returns the row or none! for an invalid row-id ] row-pick-code row-change: func [ "Change a row in an on-memory table" table [object!] row-id [integer!] changes [block! object!] ; returns the row-id of the changed row, or none! for ; an invalid row-id ] row-change-code row-remove: func [ "Remove a row from an on-memory table" table [object!] row-id [integer!] ; returns true, or false if the row-id is invalid ] row-remove-code ] -- some comments: the row-id will be the index of the row in the block, so it's an integer. this might be different for other kind of tables. also, the row-id of a row is not guaranteed to remain constant for a row, like in dbms.r. the changes argument of the row-change function can be a block or an object; a block is useful for things such as [column: column + 1] where you want to change the value of a column based on its previous value. [TO BE CONTINUED] (I'll stop here for today, as I want too see the reaction of the list before going too much further.)