Class: Taggata::Scanner

Inherits:
Object
  • Object
show all
Defined in:
lib/taggata/scanner.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

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

#dbObject (readonly)

Returns the value of attribute db.



4
5
6
# File 'lib/taggata/scanner.rb', line 4

def db
  @db
end

#jobsObject (readonly)

Returns the value of attribute jobs.



4
5
6
# File 'lib/taggata/scanner.rb', line 4

def jobs
  @jobs
end

#progressObject (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

#reportObject



16
17
18
# File 'lib/taggata/scanner.rb', line 16

def report
  puts "#{progress[:files]}\t#{progress[:directories]}\t\t#{jobs.length}"
end

#report_headerObject



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