public XmlDocument DeviceDataPostV3(String deviceId, String packageId, String companyName, String appVersion, String webOsBuildNumber, String resolution, String carrier, String webOsVersion, String deviceName, String locale)
        {
            byte[] deviceIdAsByteArray = Encoding.UTF8.GetBytes(deviceId);
            String hashId = Convert.ToBase64String(metrixHash.ComputeHash(deviceIdAsByteArray));

            var q = from p in db.MetrixGeneralDeviceDatas
                    where p.HashId == hashId && p.PackageID == packageId
                    select p;

            if (q.Count() == 0)
            {
                //generalDataTable.DeviceId = deviceId;         //Unique Id of a phone, this is not necessary a reflection of unique users since devices can be replaced but it is the closest we can get for now.
                generalDataTable.HashId = hashId;
                generalDataTable.PackageID = packageId;        //Unique name of the app
                generalDataTable.CreationTimeStamp = DateTime.Now;     //Stamped only the first time a deviceId checks in
                generalDataTable.LastUpdateTimeStamp = DateTime.Now;     //Stamped only when the appVersion changes
                generalDataTable.CompanyName = companyName;      //Company that produced the app
                generalDataTable.AppVersion = appVersion;       //Version number of the app
                generalDataTable.WebOsBuildNumber = webOsBuildNumber; //This is the build number of WebOs on the device
                generalDataTable.ScreenResolution = resolution;       //Screen resolution for the device. I.E. Pre = 320x480, Pixie = 320x400
                generalDataTable.CarrierName = carrier;          //Telephone company the phone is assigned to
                generalDataTable.WebOsVersion = webOsVersion;     //This is the version of WebOs on the device
                generalDataTable.DeviceName = deviceName;       //This is the string name for the device.
                generalDataTable.LastCheckInTimeStamp = DateTime.Now;     //This is stamped everytime the device checks in
                generalDataTable.Locale = locale;

                db.MetrixGeneralDeviceDatas.InsertOnSubmit(generalDataTable);
                db.SubmitChanges();
            }
            else //already on file just update record
            {
                generalDataTable = q.Single();

                // hit the db if something changed or we haven't checked in for 12 hours.
                if (generalDataTable.AppVersion != appVersion ||
                    generalDataTable.HashId == null ||
                    generalDataTable.CompanyName != companyName ||
                    generalDataTable.WebOsBuildNumber != webOsBuildNumber ||
                    generalDataTable.CarrierName != carrier ||
                    generalDataTable.ScreenResolution != resolution ||
                    generalDataTable.WebOsVersion != webOsVersion ||
                    generalDataTable.DeviceName != deviceName ||
                    generalDataTable.Locale != locale ||
                    generalDataTable.LastCheckInTimeStamp < DateTime.Now.AddHours(-12)
                   )
                {
                    if (generalDataTable.AppVersion != appVersion)
                    {
                        generalDataTable.LastUpdateTimeStamp = DateTime.Now;
                    }

                    if (generalDataTable.HashId == null)
                    {
                        generalDataTable.HashId = hashId;
                    }

                    generalDataTable.CompanyName = companyName;
                    generalDataTable.AppVersion = appVersion;
                    generalDataTable.WebOsBuildNumber = webOsBuildNumber;
                    generalDataTable.CarrierName = carrier;
                    generalDataTable.ScreenResolution = resolution;
                    generalDataTable.WebOsVersion = webOsVersion;
                    generalDataTable.DeviceName = deviceName;
                    generalDataTable.LastCheckInTimeStamp = DateTime.Now;
                    generalDataTable.Locale = locale;

                    db.SubmitChanges();
                }
            }

            XmlDocument xmlDoc = new XmlDocument();
            String result = "<postGeneralDataResult><creationTimestamp>" + convertToUTC(generalDataTable.CreationTimeStamp).ToString() + "</creationTimestamp><lastUpdateTimestamp>" + convertToUTC(generalDataTable.LastUpdateTimeStamp).ToString() + "</lastUpdateTimestamp></postGeneralDataResult>";
            xmlDoc.LoadXml(result);
            return xmlDoc;
        }
        public XmlDocument DeviceDataPostV4(String deviceId, String packageId, String companyName, String appVersion, String webOsBuildNumber, String resolution, String carrier, String webOsVersion, String deviceName, String locale)
        {
            byte[] deviceIdAsByteArray = Encoding.UTF8.GetBytes(deviceId);
            String hashId = Convert.ToBase64String(metrixHash.ComputeHash(deviceIdAsByteArray));

            var q = from p in db.MetrixGeneralDeviceDatas
                    where p.HashId == hashId && p.PackageID == packageId
                    select p;

            if (q.Count() == 0)
            {
                //generalDataTable.DeviceId = deviceId;         //Unique Id of a phone, this is not necessary a reflection of unique users since devices can be replaced but it is the closest we can get for now.
                generalDataTable.HashId = hashId;
                generalDataTable.PackageID = packageId;        //Unique name of the app
                generalDataTable.CreationTimeStamp = DateTime.Now;     //Stamped only the first time a deviceId checks in
                generalDataTable.LastUpdateTimeStamp = DateTime.Now;     //Stamped only when the appVersion changes
                generalDataTable.CompanyName = companyName;      //Company that produced the app
                generalDataTable.AppVersion = appVersion;       //Version number of the app
                generalDataTable.WebOsBuildNumber = webOsBuildNumber; //This is the build number of WebOs on the device
                generalDataTable.ScreenResolution = resolution;       //Screen resolution for the device. I.E. Pre = 320x480, Pixie = 320x400
                generalDataTable.CarrierName = carrier;          //Telephone company the phone is assigned to
                generalDataTable.WebOsVersion = webOsVersion;     //This is the version of WebOs on the device
                generalDataTable.DeviceName = deviceName;       //This is the string name for the device.
                generalDataTable.LastCheckInTimeStamp = DateTime.Now;     //This is stamped everytime the device checks in
                generalDataTable.Locale = locale;

                db.MetrixGeneralDeviceDatas.InsertOnSubmit(generalDataTable);
                db.SubmitChanges();
            }
            else //already on file just update record
            {
                generalDataTable = q.Single();

                // hit the db if something changed or we haven't checked in for 12 hours.
                if (generalDataTable.AppVersion != appVersion ||
                    generalDataTable.HashId == null ||
                    generalDataTable.CompanyName != companyName ||
                    generalDataTable.WebOsBuildNumber != webOsBuildNumber ||
                    generalDataTable.CarrierName != carrier ||
                    generalDataTable.ScreenResolution != resolution ||
                    generalDataTable.WebOsVersion != webOsVersion ||
                    generalDataTable.DeviceName != deviceName ||
                    generalDataTable.Locale != locale ||
                    generalDataTable.LastCheckInTimeStamp < DateTime.Now.AddHours(-12)
                   )
                {
                    if (generalDataTable.AppVersion != appVersion)
                    {
                        generalDataTable.LastUpdateTimeStamp = DateTime.Now;
                    }

                    if (generalDataTable.HashId == null)
                    {
                        generalDataTable.HashId = hashId;
                    }

                    generalDataTable.CompanyName = companyName;
                    generalDataTable.AppVersion = appVersion;
                    generalDataTable.WebOsBuildNumber = webOsBuildNumber;
                    generalDataTable.CarrierName = carrier;
                    generalDataTable.ScreenResolution = resolution;
                    generalDataTable.WebOsVersion = webOsVersion;
                    generalDataTable.DeviceName = deviceName;
                    generalDataTable.LastCheckInTimeStamp = DateTime.Now;
                    generalDataTable.Locale = locale;

                    db.SubmitChanges();
                }
            }

            MetrixDeviceInfo mdd = new MetrixDeviceInfo();
            MetrixAppStructure mas = new MetrixAppStructure();

            var mongo = MDB.Instance().GetMongo();
            var device = mongo.GetCollection<MetrixDeviceInfo>();

            if (device.Count() > 0)
                mongo.Database.DropCollection("MetrixDeviceInfo");

            device = mongo.GetCollection<MetrixDeviceInfo>();

            var qm = from p in device.AsQueryable()
                     where p.HashId == hashId
                     select p;

            if (q.Count() > 0)
            {
                mdd = qm.Single();

                var a = from p in mdd.Apps
                        where p.PackageId == packageId
                        select p;

                if (a.Count() > 0)
                {

                    mas = a.Single();

                    mas.Company = companyName;
                    mas.Creation = mas.Creation;

                    mas.LastCheckIn = DateTime.Now;

                    if (mas.AppVersion != appVersion)
                    {
                        mas.LastUpdate = DateTime.Now;
                    }
                    else
                    {
                        mas.LastUpdate = mas.LastUpdate;
                    }

                    mas.AppVersion = appVersion;
                }
                else
                {
                    if (mdd.Apps.Count() == 0)
                    {
                        mas.ID = 0;
                    }
                    else
                    {
                        mas.ID = mdd.Apps.AsQueryable().OrderByDescending(i => i.ID).First().ID + 1;
                    }

                    mas.PackageId = packageId;
                    mas.Company = companyName;
                    mas.AppVersion = appVersion;
                    mas.Creation = DateTime.Now;
                    mas.LastCheckIn = DateTime.Now;
                    mas.LastUpdate = DateTime.Now;

                    mdd.Apps.Add(mas);
                }
            }
            else
            {
                if (device.Count() == 0)
                {
                    mdd.ID = 0;
                }
                else
                {
                    mdd.ID = device.AsQueryable().OrderByDescending(i => i.ID).First().ID + 1;
                }

                mdd.HashId = hashId;
                mas.PackageId = packageId;
                mas.Company = companyName;
                mas.AppVersion = appVersion;
                mas.Creation = DateTime.Now;
                mas.LastCheckIn = DateTime.Now;
                mas.LastUpdate = DateTime.Now;

                mdd.Apps = new List<MetrixAppStructure>();
                mdd.Apps.Add(mas);
            }

            mdd.Device = deviceName;
            mdd.Carrier = carrier;
            mdd.Screen = resolution;
            mdd.Locale = locale;
            mdd.WebOsBuild = webOsBuildNumber;
            mdd.WebOsVersion = webOsVersion;

            device.Save(mdd);

            XmlDocument xmlDoc = new XmlDocument();
            String result = "<postGeneralDataResult><creationTimestamp>" + convertToUTC(generalDataTable.CreationTimeStamp).ToString() + "</creationTimestamp><lastUpdateTimestamp>" + convertToUTC(generalDataTable.LastUpdateTimeStamp).ToString() + "</lastUpdateTimestamp></postGeneralDataResult>";
            xmlDoc.LoadXml(result);
            return xmlDoc;
        }