<% '======================================================================================================================= ' INDUSTRY REPOSITORY '======================================================================================================================= Class IndustryRepository_Class ' All industries with the number of businesses in each: list of Dictionary(id, name, n) Public Function All() Dim list, rs, d Set list = CreateObject("Scripting.Dictionary") Set rs = Db_Query("SELECT i.id, i.name, COUNT(b.id) AS n FROM industries i LEFT JOIN businesses b ON b.industry_id = i.id GROUP BY i.id, i.name ORDER BY i.name", Array()) Do While Not rs.EOF Set d = CreateObject("Scripting.Dictionary") d("id") = CLng(rs(0)) : d("name") = rs(1) & "" : d("n") = CLng(rs(2)) list.Add list.Count, d rs.MoveNext Loop rs.Close Set All = list End Function Public Function UncategorizedCount() Dim rs Set rs = Db_Query("SELECT COUNT(*) FROM businesses WHERE industry_id IS NULL", Array()) UncategorizedCount = CLng(rs(0)) rs.Close End Function Public Function Find(id) Dim rs Set rs = Db_Query("SELECT i.id, i.name, (SELECT COUNT(*) FROM businesses b WHERE b.industry_id = i.id) AS n FROM industries i WHERE i.id = ?", Array(Db_PI(id))) If rs.EOF Then Set Find = Nothing Else Dim d : Set d = CreateObject("Scripting.Dictionary") d("id") = CLng(rs(0)) : d("name") = rs(1) & "" : d("n") = CLng(rs(2)) Set Find = d End If rs.Close End Function ' True when another industry (not excludeId) already has this name (case-insensitive). Public Function NameTaken(name, excludeId) Dim rs Set rs = Db_Query("SELECT COUNT(*) FROM industries WHERE name = ? AND id <> ?", Array(Db_PS(name), Db_PI(excludeId))) NameTaken = (CLng(rs(0)) > 0) rs.Close End Function Public Sub Create(name) Db_Exec "INSERT INTO industries (name) VALUES (?)", Array(Db_PS(name)) End Sub Public Sub Rename(id, name) Db_Exec "UPDATE industries SET name = ? WHERE id = ?", Array(Db_PS(name), Db_PI(id)) End Sub ' Moves every business from sourceId to targetId, then deletes sourceId. Returns the number of businesses moved. Public Function Merge(sourceId, targetId) Dim conn, moved, rs, msg Set conn = DAL().Connection Set rs = Db_Query("SELECT COUNT(*) FROM businesses WHERE industry_id = ?", Array(Db_PI(sourceId))) moved = CLng(rs(0)) rs.Close conn.BeginTrans On Error Resume Next Db_Exec "UPDATE businesses SET industry_id = ? WHERE industry_id = ?", Array(Db_PI(targetId), Db_PI(sourceId)) If Err.Number = 0 Then Db_Exec "DELETE FROM industries WHERE id = ?", Array(Db_PI(sourceId)) If Err.Number <> 0 Then msg = Err.Description Err.Clear conn.RollbackTrans On Error GoTo 0 Err.Raise 5, "IndustryRepository.Merge", msg End If conn.CommitTrans On Error GoTo 0 Merge = moved End Function Public Sub Delete(id) Db_Exec "DELETE FROM industries WHERE id = ?", Array(Db_PI(id)) End Sub End Class Dim IndustryRepository_Class__Singleton Function IndustryRepository() If IsEmpty(IndustryRepository_Class__Singleton) Then Set IndustryRepository_Class__Singleton = New IndustryRepository_Class End If Set IndustryRepository = IndustryRepository_Class__Singleton End Function %>