Attribute VB_Name = "Database" Option Explicit Private p_cnn As ADODB.Connection Private p_intSKU As Long Private p_intAuthoringGroup As Long Private p_strUserName As String Private p_dictStopSigns As Scripting.Dictionary Private p_dictStopWords As Scripting.Dictionary Private p_dictKeywords As Scripting.Dictionary Private p_dictSynonymSets As Scripting.Dictionary Private p_dictSynonyms As Scripting.Dictionary Private p_dictTaxonomyNodes As Scripting.Dictionary Private Const EID_KID_SEPARATOR_C As String = "/" Private Const KEY_PREFIX_C As String = "KEY" Private Const ROOT_KEY_C As String = "KEY1" Private Const SYNONYM_C As String = "SYNONYM" Private Const SUPER_KEYWORD_C As String = "SuperKeyword" Private Const SYNSET_ID_C As String = "ID" Private Const HHT_OPERATOR_C As String = "OPERATOR" Private Const HHT_OPERATION_C As String = "OPERATION" Private Const OPERATOR_SEPARATOR_C As String = ";" Public Sub OpenDatabaseAndSetSKU( _ ByVal i_strDatabase As String, _ ByVal i_intSKU As Long _ ) On Error GoTo LError p_AllocateDBGlobals p_cnn.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _ "Data Source=" & i_strDatabase & ";" p_intSKU = i_intSKU p_intAuthoringGroup = GetParameter(p_cnn, AUTHORING_GROUP_C) p_strUserName = GetUserName1 p_ReadDatabase LEnd: Exit Sub LError: Err.Raise E_FAIL, , "Unable to open database " & i_strDatabase & ": " & Err.Description End Sub Public Sub ImportTaxonomyEntry( _ ByVal i_DOMNode As MSXML2.IXMLDOMNode _ ) On Error GoTo LError Dim rs As ADODB.Recordset Dim strQuery As String Dim intParentTID As Long Dim intOrderUnderParent As Long Dim strCategory As String Dim strEntry As String Dim strNewCategory As String Dim strVisible As String Dim strSubSite As String Dim blnLeaf As Boolean Dim intTID As Long strCategory = XMLGetAttribute(i_DOMNode, HHT_CATEGORY_C) If (Not p_dictTaxonomyNodes.Exists(strCategory)) Then Err.Raise E_FAIL, , "Category " & strCategory & " doesn't exist" Exit Sub End If intParentTID = p_dictTaxonomyNodes(strCategory)(0) intOrderUnderParent = p_dictTaxonomyNodes(strCategory)(1) Set rs = New ADODB.Recordset strQuery = "" & _ "SELECT * " & _ "FROM Taxonomy" rs.Open strQuery, p_cnn, adOpenForwardOnly, adLockOptimistic strEntry = XMLGetAttribute(i_DOMNode, HHT_ENTRY_C) blnLeaf = IIf((strEntry = ""), True, False) strVisible = XMLGetAttribute(i_DOMNode, HHT_VISIBLE_C) strSubSite = XMLGetAttribute(i_DOMNode, HHT_SUBSITE_C) rs.AddNew rs("ModifiedTime") = Now rs("Comments") = "" rs("ENUTitle") = p_GetValue(i_DOMNode, HHT_TITLE_C) rs("ENUDescription") = p_GetValue(i_DOMNode, HHT_DESCRIPTION_C) rs("Type") = XMLGetAttribute(i_DOMNode, HHT_TYPE_C) rs("ContentURI") = XMLGetAttribute(i_DOMNode, HHT_URI_C) rs("SKUs") = p_intSKU rs("ParentTID") = intParentTID rs("Leaf") = blnLeaf rs("BaseFile") = "" rs("LocInclude") = LOC_INCLUDE_ALL_C rs("Visible") = IIf((strVisible = ""), True, strVisible) rs("Keywords") = GetKeywords(p_cnn, i_DOMNode, p_dictKeywords) rs("OrderUnderParent") = intOrderUnderParent rs("AuthoringGroup") = p_intAuthoringGroup rs("IconURI") = XMLGetAttribute(i_DOMNode, HHT_ICONURI_C) rs("SubSite") = IIf((strSubSite = ""), False, strSubSite) rs("Username") = p_strUserName rs("Entry") = strEntry rs("NavigationModel") = p_GetNavigationModel(i_DOMNode) rs.Update intTID = rs("TID") p_dictTaxonomyNodes(strCategory) = Array(intParentTID, intOrderUnderParent + 1) If (Not blnLeaf) Then strNewCategory = strCategory If (strNewCategory <> "") Then strNewCategory = strNewCategory & "/" & strEntry Else strNewCategory = strEntry End If p_dictTaxonomyNodes.Add strNewCategory, Array(intTID, MAX_ORDER_C) End If LEnd: Exit Sub LError: Err.Raise E_FAIL, , "While importing " & i_DOMNode.XML & ": " & Err.Description End Sub Public Sub ImportOperators( _ ByVal i_DOMNodeList As MSXML2.IXMLDOMNodeList _ ) Dim strOperator As String Dim strOperation As String Dim strOperatorsAnd As String Dim strOperatorsOr As String Dim strOperatorsNot As String Dim DOMNode As MSXML2.IXMLDOMNode strOperatorsAnd = GetParameter(p_cnn, OPERATORS_AND_C) & "" strOperatorsOr = GetParameter(p_cnn, OPERATORS_OR_C) & "" strOperatorsNot = GetParameter(p_cnn, OPERATORS_NOT_C) & "" For Each DOMNode In i_DOMNodeList strOperator = XMLGetAttribute(DOMNode, HHT_OPERATOR_C) strOperation = UCase$(XMLGetAttribute(DOMNode, HHT_OPERATION_C)) Select Case strOperation Case "AND" If (strOperatorsAnd = "") Then strOperatorsAnd = strOperator Else strOperatorsAnd = strOperatorsAnd & OPERATOR_SEPARATOR_C & strOperator End If Case "OR" If (strOperatorsOr = "") Then strOperatorsOr = strOperator Else strOperatorsOr = strOperatorsOr & OPERATOR_SEPARATOR_C & strOperator End If Case "NOT" If (strOperatorsNot = "") Then strOperatorsNot = strOperator Else strOperatorsNot = strOperatorsNot & OPERATOR_SEPARATOR_C & strOperator End If End Select Next SetParameter p_cnn, OPERATORS_AND_C, strOperatorsAnd SetParameter p_cnn, OPERATORS_OR_C, strOperatorsOr SetParameter p_cnn, OPERATORS_NOT_C, strOperatorsNot End Sub Public Sub ImportStopSign( _ ByVal i_DOMNode As MSXML2.IXMLDOMNode _ ) Dim strStopSign As String Dim strContext As String Dim intContext As Long Dim rs As ADODB.Recordset Dim strQuery As String strStopSign = XMLGetAttribute(i_DOMNode, HHT_STOPSIGN_C) strContext = UCase$(XMLGetAttribute(i_DOMNode, HHT_CONTEXT_C)) Select Case strContext Case HHTVAL_ANYWHERE_C intContext = CONTEXT_ANYWHERE_E Case Else intContext = CONTEXT_AT_END_OF_WORD_E End Select If (p_dictStopSigns.Exists(strStopSign)) Then If (p_dictStopSigns(strStopSign) <> intContext) Then frmMain.Output "Existing StopSign """ & strStopSign & """ has opposite context", LOGGING_TYPE_WARNING_E End If Exit Sub End If Set rs = New ADODB.Recordset strQuery = "" & _ "SELECT * " & _ "FROM StopSigns" rs.Open strQuery, p_cnn, adOpenForwardOnly, adLockOptimistic rs.AddNew rs("StopSign") = strStopSign rs("Context") = intContext rs.Update p_dictStopSigns.Add strStopSign, intContext End Sub Public Sub ImportStopWord( _ ByVal i_DOMNode As MSXML2.IXMLDOMNode _ ) Dim strStopWord As String Dim rs As ADODB.Recordset Dim strQuery As String strStopWord = XMLGetAttribute(i_DOMNode, HHT_STOPWORD_C) If (p_dictStopWords.Exists(strStopWord)) Then Exit Sub End If Set rs = New ADODB.Recordset strQuery = "" & _ "SELECT * " & _ "FROM StopWords" rs.Open strQuery, p_cnn, adOpenForwardOnly, adLockOptimistic rs.AddNew rs("StopWord") = strStopWord rs.Update p_dictStopWords.Add strStopWord, True End Sub Public Sub ImportSynset( _ ByVal i_DOMNode As MSXML2.IXMLDOMNode _ ) ' The error handling is a hack. It is required, because a synonym set may have ' 2 keywords: "800 X 600" and "800 x 600". However, they are the same keyword. ' So rs2.Update will fail. The solution is to remember that we have already ' created the synonym and not try to create it again. On Error Resume Next Dim rs1 As ADODB.Recordset Dim rs2 As ADODB.Recordset Dim strQuery As String Dim intEID As Long Dim intKID As Long Dim DOMNode As MSXML2.IXMLDOMNode Dim strKeyword As String ' Dim blnSynonymSetNamed As Boolean intEID = XMLGetAttribute(i_DOMNode, SYNSET_ID_C) Set rs1 = New ADODB.Recordset strQuery = "" & _ "SELECT * " & _ "FROM SynonymSets" rs1.Open strQuery, p_cnn, adOpenForwardOnly, adLockOptimistic rs1.AddNew rs1("Name") = "Not named yet" rs1("EID") = intEID rs1.Update Set rs2 = New ADODB.Recordset strQuery = "" & _ "SELECT * " & _ "FROM Synonyms" rs2.Open strQuery, p_cnn, adOpenForwardOnly, adLockOptimistic If (Not i_DOMNode.firstChild Is Nothing) Then For Each DOMNode In i_DOMNode.childNodes If (DOMNode.baseName = SYNONYM_C) Then strKeyword = DOMNode.Text If (strKeyword <> "") Then intKID = GetKID(p_cnn, strKeyword, p_dictKeywords) rs2.AddNew rs2("EID") = intEID rs2("KID") = intKID rs2.Update ' If (Not blnSynonymSetNamed) Then ' rs1("Name") = strKeyword ' rs1.Update ' blnSynonymSetNamed = True ' End If End If ElseIf (DOMNode.baseName = SUPER_KEYWORD_C) Then rs1("Name") = DOMNode.Text rs1.Update End If Next End If End Sub Public Sub SetDomFragment( _ ByVal i_strXML As String _ ) Dim strName As String Dim strXML As String strName = DOM_FRAGMENT_HHT_C & p_intSKU strXML = GetParameter(p_cnn, strName) & vbCrLf & i_strXML SetParameter p_cnn, strName, strXML End Sub Public Sub FinalizeDatabase( _ ) FixOrderingNumbers p_cnn End Sub Private Function p_GetValue( _ ByVal i_DOMNode As MSXML2.IXMLDOMNode, _ ByVal i_strName As String _ ) As String On Error Resume Next Dim str As String str = XMLGetAttribute(i_DOMNode, i_strName) If (str = "") Then str = i_DOMNode.selectSingleNode(i_strName).Text End If p_GetValue = str End Function Private Function p_GetNavigationModel( _ ByVal i_DOMNode As MSXML2.IXMLDOMNode _ ) As Long Dim str As String str = LCase$(XMLGetAttribute(i_DOMNode, HHT_NAVIGATIONMODEL_C)) Select Case str Case NAVMODEL_SERVER_STR_C p_GetNavigationModel = NAVMODEL_SERVER_NUM_C Case NAVMODEL_DESKTOP_STR_C p_GetNavigationModel = NAVMODEL_DESKTOP_NUM_C Case Else p_GetNavigationModel = NAVMODEL_DEFAULT_NUM_C End Select End Function Private Sub p_AllocateDBGlobals() Set p_cnn = New ADODB.Connection Set p_dictStopSigns = New Scripting.Dictionary Set p_dictStopWords = New Scripting.Dictionary p_dictStopWords.CompareMode = TextCompare Set p_dictKeywords = New Scripting.Dictionary p_dictKeywords.CompareMode = TextCompare Set p_dictSynonymSets = New Scripting.Dictionary Set p_dictSynonyms = New Scripting.Dictionary Set p_dictTaxonomyNodes = New Scripting.Dictionary p_dictTaxonomyNodes.CompareMode = TextCompare End Sub Private Sub p_ReadDatabase() p_ReadStopSigns p_ReadStopWords p_ReadKeywords p_ReadSynonymSets p_ReadSynonyms p_ReadTaxonomyNodes End Sub Private Sub p_ReadStopSigns() Dim rs As ADODB.Recordset Dim strQuery As String frmMain.Output "Reading existing Stop Signs", LOGGING_TYPE_NORMAL_E Set rs = New ADODB.Recordset strQuery = "" & _ "SELECT * " & _ "FROM StopSigns" rs.Open strQuery, p_cnn, adOpenForwardOnly, adLockReadOnly Do While (Not rs.EOF) p_dictStopSigns.Add rs("StopSign").Value, rs("Context").Value DoEvents rs.MoveNext Loop End Sub Private Sub p_ReadStopWords() Dim rs As ADODB.Recordset Dim strQuery As String frmMain.Output "Reading existing Stop Words", LOGGING_TYPE_NORMAL_E Set rs = New ADODB.Recordset strQuery = "" & _ "SELECT * " & _ "FROM StopWords" rs.Open strQuery, p_cnn, adOpenForwardOnly, adLockReadOnly Do While (Not rs.EOF) p_dictStopWords.Add rs("StopWord").Value, True DoEvents rs.MoveNext Loop End Sub Private Sub p_ReadKeywords() Dim rs As ADODB.Recordset Dim strQuery As String frmMain.Output "Reading existing Keywords", LOGGING_TYPE_NORMAL_E Set rs = New ADODB.Recordset strQuery = "" & _ "SELECT * " & _ "FROM Keywords" rs.Open strQuery, p_cnn, adOpenForwardOnly, adLockReadOnly Do While (Not rs.EOF) p_dictKeywords.Add rs("Keyword").Value, rs("KID").Value DoEvents rs.MoveNext Loop End Sub Private Sub p_ReadSynonymSets() Dim rs As ADODB.Recordset Dim strQuery As String frmMain.Output "Reading existing Synonym Sets", LOGGING_TYPE_NORMAL_E Set rs = New ADODB.Recordset strQuery = "" & _ "SELECT * " & _ "FROM SynonymSets" rs.Open strQuery, p_cnn, adOpenForwardOnly, adLockReadOnly Do While (Not rs.EOF) p_dictSynonymSets.Add rs("Name").Value, rs("EID").Value DoEvents rs.MoveNext Loop End Sub Private Sub p_ReadSynonyms() Dim rs As ADODB.Recordset Dim strQuery As String frmMain.Output "Reading existing Synonyms", LOGGING_TYPE_NORMAL_E Set rs = New ADODB.Recordset strQuery = "" & _ "SELECT * " & _ "FROM Synonyms" rs.Open strQuery, p_cnn, adOpenForwardOnly, adLockReadOnly Do While (Not rs.EOF) p_dictSynonyms.Add rs("EID").Value & EID_KID_SEPARATOR_C & rs("KID").Value, True DoEvents rs.MoveNext Loop End Sub Private Sub p_ReadTaxonomyNodes() Dim rs As ADODB.Recordset Dim strQuery As String Dim dict As Scripting.Dictionary frmMain.Output "Reading existing Taxonomy Nodes", LOGGING_TYPE_NORMAL_E Set rs = New ADODB.Recordset Set dict = New Scripting.Dictionary strQuery = "" & _ "SELECT * " & _ "FROM Taxonomy" rs.Open strQuery, p_cnn, adOpenForwardOnly, adLockReadOnly Do While (Not rs.EOF) If (Not rs("Leaf").Value) Then dict.Add KEY_PREFIX_C & rs("TID").Value, _ Array("", rs("Entry").Value, rs("ParentTID").Value) End If DoEvents rs.MoveNext Loop p_PopulateDictTaxonomyNodes dict End Sub Private Sub p_PopulateDictTaxonomyNodes( _ ByVal i_dict As Scripting.Dictionary _ ) Dim vntKey As Variant Dim intKey As Long For Each vntKey In i_dict.Keys p_SetCategory i_dict, vntKey Next For Each vntKey In i_dict.Keys intKey = Mid$(vntKey, 4) ' Get rid of KEY_PREFIX_C p_dictTaxonomyNodes.Add i_dict(vntKey)(0), Array(intKey, MAX_ORDER_C) Next End Sub Private Sub p_SetCategory( _ ByVal i_dict As Scripting.Dictionary, _ ByVal i_strKey As String _ ) Dim strParentKey As String Dim strParentCategory As String ' The Category represented by the Node, not the Category of the Node. Dim strCategory As String Dim vnt As Variant If (i_strKey = ROOT_KEY_C) Then Exit Sub End If vnt = i_dict(i_strKey) strParentKey = KEY_PREFIX_C & vnt(2) If (i_dict(strParentKey)(0) = "") Then p_SetCategory i_dict, strParentKey End If strParentCategory = i_dict(strParentKey)(0) If (strParentKey = ROOT_KEY_C) Then strCategory = vnt(1) Else strCategory = strParentCategory & "/" & vnt(1) End If i_dict(i_strKey) = Array(strCategory, vnt(1), vnt(2)) End Sub