[#33161] Call/CC and Ruby iterators. — olczyk@... (Thaddeus L Olczyk)

Reading about call/cc in Scheme I get the impression that it is very

11 messages 2002/02/05

[#33242] favicon.ico — Dave Thomas <Dave@...>

19 messages 2002/02/06
[#33256] Re: favicon.ico — Leon Torres <leon@...> 2002/02/06

[#33435] Reg: tiny contest: who's faster? (add_a_gram) — grady@... (Steven Grady)

> My current solution works correctly with various inputs.

17 messages 2002/02/08

[#33500] Ruby Embedded Documentation — William Djaja Tjokroaminata <billtj@...>

Hi,

24 messages 2002/02/10
[#33502] Re: Ruby Embedded Documentation — "Lyle Johnson" <ljohnson@...> 2002/02/10

> Now, I am using Ruby on Linux, and I have downloaded Ruby version

[#33615] Name resolution in Ruby — stern@... (Alan Stern)

I've been struggling to understand how name resolution is supposed to

16 messages 2002/02/11

[#33617] choice of HTML templating system — Paul Brannan <paul@...>

I am not a web developer, nor do I pretend to be one.

23 messages 2002/02/11

[#33619] make first letter lowercase — sebi@... (sebi)

hello,

20 messages 2002/02/11
[#33620] Re: [newbie] make first letter lowercase — Tobias Reif <tobiasreif@...> 2002/02/11

sebi wrote:

[#33624] Re: [newbie] make first letter lowercase — "Jeff 'japhy' Pinyan" <jeffp@...> 2002/02/11

On Feb 11, Tobias Reif said:

[#33632] Re: [newbie] make first letter lowercase — Mathieu Bouchard <matju@...> 2002/02/12

[#33731] simple XML parsing (greedy / non-greedy — Ron Jeffries <ronjeffries@...>

Suppose I had this text

14 messages 2002/02/13

[#33743] qualms about respond_to? idiom — David Alan Black <dblack@...>

Hi --

28 messages 2002/02/13
[#33751] Re: qualms about respond_to? idiom — Dave Thomas <Dave@...> 2002/02/13

David Alan Black <dblack@candle.superlink.net> writes:

[#33754] Re: qualms about respond_to? idiom — David Alan Black <dblack@...> 2002/02/13

Hi --

[#33848] "Powered by Ruby" banner — Yuri Leikind <YuriLeikind@...>

Hello Ruby folks,

78 messages 2002/02/14
[#33909] Re: "Powered by Ruby" banner — Leon Torres <leon@...> 2002/02/14

On Thu, 14 Feb 2002, Yuri Leikind wrote:

[#33916] RE: "Powered by Ruby" banner — "Jack Dempsey" <dempsejn@...> 2002/02/15

A modest submission:

[#33929] Re: "Powered by Ruby" banner — yet another bill smith <bigbill.smith@...> 2002/02/15

Kent Dahl wrote:

[#33932] OT Netscape 4.x? was Re: "Powered by Ruby" banner — Chris Gehlker <gehlker@...> 2002/02/15

On 2/15/02 5:54 AM, "yet another bill smith" <bigbill.smith@verizon.net>

[#33933] RE: OT Netscape 4.x? was Re: "Powered by Ruby" banner — "Jack Dempsey" <dempsejn@...> 2002/02/15

i just don't understand why it didn't show up! dhtml/javascript, ok, but a

[#33937] Re: OT Netscape 4.x? was Re: "Powered by Ruby" banner — Chris Gehlker <gehlker@...> 2002/02/15

On 2/15/02 7:16 AM, "Jack Dempsey" <dempsejn@georgetown.edu> wrote:

[#33989] Re: OT OmniWeb [was: Netscape 4.x?] — Sean Russell <ser@...> 2002/02/16

Chris Gehlker wrote:

[#33991] Re: OT OmniWeb [was: Netscape 4.x?] — Rob Partington <rjp@...> 2002/02/16

In message <3c6e5e01_1@spamkiller.newsgroups.com>,

[#33993] Re: OT OmniWeb [was: Netscape 4.x?] — Thomas Hurst <tom.hurst@...> 2002/02/16

* Rob Partington (rjp@browser.org) wrote:

[#33925] Re: "Powered by Ruby" banner — Martin Maciaszek <mmaciaszek@...> 2002/02/15

In article <3C6CFCCA.5AD5CA67@scnsoft.com>, Yuri Leikind wrote:

[#33956] Re: "Powered by Ruby" banner — Leon Torres <leon@...> 2002/02/15

On Fri, 15 Feb 2002, Martin Maciaszek wrote:

[#33851] Ruby and .NET — Patrik Sundberg <ps@...>

I have been reading a bit about .NET for the last couple of days and must say

53 messages 2002/02/14

[#34024] Compiled companion language for Ruby? — Erik Terpstra <erik@...>

Hmmm, seems that my previous post was in a different thread, I'll try

12 messages 2002/02/16

[#34036] The GUI Returns — "Horacio Lopez" <vruz@...>

Hello all,

33 messages 2002/02/17

[#34162] Epic4/Ruby — Thomas Hurst <tom.hurst@...>

Rejoice, for you no longer have to put up with that evil excuse for a

34 messages 2002/02/18

[#34185] Operator overloading and multiple arguments — ptkwt@...1.aracnet.com (Phil Tomson)

I'm trying to overload the '<=' operator in a class in order to use it for

10 messages 2002/02/18

[#34217] Ruby for web development — beripome@... (Billy)

Hi all,

21 messages 2002/02/19

[#34350] FAQ for comp.lang.ruby — "Hal E. Fulton" <hal9000@...>

RUBY NEWSGROUP FAQ -- Welcome to comp.lang.ruby! (Revised 2001-2-18)

15 messages 2002/02/20

[#34375] Setting the Ruby continued — <jostein.berntsen@...>

Hi,

24 messages 2002/02/20
[#34384] Re: Setting the Ruby continued — Paulo Schreiner <paulo@...> 2002/02/20

Also VERY important:

[#34467] recursive require — Ron Jeffries <ronjeffries@...>

I'm having a really odd thing happen with two files that mutually

18 messages 2002/02/21

[#34503] special characters — Tobias Reif <tobiasreif@...>

Hi all,

13 messages 2002/02/22

[#34517] Windows Installer Ruby 166-0 available — Andrew Hunt <andy@...>

16 messages 2002/02/22

[#34597] rdoc/xml questions — Dave Thomas <Dave@...>

24 messages 2002/02/23

[#34631] Object/Memory Management — "Sean O'Dell" <sean@...>

I'm new to Ruby and the community here (I've been learning Ruby for a grand

44 messages 2002/02/23

[#34682] duplicate method name — Ron Jeffries <ronjeffries@...>

I just found a case in a test file where i had two tests of the same

16 messages 2002/02/24
[#34687] Re: duplicate method name — s@... (Stefan Schmiedl) 2002/02/24

Hi Ron.

[#34791] Style Question — Ron Jeffries <ronjeffries@...>

So I'm building this set theory library. The "only" object is supposed

13 messages 2002/02/25

[#34912] RCR?: parallel to until: as_soon_as — Tobias Reif <tobiasreif@...>

Hi,

18 messages 2002/02/26

[#34972] OT A Question on work styles — Chris Gehlker <gehlker@...>

As a Mac baby I just had to step through ruby in GDB *from the command line*

20 messages 2002/02/28

[#35015] Time Comparison — "Sean O'Dell" <sean@...>

I am using the time object to compare times between two files and I'm

21 messages 2002/02/28

Postgress backend for CGI::Session

From: Stephen Schaefer <stephen_schaefer27517@...>
Date: 2002-02-08 21:17:46 UTC
List: ruby-talk #33437
I'd like to contribute this original code, and would
appreciate any critique.  I've used it successfully in
a re-implementation of the hangman program from
``Writing Apache Modules in Perl and C''.

I am not convinced this code will scale, and I'd like
to participate in a discussion of whether and how one
would pre-declare the structure of an appropriate
backend database.

In PostgreSQL 6.5 I used ``varchar'' for the fields
and field values; in PostgreSQL 7.1 I switch to
``text'' fields, since it would no longer cast
``varchar'' fields to integer or other numeric types. 
 Anyway, the code:



=begin
= Synopsis
   require pgsession.rb
   aSession = CGI::Session.new( aCGI,
      'database_manager' => CGI::Session::PostgreSQL,
      < aHash >* )
   value = aSession[key]
   aSession[key] = value
   aSession.delete
   aSession.update
= Description

This file extends the class (({CGI::Session})) to
support a PostgreSQL
backend.  It will be persistent in the same way that
(({CGI::Session::FileStore})) is, but uses a postgres
database named (({web})) with two tables defined as
follows:
 #!/bin/sh
 /usr/bin/psql web <<EOF
 DROP INDEX sess_val_idx;
 DROP TABLE session_mods;
 DROP TABLE session_values;

 CREATE TABLE session_mods (
   session_id   char(16) PRIMARY KEY,
   modified     timestamp
 );

 CREATE TABLE session_values (
   session_id   char(16) REFERENCES session_mods (
session_id )
     ON DELETE CASCADE
     ON UPDATE CASCADE,
   varname      text,
   varval       text
 );

 CREATE UNIQUE INDEX sess_val_idx ON session_values
(session_id, varname);
 EOF

Note that the (({REFERENCES})) clause is recognized
but not supported
in PostgreSQL 6.5; it may be supported in later
versions, but this
code does not depend on its PostgreSQL implementation.
 This
implementation supports a timestamp field named
(({modified})) within
the database, so that the database administrator has
an opportunity
(outside this class) to expire outdated sessions.  The
following text
extensively quotes the library descriptions found in
Thomas and Hunt's
((*Programming Ruby*)).

= Class Methods
--- CGI.Session.new( aCGI, aHash )
    Returns a new session object for the (({CGI}))
query.  Options that may be given in ((|aHash|))
include:
    : Option
      Description
    : (({session_key}))
      Name of CGI key for session identification.
    : (({session_id}))
      Value of session id.  The
(({CGI::Session::PostgreSQL})) implementation
      will pad or truncate this string to sixteen
characters.
    : (({new_session}))
      If (({true})), create a new session id for this
session.
    : (({database_manager}))
      Class to use to save sessions; may be
(({CGI::Session::FileStore})),
      (({CGI::Session::MemoryStore})) or
(({CGI::Session::PostgreSQL}))
      (or use defined if you're brave).  Default is
(({FileStore})).
    : (({tmpdir}))
      For (({FileStore})), directory for session
files.
    : (({prefix}))
      For (({FileStore})), prefix of session
filenames.

= Instance Methods
--- []
    Returns the value for the given key.

--- []=
    Sets the value for the given key.

--- delete
    Calls the (({delete})) method of the udnerlying
database manager.  For
    (({PostgreSQL})), deletes the database entries
corresponding to the
    session.  For (({FileStore})), deletes the
physical file containing the
    session.  For (({MemoryStore})), removes the
session from memory.

--- update
    Calls the (({update})) method of the underlying
database manager.  For
    (({PostreSQL})), replaces the table entries
corresponding to the session.
    For (({FileStore})), writes the session data out
to disk.  Has no effect
    with (({MemoryStore})).
  
=end

require 'cgi/session.rb'

class CGI
  class Session
    class PostgreSQL
      @@DBH = nil
      require "postgres"
      DB	= 'localhost'
      DB_PORT	= 5432
      DB_OPTIONS = nil
      DB_TTY = nil
      DB_NAME = "web"
      DB_PASSWORD = ""
      DB_SESS_TABLE = "session_mods"
      DB_VALS_TABLE = "session_values"
      def initialize(session, option={})
	if (!@@DBH)
	  begin
	    @@DBH = PGconn.connect(DB, DB_PORT, DB_OPTIONS,
DB_TTY, DB_NAME, DB_LOGIN, DB_PASSWORD) 
	  rescue PGError
	    $stderr.print "Database problem: " + $!
	    raise
	  end
	end

        @session_id = session.session_id[0..15]
	begin
	  r = @@DBH.exec("SELECT * FROM #{DB_SESS_TABLE}
WHERE session_id = '#{@session_id}'")
	rescue PGError
	  $stderr.print "Database problem: " + $!
	  raise
	end

	if r.num_tuples == 0
	  # normal case: new session id
	  @hash = {}
	  cmd =
"BEGIN;
  INSERT INTO #{DB_SESS_TABLE} (session_id, modified)
VALUES ( '#{@session_id}', 'now' );
  DELETE FROM #{DB_VALS_TABLE} WHERE session_id =
'#{@session_id}';
COMMIT"
	else
	  cmd ="UPDATE #{DB_SESS_TABLE} SET modified = 'now'
WHERE session_id = '#{@session_id}'"
	end

	begin
	  $stderr.print cmd + "\n"
	  @@DBH.exec("#{cmd}")
	rescue PGError
	  $stderr.print "Database problem: " + $!
	  raise
	end
      end

      def restore
	unless @hash
	  @hash = {}
	  begin
            cmd = "SELECT varname, varval FROM
#{DB_VALS_TABLE} WHERE session_id =
'#{@session_id}'\n"
	    $stderr.print cmd
	    r = @@DBH.exec(cmd)
	  rescue PGError
	    $stderr.print "Database problem: " + $!
	    raise
	  end
	  for i in 0 ... r.num_tuples
	    k = CGI::unescape(r.getvalue(i, 0))
	    v = CGI::unescape(r.getvalue(i, 1))
	    @hash[k] = v
	  end
	end
	@hash
      end

      def update
	cmd =
"BEGIN;
  DELETE FROM #{DB_VALS_TABLE} WHERE session_id =
'#{@session_id}';
"
	@hash.each {
	  | k, v |
	  cmd <<
"  INSERT INTO #{DB_VALS_TABLE} (session_id, varname,
varval)
    VALUES ( '#{@session_id}', '" +
    CGI::escape(k).gsub(/'/, "''") +
    "', '" +
    CGI::escape(v).gsub(/'/, "''") +
    "' );
"
	}
	cmd <<
"COMMIT\n"
        begin
	  $stderr.print cmd
	  @@DBH.exec(cmd)
	rescue
	  $stderr.print "Database problem: " + $!
	  raise
	end
      end

      def close
        begin
	  @@DBH.close
	rescue
	  $stderr.print "Database problem: " + $!
	  raise
	end
	@@DBH = nil
      end

      def delete
	cmd =
"BEGIN;
  DELETE FROM #{DB_VALS_TABLE} WHERE session_id =
'#{@session_id}';
  DELETE FROM #{DB_SESS_TABLE} WHERE session_id =
'#{@session_id}';
COMMIT
"
        begin
	  $stderr.print cmd
	  @@DBH.exec(cmd)
	rescue
	  $stderr.print "Database problem: " + $!
	  raise
	end
      end
    end
  end
end


__________________________________________________
Do You Yahoo!?
Send FREE Valentine eCards with Yahoo! Greetings!
http://greetings.yahoo.com

In This Thread

Prev Next