Skip to main content

databaselink - How to update bundled SQLite library (or driver?) in V10 for OS X


I've been using undocumented Database functions with Mathematica V9 to acces my SQLite database, which is a Firefox-generated database that contains cookies.


db = Database`OpenDatabase[
"/Users/username/Library/Application Support/Firefox/Profiles/sjk6e588.default/cookies.sqlite"];
Database`QueryDatabase[db, "SELECT sqlite_version();"]


{{"3.8.6"}}



In order for this to work, I had to manually replace the outdated libsqlite3.dylib, which is located at



/Applications/Mathematica9.app/SystemFiles/Kernel/Binaries/MacOSX-x86-64/libsqlite3.dylib

otherwise Mathematica could not read the database. Now in V10 the undocumented Database functions no longer work, but instead there are new functions available to work with databases. The new code looks like this:


Needs["DatabaseLink`"];
db = OpenSQLConnection[JDBC["SQLite",
"/Users/username/Library/Application Support/Firefox/Profiles/sjk6e588.default/cookies.sqlite"]];
SQLExecute[db, "SELECT sqlite_version();"]


{{"3.6.23.1"}}




As you can see the bundled SQLite library is still outdated and does not work with this database. I tried replacing the libsqlite3.dylib file, which is now located at


/Applications/Mathematica.app/SystemFiles/Libraries/MacOSX-x86-64/libsqlite3.0.dylib

but Mathematica apparently ignores it and still uses the outdated library.


How can I update the SQLite library (or driver) so I can work with this database?



Answer



Mathematica 10 ships with version 3.7.2 of the Xerial SQLite JDBC driver. Let me first verify your findings.


SQLiteVersion[] := Module[{v, c = OpenSQLConnection[JDBC["SQLite(Memory)", ""]]},
v = First@First@SQLExecute[c, "SELECT sqlite_version();"];

CloseSQLConnection[c];
v
];
SQLiteVersion[]


3.6.23.1



There are a few SQLite databases in that profiles directory:


$dir = "/Users/dillont/Library/Application Support/Firefox/Profiles/2bd5ni53.default";

dbs = FileNames[{"*.sqlite"}, $dir];
dbNames = FileBaseName /@ dbs


{"addons", "content-prefs", "cookies", "extensions", "formhistory", "healthreport", "permissions", "places", "signons", "webappsstore"}



Try opening connections to each of these:


connAssoc = AssociationThread[dbNames, OpenSQLConnection[JDBC["SQLite", #]] & /@ dbs];
readable = SQLConnectionUsableQ[#, {"SELECT name FROM sqlite_master WHERE type='table';",
{{_String} ..}}] & /@ connAssoc



<|addons->True,content-prefs->True,cookies->False,extensions->True,formhistory->True,healthreport->False,permissions->True,places->False,signons->True,webappsstore->False|>



Four of them don't work (including the cookies database). Probably they were added to the application more recently. Note here I've used the two-argument form of SQLConnectionUsableQ to supply my own test. This is because the newer database will happily answer older drivers issuing the trivial query used by the default test (typically something like SELECT 1), but it won't actually let you look at any tables.


I'll close these connections and then try the newer driver.


CloseSQLConnection /@ Keys[connAssoc];

The procedure here will be like adding a driver for any unbundled database, like Oracle (documentation; see especially the section on JDBC Connections). The short version is, I'm going to download a jar and put it on the classpath.


A new release of the SQLite JDBC driver dropped a few hours before this writing. There are a bunch of places I could put it; a reasonable choice is $UserBaseDirectory/Applications/SQLite/Java/. I do that.



I can now restart my Mathematica session, or just restart Java:


<< JLink`;
ReinstallJava[];

If you wear a belt and suspenders, verify that the new driver is taking precedence over the old one on the classpath:


Flatten@StringCases[JavaClassPath[], ___ ~~ "sqlite" ~~ ___]


{"/Users/dillont/Library/Mathematica/Applications/SQLite/Java/sqlite-jdbc-3.8.6.jar", "/Applications/Mathematica.app/SystemFiles/Links/DatabaseLink/Java/sqlite-jdbc-3.7.2.jar"}




And the version should have incremented:


SQLiteVersion[]


3.8.6



The installation looks good. Try opening and testing the connections again:


connAssoc = AssociationThread[dbNames, OpenSQLConnection[JDBC["SQLite", #]] & /@ dbs];
readable = SQLConnectionUsableQ[#, {"SELECT name FROM sqlite_master WHERE type='table';",
{{_String} ..}}] & /@ connAssoc



<|addons->True,content-prefs->True,cookies->True,extensions->True, formhistory->True,healthreport->True,permissions->True,places->True, signons->True,webappsstore->True|>



Better. Try getting some data out of the cookies database:


SQLTables[connAssoc["cookies"]]


{SQLTable[moz_cookies, TableType->TABLE]}




SQLColumns[connAssoc["cookies"], "moz_cookies"][[All, 1]][[All, -1]]


{id,baseDomain,appId,inBrowserElement,name,value,host,path,expiry,lastAccessed, creationTime,isSecure,isHttpOnly}



SQLSelect[connAssoc["cookies"], "moz_cookies", {"id", "baseDomain", "name", "value", "expiry"}, "MaxRows"->5, "ShowColumnHeadings"->True]


{{id,baseDomain,name,value,expiry},{95,imrworldwide.com,V5,AStfNzpEBSg7EhozMRwjIyotCRsYAVInHlJJJQ__,1424978712},{96,imrworldwide.com,IMRID,US0MGYpsGysAACYAtzc,1424978712},{100,thedailybeast.com,_lsd0,17bbb925-5480-41e3-bd6c-f402972b2903,1514834714},{102,erovinmo.com,_lsx0,3f60d7b6-804a-11e2-865d-d3726fca0c4b,1519673114},{103,wunderground.com,DT,1361906715:18788:365-v5,1577836799}}




CloseSQLConnection /@ Keys[connAssoc];

Comments

Popular posts from this blog

functions - Get leading series expansion term?

Given a function f[x] , I would like to have a function leadingSeries that returns just the leading term in the series around x=0 . For example: leadingSeries[(1/x + 2)/(4 + 1/x^2 + x)] x and leadingSeries[(1/x + 2 + (1 - 1/x^3)/4)/(4 + x)] -(1/(16 x^3)) Is there such a function in Mathematica? Or maybe one can implement it efficiently? EDIT I finally went with the following implementation, based on Carl Woll 's answer: lds[ex_,x_]:=( (ex/.x->(x+O[x]^2))/.SeriesData[U_,Z_,L_List,Mi_,Ma_,De_]:>SeriesData[U,Z,{L[[1]]},Mi,Mi+1,De]//Quiet//Normal) The advantage is, that this one also properly works with functions whose leading term is a constant: lds[Exp[x],x] 1 Answer Update 1 Updated to eliminate SeriesData and to not return additional terms Perhaps you could use: leadingSeries[expr_, x_] := Normal[expr /. x->(x+O[x]^2) /. a_List :> Take[a, 1]] Then for your examples: leadingSeries[(1/x + 2)/(4 + 1/x^2 + x), x] leadingSeries[Exp[x], x] leadingSeries[(1/x + 2 + (1 - 1/x...

How to thread a list

I have data in format data = {{a1, a2}, {b1, b2}, {c1, c2}, {d1, d2}} Tableform: I want to thread it to : tdata = {{{a1, b1}, {a2, b2}}, {{a1, c1}, {a2, c2}}, {{a1, d1}, {a2, d2}}} Tableform: And I would like to do better then pseudofunction[n_] := Transpose[{data2[[1]], data2[[n]]}]; SetAttributes[pseudofunction, Listable]; Range[2, 4] // pseudofunction Here is my benchmark data, where data3 is normal sample of real data. data3 = Drop[ExcelWorkBook[[Column1 ;; Column4]], None, 1]; data2 = {a #, b #, c #, d #} & /@ Range[1, 10^5]; data = RandomReal[{0, 1}, {10^6, 4}]; Here is my benchmark code kptnw[list_] := Transpose[{Table[First@#, {Length@# - 1}], Rest@#}, {3, 1, 2}] &@list kptnw2[list_] := Transpose[{ConstantArray[First@#, Length@# - 1], Rest@#}, {3, 1, 2}] &@list OleksandrR[list_] := Flatten[Outer[List, List@First[list], Rest[list], 1], {{2}, {1, 4}}] paradox2[list_] := Partition[Riffle[list[[1]], #], 2] & /@ Drop[list, 1] RM[list_] := FoldList[Transpose[{First@li...

front end - keyboard shortcut to invoke Insert new matrix

I frequently need to type in some matrices, and the menu command Insert > Table/Matrix > New... allows matrices with lines drawn between columns and rows, which is very helpful. I would like to make a keyboard shortcut for it, but cannot find the relevant frontend token command (4209405) for it. Since the FullForm[] and InputForm[] of matrices with lines drawn between rows and columns is the same as those without lines, it's hard to do this via 3rd party system-wide text expanders (e.g. autohotkey or atext on mac). How does one assign a keyboard shortcut for the menu item Insert > Table/Matrix > New... , preferably using only mathematica? Thanks! Answer In the MenuSetup.tr (for linux located in the $InstallationDirectory/SystemFiles/FrontEnd/TextResources/X/ directory), I changed the line MenuItem["&New...", "CreateGridBoxDialog"] to read MenuItem["&New...", "CreateGridBoxDialog", MenuKey["m", Modifiers-...