[APPHELP][APPHELP_APITEST] Update db apitests to succeed from 2k3 to 10, paving the...
[reactos.git] / reactos / dll / appcompat / apphelp / sdbapi.c
index 04a5662..38ff2da 100644 (file)
@@ -425,7 +425,7 @@ PDB WINAPI SdbOpenDatabase(LPCWSTR path, PATH_TYPE type)
     if (!db)
         return NULL;
 
     if (!db)
         return NULL;
 
-    if (major != 2)
+    if (major != 2 && major != 3)
     {
         SdbCloseDatabase(db);
         SHIM_ERR("Invalid shim database version\n");
     {
         SdbCloseDatabase(db);
         SHIM_ERR("Invalid shim database version\n");
@@ -563,6 +563,67 @@ BOOL WINAPI SdbGetDatabaseVersion(LPCWSTR database, PDWORD VersionHi, PDWORD Ver
 }
 
 
 }
 
 
+/**
+ * Find the first named child tag.
+ *
+ * @param [in]  database    The database.
+ * @param [in]  root        The tag to start at
+ * @param [in]  find        The tag type to find
+ * @param [in]  nametag     The child of 'find' that contains the name
+ * @param [in]  find_name   The name to find
+ *
+ * @return  The found tag, or TAGID_NULL on failure
+ */
+TAGID WINAPI SdbFindFirstNamedTag(PDB db, TAGID root, TAGID find, TAGID nametag, LPCWSTR find_name)
+{
+    TAGID iter;
+
+    iter = SdbFindFirstTag(db, root, find);
+
+    while (iter != TAGID_NULL)
+    {
+        TAGID tmp = SdbFindFirstTag(db, iter, nametag);
+        if (tmp != TAGID_NULL)
+        {
+            LPCWSTR name = SdbGetStringTagPtr(db, tmp);
+            if (name && !lstrcmpiW(name, find_name))
+                return iter;
+        }
+        iter = SdbFindNextTag(db, root, iter);
+    }
+    return TAGID_NULL;
+}
+
+
+/**
+ * Find a named layer in a multi-db.
+ *
+ * @param [in]  hsdb        The multi-database.
+ * @param [in]  layerName   The named tag to find.
+ *
+ * @return  The layer, or TAGREF_NULL on failure
+ */
+TAGREF WINAPI SdbGetLayerTagRef(HSDB hsdb, LPCWSTR layerName)
+{
+    PDB db = hsdb->db;
+
+    TAGID database = SdbFindFirstTag(db, TAGID_ROOT, TAG_DATABASE);
+    if (database != TAGID_NULL)
+    {
+        TAGID layer = SdbFindFirstNamedTag(db, database, TAG_LAYER, TAG_NAME, layerName);
+        if (layer != TAGID_NULL)
+        {
+            TAGREF tr;
+            if (SdbTagIDToTagRef(hsdb, db, layer, &tr))
+            {
+                return tr;
+            }
+        }
+    }
+    return TAGREF_NULL;
+}
+
+
 /**
  * Converts the specified string to an index key.
  *
 /**
  * Converts the specified string to an index key.
  *