|
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160 |
- <%
-
-
-
-
-
-
-
-
- Class Automapper_Class
- Private m_src
- Private m_target
- Private m_statements
- Private m_statements_count
-
- Private Property Get Src : set Src = m_src : End Property
- Private Property Get Target : set Target = m_target : End Property
-
- Private Sub Class_Initialize
- m_statements = Array()
- m_statements_count = 0
- redim m_statements(m_statements_count)
- End Sub
-
- Private Sub ResetState
- m_statements_count = 0
- redim m_statements(m_statements_count)
- set m_src = Nothing
- set m_target = Nothing
- End Sub
-
-
- Public Function AutoMap(src_obj, target_obj)
- Set AutoMap = FlexMap(src_obj, target_obj, empty)
- End Function
-
-
-
- Public Function FlexMap(src_obj, target_obj, field_names)
- Set FlexMap = DynMap(src_obj, target_obj, field_names, empty)
- End Function
-
-
-
-
- Public Function DynMap(src_obj, target_obj, field_names, exprs)
- SetSource src_obj
- SetTarget target_obj
-
- dim field_name
- dim field_idx
-
- if IsEmpty(field_names) then
- if typename(src_obj) = "Recordset" then
- for field_idx = 0 to src_obj.Fields.Count - 1
- field_name = src_obj.Fields.Item(field_idx).Name
-
- AddStatement BuildStatement(field_name)
- next
-
- elseif InStr(typename(src_obj), "Dictionary") > 0 then
- for each field_name in src_obj
- AddStatement BuildStatement(field_name)
- next
-
- elseif not IsEmpty(src_obj.Class_Get_Properties) then
- dim props : props = src_obj.Class_Get_Properties
- for field_idx = 0 to ubound(props)
- field_name = props(field_idx)
-
- AddStatement BuildStatement(field_name)
- next
-
- else
- Err.Raise 9, "Automapper.DynMap", "Cannot automatically map this source object. Expected recordset or object implementing Class_Get_Properties reflection, got: " & typename(src_obj)
- end if
-
- else
- for field_idx = lbound(field_names) to ubound(field_names)
- field_name = field_names(field_idx)
-
- AddStatement BuildStatement(field_name)
- next
- end if
-
- dim exprs_idx
-
- if not IsEmpty(exprs) then
- if typename(exprs) = "Variant()" then
- for exprs_idx = lbound(exprs) to ubound(exprs)
-
-
- AddStatement exprs(exprs_idx)
- next
- else
- AddStatement exprs
- end if
- end if
-
-
-
-
-
-
- on error resume next
- dim stmt_idx
- for stmt_idx = 0 to ubound(m_statements)
- Execute m_statements(stmt_idx)
- next
- on error goto 0
-
- set DynMap = m_target
-
- ResetState
- End Function
-
-
- Private Sub SetSource(ByVal src_obj)
- set m_src = src_obj
- End Sub
-
- Private Sub SetTarget(ByVal target_obj)
- if typename(target_obj) = "String" then
- set m_target = eval("new " & target_obj)
- else
- set m_target = target_obj
- end if
- End Sub
-
-
-
- Private Sub AddStatement(ByVal stmt)
- redim preserve m_statements(m_statements_count + 1)
- m_statements(m_statements_count) = stmt
- m_statements_count = m_statements_count + 1
- End Sub
-
- Private Function BuildStatement(ByVal field_name)
- dim result
- if typename(m_src) = "Recordset" or InStr(typename(m_src), "Dictionary") > 0 then
- result = "m_target." & field_name & " = m_src(""" & field_name & """)"
- else
-
-
- if IsObject(eval("m_src." & field_name)) then
- result = "set "
- else
-
- end if
- result = result & " m_target." & field_name & " = m_src." & field_name
- end if
- BuildStatement = result
- End Function
- End Class
-
-
- Function Automapper()
- Set Automapper = new Automapper_Class
- End Function
- %>
|