GSP数据库接口单元_第1页
GSP数据库接口单元_第2页
GSP数据库接口单元_第3页
GSP数据库接口单元_第4页
GSP数据库接口单元_第5页
已阅读5页,还剩53页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、 * GSP 数据库接口单元 设计:Tu Jianhua 2005.06.24 备注: 审核: Copyright (c) 1994-2005 GrandSoft Corporation * unit GSPInterface; interface uses Classes, SysUtils, Types, GrandXMLIntf, GEPInterface; const cGSPEngineVersion = 2.3.9;/ 平台引擎版本号(版本.存储.接口) cErrorRefCode = ?; / 非法引用代码 cParamMark = ?; / 参数标记 cRefForeignKe

2、yMark = ; / 引用外键字段标识 cVariableMark = ; / 变量标记 const ptUnknown = 0; / 未知 ptField = 1; / 字段 ptCustomMacro = 2; / 自定义宏 ptRowRefMacro = 3; / 行引用宏 ptConditionMacro = 4; / 条件宏 ptKeyValueMacro = 5; / 键值宏 ptExprEvaluator = 6; / 表达式求值器 ptViewFilterTrigger = 7; / 动态View 的记录过滤触发器 ptConstraintRule = 8; / 约束规则 c

3、onst edtIntegerProvider = 30; edtFloatProvider = 31; edtStringProvider = 32; edtBooleanProvider = 33; edtDatetimeProvider = 34; edtInt64Provider = 35; edtIntegerProviderList = 40; edtFloatProviderList = 41; edtStringProviderList = 42; edtBooleanProviderList = 43; edtDatetimeProviderList = 44; edtInt

4、64ProviderList = 45; edtModel = 50; / IGSPModel edtDatabase = 51; / IGSPDatabase edtTable = 52; / IGSPTable edtRecord = 53; / IGSPRecord edtField = 54; / IGSPField edtData = 55; / IGEPData edtView = 56; / IGSPView edtDatabaseDynArray = 60; / IGSPDatabaseDynArray edtTableDynArray = 61; / IGSPTableDyn

5、Array edtRecordDynArray = 62; / IGSPRecordDynArray type / 数据模式 TGSPMode = ( gmDesign = 0, / 设计期 gmLoad = 1, / 装载期 gmRuntime = 2 / 运行期 ); / 数据类型 TGSPDataType = ( dtString = 0, / 字符串 dtBoolean = 1, / 布尔型 dtLongInt = 2, / 4 字节有符号整数 dtShortInt = 3, / 1 字节有符号整数 dtByte = 4, / 1 字节无符号整数 dtSmallInt = 5, / 2

6、 字节有符号整数 dtWord = 6, / 2 字节无符号整数 dtDouble = 7, / 双精度浮点数 dtDecimal = 8, / 固定小数位数浮点数 dtDateTime = 9, / 日期时间型 dtText = 10, / 文本备注 dtBlob = 11, / 二进制OLE dtTable = 12, / 表 dtInt64 = 13 / 长整数 ); / 字段类型 TGSPFieldKind = ( fkPrimaryKey = 0, / 主键字段 fkForeignKey = 1, / 外键字段 fkNormalData = 2, / 普通数据字段 fkEnum =

7、3, / 枚举字段 fkExpr = 4, / 表达式字段(用户输入表达式) fkCalc = 5, / 计算字段(在Schema 中定义表达式) fkNullExprData = 6, / 带空值表达式数据字段 fkNestedTable = 7 / 嵌套表 ); / 主细关系 TGSPMasterDetailRelationship = ( mdrOneToMany = 0, / 1 对多 mdrOneToOne = 1 / 1 对1 ); / 表类型 TGSPTableKind = ( tkNormalTable = 0, / 普通表 tkPropTable = 1, / 属性表 tkN

8、estedTable = 2, / 嵌套表 tkTempTable = 3 / 临时表 ); / 基本数据类型 TGSPBaseDataType = ( bdtUnknown, / 未知 bdtInteger, / 整数 bdtFloat, / 浮点数 bdtString, / 字符串 bdtBoolean, / 布尔 bdtDatetime, / 日期时间 bdtTable, / 嵌套表 bdtInt64 / 长整数 ); / 命令状态 TGSPDoCommandMode = ( dcmNone, / 无 dcmUndo, / 撤销状态 dcmRedo / 重做状态 ); / Provide

9、r 类型 TGSPProviderType = Byte; / Seek 定位选项 TGSPSeekOption = ( gsoFirst, / 返回第一条匹配的记录下标 gsoLast, / 返回最后一条匹配的记录下标 gsoMatch / 返回二分查找时首次匹配的记录下标 ); / Seek 定位选项 TGSPSeekFlag = ( sfEqual, sfGreaterThan, sfGreaterEqual, sfLessThan, sfLessEqual ); / 比较结果 TGSPCompareResult = ( gcrLessThan = -1, / 小于 gcrEqual =

10、 0, / 等于 gcrGreaterThan = 1 / 大于 ); / 命令类型 TGSPCommandKind = Word; / 下拉列表选择项 TGSPPickItem = record DisplayText: string; / 显示文本 PickResult: string; / 返回值 end; / 下拉列表 TGSPPickItemDynArray = array of TGSPPickItem; / Lookup 类型 TGSPLookupKind = ( lkNone, / 无查询 lkTable, / 从表中查询 lkList, / 从固定列表中查询 lkSQL /

11、SQL 语句查询 ); / 自定义宏类型 TGSPCustomMacroType = ( cmtTableCustomMacro, cmtRecordCustomMacro ); type IGSPModel = interface; IGSPDatabase = interface; IGSPTables = interface; IGSPTable = interface; IGSPView = interface; IGSPRecord = interface; IGSPRecordProxy = interface; IGSPRecordParser = interface; IGSP

12、Field = interface; IGSPTableSchema = interface; IGSPFieldSchemas = interface; IGSPFieldSchema = interface; IGSPForeignKeyFieldSchema = interface; IGSPExtPropDefs = interface; IGSPExtPropDef = interface; IGSPKeyValueMacroDef = interface; IGSPCustomMacroDefs = interface; IGSPCustomMacroDef = interface

13、; IGSPConstDef = interface; IGSPConstDefs = interface; IGSPRuleDefs = interface; IGSPRuleDef = interface; IGSPReadonlyRuleDefs = interface; IGSPReadonlyRuleDef = interface; IGSPIndexFiles = interface; IGSPIndexFile = interface; IGSPVariable = interface; IGSPScripts = interface; IGSPScript = interfac

14、e; IGSPApplyUpdateCommands = interface; IGSPFilterRecordEventList = interface; IGSPModelEventContainer = interface; IGSPDatabaseEventContainer = interface; IGSPTableEventContainer = interface; IGSPRecordEventContainer = interface; IGSPFieldEventContainer = interface; IGSPViewObserver = interface; IG

15、SPCommand = interface; IGSPProvider = interface; IGSPExprEvaluator = interface; IGSPRecordList = interface; IGSPVarInfo = interface; IGSPSubModelInfo = interface; IGSPModelXMLReader = interface; IGSPModelXMLWriter = interface; IGSPTableXMLReader = interface; IGSPTableXMLWriter = interface; / 事件方法类型:

16、Mode 改变之前触发 TGSPBeforeModeChangeEvent = procedure (const AModel: IGSPModel; ANewMode: TGSPMode; var ACanChange: Boolean) of object; / 事件方法类型:Mode 改变之后触发 TGSPAfterModeChangeEvent = procedure (const AModel: IGSPModel; AOldMode: TGSPMode) of object; / 事件方法类型:创建SubModel 之前触发 TGSPBeforeGetSubModelEvent =

17、 procedure (const AModel: IGSPModel; const ASubModelInfo: IGSPSubModelInfo; var ACanCreate: Boolean) of object; / 事件方法类型:创建SubModel 之后触发 TGSPAfterGetSubModelEvent = procedure (const AModel, ASubModel: IGSPModel; const ASubModelInfo: IGSPSubModelInfo) of object; / 事件方法类型:提交更新之前触发 TGSPBeforeApplyUpdat

18、eEvent = procedure (const AModel: IGSPModel; const ACommands: IGSPApplyUpdateCommands; var ACanApplyUpdate: Boolean) of object; / 事件方法类型:提交更新之后触发 TGSPAfterApplyUpdateEvent = procedure (const AModel: IGSPModel; const ACommands: IGSPApplyUpdateCommands) of object; / 事件方法类型:插入数据库之前触发 TGSPBeforeInsertDa

19、tabaseEvent = procedure (AIndex: Integer; const ADatabase: IGSPDatabase; var ACanInsert: Boolean) of object; / 事件方法类型:插入数据库之后触发 TGSPAfterInsertDatabaseEvent = procedure (const ADatabase: IGSPDatabase) of object; / 事件方法类型:删除数据库之前触发 TGSPBeforeDeleteDatabaseEvent = procedure (const ADatabase: IGSPDatab

20、ase; var ACanDelete: Boolean) of object; / 事件方法类型:删除数据库之后触发 TGSPAfterDeleteDatabaseEvent = procedure (const ADatabase: IGSPDatabase) of object; / 事件方法类型:移动数据库之前触发 TGSPBeforeMoveDatabaseEvent = procedure (const AModel: IGSPModel; AFromIndex, AToIndex: Integer; var ACanMove: Boolean) of object; / 事件方法

21、类型:移动数据库之后触发 TGSPAfterMoveDatabaseEvent = procedure (const AModel: IGSPModel; AFromIndex, AToIndex: Integer) of object; / 事件方法类型:插入表之前触发 TGSPBeforeInsertTableEvent = procedure (AIndex: Integer; const ATable: IGSPTable; var ACanInsert: Boolean) of object; / 事件方法类型:插入表之后触发 TGSPAfterInsertTableEvent =

22、procedure (const ATable: IGSPTable) of object; / 事件方法类型:删除表之前触发 TGSPBeforeDeleteTableEvent = procedure (const ATable: IGSPTable; var ACanDelete: Boolean) of object; / 事件方法类型:删除表之后触发 TGSPAfterDeleteTableEvent = procedure (const ATable: IGSPTable) of object; / 事件方法类型:移动表之前触发 TGSPBeforeMoveTableEvent =

23、 procedure (const ADatabase: IGSPDatabase; AFromIndex, AToIndex: Integer; var ACanMove: Boolean) of object; / 事件方法类型:移动表之后触发 TGSPAfterMoveTableEvent = procedure (const ADatabase: IGSPDatabase; AFromIndex, AToIndex: Integer) of object; / 事件方法类型:插入记录之前触发 TGSPBeforeInsertRecordEvent = procedure (AIndex

24、: Integer; const ARecord: IGSPRecord; var ACanInsert: Boolean) of object; / 事件方法类型:插入记录之后触发 TGSPAfterInsertRecordEvent = procedure (const ARecord: IGSPRecord) of object; / 事件方法类型:删除记录之前触发 TGSPBeforeDeleteRecordEvent = procedure (const ARecord: IGSPRecord; var ACanDelete: Boolean) of object; / 事件方法类型

25、:删除记录之后触发 TGSPAfterDeleteRecordEvent = procedure (const ARecord: IGSPRecord) of object; / 事件方法类型:移动记录之前触发 TGSPBeforeMoveRecordEvent = procedure (const ATable: IGSPTable; AFromIndex, AToIndex: Integer; var ACanMove: Boolean) of object; / 事件方法类型:移动记录之后触发 TGSPAfterMoveRecordEvent = procedure (const ATa

26、ble: IGSPTable; AFromIndex, AToIndex: Integer) of object; / 事件方法类型:更新字段之前触发 TGSPBeforeUpdateFieldEvent = procedure (const AField: IGSPField; ANewValue: Variant; AIsExprUpdate: Boolean; var ACanChange: Boolean) of object; / 事件方法类型:更新字段之后触发 TGSPAfterUpdateFieldEvent = procedure (const AField: IGSPFiel

27、d; AIsExprUpdate: Boolean) of object; / 事件方法类型:查询主键值 TGSPQueryIDValueEvent = procedure (const ARecord: IGSPRecord; var AIDValue: Integer) of object; / 事件方法类型:取浮点类型字段精度 TGSPQueryDecimalEvent = procedure (const AField: IGSPField; var ADecimal: Integer) of Object; / 事件方法类型:过滤记录 TGSPFilterRecordEvent =

28、procedure(const ARecord: IGSPRecord; var Accept: Boolean) of object; / 事件方法类型:刷新ExprEvaluator 值 TGSPEvaluatorRefreshValueEvent = procedure(const AEvaluator: IGSPExprEvaluator) of object; / 记录排序比较函数 TGSPRecordCompareFunc = function (const ARecord1, ARecord2: IGSPRecord): TGSPCompareResult of object;

29、/ IGSPTableSchema 动态数组 TGSPTableSchemaDynArray = array of IGSPTableSchema; / 外键字段动态数组 TGSPForeignKeyFieldSchemaDynArray = array of IGSPForeignKeyFieldSchema; / IGSPDatabase 动态数组 TGSPDatabaseDynArray = array of IGSPDatabase; / IGSPTable 动态数组 TGSPTableDynArray = array of IGSPTable; / IGSPRecord 动态数组 T

30、GSPRecordDynArray = array of IGSPRecord; / IGSPField 动态数组 TGSPFieldDynArray = array of IGSPField; / IGSPProvider 动态数组 TGSPProviderDynArray = array of IGSPProvider; / IGSPView 动态数组 TGSPViewDynArray = array of IGSPView; / IGSPViewObserver 动态数组 TGSPViewObserverDynArray = array of IGSPViewObserver; / 字段

31、类型动态数组 TGSPFieldKindDynArray = array of TGSPFieldKind; / 平台引擎接口 IGSPEngine = interface 1B048041-1E81-4A41-8D30-73CCF78600AF function CreateModel( ALogCommand: Boolean = False; const AGEPEngine: IGEPEngine = nil): IGSPModel; function CreateTempTable( const ATableName: string = ; const AModel: IGSPMod

32、el = nil; const AGEPEngine: IGEPEngine = nil): IGSPTable; function CreateModelXMLReader(ASimpleDataIntf: Boolean = False): IGSPModelXMLReader; function CreateModelXMLWriter: IGSPModelXMLWriter; function CreateTableXMLReader: IGSPTableXMLReader; function CreateTableXMLWriter: IGSPTableXMLWriter; func

33、tion CreateGEPEngine: IGEPEngine; function GetDefaultGEPEngine: IGEPEngine; function GetVersion: string; property DefaultGEPEngine: IGEPEngine read GetDefaultGEPEngine; property Version: string read GetVersion; end; / 模型XML 格式读取接口 IGSPModelXMLReader = interface A67D20CB-E430-462B-8E6E-1B21ACE2071A p

34、rocedure Read(const AXMLNode: IXMLNode; const AModel: IGSPModel; AReadonly: Boolean = False); overload; procedure Read(const AXMLDoc: IXMLDocument; const AModel: IGSPModel; AReadonly: Boolean = False); overload; procedure Read(const AFileName: string; const AModel: IGSPModel; AReadonly: Boolean = Fa

35、lse); overload; procedure Read(const AStream: TStream; const AModel: IGSPModel; AReadonly: Boolean = False); overload; procedure Read(const AXMLNode: IXMLNode; const AModel: IGSPModel; AForceMode: TGSPMode; AReadonly: Boolean = False); overload; procedure Read(const AXMLDoc: IXMLDocument; const AMod

36、el: IGSPModel; AForceMode: TGSPMode; AReadonly: Boolean = False); overload; procedure Read(const AFileName: string; const AModel: IGSPModel; AForceMode: TGSPMode; AReadonly: Boolean = False); overload; procedure Read(const AStream: TStream; const AModel: IGSPModel; AForceMode: TGSPMode; AReadonly: B

37、oolean = False); overload; procedure Read(const AXMLNode: IXMLNode; const ADatabase: IGSPDatabase; const ADatabaseName: string); overload; procedure Read(const AXMLDoc: IXMLDocument; const ADatabase: IGSPDatabase; const ADatabaseName: string); overload; procedure Read(const AFileName: string; const

38、ADatabase: IGSPDatabase; const ADatabaseName: string); overload; procedure Read(const AStream: TStream; const ADatabase: IGSPDatabase; const ADatabaseName: string); overload; procedure ReadSchema(const AXMLNode: IXMLNode; const AModel: IGSPModel); overload; procedure ReadSchema(const AXMLDoc: IXMLDo

39、cument; const AModel: IGSPModel); overload; procedure ReadSchema(const AFileName: string; const AModel: IGSPModel); overload; procedure ReadSchema(const AStream: TStream; const AModel: IGSPModel); overload; procedure ReadData(const AXMLNode: IXMLNode; const AModel: IGSPModel; AReadonly: Boolean = Fa

40、lse); overload; procedure ReadData(const AXMLDoc: IXMLDocument; const AModel: IGSPModel; AReadonly: Boolean = False); overload; procedure ReadData(const AFileName: string; const AModel: IGSPModel; AReadonly: Boolean = False); overload; procedure ReadData(const AStream: TStream; const AModel: IGSPMod

41、el; AReadonly: Boolean = False); overload; end; / 模型XML 格式保存接口 IGSPModelXMLWriter = interface D656872F-FC67-44FC-A527-257FF8D6A519 procedure Write(const AXMLNode: IXMLNode; const AModel: IGSPModel; ACompressData: Boolean = True); overload; procedure Write(const AXMLDoc: IXMLDocument; const AModel: I

42、GSPModel; ACompressData: Boolean = True); overload; procedure Write(const AFileName: string; const AModel: IGSPModel; ACompressData: Boolean = True; AEncryptData: Boolean = True); overload; procedure Write(const AStream: TStream; const AModel: IGSPModel; ACompressData: Boolean = True; AEncryptData:

43、Boolean = True); overload; procedure WriteSchema(const AXMLNode: IXMLNode; const AModel: IGSPModel); overload; procedure WriteSchema(const AXMLDoc: IXMLDocument; const AModel: IGSPModel); overload; procedure WriteSchema(const AFileName: string; const AModel: IGSPModel; AEncryptData: Boolean = True);

44、 overload; procedure WriteSchema(const AStream: TStream; const AModel: IGSPModel); overload; procedure WriteData(const AXMLNode: IXMLNode; const AModel: IGSPModel; ACompressData: Boolean = True); overload; procedure WriteData(const AXMLDoc: IXMLDocument; const AModel: IGSPModel; ACompressData: Boole

45、an = True); overload; procedure WriteData(const AFileName: string; const AModel: IGSPModel; ACompressData: Boolean = True; AEncryptData: Boolean = True); overload; procedure WriteData(const AStream: TStream; const AModel: IGSPModel; ACompressData: Boolean = True); overload; end; / 表XML 格式读取接口 IGSPTa

46、bleXMLReader = interface 47D66096-CF94-4583-92FF-764AB57C510B procedure Read(const AXMLNode: IXMLNode; const ATable: IGSPTable); overload; procedure Read(const AXMLFile: string; const ATable: IGSPTable); overload; procedure Read(const AXMLDoc: IXMLDocument; const ATable: IGSPTable); overload; end; /

47、 表XML 格式保存接口 IGSPTableXMLWriter = interface 47D66096-CF94-4583-92FF-764AB57C510B procedure Write(const AXMLNode: IXMLNode; const ATable: IGSPTable; ACompressData: Boolean); overload; procedure Write(const AXMLFile: string; const ATable: IGSPTable; ACompressData: Boolean = False; AEncryptData: Boolea

48、n = True); overload; procedure Write(const AXMLDoc: IXMLDocument; const ATable: IGSPTable; ACompressData: Boolean); overload; end; / 提交命令接口 IGSPApplyUpdateCommands = interface 802541EC-B081-4DD5-9215-95694F5D5B86 procedure Execute(const AModel: IGSPModel); end; / 模型接口 IGSPModel = interface AA1E8499-

49、3EF8-4141-AE10-2B41882D2C8F function New(const ADatabaseName: string = ; const ADatabaseAliasName: string = ): IGSPDatabase; procedure Add(const ADatabase: IGSPDatabase); overload; procedure Add(const ADatabases: array of IGSPDatabase); overload; procedure Delete(AIndex: Integer); procedure Remove(c

50、onst ADatabaseName: string); overload; procedure Remove(const ADatabase: IGSPDatabase); overload; procedure Remove(const ADatabaseNames: TStringDynArray); overload; procedure Remove(const ADatabases: array of IGSPDatabase); overload; procedure Clear; procedure Move(AFromIndex, AToIndex: Integer); pr

51、ocedure Merge(const ASource: IGSPModel); overload; procedure Merge(const ASource: IGSPDatabase); overload; procedure Merge(const ADatabases: array of IGSPDatabase); overload; function IndexOf(const ADatabaseName: string): Integer; overload; function IndexOf(const ADatabase: IGSPDatabase): Integer; o

52、verload; function Find(const ADatabaseName: string): IGSPDatabase; function FindTable(const ADatabaseName, ATableName: string): IGSPTable; function TableByName(const ATableName: string; const ADatabaseName: string = ): IGSPTable; procedure AssignData(const ASource: IGSPModel); procedure ClearData; f

53、unction Clone(ALogCommand: Boolean = False; ASchemaOnly: Boolean = False): IGSPModel; procedure BatchInsertRecord(const ARecords: TGSPRecordDynArray; const ANextRecordIDs: TIntegerDynArray); overload; procedure BatchInsertRecord(const ARecords: IGSPRecordList; const ANextRecordIDs: TIntegerDynArray)

54、; overload; procedure BatchRemoveRecord(const ARecords: TGSPRecordDynArray); overload; procedure BatchRemoveRecord(const ARecords: IGSPRecordList); overload; procedure BeginLockObservers; procedure EndLockObservers; function InLockObserversState: Boolean; function ExecuteSQL(const ASQLText: string;

55、ASchemaOnly: Boolean = False): IGSPTable; procedure ApplyUpdate(const ACommands: IGSPApplyUpdateCommands); function CreateSubModel( const ASubModelInfo: IGSPSubModelInfo; ALogCommand: Boolean; ASchemaOnly: Boolean = False; ACheckValidaty: Boolean = True): IGSPModel; overload; function CreateSubModel

56、( const ASubModelInfo: TObject; ALogCommand: Boolean; ASchemaOnly: Boolean = False; ACheckValidaty: Boolean = True): IGSPModel; overload; procedure CheckModelValidaty( const ARefModel: IGSPModel; const ASubModelInfo: IGSPSubModelInfo; AForceForeignKey: Boolean); function RegisterVar(const ACode: str

57、ing; ADataType: TGEPDataType): IGSPVariable; function FindVar(const ACode: string): IGSPVariable; function HasCommand: Boolean; function FetchCommand: IGSPCommand; function CreateCommand(ACommandKind: TGSPCommandKind): IGSPCommand; procedure BeginPauseCommand; procedure EndPauseCommand; function InP

58、auseCommand: Boolean; procedure BeginTransaction; procedure EndTransaction; procedure Rollback; function InTransaction: Boolean; procedure BeginIgnoreFieldConstraint; procedure EndIgnoreFieldConstraint; procedure CancelIgnoreFieldConstraint; function InIgnoreFieldConstraint: Boolean; procedure Begin

59、Update; procedure EndUpdate; procedure CancelUpdate; function InUpdate: Boolean; function UpdateCount: Integer; procedure BeginPauseEvents; procedure EndPauseEvents; function InPauseEvents: Boolean; function ClearUpdateCount: Integer; procedure ResetUpdateCount(AUpdateCount: Integer); function GetMo

60、delEventContainer: IGSPModelEventContainer; function GetDatabaseEventContainer: IGSPDatabaseEventContainer; function GetTableEventContainer: IGSPTableEventContainer; function GetRecordEventContainer: IGSPRecordEventContainer; function GetFieldEventContainer: IGSPFieldEventContainer; function GetVers

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论