From kato-k at rubyforge.org Mon Oct 1 06:31:44 2007 From: kato-k at rubyforge.org (kato-k at rubyforge.org) Date: Mon, 1 Oct 2007 06:31:44 -0400 (EDT) Subject: [ap4r-devel] [324] trunk/ap4r: Added: ActiveRecord support for queue and topic tables. Message-ID: <20071001103144.5A4C35240A2E@rubyforge.org> Revision: 324 Author: kato-k Date: 2007-10-01 06:31:43 -0400 (Mon, 01 Oct 2007) Log Message: ----------- Added: ActiveRecord support for queue and topic tables. Modified Paths: -------------- trunk/ap4r/History.txt trunk/ap4r/Rakefile trunk/ap4r/lib/ap4r/message_store_ext.rb trunk/ap4r/lib/ap4r/version.rb Modified: trunk/ap4r/History.txt =================================================================== --- trunk/ap4r/History.txt 2007-09-28 04:07:20 UTC (rev 323) +++ trunk/ap4r/History.txt 2007-10-01 10:31:43 UTC (rev 324) @@ -1,6 +1,9 @@ == 0.3.x -=== 0.3.3 (June ?, 2007) +=== 0.3.4 (October ?, 2007) +* Added: Support ActiveRecord as reliable RDBMS persistence. + +=== 0.3.3 (September 19, 2007) * Added: Support with hoe. * Added: Support PostgreSQL as reliable RDBMS persistence. * Added: Test supports, stub of queueing and service controls. Modified: trunk/ap4r/Rakefile =================================================================== --- trunk/ap4r/Rakefile 2007-09-28 04:07:20 UTC (rev 323) +++ trunk/ap4r/Rakefile 2007-10-01 10:31:43 UTC (rev 324) @@ -1,5 +1,7 @@ require 'rubygems' require 'hoe' +require 'erb' +require 'active_record' require File.join(File.dirname(__FILE__), 'lib/ap4r', 'version') namespace :hoe do @@ -136,3 +138,24 @@ ["Local specs", "spec/local"] ).to_s end + +namespace :qdb do + desc "Make queue and topic tables through scripts in lib/ap4r/db/migrate." + task :migrate do + + # Todo: configurable file name, 2007/10/01 kiwamu + ap4r_config_file = "config/queues_ar.cfg" + ap4r_config = YAML::load(ERB.new(IO.read(ap4r_config_file)).result) + database_config = ap4r_config["store"] + if database_config["type"].starts_with?("activerecord") + database_config["adapter"] = database_config["type"].split("_").last.downcase + else + # Todo + end + ActiveRecord::Base.logger = Logger.new(STDOUT) + ActiveRecord::Base.establish_connection(database_config) + + ActiveRecord::Migrator.migrate("lib/ap4r/db/migrate/", ENV["VERSION"] ? ENV["VERSION"].to_i : nil) + end +end + Modified: trunk/ap4r/lib/ap4r/message_store_ext.rb =================================================================== --- trunk/ap4r/lib/ap4r/message_store_ext.rb 2007-09-28 04:07:20 UTC (rev 323) +++ trunk/ap4r/lib/ap4r/message_store_ext.rb 2007-10-01 10:31:43 UTC (rev 324) @@ -30,6 +30,23 @@ } queue_and_created ? queue_and_created[0] : nil end + + # Returns a message store from the specified configuration (previously + # created with configure). + # + # :call-seq: + # Base::configure(config, logger) -> store + # + def self.configure config, logger + if config["type"].downcase.starts_with?("activerecord") + type = config["type"].downcase.split("_").first + else + type = config["type"].downcase + end + cls = @@stores[type] + raise RuntimeError, format(ERROR_INVALID_MESSAGE_STORE, type) unless cls + cls.new config, logger + end end @@ -200,7 +217,177 @@ end end + + rescue LoadError + # do nothing + end + + begin + # ActiveRecord + # Make sure we have a ActiveRecord library before creating this class, + # worst case we end up with a disk-based message store. + begin + require 'active_record' + require 'ap4r/reliable_msg_queue' + require 'ap4r/reliable_msg_topic' + rescue LoadError + require 'rubygems' + require 'activerecord' + require 'ap4r/reliable_msg_queue' + require 'ap4r/reliable_msg_topic' + end + + class ActiveRecordStore < Base #:nodoc: + + TYPE = "activerecord" + + @@stores[TYPE] = self + + # Default prefix for tables in the database. + DEFAULT_PREFIX = 'reliable_msg_'; + + # Reference to an open ActiveRecord connection held in the current thread. + THREAD_CURRENT_ACTIVE_RECORD = :reliable_msg_active_record #:nodoc: + + + def initialize config, logger + super logger + @config = { :adapter=>config['type'].split('_').last.downcase, + :host=>config['host'], :username=>config['username'], :password=>config['password'], + :database=>config['database'], :port=>config['port'], :socket=>config['socket'] } + @prefix = config['prefix'] || DEFAULT_PREFIX + @queues_table = "#{@prefix}queues" + @topics_table = "#{@prefix}topics" + establish_connection + end + + + def type + TYPE + end + + + # Todo: implement calling migration logic. 2007/10/01 kiwamu + def setup + end + + + def configuration + config = { "type"=>TYPE, "host"=>@config[:host], "username"=>@config[:username], + "password"=>@config[:password], "database"=>@config[:database] } + config["port"] = @config[:port] if @config[:port] + config["socket"] = @config[:socket] if @config[:socket] + config["prefix"] = @config[:prefix] if @config[:prefix] + config + end + + + def activate + super + load_index + end + + + def deactivate + Thread.list.each do |thread| + if conn = thread[THREAD_CURRENT_ACTIVE_RECORD] + thread[THREAD_CURRENT_ACTIVE_RECORD] = nil + conn.close + end + end + super + end + + + protected + + def update inserts, deletes, dlqs + begin + inserts.each do |insert| + if insert[:queue] + ::Ap4r::ReliableMsgQueue.new( + :message_id => insert[:id], + :queue => insert[:queue], + :headers => Marshal::dump(insert[:headers]), + :object => insert[:message]).save! + else + ::Ap4r::ReliableMsgTopic.new( + :topic => insert[:topic], + :headers => Marshal::dump(insert[:headers]), + :object => insert[:message]).save! + end + end + ids = deletes.inject([]) do |array, delete| + delete[:queue] ? array << "#{delete[:id]}" : array + end + if !ids.empty? + # TODO: Use IN clause 2007/10/01 kiwamu + ids.each do |id| + ::Ap4r::ReliableMsgQueue.delete_all(:message_id => id) + end + end + dlqs.each do |dlq| + dlq_message = ::Ap4r::ReliableMsgQueue.find(:first, :conditions => { :message_id => dlq[:id] }) + dlq_message.queue = Queue::DLQ + dlq_message.save! + end + rescue Exception=>error + raise error + end + super + + end + + + def load_index + ::Ap4r::ReliableMsgQueue.find(:all).each do |message| + queue = @queues[message[:queue]] ||= [] + headers = Marshal::load(message[:headers]) + # Add element based on priority, higher priority comes first. + priority = headers[:priority] + added = false + queue.each_index do |idx| + if queue[idx][:priority] < priority + queue[idx, 0] = headers + added = true + break + end + end + queue << headers unless added + end + + ::Ap4r::ReliableMsgTopic.find(:all).each do |message| + @topocs[message[:topic]] = Marshal::load(message[:headers]) + end + end + + + def load id, type, queue_or_topic + object = nil + if type == :queue + message = ::Ap4r::ReliableMsgQueue.find(:first, :conditions => { :message_id => id }) + object = message.object + else + message = ::Ap4r::ReliableMsgTopic.find(:first, :conditions => { :topic => queue_or_topic }) + object = message.object + end + object + end + + + def establish_connection + ActiveRecord::Base.establish_connection( + :adapter => @config[:adapter], + :host => @config[:host], + :username => @config[:username], + :password => @config[:password], + :database => @config[:database] + ) + end + + end + rescue LoadError # do nothing end Modified: trunk/ap4r/lib/ap4r/version.rb =================================================================== --- trunk/ap4r/lib/ap4r/version.rb 2007-09-28 04:07:20 UTC (rev 323) +++ trunk/ap4r/lib/ap4r/version.rb 2007-10-01 10:31:43 UTC (rev 324) @@ -8,7 +8,7 @@ module VERSION #:nodoc: MAJOR = 0 MINOR = 3 - TINY = 3 + TINY = 4 STRING = [MAJOR, MINOR, TINY].join('.') end From kato-k at rubyforge.org Mon Oct 1 21:48:22 2007 From: kato-k at rubyforge.org (kato-k at rubyforge.org) Date: Mon, 1 Oct 2007 21:48:22 -0400 (EDT) Subject: [ap4r-devel] [325] trunk/ap4r: Added: config file to use ActiveRecord and migration files. Message-ID: <20071002014822.E69EC5240DB5@rubyforge.org> Revision: 325 Author: kato-k Date: 2007-10-01 21:48:21 -0400 (Mon, 01 Oct 2007) Log Message: ----------- Added: config file to use ActiveRecord and migration files. Added Paths: ----------- trunk/ap4r/config/queues_ar.cfg trunk/ap4r/lib/ap4r/db/ trunk/ap4r/lib/ap4r/db/migrate/ trunk/ap4r/lib/ap4r/db/migrate/001_reliable_msg_queue_and_topic.rb trunk/ap4r/lib/ap4r/reliable_msg_queue.rb trunk/ap4r/lib/ap4r/reliable_msg_topic.rb Added: trunk/ap4r/config/queues_ar.cfg =================================================================== --- trunk/ap4r/config/queues_ar.cfg (rev 0) +++ trunk/ap4r/config/queues_ar.cfg 2007-10-02 01:48:21 UTC (rev 325) @@ -0,0 +1,20 @@ +--- +store: + type: activerecord_sqlite3 + host: localhost + database: reliable_msg.db + username: ap4r + password: ap4r +# dbfile: memory +drb: + host: + port: 6438 + acl: allow 127.0.0.1 allow ::1 allow 10.0.0.0/8 +dispatchers: + - + targets: queue.* + threads: 1 +#carriers: +# - +# source_uri: druby://another.host.local:6438 +# threads: 1 Added: trunk/ap4r/lib/ap4r/db/migrate/001_reliable_msg_queue_and_topic.rb =================================================================== --- trunk/ap4r/lib/ap4r/db/migrate/001_reliable_msg_queue_and_topic.rb (rev 0) +++ trunk/ap4r/lib/ap4r/db/migrate/001_reliable_msg_queue_and_topic.rb 2007-10-02 01:48:21 UTC (rev 325) @@ -0,0 +1,22 @@ +class ReliableMsgQueueAndTopic < ActiveRecord::Migration + + def self.up + create_table :reliable_msg_queues do |t| + t.column "message_id", :string + t.column "queue", :string + t.column "headers", :binary + t.column "object", :binary + end + + create_table :reliable_msg_topics do |t| + t.column "topic", :string + t.column "headers", :binary + t.column "object", :binary + end + end + + def self.down + drop_table :reliable_msg_queues + drop_table :reliable_msg_topics + end +end Added: trunk/ap4r/lib/ap4r/reliable_msg_queue.rb =================================================================== --- trunk/ap4r/lib/ap4r/reliable_msg_queue.rb (rev 0) +++ trunk/ap4r/lib/ap4r/reliable_msg_queue.rb 2007-10-02 01:48:21 UTC (rev 325) @@ -0,0 +1,4 @@ +module Ap4r + class ReliableMsgQueue < ActiveRecord::Base + end +end Added: trunk/ap4r/lib/ap4r/reliable_msg_topic.rb =================================================================== --- trunk/ap4r/lib/ap4r/reliable_msg_topic.rb (rev 0) +++ trunk/ap4r/lib/ap4r/reliable_msg_topic.rb 2007-10-02 01:48:21 UTC (rev 325) @@ -0,0 +1,4 @@ +module Ap4r + class ReliableMsgTopic < ActiveRecord::Base + end +end From noreply at rubyforge.org Tue Oct 2 20:31:55 2007 From: noreply at rubyforge.org (noreply at rubyforge.org) Date: Tue, 2 Oct 2007 20:31:55 -0400 (EDT) Subject: [ap4r-devel] [Task #1692] Incorporate retry delay Message-ID: <20071003003155.A7B3FA970005@rubyforge.org> Task #1692 has been updated. Project: AP4R Subproject: To Do Summary: Incorporate retry delay Complete: 0% Status: Open Description: [ap4r-user] A few neophyte questions ==== > Btw, I've had the same issue happen when restarting a queue. I think > it would be nice to add in a retry delay to the ap4 client. ==== http://rubyforge.org/pipermail/ap4r-user/2007-October/000021.html ------------------------------------------------------- For more info, visit: http://rubyforge.org/pm/task.php?func=detailtask&project_task_id=1692&group_id=1765&group_project_id=2144 From kato-k at rubyforge.org Thu Oct 4 01:04:06 2007 From: kato-k at rubyforge.org (kato-k at rubyforge.org) Date: Thu, 4 Oct 2007 01:04:06 -0400 (EDT) Subject: [ap4r-devel] [326] trunk/ap4r: Modified: the setting method of AR adapter and so on. Message-ID: <20071004050406.615225240F0C@rubyforge.org> Revision: 326 Author: kato-k Date: 2007-10-04 01:04:02 -0400 (Thu, 04 Oct 2007) Log Message: ----------- Modified: the setting method of AR adapter and so on. Modified Paths: -------------- trunk/ap4r/Rakefile trunk/ap4r/config/queues_ar.cfg trunk/ap4r/lib/ap4r/message_store_ext.rb Modified: trunk/ap4r/Rakefile =================================================================== --- trunk/ap4r/Rakefile 2007-10-02 01:48:21 UTC (rev 325) +++ trunk/ap4r/Rakefile 2007-10-04 05:04:02 UTC (rev 326) @@ -147,8 +147,8 @@ ap4r_config_file = "config/queues_ar.cfg" ap4r_config = YAML::load(ERB.new(IO.read(ap4r_config_file)).result) database_config = ap4r_config["store"] - if database_config["type"].starts_with?("activerecord") - database_config["adapter"] = database_config["type"].split("_").last.downcase + if "activerecord" == database_config["type"].downcase + database_config["adapter"] = database_config["adapter"].downcase else # Todo end Modified: trunk/ap4r/config/queues_ar.cfg =================================================================== --- trunk/ap4r/config/queues_ar.cfg 2007-10-02 01:48:21 UTC (rev 325) +++ trunk/ap4r/config/queues_ar.cfg 2007-10-04 05:04:02 UTC (rev 326) @@ -1,11 +1,11 @@ --- store: - type: activerecord_sqlite3 + type: activerecord + adapter: sqlite3 host: localhost database: reliable_msg.db username: ap4r password: ap4r -# dbfile: memory drb: host: port: 6438 Modified: trunk/ap4r/lib/ap4r/message_store_ext.rb =================================================================== --- trunk/ap4r/lib/ap4r/message_store_ext.rb 2007-10-02 01:48:21 UTC (rev 325) +++ trunk/ap4r/lib/ap4r/message_store_ext.rb 2007-10-04 05:04:02 UTC (rev 326) @@ -253,7 +253,7 @@ def initialize config, logger super logger - @config = { :adapter=>config['type'].split('_').last.downcase, + @config = { :adapter=>config['adapter'], :host=>config['host'], :username=>config['username'], :password=>config['password'], :database=>config['database'], :port=>config['port'], :socket=>config['socket'] } @prefix = config['prefix'] || DEFAULT_PREFIX @@ -264,7 +264,7 @@ def type - TYPE + TYPE + " (#{@config[:adapter]})" end @@ -274,8 +274,8 @@ def configuration - config = { "type"=>TYPE, "host"=>@config[:host], "username"=>@config[:username], - "password"=>@config[:password], "database"=>@config[:database] } + config = { "type"=>TYPE, "adapter"=>@config[:adapter], "host"=>@config[:host], + "username"=>@config[:username], "password"=>@config[:password], "database"=>@config[:database] } config["port"] = @config[:port] if @config[:port] config["socket"] = @config[:socket] if @config[:socket] config["prefix"] = @config[:prefix] if @config[:prefix] From kato-k at rubyforge.org Fri Oct 5 03:57:33 2007 From: kato-k at rubyforge.org (kato-k at rubyforge.org) Date: Fri, 5 Oct 2007 03:57:33 -0400 (EDT) Subject: [ap4r-devel] [327] trunk/ap4r/lib/ap4r/message_store_ext.rb: Added: a message store which is on memory. Message-ID: <20071005075733.091FA5240EF5@rubyforge.org> Revision: 327 Author: kato-k Date: 2007-10-05 03:57:32 -0400 (Fri, 05 Oct 2007) Log Message: ----------- Added: a message store which is on memory. It's volatile, but fast. Modified Paths: -------------- trunk/ap4r/lib/ap4r/message_store_ext.rb Modified: trunk/ap4r/lib/ap4r/message_store_ext.rb =================================================================== --- trunk/ap4r/lib/ap4r/message_store_ext.rb 2007-10-04 05:04:02 UTC (rev 326) +++ trunk/ap4r/lib/ap4r/message_store_ext.rb 2007-10-05 07:57:32 UTC (rev 327) @@ -264,7 +264,7 @@ def type - TYPE + " (#{@config[:adapter]})" + "#{TYPE} (#{@config[:adapter]})" end @@ -392,6 +392,68 @@ # do nothing end + + class Memory < Base #:nodoc: + + TYPE = self.name.split('::').last.downcase + + @@stores[TYPE] = self + + DEFAULT_CONFIG = { + "type"=>TYPE, + } + + def initialize config, logger + super logger + # memory_map maps messages (by ID) to memory. The value is messege object. + @memory_map = {} + end + + + def type + TYPE + end + + + def setup + # do nothing + end + + + def configuration + { "type"=>TYPE } + end + + + def activate + super + end + + + def deactivate + @memory_map = nil + super + end + + + protected + + def update inserts, deletes, dlqs + inserts.each do |insert| + @mutex.synchronize do + @memory_map[insert[:id]] = insert[:message] + end + end + super + @mutex.synchronize do + deletes.each do |delete| + @memory_map.delete(delete[:id]) + end + end + end + + end + end end From tom at infoether.com Wed Oct 17 09:34:34 2007 From: tom at infoether.com (Tom Copeland) Date: Wed, 17 Oct 2007 09:34:34 -0400 Subject: [ap4r-devel] Merely a test Message-ID: <1192628074.2906.6.camel@bugs.hal> Testing... Tom From shinohara.shunichi at future.co.jp Wed Oct 17 20:11:24 2007 From: shinohara.shunichi at future.co.jp (shinohara.shunichi at future.co.jp) Date: Thu, 18 Oct 2007 09:11:24 +0900 Subject: [ap4r-devel] Merely a test In-Reply-To: <1192628074.2906.6.camel@bugs.hal> References: <1192628074.2906.6.camel@bugs.hal> Message-ID: <14CE73B79D552644B7CBEF0428763DF60356E7EF@045MAIL.future.co.jp> reply test Sorry for annoyance. shino > -----Original Message----- > From: ap4r-devel-bounces at rubyforge.org > [mailto:ap4r-devel-bounces at rubyforge.org] On Behalf Of Tom Copeland > Sent: Wednesday, October 17, 2007 10:35 PM > To: ap4r-devel at rubyforge.org > Subject: [ap4r-devel] Merely a test > > Testing... > > Tom > > _______________________________________________ > ap4r-devel mailing list > ap4r-devel at rubyforge.org > http://rubyforge.org/mailman/listinfo/ap4r-devel > From shino at rubyforge.org Wed Oct 17 21:10:26 2007 From: shino at rubyforge.org (shino at rubyforge.org) Date: Wed, 17 Oct 2007 21:10:26 -0400 (EDT) Subject: [ap4r-devel] [337] trunk/ap4r/lib/ap4r/dispatcher.rb: Fix: typo Message-ID: <20071018011026.B743618585FC@rubyforge.org> Revision: 337 Author: shino Date: 2007-10-17 21:10:26 -0400 (Wed, 17 Oct 2007) Log Message: ----------- Fix: typo Modified Paths: -------------- trunk/ap4r/lib/ap4r/dispatcher.rb Modified: trunk/ap4r/lib/ap4r/dispatcher.rb =================================================================== --- trunk/ap4r/lib/ap4r/dispatcher.rb 2007-10-17 08:22:24 UTC (rev 336) +++ trunk/ap4r/lib/ap4r/dispatcher.rb 2007-10-18 01:10:26 UTC (rev 337) @@ -325,8 +325,8 @@ # Dispatches via druby protocol with the implementation DRb. # # The call result is judged as - # * "success" if finishes normally (without exception) - # * "failuar" if finishes by exception + # * "success" if finishes normally (without an exception) + # * "failuer" if finishes with an exception # class DRb < Base dispatch_mode :druby From shino at rubyforge.org Wed Oct 17 22:53:48 2007 From: shino at rubyforge.org (shino at rubyforge.org) Date: Wed, 17 Oct 2007 22:53:48 -0400 (EDT) Subject: [ap4r-devel] [338] trunk/ap4r/lib/ap4r/dispatcher.rb: Modify: change DRb dispatcher' s class name, Message-ID: <20071018025348.67E3518585F9@rubyforge.org> Revision: 338 Author: shino Date: 2007-10-17 22:53:47 -0400 (Wed, 17 Oct 2007) Log Message: ----------- Modify: change DRb dispatcher's class name, from DRb to Druby (the same name as a corresponding converter). Modified Paths: -------------- trunk/ap4r/lib/ap4r/dispatcher.rb Modified: trunk/ap4r/lib/ap4r/dispatcher.rb =================================================================== --- trunk/ap4r/lib/ap4r/dispatcher.rb 2007-10-18 01:10:26 UTC (rev 337) +++ trunk/ap4r/lib/ap4r/dispatcher.rb 2007-10-18 02:53:47 UTC (rev 338) @@ -328,7 +328,7 @@ # * "success" if finishes normally (without an exception) # * "failuer" if finishes with an exception # - class DRb < Base + class Druby < Base dispatch_mode :druby def invoke From shino at rubyforge.org Wed Oct 17 23:00:49 2007 From: shino at rubyforge.org (shino at rubyforge.org) Date: Wed, 17 Oct 2007 23:00:49 -0400 (EDT) Subject: [ap4r-devel] [339] trunk/samples/HelloWorld/vendor/plugins/ap4r/lib/async_helper.rb: Modify: default queue prefix for druby dispatcher, Message-ID: <20071018030049.3DA7B18585F9@rubyforge.org> Revision: 339 Author: shino Date: 2007-10-17 23:00:48 -0400 (Wed, 17 Oct 2007) Log Message: ----------- Modify: default queue prefix for druby dispatcher, from queue.drb_default. to queue.druby. For simplisity. Modified Paths: -------------- trunk/samples/HelloWorld/vendor/plugins/ap4r/lib/async_helper.rb Modified: trunk/samples/HelloWorld/vendor/plugins/ap4r/lib/async_helper.rb =================================================================== --- trunk/samples/HelloWorld/vendor/plugins/ap4r/lib/async_helper.rb 2007-10-18 02:53:47 UTC (rev 338) +++ trunk/samples/HelloWorld/vendor/plugins/ap4r/lib/async_helper.rb 2007-10-18 03:00:48 UTC (rev 339) @@ -299,7 +299,7 @@ @rm_options[:queue] = [AsyncHelper::Base.default_queue_prefix.chomp("."), - @url_options[OPTION_KEY].to_s || "drb_default", + @url_options[OPTION_KEY].to_s || "druby", @url_options[:message].to_s].join(".") @rm_options[:queue] end From kato-k at rubyforge.org Wed Oct 31 07:18:22 2007 From: kato-k at rubyforge.org (kato-k at rubyforge.org) Date: Wed, 31 Oct 2007 07:18:22 -0400 (EDT) Subject: [ap4r-devel] [340] trunk/ap4r/History.txt: Added comment. Message-ID: <20071031111822.908CE18585D5@rubyforge.org> Revision: 340 Author: kato-k Date: 2007-10-31 07:18:21 -0400 (Wed, 31 Oct 2007) Log Message: ----------- Added comment. Modified Paths: -------------- trunk/ap4r/History.txt Modified: trunk/ap4r/History.txt =================================================================== --- trunk/ap4r/History.txt 2007-10-18 03:00:48 UTC (rev 339) +++ trunk/ap4r/History.txt 2007-10-31 11:18:21 UTC (rev 340) @@ -1,10 +1,11 @@ == 0.3.x -=== 0.3.4 (October ?, 2007) +=== 0.3.4 (October 31, 2007) * Added: Support ActiveRecord as reliable RDBMS persistence. * Added: Capistrano recipes. * Added: A dispatcher via druby. Based on a patch from Kouhei Sutou . +* Added: Support memory queue which is volatile. === 0.3.3 (September 19, 2007) * Added: Support with hoe. From kato-k at rubyforge.org Wed Oct 31 07:54:47 2007 From: kato-k at rubyforge.org (kato-k at rubyforge.org) Date: Wed, 31 Oct 2007 07:54:47 -0400 (EDT) Subject: [ap4r-devel] [341] tags/ap4r-0.3.4/: tag 0.3.4 Message-ID: <20071031115447.61F9418585CB@rubyforge.org> Revision: 341 Author: kato-k Date: 2007-10-31 07:54:46 -0400 (Wed, 31 Oct 2007) Log Message: ----------- tag 0.3.4 Added Paths: ----------- tags/ap4r-0.3.4/ Copied: tags/ap4r-0.3.4 (from rev 340, trunk)