Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Database file locked error while reading chrome history c#

I am developing an application, which requires chrome browser history. I have written a C# code for fetching the history. However there are two issues in my code which I am unable to figure out.

  1. There is this warning.

Warning 1 There was a mismatch between the processor architecture of the project being built "MSIL" and the processor architecture of the reference "System.Data.SQLite", "AMD64". This mismatch may cause runtime failures. Please consider changing the targeted processor architecture of your project through the Configuration Manager so as to align the processor architectures between your project and references, or take a dependency on references with a processor architecture that matches the targeted processor architecture of your project. ChromeData

  1. There is this error

SQLite error (5): database is locked

I tried closing the browser, but still there is this error. However, when I created a copy of History file and renamed it, gave its path instead of History, the program was working and it could read the file and fetch the data. I am unable to figure it out where the error is. So, please help. I am posting my 3 class files.

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

namespace ChromeData
{
    class GoogleChrome
    {
    public List<URL> Urls = new List<URL>();
    public IEnumerable<URL> GetHistory()
    {
        string DocumentsFolder = Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData);
        //Console.WriteLine(DocumentsFolder);
        string[] tempstr = DocumentsFolder.Split('\\');
        foreach(string s in tempstr)
        {
            Console.WriteLine(s);
        }
        string tempstr1 = "";
        DocumentsFolder += "\\Google\\Chrome\\User Data\\Default";
        if(tempstr[tempstr.Length-1] != "Local")
        {
            for(int i =0; i<tempstr.Length-1;i++)
            {
                tempstr1 += tempstr[i] + "\\";
            }
            DocumentsFolder = tempstr1 + "Local\\Google\\Chrome\\User Data\\Default";
        }
        Console.WriteLine(DocumentsFolder);
        if(Directory.Exists(DocumentsFolder))
        {
            return ExtractUserHistory(DocumentsFolder);
        }
        return null;
    }

    public IEnumerable<URL> ExtractUserHistory(string folder)
    {
        DataTable HistoryData = ExtractFromTable("urls", folder);

        foreach(DataRow row in HistoryData.Rows)
        {
            string url = row["url"].ToString();
            string title = row["title"].ToString();

            URL u = new URL(url.Replace('\'',' '), title.Replace('\'',' '), "Google Chrome");
            Urls.Add(u);
        }

        return Urls;
    }

    DataTable ExtractFromTable(string table, string folder)
    {
        SQLiteConnection sql_con;
        SQLiteDataAdapter DB;
        SQLiteCommand sql_cmd;
        string dbpath = folder + "\\History";

        DataTable DT = new DataTable();

        if(File.Exists(dbpath))
        {
            try
            {
                sql_con = new SQLiteConnection("Data Source=" + dbpath + ";Version=3;New=False;Compress=True;");

                sql_con.Open();
                sql_cmd = sql_con.CreateCommand();

                string CommandText = "select * from " + table;

                DB = new SQLiteDataAdapter(CommandText, sql_con);

                DB.Fill(DT);
                sql_con.Close();

            }
            catch(Exception e)
            {
                TextWriter errorWriter = Console.Error;
                errorWriter.WriteLine(e.Message);
            }
        }
        return DT;
    }
}


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;

namespace ChromeData
{
    class TestClass
    {
    public static List<URL> Urls = new List<URL>();

    public static void Main()
    {
        string path = @"C:\Users\Public\Desktop\history.txt";
        GoogleChrome g = new GoogleChrome();
        Urls = (List<URL>)g.GetHistory();

        using(StreamWriter sw = File.CreateText(path))
        {
            foreach(URL u in Urls)
            {
                sw.WriteLine(u.url);
            }
        }

        Console.ReadLine();
    }
}


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ChromeData
{
    class URL
    {
    public string url;
    public string title;
    public string browser;

    public URL(string url,string title,string browser)
    {
        this.browser = browser;
        this.title = title;
        this.url = url;
    }


}
like image 906
Vineel Avatar asked Jun 11 '15 06:06

Vineel


2 Answers

One solution is to copy the file to a temporary location and read it from there.

string source = @"C:\Users\{USERNAME}\AppData\Local\Google\Chrome\User Data\Default\History";
string target = @"C:\Temp\History";

if (File.Exists(target))
{
    File.Delete(target);
}

File.Copy(source, target);

string cs = @"Data Source=" + target;
string sql = "Select * From urls";

using (SQLiteConnection c = new SQLiteConnection(cs))
{
    c.Open();
    using (SQLiteCommand cmd = new SQLiteCommand(sql, c))
    {
        using (SQLiteDataReader rdr = cmd.ExecuteReader())
        {
            while (rdr.Read())
            {
                Console.WriteLine(rdr[1].ToString());
            }
        }
    }
}
like image 102
Valamas Avatar answered Sep 28 '22 02:09

Valamas


I've found chrome.exe will continue running, and holding the lock, despite exiting the browser as normal.

taskkill.exe /IM chrome.exe /F 

This will shut down Chrome, with an added bonus of having a 'restore tabs' button upon restart by the user. Restore tabs is available because you killed forcefully.

like image 45
Alex Schittko Avatar answered Sep 28 '22 02:09

Alex Schittko