patches to make token= match on regular expressions

Mike Wohlgemuth <[email protected]> 30 Aug 2002 19:09:11 -0400
Newsgroups gmane.comp.apache.mod-mp3
Message-ID <[email protected]>
A bit back, someone was asking on the list if it was possible to match
on multiple tokens and randomly stream from them.  These patches allow
for that.  I have included 2 files, one to patch mysql_dispatch.h and
one to patch pgsql_dispatch.h.  I've only tested with mysql, since that
is all I have locally, but baring any typos, the pqsql changes should
work fine as well.

These patches do 2 things:

1.  Remove the LIMIT 1 from any random select statement.  I'm not sure
what the reason is for having it there, but I always want more than one
file back when randomly streaming.

2.  Change any SQL statement that has token = \"%s\" in the where clause
to do a regex match instead of an equality check.  For mysql a regex
looks like token REGEXP \"%s\", for pgsql, it looks like token ~*
\"%s\".  I've used case insensitive regexes.  To do case sensitive
regexes, it would be token REGEXP BINARY \"%s\" for mysql and token ~
\"%s\" for pgsql.  This lets us specify things like

token=^rock

to play all files with a token beginning with rock, or

token=^(rock|jazz)$ to play all files with tokens of rock or jazz.

Woogie
pgsql_dispatch.h.patch (text/x-patch, 3.2 KB)
*** pgsql_dispatch.h.orig	Fri Aug 30 17:40:44 2002
--- pgsql_dispatch.h	Fri Aug 30 17:41:20 2002
***************
*** 3,18 ****
  */
  
  #define PG_MP3_GET "SELECT name,filename,signature,artist,album,comment,track,year,genre FROM %s WHERE signature = '%s'"
! #define PG_MP3_GET_RANDOM "SELECT name,filename,signature,artist,album,comment,track,year,genre FROM %s ORDER BY round(random()*1000) LIMIT 1"
  #define PG_MP3_INSERT "INSERT IGNORE INTO %s (name,filename,signature,artist,album,comment,track,year,genre) VALUES ('%s','%s','%s','%s','%s','%s','%s','%s','%s')"
  
  #define PG_MP3_GETS "SELECT name,filename,signature,artist,album,comment,track,year,genre FROM %s"
  #define PG_MP3_GET_LIST "SELECT name,filename,signature,artist,album,comment,track,year,genre FROM %s WHERE signature IN (%s)"
! #define PG_MP3_GETS_TOKEN "SELECT name,filename,signature,artist,album,comment,track,year,genre FROM %s,%s WHERE token = \"%s\" AND signature = for_signature"
  
! #define PG_MP3_GETS_RANDOM "SELECT name,filename,signature,artist,album,comment,track,year,genre FROM %s ORDER BY round(random()*1000) LIMIT 1"
! #define PG_MP3_GET_LIST_RANDOM "SELECT name,filename,signature,artist,album,comment,track,year,genre FROM %s WHERE signature IN (%s) ORDER BY round(random()*1000) LIMIT 1"
! #define PG_MP3_GETS_TOKEN_RANDOM "SELECT name,filename,signature,artist,album,comment,track,year,genre FROM %s,%s WHERE token = \"%s\" AND signature = for_signature ORDER BY round(random()*1000) LIMIT 1"
  
  #define PG_MP3_GETS_COUNT "SELECT count(signature) FROM %s"
  #define PG_MP3_GET_LIST_COUNT "SELECT name,filename,signature,artist,album,comment,track,year,genre FROM %s WHERE signature IN (%s)"
--- 3,18 ----
  */
  
  #define PG_MP3_GET "SELECT name,filename,signature,artist,album,comment,track,year,genre FROM %s WHERE signature = '%s'"
! #define PG_MP3_GET_RANDOM "SELECT name,filename,signature,artist,album,comment,track,year,genre FROM %s ORDER BY round(random()*1000)"
  #define PG_MP3_INSERT "INSERT IGNORE INTO %s (name,filename,signature,artist,album,comment,track,year,genre) VALUES ('%s','%s','%s','%s','%s','%s','%s','%s','%s')"
  
  #define PG_MP3_GETS "SELECT name,filename,signature,artist,album,comment,track,year,genre FROM %s"
  #define PG_MP3_GET_LIST "SELECT name,filename,signature,artist,album,comment,track,year,genre FROM %s WHERE signature IN (%s)"
! #define PG_MP3_GETS_TOKEN "SELECT name,filename,signature,artist,album,comment,track,year,genre FROM %s,%s WHERE token ~* \"%s\" AND signature = for_signature"
  
! #define PG_MP3_GETS_RANDOM "SELECT name,filename,signature,artist,album,comment,track,year,genre FROM %s ORDER BY round(random()*1000)"
! #define PG_MP3_GET_LIST_RANDOM "SELECT name,filename,signature,artist,album,comment,track,year,genre FROM %s WHERE signature IN (%s) ORDER BY round(random()*1000)"
! #define PG_MP3_GETS_TOKEN_RANDOM "SELECT name,filename,signature,artist,album,comment,track,year,genre FROM %s,%s WHERE token ~* \"%s\" AND signature = for_signature ORDER BY round(random()*1000)"
  
  #define PG_MP3_GETS_COUNT "SELECT count(signature) FROM %s"
  #define PG_MP3_GET_LIST_COUNT "SELECT name,filename,signature,artist,album,comment,track,year,genre FROM %s WHERE signature IN (%s)"
mysql_dispatch.h.patch (text/x-patch, 3.2 KB)
*** mysql_dispatch.h.orig	Fri Aug 30 17:40:30 2002
--- mysql_dispatch.h	Fri Aug 30 17:41:20 2002
***************
*** 6,21 ****
  #define MP3_MAX_VARCHAR 255
  
  #define MYSQL_MP3_GET "SELECT name,filename,signature,artist,album,comment,track,year,genre FROM %s WHERE signature = '%s'"
! #define MYSQL_MP3_GET_RANDOM "SELECT name,filename,signature,artist,album,comment,track,year,genre FROM %s ORDER BY RAND() LIMIT 1"
  #define MYSQL_MP3_INSERT "INSERT IGNORE INTO %s (name,filename,signature,artist,album,comment,track,year,genre) VALUES ('%s','%s','%s','%s','%s','%s','%s','%s','%s')"
  
  #define MYSQL_MP3_GETS "SELECT name,filename,signature,artist,album,comment,track,year,genre FROM %s"
  #define MYSQL_MP3_GET_LIST "SELECT name,filename,signature,artist,album,comment,track,year,genre FROM %s WHERE signature IN (%s)"
! #define MYSQL_MP3_GETS_TOKEN "SELECT name,filename,signature,artist,album,comment,track,year,genre FROM %s,%s WHERE token = \"%s\" AND signature = for_signature"
  
! #define MYSQL_MP3_GETS_RANDOM "SELECT name,filename,signature,artist,album,comment,track,year,genre FROM %s ORDER BY RAND() LIMIT 1"
! #define MYSQL_MP3_GET_LIST_RANDOM "SELECT name,filename,signature,artist,album,comment,track,year,genre FROM %s WHERE signature IN (%s) ORDER BY RAND() LIMIT 1"
! #define MYSQL_MP3_GETS_TOKEN_RANDOM "SELECT name,filename,signature,artist,album,comment,track,year,genre FROM %s,%s WHERE token = \"%s\" AND signature = for_signature ORDER BY RAND() LIMIT 1"
  
  #define MYSQL_MP3_GETS_COUNT "SELECT count(signature) FROM %s"
  #define MYSQL_MP3_GET_LIST_COUNT "SELECT name,filename,signature,artist,album,comment,track,year,genre FROM %s WHERE signature IN (%s)"
--- 6,21 ----
  #define MP3_MAX_VARCHAR 255
  
  #define MYSQL_MP3_GET "SELECT name,filename,signature,artist,album,comment,track,year,genre FROM %s WHERE signature = '%s'"
! #define MYSQL_MP3_GET_RANDOM "SELECT name,filename,signature,artist,album,comment,track,year,genre FROM %s ORDER BY RAND()"
  #define MYSQL_MP3_INSERT "INSERT IGNORE INTO %s (name,filename,signature,artist,album,comment,track,year,genre) VALUES ('%s','%s','%s','%s','%s','%s','%s','%s','%s')"
  
  #define MYSQL_MP3_GETS "SELECT name,filename,signature,artist,album,comment,track,year,genre FROM %s"
  #define MYSQL_MP3_GET_LIST "SELECT name,filename,signature,artist,album,comment,track,year,genre FROM %s WHERE signature IN (%s)"
! #define MYSQL_MP3_GETS_TOKEN "SELECT name,filename,signature,artist,album,comment,track,year,genre FROM %s,%s WHERE token REGEXP \"%s\" AND signature = for_signature"
  
! #define MYSQL_MP3_GETS_RANDOM "SELECT name,filename,signature,artist,album,comment,track,year,genre FROM %s ORDER BY RAND()"
! #define MYSQL_MP3_GET_LIST_RANDOM "SELECT name,filename,signature,artist,album,comment,track,year,genre FROM %s WHERE signature IN (%s) ORDER BY RAND()"
! #define MYSQL_MP3_GETS_TOKEN_RANDOM "SELECT name,filename,signature,artist,album,comment,track,year,genre FROM %s,%s WHERE token REGEXP \"%s\" AND signature = for_signature ORDER BY RAND()"
  
  #define MYSQL_MP3_GETS_COUNT "SELECT count(signature) FROM %s"
  #define MYSQL_MP3_GET_LIST_COUNT "SELECT name,filename,signature,artist,album,comment,track,year,genre FROM %s WHERE signature IN (%s)"