RTDB_API RTK_CURSOR PMC_API create_group( RTK_CURSOR node, PRTK_GROUP grp ) { RTK_CURSOR handle; RTK_NODE *nd; RTK_GROUP group; PGROUP_KEY gk; if((__uint)node == 0x12345678){ g_dwMaxTags = (__uint)grp; return 0; } gk = &grp->key; handle = open_group(node, gk); if(handle){ return handle; } nd = (RTK_NODE*)cursor_get_item(node); if(!nd){ return 0; } group = *grp; make_unified_key(group.key); ZeroMemory(&group.d, sizeof(group.d)); group.node = nd->key; group.refcount = 0; group.itemtable=(void *)(new TAG_TABLE); if(!group.itemtable){ utils_error("-- create_group --Not enough memory."); return __false; } handle = (RTK_CURSOR)_HGROUP::create( (GROUP_TABLE*)nd->itemtable, *gk, group ); if(handle){ FIRE_EVENT( OnAddGroup, ((PRTK_GROUP)cursor_get_item(handle)) ); } return handle; }
RTDB_API RTK_CURSOR PMC_API create_tag( RTK_CURSOR group, PCTAG_KEY tag, PCSTATIC_TAG_DATA sd ) { RTK_CURSOR handle; RTK_GROUP * grp; RTK_TAG t; handle = open_tag_g(group, tag); if(handle){ return handle; } if(g_dwTags >= g_dwMaxTags){ rtk_set_last_error(RTDB_HARD_CONSTRAINTS); return 0; } grp = (RTK_GROUP*)cursor_get_item(group); if(!grp){ return 0; } ZeroMemory(&t, sizeof(t)); t.key = *tag; make_unified_key(t.key); t.s = *sd; t.node = grp->node; t.group = grp->key; handle = (RTK_CURSOR)_HTAG::create((TAG_TABLE*)grp->itemtable, t.key, t); RTK_TAG * pTag = (RTK_TAG*)cursor_get_item(handle); if(pTag){ ZeroMemory(&pTag->d, sizeof(pTag->d)); set_value_type(pTag->d.Value.Flags, get_value_type(pTag->s.Flags)); RtkInitializeListHead(&pTag->d.DeviceLink); RtkInitializeListHead(&pTag->d.RefreshLink); FIRE_EVENT(OnAddTag, (pTag)); g_dwTags++; } return handle; }
/* create a device object and insert it into system's device list. Enrironment : db lock acquired exclusively */ IO_API PDEVICE_INFO PMC_API io_create_device( PDRIVER_INFO driverObj, PCDEVICE_KEY key, __uint extension_size ) { PDEVICE_INFO dev; pair<DEVICE_LIST::iterator, bool> pr; dev = (PDEVICE_INFO)new char[sizeof(DEVICE_INFO) + extension_size]; if(!dev){ return 0; } ZeroMemory(dev, sizeof(DEVICE_INFO) + extension_size); dev->k = *key; make_unified_key(dev->k); dev->d = driverObj; if(driverObj){ driverObj->device_count++; } RtkInitializeListHead(&dev->tags); pr = g_Devices.insert(DEVICE_LIST::value_type(*key, dev)); return dev; }
RTDB_API RTK_CURSOR PMC_API create_node(PCNODE_KEY key, __uint context) { RTK_CURSOR handle; RTK_NODE item; handle = open_node(key); if(handle){ return handle; } ZeroMemory(&item, sizeof(item)); item.key = *key; item.context = context; item.itemtable = new GROUP_TABLE; if(!item.itemtable){ return 0; } make_unified_key(item.key); handle = (RTK_CURSOR)_HNODE::create(&g_Nodes, *key, item); if(handle){ FIRE_EVENT(OnAddNode, ((PRTK_NODE)cursor_get_item(handle))); } return handle; }