better display of description and time for a single photo
[photo-tags.git] / f-spot-db-reduce.sh
1 #!/bin/bash
2
3 #    copyright 2012,2013 Arun Persaud <arun@nubati.net>
4 #
5 #    This file is part of photo-tags.
6 #
7 #    Photo-tags is free software: you can redistribute it and/or modify
8 #    it under the terms of the GNU General Public License as published by
9 #    the Free Software Foundation, either version 3 of the License, or
10 #    (at your option) any later version.
11 #
12 #    Photo-tags is distributed in the hope that it will be useful,
13 #    but WITHOUT ANY WARRANTY; without even the implied warranty of
14 #    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15 #    GNU General Public License for more details.
16 #
17 #    You should have received a copy of the GNU General Public License
18 #    along with Photo-tags.  If not, see <http://www.gnu.org/licenses/>.
19
20 # parse ini file
21 CONFIG_FILE="config.ini"
22
23 # copied and modified from http://mark.aufflick.com/blog/2007/11/08/parsing-ini-files-with-sed
24 eval `sed -e 's/[[:space:]]*\=[[:space:]]*/=/g' \
25     -e 's/;.*$//' \
26     -e 's/\[.*\]//' \
27     -e 's/[[:space:]]*$//' \
28     -e 's/^[[:space:]]*//' \
29     -e "s/^\(.*\)=\([^\"']*\)$/\1=\"\2\"/" \
30    < $CONFIG_FILE `
31
32 LOCALDB=$fspotdb
33 REMOTEDB=$origdb
34 dbprefix=${dbprefix//\//\\\/}
35 # end parsing
36
37
38 function usage () {
39     echo <<EOF
40 f-spot-db-reduce.sh <options>
41
42 The script uses config.ini for most of it's input data.
43
44 Options:
45      --include=<comma separated taglist>      include pictures with these tags
46      --exclude=<comma separated taglist>      remove pictures with these tags
47      --hide=<comma separated taglist>         remove these tags, but leave pictures
48 EOF
49
50 }
51
52 # parse command line
53 CL_INCLUDE=""
54 CL_EXCLUDE=""
55 CL_HIDE=""
56
57 for i in "$@"; do
58     case $i in
59         --include=*)
60            CL_INCLUDE=${i#*=}
61            ;;
62         --exclude=*)
63            CL_EXCLUDE=${i#*=}
64            ;;
65         --hide=*)
66            CL_HIDE=${i#*=}
67            ;;
68         -h|--help)
69            usage
70            ;;
71     esac
72 done
73
74 # check database version, exit if different from what we expect
75 DBVERSION=`sqlite3 $REMOTEDB 'select data from meta where name="F-Spot Database Version"'`
76
77 if [ x"$DBVERSION" != "x18" ] ; then
78     echo "The database is from a different F-spot version (database version $DBVERSION) that is not implemented."
79     echo "Check TODO for a newer version or file a bug-report at: TODO"
80     exit 2
81 fi
82
83
84 # join tags together in a list of comma seperated quoted strings, so that they can be used in DB queries
85 INCLUDE="'${CL_INCLUDE/,/','}'"
86 EXCLUDE="'${CL_EXCLUDE/,/','}'"
87 HIDE="'${CL_HIDE/,/','}'"
88
89 if [ "x$INCLUDE" != "x" ] ; then
90     echo "only including pictures with tags: $INCLUDE"
91 fi
92
93 if [ "x$EXCLUDE" != "x" ] ; then
94     echo "excluding all pictures with tags: $EXCLUDE"
95 fi
96
97 if [ "x$HIDE" != "x" ] ; then
98     echo "removing tags: $HIDE"
99 fi
100
101 if [ "x$EXCLUDE" == "x" -a "x$INCLUDE" == "x" ] ; then
102     echo "using all pictures from the database"
103 fi
104
105 # test if localdb already exist:
106 # yes:
107 #     see if photo-db is newer? yes: merge them; no: do nothing
108 # no:
109 #     create it
110
111 cp $REMOTEDB  $LOCALDB
112
113 ExcludeTags=""
114 if [ "x$EXCLUDE" != "x" ] ; then
115     ExcludeTags="insert into rmphotoids select photo_id from photo_tags where tag_id in (select id from tags where name in ($EXCLUDE));"
116 fi
117
118 HideTags=""
119 if [ "x$HIDE" != "x" ] ; then
120     HideTags="delete from photo_tags where tag_id in (select id from tags where name in ($HIDE));
121               delete from tags where name in ($HIDE);"
122 fi
123
124 # delete all photo related information that we don't want to keep in case INCLUDE tags were given
125 sqlite3 $LOCALDB <<EOF
126 create temp table rmphotoids as select id from photos where id not in (select photo_id from photo_tags where tag_id in (select id from tags where name in ($INCLUDE)));
127
128 $ExcludeTags
129 $HideTags
130
131 delete from photos where id in (select * from rmphotoids);
132 delete from photo_tags where photo_id in (select * from rmphotoids);
133 delete from photo_versions where photo_id in (select * from rmphotoids);
134
135 delete from tags where id not in (select distinct tag_id from photo_tags asc);
136 delete from rolls where id not in (select distinct roll_id from photos asc);
137
138 drop table rmphotoids;
139 drop table jobs;
140 drop table exports;
141
142 vacuum;
143
144 EOF