可个性化信息的实现的制作方法

文档序号:6568661阅读:531来源:国知局

专利名称::可个性化信息的实现的制作方法可个性化信息的实现相关申请的交叉引用本申请要求于2005年8月24日提交的第60/710,857号美国临时申请的权益,该临时申请通过引用被全部结合于此。本申请也要求于2005年8月25日提交的第60/711,580号美国临时申请的权益,该临时申请通过引用被全部结合于此。
背景技术
:几十年来,计算机已经被网络化以便在其间交换数据。一个重要的网络,即互联网,包括大量计算机以及通过计算机信道互连的计算机网络。互联网有许多用途,包括电子商务、交换像电子邮件这样的信息、检索信息并做研究等等。为了在互联网上交换信息而建立了许多标准,比如电子邮件、Gopher、和万维网("WWW")。万维网服务使服务器计算机系统(即web服务器或网站)能把信息的图形网页发送到远程客户机计算机系统。远程客户机计算系统于是可以显示网页。万维网的每个资源(例如计算机或网页)能通过一个统一资源定位符("URL")进行唯一的标识。为了査看一个特定的网页,客户机计算机系统在一请求(例如,超文本传输协议("HTTP")请求)中指定该网页的URL。该请求被转发至支持该网页的web服务器。当该web服务器接收到请求时,它把所请求的网页发送至客户机计算机系统。当客户机计算机系统接收到该网页时,它通常用一浏览器来显示该网页。浏览器通常是用于请求和显示网页的专用应用程序。目前,网页通常用超文本标记语言("HTML")来定义。HTML提供了一个标准的标签集合,定义了怎样显示网页。当用户向浏览器做出显示网页的请求时,浏览器把请求发送到服务器计算机系统以便向客户机计算机系统传送定义该网页的HTML文档。当所请求的HTML文档被客户机计算机系统接收时,浏览器显示由该HTML文档所定义的网页。HTML文档包含用来控制文本、图形、控件及其它特征的显示的各种标签。HTML文档可包含在该服务器计算3机系统或者在其他服务器计算机系统上可用的其他网页的URL。存在新的协议,比如可扩展标记语言("XML")和无线接入协议("WAP")。XML比HTML更具灵活性。WAP提供了在手持、无线设备上浏览网页的能力、等等,所述手持无线设备比如手机和便携式计算机(如PDA)。所有这些协议都提供了较为容易的方式来通过各种数据处理设备把信息提供给人们。为了进一步帮助信息交换,继续开发了许多其他用来在数据处理设备间交换数据的协议和装置。图1是可采用本发明各方面的基本且合适的计算机的框图。图2A是例示一简单且合适的系统的框图,其中本发明各方面可在一网络化的计算机环境中工作。图2B是例示对图2A系统的替换系统的框图。具体实施例方式现在将描述本发明的各个实施例。以下描述提供了用于透彻理解和描述这些实施例的具体细节。然而,本领域的技术人员能理解,没有许多这些细节也能实现本发明。此外,为避免不必要地混淆各个实施例的相关描述,没有具体示出或描述一些公知的结构或功能。以下描述中使用的术语应以其最广泛的含义来解释,即使它结合本发明的某些特定实施例的详细描述而使用。某些术语可能在以下强调,然而,在这一具体实施方式小节中,任何将以狭义方式解释的术语都会明显且特别的定义。图1及以下讨论提供了对其中可实现本发明各方面的适当计算环境的简要、通用的描述。尽管不需要,本发明各方面和各实施例会以计算机可执行指令的一般上下文来描述,例如由服务器或个人计算机这样的通用计算机所执行的例程。相关领域的技术人员会理解,本发明可以以其他计算机系统配置来实现,包括互联网用具、手持设备、可佩戴计算机、蜂窝或移动电话、多处理器系统、基于微处理器的或可编程的消费者电子设备、机顶盒、网络PC、微型计算机、大型计算机等等。本发明可体现在专用计算机或数据处理器中,它被专门编程、配置或构造以执行下面详述的一个或多个计算机可执行指令。实际上,这里一般使用的术语"计算机"是指任何上述设备以及任何数据处理器。本发明也可以在分布式计算环境中实现,其中任务或模块由通过通信网络链接的远程处理设备执行,所述通信网络例如局域网("LAN")、广域网("WAN")或互联网。在分布式计算环境中,程序模块或子例程可位于本地和远程的内存存储设备中。以下描述的本发明各方面可以被存储在或分布在包括磁性或光学可读和可移动的计算机盘计算机可读媒质上、以码片(例如EEPROM码片)存储为固件、以及电子地分布在互联网或其他网络(包括无线网络)上。相关领域的技术人员会认识到,本发明多个部分可驻留在服务器计算机上,同时相应的部分驻留在客户机计算机上。和本发明各方面特别有关的数据结构和数据传输也包含在本发明的范围内。参照图1,本发明的一个实施例采用了诸如个人计算机或工作站这样的计算机100,它具有与一个或多个用户输入设备102和数据存储设备104耦合的一个或多个处理器101。计算机还耦合到至少一个输出设备,比如显示设备106以及一个或多个任选的其他输出设备108(例如,打印机、绘图机、扬声器、触觉或嗅觉的输出设备、等)。计算机可以耦合到外部计算机,比如通过任选的网络连接110、无线收发器112或两者。输入设备102可包括键盘和/或像鼠标这样的定位设备。其他输入设备也是可能的,比如麦克风、游戏杆、笔、游戏板、扫描仪、数码相机、摄像机等。数据存储设备104可包括能存储可由计算机IOO访问的数据的任何类型的计算机可读媒质,例如磁性硬盘和软盘驱动器、光盘驱动器、磁性卡带、磁带驱动器、闪存卡、数字视频盘(DVD)、贝努里(Bernoulli)电桥、RAM、ROM、智能卡等。实际上可以使用任何用来存储或发送计算机可读指令和数据的媒质,包括到网络的连接端口或者网络上的节点,所述网络例如局域网(LAN)、广域网(WAN)或互联网(图l未示出)。本发明各方面可以在多种其他计算环境中实现。例如,参照图2A,示出带有web接口的分布式计算环境在系统200中包括一个或多个用户计算机202,每个用户计算机都包括一浏览器程序模块204,它使计算机能用互联网206访问和交换数据,包括在互联网的万维网部分内的网站。用户计算机可以基本上类似于上面参照图l描述的计算机。用户计算机可以包括其他程序模块,例如操作系统、一个或多个应用程序(文字处理或电子制表应用程序)等。计算机可以是被编程以运行各类应用程序的通用设备,或者它们可以是被优化或限定为一个特定功能或功能类的单用途设备。更重要的是,尽管以web浏览器示出,可以采用任何用来向用户提供图形用户界面的应用程序,如下详述;web浏览器和web界面的使用在此仅仅用作一个熟悉的例子。与互联网或万维网("Web")206耦合的至少一个服务器计算机208执行用来接收、路由和存储像网页、音频信号和电子图像这样的电子消息的大部分或全部功能。尽管示出互联网,在一些应用中可能倾向于使用像内联网这样的私有网络。网络可具有一客户机一服务器结构,其中一计算机专用于服务其他客户机计算机,或者也可以有象点对点这样的其他结构,其中一个或多个计算机同时充当服务器和客户机。与服务器计算机耦合的一个数据库210或多个数据库存储在用户计算机之间交换的大部分网页和内容。包括数据库在内的服务器计算机可采用安全手段来阻止系统上的恶意攻击,并且保证其中所存储的消息和数据(例如,防火墙系统、加密套接层(SSL)、密码保护方案、加密等等)的完整性。服务器计算机208可包括服务器引擎212、网页管理组件214、内容管理组件216和数据库管理组件218。服务器引擎执行基本的处理和操作系统层任务。网页管理组件处理网页的创建和显示或路由。用户可以通过与服务器计算机相关的URL来访问它。在下述实施例中,内容管理组件处理大部分功能。数据库管理组件包括关于数据库的存储和检索任务、对数据库的查询、以及像视频、图形和音频信号这样的数据的存储。参照图2B,系统200的一个替换实施例被示出为系统250。系统250基本上类似于系统200,但包括不止一个服务器计算机(示出为服务器计算机1、2、...J)。负载平衡系统252平衡几个服务器计算机上的负载。负载平衡是本领域中公知的用来在两个或多个计算机之间分布处理负载的技术,从而更有效地处理指令和路由数据。这一负载平衡器可以分布消息话务,特别是在峰值话务时间。分布式文件系统254把web服务器耦合到几个数据库(示出为数据库1、2、...J)。分布式文件系统是一类文件系统,其中文件系统本身管理并透明地定位来自远程文件或数据库的信息(例如内容页面)以及像LAN这样的网络上的分布式文件。分布式文件系统也管理从数据库读取函数并将函数写入到其中下面提供了本发明至少一个实施例的进一步细节。通常,本发明各实施例的详细描述不是穷尽性的,也不把本发明限制为仅限于公开的内容。尽管上面为说明起见描述了本发明的特定实施例和例子,然而本领域的技术人员会认识到,各种等价的修改在本发明范围内也是可行的。例如,虽然过程或方框以给定的次序示出,其他实施例可以执行具有不同次序的步骤的例程,或者采用具有不同次序方框的系统,一些过程或方框可以被删除、移动、添加、细分、组合和/或修改。这些过程或方框的每一个都可以以多种不同方式实现。同样,虽然有时处理或方框示出为在时间上顺序执行,这些过程或方框也可以在时间上并行的执行,或者可以在不同时刻执行。本发明各方面可以被存储在或分布在计算机可读媒质上,包括磁或光可读的计算机盘、硬线或预编程码片(例如EEPROM半导体码片)、纳米技术存储器、生物存储器、或其他数据存储媒质。实际上,计算机实现的指令、数据结构、屏幕显示器以及按照本发明各方面的其他数据可以在互联网或其他网络(包括无线网络)上分布、可以在一段时间在一传播媒质上的传播信号(例如,电磁波、声波等)上分布,或者它们可以在任何(分组交换的、电路切换的或其他方案的)模拟或数字网络上提供。本领域的技术人员会认识到,本发明的多个部分可驻留在服务器计算机上,而同时相应的部分驻留在像移动或便携式设备这样的客户机计算机上,因此,尽管这里描述了特定的硬件平台,本发明各方面同样也可应用于网络上的节点。这里提供的本发明的原理可应用于其他系统,而并非必须这里描述的系统。这里所述的各个实施例的元素和动作可以组合以提供其他实施例。考虑到以上具体实施方式,可以对本发明做出这些及其它变化。虽然上述描述具体说明了本发明的各个实施例并描述了所构想的最佳模式,然而无论上面文本的描述多么详尽,本发明也可以以许多方式来实现。本发明的细节在其实现细节上可以显著地改变,而同时被这里所公开的发明所包含。如上所述,在描述本发明特定特征或方面时所用的特定术语不应该用来意指该术语在此定义为限制为该术语与之相关联的本发明的任何特定的特征、特性、或方面。通常,权利要求书中所使用的术语不应把本发明限制为说明书中公开的特定实施例,除非在具体实施方式中具体定义了这样的术语。此外,本发明的实际范围不仅包括所公开的实施例,而且还包括实现本发明的所有等价方式。下面定义了一些特征1.可调用包(CW)。"可调用包"层易于在.NET中实现COM对象,并且在非管理代码中实现.NET对象。本发明的系统比简单的界面汇集系统更为可扩展。特别是,它使你能创建适用于.NET或COM的完全不同的界面,并且在它们之间提供比简单的汇集更为强大的转换层。它使用COM集合来提供从单个.NET对象的多界面汇集。创建了原本只在非管理领域可行的在.NET中进行处理的能力。下面是代表列表a.在.NET中建立索引服务器过滤器(IndexServerFilter)b.在.NET中建立IE扩展,包括工具条c.在.NET中建立Shell扩展(ShellExtension)d.在.NET中建立上下文菜单(ContextMenus)e.在.NET中访问扩展的MAPI(ExtendedMAPI)f.在.NET中访问NT日志API(NTJournalAPIs)g..NET中的HTML对象模型(ObjectModel)访问h.到.NET事件的普通IDispatch事件(GenericIDispatchEvent)映射2.数据库相关COM技术。我们写了一个COMAPI来允许人们实现扩展的所存储过程。还写了一简单COMAPI来实现使用正numXXX仅简单转发OLEdb行集合。现有的ATL基础设施仅支持数据结构上完全加载在存储器中的行集合。本发明的实现使你能返回在请求时被构建为行的结果。3.扮演的异步操作。创建了一.NET基础设施来允许用户扮演时的异步操作。这一精细的基础设施允许操作被异步或同步地写、允许嵌套操作、并且具有内置错误或具有内置能力来传播错误和进程信息。4.视图。创建了一个用于以XML定义视图的模型。该模型能定义作用于源数据的特定元素上的组件。然后提供一视图编译器,它把该模型编译为对于各个输出技术特定的格式,例如XSLT和ASP。关键创新在于本发明的视图定义以及它们所包括的组件独立于任何特定的查看技术。5.XML更新图(XMLUpdategram)。定义了一种用户直觉文件格式来描述对任何XML文档的变化。更新格式与原始格式相同,几乎没有影响更新语义的注释。提供一算法,它使用原始文档、更新文档和模型信息以应用更新图并生成一新文档。更新算法有特殊的支持以便更新更新图本身。这一技术被应用于产品中的许多不同的情况。a.编辑仪表板、查看b.使用更新图语义创建模板文档c.由于更新图的小型特性而允许http上的Ajax型文档编辑d.通过减少冲突支持更佳的多用户语义。6.XHTML更新图(XHTMLUpdategrams)。它是上述XML更新图语义的具体形式,作用于XHTML文件格式。提供了一种代码实现,它将此更新图应用于浏览器中的活动HTML树。使用浏览器中的IMarkupServices支持来对树作出必要的变化。此外,构建更新图知道XSLT能转换兼容模型的XML更新图以生成XHTML更新图。7.PRL/Href/ld转换。提供了一种用于快速和永久地把"本地"名称(专用于特定名字空间的名称)转换成通用名称的系统。一些特征包括1)在任何数量的本地名字空间上的工作,2)使通用ID创建发生在任何机器上并且作用于使用该系统的任何其他机器上。8.视为数据库的ACL。各种ACL容器(文档、别名、令牌)被视为ACL表格。这使各种ACL更新/合并活动完全发生在数据库中作为所存储的过程,所存储的过程能改进性能并能实现复杂特征。9.数据库设置。开发了一种基于XML的数据库定义语言,以及读取该XML并生成或更新数据库的处理器。许多特征内置于此(也可以有更多)。特征包括定义命名的常量、在设置时(尚未实现但设计的)评估的定义命名的表示、把外来关键字关系、索引和约束与核心列定义相集成的表格定义、基于XML表格初始化数据的能力。10.用于表示结构化数据的框架。为了有效地把.NET部件所返回的数据插入微软SQL服务器数据库中,开发了一种框架,它能把由受管理代码返回的结构化数据的任意流显示为OLEDB提供器行集合。框架受元数据驱动,并且使用Win32IPC功能(比如命名的管道及其它)。它实现和微软SQL服务器在同一进程中运行的普通OLEDB提供器,有效地把对以T-SQL语言输入的数据的请求流化为.NET代码、并把所返回的数据流显示为OLEDB行集合。该框架为返回元数据的所有所需OLEDB接口以及从.NET部件回流的结果动态发现的结果集合提供了稳健的实现。由于使用了流化模式,该框架是性能和内存有效的,并且能在.NET代码仍产生结果的同时开始消耗数据。11.搜索集成的滚动条(示出滚动条上的点击)。如今的视图有两种搜索支持a)随着用户键入字符序列,视图滚动至所排序字段的值与至此键入的文字相9匹配的位置。例子根据收件箱中的from字段来排列,并且键入滚动的人名。b)用户键入一些搜索文本,视图过滤各项以便仅示出和搜索标准相匹配的内容。搜索滚动条特征不过滤或要求对列进行排序。搜索在被浏览的项的范围上完成。匹配项的结果通过在滚动条上有表示所匹配项的带来表示。用户能通过点击滚动条上的彩色带来容易地滚动至所关注的项。这一特征的有趣应用是历史视图。人们时常记得他们在做某一特定活动或搜索的时刻附近发生的一些事。通过使用这一滚动条特性,用户能滚动历史中的该点,以确定他们所查找的url是否在列表中。XMLUpdateGram(XML更新图)。xml更新图的原本目标是查找一个能更新任何XML文档的基于直觉标准的格式。这是为了更新数据库记录而不是纯的树形数据结构。web的另一种特色在于xml更新图是非常xml的且非常详细的。然而,它不是一个标准。定义了一种新的语法,它看上去更像几乎没有属性的原始格式。这种方法使格式降级很好地常规更新,并且更为直观。UpdateGramAttributes(更新图属性)。如上所述,更新图格式与原始文件格式(它正在影响的实际文件格式)相同。所有元素名和分层都和原始格式相同,并且可能不引入新的分层元素。然而,通过xml分层,可能有描述怎样更新目标文档的属性标注。属性的描述以及它们的含义。xaug:oporxaug:operation以下是这一属性所允许的值和含义"new":插入这一节点并且缺省地替换所有其内容"update":将这一节点与目标文档中另一节点相匹配并且更新它"delete":将这一节点与目标文档中另一节点相匹配并且删除它如果属性不存在于给定节点。缺省值继承自父节点。在根节点情况下,这一缺省为"new"。xaug:selorxaug:select:这一属性是为了查找目标文档中将要被影响的目标节点。注意到这一属性即使在操作为"new"时也是有意义的。通过使用"new"选择,能有效地替换该节点而不是仅仅更新它。选择属性有各种形式。:如果节点在这一模式中仅出现一次(例如根节点),则它仅与一个节点匹配。通常,每个节点类型定义了它的缺省选择属性。例如,如果标记具有一主关键字,它能隐含地使用关键字作为选择。因此不需要规定选择声明,只要节点上有主关键字("id")属性便足够。"46":这一给出的值用于匹配当前节点类型的主关键字以査找目标节点"@id='46,"它是在父节点的目标上运行的xpath表达式,用于査找在先未被用作另一源节点的和标准匹配的目标的第一节点。xaug:posorxaug:position:这一属性是为了在更新或替换后定位节点。这一属性的语法格式为"[source-match]〉[target-match]"或"[source-match]〈[target-match]"。Source-match把源节点上的一特定属性规定为插入/更新。target-match是目标-父亲上用于查找定位节点的xpath表达式。〉意味着新节点在之后被插入,<意味着在之前被插入。这一属性有许多变体。ceY="query,ici''/><columnname-',sourceid"type-"int"/>〈columnname="sourcetype"type=f,xnt"/><columnname=":rsid"type:"bigiiit"/><colusmname="urlid"type-"int',fo:reignlcey="iteminfo,ici"/><columnname="args"type="nvarchar(256)"/><columnname="topri"type=',:lrvt"/><columnname=',rorder"type=',antn/>■ccolumnnameyusn"type-"bigirit,,/》<indexname="ix—gueryplari"><formula>formulaseeoriginaldocumentpage14</formula>SELECTgueryid,sourceid,rsid,reid,qreid,rorder,rsubord&rFROMqa:rawWHERE(rowtype=$rte!iink$)UNIONSELECTqueryid,sourceid,rsid,0,0,MAX(rorder),M工N(rsubordeFTOMgrrawWHERE(sourcetype$rstNative$ORsourcetype-$rstPlan$)ANDreid=0GROUPBYqueryid,sourceid,rsid</sou2:ce></view><viewname="qrefinal')<source>SELECTgreraw.queryid,qreraw.rsid,greraw,reicl,greorder,rorder,qreorder.rsuborderFROM(SELECTquoryid,qreid,CASEqreiciW鹏0THEM$inaxzorde;r$ELSSSUM(rorder)+(OxFF-MIN(sourceid))ENDASirorder,MIN(rsuborcier〉ASrsuborderFROMgrerawGROUPBYqueryid,qreid)qreorderI柳ERJO工WqrerawONqreorder.query丄d=qreraw.queryidANDgreorder,greiddbo.qreraw.qreid</source><viewname-"qrfinal">SELECTTOP100PERCENTqrr亂queryid,sourceid,greidASreid,rowtype,valueFROMqrefinal-INNERJOINqrrawONqre;final.queryid=qrraw.queryidANDgrefinal,rsid-qrraw.rsidANDqrefinal.reidqrraw.reidORDERBYqrefinal.rorderDESC,qreflnai.rsuborderASC,CASEWHENrowtype&gt,'$RTESOURCEFlRST$ANDrowtype&lt;$RT£SOURCELAST$ANDqreici卜0THEN$RTESOURCEFIRST$EIiSErowtypeENDASC,rowtypeASC,qrraw,rsuborderASC</souxce></view><viewrmme="qrbacklink"SELECTDISTINCTgroupingin:foex.groupurlidASur]j.d,queryplanqueryidFROMqueryplanINNERJOINresultcacheONgueryplan,rsidresultcache.rsid工卵ERJOINgroupinginfoexONresultcache,reid-grouping丄nfoex.urlidWHEREresultGache.rowtype$rteliink$15<viewnanie=,'q3:planent::cies,,><sourc8>SELECTgueryplan*gueryid,queryplaruidASrownum,iteminfoex,idasre丄d,iteminfoex,hrefashref,queryplan.sourceid,gueryplan,sourcetypePROMqueryplanJOINiteminfoexONqueryp丄an,urlid=it柳infoex.iciWHEREqueryplaruurlidIS匿NUKL</source></view><soui:ce>queryplan*idasrown翩,itemirifoesc-idasreid,$:rteEirror$asrowtype,resoltcsche.valueFROMqueryplanJOINiteminfoexONqueryplan,urlid-iterainfoex.idJOINresultcachequeryplan,rsid-resultcache,rsidWHEREqueryplan,urlidISNOTNULLANDresultcache,rowtype=$rtfError$</source></vxew><vxewnsme^,'qrplandelayedresults"><scmirce>SELECTqueryplanqueryid,gueryplsn,idasrownuir.,iteminfoex.idasre丄d,$rteDelayed$asrowtype,resultcache.valueFROMqueryplanJOINitemin;fo2cONqueryplsntrtliditeminfoex.idJOINresultcacheONqueryplan.rsid-resultcache,rsidWH鹏gueryplan.urlidISNOTNULLANDresultcache.rowtype=</soui:ce></view>(procedurename="spJewQueryId"publxc=',true"><parainname-"qusryid"type-"int"output="trtie,,/><source>--CreateaemptyqueryplannodetogenerateauniqueresultINSERTINTOquery(dummy)VALUES(0)SETGgueryid=SCOPEIDE證TYU</source></procedure>procedure諸ne-"sp一InsertQue3:yPlanEntry"pub:iic="i:r\ie''><paramname="sourcetype"type=="int"/><paramname-"url"type="nvarchar(4000)"/><parsmnajne5"args"七ype-"nvarchar(256)"/><parajnname-,'topn,'type-"int,'/><source>DECLARE@sourceid丄ntDECMRE@urlidintSET@urlid=TOIjIj工FgurlISNOT狐LBEG工MSET@finalUrl=ISMLU(dbo,PrlFi:oinlteraUrl《gurl》,EXECdbo,sp—Reg丄sterltem@url@finalUrl,=@urlidoutputEND—SELECTgsourceidWHEREgueryid=@gueryidISMJH(l+MAX(so訓eid),0),MqueryplanINSERTINTOgueryplan(queryid,rsid,sourceid,sourcetype,urlid,args,topn,rorder,usn)VALUES(@queryid,0,Osourceid,gsourcetype,@ui:l:Ld,@ai:gs,@topn,</source></procedurs><procGdu:ceri認e頃<paramname-<pai:amname=<paramname"<paramnsme=</proceduire>";sp一Irlse^tSea^chReslllt:s,,source-"InsertSearchResult.sqi"'userid"type="bigint"/>■searctistring"type="nvarchar(256)"/>化opn,'type-,'丄nt"/>'rsid"type"bigint"output**"true"/><proc:edurename=,'sp—InsertRelatieciResults''source-"工nsertRelatedResult.sql"><paramname^"guery;ld"type-"int"/><paramnamG-"i3serid"type^"bigiivt"/><pararaname=,'rsici',type效"bigirit:"output="trije"/></p:rocedure>(procedurer'ame鹏"sp一Insert3ackl:inkilesu工ts"souxce="InsrtBaclcl:LnkResult.sgl"><paramnarae="queryid"type="int"/:><paramname="userid',type="bigint"/>^parsmname巧"rsicTtype-"fc)丄g丄nt:"output="true"/></procedure><procedurename="sp—InsertQueryPlanResuits"soiirce-"InsertQueryPlanSesult,sql"><paramname="queryid"type^"int"/><paramname-"rsid"type-"big:in1:"output^</procedure>"t;rue,V><procedurename=^sp—PatchCollectionResults"><paramnameWrsid"typG^"bigint"/><source>INSERTINTOresultcache(rownum,rs丄d,reici,rowtype,value)SELECTentries■rownura,@rsid,entries.reid,CollectionEntryRows,rowtype,CollectionEntryRows.valueF顧(SELECTDISTINCTrownunvreidF訓resultcacheWHERErsid=S;csidANDreid>0)ASentriesJOINCollectionEiitryRowsONentries,reid工</source></procedure><p:rocedurename*3"sp—PatchFrsgraentResults"><paramname-"rsid"type>="bigint,'/><source>INSERTINTOresultcache(rowrmm,rsid,reid,row匕ype,value>SEIiECTentriesrownum,@rsid,entries-reid,FragmentEntryRows*rowtype,FragmentEntryRows,valueFROM(SELECTDISTINCTrownum,reid,:LatestRsidF0rUrl工d.3:siciASmasterrsidFROMre5ultcacheJOINmasteritemlookupONresultcache,reid=躯steritenlookup,fragmenturlidJOINl>atestRsidFo:rt3rUdONKiasteriteralockup,masterurlid=LatestRsidForUrlld.urlidWHEREresultcachs.rsid—rsidANDresultcache.reid>0)ASentriesJOINFragraentEncryRowsONentries,wastor:rsicl,FrsgmentSntryRows.mastea:rsidANDen七i:ies.reid=FragraentEntryRows,urlid</source></procedure><paramna助-"rsTd"type-"bigint',/><source>INSERTINTOresultcache(rownum,rsid,reid,rowtype,value)SELECTentries,rownum,(rsid,entries,reid,FragmentEntryRowsrowtype,FragmentEofcryRows.valueFROM(SELECTDISTINCT而num,reid,collectioninfo,rsiciASmasterrsiciFROMj:esultcacheJOINinas七e;rite:rdookupOMresultcache.reid=masteritemlookup.fragmenturlidJOINcollectioninfoONmasteritemlookvip.masterurlid=collect丄oninfo.idWHEREresultcache.rsid=@:rsidANDresultcache.reid>0》ASentriesJOINFragmenrEntryRowsONentries,masterrsicl-FragroentEntryRows.masteirrsidANDFragmentEntryRows曙urlid</source></procedure>-procedurename="sp__FinalizeQuery"public:source"""FirislizeQuery.sql"><paramname-,'queryid"type="int"/></procedure>-procedurename一"sp一PrepareRe3ult"source"<paramname-"quei:yid"type""int"/></procedure>(procedurename-"sp一GetUrlResuits"source-<paramname,,urTici"type="intrt/><psr3raname="usn"type="bigint"output="true"/>entriesreid'truen,PrepareRes11lt,sql"Get口rlResult.sgl"18<paramna加e-"i:s丄d"type="bigint"output="truert/></procedurs>procedurename="sp—GetQuearyResult,'somrce-"GetQueryRe3ult.sgl'<paramname"queryiciwtype敏"int"/>^proceduren3me=""3p_GetQueryResultKnownOnly'fsourcefe"GetQueryResultKnownOnlysgl<paramnaraes"gue:ry土d''type=":Lnt',/></procedure><proceciurenaine-"sp—ReadCachedRows"public=,,true"><f>arsmname-"gu^ryid',typeh',int',/><pararaname-"urlid"type-,'iivt''/><source>IF@queryid=0BEGINSELECT@queryidMMAX(gueryid)FROMqueryplan咖DEXSCsp—llpdateQuejryUrlldGqueryidSEI^CTrowtype,valueFROMqrfinal舰ERSqueryid=liqueryiciANDreid=gurlid</source></p;rocedure〉</dbsetup><"xmlversion"""<dbsetupxmlns-G"encod丄ng-"utf-8">httpr//tempuri-org/dbinit.xsd"><loginname="@\DomainUsers,,></login><linkname"XSPDB"desc;ription-"TriniergentSearchPageProvider"provider="XSPDB"/><includeresource-"extp;rocs,dsi"/><databaserjame="xa"filenaine-"c:\A6753C08E94747al83S87D12ECFlE3ES\xadats"雄lns^"http://tempuri.org/dbinit.xsd"arithabort="on"ansi—paddings"off"><Jloginn3iiie="@\DomainUse:cs";></login><roienanie=="xau3e:rs"></role>〈includeresource^,'utility,dsi"/><inciuderesou;rce="url.dsi"/><i.ncludGresoui:ce^"coritairier.clsi"/><includeresouirce^'iteEi.cisi''/><includeresource^"coUection.dsi"/><includeresoixrce="results.dsirt/>■^includeresource^groupings.dsi"/><inclucleresource"que:ry,dsi"/><inciuderesoui:cew"outbox.dsi"/><iric〕—uderesou;cce="e:cxorsdsi"/><includeresource="timang,dsi"/><inclucieresource-"re:fe;rences.dsi"/><inclucieresourcea"r印lication,dsi"/><proceciu:renante="sp—InitStore"public="true"><source>DECLAREgidintEXSCsp一RegisterCorvtainer@uri,mail://',Sfst認phint=-l,@id"@idoutputEXECsp_RegisterContainer@url=,file:///c:/,,stamphint=-1,@id=@idoutput—EXECsp—RegisterServer@href=,http://centaur/share*,@type-1</source>一</proceciure><executename="sp—InitStore"/></dbsetup>1.可调用包(CW)。.NET具有一个称为可调用包的概念。该层的主要目的是使.NET代码能调用到非管理域以及其他有关方式。在Trimergent中构建一系统,19它把可调用包的标准支持扩展为做更为复杂的接口。不像只能把经典COM接口简单地一对一地映射到.NET方法的内嵌汇集实现,我们的层使实现者能够使用在合适之处现有的.NET/COM接口,而不是定义整个新的接口。在定义了新接口的位置处,定义了方法以便和它们所用于的环境相兼容。受管理的接口是.NET友好的,不受管理的接口是COM友好的。实现包括多个基类,它们实现IUnknown、对所有受管理接口的基对象、对受管理/不受管理端的聚集、所讨论的特定COM或.NET接口的自定义实现。这里有所涉及的几个例子和实际接口。一些基层代码和接口的链接IUnknown.c卯一所有不受管理接口的基类INetObject.cpp—所有受管理接口的基类NetMarshal.cpp—用于管理短线和代理的全部创建的帮助类a.现有COM接口至现有.NET接口映射的例子IStream—流IStream:http:〃msdn.microsoft,com/librarv/defaultasDurl=/library/en-us/sta/stq/istream.aspStream:http:〃msdn.microsoft.com/librarv/default.asDuri=/librarv/en-us/cpref/html/frlrfsvstemiostreamcl.asstopic.aspIEnumVariant-lEnumerable旧numVariant-htt。:〃msdn.microsoft.com/!ibrarv/defaultasr37url=/librarv/en-us/automat/htm/chap.5..iiii,6t2.d...as。lEnumerable-http:〃msdn.microsoft.com/librarv/default.aspiirN/librafv/en-us/cpref/html/frlrfsvstemcollectionsienumerableclasstoDic.aspb.现有COM接口至新.NET接口映射的例子IOIeCommandTarget-INetCommandTarget+INetCommandlOleCommandTarget-http:〃msdn,miGrosoft.com/librarv/default,aspurl=^ibrarv/en-us/com/html/5c8b455e-7740-4171-aef6-273903113is3邻pINetCoiT)mandTarget—attachedfileINetCommandTarget,csINetCommandTarget—attachedfileINetCommand.es以下列出它所使能的功能a)构建.NET中的索引服务器过滤器(IndexServerFilters)b)构建.NET中的IE扩展,包括工具条c)构建.NET中的Shell扩展d)构建.NET中的上下文菜单(ContextMenus)e)访问.NET中的扩展MAPI(ExtendedMAPI)f)访问.NET中的NT日志API(NTJournalAPI)g).NET中的HTML对象模型访问h)至IJ.NET事件的一般IDispatch事件映射2.数据库相关的COM技术。写了一COMAPI使人们能实现扩展的所存储过程。也写了一简单COMAPI来使用IEnumXXX仅转发OLEdb行集合。现有的ATL基础结构仅支持数据结构上完全加载在内存中的行集合。我们的实现使人们能返回在请求时被构造成行的结果。3.扮演时的异步操作。所附三个"类文件"一OperationBase.es、ContextSwitchOperation.es和AbstractQueryExecute.es。也仓寸建了一.NET基础结构,允许用户扮演的异步操作。服务器运行本地系统访问(它所加载的环境)。当服务器接收一请求时,它使用调用者的访问令牌来扮演呼叫者。这使我们能在本地系统以及在调用者的内容下都能运行代码。本发明的基础结构包括一操作基类(OperationBase),它使操作异步或同步地被写入、允许嵌套操作、并且具有内嵌能力来传播误差和进度信息。导出类(ContextSwitchOperation)提供基础结构以使代码运行在本地系统和/或调用者的环境下。通过写入导出类并且覆盖两个方法(OnExecuteAsCaller、OnExecuteAsSystem),可以控制每片代码所执行的环境。在AbstractQueryExecute类中提供了一个例子。4.视图。创建了一种用于定义XML中视图的模型。该模型能定义对源数据中的特定元素进行操作的组件。然后有一个视图编译器,它把该模型编译为对于各种输出技术特定的格式,例如XSLT和ASP。关键变革是我们的视图定义和它们所包括的组件独立于任何特定的浏览技术。所附两个文件,defaultview.xsp(示例视图)禾卩emals.xsl(示例组件)。对我们的视图定义特定的所有标记都由"xview"开始。注意到在这些文件中可以看到HTML和XSLT标记。这是因为所示出的特定视图和组件基于XSLT,并且把源数据转换成HTML。然而,这些技术的使用不是体系结构所必须的。特定标记的描述xview:html表示所有包含标记的输出格式为html的标记。xview:component表示应包括"类型type"属性所引用的分量。写分量以便匹配具有已知模式的源数据(即DashboardXML格式)的特定元素,并且创建对于所匹配元素的模式特定的输出。例如,"title"分量和源数据中的"title"标记匹配,并且得知元素的内部文字包含标题的文字。xview:results表示一系列要包括的结果。输出一表格以包含结果组。200680030556.9xview:group表示一组结果。"class类"属性指定了组在总的结果集合中的情况(例如该结果组出现在哪一列中)。xview:viewitem包含一组其他xview命令的标记。目前没有功能,但能被用作设置XML名字空间前缀等的标记。xview:xslcomponentXSL专用的。创建XSLT输出,该XSLT输出指定了用于确定这一分量要应用于哪个节点的标准。xview:componentrow指定了随后的一系列分量,它们将被组合到一个行中。用于把一个项的图标和标题文字列组合在一起。xview:componentbody表示一个项的"主体body"部分,一般包含一个项的描述性文字。5.XML更新图(XMLUpdategram)。定义了用于描述对任何XML文档的变化的用户直观文件格式。更新格式与原始格式相同,基本没有影响更新语义的注释。有一个算法,它使用原始文档、更新文档和模式信息以应用更新图并产生新文档。该更新技术对处理更新更新图自身有特殊的支持。这一技术应用于产品中的许多不同情况。a.编辑仪表板、视图b.使用更新图语法创建模板文档c.由于更新图的小型特性允许http上的Ajax风格文档编辑。d.通过减少冲突支持更好的多用户语义为RSS模式产生更新图。以下例子是插入一个有标题的链接以及删除该链接值的项<xmlversion="l,0"eno3ding-"UTF-8"><rssxmlns:xaua=',http://www,tHmercient'com/xaucr><itemxaug:position="after:link=http://www.ch8ngellnkl.com"><link>http:〃www.weblink:Lcom</Hnk><t:le>WebLinkOne</titte></item><itemxaug:op="defeten><link>http:〃www,deletelink.com</link></h;em><iternxaug:op="change"><nnk>http:〃www,ch3ngeiinki.com</link><mte>WebLinkOne</t〖tle></ltem></channel></rss>xml更新图用语法更新图属性扩展了原始xml,更新图属性在名字空间中不与原始文档属性抵触。更新图属性有22Xaug:op二表示可以是"new"、"delete"、"change"的更新操作Xaug:position二使更新能把实际xml重定位到同一文档中的不同位置Xaug:select-使复杂xql语法能选择特定的xml代码进行更新。更新图引擎还使用模式定义文件来确定查找语义。例如在以上模式中,把项节点的链接字段标记为主关键字。项节点因此具有一个基于链接字段的自动隐含的选择。因此,在把节点插入文档之前,更新图引擎会使用新数据的链接字段来将其与目标文档相关。如果在文档中有相同链接字段的节点,则更新会替换文档的该部分否则插入一个新的。6.XHTML更新图(XHTMLUpdategrams)。它是上述XML更新图语法的特定形式,作用于XHTML文件格式。一代码实现将这一更新图应用于浏览器中的活动HTML树。使用浏览器中的IMarkupServices支持来对树作出必要的变化。此外,构建更新图感知XSLT以便能转换兼容模式的XML更新图以产生XHTML更新图。以下是包含有两行的表格的示例HTML<html><title>OrigiralTitle</title></head><body><tabteborder="1Hwidth="100%"id="tabtelcf><trid="row1"><td>Row1</td></tr><trid='Yow2"><td>Row2</td></tr><她1>,o争</html>更新以改变页面标题、删除一行、改变一行以及添加新行,看上去像<xmlversion="1.0"encoding="UTF-8"><咖1xmlns:xaua="http://www.trimerqentcom/xauq"><he3d><title>UpdatedTitle</title></he3d><body><tableborder=T'width="100%"id="tableld"><trid=Mraw1"xaug:op="delete"></tr><trid="row2"><td>Row2Changed</td></tr><trid="row3"><td>Row3Added</td></tr></column></row><table></body></html>IMarkupServices接口索弓Ihttp:〃msdn,microsoft.com/library/defaiilt.3spiirl=/workshop/browser/mshtml/reference/ifaces/markupservices/markuipservices.asD7.PRL/Href/ld转换。有一个系统用于快速地和永久地把"本地"名称(对于特定名字空间特定的名称)转换成通用名称。一些特征包括1)作用于任何数量的本地名字空间,2)允许通用ID创建出现在任何机器上并且作用于使用本发明系统的任何其他机器。在本发明的系统中,"PRL"(提供器资源定位符)是一URL,引用一特定提供器(即"文件")、指向特定机器上(指向"c:\foo\bar.txt"的PRL只有在它所用于的特定机器上时才是有效的)的一特定资源(即,文件"c:\foo\bar.txt")。prl的例子(硬盘驱动器上的文件)file:〃/c:/docunients%20arid0/o20settiri。s/matt/mv0/02Ddocumerits/fnvo/o20dashboEirds/audrev.xsci(MSN桌面搜索所返回的邮件项)mail:〃localhost/default/mailbox%20%20matt%20hillman%20($eOb7)/inbox/0000000011fe3d247f2121439a9fbceb4942aa6e07007e咖785咖03f4497a24簡c52c25700000000209,0026鹏6fd74c22343ada8bS079c25f43eO00000化bd1fOOOO当这些条目被扣到仪表板时,然后可能被共享,则需要把PRL转换成一通用"HREF",它是可对多个机器共享的TJRL,并唯一地指向源数据。这通过以下步骤完成a)使用标识数据的源机器的前缀,b)创建表示该条目的容器的唯一标识符(使任何容器层次变成二维),以及c)附加PRL的最后的描述性部分(通常表示文件名和扩展)。在每台机器(包括中央服务器)上,数据库存储从多个PRL到多个HREF的映射。PRL/HREF对是"注册的",并且一旦注册,则可以使用一整数ID来表示PRL/HREF对。整数ID用在数据库操作中,用于在执行查询时有效地加入关于所注册的对的信息。href的例子有(这釋是以上prl的href):,,http:〃lDcalhost/share/content.xaciiierv/nnatt01/eac518ec2ad609fb/audrev.xsi3http:〃localhost/share/content.xa。uerv/matt01/8de2c5fd53eb4281/0000000011fe3ci247f2121439a9fbceb4942aa6e07007ed607858b903f4497a241和8c52c25700000000209d0000269956fd74c22343ada8b6079c25f43e00000016bd1f0000HREF的"http:〃localhost/share/content.xaquery/MachineName"部分由软件来解译。如果"MachineName"等价于本地机器名,则可以使用本地服务器的PRL-HREF映射表把href转换成pri。否则,软件则向中央服务器转发HTTP请求,包含来自所有用户的复制文件。在服务器上,然后用服务器的PRL-HREF映射表把HREF转换成PRL。注意到HREF不再表示一特定的提供器。实际上,HREF可以被映射为客户机器上的一个提供器,但它是服务器机器上的一个完全不同的提供器。例如,当一邮件消息被复制到服务器时,它被存储为文件系统(与邮件文件夹相对)中的.MSG文件。在客户机上,该条目的PRL是"mail:..."PRL。在服务器上,PRL是"file:..."PRL。然而,HREF在始发客户机器、服务器、以及所有其他客户机器上都是一致的,并且是能够使存在于一特定客户机器上的数据条目能与其他机器共享的关键。8.被视为数据库的ACL。把各种ACL容器(文档、另lj名、令牌)视为ACL表格。例如,Windows用户的访问令牌包含该用户在一给定登录会话期间的安全信息。令牌标识该用户以及该用户所属的组,系统用这些信息来控制对安全对象的访问。一个令牌被分解为以下数据库表格TokenCache(令牌高速缓存)userid(用户标识)groupid(组标识)位置令牌所表示的用户的标识符。该列和"Userlnfo"表中的"id"列有外来关键字关系。用户所属的组(别名)的标识符。该列和"Userlnfo"表中的"id"列有外来关键字关系。"groupid"在用户令牌中的位置。Userlnfo(用户信息)idsid名称email用户、组、或计算机帐户的自动生成的(唯一)标识符。唯一地标识Windows帐户的NTSID(安全标识符)。Windows帐户的名称。Windows帐户的emailo25对于像NT安全描述符这样的其他ACL信息还有类似的"分解"数据库表格。这使各种ACL更新/合并活动完全发生在数据库中作为所存储的过程,所存储的过程能改进性能并能实现复杂特征。9.数据库设置。开发了一种基于XML的数据库定义语言,以及读取该XML并生成或更新数据库的处理器。许多特征内置于此(也可以有更多)。特征包括定义命名的常量、在设置时(尚未实现但设计的)评估的定义命名的表示、把外来关键字关系、索引和约束与核心列定义相集成的表格定义、以及基于XML表格初始化数据的能力。所附两个示例数据库描述文件。这些示例并未包括全部特征,只是说明基本概念。在该例中,dbinit.dsi是一个"主"数据库描述文件,该文件包括各种其他文件,包括相关表格、过程等的组。标记描述*dbsetup—数据库描述文件的根标记。*database—定义一数据库。许多其他元素通常作为数据库的子标记。*include—递归地包括另一数据库描述文件。可用于把相关的表格/功能/过程/视图组合在一起。*login—定义了SQL登录。*link—定义了SQL链接的数据库*role—定义了SQL任务。*local—定义了本地的(仅对该文件有效)常量。这可用于用源标记(见下)中的名称表示常量值,使代码易于理解和修改。*global—类似于本地常量,但该常量可以在所有文件中使用。*table—定义一表格。表格的子标记包括*column—定义了表列。列可以有把它们描述为主要关键字、身份列、所有列等等的属性。*index—定义了该表的多列索引。*procedure—定义了一所存储的过程。过程的子标记包括*param—定义了所存储过程的参数。*source—定义了过程的源代码。或者,过程标记可以包含引用一分开的源文件的属性"源"。*function—类似于过程,定义了用户定义的函数。*param—定义了所存储过程的参数*returns—定义了所存储过程的返回值。*source—定义了函数的源代码。*view—定义了SQL视图。26*source—定义了视图的源语句。数据库设置处理器读取描述文件并把标记转换成真实SQL命令。处理器可以以几种不同的模式运行-*create—基于描述创建数据库。*update—假定已存在数据库,更新表格/过程等,应用对描述文件所作的任何变化。*delete—删除一现有数据库。10.把.Net插入SQL服务器。为了有效地把.NET部件所返回的数据插入微软SQL服务器数据库中,开发了一种框架,它能把由受管理代码返回的结构化数据的任意流显示为OLEDB提供器行集合。框架受元数据驱动,并且使用Win32IPC功能(比如命名的管道及其它)。它实现和微软SQL服务器在同一进程中运行的普通OLEDB提供器,有效地把对以T-SQL语言输入的数据的请求流化为.NET代码、并把所返回的数据流显示为OLEDB行集合。该框架为返回元数据的所有所需OLEDB接口以及从.NET部件回流的结果动态发现的结果集合提供了稳健的实现。由于使用了流化模式,该框架是性能和内存有效的,并且能在.NET代码仍产生结果的同时开始消耗数据。以下是怎样用框架把"XspRow"对象从C絲代码流化为OLEDB代码、并且把它们显示为带有"XspRow"元数据信息的OLEDB行集合的例子。只要在来自.NET代码的"XspRow"数据变得可用时调用微软SQL服务器TSQL查询,消耗行集合,从而能把XspRow对象有效地插入数据库中。0++文件演示了实现的OLEDB端,C弁文件演示了实现的.NET端。这两端都用Win32NamedPipe(Win32命名管道)把对XspRows的请求以及所产生的行流串行化。命名管道的可编程接口被显示为C+十代码中的IStrean^接口、以及C存代码中的Stream(流)对象。附有.NET代码的实现。11.搜索集成的滚动条(示出滚动条上的点击)。如今的视图有两种搜索支持a)随着用户键入字符序列,视图滚动至所排序字段的值与至此键入的文字相匹配的位置。例子根据收件箱中的from字段来排列,并且键入滚动的人名。b)用户键入一些搜索文本,视图过滤各项以便仅示出和搜索标准相匹配的内容。搜索滚动条特征不过滤或要求对列进行排序。搜索在被浏览的项的范围上完成。匹配项的结果通过在滚动条上有表示所匹配项的带来表示。用户能通过点击滚动条上的彩色带来容易地滚动至所关注的项。这一特征的有趣应用是历史视图。人们时常记得他们在做某一特定活动或搜索的时刻附近发生的一些事。通过使用这一滚动条特性,用户能滚动历史中的该点,以确定他们所査找的url是否在列表中。27扩展的所存储过程框架api:〃----------------------------//Xproc.h〃Trime巧ent公司版权所有(c)2004—2005〃------------------------------------#include"srv,h券pi:agmaonceeraitidl(false)fobject,local,m2id(,,2FCA12CA-9AF2-41BF-83C4-咖E4744591F",helpstring〖"IXProcRow"),pointer—default(unique)]一一interfaceIXProcRow:IDntaown厂HRESULTSetColumn(constchar*szName,constVARIANT*pvarSet);HRESULTCommit();object,local,13\^("735鄉00-0008-4060-&0£4-21鄉咖3821"),helpstring〈"IXPi:ccCallback'M,pointQr一default(unique)]一—interface工XProcCallback:IOnknownt"HRESUl/TGetPararueterCount{int*pcparams)HRESULTGetParameter(constchar*szName,HRESU1jTSetParameter《constchar*szNsme,HRESUI/TCreateRowUXProcRow"pprow)服ES歸ClearRowCount()typedefHRESULT(+FNXPROC)(IXProcCallback";[emitidl(true)SRVRETCODEExecExtendedProcedure(SRV一PROC士pSrvProc,FNXTOXpfnProc);HRESULTGetStringParameter{IXProcCallback*pxpc,constchar*szName,intiPararaDefault,BSTR*pbstrValue,BOOLf歸lOK=false)HRESULTGetliOngLongParameter(IXProcCallback*pxpc,constchar*szMams,intiPararoDefauit,LONGLO,pll);祐defineDECLARE—XPROC(name)\extern"C"二declspec(cillexport)SRVRETCODK;xp—朴存ria加e(SRV—PROC*pSrvProc)\{\—一一returnExscExtendedProcedure(pSrvProc,name);\仅转发oledb行集合-〃-----------------------------------------------------------intiParamDefault,VARIANT*constVARIANT*pvarSet)/<formula>formulaseeoriginaldocumentpage29</formula><formula>formulaseeoriginaldocumentpage30</formula>—interfaceIEnumStruct:工Unkriown"THRESULTClone(IEnumStruct"ppemim);HRESOI/TSkip(UIiONGcpv);HHSSGLTGetDefiiiiticmCIStructDefirxition**ppsdsf)};object,uuid(',4550SC2C-,E-41FE-A5DF-9F19犯,9BF"),helpstring〖''IStructDBSecurityContextInterface")—interfaceIStructDBSecurityContext:工Unknown厂HRESULTGetToken(HANDLE*phToken);HRESUI/TCan工mper30nate(BOOL*can工mpersonate);HRESULTImpersonate();HRESCJLTRevertToSelf();};E-object,uuid("065D083S-D79D-4FFB-A6C8-23織淑680B"》,helpstring(,'工StructDbCoramandInterface")3—interface工StructE)BComniand:工UnknownHRESUI/TGe七Definition(IStjructDefinit土on+^ppsdef);HRESULTGetEnumerator(IStructDBSecurityContext*psc,constScjlParseResult*HRESULTCreateSDBDataSource(constCLSID*pclsid,工ClassFactory*pfactSDSCmd,lOnknown*punkOuter,REF工IDriid,Itinknown"ppunk);HRESULTCreateStructDef(constStructDefinition*psd,IStructDefination**ppsdef);Cemitidl(true)'jXspDbEimmOnStream.cpp〃//XspDbEnumOnStream.cpp//Trimergent公司版权所#(c)2004—2005〃------------------------------------#include"stdafx.h#include"xspdb.h"structXspRowFro涵anagedDWORDVslOffs由INTUrl工d;INTRowType;h'classXspDbEnuiriOnStream:publicCComObjectRoo1:Ex<CCoinMultiTh;readMod3l>,publicIEnumStructpublic:staticHRESULTCreate(IStructDefinition*s,IStream*inputStream,工EnumStimet"ppenum》CComObject<XspDbEnumOnStream>*penumNUIjIj;HRESUIjThr^b—ok^ChkBool《ppenum,E—工MVALIDARG);Chk(CCoiciObject<XspDbEimmOnStreani>::Create工11stance(&penura));pen画一>m—structDef工nt=penum-〉m』stream=i叩utStream;Chk(penum->Init())Chk(penum_>QueryIriter:face(ppenum));penum^卵KL;Error1if<permra冊IjL)tdeleteperium'*returnhr/HRESUIiTClone(IE皿raStruct"ppenum)returnE—隨工MPL;}—HRESULTNext(ULOMGcpv,void*pv,(ILONG*pcpvFetched)H固ULThr=S—OK;ChkBool(cpv濕漏1,E一INVALIDARG》;ChkBool(pcpvFetched一鹏NULiL,E一工NVAL3DARG);XspRow*row"(XspRow"pv;//读取行的尺寸dwordtotalRowSize,'Chk(ResdNimberQfBytes((BYTE*)(&t0talR0wSi2e),s土zeof(totalRowS丄ze))),'ChkBool(totalRowSize>0,E一UNEXPECTED);//读取原始行数据_BYTE*rswt)3ta一newBYTE[totalRowSize〗;Chk(ReadNumberOfBytes(rawDats,totalRowSize》);XspRowFromManaged*rowPromStreamreinterpret—cast<XspRow!TroinN,anaged*>(rawData)//检i它是否是最后一行的指示符if(rowF3roiuStream->RowNurat>erOxFFFFFFFF)〃是,它是最后一行。它的值字符串包含继之以任选错误字符串的操作的HRESULT。hr=S—FALSE,'■}else//报错—它应被重写以便更有效,并且不复制有关getURL和Val的信息。Chk(hr)row—>rowntmirowFromSt:ream->RowNuKiber;row—>rowtype效rowFromStresm—>RowTypedelete]rawDat3;if(hr==FALSE){—〃删除流对象。m__pstreaiu.Release()retuirnhr;HRESULTReset()returnE一NOTIMPL;HR咖LTSk丄p(ULONGcpv)returnE一NOTIMPL;f舰SUIiTGetDefinition(IStructDefinition**ppsdef)CHRESULThrS一OK;Chk(m一structDefInt,CopyTo(ppsdef)》;returnhr,.》BEGIN—COM—MAP(XspDbEnumOnStream)C5M—INTERFACE—ENTRY(IEr扁Struct),一COM一舰P()privatetCCoraPtr<IStream>m_pst2:eam''CComFt"IStructDefinitioii>ra—structDefInt;//CComHeapPtr<StructDefinition>m—structDef7.33鹏SUMRea咖mbe魔3ytes(BYTE会buffer,DWORDnumberOfBytes)臓S,hr=S—OK,*ULONGreadBytes/ULONGtotalReadBytes-0;while(totalReadBytes!=rrumberOfBytes)Chk《m^pstream—Read(buffer+totalReadEytes,numborOfBytes—totalReadBytes,"eadBytes));totalReadBytesrreadBytes;ChkBool(totalReadBytes=numberOfBytes,E—UNEXPECTED),'Errori'returnhr;WCHAR*ReadStringFromRowDats(BYTE:*rowStart,DWORDoffset,hr)iif(offset〉0)BYTE*curPointer;curPoin七er=rowStart+offset—sizeof(DWORD),'DWORDcurStringLen=*(reinterpret—cast<DWORD*>(curPointer)),.curPointersizeof(DWORD)WCHAR*curStr丄ngStartreinterpret—cast<WCHAR*>(curPointer);WCHAR*res,'if(FAILED(hr=CoDuplicateStringLiength(curStringStart,return而LIwreturnrss;}elsereturn〃使我们准备好读取行HRESUIiTInit《〉HRESULThr"S一OK,'//读版本'DWORDvsr;Chk(ReadNumberOfBytes((B,*)(&ver),sizeof(ver))),■ChkBool(ver1,El—UNEXPECTED)〃读字段号WORD画omelds;Chk(ReadMuraberOfBytes((BYTE*)(&numOfFields),si:seof(nuraOfFields)));ChkBOol(n碰OfPields>0,E一UNEXPECTED〉〃读元数据。注意它尚未使用,一但会在将来使该代码更为普遍的时候使用;DBTYPEcurType,.for(inti=O,'i<numOfFieWs;Chk(ReadM'JtBberOfBytes《(BYTE*)(&cui:Type),sizeof(curType))),'〃准备好开始读取行Error:returnhr;'HRESUIiTCreateXspEnumOnStream(IStructDefinition*s,IStream*stream,工En醒Struct"ppenum)returnXspDbSnumOnStreanu:Create(s,stream,ppemim);34XspRowBinarySerializaer.es〃----------------------------//XspRowBinarySerializer".cs//Trimergent公司版权所有(c)2004—2005//描述〃IEnumXspRowInfo的二进制串行化实现。二进制格式与OleDb提供器从0##代码〃中的流读回数据所用的格式兼容。〃-----------------------------------------------------------------------usingSystem,'usingSystem.I〇;usingSystem.TextusingSystem.Data.OleDb,.usingxa.api/usingxa.core,'namespacexa,xsp///<summary>///IEnumXspRow工nfo的二进制串行化实现。〃/所有字符串都是Unicode。〃/数据格式如下/〃1),式的版本信息一DWORD[4字节]。它只是一个数。///2)行的元数据。它使用DBTYPEENUM/OleDbType常量[对于C+十八NET///OleDB支持来说是相同的]来表示行的类型。每一条目是WORD[2字节]。///3)行的列表。每行具有下列格式〃/a)以字节为单位的行尺寸一DWORD。注意它不包括行尺寸信息的4字节。〃/b)行的数据[和元数据中所述的顺序相同〗。/〃b.i)对于具有固定长度(至今为非字符串)的行成员,对值本身进行写〃/b.ii)对于具有可变长度的成员,写DWORD,该DWORD指向偏移。///从字符串开始处的行数据(以字节为单位)的开始处,应注意恰在这一位置以前的DWORD包含字符串长度[BSTR方法]。偏移指向数据本身开始的位置,而非字符串长度被存储的位置。偏移值0是指空的字符串。///c)当写了所有上述信息时,则在可变尺寸字符串前写入它们的尺寸。///</summary>publicclassXspRowBinarySerializei:弁regionmembersandconstantsprivateconstU工nt32version=1;privateconstintstringLenSizelnBytes=4;//写字符串的长度所需的字节数privateconstintstringOffsetSizelnBytes=4;〃将使用Ulnt32来写字符串数据的偏移privateBinaryWriterwriter,.privateboolmetadataSerialized=false;弁endregionprivateXspRowBinarySerializer()publicXspRowBinarySerializer(StreamoutputStream)this,writer=newBinaryWriter(outputStrearu,Encoding.Unicode);///<summary>〃/用给定的写程序写单个行///</summary>///<paramnarue="ciirRow"X/param:>///<paramname-"writer"x/param>privatestaticvoidWriteRow(XspRow工nfocurRow,BinaryWriterwriter)XaTrace.Assert(curRow!=null);XaTrace.Assert(writer!=null)///注意下面ifXspRowlnfo定义。〃每个int/uint/enum占据4个字节。//每个字符串占用stringLenSizelnBytes+stringOffsetSizelnBytes个字节[长度和偏移]+字节数来写字符串字符。//stringVal;//intUrIId;//ResultRowTypeRowType,.//uintRowNumber,'intfixedRowSizePart=string〇ffsetSizelnBytes+4+4+4/intcur"RowSize,'curRowSize=fixedRowSizePart/if(curRow,Val!=null)curRowSize+=stringLenSizelnBytes+curRow.Val.Length*2;//Unicode字符占据2个字节〃写总的行尺寸。Write(curRowSize);intcurStringDataOffset=fixedRowSizePart+stringljenSizelriBytes///写val字符串数据写程序的偏移。writer.Write(curRow.Val!=nullcurStringDataOffset:0);〃写urlid。writer.Write(curRow.UrIId);〃写结果行类型。writer.Write((Int32)curRow.RowType)/〃写行号。writer.Write(curRow.RowNumber)〃根据需要写值字符串数据。if(curRow.Val!=null)writer.Write(curRow.Val.Length);writer.Write(UnicodeEncoding.Unicode.GetBytes(curRow.Val));privatestaticvoidWrite:LastRow(Bina:ryWi:iterwriter,工nt32hresult,stringerrorMessage)XspRowlnfospecialRow=newXspRowlnfo();specialRow.RowNumber=OxFFFFFFFF/specialRow.Val=String.Format("{0}{l}",hresult,errorMessage);Wr"iteRow(specialRow,writer)/writer.Flush(),*///<summary>///在单个记录中写和类型有关的元数据。///</summary>.publicvoidSerializeMetadata()XaTrace.Assert(this.writer!=null),//写文件格式版本。36this.writer.Write(version);OleDbType[]xspRowTypes=newOleDbType[]OleDbType.WChar,//值OleDbType.Integer,//url工DOleDbType.Integer,//至UInt32的RowTypeOleDbType.Unsignedlnt,//《亍号//写字段号。this.writer.Write((Ulntl(3)xspRowTypes,Length)//写XspRowlnfo的OleDbTypesUlntl6curType;for(inti=0;i<xspRowTypes.:Leiigth,.i++)curType=(Ulntl|3)xspRowTypes[i]/this.writer*.Write(curType)this.metadataSerialized=true,'///<summary>〃/把所有可用的行串行化到给定流中///</summary>publicvoidSerialize(IEivumXspRow工nfodataSource)(dataSource==null)XaTrace.LiOgExThrow();thrownewArgumentNullException("dataSource");(!this.metadataSerialized)SerializeMetadata();this.metadataSerialized=false;〃将其复位从而能重复地调用串行化while(dataSource.MoveNext())XspRowlnfocurRow=dataSource.CurrentRow/if(curRow!=null)WriteRow(curRow,this.writer)///写特殊的最后一行,表示它是流的结尾。WriteLastRow(this,writer,0,string.Empty)publicvoidSerializeRows(XspRowlnfo[]rows,boolnoMoreRows)(rows!=null)for(inti=0;i<:rows.:Length,'i++)SerializeRow(rows[i]);(noMoreRows)WriteLastRow(this.writer,0,string.Empty);37if{publicvoidSerializeRow(XspRowInfori)SerializeRow(ri,false),'publicvoidSerializeRow(XspRow工nfori,boollastRow)if(ri1=null)WriteRow(ri,this.writer)if(lastRow)WriteLastRow(this.writer,0,string.Empty);///<summary>///可用于把错误串行化到给定流中。///</sumruary>///<:paramname-"s"x/param>///<paramname-"hresult"></pa:raTn>///<paramname-"ex"></param>publicvoidWriteEr:ror(In仁32hresult,Exceptionex)WriteLastRow(this.writer,hresult,ex!=nullex.Message:string.Empty);NamedPipeStream.cpp〃-----------------------//NamedPipeStream.cpp//Trimergent公司版权所有(c)2004—2005〃------------------------------------莽inducie,,stdafx.h"掩include"objectsecurity*hwusingnamespaceSystem::10;us丄ngnamespaceSystem::Runtime::Serial:ization'-usingnamespaceSystem::Security::Ac:cesiiCorit工.ol''namespscexanamespacewini)Dublic_valueenumPipeMode)—NoWait,1,ReadByte0,ReadMessage=2,TypeByte-0,public—gcclassNamedPipeStream:publicFileStresm{—publici//NamedPipeStream//作者raman〃NamedPlpeStream(String*pipename'FileModemode,Fi.leAccessaccess,intbuffersize,ObjectSecurity*os):Fi].eStream(OpenCreateHandle(p丄pename,iuode,access,buffersize,os),NamedPipeStreara(String*pipename,FiieModemode,FiieAccessaccess,intbuffersize):F丄leStream(OpenCreateHancile(plpenaine,mode,access,buffersise),3CCSSS)《//NamedPipeStream〃作者raman〃,NamedPipeStresm(String*pipename,F"土leModemode,FileAccessaccess):FileStxeam(OpenCrQateHandle(p丄penaine,瓜ode,access,PioG—DefauItBuffer),access).'T//get—Name//作者ramanZ/—propertyString*getName()T"—returnthis->pipename;>////get—Path//作者raman〃—propertyString*get—Path()厂—returnPathFromName(this—>pipename);3//get—Mode//作者raman〃_propertyPipeModegetMode()厂—DWORDstate,.Chkli3stError(GetNamedPipeHaridleState(this—>getHPipe(),sstate,0,0,0,0,0));—return(P丄peMode)state///set—Mode//作者faman//—propertyvo丄dset—Mode(PipeModevalue)厂一DTORDstatestate=(DWORD》value;ChkliastError(SetNamedPxpeHancUeState(this—>get—HPipe()r&state,0,0));,-//PathFromName//作者raman〃staticString*PathFromName(String*pipename)returnString::Format("\\\\\ApipeW0}",pipename);39//Connect//作者raman〃voidConnect(》if<!ConnectN認edPipe(th丄s-〉get一HPipe(),0)){一DWORDerrorerror=GetljastError(〉;if(error卜ERROR一P工PE—CO碼CTED)throw(newWin32Except丄on(error));voidDisconnect()ChkLastError(DisconnectlSIamedP丄pe(this—>get_JiPipe())),'voidFlushBuffers()ChkI>astError(::FlushFileBuffers(this->get—HPipe())》;//WaitForConnect//作者raman//voidtoitForCormect()LWa丄tForCo画ct(MMPWMT—USE—DEFALT—WAIT)voidWaitForCormect(unsigned丄ntnTiraeOut)wchar—t_pin*ppipepath-PtrToStringChars(PathFroraName(pipename));tryChkLastError(WaitNamedPipe(ppipepath,nTimeOut)〉_—finallyrppipepath^0/void工mpersonateClieiit()ChkLsstError(ImpersonateNamedPipeClient(get一HPipe()))'this->isIinp)ersonating=true,*voidRevertToSelf()《if(this-〉isImpersonating)ChkLastError(::RevertToSelf(H'*this"->isImpersonating溢false;private:—propertyHANDLEget—HPipe()—厂—return(HANDLE)this力get一Handle().ToPo丄nter()//OpenCreateHandle〃作者raman40//IntPtrOpenCreateHandle(String*pipenarae,FileModemode,File&ccessaccess,intbuffersize》CreturnOpenCreateHandle(pipename,mode,sccessfbuffersize,NUKd)工ntPtrOpenCreateHand丄e(String*pipename,FileModemode,FileAccessaccess,intbuffersize,ObjectSecurity*os)工ntPtrhandle-0;"this—>pipenaine=NU!LIi,'switch(mode)caseFil暨Mode::CreateNew:handle-CreateHandle(pipename,access,buffersize,。s),'brea)c,,caseFileMode::Open:handle=OpenHandle(pipename,access),'break,*defsuit:throw(newSystem::ArgumerttException("InvalidMode")),'this—>pipename=pipename;returnhandle;》//CreateHandle//作者raman//工ntPtrCreateHandle(String*pipensme,FileAccessaccess,intbuffersize)returnCreateHandle(pipename,access,buffersize,NUIiL)/voidGetSecurityDescriptorFromObjectSecurity(ObjectSecurity*os,PSECURITYJDSSCRIPTOR*ppsd){—*ppsd-MULjIj;if(os!=NULL)unsignedcharsd工n3inForm_gc[os—>GetSecurityDescript:orBinaxyFora(),-*ppsd-LocalAlloc(ijPTR,sdInBinFo;rm力Count)Marshal::Copy(sdlnBinForm,0,*ppsd,sdlnBinForm—>Count);voidFreeSecurityDescriptorFromObjectSecurity(void*ppsd)if(ppsd)LocslFree(ppsd)》IntPtrCreateHandle(String*pipename,FileAccessaccess,intbuffersize,ObjectSecurity*os)肌冊LEhPipe=0,'wchar一t_pin*ppipepath然0,'—try(ppipepath=PtrToStringChars(PathFromName(pipename));if(osOTLL)SECURITY—ATTRIBUTESsa,'sa.blnhe三丄tHandle-false/sa.nLength=sizeof(SECTOITY—ATTRIBUTES)GetSecuri七yDescriptorPromObji^t8ecurlty(os,&sa,1pSecurityDescriptor〉;hPipe=CreateNamedPipe(ppipepath,access,PIPS—TYPE—BYTOIPIPE—REMMODE—BYTE|PIPE一柳ITP丄pe:DefaultMsx工ristanHe,—buffersize,Pipe一DefaultTimeOut,FfesSecurityDescriptorFromObjectSecurity(sa,IpSecurityDescriptor);》elsehPipe=CreateNamedPipe(ppipepath,access,PIPE—TYPE—BYTSIP工PE—READMODE一BYTE|PIPE—WAIT,Pipe—Default船xlnstsnce,buffers丄ze,buffersize,Pipe—Default了imeOut,o);"*—finally厂ppipepath=o;》return(工ntPtr)hPipe;//OpenHandle//作者raman〃IntPtrOpenHandle(String*pipename,PileAccessaccess)returnOpenHandle(pipenaiae,access,NULIj);工ntPtrOpenHandle(String*p丄pename,FileAccessaccess,ObjectSecurity*os)wchar—t^pin*ppipepath:DWORDnativeAccess=0;_tryrppipepath=PtrToStringChars(PathFromNarcie(pipensme));switch(access)caseFi〕.eAccess::Read:nativeAccess=GENERIC—REM;break,'—caseFileAccess::Write:42nativeAccess鹏GENERIC—WRITE-*break,caseFileftccess::ReadWrite:nativeAccess-GENERIC—READ|GENERIC—WRITE;break/ChkLastError(WaitNameciPipe(ppipepath,NMPWAIT一USE一DSFAUIiT一WAIT));if(os!=NCJKL)SECURITY—ATTRIBUTESS3;sa,bInheitHandle=false,-sa.length-sizeof(SECTRITY一腊R工B誰S>;GetSecurityDescriptorFromObjectSecurity(os,&sa.IpSecmrityDescriptor);hpip^CreateFileW(ppipspath,nativeAccess,FILE—SHARE—READ,OPEN一EXISTING,FILE—ATTRIBUTE—NORMAL,0);B—'reeSecurityDescrlptorFromObjectSecurity(sa.lpSecurityDescriptor)/}else1hpipe累CreateFileW(ppipepath,nativeAccess,F工LE一SHARE—READ,0,OPEN—EXISTING,F工LE—ATTRIBUTE—NORMAL,0)》—_—ChkiastError(hpipe》;finallyppipepath=0^return(工ntPtr)hpipe;String*pipename''boo;isliapersonsting/staticconstintPipe一DefaultBuffer=4096,'〃4k缓冲器staticconstintPipe_DefaultTimeOut=10000///10秒staticconstintPipe—DefaultMax工nstance=255;//最大实例allowed<xmlversion="l.0"encoding認"Windows-1252"><rssversion="20"xiainse"http://purl,org/atom/ns#"xml:base="http://localhost/share/"><channel><title>TriraergentDefaultView</title>,<typexmlns=',http://www*trimergent,coia/xasearch">xs.documentxsp〈/type》43<viewxmlns=,'http://www.trimergentcom/xasearch"><xview:htmlxmlns:xview=',h±tp://www*七rimergent,com/xview"r<xview:componenttype="title"/><xvisw:componenttype扭"searchform"/><divstyle-"margin:5px"/><xview:eompoiienttype"'providers"/><xview:results><xview:groupclass="leftcol"><xvisw:componenttype=,'SearchPages"/><xview:componenttype認"RelatedPages"/><xview:componenttype"",'Playliists"/></xviev"group><xview:groupclass="midcol">ocview:componenttype="InlineConteiit"Ocvisw:componenttype口,'Emails"/><xview:componenttype="WeblinlcsM/></xview:group><xview:groupclass-nrighi:col,,><xvisw:componenttyps。"Contacts"/><xview:component<xview:component<xview:co瓜pcmeirt<xvisw:component</xviev:graup></xview:results></xvaew:html></view></charmel>type-"Appointments"/>type*8"Documents"/>type"StickyNotes"/>type-"MediaFiles"/>-<卜-Email—>ocview:viewitemxmlns豕"http:〃www.w3,org/lS39/xhtml"xmins:xsla"hl:tp://www.w3,org/1993/XSL/Transform,'xnan曰s"httpi//purl,orgyat:oiti/iis#"xmlns:xs"http://www*tri鹏rgent,com/幼searc;h"xmlrm:xview"2it;tp://www.trime巧ent,c。m/xv">-ocview:xalccfttiponeKtname"email"seIect^"//at:iteiaOtarts-with(xs'*type,'xa,ipm.note'》"》《xview:componenttype雄"co边ponentheader"title-"幽S-**href奨"'ejaailview,xsp11—"ocsl:apply—templatesselects"草ajna;ll)aod錢曰"^<xsl:with-paramnajae頃"co顶ponent"select-"*emails,"/>ewifch-para:nnamen"li迈it"selectnSw/></xsl:apply-tempiatea></xviewxslcomponent>陽templatename。"emai;Lt6Hiplate11match="//at:iteai〖startg-with(xs:type,'xa,ipnunofce,)]'priority,ft0">-ocview:co,體entxowname="'emails***>ocview:conipoaenttype-"pi加olu3an"/><xview:componenttypessBoverlaycoluffiiiw/><xviewTco卿onenttypeMieoiico:UunaMiconsrc-瞎*images/icon-asg,gifw/>-<xview:componentboc5y><xsl:vaiue-ofseiect^"xssabstract/;Kc:nia;ia/錢fro:m瞎/><xsl:value-ofselectw"xs:a23stract/xc:mail/扱sub:iect"/></div><xsl:valueselects"sub3匕rir1g-befbre(xs:abstract/xc:rnail/@x:eceived,''》'■/》〃-《xvisw:componenttype-</xview:componentbody></xview:component3:ow>AbstractQueryExecute.es<m8/》//AbstractQueryExecute.cs//Trime巧ent公司版权所有(c)2004—200544〃描述采用査询计划(queryplan)并生成结果流//作者raman〃--------------------------------------us丄ngSystem,'usingSystem.Collections;ias丄ngSystem.Data,'usingSystem.Data.SqlClie由usingSystera,Globalization,*usingSystem.10;usingSystem,Runt丄rae工nteropServicesusingSystem.Security,Principal/usingxa,api,'usi呵core,'usingxa-store,'namespacexa,pagepublicclassAbstractQuea:yExecute:ContextSwitchOperation券regionConstruction//AbstractQueryExecute//作者raman〃publicAbstractQueryExecute(CJrigueryUrl,AbstractQueryquery,OperationCallbackcallback):base(callback)this,originalQuery-qury;this,plarx=newAbstractQueryPlan(queryUrl,thisoriginalQuery》;)弁regionPublicPropertiespublicAbstractQueryQuerygetreturnthis.originalQuery;//ContentType〃作者matt〃freturnQueryResaitStsean,c0ntentType7}〃Wew,ath./7authors:腿tt〃publicstringViewPathgetif(this.originalQuery.Format==AbstractFormat.Xsp|this.originalQuery.Format==AbstractFormat.Atom)returnnull,,returnthis.qrs.iewPath,'45弁eridregion弁reg土onVirtualimplementations//OnComplete//作者raman,savvy〃protectedoverridevoidOnComplete(CompletedEventArgse)if(e.State==OperationState.Cancelled)lock(this)if(this.activeCmd!=null)this.activeCmd.Cancel();base.OnComplete(e);OnExecuteAsCaller作者rsmsn〃〃〃protectedoverridevoidOnExecuteAsCaller(ExecuteEventArgse)base.OnExecuteAsCaller(e);this.plan.Prepare()/using(StoreCommandcmdFinalize=newStoreCommand())trycmdFinalize.CommandType=CommandType.StoredProcedure;cmdFinalize.CommandText="sp—FinalizeQuery"cmdFinalize.AddlnputParameter("@queryid",DbType,工nt32,this.plan.Id)this.ActiveCmd=cmdFinalizecmdFinalize,ExecuteNonQuery()/finallythis.ActiveCmd=null///OnExecuteAsSystem//作者raman//protectedoverridevoidOnExecuteAsSystem(ExecuteEventArgse)base.OnExecuteAsSystem(e);IDataReaderdata=null,-using(StoreCommandcmdQuery=newStoreCommand())trycmdQuery.CommandType=CommandType.StoredProcedure;cmdQuery.CommandText=(this.originalQuery.Mode==QueryMode.Known)*"sp—GetQueryResultKnownOnly":"sp—GetQueryResult";cmdQuery.AddlnputParameter("@queryid",DbType.Int32,46this.plan.Id)/this.ActiveCmd=cmdQuery/data=cmdQuery.ExecuteReader()/finallythis.ActiveCmd=null;this.qrs=newQueryResultStream(data,this.originalQuerythis.plan)this.result=this.qrs/弁endregion弁regionPrivateVariablesandmethodsprivateStoreCommandActiveCmdgetlock(this)returnthis.activeCmd;setlock(this)this.activeCmdprivateQueryResultStreamprivateAbstractQueryprivateAbstractQueryPlanprivateStoreCommand#endregionvalueqrsoriginalQuery;plan,.activeCmd;ContextSwitchOperation.es〃-----------------------//ContextSwitchOperation.es//Trimergent公司M权所有(c)2004-2005//描述//在不同于调用者的环境下(部分或完全)执行所需的操作的基类。该类为了在//调用者环境下执行以及在本地系统环境下执行提供了支持。〃注意任何ContextSwitchOperation必须异步地执行(以提供系统环境)。//任何嵌套的ContextSwithOperation必须在其父亲的OnExecuteAsCaller方法//执行期间被创建(以提供调用者环境)。〃----------------------------------------------------------------usingMicrosoft.Win32usingSystem,.usingSystem.Collections,-usingSystem.Security.Principal,'usingSystem.Threading,'usingxa.fx,.namespacexa.apipublicclassContextSwitchOperation:OperationBasepubliceventEventHandlerExecuteAsCaller=null;publiceventEventHandlerExecuteAsSystem=null;弁regionConstructionpublicContextSwitchOperation(OperationCallbackcallback):base(callback)publicContextSwitchOperation(OperationCallbackOperationCallback,ProgressCallbackprogressCallback):base(OperationCallback,progressCallback)publicContextSwitchOperation(OperationCallbackOperationCallback,OperationBaseouter,intsubUpperBound):base(OperationCallback,outer,subUpperBound)弁endregion弁regionProtectedMembersprotecteddelegatevoidUserContext(object///CallAsUser//作者'.Justin〃//Executethedelegatefunctionintheuser(non-system)context.//protectedvoidCallAsUser(UserContextuserContextFunction,objectarg)tryImpersonate();UserContextFunction(arg)finallyRevertImpersonation();//OnExecute//作者raman,justin〃protectedoverridevoidOnExecute(ExecuteEventArgse)base.OnExecute(e);if(this.Mode==OperationMode.Sync)throw(newInvalidOperationException("ContextSwitchOperationcannotbeexecutedsynchronously.")),.if(!this,callerModeComplete)tryImpersonate()/this.OnExecuteAsCaller(e);this.OnExecuteAsCallerCompleted(finallyRevertlmpersonation();if(this.callerModeComplete)this.OnExecuteAsSystem(e);//OnExecuteAsCallerCompleted〃作者Justin〃protectedvirtualvoidOnExecuteAsCallerCompleted()this.callerModeComplete=true;//OnExecuteAsCaller〃作者J"ustin〃protectedvirtualvoidOnExecuteAsCaller(ExecuteEventArgse)if(this.ExecuteAsCaller!=null)this.ExecuteAsCaller(this,e);//OnExecuteAsSystem〃作者Justin〃protectedvirtualvoidOnExecuteAsSystem(ExecuteEventArgse)if(this.ExecuteAsSystem!=null)this.ExecuteAsSystem(this,e);#endregicm弁regionPrivateMembers//扮演//作者Justin,savvy〃privatevoidImpersonate()IPrincipalnewPrincipal=null,.WindowsIdentitynewldentity=null/this.originalPrincipal=Thread.CurrentPrincipalSystem.Diagnostics,Debug.Assert(this,identityisWindowsIdentity)new工dentity=(Windowsldentity)this,identitynewPrincipal=newWindowsPrincipal(newldentity),-this,userProfile=newUserProfile(newldentity)Thread.CurrentPrincipal=newPrincipal/this.impersonatedUser=newldentity.Impersonate();//RevertImpersonation//作者Justin,savvy49privatevoidRevertlmpersonation()//撤销扮演if(this.impersonatedUser!=null)this.impersonatedUser.Undo();this.impersonatedUser=null;//回复到原始if(this.originalPrincipal!=null)Thread.CurrentPrincipal=this.originalPrincipal,.this.originalPrincipal=null,.if(this.userProfile!=null)this.userProfile.Dispose(true),.this.userProfile=newUserProfile((Windowsldentity)this.identity)/privateboolcallerModeComplete=false;privateIPrincipaloriginalPrincipal=null;privateWindows工mpersonationContextimpersonatedUser=null,privateUserProfileuserProfile=null,'#endregionOperationBase.es//--------------//OperationBase.cs//Trimergent公司版权所有(c)2004-2005//描述//<在此输入简要描述>//作者raman//-----------------------------------usingSystem,.usingSystem.Collections;usingSystem.Security.Principal;usingSystem.Runtime.Serialization;usingSystem.Threading,-namespacexa.apipublicdelegatevoidOperationMethod();publicdelegateboolOperationMethodBool(),'#:regionExecuteEventArgs//ExecuteEventArgs//作者savvypublicclassExecuteEventArgs:EventArgs弁i:egionConstructorpublicExecuteEventArgs()waitHandles=newArrayljist();弁eridregion弁regionPublicPropertiespublicArrayListWaitHandlesget50returnthis.waitHandles,'弁endregion弁regionPrivateVariablesprivateArrayljistwaitHandles=null;#endregion弁endregion弁regionCompletedEventArgs//CompletedEventArgs//作者savvypublicclassCompletedEventArgs:EventArgs弁tregionConstructorpublicCompletedEventArgs(Operationstatestate,Exceptione)this,state=state;this,error=e,'#endregion弁regionPublicPropertiespublicOperationStateStategetreturnthis,state,'publicExceptionErirorgetreturnthis,error;幷endregion弁regionPrivateVariablesprivateOperationStatestate;privateExceptionerror',弁endregion弁endregion弁regionTimeoutException//TimeoutException//作者savvy[Serializable]可串行化的publicclassTimeoutException:Exception#regionConstructorpublicTimeoutException(){}publicTimeoutException(strings):base(s){}protectedTimeoutException(Serialization工nfoinfo,StreamingContextcontext):base(info,context){}publicTimeoutException(strings,Exceptione):base(s,e){}弁endregion弁endregion弁regionOperationBasepublicenumOperationModeNone,Async,SyncpublicclassOperationBase:MarshalByRefObject,工Operation//OperationBase//作者savvy〃publicOperationBase(OperationCallback:operationCallback):this(operationCallback,null)//OperationBase//作者raman,savvy〃publicOperationBase(OperationCallbackoperationCallback,ProgressCallbackprogressCallback)this.callback=operaticmCallback,'this.progress=newProgressState(progressCallback),-//OperationBase//作者raman,savvy〃publicOperationBase(OperationCallbackoperationCallback,OperationBaseouter,intsubUpperBound):this(OperationCallback,NestedProgressCallback.Create(outer.progress,subUpperBound))弁regionIOperationmethods〃Cancel(取消)//作者raxnan,savvy//publicvoidCancel()lock(this)if(this.nestedOperations!=null)for(inti=0,i<this.nestedOperations.Counti++)((工Operation)this.nestedOperations[i]).Cancel()this.cancelled=true/〃Result(结果)//作者savvy〃publicobjectResultgetreturnthis.result,'52setthis,result=value;}、//Description(描述)//作者raman〃publicstringDescriptiongetreturnthis.description,.〃State(状态)//作者raman〃publicOperationStateStategetretumthis.state,'//Progress(进程)//作者raman〃,publicProgressStateProgressgetreturnthis.progress,-//ProgressCallback//作者savvy〃publicProgressCallbackProgressCallbackgetreturnthis.progress.Callback;setthis.progress.Callback=value,'〃Error(错误)//作者ramanpublicExceptionErrorgetreturnthis,error^#endregion53#regionMarshalByRef〇bject//工nitializeljifetimeService//作者raman〃publicoverrideobjectInitializeLifetimeService()returnnull,'弁eridregion#iregionPublicMethodsandPropertiespubliceventEventHandlerExecute/publiceventEventHandlerCompleted;//ExecuteAsync//作者raman,savvy〃publicvoidExecuteAsync()this.identity=Thread.CurrentPrincipal.Identity;mode=OperationMode.Async;ThreadPool.QueueUserWorkltem(newWaitCallback(this.ExecuteThreadProc))///ExecuteSyncNoThrow//作者raman,savvy〃publicboolExecuteSyncNoThrow()this.identity=Thread.CurrentPrincipal.Identityboolsuccess;mode=OperationMode.Sync/this.progressTimer=newTimer(newTimerCallback(OnP:rog:iressIrLte:rvalElapsed),this,progresslnterval,progresslnterval)///由于刚进入运行状态而向客户机调用回叫。tryif(callback!=null)callback(this,this.state);catch//忽略来自客户机回叫的错误。try〃注意waitHandles允许并行化的异步嵌套操作,且//重复允许多步骤的操作,其中各个步骤是异步操作。boolrepeat=true7doVerifyTimeout()ExecuteEventArgseventArgs=newExecuteEventArgs();OnExecute(eventArgs);if(eventArgs.WaitHandles.Count>0)VerifyTimeout();ArraywaitHandles=eventArgs.WaitHandles.ToArray(Type.GetType("System.Threading.WaitHandle"))this.e:r:rorisCancelException)WaitHandle.WaitAll((WaitHandle[])waitHandles)repeat=false;}while(repeat==true);this.state=OperationState.Complete,'if(progress!=null)progress.Complete();catch(Exceptione)SetExceptionState(e);success=(this.error==nullExecutionEpilog();returnsuccessj//ExecuteSync//作者raman〃publicvoidExecuteSync()if(!ExecuteSyncNoThrow())throw(this.error),*//IsComplete//作者raman,savvy〃publicboolIsCompletegetreturn(state!=OperationState.Running),'//Callback//作者ramanpublicOperationCallbackCallbackgetreturnthis.callback,'弁endregion弁regionProtectedmembers〃Mode(模式)//作者savvy//protectedOperationModeModegetreturnmode,-55//NestedOperations(嵌套操作)//作者raman,savvy〃protectedArrayLiistNestedOperationsgetlock(this)if(this.nestedOperations==null)this.nestedOperations=newArrayList()returnthis.nestedOperations/CreateNestedCallback//作者raman,savvy〃protectedProgressCallbackCreateNestedCallback(intnestediJpperBound)returnNestedProgressCallback.Create(this.progres,nestedUpperBound)//ReportProgress//作者ra:nan,savvy〃protectedvirtualvoidReportProgress()trythis.progress.Report()catch//忽略来自客户机回叫的错误//VerifyCancel//作者raman〃protectedvoidVerifyCancel()if(this.cancelled)throw(newCancelException()),'//VerifyTimeout//作者savvy//protectedvoidVerifyTimeout()if(this.timedOut)throw(newTimeoutException());//OnExecute//作者raman,savvy56〃protectedvirtualvoidOnExecute(ExecuteEventArgse)if(this.Execute1=null)this.Execute(this,e),.//OnExecuted//作者savvy〃protectedvirtualvoidOnExecuted()//释放资源,操作现已执行//OnAsyncCompleted//作者savvy〃protectedvirtualvoidOnAsyncCompleted()trythis.state=OperationState.Complete,'if(progress!=null)progress.Complete()catch(Exceptione)SetExceptionState(e);ExecutionEpilog()///OnAsyncExecuted//作者savvy〃protectedvirtualvoidOnAsyncExecuted(objectstate,booltirueciOut)//注意重复地调用,直到一步骤执行并且不返回等待句柄。这允许多步骤的操作,其中各个步骤是异步操作。//WaitCount禾口WaitHandles允许并行化的异步嵌套操作。tryVerifyTirueout();if(waitCount!=0)if(Interlocked.Decrement(refwaitCount)!=0)//并行化的当前步骤的一部分仍旧未决return;VerifyTimeout();ExecuteEventArgseventA巧s=newExecuteEventArgs()OnExecute(eventArgs),'waitCount=eventArgs.WaitHandles.Count;if(eventArgs.WaitHandles.Count>0)VerifyTimeout();for(inti=0;i<eventArgs.WaitHandles.Count;i++)57//ThreadPool.RegisterWaitForSingleObject((WaitHandle)eventArgs.WaitHandles[i],newWaitOrTimerCallback:(OnAsyncExecuted)this,true),'OnAsyncCompleted();catch(Exceptione)SetExceptionState(e);ExecutionEpilog()OnComplete//作者raman,savvy〃protectedvirtualvoidOnComplete(CompletedEventArgse)lock:(this)if(this,Completed!=null)this.Completed(this,e)//SetExceptionState//作者raman〃protectedvoidSetExceptionState(Exceptione)this,error=e,.if(eisCancelExceptiori)this.progress.Message=Api.Resource.GetString("OperationCancelled")this.state=OperationState.Cancelled)else//System.Diagnostics.Debug.Assert(false,e.Message);this.progress.Message=e.Message,-this.state=OperationState.Exception;protectedIdentityprotectedobjectprotectedOperationCallbackprotectedProgressStateprotectedOperationStateprotectedboolprotectedboolprotectedExceptionprotectedstringprotectedOperationModeidentity,.result=null,-callback=null,'progress=null,-state=OperationState.Running;cancelled=false,'timedOut=false/error=null,'description=string.Empty/mode=OperationMode.None;弁endregion弁:regionPrivatemembersprivatevoidOnProgressIntervalElapsed(Objectstate)//如果整个间隔中操作上没有进程则设置异常if(this.progress.ChangeCount==this.progressCount)lock(this)if(this.progressTimer!=null)this.progressTimer.Dispose()/this.progressTimer=null,.this.timedOut=true,'lock(this)this.progressCount=this.progress.ChangeCount///ExecutionEpilog//作者raman,savvy//privatevoidExecutionEpilog(){..if(this.progressTimer!=null)this.progressTimer.Dispose(),'this.progressTimer=null;OnExecuted();tryCompletedEventA巧seventArgs=newCompletedEventArgs(this.statethis.error)OnComplete(eventArgs);catch//忽略完整事件上的异常//最终报告ReportProgress();//在操作完成时调用客户机回叫。tryif(callback!=null)callback(this,this.state)catch//忽略来自客户机回叫的错误。//ExecuteThreadProc//作者raman,savvy〃privatevoidExecuteThreadProc(objectstate)工IdentitycurrentIdentity=Thread.CurrentPrincipal.Identity,'if(this.identity.Name!=currentIdentity.Name)System.Diagnostics.Debug.Assert(thisisContextSwitchOperation);this.progressTimer=newTimer(newTimerCallback(OnProgiressIntervalElapseci),this,progresslnterval,progressInterval);//由于刚进入运行状态而调用客户机回叫。tryif(callback!=null)callback(this,this.state)catch//忽略来自客户机回叫的错误。OnAsyncExecuted(state,false),'privateAxrayListnestedOperations=null;private工nt32waitCount=0;privateTimerprogressTimer=null;privateintprogressCount=0;privateconstintprogresslnterval=600000;//10分钟#endregion弁endregion弁regionNotlmplementedOperation//NotlmplementedOperation//作者raman,savvy〃publicclassNotlmplementedOperation:OperationBasepublicNotlmplementedOperation(OperationCallback:callback):base(callback)SetExceptionState(newNotlmplementedException());Oncomplete(newCompletedEventArgs(state,error))^弁endregion尽管以上述环境描述了各个实施例,本领域的技术人员能理解,本发明的装置可以在多种其他环境中实现,包括单一、单片的计算机系统、以及计算机系统或者以各种方式连接的类似设备的各种其他组合。本领域的技术人员能理解,上述步骤可以以多种方式改变。例如,步骤的顺60序可以重新排列;可以并行地执行子步骤;可以省略所示出的步骤,或者可以包括其他步骤,等等。本领域的技术人员能理解,上述装置可以直接适用,或者以各种方式扩展。权利要求1.一种由计算机系统执行用来提供可个性化信息的方法,包括接收访问令牌的标识,所述访问令牌标识了一用户帐户;把所接收的令牌与一数据库表格相关联,所述数据库表格将所述令牌与一用户标识符和一信息项相关联;以及当一访问控制许可要应用于一信息项时,通过评估所述信息条目与所述数据库表格中标识的用户之间的关联,来确定所述访问控制许可。全文摘要描述了一种用于实现可个性化信息的设备。该设备包括可调用包、数据库相关COM技术、扮演时的异步操作、视图、XML更新图、XHTML更新图、PRL/href/ld转换、被视为数据库的ACL、数据库设置、用于表示结构化数据的框架、以及搜索集成的滚动条。文档编号G06F17/30GK101501685SQ200680030556公开日2009年8月5日申请日期2006年8月24日优先权日2005年8月24日发明者A·瑟罗希,M·F·希尔曼,S·拉曼申请人:微软公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1