4249 lines
174 KiB
Transact-SQL
4249 lines
174 KiB
Transact-SQL
|
|
/******************************************************************************/
|
|
/* */
|
|
/* WMI Repository driver database creation script. */
|
|
/* */
|
|
/* (NOTE: This will only run on SQL 7.0) */
|
|
/* */
|
|
/******************************************************************************/
|
|
|
|
SET NOCOUNT ON
|
|
|
|
/******************************************************************************/
|
|
/* */
|
|
/* Define the custom datatype WMISQL_ID */
|
|
/* */
|
|
/* This datatype exists since the default (18,0) is not large enough to hold */
|
|
/* our CRC64 key values. */
|
|
/* */
|
|
/******************************************************************************/
|
|
|
|
IF NOT EXISTS (select * from systypes where name = 'WMISQL_ID')
|
|
BEGIN
|
|
print 'Defining WMISQL_ID in WMI1 ...'
|
|
exec sp_addtype WMISQL_ID, 'numeric(20,0)', 'NULL'
|
|
END
|
|
go
|
|
|
|
IF NOT EXISTS (select * from sysobjects where name = 'DBVersion')
|
|
BEGIN
|
|
print 'Creating table DBVersion...'
|
|
create table DBVersion (Version int NOT NULL)
|
|
insert into DBVersion select 0
|
|
END
|
|
go
|
|
|
|
/******************************************************************************/
|
|
/* */
|
|
/* ObjectMap */
|
|
/* */
|
|
/* Description: This is the parent table of all database objects derived */
|
|
/* from classes and instances. This includes namespaces. */
|
|
/* */
|
|
/******************************************************************************/
|
|
|
|
IF NOT EXISTS (select * from sysobjects where name = 'ObjectMap')
|
|
BEGIN
|
|
print 'Creating table ObjectMap...'
|
|
create table ObjectMap
|
|
(
|
|
ObjectId WMISQL_ID NOT NULL,
|
|
ClassId WMISQL_ID NOT NULL,
|
|
ObjectKey nvarchar(450) NOT NULL,
|
|
ObjectPath nvarchar(3500) NULL,
|
|
ObjectState int NULL DEFAULT 0,
|
|
ReferenceCount int DEFAULT 0,
|
|
ObjectFlags int NULL DEFAULT 0,
|
|
ObjectScopeId WMISQL_ID NULL DEFAULT 0,
|
|
CONSTRAINT ObjectMap_PK PRIMARY KEY CLUSTERED (ObjectId) WITH FILLFACTOR = 80,
|
|
CONSTRAINT ObjectMap_AK UNIQUE (ObjectKey) WITH FILLFACTOR=80
|
|
)
|
|
|
|
/******************************************************************************/
|
|
/* */
|
|
/* Initial Objects: */
|
|
/* */
|
|
/* meta_class The parent of all class objects. */
|
|
/* __Namespace The container class of namespace objects. */
|
|
/* __Namespace='root' The default namespace. */
|
|
/* __SqlMappedNamespace A mapped namespace */
|
|
/* */
|
|
/******************************************************************************/
|
|
|
|
insert into ObjectMap (ObjectId, ObjectKey, ObjectPath, ObjectState, ReferenceCount, ClassId)
|
|
select 1, 'meta_class', 'meta_class', 3, 0, 0
|
|
insert into ObjectMap (ObjectId, ObjectKey, ObjectPath, ObjectState, ReferenceCount, ClassId)
|
|
select 2372429868687864876, '__Namespace', '__Namespace', 3, 1, ObjectId from ObjectMap where ObjectPath = 'meta_class'
|
|
insert into ObjectMap (ObjectId, ObjectKey, ObjectPath, ObjectState, ReferenceCount, ClassId)
|
|
select -1411745643584611171, 'root','root', 3, 0, ObjectId from ObjectMap where ObjectPath = '__Namespace'
|
|
insert into ObjectMap (ObjectId, ObjectKey, ObjectPath, ObjectState, ReferenceCount, ClassId)
|
|
select -7061265575274197401, '__SqlMappedNamespace', '__SqlMappedNamespace', 3, 1, ObjectId from ObjectMap where ObjectPath = 'meta_class'
|
|
insert into ObjectMap (ObjectId, ObjectKey, ObjectPath, ObjectState, ReferenceCount, ClassId)
|
|
select 3373910491091605771, '__Instances', '__Instances', 3, 1, ObjectId from ObjectMap where ObjectPath = 'meta_class'
|
|
insert into ObjectMap (ObjectId, ObjectKey, ObjectPath, ObjectState, ReferenceCount, ClassId)
|
|
select -7316356768687527881, '__Container_Association', '__Container_Association', 3, 1, 1
|
|
END
|
|
go
|
|
|
|
/******************************************************************************/
|
|
/* */
|
|
/* ClassMap */
|
|
/* */
|
|
/* Description: This table stores information that only pertains to classes.*/
|
|
/* This is an optimization to allow quick location of class */
|
|
/* objects. */
|
|
/* */
|
|
/******************************************************************************/
|
|
|
|
IF NOT EXISTS (select * from sysobjects where name = 'ClassMap')
|
|
BEGIN
|
|
print 'Creating ClassMap...'
|
|
create table ClassMap
|
|
( ClassId WMISQL_ID NOT NULL,
|
|
ClassName nvarchar(450) NOT NULL,
|
|
SuperClassId WMISQL_ID NULL DEFAULT 0,
|
|
ClassBlob image NULL,
|
|
CONSTRAINT ClassMap_PK PRIMARY KEY CLUSTERED (ClassId)
|
|
)
|
|
/******************************************************************************/
|
|
/* */
|
|
/* Initial classes: */
|
|
/* */
|
|
/* meta_class The parent of all class objects. */
|
|
/* __Namespace The container class of namespace objects. */
|
|
/* */
|
|
/******************************************************************************/
|
|
|
|
insert into ClassMap (ClassId, ClassName)
|
|
select ObjectId, 'meta_class' from ObjectMap
|
|
where ObjectPath = 'meta_class'
|
|
insert into ClassMap (ClassId, ClassName, SuperClassId)
|
|
select ObjectId, '__Namespace', 1 from ObjectMap
|
|
where ObjectPath = '__Namespace'
|
|
declare @SuperClassId WMISQL_ID
|
|
select @SuperClassId = ClassId from ClassMap where ClassName = '__Namespace'
|
|
insert into ClassMap (ClassId, ClassName, SuperClassId)
|
|
select ObjectId, '__SqlMappedNamespace', @SuperClassId from ObjectMap
|
|
where ObjectPath = '__SqlMappedNamespace'
|
|
insert into ClassMap (ClassId, ClassName, SuperClassId)
|
|
select ObjectId, '__Instances', 1 from ObjectMap
|
|
where ObjectPath = '__Instances'
|
|
insert into ClassMap (ClassId, ClassName, SuperClassId)
|
|
select ObjectId, '__Container_Association', 1 from ObjectMap
|
|
where ObjectPath = '__Container_Association'
|
|
|
|
END
|
|
go
|
|
|
|
/******************************************************************************/
|
|
/* */
|
|
/* ContainerObjs */
|
|
/* */
|
|
/******************************************************************************/
|
|
|
|
IF NOT EXISTS (select * from sysobjects where name = 'ContainerObjs')
|
|
BEGIN
|
|
print 'Creating ContainerObjs...'
|
|
create table ContainerObjs
|
|
( ContainerId WMISQL_ID NOT NULL,
|
|
ContaineeId WMISQL_ID NOT NULL,
|
|
CONSTRAINT ContainerObjs_PK PRIMARY KEY CLUSTERED (ContainerId, ContaineeId)
|
|
)
|
|
|
|
create index ContainerObjs_idx on ContainerObjs (ContaineeId)
|
|
END
|
|
go
|
|
|
|
/******************************************************************************/
|
|
/* */
|
|
/* StorageTypes */
|
|
/* */
|
|
/* Description: Lookup table to allow quick cross-referencing between */
|
|
/* native CIM Types and their SQL equivalents. */
|
|
/* */
|
|
/* Types: SQL Type: Description: */
|
|
/* String nvarchar(4000) Unicode string */
|
|
/* Int64 WMISQL_ID(18,0) Fixed-length signed 64-bit integer */
|
|
/* Real float(53) 64-bit floating point integer */
|
|
/* Object WMISQL_ID(18,0) Object ID reference */
|
|
/* Image image 8K blob */
|
|
/* Compact n/a Inherent storage in schema */
|
|
/* */
|
|
/******************************************************************************/
|
|
|
|
IF NOT EXISTS (select * from sysobjects where name = 'StorageTypes')
|
|
BEGIN
|
|
print 'Creating StorageTypes...'
|
|
|
|
create table StorageTypes
|
|
(
|
|
StorageTypeId int NOT NULL,
|
|
StorageType nvarchar(64) NOT NULL,
|
|
CONSTRAINT StorageTypes_PK PRIMARY KEY CLUSTERED (StorageTypeId)
|
|
)
|
|
|
|
create unique index StorageType_idx on StorageTypes (StorageType)
|
|
|
|
insert into StorageTypes values (1, 'String')
|
|
insert into StorageTypes values (2, 'Int64')
|
|
insert into StorageTypes values (3, 'Real')
|
|
insert into StorageTypes values (4, 'Object')
|
|
insert into StorageTypes values (5, 'Image')
|
|
insert into StorageTypes values (6, 'Compact')
|
|
|
|
END
|
|
go
|
|
|
|
/******************************************************************************/
|
|
/* */
|
|
/* CIMTypes */
|
|
/* */
|
|
/* Description: Lookup table for native CIM Types and values. */
|
|
/* StorageTypeId refers to the storage mechanism in SQL. */
|
|
/* ConversionLevel is used by sp_ConversionAllowed to indicate */
|
|
/* cross-compatibility between datatypes (if a conversion is */
|
|
/* requested.) */
|
|
/* */
|
|
/* Types: SQL Type: Conversion: Comments: */
|
|
/* Boolean Int64 >=int8,Real */
|
|
/* Uint8 Int64 >=int8,Real If array, stored as blob. */
|
|
/* Sint8 Int64 >=int8,Real */
|
|
/* Uint16 Int64 >=int16,Real */
|
|
/* Sint16 Int64 >=int16,Real */
|
|
/* Uint32 Int64 >=int32,Real */
|
|
/* Sint32 Int64 >=int32,Real */
|
|
/* Uint64 Int64 Sint64,Real64 */
|
|
/* Sint64 Int64 Uint64,Real64 */
|
|
/* Char16 Int64 >=int16,Real Stored as 16-bit int. */
|
|
/* String String None */
|
|
/* Datetime String None Stored as DMTF string. */
|
|
/* Real32 Real Real64 */
|
|
/* Real64 Real None */
|
|
/* Object Object None Stored same as reference. */
|
|
/* Ref Object None */
|
|
/* */
|
|
/******************************************************************************/
|
|
|
|
IF NOT EXISTS (select * from sysobjects where name = 'CIMTypes')
|
|
BEGIN
|
|
print 'Creating CIMTypes...'
|
|
|
|
create table CIMTypes
|
|
(
|
|
CIMTypeId int NOT NULL,
|
|
CIMType nvarchar(64) NOT NULL,
|
|
StorageTypeId int NULL,
|
|
ConversionLevel tinyint NULL DEFAULT 0, /* Only can convert upwards...*/
|
|
CONSTRAINT CIMType_PK PRIMARY KEY CLUSTERED (CIMTypeId),
|
|
CONSTRAINT CIMType_FK FOREIGN KEY (StorageTypeId) REFERENCES StorageTypes
|
|
)
|
|
create unique index CIMType_idx on CIMTypes (CIMType)
|
|
|
|
insert into CIMTypes values (11, 'Boolean', 2, 0)
|
|
insert into CIMTypes values (17, 'Uint8', 2, 1)
|
|
insert into CIMTypes values (16, 'Sint8', 2, 1)
|
|
insert into CIMTypes values (18, 'Uint16', 2, 2)
|
|
insert into CIMTypes values (2, 'Sint16', 2, 2)
|
|
insert into CIMTypes values (19, 'Uint32', 2, 3)
|
|
insert into CIMTypes values (3, 'Sint32', 2, 3)
|
|
insert into CIMTypes values (21, 'Uint64', 2, 5)
|
|
insert into CIMTypes values (20, 'Sint64', 2, 5)
|
|
insert into CIMTypes values (103,'Char16',2, 2)
|
|
insert into CIMTypes values (8, 'String', 1, 99)
|
|
insert into CIMTypes values (101,'Datetime', 1, 99)
|
|
insert into CIMTypes values (4, 'Real32', 3, 4)
|
|
insert into CIMTypes values (5, 'Real64', 3, 6)
|
|
insert into CIMTypes values (13, 'Object', 4, 99)
|
|
insert into CIMTypes values (102,'Ref', 4, 99)
|
|
END
|
|
go
|
|
|
|
/******************************************************************************/
|
|
/* */
|
|
/* CIMFlags */
|
|
/* */
|
|
/* Description: This table stores a short-hand lookup list for commonly- */
|
|
/* used and essential qualifiers. The presence of one of */
|
|
/* these flags will preclude separate storage in ClassData. */
|
|
/* Flags marked with asterisk (*) are system-enforced at this */
|
|
/* level (instead of /in addition to API) */
|
|
/* */
|
|
/* Flags: Description: */
|
|
/* Array Multiple values allowed for this property */
|
|
/* Qualifier *This property is a qualifier. */
|
|
/* Key *This property uniquely identifies an instance. */
|
|
/* Indexed *This property is commonly searched on (optimize) */
|
|
/* Not_Null *This property cannot be null. */
|
|
/* Method This property is a method. */
|
|
/* In Parameter This property is a method IN parameter. */
|
|
/* Out Parameter This property is a method OUT parameter. */
|
|
/* Keyhole This class must supply its own key if not supplied. */
|
|
/* Abstract *This class cannot have instances. */
|
|
/* Unkeyed *This class cannot have key properties (sys supplies) */
|
|
/* Singleton *This class can have a maximum of 1 instance. */
|
|
/* Hidden This namespace is not visible to other users */
|
|
/* System This property was created by the system */
|
|
/* */
|
|
/******************************************************************************/
|
|
|
|
IF NOT EXISTS (select * from sysobjects where name = 'CIMFlags')
|
|
BEGIN
|
|
print 'Creating CIMFlags...'
|
|
create table CIMFlags
|
|
(
|
|
CIMFlagId int NOT NULL,
|
|
CIMFlag nvarchar(36) NULL,
|
|
CONSTRAINT CIMTypeFlags_PK PRIMARY KEY CLUSTERED (CIMFlagId)
|
|
)
|
|
create unique index CIMFlag_idx on CIMFlags (CIMFlag)
|
|
|
|
/* Property flags */
|
|
insert into CIMFlags values (1, 'Array')
|
|
insert into CIMFlags values (2, 'Qualifier')
|
|
insert into CIMFlags values (4, 'Key')
|
|
insert into CIMFlags values (8, 'Indexed')
|
|
insert into CIMFlags values (16, 'Not_Null')
|
|
insert into CIMFlags values (32, 'Method')
|
|
insert into CIMFlags values (64, 'In Parameter')
|
|
insert into CIMFlags values (128, 'Out Parameter')
|
|
insert into CIMFlags values (256, 'Keyhole')
|
|
|
|
/* Class flags */
|
|
insert into CIMFlags values (512, 'Abstract')
|
|
insert into CIMFlags values (1024,'Unkeyed')
|
|
insert into CIMFlags values (2048,'Singleton')
|
|
|
|
/* Namespace flag */
|
|
insert into CIMFlags values (4096,'Hidden')
|
|
insert into CIMFlags values (8192,'System')
|
|
END
|
|
go
|
|
|
|
/******************************************************************************/
|
|
/* */
|
|
/* ClassKeys */
|
|
/* */
|
|
/******************************************************************************/
|
|
|
|
IF NOT EXISTS (select * from sysobjects where name = 'ClassKeys')
|
|
BEGIN
|
|
CREATE TABLE ClassKeys
|
|
(
|
|
ClassId WMISQL_ID NOT NULL,
|
|
PropertyId int NOT NULL,
|
|
CONSTRAINT ClassKeys_PK PRIMARY KEY CLUSTERED (ClassId, PropertyId)
|
|
)
|
|
END
|
|
go
|
|
|
|
/******************************************************************************/
|
|
/* */
|
|
/* ReferenceProperties */
|
|
/* */
|
|
/******************************************************************************/
|
|
|
|
IF NOT EXISTS (select * from sysobjects where name = 'ReferenceProperties')
|
|
BEGIN
|
|
CREATE TABLE ReferenceProperties
|
|
(
|
|
ClassId WMISQL_ID NOT NULL,
|
|
PropertyId int NOT NULL,
|
|
RefClassId WMISQL_ID NOT NULL,
|
|
CONSTRAINT RefProp_PK PRIMARY KEY CLUSTERED (ClassId, PropertyId)
|
|
)
|
|
|
|
create index PropertyId_idx on ReferenceProperties (PropertyId)
|
|
create index RefClassId_idx on ReferenceProperties (RefClassId)
|
|
END
|
|
go
|
|
/******************************************************************************/
|
|
/* */
|
|
/* PropertyMap */
|
|
/* */
|
|
/* Description: This table stores the schema of a class object. Each */
|
|
/* property, method, method parameter and qualifier is */
|
|
/* inserted into this table. Qualifiers are always assigned */
|
|
/* to meta_class so they are available globally. Default data */
|
|
/* and qualifier values are stored separately in ClassData. */
|
|
/* */
|
|
/* Defaults: Class: Notes: */
|
|
/* Name __Namespace Namespace name (for default) */
|
|
/* __Path meta_class Auto-generated by vSystemProperties */
|
|
/* __RelPath -"- or the system. */
|
|
/* __Class -"- -"- */
|
|
/* __SuperClass -"- -"- */
|
|
/* __Deriviation -"- -"- */
|
|
/* __Dynasty -"- -"- */
|
|
/* __Namespace -"- -"- */
|
|
/* __Genus -"- -"- */
|
|
/* __Property_Count -"- -"- */
|
|
/* __Server -"- -"- */
|
|
/* __Version -"- -"- */
|
|
/* __Security -"- security descriptor (internal) */
|
|
/* */
|
|
/******************************************************************************/
|
|
|
|
IF NOT EXISTS (select * from sysobjects where name = 'PropertyMap')
|
|
BEGIN
|
|
print 'Creating PropertyMap...'
|
|
create table PropertyMap
|
|
(
|
|
PropertyId int NOT NULL IDENTITY(1,1),
|
|
ClassId WMISQL_ID NOT NULL,
|
|
PropertyName nvarchar(450) NOT NULL,
|
|
StorageTypeId int NULL DEFAULT 0,
|
|
CIMTypeId int NULL DEFAULT 0,
|
|
Flags int NULL DEFAULT 0, /* IsArray, IsQualifier, IsIndexed, IsKey, CanBeNull */
|
|
CONSTRAINT PropertyMap_PK PRIMARY KEY CLUSTERED (PropertyId),
|
|
CONSTRAINT PropertyMap_FK FOREIGN KEY (ClassId) REFERENCES ClassMap,
|
|
CONSTRAINT PropertyMap_FK2 FOREIGN KEY (StorageTypeId) REFERENCES StorageTypes,
|
|
CONSTRAINT PropertyMap_FK3 FOREIGN KEY (CIMTypeId) REFERENCES CIMTypes
|
|
)
|
|
|
|
insert into PropertyMap (ClassId, PropertyName, StorageTypeId, CIMTypeId, Flags)
|
|
select ClassId, 'Name', 1, 8, 4 from ClassMap
|
|
where ClassName = '__Namespace'
|
|
insert into ClassKeys (ClassId, PropertyId) select ClassId, @@identity
|
|
from ClassMap where ClassName = '__Namespace'
|
|
insert into PropertyMap (ClassId, PropertyName, StorageTypeId, CIMTypeId, Flags)
|
|
select ClassId, 'ClassName', 1, 8, 4 from ClassMap
|
|
where ClassName = '__Instances'
|
|
insert into ClassKeys (ClassId, PropertyId) select ClassId, @@identity
|
|
from ClassMap where ClassName = '__Instances'
|
|
|
|
insert into PropertyMap (ClassId, PropertyName, StorageTypeId, CIMTypeId, Flags)
|
|
select ClassId, '__Path', 6, 8, 8192 from ClassMap
|
|
where ClassName = 'meta_class'
|
|
insert into PropertyMap (ClassId, PropertyName, StorageTypeId, CIMTypeId, Flags)
|
|
select ClassId, '__RelPath', 6, 8, 8192 from ClassMap
|
|
where ClassName = 'meta_class'
|
|
insert into PropertyMap (ClassId, PropertyName, StorageTypeId, CIMTypeId, Flags)
|
|
select ClassId, '__Class', 6, 8, 8192 from ClassMap
|
|
where ClassName = 'meta_class'
|
|
insert into PropertyMap (ClassId, PropertyName, StorageTypeId, CIMTypeId, Flags)
|
|
select ClassId, '__SuperClass', 6, 8, 8192 from ClassMap
|
|
where ClassName = 'meta_class'
|
|
insert into PropertyMap (ClassId, PropertyName, StorageTypeId, CIMTypeId, Flags)
|
|
select ClassId, '__Derivation', 6, 8, 8193 from ClassMap
|
|
where ClassName = 'meta_class'
|
|
insert into PropertyMap (ClassId, PropertyName, StorageTypeId, CIMTypeId, Flags)
|
|
select ClassId, '__Dynasty', 6, 8, 8192 from ClassMap
|
|
where ClassName = 'meta_class'
|
|
insert into PropertyMap (ClassId, PropertyName, StorageTypeId, CIMTypeId, Flags)
|
|
select ClassId, '__Namespace', 6, 8, 8192 from ClassMap
|
|
where ClassName = 'meta_class'
|
|
insert into PropertyMap (ClassId, PropertyName, StorageTypeId, CIMTypeId, Flags)
|
|
select ClassId, '__Genus', 6, 3, 8192 from ClassMap
|
|
where ClassName = 'meta_class'
|
|
insert into PropertyMap (ClassId, PropertyName, StorageTypeId, CIMTypeId, Flags)
|
|
select ClassId, '__Property_Count', 6, 8, 8192 from ClassMap
|
|
where ClassName = 'meta_class'
|
|
insert into PropertyMap (ClassId, PropertyName, StorageTypeId, CIMTypeId, Flags)
|
|
select ClassId, '__Server', 6, 3, 8192 from ClassMap
|
|
where ClassName = 'meta_class'
|
|
insert into PropertyMap (ClassId, PropertyName, StorageTypeId, CIMTypeId, Flags)
|
|
select ClassId, '__Version', 6, 8, 8192 from ClassMap
|
|
where ClassName = 'meta_class'
|
|
|
|
insert into PropertyMap (ClassId, PropertyName, StorageTypeId, CIMTypeId, Flags)
|
|
select ClassId, 'Containee', 4, 102, 4 from ClassMap
|
|
where ClassName = '__Container_Association'
|
|
insert into ClassKeys (ClassId, PropertyId) select ClassId, @@identity from
|
|
ClassMap where ClassName = '__Container_Association'
|
|
insert into PropertyMap (ClassId, PropertyName, StorageTypeId, CIMTypeId, Flags)
|
|
select ClassId, 'Container', 4, 102, 4 from ClassMap
|
|
where ClassName = '__Container_Association'
|
|
insert into ClassKeys (ClassId, PropertyId) select ClassId, @@identity from
|
|
ClassMap where ClassName = '__Container_Association'
|
|
|
|
create index PropertyName_idx on PropertyMap (PropertyName)
|
|
|
|
create index ClassId_idx on PropertyMap (ClassId)
|
|
END
|
|
go
|
|
|
|
/******************************************************************************/
|
|
/* */
|
|
/* IndexStringData */
|
|
/* IndexNumericData */
|
|
/* IndexRealData */
|
|
/* IndexRefData */
|
|
/* */
|
|
/* Description: These tables store frequently-accessed data for instances */
|
|
/* Each table contains a column of data in its own indigenous */
|
|
/* type, and a non-clustered index on that data. */
|
|
/* (The non-clustered index proved 80% faster than clustered */
|
|
/* for insert and query operations.) */
|
|
/* These tables allow the system to avoid indexing non-indexed */
|
|
/* data in the master storage table ClassData. */
|
|
/* */
|
|
/******************************************************************************/
|
|
|
|
IF NOT EXISTS (select * from sysobjects where name = 'IndexStringData')
|
|
BEGIN
|
|
print 'Creating index tables...'
|
|
create table IndexStringData
|
|
(ObjectId WMISQL_ID NOT NULL,
|
|
PropertyId int NOT NULL,
|
|
PropertyStringValue nvarchar(450) NOT NULL,
|
|
ArrayPos smallint NOT NULL DEFAULT 0,
|
|
CONSTRAINT IndexStringData_PK PRIMARY KEY CLUSTERED (ObjectId, PropertyId, ArrayPos) WITH FILLFACTOR=80,
|
|
CONSTRAINT IndexStringData_FK FOREIGN KEY (PropertyId) REFERENCES PropertyMap,
|
|
CONSTRAINT IndexStringData_FK2 FOREIGN KEY (ObjectId) REFERENCES ObjectMap
|
|
)
|
|
|
|
create index IndexStringData_idx on IndexStringData (PropertyStringValue) with fillfactor = 80
|
|
|
|
create index IndexStringData2_idx on IndexStringData (PropertyId) with fillfactor = 80
|
|
END
|
|
go
|
|
|
|
IF NOT EXISTS (select * from sysobjects where name = 'IndexNumericData')
|
|
BEGIN
|
|
print 'Creating index tables...'
|
|
create table IndexNumericData
|
|
(ObjectId WMISQL_ID NOT NULL,
|
|
PropertyId int NOT NULL,
|
|
PropertyNumericValue WMISQL_ID NOT NULL,
|
|
ArrayPos smallint NOT NULL DEFAULT 0,
|
|
CONSTRAINT IndexNumericData_PK PRIMARY KEY CLUSTERED (ObjectId, PropertyId, ArrayPos) WITH FILLFACTOR=80,
|
|
CONSTRAINT IndexNumericData_FK FOREIGN KEY (PropertyId) REFERENCES PropertyMap,
|
|
CONSTRAINT IndexNumericData_FK2 FOREIGN KEY (ObjectId) REFERENCES ObjectMap
|
|
)
|
|
|
|
create index IndexNumericData_idx on IndexNumericData (PropertyNumericValue) with fillfactor = 80
|
|
|
|
create index IndexNumericData2_idx on IndexNumericData (PropertyId) with fillfactor = 80
|
|
END
|
|
go
|
|
|
|
IF NOT EXISTS (select * from sysobjects where name = 'IndexRealData')
|
|
BEGIN
|
|
print 'Creating index tables...'
|
|
|
|
create table IndexRealData
|
|
(ObjectId WMISQL_ID NOT NULL,
|
|
PropertyId int NOT NULL,
|
|
PropertyRealValue float(53) NOT NULL,
|
|
ArrayPos smallint NOT NULL DEFAULT 0,
|
|
CONSTRAINT IndexRealData_PK PRIMARY KEY CLUSTERED (ObjectId, PropertyId, ArrayPos) WITH FILLFACTOR=80,
|
|
CONSTRAINT IndexRealData_FK FOREIGN KEY (PropertyId) REFERENCES PropertyMap,
|
|
CONSTRAINT IndexRealData_FK2 FOREIGN KEY (ObjectId) REFERENCES ObjectMap
|
|
)
|
|
|
|
create index IndexRealData_idx on IndexRealData (PropertyRealValue)
|
|
|
|
create index IndexReal2Data_idx on IndexRealData (PropertyId)
|
|
END
|
|
go
|
|
|
|
IF NOT EXISTS (select * from sysobjects where name = 'IndexRefData')
|
|
BEGIN
|
|
print 'Creating index tables...'
|
|
create table IndexRefData
|
|
(ObjectId WMISQL_ID NOT NULL,
|
|
PropertyId int NOT NULL,
|
|
RefId WMISQL_ID NOT NULL,
|
|
ArrayPos smallint NOT NULL DEFAULT 0,
|
|
CONSTRAINT IndexRefData_PK PRIMARY KEY CLUSTERED (ObjectId, PropertyId, ArrayPos) WITH FILLFACTOR=80,
|
|
CONSTRAINT IndexRefData_FK FOREIGN KEY (PropertyId) REFERENCES PropertyMap,
|
|
CONSTRAINT IndexRefData_FK2 FOREIGN KEY (ObjectId) REFERENCES ObjectMap
|
|
)
|
|
|
|
create index IndexRefData_idx on IndexRefData (RefId)
|
|
|
|
create index IndexRefData2_idx on IndexRefData (PropertyId)
|
|
END
|
|
go
|
|
|
|
/******************************************************************************/
|
|
/* */
|
|
/* ClassData */
|
|
/* */
|
|
/* Description: This table stores values for the properties of class and */
|
|
/* instances. Class data includes default values, method */
|
|
/* parameter defaults and qualifiers. Instance data includes */
|
|
/* qualifier and property values. */
|
|
/* If a property is null, it is not present in this table. */
|
|
/* */
|
|
/******************************************************************************/
|
|
|
|
IF NOT EXISTS (select * from sysobjects where name = 'ClassData')
|
|
BEGIN
|
|
print 'Creating ClassData...'
|
|
create table ClassData
|
|
(
|
|
ObjectId WMISQL_ID NOT NULL,
|
|
PropertyId int NOT NULL,
|
|
ArrayPos smallint NOT NULL,
|
|
QfrPos int NOT NULL DEFAULT 0, /* If qfr, enable same ID on multiple places in same obj*/
|
|
ClassId WMISQL_ID NOT NULL,
|
|
PropertyStringValue nvarchar(3970) NULL DEFAULT '',
|
|
PropertyNumericValue WMISQL_ID NULL DEFAULT 0,
|
|
PropertyRealValue float(53) NULL DEFAULT 0,
|
|
Flags smallint NULL DEFAULT 0, /* Flavor if qualifier, Embedded object vs. Ref */
|
|
RefClassId WMISQL_ID NULL DEFAULT 0,
|
|
RefId WMISQL_ID NULL DEFAULT 0, /* Object or property ID (Obj if Ref or embedded obj, Prop if prop qualifier)*/
|
|
CONSTRAINT ClassData_PK PRIMARY KEY CLUSTERED (ObjectId, PropertyId, ArrayPos, QfrPos) WITH FILLFACTOR = 80,
|
|
CONSTRAINT ClassData_FK FOREIGN KEY (PropertyId) REFERENCES PropertyMap,
|
|
CONSTRAINT ClassData2_FK FOREIGN KEY (ObjectId) REFERENCES ObjectMap
|
|
)
|
|
END
|
|
go
|
|
|
|
/******************************************************************************/
|
|
/* */
|
|
/* ClassImages */
|
|
/* */
|
|
/* Description: This table stores values of uint8 arrays and security */
|
|
/* descriptors for database objects. */
|
|
/* */
|
|
/******************************************************************************/
|
|
|
|
IF NOT EXISTS (select * from sysobjects where name = 'ClassImages')
|
|
BEGIN
|
|
create table ClassImages
|
|
(
|
|
ObjectId WMISQL_ID NOT NULL,
|
|
PropertyId int NOT NULL,
|
|
ArrayPos smallint NOT NULL,
|
|
PropertyImageValue image NULL,
|
|
CONSTRAINT ClassImages_PK PRIMARY KEY CLUSTERED (ObjectId, PropertyId, ArrayPos),
|
|
CONSTRAINT ClassImages_FK FOREIGN KEY (PropertyId) REFERENCES PropertyMap,
|
|
CONSTRAINT ClassImages2_FK FOREIGN KEY (ObjectId) REFERENCES ObjectMap
|
|
)
|
|
END
|
|
go
|
|
|
|
/******************************************************************************/
|
|
/* */
|
|
/* AutoDelete */
|
|
/* */
|
|
/******************************************************************************/
|
|
|
|
IF NOT EXISTS (select * from sysobjects where name = 'AutoDelete')
|
|
BEGIN
|
|
CREATE TABLE AutoDelete
|
|
(
|
|
ObjectId WMISQL_ID NOT NULL,
|
|
CONSTRAINT AutoDelete_PK PRIMARY KEY CLUSTERED (ObjectId)
|
|
)
|
|
END
|
|
go
|
|
|
|
|
|
/******************************************************************************/
|
|
/* */
|
|
/* Default namespace */
|
|
/* */
|
|
/* NOTE: This is a temporary construct for testing. The actual name of the */
|
|
/* root namespace may be dynamically-generated during setup, based */
|
|
/* on the architecture of the installation. */
|
|
/* */
|
|
/******************************************************************************/
|
|
|
|
print 'Creating root namespace...'
|
|
|
|
declare @ObjectId numeric(20,0), @ClassId numeric(20,0), @PropertyId int
|
|
select @ObjectId = ObjectId from ObjectMap where ObjectKey = 'root'
|
|
select @ClassId = ObjectId from ObjectMap where ObjectKey = '__Namespace'
|
|
select @PropertyId = PropertyId from PropertyMap where ClassId = @ClassId and PropertyName = 'Name'
|
|
|
|
IF NOT EXISTS (select * from ClassData where ObjectId = @ObjectId and PropertyId = @PropertyId)
|
|
BEGIN
|
|
insert into ClassData
|
|
(ObjectId, ClassId, PropertyId, ArrayPos, PropertyStringValue) values
|
|
(@ObjectId, @ClassId, @PropertyId, 0, 'root')
|
|
insert into IndexStringData
|
|
(ObjectId, PropertyId, ArrayPos, PropertyStringValue) values
|
|
(@ObjectId, @PropertyId, 0, 'root')
|
|
END
|
|
go
|
|
|
|
print 'Creating system classes for SQL Driver Extension for custom schema...'
|
|
|
|
IF NOT EXISTS (select * from ObjectMap where ObjectId in (-539347062633018661, -3130657873239620716))
|
|
BEGIN
|
|
insert into ObjectMap (ObjectId, ClassId, ObjectKey, ObjectPath, ObjectState, ReferenceCount, ObjectFlags, ObjectScopeId)
|
|
values (-539347062633018661, 1, '__CustRepDrvrMapping', '__CustRepDrvrMapping', 0, 0, 0, 0)
|
|
insert into ObjectMap (ObjectId, ClassId, ObjectKey, ObjectPath, ObjectState, ReferenceCount, ObjectFlags, ObjectScopeId)
|
|
values (-3130657873239620716, 1, '__CustRepDrvrMappingProperty', '__CustRepDrvrMappingProperty', 0, 0, 0, 0)
|
|
|
|
insert into ClassMap (ClassId, ClassName, SuperClassId) values
|
|
(-539347062633018661, '__CustRepDrvrMapping', 1)
|
|
insert into ClassMap (ClassId, ClassName, SuperClassId) values
|
|
(-3130657873239620716, '__CustRepDrvrMappingProperty', 1)
|
|
|
|
insert into PropertyMap (ClassId, PropertyName, StorageTypeId, CIMTypeId, Flags) values
|
|
(-539347062633018661, 'sTableName', 1, 8, 0)
|
|
insert into PropertyMap (ClassId, PropertyName, StorageTypeId, CIMTypeId, Flags) values
|
|
(-539347062633018661, 'sPrimaryKeyCol', 1, 8, 0)
|
|
insert into PropertyMap (ClassId, PropertyName, StorageTypeId, CIMTypeId, Flags) values
|
|
(-539347062633018661, 'sDatabaseName', 1, 8, 0)
|
|
insert into PropertyMap (ClassId, PropertyName, StorageTypeId, CIMTypeId, Flags) values
|
|
(-539347062633018661, 'sClassName', 1, 8, 4)
|
|
insert into ClassKeys (ClassId, PropertyId) select -539347062633018661, @@identity
|
|
insert into PropertyMap (ClassId, PropertyName, StorageTypeId, CIMTypeId, Flags) values
|
|
(-539347062633018661, 'arrProperties', 4, 13, 1)
|
|
insert into PropertyMap (ClassId, PropertyName, StorageTypeId, CIMTypeId, Flags) values
|
|
(-539347062633018661, 'sScopeClass', 1, 8, 0)
|
|
|
|
insert into ReferenceProperties (ClassId, PropertyId, RefClassId) values
|
|
(-539347062633018661, @@identity, -3130657873239620716)
|
|
insert into PropertyMap (ClassId, PropertyName, StorageTypeId, CIMTypeId, Flags) values
|
|
(-3130657873239620716, 'arrColumnNames', 1, 8, 1)
|
|
insert into PropertyMap (ClassId, PropertyName, StorageTypeId, CIMTypeId, Flags) values
|
|
(-3130657873239620716, 'arrForeignKeys', 1, 8, 1)
|
|
insert into PropertyMap (ClassId, PropertyName, StorageTypeId, CIMTypeId, Flags) values
|
|
(-3130657873239620716, 'bIsKey', 2, 11, 0)
|
|
insert into PropertyMap (ClassId, PropertyName, StorageTypeId, CIMTypeId, Flags) values
|
|
(-3130657873239620716, 'bStoreAsNumber', 2, 11, 0)
|
|
insert into PropertyMap (ClassId, PropertyName, StorageTypeId, CIMTypeId, Flags) values
|
|
(-3130657873239620716, 'bReadOnly', 2, 11, 0)
|
|
insert into PropertyMap (ClassId, PropertyName, StorageTypeId, CIMTypeId, Flags) values
|
|
(-3130657873239620716, 'bStoreAsBlob', 2, 11, 0)
|
|
insert into PropertyMap (ClassId, PropertyName, StorageTypeId, CIMTypeId, Flags) values
|
|
(-3130657873239620716, 'bDecompose', 2, 11, 0)
|
|
insert into PropertyMap (ClassId, PropertyName, StorageTypeId, CIMTypeId, Flags) values
|
|
(-3130657873239620716, 'bStoreAsMofText', 2, 11, 0)
|
|
insert into PropertyMap (ClassId, PropertyName, StorageTypeId, CIMTypeId, Flags) values
|
|
(-3130657873239620716, 'sPropertyName', 1, 8, 4)
|
|
insert into ClassKeys (ClassId, PropertyId) select -3130657873239620716, @@identity
|
|
insert into PropertyMap (ClassId, PropertyName, StorageTypeId, CIMTypeId, Flags) values
|
|
(-3130657873239620716, 'sTableName', 1, 8, 0)
|
|
insert into PropertyMap (ClassId, PropertyName, StorageTypeId, CIMTypeId, Flags) values
|
|
(-3130657873239620716, 'sClassTableName', 1, 8, 0)
|
|
insert into PropertyMap (ClassId, PropertyName, StorageTypeId, CIMTypeId, Flags) values
|
|
(-3130657873239620716, 'sClassDataColumn', 1, 8, 0)
|
|
insert into PropertyMap (ClassId, PropertyName, StorageTypeId, CIMTypeId, Flags) values
|
|
(-3130657873239620716, '"sClassNameColumn', 1, 8, 0)
|
|
insert into PropertyMap (ClassId, PropertyName, StorageTypeId, CIMTypeId, Flags) values
|
|
(-3130657873239620716, 'sClassForeignKey', 1, 8, 0)
|
|
END
|
|
go
|
|
|
|
print 'Creating stored procedures...'
|
|
|
|
create table #Parents (ClassId WMISQL_ID)
|
|
go
|
|
create table #Children (ClassId WMISQL_ID, SuperClassId WMISQL_ID)
|
|
go
|
|
|
|
/******************************************************************************/
|
|
/* */
|
|
/* sp_GetChildClassList */
|
|
/* */
|
|
/* Description: Loads a temp table with the list of classes derived of this */
|
|
/* */
|
|
/* Parameters: */
|
|
/* @ClassID WMISQL_ID the internal ClassID */
|
|
/* */
|
|
/******************************************************************************/
|
|
print 'Creating sp_GetChildClassList...'
|
|
|
|
IF EXISTS (select * from sysobjects where type = 'P' and name = 'sp_GetChildClassList')
|
|
BEGIN
|
|
drop procedure sp_GetChildClassList
|
|
END
|
|
go
|
|
|
|
CREATE PROCEDURE sp_GetChildClassList
|
|
@ClassID WMISQL_ID,
|
|
@RetValue bit = 0
|
|
AS
|
|
BEGIN
|
|
truncate table #Children
|
|
declare @RowCount int
|
|
|
|
insert into #Children select @ClassID, 0
|
|
|
|
insert into #Children select ClassId, SuperClassId from ClassMap
|
|
where SuperClassId = @ClassID
|
|
|
|
select @RowCount = @@rowcount
|
|
|
|
while (@RowCount > 0)
|
|
BEGIN
|
|
insert into #Children select t1.ClassId, t1.SuperClassId from ClassMap as t1
|
|
inner join #Children as t2
|
|
on t1.SuperClassId = t2.ClassId
|
|
where not exists (select ClassId from #Children as t3 where t3.ClassId = t1.ClassId)
|
|
select @RowCount = @@rowcount
|
|
END
|
|
|
|
IF (@RetValue != 0)
|
|
select * from #Children
|
|
|
|
return 0
|
|
|
|
END
|
|
go
|
|
|
|
|
|
/******************************************************************************/
|
|
/* */
|
|
/* sp_GetParentList */
|
|
/* */
|
|
/* Description: Loads a temp table with the list of this classes' ancestors */
|
|
/* */
|
|
/* Parameters: */
|
|
/* @ClassID WMISQL_ID the internal ClassID */
|
|
/* */
|
|
/******************************************************************************/
|
|
print 'Creating sp_GetParentList...'
|
|
|
|
IF EXISTS (select * from sysobjects where type = 'P' and name = 'sp_GetParentList')
|
|
BEGIN
|
|
drop procedure sp_GetParentList
|
|
END
|
|
go
|
|
|
|
CREATE PROCEDURE sp_GetParentList
|
|
@ClassID WMISQL_ID,
|
|
@RetValue bit = 0
|
|
AS
|
|
BEGIN
|
|
truncate table #Parents
|
|
declare @ParentID WMISQL_ID
|
|
|
|
select @ParentID = SuperClassId from ClassMap where ClassID = @ClassID
|
|
|
|
while (isnull(@ParentID,0) > 0)
|
|
BEGIN
|
|
insert into #Parents select @ParentID
|
|
select @ParentID = SuperClassId from ClassMap where ClassID = @ParentID
|
|
IF EXISTS (select * from #Parents where ClassId = @ParentID)
|
|
return 0
|
|
END
|
|
|
|
IF (@RetValue != 0)
|
|
select * from #Parents
|
|
|
|
return 0
|
|
|
|
END
|
|
go
|
|
|
|
/******************************************************************************/
|
|
/* */
|
|
/* sp_GetHierarchy */
|
|
/* */
|
|
/* Description: Loads a temp table with the list of this classes' ancestors */
|
|
/* */
|
|
/* Parameters: */
|
|
/* @ClassID WMISQL_ID the internal ClassID */
|
|
/* */
|
|
/******************************************************************************/
|
|
|
|
print 'Creating sp_GetHierarchy...'
|
|
|
|
IF EXISTS (select * from sysobjects where type = 'P' and name = 'sp_GetHierarchy')
|
|
BEGIN
|
|
drop procedure sp_GetHierarchy
|
|
END
|
|
go
|
|
|
|
CREATE PROCEDURE sp_GetHierarchy
|
|
@ClassId WMISQL_ID,
|
|
@RetValue bit = 0
|
|
AS
|
|
BEGIN
|
|
exec sp_GetParentList @ClassId, @RetValue
|
|
exec sp_GetChildClassList @ClassId, @RetValue
|
|
END
|
|
go
|
|
|
|
/******************************************************************************/
|
|
/* */
|
|
/* sp_GetFlagFromQualifier */
|
|
/* */
|
|
/* Description: Returns the WMISQL_ID value for a well-known qualifier flag. */
|
|
/* */
|
|
/* Parameters: */
|
|
/* @Type nvarchar(32) the qualifier name */
|
|
/* @RetValue bit TRUE if proc should print ret value */
|
|
/* */
|
|
/******************************************************************************/
|
|
|
|
print 'Creating sp_GetFlagFromQualifier...'
|
|
|
|
IF EXISTS (select * from sysobjects where type = 'P' and name = 'sp_GetFlagFromQualifier')
|
|
BEGIN
|
|
drop procedure sp_GetFlagFromQualifier
|
|
END
|
|
go
|
|
|
|
CREATE PROCEDURE sp_GetFlagFromQualifier
|
|
@Type nvarchar(32),
|
|
@RetValue bit = 0
|
|
AS
|
|
BEGIN
|
|
|
|
declare @FlagID int
|
|
select @FlagID = CIMFlagId from CIMFlags where CIMFlag = @Type
|
|
|
|
if (isnull(@FlagID,-1) = -1)
|
|
BEGIN
|
|
raiserror 99107 'Invalid CIM Flag'
|
|
select @Type
|
|
return 0
|
|
END
|
|
|
|
if (@RetValue != 0)
|
|
select @FlagID
|
|
|
|
return @FlagID
|
|
|
|
END
|
|
go
|
|
|
|
/******************************************************************************/
|
|
/* */
|
|
/* sp_GetStorageTypeFromCIMType */
|
|
/* */
|
|
/* Description: Returns the internal storage type ID for a CIM Type ID */
|
|
/* */
|
|
/* Parameters: */
|
|
/* @Type nvarchar(32) the CIM type name */
|
|
/* @RetValue bit TRUE to print return value */
|
|
/* */
|
|
/******************************************************************************/
|
|
|
|
print 'Creating sp_GetStorageTypeFromCIMType...'
|
|
|
|
IF EXISTS (select * from sysobjects where type = 'P' and name = 'sp_GetStorageTypeFromCIMType')
|
|
BEGIN
|
|
drop procedure sp_GetStorageTypeFromCIMType
|
|
END
|
|
go
|
|
|
|
CREATE PROCEDURE sp_GetStorageTypeFromCIMType
|
|
@Type nvarchar(64),
|
|
@RetValue bit = 0
|
|
AS
|
|
BEGIN
|
|
|
|
declare @FlagID int
|
|
select @FlagID = StorageTypeId from CIMTypes where CIMType = @Type
|
|
|
|
if (isnull(@FlagID,-1) = -1)
|
|
BEGIN
|
|
raiserror 99108 'Invalid CIM Datatype'
|
|
select @Type
|
|
return 0
|
|
END
|
|
|
|
if (@RetValue != 0)
|
|
select @FlagID
|
|
|
|
return @FlagID
|
|
|
|
END
|
|
go
|
|
|
|
/******************************************************************************/
|
|
/* */
|
|
/* sp_GetCIMTypeID */
|
|
/* */
|
|
/* Description: Returns the WMISQL_ID ID for a CIM Type. */
|
|
/* */
|
|
/* Parameters: */
|
|
/* @Type nvarchar(32) The CIM Type name */
|
|
/* @RetValue bit TRUE to print the return value */
|
|
/* */
|
|
/******************************************************************************/
|
|
|
|
print 'Creating sp_GetCIMTypeID...'
|
|
|
|
IF EXISTS (select * from sysobjects where type = 'P' and name = 'sp_GetCIMTypeID')
|
|
BEGIN
|
|
drop procedure sp_GetCIMTypeID
|
|
END
|
|
go
|
|
|
|
CREATE PROCEDURE sp_GetCIMTypeID
|
|
@Type nvarchar(32),
|
|
@RetValue bit = 0
|
|
AS
|
|
BEGIN
|
|
|
|
declare @FlagID int
|
|
select @FlagID = CIMTypeId from CIMTypes where CIMType = @Type
|
|
|
|
if (isnull(@FlagID,-1) = -1)
|
|
BEGIN
|
|
raiserror 99108 'Invalid CIM Datatype'
|
|
select @Type
|
|
return 0
|
|
END
|
|
|
|
if (@RetValue != 0)
|
|
select @FlagID
|
|
|
|
return @FlagID
|
|
|
|
END
|
|
go
|
|
|
|
/******************************************************************************/
|
|
/* */
|
|
/* sp_ConversionAllowed */
|
|
/* */
|
|
/* Description: Returns TRUE if the new CIM Type is convertible from the */
|
|
/* existing type. */
|
|
/* */
|
|
/* Parameters: */
|
|
/* @OriginalType int The existing CIM Type ID */
|
|
/* @NewType int The proposed new CIM Type ID */
|
|
/* */
|
|
/* NOTES: */
|
|
/* Conversions are only allowed to increase precision - irrespective */
|
|
/* of the existing data. We will only allow conversions from integer */
|
|
/* to real, and between integer types that increase the size, or change */
|
|
/* sign. */
|
|
/* */
|
|
/******************************************************************************/
|
|
|
|
print 'Creating sp_ConversionAllowed...'
|
|
|
|
IF EXISTS (select * from sysobjects where type = 'P' and name = 'sp_ConversionAllowed')
|
|
BEGIN
|
|
drop procedure sp_ConversionAllowed
|
|
END
|
|
go
|
|
|
|
CREATE PROCEDURE sp_ConversionAllowed
|
|
@OriginalType int,
|
|
@NewType int
|
|
AS
|
|
BEGIN
|
|
declare @RetVal bit
|
|
declare @Lvl1 tinyint, @Lvl2 tinyint
|
|
|
|
select @Lvl1 = ConversionLevel from CIMTypes where CIMTypeId = @OriginalType
|
|
select @Lvl2 = ConversionLevel from CIMTypes where CIMTypeId = @NewTYpe
|
|
|
|
IF (@Lvl2 >= @Lvl1 and @Lvl2 != 99)
|
|
select @RetVal = 1
|
|
ELSE
|
|
select @RetVal = 0
|
|
|
|
return @RetVal
|
|
END
|
|
go
|
|
|
|
/******************************************************************************/
|
|
/* */
|
|
/* sp_HasInstances */
|
|
/* */
|
|
/* Description: Returns TRUE if this class contains any instances of itself */
|
|
/* or any child classes */
|
|
/* */
|
|
/* Parameters: */
|
|
/* @ClassId WMISQL_ID The class ID to test */
|
|
/* @HasInst int TRUE if instances exist (output) */
|
|
/* */
|
|
/******************************************************************************/
|
|
|
|
print 'Creating sp_HasInstances...'
|
|
|
|
IF EXISTS (select * from sysobjects where type = 'P' and name = 'sp_HasInstances')
|
|
BEGIN
|
|
drop procedure sp_HasInstances
|
|
END
|
|
go
|
|
|
|
CREATE PROCEDURE sp_HasInstances
|
|
@ClassId WMISQL_ID,
|
|
@HasInst int output
|
|
AS
|
|
BEGIN
|
|
|
|
select @HasInst = 0
|
|
|
|
IF EXISTS (select ObjectId from ObjectMap
|
|
where ClassId = @ClassId)
|
|
BEGIN
|
|
select @HasInst = 1
|
|
return 1
|
|
END
|
|
|
|
IF EXISTS (select ClassId from ClassMap where SuperClassId = @ClassId)
|
|
BEGIN
|
|
IF EXISTS (select ObjectId from ObjectMap as o
|
|
inner join ClassMap as c
|
|
on c.ClassId = o.ClassId
|
|
where c.SuperClassId = @ClassId)
|
|
BEGIN
|
|
select @HasInst = 1
|
|
return 1
|
|
END
|
|
|
|
exec sp_GetChildClassList @ClassId
|
|
IF EXISTS (select ObjectId from ObjectMap as o inner join #Children as c
|
|
on c.ClassId = o.ClassId)
|
|
BEGIN
|
|
select @HasInst = 1
|
|
END
|
|
END
|
|
|
|
return @HasInst
|
|
END
|
|
go
|
|
|
|
/******************************************************************************/
|
|
/* */
|
|
/* sp_ChildHasKey */
|
|
/* */
|
|
/* helper function for sp_CheckKeyMigration */
|
|
/* */
|
|
/******************************************************************************/
|
|
|
|
print 'Creating sp_ChildHasKey...'
|
|
print 'THIS IS A RECURSIVE PROC. Disregard missing object warnings.'
|
|
|
|
IF EXISTS (select * from sysobjects where type = 'P' and name = 'sp_ChildHasKey')
|
|
BEGIN
|
|
drop procedure sp_ChildHasKey
|
|
END
|
|
go
|
|
|
|
CREATE PROCEDURE sp_ChildHasKey
|
|
@ScopeID WMISQL_ID,
|
|
@ID WMISQL_ID,
|
|
@KeyString nvarchar(450),
|
|
@SkipMe bit = 0
|
|
AS
|
|
BEGIN
|
|
|
|
declare @RetVal int
|
|
select @RetVal = 0
|
|
|
|
IF (@SkipMe = 0)
|
|
BEGIN
|
|
IF EXISTS (select ObjectId from ObjectMap where ClassId = @ID
|
|
and ObjectScopeId = @ScopeID and ObjectKey like @KeyString)
|
|
BEGIN
|
|
select @RetVal = 1
|
|
return @RetVal
|
|
END
|
|
END
|
|
|
|
DECLARE Children CURSOR
|
|
LOCAL FORWARD_ONLY STATIC READ_ONLY
|
|
FOR select ClassId from ClassMap where SuperClassId = @ID
|
|
|
|
OPEN Children
|
|
FETCH NEXT FROM Children
|
|
INTO @ID
|
|
|
|
WHILE @@FETCH_STATUS = 0
|
|
BEGIN
|
|
exec @RetVal = sp_ChildHasKey @ScopeID, @ID, @KeyString, 0
|
|
if (@RetVal = 1)
|
|
return @RetVal
|
|
|
|
FETCH NEXT FROM Children
|
|
INTO @ID
|
|
END
|
|
|
|
CLOSE Children
|
|
DEALLOCATE Children
|
|
|
|
return @RetVal
|
|
|
|
END
|
|
go
|
|
|
|
/******************************************************************************/
|
|
/* */
|
|
/* sp_CheckKeyMigration */
|
|
/* */
|
|
/* Description: Returns TRUE if this class contains any instances of itself */
|
|
/* or any child classes */
|
|
/* */
|
|
/* Parameters: */
|
|
/* @ScopeID WMISQL_ID the ScopeID of this instance */
|
|
/* @ClassID WMISQL_ID the original class ID */
|
|
/* @KeyString nvarchar(450) the key string to test */
|
|
/* @RetVal int TRUE if there is an instance of this key */
|
|
/* */
|
|
/******************************************************************************/
|
|
print 'Creating sp_CheckKeyMigration...'
|
|
|
|
IF EXISTS (select * from sysobjects where type = 'P' and name = 'sp_CheckKeyMigration')
|
|
BEGIN
|
|
drop procedure sp_CheckKeyMigration
|
|
END
|
|
go
|
|
|
|
CREATE PROCEDURE sp_CheckKeyMigration
|
|
@ScopeID WMISQL_ID,
|
|
@ClassID WMISQL_ID,
|
|
@KeyString nvarchar(450),
|
|
@RetVal int output
|
|
AS
|
|
BEGIN
|
|
select @RetVal = 0
|
|
|
|
select @KeyString = @KeyString + '%'
|
|
|
|
IF NOT EXISTS (select ClassId from ClassMap where SuperClassId = @ClassID)
|
|
AND (select SuperClassId from ClassMap where ClassId = @ClassID and SuperClassId != 1) is null
|
|
BEGIN
|
|
select @RetVal = 0
|
|
return 0
|
|
END
|
|
|
|
declare @ID WMISQL_ID
|
|
select @ID = SuperClassId from ClassMap where ClassId = @ClassID and SuperClassId != 1
|
|
while (isnull(@ID,0) != 0)
|
|
BEGIN
|
|
IF EXISTS (select ObjectId from ObjectMap where ClassId = @ID
|
|
and ObjectScopeId = @ScopeID and ObjectKey like @KeyString)
|
|
BEGIN
|
|
select @RetVal = 1
|
|
return 0
|
|
END
|
|
select @ID = SuperClassId from ClassMap where ClassId = @ID
|
|
if (@ID = 1)
|
|
select @ID = 0
|
|
END
|
|
|
|
exec @RetVal = sp_ChildHasKey @ScopeID, @ClassID, @KeyString, 1
|
|
|
|
END
|
|
go
|
|
|
|
/******************************************************************************/
|
|
/* */
|
|
/* sp_GetClassInfo */
|
|
/* */
|
|
/******************************************************************************/
|
|
|
|
print 'Creating sp_GetClassInfo...'
|
|
|
|
IF EXISTS (select * from sysobjects where type = 'P' and name = 'sp_GetClassInfo')
|
|
BEGIN
|
|
drop procedure sp_GetClassInfo
|
|
END
|
|
go
|
|
|
|
CREATE PROCEDURE sp_GetClassInfo
|
|
@ClassId WMISQL_ID
|
|
AS
|
|
BEGIN
|
|
select SuperClassId, ClassBlob from ClassMap
|
|
where ClassId = @ClassId
|
|
END
|
|
go
|
|
|
|
/******************************************************************************/
|
|
/* */
|
|
/* sp_GetPropertyID */
|
|
/* */
|
|
/* Description: Returns the WMISQL_ID Property ID for a property or qfr */
|
|
/* */
|
|
/* Parameters: */
|
|
/* @ClassID WMISQL_ID */
|
|
/* @PropName nvarchar(450) the property or qualifier name, if any */
|
|
/* */
|
|
/******************************************************************************/
|
|
print 'Creating sp_GetPropertyID...'
|
|
|
|
IF EXISTS (select * from sysobjects where type = 'P' and name = 'sp_GetPropertyID')
|
|
BEGIN
|
|
drop procedure sp_GetPropertyID
|
|
END
|
|
go
|
|
|
|
CREATE PROCEDURE sp_GetPropertyID
|
|
@ClassID WMISQL_ID,
|
|
@PropName nvarchar(450),
|
|
@RetValue bit = 0
|
|
AS
|
|
BEGIN
|
|
|
|
declare @PropID int
|
|
|
|
select @PropID = PropertyId from PropertyMap where ClassId = @ClassID
|
|
and PropertyName = @PropName
|
|
|
|
IF (isnull(@PropID,-1) = -1)
|
|
BEGIN
|
|
raiserror 99111 'This property/qualifier/method has not been defined.'
|
|
return 0
|
|
END
|
|
|
|
if (@RetValue != 0)
|
|
select @PropID
|
|
|
|
return @PropID
|
|
|
|
END
|
|
go
|
|
|
|
|
|
/******************************************************************************/
|
|
/* */
|
|
/* sp_GetInstanceID */
|
|
/* */
|
|
/* Description: Returns the WMISQL_ID Instance ID for an object */
|
|
/* */
|
|
/* Parameters: */
|
|
/* @ObjectKey nvarchar(450) the key of this instance */
|
|
/* */
|
|
/******************************************************************************/
|
|
print 'Creating sp_GetInstanceID...'
|
|
|
|
IF EXISTS (select * from sysobjects where type = 'P' and name = 'sp_GetInstanceID')
|
|
BEGIN
|
|
drop procedure sp_GetInstanceID
|
|
END
|
|
go
|
|
|
|
|
|
CREATE PROCEDURE sp_GetInstanceID
|
|
@ObjectKey nvarchar(450),
|
|
@ObjectId WMISQL_ID OUTPUT,
|
|
@ClassId WMISQL_ID OUTPUT,
|
|
@ScopeId WMISQL_ID = 0 OUTPUT
|
|
AS
|
|
BEGIN
|
|
|
|
declare @State int
|
|
|
|
select @ObjectId = ObjectId, @State = ObjectState, @ClassId = ClassId, @ScopeId = ObjectScopeId
|
|
from ObjectMap
|
|
where ObjectKey = @ObjectKey
|
|
|
|
IF (@State = 2)
|
|
BEGIN
|
|
raiserror 99105 'This class/instance has been deleted.'
|
|
return 0
|
|
END
|
|
|
|
IF (@ObjectId is null)
|
|
BEGIN
|
|
raiserror 99104 'This class/instance has not been defined.'
|
|
return 0
|
|
END
|
|
|
|
END
|
|
go
|
|
|
|
/******************************************************************************/
|
|
/* */
|
|
/* sp_ObjectExists */
|
|
/* */
|
|
/* Description: Returns TRUE if the object associated with a given ID exists*/
|
|
/* */
|
|
/* Parameters: */
|
|
/* @ObjectID the object ID */
|
|
/* @Exists the output parameter */
|
|
/* @ClassID the class ID */
|
|
/* */
|
|
/******************************************************************************/
|
|
print 'Creating sp_InstanceExists...'
|
|
|
|
IF EXISTS (select * from sysobjects where type = 'P' and name = 'sp_InstanceExists')
|
|
BEGIN
|
|
drop procedure sp_InstanceExists
|
|
END
|
|
go
|
|
|
|
|
|
CREATE PROCEDURE sp_InstanceExists
|
|
@ObjectId WMISQL_ID,
|
|
@Exists bit OUTPUT,
|
|
@ClassId WMISQL_ID OUTPUT,
|
|
@ScopeId WMISQL_ID = 0 OUTPUT
|
|
AS
|
|
BEGIN
|
|
|
|
declare @State int
|
|
select @Exists = 0
|
|
|
|
select @State = ObjectState, @ClassId = ClassId, @ScopeId = ObjectScopeId, @Exists = 1
|
|
from ObjectMap
|
|
where ObjectId = @ObjectId
|
|
|
|
IF (@State = 2)
|
|
BEGIN
|
|
raiserror 99105 'This class/instance has been deleted.'
|
|
return 0
|
|
END
|
|
|
|
return 0
|
|
END
|
|
go
|
|
|
|
/******************************************************************************/
|
|
/* */
|
|
/* sp_GetInstanceByPath */
|
|
/* */
|
|
/* Description: Retrieves the data for an instance, by path */
|
|
/* */
|
|
/* Parameters: */
|
|
/* @ObjectKey nvarchar(450) the key of this instance */
|
|
/* @ObjectState int the initial state of this instance */
|
|
/* */
|
|
/******************************************************************************/
|
|
print 'Creating sp_GetInstanceByPath...'
|
|
|
|
IF EXISTS (select * from sysobjects where type = 'P' and name = 'sp_GetInstanceByPath')
|
|
BEGIN
|
|
drop procedure sp_GetInstanceByPath
|
|
END
|
|
go
|
|
|
|
CREATE PROCEDURE sp_GetInstanceByPath
|
|
@ObjectKey nvarchar(450),
|
|
@ObjectState int = 1
|
|
AS
|
|
BEGIN
|
|
|
|
/* Simple lookup by path*/
|
|
|
|
declare @ObjID WMISQL_ID, @State int
|
|
|
|
select @ObjID = ObjectId, @State = ObjectState from ObjectMap where ObjectKey = @ObjectKey
|
|
IF (isnull(@ObjID,-1) = -1)
|
|
BEGIN
|
|
raiserror 99104 'This class/instance has not been defined.'
|
|
return 0
|
|
END
|
|
|
|
IF ((@State = 2) )
|
|
BEGIN
|
|
raiserror 99105 'This class/instance has been deleted.'
|
|
return 0
|
|
END
|
|
|
|
/* Retrieve all the data for this Object Id */
|
|
|
|
select o.ObjectId, o.ObjectPath, s.ObjectPath ObjectScope, o.ClassId, o.ObjectState, o.ReferenceCount
|
|
from ObjectMap o left outer join ObjectMap as s on o.ObjectScopeId = s.ObjectId
|
|
where o.ObjectId = @ObjID
|
|
|
|
return 0
|
|
|
|
END
|
|
go
|
|
|
|
|
|
/******************************************************************************/
|
|
/* */
|
|
/* sp_GetInstanceData */
|
|
/* */
|
|
/* Description: Retrieves instance data, by known keys */
|
|
/* */
|
|
/* Parameters: */
|
|
/* @ObjectID WMISQL_ID the internal ObjectID */
|
|
/* @PropertyID int the ID of the property to retrieve, if any */
|
|
/* */
|
|
/******************************************************************************/
|
|
print 'Creating sp_GetInstanceData...'
|
|
|
|
IF EXISTS (select * from sysobjects where type = 'P' and name = 'sp_GetInstanceData')
|
|
BEGIN
|
|
drop procedure sp_GetInstanceData
|
|
END
|
|
go
|
|
|
|
CREATE PROCEDURE sp_GetInstanceData
|
|
@ObjectID WMISQL_ID,
|
|
@PropertyID int = 0
|
|
AS
|
|
BEGIN
|
|
|
|
/* Retrieve all the data for this Object Id */
|
|
IF ((select ObjectState from ObjectMap where ObjectId = @ObjectID) != 2)
|
|
BEGIN
|
|
IF (@PropertyID != 0)
|
|
BEGIN
|
|
select c.ObjectId, c.ClassId, c.PropertyId, c.ArrayPos, c.PropertyStringValue,
|
|
c.PropertyNumericValue, c.PropertyRealValue,
|
|
c.Flags, c.RefId, c.RefClassId,
|
|
convert(nvarchar(30), c.PropertyNumericValue) Int64s
|
|
from ClassData as c
|
|
where c.ObjectId = @ObjectID
|
|
and c.PropertyId = @PropertyID
|
|
order by c.ArrayPos desc
|
|
END
|
|
ELSE
|
|
BEGIN
|
|
select c.ObjectId, c.ClassId, c.PropertyId, c.ArrayPos, c.PropertyStringValue,
|
|
c.PropertyNumericValue, c.PropertyRealValue, c.Flags,
|
|
c.RefId, c.RefClassId,
|
|
convert(nvarchar(30), c.PropertyNumericValue) Int64s
|
|
from ClassData as c
|
|
where c.ObjectId = @ObjectID
|
|
order by c.QfrPos, c.PropertyId, c.ArrayPos desc
|
|
END
|
|
END
|
|
ELSE
|
|
BEGIN
|
|
raiserror 99105 'This class/instance has been deleted.'
|
|
return 0
|
|
END
|
|
return
|
|
|
|
END
|
|
go
|
|
|
|
/******************************************************************************/
|
|
/* */
|
|
/* sp_GetInstanceImageData */
|
|
/* */
|
|
/* Description: Retrieves image instance data, by known keys */
|
|
/* */
|
|
/* Parameters: */
|
|
/* @ObjectID WMISQL_ID the internal ObjectID */
|
|
/* @PropertyID int the ID of the property to retrieve, if any */
|
|
/* */
|
|
/******************************************************************************/
|
|
print 'Creating sp_GetInstanceImageData...'
|
|
|
|
IF EXISTS (select * from sysobjects where type = 'P' and name = 'sp_GetInstanceImageData')
|
|
BEGIN
|
|
drop procedure sp_GetInstanceImageData
|
|
END
|
|
go
|
|
|
|
CREATE PROCEDURE sp_GetInstanceImageData
|
|
@ObjectID WMISQL_ID,
|
|
@PropertyID int = 0
|
|
AS
|
|
BEGIN
|
|
|
|
/* Retrieve all the data for this Object Id */
|
|
declare @SecPropID int
|
|
|
|
IF (@PropertyID != 0)
|
|
BEGIN
|
|
select ObjectId, 0, PropertyId, ArrayPos, PropertyImageValue,
|
|
0, 0, 0, 0, 0 from ClassImages where ObjectId = @ObjectID
|
|
and PropertyId = @PropertyID
|
|
order by ArrayPos desc
|
|
END
|
|
ELSE
|
|
BEGIN
|
|
select @SecPropID = PropertyId from PropertyMap where PropertyName = '__SECURITY_DESCRIPTOR'
|
|
if (@SecPropID is null) select @SecPropID = 0
|
|
select ObjectId, 0, PropertyId, ArrayPos, PropertyImageValue,
|
|
0, 0, 0, 0, 0 from ClassImages where ObjectId = @ObjectID
|
|
and PropertyId != @SecPropID
|
|
order by PropertyId, ArrayPos desc
|
|
END
|
|
|
|
return
|
|
|
|
END
|
|
go
|
|
|
|
/******************************************************************************/
|
|
/* */
|
|
/* sp_GetSecurityInfo */
|
|
/* */
|
|
/* Description: Retrieves security info for a class or instance. */
|
|
/* */
|
|
/* Parameters: */
|
|
/* @ObjectID WMISQL_ID the internal ObjectID */
|
|
/* @Flags int class or instance */
|
|
/* */
|
|
/******************************************************************************/
|
|
print 'Creating sp_GetSecurityInfo...'
|
|
|
|
IF EXISTS (select * from sysobjects where type = 'P' and name = 'sp_GetSecurityInfo')
|
|
BEGIN
|
|
drop procedure sp_GetSecurityInfo
|
|
END
|
|
go
|
|
|
|
CREATE PROCEDURE sp_GetSecurityInfo
|
|
@ObjectID WMISQL_ID,
|
|
@Flags int
|
|
AS
|
|
BEGIN
|
|
|
|
/* Retrieve all the data for this Object Id */
|
|
declare @SecPropID int
|
|
declare @ClassID WMISQL_ID, @ObjID WMISQL_ID, @ScopeID WMISQL_ID
|
|
declare @Name nvarchar(450)
|
|
|
|
select @ObjID = @ObjectID
|
|
select @ClassID = ClassId, @ScopeID = ObjectScopeId from ObjectMap where ObjectId = @ObjectID
|
|
select @SecPropID = PropertyId from PropertyMap where PropertyName = '__SECURITY_DESCRIPTOR'
|
|
|
|
IF (@ClassID = 1)
|
|
BEGIN
|
|
select @Name = ClassName from ClassMap where ClassId = @ClassID
|
|
|
|
IF (@Flags = 1)
|
|
BEGIN
|
|
/* Check __ClassSecurity */
|
|
|
|
select @ClassID = ClassId from ClassMap where ClassName = '__ClassSecurity'
|
|
IF (@ClassID is not null)
|
|
BEGIN
|
|
select @ObjID = ObjectId from ObjectMap
|
|
where ClassId = @ClassID and ObjectScopeId = @ScopeID
|
|
and ObjectKey like @Name + '?__ClassSecurity%'
|
|
END
|
|
END
|
|
ELSE
|
|
BEGIN
|
|
/* Check __ClassInstancesSecurity */
|
|
select @ClassID = ClassId from ClassMap where ClassName = '__ClassInstancesSecurity'
|
|
IF (@ClassID is not null)
|
|
BEGIN
|
|
select @ObjID = ObjectId from ObjectMap
|
|
where ClassId = @ClassID and ObjectScopeId = @ScopeID
|
|
and ObjectKey like @Name + '?__ClassInstancesSecurity%'
|
|
END
|
|
END
|
|
END
|
|
|
|
select PropertyImageValue
|
|
from ClassImages where ObjectId = @ObjID
|
|
and PropertyId = @SecPropID
|
|
|
|
END
|
|
go
|
|
|
|
/******************************************************************************/
|
|
/* */
|
|
/* sp_InsertInstanceBlobData */
|
|
/* */
|
|
/* Description: Inserts instance data for a known Object ID */
|
|
/* */
|
|
/* Parameters: */
|
|
/* @ClassID int the internal ClassID */
|
|
/* @ObjectID WMISQL_ID the internal ObjectID */
|
|
/* @PropertyID int the internal Property ID */
|
|
/* @ArrayPos int the ArrayPos, if this is an array */
|
|
/* @Value image the image data. */
|
|
/* */
|
|
/******************************************************************************/
|
|
print 'Creating sp_InsertInstanceBlobData...'
|
|
|
|
IF EXISTS (select * from sysobjects where type = 'P' and name = 'sp_InsertInstanceBlobData')
|
|
BEGIN
|
|
drop procedure sp_InsertInstanceBlobData
|
|
END
|
|
go
|
|
|
|
CREATE PROCEDURE sp_InsertInstanceBlobData
|
|
@ClassID WMISQL_ID,
|
|
@ObjectID WMISQL_ID,
|
|
@PropertyID int,
|
|
@Value image,
|
|
@ArrayPos int = 0
|
|
AS
|
|
BEGIN
|
|
|
|
IF NOT EXISTS (select * from ClassImages where ObjectId = @ObjectID
|
|
and PropertyId = @PropertyID and ArrayPos = @ArrayPos)
|
|
BEGIN
|
|
insert into ClassImages (ObjectId, PropertyId, ArrayPos, PropertyImageValue) values
|
|
(@ObjectID, @PropertyID, @ArrayPos, @Value)
|
|
END
|
|
ELSE
|
|
BEGIN
|
|
update ClassImages set
|
|
PropertyImageValue = @Value
|
|
where ObjectId = @ObjectID and PropertyId = @PropertyID and ArrayPos = @ArrayPos
|
|
END
|
|
|
|
END
|
|
go
|
|
|
|
|
|
/******************************************************************************/
|
|
/* */
|
|
/* pDelete */
|
|
/* */
|
|
/* Description: Deletes an object and all its dependencies. */
|
|
/* */
|
|
/* Parameters: */
|
|
/* @ObjectID WMISQL_ID the internal ObjectID */
|
|
/* */
|
|
/******************************************************************************/
|
|
|
|
print 'Creating pDelete...'
|
|
IF EXISTS (select * from sysobjects where type = 'P' and name = 'pDelete')
|
|
BEGIN
|
|
drop procedure pDelete
|
|
END
|
|
go
|
|
|
|
CREATE PROCEDURE pDelete
|
|
@ObjectId WMISQL_ID
|
|
AS
|
|
BEGIN
|
|
declare @Rowcount int
|
|
create table #Deleted (ObjId numeric(20,0), ClassId numeric(20,0), ScopeId numeric(20,0), RefCount int)
|
|
insert into #Deleted select @ObjectId, ClassId, ObjectScopeId, ReferenceCount from ObjectMap where ObjectId = @ObjectId
|
|
select @Rowcount = 1
|
|
while (@Rowcount > 0)
|
|
BEGIN
|
|
/* Subscoped objects */
|
|
select @Rowcount = 0
|
|
insert into #Deleted (ObjId, ClassId, ScopeId, RefCount)
|
|
select ObjectId, o.ClassId, ObjectScopeId, ReferenceCount from ObjectMap as o
|
|
left outer join #Deleted as d
|
|
on d.ObjId = ObjectId
|
|
inner join #Deleted as dd on dd.ObjId = ObjectScopeId
|
|
where d.ObjId is null
|
|
select @Rowcount = @Rowcount + @@rowcount
|
|
/* Instances of any classes */
|
|
insert into #Deleted (ObjId, ClassId, ScopeId, RefCount)
|
|
select ObjectId, o.ClassId, ObjectScopeId, ReferenceCount from ObjectMap as o
|
|
left outer join #Deleted as d
|
|
on d.ObjId = ObjectId
|
|
inner join #Deleted as dd on dd.ObjId = o.ClassId
|
|
where d.ObjId is null
|
|
select @Rowcount = @Rowcount + @@rowcount
|
|
/* Subclasses */
|
|
insert into #Deleted (ObjId, ClassId, ScopeId, RefCount)
|
|
select c.ClassId, 1, ObjectScopeId, ReferenceCount from ClassMap as c
|
|
inner join ObjectMap as o on o.ObjectId = c.ClassId
|
|
left outer join #Deleted as d
|
|
on d.ObjId = c.ClassId
|
|
inner join #Deleted as dd on SuperClassId = dd.ObjId
|
|
where d.ObjId is null
|
|
select @Rowcount = @Rowcount + @@rowcount
|
|
/* Deleted references */
|
|
insert into #Deleted (ObjId, ClassId, ScopeId, RefCount)
|
|
select distinct RefId, o.ClassId, ObjectScopeId, ReferenceCount-1 from ClassData as c
|
|
inner join ObjectMap as o on o.ObjectId = c.RefId
|
|
left outer join #Deleted as d
|
|
on d.ObjId = RefId
|
|
inner join #Deleted as dd on c.ObjectId = dd.ObjId
|
|
where d.ObjId is null and RefId <> 0 and ObjectState = 2
|
|
select @Rowcount = @Rowcount + @@rowcount
|
|
END
|
|
|
|
/**** PROBLEM: Every object that had been referenced needs to be
|
|
decremented once for each object we are about to delete *****/
|
|
|
|
/*** Get the ref count that each reference will be reduced by ***/
|
|
select o.ObjectId ObjId, count(RefId) RefCount
|
|
into #RefCounts
|
|
from ObjectMap as o inner join ClassData as c
|
|
on o.ObjectId = c.RefId
|
|
inner join #Deleted on ObjId = c.ObjectId
|
|
group by o.ObjectId
|
|
|
|
update ObjectMap set ReferenceCount = ReferenceCount - RefCount
|
|
from ObjectMap as o inner join #RefCounts on o.ObjectId = ObjId
|
|
|
|
update #Deleted set RefCount = ReferenceCount
|
|
from ObjectMap as o inner join #Deleted on ObjId = o.ObjectId
|
|
|
|
delete IndexRefData from IndexRefData inner join #Deleted on ObjId = ObjectId
|
|
delete IndexNumericData from IndexNumericData inner join #Deleted on ObjId = ObjectId
|
|
delete IndexRealData from IndexRealData inner join #Deleted on ObjId = ObjectId
|
|
delete IndexStringData from IndexStringData inner join #Deleted on ObjId = ObjectId
|
|
delete ClassImages from ClassImages inner join #Deleted on ObjId = ObjectId
|
|
delete ClassData from ClassData inner join #Deleted on ObjId = ObjectId
|
|
delete PropertyMap from PropertyMap inner join #Deleted on PropertyMap.ClassId = ObjId
|
|
delete ClassKeys from ClassKeys inner join #Deleted on ClassKeys.ClassId = ObjId
|
|
delete ReferenceProperties from ReferenceProperties inner join #Deleted on ReferenceProperties.ClassId = ObjId
|
|
delete ReferenceProperties from ReferenceProperties inner join #Deleted on ReferenceProperties.RefClassId = ObjId
|
|
delete ClassMap from ClassMap inner join #Deleted on ObjId = ClassMap.ClassId
|
|
delete ContainerObjs from ContainerObjs inner join #Deleted on ObjId = ContainerId
|
|
delete ContainerObjs from ContainerObjs inner join #Deleted on ObjId = ContaineeId
|
|
delete AutoDelete from AutoDelete inner join #Deleted on ObjId = ObjectId
|
|
|
|
/* We can only remove the entire object if it has a zero reference count.*/
|
|
|
|
delete ObjectMap from ObjectMap inner join #Deleted on ObjId = ObjectId where RefCount <= 0
|
|
|
|
/* All others get set to a 'deleted' state */
|
|
update ObjectMap set ObjectState = 2
|
|
from ObjectMap inner join #Deleted on ObjectId = ObjId
|
|
|
|
select ObjId, ClassId, ScopeId from #Deleted
|
|
return 0
|
|
END
|
|
go
|
|
|
|
/******************************************************************************/
|
|
/* */
|
|
/* sp_DeleteClassData */
|
|
/* */
|
|
/* Description: Deletes instance data for a known Class ID */
|
|
/* */
|
|
/* Parameters: */
|
|
/* @PropertyID int the property to delete */
|
|
/* */
|
|
/******************************************************************************/
|
|
print 'Creating sp_DeleteClassData...'
|
|
|
|
IF EXISTS (select * from sysobjects where type = 'P' and name = 'sp_DeleteClassData')
|
|
BEGIN
|
|
drop procedure sp_DeleteClassData
|
|
END
|
|
go
|
|
|
|
|
|
CREATE PROCEDURE sp_DeleteClassData
|
|
@PropertyID int
|
|
AS
|
|
BEGIN
|
|
/* This has to clean up all ClassData, and RefIds.
|
|
Decrement reference counts if we're removing a ref property...*/
|
|
declare @ClassID WMISQL_ID, @Storage int, @Flags int, @RefID WMISQL_ID, @RefCount int
|
|
select @ClassID = ClassId, @Storage = StorageTypeId, @Flags = Flags
|
|
from PropertyMap where PropertyId = @PropertyID
|
|
|
|
IF (@Flags&4 = 4)
|
|
BEGIN
|
|
/* We do support dropping keys if there are no instances*/
|
|
|
|
IF EXISTS (select * from ClassData as d left outer join ClassMap as c
|
|
on c.ClassId = d.ObjectId where
|
|
PropertyId = @PropertyID and c.ClassId is null)
|
|
BEGIN
|
|
raiserror 99116 'Deleting key properties is not supported.'
|
|
return
|
|
END
|
|
END
|
|
|
|
IF (isnull(@ClassID,-1) = -1)
|
|
BEGIN
|
|
raiserror 99111 'This property/qualifier/method has not been defined.'
|
|
return 0
|
|
END
|
|
|
|
begin transaction
|
|
|
|
delete from ClassImages where PropertyId = @PropertyID
|
|
|
|
/* Delete qualifiers on this property. Qualifiers can't be
|
|
indexed or references, so this should be OK.*/
|
|
|
|
delete ClassData from ClassData inner join PropertyMap
|
|
on PropertyMap.PropertyId = ClassData.PropertyId
|
|
where RefId = @PropertyID and PropertyMap.Flags&2 = 2
|
|
|
|
delete from ClassKeys where PropertyId = @PropertyID
|
|
delete from ReferenceProperties where PropertyId = @PropertyID
|
|
|
|
/* If a reference, decrement reference count */
|
|
|
|
IF (@Storage = 4)
|
|
BEGIN
|
|
|
|
DECLARE RefCount CURSOR
|
|
LOCAL FORWARD_ONLY STATIC READ_ONLY
|
|
FOR select RefId, count(*) RefCount from ClassData where PropertyId = @PropertyID
|
|
group by RefId having count(*) > 0
|
|
|
|
OPEN RefCount
|
|
|
|
FETCH NEXT FROM RefCount
|
|
INTO @RefID, @RefCount
|
|
|
|
WHILE @@FETCH_STATUS = 0
|
|
BEGIN
|
|
update ObjectMap set
|
|
ReferenceCount = ReferenceCount - @RefCount
|
|
where ObjectId = @RefID
|
|
|
|
IF (@@error != 0)
|
|
BEGIN
|
|
rollback transaction
|
|
return 0
|
|
END
|
|
|
|
/* Delete deleted objects where reference count is zero */
|
|
|
|
IF ((select ReferenceCount from ObjectMap
|
|
where ObjectId = @RefID and ObjectState = 2) = 0)
|
|
BEGIN
|
|
exec pDelete @RefID /* References are always instances, right?? */
|
|
END
|
|
|
|
FETCH NEXT FROM RefCount
|
|
INTO @RefID, @RefCount
|
|
|
|
END
|
|
|
|
CLOSE RefCount
|
|
DEALLOCATE RefCount
|
|
|
|
END
|
|
|
|
delete from ClassData where PropertyId = @PropertyID
|
|
delete from ClassImages where PropertyId = @PropertyID
|
|
IF (@Storage = 1)
|
|
BEGIN
|
|
delete from IndexStringData where PropertyId = @PropertyID
|
|
END
|
|
IF (@Storage = 2)
|
|
BEGIN
|
|
delete from IndexNumericData where PropertyId = @PropertyID
|
|
END
|
|
IF (@Storage = 3)
|
|
BEGIN
|
|
delete from IndexRealData where PropertyId = @PropertyID
|
|
END
|
|
IF (@Storage = 4)
|
|
BEGIN
|
|
delete from IndexRefData where PropertyId = @PropertyID
|
|
END
|
|
|
|
delete from PropertyMap where PropertyId = @PropertyID
|
|
|
|
IF (@@error = 0)
|
|
commit transaction
|
|
ELSE
|
|
rollback transaction
|
|
|
|
return
|
|
|
|
END
|
|
go
|
|
|
|
|
|
/******************************************************************************/
|
|
/* */
|
|
/* sp_DeleteInstanceData */
|
|
/* */
|
|
/* Parameters: */
|
|
/* @ObjectID WMISQL_ID the internal ObjectID */
|
|
/* @PropertyID int the property to delete */
|
|
/* @ArrayPos int the ArrayPos to remove */
|
|
/* */
|
|
/******************************************************************************/
|
|
print 'Creating sp_DeleteInstanceData...'
|
|
|
|
IF EXISTS (select * from sysobjects where type = 'P' and name = 'sp_DeleteInstanceData')
|
|
BEGIN
|
|
drop procedure sp_DeleteInstanceData
|
|
END
|
|
go
|
|
|
|
CREATE PROCEDURE sp_DeleteInstanceData
|
|
@ObjectID WMISQL_ID,
|
|
@PropertyID int,
|
|
@ArrayPos int = -1
|
|
|
|
AS
|
|
BEGIN
|
|
/* decrement reference counts */
|
|
|
|
declare @ClassID WMISQL_ID, @Storage int, @Flags int, @RefID WMISQL_ID
|
|
select @ClassID = ClassId, @Storage = StorageTypeId, @Flags = Flags
|
|
from PropertyMap where PropertyId = @PropertyID
|
|
|
|
IF (@Flags&4 = 4)
|
|
BEGIN
|
|
raiserror 99116 'Deleting key properties is not supported.'
|
|
return
|
|
END
|
|
|
|
IF (@Flags&16=16)
|
|
BEGIN
|
|
raiserror 99133 'Cannot delete not_null property.'
|
|
return
|
|
END
|
|
|
|
IF (isnull(@ClassID,-1) = -1)
|
|
BEGIN
|
|
raiserror 99111 'This property/qualifier/method has not been defined.'
|
|
return 0
|
|
END
|
|
|
|
begin transaction
|
|
|
|
IF (@Storage = 4)
|
|
BEGIN
|
|
/* We don't support arrays of references, do we?? */
|
|
select @RefID = RefId from ClassData where ObjectId = @ObjectID and PropertyId = @PropertyID
|
|
IF (isnull(@RefID,-1) != -1)
|
|
BEGIN
|
|
update ObjectMap set ReferenceCount = ReferenceCount - 1
|
|
where ObjectId = @RefID
|
|
|
|
/* Delete deleted objects where reference count is zero */
|
|
|
|
IF ((select ReferenceCount from ObjectMap
|
|
where ObjectId = @RefID and ObjectState = 2) = 0)
|
|
BEGIN
|
|
exec pDelete @RefID, 0, 0 /* References are always instances, right?? */
|
|
END
|
|
|
|
END
|
|
END
|
|
|
|
IF (@ArrayPos >= 0)
|
|
BEGIN
|
|
delete from ClassImages where ObjectId = @ObjectID and PropertyId = @PropertyID
|
|
and ArrayPos = @ArrayPos
|
|
delete from ClassData where ObjectId = @ObjectID and PropertyId = @PropertyID
|
|
and ArrayPos = @ArrayPos
|
|
END
|
|
ELSE
|
|
BEGIN
|
|
delete from ClassImages where ObjectId = @ObjectID and PropertyId = @PropertyID
|
|
delete from ClassData where ObjectId = @ObjectID and PropertyId = @PropertyID
|
|
END
|
|
|
|
IF (@Storage = 1)
|
|
BEGIN
|
|
IF (@ArrayPos >= 0)
|
|
delete from IndexStringData where PropertyId = @PropertyID and ObjectId = @ObjectID
|
|
and ArrayPos = @ArrayPos
|
|
ELSE
|
|
delete from IndexStringData where PropertyId = @PropertyID and ObjectId = @ObjectID
|
|
END
|
|
IF (@Storage = 2)
|
|
BEGIN
|
|
IF (@ArrayPos >= 0)
|
|
delete from IndexNumericData where PropertyId = @PropertyID and ObjectId = @ObjectID
|
|
and ArrayPos = @ArrayPos
|
|
ELSE
|
|
delete from IndexNumericData where PropertyId = @PropertyID and ObjectId = @ObjectID
|
|
END
|
|
IF (@Storage = 3)
|
|
BEGIN
|
|
IF (@ArrayPos >= 0)
|
|
delete from IndexRealData where PropertyId = @PropertyID and ObjectId = @ObjectID
|
|
and ArrayPos = @ArrayPos
|
|
ELSE
|
|
delete from IndexRealData where PropertyId = @PropertyID and ObjectId = @ObjectID
|
|
END
|
|
IF (@Storage = 4)
|
|
BEGIN
|
|
IF (@ArrayPos >= 0)
|
|
delete from IndexRefData where PropertyId = @PropertyID and ObjectId = @ObjectID
|
|
and ArrayPos = @ArrayPos
|
|
ELSE
|
|
delete from IndexRefData where PropertyId = @PropertyID and ObjectId = @ObjectID
|
|
END
|
|
|
|
IF (@@error != 0)
|
|
rollback transaction
|
|
ELSE
|
|
commit transaction
|
|
|
|
return
|
|
|
|
END
|
|
go
|
|
|
|
/******************************************************************************/
|
|
/* */
|
|
/* InsertPropertyValue */
|
|
/* */
|
|
/* This INTERNAL procedure inserts a single row of instance data. */
|
|
/* */
|
|
/* @ObjectId WMISQL_ID ObjectId */
|
|
/* @PropertyId int ID of property to insert */
|
|
/* @ArrayPos int ArrayPos to insert */
|
|
/* @Value nvarchar Value to insert */
|
|
/* @RefPropID int Property ID, if property qualifier */
|
|
/* @Flavor smallint the flavor, if qualifier */
|
|
/* */
|
|
/******************************************************************************/
|
|
print 'Creating InsertPropertyValue...'
|
|
|
|
IF EXISTS (select * from sysobjects where name = 'InsertPropertyValue')
|
|
BEGIN
|
|
drop procedure InsertPropertyValue
|
|
END
|
|
go
|
|
|
|
CREATE PROCEDURE InsertPropertyValue
|
|
@ObjectId WMISQL_ID,
|
|
@PropertyId int,
|
|
@ArrayPos int,
|
|
@Value nvarchar(4000),
|
|
@RefPropID WMISQL_ID = 0,
|
|
@Flavor smallint = 0,
|
|
@RefValue WMISQL_ID = 0 output
|
|
AS
|
|
BEGIN
|
|
|
|
declare @CIMTypeID int, @StorageTypeID int, @ClassID WMISQL_ID
|
|
declare @Flags int, @RefID WMISQL_ID, @RefClassID WMISQL_ID
|
|
declare @Temp1 WMISQL_ID, @Temp2 float(53)
|
|
declare @OldRefID WMISQL_ID
|
|
declare @QfrPos int
|
|
declare @KeyValue nvarchar(450), @TextValue nvarchar(450)
|
|
|
|
select @QfrPos = 0 /* Only use if this is a qualifier! */
|
|
|
|
select @RefClassID = 0, @RefID = 0
|
|
|
|
select @Flags = Flags, @CIMTypeID = CIMTypeId,
|
|
@StorageTypeID = StorageTypeId, @ClassID = ClassId
|
|
from PropertyMap where PropertyId = @PropertyId
|
|
|
|
/* If they are setting the value to null,
|
|
just remove the row. */
|
|
|
|
IF (@Value is null or @Value = '')
|
|
BEGIN
|
|
IF (@StorageTypeID = 5)
|
|
delete from ClassImages where ObjectId = @ObjectId
|
|
and PropertyId = @PropertyId and ArrayPos = @ArrayPos
|
|
ELSE IF (@StorageTypeID = 1)
|
|
delete from IndexStringData where ObjectId = @ObjectId
|
|
and PropertyId = @PropertyId and ArrayPos = @ArrayPos
|
|
ELSE IF (@StorageTypeID = 2)
|
|
delete from IndexNumericData where ObjectId = @ObjectId
|
|
and PropertyId = @PropertyId and ArrayPos = @ArrayPos
|
|
ELSE IF (@StorageTypeID = 3)
|
|
delete from IndexRealData where ObjectId = @ObjectId
|
|
and PropertyId = @PropertyId and ArrayPos = @ArrayPos
|
|
ELSE IF (@StorageTypeID = 4)
|
|
BEGIN
|
|
delete from IndexRefData where ObjectId = @ObjectId
|
|
and PropertyId = @PropertyId and ArrayPos = @ArrayPos
|
|
END
|
|
|
|
delete from ClassData where ObjectId = @ObjectId
|
|
and PropertyId = @PropertyId and ArrayPos = @ArrayPos
|
|
|
|
return 0
|
|
END
|
|
|
|
/* If this is a reference to an object that doesn't exist,
|
|
create a new record for it. */
|
|
|
|
IF (@StorageTypeID = 4)
|
|
BEGIN
|
|
select @QfrPos = charindex('?', @Value)
|
|
if (@QfrPos > 1)
|
|
BEGIN
|
|
select @TextValue = substring(@Value, 1, @QfrPos-1)
|
|
select @KeyValue = substring(@Value, @QfrPos+1, 450)
|
|
END
|
|
ELSE
|
|
BEGIN
|
|
select @KeyValue = @Value
|
|
select @TextValue = @Value
|
|
END
|
|
select @RefID = ObjectId, @RefClassID = ClassId
|
|
from ObjectMap where ObjectId = convert(numeric(20,0),@KeyValue)
|
|
|
|
IF (isnull(@RefID,0) = 0)
|
|
BEGIN
|
|
select @RefID = convert(numeric(20,0), @KeyValue)
|
|
insert into ObjectMap (ObjectId, ObjectPath, ObjectKey, ObjectState, ReferenceCount, ClassId,
|
|
ObjectFlags) select @RefID, @TextValue, 'TEMP:' + @TextValue, 2, 0, 0, 0
|
|
select @RefClassID = 1
|
|
END
|
|
select @QfrPos = 0
|
|
select @RefValue = @RefID
|
|
END
|
|
ELSE /* This may be a qualifier */
|
|
BEGIN
|
|
select @RefID = @RefPropID, @RefClassID = 0
|
|
select @QfrPos = isnull(@RefPropID,0)
|
|
END
|
|
|
|
IF EXISTS (select * from ClassData
|
|
where ObjectId = @ObjectId and PropertyId = @PropertyId
|
|
and ArrayPos = @ArrayPos and QfrPos = @QfrPos)
|
|
BEGIN
|
|
IF (@StorageTypeID = 1)
|
|
BEGIN
|
|
update ClassData set
|
|
PropertyStringValue = @Value
|
|
where ObjectId = @ObjectId
|
|
and PropertyId = @PropertyId
|
|
and ArrayPos = @ArrayPos
|
|
and QfrPos = @QfrPos
|
|
and PropertyStringValue != @Value
|
|
|
|
IF (@Flags & 12 != 0)
|
|
BEGIN
|
|
update IndexStringData set
|
|
PropertyStringValue = @Value
|
|
where ObjectId = @ObjectId
|
|
and PropertyId = @PropertyId
|
|
and ArrayPos = @ArrayPos
|
|
and PropertyStringValue != @Value
|
|
END
|
|
END
|
|
ELSE IF (@StorageTypeID = 2)
|
|
BEGIN
|
|
select @Temp1 = convert(numeric(20,0), @Value)
|
|
|
|
update ClassData set
|
|
PropertyNumericValue = @Temp1
|
|
where ObjectId = @ObjectId
|
|
and PropertyId = @PropertyId
|
|
and ArrayPos = @ArrayPos
|
|
and QfrPos = @QfrPos
|
|
and PropertyNumericValue != @Temp1
|
|
|
|
IF (@Flags & 12 != 0)
|
|
BEGIN
|
|
update IndexNumericData set
|
|
PropertyNumericValue = @Temp1
|
|
where ObjectId = @ObjectId
|
|
and PropertyId = @PropertyId
|
|
and ArrayPos = @ArrayPos
|
|
and PropertyNumericValue != @Temp1
|
|
END
|
|
END
|
|
ELSE IF (@StorageTypeID = 3)
|
|
BEGIN
|
|
select @Temp2 = convert(float(53), @Value)
|
|
|
|
update ClassData set
|
|
PropertyRealValue = @Temp2
|
|
where ObjectId = @ObjectId
|
|
and PropertyId = @PropertyId
|
|
and ArrayPos = @ArrayPos
|
|
and QfrPos = @QfrPos
|
|
and PropertyRealValue != @Temp2
|
|
|
|
IF (@Flags & 12 != 0)
|
|
BEGIN
|
|
update IndexRealData set
|
|
PropertyRealValue = @Temp2
|
|
where ObjectId = @ObjectId
|
|
and PropertyId = @PropertyId
|
|
and ArrayPos = @ArrayPos
|
|
and PropertyRealValue != @Temp2
|
|
END
|
|
END
|
|
ELSE IF (@StorageTypeID = 4)
|
|
BEGIN
|
|
select @OldRefID = RefId from ClassData
|
|
where ObjectId = @ObjectId
|
|
and PropertyId = @PropertyId
|
|
and ArrayPos = @ArrayPos
|
|
|
|
IF (@OldRefID != @RefID)
|
|
BEGIN
|
|
update ObjectMap set
|
|
ReferenceCount = ReferenceCount - 1
|
|
where ObjectId = @OldRefID
|
|
|
|
update ObjectMap set
|
|
ReferenceCount = ReferenceCount + 1
|
|
where Objectid = @RefID
|
|
|
|
IF (@CIMTypeID = 13)
|
|
BEGIN
|
|
/* Delete the old embedded object */
|
|
exec pDelete @OldRefID
|
|
END
|
|
|
|
update ClassData set
|
|
PropertyStringValue = @TextValue,
|
|
RefId = @RefID,
|
|
RefClassId = @RefClassID
|
|
where ObjectId = @ObjectId
|
|
and PropertyId = @PropertyId
|
|
and ArrayPos = @ArrayPos
|
|
and QfrPos = @QfrPos
|
|
|
|
IF (@Flags & 12 != 0)
|
|
BEGIN
|
|
update IndexRefData set
|
|
RefId = @RefID
|
|
where ObjectId = @ObjectId
|
|
and PropertyId = @PropertyId
|
|
and ArrayPos = @ArrayPos
|
|
END
|
|
|
|
END
|
|
END
|
|
END
|
|
ELSE
|
|
BEGIN
|
|
IF (@StorageTypeID = 1)
|
|
BEGIN
|
|
delete from ClassImages where ObjectId = @ObjectId
|
|
and PropertyId = @PropertyId and ArrayPos = @ArrayPos
|
|
insert into ClassData (ObjectId, PropertyId, ArrayPos, QfrPos,
|
|
PropertyStringValue, Flags, RefClassId, RefId, ClassId)
|
|
values (@ObjectId, @PropertyId, @ArrayPos, @QfrPos, @Value,
|
|
@Flavor, @RefClassID, @RefID, @ClassID)
|
|
IF (@Flags & 12 != 0)
|
|
BEGIN
|
|
insert into IndexStringData (ObjectId, PropertyId, PropertyStringValue, ArrayPos)
|
|
select @ObjectId, @PropertyId, @Value, @ArrayPos
|
|
END
|
|
END
|
|
ELSE IF (@StorageTypeID = 2)
|
|
BEGIN
|
|
insert into ClassData (ObjectId, PropertyId, ArrayPos, QfrPos,
|
|
PropertyNumericValue, Flags, RefClassId, RefId, ClassId)
|
|
select @ObjectId, @PropertyId, @ArrayPos, @QfrPos, convert(numeric(20,0),@Value),
|
|
@Flavor, @RefClassID, @RefID, @ClassID
|
|
IF (@Flags & 12 != 0)
|
|
BEGIN
|
|
insert into IndexNumericData (ObjectId, PropertyId, PropertyNumericValue, ArrayPos)
|
|
select @ObjectId, @PropertyId, convert(numeric(20,0),@Value), @ArrayPos
|
|
END
|
|
END
|
|
ELSE IF (@StorageTypeID = 3)
|
|
BEGIN
|
|
insert into ClassData (ObjectId, PropertyId, ArrayPos, QfrPos,
|
|
PropertyRealValue, Flags, RefClassId, RefId, ClassId)
|
|
select @ObjectId, @PropertyId, @ArrayPos, @QfrPos, convert(float(53),@Value),
|
|
@Flavor, @RefClassID, @RefID, @ClassID
|
|
IF (@Flags & 12 != 0)
|
|
BEGIN
|
|
insert into IndexRealData (ObjectId, PropertyId, PropertyRealValue, ArrayPos)
|
|
select @ObjectId, @PropertyId, convert(float(53),@Value), @ArrayPos
|
|
END
|
|
END
|
|
ELSE IF (@StorageTypeID = 4)
|
|
BEGIN
|
|
delete from ClassImages where ObjectId = @ObjectId
|
|
and PropertyId = @PropertyId and ArrayPos = @ArrayPos
|
|
|
|
insert into ClassData (ObjectId, PropertyId, ArrayPos,QfrPos,
|
|
RefId, Flags, RefClassId, ClassId, PropertyStringValue)
|
|
values (@ObjectId, @PropertyId, @ArrayPos, @QfrPos, @RefID,
|
|
@Flavor, @RefClassID, @ClassID, @TextValue)
|
|
|
|
update ObjectMap set ReferenceCount = ReferenceCount + 1
|
|
where ObjectId = @RefID
|
|
IF (@Flags & 12 != 0)
|
|
BEGIN
|
|
insert into IndexRefData (ObjectId, PropertyId, RefId, ArrayPos)
|
|
select @ObjectId, @PropertyId, @RefID, @ArrayPos
|
|
END
|
|
END
|
|
END
|
|
END
|
|
go
|
|
|
|
/******************************************************************************/
|
|
/* */
|
|
/* InsertPropertyDef */
|
|
/* */
|
|
/* Description: This INTERNAL procedure inserts a single property into the */
|
|
/* PropertyMap, along with any new default data. */
|
|
/* */
|
|
/* Parameters: */
|
|
/* @ClassId WMISQL_ID The ID of the class to chg. */
|
|
/* @PropertyName nvarchar(450) The name of the new property */
|
|
/* @CIMType int The original CIM Type ID */
|
|
/* @Flags int Flags (Index Key, Qfr, etc.) */
|
|
/* @Value nvarchar(4000) The default or qfr value */
|
|
/* @SkipValid bit TRUE to skip validation steps */
|
|
/* @RefClassId WMISQL_ID Class Id of strong-typed obj*/
|
|
/* @RefPropId int PropertyId of qfr or param */
|
|
/* @Flavor int Flavor if this is a qfr */
|
|
/* */
|
|
/******************************************************************************/
|
|
|
|
print 'Creating InsertPropertyDef...'
|
|
IF EXISTS (select * from sysobjects where type = 'P' and name = 'InsertPropertyDef')
|
|
BEGIN
|
|
drop procedure InsertPropertyDef
|
|
END
|
|
go
|
|
|
|
CREATE PROCEDURE InsertPropertyDef
|
|
@ClassId WMISQL_ID,
|
|
@PropertyName nvarchar(450),
|
|
@CIMType int,
|
|
@Flags int,
|
|
@Value nvarchar(4000) = '',
|
|
@SkipValid bit = 0,
|
|
@RefClassId WMISQL_ID = 0,
|
|
@RefPropId int = 0,
|
|
@Flavor int = 0
|
|
AS
|
|
BEGIN
|
|
|
|
declare @ExistingFlags int, @ExistingType int, @ExistingStorage int
|
|
declare @PropID int, @TypeId int
|
|
select @PropID = 0
|
|
|
|
/* Qualifiers always belong to the root class */
|
|
declare @ClsId WMISQL_ID
|
|
select @ClsId = @ClassId
|
|
IF ((@Flags & 2) = 2)
|
|
select @ClsId = 1
|
|
|
|
select @TypeId = StorageTypeId from CIMTypes where CIMTypeId = @CIMType
|
|
if (@TypeId is null)
|
|
BEGIN
|
|
raiserror 99108 'Invalid CIM Datatype'
|
|
return 0
|
|
END
|
|
|
|
/* Can't add key to unkeyed class */
|
|
IF (@Flags & 4 = 4)
|
|
BEGIN
|
|
IF ((select ObjectFlags & 1024 from ObjectMap where ObjectId = @ClassId) = 1024)
|
|
BEGIN
|
|
raiserror 99122 'Cannot add a key property to an unkeyed class.'
|
|
return 0
|
|
END
|
|
END
|
|
|
|
/* Only uint8 arrays are to be stored as blobs. Oversized text will be a string array. */
|
|
IF (@CIMType = 17 AND @Flags & 1 = 1)
|
|
BEGIN
|
|
select @TypeId = 5
|
|
END
|
|
|
|
select @PropID = PropertyId, @ExistingFlags = Flags,
|
|
@ExistingType = CIMTypeId, @ExistingStorage = StorageTypeId
|
|
from PropertyMap where ClassID = @ClsId and
|
|
PropertyName = @PropertyName
|
|
|
|
IF (@SkipValid = 0)
|
|
BEGIN
|
|
declare @HasInstances bit
|
|
declare @TempID int
|
|
|
|
/* If qualifier, make sure its not a predefined one */
|
|
IF (@Flags & 2 = 2)
|
|
BEGIN
|
|
select @TempID = CIMFlagId from CIMFlags
|
|
where CIMFlag = @PropertyName
|
|
IF (@TempID is not null)
|
|
BEGIN
|
|
update ObjectMap set ObjectFlags = isnull(ObjectFlags,0) | @TempID
|
|
where ObjectId = @ClassID
|
|
return @TempID
|
|
END
|
|
END
|
|
|
|
/* Keyholes only on supported datatype */
|
|
IF (@Flags & 256 = 256)
|
|
BEGIN
|
|
IF (@TypeId not in (1,2) OR
|
|
@CIMType in (4,5,11,101,103)) /* Exclude real, datetime, boolean */
|
|
BEGIN
|
|
raiserror 99130 'Keyholes can only be created on numbers and strings.'
|
|
return 0
|
|
END
|
|
END
|
|
|
|
/* Can't add or drop key if instances */
|
|
IF EXISTS (select * from ClassData where ClassId = @ClsId and ObjectId != @ClassID)
|
|
select @HasInstances = 1
|
|
|
|
/* Can't add or drop key property if class has instances in hierarchy*/
|
|
IF ((isnull(@ExistingFlags,0) & 4 <> (isnull(@Flags,0) & 4)) and @HasInstances = 1)
|
|
BEGIN
|
|
raiserror 99128 'Class has instances.'
|
|
return 0
|
|
END
|
|
|
|
/* Can't add not-null property without default if instances */
|
|
IF ((@Flags & 16) = 16 and @HasInstances = 1 and datalength(isnull(@Value,'')) = 0)
|
|
BEGIN
|
|
raiserror 99131 'Cannot add not_null property with no default to a class with instances.'
|
|
return 0;
|
|
END
|
|
|
|
/* Conversion required? validate it */
|
|
IF (isnull(@PropID,0) != 0)
|
|
BEGIN
|
|
IF (@CIMType != @ExistingType)
|
|
BEGIN
|
|
declare @Succeed bit
|
|
exec @Succeed = sp_ConversionAllowed @ExistingType, @CIMType
|
|
IF (@Succeed = 0 OR (@ExistingStorage > @TypeId )) /* Filter out real conversions.*/
|
|
BEGIN
|
|
raiserror 99127 'Conversion not allowed.'
|
|
return 0
|
|
END
|
|
ELSE
|
|
BEGIN
|
|
/* We need to move the data from one column to the other, and possibly one index table to another. */
|
|
IF (@TypeId = 3 and @ExistingStorage = 2)
|
|
BEGIN
|
|
update ClassData set
|
|
PropertyRealValue = convert(float(53),PropertyNumericValue),
|
|
PropertyNumericValue = 0
|
|
where PropertyId = @PropID
|
|
|
|
IF EXISTS (select * from IndexNumericData where PropertyId = @PropID)
|
|
delete from IndexNumericData where PropertyId = @PropID
|
|
|
|
/* If they want an index, force it to be recreated.*/
|
|
select @ExistingFlags = ~12 & @ExistingFlags
|
|
END
|
|
END
|
|
END
|
|
END
|
|
ELSE
|
|
/* Make sure this property does not already exist in hierarchy */
|
|
BEGIN
|
|
select @PropID = p.PropertyId from PropertyMap as p inner join #Parents as p1 on
|
|
p1.ClassId = p.ClassId where PropertyName = @PropertyName and p.ClassId not in (@ClassID,1)
|
|
|
|
IF EXISTS (select * from PropertyMap as p inner join #Children as p1 on
|
|
p1.ClassId = p.ClassId where PropertyName = @PropertyName and p.ClassId != @ClassID)
|
|
BEGIN
|
|
raiserror 99132 'This property/qualifier/method already exists on a derived class.'
|
|
return 0
|
|
END
|
|
END
|
|
END
|
|
|
|
/* Update the data... */
|
|
IF (isnull(@PropID,0) = 0)
|
|
BEGIN
|
|
insert into PropertyMap (ClassId, PropertyName, StorageTypeId, CIMTypeId, Flags)
|
|
values (@ClsId, @PropertyName, @TypeId, @CIMType, @Flags)
|
|
select @PropID = @@identity
|
|
END
|
|
ELSE
|
|
BEGIN
|
|
update PropertyMap set StorageTypeId = @TypeId, CIMTypeId = @CIMType,
|
|
Flags = @Flags
|
|
where PropertyId = @PropID
|
|
|
|
/* Add/remove index data if needed */
|
|
IF ((@Flags & 12) = 0 AND (@ExistingFlags & 12) != 0)
|
|
BEGIN
|
|
/* We are dropping an index. Delete the index data.*/
|
|
IF (@ExistingStorage = 1)
|
|
delete from IndexStringData where PropertyId = @PropID
|
|
ELSE IF (@ExistingStorage = 2)
|
|
delete from IndexNumericData where PropertyId = @PropID
|
|
ELSE IF (@ExistingStorage= 3)
|
|
delete from IndexRealData where PropertyId = @PropID
|
|
ELSE IF (@ExistingStorage = 4)
|
|
delete from IndexRefData where PropertyId = @PropID
|
|
END
|
|
ELSE IF ((@Flags & 12) != 0 AND (@ExistingFlags & 12) = 0)
|
|
BEGIN
|
|
/* Adding an index */
|
|
IF (@ExistingStorage = 1)
|
|
insert into IndexStringData (ObjectId, PropertyId, ArrayPos, PropertyStringValue)
|
|
select ObjectId, PropertyId, ArrayPos, PropertyStringValue from ClassData
|
|
where PropertyId = @PropID
|
|
ELSE IF (@ExistingStorage = 2)
|
|
insert into IndexNumericData (ObjectId, PropertyId, ArrayPos, PropertyNumericValue)
|
|
select ObjectId, PropertyId, ArrayPos, PropertyNumericValue from ClassData
|
|
where PropertyId = @PropID
|
|
ELSE IF (@ExistingStorage = 3)
|
|
insert into IndexRealData (ObjectId, PropertyId, ArrayPos, PropertyRealValue)
|
|
select ObjectId, PropertyId, ArrayPos, PropertyRealValue from ClassData
|
|
where PropertyId = @PropID
|
|
ELSE IF (@ExistingStorage = 4)
|
|
insert into IndexRefData (ObjectId, PropertyId, ArrayPos, RefId)
|
|
select ObjectId, PropertyId, ArrayPos, RefId from ClassData
|
|
where PropertyId = @PropID
|
|
END
|
|
END
|
|
|
|
/* If this isn't a method-related item or a qualifier... */
|
|
IF ((@Flags & 226) = 0)
|
|
BEGIN
|
|
/* We're adding a default value. */
|
|
IF (isnull(@Value,'') != '')
|
|
BEGIN
|
|
IF (@TypeId = 1)
|
|
BEGIN
|
|
insert into ClassData (ObjectId, PropertyId, ArrayPos, QfrPos, ClassId, PropertyStringValue, Flags, RefId) select
|
|
ObjectId, @PropID, 0, @RefPropId, @ClsId, @Value, @Flavor, @RefPropId
|
|
from ObjectMap as o
|
|
where exists (select * from ClassData as c where o.ObjectId = c.ObjectId and c.ClassId = @ClsId)
|
|
and not exists (select * from ClassData as d where o.ObjectId = d.ObjectId and PropertyId = @PropID)
|
|
|
|
insert into IndexStringData (ObjectId, PropertyId, ArrayPos, PropertyStringValue) select
|
|
ObjectId, @PropID, 0, @Value from ObjectMap as o
|
|
where exists (select * from ClassData as c where o.ObjectId = c.ObjectId and PropertyId = @PropID)
|
|
and not exists (select * from IndexStringData as d where o.ObjectId = d.ObjectId and PropertyId = @PropID)
|
|
END
|
|
ELSE IF (@TypeId = 2)
|
|
BEGIN
|
|
insert into ClassData (ObjectId, PropertyId, ArrayPos, QfrPos, ClassId, PropertyNumericValue, Flags, RefId) select
|
|
ObjectId, @PropID, 0, @RefPropId, @ClsId, convert(numeric(20,0),@Value), @Flavor, @RefPropId
|
|
from ObjectMap as o
|
|
where exists (select * from ClassData as c where o.ObjectId = c.ObjectId and c.ClassId = @ClsId)
|
|
and not exists (select * from ClassData as d where o.ObjectId = d.ObjectId and PropertyId = @PropID)
|
|
|
|
insert into IndexNumericData (ObjectId, PropertyId, ArrayPos, PropertyNumericValue) select
|
|
ObjectId, @PropID, 0, convert(numeric(20,0),@Value) from ObjectMap as o
|
|
where exists (select * from ClassData as c where o.ObjectId = c.ObjectId and PropertyId = @PropID)
|
|
and not exists (select * from IndexNumericData as d where o.ObjectId = d.ObjectId and PropertyId = @PropID)
|
|
END
|
|
ELSE IF (@TypeId = 3)
|
|
BEGIN
|
|
insert into ClassData (ObjectId, PropertyId, ArrayPos, QfrPos, ClassId, PropertyRealValue, Flags, RefId) select
|
|
ObjectId, @PropID, 0, @RefPropId, @ClsId, convert(float(53),@Value), @Flavor, @RefPropId
|
|
from ObjectMap as o
|
|
where exists (select * from ClassData as c where o.ObjectId = c.ObjectId and c.ClassId = @ClsId)
|
|
and not exists (select * from ClassData as d where o.ObjectId = d.ObjectId and PropertyId = @PropID)
|
|
|
|
insert into IndexRealData (ObjectId, PropertyId, ArrayPos, PropertyRealValue) select
|
|
ObjectId, @PropID, 0, convert(float(53),@Value) from ObjectMap as o
|
|
where exists (select * from ClassData as c where o.ObjectId = c.ObjectId and PropertyId = @PropID)
|
|
and not exists (select * from IndexRealData as d where o.ObjectId = d.ObjectId and PropertyId = @PropID)
|
|
END
|
|
ELSE IF (@TypeId = 4)
|
|
BEGIN
|
|
declare @RefID WMISQL_ID
|
|
select @RefID = ObjectId from ObjectMap where ObjectKey = @Value
|
|
IF (@RefID is not null)
|
|
BEGIN
|
|
update ObjectMap set ReferenceCount = ReferenceCount + 1 where ObjectId = convert(numeric(20,0),@Value)
|
|
insert into ClassData (ObjectId, PropertyId, ArrayPos, QfrPos, ClassId, RefClassId, Flags, RefId) values
|
|
(@ClassId, @PropID, 0, @RefPropId, @ClsId, @RefClassID, @Flavor, @RefID)
|
|
|
|
IF ((@Flags & 226) = 0)
|
|
BEGIN
|
|
insert into ClassData (ObjectId, PropertyId, ArrayPos, QfrPos, ClassId, RefClassId, Flags, RefId) select
|
|
ObjectId, @PropID, 0, @RefPropId, @ClsId, @RefClassID, @Flavor, @RefID
|
|
from ObjectMap as o
|
|
where exists (select * from ClassData as c where o.ObjectId = c.ObjectId and c.ClassId = @ClsId)
|
|
and not exists (select * from ClassData as d where o.ObjectId = d.ObjectId and PropertyId = @PropID)
|
|
|
|
insert into IndexRefData (ObjectId, PropertyId, ArrayPos, RefId) select
|
|
ObjectId, @PropID, 0, @RefID from ObjectMap as o
|
|
where exists (select * from ClassData as c where o.ObjectId = c.ObjectId and PropertyId = @PropID)
|
|
and not exists (select * from IndexRefData as d where o.ObjectId = d.ObjectId and PropertyId = @PropID)
|
|
END
|
|
END
|
|
END
|
|
END
|
|
ELSE IF (isnull(@Value,'') = '')
|
|
/* We may be dropping a default value */
|
|
BEGIN
|
|
delete from ClassData where PropertyId = @PropID and ObjectId = @ClassID and QfrPos = @RefPropId
|
|
IF ((@Flags & 12) != 0 AND (@ExistingFlags & 12) != 0)
|
|
BEGIN
|
|
delete from IndexStringData where PropertyId = @PropID and ObjectId = @ClassID
|
|
delete from IndexNumericData where PropertyId = @PropID and ObjectId = @ClassID
|
|
delete from IndexRealData where PropertyId = @PropID and ObjectId = @ClassID
|
|
delete from IndexRefData where PropertyId = @PropID and ObjectId = @ClassID
|
|
END
|
|
END
|
|
END
|
|
|
|
/* Insert class data as required.*/
|
|
exec InsertPropertyValue @ClassId, @PropID, @RefPropId, @Value, @RefPropId, @Flavor
|
|
|
|
return @PropID
|
|
END
|
|
go
|
|
|
|
/******************************************************************************/
|
|
/* */
|
|
/* sp_InsertPropertyDefs */
|
|
/* */
|
|
/* Description: Inserts up to 5 properties for a class */
|
|
/* */
|
|
/* Parameters: */
|
|
/* @ClassId WMISQL_ID The ID of the class to modify. */
|
|
/* @PropName1..5 nvarchar(450) The name of the new property. */
|
|
/* @Type1..5 int The CIM Type ID of the new property. */
|
|
/* @Value1..5 nvarchar(4000)The default value, if any */
|
|
/* @RefPropID1..5 int The method ID, if applicable */
|
|
/* @Flags1..5 int The CIM Flags, if any (key, indexed) */
|
|
/* @RefClassID1..5 int The method ID, if applicable */
|
|
/* @Flavor1..5 int The flavor, if qualifier */
|
|
/* @RefPropName1..5 nvarchar(450) The ref property name, if necessary */
|
|
/* @PropId1..5 int The new Property ID (output) */
|
|
/* */
|
|
/* NOTES: This inserts properties, methods, method parameters */
|
|
/* */
|
|
/******************************************************************************/
|
|
|
|
print 'Creating sp_InsertPropertyDefs...'
|
|
|
|
IF EXISTS (select * from sysobjects where type = 'P' and name = 'sp_InsertPropertyDefs')
|
|
BEGIN
|
|
drop procedure sp_InsertPropertyDefs
|
|
END
|
|
go
|
|
|
|
CREATE PROCEDURE sp_InsertPropertyDefs
|
|
@ClassId WMISQL_ID,
|
|
@PropName1 nvarchar(450),
|
|
@Type1 int,
|
|
@Value1 nvarchar(4000),
|
|
@RefPropID1 int = 0,
|
|
@Flags1 int = 0,
|
|
@RefClassID1 WMISQL_ID = 0,
|
|
@Flavor1 int = 0,
|
|
@RefPropName1 nvarchar(450) = '',
|
|
@PropId1 int = 0 OUTPUT,
|
|
@PropName2 nvarchar(450) = '',
|
|
@Type2 int = 0,
|
|
@Value2 nvarchar(4000) = '',
|
|
@RefPropID2 int = 0,
|
|
@Flags2 int = 0,
|
|
@RefClassID2 WMISQL_ID = 0,
|
|
@Flavor2 int = 0,
|
|
@RefPropName2 nvarchar(450) = '',
|
|
@PropId2 int = 0 OUTPUT,
|
|
@PropName3 nvarchar(450) = '',
|
|
@Type3 int = 0,
|
|
@Value3 nvarchar(4000) = '',
|
|
@RefPropID3 int = 0,
|
|
@Flags3 int = 0,
|
|
@RefClassID3 WMISQL_ID = 0,
|
|
@Flavor3 int = 0,
|
|
@RefPropName3 nvarchar(450) = '',
|
|
@PropId3 int = 0 OUTPUT,
|
|
@PropName4 nvarchar(450) = '',
|
|
@Type4 int = 0,
|
|
@Value4 nvarchar(4000) = '',
|
|
@RefPropID4 int = 0,
|
|
@Flags4 int = 0,
|
|
@RefClassID4 WMISQL_ID = 0,
|
|
@Flavor4 int = 0,
|
|
@RefPropName4 nvarchar(450) = '',
|
|
@PropId4 int = 0 OUTPUT,
|
|
@PropName5 nvarchar(450) = '',
|
|
@Type5 int = 0,
|
|
@Value5 nvarchar(4000) = '',
|
|
@RefPropID5 int = 0,
|
|
@Flags5 int = 0,
|
|
@RefClassID5 WMISQL_ID = 0,
|
|
@Flavor5 int = 0,
|
|
@RefPropName5 nvarchar(450) = '',
|
|
@PropId5 int = 0 OUTPUT
|
|
AS
|
|
BEGIN
|
|
IF (@PropName1 != '')
|
|
BEGIN
|
|
IF (@RefPropName1 != '' AND @RefPropID1 = 0)
|
|
BEGIN
|
|
select @RefPropID1 = PropertyId
|
|
from PropertyMap as p inner join #Children as c
|
|
on c.ClassId = p.ClassId
|
|
where PropertyName = @RefPropName1
|
|
END
|
|
exec @PropId1 = InsertPropertyDef @ClassId, @PropName1, @Type1, @Flags1, @Value1, 0, @RefClassID1, @RefPropID1, @Flavor1
|
|
END
|
|
IF (@PropName2 != '')
|
|
BEGIN
|
|
IF (@RefPropName2 != '' AND @RefPropID2 = 0)
|
|
BEGIN
|
|
select @RefPropID2 = PropertyId
|
|
from PropertyMap as p inner join #Children as c
|
|
on c.ClassId = p.ClassId
|
|
where PropertyName = @RefPropName2
|
|
END
|
|
exec @PropId2 = InsertPropertyDef @ClassId, @PropName2, @Type2, @Flags2, @Value2, 0, @RefClassID2, @RefPropID2, @Flavor2
|
|
END
|
|
IF (@PropName3 != '')
|
|
BEGIN
|
|
IF (@RefPropName3 != '' AND @RefPropID3 = 0)
|
|
BEGIN
|
|
select @RefPropID3 = PropertyId
|
|
from PropertyMap as p inner join #Children as c
|
|
on c.ClassId = p.ClassId
|
|
where PropertyName = @RefPropName3
|
|
END
|
|
exec @PropId3 = InsertPropertyDef @ClassId, @PropName3, @Type3, @Flags3, @Value3, 0, @RefClassID3, @RefPropID3, @Flavor3
|
|
END
|
|
IF (@PropName4 != '')
|
|
BEGIN
|
|
IF (@RefPropName4 != '' AND @RefPropID4 = 0)
|
|
BEGIN
|
|
select @RefPropID4 = PropertyId
|
|
from PropertyMap as p inner join #Children as c
|
|
on c.ClassId = p.ClassId
|
|
where PropertyName = @RefPropName4
|
|
END
|
|
exec @PropId4 = InsertPropertyDef @ClassId, @PropName4, @Type4, @Flags4, @Value4, 0, @RefClassID4, @RefPropID4, @Flavor4
|
|
END
|
|
IF (@PropName5 != '')
|
|
BEGIN
|
|
IF (@RefPropName5 != '' AND @RefPropID5 = 0)
|
|
BEGIN
|
|
select @RefPropID5 = PropertyId
|
|
from PropertyMap as p inner join #Children as c
|
|
on c.ClassId = p.ClassId
|
|
where PropertyName = @RefPropName5
|
|
END
|
|
exec @PropId5 = InsertPropertyDef @ClassId, @PropName5, @Type5, @Flags5, @Value5, 0, @RefClassID5, @RefPropID5, @Flavor5
|
|
END
|
|
return 0
|
|
END
|
|
go
|
|
|
|
/******************************************************************************/
|
|
/* */
|
|
/* sp_InsertClassAndData */
|
|
/* */
|
|
/* Description: Creates or modifies a class, and stores up to 5 properties. */
|
|
/* */
|
|
/* Parameters: */
|
|
/* @ObjectId WMISQL_ID The class ID (output) */
|
|
/* @ClassName nvarchar(450) The Class name */
|
|
/* @ObjectKey nvarchar(450) The unique identifier of cls object */
|
|
/* @ObjectPath nvarchar(4000) The path of the class object. */
|
|
/* @ScopePath nvarchar(450) The unique identifier of scope obj */
|
|
/* @ParentClass nvarchar(450) The unique identifier of parent */
|
|
/* @ClassFlags int CIM Flags for this class (abstract) */
|
|
/* @InsertFlags int 1 upd, 2 insert, 0 if none */
|
|
/* @PropName1..5 nvarchar(450) The name of the new property. */
|
|
/* @Type1..5 int The CIM Type ID of the new property. */
|
|
/* @Value1..5 nvarchar(4000)The default value, if any */
|
|
/* @RefPropID1..5 int The method ID, if applicable */
|
|
/* @Flags1..5 int The CIM Flags, if any (key, indexed) */
|
|
/* @RefClassID1..5 int The method ID, if applicable */
|
|
/* @Flavor1..5 int The flavor, if qualifier */
|
|
/* @RefPropName1..5 nvarchar(450) The ref property name, if necessary */
|
|
/* @PropId1..5 int The new Property ID (output) */
|
|
/* */
|
|
/******************************************************************************/
|
|
|
|
print 'Creating sp_InsertClassAndData...'
|
|
IF EXISTS (select * from sysobjects where type = 'P' and name = 'sp_InsertClassAndData')
|
|
BEGIN
|
|
drop procedure sp_InsertClassAndData
|
|
END
|
|
go
|
|
|
|
CREATE PROCEDURE sp_InsertClassAndData
|
|
@ObjectId WMISQL_ID OUTPUT,
|
|
@ClassName nvarchar(450),
|
|
@ObjectKey nvarchar(450),
|
|
@ObjectPath nvarchar(4000),
|
|
@ScopePath nvarchar(450),
|
|
@ParentClass nvarchar(450) = '',
|
|
@ClassFlags int = 0, /* Singleton, abstract, etc.*/
|
|
@InsertFlags int = 0, /* If insert, do no validation!! */
|
|
@PropName1 nvarchar(450) ='',
|
|
@Type1 int = 0,
|
|
@Value1 nvarchar(4000) = '',
|
|
@RefPropID1 int = 0,
|
|
@Flags1 int = 0,
|
|
@RefClassID1 WMISQL_ID = 0,
|
|
@Flavor1 int = 0,
|
|
@RefPropName1 nvarchar(450) = '',
|
|
@PropId1 int = 0 OUTPUT,
|
|
@PropName2 nvarchar(450) = '',
|
|
@Type2 int = 0,
|
|
@Value2 nvarchar(4000) = '',
|
|
@RefPropID2 int = 0,
|
|
@Flags2 int = 0,
|
|
@RefClassID2 WMISQL_ID = 0,
|
|
@Flavor2 int = 0,
|
|
@RefPropName2 nvarchar(450) = '',
|
|
@PropId2 int = 0 OUTPUT,
|
|
@PropName3 nvarchar(450) = '',
|
|
@Type3 int = 0,
|
|
@Value3 nvarchar(4000) = '',
|
|
@RefPropID3 int = 0,
|
|
@Flags3 int = 0,
|
|
@RefClassID3 WMISQL_ID = 0,
|
|
@Flavor3 int = 0,
|
|
@RefPropName3 nvarchar(450) = '',
|
|
@PropId3 int = 0 OUTPUT,
|
|
@PropName4 nvarchar(450) = '',
|
|
@Type4 int = 0,
|
|
@Value4 nvarchar(4000) = '',
|
|
@RefPropID4 int = 0,
|
|
@Flags4 int = 0,
|
|
@RefClassID4 WMISQL_ID = 0,
|
|
@Flavor4 int = 0,
|
|
@RefPropName4 nvarchar(450) = '',
|
|
@PropId4 int = 0 OUTPUT,
|
|
@PropName5 nvarchar(450) = '',
|
|
@Type5 int = 0,
|
|
@Value5 nvarchar(4000) = '',
|
|
@RefPropID5 int = 0,
|
|
@Flags5 int = 0,
|
|
@RefClassID5 WMISQL_ID = 0,
|
|
@Flavor5 int = 0,
|
|
@RefPropName5 nvarchar(450) = '',
|
|
@PropId5 int = 0 OUTPUT
|
|
|
|
AS
|
|
BEGIN
|
|
|
|
set nocount on
|
|
declare @ScopeObjID WMISQL_ID, @ParentID WMISQL_ID, @State int
|
|
declare @Flags int, @OldParentID WMISQL_ID, @SkipValid bit
|
|
|
|
select @SkipValid = 0
|
|
|
|
/* Validate the scope path */
|
|
IF (@ScopePath != '')
|
|
BEGIN
|
|
select @ScopeObjID = ObjectId from ObjectMap where ObjectKey = @ScopePath
|
|
if (isnull(@ScopeObjID,-1) = -1)
|
|
BEGIN
|
|
raiserror 99100 'Scoping object has not been defined.'
|
|
return 0
|
|
END
|
|
END
|
|
else
|
|
BEGIN
|
|
/* This must be a global class type, like __Namespace ... */
|
|
select @ScopeObjID = 0
|
|
END
|
|
|
|
/* Validate the object path */
|
|
IF (@ObjectPath = '')
|
|
BEGIN
|
|
raiserror 99109 'Object Path cannot be blank.'
|
|
return 0
|
|
END
|
|
|
|
/* Validate the parent class */
|
|
IF (@ParentClass <> '')
|
|
BEGIN
|
|
select @ParentID = ObjectId from ObjectMap where ObjectKey = @ParentClass
|
|
if (isnull(@ParentID,-1) = -1)
|
|
BEGIN
|
|
raiserror 99101 'Parent class has not been defined.'
|
|
return 0
|
|
END
|
|
IF NOT EXISTS (select ClassId from ClassMap where ClassId = @ParentID)
|
|
BEGIN
|
|
raiserror 99101 'Parent class has not been defined.'
|
|
return 0
|
|
END
|
|
END
|
|
ELSE
|
|
select @ParentID = ClassId from ClassMap where ClassName = 'meta_class' /* Default */
|
|
|
|
/* Verify the insert flags */
|
|
select @ObjectId = ObjectId, @Flags = ObjectFlags
|
|
from ObjectMap where ObjectKey = @ObjectKey
|
|
|
|
/* Make sure the parent class is not the current class or a child! */
|
|
IF (@ParentID > 1 and @ObjectId is not null)
|
|
BEGIN
|
|
exec sp_GetChildClassList @ObjectId
|
|
IF EXISTS (select * from #Children where ClassId = @ParentID)
|
|
BEGIN
|
|
raiserror 99129 'Parent class would cause a loop.'
|
|
return 0
|
|
END
|
|
END
|
|
|
|
IF (@InsertFlags = 1) /* Update only */
|
|
BEGIN
|
|
IF (isnull(@ObjectId,-1) = -1)
|
|
BEGIN
|
|
raiserror 99126 'Cannot update: This object does not exist.'
|
|
return 0
|
|
END
|
|
END
|
|
ELSE IF (@InsertFlags = 2) /* Create only */
|
|
BEGIN
|
|
IF (isnull(@ObjectId,-1) != -1)
|
|
BEGIN
|
|
raiserror 99125 'Cannot insert: This object already exists.'
|
|
return 0
|
|
END
|
|
END
|
|
|
|
/* This is a new class */
|
|
IF (@ObjectId is null)
|
|
BEGIN
|
|
insert into ObjectMap (ClassId, ObjectPath, ObjectKey, ObjectState, ReferenceCount, ObjectFlags,
|
|
ObjectScopeId) values
|
|
(1, @ObjectPath, @ObjectKey, 0, 0, @ClassFlags, @ScopeObjID)
|
|
select @ObjectId = @@identity
|
|
insert into ClassMap (ClassId, ClassName, SuperClassId) values
|
|
(@ObjectId, @ClassName, @ParentID)
|
|
IF (@@error != 0)
|
|
BEGIN
|
|
return 0
|
|
END
|
|
/* If there is no parent, we can just insert all
|
|
the properties without validation */
|
|
IF (@ParentID = 1)
|
|
BEGIN
|
|
select @SkipValid = 1
|
|
END
|
|
END
|
|
ELSE
|
|
BEGIN
|
|
/* This is an update. Delete all qualifiers */
|
|
IF EXISTS (select * from ClassData where ObjectId = @ObjectId and ClassId = 1)
|
|
BEGIN
|
|
delete from ClassData where ObjectId = @ObjectId and ClassId = 1
|
|
END
|
|
select @OldParentID = SuperClassId from ClassMap where ClassId = @ObjectId
|
|
IF ((@Flags != @ClassFlags) OR (@OldParentID != @ParentID))
|
|
BEGIN
|
|
/* Only change flags if no instances */
|
|
IF EXISTS (select ObjectId from ClassData
|
|
where ClassId = @ObjectId and ObjectId != @ObjectId)
|
|
BEGIN
|
|
raiserror 99128 'Class has instances.'
|
|
return 0
|
|
END
|
|
END
|
|
|
|
/* Make sure the row is not marked as deleted */
|
|
|
|
update ObjectMap set ObjectState = 0,
|
|
ObjectFlags = @ClassFlags where ObjectId = @ObjectId
|
|
and (ObjectState != 0 or ClassId != @ParentID or ObjectFlags != @ClassFlags)
|
|
IF (@@error = 0)
|
|
BEGIN
|
|
update ClassMap set SuperClassId = @ParentID
|
|
where ClassId = @ObjectId and SuperClassId != @ParentID
|
|
END
|
|
END
|
|
|
|
/* Insert the 5 properties */
|
|
|
|
IF (@ParentID > 1)
|
|
exec sp_GetParentList @ObjectId
|
|
|
|
exec sp_InsertPropertyDefs @ObjectId, @PropName1, @Type1, @Value1, @RefPropID1, @Flags1,
|
|
@RefClassID1, @Flavor1, @RefPropName1, @PropId1 output, @PropName2, @Type2, @Value2, @RefPropID2, @Flags2,
|
|
@RefClassID2, @Flavor2, @RefPropName2, @PropId2 output, @PropName3, @Type3, @Value3, @RefPropID3, @Flags3,
|
|
@RefClassID3, @Flavor3, @RefPropName3, @PropId3 output, @PropName4, @Type4, @Value4, @RefPropID4, @Flags4,
|
|
@RefClassID4, @Flavor4, @RefPropName4, @PropId4 output, @PropName5, @Type5, @Value5, @RefPropID5, @Flags5,
|
|
@RefClassID5, @Flavor5, @RefPropName5, @PropId5 output
|
|
|
|
set nocount off
|
|
return @ObjectId
|
|
|
|
END
|
|
go
|
|
|
|
|
|
/******************************************************************************/
|
|
/* */
|
|
/* sp_BatchInsertProperty */
|
|
/* */
|
|
/* Function to insert an instance and all non-qualifier properties */
|
|
/* */
|
|
/* @ObjectPath nvarchar the object path */
|
|
/* @ClassID WMISQL_ID the Class ID */
|
|
/* @ScopeID WMISQL_ID the Scope instance ID */
|
|
/* @InsertFlags int 1 if update only, 2 if insert only */
|
|
/* @RetValue bit true to return the ID */
|
|
/* @PropID1...10 int the property ID */
|
|
/* @PropValue1...0 nvarchar the value */
|
|
/* @PropPos1...10 int the array ArrayPos, or zero */
|
|
/* */
|
|
/******************************************************************************/
|
|
print 'Creating sp_BatchInsertProperty...'
|
|
|
|
IF EXISTS (select * from sysobjects where name = 'sp_BatchInsertProperty')
|
|
BEGIN
|
|
drop procedure sp_BatchInsertProperty
|
|
END
|
|
go
|
|
|
|
CREATE PROCEDURE sp_BatchInsertProperty
|
|
@ObjectID WMISQL_ID,
|
|
@ObjectKey nvarchar(450),
|
|
@ObjectPath nvarchar(4000),
|
|
@ClassID WMISQL_ID,
|
|
@ScopeID WMISQL_ID,
|
|
@InsertFlags int,
|
|
@Init bit,
|
|
@PropID1 int,
|
|
@PropValue1 nvarchar(4000),
|
|
@PropPos1 int = 0,
|
|
@PropID2 int = 0,
|
|
@PropValue2 nvarchar(4000) = '',
|
|
@PropPos2 int = 0,
|
|
@PropID3 int = 0,
|
|
@PropValue3 nvarchar(4000) = '',
|
|
@PropPos3 int = 0,
|
|
@PropID4 int = 0,
|
|
@PropValue4 nvarchar(4000) = '',
|
|
@PropPos4 int = 0,
|
|
@PropID5 int = 0,
|
|
@PropValue5 nvarchar(4000) = '',
|
|
@PropPos5 int = 0,
|
|
@PropID6 int = 0,
|
|
@PropValue6 nvarchar(4000) = '',
|
|
@PropPos6 int = 0,
|
|
@PropID7 int = 0,
|
|
@PropValue7 nvarchar(4000) = '',
|
|
@PropPos7 int = 0,
|
|
@PropID8 int = 0,
|
|
@PropValue8 nvarchar(4000) = '',
|
|
@PropPos8 int = 0,
|
|
@PropID9 int = 0,
|
|
@PropValue9 nvarchar(4000) = '',
|
|
@PropPos9 int = 0,
|
|
@PropID10 int = 0,
|
|
@PropValue10 nvarchar(4000) = '',
|
|
@PropPos10 int = 0,
|
|
@CompKey nvarchar(450) = ''
|
|
AS
|
|
BEGIN
|
|
|
|
declare @ObjectState int, @ObjectFlags int, @Exists bit, @ExClassId WMISQL_ID
|
|
|
|
select @Exists = 0
|
|
|
|
/* First confirm that the flags are OK */
|
|
|
|
select @ObjectState = ObjectState, @Exists = 1, @ExClassId = ClassId
|
|
from ObjectMap where ObjectId = @ObjectID
|
|
|
|
IF (@Exists = 0)
|
|
BEGIN
|
|
IF (@InsertFlags & 1 = 1) /* Update Only */
|
|
BEGIN
|
|
raiserror 99126 'Cannot update: This object does not exist.'
|
|
return 0
|
|
END
|
|
|
|
/* Insert */
|
|
insert into ObjectMap
|
|
(ObjectId, ObjectPath, ObjectKey, ClassId, ObjectState, ReferenceCount, ObjectFlags, ObjectScopeId) values
|
|
(@ObjectID, @ObjectPath, @ObjectKey, @ClassID, 0, 0, 0, @ScopeID)
|
|
|
|
IF (@InsertFlags & 8196 = 8196)
|
|
insert into AutoDelete (ObjectId) values (@ObjectId)
|
|
END
|
|
ELSE
|
|
BEGIN
|
|
IF (@InsertFlags & 2 = 2) /* Create only */
|
|
BEGIN
|
|
raiserror 99125 'Cannot insert: This object already exists.'
|
|
return 0
|
|
END
|
|
IF (@ClassID != @ExClassId AND @ExClassId != 0)
|
|
BEGIN
|
|
raiserror 99125 'Cannot insert: This object already exists.'
|
|
return 0
|
|
END
|
|
|
|
IF (@ObjectState != 0)
|
|
BEGIN
|
|
update ObjectMap set ObjectKey = @ObjectKey, ObjectState = 0, ClassId = @ClassID, ObjectScopeId = @ScopeID
|
|
where ObjectId = @ObjectID
|
|
END
|
|
/* Remove all qualifiers on the first pass, so we can re-add them. */
|
|
IF (@Init = 1) AND EXISTS (select * from ClassData where ObjectId = @ObjectID and ClassId = 1)
|
|
BEGIN
|
|
delete from ClassData where ObjectId = @ObjectID and ClassId = 1
|
|
END
|
|
END
|
|
|
|
declare @ContainerId WMISQL_ID, @ContaineeId WMISQL_ID
|
|
|
|
IF (@PropID1 != 0)
|
|
exec InsertPropertyValue @ObjectID, @PropID1, @PropPos1, @PropValue1, 0, 0, @ContaineeId output
|
|
IF (@PropID2 != 0)
|
|
exec InsertPropertyValue @ObjectID, @PropID2, @PropPos2, @PropValue2, 0, 0, @ContainerId output
|
|
IF (@PropID3 != 0)
|
|
exec InsertPropertyValue @ObjectID, @PropID3, @PropPos3, @PropValue3
|
|
IF (@PropID4 != 0)
|
|
exec InsertPropertyValue @ObjectID, @PropID4, @PropPos4, @PropValue4
|
|
IF (@PropID5 != 0)
|
|
exec InsertPropertyValue @ObjectID, @PropID5, @PropPos5, @PropValue5
|
|
IF (@PropID6 != 0)
|
|
exec InsertPropertyValue @ObjectID, @PropID6, @PropPos6, @PropValue6
|
|
IF (@PropID7 != 0)
|
|
exec InsertPropertyValue @ObjectID, @PropID7, @PropPos7, @PropValue7
|
|
IF (@PropID8 != 0)
|
|
exec InsertPropertyValue @ObjectID, @PropID8, @PropPos8, @PropValue8
|
|
IF (@PropID9 != 0)
|
|
exec InsertPropertyValue @ObjectID, @PropID9, @PropPos9, @PropValue9
|
|
IF (@PropID10 != 0)
|
|
exec InsertPropertyValue @ObjectID, @PropID10, @PropPos10, @PropValue10
|
|
|
|
IF (@@error != 0)
|
|
BEGIN
|
|
return 0
|
|
END
|
|
|
|
IF (@ClassID = -7316356768687527881 AND isnull(@ContaineeId,0) != 0) /* Container_Association */
|
|
BEGIN
|
|
IF NOT EXISTS (select * from ContainerObjs where ContaineeId = @ContaineeId and ContainerId = @ContainerId)
|
|
BEGIN
|
|
insert into ContainerObjs (ContainerId, ContaineeId) values (@ContainerId, @ContaineeId)
|
|
END
|
|
END
|
|
return 0
|
|
|
|
END
|
|
go
|
|
|
|
/******************************************************************************/
|
|
/* */
|
|
/* sp_BatchInsertPropertyByID */
|
|
/* */
|
|
/* Function to insert an instance and all non-qualifier properties */
|
|
/* */
|
|
/* @ObjectId WMISQL_ID the existing WMISQL_ID Object Identifr */
|
|
/* @ClassID WMISQL_ID the Class ID */
|
|
/* @ScopeID WMISQL_ID the Scope instance ID */
|
|
/* @RetValue bit true to return the ID */
|
|
/* @PropID1...10 int the property ID */
|
|
/* @PropValue1...0 nvarchar the value */
|
|
/* @PropPos1...10 int the array ArrayPos, or zero */
|
|
/* */
|
|
/******************************************************************************/
|
|
print 'Creating sp_BatchInsertPropertyByID...'
|
|
|
|
IF EXISTS (select * from sysobjects where name = 'sp_BatchInsertPropertyByID')
|
|
BEGIN
|
|
drop procedure sp_BatchInsertPropertyByID
|
|
END
|
|
go
|
|
|
|
CREATE PROCEDURE sp_BatchInsertPropertyByID
|
|
@ObjectID WMISQL_ID,
|
|
@ClassID WMISQL_ID,
|
|
@ScopeID WMISQL_ID,
|
|
@RetValue bit,
|
|
@PropID1 int,
|
|
@PropValue1 nvarchar(4000),
|
|
@PropPos1 int = 0,
|
|
@PropID2 int = 0,
|
|
@PropValue2 nvarchar(4000) = '',
|
|
@PropPos2 int = 0,
|
|
@PropID3 int = 0,
|
|
@PropValue3 nvarchar(4000) = '',
|
|
@PropPos3 int = 0,
|
|
@PropID4 int = 0,
|
|
@PropValue4 nvarchar(4000) = '',
|
|
@PropPos4 int = 0,
|
|
@PropID5 int = 0,
|
|
@PropValue5 nvarchar(4000) = '',
|
|
@PropPos5 int = 0
|
|
AS
|
|
BEGIN
|
|
|
|
declare @ObjectState int
|
|
|
|
select @ObjectState = ObjectState
|
|
from ObjectMap where ObjectId = @ObjectID
|
|
|
|
IF (isnull(@ObjectState,-1) = -1)
|
|
BEGIN
|
|
raiserror 99104 'This class/instance has not been defined.'
|
|
return 0
|
|
END
|
|
|
|
IF (@ObjectState != 0)
|
|
BEGIN
|
|
update ObjectMap set ObjectState = 0, ClassId = @ClassID, ObjectScopeId = @ScopeID
|
|
where ObjectId = @ObjectID
|
|
END
|
|
|
|
IF (@PropID1 != 0)
|
|
exec InsertPropertyValue @ObjectID, @PropID1, @PropPos1, @PropValue1
|
|
IF (@PropID2 != 0)
|
|
exec InsertPropertyValue @ObjectID, @PropID2, @PropPos2, @PropValue2
|
|
IF (@PropID3 != 0)
|
|
exec InsertPropertyValue @ObjectID, @PropID3, @PropPos3, @PropValue3
|
|
IF (@PropID4 != 0)
|
|
exec InsertPropertyValue @ObjectID, @PropID4, @PropPos4, @PropValue4
|
|
IF (@PropID5 != 0)
|
|
exec InsertPropertyValue @ObjectID, @PropID5, @PropPos5, @PropValue5
|
|
|
|
IF (@@error != 0)
|
|
BEGIN
|
|
return 0
|
|
END
|
|
|
|
IF (@RetValue != 0)
|
|
select @ObjectID
|
|
return @ObjectID
|
|
END
|
|
go
|
|
|
|
/******************************************************************************/
|
|
/* */
|
|
/* sp_BatchInsert */
|
|
/* */
|
|
/* Function to insert all properties for a given object ID */
|
|
/* */
|
|
/* @ObjectId WMISQL_ID the object ID */
|
|
/* @QfrID1..10 int the qualifier property ID */
|
|
/* @QfrValue1..10 nvarchar the value */
|
|
/* @Flavor1..10 int the flavor */
|
|
/* @PropID1..10 int the property ID, a property qfr */
|
|
/* @QfrPos1..10 int the ArrayPos, if array element */
|
|
/* */
|
|
/******************************************************************************/
|
|
print 'Creating sp_BatchInsert...'
|
|
|
|
IF EXISTS (select * from sysobjects where name = 'sp_BatchInsert')
|
|
BEGIN
|
|
drop procedure sp_BatchInsert
|
|
END
|
|
go
|
|
|
|
CREATE PROCEDURE sp_BatchInsert
|
|
@ObjectId WMISQL_ID,
|
|
@ClassID WMISQL_ID,
|
|
@ScopeID WMISQL_ID,
|
|
@QfrId1 int,
|
|
@QfrValue1 nvarchar(4000),
|
|
@Flavor1 int,
|
|
@PropID1 int = 0,
|
|
@QfrPos1 int = 0,
|
|
@QfrId2 int = 0,
|
|
@QfrValue2 nvarchar(4000)= '',
|
|
@Flavor2 int = 0,
|
|
@PropID2 int = 0,
|
|
@QfrPos2 int = 0,
|
|
@QfrId3 int = 0,
|
|
@QfrValue3 nvarchar(4000) = '',
|
|
@Flavor3 int = 0,
|
|
@PropID3 int = 0,
|
|
@QfrPos3 int = 0,
|
|
@QfrId4 int = 0,
|
|
@QfrValue4 nvarchar(4000) = '',
|
|
@Flavor4 int = 0,
|
|
@PropID4 int = 0,
|
|
@QfrPos4 int = 0,
|
|
@QfrId5 int = 0,
|
|
@QfrValue5 nvarchar(4000)='',
|
|
@Flavor5 int = 0,
|
|
@PropID5 int = 0,
|
|
@QfrPos5 int = 0
|
|
AS
|
|
BEGIN
|
|
|
|
declare @ObjectState int
|
|
|
|
select @ObjectState = ObjectState
|
|
from ObjectMap where ObjectId = @ObjectID
|
|
|
|
IF (@ObjectState is null)
|
|
BEGIN
|
|
raiserror 99104 'This class/instance has not been defined.'
|
|
return 0
|
|
END
|
|
|
|
IF (@ObjectState != 0)
|
|
BEGIN
|
|
update ObjectMap set ObjectState = 0, ClassId = @ClassID, ObjectScopeId = @ScopeID
|
|
where ObjectId = @ObjectID
|
|
END
|
|
|
|
IF (@QfrId1 != 0)
|
|
exec InsertPropertyValue @ObjectId, @QfrId1, @QfrPos1, @QfrValue1, @PropID1, @Flavor1
|
|
IF (@QfrId2 != 0)
|
|
exec InsertPropertyValue @ObjectId, @QfrId2, @QfrPos2, @QfrValue2, @PropID2, @Flavor2
|
|
IF (@QfrId3 != 0)
|
|
exec InsertPropertyValue @ObjectId, @QfrId3, @QfrPos3, @QfrValue3, @PropID3, @Flavor3
|
|
IF (@QfrId4 != 0)
|
|
exec InsertPropertyValue @ObjectId, @QfrId4, @QfrPos4, @QfrValue4, @PropID4, @Flavor4
|
|
IF (@QfrId5 != 0)
|
|
exec InsertPropertyValue @ObjectId, @QfrId5, @QfrPos5, @QfrValue5, @PropID5, @Flavor5
|
|
END
|
|
go
|
|
|
|
/******************************************************************************/
|
|
/* */
|
|
/* sp_EnumerateNamespaces */
|
|
/* */
|
|
/* Description: This procedure allows a quick way of retrieving all */
|
|
/* namespaces and object scopes in the system, so we */
|
|
/* can quickly determine security and lock status on any */
|
|
/* given object (that may or may not be scoped). */
|
|
/* */
|
|
/******************************************************************************/
|
|
|
|
print 'Creating sp_EnumerateNamespaces...'
|
|
|
|
IF EXISTS (select * from sysobjects where type = 'P' and name = 'sp_EnumerateNamespaces')
|
|
BEGIN
|
|
drop procedure sp_EnumerateNamespaces
|
|
END
|
|
go
|
|
|
|
CREATE PROCEDURE sp_EnumerateNamespaces
|
|
AS
|
|
BEGIN
|
|
declare @NsClsId1 WMISQL_ID, @NsClsId2 WMISQL_ID, @NsClsId3 WMISQL_ID
|
|
select @NsClsId1 = ClassId from ClassMap where ClassName = '__Namespace'
|
|
select @NsClsId2 = ClassId from ClassMap where ClassName = '__SqlMappedNamespace'
|
|
select @NsClsId3 = ClassId from ClassMap where ClassName = '__WmiMappedDriverNamespace'
|
|
|
|
create table #Namespaces (ID numeric(20,0), Name nvarchar(1024) NULL, ObjKey nvarchar(450) NULL,
|
|
ParentID numeric(20,0) NULL, NClassId numeric(20,0) NULL)
|
|
insert into #Namespaces select ObjectId, ObjectPath, ObjectKey, ObjectScopeId, ClassId from ObjectMap
|
|
where ClassId in (@NsClsId1, @NsClsId2, @NsClsId3)
|
|
insert into #Namespaces (ID) select distinct ObjectScopeId
|
|
from ObjectMap where isnull(ObjectScopeId,0) != 0
|
|
and ObjectScopeId not in (select ID from #Namespaces)
|
|
update #Namespaces set Name = ObjectPath, ObjKey = ObjectKey, ParentID = ObjectScopeId, NClassId = ClassId
|
|
from ObjectMap inner join #Namespaces
|
|
on ID = ObjectId
|
|
where Name is null
|
|
select * from #Namespaces order by ParentID
|
|
END
|
|
go
|
|
|
|
/******************************************************************************/
|
|
/* */
|
|
/* vTableSizes */
|
|
/* */
|
|
/* Description: This view allows quick determination of database space */
|
|
/* usage. This is primarily for internal use. */
|
|
/* */
|
|
/* Sample Usage: select * from vTableSizes where type = 'U' */
|
|
/* order by SizeInKBs desc compute sum(SizeInKBs) */
|
|
/* */
|
|
/******************************************************************************/
|
|
|
|
IF EXISTS (select * from sysobjects where name = 'vTableSizes')
|
|
BEGIN
|
|
drop view vTableSizes
|
|
END
|
|
go
|
|
|
|
print 'Creating view vTableSizes...'
|
|
go
|
|
|
|
CREATE VIEW vTableSizes AS
|
|
select o.id, o.name, convert(int,max(round(((reserved * convert(float, d.low))/1024 ), 0))) as SizeInKBs, o.type
|
|
from sysindexes i, master.dbo.spt_values d, sysobjects o
|
|
where d.number = 1
|
|
and d.type = 'E'
|
|
and indid in (0,1,255)
|
|
and o.id = i.id
|
|
group by o.id, o.name, o.type
|
|
go
|
|
|
|
/******************************************************************************/
|
|
/* */
|
|
/* vSystemProperties */
|
|
/* */
|
|
/* Description: This view allows the system to support queries on system */
|
|
/* properties without having to store them redundantly. */
|
|
/* UNDER CONSTRUCTION */
|
|
/* */
|
|
/******************************************************************************/
|
|
|
|
IF EXISTS (select * from sysobjects where name = 'vSystemProperties')
|
|
BEGIN
|
|
drop view vSystemProperties
|
|
END
|
|
go
|
|
|
|
print 'Creating view vSystemProperties...'
|
|
go
|
|
|
|
CREATE VIEW vSystemProperties
|
|
AS
|
|
select
|
|
ObjectId = o.ObjectId,
|
|
ClassId = o.ClassId,
|
|
__Path = o.ObjectPath,
|
|
__RelPath = substring(o.ObjectPath, charindex(':', o.ObjectPath)+1, datalength(o.ObjectPath)-((charindex(':', o.ObjectPath)+1))),
|
|
__Class = c.ClassName,
|
|
__SuperClass = s.ClassName,
|
|
__Derivation = NULL,
|
|
__Dynasty = 'meta_class',
|
|
__Namespace = case when charindex(':', o.ObjectPath) = 0 then '' else substring(o.ObjectPath, 1, charindex(':', o.ObjectPath)-1) end,
|
|
__Genus = case when exists (select ClassId from ClassMap where ClassId = o.ObjectId) then 1 else 2 end,
|
|
__Property_Count = (select count(PropertyId) from PropertyMap where ClassId = o.ObjectId),
|
|
__Server = '.',
|
|
__Version = 0,
|
|
__Timestamp = NULL
|
|
from ObjectMap as o
|
|
inner join ClassMap as c
|
|
on ((o.ClassId = c.ClassId AND o.ClassId != 1) OR o.ObjectId = c.ClassId)
|
|
left outer join ClassMap as s
|
|
on c.SuperClassId = s.ClassId
|
|
|
|
go
|
|
|
|
/******************************************************************************/
|
|
/* */
|
|
/* sp_Reindex */
|
|
/* */
|
|
/* Description: This procedure allows a quick system reindexing of all */
|
|
/* user tables in the database. (Optimization) */
|
|
/* */
|
|
/******************************************************************************/
|
|
print 'Creating sp_Reindex...'
|
|
|
|
IF EXISTS (select * from sysobjects where name = 'sp_Reindex')
|
|
BEGIN
|
|
drop procedure sp_Reindex
|
|
END
|
|
go
|
|
|
|
CREATE PROCEDURE sp_Reindex
|
|
AS
|
|
BEGIN
|
|
declare @TableName nvarchar(50)
|
|
select @TableName = min(name) from sysobjects where type = 'U'
|
|
while (@TableName != NULL)
|
|
BEGIN
|
|
dbcc dbreindex(@TableName)
|
|
select @TableName = min(name) from sysobjects where type = 'U'
|
|
and name > @TableName
|
|
END
|
|
END
|
|
go
|
|
|
|
/******************************************************************************/
|
|
/* */
|
|
/* sp_GetNextKeyhole */
|
|
/* */
|
|
/* Description: This procedure finds the next available value for a keyhole */
|
|
/* property. */
|
|
/* */
|
|
/* Parameter: */
|
|
/* @PropID int The keyhole property. */
|
|
/* @NextID WMISQL_ID The new value (output) */
|
|
/* */
|
|
/******************************************************************************/
|
|
print 'Creating sp_GetNextKeyhole...'
|
|
|
|
IF EXISTS (SELECT * from sysobjects where name = 'sp_GetNextKeyhole')
|
|
BEGIN
|
|
drop procedure sp_GetNextKeyhole
|
|
END
|
|
go
|
|
|
|
CREATE PROCEDURE sp_GetNextKeyhole @PropID int, @NextID WMISQL_ID OUTPUT
|
|
AS
|
|
BEGIN
|
|
declare @StorageType int
|
|
|
|
select @StorageType = StorageTypeId from PropertyMap
|
|
where PropertyId = @PropID
|
|
if (isnull(@StorageType,-1) = -1)
|
|
BEGIN
|
|
raiserror 99111 'This property/qualifier/method has not been defined.'
|
|
return 0
|
|
END
|
|
|
|
begin transaction
|
|
if (@StorageType = 1)
|
|
BEGIN
|
|
select @NextID = isnull(max(convert(numeric(20,0),PropertyStringValue)),0)+1
|
|
from IndexStringData
|
|
where PropertyId = @PropID
|
|
END
|
|
ELSE IF (@StorageType = 2)
|
|
BEGIN
|
|
select @NextID = isnull(max(PropertyNumericValue),0)+1
|
|
from IndexNumericData
|
|
where PropertyId = @PropID
|
|
END
|
|
commit transaction
|
|
|
|
return @NextID
|
|
|
|
END
|
|
go
|
|
|
|
/******************************************************************************/
|
|
/* */
|
|
/* sp_GetNextUnkeyedPath */
|
|
/* */
|
|
/* Description: This procedure finds the next available object path for */
|
|
/* a new unkeyed property. Since WMI objects create their */
|
|
/* object path out of properties marked 'key', unkeyed objects */
|
|
/* require this mechanism to get a new object path. */
|
|
/* */
|
|
/* Parameters: */
|
|
/* @ClassID WMISQL_ID The class ID */
|
|
/* @NewPath nvarchar(450) The new unique key for this class. */
|
|
/* */
|
|
/******************************************************************************/
|
|
print 'Creating sp_GetNextUnkeyedPath...'
|
|
|
|
IF EXISTS (SELECT * from sysobjects where name = 'sp_GetNextUnkeyedPath')
|
|
BEGIN
|
|
drop procedure sp_GetNextUnkeyedPath
|
|
END
|
|
go
|
|
|
|
CREATE PROCEDURE sp_GetNextUnkeyedPath
|
|
@ClassID WMISQL_ID,
|
|
@NewPath nvarchar(450) OUTPUT,
|
|
|
|
@RetVal bit = 0
|
|
AS
|
|
BEGIN
|
|
declare @RetValue nvarchar(450)
|
|
declare @NextValue WMISQL_ID
|
|
|
|
begin transaction
|
|
|
|
select @RetValue = ObjectPath from ObjectMap where ObjectId = @ClassID
|
|
select @Newpath = @RetValue + '="' + convert(nvarchar(50),newid()) + '"'
|
|
|
|
IF (@RetVal = 1)
|
|
select @Newpath
|
|
commit transaction
|
|
|
|
return 0
|
|
|
|
END
|
|
go
|
|
|
|
/******************************************************************************/
|
|
/* */
|
|
/* sp_InsertClass */
|
|
/* */
|
|
/* Description: Inserts ClassMap with the high-level information for a class.*/
|
|
/* */
|
|
/* Parameters: */
|
|
/* @ClassName nvarchar(450) the name of this class, unique within */
|
|
/* this scope (namespace or other instance) */
|
|
/* @ObjectPath nvarchar(4000) the full path of this class */
|
|
/* @ScopePath nvarchar(450) the full path to the scoping instance. */
|
|
/* @ParentClass nvarchar(450) the parent class name, if any */
|
|
/* @ClassState int the initial state of this class */
|
|
/* @TableName nvarchar(30) the table name used, if different. */
|
|
/* */
|
|
/* Returns: new or existing ClassID */
|
|
/* */
|
|
/* NOTE: In this implementation, a class can be scoped to only one object. */
|
|
/* Not sure how it would work if it could be scoped to multiple... */
|
|
/* */
|
|
/******************************************************************************/
|
|
print 'Creating sp_InsertClass...'
|
|
|
|
|
|
IF EXISTS (select * from sysobjects where type = 'P' and name = 'sp_InsertClass')
|
|
BEGIN
|
|
drop procedure sp_InsertClass
|
|
END
|
|
go
|
|
|
|
CREATE PROCEDURE sp_InsertClass
|
|
@ClassName nvarchar(450),
|
|
@ObjectKey nvarchar(450),
|
|
@ObjectPath nvarchar(4000),
|
|
@ScopeObjID WMISQL_ID,
|
|
@ParentID WMISQL_ID,
|
|
@ClassState int = 0,
|
|
@ClassBuffer image = NULL,
|
|
@ClassFlags int = 0, /* Singleton, Abstract, etc. An optimization.*/
|
|
@InsertFlags int = 0,
|
|
@RetValue bit = 0,
|
|
@ObjectId WMISQL_ID
|
|
AS
|
|
BEGIN
|
|
set nocount on
|
|
declare @State int, @Exists bit
|
|
declare @Flags int, @OldParentID WMISQL_ID
|
|
|
|
select @Exists = 0
|
|
|
|
IF (@ObjectPath = '')
|
|
BEGIN
|
|
raiserror 99109 'Object Path cannot be blank.'
|
|
return 0
|
|
END
|
|
|
|
IF (@ClassState = 2)
|
|
BEGIN
|
|
raiserror 99106 'Invalid lock value.'
|
|
return 0
|
|
END
|
|
|
|
/* Verify the insert flags */
|
|
|
|
select @Flags = ObjectFlags, @Exists = 1
|
|
from ObjectMap where ObjectId = @ObjectId
|
|
|
|
IF (@InsertFlags & 1 = 1) /* Update only */
|
|
BEGIN
|
|
IF (@Exists = 0)
|
|
BEGIN
|
|
raiserror 99126 'Cannot update: This object does not exist.'
|
|
return 0
|
|
END
|
|
END
|
|
ELSE IF (@InsertFlags & 2 = 2) /* Create only */
|
|
BEGIN
|
|
IF (@Exists = 1)
|
|
BEGIN
|
|
raiserror 99125 'Cannot insert: This object already exists.'
|
|
return 0
|
|
END
|
|
END
|
|
|
|
IF (@ParentID = 0)
|
|
select @ParentID = 1 /* Default */
|
|
|
|
IF (@Exists = 0)
|
|
BEGIN
|
|
/* Make sure this class exists in the ObjectMap table */
|
|
insert into ObjectMap (ObjectId, ClassId, ObjectPath, ObjectKey, ObjectState, ReferenceCount, ObjectFlags,
|
|
ObjectScopeId) values
|
|
(@ObjectId, 1, @ObjectPath, @ObjectKey, @ClassState, 0, @ClassFlags, @ScopeObjID)
|
|
insert into ClassMap (ClassId, ClassName, SuperClassId, ClassBlob) values
|
|
(@ObjectId, @ClassName, @ParentID, @ClassBuffer)
|
|
IF (@InsertFlags & 8192 = 8192)
|
|
insert into AutoDelete (ObjectId) select @ObjectId
|
|
IF (@@error != 0)
|
|
BEGIN
|
|
return 0
|
|
END
|
|
END
|
|
ELSE
|
|
BEGIN
|
|
/* I guess we could update state or table name, but we don't want to.
|
|
Just make sure its marked 'Unknown' instead of 'Deleted' */
|
|
update ObjectMap set ObjectState = 0,
|
|
ObjectFlags = @ClassFlags where ObjectId = @ObjectId
|
|
and (ObjectState != 0 or ClassId != @ParentID or ObjectFlags != @ClassFlags)
|
|
IF (@@error = 0)
|
|
BEGIN
|
|
update ClassMap set SuperClassId = @ParentID, ClassBlob = @ClassBuffer
|
|
where ClassId = @ObjectId and SuperClassId != @ParentID
|
|
IF EXISTS (select * from ClassData where ObjectId = @ObjectId and ClassId = 1)
|
|
BEGIN
|
|
delete from ClassData where ObjectId = @ObjectId and ClassId = 1
|
|
END
|
|
|
|
END
|
|
END
|
|
|
|
IF (@RetValue != 0)
|
|
select 0
|
|
|
|
set nocount off
|
|
END
|
|
go
|
|
|
|
/******************************************************************************/
|
|
/* */
|
|
/* UpdateDefault */
|
|
/* */
|
|
/******************************************************************************/
|
|
|
|
print 'Creating UpdateDefault...'
|
|
|
|
IF EXISTS (select * from sysobjects where type = 'P' and name = 'UpdateDefault')
|
|
BEGIN
|
|
drop procedure UpdateDefault
|
|
END
|
|
go
|
|
|
|
CREATE PROCEDURE UpdateDefault
|
|
@ObjectId WMISQL_ID,
|
|
@ClassID WMISQL_ID,
|
|
@PropertyId int,
|
|
@PropID int,
|
|
@Value nvarchar(4000),
|
|
@StorageType int,
|
|
@Flavor int,
|
|
@Flags int,
|
|
@ExistingFlags int,
|
|
@RefClassID WMISQL_ID
|
|
AS
|
|
BEGIN
|
|
declare @FloatVal float(53), @NumVal numeric(20,0)
|
|
IF (isnull(@Value,'') = '')
|
|
BEGIN
|
|
select @FloatVal = NULL
|
|
select @NumVal = NULL
|
|
END
|
|
ELSE
|
|
BEGIN
|
|
IF (@StorageType = 2)
|
|
select @NumVal = convert(numeric(20,0), @Value)
|
|
ELSE IF (@StorageType = 3)
|
|
select @FloatVal = convert(float(53), @Value)
|
|
END
|
|
|
|
/* Otherwise, update or insert the new default */
|
|
|
|
IF (isnull(@Value,'') <> '')
|
|
BEGIN
|
|
if (@StorageType = 1 OR @StorageType = 4)
|
|
BEGIN
|
|
IF NOT EXISTS (select * from ClassData where PropertyId = @PropertyId and ObjectId = @ObjectId and QfrPos = @PropID)
|
|
insert into ClassData (ObjectId, PropertyId, ArrayPos, QfrPos, ClassId, PropertyStringValue, Flags, RefId) values
|
|
(@ObjectId, @PropertyId, 0, @PropID, @ClassID, @Value, @Flavor, @PropID)
|
|
ELSE
|
|
update ClassData set PropertyStringValue = @Value, RefId = @PropID where ObjectId = @ObjectId
|
|
and PropertyId = @PropertyId and QfrPos = @PropID and PropertyStringValue != @Value
|
|
END
|
|
ELSE IF (@StorageType = 2)
|
|
BEGIN
|
|
IF NOT EXISTS (select * from ClassData where PropertyId = @PropertyId and ObjectId = @ObjectId and QfrPos = @PropID)
|
|
insert into ClassData (ObjectId, PropertyId, ArrayPos, QfrPos, ClassId, PropertyNumericValue, Flags, RefId) values
|
|
(@ObjectId, @PropertyId, 0, @PropID, @ClassID, @NumVal, @Flavor, @PropID)
|
|
ELSE
|
|
update ClassData set PropertyNumericValue = @NumVal, RefId = @PropID where ObjectId = @ObjectId
|
|
and PropertyId = @PropertyId and QfrPos = @PropID and PropertyNumericValue != @NumVal
|
|
END
|
|
ELSE IF (@StorageType = 3)
|
|
BEGIN
|
|
IF NOT EXISTS (select * from ClassData where PropertyId = @PropertyId and ObjectId = @ObjectId and QfrPos = @PropID)
|
|
insert into ClassData (ObjectId, PropertyId, ArrayPos, QfrPos, ClassId, PropertyRealValue, Flags, RefId) values
|
|
(@ObjectId, @PropertyId, 0, @PropID, @ClassID, @FloatVal, @Flavor, @PropID)
|
|
ELSE
|
|
update ClassData set PropertyRealValue = @FloatVal, RefId = @PropID where ObjectId = @ObjectId
|
|
and PropertyId = @PropertyId and QfrPos = @PropID and PropertyRealValue != @FloatVal
|
|
END
|
|
|
|
/* If the data type was blob, we will not support a default (for now)... */
|
|
END
|
|
ELSE IF EXISTS (select * from ClassData where PropertyId = @PropertyId and ObjectId = @ClassID and QfrPos = @PropID)
|
|
BEGIN
|
|
delete from ClassData where PropertyId = @PropertyId and ObjectId = @ClassID and QfrPos = @PropID
|
|
IF ((@ExistingFlags & 12) != 0)
|
|
BEGIN
|
|
delete from IndexStringData where PropertyId = @PropertyId and ObjectId = @ClassID
|
|
delete from IndexNumericData where PropertyId = @PropertyId and ObjectId = @ClassID
|
|
delete from IndexRealData where PropertyId = @PropertyId and ObjectId = @ClassID
|
|
delete from IndexRefData where PropertyId = @PropertyId and ObjectId = @ClassID
|
|
END
|
|
END
|
|
END
|
|
go
|
|
|
|
/******************************************************************************/
|
|
/* */
|
|
/* sp_InsertClassData */
|
|
/* */
|
|
/* Description: Inserts a row of data associated with this class. */
|
|
/* */
|
|
/* Parameters: */
|
|
/* @PropertyId int the property ID, if known */
|
|
/* @ClassID int the class ID of this class */
|
|
/* @PropName nvarchar(450) the property or qualifier name */
|
|
/* @CIMType int the WMISQL_ID associated with the data type*/
|
|
/* @StorageType int the ID of the method used to store this dt */
|
|
/* @Value nvarchar(450) the default value, in text */
|
|
/* @RefClassID int the classID, if object or ref */
|
|
/* @PropID int the property ID, if prop qualifier */
|
|
/* @Flags int flags, such as Indexed, Key, etc. */
|
|
/* @Flavor int flavor, if this is a qualifier */
|
|
/* */
|
|
/* Returns: new or existing PropertyID */
|
|
/* */
|
|
/* Notes: For qualifiers, set the Qualifier flag. For methods, set the */
|
|
/* method flag. For method parameters, set In Parameter or Out */
|
|
/* Parameter flag. For property qualifiers, and method parameters, */
|
|
/* fill in the property ID and Class ID if applicable. */
|
|
/* For non-static properties, DO NOT leave Value blank. */
|
|
/* */
|
|
/******************************************************************************/
|
|
print 'Creating sp_InsertClassData...'
|
|
go
|
|
|
|
IF EXISTS (select * from sysobjects where type = 'P' and name = 'sp_InsertClassData')
|
|
BEGIN
|
|
drop procedure sp_InsertClassData
|
|
END
|
|
go
|
|
|
|
|
|
CREATE PROCEDURE sp_InsertClassData
|
|
@ClassID WMISQL_ID,
|
|
@PropName nvarchar(450),
|
|
@CIMType int,
|
|
@StorageType int,
|
|
@Value nvarchar(450) = '',
|
|
@RefClassID WMISQL_ID = 0,
|
|
@PropID int = 0,
|
|
@Flags int = 0,
|
|
@Flavor int = 0,
|
|
@PropertyId int = 0,
|
|
@IsKey bit = 0
|
|
AS
|
|
BEGIN
|
|
set nocount on
|
|
declare @ObjectId WMISQL_ID
|
|
declare @Flag int, @ExistingFlags int, @ExistingType int, @ExistingStorage int
|
|
declare @HasInstances bit
|
|
|
|
select @ObjectId = @ClassID
|
|
|
|
IF (@PropID is null)
|
|
select @PropID = 0
|
|
IF (@Flavor is null)
|
|
select @Flavor = 0
|
|
|
|
IF ((@Flags & 2) = 2)
|
|
BEGIN
|
|
select @PropertyId = PropertyId, @ExistingFlags = Flags,
|
|
@ExistingType = CIMTypeId, @ExistingStorage = StorageTypeId
|
|
from PropertyMap as p
|
|
where ClassId = 1 and
|
|
PropertyName = @PropName
|
|
|
|
select @ClassID = 1
|
|
END
|
|
ELSE
|
|
BEGIN
|
|
select @ExistingFlags = Flags, @ClassID = ClassId,
|
|
@ExistingType = CIMTypeId, @ExistingStorage = StorageTypeId
|
|
from PropertyMap as p where PropertyId = @PropertyId
|
|
END
|
|
|
|
IF (@PropertyId = 0)
|
|
BEGIN
|
|
/* If this property was overridden, we will insert the default,
|
|
but not touch the original definition. */
|
|
|
|
insert into PropertyMap (ClassId, StorageTypeId, CIMTypeId, PropertyName, Flags)
|
|
values (@ClassID, @StorageType, @CIMType, @PropName, @Flags)
|
|
select @PropertyId = @@identity
|
|
END
|
|
ELSE
|
|
BEGIN
|
|
/* If there are no instances of this property yet, we can go ahead
|
|
and update the flag types. After that, its too late. */
|
|
|
|
IF (@ExistingType != @CIMType or @ExistingFlags != @Flags)
|
|
BEGIN
|
|
/* If we have changed the data type, we need to move/validate
|
|
the data according to the rules */
|
|
|
|
IF (@CIMType != @ExistingType)
|
|
BEGIN
|
|
/* We need to move the data from one column to the other, and possibly one index table to another. */
|
|
IF (@StorageType = 3 and @ExistingStorage = 2)
|
|
BEGIN
|
|
update ClassData set
|
|
PropertyRealValue = convert(float(53),PropertyNumericValue),
|
|
PropertyNumericValue = 0
|
|
where PropertyId = @PropertyId
|
|
|
|
delete from IndexNumericData where PropertyId = @PropertyId
|
|
|
|
/* If they want an index, force it to be recreated.*/
|
|
select @ExistingFlags = ~12 & @ExistingFlags
|
|
END
|
|
END
|
|
|
|
/* If we've updated the flags to add/drop an index, make sure
|
|
we move the data.*/
|
|
|
|
IF ((@Flags & 12) = 0 AND (@ExistingFlags & 12) != 0)
|
|
BEGIN
|
|
/* We are dropping an index. Delete the index data.*/
|
|
IF (@ExistingStorage = 1)
|
|
delete from IndexStringData where PropertyId = @PropertyId
|
|
ELSE IF (@ExistingStorage = 2)
|
|
delete from IndexNumericData where PropertyId = @PropertyId
|
|
ELSE IF (@ExistingStorage= 3)
|
|
delete from IndexRealData where PropertyId = @PropertyId
|
|
ELSE IF (@ExistingStorage = 4)
|
|
delete from IndexRefData where PropertyId = @PropertyId
|
|
END
|
|
ELSE IF ((@Flags & 12) != 0 AND (@ExistingFlags & 12) = 0)
|
|
BEGIN
|
|
/* Adding an index */
|
|
IF (@ExistingStorage = 1)
|
|
insert into IndexStringData (ObjectId, PropertyId, ArrayPos, PropertyStringValue)
|
|
select ObjectId, PropertyId, ArrayPos, PropertyStringValue from ClassData
|
|
where PropertyId = @PropertyId
|
|
ELSE IF (@ExistingStorage = 2)
|
|
insert into IndexNumericData (ObjectId, PropertyId, ArrayPos, PropertyNumericValue)
|
|
select ObjectId, PropertyId, ArrayPos, PropertyNumericValue from ClassData
|
|
where PropertyId = @PropertyId
|
|
ELSE IF (@ExistingStorage = 3)
|
|
insert into IndexRealData (ObjectId, PropertyId, ArrayPos, PropertyRealValue)
|
|
select ObjectId, PropertyId, ArrayPos, PropertyRealValue from ClassData
|
|
where PropertyId = @PropertyId
|
|
ELSE IF (@ExistingStorage = 4)
|
|
insert into IndexRefData (ObjectId, PropertyId, ArrayPos, RefId)
|
|
select ObjectId, PropertyId, ArrayPos, RefId from ClassData
|
|
where PropertyId = @PropertyId
|
|
END
|
|
END
|
|
|
|
update PropertyMap set
|
|
Flags = @Flags,
|
|
CIMTypeId = @CIMType,
|
|
StorageTypeId = @StorageType
|
|
where PropertyId = @PropertyId
|
|
END
|
|
|
|
IF (@@error != 0)
|
|
BEGIN
|
|
return 0
|
|
END
|
|
|
|
if (@PropertyId is null)
|
|
BEGIN
|
|
raiserror 99111 'This property/qualifier/method has not been defined.'
|
|
return 0
|
|
END
|
|
|
|
/* If this is the top of the key hierarchy, we need to
|
|
// store it in ClassKeys and set @IsKey to TRUE
|
|
// Persist any reference class IDs as needed in ReferenceProperties.
|
|
*/
|
|
|
|
IF (@IsKey = 1)
|
|
BEGIN
|
|
IF NOT EXISTS (select * from ClassKeys where PropertyId = @PropertyId and ClassId = @ClassID)
|
|
BEGIN
|
|
insert into ClassKeys (ClassId, PropertyId) values (@ClassID, @PropertyId)
|
|
END
|
|
END
|
|
ELSE
|
|
BEGIN
|
|
IF EXISTS (select * from ClassKeys where PropertyId = @PropertyId and ClassId = @ClassID)
|
|
BEGIN
|
|
delete from ClassKeys where PropertyId = @PropertyId and ClassId = @ClassID
|
|
END
|
|
END
|
|
|
|
IF (@StorageType = 4)
|
|
BEGIN
|
|
IF (@RefClassID != 0)
|
|
BEGIN
|
|
IF NOT EXISTS (select * from ReferenceProperties where PropertyId = @PropertyId and ClassId = @ClassID)
|
|
BEGIN
|
|
insert into ReferenceProperties (ClassId, PropertyId, RefClassId) values
|
|
(@ClassID, @PropertyId, @RefClassID)
|
|
END
|
|
ELSE
|
|
BEGIN
|
|
update ReferenceProperties set RefClassId = @RefClassID
|
|
where ClassId = @ClassID and PropertyId = @PropertyId
|
|
and RefClassId != @RefClassID
|
|
END
|
|
END
|
|
ELSE IF EXISTS (select * from ReferenceProperties where PropertyId = @PropertyId and ClassId = @ClassID)
|
|
BEGIN
|
|
delete from ReferenceProperties where ClassId = @ClassID and PropertyId = @PropertyId
|
|
END
|
|
END
|
|
|
|
return @PropertyId
|
|
set nocount off
|
|
END
|
|
go
|
|
|
|
/******************************************************************************/
|
|
/* */
|
|
/* sp_RenameSubscopedObjs */
|
|
/* */
|
|
/******************************************************************************/
|
|
print 'Creating sp_RenameSubscopedObjs'
|
|
|
|
IF EXISTS (select * from sysobjects where type = 'P' and name = 'sp_RenameSubscopedObjs')
|
|
BEGIN
|
|
drop procedure sp_RenameSubscopedObjs
|
|
END
|
|
go
|
|
|
|
CREATE PROCEDURE sp_RenameSubscopedObjs
|
|
@OldPath nvarchar(4000),
|
|
@OldKey nvarchar(450),
|
|
@NewPath nvarchar(4000),
|
|
@NewKey nvarchar(450)
|
|
AS
|
|
BEGIN
|
|
/* This needs to:
|
|
* Update the key and path on all subscoped objects
|
|
* Update the reference path on all reference properties
|
|
*/
|
|
|
|
declare @OldPathLen int, @NewPathLen int, @OldKeyLen int, @NewKeyLen int
|
|
select @OldPathLen = datalength(@OldPath)/2, @OldKeyLen = datalength(@OldKey)/2
|
|
select @NewPathLen = datalength(@NewPath)/2, @NewKeyLen = datalength(@NewKey)/2
|
|
|
|
update ObjectMap set
|
|
ObjectPath = @NewPath + substring(ObjectPath, @OldPathLen+1, (datalength(ObjectPath)/2)- @OldPathLen),
|
|
ObjectKey = substring(ObjectKey, 1, charindex(@OldKey, ObjectKey)-1) +@NewKey
|
|
where ObjectPath like @OldPath + '%'
|
|
|
|
update ClassData set
|
|
PropertyStringValue = @NewPath + substring(PropertyStringValue, @OldPathLen+1,
|
|
(datalength(PropertyStringValue)/2)- @OldPathLen)
|
|
where PropertyStringValue like @OldPath + '%'
|
|
|
|
END
|
|
go
|
|
|
|
/******************************************************************************/
|
|
/* */
|
|
/* sp_EnumerateSubscopes */
|
|
/* */
|
|
/******************************************************************************/
|
|
print 'Creating sp_EnumerateSubscopes'
|
|
|
|
IF EXISTS (select * from sysobjects where type = 'P' and name = 'sp_EnumerateSubscopes')
|
|
BEGIN
|
|
drop procedure sp_EnumerateSubscopes
|
|
END
|
|
go
|
|
|
|
create table #SubScopeIds (ID numeric(20,0))
|
|
go
|
|
|
|
CREATE PROCEDURE sp_EnumerateSubscopes
|
|
@ScopeId WMISQL_ID
|
|
AS
|
|
BEGIN
|
|
truncate table #SubScopeIds
|
|
|
|
insert into #SubScopeIds (ID) select @ScopeId
|
|
/* Collect subscopes */
|
|
declare @RowCount int
|
|
insert into #SubScopeIds (ID)
|
|
select ObjectId
|
|
from ObjectMap as a where ObjectScopeId = @ScopeId
|
|
and exists (select * from ObjectMap as b
|
|
where a.ObjectId = b.ObjectScopeId)
|
|
UNION
|
|
select ContaineeId from ContainerObjs as a
|
|
where ContainerId = @ScopeId
|
|
|
|
select @RowCount = @@rowcount
|
|
while (@RowCount > 0)
|
|
BEGIN
|
|
insert into #SubScopeIds (ID)
|
|
select a.ObjectId
|
|
from ObjectMap as a
|
|
inner join #SubScopeIds as b on a.ObjectScopeId = b.ID
|
|
where exists (select * from ObjectMap as c
|
|
where a.ObjectId = c.ObjectScopeId)
|
|
and not exists (select * from #SubScopeIds as c where c.ID = a.ObjectId)
|
|
UNION
|
|
select ContaineeId from ContainerObjs as a inner join #SubScopeIds as b
|
|
on a.ContainerId = b.ID
|
|
and not exists (select * from #SubScopeIds as c where c.ID = a.ContaineeId)
|
|
|
|
select @RowCount = @@rowcount
|
|
END
|
|
END
|
|
go
|
|
|
|
drop table #SubScopeIds
|
|
go
|
|
|
|
/******************************************************************************/
|
|
/* */
|
|
/* sp_AutoDelete */
|
|
/* */
|
|
/******************************************************************************/
|
|
print 'Creating sp_AutoDelete'
|
|
|
|
IF EXISTS (select * from sysobjects where type = 'P' and name = 'sp_AutoDelete')
|
|
BEGIN
|
|
drop procedure sp_AutoDelete
|
|
END
|
|
go
|
|
|
|
CREATE PROCEDURE sp_AutoDelete
|
|
AS
|
|
BEGIN
|
|
declare @ObjectId WMISQL_ID
|
|
select @ObjectId = min(ObjectId) from AutoDelete
|
|
|
|
WHILE (@ObjectId is not null)
|
|
BEGIN
|
|
exec pDelete @ObjectId
|
|
select @ObjectId = min(ObjectId) from AutoDelete where
|
|
ObjectId > @ObjectId
|
|
END
|
|
END
|
|
go
|
|
|
|
/******************************************************************************/
|
|
/* */
|
|
/* sp_DeleteUncommittedEvents */
|
|
/* */
|
|
/******************************************************************************/
|
|
print 'Creating sp_DeleteUncommittedEvents'
|
|
|
|
IF EXISTS (select * from sysobjects where type = 'P' and name = 'sp_DeleteUncommittedEvents')
|
|
BEGIN
|
|
drop procedure sp_DeleteUncommittedEvents
|
|
END
|
|
go
|
|
|
|
CREATE PROCEDURE sp_DeleteUncommittedEvents
|
|
@GUID nvarchar(50)
|
|
AS
|
|
BEGIN
|
|
declare @Current WMISQL_ID
|
|
create table #ToDel (ObjectId numeric(20,0))
|
|
insert into #ToDel select ObjectId from IndexStringData
|
|
where PropertyId =
|
|
(select PropertyId from PropertyMap
|
|
where PropertyName = 'EventID' and ClassId =
|
|
(select ClassId from ClassMap where ClassName = '__UncommittedEvent')
|
|
)
|
|
and PropertyStringValue = @GUID
|
|
|
|
select @Current = min (ObjectId) from #ToDel
|
|
while (@Current is not null)
|
|
BEGIN
|
|
exec pDelete @Current
|
|
select @Current = min(ObjectId) from #ToDel
|
|
where ObjectId > @Current
|
|
END
|
|
END
|
|
go
|
|
|
|
|
|
/******************************************************************************/
|
|
/* */
|
|
/* sp_GetUncommittedEvents */
|
|
/* */
|
|
/******************************************************************************/
|
|
print 'Creating sp_GetUncommittedEvents'
|
|
|
|
IF EXISTS (select * from sysobjects where type = 'P' and name = 'sp_GetUncommittedEvents')
|
|
BEGIN
|
|
drop procedure sp_GetUncommittedEvents
|
|
END
|
|
go
|
|
|
|
CREATE PROCEDURE sp_GetUncommittedEvents
|
|
@GUID nvarchar(50)
|
|
AS
|
|
BEGIN
|
|
declare @ClassId WMISQL_ID, @NsProp WMISQL_ID, @TransGUIDProp WMISQL_ID
|
|
declare @ClassProp WMISQL_ID, @OldObjProp WMISQL_ID, @NewObjProp WMISQL_ID
|
|
|
|
select @ClassId = ClassId from ClassMap where ClassName = '__UncommittedEvent'
|
|
select @NsProp = PropertyId from PropertyMap where PropertyName = 'NamespaceName'
|
|
and ClassId = @ClassId
|
|
select @ClassProp = PropertyId from PropertyMap where PropertyName = 'ClassName'
|
|
and ClassId = @ClassId
|
|
select @OldObjProp = PropertyId from PropertyMap where PropertyName = 'OldObject'
|
|
and ClassId = @ClassId
|
|
select @NewObjProp = PropertyId from PropertyMap where PropertyName = 'NewObject'
|
|
and ClassId = @ClassId
|
|
select @TransGUIDProp = PropertyId from PropertyMap where PropertyName = 'TransactionGUID'
|
|
and ClassId = @ClassId
|
|
|
|
select a.ObjectId,
|
|
b.PropertyStringValue,
|
|
c.PropertyStringValue,
|
|
d.PropertyImageValue,
|
|
e.PropertyImageValue
|
|
from ObjectMap as a
|
|
inner join ClassData as b on a.ObjectId = b.ObjectId
|
|
inner join ClassData as c on a.ObjectId = c.ObjectId
|
|
inner join ClassImages as d on a.ObjectId = d.ObjectId
|
|
inner join ClassImages as e on a.ObjectId = e.ObjectId
|
|
inner join IndexStringData as f on a.ObjectId = f.ObjectId
|
|
where a.ClassId = @ClassId
|
|
and b.PropertyId = @NsProp
|
|
and c.PropertyId = @ClassProp
|
|
and d.PropertyId = @OldObjProp
|
|
and e.PropertyId = @NewObjProp
|
|
and f.PropertyId = @TransGUIDProp
|
|
and f.PropertyStringValue = @GUID
|
|
END
|
|
go
|
|
|
|
SET NOCOUNT OFF
|
|
go
|
|
|
|
if (@@error = 0)
|
|
print '*** Database created successfully!!! ***'
|
|
|
|
drop table #Parents
|
|
drop table #Children
|
|
go
|
|
|