2013-06-11 12:42:32 +04:00
|
|
|
package postgis
|
|
|
|
|
|
|
|
import (
|
|
|
|
"fmt"
|
|
|
|
)
|
|
|
|
|
|
|
|
func (pg *PostGIS) rotate(source, dest, backup string) error {
|
|
|
|
defer log.StopStep(log.StartStep(fmt.Sprintf("Rotating tables")))
|
|
|
|
|
2013-12-02 16:10:42 +04:00
|
|
|
if err := pg.createSchema(dest); err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
2013-06-11 12:42:32 +04:00
|
|
|
if err := pg.createSchema(backup); err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
|
|
|
tx, err := pg.Db.Begin()
|
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
defer rollbackIfTx(&tx)
|
|
|
|
|
2013-10-29 18:30:51 +04:00
|
|
|
for _, tableName := range pg.tableNames() {
|
2013-06-11 12:42:32 +04:00
|
|
|
tableName = pg.Prefix + tableName
|
|
|
|
|
|
|
|
log.Printf("Rotating %s from %s -> %s -> %s", tableName, source, dest, backup)
|
|
|
|
|
|
|
|
backupExists, err := tableExists(tx, backup, tableName)
|
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
sourceExists, err := tableExists(tx, source, tableName)
|
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
destExists, err := tableExists(tx, dest, tableName)
|
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
|
|
|
if !sourceExists {
|
|
|
|
log.Warnf("skipping rotate of %s, table does not exists in %s", tableName, source)
|
|
|
|
continue
|
|
|
|
}
|
|
|
|
|
|
|
|
if destExists {
|
|
|
|
log.Printf("backup of %s, to %s", tableName, backup)
|
|
|
|
if backupExists {
|
|
|
|
err = dropTableIfExists(tx, backup, tableName)
|
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
}
|
|
|
|
sql := fmt.Sprintf(`ALTER TABLE "%s"."%s" SET SCHEMA "%s"`, dest, tableName, backup)
|
|
|
|
_, err = tx.Exec(sql)
|
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
sql := fmt.Sprintf(`ALTER TABLE "%s"."%s" SET SCHEMA "%s"`, source, tableName, dest)
|
|
|
|
_, err = tx.Exec(sql)
|
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
err = tx.Commit()
|
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
tx = nil // set nil to prevent rollback
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
|
|
|
func (pg *PostGIS) Deploy() error {
|
2013-12-02 16:10:42 +04:00
|
|
|
return pg.rotate(pg.Config.ImportSchema, pg.Config.ProductionSchema, pg.Config.BackupSchema)
|
2013-06-11 12:42:32 +04:00
|
|
|
}
|
|
|
|
|
|
|
|
func (pg *PostGIS) RevertDeploy() error {
|
2013-12-02 16:10:42 +04:00
|
|
|
return pg.rotate(pg.Config.BackupSchema, pg.Config.ProductionSchema, pg.Config.ImportSchema)
|
2013-06-11 12:42:32 +04:00
|
|
|
}
|
|
|
|
|
|
|
|
func (pg *PostGIS) RemoveBackup() error {
|
|
|
|
tx, err := pg.Db.Begin()
|
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
defer rollbackIfTx(&tx)
|
|
|
|
|
2013-12-02 16:10:42 +04:00
|
|
|
backup := pg.Config.BackupSchema
|
2013-06-11 12:42:32 +04:00
|
|
|
|
2013-10-29 18:30:51 +04:00
|
|
|
for _, tableName := range pg.tableNames() {
|
2013-06-11 12:42:32 +04:00
|
|
|
tableName = pg.Prefix + tableName
|
|
|
|
|
|
|
|
backupExists, err := tableExists(tx, backup, tableName)
|
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
if backupExists {
|
|
|
|
log.Printf("removing backup of %s from %s", tableName, backup)
|
|
|
|
err = dropTableIfExists(tx, backup, tableName)
|
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
err = tx.Commit()
|
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
tx = nil // set nil to prevent rollback
|
|
|
|
return nil
|
|
|
|
}
|
2013-10-29 18:30:51 +04:00
|
|
|
|
|
|
|
// tableNames returns a list of all tables (without prefix).
|
|
|
|
func (pg *PostGIS) tableNames() []string {
|
|
|
|
var names []string
|
|
|
|
for name, _ := range pg.Tables {
|
|
|
|
names = append(names, name)
|
|
|
|
}
|
|
|
|
for name, _ := range pg.GeneralizedTables {
|
|
|
|
names = append(names, name)
|
|
|
|
}
|
|
|
|
return names
|
|
|
|
}
|