Class: Taggata::Scanner
- Inherits:
-
Object
- Object
- Taggata::Scanner
- Defined in:
- lib/taggata/scanner.rb
Instance Attribute Summary collapse
-
#db ⇒ Object
readonly
Returns the value of attribute db.
-
#jobs ⇒ Object
readonly
Returns the value of attribute jobs.
-
#progress ⇒ Object
readonly
Returns the value of attribute progress.
Instance Method Summary collapse
- #add_directory_jobs(dirs, parent_id) ⇒ Object
- #do_job(parent_id, path) ⇒ Object
- #find_in_db(klass, parent_id, names, param) ⇒ Object
-
#initialize(db) ⇒ Scanner
constructor
A new instance of Scanner.
- #process(dir) ⇒ Object
- #report ⇒ Object
- #report_header ⇒ Object
- #save_missing(files, parent_id, klass) ⇒ Object
Constructor Details
#initialize(db) ⇒ Scanner
Returns a new instance of Scanner.
6 7 8 9 10 |
# File 'lib/taggata/scanner.rb', line 6 def initialize(db) @db = db @jobs = [] @progress = { :files => 0, :directories => 0 } end |
Instance Attribute Details
#db ⇒ Object (readonly)
Returns the value of attribute db.
4 5 6 |
# File 'lib/taggata/scanner.rb', line 4 def db @db end |
#jobs ⇒ Object (readonly)
Returns the value of attribute jobs.
4 5 6 |
# File 'lib/taggata/scanner.rb', line 4 def jobs @jobs end |
#progress ⇒ Object (readonly)
Returns the value of attribute progress.
4 5 6 |
# File 'lib/taggata/scanner.rb', line 4 def progress @progress end |
Instance Method Details
#add_directory_jobs(dirs, parent_id) ⇒ Object
62 63 64 65 66 67 68 |
# File 'lib/taggata/scanner.rb', line 62 def add_directory_jobs(dirs, parent_id) ids = find_in_db Persistent::Directory, parent_id, dirs.map { |d| ::File.basename d }, :id ids.zip(dirs).each { |job| jobs << [job.first, job.last] } end |
#do_job(parent_id, path) ⇒ Object
31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 |
# File 'lib/taggata/scanner.rb', line 31 def do_job(parent_id, path) files, directories = Dir.glob(File.join(path, '*')) .sort .partition { |entry| ::File.file? entry } save_missing files.map { |f| ::File.basename f }, parent_id, Persistent::File unless files.empty? save_missing directories.map { |f| ::File.basename f }, parent_id, Persistent::Directory unless directories.empty? progress[:files] += files.length add_directory_jobs directories, parent_id unless directories.empty? progress[:directories] += 1 end |
#find_in_db(klass, parent_id, names, param) ⇒ Object
55 56 57 58 59 60 |
# File 'lib/taggata/scanner.rb', line 55 def find_in_db(klass, parent_id, names, param) db.adapter.db[klass.table] .where(:parent_id => parent_id) .where(:name => names) .map(param) end |
#process(dir) ⇒ Object
20 21 22 23 24 25 26 27 28 29 |
# File 'lib/taggata/scanner.rb', line 20 def process(dir) report_header db.transaction do jobs << [dir.id, dir.name] until jobs.empty? do_job *jobs.shift report end end end |
#report ⇒ Object
16 17 18 |
# File 'lib/taggata/scanner.rb', line 16 def report puts "#{progress[:files]}\t#{progress[:directories]}\t\t#{jobs.length}" end |
#report_header ⇒ Object
12 13 14 |
# File 'lib/taggata/scanner.rb', line 12 def report_header puts "Files\tDirectories\tQueued" end |
#save_missing(files, parent_id, klass) ⇒ Object
47 48 49 50 51 52 53 |
# File 'lib/taggata/scanner.rb', line 47 def save_missing(files, parent_id, klass) in_db = find_in_db(klass, parent_id, files, :name) to_save = (files - in_db).map do |basename| { :name => basename, :parent_id => parent_id } end db.adapter.db[klass.table].multi_insert(to_save) end |