Beispiel #1
0
        public List <SchedulerItem> ToRun()
        {
            List <SchedulerItem> returnValue = new List <SchedulerItem>();
            DataReaderConnection dr          = null;

            try
            {
                dr =
                    m_Gd.QueryData(
                        "WHERE enabled = 1 AND runs_next < '" + DateTime.UtcNow.ToString("yyyy-MM-dd HH:mm") +
                        "' ORDER BY runs_next desc", "scheduler", string.Join(", ", theFields));
                if (dr != null && dr.DataReader != null)
                {
                    while (dr.DataReader.Read())
                    {
                        returnValue.Add(LoadFromDataReader(dr.DataReader));
                    }
                }
            }
            catch
            {
            }
            finally
            {
                m_Gd.CloseDatabase(dr);
            }

            return(returnValue);
        }
        private AssetBase GetAsset(UUID uuid, bool displaywarning)
        {
            DataReaderConnection dr = null;

            try
            {
                dr = m_Gd.QueryData("where id = '" + uuid + "'", "assets",
                                    "id, name, description, assetType, local, temporary, asset_flags, creatorID, data");
                while (dr != null && dr.DataReader.Read())
                {
                    return(LoadAssetFromDataRead(dr.DataReader));
                }
                if (displaywarning)
                {
                    MainConsole.Instance.WarnFormat("[LocalAssetDatabase] GetAsset({0}) - Asset was not found.", uuid);
                }
            }
            catch (Exception e)
            {
                MainConsole.Instance.Error("[LocalAssetDatabase]: Failed to fetch asset " + uuid + ", " + e);
            }
            finally
            {
                m_Gd.CloseDatabase(dr);
            }
            return(null);
        }
Beispiel #3
0
        public virtual OSDArray GetLLSDItems(string[] fields, string[] vals)
        {
            string query = "where ";

            for (int i = 0; i < fields.Length; i++)
            {
                query += String.Format("{0} = '{1}' and ", fields[i], vals[i]);
            }
            query = query.Remove(query.Length - 5);
            using (DataReaderConnection reader = GD.QueryData(query, m_itemsrealm, "*"))
            {
                try
                {
                    return(ParseLLSDInventoryItems(reader.DataReader));
                }
                catch
                {
                }
                finally
                {
                    GD.CloseDatabase(reader);
                }
            }
            return(null);
        }
        public byte [] GetData(UUID uuid)
        {
            DataReaderConnection dr = null;

            try {
                dr = m_Gd.QueryData("where id = '" + uuid + "' LIMIT 1", "assets", "data");
                if (dr != null)
                {
                    return((byte [])dr.DataReader ["data"]);
                }
                if (MainConsole.Instance != null)
                {
                    MainConsole.Instance.WarnFormat("[LocalAssetDatabase] GetData({0}) - Asset (UUID data) was not found.", uuid);
                }
            } catch (Exception e) {
                if (MainConsole.Instance != null)
                {
                    MainConsole.Instance.Error("[LocalAssetDatabase]: Failed to fetch asset " + uuid + ", " + e);
                }
            } finally {
                if (dr != null)
                {
                    m_Gd.CloseDatabase(dr);
                }
            }

            return(null);
        }
        /// <summary>
        ///   Returns a list object of AvatarArchives. This is being used for WebUI
        /// </summary>
        /// <param name = "Public"></param>
        /// <returns></returns>
        public List <AvatarArchive> GetAvatarArchives(bool isPublic)
        {
            List <AvatarArchive> returnValue = new List <AvatarArchive>();
            DataReaderConnection RetVal      = null;

            try
            {
                RetVal = GD.QueryData("where IsPublic = 1", "avatararchives", "Name, Snapshot, IsPublic");
                while (RetVal.DataReader.Read())
                {
                    AvatarArchive Archive = new AvatarArchive
                    {
                        Name     = RetVal.DataReader["Name"].ToString(),
                        Snapshot = RetVal.DataReader["Snapshot"].ToString(),
                        IsPublic = int.Parse(RetVal.DataReader["IsPublic"].ToString())
                    };
                    returnValue.Add(Archive);
                }
            }
            catch
            {
                GD.CloseDatabase(RetVal);
            }
            return(returnValue);
        }
Beispiel #6
0
        public virtual InventoryItemBase[] GetActiveGestures(UUID principalID)
        {
            string query = String.Format("where {0} = '{1}' and {2} = '{3}'", "avatarID", principalID, "assetType",
                                         (int)AssetType.Gesture);

            using (DataReaderConnection reader = GD.QueryData(query, m_itemsrealm, "*"))
            {
                List <InventoryItemBase> items = new List <InventoryItemBase>();
                try
                {
                    items = ParseInventoryItems(reader.DataReader);
#if (!ISWIN)
                    items.RemoveAll(delegate(InventoryItemBase item)
                    {
                        return((item.Flags & 1) != 1); //1 means that it is active, so remove all ones that do not have a 1
                    });
#else
                    items.RemoveAll(
                        item => (item.Flags & 1) != 1);
#endif
                }
                catch
                {
                }
                finally
                {
                    GD.CloseDatabase(reader);
                }
                return(items.ToArray());
            }
        }
 public override void CloseDatabase(DataReaderConnection conn)
 {
     if (conn != null && conn.DataReader != null)
     {
         conn.DataReader.Close();
     }
 }
        public AssetBase GetMeta(UUID uuid)
        {
            DataReaderConnection dr = null;

            try {
                dr = m_Gd.QueryData("where id = '" + uuid + "' LIMIT 1", "assets",
                                    "id, name, description, assetType, local, temporary, asset_flags, creatorID");
                while (dr.DataReader.Read())
                {
                    return(LoadAssetFromDataRead(dr.DataReader));
                }
                if (MainConsole.Instance != null)
                {
                    MainConsole.Instance.WarnFormat("[LocalAssetDatabase] GetMeta({0}) - Asset UUID was not found.", uuid);
                }
            } catch (Exception e) {
                if (MainConsole.Instance != null)
                {
                    MainConsole.Instance.Error("[LocalAssetDatabase]: Failed to fetch asset " + uuid + ", " + e);
                }
            } finally {
                if (dr != null)
                {
                    m_Gd.CloseDatabase(dr);
                }
            }

            return(null);
        }
 public override void CloseDatabase(DataReaderConnection conn)
 {
     if (conn != null && conn.DataReader != null)
         conn.DataReader.Close();
     //Interlocked.Decrement (ref m_locked);
     //m_connection.Close();
     //m_connection.Dispose();
 }
Beispiel #10
0
        public override void FinishedMigration(IDataConnector genericData)
        {
            if (!genericData.TableExists("estates"))
            {
                return;
            }
            DataReaderConnection dr = genericData.QueryData("WHERE `Key` = 'EstateID'", "estates", "`ID`, `Key`, `Value`");

            if (dr != null)
            {
                try
                {
                    while (dr.DataReader.Read())
                    {
                        try
                        {
                            UUID        ID     = UUID.Parse(dr.DataReader["ID"].ToString());
                            string      value  = dr.DataReader["Value"].ToString();
                            QueryFilter filter = new QueryFilter();
                            filter.andFilters["`ID`"]  = value;
                            filter.andFilters["`Key`"] = "EstateSettings";
                            List <string> results = genericData.Query(new string[1] {
                                "`Value`"
                            }, "estates", filter, null, null, null);
                            if ((results != null) && (results.Count >= 1))
                            {
                                EstateSettings es = new EstateSettings();
                                es.FromOSD((OSDMap)OSDParser.DeserializeLLSDXml(results[0]));
                                genericData.Insert("estateregions", new object[] { ID, value });

                                filter = new QueryFilter();
                                filter.andFilters["`EstateID`"] = value;

                                List <string> exist = genericData.Query(new string[1] {
                                    "`EstateID`"
                                }, "estatesettings", filter, null, null, null);
                                if (exist == null || exist.Count == 0)
                                {
                                    genericData.Insert("estatesettings", new object[] { value, es.EstateName, es.EstateOwner, es.ParentEstateID, es.ToOSD() });
                                }
                            }
                        }
                        catch
                        {
                        }
                    }
                }
                catch
                {
                }
                finally
                {
                    dr.DataReader.Close();
                    genericData.CloseDatabase(dr);
                }
            }
        }
Beispiel #11
0
 public override void CloseDatabase(DataReaderConnection conn)
 {
     if (conn == null)
         return;
     if (conn.DataReader != null)
         conn.DataReader.Close();
     if (conn != null && conn.Connection != null && conn.Connection is SqliteConnection)
         ((SqliteConnection) conn.Connection).Close();
 }
 public override void CloseDatabase(DataReaderConnection conn)
 {
     if (conn != null && conn.DataReader != null)
     {
         conn.DataReader.Close();
     }
     //Interlocked.Decrement (ref m_locked);
     //m_connection.Close();
     //m_connection.Dispose();
 }
        public virtual InventoryItemBase[] GetActiveGestures(UUID principalID)
        {
            string query = string.Format("where {0} = '{1}' and {2} = '{3}'", "avatarID", principalID, "assetType",
                                         (int)AssetType.Gesture);

            using (DataReaderConnection reader = GD.QueryData(query, m_itemsrealm, "*"))
            {
                List <InventoryItemBase> items = new List <InventoryItemBase>();
                try {
                    items = ParseInventoryItems(reader.DataReader);
                    items.RemoveAll(
                        item => (item.Flags & 1) != 1);
                } catch {
                } finally {
                    GD.CloseDatabase(reader);
                }

                return(items.ToArray());
            }
        }
Beispiel #14
0
        public virtual List <InventoryItemBase> GetItems(UUID avatarID, string[] fields, string[] vals)
        {
            string query = "where ";

            for (int i = 0; i < fields.Length; i++)
            {
                query += string.Format("{0} = '{1}' and ", fields[i], vals[i]);
            }

            query = query.Remove(query.Length - 5);
            using (DataReaderConnection reader = m_GD.QueryData(query, m_itemsrealm, "*"))
            {
                try {
                    return(ParseInventoryItems(reader.DataReader));
                } catch {
                } finally {
                    m_GD.CloseDatabase(reader);
                }
            }
            return(new List <InventoryItemBase>());
        }
Beispiel #15
0
 public abstract void CloseDatabase(DataReaderConnection connection);
 public abstract void CloseDatabase(DataReaderConnection connection);
Beispiel #17
0
        public virtual byte[] FetchInventoryReply(OSDArray fetchRequest, UUID AgentID, UUID forceOwnerID,
                                                  UUID libraryOwnerID)
        {
            LLSDSerializationDictionary contents = new LLSDSerializationDictionary();

            contents.WriteStartMap("llsd");      //Start llsd

            contents.WriteKey("folders");        //Start array items
            contents.WriteStartArray("folders"); //Start array folders

            foreach (OSD m in fetchRequest)
            {
                contents.WriteStartMap("internalContents"); //Start internalContents kvp
                OSDMap invFetch = (OSDMap)m;

                UUID owner_id      = invFetch["owner_id"].AsUUID();
                UUID folder_id     = invFetch["folder_id"].AsUUID();
                bool fetch_folders = invFetch["fetch_folders"].AsBoolean();
                bool fetch_items   = invFetch["fetch_items"].AsBoolean();

                //Set the normal stuff
                contents["agent_id"]  = AgentID;
                contents["owner_id"]  = owner_id;
                contents["folder_id"] = folder_id;

                int    count = 0;
                string query = "";

                if (fetch_items)
                {
                    contents.WriteKey("items"); //Start array items
                    contents.WriteStartArray("items");
                    List <UUID> moreLinkedItems = new List <UUID>();
                    bool        addToCount      = true;
                    query = String.Format("where {0} = '{1}'", "parentFolderID", folder_id);
redoQuery:
                    using (DataReaderConnection retVal = GD.QueryData(query, m_itemsrealm, "*"))
                    {
                        try
                        {
                            while (retVal.DataReader.Read())
                            {
                                contents.WriteStartMap("item"); //Start item kvp
                                UUID assetID = UUID.Parse(retVal.DataReader["assetID"].ToString());
                                contents["asset_id"] = assetID;
                                contents["name"]     = retVal.DataReader["inventoryName"].ToString();
                                contents["desc"]     = retVal.DataReader["inventoryDescription"].ToString();


                                contents.WriteKey("permissions"); //Start permissions kvp
                                contents.WriteStartMap("permissions");
                                contents["group_id"]       = UUID.Parse(retVal.DataReader["groupID"].ToString());
                                contents["is_owner_group"] = int.Parse(retVal.DataReader["groupOwned"].ToString()) == 1;
                                contents["group_mask"]     =
                                    uint.Parse(retVal.DataReader["inventoryGroupPermissions"].ToString());
                                contents["owner_id"] = forceOwnerID == UUID.Zero
                                                           ? UUID.Parse(retVal.DataReader["avatarID"].ToString())
                                                           : forceOwnerID;
                                contents["last_owner_id"]   = UUID.Parse(retVal.DataReader["avatarID"].ToString());
                                contents["next_owner_mask"] =
                                    uint.Parse(retVal.DataReader["inventoryNextPermissions"].ToString());
                                contents["owner_mask"] =
                                    uint.Parse(retVal.DataReader["inventoryCurrentPermissions"].ToString());
                                UUID creator;
                                if (UUID.TryParse(retVal.DataReader["creatorID"].ToString(), out creator))
                                {
                                    contents["creator_id"] = creator;
                                }
                                else
                                {
                                    contents["creator_id"] = UUID.Zero;
                                }
                                contents["base_mask"] =
                                    uint.Parse(retVal.DataReader["inventoryBasePermissions"].ToString());
                                contents["everyone_mask"] =
                                    uint.Parse(retVal.DataReader["inventoryEveryOnePermissions"].ToString());
                                contents.WriteEndMap(/*Permissions*/);

                                contents.WriteKey("sale_info");      //Start permissions kvp
                                contents.WriteStartMap("sale_info"); //Start sale_info kvp
                                contents["sale_price"] = int.Parse(retVal.DataReader["salePrice"].ToString());
                                switch (byte.Parse(retVal.DataReader["saleType"].ToString()))
                                {
                                default:
                                    contents["sale_type"] = "not";
                                    break;

                                case 1:
                                    contents["sale_type"] = "original";
                                    break;

                                case 2:
                                    contents["sale_type"] = "copy";
                                    break;

                                case 3:
                                    contents["sale_type"] = "contents";
                                    break;
                                }
                                contents.WriteEndMap(/*sale_info*/);


                                contents["created_at"] = int.Parse(retVal.DataReader["creationDate"].ToString());
                                contents["flags"]      = uint.Parse(retVal.DataReader["flags"].ToString());
                                UUID inventoryID = UUID.Parse(retVal.DataReader["inventoryID"].ToString());
                                contents["item_id"]   = inventoryID;
                                contents["parent_id"] = UUID.Parse(retVal.DataReader["parentFolderID"].ToString());
                                UUID avatarID = forceOwnerID == UUID.Zero
                                                    ? UUID.Parse(retVal.DataReader["avatarID"].ToString())
                                                    : forceOwnerID;
                                contents["agent_id"] = avatarID;

                                AssetType assetType = (AssetType)int.Parse(retVal.DataReader["assetType"].ToString());
                                if (assetType == AssetType.Link)
                                {
                                    moreLinkedItems.Add(assetID);
                                }
                                if (assetType == AssetType.Unknown)
                                {
                                    assetType = AssetType.Link;
                                }
                                contents["type"] =
                                    Utils.AssetTypeToString((AssetType)Util.CheckMeshType((sbyte)assetType));
                                InventoryType invType =
                                    (InventoryType)int.Parse(retVal.DataReader["invType"].ToString());
                                contents["inv_type"] = Utils.InventoryTypeToString(invType);

                                if ((int)invType == -1)
                                {
                                    //Asset problem, fix it, it's supposed to be 0
                                    List <InventoryItemBase> itms = GetItems(AgentID,
                                                                             new string[2] {
                                        "inventoryID", "avatarID"
                                    },
                                                                             new string[2]
                                    {
                                        inventoryID.ToString(),
                                        avatarID.ToString()
                                    });
                                    itms[0].InvType = 0;
                                    StoreItem(itms[0]);
                                }

                                if (addToCount)
                                {
                                    count++;
                                }
                                contents.WriteEndMap(/*"item"*/);  //end array items
                            }
                        }
                        catch
                        {
                        }
                        finally
                        {
                            GD.CloseDatabase(retVal);
                        }
                    }
                    if (moreLinkedItems.Count > 0)
                    {
                        addToCount = false;
                        query      = "where (";

                        query = moreLinkedItems.Aggregate(query,
                                                          (current, t) =>
                                                          current + String.Format("{0} = '{1}' or ", "inventoryID", t));

                        query  = query.Remove(query.Length - 4, 4);
                        query += ")";
                        moreLinkedItems.Clear();
                        goto redoQuery;
                    }
                    contents.WriteEndArray();           //end array items
                }
                contents.WriteStartArray("categories"); //We don't send any folders
                int         version = 0;
                QueryFilter filter  = new QueryFilter();
                filter.andFilters["folderID"] = folder_id;
                List <string> versionRetVal = GD.Query(new[]
                {
                    "version",
                    "type"
                }, m_foldersrealm, filter, null, null, null);

                if (versionRetVal.Count > 0)
                {
                    version = int.Parse(versionRetVal[0]);

                    if (fetch_folders)
                    {
                        if (int.Parse(versionRetVal[1]) == (int)AssetType.TrashFolder ||
                            int.Parse(versionRetVal[1]) == (int)AssetType.CurrentOutfitFolder ||
                            int.Parse(versionRetVal[1]) == (int)AssetType.LinkFolder)
                        {
                            //If it is the trash folder, we need to send its descendents, because the viewer wants it
                            query = String.Format("where {0} = '{1}' and {2} = '{3}'", "parentFolderID", folder_id,
                                                  "agentID", AgentID);
                            using (DataReaderConnection retVal = GD.QueryData(query, m_foldersrealm, "*"))
                            {
                                try
                                {
                                    while (retVal.DataReader.Read())
                                    {
                                        contents.WriteStartMap("folder"); //Start item kvp
                                        contents["folder_id"] = UUID.Parse(retVal.DataReader["folderID"].ToString());
                                        contents["parent_id"] =
                                            UUID.Parse(retVal.DataReader["parentFolderID"].ToString());
                                        contents["name"] = retVal.DataReader["folderName"].ToString();
                                        int type = int.Parse(retVal.DataReader["type"].ToString());
                                        contents["type"]           = type;
                                        contents["preferred_type"] = type;

                                        count++;
                                        contents.WriteEndMap(); //end array items
                                    }
                                }
                                catch
                                {
                                }
                                finally
                                {
                                    GD.CloseDatabase(retVal);
                                }
                            }
                        }
                    }
                }

                contents.WriteEndArray();
                contents["descendents"] = count;
                contents["version"]     = version;

                //Now add it to the folder array
                contents.WriteEndMap(); //end array internalContents
            }

            contents.WriteEndArray(); //end array folders
            contents.WriteEndMap();   //end llsd

            try
            {
                return(contents.GetSerializer());
            }
            finally
            {
                contents = null;
            }
        }
        public override byte[] FetchInventoryReply(OSDArray fetchRequest, UUID AgentID, UUID forceOwnerID, UUID libraryOwnerID)
        {
            LLSDSerializationDictionary contents = new LLSDSerializationDictionary();

            contents.WriteStartMap("llsd");      //Start llsd

            contents.WriteKey("folders");        //Start array items
            contents.WriteStartArray("folders"); //Start array folders

            foreach (OSD m in fetchRequest)
            {
                contents.WriteStartMap("internalContents"); //Start internalContents kvp
                OSDMap invFetch = (OSDMap)m;

                //UUID agent_id = invFetch["agent_id"].AsUUID();
                UUID owner_id      = invFetch["owner_id"].AsUUID();
                UUID folder_id     = invFetch["folder_id"].AsUUID();
                bool fetch_folders = invFetch["fetch_folders"].AsBoolean();
                bool fetch_items   = invFetch["fetch_items"].AsBoolean();
                int  sort_order    = invFetch["sort_order"].AsInteger();

                //Set the normal stuff
                contents["agent_id"]  = forceOwnerID == UUID.Zero ? owner_id : forceOwnerID;
                contents["owner_id"]  = forceOwnerID == UUID.Zero ? owner_id : forceOwnerID;
                contents["folder_id"] = folder_id;

                contents.WriteKey("items"); //Start array items
                contents.WriteStartArray("items");
                List <UUID> moreLinkedItems = new List <UUID>();
                int         count           = 0;
                bool        addToCount      = true;
                string      invServer       = "";
                bool        isForeign       = GetIsForeign(AgentID, "InventoryServerURI", m_registry, out invServer);
                IDataReader fretVal         = null;
                if (isForeign)
                {
                    fretVal = GetForeignInventory(AgentID, folder_id, invServer);
                }
                string query = String.Format("where {0} = '{1}'", "parentFolderID", folder_id,
                                             "avatarID", AgentID, "avatarID", libraryOwnerID);
redoQuery:
                using (DataReaderConnection retVal = isForeign ? new DataReaderConnection()
                {
                    DataReader = fretVal
                } : GD.QueryData(query, m_itemsrealm, "*"))
                {
                    try
                    {
                        while (retVal.DataReader.Read())
                        {
                            contents.WriteStartMap("item"); //Start item kvp
                            UUID assetID = UUID.Parse(retVal.DataReader["assetID"].ToString());
                            contents["asset_id"] = assetID;
                            contents["name"]     = retVal.DataReader["inventoryName"].ToString();
                            contents["desc"]     = retVal.DataReader["inventoryDescription"].ToString();


                            contents.WriteKey("permissions"); //Start permissions kvp
                            contents.WriteStartMap("permissions");
                            contents["group_id"]       = UUID.Parse(retVal.DataReader["groupID"].ToString());
                            contents["is_owner_group"] = int.Parse(retVal.DataReader["groupOwned"].ToString()) == 1;
                            contents["group_mask"]     = uint.Parse(retVal.DataReader["inventoryGroupPermissions"].ToString());
                            contents["owner_id"]       = forceOwnerID == UUID.Zero
                                                       ? UUID.Parse(retVal.DataReader["avatarID"].ToString())
                                                       : forceOwnerID;
                            contents["last_owner_id"]   = UUID.Parse(retVal.DataReader["avatarID"].ToString());
                            contents["next_owner_mask"] = uint.Parse(retVal.DataReader["inventoryNextPermissions"].ToString());
                            contents["owner_mask"]      = uint.Parse(retVal.DataReader["inventoryCurrentPermissions"].ToString());
                            UUID creator;
                            if (UUID.TryParse(retVal.DataReader["creatorID"].ToString(), out creator))
                            {
                                contents["creator_id"] = creator;
                            }
                            else
                            {
                                contents["creator_id"] = UUID.Zero;
                            }
                            contents["base_mask"]     = uint.Parse(retVal.DataReader["inventoryBasePermissions"].ToString());
                            contents["everyone_mask"] = uint.Parse(retVal.DataReader["inventoryEveryOnePermissions"].ToString());
                            contents.WriteEndMap(/*Permissions*/);

                            contents.WriteKey("sale_info");      //Start permissions kvp
                            contents.WriteStartMap("sale_info"); //Start sale_info kvp
                            contents["sale_price"] = int.Parse(retVal.DataReader["salePrice"].ToString());
                            switch (byte.Parse(retVal.DataReader["saleType"].ToString()))
                            {
                            default:
                                contents["sale_type"] = "not";
                                break;

                            case 1:
                                contents["sale_type"] = "original";
                                break;

                            case 2:
                                contents["sale_type"] = "copy";
                                break;

                            case 3:
                                contents["sale_type"] = "contents";
                                break;
                            }
                            contents.WriteEndMap(/*sale_info*/);


                            contents["created_at"] = int.Parse(retVal.DataReader["creationDate"].ToString());
                            contents["flags"]      = uint.Parse(retVal.DataReader["flags"].ToString());
                            UUID inventoryID = UUID.Parse(retVal.DataReader["inventoryID"].ToString());
                            contents["item_id"]   = inventoryID;
                            contents["parent_id"] = UUID.Parse(retVal.DataReader["parentFolderID"].ToString());
                            UUID avatarID = forceOwnerID == UUID.Zero
                                                ? UUID.Parse(retVal.DataReader["avatarID"].ToString())
                                                : forceOwnerID;
                            contents["agent_id"] = avatarID;

                            AssetType assetType = (AssetType)int.Parse(retVal.DataReader["assetType"].ToString());
                            if (assetType == AssetType.Link)
                            {
                                moreLinkedItems.Add(assetID);
                            }
                            contents["type"] = Utils.AssetTypeToString(assetType);
                            InventoryType invType = (InventoryType)int.Parse(retVal.DataReader["invType"].ToString());
                            contents["inv_type"] = Utils.InventoryTypeToString(invType);

                            if (addToCount)
                            {
                                count++;
                            }
                            contents.WriteEndMap(/*"item"*/);  //end array items
                        }
                    }
                    catch
                    {
                    }
                    finally
                    {
                        GD.CloseDatabase(retVal);
                    }
                }
                if (moreLinkedItems.Count > 0)
                {
                    addToCount = false;
                    query      = String.Format("where {0} = '{1}' and (", "avatarID", AgentID);
#if (!ISWIN)
                    foreach (UUID item in moreLinkedItems)
                    {
                        query = query + String.Format("{0} = '{1}' or ", "inventoryID", item);
                    }
#else
                    query = moreLinkedItems.Aggregate(query, (current, t) => current + String.Format("{0} = '{1}' or ", "inventoryID", t));
#endif
                    query  = query.Remove(query.Length - 4, 4);
                    query += ")";
                    if (isForeign)
                    {
                        fretVal = new FakeDataReader();
                        IConfigurationService configService = m_registry.RequestModuleInterface <IConfigurationService>();
                        if (invServer == "" && configService != null)
                        {
                            List <string> urls = configService.FindValueOf("InventoryServerURI");
                            if (urls.Count > 0)
                            {
                                invServer = urls[0];
                            }
                            else
                            {
                                return(null);
                            }
                        }
                        XInventoryServicesConnector xinv = new XInventoryServicesConnector(invServer + "xinventory");
                        foreach (UUID t in moreLinkedItems)
                        {
                            ((FakeDataReader)fretVal).items.Add(xinv.GetItem(new InventoryItemBase(t)));
                        }
                    }
                    moreLinkedItems.Clear();
                    goto redoQuery;
                }
                contents.WriteEndArray(/*"items"*/);    //end array items

                contents.WriteStartArray("categories"); //We don't send any folders
                int         version = 0;
                QueryFilter filter  = new QueryFilter();
                filter.andFilters["folderID"] = folder_id;
                List <string> versionRetVal = GD.Query(new string[2] {
                    "version", "type"
                }, m_foldersrealm, filter, null, null, null);
                List <InventoryFolderBase> foldersToAdd = new List <InventoryFolderBase>();
                if (versionRetVal.Count > 0)
                {
                    version = int.Parse(versionRetVal[0]);
                    if (int.Parse(versionRetVal[1]) == (int)AssetType.TrashFolder ||
                        int.Parse(versionRetVal[1]) == (int)AssetType.CurrentOutfitFolder ||
                        int.Parse(versionRetVal[1]) == (int)AssetType.LinkFolder)
                    {
                        //If it is the trash folder, we need to send its descendents, because the viewer wants it
                        query = String.Format("where {0} = '{1}' and {2} = '{3}'", "parentFolderID", folder_id,
                                              "agentID", AgentID);
                        using (DataReaderConnection retVal = GD.QueryData(query, m_foldersrealm, "*"))
                        {
                            try
                            {
                                while (retVal.DataReader.Read())
                                {
                                    contents.WriteStartMap("folder"); //Start item kvp
                                    contents["folder_id"] = UUID.Parse(retVal.DataReader["folderID"].ToString());
                                    contents["parent_id"] = UUID.Parse(retVal.DataReader["parentFolderID"].ToString());
                                    contents["name"]      = retVal.DataReader["folderName"].ToString();
                                    int type = int.Parse(retVal.DataReader["type"].ToString());
                                    contents["type"]           = type;
                                    contents["preferred_type"] = type;

                                    count++;
                                    contents.WriteEndMap(/*"folder"*/);  //end array items
                                }
                            }
                            catch
                            {
                            }
                            finally
                            {
                                GD.CloseDatabase(retVal);
                            }
                        }
                    }
                }

                contents.WriteEndArray(/*"categories"*/);
                contents["descendents"] = count;
                contents["version"]     = version;

                //Now add it to the folder array
                contents.WriteEndMap(); //end array internalContents
            }

            contents.WriteEndArray();         //end array folders
            contents.WriteEndMap(/*"llsd"*/); //end llsd

            try
            {
                return(contents.GetSerializer());
            }
            finally
            {
                contents = null;
            }
        }
 public override void CloseDatabase(DataReaderConnection connection)
 {
     if (connection != null) {                 
         connection.Dispose ();
     }
 }