<% ' Universal data caching system for frequently accessed database queries ' Uses Application-level cache with configurable TTL (Time To Live) ' Cache durations in minutes Const CACHE_DROPDOWN_TTL = 60 ' Dropdowns (vendors, models) - 1 hour Const CACHE_LIST_TTL = 5 ' List pages (printers, machines) - 5 minutes Const CACHE_STATIC_TTL = 1440 ' Static data (rarely changes) - 24 hours '============================================================================= ' DROPDOWN DATA CACHING (Vendors, Models, etc.) '============================================================================= ' Get all printer vendors (cached) Function GetPrinterVendorsCached() Dim cacheKey, cacheAge, cachedData cacheKey = "dropdown_printer_vendors" ' Check cache If Not IsEmpty(Application(cacheKey)) Then cacheAge = DateDiff("n", Application(cacheKey & "_time"), Now()) If cacheAge < CACHE_DROPDOWN_TTL Then GetPrinterVendorsCached = Application(cacheKey) Exit Function End If End If ' Fetch from database Dim sql, rs_temp, resultArray(), count, i sql = "SELECT vendorid, vendor FROM vendors WHERE isprinter=1 AND isactive=1 ORDER BY vendor ASC" Set rs_temp = objConn.Execute(sql) ' Count rows count = 0 While Not rs_temp.EOF count = count + 1 rs_temp.MoveNext Wend If count = 0 Then Set rs_temp = Nothing GetPrinterVendorsCached = Array() Exit Function End If ' Reset to beginning rs_temp.MoveFirst ' Build array ReDim resultArray(count - 1, 1) ' vendorid, vendor i = 0 While Not rs_temp.EOF resultArray(i, 0) = rs_temp("vendorid") resultArray(i, 1) = rs_temp("vendor") i = i + 1 rs_temp.MoveNext Wend rs_temp.Close Set rs_temp = Nothing ' Cache it Application.Lock Application(cacheKey) = resultArray Application(cacheKey & "_time") = Now() Application.Unlock GetPrinterVendorsCached = resultArray End Function ' Get all printer models (cached) Function GetPrinterModelsCached() Dim cacheKey, cacheAge, cachedData cacheKey = "dropdown_printer_models" ' Check cache If Not IsEmpty(Application(cacheKey)) Then cacheAge = DateDiff("n", Application(cacheKey & "_time"), Now()) If cacheAge < CACHE_DROPDOWN_TTL Then GetPrinterModelsCached = Application(cacheKey) Exit Function End If End If ' Fetch from database Dim sql, rs_temp, resultArray(), count, i sql = "SELECT models.modelnumberid, models.modelnumber, vendors.vendor " & _ "FROM vendors, models " & _ "WHERE models.vendorid = vendors.vendorid " & _ "AND vendors.isprinter=1 AND models.isactive=1 " & _ "ORDER BY modelnumber ASC" Set rs_temp = objConn.Execute(sql) ' Count rows count = 0 While Not rs_temp.EOF count = count + 1 rs_temp.MoveNext Wend If count = 0 Then Set rs_temp = Nothing GetPrinterModelsCached = Array() Exit Function End If ' Reset to beginning rs_temp.MoveFirst ' Build array ReDim resultArray(count - 1, 2) ' modelnumberid, modelnumber, vendor i = 0 While Not rs_temp.EOF resultArray(i, 0) = rs_temp("modelnumberid") resultArray(i, 1) = rs_temp("modelnumber") resultArray(i, 2) = rs_temp("vendor") i = i + 1 rs_temp.MoveNext Wend rs_temp.Close Set rs_temp = Nothing ' Cache it Application.Lock Application(cacheKey) = resultArray Application(cacheKey & "_time") = Now() Application.Unlock GetPrinterModelsCached = resultArray End Function '============================================================================= ' LIST PAGE CACHING (Printer list, Machine list, etc.) '============================================================================= ' Get all active printers (cached) - for displayprinters.asp Function GetPrinterListCached() Dim cacheKey, cacheAge cacheKey = "list_printers" ' Check cache If Not IsEmpty(Application(cacheKey)) Then cacheAge = DateDiff("n", Application(cacheKey & "_time"), Now()) If cacheAge < CACHE_LIST_TTL Then GetPrinterListCached = Application(cacheKey) Exit Function End If End If ' Fetch from database Dim sql, rs_temp, resultArray(), count, i sql = "SELECT printers.printerid AS printer, models.image, printers.installpath, " & _ "printers.printercsfname, printers.ipaddress, printers.serialnumber AS printerserial, " & _ "machines.islocationonly, vendors.vendor, models.modelnumber, models.documentationpath, " & _ "machines.machinenumber, machines.machineid " & _ "FROM printers, vendors, models, machines " & _ "WHERE printers.modelid=models.modelnumberid " & _ "AND models.vendorid=vendors.vendorid " & _ "AND printers.machineid=machines.machineid " & _ "AND printers.isactive=1 " & _ "ORDER BY machinenumber ASC" Set rs_temp = objConn.Execute(sql) ' Count rows count = 0 While Not rs_temp.EOF count = count + 1 rs_temp.MoveNext Wend If count = 0 Then Set rs_temp = Nothing GetPrinterListCached = Array() Exit Function End If rs_temp.MoveFirst ' Build array with all needed fields ReDim resultArray(count - 1, 11) ' printer, image, installpath, machinenumber, machineid, vendor, modelnumber, documentationpath, printercsfname, ipaddress, serialnumber, islocationonly i = 0 While Not rs_temp.EOF resultArray(i, 0) = rs_temp("printer") resultArray(i, 1) = rs_temp("image") resultArray(i, 2) = rs_temp("installpath") resultArray(i, 3) = rs_temp("machinenumber") resultArray(i, 4) = rs_temp("machineid") resultArray(i, 5) = rs_temp("vendor") resultArray(i, 6) = rs_temp("modelnumber") resultArray(i, 7) = rs_temp("documentationpath") resultArray(i, 8) = rs_temp("printercsfname") resultArray(i, 9) = rs_temp("ipaddress") resultArray(i, 10) = rs_temp("printerserial") ' Convert islocationonly bit to 1/0 integer (bit fields come as binary) On Error Resume Next If IsNull(rs_temp("islocationonly")) Then resultArray(i, 11) = 0 Else ' Convert bit field to integer (0 or 1) resultArray(i, 11) = Abs(CBool(rs_temp("islocationonly"))) End If On Error Goto 0 i = i + 1 rs_temp.MoveNext Wend rs_temp.Close Set rs_temp = Nothing ' Cache it Application.Lock Application(cacheKey) = resultArray Application(cacheKey & "_time") = Now() Application.Unlock GetPrinterListCached = resultArray End Function '============================================================================= ' HELPER FUNCTIONS '============================================================================= ' Render dropdown options from cached vendor data Function RenderVendorOptions(selectedID) Dim vendors, output, i, safeSelectedID vendors = GetPrinterVendorsCached() output = "" On Error Resume Next If Not IsArray(vendors) Or UBound(vendors) < 0 Then RenderVendorOptions = "" Exit Function End If On Error Goto 0 ' Safely handle null/empty selectedID safeSelectedID = 0 If Not IsNull(selectedID) And selectedID <> "" And IsNumeric(selectedID) Then safeSelectedID = CLng(selectedID) End If For i = 0 To UBound(vendors) If CLng(vendors(i, 0)) = safeSelectedID Then output = output & "" Else output = output & "" End If Next RenderVendorOptions = output End Function ' Render dropdown options from cached model data Function RenderModelOptions(selectedID) Dim models, output, i, safeSelectedID models = GetPrinterModelsCached() output = "" On Error Resume Next If Not IsArray(models) Or UBound(models) < 0 Then RenderModelOptions = "" Exit Function End If On Error Goto 0 ' Safely handle null/empty selectedID safeSelectedID = 0 If Not IsNull(selectedID) And selectedID <> "" And IsNumeric(selectedID) Then safeSelectedID = CLng(selectedID) End If For i = 0 To UBound(models) If CLng(models(i, 0)) = safeSelectedID Then output = output & "" Else output = output & "" End If Next RenderModelOptions = output End Function ' Get all support teams (cached) - for application dropdowns Function GetSupportTeamsCached() Dim cacheKey, cacheAge, cachedData cacheKey = "dropdown_support_teams" ' Check cache If Not IsEmpty(Application(cacheKey)) Then cacheAge = DateDiff("n", Application(cacheKey & "_time"), Now()) If cacheAge < CACHE_DROPDOWN_TTL Then GetSupportTeamsCached = Application(cacheKey) Exit Function End If End If ' Fetch from database Dim sql, rs_temp, resultArray(), count, i sql = "SELECT supporteamid, teamname FROM supportteams WHERE isactive=1 ORDER BY teamname ASC" Set rs_temp = objConn.Execute(sql) ' Count rows count = 0 While Not rs_temp.EOF count = count + 1 rs_temp.MoveNext Wend If count = 0 Then Set rs_temp = Nothing GetSupportTeamsCached = Array() Exit Function End If ' Reset to beginning rs_temp.MoveFirst ' Build array ReDim resultArray(count - 1, 1) ' supporteamid, teamname i = 0 While Not rs_temp.EOF resultArray(i, 0) = rs_temp("supporteamid") resultArray(i, 1) = rs_temp("teamname") i = i + 1 rs_temp.MoveNext Wend rs_temp.Close Set rs_temp = Nothing ' Cache it Application.Lock Application(cacheKey) = resultArray Application(cacheKey & "_time") = Now() Application.Unlock GetSupportTeamsCached = resultArray End Function ' Render dropdown options from cached support team data Function RenderSupportTeamOptions(selectedID) Dim teams, output, i, safeSelectedID teams = GetSupportTeamsCached() output = "" On Error Resume Next If Not IsArray(teams) Or UBound(teams) < 0 Then RenderSupportTeamOptions = "" Exit Function End If On Error Goto 0 ' Safely handle null/empty selectedID safeSelectedID = 0 If Not IsNull(selectedID) And selectedID <> "" And IsNumeric(selectedID) Then safeSelectedID = CLng(selectedID) End If For i = 0 To UBound(teams) If CLng(teams(i, 0)) = safeSelectedID Then output = output & "" Else output = output & "" End If Next RenderSupportTeamOptions = output End Function ' Clear dropdown cache (call after adding/editing vendors or models) Sub ClearDropdownCache() Application.Lock Application("dropdown_printer_vendors") = Empty Application("dropdown_printer_vendors_time") = Empty Application("dropdown_printer_models") = Empty Application("dropdown_printer_models_time") = Empty Application("dropdown_support_teams") = Empty Application("dropdown_support_teams_time") = Empty Application.Unlock End Sub ' Clear list cache (call after adding/editing printers) Sub ClearListCache() Application.Lock Application("list_printers") = Empty Application("list_printers_time") = Empty Application.Unlock End Sub ' Clear ALL data cache Sub ClearAllDataCache() Dim key, keysToRemove(), count, i count = 0 ' First pass: collect keys to remove ReDim keysToRemove(100) ' Initial size For Each key In Application.Contents If Left(key, 9) = "dropdown_" Or Left(key, 5) = "list_" Then keysToRemove(count) = key count = count + 1 If count Mod 100 = 0 Then ReDim Preserve keysToRemove(count + 100) End If End If Next ' Second pass: remove collected keys Application.Lock For i = 0 To count - 1 Application.Contents.Remove(keysToRemove(i)) Next Application.Unlock End Sub ' Get cache stats Function GetCacheStats() Dim stats, key, count count = 0 For Each key In Application.Contents If Left(key, 9) = "dropdown_" Or Left(key, 5) = "list_" Or Left(key, 7) = "zabbix_" Then If Right(key, 5) <> "_time" And Right(key, 11) <> "_refreshing" Then count = count + 1 End If End If Next stats = "Cached items: " & count GetCacheStats = stats End Function %>