1. proposal EDS functions

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...

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

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


Regards,

Salix

new topic     » topic index » view message » categorize

2. Re: proposal EDS functions

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...
> 
> }}}
<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
> 
> 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>
{{{

> 
> Regards,
> 
> Salix

just to add to this post... here is a database.e "function" only handler that i
use alot...

include database.e
------------------

global
procedure dbase(sequence s, object x, integer c)

    x = call_func(routine_id(s),x)

    if x != DB_OK and x != c                     -- continue
    then
        clear_screen()
        puts (1,"\ndbase() -> A fatal database failure...\n")
        -- Todo: display s & x
        abort(x)
    end if

end procedure


* execution continues if the return error is DB_OK or the
  allowed condition, else a fatal error is reported...

-- example:

    -- select a table from the database, execution will countinue if
    -- DB_OK or DB_OPEN_FAIL    

    dbase("db_select_table",{"my_table"},DB_OPEN_FAIL)

    -- create a table in the database, execution will continue if
    -- DB_OK or DB_EXISTS_ALREADY

    dbase("db_create_table",{"my_table"},DB_EXISTS_ALREADY)


new topic     » goto parent     » topic index » view message » categorize

3. Re: proposal EDS functions

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 message » categorize

Search



Quick Links

User menu

Not signed in.

Misc Menu