Need help with a timing? problem

L

lrlebron

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
 
P

Phrogz

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.

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.
 
L

lrlebron

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()
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,756
Messages
2,569,540
Members
45,025
Latest member
KetoRushACVFitness

Latest Threads

Top