|
- <%
- 'Represents a single migration (either up or down)
- Class Migration_Class
- Private m_name
- Private m_migration_instance
- Private m_sql_array
- Private m_sql_array_size
- Private m_connection
- Private m_has_errors
-
- Public Tracing 'bool
-
- Public Property Get Name
- Name = m_name
- End Property
-
- Public Property Get Migration
- set Migration = m_migration_instance
- End Property
-
- Public Property Set Migration(obj)
- set m_migration_instance = obj
- End Property
-
- Public Property Get HasErrors
- HasErrors = m_has_errors
- End Property
-
- Private Sub Class_Initialize
- m_sql_array = array()
- redim m_sql_array(-1)
-
- m_has_errors = false
- End Sub
-
- Public Sub Initialize(name, migration_instance, connection)
- m_name = name
- set m_migration_instance = migration_instance
- set m_migration_instance.Migration = Me 'how circular can we get? ...
- set m_connection = connection
- End Sub
-
- Private Sub Class_Terminate
- 'm_connection.Close
- 'set m_connection = Nothing
- End Sub
-
- Public Sub [Do](sql)
- dim new_size : new_size = ubound(m_sql_array) + 1
- redim preserve m_sql_array(new_size)
- m_sql_array(new_size) = sql
- 'put "Added command: " & sql
- End Sub
-
- Public Sub Irreversible
- Err.Raise 1, "Migration_Class:Irreversible", "Migration cannot proceed because this migration is irreversible."
- End Sub
-
- Public Sub DownDataWarning
- put "Migration can be downversioned but data changes cannot take place due to the nature of the Up migration in this set."
- End Sub
-
- Public Function Query(sql)
- put "Query: " & sql
- set Query = m_connection.Execute(sql)
- End Function
-
- Public Sub DoUp
- Migration.Up
- ShowCommands
- ExecuteCommands
- End Sub
-
- Public Sub DoDown
- Migration.Down
- ShowCommands
- ExecuteCommands
- End Sub
-
- Private Sub ShowCommands
- put ""
- put "Commands:"
- dim i : i = 0
- For i = 0 to ubound(m_sql_array)
- put " Command: " & m_sql_array(i)
- Next
- put ""
- End Sub
-
- Private Sub ExecuteCommands
- dim i : i = 0
- dim sql
- m_connection.BeginTrans 'wrap entire process in transaction, rollback If error encountered on any statement
- For i = 0 to ubound(m_sql_array)
- sql = m_sql_array(i)
- If not m_has_errors then 'avoid further processing If errors exist
- On Error Resume Next
- put "Executing: " & sql
- m_connection.Execute sql
- If Err.Number <> 0 then 'something went wrong, rollback the transaction and display an error
- m_has_errors = true
- m_connection.RollbackTrans
- put_error "Error during migration: " & Err.Description
- put_error "SQL: " & sql
- exit sub
- End If
- On Error Goto 0
- End If
- Next
- m_connection.CommitTrans 'surprisingly no errors were encountered, so commit the entire transaction
- End Sub
-
- 'force font color dIfference
- Private Sub put(s)
- If Me.Tracing then response.write "<div style='color: #999'>" & s & "</div>"
- End Sub
- End Class
-
-
- '---------------------------------------------------------------------------------------------------------------------
- 'Represents the collection of migrations to be performed
- Class Migrations_Class
- Private m_migrations_array ' 1-based to match migration naming scheme, ignore the first element
- Private m_migrations_array_size
- Private m_version
- Private m_connection
- Private m_connection_string
- Private m_has_errors
-
- Public Tracing 'bool
-
- Private Sub Class_Initialize
- m_migrations_array = array()
- m_migrations_array_size = 0 ' 1-based, ignore the first element
- redim m_migrations_array(m_migrations_array_size)
-
- m_has_errors = false
- End Sub
-
- Private Sub Class_Terminate
- On Error Resume Next
- m_connection.Close
- set m_connection = Nothing
- On Error Goto 0
- End Sub
-
- 'force font color dIfference
- Private Sub put(s)
- If Me.Tracing then response.write "<div style='color: #999'>" & s & "</div>"
- End Sub
-
- Public Sub Initialize(connection_string)
- m_connection_string = connection_string
- set m_connection = Server.CreateObject("ADODB.Connection")
- m_connection.Open m_connection_string
- put "Initialized: " & typename(m_connection)
- End Sub
-
- Public Sub Add(name)
- m_migrations_array_size = m_migrations_array_size + 1
- redim preserve m_migrations_array(m_migrations_array_size)
- dim M : set M = new Migration_Class
- dim migration_instance : set migration_instance = eval("new " & name)
- M.Initialize name, migration_instance, m_connection
- M.Tracing = Me.Tracing
- set m_migrations_array(m_migrations_array_size) = M
- End Sub
-
- Public Sub MigrateUp
- MigrateUpTo m_migrations_array_size
- End Sub
-
- Public Sub MigrateUpBy(num)
- MigrateUpTo Version + num
- End Sub
-
- Public Sub MigrateUpTo(requested_version)
- requested_version = CInt(requested_version)
- put "Migrating Up To Version " & requested_version
- dim M, class_name
-
- If Version >= requested_version then
- put_error "DB already at higher version than requested up migration."
- ElseIf requested_version > m_migrations_array_size then
- put_error "Requested version exceeds available migrations. Only " & m_migrations_array_size & " migrations are available."
- Else
- While (NextVersion <= requested_version) and (not m_has_errors)
- set M = m_migrations_array(NextVersion)
- put ""
- put "<b>Up: " & M.name & "</b>"
- M.DoUp
- m_has_errors = M.HasErrors
- If not m_has_errors then IncrementVersion
- Wend
- End If
- End Sub
-
- Public Sub MigrateDown
- MigrateDownTo 0
- End Sub
-
- Public Sub MigrateDownBy(num)
- MigrateDownTo Version - num
- End Sub
-
- Public Sub MigrateDownTo(requested_version)
- requested_version = CInt(requested_version)
- put "Migrating Down To Version: " & requested_version
- dim M, class_name
-
- If requested_version < 0 then
- put_error "Cannot migrate down to a version less than 0."
- ElseIf requested_version > Version then
- put_error "Cannot migrate down to a version higher than the current version."
- ElseIf requested_version = Version then
- put_error "Cannot migrate down to the current version, already there."
- Else
- While (Version > requested_version) and (not m_has_errors)
- set M = m_migrations_array(Version)
- put ""
- put "<b>Down: " & M.Name & "</b>"
- M.DoDown
- m_has_errors = M.HasErrors
- If not m_has_errors then DecrementVersion
- Wend
- End If
- End Sub
-
-
-
- Public Property Get Version
- If IsEmpty(m_version) then
- m_version = GetDBVersion()
- End If
- Version = m_version
- End Property
-
-
- Private Property Let Version(val)
- m_version = val
- m_connection.Execute "update meta_migrations set version = " & m_version
- End Property
-
- Public Property Get NextVersion
- NextVersion = Version + 1
- End Property
-
- Private Function GetDBVersion()
- dim rs : set rs = m_connection.Execute("select version from meta_migrations")
- If rs.BOF or rs.EOF then
- GetDBVersion = NULL
- Else
- GetDBVersion = rs("version")
- End If
- rs.Close
- set rs = Nothing
- End Function
-
- Private Sub IncrementVersion
- If not m_has_errors then Version = Version + 1
- End Sub
-
- Private Sub DecrementVersion
- If not m_has_errors then Version = Version - 1
- End Sub
-
- End Class
-
-
- dim Migrations_Class__Singleton
-
- Function Migrations()
- If IsEmpty(Migrations_Class__Singleton) then set Migrations_Class__Singleton = new Migrations_Class
- set Migrations = Migrations_Class__Singleton
- End Function
- %>
|