github.com/Ali-iotechsys/sqlboiler/v4@v4.0.0-20221208124957-6aec9a5f1f71/drivers/sqlboiler-sqlite3/driver/override/test/singleton/sqlite3_main_test.go.tpl (about) 1 var rgxSQLitekey = regexp.MustCompile(`(?mi)((,\n)?\s+foreign key.*?\n)+`) 2 3 type sqliteTester struct { 4 dbConn *sql.DB 5 6 dbName string 7 testDBName string 8 } 9 10 func init() { 11 dbMain = &sqliteTester{} 12 } 13 14 func (s *sqliteTester) setup() error { 15 var err error 16 17 s.dbName = viper.GetString("sqlite3.dbname") 18 if len(s.dbName) == 0 { 19 return errors.New("no dbname specified") 20 } 21 22 s.testDBName = filepath.Join(os.TempDir(), fmt.Sprintf("boil-sqlite3-%d.sql", rand.Int())) 23 24 dumpCmd := exec.Command("sqlite3", "-cmd", ".dump", s.dbName) 25 createCmd := exec.Command("sqlite3", s.testDBName) 26 27 r, w := io.Pipe() 28 dumpCmd.Stdout = w 29 createCmd.Stdin = newFKeyDestroyer(rgxSQLitekey, r) 30 31 if err = dumpCmd.Start(); err != nil { 32 return errors.Wrap(err, "failed to start sqlite3 dump command") 33 } 34 if err = createCmd.Start(); err != nil { 35 return errors.Wrap(err, "failed to start sqlite3 create command") 36 } 37 38 if err = dumpCmd.Wait(); err != nil { 39 fmt.Println(err) 40 return errors.Wrap(err, "failed to wait for sqlite3 dump command") 41 } 42 43 w.Close() // After dumpCmd is done, close the write end of the pipe 44 45 if err = createCmd.Wait(); err != nil { 46 fmt.Println(err) 47 return errors.Wrap(err, "failed to wait for sqlite3 create command") 48 } 49 50 return nil 51 } 52 53 func (s *sqliteTester) teardown() error { 54 if s.dbConn != nil { 55 s.dbConn.Close() 56 } 57 58 return os.Remove(s.testDBName) 59 } 60 61 func (s *sqliteTester) conn() (*sql.DB, error) { 62 if s.dbConn != nil { 63 return s.dbConn, nil 64 } 65 66 var err error 67 s.dbConn, err = sql.Open("sqlite", fmt.Sprintf("file:%s?cache=shared&_loc=UTC", s.testDBName)) 68 if err != nil { 69 return nil, err 70 } 71 72 return s.dbConn, nil 73 }