func (d *Dumper) parseMetadataFile(meta string, w io.Writer) error { log.Infof("Parsing: %s", meta) if file, err := os.Open(meta); err != nil { return err } else { defer file.Close() scanner := bufio.NewScanner(file) binLogExp := regexp.MustCompile("\\s+Log:\\s+(.+)") binLogPosExp := regexp.MustCompile("\\s+Pos:\\s+(\\d+)") binLog := "" binLogPos := "" for scanner.Scan() { line := scanner.Text() if m := binLogExp.FindStringSubmatch(line); len(m) > 0 { binLog = m[1] } else if m := binLogPosExp.FindStringSubmatch(line); len(m) > 0 { binLogPos = m[1] } } if err = scanner.Err(); err != nil { return err } else { stmnt := fmt.Sprintf("CHANGE MASTER TO MASTER_LOG_FILE='%s', MASTER_LOG_POS=%s;\n", binLog, binLogPos) log.Debug(stmnt) _, err = fmt.Fprintf(w, stmnt) return err } } }
func (d *Dumper) parseDumpFile(dump string, w io.Writer) error { log.Infof("Parsing: %s", dump) lastSlash := strings.LastIndex(dump, "/") + 1 database := strings.Split(dump[lastSlash:len(dump)], ".")[0] stmnt := fmt.Sprintf("CREATE DATABASE IF NOT EXISTS `%s`;\n\nUSE `%s`;\n", database, database) log.Debug(stmnt) if _, err := fmt.Fprintf(w, stmnt); err != nil { return err } else if file, err := os.Open(dump); err != nil { return err } else { defer file.Close() scanner := bufio.NewScanner(file) scanner.Buffer(make([]byte, 1024*1024), 1024*1024) insertExp := regexp.MustCompile("^INSERT INTO `.+` VALUES$") valuesExp := regexp.MustCompile("^\\(.+\\)[;,]$") n := 0 for scanner.Scan() { n = n + 1 if n%10000 == 0 { log.Infof("%d lines parsed ", n) } line := scanner.Text() if insertExp.FindString(line) != "" { stmnt := fmt.Sprintf("%s\n", line) _, err = w.Write([]byte(stmnt)) } else if valuesExp.FindString(line) != "" { stmnt := fmt.Sprintf("%s\n", line) _, err = w.Write([]byte(stmnt)) } if err != nil { log.Errorf("Failed after %d lines parsed due to %v: %v", n, err, line) return err } } log.Infof("Parsing completed with %d lines parsed", n) return scanner.Err() } }