unity-scope-zotero-0.1+13.10.20130723/0000755000015700001700000000000012173420231017475 5ustar pbuserpbgroup00000000000000unity-scope-zotero-0.1+13.10.20130723/po/0000755000015700001700000000000012173420231020113 5ustar pbuserpbgroup00000000000000unity-scope-zotero-0.1+13.10.20130723/po/unity-scope-zotero.pot0000644000015700001700000000262612173417306024455 0ustar pbuserpbgroup00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2013-06-16 01:19+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=CHARSET\n" "Content-Transfer-Encoding: 8bit\n" #: ../src/unity_zotero_daemon.py:34 ../data/zotero.scope.in.h:4 msgid "Search Zotero" msgstr "" #: ../src/unity_zotero_daemon.py:35 msgid "Sorry, there are no Zotero results that match your search." msgstr "" #: ../src/unity_zotero_daemon.py:36 msgid "Powered by Zotero" msgstr "" #: ../src/unity_zotero_daemon.py:62 msgid "Articles" msgstr "" #. Add the "View" action #: ../src/unity_zotero_daemon.py:158 msgid "View Article" msgstr "" #: ../data/zotero.scope.in.h:1 msgid "zotero;" msgstr "" #: ../data/zotero.scope.in.h:2 msgid "Zotero" msgstr "" #: ../data/zotero.scope.in.h:3 msgid "" "This is an Ubuntu search plugin that enables information from Zotero to be " "searched and displayed in the Dash underneath the Reference header. If you " "do not wish to search this content source, you can disable this search " "plugin." msgstr "" unity-scope-zotero-0.1+13.10.20130723/po/POTFILES.in0000644000015700001700000000012512173417306021677 0ustar pbuserpbgroup00000000000000[encoding: UTF-8] src/unity_zotero_daemon.py [type: gettext/ini]data/zotero.scope.in unity-scope-zotero-0.1+13.10.20130723/MANIFEST.in0000644000015700001700000000007612173417306021247 0ustar pbuserpbgroup00000000000000include MANIFEST.in include src/* include data/* include po/* unity-scope-zotero-0.1+13.10.20130723/tests/0000755000015700001700000000000012173420231020637 5ustar pbuserpbgroup00000000000000unity-scope-zotero-0.1+13.10.20130723/tests/test_zotero.py0000644000015700001700000000452612173417306023612 0ustar pbuserpbgroup00000000000000#! /usr/bin/python3 # -*- coding: utf-8 -*- from gi.repository import Unity from unittest import TestCase import imp class ResultSet(Unity.ResultSet): def __init__(self): Unity.ResultSet.__init__(self) self.results = [] def do_add_result(self, result): self.results.append({'uri':result.uri, 'title':result.title, 'comment':result.comment, 'icon':result.icon_hint}) class ScopeTestCase(TestCase): def init_scope(self, scope_path): self.scope_module = imp.load_source('scope', scope_path) self.scope = self.scope_module.load_scope() def perform_query(self, query, filter_set = Unity.FilterSet.new()): result_set = ResultSet() ctx = Unity.SearchContext.create(query, 0, filter_set, None, result_set, None) s = self.scope.create_search_for_query(ctx) s.run() return result_set class TestZotero(ScopeTestCase): def setUp(self): self.init_scope('src/unity_zotero_daemon.py') def tearDown(self): self.scope = None self.scope_module = None def test_valid_search(self): self.scope_module.PATHS = ['tests/data/mock_zotero_pass/'] expected_results = ['[Qualitative and quantitative analysis of fluoxetine hydrochloride by 19F NMR]', 'http://www.ncbi.nlm.nih.gov/pubmed/22812008'] results = [] for s in ['fluoxetine']: result_set = self.perform_query(s) results.append(result_set.results[0]['title']) results.append(result_set.results[0]['uri']) self.assertEqual(results, expected_results) def test_failing_search(self): self.scope_module.PATHS = ['tests/data/mock_zotero_fail/'] for s in ['query']: result_set = self.perform_query(s) self.assertEqual(len(result_set.results), 0) def test_activation(self): result = Unity.ScopeResult() result.uri = "http://www.ncbi.nlm.nih.gov/pubmed/2281200" activation = self.scope.activate(result, Unity.SearchMetadata(), None) self.assertEqual(activation.props.goto_uri, None) self.assertEqual(activation.props.handled, Unity.HandledType.NOT_HANDLED) if __name__ == '__main__': unittest.main() unity-scope-zotero-0.1+13.10.20130723/tests/data/0000755000015700001700000000000012173420231021550 5ustar pbuserpbgroup00000000000000unity-scope-zotero-0.1+13.10.20130723/tests/data/mock_zotero_fail0000644000015700001700000000000612173417306025026 0ustar pbuserpbgroup00000000000000 unity-scope-zotero-0.1+13.10.20130723/tests/data/mock_zotero_pass/0000755000015700001700000000000012173420231025131 5ustar pbuserpbgroup00000000000000unity-scope-zotero-0.1+13.10.20130723/tests/data/mock_zotero_pass/zotero.default/0000755000015700001700000000000012173420231030076 5ustar pbuserpbgroup00000000000000unity-scope-zotero-0.1+13.10.20130723/tests/data/mock_zotero_pass/zotero.default/zotero/0000755000015700001700000000000012173420231031420 5ustar pbuserpbgroup00000000000000././@LongLink0000000000000000000000000000014600000000000011216 Lustar 00000000000000unity-scope-zotero-0.1+13.10.20130723/tests/data/mock_zotero_pass/zotero.default/zotero/zotero.sqliteunity-scope-zotero-0.1+13.10.20130723/tests/data/mock_zotero_pass/zotero.default/zotero/zotero.sqlit0000644000015700001700000027000012173417306034030 0ustar pbuserpbgroup00000000000000SQLite format 3@ 7-( $ veUJ<.r_J8# $+ dictionaryEntry#3 encyclopediaArticle"document!+ conferencePaper + computerProgram  podcast) radioBroadcast# tvBroadcast) videoRecording% presentation) audioRecording forumPost) instantMessage  blogPost map  email  statute  patent  hearing  case  bill  report!attachment webpage  artwork  film  interview ! manuscript  letter  thesis-newspaperArticle+magazineArticle)journalArticle#bookSection book note h vlbUE0wbUG<' s _ E 0 { j ] O < / #   { i Y I : )   v l ` U G 8 +   {archive zgenrey!filingDatex-issuingAuthorityw%programTitle vnumPagesu%docketNumbert!shortTitle sbookTitler-proceedingsTitle qsubject pnameOfAct ocaseName ntitle mmediumltype kblogTitlei'episodeNumberh!forumTitleg/applicationNumber fcountrye+publicLawNumberd#dateEnactedc)documentNumber bfirstPagea)reporterVolume`#dateDecided _codePages^!codeVolume]!billNumber\%reportNumber[%websiteTitleZ%abstractNoteY!universityX3programmingLanguage WlanguageV+dictionaryTitleU/encyclopediaTitleT)conferenceName Scompany Rsystem QversionP'audioFileType OpostType NnetworkM#runningTime LstudioK#meetingNameJ-presentationType HlabelG5audioRecordingFormatF#websiteTypeE!thesisType Dscale CmapTypeB)manuscriptTypeA!letterType@+interviewMedium?5videoRecordingFormat>)libraryCatalog=#artworkSize <number;'artworkMedium7!codeNumber6#legalStatus5!references 4issueDate3+priorityNumbers2%patentNumber 0assignee .committee-+numberOfVolumes ,court +reporter *history)+legislativeBody (session$code !reportType#institution%seriesNumber!seriesText#seriesTitle!accessDateDOI3journalAbbreviation extra#distributor+archiveLocation!callNumber sectiondate ISSN -publicationTitle ISBN pages publisher place edition issue volume series rightsurl  UB  C32012-07-22 19:45:01BThe chemical shift of fluoxetine hydrochloride appears at delta 14.15 in 19F NMR analysis. The delta moved upfield slightly from 14.158 to 14.145 when the concentration of solution became diluted from 2.00 to 0.05 mmol x L(-1). Spiking test was suggested to confirm the existence of the compound for qualitative analysis. 19F NMR detection sensitivity test illustrated that a concentration of 17 mg in 1 L water could be detected while the sample was scanned 500 times with optimum parameters. In quantitative analysis, standard curve of concentration versus fluorine signal intensity was proposed to determine the amount of fluoxetine. Long capillary tube containing trifluoroacetic acid was used as internal standard for the integration measurements and straight line was obtained with good fitting. Direct additions of trifluoroethanol to fluoxetine solutions gave a poorer standard curve.A/.@cYao xue xue bao = Acta pharmaceutica Sinica?+Yao Xue Xue Bao >0513-4870 =630-633R<)[Qualitative and quantitative analysis of fluoxetine hydrochloride by 19F NMR];)PMID: 22812008.:chttp://www.ncbi.nlm.nih.gov/pubmed/2281200832012-05-00 May 2012 #NCBI PubMed.chttp://zotero.org/support/quick_start_guide=Zotero Quick Start Guide    P /chttp://zotero.org/support/quick_start_guide/chttp://www.ncbi.nlm.nih.gov/pubmed/22812008:S)[Qualitative and quantitative analysis of fluoxetine hydrochloride by 19F NMR]<= Zotero Quick Start Guide/cYao xue xue bao = Acta pharmaceutica Sinica@+Yao Xue Xue Bao?The chemical shift of fluoxetine hydrochloride appears at delta 14.15 in 19F NMR analysis. The delta moved upfield slightly from 14.158 to 14.145 when the concentration of solution became diluted from 2.00 to 0.05 mmol x L(-1). Spiking test was suggested to confirm the existence of the compound for qualitative analysis. 19F NMR detection sensitivity test illustrated that a concentration of 17 mg in 1 L water could be detected while the sample was scanned 500 times with optimum parameters. In quantitative analysis, standard curve of concentration versus fluorine signal intensity was proposed to determine the amount of fluoxetine. Long capillary tube containing trifluoroacetic acid was used as internal standard for the integration measurements and straight line was obtained with good fitting. Direct additions of trifluoroethanol to fluoxetine solutions gave a poorer standard curve.B)PMID: 22812008;#NCBI PubMed 630-633=32012-07-22 19:45:01C32012-05-00 May 2012 0513-4870>/A ~~JCI> HZBGFEAD @C?B >A =@n<?;> :   n n@ZH>IJC?G B D AFE >  n  rr! Shrong-ShiLin Shou-QianZhao Xiao-DiXue Er-LiKong Bai-QinYang' M Center for History and New Media                     n@ nZH>IJC?G B D AFE >   iJ3332012-07-22 19:45:012012-07-22 19:45:012012-07-22 19:45:01UNKW4WWEI 3332012-07-20 20:01:432012-07-20 20:01:432012-07-20 20:01:43ABCD3456J333 2012-07-20 20:01:432012-07-20 20:01:432012-07-20 20:01:43ABCD2345  UNKW4WWE ABCD3456  ABCD2345 :i:J3332012-07-22 19:45:012012-07-22 19:45:012012-07-22 19:45:01PSPZXBQSI3332012-07-22 19:45:012012-07-22 19:45:012012-07-22 19:45:01AN7VXTFJ3332012-07-22 19:45:012012-07-22 19:45:012012-07-22 19:45:01DKGTUUS4J3332012-07-22 19:45:012012-07-22 19:45:012012-07-22 19:45:01XKC8J55FJ3332012-07-22 19:45:012012-07-22 19:45:012012-07-12 19:45:015I7HWCF7I 3332012-07-20 20:01:432012-07-20 20:01:432012-07-20 20:01:43ABCD2345  PSPZXBQS AN7VXTF DKGTUUS4 XKC8J55F 5I7HWCF7  ABCD2345  k Ok1# triggerinsert_creatorDatacreatorDataCREATE TRIGGER insert_creatorData BEFORE INSERT ON creatorData FOR EACH ROW WHEN NEW.firstName='' AND NEW.lastName='' BEGIN SELECT RAISE (ABORT, 'Creator names cannot be empty'); ENDk1# triggerupdate_creatorDatacreatorDataCREATE TRIGGER update_creatorData BEFORE UPDATE ON creatorData FOR EACH ROW WHEN NEW.firstName='' AND NEW.lastName='' BEGIN SELECT RAISE (ABORT, 'Creator names cannot be empty'); END1u#Utriggerfkd_creators_creatorDataID_creatorData_creatorDataIDcreatorDataCREATE TRIGGER fkd_creators_creatorDataID_creatorData_creatorDataID BEFORE DELETE ON creatorData FOR EACH ROW BEGIN SELECT RAISE(ABORT, 'delete on table "creatorData" violates foreign key constraint "fkd_creators_creatorDataID_creatorData_creatorDataID"') WHERE (SELECT COUNT(*) FROM creators WHERE creatorDataID = OLD.creatorDataID) > 0; ENDBu#wtriggerfku_creatorData_creatorDataID_creators_creatorDataIDcreatorDataCREATE TRIGGER fku_creatorData_creatorDataID_creators_creatorDataID BEFORE UPDATE OF creatorDataID ON creatorData FOR EACH ROW BEGIN SELECT RAISE(ABORT, 'update on table "creatorData" violates foreign key constraint "fku_creatorData_creatorDataID_creators_creatorDataID"') WHERE (SELECT COUNT(*) FROM creators WHERE creatorDataID = OLD.creatorDataID) > 0; ENDU%-triggerfki_itemCreators_itemID_items_itemIDitemCreatorsCREATE TRIGGER fki_itemCreators_itemID_items_itemID BEFORE INSERT ON itemCreators FOR EACH ROW BEGIN SELECT RAISE(ABORT, 'insert on table "itemCreators" violates foreign key constraint "fki_itemCreators_itemID_items_itemID"') WHERE NEW.itemID IS NOT NULL AND (SELECT COUNT(*) FROM items WHERE itemID = NEW.itemID) = 0; ENDU%Atriggerfku_itemCreators_itemID_items_itemIDitemCreatorsCREATE TRIGGER fku_itemCreators_itemID_items_itemID BEFORE UPDATE OF itemID ON itemCreators FOR EACH ROW BEGIN SELECT RAISE(ABORT, 'update on table "itemCreators" violates foreign key constraint "fku_itemCreators_itemID_items_itemID"') WHERE NEW.itemID IS NOT NULL AND (SELECT COUNT(*) FROM items WHERE itemID = NEW.itemID) = 0; END5g%itriggerfki_itemCreators_creatorID_creators_creatorIDitemCreatorsCREATE TRIGGER fki_itemCreators_creatorID_creators_creatorID BEFORE INSERT ON itemCreators FOR EACH ROW BEGIN SELECT RAISE(ABORT, 'insert on table "itemCreators" violates foreign key constraint "fki_itemCreators_creatorID_creators_creatorID"') WHERE NEW.creatorID IS NOT NULL AND (SELECT COUNT(*) FROM creators WHERE creatorID = NEW.creatorID) = 0; ENDBg%triggerfku_itemCreators_creatorID_creators_creatorIDitemCreatorsCREATE TRIGGER fku_itemCreators_creatorID_creators_creatorID BEFORE UPDATE OF creatorID ON itemCreators FOR EACH ROW BEGIN SELECT RAISE(ABORT, 'update on table "itemCreators" violates foreign key constraint "fku_itemCreators_creatorID_creators_creatorID"') WHERE NEW.creatorID IS NOT NULL AND (SELECT COUNT(*) FROM creators WHERE creatorID = NEW.creatorID) = 0; ENDi%9triggerfki_itemCreators_creatorTypeID_creatorTypes_creatorTypeIDitemCreatorsCREATE TRIGGER fki_itemCreators_creatorTypeID_creatorTypes_creatorTypeID BEFORE INSERT ON itemCreators FOR EACH ROW BEGIN SELECT RAISE(ABORT, 'insert on table "itemCreators" violates foreign key constraint "fki_itemCreators_creatorTypeID_creatorTypes_creatorTypeID"') WHERE NEW.creatorTypeID IS NOT NULL AND (SELECT COUNT(*) FROM creatorTypes WHERE creatorTypeID = NEW.creatorTypeID) = 0; END  F _z%[triggerfku_itemCreators_creatorTypeID_creatorTypes_creatorTypeIDitemCreatorsCREATE TRIGGER fku_itemCreators_creatorTypeID_creatorTypes_creatorTypeID BEFORE UPDATE OF creatorTypeID ON itemCreators FOR EACH ROW BEGIN SELECT RAISE(ABORT, 'update on table "itemCreators" violates foreign key constraint "fku_itemCreators_creatorTypeID_creatorTypes_creatorTypeID"') WHERE NEW.creatorTypeID IS NOT NULL AND (SELECT COUNT(*) FROM creatorTypes WHERE creatorTypeID = NEW.creatorTypeID) = 0; ENDA%Atriggerfki_itemCreators_libraryIDitemCreatorsCREATE TRIGGER fki_itemCreators_libraryID BEFORE INSERT ON itemCreators FOR EACH ROW BEGIN SELECT RAISE(ABORT, 'insert on table "itemCreators" violates foreign key constraint "fki_itemCreators_libraryID"') WHERE ( (SELECT libraryID FROM creators WHERE creatorID = NEW.creatorID) IS NULL AND (SELECT libraryID FROM items WHERE itemID = NEW.itemID) IS NOT NULL ) OR ( (SELECT libraryID FROM creators WHERE creatorID = NEW.creatorID) IS NOT NULL AND (SELECT libraryID FROM items WHERE itemID = NEW.itemID) IS NULL ) OR (SELECT libraryID FROM creators WHERE creatorID = NEW.creatorID) != (SELECT libraryID FROM items WHERE itemID = NEW.itemID); ENDA%Atriggerfku_itemCreators_libraryIDitemCreatorsCREATE TRIGGER fku_itemCreators_libraryID BEFORE UPDATE ON itemCreators FOR EACH ROW BEGIN SELECT RAISE(ABORT, 'update on table "itemCreators" violates foreign key constraint "fku_itemCreators_libraryID"') WHERE ( (SELECT libraryID FROM creators WHERE creatorID = NEW.creatorID) IS NULL AND (SELECT libraryID FROM items WHERE itemID = NEW.itemID) IS NOT NULL ) OR ( (SELECT libraryID FROM creators WHERE creatorID = NEW.creatorID) IS NOT NULL AND (SELECT libraryID FROM items WHERE itemID = NEW.itemID) IS NULL ) OR (SELECT libraryID FROM creators WHERE creatorID = NEW.creatorID) != (SELECT libraryID FROM items WHERE itemID = NEW.itemID); ENDvM triggerfki_itemData_itemID_items_itemIDitemDataCREATE TRIGGER fki_itemData_itemID_items_itemID BEFORE INSERT ON itemData FOR EACH ROW BEGIN SELECT RAISE(ABORT, 'insert on table "itemData" violates foreign key constraint "fki_itemData_itemID_items_itemID"') WHERE NEW.itemID IS NOT NULL AND (SELECT COUNT(*) FROM items WHERE itemID = NEW.itemID) = 0; ENDM!triggerfku_itemData_itemID_items_itemIDitemDataCREATE TRIGGER fku_itemData_itemID_items_itemID BEFORE UPDATE OF itemID ON itemData FOR EACH ROW BEGIN SELECT RAISE(ABORT, 'update on table "itemData" violates foreign key constraint "fku_itemData_itemID_items_itemID"') WHERE NEW.itemID IS NOT NULL AND (SELECT COUNT(*) FROM items WHERE itemID = NEW.itemID) = 0; ENDSAtriggerfki_itemData_fieldID_fields_fieldIDitemDataCREATE TRIGGER fki_itemData_fieldID_fields_fieldID BEFORE INSERT ON itemData FOR EACH ROW BEGIN SELECT RAISE(ABORT, 'insert on table "itemData" violates foreign key constraint "fki_itemData_fieldID_fieldsCombined_fieldID"') WHERE NEW.fieldID IS NOT NULL AND (SELECT COUNT(*) FROM fieldsCombined WHERE fieldID = NEW.fieldID) = 0; ENDSWtriggerfku_itemData_fieldID_fields_fieldIDitemDataCREATE TRIGGER fku_itemData_fieldID_fields_fieldID BEFORE UPDATE OF fieldID ON itemData FOR EACH ROW BEGIN SELECT RAISE(ABORT, 'update on table "itemData" violates foreign key constraint "fku_itemData_fieldID_fieldsCombined_fieldID"') WHERE NEW.fieldID IS NOT NULL AND (SELECT COUNT(*) FROM fieldsCombined WHERE fieldID = NEW.fieldID) = 0; END M 5 + )++atableitemAttachmentsitemAttachmentsCREATE TABLE itemAttachments ( itemID INTEGER PRIMARY KEY, sourceItemID INT, linkMode INT, mimeType TEXT, charsetID INT, path TEXT, originalPath TEXT, syncState INT DEFAULT 0, storageModTime INT, storageHash TEXT, FOREIGN KEY (itemID) REFERENCES items(itemID), FOREIGN KEY (sourceItemID) REFERENCES items(itemID) )#cQtriggerfki_itemData_valueID_itemDataValues_valueIDitemDataCREATE TRIGGER fki_itemData_valueID_itemDataValues_valueID BEFORE INSERT ON itemData FOR EACH ROW BEGIN SELECT RAISE(ABORT, 'insert on table "itemData" violates foreign key constraint "fki_itemData_valueID_itemDataValues_valueID"') WHERE NEW.valueID IS NOT NULL AND (SELECT COUNT(*) FROM itemDataValues WHERE valueID = NEW.valueID) = 0; END. cgtriggerfku_itemData_valueID_itemDataValues_valueIDitemDataCREATE TRIGGER fku_itemData_valueID_itemDataValues_valueID BEFORE UPDATE OF valueID ON itemData FOR EACH ROW BEGIN SELECT RAISE(ABORT, 'update on table "itemData" violates foreign key constraint "fku_itemData_valueID_itemDataValues_valueID"') WHERE NEW.valueID IS NOT NULL AND (SELECT COUNT(*) FROM itemDataValues WHERE valueID = NEW.valueID) = 0; END!c)%triggerfkd_itemData_valueID_itemDataValues_valueIDitemDataValuesCREATE TRIGGER fkd_itemData_valueID_itemDataValues_valueID BEFORE DELETE ON itemDataValues FOR EACH ROW BEGIN SELECT RAISE(ABORT, 'delete on table "itemDataValues" violates foreign key constraint "fkd_itemData_valueID_itemDataValues_valueID"') WHERE (SELECT COUNT(*) FROM itemData WHERE valueID = OLD.valueID) > 0; END"c);triggerfku_itemDataValues_valueID_itemData_valueIDitemDataValuesCREATE TRIGGER fku_itemDataValues_valueID_itemData_valueID BEFORE UPDATE OF valueID ON itemDataValues FOR EACH ROW BEGIN SELECT RAISE(ABORT, 'update on table "itemDataValues" violates foreign key constraint "fku_itemDataValues_valueID_itemData_valueID"') WHERE (SELECT COUNT(*) FROM itemData WHERE valueID = OLD.valueID) > 0; ENDs#U%wtriggerfki_deletedItems_itemID_items_itemIDdeletedItemsCREATE TRIGGER fki_deletedItems_itemID_items_itemID BEFORE INSERT ON deletedItems FOR EACH ROW BEGIN SELECT RAISE(ABORT, 'insert on table "deletedItems" violates foreign key constraint "fki_deletedItems_itemID_items_itemID"') WHERE (SELECT COUNT(*) FROM items WHERE itemID = NEW.itemID) = 0; END}$U% triggerfku_deletedItems_itemID_items_itemIDdeletedItemsCREATE TRIGGER fku_deletedItems_itemID_items_itemID BEFORE UPDATE OF itemID ON deletedItems FOR EACH ROW BEGIN SELECT RAISE(ABORT, 'update on table "deletedItems" violates foreign key constraint "fku_deletedItems_itemID_items_itemID"') WHERE (SELECT COUNT(*) FROM items WHERE itemID = NEW.itemID) = 0; END-%9tableitemsitemsCREATE TABLE items ( itemID INTEGER PRIMARY KEY, itemTypeID INT NOT NULL, dateAdded TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, dateModified TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, clientDateModified TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, libraryID INT, key TEXT NOT NULL, UNIQUE (libraryID, key), FOREIGN KEY (libraryID) REFERENCES libraries(libraryID) ))&=indexsqlite_autoindex_items_1itemsF'_tablecreatorscreatorsCREATE TABLE creators ( creatorID INTEGER PRIMARY KEY, creatorDataID INT NOT NULL, dateAdded TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, dateModified TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, clientDateModified TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, libraryID INT, key TEXT NOT NULL, UNIQUE (libraryID, key), FOREIGN KEY (creatorDataID) REFERENCES creatorData(creatorDataID) )/(Cindexsqlite_autoindex_creators_1creators #`&_ O OmtableitemTypesitemTypesCREATE TABLE itemTypes ( itemTypeID INTEGER PRIMARY KEY, typeName TEXT, templateItemTypeID INT, display INT DEFAULT 1 -- 0 == hide, 1 == display, 2 == primary )CatablefieldsfieldsCREATE TABLE fields ( fieldID INTEGER PRIMARY KEY, fieldName TEXT, fieldFormatID INT, FOREIGN KEY (fieldFormatID) REFERENCES fieldFormats(fieldFormatID) )z))/tableitemDataValuesitemDataValuesCREATE TABLE itemDataValues ( valueID INTEGER PRIMARY KEY, value UNIQUE );O)indexsqlite_autoindex_itemDataValues_1itemDataValues--tableitemDataitemDataCREATE TABLE itemData ( itemID INT, fieldID INT, valueID, PRIMARY KEY (itemID, fieldID), FOREIGN KEY (itemID) REFERENCES items(itemID), FOREIGN KEY (fieldID) REFERENCES fields(fieldID), FOREIGN KEY (valueID) REFERENCES itemDataValues(valueID) )/Cindexsqlite_autoindex_itemData_1itemDataF##StablecreatorDatacreatorData CREATE TABLE creatorData ( creatorDataID INTEGER PRIMARY KEY, firstName TEXT, lastName TEXT, shortName TEXT, fieldMode INT, birthYear INT )%%utableitemCreatorsitemCreators CREATE TABLE itemCreators ( itemID INT, creatorID INT, creatorTypeID INT DEFAULT 1, orderIndex INT DEFAULT 0, PRIMARY KEY (itemID, creatorID, creatorTypeID, orderIndex), FOREIGN KEY (itemID) REFERENCES items(itemID), FOREIGN KEY (creatorID) REFERENCES creators(creatorID) FOREIGN KEY (creatorTypeID) REFERENCES creatorTypes(creatorTypeID) )7 K%indexsqlite_autoindex_itemCreators_1itemCreators  %%mtabledeletedItemsdeletedItems CREATE TABLE deletedItems ( itemID INTEGER PRIMARY KEY, dateDeleted DEFAULT CURRENT_TIMESTAMP NOT NULL )V -qindexitemData_fieldIDitemData CREATE INDEX itemData_fieldID ON itemData(fieldID)s =%indexdeletedItems_dateDeleteddeletedItemsCREATE INDEX deletedItems_dateDeleted ON deletedItems(dateDeleted) /utriggerinsert_date_fielditemDataCREATE TRIGGER insert_date_field BEFORE INSERT ON itemData FOR EACH ROW WHEN NEW.fieldID IN (14, 27, 52, 96, 100) BEGIN SELECT CASE CAST(SUBSTR((SELECT value FROM itemDataValues WHERE valueID=NEW.valueID), 1, 4) AS INT) BETWEEN 0 AND 9999 AND SUBSTR((SELECT value FROM itemDataValues WHERE valueID=NEW.valueID), 5, 1) = '-' AND CAST(SUBSTR((SELECT value FROM itemDataValues WHERE valueID=NEW.valueID), 6, 2) AS INT) BETWEEN 0 AND 12 AND SUBSTR((SELECT value FROM itemDataValues WHERE valueID=NEW.valueID), 8, 1) = '-' AND CAST(SUBSTR((SELECT value FROM itemDataValues WHERE valueID=NEW.valueID), 9, 2) AS INT) BETWEEN 0 AND 31 WHEN 0 THEN RAISE (ABORT, 'Date field must begin with SQL date') END; END/utriggerupdate_date_fielditemDataCREATE TRIGGER update_date_field BEFORE UPDATE ON itemData FOR EACH ROW WHEN NEW.fieldID IN (14, 27, 52, 96, 100) BEGIN SELECT CASE CAST(SUBSTR((SELECT value FROM itemDataValues WHERE valueID=NEW.valueID), 1, 4) AS INT) BETWEEN 0 AND 9999 AND SUBSTR((SELECT value FROM itemDataValues WHERE valueID=NEW.valueID), 5, 1) = '-' AND CAST(SUBSTR((SELECT value FROM itemDataValues WHERE valueID=NEW.valueID), 6, 2) AS INT) BETWEEN 0 AND 12 AND SUBSTR((SELECT value FROM itemDataValues WHERE valueID=NEW.valueID), 8, 1) = '-' AND CAST(SUBSTR((SELECT value FROM itemDataValues WHERE valueID=NEW.valueID), 9, 2) AS INT) BETWEEN 0 AND 31 WHEN 0 THEN RAISE (ABORT, 'Date field must begin with SQL date') END; END././@LongLink0000000000000000000000000000016100000000000011213 Lustar 00000000000000unity-scope-zotero-0.1+13.10.20130723/tests/data/mock_zotero_pass/zotero.default/zotero/zotero-lensbackup.sqliteunity-scope-zotero-0.1+13.10.20130723/tests/data/mock_zotero_pass/zotero.default/zotero/zotero-lensb0000644000015700001700000027000012173417306033776 0ustar pbuserpbgroup00000000000000SQLite format 3@ 7-( $ veUJ<.r_J8# $+ dictionaryEntry#3 encyclopediaArticle"document!+ conferencePaper + computerProgram  podcast) radioBroadcast# tvBroadcast) videoRecording% presentation) audioRecording forumPost) instantMessage  blogPost map  email  statute  patent  hearing  case  bill  report!attachment webpage  artwork  film  interview ! manuscript  letter  thesis-newspaperArticle+magazineArticle)journalArticle#bookSection book note h vlbUE0wbUG<' s _ E 0 { j ] O < / #   { i Y I : )   v l ` U G 8 +   {archive zgenrey!filingDatex-issuingAuthorityw%programTitle vnumPagesu%docketNumbert!shortTitle sbookTitler-proceedingsTitle qsubject pnameOfAct ocaseName ntitle mmediumltype kblogTitlei'episodeNumberh!forumTitleg/applicationNumber fcountrye+publicLawNumberd#dateEnactedc)documentNumber bfirstPagea)reporterVolume`#dateDecided _codePages^!codeVolume]!billNumber\%reportNumber[%websiteTitleZ%abstractNoteY!universityX3programmingLanguage WlanguageV+dictionaryTitleU/encyclopediaTitleT)conferenceName Scompany Rsystem QversionP'audioFileType OpostType NnetworkM#runningTime LstudioK#meetingNameJ-presentationType HlabelG5audioRecordingFormatF#websiteTypeE!thesisType Dscale CmapTypeB)manuscriptTypeA!letterType@+interviewMedium?5videoRecordingFormat>)libraryCatalog=#artworkSize <number;'artworkMedium7!codeNumber6#legalStatus5!references 4issueDate3+priorityNumbers2%patentNumber 0assignee .committee-+numberOfVolumes ,court +reporter *history)+legislativeBody (session$code !reportType#institution%seriesNumber!seriesText#seriesTitle!accessDateDOI3journalAbbreviation extra#distributor+archiveLocation!callNumber sectiondate ISSN -publicationTitle ISBN pages publisher place edition issue volume series rightsurl  UB  C32012-07-22 19:45:01BThe chemical shift of fluoxetine hydrochloride appears at delta 14.15 in 19F NMR analysis. The delta moved upfield slightly from 14.158 to 14.145 when the concentration of solution became diluted from 2.00 to 0.05 mmol x L(-1). Spiking test was suggested to confirm the existence of the compound for qualitative analysis. 19F NMR detection sensitivity test illustrated that a concentration of 17 mg in 1 L water could be detected while the sample was scanned 500 times with optimum parameters. In quantitative analysis, standard curve of concentration versus fluorine signal intensity was proposed to determine the amount of fluoxetine. Long capillary tube containing trifluoroacetic acid was used as internal standard for the integration measurements and straight line was obtained with good fitting. Direct additions of trifluoroethanol to fluoxetine solutions gave a poorer standard curve.A/.@cYao xue xue bao = Acta pharmaceutica Sinica?+Yao Xue Xue Bao >0513-4870 =630-633R<)[Qualitative and quantitative analysis of fluoxetine hydrochloride by 19F NMR];)PMID: 22812008.:chttp://www.ncbi.nlm.nih.gov/pubmed/2281200832012-05-00 May 2012 #NCBI PubMed.chttp://zotero.org/support/quick_start_guide=Zotero Quick Start Guide    P /chttp://zotero.org/support/quick_start_guide/chttp://www.ncbi.nlm.nih.gov/pubmed/22812008:S)[Qualitative and quantitative analysis of fluoxetine hydrochloride by 19F NMR]<= Zotero Quick Start Guide/cYao xue xue bao = Acta pharmaceutica Sinica@+Yao Xue Xue Bao?The chemical shift of fluoxetine hydrochloride appears at delta 14.15 in 19F NMR analysis. The delta moved upfield slightly from 14.158 to 14.145 when the concentration of solution became diluted from 2.00 to 0.05 mmol x L(-1). Spiking test was suggested to confirm the existence of the compound for qualitative analysis. 19F NMR detection sensitivity test illustrated that a concentration of 17 mg in 1 L water could be detected while the sample was scanned 500 times with optimum parameters. In quantitative analysis, standard curve of concentration versus fluorine signal intensity was proposed to determine the amount of fluoxetine. Long capillary tube containing trifluoroacetic acid was used as internal standard for the integration measurements and straight line was obtained with good fitting. Direct additions of trifluoroethanol to fluoxetine solutions gave a poorer standard curve.B)PMID: 22812008;#NCBI PubMed 630-633=32012-07-22 19:45:01C32012-05-00 May 2012 0513-4870>/A ~~JCI> HZBGFEAD @C?B >A =@n<?;> :   n n@ZH>IJC?G B D AFE >  n  rr! Shrong-ShiLin Shou-QianZhao Xiao-DiXue Er-LiKong Bai-QinYang' M Center for History and New Media                     n@ nZH>IJC?G B D AFE >   iJ3332012-07-22 19:45:012012-07-22 19:45:012012-07-22 19:45:01UNKW4WWEI 3332012-07-20 20:01:432012-07-20 20:01:432012-07-20 20:01:43ABCD3456J333 2012-07-20 20:01:432012-07-20 20:01:432012-07-20 20:01:43ABCD2345  UNKW4WWE ABCD3456  ABCD2345 :i:J3332012-07-22 19:45:012012-07-22 19:45:012012-07-22 19:45:01PSPZXBQSI3332012-07-22 19:45:012012-07-22 19:45:012012-07-22 19:45:01AN7VXTFJ3332012-07-22 19:45:012012-07-22 19:45:012012-07-22 19:45:01DKGTUUS4J3332012-07-22 19:45:012012-07-22 19:45:012012-07-22 19:45:01XKC8J55FJ3332012-07-22 19:45:012012-07-22 19:45:012012-07-12 19:45:015I7HWCF7I 3332012-07-20 20:01:432012-07-20 20:01:432012-07-20 20:01:43ABCD2345  PSPZXBQS AN7VXTF DKGTUUS4 XKC8J55F 5I7HWCF7  ABCD2345  k Ok1# triggerinsert_creatorDatacreatorDataCREATE TRIGGER insert_creatorData BEFORE INSERT ON creatorData FOR EACH ROW WHEN NEW.firstName='' AND NEW.lastName='' BEGIN SELECT RAISE (ABORT, 'Creator names cannot be empty'); ENDk1# triggerupdate_creatorDatacreatorDataCREATE TRIGGER update_creatorData BEFORE UPDATE ON creatorData FOR EACH ROW WHEN NEW.firstName='' AND NEW.lastName='' BEGIN SELECT RAISE (ABORT, 'Creator names cannot be empty'); END1u#Utriggerfkd_creators_creatorDataID_creatorData_creatorDataIDcreatorDataCREATE TRIGGER fkd_creators_creatorDataID_creatorData_creatorDataID BEFORE DELETE ON creatorData FOR EACH ROW BEGIN SELECT RAISE(ABORT, 'delete on table "creatorData" violates foreign key constraint "fkd_creators_creatorDataID_creatorData_creatorDataID"') WHERE (SELECT COUNT(*) FROM creators WHERE creatorDataID = OLD.creatorDataID) > 0; ENDBu#wtriggerfku_creatorData_creatorDataID_creators_creatorDataIDcreatorDataCREATE TRIGGER fku_creatorData_creatorDataID_creators_creatorDataID BEFORE UPDATE OF creatorDataID ON creatorData FOR EACH ROW BEGIN SELECT RAISE(ABORT, 'update on table "creatorData" violates foreign key constraint "fku_creatorData_creatorDataID_creators_creatorDataID"') WHERE (SELECT COUNT(*) FROM creators WHERE creatorDataID = OLD.creatorDataID) > 0; ENDU%-triggerfki_itemCreators_itemID_items_itemIDitemCreatorsCREATE TRIGGER fki_itemCreators_itemID_items_itemID BEFORE INSERT ON itemCreators FOR EACH ROW BEGIN SELECT RAISE(ABORT, 'insert on table "itemCreators" violates foreign key constraint "fki_itemCreators_itemID_items_itemID"') WHERE NEW.itemID IS NOT NULL AND (SELECT COUNT(*) FROM items WHERE itemID = NEW.itemID) = 0; ENDU%Atriggerfku_itemCreators_itemID_items_itemIDitemCreatorsCREATE TRIGGER fku_itemCreators_itemID_items_itemID BEFORE UPDATE OF itemID ON itemCreators FOR EACH ROW BEGIN SELECT RAISE(ABORT, 'update on table "itemCreators" violates foreign key constraint "fku_itemCreators_itemID_items_itemID"') WHERE NEW.itemID IS NOT NULL AND (SELECT COUNT(*) FROM items WHERE itemID = NEW.itemID) = 0; END5g%itriggerfki_itemCreators_creatorID_creators_creatorIDitemCreatorsCREATE TRIGGER fki_itemCreators_creatorID_creators_creatorID BEFORE INSERT ON itemCreators FOR EACH ROW BEGIN SELECT RAISE(ABORT, 'insert on table "itemCreators" violates foreign key constraint "fki_itemCreators_creatorID_creators_creatorID"') WHERE NEW.creatorID IS NOT NULL AND (SELECT COUNT(*) FROM creators WHERE creatorID = NEW.creatorID) = 0; ENDBg%triggerfku_itemCreators_creatorID_creators_creatorIDitemCreatorsCREATE TRIGGER fku_itemCreators_creatorID_creators_creatorID BEFORE UPDATE OF creatorID ON itemCreators FOR EACH ROW BEGIN SELECT RAISE(ABORT, 'update on table "itemCreators" violates foreign key constraint "fku_itemCreators_creatorID_creators_creatorID"') WHERE NEW.creatorID IS NOT NULL AND (SELECT COUNT(*) FROM creators WHERE creatorID = NEW.creatorID) = 0; ENDi%9triggerfki_itemCreators_creatorTypeID_creatorTypes_creatorTypeIDitemCreatorsCREATE TRIGGER fki_itemCreators_creatorTypeID_creatorTypes_creatorTypeID BEFORE INSERT ON itemCreators FOR EACH ROW BEGIN SELECT RAISE(ABORT, 'insert on table "itemCreators" violates foreign key constraint "fki_itemCreators_creatorTypeID_creatorTypes_creatorTypeID"') WHERE NEW.creatorTypeID IS NOT NULL AND (SELECT COUNT(*) FROM creatorTypes WHERE creatorTypeID = NEW.creatorTypeID) = 0; END  F _z%[triggerfku_itemCreators_creatorTypeID_creatorTypes_creatorTypeIDitemCreatorsCREATE TRIGGER fku_itemCreators_creatorTypeID_creatorTypes_creatorTypeID BEFORE UPDATE OF creatorTypeID ON itemCreators FOR EACH ROW BEGIN SELECT RAISE(ABORT, 'update on table "itemCreators" violates foreign key constraint "fku_itemCreators_creatorTypeID_creatorTypes_creatorTypeID"') WHERE NEW.creatorTypeID IS NOT NULL AND (SELECT COUNT(*) FROM creatorTypes WHERE creatorTypeID = NEW.creatorTypeID) = 0; ENDA%Atriggerfki_itemCreators_libraryIDitemCreatorsCREATE TRIGGER fki_itemCreators_libraryID BEFORE INSERT ON itemCreators FOR EACH ROW BEGIN SELECT RAISE(ABORT, 'insert on table "itemCreators" violates foreign key constraint "fki_itemCreators_libraryID"') WHERE ( (SELECT libraryID FROM creators WHERE creatorID = NEW.creatorID) IS NULL AND (SELECT libraryID FROM items WHERE itemID = NEW.itemID) IS NOT NULL ) OR ( (SELECT libraryID FROM creators WHERE creatorID = NEW.creatorID) IS NOT NULL AND (SELECT libraryID FROM items WHERE itemID = NEW.itemID) IS NULL ) OR (SELECT libraryID FROM creators WHERE creatorID = NEW.creatorID) != (SELECT libraryID FROM items WHERE itemID = NEW.itemID); ENDA%Atriggerfku_itemCreators_libraryIDitemCreatorsCREATE TRIGGER fku_itemCreators_libraryID BEFORE UPDATE ON itemCreators FOR EACH ROW BEGIN SELECT RAISE(ABORT, 'update on table "itemCreators" violates foreign key constraint "fku_itemCreators_libraryID"') WHERE ( (SELECT libraryID FROM creators WHERE creatorID = NEW.creatorID) IS NULL AND (SELECT libraryID FROM items WHERE itemID = NEW.itemID) IS NOT NULL ) OR ( (SELECT libraryID FROM creators WHERE creatorID = NEW.creatorID) IS NOT NULL AND (SELECT libraryID FROM items WHERE itemID = NEW.itemID) IS NULL ) OR (SELECT libraryID FROM creators WHERE creatorID = NEW.creatorID) != (SELECT libraryID FROM items WHERE itemID = NEW.itemID); ENDvM triggerfki_itemData_itemID_items_itemIDitemDataCREATE TRIGGER fki_itemData_itemID_items_itemID BEFORE INSERT ON itemData FOR EACH ROW BEGIN SELECT RAISE(ABORT, 'insert on table "itemData" violates foreign key constraint "fki_itemData_itemID_items_itemID"') WHERE NEW.itemID IS NOT NULL AND (SELECT COUNT(*) FROM items WHERE itemID = NEW.itemID) = 0; ENDM!triggerfku_itemData_itemID_items_itemIDitemDataCREATE TRIGGER fku_itemData_itemID_items_itemID BEFORE UPDATE OF itemID ON itemData FOR EACH ROW BEGIN SELECT RAISE(ABORT, 'update on table "itemData" violates foreign key constraint "fku_itemData_itemID_items_itemID"') WHERE NEW.itemID IS NOT NULL AND (SELECT COUNT(*) FROM items WHERE itemID = NEW.itemID) = 0; ENDSAtriggerfki_itemData_fieldID_fields_fieldIDitemDataCREATE TRIGGER fki_itemData_fieldID_fields_fieldID BEFORE INSERT ON itemData FOR EACH ROW BEGIN SELECT RAISE(ABORT, 'insert on table "itemData" violates foreign key constraint "fki_itemData_fieldID_fieldsCombined_fieldID"') WHERE NEW.fieldID IS NOT NULL AND (SELECT COUNT(*) FROM fieldsCombined WHERE fieldID = NEW.fieldID) = 0; ENDSWtriggerfku_itemData_fieldID_fields_fieldIDitemDataCREATE TRIGGER fku_itemData_fieldID_fields_fieldID BEFORE UPDATE OF fieldID ON itemData FOR EACH ROW BEGIN SELECT RAISE(ABORT, 'update on table "itemData" violates foreign key constraint "fku_itemData_fieldID_fieldsCombined_fieldID"') WHERE NEW.fieldID IS NOT NULL AND (SELECT COUNT(*) FROM fieldsCombined WHERE fieldID = NEW.fieldID) = 0; END M 5 + )++atableitemAttachmentsitemAttachmentsCREATE TABLE itemAttachments ( itemID INTEGER PRIMARY KEY, sourceItemID INT, linkMode INT, mimeType TEXT, charsetID INT, path TEXT, originalPath TEXT, syncState INT DEFAULT 0, storageModTime INT, storageHash TEXT, FOREIGN KEY (itemID) REFERENCES items(itemID), FOREIGN KEY (sourceItemID) REFERENCES items(itemID) )#cQtriggerfki_itemData_valueID_itemDataValues_valueIDitemDataCREATE TRIGGER fki_itemData_valueID_itemDataValues_valueID BEFORE INSERT ON itemData FOR EACH ROW BEGIN SELECT RAISE(ABORT, 'insert on table "itemData" violates foreign key constraint "fki_itemData_valueID_itemDataValues_valueID"') WHERE NEW.valueID IS NOT NULL AND (SELECT COUNT(*) FROM itemDataValues WHERE valueID = NEW.valueID) = 0; END. cgtriggerfku_itemData_valueID_itemDataValues_valueIDitemDataCREATE TRIGGER fku_itemData_valueID_itemDataValues_valueID BEFORE UPDATE OF valueID ON itemData FOR EACH ROW BEGIN SELECT RAISE(ABORT, 'update on table "itemData" violates foreign key constraint "fku_itemData_valueID_itemDataValues_valueID"') WHERE NEW.valueID IS NOT NULL AND (SELECT COUNT(*) FROM itemDataValues WHERE valueID = NEW.valueID) = 0; END!c)%triggerfkd_itemData_valueID_itemDataValues_valueIDitemDataValuesCREATE TRIGGER fkd_itemData_valueID_itemDataValues_valueID BEFORE DELETE ON itemDataValues FOR EACH ROW BEGIN SELECT RAISE(ABORT, 'delete on table "itemDataValues" violates foreign key constraint "fkd_itemData_valueID_itemDataValues_valueID"') WHERE (SELECT COUNT(*) FROM itemData WHERE valueID = OLD.valueID) > 0; END"c);triggerfku_itemDataValues_valueID_itemData_valueIDitemDataValuesCREATE TRIGGER fku_itemDataValues_valueID_itemData_valueID BEFORE UPDATE OF valueID ON itemDataValues FOR EACH ROW BEGIN SELECT RAISE(ABORT, 'update on table "itemDataValues" violates foreign key constraint "fku_itemDataValues_valueID_itemData_valueID"') WHERE (SELECT COUNT(*) FROM itemData WHERE valueID = OLD.valueID) > 0; ENDs#U%wtriggerfki_deletedItems_itemID_items_itemIDdeletedItemsCREATE TRIGGER fki_deletedItems_itemID_items_itemID BEFORE INSERT ON deletedItems FOR EACH ROW BEGIN SELECT RAISE(ABORT, 'insert on table "deletedItems" violates foreign key constraint "fki_deletedItems_itemID_items_itemID"') WHERE (SELECT COUNT(*) FROM items WHERE itemID = NEW.itemID) = 0; END}$U% triggerfku_deletedItems_itemID_items_itemIDdeletedItemsCREATE TRIGGER fku_deletedItems_itemID_items_itemID BEFORE UPDATE OF itemID ON deletedItems FOR EACH ROW BEGIN SELECT RAISE(ABORT, 'update on table "deletedItems" violates foreign key constraint "fku_deletedItems_itemID_items_itemID"') WHERE (SELECT COUNT(*) FROM items WHERE itemID = NEW.itemID) = 0; END-%9tableitemsitemsCREATE TABLE items ( itemID INTEGER PRIMARY KEY, itemTypeID INT NOT NULL, dateAdded TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, dateModified TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, clientDateModified TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, libraryID INT, key TEXT NOT NULL, UNIQUE (libraryID, key), FOREIGN KEY (libraryID) REFERENCES libraries(libraryID) ))&=indexsqlite_autoindex_items_1itemsF'_tablecreatorscreatorsCREATE TABLE creators ( creatorID INTEGER PRIMARY KEY, creatorDataID INT NOT NULL, dateAdded TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, dateModified TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, clientDateModified TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, libraryID INT, key TEXT NOT NULL, UNIQUE (libraryID, key), FOREIGN KEY (creatorDataID) REFERENCES creatorData(creatorDataID) )/(Cindexsqlite_autoindex_creators_1creators #`&_ O OmtableitemTypesitemTypesCREATE TABLE itemTypes ( itemTypeID INTEGER PRIMARY KEY, typeName TEXT, templateItemTypeID INT, display INT DEFAULT 1 -- 0 == hide, 1 == display, 2 == primary )CatablefieldsfieldsCREATE TABLE fields ( fieldID INTEGER PRIMARY KEY, fieldName TEXT, fieldFormatID INT, FOREIGN KEY (fieldFormatID) REFERENCES fieldFormats(fieldFormatID) )z))/tableitemDataValuesitemDataValuesCREATE TABLE itemDataValues ( valueID INTEGER PRIMARY KEY, value UNIQUE );O)indexsqlite_autoindex_itemDataValues_1itemDataValues--tableitemDataitemDataCREATE TABLE itemData ( itemID INT, fieldID INT, valueID, PRIMARY KEY (itemID, fieldID), FOREIGN KEY (itemID) REFERENCES items(itemID), FOREIGN KEY (fieldID) REFERENCES fields(fieldID), FOREIGN KEY (valueID) REFERENCES itemDataValues(valueID) )/Cindexsqlite_autoindex_itemData_1itemDataF##StablecreatorDatacreatorData CREATE TABLE creatorData ( creatorDataID INTEGER PRIMARY KEY, firstName TEXT, lastName TEXT, shortName TEXT, fieldMode INT, birthYear INT )%%utableitemCreatorsitemCreators CREATE TABLE itemCreators ( itemID INT, creatorID INT, creatorTypeID INT DEFAULT 1, orderIndex INT DEFAULT 0, PRIMARY KEY (itemID, creatorID, creatorTypeID, orderIndex), FOREIGN KEY (itemID) REFERENCES items(itemID), FOREIGN KEY (creatorID) REFERENCES creators(creatorID) FOREIGN KEY (creatorTypeID) REFERENCES creatorTypes(creatorTypeID) )7 K%indexsqlite_autoindex_itemCreators_1itemCreators  %%mtabledeletedItemsdeletedItems CREATE TABLE deletedItems ( itemID INTEGER PRIMARY KEY, dateDeleted DEFAULT CURRENT_TIMESTAMP NOT NULL )V -qindexitemData_fieldIDitemData CREATE INDEX itemData_fieldID ON itemData(fieldID)s =%indexdeletedItems_dateDeleteddeletedItemsCREATE INDEX deletedItems_dateDeleted ON deletedItems(dateDeleted) /utriggerinsert_date_fielditemDataCREATE TRIGGER insert_date_field BEFORE INSERT ON itemData FOR EACH ROW WHEN NEW.fieldID IN (14, 27, 52, 96, 100) BEGIN SELECT CASE CAST(SUBSTR((SELECT value FROM itemDataValues WHERE valueID=NEW.valueID), 1, 4) AS INT) BETWEEN 0 AND 9999 AND SUBSTR((SELECT value FROM itemDataValues WHERE valueID=NEW.valueID), 5, 1) = '-' AND CAST(SUBSTR((SELECT value FROM itemDataValues WHERE valueID=NEW.valueID), 6, 2) AS INT) BETWEEN 0 AND 12 AND SUBSTR((SELECT value FROM itemDataValues WHERE valueID=NEW.valueID), 8, 1) = '-' AND CAST(SUBSTR((SELECT value FROM itemDataValues WHERE valueID=NEW.valueID), 9, 2) AS INT) BETWEEN 0 AND 31 WHEN 0 THEN RAISE (ABORT, 'Date field must begin with SQL date') END; END/utriggerupdate_date_fielditemDataCREATE TRIGGER update_date_field BEFORE UPDATE ON itemData FOR EACH ROW WHEN NEW.fieldID IN (14, 27, 52, 96, 100) BEGIN SELECT CASE CAST(SUBSTR((SELECT value FROM itemDataValues WHERE valueID=NEW.valueID), 1, 4) AS INT) BETWEEN 0 AND 9999 AND SUBSTR((SELECT value FROM itemDataValues WHERE valueID=NEW.valueID), 5, 1) = '-' AND CAST(SUBSTR((SELECT value FROM itemDataValues WHERE valueID=NEW.valueID), 6, 2) AS INT) BETWEEN 0 AND 12 AND SUBSTR((SELECT value FROM itemDataValues WHERE valueID=NEW.valueID), 8, 1) = '-' AND CAST(SUBSTR((SELECT value FROM itemDataValues WHERE valueID=NEW.valueID), 9, 2) AS INT) BETWEEN 0 AND 31 WHEN 0 THEN RAISE (ABORT, 'Date field must begin with SQL date') END; ENDunity-scope-zotero-0.1+13.10.20130723/src/0000755000015700001700000000000012173420231020264 5ustar pbuserpbgroup00000000000000unity-scope-zotero-0.1+13.10.20130723/src/unity_zotero_daemon.py0000644000015700001700000002551212173417306024751 0ustar pbuserpbgroup00000000000000#! /usr/bin/python3 # -*- coding: utf-8 -*- # Copyright(C) 2013 Mark Tully # This program is free software: you can redistribute it and/or modify it # under the terms of the GNU General Public License version 3, as published # by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranties of # MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR # PURPOSE. See the GNU General Public License for more details. # # You should have received a copy of the GNU General Public License along # with this program. If not, see . from gi.repository import Unity from gi.repository import Gio, GLib import gettext import os.path import shutil import sqlite3 import html APP_NAME = 'unity-scope-zotero' LOCAL_PATH = '/usr/share/locale/' gettext.bindtextdomain(APP_NAME, LOCAL_PATH) gettext.textdomain(APP_NAME) _ = gettext.gettext GROUP_NAME = 'com.canonical.Unity.Scope.Academic.Zotero' UNIQUE_PATH = '/com/canonical/unity/scope/academic/zotero' SEARCH_URI = '' SEARCH_HINT = _('Search Zotero') NO_RESULTS_HINT = _('Sorry, there are no Zotero results that match your search.') PROVIDER_CREDITS = _('Powered by Zotero') SVG_DIR = '/usr/share/icons/unity-icon-theme/places/svg/' PROVIDER_ICON = SVG_DIR + 'service-zotero.svg' DEFAULT_RESULT_ICON = SVG_DIR + 'result-academic.svg' DEFAULT_RESULT_MIMETYPE = 'text/html' DEFAULT_RESULT_TYPE = Unity.ResultType.DEFAULT PATHS = [os.getenv("HOME") + "/.mozilla/firefox/", os.getenv("HOME") + "/.zotero/zotero/"] QUERY = '''SELECT title.value, COALESCE(url.value, url2.value), pub.value, GROUP_CONCAT(COALESCE(c1.lastName, "") || ' ' || COALESCE(c2.lastName, "") || ' ' || COALESCE(c3.lastName, "") || ' ' || COALESCE(c4.lastName, "") || ' ' || COALESCE(c5.lastName, "")) as creator, abstract.value FROM items i INNER JOIN itemDataValues title ON title.valueID =(SELECT itemData.valueID FROM itemData WHERE itemData.fieldID =(SELECT fieldID FROM fields WHERE fields.fieldName = 'title' LIMIT 1) AND itemData.itemID=i.itemID LIMIT 1) LEFT JOIN itemTypes t ON t.itemTypeID = i.itemTypeID LEFT JOIN itemDataValues url ON url.valueID = (SELECT itemData.valueID FROM itemData WHERE itemData.fieldID =(SELECT fieldID FROM fields WHERE fields.fieldName = 'url' LIMIT 1) AND itemData.itemID=i.itemID LIMIT 1) LEFT JOIN itemDataValues url2 on url2.valueID = (SELECT itemData.valueID FROM itemData WHERE itemData.fieldID =(SELECT fieldID FROM fields WHERE fields.fieldName = 'url' LIMIT 1) AND itemData.itemID = (SELECT itemAttachments.itemID FROM itemAttachments WHERE itemAttachments.sourceItemID = i.itemID) LIMIT 1) LEFT JOIN creatorData c1 ON c1.creatorDataID =(SELECT creatorDataID FROM creators WHERE creatorID =(SELECT creatorID FROM itemCreators WHERE itemID = i.itemID ORDER BY orderIndex LIMIT 0,1) LIMIT 1) LEFT JOIN creatorData c2 ON c2.creatorDataID =(SELECT creatorDataID FROM creators WHERE creatorID =(SELECT creatorID FROM itemCreators WHERE itemID = i.itemID ORDER BY orderIndex LIMIT 1,1) LIMIT 1) LEFT JOIN creatorData c3 ON c3.creatorDataID =(SELECT creatorDataID FROM creators WHERE creatorID =(SELECT creatorID FROM itemCreators WHERE itemID = i.itemID ORDER BY orderIndex LIMIT 2,1) LIMIT 1) LEFT JOIN creatorData c4 ON c4.creatorDataID =(SELECT creatorDataID FROM creators WHERE creatorID =(SELECT creatorID FROM itemCreators WHERE itemID = i.itemID ORDER BY orderIndex LIMIT 3,1) LIMIT 1) LEFT JOIN creatorData c5 ON c5.creatorDataID =(SELECT creatorDataID FROM creators WHERE creatorID =(SELECT creatorID FROM itemCreators WHERE itemID = i.itemID ORDER BY orderIndex LIMIT 4,1) LIMIT 1) LEFT JOIN itemDataValues pub ON pub.valueID =(SELECT itemData.valueID FROM itemData WHERE itemData.fieldID =(SELECT fieldID FROM fields WHERE fields.fieldName = 'publicationTitle' LIMIT 1) AND itemData.itemID=i.itemID LIMIT 1) LEFT JOIN itemDataValues abstract ON abstract.valueID =(SELECT itemData.valueID FROM itemData WHERE itemData.fieldID =(SELECT fieldID FROM fields WHERE fields.fieldName = 'abstractNote' LIMIT 1) AND itemData.itemID=i.itemID LIMIT 1) LEFT JOIN deletedItems ON i.itemID = deletedItems.itemID WHERE deletedItems.itemID IS NULL AND t.typeName = "journalArticle" GROUP BY title.value''' c1 = {'id': 'scholar', 'name': _('Articles'), 'icon': SVG_DIR + 'group-installed.svg', 'renderer': Unity.CategoryRenderer.VERTICAL_TILE} CATEGORIES = [c1] FILTERS = [] META0 = {'id': 'authors', 'type': 's', 'field': Unity.SchemaFieldType.OPTIONAL} META1 = {'id': 'journal', 'type': 's', 'field': Unity.SchemaFieldType.OPTIONAL} META2 = {'id': 'abstract', 'type': 's', 'field': Unity.SchemaFieldType.OPTIONAL} META3 = {'id': 'fulltitle', 'type': 's', 'field': Unity.SchemaFieldType.OPTIONAL} EXTRA_METADATA = [META0, META1, META2, META3] def search(search, filters): ''' Any search method returning results as a list of tuples. Available tuple fields: uri(string) icon(string) title(string) comment(string) dnd_uri(string) mimetype(string) category(int) result_type(Unity ResultType) extras metadata fields(variant) ''' results = [] dbFile = "" for path in PATHS: for folder in [default for default in os.listdir(path) if default.endswith(".default")]: dbFile = path + folder + "/zotero/zotero.sqlite" if os.path.exists(dbFile): backup_dbFile = path + folder + "/zotero/zotero-lensbackup.sqlite" shutil.copy2(dbFile, backup_dbFile) records = [] if os.path.exists(backup_dbFile): conn = sqlite3.connect(backup_dbFile) c = conn.cursor() rows = c.execute(QUERY) records = c.fetchall() c.close() for record in records: title = record[0] uri = record[1] journal = record[2] authors = record[3] abstract = record[4] if search.lower() in title.lower(): if uri: results.append({'uri': uri, 'title': title, 'authors': authors, 'journal': journal, 'abstract': abstract}) return results class Preview(Unity.ResultPreviewer): ''' Creates the preview for the result ''' def do_run(self): ''' Create a preview and return it ''' preview = Unity.GenericPreview.new(self.result.title, '', None) preview.props.image_source_uri = 'file://%s' % self.result.icon_hint try: preview.props.subtitle = self.result.metadata['authors'].get_string() except KeyError as e: print(e) description = '' try: description += self.result.metadata['journal'].get_string() + '\n\n' except KeyError as e: print(e) try: description += html.escape(self.result.metadata['abstract'].get_string()) except KeyError as e: print(e) preview.props.description_markup = description # Add the "View" action show_action = Unity.PreviewAction.new("show", _("View Article"), None) preview.add_action(show_action) return preview # Classes below this point establish communication # with Unity, you probably shouldn't modify them. class MySearch(Unity.ScopeSearchBase): def __init__(self, search_context): super(MySearch, self).__init__() self.set_search_context(search_context) def do_run(self): ''' Adds results to the model ''' try: result_set = self.search_context.result_set for i in search(self.search_context.search_query, self.search_context.filter_state): if not 'uri' in i or not i['uri'] or i['uri'] == '': continue if not 'icon' in i or not i['icon'] or i['icon'] == '': i['icon'] = DEFAULT_RESULT_ICON if not 'mimetype' in i or not i['mimetype'] or i['mimetype'] == '': i['mimetype'] = DEFAULT_RESULT_MIMETYPE if not 'result_type' in i or not i['result_type'] or i['result_type'] == '': i['result_type'] = DEFAULT_RESULT_TYPE if not 'category' in i or not i['category'] or i['category'] == '': i['category'] = 0 if not 'title' in i or not i['title']: i['title'] = '' if not 'comment' in i or not i['comment']: i['comment'] = '' if not 'dnd_uri' in i or not i['dnd_uri'] or i['dnd_uri'] == '': i['dnd_uri'] = i['uri'] i['provider_credits'] = GLib.Variant('s', PROVIDER_CREDITS) result_set.add_result(**i) except Exception as error: print(error) class Scope(Unity.AbstractScope): def __init__(self): Unity.AbstractScope.__init__(self) def do_get_search_hint(self): return SEARCH_HINT def do_get_schema(self): ''' Adds specific metadata fields ''' schema = Unity.Schema.new() if EXTRA_METADATA: for m in EXTRA_METADATA: schema.add_field(m['id'], m['type'], m['field']) #FIXME should be REQUIRED for credits schema.add_field('provider_credits', 's', Unity.SchemaFieldType.OPTIONAL) return schema def do_get_categories(self): ''' Adds categories ''' cs = Unity.CategorySet.new() if CATEGORIES: for c in CATEGORIES: cat = Unity.Category.new(c['id'], c['name'], Gio.ThemedIcon.new(c['icon']), c['renderer']) cs.add(cat) return cs def do_get_filters(self): ''' Adds filters ''' fs = Unity.FilterSet.new() # if FILTERS: # return fs def do_get_group_name(self): return GROUP_NAME def do_get_unique_name(self): return UNIQUE_PATH def do_create_search_for_query(self, search_context): se = MySearch(search_context) return se def do_activate(self, result, metadata, action): ''' What to do when a resut is clicked ''' return Unity.ActivationResponse(handled=Unity.HandledType.NOT_HANDLED, goto_uri=None) def do_create_previewer(self, result, metadata): ''' Creates a preview when a resut is right-clicked ''' result_preview = Preview() result_preview.set_scope_result(result) result_preview.set_search_metadata(metadata) return result_preview def load_scope(): return Scope() unity-scope-zotero-0.1+13.10.20130723/src/__init__.py0000644000015700001700000000000012173417306022374 0ustar pbuserpbgroup00000000000000unity-scope-zotero-0.1+13.10.20130723/setup.py0000644000015700001700000000156112173417306021223 0ustar pbuserpbgroup00000000000000#!/usr/bin/env python3 # -*- coding: utf-8 -*- ''' Setup file for zotero dash plugin ''' from distutils.core import setup from DistUtilsExtra.command import build_extra from DistUtilsExtra.command import build_i18n setup(name='unity-scope-zotero', version='0.1', author='Mark Tully', author_email='markjtully@gmail.com', url='http://launchpad.net/ubuntu-scopes', license='GNU General Public License (GPL)', data_files=[('share/dbus-1/services', ['data/unity-scope-zotero.service']), # ('share/icons/unity-icon-theme/places/svg', ['data/icons/service-zotero.svg']), ('share/unity-scopes/zotero', ['src/unity_zotero_daemon.py']), ('share/unity-scopes/zotero', ['src/__init__.py']), ], cmdclass={'build': build_extra.build_extra, 'build_i18n': build_i18n.build_i18n, }) unity-scope-zotero-0.1+13.10.20130723/setup.cfg0000644000015700001700000000020612173417306021325 0ustar pbuserpbgroup00000000000000[build] i18n=True [build_i18n] domain=unity-scope-zotero desktop_files=[('share/unity/scopes/reference', ('data/zotero.scope.in',))] unity-scope-zotero-0.1+13.10.20130723/data/0000755000015700001700000000000012173420231020406 5ustar pbuserpbgroup00000000000000unity-scope-zotero-0.1+13.10.20130723/data/unity-scope-zotero.service0000644000015700001700000000027012173417306025577 0ustar pbuserpbgroup00000000000000[D-BUS Service] Name=com.canonical.Unity.Scope.Academic.Zotero Exec=/usr/bin/python3 /usr/share/unity-scopes/scope-runner-dbus.py /usr/share/unity-scopes/zotero/unity_zotero_daemon.py unity-scope-zotero-0.1+13.10.20130723/data/zotero.scope0000644000015700001700000000061012173417306022771 0ustar pbuserpbgroup00000000000000[Scope] DBusName=com.canonical.Unity.Scope.Academic.Zotero DBusPath=/com/canonical/unity/scope/academic/zotero Icon= Keywords=zotero; RequiredMetadata= OptionalMetadata= Loader=/usr/share/unity-scopes/zotero/unity_zotero_daemon.py RemoteContent=false Type=academic Name=Zotero Description=Find Zotero items SearchHint=Search Zotero [Desktop Entry] X-Ubuntu-Gettext-Domain=unity-scope-zotero unity-scope-zotero-0.1+13.10.20130723/data/zotero.scope.in0000644000015700001700000000114012173417306023375 0ustar pbuserpbgroup00000000000000[Scope] DBusName=com.canonical.Unity.Scope.Academic.Zotero DBusPath=/com/canonical/unity/scope/academic/zotero Icon= _Keywords=zotero; RequiredMetadata= OptionalMetadata= Loader=/usr/share/unity-scopes/zotero/unity_zotero_daemon.py RemoteContent=false Type=reference _Name=Zotero _Description=This is an Ubuntu search plugin that enables information from Zotero to be searched and displayed in the Dash underneath the Reference header. If you do not wish to search this content source, you can disable this search plugin. _SearchHint=Search Zotero [Desktop Entry] X-Ubuntu-Gettext-Domain=unity-scope-zotero unity-scope-zotero-0.1+13.10.20130723/data/icons/0000755000015700001700000000000012173420231021521 5ustar pbuserpbgroup00000000000000