@@ -2,6 +2,7 @@ package migrate
22
33import  (
44	"bufio" 
5+ 	"errors" 
56	"fmt" 
67	"io" 
78	"time" 
@@ -118,7 +119,7 @@ func (m *Migration) LogString() string {
118119
119120// Buffer buffers Body up to BufferSize. 
120121// Calling this function blocks. Call with goroutine. 
121- func  (m  * Migration ) Buffer () error  {
122+ func  (m  * Migration ) Buffer () ( err   error )  {
122123	if  m .Body  ==  nil  {
123124		return  nil 
124125	}
@@ -127,41 +128,41 @@ func (m *Migration) Buffer() error {
127128
128129	b  :=  bufio .NewReaderSize (m .Body , int (m .BufferSize ))
129130
130- 	var  bufferWriterCloseErr  error 
131- 	// Always close bufferWriter, even on error, to prevent deadlocks. 
132- 	// This lets Buffer know that there is no more data coming. 
131+ 	// defer closing buffer writer and body. 
132+ 	// defer blocks run in reverse order 
133+ 
134+ 	// close the Body. 
135+ 	defer  func () {
136+ 		if  cerr  :=  m .Body .Close (); cerr  !=  nil  {
137+ 			err  =  errors .Join (err , cerr )
138+ 		}
139+ 	}()
140+ 
141+ 	// always close bufferWriter, even on error, to prevent deadlocks. 
142+ 	// this lets Buffer know that there is no more data coming. 
133143	defer  func () {
134- 		if  err  :=  m .bufferWriter .Close (); err   !=   nil   &&   bufferWriterCloseErr   = =  nil  {
135- 			bufferWriterCloseErr  =  err 
144+ 		if  cerr  :=  m .bufferWriter .Close (); cerr   ! =  nil  {
145+ 			err  =  errors . Join ( err ,  cerr ) 
136146		}
137147	}()
138148
139149	// start reading from body, peek won't move the read pointer though 
140150	// poor man's solution? 
141- 	if  _ , err  :=  b .Peek (int (m .BufferSize )); err  !=  nil  &&  err  !=  io .EOF  {
142- 		return  err 
151+ 	if  _ , perr  :=  b .Peek (int (m .BufferSize )); perr  !=  nil  &&  perr  !=  io .EOF  {
152+ 		return  perr 
143153	}
144154
145155	m .FinishedBuffering  =  time .Now ()
146156
147157	// write to bufferWriter, this will block until 
148158	// something starts reading from m.Buffer 
149- 	n , err  :=  b .WriteTo (m .bufferWriter )
150- 	if  err  !=  nil  {
151- 		return  err 
159+ 	n , werr  :=  b .WriteTo (m .bufferWriter )
160+ 	if  werr  !=  nil  {
161+ 		return  werr 
152162	}
153163
154164	m .FinishedReading  =  time .Now ()
155165	m .BytesRead  =  n 
156166
157- 	// it's safe to close the Body too 
158- 	if  err  :=  m .Body .Close (); err  !=  nil  {
159- 		return  err 
160- 	}
161- 
162- 	if  bufferWriterCloseErr  !=  nil  {
163- 		return  bufferWriterCloseErr 
164- 	}
165- 
166167	return  nil 
167168}
0 commit comments