示例#1
0
// fileMapper returns the filename of the map file for a given filename
func fileMapper(filename string) string {
	file, err := ioutil.TempFile("", "marcsnapshot-")
	if err != nil {
		log.Fatal(err)
	}
	defer func() {
		if err := file.Close(); err != nil {
			log.Fatal(err)
		}
	}()
	marctools.MarcMap(filename, file)
	return file.Name()
}
示例#2
0
func main() {

	version := flag.Bool("v", false, "prints current program version")
	output := flag.String("o", "", "output to sqlite3 file")
	cpuprofile := flag.String("cpuprofile", "", "write cpu profile to file")

	var PrintUsage = func() {
		fmt.Fprintf(os.Stderr, "Usage: %s [OPTIONS] MARCFILE\n", os.Args[0])
		flag.PrintDefaults()
	}

	flag.Parse()

	if *cpuprofile != "" {
		f, err := os.Create(*cpuprofile)
		if err != nil {
			log.Fatal(err)
		}
		pprof.StartCPUProfile(f)
		defer pprof.StopCPUProfile()
	}

	if *version {
		fmt.Println(marctools.AppVersion)
		os.Exit(0)
	}

	if flag.NArg() < 1 {
		PrintUsage()
		os.Exit(1)
	}

	filename := flag.Args()[0]

	if *output == "" {
		marctools.MarcMap(filename, os.Stdout)
	} else {
		marctools.MarcMapSqlite(filename, *output)
	}
}
示例#3
0
func main() {
	secondary := flag.String("secondary", "", "add a secondary value to the row")
	encodeRecord := flag.Bool("encode", false, "base64 encode record before inserting it")
	output := flag.String("o", "", "output sqlite3 filename")
	version := flag.Bool("v", false, "prints current program version")
	cpuprofile := flag.String("cpuprofile", "", "write cpu profile to file")

	var PrintUsage = func() {
		fmt.Fprintf(os.Stderr, "Usage: %s [OPTIONS] MARCFILE\n", os.Args[0])
		flag.PrintDefaults()
	}

	flag.Parse()

	if *cpuprofile != "" {
		f, err := os.Create(*cpuprofile)
		if err != nil {
			log.Fatal(err)
		}
		pprof.StartCPUProfile(f)
		defer pprof.StopCPUProfile()
	}

	if *version {
		fmt.Println(marctools.AppVersion)
		os.Exit(0)
	}

	if flag.NArg() < 1 {
		PrintUsage()
		os.Exit(1)
	}

	filename := flag.Args()[0]

	// record ids in order
	var b bytes.Buffer
	marctools.MarcMap(filename, &b)

	// the input file
	handle, err := os.Open(filename)
	if err != nil {
		log.Fatalf("%s\n", err)
	}

	defer func() {
		if err := handle.Close(); err != nil {
			log.Fatalf("%s\n", err)
		}
	}()

	// prepare sqlite3 output
	db, err := sql.Open("sqlite3", *output)
	if err != nil {
		log.Fatalln(err)
	}
	defer db.Close()

	// prepare table
	init := `CREATE TABLE IF NOT EXISTS store (id TEXT, secondary TEXT, record BLOB, PRIMARY KEY (id, secondary))`
	_, err = db.Exec(init)
	if err != nil {
		log.Fatalf("%q: %s\n", err, init)
	}

	// prepare statement
	tx, err := db.Begin()
	if err != nil {
		log.Fatalln(err)
	}
	stmt, err := tx.Prepare("INSERT INTO store VALUES (?, ?, ?)")
	if err != nil {
		log.Fatalln(err)
	}
	defer stmt.Close()

	for _, row := range strings.Split(b.String(), "\n") {
		fields := strings.Fields(row)
		if len(fields) == 0 {
			continue
		}

		offset, err := strconv.Atoi(fields[1])
		if err != nil {
			log.Fatalln(err)
		}

		length, err := strconv.Atoi(fields[2])
		if err != nil {
			log.Fatalln(err)
		}

		handle.Seek(int64(offset), os.SEEK_SET)
		buf := make([]byte, length)
		_, err = handle.Read(buf)
		if err != nil {
			log.Fatalln(err)
		}

		var s string
		if *encodeRecord {
			s = base64.StdEncoding.EncodeToString(buf)
		} else {
			s = string(buf)
		}
		_, err = stmt.Exec(fields[0], *secondary, s)
		if err != nil {
			log.Fatalln(err)
		}
	}

	// create index
	_, err = tx.Exec("CREATE INDEX IF NOT EXISTS idx_store_id ON store (id)")
	if err != nil {
		log.Fatalln(err)
	}
	tx.Commit()
}