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

[REBOL] Re: Object Database

From: carl:rebol at: 11-Apr-2001 5:49

Wow... so many questions. It's a good think I can't sleep tonight... My replies are mixed in below:
> -----Original Message----- > From: [rebol-bounce--rebol--com] [mailto:[rebol-bounce--rebol--com]]On Behalf Of > Dr. Louis A. Turk > Sent: Tuesday, April 10, 2001 11:48 PM > To: [rebol-list--rebol--com] > Subject: [REBOL] Re: Object Database > > Dear Carl, > > I am amazed that such a small amount of code can do so much, and > also that > the creator of this language himself would help me like this. > Many thanks!
Whatever I can do to help!
> I have some questions. I have been studying your code carefully > trying to > learn how it works. I've been on this list for quite a while, but have > only recently taken time to buy Ralph's book and Elan and John's book to > really get serious about learning the language. I'm a real beginner, so > please excuse me if my questions betray that fact. > > So far I have figured out how to use your functions to enter data into a > record, and then save it to a file. By entering "print read %data.r" at > the command line, I am able to see that I have entered the data > successfully. So I think I understand how to use insert-data and > save-data. However, when I type load-data I get an error message ("blk > has no value"); what am I doing wrong? Also, I assume that I must learn
I'm sorry. Change blk to data. A typo. Did I mention that it still needed your help debugging it? ;)
> how to get load-data to work before find-data and remove-data will work; > but to keep from having to ask you later, how are these two > functions used?
The database works from memory. Load-data brings it into memory where the find, remove and other functions operate on it. So, yes, you have to load it first, or at least insert-data a few times to create some data records. The functions work like this: rec: find-data [bob--example--com] print rec/name print rec/phone etc. remove-data [bob--example--com] save-data ; write back to disk insert-data [kit--example--com] "Kitty Carson" none http:/ save-data ; write back to disk You can use NONE for any missing value above. You don't need to do the save-data each time... but you must do it sooner or later.
> I want to use this database for an email list. Most of the data remains > the same, but email addresses change often. Sometime I do not > even have a > name---only an email address that has to be removed or changed. How do I > change an email address?
The data is organized (keyed) by email. To change an email address, but keep the rest of the record intact, you'll need a new function: change-data: func [email-old email-new /local record] [ record: find database email-old if none? record [alert reform ["Missing record:" email-old] exit] insert clear first record email-new ; see note below ] Note: This is subtle, so should be noted... I'm clearing out the actual memory string for the old email, then inserting the new string into it. Also, this string is shared. It is used both in the database block (as the key) and in the record object itself. So changing it here will change it in both places. That's a feature, but it is not obvious, so make sure that you comment that line.
> You say: > > > If you expect to grow this database to a large > >size, you will want to MAKE HASH! the database when you load > >it. > > Will this modification do it?: > > >load-data: has [data] [ > > data: make hash! load/all db-file > > clear database > > foreach item blk [ > > item: make record item > > repend database [item/email item] > > ] > >]
You will want to make the hash after the database is created (after the foreach loop). database: make hash! database But, don't worry about that until your database gets big. For a few hundred names, you don't need it. Get to know the code and debug it before hashing it.
> Will your code work with Rebol/View also? Am I correct in assuming that > View would be ideal for creating a user interface for the database?
Yes and yes. You will want to add two new functions: one to copy data from a record into a view form, and another to copy it back or create a new record in the database.
> Many thanks for your help, and for creating a truly exciting language.
When you are done, you will have written an actual database system from scratch in REBOL. Not bad for a couple pages of code, eh?