r3wp [groups: 83 posts: 189283]
  • Home
  • Script library
  • AltME Archive
  • Mailing list
  • Articles Index
  • Site search
 

World: r3wp

[!RebDB] REBOL Pseudo-Relational Database

Ashley
5-Apr-2006
[91]
help db-update is a good start. ;) For a full list of db functions 
just enter "help db-" at the console.
Maxim
7-Apr-2006
[92x2]
is anyone here interested in a contextualised version of rebdb ? 
 I mean one with everything hidden within an object, and most functions 
fixed to support it?
it allows us to use rebdb by supplying table names within values, 
instead of having to supply them directly within code.
Pekr
7-Apr-2006
[94]
that is not the problem of RebDB imo ... e.g. me and my friend stopped 
using it because of missing 'join and because Ashley stated, that 
instead of reinventing the wheel (RIF based on-disk version), he 
suggests SQLite ....
Maxim
7-Apr-2006
[95]
the only drawback is that sql use needs ticks for table names.   
acter using it for a while I actually like this better, cause it 
clearly identifies what is a reserved word and was is an argument, 
within the statements.
Pekr
7-Apr-2006
[96]
other than that - I like RebDB very much and I regard it being one 
of the best rebol tools so far ....
Maxim
7-Apr-2006
[97x3]
I have a merge function.   :-)
which can do some of the joining.
but you do need to do two queries beforehand... which is not exactly 
a join.. but anyhow you do end up with a block containing interleaved 
data from two tables ... and its pretty quick.
Normand
17-Jun-2006
[100]
Another newbee one: db-select can retreive the rows on multiples 
values like the query  db-select/where * noms [any [nom = 'leclerc 
prenom = 'marion]] but can I query a column's values to find all 
rows where a column contains a substring, like the query db-select/where 
* noms [find ["lec"] nomprenom] ?  This last one is not the answer. 
 What would be the good query for such a purpose?
Ashley
18-Jun-2006
[101]
Almost there, needs to be in the form:

	db-select/where * my-table [find string-column "string"]
Normand
22-Jun-2006
[102x3]
I am trying to update my RebDB database with a level of indirection,
as I am using a block of 39 colunms names and 
the corresponding 39 entry-fields from ReBGui.

Shortening those blocks for the example's sake, I do try to update 
the DB with the following command:

Let's say that exColumns: [name surname dob phone] and exValues: 
["Doe" "Jane" "1990-01-01" "418-840-4040"].

Then >> db-update/where exDB (exColumns) (exValues) compose ['rowid 
= (to-id)] do not work, nor variants I know.
Proof:
>> db-create exDB exColumns == true

>> db-insert exDB ["Foe" "Joe" "1991-01-01" "514-480-8080"] == true
>> db-commit exDB == true

Then what is a working update, as those do not work with indirection 
in column & values spec and rowid?
to-id: 1

Variant1 >> db-update/where exDB exColumns exValues compose [rowid 
= to-id]
== ** User Error: Invalid or duplicate column

Variant2 >> db-update/where exDB (exColumns) (exValues) compose [rowid 
= to-id]

== ** Script Error: db-update expected columns argument of type: 
word block

Variant3 >> do [ db-update/where exDB exColumns exValues compose 
[rowid = to-id] ]
== ** User Error: Invalid or duplicate column

Variant4 >> reduce [ db-update/where exDB exColumns exValues compose 
[rowid = to-id] ]
== ** User Error: Invalid or duplicate column

Variant5 >> reduce [ db-update/where exDB (exColumns) (exValues) 
compose [rowid = to-id] ]

== ** Script Error: db-update expected columns argument of type: 
word block

The more I go, the more I am frustrated into the word/value distinction.
What is the resiliently simple answer to my show stopper?
I also tried:

>> db-update/where bottinDB (get fieldsnames) (get fvalues) compose 
['rowid = (to-id)]

** Script Error: db-update expected columns argument of type: word 
block

>> do [ db-update/where bottinDB (get fieldsnames) (get fvalues) 
compose ['rowid = (to-id)] ]

** Script Error: db-update expected columns argument of type: word 
block

>> reduce [ db-update/where exDB ( get exColumns) (get exValues) 
compose [rowid = to-id] ]

** Script Error: db-update expected columns argument of type: word 
block
I am getting short of inspiration.
And about find:
db-select/where * exDB [find name "e"]
Expectedly, any letter of the string searched retrieves it:
>> db-select/where * exDB [find name "e"]
== ["Foe" "Joe" "1991-01-01" "514-480-8080"]
>> db-select/where * exDB [find name "oe"]
== ["Foe" "Joe" "1991-01-01" "514-480-8080"]
>> db-select/where * exDB [find name "Foe"]
== ["Foe" "Joe" "1991-01-01" "514-480-8080"]

But, reverting column and search-string, is this behaviour a specification 
of RebDB, or is it simply luck?
>> db-select/where * exDB [find "e" name]
== []
>> db-select/where * exDB [find "Foe" name]
== ["Foe" "Joe" "1991-01-01" "514-480-8080"]
Ashley
22-Jun-2006
[105]
Following works fine:

	db-update/where names name "Jane" [rowid = 1]

and reversing the find is saying:

	find "e" name -> where name appears in "e" ... so [] is corect

 find "Foe" name -> where name appears in "Foe" ... so ["Foe" ...] 
 is correct

is this behaviour a specification of RebDB

 ... this is how the REBOL find word works. Type "help find" at the 
 REBOL console for more information.
Normand
22-Jun-2006
[106]
Thanks for the 'find' explanation.  As for the update, the formula 
'db-update/where names name "Jane" [rowid = 1]' is a rather simple 
case.  I am trying to update a 39 columds database splitted into 
3 tab-panels.  So I figure that there is a way to parametrize the 
update and to obtain back, in return, the rowid  where RebDB placed 
it, as the rowid is not allways the same as the saved id, as shown 
in >> db-select id bottinDB
== [1 2 3 4 7 8 9 10]
>> db-select rowid bottinDB
== [1 2 3 4 5 6 7 8].
Ashley
22-Jun-2006
[107]
db-update returns an integer! indicating how many rows where updated. 
Rowid is the physical row sequence computed dynamically at query 
execution.


You can update multiple columns at once by providing a block of column 
names followed by a block of values (but number of values must match 
number of columns). If you are updating a large number of column 
values it is probably more efficient (and easier to code) to delete 
then re-insert the row.
Normand
22-Jun-2006
[108]
Well.  Is there any way to obtain the rowid (physical row order number) 
of a selected entry, or deleted or updated entry?  I am trying to 
devise a way to navigate into the database, from the initial point 
of a query or of an update.  But with delete operations, the first 
column, id, is not allways in sequence.  >> db-select id bottinDB 
 == [1 2 3 4 7 8 9 10]  >> db-select rowid bottinDB == [1 2 3 4 5 
6 7 8].  And, as much as I can, I want to keep the historical order 
of entry, as it gives me information.  It may be usefull to know 
that I did read a book or meet a person before another. The rowid 
gives a hint to that.  All and all, parametrizing the update and 
obtaining the rowid are stoping me to complete my small everyday 
application.  By the way, I do not see any example of 'demo' applications 
with RebDB and RebGui.  A little help with mine could give birth 
to one.  I should say that, design wise, RebGui is a great decision, 
to favor simplicity.  You adress there some needs never covered by 
other systems: the myriads of simple applets everybody needs but 
were unable to ask.  After a couple of  weekends, I have got 400 
lines of codes and am almost done.  And I am not a programmer. So 
I figure out how efficient it is for you guys. Thanks.
BrianH
22-Jun-2006
[109x2]
It sounds like you should add your own field for insert order. I 
don't think that RebDB keeps the records in the order it inserts 
them. Even its web site says that it sorts the records when selecting 
- this isn't Access you know. If you want to keep some information 
in the database, put it there.
If records aren't inserted often you can use a date/time for the 
field - otherwise use a number that you would increment. Keep in 
mind that if you do a lot of insertions and deletions, a number field 
could end up overflowing unless you occasionally compact the numbers.
Ashley
22-Jun-2006
[111]
Another option is to select the rowid(s) you are after:

	id: db-select/where rowid table [...]

then perform the operations you want:

	db-update/where ... compose [ ... (id) ...]


BTW, thanks for the feedback on both RebDB/RebGUI ... always good 
to know where folks are having both success and problems. More demos/tutorials 
are on the ever growing ToDo list. ;)
Normand
23-Jun-2006
[112]
Thanks for those suggestions.   If I finish it, I'll feedback with 
it.
xavier
14-Nov-2006
[113]
hello, i d like to know if its possible to call db.r script from 
an encaped program.  It says that core 2.6 is needed and if i try 
to remove the security it fails.  what i try to do is the following 
:
rebol []


#include %/C/Documents and Settings/xavier/rebApps/spikes/mezz.r;

#include %/C/Documents and Settings/xavier/rebApps/spikes/prot.r

#include %/C/Documents and Settings/xavier/rebApps/spikes/view.r

test: request-file
write %test/param.par test
do to-rebol-file read %test/param.par
probe db-select * patients
ask ""


in this example the file u are supposed to point is db.r.  When it 
s not encaped it work, not when it is.  if someone has an idea ...
Anton
14-Nov-2006
[114]
A guess is that the path  %test/param.par  is not being resolved 
correctly when encapped. Try adding.
	probe what-dir
and see if the results are different encapped and normally.
Ashley
14-Nov-2006
[115]
RebDB uses features introduced in core 2.6 (case, unless, etc) so 
the solution to your problem is to use an SDK that supports Core 
2.6 and later. Calling %db.r from your encapped script will use the 
SDK version of REBOL, whilst running it from file explorer will use 
whatever version of REBOL is associated with .r files. Latest SDK 
builds are located here: http://www.rebol.net/builds/sdk/


You should then be able to include %db.r directly in your encapped 
script.r.
xavier
15-Nov-2006
[116]
it works ashley , thanks for everything , u found the solution.  
thanks to that i normally could be able to access to rebdb from my 
encaped program.  I ll do trial to see if i can access to the db.r 
script from the network but normally this could be THE solution to 
my problem.  Thanks for your very good job and for the information 
:)).
Ammon
12-Apr-2007
[117]
Ashley, I noticed some strange behavior with db-select.  If you do 
NOT supply the /where argument then blocks are inserted into the 
result correctly but if do they are inserted inline.

Example:
>> db-describe tags
== [id integer! tag string! files block!]
>> db-select [id files] tags
== [1 [3]]
>> db-select/where [id files] tags [tag = "t"]
== [1 3]


I've spent about an hour trying to find where to fix this in db.r 
but I'm not seeing it.  Any ideas?
Ashley
12-Apr-2007
[118]
Sounds like a missing /only refinement on an insert. I'll look at 
this later tonight ... odd how no-one else has hit this in over 2 
years ... maybe not many folks store blocks! ;)
Ammon
13-Apr-2007
[119]
That's what I thought so I started poking around but I didn't find 
the place to add the /only to...
Ashley
13-Apr-2007
[120]
Think I've nailed the 3 spots /only is required:

	http://www.dobeash.com/RebDB/RebDB-203.zip


Note that this pre-release includes a few other untested changes; 
including /joins and /replaces refinements to db-select (refer discussion 
from 12-Feb-2006 onwards for explanation).
Pekr
13-Apr-2007
[121]
interesting to know, someone still uses RebDB ... although in-memory 
and not shareable, it is cool Rebol design!
Ashley
13-Apr-2007
[122]
I'm hoping R3 will make it and the SQLite driver redundant ;)
Pekr
13-Apr-2007
[123x3]
ah, high hopes :-)
I can imagine solving even sharing problem - simply to queue requests 
....
the question is, if RIF comes or not.
Henrik
13-Apr-2007
[126]
what about locking?
Pekr
13-Apr-2007
[127x3]
locking? why not? You can distribute ticket :-)
there is the concept called, uh, I forgot, java persistent database, 
few hundred of lines of code ....
Maybe an interesting project? http://sqlrelay.sourceforge.net/
Robert
13-Apr-2007
[130]
Looks interesting. I will see how this works with SQLite & RebService...
Dockimbel
13-Apr-2007
[131]
Pekr, you're thinking about "Prevalence" ? http://www.advogato.org/article/398.html
Pekr
15-Apr-2007
[132]
Doc, yes, it was Prevailer ...
Anton
15-Apr-2007
[133]
Prevayler
Ammon
28-Apr-2007
[134]
Thanks Ashley!  I kind of got distracted from what I was doing, but 
I'm working on it some more and your fixes work.
btiffin
2-Jul-2007
[135]
Ashley;  Can we get rid of the %rebgui.log  and RebDB %.log database 
replay conflict?  I've taken to just deleting the %rebgui.log on 
app startup, which is probably not a good habit.  Preferred would 
be a rename of the database replay logs to something less 'conflicting', 
say .ldb or some such.  .LOG is too easy to trip over during app 
(especially widget) development.  But I'll accept a nice short No, 
too.  :)
Ashley
3-Jul-2007
[136]
db/base-dir: %data/
btiffin
3-Jul-2007
[137]
Thank you sir.  That's a way round.  :)
GiuseppeC
13-Dec-2007
[138]
Hello, I have a question: which are the advantages of SQLLite over 
RebDB ? I have to chose something to lear for my projects.
Ashley
13-Dec-2007
[139]
SQLite supports joins, RebDB doesn't.
SQLite driver requires /PRO, RebDB doesn't.
SQLite is disk-based, RebDB is RAM-based.


I use RebDB for small, simple, single-user apps; and SQLite for larger 
multi-user apps.
GiuseppeC
13-Dec-2007
[140]
Ok, I suppose I will have to learn both. RebDB for very simple projects 
and SQL for large ones. After Christmas I will buy Rebol/Pro and 
when my project will be ready the whole suite.