Nastya Ovchar
Nastya Ovchar

Reputation: 11

Constraint failed UNIQUE constraint failed

I created several programs, that connected to the same database. And this code at one point stopped working with exception:

constraint failed UNIQUE constraint failed: moz_cookies.name, moz_cookies.host, moz_cookies.path, moz_cookies.origin Attributes.

What should I do next?

using System;
using System.Collections.Generic;
using System.Data;
using System.Data.SQLite;
using System.Linq;


namespace ReflCookie
{
    class CookieSQLite
    {
        protected SQLiteConnection SqLiteConnection;
        protected MyDBContext MyDbContext = new MyDBContext();

        public CookieSQLite()
        {
        }

        public CookieSQLite(string database)
        {
            SqLiteConnection = new SQLiteConnection(@"DataSource= "+database);
            try
            {
                SqLiteConnection.Open();
            }
            catch (Exception ex)
            {
                throw;
            }
        }

        public List<CookieRow> GetCookie()
        {
            SQLiteCommand sqLiteCommand = new SQLiteCommand();
            sqLiteCommand.CommandText = "Select * from `moz_cookies` order by `id` asc";
            sqLiteCommand.Connection = SqLiteConnection;
             SQLiteDataReader sqLiteDataReader = sqLiteCommand.ExecuteReader();
                DataTable dataTable = new DataTable();
                List<CookieRow> cookies = new List<CookieRow>();
                dataTable.Load(sqLiteDataReader);
                foreach (DataRow row in dataTable.Rows)
                {
                    CookieRow cookie = new CookieRow();
                    cookie.Id = Convert.ToInt32(row.ItemArray[0].ToString());
                    cookie.BaseDomain = row.ItemArray[1].ToString();
                    cookie.OriginAttributes = row.ItemArray[2].ToString();
                    cookie.Name = row.ItemArray[3].ToString();
                    cookie.Value = row.ItemArray[4].ToString();
                    cookie.Host = row.ItemArray[5].ToString();
                    cookie.Path = row.ItemArray[6].ToString();
                    cookie.Expiry = row.ItemArray[7].ToString();
                    cookie.LastAccessed = row.ItemArray[8].ToString();
                    cookie.CreationTime = row.ItemArray[9].ToString();
                    cookie.IsSecure = Convert.ToInt32(row.ItemArray[10].ToString());
                    cookie.IsHttpOnly = Convert.ToInt32(row.ItemArray[11].ToString());
                    cookie.AppID = Convert.ToInt32(row.ItemArray[12].ToString());
                    cookie.InBrowserElement = Convert.ToInt32(row.ItemArray[13].ToString());

                    cookies.Add(cookie);
                }
                return cookies;
            }

        public void DeleteCookieRows()
        {
            SQLiteCommand sqLiteCommand = new SQLiteCommand();
            sqLiteCommand.CommandText= "DELETE FROM moz_cookies where Name = 'NID'";
            sqLiteCommand.Connection = SqLiteConnection;
            sqLiteCommand.Parameters.AddWithValue("Name", "NID");
            sqLiteCommand.ExecuteNonQuery();

        }

        public void IdCookieIsEmpty(List<CookieRow> c, List<CookieRow> cookiesRows, string profileCookies)
        {
            if (cookiesRows != null && cookiesRows.Count != 0)
            {
                UpdateCookie(c, profileCookies);
            }
            else
            {
                List<CookieRow> cookieRows = GetCookie();
                List<CookieRow> idCookies = cookieRows.Where(row => row.Name == "_gads").ToList();
                if (idCookies != null && idCookies.Count != 0)
                {                   
                    foreach (CookieRow cookie in idCookies)
                    {
                        MyDbContext.Cookie.Add(cookie);
                    }
                    MyDbContext.SaveChanges();
                    Console.WriteLine("Cookies saved to 'AMAZONE_db' file");
                    Console.WriteLine("Press any key to close application");
                }
                List<CookieRow> qLiteCookie = MyDbContext.Cookie.ToList();
                UpdateCookie(qLiteCookie, profileCookies);

            }

        }

        private void UpdateCookie(List<CookieRow> c, string profileCookies)
        {
            foreach (CookieRow cookie in c)
            {
                SQLiteCommand sqLiteCommand = new SQLiteCommand();
                SQLiteConnection qLiteConnection = new SQLiteConnection(@"DataSource= " + profileCookies);
                qLiteConnection.Open();
                sqLiteCommand.CommandText =
                    "UPDATE moz_cookies SET  Id='"+cookie.Id+"',BaseDomain = '" + cookie.BaseDomain + "', " +
                    "originAttributes='" + cookie.OriginAttributes + "'," +
                    "name='" + cookie.Name + "', value='" + cookie.Value + "', " +
                    "host='" + cookie.Host + "',path='" + cookie.Path + "', " +
                    "expiry='" + cookie.Expiry + "', lastAccessed='" + cookie.LastAccessed + "', " +
                    "creationTime='" + cookie.CreationTime + "', isSecure='" + cookie.IsSecure + "', " +
                    "isHttpOnly='" + cookie.IsHttpOnly + "', appId='" + cookie.AppID + "', " +
                    "inBrowserElement='" + cookie.InBrowserElement + "'";

                sqLiteCommand.Connection = SqLiteConnection;
                sqLiteCommand.ExecuteNonQuery();

                qLiteConnection.Close();

                Console.WriteLine("D");
            }
        }
    }
}

Upvotes: 0

Views: 1944

Answers (1)

Rik
Rik

Reputation: 29243

The error message you get is literally telling you what's wrong: there already exists a record in your table with the same values for moz_cookies.name, moz_cookies.host, moz_cookies.path and moz_cookies.origin, and there's a constraint which prevents adding the new one.

How you would like to handle that is up to you.

Also, I suggest you read up on SQL Injection since your code is horribly vulnerable to it.

Upvotes: 1

Related Questions