Re: proposal EDS functions

new topic     » goto parent     » topic index » view thread      » older message » newer message

Salix wrote:
> 
> Hello,
> 
> I regularly use EDS in my projects for quite a few years now. 
> Whenever I start a new project I found myself rewritting these 
> functions. I suggest to include them in the standard database.e 
> file. 
> 
> Any comment, support, improvment is welcome. I suppose all of us
> developed some similar rountines...
> 

I can see some issues with the below function:

> }}}
<eucode>
> global function db_startup(sequence dbf)
> 	integer err,lock
> 	lock=DB_LOCK_NO
> 	err=db_open(dbf,lock)
> 	if err=DB_OK then
> 		return DB_OK
> 	elsif err=DB_OPEN_FAIL then
> 		return db_create(dbf,lock)
> 	elsif err=DB_LOCK_FAIL then
> 		for i=1 to 10 by 1 do
> 			if db_open(dbf,lock)=DB_OK then
> 				return DB_OK
> 			else
> 				sleep(2)
> 			end if
> 		end for
> 		return DB_LOCK_FAIL
> 	else
> 		return DB_OPEN_FAIL
> 	end if
> end function
> 

1/ I assume lock is an argument to the function, not a local variable as you
coded it;

2/ I'd expect the "10" to be adjustable. This would require defining a
db_max_retry global variable, some factory default for it and a procedure to
reset it to that default. Also, you may wish to have a setter which guards
against invalid/undesirably large values. It is ok as long as you are admin of
your database; if you are not, you should not even be allowed to set that number.

3/ Same remarks as above regarding the delay between consecutive retries (the
"2"). Replace "large" by "small" though.

4/ Additionally, your method is blocking, as you sleep() between retries, even
though some systems will enable you to yield immediately and be notified of I/O
success or timeout. I think db_startup() should try to use these mechanisms where
available. They don't exist under DOS, do under Windows 2K and later. Not sure
for NT, not available under 9x I think. For unixes, I have no clue.
Also, see the thread about nonblocking I/O in Eu.

Btw, I never tried mixing Windows' waitable I/O objects and Eu tasks. No idea
whether it works without too much effort. I guess the trick is for the callback
to call Eu's scheduler with the id of a suspended task which will act real-time
upon notification.

> global function db_startup_table(sequence t)
> 	integer err
> 	if db_select_table(t)=DB_OK 
> 	or db_create_table(t)=DB_OK 
> 	then 
> 		return DB_OK 
> 	end if
>        	return DB_OPEN_FAIL
> end function
> </eucode>
{{{

> 

No objection there. However, returning a new DB_CREATED status code when the
table didn't exist prior could provide useful information (for instance, do some
init job if the table wasn't there before). Returning DB_CREATED would be useful
in db_startup() too.

CChris

> Regards,
> 
> Salix

new topic     » goto parent     » topic index » view thread      » older message » newer message

Search



Quick Links

User menu

Not signed in.

Misc Menu