PostgreSQL 2 Rebol and back again...
[1/20] from: emptyhead::home::nl at: 7-Dec-2000 11:21
PostgreSQL also has an tcp/ip interface, an it is free and has more options than
mysql and is distrubuted with redhat. I saw some database tests where PostgreSQL
outperforms most databases.
I managed to login into the database using rebol connecting to the tcp/ip port.
The only problem is that when sending an query the protocol doesn't seem to
match the implementation. The documentation of the protocol is on their website:
http://www.postgresql.org/
Could someone find out what goes wrong. I can not find the problem.
Daan Oosterveld
CRS - Psy Sel/SPO, COUSSEMENT Christophe, CPN
schreef:
> Jeff:
> Just ask Bo at RT for a trial version: [bo--rebol--com]
<<quoted lines omitted: 4>>
> good luck
> Christophe
-- Attached file included as plaintext by Listar --
-- File: postgres.r
REBOL [
Title: "PostgreSQL frontend client"
Author: "Daan Oosterveld"
Date: now
Version: 0.0.1
Notes: {
This client can be used on the localhost...
It does not supply any password authorisation
of any kind at this moment...
Standart host is localhost:5432 other connections
can be set by using /host
}
Usage: {
Quick information: >> postgres/help
database: postgres/startup
user (string!)
database (string!)
[/host
tcp://host.domain:port (url)
]
result: postgres/query database {query}
postgres/terminate database
}
]
postgres: make object! [
; all postgres user functions:
startup: func [
{Make a connection to a postgreSQL database}
user [string!] {User indentification}
database [string!] {Database to connect}
/host {Use a custom host}
address [url!] {postgreSQL TCP/IP server to connect}
/throw {Throw "postgres" instead of creating errors}
name {name to throw, none is no name...}
/debug {Print logs direct on screen}
/local
database
][
either debug [
database: make-database/debug database user
][
database: make-database database user
]
database/throw: throw
open-database-connection database tcp://localhost:5432
send-packet/StartupPacket database database/name database/user "" ""
; Handles startup cycle
recieve-packet/startup-cycle database
; If no errors where triggered we should be logged in
; and be able to run a query!
database
]
query: func [
{Queries a connected database}
database [object!] {database to query (returned by startup)}
query [string!] {SQL query}
/throw {Throws "postgres" instead of creating errors}
name {A named throw, none to disable}
][
database/throw: throw
send-packet/Query database query
return recieve-packet/Query-cycle database
]
terminate: func [
{Terminates a database connection}
database [object!] {Database to terminate}
][
send-packet/terminate database
close database/host
add-log database 'connection
{Frontend: Closed connection}
]
log: func [
{Returns notice and error log, great for debuging}
database [object!] {Database to get log from}
][
foreach [type entry] database/log [
print entry
]
]
;------------------------------------------------
; Do not use any functions below this comment...
;------------------------------------------------
; Notivy me (by email) when...
; - You found a bug
; - You have a suggestion
; - You changed the code to suit your implementation
; (you shouldn't do this, but if you do: add an author,
; and also change the version and date.)
; - You bugfixed untested parts
add-log: func [database type log-entry][
append database/log reduce [type log-entry]
if database/trace [print log-entry]
]
issue-error-log: func [database error][
add-log database 'error error
either database/throw [
throw/name error "postgres"
][
make error! error
]
]
; function to make a database object...
make-database: func [
the-name [string!]
the-user [string!]
/debug
][
make object! [
host: none ; port to use
log: make block! 10 ; connection log
name: the-name ; database name
user: the-user ; user login name
pid: none
key: none
trace: debug
throw: false
]
]
open-database-connection: func [database host][
database/host: open/binary host
add-log database 'connection "Frontend: Opened connection"
]
; functions to recieve packets...
recieve-packet: make object! [
; packetlist: Startup Query Status
; AsciiRow x T
; AuthenticationOk x C
; AuthenticationKerberosV4 x X
; AuthenticationKerberosV5 x X
; AuthenticationUnencryptedPassword x T
; AuthenticationEncryptedPassword x X
; BackendKeyData x C
; BinaryRow x T
; CompletedResponse x T
; CopyDataRows x T
; CopyInResponse x T
; CopyOutResponse x T
; CursorResponse x T
; EmptyQueryResponse x T
; ErrorResponse x x U
; FunctionResultResponse N
; FunctionVoidResponse N
; NoticeResponse x x U
; NotificationResponse x T
; ReadyForQuery x x C
; RowDiscription x T
;
; Status:
; (T)odo, should be implemented in the near future
; (C)ompleted,
; (U)ntested, might be bugs in it, never used before
; (B)uggy,
; (N)ot implemented
; (X) terminates connection after unsupported packet...
; Note: The function cycle is not implemented in this release
; function to recieve data after sending a query
query-cycle: func [database /local result][
result: make block! 10
until [
;print "LOOP!"
switch/default recieve-value/byte database 1 [
"G" [ CopyInResponse database false ]
"H" [ insert/only tail result CopyOutResponse database false ]
"P" [ CursorResponse database ]
"N" [ NoticeResponse database ]
"I" [ EmptyQueryResponse database ]
; Completed SQL statement:
"C" [ CompleteResponse database false ]
; Exit packets
"E" [ ErrorResponse database ]
"Z" [ ReadyForQuery database ]
][
add-log database 'unknown
{Frontend: Warning: recieved unknown packet}
false
]
]
result
]
; function to recieve packets from the startup cycle
startup-cycle: func [database][
; First we have to wait for a AuthorisationOk or other less pleasant
; response...
until [
switch/default recieve-value/byte database 1 [
"N" [ NoticeResponse database ]
"E" [ ErrorResponse ]
"R" [
switch/default to-integer recieve-value/int/b32 database [
0 [
add-log database 'startup
{Backend: AuthenticationOK}
return true
]
1 [ KerberosV4 database ]
2 [ KerberosV5 database ]
3 [ UnencryptedPassword database ]
4 [ EncryptedPassword database ]
][
add-log database 'unknown
{Frontend: Warning: Recieved unknown packet}
false
]
]
][
add-log database 'unknown
{Frontend: Warning: Recieved unknown packet}
false
]
]
; The until is not needed, because no authentication
; loops more times, just implemented it already for future
; implementation
; AuthenticationOk recieved!, entering the backend startup loop
until [
switch/default recieve-value/byte database 1 [
"K" [ BackendKeyData database ]
"Z" [ ReadyForQuery database ]
"N" [ NoticeResponse database ]
"E" [
; ErrorResponse
issue-error-log database rejoin [
"Backend: Error: " recieve-value/string database
]
]
][
issue-error-log database
{Frontend: Error: Recieved unsupported packet}
]
]
; The database is now ready for SQL queries...
return database
]
; The packet-handlers follow:
; ErrorResponse
ErrorResponse: func [database][
issue-error-log database
recieve-value/string database
]
; Unsupported password authentications
KerberosV4:
KerberosV5:
UnencryptedPassword:
EncryptedPassword: func [database][
send-packet/Terminate database
issue-error-log database
{Frontend: Error: Unsupported authentication protocol}
]
; Notice packet... just a message for the log
NoticeResponse: func [database][
add-log database 'notice rejoin [
"Backend: Notice: "
recieve-value/string database
]
false
]
; Copy from frontend to backend... Not supported...
CopyInResponse: func [database][
issue-error-log database
{Frontend: Error: CopyInResponse not supported.}
]
CopyOutResponse: func [database][
add-log database 'query
{Backend: CopyOutResponse, sending datarows...}
CopyDataRows database
]
; Copies a stream of datarows...
CopyDataRows: func [database /local result temp][
add-log database 'query
{Backend: Sending datarows}
result: make string! 100
append result recieve-value/byte database 4
until [
append result recieve/byte database 1
(found? find/match skip tail result -4 "^/\.^/")
]
result
]
; SQL result is commin' in...
CursorResponse: func [database][
add-log database 'query rejoin [
{Backend: Cursor: [ }
mold recieve-value/string database
{ ]}
]
false
]
; Completed SQL statement:
CompleteResponse: func [database][
add-log database 'query rejoin [
{Backend: Completed query: [ }
mold recieve-value/string database
{ ] }
]
false
]
; EmptyQueryResponse...(who would send one?)
EmptyQueryResponse: func [database][
recieve-value/string database
add-log database 'query
{Backend: Empty query!}
false
]
; Indicates that a new query starts or the startup stops
ReadyForQuery: func [database][
add-log database 'ready {Backend: Ready for query}
; this packet has no more data then the header...
true ; stop looping
]
; Magic key data to cancel a request...
BackendKeyData: func [database][
; The backend has suceeded to startup...
database/pid: recieve-value/int/b32 database
database/key: recieve-value/int/b32 database
add-log database 'startup rejoin [
{Backend: Backend key data: [ pid: } database/pid
{ key: } database/key { ] }
]
false ; still have to wait for ReadyForQuery...
]
; recives values from the database
recieve-value: make object! [
; Get a byte value...
byte: func [database length][
to-string copy/part database/host length
]
string: func [database /local string temp][
string: make string! 32
while[ (temp: copy/part database/host 1) <> #{00} ][
append string temp
]
probe string
]
lim-string: func [database length][
trim/with to-string copy/part database/host length "^@"
]
int: make object! [
b16: func [database][ copy/part database/host 2 ]
b32: func [database][ copy/part database/host 4 ]
]
]
]
; functions to send frontend packets..
send-packet: make object! [
; Packet list: Startup Query Status
; CancelRequest x N
; CopyDataRows x T
; EncryptedPasswordPacket x N
; FunctionCall x N
; Query x T
; StartupPacket x C
; Terminate x C
; UnencryptedPasswordPacket x T
;
; Status:
; (T)odo, should be implemented in the near future
; (C)ompleted,
; (U)ntested, might be bugs in it, never used before
; (B)uggy,
; (N)ot implemented
; (X) terminates connection after unsupported packet...
; Note: The function cycle is not implemented in this release
; The query packet...
; The queries should end with an ; !
Query: func [ database q ][
;send-value/byte database "Q"
send-value/string database q
add-log database 'query "Frontend: Query: Sended SQL query"
]
; The startup packet is one of the most important
; packets, it initialises a database connection and
; it is the first packet to be sended over a new connection
StartupPacket: func [
database
database-name
user-name
backend-commandline
tty-debug-messages
][
; length of packet (296)
send-value/int/b32 database #{000000C4}
; version 2.0 int16(2).int16(0)
send-value/int/b32 database #{00020000}
; Send database name
send-value/lim-string database database-name 64
; Send user name
send-value/lim-string database user-name 32
; Send backend command arguments
send-value/lim-string database backend-commandline 64
; Unused
send-value/lim-string database "" 64
; tty backend debug messages
send-value/lim-string database tty-debug-messages 64
add-log database 'packet rejoin [
{Frontend: Startup packet: [}
{ protocol: 2.0}
{ database: } mold database-name
{ user: } mold user-name { ] }
]
]
; Terminate connection with backend after ReayForQuery
Terminate: func [database][
add-log database 'terminate "Frontend: Terminate"
send-value/byte database "X"
]
; Used to send elements of a message
; These functions should only be used by packet senders...
send-value: make object! [
; Value list:
; Intn(i) n integer i (32/64)
; String(v) send a normal C-string (NullTerminated)
; LimStringn(v) string limited to a size n (NullTerm)
; Byten(v) send n bytes (characters)
;
int: func [database /b16 /b32 value ][
either b16 [
insert/part database/host value 2
][
; standart is int32(v)
insert/part database/host value 4
]
]
string: func [ database value ][
;print query database/host
insert probe database/host probe join to-binary value #{00}
;insert database/host #{00}
]
lim-string: func [ database value bytes ][
insert database/host
to-binary value
insert/dup database/host #{00} (bytes - length? value)
]
byte: func [ database value ][
insert database/host to-binary value
]
]
]
]
trace/net on
db: postgres/startup/debug "daan" "compactdiskshop"
postgres/query db "QCREATE TABLE compactdisks (NAME CHARACTER(40));^/"
postgres/terminate db
postgres/log db
[2/20] from: nhytro:compuserve at: 7-Dec-2000 6:05
Hi Daan!
I agree that Postgres is better, I would actually like to use Postgres, But
I can´t compile on Windows ( I can´t speak C++). Were you able to compile
MDBMS on Widows?.
Regards
Sharriff
Nachricht geschrieben von INTERNET:[rebol-list--rebol--com]
>PostgreSQL also has an tcp/ip interface, an it is free and has more
options than
mysql and is distrubuted with redhat. I saw some database tests where
PostgreSQL
outperforms most databases.
I managed to login into the database using rebol connecting to the tcp/ip
port.
The only problem is that when sending an query the protocol doesn't seem to
match the implementation. The documentation of the protocol is on their
website:
http://www.postgresql.org/
Could someone find out what goes wrong. I can not find the problem.<
Hi Daan
[3/20] from: cribbsj:oakwood at: 7-Dec-2000 8:23
Hi, Sharriff!
Not to break in on your question to Daan, but is someone attempting to get
MDBMS to run on Windows? That would be cool! About a month ago, I spent a
whole day using Google to try to find a DBMS that would let me connect to it
via a port from Rebol. MDBMS was the only one I found. Unfortunately, when
I emailed the author of MDBMS, it sounded like he was no longer actively
developing the product. Also, it didn't run on Windows, just Linux.
By the way, if someone could kindly point me towards a more specific link to
find that Postres port connection documentation, I would appreciate it. Last
time I checked the site I couldn't find anything in the docs talking about
that.
Jamey.
On Thursday 07 December 2000 06:05, you wrote:
[4/20] from: nhytro:compuserve at: 7-Dec-2000 10:07
Hi Jamie!
I rang Hinttech in Holland up too, and the authour had absolutely no
intention of porting it to windows, but he gave me the hint that it was
written in GNU C and straight C, so it should´nt be hard to comple on a
windows machine, I got a C tutorial and freeware compiler now ( thanks to
Mark) and I hope I´ll be good enough soon to be able to compile it on
windows.
Regards
Sharriff
[5/20] from: cribbsj:oakwood at: 7-Dec-2000 10:23
Go for it, Sharriff! That would be great!
Did the author (I think his first name was Marty) sound like he had any
intention of continuing development of MDBMS? I haven't played with it much,
but it seems like such a cool little product and it's so easy to install that
it seems a shame to see it stay dormant.
Jamey.
On Thursday 07 December 2000 10:07, you wrote:
[6/20] from: jeff:rebol at: 7-Dec-2000 7:59
I've also made a script for COMMAND talks directly to
Postgres through the postgres-client shared library
functions, if anyone's interested. The script's pretty clean
and comprehensive.
-jeff
[7/20] from: jregent:centrum:cz at: 7-Dec-2000 17:41
Jeff,
send this script to forum.
Thanks.
Jan Regent
______________________________________________________________
> Od: [jeff--rebol--net]
> Komu: [rebol-list--rebol--com]
<<quoted lines omitted: 10>>
> [rebol-request--rebol--com] with "unsubscribe" in the
> subject, without the quotes.
K chatování je tu http://www.XChat.cz
Založte si svųj mail na http://mail.centrum.cz
[8/20] from: jeff:rebol at: 7-Dec-2000 8:58
;- Postgres has a much cleaner client API to work with
; for REBOL/Command than MySQL.
REBOL [
Title: "Postgres Database REBOL/command API"
Purpose: {
Exposes the Postgres API in REBOL/command
}
Needs: [command]
File: %postgres.r
]
pq: load/library %libpq.so
routines: [
PQsetdbLogin [
"Login to postgres Database"
pghost [int] pgport [int]
pgoptions [int] pgtty [int]
dbName [int] login [string!]
pwd [string!] return: [long]
]
PQdb ["Name of database"
PGconn [int] return: [string!]]
PQhost ["Name of host"
PGconn [int] return: [string!]]
PQoptions ["Options of connection"
PGconn [int] return: [string!]]
PQport ["Port number"
PGconn [int] return: [string!]]
PQtty ["Tty of database"
PGconn [int] return: [string!]]
PQstatus ["Status of connection"
PGconn [int] return: [int]]
PQerrorMessage ["Error associated with connection"
PGconn [int] return: [string!]]
PQfinish ["Close connection"
PGconn [int]]
PQreset ["Reset communication with database"
PGconn [int]]
PQexec [ "Execute SQL statement"
PGconn [int] query [string!] return: [int]]
PQresultStatus ["Status of query"
result [int] return: [int]]
PQresStatus ["Convert status to string"
res-stat [int] return: [string!]]
PQresultErrorMessage ["Error message for query"
PGresult [int] return: [string!]]
PQntuples ["Number of tuples in result"
PGresult [int] return: [int]]
PQnfields ["Number of fields in result"
PGresult [int] return: [int]]
PQfname ["Field attribute associated with field index"
PGresult [int] field_index [int] return: [string!]]
PQfnumber ["Field index associated with field name"
PGresult [int] field_name [string!] return: [int]]
PQftype ["Field type associated with given index"
PGresult [int] field_num [int] return: [int]]
PQfsize ["Size in bytes of field associated with index"
PGresult [int] field_index [int] return: [int]]
PQfmod ["Type-specific modification data per field at index"
PGresult [int] field_index [int] return: [int]]
PQgetvalue ["Get field (attribute) value"
PGresult [int] tup_num [int] field_num [int] return: [char*]]
PQgetlength ["Length of a field in bytes"
PGresult [int] tup_num [int] field_num [int] return: [int]]
PQgetisnull ["NULL status of a field"
PGresult [int] tup_num [int] field_num [int] return: [int]]
PQcmdStatus ["Command status of last query command"
PGresult [int] return: [string!]]
PQcmdTuples ["Number of tuples affected by INSERT, UPDATE, DELETE queries"
PGresult [int] return: [string!]]
PQoidStatus ["String with the object id of the tuple inserted"
PGresult [int] return: [string!]]
PQclear ["Frees the storage associated with the PGresult"
PQresult [int]]
PQsendQuery ["Submit a query to Postgres without waiting result(s)"
PGconn [int] query [string!] return: [string!]]
PQgetResult ["Wait for the next result from a prior PQsendQuery"
PGconn [int] return: [int]]
PQconsumeInput ["If input is available from the backend, consume it"
PGconn [int]]
PQisBusy ["Returns TRUE if a query is busy (would block)"
PGconn [int] return: [int]]
PQsocket ["file descriptor number for the backend connection socket"
PGconn [int] return: [int]]
PQrequestCancel["Request abandon processing of the current query"
PGconn [int] return: [int]]
fe_getauthname ["Name the user has authenticated"
errorMessage [string!] return: [string!]]
fe_setauthsvc ["use authentication service name rather default"
name [string!] errorMessage [string!]]
]
foreach [name spec] routines [
set name make routine! spec pq form name
]
[9/20] from: emptyhead:home:nl at: 7-Dec-2000 18:04
I have not tried yet. You don't have to speak C++ for this. Some essential
files are missing from the include/sys directory. Like socket.h. I only have
compiled C/C++ under Linux and BeOS. These have standart unix headers to
support tcp/ip. There should be some around for windows. Does anyone know where
to find standart unix headers for windows?
Daan Oosterveld
Sharriff Aina schreef:
[10/20] from: emptyhead:home:nl at: 7-Dec-2000 18:15
Jamey Cribbs schreef:
> Hi, Sharriff!
> Not to break in on your question to Daan, but is someone attempting to get
<<quoted lines omitted: 3>>
> I emailed the author of MDBMS, it sounded like he was no longer actively
> developing the product. Also, it didn't run on Windows, just Linux.
I use BeOS and Linux as base platform to run cgi scripts on. It is possible to
make it run on windows. I never developed on/for windows and I like to keep it
that way. 8^)
> By the way, if someone could kindly point me towards a more specific link to
> find that Postres port connection documentation, I would appreciate it. Last
> time I checked the site I couldn't find anything in the docs talking about
> that.
>
http://www.postgresql.org/devel-corner/docs/postgres/protocol.htm
Daan Oosterveld
[11/20] from: g:santilli:tiscalinet:it at: 8-Dec-2000 11:03
Hello Jamey!
On 07-Dic-00, you wrote:
[...]
Just a question for you all: would you be interested in a DBMS
written in REBOL? What kind of functionality do you consider most
important?
I have some ideas floating in my mind, but I think I won't have
enough time to implement them all. But perhaps, with some help...
Regards,
Gabriele.
--
Gabriele Santilli <[giesse--writeme--com]> - Amigan - REBOL programmer
Amiga Group Italia sez. L'Aquila -- http://www.amyresource.it/AGI/
[12/20] from: cribbsj:oakwood at: 8-Dec-2000 3:25
Hello, Gabriele!
That's a great question! It's funny you mention it. A few weeks ago, after
the light bulb came on in my head when I discovered how EASY it is to connect
to separate REBOL processes through a port, I started fooling around writing
a VERY basic DBMS engine in REBOL that could be accessed through a port,
similar to the way MDBMS can.
I spent about a week on it, off and on, before I got swamped with other
stuff. I was able to get the engine to be able to:
*Initialize an object (representing a table) for each .db file it found in a
directory.
* Accept client requests for add, change, delete, and find and return the
result set in the form of a block.
The client request had to be in the form of a block (ex):
[Add player "Montana" "Joe" "QB" "SF"]
That was about as far as I got, but, man, I had a lot of fun working on it
and it was SO cool to think I was actually writing a DB engine (albeit a very
crude, simplistic one).
Anyway, I'll quit rambling and get back to your question. What would I like
to see in a DBMS? Well, just off the top of my head:
*Normal stuff like adds, deletes, changes, selects (queries).
*Joins.
*Multi-user (locking, etc.)
*Referential Integrity.
*Ability to connect to remote dbs via TCP/IP.
What is not so important to me:
* Transactions
* Triggers or stored procedures (although they would be nice :) )
Well, I haven't had my morning coffee yet, so that's all I can think of right
now. If you pull something like this off, I think it would be HUGE for the
Rebol community.
Jamey.
On Friday 08 December 2000 04:03, you wrote:
[13/20] from: chaz:innocent at: 8-Dec-2000 23:48
I'd like to be able to use a database to store and retrieve REBOL objects,
e.g. REBOL/View gadgets (sliders, buttons, etc), schemes, and contexts. It
would be nice if this database connected to, and exposed, the REBOL System
Object.
chaz
At 11:03 AM 12/8/00 +0200, you wrote:
[14/20] from: g:santilli:tiscalinet:it at: 8-Dec-2000 18:53
Hello Jamey!
On 08-Dic-00, you wrote:
JC> I spent about a week on it, off and on, before I got swamped
JC> with other stuff. I was able to get the engine to be able to:
[...]
If you don't mind, I'd like to have a look at it. It could be an
interesting source of ideas. :-)
JC> What is not so important to me:
JC> * Transactions
JC> * Triggers or stored procedures (although they would be nice
JC> :) )
I think that the ability to store code as data would make triggers
and stored procedures very easy to add; REBOL could even make
possible to do new and interesting things...
JC> can think of right now. If you pull something like this off,
JC> I think it would be HUGE for the Rebol community.
I mainly wonder about speed, because using an interpreted language
will always give some penalty wrt native DBMS. Would the greater
simplicity of the REBOL approach justify such a penalty, in your
opinion?
Regards,
Gabriele.
--
Gabriele Santilli <[giesse--writeme--com]> - Amigan - REBOL programmer
Amiga Group Italia sez. L'Aquila -- http://www.amyresource.it/AGI/
[15/20] from: g:santilli:tiscalinet:it at: 9-Dec-2000 11:17
Hello chaz!
On 09-Dic-00, you wrote:
c> I'd like to be able to use a database to store and retrieve
c> REBOL objects, e.g. REBOL/View gadgets (sliders, buttons,
c> etc), schemes, and contexts. It would be nice if this database
c> connected to, and exposed, the REBOL System Object.
Serializing complex objects is not that simple. But you can easyly
store dialects that construct your objects; so you could store
your VID code, for example...
Regards,
Gabriele.
--
Gabriele Santilli <[giesse--writeme--com]> - Amigan - REBOL programmer
Amiga Group Italia sez. L'Aquila -- http://www.amyresource.it/AGI/
[16/20] from: cribbsj:oakwood at: 11-Dec-2000 10:30
Gabriele, I sent you the files in email to your address. Please don't laugh
at my code! :)
In response to your question below, I would answer "Yes". You are right
about the speed penalty. However, I think that the combination of Rebol/View
with some kind of easily accessible, portable backend DBMS would be a VB
killer. If the backend were to be written in Rebol, as you are proposing,
this would ensure portability and also give the developer the ability to
customize or modify any back-end processes he desired.
It might not be applicable for huge databases or for transaction intensive
ones, but those types of apps would probably use something like Oracle anyway.
Jamey.
On Friday 08 December 2000 11:53, you wrote:
[17/20] from: coussement:c:itc:mil:be at: 13-Dec-2000 9:50
Hi Gabriele:
An answer with some delay: I had to think a little bit about it.
Well, I'd the same idea and began to work on it for my project.
I've work for sometime now with relational systems (oa. SQL Server) and I'm
convinced data management can better than being flat...
In my particular system, I'm more interrested in the relations between the
items than in the items themself - because the first carry the key
informations I need.
So ... what I need is an Object Oriented DBMS !
I've no experience with those system (well with OO), and I intend to learn
it and write my own Rebol/OODBMS. After all, OO and Rebol are both another
step in the quest for expressing solutions to problems in a more natural,
easier to understand way.
Of course, the more people interrested in it, the further we can reach !
I've done some prospection for documentation. For those interested, try
this:
* Chaudhri, A.B. (1993) Object Database Management Systems: An
Overview in "BCS OOPS Newsletter", No.18 Summer '93
* Chaudhri, A.B. & Osmon, P. (1996) Databases for a New Generation in
Object Expert
March/April '97 pp 33-38
* Graham, I. (1994) Object Oriented Methods. Published by:
Addison-Wesley, ISBN 0-201-59371-8
* Graham, I. (1995) Migrating to Object Technology. Published by:
Addison-Wesley, ISBN 0-201-59389-0
* Vadarparty, K. (1996) Developing an ODBMS Application: Basic Steps
in "Journal of Object Oriented Programming" January '96 pp 19-21
or on the net, the -very- well documented site of the DACS:
http://www.dacs.dtic.mil/techs/oodbms2/index.html
Regards to the REBOLlians,
Christophe
[18/20] from: webmaster:siliconspecies at: 13-Dec-2000 4:10
Cache is object oriented.
www.edbms.com
Jeff
[19/20] from: g:santilli:tiscalinet:it at: 13-Dec-2000 16:41
CRS - Psy Sel/SPO, COUSSEMENT Christophe, CPN
wrote:
> http://www.dacs.dtic.mil/techs/oodbms2/index.html
Thanks for the link, this is an interesting issue. I'm not able to
check it out currently (the host seems to be unreachable from here
--- probably a broken router), but I'll check it out surely.
Regards,
Gabriele.
--
Gabriele Santilli <[giesse--writeme--com]> - Amigan - REBOL programmer
Amiga Group Italia sez. L'Aquila -- http://www.amyresource.it/AGI/
[20/20] from: brett:codeconscious at: 14-Dec-2000 13:45
A bit late to this discussion.
> I mainly wonder about speed, because using an interpreted language
> will always give some penalty wrt native DBMS. Would the greater
> simplicity of the REBOL approach justify such a penalty, in your
> opinion?
>
I think such an approach could carve out its own niche applications.
Applications upgrading to or requiring blistering speed would need to
consider alternatives as they do now (I mean that you always have to pick
your solutions according to your requirements).
A really really big plus for this project would be that it would stress test
Rebol for reliability and stability.
If you do it, I'd love it. Especially with the functionality already
discussed.
Brett.
Notes
- Quoted lines have been omitted from some messages.
View the message alone to see the lines that have been omitted