mirror of
				https://github.com/superseriousbusiness/gotosocial.git
				synced 2025-10-31 03:12:25 -05:00 
			
		
		
		
	[bugfix] fix issues with postgres array serialization (#4295)
thank you to @kipvandenbos -erino for figuring this out! Reviewed-on: https://codeberg.org/superseriousbusiness/gotosocial/pulls/4295 Co-authored-by: kim <grufwub@gmail.com> Co-committed-by: kim <grufwub@gmail.com>
This commit is contained in:
		
					parent
					
						
							
								700bd69828
							
						
					
				
			
			
				commit
				
					
						39b11dbfb6
					
				
			
		
					 4 changed files with 38 additions and 2 deletions
				
			
		|  | @ -196,13 +196,17 @@ func (m *mediaDB) DeleteAttachment(ctx context.Context, id string) error { | ||||||
| 			}) | 			}) | ||||||
| 
 | 
 | ||||||
| 			if len(updatedIDs) != len(status.AttachmentIDs) { | 			if len(updatedIDs) != len(status.AttachmentIDs) { | ||||||
|  | 
 | ||||||
|  | 				// Convert to bun array for serialization. | ||||||
|  | 				arrIDs := bunArrayType(tx, updatedIDs) | ||||||
|  | 
 | ||||||
| 				// Note: this handles not found. | 				// Note: this handles not found. | ||||||
| 				// | 				// | ||||||
| 				// Attachments changed, update the status. | 				// Attachments changed, update the status. | ||||||
| 				if _, err := tx.NewUpdate(). | 				if _, err := tx.NewUpdate(). | ||||||
| 					Table("statuses"). | 					Table("statuses"). | ||||||
| 					Where("? = ?", bun.Ident("id"), status.ID). | 					Where("? = ?", bun.Ident("id"), status.ID). | ||||||
| 					Set("? = ?", bun.Ident("attachment_ids"), updatedIDs). | 					Set("? = ?", bun.Ident("attachment_ids"), arrIDs). | ||||||
| 					Exec(ctx); err != nil { | 					Exec(ctx); err != nil { | ||||||
| 					return gtserror.Newf("error updating status: %w", err) | 					return gtserror.Newf("error updating status: %w", err) | ||||||
| 				} | 				} | ||||||
|  |  | ||||||
|  | @ -110,12 +110,16 @@ func init() { | ||||||
| 						return gtserror.Newf("error selecting %T ids: %w", data.Model, err) | 						return gtserror.Newf("error selecting %T ids: %w", data.Model, err) | ||||||
| 					} | 					} | ||||||
| 
 | 
 | ||||||
|  | 					// Convert related IDs to bun array | ||||||
|  | 					// type for serialization in query. | ||||||
|  | 					arrIDs := bunArrayType(tx, relatedIDs) | ||||||
|  | 
 | ||||||
| 					// Now update the relevant filter | 					// Now update the relevant filter | ||||||
| 					// row to contain these related IDs. | 					// row to contain these related IDs. | ||||||
| 					if _, err := tx.NewUpdate(). | 					if _, err := tx.NewUpdate(). | ||||||
| 						Model((*newmodel.Filter)(nil)). | 						Model((*newmodel.Filter)(nil)). | ||||||
| 						Where("? = ?", bun.Ident("id"), filterID). | 						Where("? = ?", bun.Ident("id"), filterID). | ||||||
| 						Set("? = ?", bun.Ident(col), relatedIDs). | 						Set("? = ?", bun.Ident(col), arrIDs). | ||||||
| 						Exec(ctx); err != nil { | 						Exec(ctx); err != nil { | ||||||
| 						return gtserror.Newf("error updating filters.%s ids: %w", col, err) | 						return gtserror.Newf("error updating filters.%s ids: %w", col, err) | ||||||
| 					} | 					} | ||||||
|  |  | ||||||
|  | @ -34,10 +34,24 @@ import ( | ||||||
| 	"github.com/uptrace/bun" | 	"github.com/uptrace/bun" | ||||||
| 	"github.com/uptrace/bun/dialect" | 	"github.com/uptrace/bun/dialect" | ||||||
| 	"github.com/uptrace/bun/dialect/feature" | 	"github.com/uptrace/bun/dialect/feature" | ||||||
|  | 	"github.com/uptrace/bun/dialect/pgdialect" | ||||||
| 	"github.com/uptrace/bun/dialect/sqltype" | 	"github.com/uptrace/bun/dialect/sqltype" | ||||||
| 	"github.com/uptrace/bun/schema" | 	"github.com/uptrace/bun/schema" | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
|  | // bunArrayType wraps the given type in a pgdialect.Array | ||||||
|  | // if needed, which postgres wants for serializing arrays. | ||||||
|  | func bunArrayType(db bun.IDB, arr any) any { | ||||||
|  | 	switch db.Dialect().Name() { | ||||||
|  | 	case dialect.SQLite: | ||||||
|  | 		return arr // return as-is | ||||||
|  | 	case dialect.PG: | ||||||
|  | 		return pgdialect.Array(arr) | ||||||
|  | 	default: | ||||||
|  | 		panic("unreachable") | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
| // doWALCheckpoint attempt to force a WAL file merge on SQLite3, | // doWALCheckpoint attempt to force a WAL file merge on SQLite3, | ||||||
| // which can be useful given how much can build-up in the WAL. | // which can be useful given how much can build-up in the WAL. | ||||||
| // | // | ||||||
|  |  | ||||||
|  | @ -29,6 +29,7 @@ import ( | ||||||
| 	"code.superseriousbusiness.org/gotosocial/internal/paging" | 	"code.superseriousbusiness.org/gotosocial/internal/paging" | ||||||
| 	"github.com/uptrace/bun" | 	"github.com/uptrace/bun" | ||||||
| 	"github.com/uptrace/bun/dialect" | 	"github.com/uptrace/bun/dialect" | ||||||
|  | 	"github.com/uptrace/bun/dialect/pgdialect" | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
| // likeEscaper is a thread-safe string replacer which escapes | // likeEscaper is a thread-safe string replacer which escapes | ||||||
|  | @ -60,6 +61,19 @@ func likeOperator(query *bun.SelectQuery) string { | ||||||
| 	return "" | 	return "" | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | // bunArrayType wraps the given type in a pgdialect.Array | ||||||
|  | // if needed, which postgres wants for serializing arrays. | ||||||
|  | func bunArrayType(db bun.IDB, arr any) any { | ||||||
|  | 	switch db.Dialect().Name() { | ||||||
|  | 	case dialect.SQLite: | ||||||
|  | 		return arr // return as-is | ||||||
|  | 	case dialect.PG: | ||||||
|  | 		return pgdialect.Array(arr) | ||||||
|  | 	default: | ||||||
|  | 		panic("unreachable") | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
| // whereLike appends a WHERE clause to the | // whereLike appends a WHERE clause to the | ||||||
| // given SelectQuery, which searches for | // given SelectQuery, which searches for | ||||||
| // matches of `search` in the given subQuery | // matches of `search` in the given subQuery | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue