Completed
Push — master ( 082c99...1af50e )
by Valentin
02:15
created

cmd.poolWorker   A

Complexity

Conditions 5

Size

Total Lines 25
Code Lines 16

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 5
eloc 16
nop 3
dl 0
loc 25
rs 9.1333
c 0
b 0
f 0
1
package cmd
2
3
import (
4
	"github.com/spf13/cobra"
5
	"github.com/vvval/go-metadata-scanner/cmd/writecmd"
6
	"github.com/vvval/go-metadata-scanner/cmd/writecmd/operations"
7
	"github.com/vvval/go-metadata-scanner/config"
8
	"github.com/vvval/go-metadata-scanner/util"
9
	"github.com/vvval/go-metadata-scanner/util/log"
10
	"github.com/vvval/go-metadata-scanner/util/scan"
11
	"github.com/vvval/go-metadata-scanner/vars"
12
	"github.com/vvval/go-metadata-scanner/vars/metadata"
13
	"sync"
14
)
15
16
var (
17
	files      vars.Chunk
18
	filesData  []vars.File
19
	writeFlags writecmd.Flags
20
)
21
22
const poolSize int = 20
23
24
func init() {
25
	var cmd = &cobra.Command{
26
		Use:   "write",
27
		Short: "Read metadata from file and writer to images",
28
		Long: `Read metadata from file and writer to images.
29
Flags file should be a CSV file with comma-separated fields (or pass custom separator via "s" flag).
30
First column should be reserved for file names, its name is omitted.
31
Other columns should be named as keywords in a dict.yaml maps section provided
32
for proper mapping CSV data into appropriate metadata fields`,
33
		Run: writeHandler,
34
	}
35
36
	rootCmd.AddCommand(cmd)
37
	writeFlags.Fill(cmd)
38
}
39
40
func writeHandler(cmd *cobra.Command, args []string) {
41
	files = scan.MustDir(writeFlags.Directory(), config.App.Extensions())
42
43
	if writeFlags.Append() {
44
		log.Log("Scan files", "\"Append\" flag is enabled")
45
46
		var poolSize, chunkSize = util.AdjustSizes(len(files), PoolSize, MinChunkSize)
47
		filesData = operations.ScanFiles(files.Split(chunkSize), poolSize)
48
49
		log.Log("Scanned", "\n")
50
	}
51
52
	var wg sync.WaitGroup
53
	jobs := make(chan *writecmd.Job)
54
	writecmd.CreatePool(&wg, poolSize, jobs, func(job *writecmd.Job) ([]byte, error) {
55
		return writecmd.Work(job, writeFlags.Append(), writeFlags.Originals(), config.App.Extensions(), &files, &filesData)
56
	})
57
58
	file := util.MustOpenReadonlyFile(writeFlags.Filename())
59
	defer file.Close()
60
61
	operations.ReadCSV(file, writeFlags.Separator(), func(filename string, payload metadata.Payload) {
62
		wg.Add(1)
63
		jobs <- writecmd.NewJob(filename, payload)
64
	})
65
66
	wg.Wait()
67
	close(jobs)
68
69
	log.Log("Writing", "done")
70
}
71