<%
Rem XML キャッシュ クラス
'------------------------------------------------ - ------------------
「転載する場合は著作権情報を保持してください」
'作者: ╰⑥月の雨╮
'バージョン:ver1.0
このクラスは、より使いやすくなった walkmanxml データ キャッシュ クラスを部分的に利用しています。コミュニケーションと進歩へようこそ。
'------------------------------------------------ - ------------------
クラスXmlCacheCls
Private m_DataConn 'データ ソース、開いている必要があります
Private m_CacheTime 'キャッシュ時間 (秒単位)、デフォルトは 10 分
プライベート m_XmlFile 'xml パス、絶対アドレスを使用、拡張子は不要
プライベート m_Sql 'SQL ステートメント
プライベート m_SQLArr '(読み取り専用) 返されたデータ配列
Private m_ReadOn '(読み取り専用)
検出用の読み取りモード 1-データベース 2-xml のプロパティを返します =========================== ==============
'データソース
パブリック プロパティ セット Conn(v)
m_DataConn = v を設定します
終了プロパティ
パブリック プロパティ Get Conn
接続 = m_DataConn
End プロパティ
'キャッシュ時間
Public プロパティ Let CacheTime(v)
m_CacheTime = v
終了プロパティ
Public プロパティ Get CacheTime
キャッシュタイム = m_CacheTime
End プロパティ
'xml パス、絶対アドレスを使用
Public プロパティ Let XmlFile(v)
m_XmlFile = v
終了プロパティ
Public プロパティ GetXmlFile
XmlFile = m_XmlFile
終了プロパティ
'SQL ステートメント
Public プロパティ Let Sql(v)
m_Sql = v
終了プロパティ
Public プロパティ Get SQL
SQL = m_Sql
終了プロパティ
'レコード配列を返す
Public プロパティ Get SQLArr
SQLArr = m_SQLArr
End プロパティ
'読み取りモードに戻る
Public プロパティ Get ReadOn
ReadOn = m_ReadOn
End Property
'クラスの破棄==========================================
Private Sub Class_Initialize() 'クラスを初期化する
m_CacheTime=60*10 'デフォルトのキャッシュ時間は 10 分です
End Sub
Private Sub Class_Terminate() 'クラスを解放
End Sub
'クラスのパブリックメソッド ================================= ========
レムがデータを読み取る
パブリック関数 ReadData
If FSOExistsFile(m_XmlFile) then 'Xml キャッシュが存在するため、XML から直接読み取ります
XML からデータを読み取る
m_ReadOn=2
それ以外
ReadDataFromDB
m_ReadOn=1
終了の場合
End Function
Rem は XML データを書き込みます
パブリック関数 WriteDataToXml
If FSOExistsFile(m_XmlFile) then 'xml の有効期限が切れていない場合は直接終了します
isXmlCacheExpired(m_XmlFile,m_CacheTime) でない場合は関数を終了します
終了の場合
ディムル
Dimxmlコンテンツ
ディムk
xmlcontent = ""
xmlcontent = xmlcontent & "<?xml version=""1.0""coding=""gb2312""?>" & vbnewline
xmlcontent = xmlcontent & " <root>" & vbnewline
k=0
Set Rs = Server.CreateObject("Adodb.Recordset")
Rs.open m_sql,m_DataConn,1
rs.eof ではない間
xmlcontent = xmlcontent & " <item "
rs.Fields の各フィールドについて
xmlcontent = xmlcontent & field.name & "=""" & XMLStringEnCode(field.value) & """ "
次
rs.movenext
k=k+1
xmlcontent = xmlcontent & "></item>" & vbnewline
ウェン
rs.close
Setrs=なし
xmlcontent = xmlcontent & " </root>" & vbnewline
Dim フォルダーパス
フォルダーパス = Trim(left(m_XmlFile,InstrRev(m_XmlFile,"")-1))
Call CreateDIR(folderpath&"") 'フォルダーを作成
WriteStringToXMLFile m_XmlFile,xmlcontent
End Function
'クラスのプライベートメソッド===========================================
データを読み取るXmlファイルからのRem
プライベート関数 ReadDataFromXml
Dim SQLARR() '配列
Dim XmlDoc 'XmlDoc オブジェクト
Dim objNode '子ノード
Dim ItemsLength '子ノードの長さ
Dim AttributesLength '子ノードの属性の長さ
Set XmlDoc=Server.CreateObject("Microsoft.XMLDOM")
XmlDoc.Async=False
XmlDoc.Load(m_XmlFile)
Set objNode=XmlDoc.documentElement 'ルートノードを取得します
ItemsLength=objNode.ChildNodes.length '子ノードの長さを取得します
items_i=0 から ItemsLength-1 まで
AttributesLength=objNode.childNodes(items_i).Attributes.length '子ノードの属性の長さを取得します
Attributes_i=0 から AttributesLength-1 まで
ReDim Preserve SQLARR(AttributesLength-1,items_i)
SQLArr(Attributes_i,items_i) = objNode.childNodes(items_i).Attributes(Attributes_i).Nodevalue
次
次
XmlDoc = なしを設定します
m_SQLArr = SQLARR
関数終了
Rem はデータベースからデータを読み取ります
プライベート関数 ReadDataFromDB
ディムル
DimSQLARR()
ディムk
k=0
Set Rs = Server.CreateObject("Adodb.Recordset")
Rs.open m_sql,m_DataConn,1
そうでない場合 (rs.eof および rs.bof)
rs.eof ではない間
薄暗いフィールド長
fieldlegth = rs.Fields.count
ReDim Preserve SQLARR(fieldlegth,k)
ディムフィールド
fieldi = 0 の場合 fieldlegth-1 へ
SQLArr(fieldi,k) = rs.Fields(fieldi).value
次
rs.movenext
k=k+1
ウェン
終了の場合
rs.close
Setrs=なし
m_SQLArr = SQLArr
End Function
'クラスの補助プライベートメソッド========================================= ==
Rem XMLファイルを書き込む
Private Sub WriteStringToXMLFile(filename,str)
ディム fs,ts
Set fs= createobject("scripting.filesystemobject")
IsObject(fs) でない場合は Sub を終了します
Set ts=fs.OpenTextFile(ファイル名,2,True)
ts.writeline(str)
ts.close
ts=何も設定しない
fs=何も設定しない
End Sub
Rem は XML キャッシュの有効期限が切れているかどうかを判断します
プライベート関数 isXmlCacheExpired(file,秒)
薄暗いファイル前回
filelasttime = FSOGetFileLastModifiedTime(ファイル)
If DateAdd("s",seconds,filelasttime) < Now then
isXmlCacheExpired = True
それ以外
isXmlCacheExpired = False
終了の場合
End Function
Rem はファイルの最終変更時刻を取得します
プライベート関数 FSOGetFileLastModifiedTime(ファイル)
ディム fso,f,s
Set fso=CreateObject("Scripting.FileSystemObject")
f=fso.GetFile(ファイル) を設定します。
FSOGetFileLastModifiedTime = f.DateLastModified
f = 何も設定しない
fso = 何も設定しない
End Function
Rem ファイルは存在しますか?
パブリック関数 FSOExistsFile(ファイル)
ディムfso
Set fso = Server.CreateObject("Scripting.FileSystemObject")
fso.FileExists(file) の場合
FSOExistsFile = true
それ以外
FSOExistsFile = false
終了の場合
fso = 何も設定しない
終了関数
Rem XML エスケープ文字
プライベート関数 XMLStringEnCode(str)
str&"" = "" の場合、XMLStringEnCode="":関数の終了
str = 置換(str,"<","<")
str = 置換(str,">",">")
str = 置換(str,"'","'")
str = 置換(str,"""",""")
str = 置換(str,"&","&")
XMLStringEnCode = str
関数終了
Rem フォルダ作成
プライベート関数 CreateDIR(byval LocalPath)
エラー時は次へ再開
Dim i、FileObject、patharr、path_level、pathtmp、cpath
LocalPath = Replace(LocalPath,"","/")
Set FileObject =server.createobject("Scripting.FileSystemObject")
patharr = Split(LocalPath,"/")
path_level = UBound(patharr)
i = 0 の場合 path_level まで
i=0 の場合
pathtmp=patharr(0) & "/"
それ以外
pathtmp = pathtmp & patharr(i) & "/"
終了の場合
cpath = left(pathtmp,len(pathtmp)-1)
FileObject.FolderExists(cpath) がない場合
'Response.write cpath
FileObject.CreateFolder cpath
終了の場合
次
FileObject = なしを設定します
err.number<>0 の場合
CreateDIR = False
エラークリア
それ以外
CreateDIR = True
終了の場合
終了機能
終了クラス
'キャッシュを設定する
関数 SetCache(xmlFilePath,CacheTime,Conn,Sql)
セットキャッシュ=新しいXmlCacheCls
キャッシュを設定します。Conn=Conn
キャッシュ.XmlFile=xmlFilePath
キャッシュ.Sql=SQL
キャッシュ.キャッシュタイム=キャッシュタイム
キャッシュ.WriteDataToXml
キャッシュ = なしを設定します
終了機能
'読み取りキャッシュ
関数 ReadCache(xmlFilePath,Conn,Sql,ByRef ReadOn)
セットキャッシュ=新しいXmlCacheCls
キャッシュ.Conn=conn を設定します
キャッシュ.XmlFile=xmlFilePath
キャッシュ.Sql=SQL
キャッシュ.ReadData
ReadCache=cache.SQLArr
ReadOn=キャッシュ.ReadOn
終了機能
%>
使用法:
1 データを XML にキャッシュ
コード:
プログラムコード
<!--#include file="Conn.asp"-->
<!--#include file="Xml.asp"-->
<%
セットキャッシュ=新しいXmlCacheCls
キャッシュ.Conn=conn を設定します
ache.XmlFile=Server.Mappath("xmlcache/index/Top.xml")
cache.Sql="tblProduction から上位 15 個の prod_id、prod_name、prod_uptime を選択"
キャッシュ.WriteDataToXml
%>
2 キャッシュされたデータを読み取るコード
:
プログラムコード
<!--#include file="Conn.asp"-->
<!--#include file="Xml.asp"-->
<%
セットキャッシュ=新しいXmlCacheCls
キャッシュ.Conn=conn を設定します
ache.XmlFile=Server.Mappath("xmlcache/index/Top.xml")
cache.Sql="prod_id asc による tblProduction 順序から上位 15 件の prod_id、prod_name、prod_uptime を選択"
キャッシュ.ReadData
rsArray=キャッシュ.SQLArr
isArray(rsArray) の場合
i=0 から ubound(rsArray,2) の場合
j=0 から ubound(rsArray,1) の場合
response.Write(rsArray(j,i)&"<br><br>")
次
次
終了する場合
%>
キャッシュ時間。デフォルトの単位は秒単位で 10 分です。cache.CacheTime=60*30 を自分で設定することもできます。