Forum: Ruby Need help with a timing? problem

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
(Guest)
on 2006-12-29 16:36
(Received via mailing list)
I am running Ruby 1.8.5 and windows XP. I am working on a program that
monitors a directory and updates and updates a database based on the
changes. At the moment I have some code to handle files that are added.
Basically I have 3 methods:

Pseudo code

def monitor
   event_handler(array)
end

event_handler(array)
    p array
    If file is added
        file_added(arr)
   end
end

file_added(array)
  #Insert into database
end

Here's my problem. Let's say I drag 10 files into the directory. If I
only have the event_handler print the array I get all 10. However, when
the event_handler calls the file_added method I only get 5 or 6 files
inserted in the database. The code is not throwing exceptions.

Any ideas on how I can fix this? I can post the code if needed.

thanks,

Luis
Logan C. (Guest)
on 2006-12-29 16:46
(Received via mailing list)
On 12/29/06, removed_email_address@domain.invalid 
<removed_email_address@domain.invalid> wrote:
>
>
> Any ideas on how I can fix this? I can post the code if needed.


It's needed.

thanks,
Gavin K. (Guest)
on 2006-12-29 17:56
(Received via mailing list)
removed_email_address@domain.invalid wrote:
>
>
> Here's my problem. Let's say I drag 10 files into the directory. If I
> only have the event_handler print the array I get all 10. However, when
> the event_handler calls the file_added method I only get 5 or 6 files
> inserted in the database. The code is not throwing exceptions.

You'd better post code to your file_added method, and ensure that the
same array is getting passed in, and still has 10 items in it.
(Guest)
on 2006-12-29 20:15
(Received via mailing list)
The event_handler will pass 10 arrays to the file_added method. One for
each file. Here's the whole script

require 'dbi'
require 'yaml'
require 'win32/changenotify'
require 'win32/file'
include Win32

class Fsm

  attr_accessor :server, :db, :user, :password, :folder_to_watch,
:count

  def initialize(folder)

    dbconfig = YAML::load(IO.read('config.yml'))

    @server = dbconfig['server']
    @db = dbconfig['db']
    @user = dbconfig['user']
    @password = dbconfig['password']
    @folder_to_watch = folder
    @count = 0
    @dbh = DBI.connect("DBI:ADO:Provider=SQLNCLI; Data
Source=#{@server};Database=#{@db};uid=#{@user}; pwd=#{@password};
{'NonBlocking'=>true}")

  end

  def tmf_insert_new_file(name, length, creation_time, directory,
extension, fullname, is_read_only, last_access_time, last_write_time,
file_type, parent_directory)
   sql = "DECLARE	@return_value int EXEC	@return_value =
sp_UpdateMasterFileList @Name = ?,	@Length = ?,	@CreationTime =
?,	@DirectoryName = ?,	@Extension = ?,	@FullName =?,	@IsReadOnly =
?,	@LastAccessTime = ?,	@LastWriteTime = ?,	@FileType =
?,	@ParentDirectory = ? SELECT	'Return Value' = @return_value"

   myKey = ""
    sth = @dbh.execute(sql, name, length, creation_time, directory,
extension, fullname, is_read_only, last_access_time, last_write_time,
file_type, parent_directory)
    myKey = sth.fetch
    sth.finish

    @dbh.commit()

    return myKey.to_s

    rescue DBI::DatabaseError => e
     puts "An error occurred in tmf_insert_new_file"
     puts "Error code: #{e.err}"
     puts "Error message: #{e.errstr}"

  end

  def monitor
    filter = ChangeNotify::FILE_NAME | ChangeNotify::DIR_NAME |
ChangeNotify::LAST_WRITE

    cn = ChangeNotify.new(@folder_to_watch, true, filter)

    cn.wait{|arr|

      event_handler(arr)

    } while true

   rescue Exception => e
      puts e
  end

  def event_handler(arr)

    if arr[0][0].to_s.include? "added"
      #puts @count+=1
      #puts "Adding file " + arr[0][1].to_s
      file_added(arr)
    end

   rescue Exception => e
    puts e

  end

  def file_added(arr)

        date_format_str = "%Y%m%d %X"
        filename = arr[0][1].to_s

        if filename.include?"/"
          filename.gsub!("/","\\")
        end

        if @folder_to_watch.include?"/"
         @folder_to_watch.gsub!("/","\\")
        end

        fullname = @folder_to_watch + filename
        stat = File::Stat.new(fullname)
        file_type = File.ftype(fullname).capitalize
        dirname = File.dirname(fullname)

        if file_type.include? "File"

            myKey = tmf_insert_new_file(File.basename(filename),
stat.size, stat.ctime.strftime(date_format_str), dirname,
File.extname(fullname), fullname,0,
stat.atime.strftime(date_format_str),
stat.mtime.strftime(date_format_str), file_type,
File.dirname(fullname))

        else

          myKey = tmf_insert_new_file(File.basename(filename), 0,
stat.ctime.strftime(date_format_str), fullname, 'None', fullname, 0,
stat.atime.strftime(date_format_str),
stat.mtime.strftime(date_format_str), "Directory", dirname)

        end

    rescue Exception =>e
      puts "Error in file_added method."
      puts e

  end

end

MyFSM = Fsm.new('C:\\')
MyFSM.monitor()
This topic is locked and can not be replied to.