Re: [PHP-DB] Automatic logoff

2010-01-28 Thread Richard Quadling
On 27 January 2010 17:20, listread listr...@cze.com wrote:
 Richard,

 I think I need to learn about semaphores!  Any suggestions for a good
 tutorial?

 One of the things we want to do is exclude locked records from a query.
  Will semaphores provide for that?

 Thanks!

 - Ron




 On 1/27/2010 8:14 AM, Richard Quadling wrote:

 The technique I've used in the past is semaphore locking, where the
 semaphore contains the session and the expected expiry time.

 Follow this.

 User a starts the process of editing a record.
 Set the semaphore where there is :
   a - no existing semaphore - no ongoing edits.
   b - the semaphore's session is the same - repeat edits by this user
 in the same session (expired or otherwise).
   c - the semaphore has expired - the other user simply took too long.

 If the semaphore cannot be set it will be because of :
   d - Different non expired session - someone else is editing the record.

 When a user saves the row, you just remove the semaphore.

 The semaphores could be in a separate table (rather than on the record
 itself).

 Different tables have different number of columns so take different
 amounts of time to edit, so each table would have a different amount
 of time from edit to expiry.

 An entry on a lookup table (just a description) should, in the main,
 be completed within 30 seconds.

 But a detail line for a purchase order may take several minutes.

 You'll have to tune this to your own needs.




 --
 PHP Database Mailing List (http://www.php.net/)
 To unsubscribe, visit: http://www.php.net/unsub.php



A semaphore is just a flag. Nothing else. You can implement it in
any way you like as long as _ALL_ code related to locking uses the
semaphores.

A common technique for locking files is to create a folder called filename.lck

A directory can only exist or not.

You try to create the directory. If you did, you got the lock. If not,
someone else has.

The same approach should be used for DB locking in this manner.

You try to place the lock (with the conditions defined in the WHERE
clause under which it should succeed). If the lock doesn't get
written, then you don't have it.

What you _DON'T_ do, is see if the lock is already there before trying
to write one. No need and provides the possibility for another user,
using the same code, to be interleaved.

Also, no need for transactions at this stage too.

You put the lock on (if you are allowed to). Now you can edit and
re-edit the row until you've finished.

This technique is described quite well in
http://en.wikipedia.org/wiki/Semaphore_(programming)

One of the important aspects to using semaphores is that the process
to set (and either succeed or fail) must not be interrupted, hence why
you don't try to read the presence of the lock before setting it.

I hope that helps some.

I used to develop using an old DOS based 4GL called Sage Retrieve 4GL
(prior to that it was called Sage Skybase). This uses a modified
D-ISAM db structure and semaphores for locking. You'd try to lock a
record and process the failure. Quite easy really.

By extending this concept to include an expiry time within the lock,
you've got your auto-unlock feature written.


-- 
-
Richard Quadling
Standing on the shoulders of some very clever giants!
EE : http://www.experts-exchange.com/M_248814.html
EE4Free : http://www.experts-exchange.com/becomeAnExpert.jsp
Zend Certified Engineer : http://zend.com/zce.php?c=ZEND002498r=213474731
ZOPA : http://uk.zopa.com/member/RQuadling

--
PHP Database Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php



Re: [PHP-DB] FW: Oracle Finalizes Acquisition of Sun

2010-01-28 Thread Bastien Koert
[snip]
[/snip]

PS We will now proceed to fire some 20,000 employees as they will no
longer be needed.
-- 

Bastien

Cat, the other other white meat

-- 
PHP Database Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php



Re: [PHP-DB] Automatic logoff

2010-01-28 Thread listread

Great explanation, Richard!

I think I understand the concept now.  I'll study it a little and try to 
implement it.


Thanks!

- Ron

On 1/28/2010 5:47 AM, Richard Quadling wrote:

On 27 January 2010 17:20, listreadlistr...@cze.com  wrote:
   

Richard,

I think I need to learn about semaphores!  Any suggestions for a good
tutorial?

One of the things we want to do is exclude locked records from a query.
  Will semaphores provide for that?

Thanks!

- Ron




On 1/27/2010 8:14 AM, Richard Quadling wrote:
 

The technique I've used in the past is semaphore locking, where the
semaphore contains the session and the expected expiry time.

Follow this.

User a starts the process of editing a record.
Set the semaphore where there is :
   a - no existing semaphore - no ongoing edits.
   b - the semaphore's session is the same - repeat edits by this user
in the same session (expired or otherwise).
   c - the semaphore has expired - the other user simply took too long.

If the semaphore cannot be set it will be because of :
   d - Different non expired session - someone else is editing the record.

When a user saves the row, you just remove the semaphore.

The semaphores could be in a separate table (rather than on the record
itself).

Different tables have different number of columns so take different
amounts of time to edit, so each table would have a different amount
of time from edit to expiry.

An entry on a lookup table (just a description) should, in the main,
be completed within 30 seconds.

But a detail line for a purchase order may take several minutes.

You'll have to tune this to your own needs.


   


--
PHP Database Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php


 

A semaphore is just a flag. Nothing else. You can implement it in
any way you like as long as _ALL_ code related to locking uses the
semaphores.

A common technique for locking files is to create a folder called filename.lck

A directory can only exist or not.

You try to create the directory. If you did, you got the lock. If not,
someone else has.

The same approach should be used for DB locking in this manner.

You try to place the lock (with the conditions defined in the WHERE
clause under which it should succeed). If the lock doesn't get
written, then you don't have it.

What you _DON'T_ do, is see if the lock is already there before trying
to write one. No need and provides the possibility for another user,
using the same code, to be interleaved.

Also, no need for transactions at this stage too.

You put the lock on (if you are allowed to). Now you can edit and
re-edit the row until you've finished.

This technique is described quite well in
http://en.wikipedia.org/wiki/Semaphore_(programming)

One of the important aspects to using semaphores is that the process
to set (and either succeed or fail) must not be interrupted, hence why
you don't try to read the presence of the lock before setting it.

I hope that helps some.

I used to develop using an old DOS based 4GL called Sage Retrieve 4GL
(prior to that it was called Sage Skybase). This uses a modified
D-ISAM db structure and semaphores for locking. You'd try to lock a
record and process the failure. Quite easy really.

By extending this concept to include an expiry time within the lock,
you've got your auto-unlock feature written.


   



--
PHP Database Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php



Re: [PHP-DB] Automatic logoff

2010-01-28 Thread listread

Richard,

One more question (for now):   Are there advantages to using a separate 
table for locking, rather than specifying a lock column in the table you 
want to lock the row in?


- Ron

On 1/28/2010 5:47 AM, Richard Quadling wrote:

On 27 January 2010 17:20, listreadlistr...@cze.com  wrote:
   

Richard,

I think I need to learn about semaphores!  Any suggestions for a good
tutorial?

One of the things we want to do is exclude locked records from a query.
  Will semaphores provide for that?

Thanks!

- Ron




On 1/27/2010 8:14 AM, Richard Quadling wrote:
 

The technique I've used in the past is semaphore locking, where the
semaphore contains the session and the expected expiry time.

Follow this.

User a starts the process of editing a record.
Set the semaphore where there is :
   a - no existing semaphore - no ongoing edits.
   b - the semaphore's session is the same - repeat edits by this user
in the same session (expired or otherwise).
   c - the semaphore has expired - the other user simply took too long.

If the semaphore cannot be set it will be because of :
   d - Different non expired session - someone else is editing the record.

When a user saves the row, you just remove the semaphore.

The semaphores could be in a separate table (rather than on the record
itself).

Different tables have different number of columns so take different
amounts of time to edit, so each table would have a different amount
of time from edit to expiry.

An entry on a lookup table (just a description) should, in the main,
be completed within 30 seconds.

But a detail line for a purchase order may take several minutes.

You'll have to tune this to your own needs.


   


--
PHP Database Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php


 

A semaphore is just a flag. Nothing else. You can implement it in
any way you like as long as _ALL_ code related to locking uses the
semaphores.

A common technique for locking files is to create a folder called filename.lck

A directory can only exist or not.

You try to create the directory. If you did, you got the lock. If not,
someone else has.

The same approach should be used for DB locking in this manner.

You try to place the lock (with the conditions defined in the WHERE
clause under which it should succeed). If the lock doesn't get
written, then you don't have it.

What you _DON'T_ do, is see if the lock is already there before trying
to write one. No need and provides the possibility for another user,
using the same code, to be interleaved.

Also, no need for transactions at this stage too.

You put the lock on (if you are allowed to). Now you can edit and
re-edit the row until you've finished.

This technique is described quite well in
http://en.wikipedia.org/wiki/Semaphore_(programming)

One of the important aspects to using semaphores is that the process
to set (and either succeed or fail) must not be interrupted, hence why
you don't try to read the presence of the lock before setting it.

I hope that helps some.

I used to develop using an old DOS based 4GL called Sage Retrieve 4GL
(prior to that it was called Sage Skybase). This uses a modified
D-ISAM db structure and semaphores for locking. You'd try to lock a
record and process the failure. Quite easy really.

By extending this concept to include an expiry time within the lock,
you've got your auto-unlock feature written.


   



--
PHP Database Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php



Re: [PHP-DB] Automatic logoff

2010-01-28 Thread Richard Quadling
On 28 January 2010 20:29, listread listr...@cze.com wrote:
 Richard,

 One more question (for now):   Are there advantages to using a separate
 table for locking, rather than specifying a lock column in the table you
 want to lock the row in?

 - Ron

 On 1/28/2010 5:47 AM, Richard Quadling wrote:

 On 27 January 2010 17:20, listreadlistr...@cze.com  wrote:


 Richard,

 I think I need to learn about semaphores!  Any suggestions for a good
 tutorial?

 One of the things we want to do is exclude locked records from a query.
  Will semaphores provide for that?

 Thanks!

 - Ron




 On 1/27/2010 8:14 AM, Richard Quadling wrote:


 The technique I've used in the past is semaphore locking, where the
 semaphore contains the session and the expected expiry time.

 Follow this.

 User a starts the process of editing a record.
 Set the semaphore where there is :
   a - no existing semaphore - no ongoing edits.
   b - the semaphore's session is the same - repeat edits by this user
 in the same session (expired or otherwise).
   c - the semaphore has expired - the other user simply took too long.

 If the semaphore cannot be set it will be because of :
   d - Different non expired session - someone else is editing the
 record.

 When a user saves the row, you just remove the semaphore.

 The semaphores could be in a separate table (rather than on the record
 itself).

 Different tables have different number of columns so take different
 amounts of time to edit, so each table would have a different amount
 of time from edit to expiry.

 An entry on a lookup table (just a description) should, in the main,
 be completed within 30 seconds.

 But a detail line for a purchase order may take several minutes.

 You'll have to tune this to your own needs.




 --
 PHP Database Mailing List (http://www.php.net/)
 To unsubscribe, visit: http://www.php.net/unsub.php




 A semaphore is just a flag. Nothing else. You can implement it in
 any way you like as long as _ALL_ code related to locking uses the
 semaphores.

 A common technique for locking files is to create a folder called
 filename.lck

 A directory can only exist or not.

 You try to create the directory. If you did, you got the lock. If not,
 someone else has.

 The same approach should be used for DB locking in this manner.

 You try to place the lock (with the conditions defined in the WHERE
 clause under which it should succeed). If the lock doesn't get
 written, then you don't have it.

 What you _DON'T_ do, is see if the lock is already there before trying
 to write one. No need and provides the possibility for another user,
 using the same code, to be interleaved.

 Also, no need for transactions at this stage too.

 You put the lock on (if you are allowed to). Now you can edit and
 re-edit the row until you've finished.

 This technique is described quite well in
 http://en.wikipedia.org/wiki/Semaphore_(programming)

 One of the important aspects to using semaphores is that the process
 to set (and either succeed or fail) must not be interrupted, hence why
 you don't try to read the presence of the lock before setting it.

 I hope that helps some.

 I used to develop using an old DOS based 4GL called Sage Retrieve 4GL
 (prior to that it was called Sage Skybase). This uses a modified
 D-ISAM db structure and semaphores for locking. You'd try to lock a
 record and process the failure. Quite easy really.

 By extending this concept to include an expiry time within the lock,
 you've got your auto-unlock feature written.





 --
 PHP Database Mailing List (http://www.php.net/)
 To unsubscribe, visit: http://www.php.net/unsub.php



I've never done any studies on this. I've always used a separate table.

I suppose one reason is that you don't touch the live data unless you
have the semaphore.

Also, the additional columns would need to be on every table where
semaphoring is required.

So, having all the locks in a lock table seems right.

The lock table should be small, whereas the data it is locking could
be very big.

-- 
-
Richard Quadling
Standing on the shoulders of some very clever giants!
EE : http://www.experts-exchange.com/M_248814.html
EE4Free : http://www.experts-exchange.com/becomeAnExpert.jsp
Zend Certified Engineer : http://zend.com/zce.php?c=ZEND002498r=213474731
ZOPA : http://uk.zopa.com/member/RQuadling

--
PHP Database Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php



Re: [PHP-DB] FW: semaphores WAS: [PHP-DB] Automatic logoff

2010-01-28 Thread Richard Quadling
On 28 January 2010 21:38, Daevid Vincent dae...@daevid.com wrote:
 An intersting synopsis of Semaphores. I've done similar things in the
 past, but never knew this is what I was doing. LOL. Just like I've built an
 uber XML parser/editor and didn't know that I actually built a Factory.
 Ahhh... good old data structures -- they didn't teach these things when
 I was in college (20+ years ago).

 I particularly found this part interesting as I hadn't considered this,
 What you _DON'T_ do, is see if the lock is already there before trying to
 write one. No need and provides the possibility for another user,
 using the same code, to be interleaved.  I am assuming (and correct me if
 I'm wrong) as you will get a race condition (on a sufficiently large
 system) wherein, two users check is there a directory lock, and the
 system responds No to each, and then the code attempts to create a
 directory. Then one of them gets a lock granted (i.e a directory) and since
 'there can be only one' [highlander reference] the other one THINKS they
 got the lock (too). Doh!

What happens in code depends upon the code.

If the code doesn't test the result of assigning the lock, then there
is no lock.

Every write will overwrite whatever was previously written if all
users use the same code.

And there is the major flaw of distributed or client initiated semaphoring.

It is entirely possible for you to open up your DB gui tool and amend
the data. Completely bypassing the semaphoring.

So, whilst semaphoring is really useful for long edits, it isn't perfect.

But as long as all code use the same semaphoring logic, then it is fine.

 The wiki page is also interesting and I'd always heard these terms, but
 never really knew what they were in a practical sense: A mutex is a binary
 semaphore that usually incorporates extra features, such as ownership,
 priority inversion protection or recursivity. The differences between
 mutexes and semaphores are operating system dependent, though mutexes are
 implemented by specialized and faster routines. Mutexes are meant to be
 used for mutual exclusion (post/release operation is restricted to thread
 which called pend/acquire) only and binary semaphores are meant to be used
 for event notification (post-ability from any thread) and mutual exclusion.
 Events are also sometimes called event semaphores and are used for event
 notification.

 And this also helped to clarify:
 http://stackoverflow.com/questions/62814/difference-between-binary-semaphor
 e-and-mutex


Ha! Toilets.



-- 
-
Richard Quadling
Standing on the shoulders of some very clever giants!
EE : http://www.experts-exchange.com/M_248814.html
EE4Free : http://www.experts-exchange.com/becomeAnExpert.jsp
Zend Certified Engineer : http://zend.com/zce.php?c=ZEND002498r=213474731
ZOPA : http://uk.zopa.com/member/RQuadling

--
PHP Database Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php



[PHP-DB] Need Help

2010-01-28 Thread nagendra prasad
Hi,

I have a database of MP3 and I have designed a PHP-Mysql search engine. I
want to break it down in pages like Google dose. What I mean is when I
search for a song it will show me some 100 song list but I want 20 songs per
page. So, is their any trick to do it?

Best,


-- 
Guru Prasad
Ubuntu Voice GTK+ Forum


Re: [PHP-DB] FW: Oracle Finalizes Acquisition of Sun

2010-01-28 Thread Eric Lee
hmm, that' true now !!

Shall the mysql db become paid software !!



Regards,
Eric,


On Thu, Jan 28, 2010 at 11:44 PM, Bastien Koert phps...@gmail.com wrote:

 [snip]
 [/snip]

 PS We will now proceed to fire some 20,000 employees as they will no
 longer be needed.
 --

 Bastien

 Cat, the other other white meat

 --
 PHP Database Mailing List (http://www.php.net/)
 To unsubscribe, visit: http://www.php.net/unsub.php




Re: [PHP-DB] Need Help

2010-01-28 Thread Udhaya Kumar
Hi There
This is what you are looking for.

http://phpsense.com/php/php-pagination-script.html

Regards
udhay

On Fri, Jan 29, 2010 at 6:01 AM, nagendra prasad
nagendra802...@gmail.comwrote:

 Hi,

 I have a database of MP3 and I have designed a PHP-Mysql search engine. I
 want to break it down in pages like Google dose. What I mean is when I
 search for a song it will show me some 100 song list but I want 20 songs
 per
 page. So, is their any trick to do it?

 Best,


 --
 Guru Prasad
 Ubuntu Voice GTK+ Forum



[PHP-DB] PHP Help with pagination

2010-01-28 Thread Karl DeSaulniers

Hey nagendra,
I tried to post this a while ago, but it may be too long for the list.

?php
if ($Submit) {  // perform search only if correct form was entered.
   $db = mysql_connect ($Host, $User, $Password);
   mysql_select_db ($DBName) or die (Cannot connect to database);

//check if the starting row variable was passed in the URL or not
if (!isset($_GET['pg']) or !is_numeric($_GET['pg'])) {
  //we give the value of the starting row to 1 because this is the  
first page

  $pg = 1;
//otherwise we take the value from the URL
} else {
  $pg = $_GET['pg'];
}
?

?php  // I used the results from a dropdown menu for the users  
selection from the previous page that called this one.

if ($fieldTwentyOne == 'All Users Last Login Date') {
  $fieldTwentyOne = %;
   }

   $srch=%.$Submit.%;
?

?php
/// Variables

$max_results = 5; /// Number of results per page

$min = (($pg * $max_results) - $max_results);
?

?php
/// Count total
$query_total_users = SELECT COUNT(*) as Num FROM users;
$totals = mysql_result(mysql_query($query_total_users, $db),0);
$total_pgs = ceil($totals / $max_results);
?

?php
$query_UserLastLogin = SELECT * FROM users WHERE UserLastLogin LIKE  
'$fieldTwentyOne' ;
$UserLastLogin = mysql_query($query_UserLastLogin, $db) or die 
(mysql_error());
if(!get_magic_quotes_gpc()) { $UserLastLogin = stripslashes 
($UserLastLogin); }

$row_UserLastLogin = mysql_fetch_assoc($UserLastLogin);
?

?php
/// Page limiter  result builder

// Access table properties

$query_users = SELECT * FROM users LIMIT $min, $max_results;
$result = mysql_query($query_users, $db) or die(mysql_error());
$num_sql = mysql_numrows($result);

if  ($result) {

// Build paging
if($pg  1) {
$prev = ($pg - 1); // Previous Link
	$paging = a href='.$_SERVER['PHP_SELF'].?Submit=.$Submit.pg=. 
$prev.'Previous pagenbsp;/a;
	//$paging = a href=\{$_SERVER['PHP_SELF']}?pg=$prev\Previous  
page/a;

}


for($j = 1; $j = $total_pgs; $j++) { /// Numbers
	$paging .= a href='.$_SERVER['PHP_SELF'].?Submit=. 
$Submit.pg=.$j.'nbsp;.$j.nbsp;/a;

//$paging .= a href=\{$_SERVER['PHP_SELF']}?pg=$ij\$j/a ; }}
}

if($pg  $total_pgs) {
$next = ($pg + 1); // Next Link
	$paging .= a href='.$_SERVER['PHP_SELF'].?Submit=. 
$Submit.pg=.$next.'nbsp;Next page/a;

}
?

//

In my html I have a table cel displaying info

For the page numbers:

td colspan=22 width=90% align=left valign=top  
bgcolor=#5E5E5Efont size=2 face=Verdana, Arial, Helvetica,  
sans-serifnbsp;nbsp;p align=left?php echo $paging?/p/td


For showing current page and database totals:

td colspan=22 width=10% align=left valign=bottom  
bgcolor=#5E5E5Efont size=2 face=Verdana, Arial, Helvetica,  
sans-serifHere are the results:brNum_sql Rows: ?php echo  
$num_sql?brNumber of Users: ?php echo $totals?brTotal Pages: ? 
php echo $total_pgs?brNumber of Results: ?php echo $totals? 
brViewing page ?php echo $pg? of ?php echo $total_pgs?br/td


Then I close the html and php

?php
} // End if($Submit)
?

Use this if you want, I took bits and pieces and put this together  
for you, but hope that helps.


Karl DeSaulniers
Design Drumm
http://designdrumm.com