0000: 2f 2a 20 0a 2f 20 65 78 69 66 5f 6c 6f 61 64 65 /* ./ exif_loade
0010: 72 0a 2f 0a 2f 20 61 20 74 6f 6f 6c 20 66 6f 72 r././ a tool for
0020: 20 75 70 6c 6f 61 64 69 6e 67 20 4a 50 45 47 2f uploading JPEG/
0030: 45 58 49 46 20 70 68 6f 74 6f 73 20 69 6e 74 6f EXIF photos into
0040: 20 61 20 44 42 20 0a 2f 20 70 72 65 73 65 72 76 a DB ./ preserv
0050: 69 6e 67 20 66 75 6c 6c 20 45 78 69 66 20 6d 65 ing full Exif me
0060: 74 61 64 61 74 61 20 61 6e 64 20 62 75 69 6c 64 tadata and build
0070: 69 6e 67 20 47 65 6f 6d 65 74 72 79 20 66 72 6f ing Geometry fro
0080: 6d 20 47 50 53 20 74 61 67 73 20 5b 69 66 20 70 m GPS tags [if p
0090: 72 65 73 65 6e 74 5d 0a 2f 0a 2f 20 76 65 72 73 resent]././ vers
00a0: 69 6f 6e 20 31 2e 30 2c 20 32 30 30 38 20 4f 63 ion 1.0, 2008 Oc
00b0: 74 6f 62 65 72 20 31 33 0a 2f 0a 2f 20 41 75 74 tober 13././ Aut
00c0: 68 6f 72 3a 20 53 61 6e 64 72 6f 20 46 75 72 69 hor: Sandro Furi
00d0: 65 72 69 20 61 2e 66 75 72 69 65 72 69 40 6c 71 eri a.furieri@lq
00e0: 74 2e 69 74 0a 2f 0a 2f 20 43 6f 70 79 72 69 67 t.it././ Copyrig
00f0: 68 74 20 28 43 29 20 32 30 30 38 20 20 41 6c 65 ht (C) 2008 Ale
0100: 73 73 61 6e 64 72 6f 20 46 75 72 69 65 72 69 0a ssandro Furieri.
0110: 2f 0a 2f 20 20 20 20 54 68 69 73 20 70 72 6f 67 /./ This prog
0120: 72 61 6d 20 69 73 20 66 72 65 65 20 73 6f 66 74 ram is free soft
0130: 77 61 72 65 3a 20 79 6f 75 20 63 61 6e 20 72 65 ware: you can re
0140: 64 69 73 74 72 69 62 75 74 65 20 69 74 20 61 6e distribute it an
0150: 64 2f 6f 72 20 6d 6f 64 69 66 79 0a 2f 20 20 20 d/or modify./
0160: 20 69 74 20 75 6e 64 65 72 20 74 68 65 20 74 65 it under the te
0170: 72 6d 73 20 6f 66 20 74 68 65 20 47 4e 55 20 47 rms of the GNU G
0180: 65 6e 65 72 61 6c 20 50 75 62 6c 69 63 20 4c 69 eneral Public Li
0190: 63 65 6e 73 65 20 61 73 20 70 75 62 6c 69 73 68 cense as publish
01a0: 65 64 20 62 79 0a 2f 20 20 20 20 74 68 65 20 46 ed by./ the F
01b0: 72 65 65 20 53 6f 66 74 77 61 72 65 20 46 6f 75 ree Software Fou
01c0: 6e 64 61 74 69 6f 6e 2c 20 65 69 74 68 65 72 20 ndation, either
01d0: 76 65 72 73 69 6f 6e 20 33 20 6f 66 20 74 68 65 version 3 of the
01e0: 20 4c 69 63 65 6e 73 65 2c 20 6f 72 0a 2f 20 20 License, or./
01f0: 20 20 28 61 74 20 79 6f 75 72 20 6f 70 74 69 6f (at your optio
0200: 6e 29 20 61 6e 79 20 6c 61 74 65 72 20 76 65 72 n) any later ver
0210: 73 69 6f 6e 2e 0a 2f 0a 2f 20 20 20 20 54 68 69 sion.././ Thi
0220: 73 20 70 72 6f 67 72 61 6d 20 69 73 20 64 69 73 s program is dis
0230: 74 72 69 62 75 74 65 64 20 69 6e 20 74 68 65 20 tributed in the
0240: 68 6f 70 65 20 74 68 61 74 20 69 74 20 77 69 6c hope that it wil
0250: 6c 20 62 65 20 75 73 65 66 75 6c 2c 0a 2f 20 20 l be useful,./
0260: 20 20 62 75 74 20 57 49 54 48 4f 55 54 20 41 4e but WITHOUT AN
0270: 59 20 57 41 52 52 41 4e 54 59 3b 20 77 69 74 68 Y WARRANTY; with
0280: 6f 75 74 20 65 76 65 6e 20 74 68 65 20 69 6d 70 out even the imp
0290: 6c 69 65 64 20 77 61 72 72 61 6e 74 79 20 6f 66 lied warranty of
02a0: 0a 2f 20 20 20 20 4d 45 52 43 48 41 4e 54 41 42 ./ MERCHANTAB
02b0: 49 4c 49 54 59 20 6f 72 20 46 49 54 4e 45 53 53 ILITY or FITNESS
02c0: 20 46 4f 52 20 41 20 50 41 52 54 49 43 55 4c 41 FOR A PARTICULA
02d0: 52 20 50 55 52 50 4f 53 45 2e 20 20 53 65 65 20 R PURPOSE. See
02e0: 74 68 65 0a 2f 20 20 20 20 47 4e 55 20 47 65 6e the./ GNU Gen
02f0: 65 72 61 6c 20 50 75 62 6c 69 63 20 4c 69 63 65 eral Public Lice
0300: 6e 73 65 20 66 6f 72 20 6d 6f 72 65 20 64 65 74 nse for more det
0310: 61 69 6c 73 2e 0a 2f 0a 2f 20 20 20 20 59 6f 75 ails.././ You
0320: 20 73 68 6f 75 6c 64 20 68 61 76 65 20 72 65 63 should have rec
0330: 65 69 76 65 64 20 61 20 63 6f 70 79 20 6f 66 20 eived a copy of
0340: 74 68 65 20 47 4e 55 20 47 65 6e 65 72 61 6c 20 the GNU General
0350: 50 75 62 6c 69 63 20 4c 69 63 65 6e 73 65 0a 2f Public License./
0360: 20 20 20 20 61 6c 6f 6e 67 20 77 69 74 68 20 74 along with t
0370: 68 69 73 20 70 72 6f 67 72 61 6d 2e 20 20 49 66 his program. If
0380: 20 6e 6f 74 2c 20 73 65 65 20 3c 68 74 74 70 3a not, see <http:
0390: 2f 2f 77 77 77 2e 67 6e 75 2e 6f 72 67 2f 6c 69 //www.gnu.org/li
03a0: 63 65 6e 73 65 73 2f 3e 2e 0a 2f 0a 2a 2f 0a 0a censes/>../.*/..
03b0: 23 69 6e 63 6c 75 64 65 20 3c 73 74 64 6c 69 62 #include <stdlib
03c0: 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74 .h>.#include <st
03d0: 64 69 6f 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 dio.h>.#include
03e0: 3c 73 74 72 69 6e 67 2e 68 3e 0a 23 69 6e 63 6c <string.h>.#incl
03f0: 75 64 65 20 3c 6d 61 74 68 2e 68 3e 0a 23 69 6e ude <math.h>.#in
0400: 63 6c 75 64 65 20 3c 66 6c 6f 61 74 2e 68 3e 0a clude <float.h>.
0410: 23 69 6e 63 6c 75 64 65 20 3c 65 72 72 6e 6f 2e #include <errno.
0420: 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79 73 h>.#include <sys
0430: 2f 74 79 70 65 73 2e 68 3e 0a 0a 23 69 66 20 64 /types.h>..#if d
0440: 65 66 69 6e 65 64 28 5f 57 49 4e 33 32 29 20 26 efined(_WIN32) &
0450: 26 20 21 64 65 66 69 6e 65 64 28 5f 5f 4d 49 4e & !defined(__MIN
0460: 47 57 33 32 5f 5f 29 0a 23 69 6e 63 6c 75 64 65 GW32__).#include
0470: 20 22 63 6f 6e 66 69 67 2d 6d 73 76 63 2e 68 22 "config-msvc.h"
0480: 0a 23 65 6c 73 65 0a 23 69 6e 63 6c 75 64 65 20 .#else.#include
0490: 22 63 6f 6e 66 69 67 2e 68 22 0a 23 65 6e 64 69 "config.h".#endi
04a0: 66 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f f..#if defined(_
04b0: 57 49 4e 33 32 29 20 26 26 20 21 64 65 66 69 6e WIN32) && !defin
04c0: 65 64 28 5f 5f 4d 49 4e 47 57 33 32 5f 5f 29 0a ed(__MINGW32__).
04d0: 23 69 6e 63 6c 75 64 65 20 3c 69 6f 2e 68 3e 0a #include <io.h>.
04e0: 23 69 6e 63 6c 75 64 65 20 3c 64 69 72 65 63 74 #include <direct
04f0: 2e 68 3e 0a 23 65 6c 73 65 0a 23 69 6e 63 6c 75 .h>.#else.#inclu
0500: 64 65 20 3c 64 69 72 65 6e 74 2e 68 3e 0a 23 65 de <dirent.h>.#e
0510: 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53 50 41 ndif..#ifdef SPA
0520: 54 49 41 4c 49 54 45 5f 41 4d 41 4c 47 41 4d 41 TIALITE_AMALGAMA
0530: 54 49 4f 4e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 TION.#include <s
0540: 70 61 74 69 61 6c 69 74 65 2f 73 71 6c 69 74 65 patialite/sqlite
0550: 33 2e 68 3e 0a 23 65 6c 73 65 0a 23 69 6e 63 6c 3.h>.#else.#incl
0560: 75 64 65 20 3c 73 71 6c 69 74 65 33 2e 68 3e 0a ude <sqlite3.h>.
0570: 23 65 6e 64 69 66 0a 0a 23 69 6e 63 6c 75 64 65 #endif..#include
0580: 20 3c 73 70 61 74 69 61 6c 69 74 65 2f 67 61 69 <spatialite/gai
0590: 61 65 78 69 66 2e 68 3e 0a 23 69 6e 63 6c 75 64 aexif.h>.#includ
05a0: 65 20 3c 73 70 61 74 69 61 6c 69 74 65 2f 67 61 e <spatialite/ga
05b0: 69 61 67 65 6f 2e 68 3e 0a 23 69 6e 63 6c 75 64 iageo.h>.#includ
05c0: 65 20 3c 73 70 61 74 69 61 6c 69 74 65 2e 68 3e e <spatialite.h>
05d0: 0a 0a 23 64 65 66 69 6e 65 20 41 52 47 5f 4e 4f ..#define ARG_NO
05e0: 4e 45 09 09 09 30 0a 23 64 65 66 69 6e 65 20 41 NE...0.#define A
05f0: 52 47 5f 44 42 5f 50 41 54 48 09 09 09 31 0a 23 RG_DB_PATH...1.#
0600: 64 65 66 69 6e 65 20 41 52 47 5f 44 49 52 09 09 define ARG_DIR..
0610: 09 09 32 0a 23 64 65 66 69 6e 65 20 41 52 47 5f ..2.#define ARG_
0620: 46 49 4c 45 09 09 09 33 0a 0a 23 69 66 20 64 65 FILE...3..#if de
0630: 66 69 6e 65 64 28 5f 57 49 4e 33 32 29 20 26 26 fined(_WIN32) &&
0640: 20 21 64 65 66 69 6e 65 64 28 5f 5f 4d 49 4e 47 !defined(__MING
0650: 57 33 32 5f 5f 29 0a 23 64 65 66 69 6e 65 20 73 W32__).#define s
0660: 74 72 63 61 73 65 63 6d 70 09 5f 73 74 72 69 63 trcasecmp._stric
0670: 6d 70 0a 23 65 6e 64 69 66 20 2f 2a 20 6e 6f 74 mp.#endif /* not
0680: 20 57 49 4e 33 32 20 2a 2f 0a 0a 73 74 61 74 69 WIN32 */..stati
0690: 63 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 0a c sqlite3_int64.
06a0: 67 65 74 50 69 78 65 6c 58 20 28 67 61 69 61 45 getPixelX (gaiaE
06b0: 78 69 66 54 61 67 4c 69 73 74 50 74 72 20 74 61 xifTagListPtr ta
06c0: 67 5f 6c 69 73 74 2c 20 69 6e 74 20 2a 6f 6b 29 g_list, int *ok)
06d0: 0a 7b 0a 2f 2a 20 74 72 79 69 6e 67 20 74 6f 20 .{./* trying to
06e0: 72 65 74 72 69 65 76 65 20 74 68 65 20 45 78 69 retrieve the Exi
06f0: 66 49 6d 61 67 65 57 69 64 74 68 20 2a 2f 0a 20 fImageWidth */.
0700: 20 20 20 67 61 69 61 45 78 69 66 54 61 67 50 74 gaiaExifTagPt
0710: 72 20 74 61 67 3b 0a 20 20 20 20 2a 6f 6b 20 3d r tag;. *ok =
0720: 20 30 3b 0a 20 20 20 20 69 66 20 28 21 74 61 67 0;. if (!tag
0730: 5f 6c 69 73 74 29 0a 09 72 65 74 75 72 6e 20 30 _list)..return 0
0740: 3b 0a 20 20 20 20 74 61 67 20 3d 20 74 61 67 5f ;. tag = tag_
0750: 6c 69 73 74 2d 3e 46 69 72 73 74 3b 0a 20 20 20 list->First;.
0760: 20 77 68 69 6c 65 20 28 74 61 67 29 0a 20 20 20 while (tag).
0770: 20 20 20 7b 0a 09 20 20 69 66 20 28 74 61 67 2d {.. if (tag-
0780: 3e 54 61 67 49 64 20 3d 3d 20 30 78 41 30 30 32 >TagId == 0xA002
0790: 29 0a 09 20 20 20 20 7b 0a 09 09 2f 2a 20 6f 6b ).. {.../* ok
07a0: 2c 20 74 68 69 73 20 6f 6e 65 20 69 73 20 74 68 , this one is th
07b0: 65 20 45 78 69 66 49 6d 61 67 65 57 69 64 74 68 e ExifImageWidth
07c0: 20 74 61 67 20 2a 2f 0a 09 09 69 66 20 28 74 61 tag */...if (ta
07d0: 67 2d 3e 54 79 70 65 20 3d 3d 20 33 20 26 26 20 g->Type == 3 &&
07e0: 74 61 67 2d 3e 43 6f 75 6e 74 20 3d 3d 20 31 29 tag->Count == 1)
07f0: 0a 09 09 20 20 7b 0a 09 09 20 20 20 20 20 20 2a ... {... *
0800: 6f 6b 20 3d 20 31 3b 0a 09 09 20 20 20 20 20 20 ok = 1;...
0810: 72 65 74 75 72 6e 20 2a 28 74 61 67 2d 3e 53 68 return *(tag->Sh
0820: 6f 72 74 56 61 6c 75 65 73 20 2b 20 30 29 3b 0a ortValues + 0);.
0830: 09 09 20 20 7d 0a 09 09 65 6c 73 65 20 69 66 20 .. }...else if
0840: 28 74 61 67 2d 3e 54 79 70 65 20 3d 3d 20 34 20 (tag->Type == 4
0850: 26 26 20 74 61 67 2d 3e 43 6f 75 6e 74 20 3d 3d && tag->Count ==
0860: 20 31 29 0a 09 09 20 20 7b 0a 09 09 20 20 20 20 1)... {...
0870: 20 20 2a 6f 6b 20 3d 20 31 3b 0a 09 09 20 20 20 *ok = 1;...
0880: 20 20 20 72 65 74 75 72 6e 20 2a 28 74 61 67 2d return *(tag-
0890: 3e 4c 6f 6e 67 56 61 6c 75 65 73 20 2b 20 30 29 >LongValues + 0)
08a0: 3b 0a 09 09 20 20 7d 0a 09 20 20 20 20 7d 0a 09 ;... }.. }..
08b0: 20 20 74 61 67 20 3d 20 74 61 67 2d 3e 4e 65 78 tag = tag->Nex
08c0: 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 72 t;. }. r
08d0: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 73 74 61 74 eturn 0;.}..stat
08e0: 69 63 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 ic sqlite3_int64
08f0: 0a 67 65 74 50 69 78 65 6c 59 20 28 67 61 69 61 .getPixelY (gaia
0900: 45 78 69 66 54 61 67 4c 69 73 74 50 74 72 20 74 ExifTagListPtr t
0910: 61 67 5f 6c 69 73 74 2c 20 69 6e 74 20 2a 6f 6b ag_list, int *ok
0920: 29 0a 7b 0a 2f 2a 20 74 72 79 69 6e 67 20 74 6f ).{./* trying to
0930: 20 72 65 74 72 69 65 76 65 20 74 68 65 20 45 78 retrieve the Ex
0940: 69 66 49 6d 61 67 65 4c 65 6e 67 74 68 20 2a 2f ifImageLength */
0950: 0a 20 20 20 20 67 61 69 61 45 78 69 66 54 61 67 . gaiaExifTag
0960: 50 74 72 20 74 61 67 3b 0a 20 20 20 20 2a 6f 6b Ptr tag;. *ok
0970: 20 3d 20 30 3b 0a 20 20 20 20 69 66 20 28 21 74 = 0;. if (!t
0980: 61 67 5f 6c 69 73 74 29 0a 09 72 65 74 75 72 6e ag_list)..return
0990: 20 30 3b 0a 20 20 20 20 74 61 67 20 3d 20 74 61 0;. tag = ta
09a0: 67 5f 6c 69 73 74 2d 3e 46 69 72 73 74 3b 0a 20 g_list->First;.
09b0: 20 20 20 77 68 69 6c 65 20 28 74 61 67 29 0a 20 while (tag).
09c0: 20 20 20 20 20 7b 0a 09 20 20 69 66 20 28 74 61 {.. if (ta
09d0: 67 2d 3e 54 61 67 49 64 20 3d 3d 20 30 78 41 30 g->TagId == 0xA0
09e0: 30 33 29 0a 09 20 20 20 20 7b 0a 09 09 2f 2a 20 03).. {.../*
09f0: 6f 6b 2c 20 74 68 69 73 20 6f 6e 65 20 69 73 20 ok, this one is
0a00: 74 68 65 20 45 78 69 66 49 6d 61 67 65 4c 65 6e the ExifImageLen
0a10: 67 74 68 20 74 61 67 20 2a 2f 0a 09 09 69 66 20 gth tag */...if
0a20: 28 74 61 67 2d 3e 54 79 70 65 20 3d 3d 20 33 20 (tag->Type == 3
0a30: 26 26 20 74 61 67 2d 3e 43 6f 75 6e 74 20 3d 3d && tag->Count ==
0a40: 20 31 29 0a 09 09 20 20 7b 0a 09 09 20 20 20 20 1)... {...
0a50: 20 20 2a 6f 6b 20 3d 20 31 3b 0a 09 09 20 20 20 *ok = 1;...
0a60: 20 20 20 72 65 74 75 72 6e 20 2a 28 74 61 67 2d return *(tag-
0a70: 3e 53 68 6f 72 74 56 61 6c 75 65 73 20 2b 20 30 >ShortValues + 0
0a80: 29 3b 0a 09 09 20 20 7d 0a 09 09 65 6c 73 65 20 );... }...else
0a90: 69 66 20 28 74 61 67 2d 3e 54 79 70 65 20 3d 3d if (tag->Type ==
0aa0: 20 34 20 26 26 20 74 61 67 2d 3e 43 6f 75 6e 74 4 && tag->Count
0ab0: 20 3d 3d 20 31 29 0a 09 09 20 20 7b 0a 09 09 20 == 1)... {...
0ac0: 20 20 20 20 20 2a 6f 6b 20 3d 20 31 3b 0a 09 09 *ok = 1;...
0ad0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 2a 28 74 return *(t
0ae0: 61 67 2d 3e 4c 6f 6e 67 56 61 6c 75 65 73 20 2b ag->LongValues +
0af0: 20 30 29 3b 0a 09 09 20 20 7d 0a 09 20 20 20 20 0);... }..
0b00: 7d 0a 09 20 20 74 61 67 20 3d 20 74 61 67 2d 3e }.. tag = tag->
0b10: 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 Next;. }.
0b20: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 73 return 0;.}..s
0b30: 74 61 74 69 63 20 76 6f 69 64 0a 67 65 74 4d 61 tatic void.getMa
0b40: 6b 65 20 28 67 61 69 61 45 78 69 66 54 61 67 4c ke (gaiaExifTagL
0b50: 69 73 74 50 74 72 20 74 61 67 5f 6c 69 73 74 2c istPtr tag_list,
0b60: 20 63 68 61 72 20 2a 73 74 72 2c 20 69 6e 74 20 char *str, int
0b70: 6c 65 6e 2c 20 69 6e 74 20 2a 6f 6b 29 0a 7b 0a len, int *ok).{.
0b80: 2f 2a 20 74 72 79 69 6e 67 20 74 6f 20 72 65 74 /* trying to ret
0b90: 72 69 65 76 65 20 74 68 65 20 4d 61 6b 65 20 2a rieve the Make *
0ba0: 2f 0a 20 20 20 20 67 61 69 61 45 78 69 66 54 61 /. gaiaExifTa
0bb0: 67 50 74 72 20 74 61 67 3b 0a 20 20 20 20 69 6e gPtr tag;. in
0bc0: 74 20 6c 3b 0a 20 20 20 20 2a 6f 6b 20 3d 20 30 t l;. *ok = 0
0bd0: 3b 0a 20 20 20 20 69 66 20 28 21 74 61 67 5f 6c ;. if (!tag_l
0be0: 69 73 74 29 0a 09 72 65 74 75 72 6e 3b 0a 20 20 ist)..return;.
0bf0: 20 20 74 61 67 20 3d 20 74 61 67 5f 6c 69 73 74 tag = tag_list
0c00: 2d 3e 46 69 72 73 74 3b 0a 20 20 20 20 77 68 69 ->First;. whi
0c10: 6c 65 20 28 74 61 67 29 0a 20 20 20 20 20 20 7b le (tag). {
0c20: 0a 09 20 20 69 66 20 28 74 61 67 2d 3e 54 61 67 .. if (tag->Tag
0c30: 49 64 20 3d 3d 20 30 78 30 31 30 46 29 0a 09 20 Id == 0x010F)..
0c40: 20 20 20 7b 0a 09 09 2f 2a 20 6f 6b 2c 20 74 68 {.../* ok, th
0c50: 69 73 20 6f 6e 65 20 69 73 20 74 68 65 20 4d 61 is one is the Ma
0c60: 6b 65 20 74 61 67 20 2a 2f 0a 09 09 69 66 20 28 ke tag */...if (
0c70: 74 61 67 2d 3e 54 79 70 65 20 3d 3d 20 32 29 0a tag->Type == 2).
0c80: 09 09 20 20 7b 0a 09 09 20 20 20 20 20 20 2a 6f .. {... *o
0c90: 6b 20 3d 20 31 3b 0a 09 09 20 20 20 20 20 20 6c k = 1;... l
0ca0: 20 3d 20 73 74 72 6c 65 6e 20 28 74 61 67 2d 3e = strlen (tag->
0cb0: 53 74 72 69 6e 67 56 61 6c 75 65 29 3b 0a 09 09 StringValue);...
0cc0: 20 20 20 20 20 20 69 66 20 28 6c 65 6e 20 3e 20 if (len >
0cd0: 6c 29 0a 09 09 09 20 20 73 74 72 63 70 79 20 28 l).... strcpy (
0ce0: 73 74 72 2c 20 74 61 67 2d 3e 53 74 72 69 6e 67 str, tag->String
0cf0: 56 61 6c 75 65 29 3b 0a 09 09 20 20 20 20 20 20 Value);...
0d00: 65 6c 73 65 0a 09 09 09 7b 0a 09 09 09 20 20 20 else....{....
0d10: 20 6d 65 6d 73 65 74 20 28 73 74 72 2c 20 27 5c memset (str, '\
0d20: 30 27 2c 20 6c 65 6e 29 3b 0a 09 09 09 20 20 20 0', len);....
0d30: 20 6d 65 6d 63 70 79 20 28 73 74 72 2c 20 74 61 memcpy (str, ta
0d40: 67 2d 3e 53 74 72 69 6e 67 56 61 6c 75 65 2c 20 g->StringValue,
0d50: 6c 65 6e 20 2d 20 31 29 3b 0a 09 09 09 7d 0a 09 len - 1);....}..
0d60: 09 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 09 . return;..
0d70: 09 20 20 7d 0a 09 20 20 20 20 7d 0a 09 20 20 74 . }.. }.. t
0d80: 61 67 20 3d 20 74 61 67 2d 3e 4e 65 78 74 3b 0a ag = tag->Next;.
0d90: 20 20 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 }. retu
0da0: 72 6e 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f rn;.}..static vo
0db0: 69 64 0a 67 65 74 4d 6f 64 65 6c 20 28 67 61 69 id.getModel (gai
0dc0: 61 45 78 69 66 54 61 67 4c 69 73 74 50 74 72 20 aExifTagListPtr
0dd0: 74 61 67 5f 6c 69 73 74 2c 20 63 68 61 72 20 2a tag_list, char *
0de0: 73 74 72 2c 20 69 6e 74 20 6c 65 6e 2c 20 69 6e str, int len, in
0df0: 74 20 2a 6f 6b 29 0a 7b 0a 2f 2a 20 74 72 79 69 t *ok).{./* tryi
0e00: 6e 67 20 74 6f 20 72 65 74 72 69 65 76 65 20 74 ng to retrieve t
0e10: 68 65 20 4d 6f 64 65 6c 20 2a 2f 0a 20 20 20 20 he Model */.
0e20: 67 61 69 61 45 78 69 66 54 61 67 50 74 72 20 74 gaiaExifTagPtr t
0e30: 61 67 3b 0a 20 20 20 20 69 6e 74 20 6c 3b 0a 20 ag;. int l;.
0e40: 20 20 20 2a 6f 6b 20 3d 20 30 3b 0a 20 20 20 20 *ok = 0;.
0e50: 69 66 20 28 21 74 61 67 5f 6c 69 73 74 29 0a 09 if (!tag_list)..
0e60: 72 65 74 75 72 6e 3b 0a 20 20 20 20 74 61 67 20 return;. tag
0e70: 3d 20 74 61 67 5f 6c 69 73 74 2d 3e 46 69 72 73 = tag_list->Firs
0e80: 74 3b 0a 20 20 20 20 77 68 69 6c 65 20 28 74 61 t;. while (ta
0e90: 67 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 69 66 g). {.. if
0ea0: 20 28 74 61 67 2d 3e 54 61 67 49 64 20 3d 3d 20 (tag->TagId ==
0eb0: 30 78 30 31 31 30 29 0a 09 20 20 20 20 7b 0a 09 0x0110).. {..
0ec0: 09 2f 2a 20 6f 6b 2c 20 74 68 69 73 20 6f 6e 65 ./* ok, this one
0ed0: 20 69 73 20 74 68 65 20 4d 6f 64 65 6c 20 74 61 is the Model ta
0ee0: 67 20 2a 2f 0a 09 09 69 66 20 28 74 61 67 2d 3e g */...if (tag->
0ef0: 54 79 70 65 20 3d 3d 20 32 29 0a 09 09 20 20 7b Type == 2)... {
0f00: 0a 09 09 20 20 20 20 20 20 2a 6f 6b 20 3d 20 31 ... *ok = 1
0f10: 3b 0a 09 09 20 20 20 20 20 20 6c 20 3d 20 73 74 ;... l = st
0f20: 72 6c 65 6e 20 28 74 61 67 2d 3e 53 74 72 69 6e rlen (tag->Strin
0f30: 67 56 61 6c 75 65 29 3b 0a 09 09 20 20 20 20 20 gValue);...
0f40: 20 69 66 20 28 6c 65 6e 20 3e 20 6c 29 0a 09 09 if (len > l)...
0f50: 09 20 20 73 74 72 63 70 79 20 28 73 74 72 2c 20 . strcpy (str,
0f60: 74 61 67 2d 3e 53 74 72 69 6e 67 56 61 6c 75 65 tag->StringValue
0f70: 29 3b 0a 09 09 20 20 20 20 20 20 65 6c 73 65 0a );... else.
0f80: 09 09 09 7b 0a 09 09 09 20 20 20 20 6d 65 6d 73 ...{.... mems
0f90: 65 74 20 28 73 74 72 2c 20 27 5c 30 27 2c 20 6c et (str, '\0', l
0fa0: 65 6e 29 3b 0a 09 09 09 20 20 20 20 6d 65 6d 63 en);.... memc
0fb0: 70 79 20 28 73 74 72 2c 20 74 61 67 2d 3e 53 74 py (str, tag->St
0fc0: 72 69 6e 67 56 61 6c 75 65 2c 20 6c 65 6e 20 2d ringValue, len -
0fd0: 20 31 29 3b 0a 09 09 09 7d 0a 09 09 20 20 20 20 1);....}...
0fe0: 20 20 72 65 74 75 72 6e 3b 0a 09 09 20 20 7d 0a return;... }.
0ff0: 09 20 20 20 20 7d 0a 09 20 20 74 61 67 20 3d 20 . }.. tag =
1000: 74 61 67 2d 3e 4e 65 78 74 3b 0a 20 20 20 20 20 tag->Next;.
1010: 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 7d }. return;.}
1020: 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 0a 67 65 ..static void.ge
1030: 74 44 61 74 65 20 28 67 61 69 61 45 78 69 66 54 tDate (gaiaExifT
1040: 61 67 4c 69 73 74 50 74 72 20 74 61 67 5f 6c 69 agListPtr tag_li
1050: 73 74 2c 20 63 68 61 72 20 2a 73 74 72 2c 20 69 st, char *str, i
1060: 6e 74 20 6c 65 6e 2c 20 69 6e 74 20 2a 6f 6b 29 nt len, int *ok)
1070: 0a 7b 0a 2f 2a 20 74 72 79 69 6e 67 20 74 6f 20 .{./* trying to
1080: 72 65 74 72 69 65 76 65 20 74 68 65 20 44 61 74 retrieve the Dat
1090: 65 20 2a 2f 0a 20 20 20 20 67 61 69 61 45 78 69 e */. gaiaExi
10a0: 66 54 61 67 50 74 72 20 74 61 67 3b 0a 20 20 20 fTagPtr tag;.
10b0: 20 69 6e 74 20 6c 3b 0a 20 20 20 20 2a 6f 6b 20 int l;. *ok
10c0: 3d 20 30 3b 0a 20 20 20 20 69 66 20 28 21 74 61 = 0;. if (!ta
10d0: 67 5f 6c 69 73 74 29 0a 09 72 65 74 75 72 6e 3b g_list)..return;
10e0: 0a 20 20 20 20 74 61 67 20 3d 20 74 61 67 5f 6c . tag = tag_l
10f0: 69 73 74 2d 3e 46 69 72 73 74 3b 0a 20 20 20 20 ist->First;.
1100: 77 68 69 6c 65 20 28 74 61 67 29 0a 20 20 20 20 while (tag).
1110: 20 20 7b 0a 09 20 20 69 66 20 28 74 61 67 2d 3e {.. if (tag->
1120: 54 61 67 49 64 20 3d 3d 20 30 78 39 30 30 33 29 TagId == 0x9003)
1130: 0a 09 20 20 20 20 7b 0a 09 09 2f 2a 20 6f 6b 2c .. {.../* ok,
1140: 20 74 68 69 73 20 6f 6e 65 20 69 73 20 74 68 65 this one is the
1150: 20 44 61 74 65 54 69 6d 65 4f 72 69 67 69 6e 61 DateTimeOrigina
1160: 6c 20 74 61 67 20 2a 2f 0a 09 09 69 66 20 28 74 l tag */...if (t
1170: 61 67 2d 3e 54 79 70 65 20 3d 3d 20 32 29 0a 09 ag->Type == 2)..
1180: 09 20 20 7b 0a 09 09 20 20 20 20 20 20 2a 6f 6b . {... *ok
1190: 20 3d 20 31 3b 0a 09 09 20 20 20 20 20 20 6c 20 = 1;... l
11a0: 3d 20 73 74 72 6c 65 6e 20 28 74 61 67 2d 3e 53 = strlen (tag->S
11b0: 74 72 69 6e 67 56 61 6c 75 65 29 3b 0a 09 09 20 tringValue);...
11c0: 20 20 20 20 20 69 66 20 28 6c 65 6e 20 3e 20 6c if (len > l
11d0: 29 0a 09 09 09 20 20 73 74 72 63 70 79 20 28 73 ).... strcpy (s
11e0: 74 72 2c 20 74 61 67 2d 3e 53 74 72 69 6e 67 56 tr, tag->StringV
11f0: 61 6c 75 65 29 3b 0a 09 09 20 20 20 20 20 20 65 alue);... e
1200: 6c 73 65 0a 09 09 09 7b 0a 09 09 09 20 20 20 20 lse....{....
1210: 6d 65 6d 73 65 74 20 28 73 74 72 2c 20 27 5c 30 memset (str, '\0
1220: 27 2c 20 6c 65 6e 29 3b 0a 09 09 09 20 20 20 20 ', len);....
1230: 6d 65 6d 63 70 79 20 28 73 74 72 2c 20 74 61 67 memcpy (str, tag
1240: 2d 3e 53 74 72 69 6e 67 56 61 6c 75 65 2c 20 6c ->StringValue, l
1250: 65 6e 20 2d 20 31 29 3b 0a 09 09 09 7d 0a 09 09 en - 1);....}...
1260: 20 20 20 20 20 20 69 66 20 28 6c 65 6e 20 3e 20 if (len >
1270: 31 39 29 0a 09 09 09 7b 0a 09 09 09 20 20 20 20 19)....{....
1280: 73 74 72 5b 34 5d 20 3d 20 27 2d 27 3b 0a 09 09 str[4] = '-';...
1290: 09 20 20 20 20 73 74 72 5b 37 5d 20 3d 20 27 2d . str[7] = '-
12a0: 27 3b 0a 09 09 09 7d 0a 09 09 20 20 20 20 20 20 ';....}...
12b0: 72 65 74 75 72 6e 3b 0a 09 09 20 20 7d 0a 09 20 return;... }..
12c0: 20 20 20 7d 0a 09 20 20 74 61 67 20 3d 20 74 61 }.. tag = ta
12d0: 67 2d 3e 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d g->Next;. }
12e0: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a . return;.}..
12f0: 73 74 61 74 69 63 20 76 6f 69 64 0a 67 65 74 47 static void.getG
1300: 70 73 43 6f 6f 72 64 73 20 28 67 61 69 61 45 78 psCoords (gaiaEx
1310: 69 66 54 61 67 4c 69 73 74 50 74 72 20 74 61 67 ifTagListPtr tag
1320: 5f 6c 69 73 74 2c 20 64 6f 75 62 6c 65 20 2a 6c _list, double *l
1330: 6f 6e 67 69 74 75 64 65 2c 20 64 6f 75 62 6c 65 ongitude, double
1340: 20 2a 6c 61 74 69 74 75 64 65 2c 0a 09 20 20 20 *latitude,..
1350: 20 20 20 69 6e 74 20 2a 6f 6b 29 0a 7b 0a 2f 2a int *ok).{./*
1360: 20 74 72 79 69 6e 67 20 74 6f 20 72 65 74 72 69 trying to retri
1370: 65 76 65 20 74 68 65 20 47 50 53 20 63 6f 6f 72 eve the GPS coor
1380: 64 69 6e 61 74 65 73 20 2a 2f 0a 20 20 20 20 67 dinates */. g
1390: 61 69 61 45 78 69 66 54 61 67 50 74 72 20 74 61 aiaExifTagPtr ta
13a0: 67 3b 0a 20 20 20 20 63 68 61 72 20 6c 61 74 5f g;. char lat_
13b0: 72 65 66 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20 ref = '\0';.
13c0: 63 68 61 72 20 6c 6f 6e 67 5f 72 65 66 20 3d 20 char long_ref =
13d0: 27 5c 30 27 3b 0a 20 20 20 20 64 6f 75 62 6c 65 '\0';. double
13e0: 20 6c 61 74 5f 64 65 67 73 20 3d 20 2d 44 42 4c lat_degs = -DBL
13f0: 5f 4d 41 58 3b 0a 20 20 20 20 64 6f 75 62 6c 65 _MAX;. double
1400: 20 6c 61 74 5f 6d 69 6e 73 20 3d 20 2d 44 42 4c lat_mins = -DBL
1410: 5f 4d 41 58 3b 0a 20 20 20 20 64 6f 75 62 6c 65 _MAX;. double
1420: 20 6c 61 74 5f 73 65 63 73 20 3d 20 2d 44 42 4c lat_secs = -DBL
1430: 5f 4d 41 58 3b 0a 20 20 20 20 64 6f 75 62 6c 65 _MAX;. double
1440: 20 6c 6f 6e 67 5f 64 65 67 73 20 3d 20 2d 44 42 long_degs = -DB
1450: 4c 5f 4d 41 58 3b 0a 20 20 20 20 64 6f 75 62 6c L_MAX;. doubl
1460: 65 20 6c 6f 6e 67 5f 6d 69 6e 73 20 3d 20 2d 44 e long_mins = -D
1470: 42 4c 5f 4d 41 58 3b 0a 20 20 20 20 64 6f 75 62 BL_MAX;. doub
1480: 6c 65 20 6c 6f 6e 67 5f 73 65 63 73 20 3d 20 2d le long_secs = -
1490: 44 42 4c 5f 4d 41 58 3b 0a 20 20 20 20 64 6f 75 DBL_MAX;. dou
14a0: 62 6c 65 20 64 62 6c 76 61 6c 3b 0a 20 20 20 20 ble dblval;.
14b0: 64 6f 75 62 6c 65 20 73 69 67 6e 3b 0a 20 20 20 double sign;.
14c0: 20 69 6e 74 20 78 6f 6b 3b 0a 20 20 20 20 2a 6f int xok;. *o
14d0: 6b 20 3d 20 30 3b 0a 20 20 20 20 69 66 20 28 21 k = 0;. if (!
14e0: 74 61 67 5f 6c 69 73 74 29 0a 09 72 65 74 75 72 tag_list)..retur
14f0: 6e 3b 0a 20 20 20 20 74 61 67 20 3d 20 74 61 67 n;. tag = tag
1500: 5f 6c 69 73 74 2d 3e 46 69 72 73 74 3b 0a 20 20 _list->First;.
1510: 20 20 77 68 69 6c 65 20 28 74 61 67 29 0a 20 20 while (tag).
1520: 20 20 20 20 7b 0a 09 20 20 69 66 20 28 74 61 67 {.. if (tag
1530: 2d 3e 47 70 73 20 26 26 20 74 61 67 2d 3e 54 61 ->Gps && tag->Ta
1540: 67 49 64 20 3d 3d 20 30 78 30 31 29 0a 09 20 20 gId == 0x01)..
1550: 20 20 7b 0a 09 09 2f 2a 20 6f 6b 2c 20 74 68 69 {.../* ok, thi
1560: 73 20 6f 6e 65 20 69 73 20 74 68 65 20 47 50 53 s one is the GPS
1570: 4c 61 74 69 74 75 64 65 52 65 66 20 74 61 67 20 LatitudeRef tag
1580: 2a 2f 0a 09 09 69 66 20 28 74 61 67 2d 3e 54 79 */...if (tag->Ty
1590: 70 65 20 3d 3d 20 32 29 0a 09 09 20 20 20 20 6c pe == 2)... l
15a0: 61 74 5f 72 65 66 20 3d 20 2a 28 74 61 67 2d 3e at_ref = *(tag->
15b0: 53 74 72 69 6e 67 56 61 6c 75 65 29 3b 0a 09 20 StringValue);..
15c0: 20 20 20 7d 0a 09 20 20 69 66 20 28 74 61 67 2d }.. if (tag-
15d0: 3e 47 70 73 20 26 26 20 74 61 67 2d 3e 54 61 67 >Gps && tag->Tag
15e0: 49 64 20 3d 3d 20 30 78 30 33 29 0a 09 20 20 20 Id == 0x03)..
15f0: 20 7b 0a 09 09 2f 2a 20 6f 6b 2c 20 74 68 69 73 {.../* ok, this
1600: 20 6f 6e 65 20 69 73 20 74 68 65 20 47 50 53 4c one is the GPSL
1610: 6f 6e 67 69 74 75 64 65 52 65 66 20 74 61 67 20 ongitudeRef tag
1620: 2a 2f 0a 09 09 69 66 20 28 74 61 67 2d 3e 54 79 */...if (tag->Ty
1630: 70 65 20 3d 3d 20 32 29 0a 09 09 20 20 20 20 6c pe == 2)... l
1640: 6f 6e 67 5f 72 65 66 20 3d 20 2a 28 74 61 67 2d ong_ref = *(tag-
1650: 3e 53 74 72 69 6e 67 56 61 6c 75 65 29 3b 0a 09 >StringValue);..
1660: 20 20 20 20 7d 0a 09 20 20 69 66 20 28 74 61 67 }.. if (tag
1670: 2d 3e 47 70 73 20 26 26 20 74 61 67 2d 3e 54 61 ->Gps && tag->Ta
1680: 67 49 64 20 3d 3d 20 30 78 30 32 29 0a 09 20 20 gId == 0x02)..
1690: 20 20 7b 0a 09 09 2f 2a 20 6f 6b 2c 20 74 68 69 {.../* ok, thi
16a0: 73 20 6f 6e 65 20 69 73 20 74 68 65 20 47 50 53 s one is the GPS
16b0: 4c 61 74 69 74 75 64 65 20 74 61 67 20 2a 2f 0a Latitude tag */.
16c0: 09 09 69 66 20 28 74 61 67 2d 3e 54 79 70 65 20 ..if (tag->Type
16d0: 3d 3d 20 35 20 26 26 20 74 61 67 2d 3e 43 6f 75 == 5 && tag->Cou
16e0: 6e 74 20 3d 3d 20 33 29 0a 09 09 20 20 7b 0a 09 nt == 3)... {..
16f0: 09 20 20 20 20 20 20 64 62 6c 76 61 6c 20 3d 20 . dblval =
1700: 67 61 69 61 45 78 69 66 54 61 67 47 65 74 52 61 gaiaExifTagGetRa
1710: 74 69 6f 6e 61 6c 56 61 6c 75 65 20 28 74 61 67 tionalValue (tag
1720: 2c 20 30 2c 20 26 78 6f 6b 29 3b 0a 09 09 20 20 , 0, &xok);...
1730: 20 20 20 20 69 66 20 28 78 6f 6b 29 0a 09 09 09 if (xok)....
1740: 20 20 6c 61 74 5f 64 65 67 73 20 3d 20 64 62 6c lat_degs = dbl
1750: 76 61 6c 3b 0a 09 09 20 20 20 20 20 20 64 62 6c val;... dbl
1760: 76 61 6c 20 3d 20 67 61 69 61 45 78 69 66 54 61 val = gaiaExifTa
1770: 67 47 65 74 52 61 74 69 6f 6e 61 6c 56 61 6c 75 gGetRationalValu
1780: 65 20 28 74 61 67 2c 20 31 2c 20 26 78 6f 6b 29 e (tag, 1, &xok)
1790: 3b 0a 09 09 20 20 20 20 20 20 69 66 20 28 78 6f ;... if (xo
17a0: 6b 29 0a 09 09 09 20 20 6c 61 74 5f 6d 69 6e 73 k).... lat_mins
17b0: 20 3d 20 64 62 6c 76 61 6c 3b 0a 09 09 20 20 20 = dblval;...
17c0: 20 20 20 64 62 6c 76 61 6c 20 3d 20 67 61 69 61 dblval = gaia
17d0: 45 78 69 66 54 61 67 47 65 74 52 61 74 69 6f 6e ExifTagGetRation
17e0: 61 6c 56 61 6c 75 65 20 28 74 61 67 2c 20 32 2c alValue (tag, 2,
17f0: 20 26 78 6f 6b 29 3b 0a 09 09 20 20 20 20 20 20 &xok);...
1800: 69 66 20 28 78 6f 6b 29 0a 09 09 09 20 20 6c 61 if (xok).... la
1810: 74 5f 73 65 63 73 20 3d 20 64 62 6c 76 61 6c 3b t_secs = dblval;
1820: 0a 09 09 20 20 7d 0a 09 20 20 20 20 7d 0a 09 20 ... }.. }..
1830: 20 69 66 20 28 74 61 67 2d 3e 47 70 73 20 26 26 if (tag->Gps &&
1840: 20 74 61 67 2d 3e 54 61 67 49 64 20 3d 3d 20 30 tag->TagId == 0
1850: 78 30 34 29 0a 09 20 20 20 20 7b 0a 09 09 2f 2a x04).. {.../*
1860: 20 6f 6b 2c 20 74 68 69 73 20 6f 6e 65 20 69 73 ok, this one is
1870: 20 74 68 65 20 47 50 53 4c 6f 6e 67 69 74 75 64 the GPSLongitud
1880: 65 20 74 61 67 20 2a 2f 0a 09 09 69 66 20 28 74 e tag */...if (t
1890: 61 67 2d 3e 54 79 70 65 20 3d 3d 20 35 20 26 26 ag->Type == 5 &&
18a0: 20 74 61 67 2d 3e 43 6f 75 6e 74 20 3d 3d 20 33 tag->Count == 3
18b0: 29 0a 09 09 20 20 7b 0a 09 09 20 20 20 20 20 20 )... {...
18c0: 64 62 6c 76 61 6c 20 3d 20 67 61 69 61 45 78 69 dblval = gaiaExi
18d0: 66 54 61 67 47 65 74 52 61 74 69 6f 6e 61 6c 56 fTagGetRationalV
18e0: 61 6c 75 65 20 28 74 61 67 2c 20 30 2c 20 26 78 alue (tag, 0, &x
18f0: 6f 6b 29 3b 0a 09 09 20 20 20 20 20 20 69 66 20 ok);... if
1900: 28 78 6f 6b 29 0a 09 09 09 20 20 6c 6f 6e 67 5f (xok).... long_
1910: 64 65 67 73 20 3d 20 64 62 6c 76 61 6c 3b 0a 09 degs = dblval;..
1920: 09 20 20 20 20 20 20 64 62 6c 76 61 6c 20 3d 20 . dblval =
1930: 67 61 69 61 45 78 69 66 54 61 67 47 65 74 52 61 gaiaExifTagGetRa
1940: 74 69 6f 6e 61 6c 56 61 6c 75 65 20 28 74 61 67 tionalValue (tag
1950: 2c 20 31 2c 20 26 78 6f 6b 29 3b 0a 09 09 20 20 , 1, &xok);...
1960: 20 20 20 20 69 66 20 28 78 6f 6b 29 0a 09 09 09 if (xok)....
1970: 20 20 6c 6f 6e 67 5f 6d 69 6e 73 20 3d 20 64 62 long_mins = db
1980: 6c 76 61 6c 3b 0a 09 09 20 20 20 20 20 20 64 62 lval;... db
1990: 6c 76 61 6c 20 3d 20 67 61 69 61 45 78 69 66 54 lval = gaiaExifT
19a0: 61 67 47 65 74 52 61 74 69 6f 6e 61 6c 56 61 6c agGetRationalVal
19b0: 75 65 20 28 74 61 67 2c 20 32 2c 20 26 78 6f 6b ue (tag, 2, &xok
19c0: 29 3b 0a 09 09 20 20 20 20 20 20 69 66 20 28 78 );... if (x
19d0: 6f 6b 29 0a 09 09 09 20 20 6c 6f 6e 67 5f 73 65 ok).... long_se
19e0: 63 73 20 3d 20 64 62 6c 76 61 6c 3b 0a 09 09 20 cs = dblval;...
19f0: 20 7d 0a 09 20 20 20 20 7d 0a 09 20 20 74 61 67 }.. }.. tag
1a00: 20 3d 20 74 61 67 2d 3e 4e 65 78 74 3b 0a 20 20 = tag->Next;.
1a10: 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 28 6c }. if ((l
1a20: 61 74 5f 72 65 66 20 3d 3d 20 27 4e 27 20 7c 7c at_ref == 'N' ||
1a30: 20 6c 61 74 5f 72 65 66 20 3d 3d 20 27 53 27 20 lat_ref == 'S'
1a40: 7c 7c 20 6c 6f 6e 67 5f 72 65 66 20 3d 3d 20 27 || long_ref == '
1a50: 45 27 20 7c 7c 20 6c 6f 6e 67 5f 72 65 66 20 3d E' || long_ref =
1a60: 3d 20 27 57 27 29 0a 09 26 26 20 6c 61 74 5f 64 = 'W')..&& lat_d
1a70: 65 67 73 20 21 3d 20 2d 44 42 4c 5f 4d 41 58 20 egs != -DBL_MAX
1a80: 26 26 20 6c 61 74 5f 6d 69 6e 73 20 21 3d 20 2d && lat_mins != -
1a90: 44 42 4c 5f 4d 41 58 20 26 26 20 6c 61 74 5f 73 DBL_MAX && lat_s
1aa0: 65 63 73 20 21 3d 20 2d 44 42 4c 5f 4d 41 58 0a ecs != -DBL_MAX.
1ab0: 09 26 26 20 6c 6f 6e 67 5f 64 65 67 73 20 21 3d .&& long_degs !=
1ac0: 20 2d 44 42 4c 5f 4d 41 58 20 26 26 20 6c 6f 6e -DBL_MAX && lon
1ad0: 67 5f 6d 69 6e 73 20 21 3d 20 2d 44 42 4c 5f 4d g_mins != -DBL_M
1ae0: 41 58 0a 09 26 26 20 6c 6f 6e 67 5f 73 65 63 73 AX..&& long_secs
1af0: 20 21 3d 20 2d 44 42 4c 5f 4d 41 58 29 0a 20 20 != -DBL_MAX).
1b00: 20 20 20 20 7b 0a 09 20 20 2a 6f 6b 20 3d 20 31 {.. *ok = 1
1b10: 3b 0a 09 20 20 69 66 20 28 6c 61 74 5f 72 65 66 ;.. if (lat_ref
1b20: 20 3d 3d 20 27 53 27 29 0a 09 20 20 20 20 20 20 == 'S')..
1b30: 73 69 67 6e 20 3d 20 2d 31 2e 30 3b 0a 09 20 20 sign = -1.0;..
1b40: 65 6c 73 65 0a 09 20 20 20 20 20 20 73 69 67 6e else.. sign
1b50: 20 3d 20 31 2e 30 3b 0a 09 20 20 6c 61 74 5f 64 = 1.0;.. lat_d
1b60: 65 67 73 20 3d 20 6d 61 74 68 5f 72 6f 75 6e 64 egs = math_round
1b70: 20 28 6c 61 74 5f 64 65 67 73 20 2a 20 31 30 30 (lat_degs * 100
1b80: 30 30 30 30 2e 30 29 3b 0a 09 20 20 6c 61 74 5f 0000.0);.. lat_
1b90: 6d 69 6e 73 20 3d 20 6d 61 74 68 5f 72 6f 75 6e mins = math_roun
1ba0: 64 20 28 6c 61 74 5f 6d 69 6e 73 20 2a 20 31 30 d (lat_mins * 10
1bb0: 30 30 30 30 30 2e 30 29 3b 0a 09 20 20 6c 61 74 00000.0);.. lat
1bc0: 5f 73 65 63 73 20 3d 20 6d 61 74 68 5f 72 6f 75 _secs = math_rou
1bd0: 6e 64 20 28 6c 61 74 5f 73 65 63 73 20 2a 20 31 nd (lat_secs * 1
1be0: 30 30 30 30 30 30 2e 30 29 3b 0a 09 20 20 64 62 000000.0);.. db
1bf0: 6c 76 61 6c 20 3d 0a 09 20 20 20 20 20 20 6d 61 lval =.. ma
1c00: 74 68 5f 72 6f 75 6e 64 20 28 6c 61 74 5f 64 65 th_round (lat_de
1c10: 67 73 20 2b 20 28 6c 61 74 5f 6d 69 6e 73 20 2f gs + (lat_mins /
1c20: 20 36 30 2e 30 29 20 2b 0a 09 09 09 20 20 28 6c 60.0) +.... (l
1c30: 61 74 5f 73 65 63 73 20 2f 20 33 36 30 30 2e 30 at_secs / 3600.0
1c40: 29 29 20 2a 20 28 73 69 67 6e 20 2f 20 31 30 30 )) * (sign / 100
1c50: 30 30 30 30 2e 30 29 3b 0a 09 20 20 2a 6c 61 74 0000.0);.. *lat
1c60: 69 74 75 64 65 20 3d 20 64 62 6c 76 61 6c 3b 0a itude = dblval;.
1c70: 09 20 20 69 66 20 28 6c 6f 6e 67 5f 72 65 66 20 . if (long_ref
1c80: 3d 3d 20 27 57 27 29 0a 09 20 20 20 20 20 20 73 == 'W').. s
1c90: 69 67 6e 20 3d 20 2d 31 2e 30 3b 0a 09 20 20 65 ign = -1.0;.. e
1ca0: 6c 73 65 0a 09 20 20 20 20 20 20 73 69 67 6e 20 lse.. sign
1cb0: 3d 20 31 2e 30 3b 0a 09 20 20 6c 6f 6e 67 5f 64 = 1.0;.. long_d
1cc0: 65 67 73 20 3d 20 6d 61 74 68 5f 72 6f 75 6e 64 egs = math_round
1cd0: 20 28 6c 6f 6e 67 5f 64 65 67 73 20 2a 20 31 30 (long_degs * 10
1ce0: 30 30 30 30 30 2e 30 29 3b 0a 09 20 20 6c 6f 6e 00000.0);.. lon
1cf0: 67 5f 6d 69 6e 73 20 3d 20 6d 61 74 68 5f 72 6f g_mins = math_ro
1d00: 75 6e 64 20 28 6c 6f 6e 67 5f 6d 69 6e 73 20 2a und (long_mins *
1d10: 20 31 30 30 30 30 30 30 2e 30 29 3b 0a 09 20 20 1000000.0);..
1d20: 6c 6f 6e 67 5f 73 65 63 73 20 3d 20 6d 61 74 68 long_secs = math
1d30: 5f 72 6f 75 6e 64 20 28 6c 6f 6e 67 5f 73 65 63 _round (long_sec
1d40: 73 20 2a 20 31 30 30 30 30 30 30 2e 30 29 3b 0a s * 1000000.0);.
1d50: 09 20 20 64 62 6c 76 61 6c 20 3d 0a 09 20 20 20 . dblval =..
1d60: 20 20 20 6d 61 74 68 5f 72 6f 75 6e 64 20 28 6c math_round (l
1d70: 6f 6e 67 5f 64 65 67 73 20 2b 20 28 6c 6f 6e 67 ong_degs + (long
1d80: 5f 6d 69 6e 73 20 2f 20 36 30 2e 30 29 20 2b 0a _mins / 60.0) +.
1d90: 09 09 09 20 20 28 6c 6f 6e 67 5f 73 65 63 73 20 ... (long_secs
1da0: 2f 20 33 36 30 30 2e 30 29 29 20 2a 20 28 73 69 / 3600.0)) * (si
1db0: 67 6e 20 2f 20 31 30 30 30 30 30 30 2e 30 29 3b gn / 1000000.0);
1dc0: 0a 09 20 20 2a 6c 6f 6e 67 69 74 75 64 65 20 3d .. *longitude =
1dd0: 20 64 62 6c 76 61 6c 3b 0a 20 20 20 20 20 20 7d dblval;. }
1de0: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a . return;.}..
1df0: 73 74 61 74 69 63 20 76 6f 69 64 0a 67 65 74 47 static void.getG
1e00: 70 73 53 61 74 65 6c 6c 69 74 65 73 20 28 67 61 psSatellites (ga
1e10: 69 61 45 78 69 66 54 61 67 4c 69 73 74 50 74 72 iaExifTagListPtr
1e20: 20 74 61 67 5f 6c 69 73 74 2c 20 63 68 61 72 20 tag_list, char
1e30: 2a 73 74 72 2c 20 69 6e 74 20 6c 65 6e 2c 20 69 *str, int len, i
1e40: 6e 74 20 2a 6f 6b 29 0a 7b 0a 2f 2a 20 74 72 79 nt *ok).{./* try
1e50: 69 6e 67 20 74 6f 20 72 65 74 72 69 65 76 65 20 ing to retrieve
1e60: 74 68 65 20 47 50 53 53 61 74 65 6c 6c 69 74 65 the GPSSatellite
1e70: 73 20 2a 2f 0a 20 20 20 20 67 61 69 61 45 78 69 s */. gaiaExi
1e80: 66 54 61 67 50 74 72 20 74 61 67 3b 0a 20 20 20 fTagPtr tag;.
1e90: 20 69 6e 74 20 6c 3b 0a 20 20 20 20 2a 6f 6b 20 int l;. *ok
1ea0: 3d 20 30 3b 0a 20 20 20 20 69 66 20 28 21 74 61 = 0;. if (!ta
1eb0: 67 5f 6c 69 73 74 29 0a 09 72 65 74 75 72 6e 3b g_list)..return;
1ec0: 0a 20 20 20 20 74 61 67 20 3d 20 74 61 67 5f 6c . tag = tag_l
1ed0: 69 73 74 2d 3e 46 69 72 73 74 3b 0a 20 20 20 20 ist->First;.
1ee0: 77 68 69 6c 65 20 28 74 61 67 29 0a 20 20 20 20 while (tag).
1ef0: 20 20 7b 0a 09 20 20 69 66 20 28 74 61 67 2d 3e {.. if (tag->
1f00: 47 70 73 20 26 26 20 74 61 67 2d 3e 54 61 67 49 Gps && tag->TagI
1f10: 64 20 3d 3d 20 30 78 30 38 29 0a 09 20 20 20 20 d == 0x08)..
1f20: 7b 0a 09 09 2f 2a 20 6f 6b 2c 20 74 68 69 73 20 {.../* ok, this
1f30: 6f 6e 65 20 69 73 20 74 68 65 20 47 50 53 53 61 one is the GPSSa
1f40: 74 65 6c 6c 69 74 65 73 20 74 61 67 20 2a 2f 0a tellites tag */.
1f50: 09 09 69 66 20 28 74 61 67 2d 3e 54 79 70 65 20 ..if (tag->Type
1f60: 3d 3d 20 32 29 0a 09 09 20 20 7b 0a 09 09 20 20 == 2)... {...
1f70: 20 20 20 20 2a 6f 6b 20 3d 20 31 3b 0a 09 09 20 *ok = 1;...
1f80: 20 20 20 20 20 6c 20 3d 20 73 74 72 6c 65 6e 20 l = strlen
1f90: 28 74 61 67 2d 3e 53 74 72 69 6e 67 56 61 6c 75 (tag->StringValu
1fa0: 65 29 3b 0a 09 09 20 20 20 20 20 20 69 66 20 28 e);... if (
1fb0: 6c 65 6e 20 3e 20 6c 29 0a 09 09 09 20 20 73 74 len > l).... st
1fc0: 72 63 70 79 20 28 73 74 72 2c 20 74 61 67 2d 3e rcpy (str, tag->
1fd0: 53 74 72 69 6e 67 56 61 6c 75 65 29 3b 0a 09 09 StringValue);...
1fe0: 20 20 20 20 20 20 65 6c 73 65 0a 09 09 09 7b 0a else....{.
1ff0: 09 09 09 20 20 20 20 6d 65 6d 73 65 74 20 28 73 ... memset (s
2000: 74 72 2c 20 27 5c 30 27 2c 20 6c 65 6e 29 3b 0a tr, '\0', len);.
2010: 09 09 09 20 20 20 20 6d 65 6d 63 70 79 20 28 73 ... memcpy (s
2020: 74 72 2c 20 74 61 67 2d 3e 53 74 72 69 6e 67 56 tr, tag->StringV
2030: 61 6c 75 65 2c 20 6c 65 6e 20 2d 20 31 29 3b 0a alue, len - 1);.
2040: 09 09 09 7d 0a 09 09 20 20 20 20 20 20 72 65 74 ...}... ret
2050: 75 72 6e 3b 0a 09 09 20 20 7d 0a 09 20 20 20 20 urn;... }..
2060: 7d 0a 09 20 20 74 61 67 20 3d 20 74 61 67 2d 3e }.. tag = tag->
2070: 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 Next;. }.
2080: 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 73 74 61 return;.}..sta
2090: 74 69 63 20 64 6f 75 62 6c 65 0a 67 65 74 47 70 tic double.getGp
20a0: 73 44 69 72 65 63 74 69 6f 6e 20 28 67 61 69 61 sDirection (gaia
20b0: 45 78 69 66 54 61 67 4c 69 73 74 50 74 72 20 74 ExifTagListPtr t
20c0: 61 67 5f 6c 69 73 74 2c 20 69 6e 74 20 2a 6f 6b ag_list, int *ok
20d0: 29 0a 7b 0a 2f 2a 20 74 72 79 69 6e 67 20 74 6f ).{./* trying to
20e0: 20 72 65 74 72 69 65 76 65 20 74 68 65 20 47 50 retrieve the GP
20f0: 53 20 64 69 72 65 63 74 69 6f 6e 20 2a 2f 0a 20 S direction */.
2100: 20 20 20 67 61 69 61 45 78 69 66 54 61 67 50 74 gaiaExifTagPt
2110: 72 20 74 61 67 3b 0a 20 20 20 20 63 68 61 72 20 r tag;. char
2120: 64 69 72 5f 72 65 66 20 3d 20 27 5c 30 27 3b 0a dir_ref = '\0';.
2130: 20 20 20 20 64 6f 75 62 6c 65 20 64 69 72 65 63 double direc
2140: 74 69 6f 6e 20 3d 20 2d 44 42 4c 5f 4d 41 58 3b tion = -DBL_MAX;
2150: 0a 20 20 20 20 64 6f 75 62 6c 65 20 64 62 6c 76 . double dblv
2160: 61 6c 3b 0a 20 20 20 20 69 6e 74 20 78 6f 6b 3b al;. int xok;
2170: 0a 20 20 20 20 2a 6f 6b 20 3d 20 30 3b 0a 20 20 . *ok = 0;.
2180: 20 20 69 66 20 28 21 74 61 67 5f 6c 69 73 74 29 if (!tag_list)
2190: 0a 09 72 65 74 75 72 6e 20 64 69 72 65 63 74 69 ..return directi
21a0: 6f 6e 3b 0a 20 20 20 20 74 61 67 20 3d 20 74 61 on;. tag = ta
21b0: 67 5f 6c 69 73 74 2d 3e 46 69 72 73 74 3b 0a 20 g_list->First;.
21c0: 20 20 20 77 68 69 6c 65 20 28 74 61 67 29 0a 20 while (tag).
21d0: 20 20 20 20 20 7b 0a 09 20 20 69 66 20 28 74 61 {.. if (ta
21e0: 67 2d 3e 47 70 73 20 26 26 20 74 61 67 2d 3e 54 g->Gps && tag->T
21f0: 61 67 49 64 20 3d 3d 20 30 78 31 30 29 0a 09 20 agId == 0x10)..
2200: 20 20 20 7b 0a 09 09 2f 2a 20 6f 6b 2c 20 74 68 {.../* ok, th
2210: 69 73 20 6f 6e 65 20 69 73 20 74 68 65 20 47 50 is one is the GP
2220: 53 44 69 72 65 63 74 69 6f 6e 52 65 66 20 74 61 SDirectionRef ta
2230: 67 20 2a 2f 0a 09 09 69 66 20 28 74 61 67 2d 3e g */...if (tag->
2240: 54 79 70 65 20 3d 3d 20 32 29 0a 09 09 20 20 20 Type == 2)...
2250: 20 64 69 72 5f 72 65 66 20 3d 20 2a 28 74 61 67 dir_ref = *(tag
2260: 2d 3e 53 74 72 69 6e 67 56 61 6c 75 65 29 3b 0a ->StringValue);.
2270: 09 20 20 20 20 7d 0a 09 20 20 69 66 20 28 74 61 . }.. if (ta
2280: 67 2d 3e 47 70 73 20 26 26 20 74 61 67 2d 3e 54 g->Gps && tag->T
2290: 61 67 49 64 20 3d 3d 20 30 78 31 31 29 0a 09 20 agId == 0x11)..
22a0: 20 20 20 7b 0a 09 09 2f 2a 20 6f 6b 2c 20 74 68 {.../* ok, th
22b0: 69 73 20 6f 6e 65 20 69 73 20 74 68 65 20 47 50 is one is the GP
22c0: 53 44 69 72 65 63 74 69 6f 6e 20 74 61 67 20 2a SDirection tag *
22d0: 2f 0a 09 09 69 66 20 28 74 61 67 2d 3e 54 79 70 /...if (tag->Typ
22e0: 65 20 3d 3d 20 35 20 26 26 20 74 61 67 2d 3e 43 e == 5 && tag->C
22f0: 6f 75 6e 74 20 3d 3d 20 31 29 0a 09 09 20 20 7b ount == 1)... {
2300: 0a 09 09 20 20 20 20 20 20 64 62 6c 76 61 6c 20 ... dblval
2310: 3d 20 67 61 69 61 45 78 69 66 54 61 67 47 65 74 = gaiaExifTagGet
2320: 52 61 74 69 6f 6e 61 6c 56 61 6c 75 65 20 28 74 RationalValue (t
2330: 61 67 2c 20 30 2c 20 26 78 6f 6b 29 3b 0a 09 09 ag, 0, &xok);...
2340: 20 20 20 20 20 20 69 66 20 28 78 6f 6b 29 0a 09 if (xok)..
2350: 09 09 20 20 64 69 72 65 63 74 69 6f 6e 20 3d 20 .. direction =
2360: 64 62 6c 76 61 6c 3b 0a 09 09 20 20 7d 0a 09 20 dblval;... }..
2370: 20 20 20 7d 0a 09 20 20 74 61 67 20 3d 20 74 61 }.. tag = ta
2380: 67 2d 3e 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d g->Next;. }
2390: 0a 20 20 20 20 69 66 20 28 28 64 69 72 5f 72 65 . if ((dir_re
23a0: 66 20 3d 3d 20 27 54 27 20 7c 7c 20 64 69 72 5f f == 'T' || dir_
23b0: 72 65 66 20 3d 3d 20 27 4d 27 29 20 26 26 20 64 ref == 'M') && d
23c0: 69 72 65 63 74 69 6f 6e 20 21 3d 20 2d 44 42 4c irection != -DBL
23d0: 5f 4d 41 58 29 0a 09 2a 6f 6b 20 3d 20 31 3b 0a _MAX)..*ok = 1;.
23e0: 20 20 20 20 72 65 74 75 72 6e 20 64 69 72 65 63 return direc
23f0: 74 69 6f 6e 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 tion;.}..static
2400: 76 6f 69 64 0a 67 65 74 47 70 73 54 69 6d 65 73 void.getGpsTimes
2410: 74 61 6d 70 20 28 67 61 69 61 45 78 69 66 54 61 tamp (gaiaExifTa
2420: 67 4c 69 73 74 50 74 72 20 74 61 67 5f 6c 69 73 gListPtr tag_lis
2430: 74 2c 20 63 68 61 72 20 2a 73 74 72 2c 20 69 6e t, char *str, in
2440: 74 20 6c 65 6e 2c 20 69 6e 74 20 2a 6f 6b 29 0a t len, int *ok).
2450: 7b 0a 2f 2a 20 74 72 79 69 6e 67 20 74 6f 20 72 {./* trying to r
2460: 65 74 72 69 65 76 65 20 74 68 65 20 47 50 53 20 etrieve the GPS
2470: 54 69 6d 65 73 74 61 6d 70 20 2a 2f 0a 20 20 20 Timestamp */.
2480: 20 67 61 69 61 45 78 69 66 54 61 67 50 74 72 20 gaiaExifTagPtr
2490: 74 61 67 3b 0a 20 20 20 20 63 68 61 72 20 64 61 tag;. char da
24a0: 74 65 5b 31 36 5d 3b 0a 20 20 20 20 63 68 61 72 te[16];. char
24b0: 20 74 69 6d 65 73 74 61 6d 70 5b 33 32 5d 3b 0a timestamp[32];.
24c0: 20 20 20 20 64 6f 75 62 6c 65 20 68 6f 75 72 73 double hours
24d0: 20 3d 20 2d 44 42 4c 5f 4d 41 58 3b 0a 20 20 20 = -DBL_MAX;.
24e0: 20 64 6f 75 62 6c 65 20 6d 69 6e 73 20 3d 20 2d double mins = -
24f0: 44 42 4c 5f 4d 41 58 3b 0a 20 20 20 20 64 6f 75 DBL_MAX;. dou
2500: 62 6c 65 20 73 65 63 73 20 3d 20 2d 44 42 4c 5f ble secs = -DBL_
2510: 4d 41 58 3b 0a 20 20 20 20 64 6f 75 62 6c 65 20 MAX;. double
2520: 64 62 6c 76 61 6c 3b 0a 20 20 20 20 69 6e 74 20 dblval;. int
2530: 78 6f 6b 3b 0a 20 20 20 20 69 6e 74 20 68 68 3b xok;. int hh;
2540: 0a 20 20 20 20 69 6e 74 20 6d 6d 3b 0a 20 20 20 . int mm;.
2550: 20 69 6e 74 20 73 73 3b 0a 20 20 20 20 69 6e 74 int ss;. int
2560: 20 6d 69 6c 6c 69 73 3b 0a 20 20 20 20 69 6e 74 millis;. int
2570: 20 6c 3b 0a 20 20 20 20 2a 6f 6b 20 3d 20 30 3b l;. *ok = 0;
2580: 0a 20 20 20 20 69 66 20 28 21 74 61 67 5f 6c 69 . if (!tag_li
2590: 73 74 29 0a 09 72 65 74 75 72 6e 3b 0a 20 20 20 st)..return;.
25a0: 20 73 74 72 63 70 79 20 28 64 61 74 65 2c 20 22 strcpy (date, "
25b0: 30 30 30 30 2d 30 30 2d 30 30 22 29 3b 0a 20 20 0000-00-00");.
25c0: 20 20 74 61 67 20 3d 20 74 61 67 5f 6c 69 73 74 tag = tag_list
25d0: 2d 3e 46 69 72 73 74 3b 0a 20 20 20 20 77 68 69 ->First;. whi
25e0: 6c 65 20 28 74 61 67 29 0a 20 20 20 20 20 20 7b le (tag). {
25f0: 0a 09 20 20 69 66 20 28 74 61 67 2d 3e 47 70 73 .. if (tag->Gps
2600: 20 26 26 20 74 61 67 2d 3e 54 61 67 49 64 20 3d && tag->TagId =
2610: 3d 20 30 78 31 44 29 0a 09 20 20 20 20 7b 0a 09 = 0x1D).. {..
2620: 09 2f 2a 20 6f 6b 2c 20 74 68 69 73 20 6f 6e 65 ./* ok, this one
2630: 20 69 73 20 74 68 65 20 47 50 53 44 61 74 65 53 is the GPSDateS
2640: 74 61 6d 70 20 74 61 67 20 2a 2f 0a 09 09 69 66 tamp tag */...if
2650: 20 28 74 61 67 2d 3e 54 79 70 65 20 3d 3d 20 32 (tag->Type == 2
2660: 29 0a 09 09 20 20 7b 0a 09 09 20 20 20 20 20 20 )... {...
2670: 73 74 72 63 70 79 20 28 64 61 74 65 2c 20 74 61 strcpy (date, ta
2680: 67 2d 3e 53 74 72 69 6e 67 56 61 6c 75 65 29 3b g->StringValue);
2690: 0a 09 09 20 20 20 20 20 20 64 61 74 65 5b 34 5d ... date[4]
26a0: 20 3d 20 27 2d 27 3b 0a 09 09 20 20 20 20 20 20 = '-';...
26b0: 64 61 74 65 5b 37 5d 20 3d 20 27 2d 27 3b 0a 09 date[7] = '-';..
26c0: 09 20 20 7d 0a 09 20 20 20 20 7d 0a 09 20 20 69 . }.. }.. i
26d0: 66 20 28 74 61 67 2d 3e 47 70 73 20 26 26 20 74 f (tag->Gps && t
26e0: 61 67 2d 3e 54 61 67 49 64 20 3d 3d 20 30 78 30 ag->TagId == 0x0
26f0: 37 29 0a 09 20 20 20 20 7b 0a 09 09 2f 2a 20 6f 7).. {.../* o
2700: 6b 2c 20 74 68 69 73 20 6f 6e 65 20 69 73 20 74 k, this one is t
2710: 68 65 20 47 50 53 54 69 6d 65 53 74 61 6d 70 20 he GPSTimeStamp
2720: 74 61 67 20 2a 2f 0a 09 09 69 66 20 28 74 61 67 tag */...if (tag
2730: 2d 3e 54 79 70 65 20 3d 3d 20 35 20 26 26 20 74 ->Type == 5 && t
2740: 61 67 2d 3e 43 6f 75 6e 74 20 3d 3d 20 33 29 0a ag->Count == 3).
2750: 09 09 20 20 7b 0a 09 09 20 20 20 20 20 20 64 62 .. {... db
2760: 6c 76 61 6c 20 3d 20 67 61 69 61 45 78 69 66 54 lval = gaiaExifT
2770: 61 67 47 65 74 52 61 74 69 6f 6e 61 6c 56 61 6c agGetRationalVal
2780: 75 65 20 28 74 61 67 2c 20 30 2c 20 26 78 6f 6b ue (tag, 0, &xok
2790: 29 3b 0a 09 09 20 20 20 20 20 20 69 66 20 28 78 );... if (x
27a0: 6f 6b 29 0a 09 09 09 20 20 68 6f 75 72 73 20 3d ok).... hours =
27b0: 20 64 62 6c 76 61 6c 3b 0a 09 09 20 20 20 20 20 dblval;...
27c0: 20 64 62 6c 76 61 6c 20 3d 20 67 61 69 61 45 78 dblval = gaiaEx
27d0: 69 66 54 61 67 47 65 74 52 61 74 69 6f 6e 61 6c ifTagGetRational
27e0: 56 61 6c 75 65 20 28 74 61 67 2c 20 31 2c 20 26 Value (tag, 1, &
27f0: 78 6f 6b 29 3b 0a 09 09 20 20 20 20 20 20 69 66 xok);... if
2800: 20 28 78 6f 6b 29 0a 09 09 09 20 20 6d 69 6e 73 (xok).... mins
2810: 20 3d 20 64 62 6c 76 61 6c 3b 0a 09 09 20 20 20 = dblval;...
2820: 20 20 20 64 62 6c 76 61 6c 20 3d 20 67 61 69 61 dblval = gaia
2830: 45 78 69 66 54 61 67 47 65 74 52 61 74 69 6f 6e ExifTagGetRation
2840: 61 6c 56 61 6c 75 65 20 28 74 61 67 2c 20 32 2c alValue (tag, 2,
2850: 20 26 78 6f 6b 29 3b 0a 09 09 20 20 20 20 20 20 &xok);...
2860: 69 66 20 28 78 6f 6b 29 0a 09 09 09 20 20 73 65 if (xok).... se
2870: 63 73 20 3d 20 64 62 6c 76 61 6c 3b 0a 09 09 20 cs = dblval;...
2880: 20 7d 0a 09 20 20 20 20 7d 0a 09 20 20 74 61 67 }.. }.. tag
2890: 20 3d 20 74 61 67 2d 3e 4e 65 78 74 3b 0a 20 20 = tag->Next;.
28a0: 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 68 6f }. if (ho
28b0: 75 72 73 20 21 3d 20 2d 44 42 4c 5f 4d 41 58 20 urs != -DBL_MAX
28c0: 26 26 20 6d 69 6e 73 20 21 3d 20 2d 44 42 4c 5f && mins != -DBL_
28d0: 4d 41 58 20 26 26 20 73 65 63 73 20 21 3d 20 2d MAX && secs != -
28e0: 44 42 4c 5f 4d 41 58 29 0a 20 20 20 20 20 20 7b DBL_MAX). {
28f0: 0a 09 20 20 2a 6f 6b 20 3d 20 31 3b 0a 09 20 20 .. *ok = 1;..
2900: 68 68 20 3d 20 28 69 6e 74 29 20 66 6c 6f 6f 72 hh = (int) floor
2910: 20 28 68 6f 75 72 73 29 3b 0a 09 20 20 6d 6d 20 (hours);.. mm
2920: 3d 20 28 69 6e 74 29 20 66 6c 6f 6f 72 20 28 6d = (int) floor (m
2930: 69 6e 73 29 3b 0a 09 20 20 73 73 20 3d 20 28 69 ins);.. ss = (i
2940: 6e 74 29 20 66 6c 6f 6f 72 20 28 73 65 63 73 29 nt) floor (secs)
2950: 3b 0a 09 20 20 6d 69 6c 6c 69 73 20 3d 20 28 69 ;.. millis = (i
2960: 6e 74 29 20 28 28 73 65 63 73 20 2d 20 73 73 29 nt) ((secs - ss)
2970: 20 2a 20 31 30 30 30 29 3b 0a 09 20 20 73 70 72 * 1000);.. spr
2980: 69 6e 74 66 20 28 74 69 6d 65 73 74 61 6d 70 2c intf (timestamp,
2990: 20 22 25 73 20 25 30 32 64 3a 25 30 32 64 3a 25 "%s %02d:%02d:%
29a0: 30 32 64 2e 25 30 33 64 22 2c 20 64 61 74 65 2c 02d.%03d", date,
29b0: 20 68 68 2c 20 6d 6d 2c 20 73 73 2c 0a 09 09 20 hh, mm, ss,...
29c0: 20 20 6d 69 6c 6c 69 73 29 3b 0a 09 20 20 6c 20 millis);.. l
29d0: 3d 20 73 74 72 6c 65 6e 20 28 74 69 6d 65 73 74 = strlen (timest
29e0: 61 6d 70 29 3b 0a 09 20 20 69 66 20 28 6c 65 6e amp);.. if (len
29f0: 20 3e 20 6c 29 0a 09 20 20 20 20 20 20 73 74 72 > l).. str
2a00: 63 70 79 20 28 73 74 72 2c 20 74 69 6d 65 73 74 cpy (str, timest
2a10: 61 6d 70 29 3b 0a 09 20 20 65 6c 73 65 0a 09 20 amp);.. else..
2a20: 20 20 20 7b 0a 09 09 6d 65 6d 73 65 74 20 28 73 {...memset (s
2a30: 74 72 2c 20 27 5c 30 27 2c 20 6c 65 6e 29 3b 0a tr, '\0', len);.
2a40: 09 09 6d 65 6d 63 70 79 20 28 73 74 72 2c 20 74 ..memcpy (str, t
2a50: 69 6d 65 73 74 61 6d 70 2c 20 6c 65 6e 20 2d 20 imestamp, len -
2a60: 31 29 3b 0a 09 20 20 20 20 7d 0a 20 20 20 20 20 1);.. }.
2a70: 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 7d }. return;.}
2a80: 0a 0a 73 74 61 74 69 63 20 69 6e 74 0a 69 73 45 ..static int.isE
2a90: 78 69 66 47 70 73 20 28 67 61 69 61 45 78 69 66 xifGps (gaiaExif
2aa0: 54 61 67 4c 69 73 74 50 74 72 20 74 61 67 5f 6c TagListPtr tag_l
2ab0: 69 73 74 29 0a 7b 0a 2f 2a 20 63 68 65 63 6b 73 ist).{./* checks
2ac0: 20 69 66 20 74 68 69 73 20 6f 6e 65 20 69 73 20 if this one is
2ad0: 61 20 47 50 53 2d 74 61 67 67 65 64 20 45 58 49 a GPS-tagged EXI
2ae0: 46 20 2a 2f 0a 20 20 20 20 69 6e 74 20 67 70 73 F */. int gps
2af0: 5f 6c 61 74 20 3d 20 30 3b 0a 20 20 20 20 69 6e _lat = 0;. in
2b00: 74 20 67 70 73 5f 6c 6f 6e 67 20 3d 20 30 3b 0a t gps_long = 0;.
2b10: 20 20 20 20 67 61 69 61 45 78 69 66 54 61 67 50 gaiaExifTagP
2b20: 74 72 20 70 54 20 3d 20 74 61 67 5f 6c 69 73 74 tr pT = tag_list
2b30: 2d 3e 46 69 72 73 74 3b 0a 20 20 20 20 77 68 69 ->First;. whi
2b40: 6c 65 20 28 70 54 29 0a 20 20 20 20 20 20 7b 0a le (pT). {.
2b50: 09 20 20 69 66 20 28 70 54 2d 3e 47 70 73 20 26 . if (pT->Gps &
2b60: 26 20 70 54 2d 3e 54 61 67 49 64 20 3d 3d 20 30 & pT->TagId == 0
2b70: 78 30 34 29 0a 09 20 20 20 20 20 20 67 70 73 5f x04).. gps_
2b80: 6c 6f 6e 67 20 3d 20 31 3b 0a 09 20 20 69 66 20 long = 1;.. if
2b90: 28 70 54 2d 3e 47 70 73 20 26 26 20 70 54 2d 3e (pT->Gps && pT->
2ba0: 54 61 67 49 64 20 3d 3d 20 30 78 30 32 29 0a 09 TagId == 0x02)..
2bb0: 20 20 20 20 20 20 67 70 73 5f 6c 61 74 20 3d 20 gps_lat =
2bc0: 31 3b 0a 09 20 20 69 66 20 28 67 70 73 5f 6c 6f 1;.. if (gps_lo
2bd0: 6e 67 20 26 26 20 67 70 73 5f 6c 61 74 29 0a 09 ng && gps_lat)..
2be0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a return 1;.
2bf0: 09 20 20 70 54 20 3d 20 70 54 2d 3e 4e 65 78 74 . pT = pT->Next
2c00: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 72 65 ;. }. re
2c10: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 73 74 61 74 69 turn 0;.}..stati
2c20: 63 20 69 6e 74 0a 75 70 64 61 74 65 45 78 69 66 c int.updateExif
2c30: 54 61 62 6c 65 73 20 28 73 71 6c 69 74 65 33 20 Tables (sqlite3
2c40: 2a 20 68 61 6e 64 6c 65 2c 20 63 6f 6e 73 74 20 * handle, const
2c50: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 62 unsigned char *b
2c60: 6c 6f 62 2c 20 69 6e 74 20 73 7a 2c 0a 09 09 20 lob, int sz,...
2c70: 20 67 61 69 61 45 78 69 66 54 61 67 4c 69 73 74 gaiaExifTagList
2c80: 50 74 72 20 74 61 67 5f 6c 69 73 74 2c 20 69 6e Ptr tag_list, in
2c90: 74 20 6d 65 74 61 64 61 74 61 2c 20 63 6f 6e 73 t metadata, cons
2ca0: 74 20 63 68 61 72 20 2a 70 61 74 68 29 0a 7b 0a t char *path).{.
2cb0: 2f 2a 20 69 6e 73 65 72 74 69 6e 67 20 61 6e 20 /* inserting an
2cc0: 45 58 49 46 20 70 68 6f 74 6f 20 69 6e 74 6f 20 EXIF photo into
2cd0: 74 68 65 20 44 42 20 2a 2f 0a 20 20 20 20 69 6e the DB */. in
2ce0: 74 20 69 3b 0a 20 20 20 20 69 6e 74 20 69 76 3b t i;. int iv;
2cf0: 0a 20 20 20 20 69 6e 74 20 6f 6b 3b 0a 20 20 20 . int ok;.
2d00: 20 69 6e 74 20 6f 6b 5f 68 75 6d 61 6e 3b 0a 20 int ok_human;.
2d10: 20 20 20 63 68 61 72 20 74 61 67 5f 6e 61 6d 65 char tag_name
2d20: 5b 31 32 38 5d 3b 0a 20 20 20 20 67 61 69 61 45 [128];. gaiaE
2d30: 78 69 66 54 61 67 50 74 72 20 70 54 3b 0a 20 20 xifTagPtr pT;.
2d40: 20 20 69 6e 74 20 72 65 74 3b 0a 20 20 20 20 63 int ret;. c
2d50: 68 61 72 20 73 71 6c 5b 31 30 32 34 5d 3b 0a 20 har sql[1024];.
2d60: 20 20 20 63 68 61 72 20 68 75 6d 61 6e 5b 31 30 char human[10
2d70: 32 34 5d 3b 0a 20 20 20 20 63 68 61 72 20 6d 61 24];. char ma
2d80: 6b 65 5b 31 30 32 34 5d 3b 0a 20 20 20 20 63 68 ke[1024];. ch
2d90: 61 72 20 6d 6f 64 65 6c 5b 31 30 32 34 5d 3b 0a ar model[1024];.
2da0: 20 20 20 20 63 68 61 72 20 73 61 74 65 6c 6c 69 char satelli
2db0: 74 65 73 5b 31 30 32 34 5d 3b 0a 20 20 20 20 63 tes[1024];. c
2dc0: 68 61 72 20 64 61 74 65 5b 33 32 5d 3b 0a 20 20 har date[32];.
2dd0: 20 20 63 68 61 72 20 74 69 6d 65 73 74 61 6d 70 char timestamp
2de0: 5b 33 32 5d 3b 0a 20 20 20 20 63 68 61 72 20 2a [32];. char *
2df0: 65 72 72 5f 6d 73 67 20 3d 20 4e 55 4c 4c 3b 0a err_msg = NULL;.
2e00: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 sqlite3_stmt
2e10: 20 2a 73 74 6d 74 3b 0a 20 20 20 20 73 71 6c 69 *stmt;. sqli
2e20: 74 65 33 5f 69 6e 74 36 34 20 70 6b 20 3d 20 30 te3_int64 pk = 0
2e30: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e ;. sqlite3_in
2e40: 74 36 34 20 76 61 6c 36 34 3b 0a 20 20 20 20 64 t64 val64;. d
2e50: 6f 75 62 6c 65 20 64 62 6c 76 61 6c 3b 0a 20 20 ouble dblval;.
2e60: 20 20 63 68 61 72 20 2a 74 79 70 65 5f 64 65 73 char *type_des
2e70: 63 3b 0a 20 20 20 20 64 6f 75 62 6c 65 20 6c 6f c;. double lo
2e80: 6e 67 69 74 75 64 65 3b 0a 20 20 20 20 64 6f 75 ngitude;. dou
2e90: 62 6c 65 20 6c 61 74 69 74 75 64 65 3b 0a 20 20 ble latitude;.
2ea0: 20 20 67 61 69 61 47 65 6f 6d 43 6f 6c 6c 50 74 gaiaGeomCollPt
2eb0: 72 20 67 65 6f 6d 3b 0a 20 20 20 20 75 6e 73 69 r geom;. unsi
2ec0: 67 6e 65 64 20 63 68 61 72 20 2a 67 65 6f 62 6c gned char *geobl
2ed0: 6f 62 3b 0a 20 20 20 20 69 6e 74 20 67 65 6f 73 ob;. int geos
2ee0: 69 7a 65 3b 0a 2f 2a 20 73 74 61 72 74 73 20 61 ize;./* starts a
2ef0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a transaction */.
2f00: 20 20 20 20 73 74 72 63 70 79 20 28 73 71 6c 2c strcpy (sql,
2f10: 20 22 42 45 47 49 4e 22 29 3b 0a 20 20 20 20 72 "BEGIN");. r
2f20: 65 74 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 65 et = sqlite3_exe
2f30: 63 20 28 68 61 6e 64 6c 65 2c 20 73 71 6c 2c 20 c (handle, sql,
2f40: 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 26 65 72 72 NULL, NULL, &err
2f50: 5f 6d 73 67 29 3b 0a 20 20 20 20 69 66 20 28 72 _msg);. if (r
2f60: 65 74 20 21 3d 20 53 51 4c 49 54 45 5f 4f 4b 29 et != SQLITE_OK)
2f70: 0a 20 20 20 20 20 20 7b 0a 09 20 20 70 72 69 6e . {.. prin
2f80: 74 66 20 28 22 42 45 47 49 4e 20 65 72 72 6f 72 tf ("BEGIN error
2f90: 3a 20 25 73 5c 6e 22 2c 20 65 72 72 5f 6d 73 67 : %s\n", err_msg
2fa0: 29 3b 0a 09 20 20 73 71 6c 69 74 65 33 5f 66 72 );.. sqlite3_fr
2fb0: 65 65 20 28 65 72 72 5f 6d 73 67 29 3b 0a 09 20 ee (err_msg);..
2fc0: 20 67 6f 74 6f 20 61 62 6f 72 74 3b 0a 20 20 20 goto abort;.
2fd0: 20 20 20 7d 0a 2f 2a 20 66 65 65 64 69 6e 67 20 }./* feeding
2fe0: 74 68 65 20 45 78 69 66 50 68 6f 74 6f 20 74 61 the ExifPhoto ta
2ff0: 62 6c 65 3b 20 70 72 65 70 61 72 69 6e 67 20 74 ble; preparing t
3000: 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 he SQL statement
3010: 2a 2f 0a 20 20 20 20 73 74 72 63 70 79 20 28 73 */. strcpy (s
3020: 71 6c 2c 0a 09 20 20 20 20 22 49 4e 53 45 52 54 ql,.. "INSERT
3030: 20 49 4e 54 4f 20 45 78 69 66 50 68 6f 74 6f 20 INTO ExifPhoto
3040: 28 50 68 6f 74 6f 49 64 2c 20 50 68 6f 74 6f 2c (PhotoId, Photo,
3050: 20 50 69 78 65 6c 58 2c 20 50 69 78 65 6c 59 2c PixelX, PixelY,
3060: 20 43 61 6d 65 72 61 4d 61 6b 65 2c 20 43 61 6d CameraMake, Cam
3070: 65 72 61 4d 6f 64 65 6c 2c 20 22 29 3b 0a 20 20 eraModel, ");.
3080: 20 20 73 74 72 63 61 74 20 28 73 71 6c 2c 0a 09 strcat (sql,..
3090: 20 20 20 20 22 53 68 6f 74 44 61 74 65 54 69 6d "ShotDateTim
30a0: 65 2c 20 47 70 73 47 65 6f 6d 65 74 72 79 2c 20 e, GpsGeometry,
30b0: 47 70 73 44 69 72 65 63 74 69 6f 6e 2c 20 47 70 GpsDirection, Gp
30c0: 73 53 61 74 65 6c 6c 69 74 65 73 2c 20 47 70 73 sSatellites, Gps
30d0: 54 69 6d 65 73 74 61 6d 70 2c 20 46 72 6f 6d 50 Timestamp, FromP
30e0: 61 74 68 29 20 22 29 3b 0a 20 20 20 20 73 74 72 ath) ");. str
30f0: 63 61 74 20 28 73 71 6c 2c 0a 09 20 20 20 20 22 cat (sql,.. "
3100: 56 41 4c 55 45 53 20 28 4e 55 4c 4c 2c 20 3f 2c VALUES (NULL, ?,
3110: 20 3f 2c 20 3f 2c 20 3f 2c 20 3f 2c 20 4a 75 6c ?, ?, ?, ?, Jul
3120: 69 61 6e 44 61 79 28 3f 29 2c 20 3f 2c 20 3f 2c ianDay(?), ?, ?,
3130: 20 3f 2c 20 4a 75 6c 69 61 6e 44 61 79 28 3f 29 ?, JulianDay(?)
3140: 2c 20 3f 29 22 29 3b 0a 20 20 20 20 72 65 74 20 , ?)");. ret
3150: 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 = sqlite3_prepar
3160: 65 5f 76 32 20 28 68 61 6e 64 6c 65 2c 20 73 71 e_v2 (handle, sq
3170: 6c 2c 20 73 74 72 6c 65 6e 20 28 73 71 6c 29 2c l, strlen (sql),
3180: 20 26 73 74 6d 74 2c 20 4e 55 4c 4c 29 3b 0a 20 &stmt, NULL);.
3190: 20 20 20 69 66 20 28 72 65 74 20 21 3d 20 53 51 if (ret != SQ
31a0: 4c 49 54 45 5f 4f 4b 29 0a 20 20 20 20 20 20 7b LITE_OK). {
31b0: 0a 09 20 20 70 72 69 6e 74 66 20 28 22 49 4e 53 .. printf ("INS
31c0: 45 52 54 20 49 4e 54 4f 20 45 78 69 66 50 68 6f ERT INTO ExifPho
31d0: 74 6f 20 65 72 72 6f 72 3a 20 25 73 5c 6e 22 2c to error: %s\n",
31e0: 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 20 sqlite3_errmsg
31f0: 28 68 61 6e 64 6c 65 29 29 3b 0a 09 20 20 67 6f (handle));.. go
3200: 74 6f 20 61 62 6f 72 74 3b 0a 20 20 20 20 20 20 to abort;.
3210: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 }. sqlite3_bi
3220: 6e 64 5f 62 6c 6f 62 20 28 73 74 6d 74 2c 20 31 nd_blob (stmt, 1
3230: 2c 20 62 6c 6f 62 2c 20 73 7a 2c 20 53 51 4c 49 , blob, sz, SQLI
3240: 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 TE_STATIC);.
3250: 76 61 6c 36 34 20 3d 20 67 65 74 50 69 78 65 6c val64 = getPixel
3260: 58 20 28 74 61 67 5f 6c 69 73 74 2c 20 26 6f 6b X (tag_list, &ok
3270: 29 3b 0a 20 20 20 20 69 66 20 28 6f 6b 29 0a 09 );. if (ok)..
3280: 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 sqlite3_bind_int
3290: 36 34 20 28 73 74 6d 74 2c 20 32 2c 20 76 61 6c 64 (stmt, 2, val
32a0: 36 34 29 3b 0a 20 20 20 20 65 6c 73 65 0a 09 73 64);. else..s
32b0: 71 6c 69 74 65 33 5f 62 69 6e 64 5f 6e 75 6c 6c qlite3_bind_null
32c0: 20 28 73 74 6d 74 2c 20 32 29 3b 0a 20 20 20 20 (stmt, 2);.
32d0: 76 61 6c 36 34 20 3d 20 67 65 74 50 69 78 65 6c val64 = getPixel
32e0: 59 20 28 74 61 67 5f 6c 69 73 74 2c 20 26 6f 6b Y (tag_list, &ok
32f0: 29 3b 0a 20 20 20 20 69 66 20 28 6f 6b 29 0a 09 );. if (ok)..
3300: 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 sqlite3_bind_int
3310: 36 34 20 28 73 74 6d 74 2c 20 33 2c 20 76 61 6c 64 (stmt, 3, val
3320: 36 34 29 3b 0a 20 20 20 20 65 6c 73 65 0a 09 73 64);. else..s
3330: 71 6c 69 74 65 33 5f 62 69 6e 64 5f 6e 75 6c 6c qlite3_bind_null
3340: 20 28 73 74 6d 74 2c 20 33 29 3b 0a 20 20 20 20 (stmt, 3);.
3350: 67 65 74 4d 61 6b 65 20 28 74 61 67 5f 6c 69 73 getMake (tag_lis
3360: 74 2c 20 6d 61 6b 65 2c 20 31 30 32 34 2c 20 26 t, make, 1024, &
3370: 6f 6b 29 3b 0a 20 20 20 20 69 66 20 28 6f 6b 29 ok);. if (ok)
3380: 0a 09 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 ..sqlite3_bind_t
3390: 65 78 74 20 28 73 74 6d 74 2c 20 34 2c 20 6d 61 ext (stmt, 4, ma
33a0: 6b 65 2c 20 73 74 72 6c 65 6e 20 28 6d 61 6b 65 ke, strlen (make
33b0: 29 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 ), SQLITE_STATIC
33c0: 29 3b 0a 20 20 20 20 65 6c 73 65 0a 09 73 71 6c );. else..sql
33d0: 69 74 65 33 5f 62 69 6e 64 5f 6e 75 6c 6c 20 28 ite3_bind_null (
33e0: 73 74 6d 74 2c 20 34 29 3b 0a 20 20 20 20 67 65 stmt, 4);. ge
33f0: 74 4d 6f 64 65 6c 20 28 74 61 67 5f 6c 69 73 74 tModel (tag_list
3400: 2c 20 6d 6f 64 65 6c 2c 20 31 30 32 34 2c 20 26 , model, 1024, &
3410: 6f 6b 29 3b 0a 20 20 20 20 69 66 20 28 6f 6b 29 ok);. if (ok)
3420: 0a 09 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 ..sqlite3_bind_t
3430: 65 78 74 20 28 73 74 6d 74 2c 20 35 2c 20 6d 6f ext (stmt, 5, mo
3440: 64 65 6c 2c 20 73 74 72 6c 65 6e 20 28 6d 6f 64 del, strlen (mod
3450: 65 6c 29 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 el), SQLITE_STAT
3460: 49 43 29 3b 0a 20 20 20 20 65 6c 73 65 0a 09 73 IC);. else..s
3470: 71 6c 69 74 65 33 5f 62 69 6e 64 5f 6e 75 6c 6c qlite3_bind_null
3480: 20 28 73 74 6d 74 2c 20 35 29 3b 0a 20 20 20 20 (stmt, 5);.
3490: 67 65 74 44 61 74 65 20 28 74 61 67 5f 6c 69 73 getDate (tag_lis
34a0: 74 2c 20 64 61 74 65 2c 20 33 32 2c 20 26 6f 6b t, date, 32, &ok
34b0: 29 3b 0a 20 20 20 20 69 66 20 28 6f 6b 29 0a 09 );. if (ok)..
34c0: 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 sqlite3_bind_tex
34d0: 74 20 28 73 74 6d 74 2c 20 36 2c 20 64 61 74 65 t (stmt, 6, date
34e0: 2c 20 73 74 72 6c 65 6e 20 28 64 61 74 65 29 2c , strlen (date),
34f0: 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b SQLITE_STATIC);
3500: 0a 20 20 20 20 65 6c 73 65 0a 09 73 71 6c 69 74 . else..sqlit
3510: 65 33 5f 62 69 6e 64 5f 74 65 78 74 20 28 73 74 e3_bind_text (st
3520: 6d 74 2c 20 36 2c 20 22 30 30 30 30 2d 30 30 2d mt, 6, "0000-00-
3530: 30 30 20 30 30 3a 30 30 3a 30 30 22 2c 20 31 39 00 00:00:00", 19
3540: 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 , SQLITE_STATIC)
3550: 3b 0a 20 20 20 20 67 65 74 47 70 73 43 6f 6f 72 ;. getGpsCoor
3560: 64 73 20 28 74 61 67 5f 6c 69 73 74 2c 20 26 6c ds (tag_list, &l
3570: 6f 6e 67 69 74 75 64 65 2c 20 26 6c 61 74 69 74 ongitude, &latit
3580: 75 64 65 2c 20 26 6f 6b 29 3b 0a 20 20 20 20 69 ude, &ok);. i
3590: 66 20 28 6f 6b 29 0a 20 20 20 20 20 20 7b 0a 09 f (ok). {..
35a0: 20 20 67 65 6f 6d 20 3d 20 67 61 69 61 41 6c 6c geom = gaiaAll
35b0: 6f 63 47 65 6f 6d 43 6f 6c 6c 20 28 29 3b 0a 09 ocGeomColl ();..
35c0: 20 20 67 65 6f 6d 2d 3e 53 72 69 64 20 3d 20 34 geom->Srid = 4
35d0: 33 32 36 3b 0a 09 20 20 67 61 69 61 41 64 64 50 326;.. gaiaAddP
35e0: 6f 69 6e 74 54 6f 47 65 6f 6d 43 6f 6c 6c 20 28 ointToGeomColl (
35f0: 67 65 6f 6d 2c 20 6c 6f 6e 67 69 74 75 64 65 2c geom, longitude,
3600: 20 6c 61 74 69 74 75 64 65 29 3b 0a 09 20 20 67 latitude);.. g
3610: 61 69 61 54 6f 53 70 61 74 69 61 4c 69 74 65 42 aiaToSpatiaLiteB
3620: 6c 6f 62 57 6b 62 20 28 67 65 6f 6d 2c 20 26 67 lobWkb (geom, &g
3630: 65 6f 62 6c 6f 62 2c 20 26 67 65 6f 73 69 7a 65 eoblob, &geosize
3640: 29 3b 0a 09 20 20 67 61 69 61 46 72 65 65 47 65 );.. gaiaFreeGe
3650: 6f 6d 43 6f 6c 6c 20 28 67 65 6f 6d 29 3b 0a 09 omColl (geom);..
3660: 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 62 sqlite3_bind_b
3670: 6c 6f 62 20 28 73 74 6d 74 2c 20 37 2c 20 67 65 lob (stmt, 7, ge
3680: 6f 62 6c 6f 62 2c 20 67 65 6f 73 69 7a 65 2c 20 oblob, geosize,
3690: 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 SQLITE_TRANSIENT
36a0: 29 3b 0a 09 20 20 66 72 65 65 20 28 67 65 6f 62 );.. free (geob
36b0: 6c 6f 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 lob);. }.
36c0: 20 20 65 6c 73 65 0a 09 73 71 6c 69 74 65 33 5f else..sqlite3_
36d0: 62 69 6e 64 5f 6e 75 6c 6c 20 28 73 74 6d 74 2c bind_null (stmt,
36e0: 20 37 29 3b 0a 20 20 20 20 64 62 6c 76 61 6c 20 7);. dblval
36f0: 3d 20 67 65 74 47 70 73 44 69 72 65 63 74 69 6f = getGpsDirectio
3700: 6e 20 28 74 61 67 5f 6c 69 73 74 2c 20 26 6f 6b n (tag_list, &ok
3710: 29 3b 0a 20 20 20 20 69 66 20 28 6f 6b 29 0a 09 );. if (ok)..
3720: 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 64 6f 75 sqlite3_bind_dou
3730: 62 6c 65 20 28 73 74 6d 74 2c 20 38 2c 20 64 62 ble (stmt, 8, db
3740: 6c 76 61 6c 29 3b 0a 20 20 20 20 65 6c 73 65 0a lval);. else.
3750: 09 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 6e 75 .sqlite3_bind_nu
3760: 6c 6c 20 28 73 74 6d 74 2c 20 38 29 3b 0a 20 20 ll (stmt, 8);.
3770: 20 20 67 65 74 47 70 73 53 61 74 65 6c 6c 69 74 getGpsSatellit
3780: 65 73 20 28 74 61 67 5f 6c 69 73 74 2c 20 73 61 es (tag_list, sa
3790: 74 65 6c 6c 69 74 65 73 2c 20 31 30 32 34 2c 20 tellites, 1024,
37a0: 26 6f 6b 29 3b 0a 20 20 20 20 69 66 20 28 6f 6b &ok);. if (ok
37b0: 29 0a 09 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f )..sqlite3_bind_
37c0: 74 65 78 74 20 28 73 74 6d 74 2c 20 39 2c 20 73 text (stmt, 9, s
37d0: 61 74 65 6c 6c 69 74 65 73 2c 20 73 74 72 6c 65 atellites, strle
37e0: 6e 20 28 73 61 74 65 6c 6c 69 74 65 73 29 2c 0a n (satellites),.
37f0: 09 09 09 20 20 20 53 51 4c 49 54 45 5f 53 54 41 ... SQLITE_STA
3800: 54 49 43 29 3b 0a 20 20 20 20 65 6c 73 65 0a 09 TIC);. else..
3810: 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 6e 75 6c sqlite3_bind_nul
3820: 6c 20 28 73 74 6d 74 2c 20 39 29 3b 0a 20 20 20 l (stmt, 9);.
3830: 20 67 65 74 47 70 73 54 69 6d 65 73 74 61 6d 70 getGpsTimestamp
3840: 20 28 74 61 67 5f 6c 69 73 74 2c 20 74 69 6d 65 (tag_list, time
3850: 73 74 61 6d 70 2c 20 33 32 2c 20 26 6f 6b 29 3b stamp, 32, &ok);
3860: 0a 20 20 20 20 69 66 20 28 6f 6b 29 0a 09 73 71 . if (ok)..sq
3870: 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 20 lite3_bind_text
3880: 28 73 74 6d 74 2c 20 31 30 2c 20 74 69 6d 65 73 (stmt, 10, times
3890: 74 61 6d 70 2c 20 73 74 72 6c 65 6e 20 28 74 69 tamp, strlen (ti
38a0: 6d 65 73 74 61 6d 70 29 2c 0a 09 09 09 20 20 20 mestamp),....
38b0: 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a SQLITE_STATIC);.
38c0: 20 20 20 20 65 6c 73 65 0a 09 73 71 6c 69 74 65 else..sqlite
38d0: 33 5f 62 69 6e 64 5f 74 65 78 74 20 28 73 74 6d 3_bind_text (stm
38e0: 74 2c 20 31 30 2c 20 22 30 30 30 30 2d 30 30 2d t, 10, "0000-00-
38f0: 30 30 20 30 30 3a 30 30 3a 30 30 22 2c 20 31 39 00 00:00:00", 19
3900: 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 , SQLITE_STATIC)
3910: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 ;. sqlite3_bi
3920: 6e 64 5f 74 65 78 74 20 28 73 74 6d 74 2c 20 31 nd_text (stmt, 1
3930: 31 2c 20 70 61 74 68 2c 20 73 74 72 6c 65 6e 20 1, path, strlen
3940: 28 70 61 74 68 29 2c 20 53 51 4c 49 54 45 5f 53 (path), SQLITE_S
3950: 54 41 54 49 43 29 3b 0a 20 20 20 20 72 65 74 20 TATIC);. ret
3960: 3d 20 73 71 6c 69 74 65 33 5f 73 74 65 70 20 28 = sqlite3_step (
3970: 73 74 6d 74 29 3b 0a 20 20 20 20 69 66 20 28 72 stmt);. if (r
3980: 65 74 20 3d 3d 20 53 51 4c 49 54 45 5f 44 4f 4e et == SQLITE_DON
3990: 45 20 7c 7c 20 72 65 74 20 3d 3d 20 53 51 4c 49 E || ret == SQLI
39a0: 54 45 5f 52 4f 57 29 0a 09 3b 0a 20 20 20 20 65 TE_ROW)..;. e
39b0: 6c 73 65 0a 20 20 20 20 20 20 7b 0a 09 20 20 70 lse. {.. p
39c0: 72 69 6e 74 66 20 28 22 73 71 6c 69 74 65 33 5f rintf ("sqlite3_
39d0: 73 74 65 70 28 29 20 65 72 72 6f 72 3a 20 25 73 step() error: %s
39e0: 5c 6e 22 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 \n", sqlite3_err
39f0: 6d 73 67 20 28 68 61 6e 64 6c 65 29 29 3b 0a 09 msg (handle));..
3a00: 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 sqlite3_finali
3a10: 7a 65 20 28 73 74 6d 74 29 3b 0a 09 20 20 67 6f ze (stmt);.. go
3a20: 74 6f 20 61 62 6f 72 74 3b 0a 20 20 20 20 20 20 to abort;.
3a30: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 }. sqlite3_fi
3a40: 6e 61 6c 69 7a 65 20 28 73 74 6d 74 29 3b 0a 20 nalize (stmt);.
3a50: 20 20 20 70 6b 20 3d 20 73 71 6c 69 74 65 33 5f pk = sqlite3_
3a60: 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69 last_insert_rowi
3a70: 64 20 28 68 61 6e 64 6c 65 29 3b 0a 20 20 20 20 d (handle);.
3a80: 69 66 20 28 6d 65 74 61 64 61 74 61 29 0a 20 20 if (metadata).
3a90: 20 20 20 20 7b 0a 09 20 20 2f 2a 20 66 65 65 64 {.. /* feed
3aa0: 69 6e 67 20 74 68 65 20 45 78 69 66 54 61 67 73 ing the ExifTags
3ab0: 20 74 61 62 6c 65 3b 20 70 72 65 70 61 72 69 6e table; preparin
3ac0: 67 20 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d g the SQL statem
3ad0: 65 6e 74 20 2a 2f 0a 09 20 20 73 74 72 63 70 79 ent */.. strcpy
3ae0: 20 28 73 71 6c 2c 0a 09 09 20 20 22 49 4e 53 45 (sql,... "INSE
3af0: 52 54 20 4f 52 20 49 47 4e 4f 52 45 20 49 4e 54 RT OR IGNORE INT
3b00: 4f 20 45 78 69 66 54 61 67 73 20 28 50 68 6f 74 O ExifTags (Phot
3b10: 6f 49 64 2c 20 54 61 67 49 64 2c 20 54 61 67 4e oId, TagId, TagN
3b20: 61 6d 65 2c 20 47 70 73 54 61 67 2c 20 56 61 6c ame, GpsTag, Val
3b30: 75 65 54 79 70 65 2c 20 22 29 3b 0a 09 20 20 73 ueType, ");.. s
3b40: 74 72 63 61 74 20 28 73 71 6c 2c 20 22 54 79 70 trcat (sql, "Typ
3b50: 65 4e 61 6d 65 2c 20 43 6f 75 6e 74 56 61 6c 75 eName, CountValu
3b60: 65 73 29 20 56 41 4c 55 45 53 20 28 3f 2c 20 3f es) VALUES (?, ?
3b70: 2c 20 3f 2c 20 3f 2c 20 3f 2c 20 3f 2c 20 3f 29 , ?, ?, ?, ?, ?)
3b80: 22 29 3b 0a 09 20 20 72 65 74 20 3d 20 73 71 6c ");.. ret = sql
3b90: 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 20 ite3_prepare_v2
3ba0: 28 68 61 6e 64 6c 65 2c 20 73 71 6c 2c 20 73 74 (handle, sql, st
3bb0: 72 6c 65 6e 20 28 73 71 6c 29 2c 20 26 73 74 6d rlen (sql), &stm
3bc0: 74 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 69 66 20 t, NULL);.. if
3bd0: 28 72 65 74 20 21 3d 20 53 51 4c 49 54 45 5f 4f (ret != SQLITE_O
3be0: 4b 29 0a 09 20 20 20 20 7b 0a 09 09 70 72 69 6e K).. {...prin
3bf0: 74 66 20 28 22 49 4e 53 45 52 54 20 49 4e 54 4f tf ("INSERT INTO
3c00: 20 45 78 69 66 54 61 67 73 20 65 72 72 6f 72 3a ExifTags error:
3c10: 20 25 73 5c 6e 22 2c 0a 09 09 09 73 71 6c 69 74 %s\n",....sqlit
3c20: 65 33 5f 65 72 72 6d 73 67 20 28 68 61 6e 64 6c e3_errmsg (handl
3c30: 65 29 29 3b 0a 09 09 67 6f 74 6f 20 61 62 6f 72 e));...goto abor
3c40: 74 3b 0a 09 20 20 20 20 7d 0a 09 20 20 66 6f 72 t;.. }.. for
3c50: 20 28 69 20 3d 20 30 3b 20 69 20 3c 20 67 61 69 (i = 0; i < gai
3c60: 61 47 65 74 45 78 69 66 54 61 67 73 43 6f 75 6e aGetExifTagsCoun
3c70: 74 20 28 74 61 67 5f 6c 69 73 74 29 3b 20 69 2b t (tag_list); i+
3c80: 2b 29 0a 09 20 20 20 20 7b 0a 09 09 70 54 20 3d +).. {...pT =
3c90: 20 67 61 69 61 47 65 74 45 78 69 66 54 61 67 42 gaiaGetExifTagB
3ca0: 79 50 6f 73 20 28 74 61 67 5f 6c 69 73 74 2c 20 yPos (tag_list,
3cb0: 69 29 3b 0a 09 09 69 66 20 28 70 54 29 0a 09 09 i);...if (pT)...
3cc0: 20 20 7b 0a 09 09 20 20 20 20 20 20 67 61 69 61 {... gaia
3cd0: 45 78 69 66 54 61 67 47 65 74 4e 61 6d 65 20 28 ExifTagGetName (
3ce0: 70 54 2c 20 74 61 67 5f 6e 61 6d 65 2c 20 31 32 pT, tag_name, 12
3cf0: 38 29 3b 0a 09 09 20 20 20 20 20 20 73 77 69 74 8);... swit
3d00: 63 68 20 28 67 61 69 61 45 78 69 66 54 61 67 47 ch (gaiaExifTagG
3d10: 65 74 56 61 6c 75 65 54 79 70 65 20 28 70 54 29 etValueType (pT)
3d20: 29 0a 09 09 09 7b 0a 09 09 09 63 61 73 65 20 31 )....{....case 1
3d30: 3a 0a 09 09 09 20 20 20 20 74 79 70 65 5f 64 65 :.... type_de
3d40: 73 63 20 3d 20 22 42 59 54 45 22 3b 0a 09 09 09 sc = "BYTE";....
3d50: 20 20 20 20 62 72 65 61 6b 3b 0a 09 09 09 63 61 break;....ca
3d60: 73 65 20 32 3a 0a 09 09 09 20 20 20 20 74 79 70 se 2:.... typ
3d70: 65 5f 64 65 73 63 20 3d 20 22 53 54 52 49 4e 47 e_desc = "STRING
3d80: 22 3b 0a 09 09 09 20 20 20 20 62 72 65 61 6b 3b ";.... break;
3d90: 0a 09 09 09 63 61 73 65 20 33 3a 0a 09 09 09 20 ....case 3:....
3da0: 20 20 20 74 79 70 65 5f 64 65 73 63 20 3d 20 22 type_desc = "
3db0: 53 48 4f 52 54 22 3b 0a 09 09 09 20 20 20 20 62 SHORT";.... b
3dc0: 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 34 3a reak;....case 4:
3dd0: 0a 09 09 09 20 20 20 20 74 79 70 65 5f 64 65 73 .... type_des
3de0: 63 20 3d 20 22 4c 4f 4e 47 22 3b 0a 09 09 09 20 c = "LONG";....
3df0: 20 20 20 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 break;....cas
3e00: 65 20 35 3a 0a 09 09 09 20 20 20 20 74 79 70 65 e 5:.... type
3e10: 5f 64 65 73 63 20 3d 20 22 52 41 54 49 4f 4e 41 _desc = "RATIONA
3e20: 4c 22 3b 0a 09 09 09 20 20 20 20 62 72 65 61 6b L";.... break
3e30: 3b 0a 09 09 09 63 61 73 65 20 36 3a 0a 09 09 09 ;....case 6:....
3e40: 20 20 20 20 74 79 70 65 5f 64 65 73 63 20 3d 20 type_desc =
3e50: 22 53 42 59 54 45 22 3b 0a 09 09 09 20 20 20 20 "SBYTE";....
3e60: 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 37 break;....case 7
3e70: 3a 0a 09 09 09 20 20 20 20 74 79 70 65 5f 64 65 :.... type_de
3e80: 73 63 20 3d 20 22 55 4e 44 45 46 49 4e 45 44 22 sc = "UNDEFINED"
3e90: 3b 0a 09 09 09 20 20 20 20 62 72 65 61 6b 3b 0a ;.... break;.
3ea0: 09 09 09 63 61 73 65 20 38 3a 0a 09 09 09 20 20 ...case 8:....
3eb0: 20 20 74 79 70 65 5f 64 65 73 63 20 3d 20 22 53 type_desc = "S
3ec0: 53 48 4f 52 54 22 3b 0a 09 09 09 20 20 20 20 62 SHORT";.... b
3ed0: 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 39 3a reak;....case 9:
3ee0: 0a 09 09 09 20 20 20 20 74 79 70 65 5f 64 65 73 .... type_des
3ef0: 63 20 3d 20 22 53 4c 4f 4e 47 22 3b 0a 09 09 09 c = "SLONG";....
3f00: 20 20 20 20 62 72 65 61 6b 3b 0a 09 09 09 63 61 break;....ca
3f10: 73 65 20 31 30 3a 0a 09 09 09 20 20 20 20 74 79 se 10:.... ty
3f20: 70 65 5f 64 65 73 63 20 3d 20 22 53 52 41 54 49 pe_desc = "SRATI
3f30: 4f 4e 41 4c 22 3b 0a 09 09 09 20 20 20 20 62 72 ONAL";.... br
3f40: 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 31 31 3a eak;....case 11:
3f50: 0a 09 09 09 20 20 20 20 74 79 70 65 5f 64 65 73 .... type_des
3f60: 63 20 3d 20 22 46 4c 4f 41 54 22 3b 0a 09 09 09 c = "FLOAT";....
3f70: 20 20 20 20 62 72 65 61 6b 3b 0a 09 09 09 63 61 break;....ca
3f80: 73 65 20 31 32 3a 0a 09 09 09 20 20 20 20 74 79 se 12:.... ty
3f90: 70 65 5f 64 65 73 63 20 3d 20 22 44 4f 55 42 4c pe_desc = "DOUBL
3fa0: 45 22 3b 0a 09 09 09 20 20 20 20 62 72 65 61 6b E";.... break
3fb0: 3b 0a 09 09 09 64 65 66 61 75 6c 74 3a 0a 09 09 ;....default:...
3fc0: 09 20 20 20 20 74 79 70 65 5f 64 65 73 63 20 3d . type_desc =
3fd0: 20 22 55 4e 4b 4e 4f 57 4e 22 3b 0a 09 09 09 20 "UNKNOWN";....
3fe0: 20 20 20 62 72 65 61 6b 3b 0a 09 09 09 7d 3b 0a break;....};.
3ff0: 09 09 20 20 20 20 20 20 2f 2a 20 49 4e 53 45 52 .. /* INSER
4000: 54 69 6e 67 20 61 6e 20 45 78 69 66 20 54 61 67 Ting an Exif Tag
4010: 20 2a 2f 0a 09 09 20 20 20 20 20 20 73 71 6c 69 */... sqli
4020: 74 65 33 5f 72 65 73 65 74 20 28 73 74 6d 74 29 te3_reset (stmt)
4030: 3b 0a 09 09 20 20 20 20 20 20 73 71 6c 69 74 65 ;... sqlite
4040: 33 5f 63 6c 65 61 72 5f 62 69 6e 64 69 6e 67 73 3_clear_bindings
4050: 20 28 73 74 6d 74 29 3b 0a 09 09 20 20 20 20 20 (stmt);...
4060: 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e sqlite3_bind_in
4070: 74 36 34 20 28 73 74 6d 74 2c 20 31 2c 20 70 6b t64 (stmt, 1, pk
4080: 29 3b 0a 09 09 20 20 20 20 20 20 73 71 6c 69 74 );... sqlit
4090: 65 33 5f 62 69 6e 64 5f 69 6e 74 20 28 73 74 6d e3_bind_int (stm
40a0: 74 2c 20 32 2c 20 67 61 69 61 45 78 69 66 54 61 t, 2, gaiaExifTa
40b0: 67 47 65 74 49 64 20 28 70 54 29 29 3b 0a 09 09 gGetId (pT));...
40c0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 sqlite3_bi
40d0: 6e 64 5f 74 65 78 74 20 28 73 74 6d 74 2c 20 33 nd_text (stmt, 3
40e0: 2c 20 74 61 67 5f 6e 61 6d 65 2c 20 73 74 72 6c , tag_name, strl
40f0: 65 6e 20 28 74 61 67 5f 6e 61 6d 65 29 2c 0a 09 en (tag_name),..
4100: 09 09 09 09 20 53 51 4c 49 54 45 5f 53 54 41 54 .... SQLITE_STAT
4110: 49 43 29 3b 0a 09 09 20 20 20 20 20 20 73 71 6c IC);... sql
4120: 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 20 28 73 ite3_bind_int (s
4130: 74 6d 74 2c 20 34 2c 20 67 61 69 61 49 73 45 78 tmt, 4, gaiaIsEx
4140: 69 66 47 70 73 54 61 67 20 28 70 54 29 29 3b 0a ifGpsTag (pT));.
4150: 09 09 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f .. sqlite3_
4160: 62 69 6e 64 5f 69 6e 74 20 28 73 74 6d 74 2c 20 bind_int (stmt,
4170: 35 2c 20 67 61 69 61 45 78 69 66 54 61 67 47 65 5, gaiaExifTagGe
4180: 74 56 61 6c 75 65 54 79 70 65 20 28 70 54 29 29 tValueType (pT))
4190: 3b 0a 09 09 20 20 20 20 20 20 73 71 6c 69 74 65 ;... sqlite
41a0: 33 5f 62 69 6e 64 5f 74 65 78 74 20 28 73 74 6d 3_bind_text (stm
41b0: 74 2c 20 36 2c 20 74 79 70 65 5f 64 65 73 63 2c t, 6, type_desc,
41c0: 20 73 74 72 6c 65 6e 20 28 74 79 70 65 5f 64 65 strlen (type_de
41d0: 73 63 29 2c 0a 09 09 09 09 09 20 53 51 4c 49 54 sc),...... SQLIT
41e0: 45 5f 53 54 41 54 49 43 29 3b 0a 09 09 20 20 20 E_STATIC);...
41f0: 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f sqlite3_bind_
4200: 69 6e 74 20 28 73 74 6d 74 2c 20 37 2c 20 67 61 int (stmt, 7, ga
4210: 69 61 45 78 69 66 54 61 67 47 65 74 4e 75 6d 56 iaExifTagGetNumV
4220: 61 6c 75 65 73 20 28 70 54 29 29 3b 0a 09 09 20 alues (pT));...
4230: 20 20 20 20 20 72 65 74 20 3d 20 73 71 6c 69 74 ret = sqlit
4240: 65 33 5f 73 74 65 70 20 28 73 74 6d 74 29 3b 0a e3_step (stmt);.
4250: 09 09 20 20 20 20 20 20 69 66 20 28 72 65 74 20 .. if (ret
4260: 3d 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 7c == SQLITE_DONE |
4270: 7c 20 72 65 74 20 3d 3d 20 53 51 4c 49 54 45 5f | ret == SQLITE_
4280: 52 4f 57 29 0a 09 09 09 20 20 3b 0a 09 09 20 20 ROW).... ;...
4290: 20 20 20 20 65 6c 73 65 0a 09 09 09 7b 0a 09 09 else....{...
42a0: 09 20 20 20 20 70 72 69 6e 74 66 20 28 22 73 71 . printf ("sq
42b0: 6c 69 74 65 33 5f 73 74 65 70 28 29 20 65 72 72 lite3_step() err
42c0: 6f 72 3a 20 25 73 5c 6e 22 2c 0a 09 09 09 09 20 or: %s\n",.....
42d0: 20 20 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 sqlite3_errms
42e0: 67 20 28 68 61 6e 64 6c 65 29 29 3b 0a 09 09 09 g (handle));....
42f0: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 sqlite3_fina
4300: 6c 69 7a 65 20 28 73 74 6d 74 29 3b 0a 09 09 09 lize (stmt);....
4310: 20 20 20 20 67 6f 74 6f 20 61 62 6f 72 74 3b 0a goto abort;.
4320: 09 09 09 7d 0a 09 09 20 20 7d 0a 09 20 20 20 20 ...}... }..
4330: 7d 0a 09 20 20 73 71 6c 69 74 65 33 5f 66 69 6e }.. sqlite3_fin
4340: 61 6c 69 7a 65 20 28 73 74 6d 74 29 3b 0a 09 20 alize (stmt);..
4350: 20 2f 2a 20 66 65 65 64 69 6e 67 20 74 68 65 20 /* feeding the
4360: 45 78 69 66 56 61 6c 75 65 73 20 74 61 62 6c 65 ExifValues table
4370: 3b 20 70 72 65 70 61 72 69 6e 67 20 74 68 65 20 ; preparing the
4380: 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f SQL statement */
4390: 0a 09 20 20 73 74 72 63 70 79 20 28 73 71 6c 2c .. strcpy (sql,
43a0: 0a 09 09 20 20 22 49 4e 53 45 52 54 20 4f 52 20 ... "INSERT OR
43b0: 49 47 4e 4f 52 45 20 49 4e 54 4f 20 45 78 69 66 IGNORE INTO Exif
43c0: 56 61 6c 75 65 73 20 28 50 68 6f 74 6f 49 64 2c Values (PhotoId,
43d0: 20 54 61 67 49 64 2c 20 56 61 6c 75 65 49 6e 64 TagId, ValueInd
43e0: 65 78 2c 20 42 79 74 65 56 61 6c 75 65 2c 20 22 ex, ByteValue, "
43f0: 29 3b 0a 09 20 20 73 74 72 63 61 74 20 28 73 71 );.. strcat (sq
4400: 6c 2c 0a 09 09 20 20 22 53 74 72 69 6e 67 56 61 l,... "StringVa
4410: 6c 75 65 2c 20 4e 75 6d 56 61 6c 75 65 2c 20 4e lue, NumValue, N
4420: 75 6d 56 61 6c 75 65 42 69 73 2c 20 44 6f 75 62 umValueBis, Doub
4430: 6c 65 56 61 6c 75 65 2c 20 48 75 6d 61 6e 52 65 leValue, HumanRe
4440: 61 64 61 62 6c 65 29 20 56 41 4c 55 45 53 20 22 adable) VALUES "
4450: 29 3b 0a 09 20 20 73 74 72 63 61 74 20 28 73 71 );.. strcat (sq
4460: 6c 2c 20 22 28 3f 2c 20 3f 2c 20 3f 2c 20 3f 2c l, "(?, ?, ?, ?,
4470: 20 3f 2c 20 3f 2c 20 3f 2c 20 3f 2c 20 3f 29 22 ?, ?, ?, ?, ?)"
4480: 29 3b 0a 09 20 20 72 65 74 20 3d 20 73 71 6c 69 );.. ret = sqli
4490: 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 20 28 te3_prepare_v2 (
44a0: 68 61 6e 64 6c 65 2c 20 73 71 6c 2c 20 73 74 72 handle, sql, str
44b0: 6c 65 6e 20 28 73 71 6c 29 2c 20 26 73 74 6d 74 len (sql), &stmt
44c0: 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 69 66 20 28 , NULL);.. if (
44d0: 72 65 74 20 21 3d 20 53 51 4c 49 54 45 5f 4f 4b ret != SQLITE_OK
44e0: 29 0a 09 20 20 20 20 7b 0a 09 09 70 72 69 6e 74 ).. {...print
44f0: 66 20 28 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 f ("INSERT INTO
4500: 45 78 69 66 56 61 6c 75 65 73 20 65 72 72 6f 72 ExifValues error
4510: 3a 20 25 73 5c 6e 22 2c 0a 09 09 09 73 71 6c 69 : %s\n",....sqli
4520: 74 65 33 5f 65 72 72 6d 73 67 20 28 68 61 6e 64 te3_errmsg (hand
4530: 6c 65 29 29 3b 0a 09 09 67 6f 74 6f 20 61 62 6f le));...goto abo
4540: 72 74 3b 0a 09 20 20 20 20 7d 0a 09 20 20 66 6f rt;.. }.. fo
4550: 72 20 28 69 20 3d 20 30 3b 20 69 20 3c 20 67 61 r (i = 0; i < ga
4560: 69 61 47 65 74 45 78 69 66 54 61 67 73 43 6f 75 iaGetExifTagsCou
4570: 6e 74 20 28 74 61 67 5f 6c 69 73 74 29 3b 20 69 nt (tag_list); i
4580: 2b 2b 29 0a 09 20 20 20 20 7b 0a 09 09 70 54 20 ++).. {...pT
4590: 3d 20 67 61 69 61 47 65 74 45 78 69 66 54 61 67 = gaiaGetExifTag
45a0: 42 79 50 6f 73 20 28 74 61 67 5f 6c 69 73 74 2c ByPos (tag_list,
45b0: 20 69 29 3b 0a 09 09 69 66 20 28 70 54 29 0a 09 i);...if (pT)..
45c0: 09 20 20 7b 0a 09 09 20 20 20 20 20 20 67 61 69 . {... gai
45d0: 61 45 78 69 66 54 61 67 47 65 74 48 75 6d 61 6e aExifTagGetHuman
45e0: 52 65 61 64 61 62 6c 65 20 28 70 54 2c 20 68 75 Readable (pT, hu
45f0: 6d 61 6e 2c 20 31 30 32 34 2c 20 26 6f 6b 5f 68 man, 1024, &ok_h
4600: 75 6d 61 6e 29 3b 0a 09 09 20 20 20 20 20 20 66 uman);... f
4610: 6f 72 20 28 69 76 20 3d 20 30 3b 20 69 76 20 3c or (iv = 0; iv <
4620: 20 67 61 69 61 45 78 69 66 54 61 67 47 65 74 4e gaiaExifTagGetN
4630: 75 6d 56 61 6c 75 65 73 20 28 70 54 29 3b 20 69 umValues (pT); i
4640: 76 2b 2b 29 0a 09 09 09 7b 0a 09 09 09 20 20 20 v++)....{....
4650: 20 2f 2a 20 49 4e 53 45 52 54 69 6e 67 20 61 6e /* INSERTing an
4660: 20 45 78 69 66 20 54 61 67 20 2a 2f 0a 09 09 09 Exif Tag */....
4670: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 65 sqlite3_rese
4680: 74 20 28 73 74 6d 74 29 3b 0a 09 09 09 20 20 20 t (stmt);....
4690: 20 73 71 6c 69 74 65 33 5f 63 6c 65 61 72 5f 62 sqlite3_clear_b
46a0: 69 6e 64 69 6e 67 73 20 28 73 74 6d 74 29 3b 0a indings (stmt);.
46b0: 09 09 09 20 20 20 20 73 71 6c 69 74 65 33 5f 62 ... sqlite3_b
46c0: 69 6e 64 5f 69 6e 74 36 34 20 28 73 74 6d 74 2c ind_int64 (stmt,
46d0: 20 31 2c 20 70 6b 29 3b 0a 09 09 09 20 20 20 20 1, pk);....
46e0: 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 sqlite3_bind_int
46f0: 20 28 73 74 6d 74 2c 20 32 2c 20 67 61 69 61 45 (stmt, 2, gaiaE
4700: 78 69 66 54 61 67 47 65 74 49 64 20 28 70 54 29 xifTagGetId (pT)
4710: 29 3b 0a 09 09 09 20 20 20 20 73 71 6c 69 74 65 );.... sqlite
4720: 33 5f 62 69 6e 64 5f 69 6e 74 20 28 73 74 6d 74 3_bind_int (stmt
4730: 2c 20 33 2c 20 69 76 29 3b 0a 09 09 09 20 20 20 , 3, iv);....
4740: 20 69 66 20 28 67 61 69 61 45 78 69 66 54 61 67 if (gaiaExifTag
4750: 47 65 74 56 61 6c 75 65 54 79 70 65 20 28 70 54 GetValueType (pT
4760: 29 20 3d 3d 20 31 0a 09 09 09 09 7c 7c 20 67 61 ) == 1.....|| ga
4770: 69 61 45 78 69 66 54 61 67 47 65 74 56 61 6c 75 iaExifTagGetValu
4780: 65 54 79 70 65 20 28 70 54 29 20 3d 3d 20 36 0a eType (pT) == 6.
4790: 09 09 09 09 7c 7c 20 67 61 69 61 45 78 69 66 54 ....|| gaiaExifT
47a0: 61 67 47 65 74 56 61 6c 75 65 54 79 70 65 20 28 agGetValueType (
47b0: 70 54 29 20 3d 3d 20 37 29 0a 09 09 09 20 20 20 pT) == 7)....
47c0: 20 20 20 7b 0a 09 09 09 09 20 20 73 71 6c 69 74 {..... sqlit
47d0: 65 33 5f 62 69 6e 64 5f 62 6c 6f 62 20 28 73 74 e3_bind_blob (st
47e0: 6d 74 2c 20 34 2c 20 70 54 2d 3e 42 79 74 65 56 mt, 4, pT->ByteV
47f0: 61 6c 75 65 2c 0a 09 09 09 09 09 09 20 20 20 20 alue,.......
4800: 20 70 54 2d 3e 43 6f 75 6e 74 2c 20 53 51 4c 49 pT->Count, SQLI
4810: 54 45 5f 53 54 41 54 49 43 29 3b 0a 09 09 09 09 TE_STATIC);.....
4820: 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 6e sqlite3_bind_n
4830: 75 6c 6c 20 28 73 74 6d 74 2c 20 35 29 3b 0a 09 ull (stmt, 5);..
4840: 09 09 09 20 20 73 71 6c 69 74 65 33 5f 62 69 6e ... sqlite3_bin
4850: 64 5f 6e 75 6c 6c 20 28 73 74 6d 74 2c 20 36 29 d_null (stmt, 6)
4860: 3b 0a 09 09 09 09 20 20 73 71 6c 69 74 65 33 5f ;..... sqlite3_
4870: 62 69 6e 64 5f 6e 75 6c 6c 20 28 73 74 6d 74 2c bind_null (stmt,
4880: 20 37 29 3b 0a 09 09 09 09 20 20 73 71 6c 69 74 7);..... sqlit
4890: 65 33 5f 62 69 6e 64 5f 6e 75 6c 6c 20 28 73 74 e3_bind_null (st
48a0: 6d 74 2c 20 38 29 3b 0a 09 09 09 20 20 20 20 20 mt, 8);....
48b0: 20 7d 0a 09 09 09 20 20 20 20 69 66 20 28 67 61 }.... if (ga
48c0: 69 61 45 78 69 66 54 61 67 47 65 74 56 61 6c 75 iaExifTagGetValu
48d0: 65 54 79 70 65 20 28 70 54 29 20 3d 3d 20 32 29 eType (pT) == 2)
48e0: 0a 09 09 09 20 20 20 20 20 20 7b 0a 09 09 09 09 .... {.....
48f0: 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 6e sqlite3_bind_n
4900: 75 6c 6c 20 28 73 74 6d 74 2c 20 34 29 3b 0a 09 ull (stmt, 4);..
4910: 09 09 09 20 20 73 71 6c 69 74 65 33 5f 62 69 6e ... sqlite3_bin
4920: 64 5f 74 65 78 74 20 28 73 74 6d 74 2c 20 35 2c d_text (stmt, 5,
4930: 20 70 54 2d 3e 53 74 72 69 6e 67 56 61 6c 75 65 pT->StringValue
4940: 2c 0a 09 09 09 09 09 09 20 20 20 20 20 73 74 72 ,....... str
4950: 6c 65 6e 20 28 70 54 2d 3e 53 74 72 69 6e 67 56 len (pT->StringV
4960: 61 6c 75 65 29 2c 0a 09 09 09 09 09 09 20 20 20 alue),.......
4970: 20 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 SQLITE_STATIC)
4980: 3b 0a 09 09 09 09 20 20 73 71 6c 69 74 65 33 5f ;..... sqlite3_
4990: 62 69 6e 64 5f 6e 75 6c 6c 20 28 73 74 6d 74 2c bind_null (stmt,
49a0: 20 36 29 3b 0a 09 09 09 09 20 20 73 71 6c 69 74 6);..... sqlit
49b0: 65 33 5f 62 69 6e 64 5f 6e 75 6c 6c 20 28 73 74 e3_bind_null (st
49c0: 6d 74 2c 20 37 29 3b 0a 09 09 09 09 20 20 73 71 mt, 7);..... sq
49d0: 6c 69 74 65 33 5f 62 69 6e 64 5f 6e 75 6c 6c 20 lite3_bind_null
49e0: 28 73 74 6d 74 2c 20 38 29 3b 0a 09 09 09 20 20 (stmt, 8);....
49f0: 20 20 20 20 7d 0a 09 09 09 20 20 20 20 69 66 20 }.... if
4a00: 28 67 61 69 61 45 78 69 66 54 61 67 47 65 74 56 (gaiaExifTagGetV
4a10: 61 6c 75 65 54 79 70 65 20 28 70 54 29 20 3d 3d alueType (pT) ==
4a20: 20 33 29 0a 09 09 09 20 20 20 20 20 20 7b 0a 09 3).... {..
4a30: 09 09 09 20 20 73 71 6c 69 74 65 33 5f 62 69 6e ... sqlite3_bin
4a40: 64 5f 6e 75 6c 6c 20 28 73 74 6d 74 2c 20 34 29 d_null (stmt, 4)
4a50: 3b 0a 09 09 09 09 20 20 73 71 6c 69 74 65 33 5f ;..... sqlite3_
4a60: 62 69 6e 64 5f 6e 75 6c 6c 20 28 73 74 6d 74 2c bind_null (stmt,
4a70: 20 35 29 3b 0a 09 09 09 09 20 20 76 61 6c 36 34 5);..... val64
4a80: 20 3d 0a 09 09 09 09 20 20 20 20 20 20 67 61 69 =..... gai
4a90: 61 45 78 69 66 54 61 67 47 65 74 53 68 6f 72 74 aExifTagGetShort
4aa0: 56 61 6c 75 65 20 28 70 54 2c 20 69 76 2c 20 26 Value (pT, iv, &
4ab0: 6f 6b 29 3b 0a 09 09 09 09 20 20 69 66 20 28 21 ok);..... if (!
4ac0: 6f 6b 29 0a 09 09 09 09 20 20 20 20 20 20 73 71 ok)..... sq
4ad0: 6c 69 74 65 33 5f 62 69 6e 64 5f 6e 75 6c 6c 20 lite3_bind_null
4ae0: 28 73 74 6d 74 2c 20 36 29 3b 0a 09 09 09 09 20 (stmt, 6);.....
4af0: 20 65 6c 73 65 0a 09 09 09 09 20 20 20 20 20 20 else.....
4b00: 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 sqlite3_bind_int
4b10: 36 34 20 28 73 74 6d 74 2c 20 36 2c 20 76 61 6c 64 (stmt, 6, val
4b20: 36 34 29 3b 0a 09 09 09 09 20 20 73 71 6c 69 74 64);..... sqlit
4b30: 65 33 5f 62 69 6e 64 5f 6e 75 6c 6c 20 28 73 74 e3_bind_null (st
4b40: 6d 74 2c 20 37 29 3b 0a 09 09 09 09 20 20 73 71 mt, 7);..... sq
4b50: 6c 69 74 65 33 5f 62 69 6e 64 5f 6e 75 6c 6c 20 lite3_bind_null
4b60: 28 73 74 6d 74 2c 20 38 29 3b 0a 09 09 09 20 20 (stmt, 8);....
4b70: 20 20 20 20 7d 0a 09 09 09 20 20 20 20 69 66 20 }.... if
4b80: 28 67 61 69 61 45 78 69 66 54 61 67 47 65 74 56 (gaiaExifTagGetV
4b90: 61 6c 75 65 54 79 70 65 20 28 70 54 29 20 3d 3d alueType (pT) ==
4ba0: 20 34 29 0a 09 09 09 20 20 20 20 20 20 7b 0a 09 4).... {..
4bb0: 09 09 09 20 20 73 71 6c 69 74 65 33 5f 62 69 6e ... sqlite3_bin
4bc0: 64 5f 6e 75 6c 6c 20 28 73 74 6d 74 2c 20 34 29 d_null (stmt, 4)
4bd0: 3b 0a 09 09 09 09 20 20 73 71 6c 69 74 65 33 5f ;..... sqlite3_
4be0: 62 69 6e 64 5f 6e 75 6c 6c 20 28 73 74 6d 74 2c bind_null (stmt,
4bf0: 20 35 29 3b 0a 09 09 09 09 20 20 76 61 6c 36 34 5);..... val64
4c00: 20 3d 20 67 61 69 61 45 78 69 66 54 61 67 47 65 = gaiaExifTagGe
4c10: 74 4c 6f 6e 67 56 61 6c 75 65 20 28 70 54 2c 20 tLongValue (pT,
4c20: 69 76 2c 20 26 6f 6b 29 3b 0a 09 09 09 09 20 20 iv, &ok);.....
4c30: 69 66 20 28 21 6f 6b 29 0a 09 09 09 09 20 20 20 if (!ok).....
4c40: 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f sqlite3_bind_
4c50: 6e 75 6c 6c 20 28 73 74 6d 74 2c 20 36 29 3b 0a null (stmt, 6);.
4c60: 09 09 09 09 20 20 65 6c 73 65 0a 09 09 09 09 20 .... else.....
4c70: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e sqlite3_bin
4c80: 64 5f 69 6e 74 36 34 20 28 73 74 6d 74 2c 20 36 d_int64 (stmt, 6
4c90: 2c 20 76 61 6c 36 34 29 3b 0a 09 09 09 09 20 20 , val64);.....
4ca0: 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 6e 75 6c sqlite3_bind_nul
4cb0: 6c 20 28 73 74 6d 74 2c 20 37 29 3b 0a 09 09 09 l (stmt, 7);....
4cc0: 09 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f . sqlite3_bind_
4cd0: 6e 75 6c 6c 20 28 73 74 6d 74 2c 20 38 29 3b 0a null (stmt, 8);.
4ce0: 09 09 09 20 20 20 20 20 20 7d 0a 09 09 09 20 20 ... }....
4cf0: 20 20 69 66 20 28 67 61 69 61 45 78 69 66 54 61 if (gaiaExifTa
4d00: 67 47 65 74 56 61 6c 75 65 54 79 70 65 20 28 70 gGetValueType (p
4d10: 54 29 20 3d 3d 20 35 29 0a 09 09 09 20 20 20 20 T) == 5)....
4d20: 20 20 7b 0a 09 09 09 09 20 20 73 71 6c 69 74 65 {..... sqlite
4d30: 33 5f 62 69 6e 64 5f 6e 75 6c 6c 20 28 73 74 6d 3_bind_null (stm
4d40: 74 2c 20 34 29 3b 0a 09 09 09 09 20 20 73 71 6c t, 4);..... sql
4d50: 69 74 65 33 5f 62 69 6e 64 5f 6e 75 6c 6c 20 28 ite3_bind_null (
4d60: 73 74 6d 74 2c 20 35 29 3b 0a 09 09 09 09 20 20 stmt, 5);.....
4d70: 76 61 6c 36 34 20 3d 0a 09 09 09 09 20 20 20 20 val64 =.....
4d80: 20 20 67 61 69 61 45 78 69 66 54 61 67 47 65 74 gaiaExifTagGet
4d90: 52 61 74 69 6f 6e 61 6c 31 56 61 6c 75 65 20 28 Rational1Value (
4da0: 70 54 2c 20 69 76 2c 0a 09 09 09 09 09 09 09 09 pT, iv,.........
4db0: 20 20 20 20 26 6f 6b 29 3b 0a 09 09 09 09 20 20 &ok);.....
4dc0: 69 66 20 28 21 6f 6b 29 0a 09 09 09 09 20 20 20 if (!ok).....
4dd0: 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f sqlite3_bind_
4de0: 6e 75 6c 6c 20 28 73 74 6d 74 2c 20 36 29 3b 0a null (stmt, 6);.
4df0: 09 09 09 09 20 20 65 6c 73 65 0a 09 09 09 09 20 .... else.....
4e00: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e sqlite3_bin
4e10: 64 5f 69 6e 74 36 34 20 28 73 74 6d 74 2c 20 36 d_int64 (stmt, 6
4e20: 2c 20 76 61 6c 36 34 29 3b 0a 09 09 09 09 20 20 , val64);.....
4e30: 76 61 6c 36 34 20 3d 0a 09 09 09 09 20 20 20 20 val64 =.....
4e40: 20 20 67 61 69 61 45 78 69 66 54 61 67 47 65 74 gaiaExifTagGet
4e50: 52 61 74 69 6f 6e 61 6c 32 56 61 6c 75 65 20 28 Rational2Value (
4e60: 70 54 2c 20 69 76 2c 0a 09 09 09 09 09 09 09 09 pT, iv,.........
4e70: 20 20 20 20 26 6f 6b 29 3b 0a 09 09 09 09 20 20 &ok);.....
4e80: 69 66 20 28 21 6f 6b 29 0a 09 09 09 09 20 20 20 if (!ok).....
4e90: 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f sqlite3_bind_
4ea0: 6e 75 6c 6c 20 28 73 74 6d 74 2c 20 37 29 3b 0a null (stmt, 7);.
4eb0: 09 09 09 09 20 20 65 6c 73 65 0a 09 09 09 09 20 .... else.....
4ec0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e sqlite3_bin
4ed0: 64 5f 69 6e 74 36 34 20 28 73 74 6d 74 2c 20 37 d_int64 (stmt, 7
4ee0: 2c 20 76 61 6c 36 34 29 3b 0a 09 09 09 09 20 20 , val64);.....
4ef0: 64 62 6c 76 61 6c 20 3d 0a 09 09 09 09 20 20 20 dblval =.....
4f00: 20 20 20 67 61 69 61 45 78 69 66 54 61 67 47 65 gaiaExifTagGe
4f10: 74 52 61 74 69 6f 6e 61 6c 56 61 6c 75 65 20 28 tRationalValue (
4f20: 70 54 2c 20 69 76 2c 20 26 6f 6b 29 3b 0a 09 09 pT, iv, &ok);...
4f30: 09 09 20 20 69 66 20 28 21 6f 6b 29 0a 09 09 09 .. if (!ok)....
4f40: 09 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 . sqlite3_b
4f50: 69 6e 64 5f 6e 75 6c 6c 20 28 73 74 6d 74 2c 20 ind_null (stmt,
4f60: 38 29 3b 0a 09 09 09 09 20 20 65 6c 73 65 0a 09 8);..... else..
4f70: 09 09 09 20 20 20 20 20 20 73 71 6c 69 74 65 33 ... sqlite3
4f80: 5f 62 69 6e 64 5f 64 6f 75 62 6c 65 20 28 73 74 _bind_double (st
4f90: 6d 74 2c 20 38 2c 20 64 62 6c 76 61 6c 29 3b 0a mt, 8, dblval);.
4fa0: 09 09 09 20 20 20 20 20 20 7d 0a 09 09 09 20 20 ... }....
4fb0: 20 20 69 66 20 28 67 61 69 61 45 78 69 66 54 61 if (gaiaExifTa
4fc0: 67 47 65 74 56 61 6c 75 65 54 79 70 65 20 28 70 gGetValueType (p
4fd0: 54 29 20 3d 3d 20 39 29 0a 09 09 09 20 20 20 20 T) == 9)....
4fe0: 20 20 7b 0a 09 09 09 09 20 20 73 71 6c 69 74 65 {..... sqlite
4ff0: 33 5f 62 69 6e 64 5f 6e 75 6c 6c 20 28 73 74 6d 3_bind_null (stm
5000: 74 2c 20 34 29 3b 0a 09 09 09 09 20 20 73 71 6c t, 4);..... sql
5010: 69 74 65 33 5f 62 69 6e 64 5f 6e 75 6c 6c 20 28 ite3_bind_null (
5020: 73 74 6d 74 2c 20 35 29 3b 0a 09 09 09 09 20 20 stmt, 5);.....
5030: 76 61 6c 36 34 20 3d 0a 09 09 09 09 20 20 20 20 val64 =.....
5040: 20 20 67 61 69 61 45 78 69 66 54 61 67 47 65 74 gaiaExifTagGet
5050: 53 69 67 6e 65 64 4c 6f 6e 67 56 61 6c 75 65 20 SignedLongValue
5060: 28 70 54 2c 20 69 76 2c 0a 09 09 09 09 09 09 09 (pT, iv,........
5070: 09 20 20 20 20 20 26 6f 6b 29 3b 0a 09 09 09 09 . &ok);.....
5080: 20 20 69 66 20 28 21 6f 6b 29 0a 09 09 09 09 20 if (!ok).....
5090: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e sqlite3_bin
50a0: 64 5f 6e 75 6c 6c 20 28 73 74 6d 74 2c 20 36 29 d_null (stmt, 6)
50b0: 3b 0a 09 09 09 09 20 20 65 6c 73 65 0a 09 09 09 ;..... else....
50c0: 09 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 . sqlite3_b
50d0: 69 6e 64 5f 69 6e 74 36 34 20 28 73 74 6d 74 2c ind_int64 (stmt,
50e0: 20 36 2c 20 76 61 6c 36 34 29 3b 0a 09 09 09 09 6, val64);.....
50f0: 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 6e sqlite3_bind_n
5100: 75 6c 6c 20 28 73 74 6d 74 2c 20 37 29 3b 0a 09 ull (stmt, 7);..
5110: 09 09 09 20 20 73 71 6c 69 74 65 33 5f 62 69 6e ... sqlite3_bin
5120: 64 5f 6e 75 6c 6c 20 28 73 74 6d 74 2c 20 38 29 d_null (stmt, 8)
5130: 3b 0a 09 09 09 20 20 20 20 20 20 7d 0a 09 09 09 ;.... }....
5140: 20 20 20 20 69 66 20 28 67 61 69 61 45 78 69 66 if (gaiaExif
5150: 54 61 67 47 65 74 56 61 6c 75 65 54 79 70 65 20 TagGetValueType
5160: 28 70 54 29 20 3d 3d 20 31 30 29 0a 09 09 09 20 (pT) == 10)....
5170: 20 20 20 20 20 7b 0a 09 09 09 09 20 20 73 71 6c {..... sql
5180: 69 74 65 33 5f 62 69 6e 64 5f 6e 75 6c 6c 20 28 ite3_bind_null (
5190: 73 74 6d 74 2c 20 34 29 3b 0a 09 09 09 09 20 20 stmt, 4);.....
51a0: 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 6e 75 6c sqlite3_bind_nul
51b0: 6c 20 28 73 74 6d 74 2c 20 35 29 3b 0a 09 09 09 l (stmt, 5);....
51c0: 09 20 20 76 61 6c 36 34 20 3d 0a 09 09 09 09 20 . val64 =.....
51d0: 20 20 20 20 20 67 61 69 61 45 78 69 66 54 61 67 gaiaExifTag
51e0: 47 65 74 53 69 67 6e 65 64 52 61 74 69 6f 6e 61 GetSignedRationa
51f0: 6c 31 56 61 6c 75 65 20 28 70 54 2c 0a 09 09 09 l1Value (pT,....
5200: 09 09 09 09 09 09 20 20 69 76 2c 0a 09 09 09 09 ...... iv,.....
5210: 09 09 09 09 09 20 20 26 6f 6b 29 3b 0a 09 09 09 ..... &ok);....
5220: 09 20 20 69 66 20 28 21 6f 6b 29 0a 09 09 09 09 . if (!ok).....
5230: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 sqlite3_bi
5240: 6e 64 5f 6e 75 6c 6c 20 28 73 74 6d 74 2c 20 36 nd_null (stmt, 6
5250: 29 3b 0a 09 09 09 09 20 20 65 6c 73 65 0a 09 09 );..... else...
5260: 09 09 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f .. sqlite3_
5270: 62 69 6e 64 5f 69 6e 74 36 34 20 28 73 74 6d 74 bind_int64 (stmt
5280: 2c 20 36 2c 20 76 61 6c 36 34 29 3b 0a 09 09 09 , 6, val64);....
5290: 09 20 20 76 61 6c 36 34 20 3d 0a 09 09 09 09 20 . val64 =.....
52a0: 20 20 20 20 20 67 61 69 61 45 78 69 66 54 61 67 gaiaExifTag
52b0: 47 65 74 53 69 67 6e 65 64 52 61 74 69 6f 6e 61 GetSignedRationa
52c0: 6c 32 56 61 6c 75 65 20 28 70 54 2c 0a 09 09 09 l2Value (pT,....
52d0: 09 09 09 09 09 09 20 20 69 76 2c 0a 09 09 09 09 ...... iv,.....
52e0: 09 09 09 09 09 20 20 26 6f 6b 29 3b 0a 09 09 09 ..... &ok);....
52f0: 09 20 20 69 66 20 28 21 6f 6b 29 0a 09 09 09 09 . if (!ok).....
5300: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 sqlite3_bi
5310: 6e 64 5f 6e 75 6c 6c 20 28 73 74 6d 74 2c 20 37 nd_null (stmt, 7
5320: 29 3b 0a 09 09 09 09 20 20 65 6c 73 65 0a 09 09 );..... else...
5330: 09 09 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f .. sqlite3_
5340: 62 69 6e 64 5f 69 6e 74 36 34 20 28 73 74 6d 74 bind_int64 (stmt
5350: 2c 20 37 2c 20 76 61 6c 36 34 29 3b 0a 09 09 09 , 7, val64);....
5360: 09 20 20 64 62 6c 76 61 6c 20 3d 0a 09 09 09 09 . dblval =.....
5370: 20 20 20 20 20 20 67 61 69 61 45 78 69 66 54 61 gaiaExifTa
5380: 67 47 65 74 53 69 67 6e 65 64 52 61 74 69 6f 6e gGetSignedRation
5390: 61 6c 56 61 6c 75 65 20 28 70 54 2c 20 69 76 2c alValue (pT, iv,
53a0: 0a 09 09 09 09 09 09 09 09 09 20 26 6f 6b 29 3b .......... &ok);
53b0: 0a 09 09 09 09 20 20 69 66 20 28 21 6f 6b 29 0a ..... if (!ok).
53c0: 09 09 09 09 20 20 20 20 20 20 73 71 6c 69 74 65 .... sqlite
53d0: 33 5f 62 69 6e 64 5f 6e 75 6c 6c 20 28 73 74 6d 3_bind_null (stm
53e0: 74 2c 20 38 29 3b 0a 09 09 09 09 20 20 65 6c 73 t, 8);..... els
53f0: 65 0a 09 09 09 09 20 20 20 20 20 20 73 71 6c 69 e..... sqli
5400: 74 65 33 5f 62 69 6e 64 5f 64 6f 75 62 6c 65 20 te3_bind_double
5410: 28 73 74 6d 74 2c 20 38 2c 20 64 62 6c 76 61 6c (stmt, 8, dblval
5420: 29 3b 0a 09 09 09 20 20 20 20 20 20 7d 0a 09 09 );.... }...
5430: 09 20 20 20 20 69 66 20 28 67 61 69 61 45 78 69 . if (gaiaExi
5440: 66 54 61 67 47 65 74 56 61 6c 75 65 54 79 70 65 fTagGetValueType
5450: 20 28 70 54 29 20 3d 3d 20 31 31 29 0a 09 09 09 (pT) == 11)....
5460: 20 20 20 20 20 20 7b 0a 09 09 09 09 20 20 73 71 {..... sq
5470: 6c 69 74 65 33 5f 62 69 6e 64 5f 6e 75 6c 6c 20 lite3_bind_null
5480: 28 73 74 6d 74 2c 20 34 29 3b 0a 09 09 09 09 20 (stmt, 4);.....
5490: 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 6e 75 sqlite3_bind_nu
54a0: 6c 6c 20 28 73 74 6d 74 2c 20 35 29 3b 0a 09 09 ll (stmt, 5);...
54b0: 09 09 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 .. sqlite3_bind
54c0: 5f 6e 75 6c 6c 20 28 73 74 6d 74 2c 20 36 29 3b _null (stmt, 6);
54d0: 0a 09 09 09 09 20 20 73 71 6c 69 74 65 33 5f 62 ..... sqlite3_b
54e0: 69 6e 64 5f 6e 75 6c 6c 20 28 73 74 6d 74 2c 20 ind_null (stmt,
54f0: 37 29 3b 0a 09 09 09 09 20 20 64 62 6c 76 61 6c 7);..... dblval
5500: 20 3d 0a 09 09 09 09 20 20 20 20 20 20 67 61 69 =..... gai
5510: 61 45 78 69 66 54 61 67 47 65 74 46 6c 6f 61 74 aExifTagGetFloat
5520: 56 61 6c 75 65 20 28 70 54 2c 20 69 76 2c 20 26 Value (pT, iv, &
5530: 6f 6b 29 3b 0a 09 09 09 09 20 20 69 66 20 28 21 ok);..... if (!
5540: 6f 6b 29 0a 09 09 09 09 20 20 20 20 20 20 73 71 ok)..... sq
5550: 6c 69 74 65 33 5f 62 69 6e 64 5f 6e 75 6c 6c 20 lite3_bind_null
5560: 28 73 74 6d 74 2c 20 38 29 3b 0a 09 09 09 09 20 (stmt, 8);.....
5570: 20 65 6c 73 65 0a 09 09 09 09 20 20 20 20 20 20 else.....
5580: 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 64 6f 75 sqlite3_bind_dou
5590: 62 6c 65 20 28 73 74 6d 74 2c 20 38 2c 20 64 62 ble (stmt, 8, db
55a0: 6c 76 61 6c 29 3b 0a 09 09 09 20 20 20 20 20 20 lval);....
55b0: 7d 0a 09 09 09 20 20 20 20 69 66 20 28 67 61 69 }.... if (gai
55c0: 61 45 78 69 66 54 61 67 47 65 74 56 61 6c 75 65 aExifTagGetValue
55d0: 54 79 70 65 20 28 70 54 29 20 3d 3d 20 31 32 29 Type (pT) == 12)
55e0: 0a 09 09 09 20 20 20 20 20 20 7b 0a 09 09 09 09 .... {.....
55f0: 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 6e sqlite3_bind_n
5600: 75 6c 6c 20 28 73 74 6d 74 2c 20 34 29 3b 0a 09 ull (stmt, 4);..
5610: 09 09 09 20 20 73 71 6c 69 74 65 33 5f 62 69 6e ... sqlite3_bin
5620: 64 5f 6e 75 6c 6c 20 28 73 74 6d 74 2c 20 35 29 d_null (stmt, 5)
5630: 3b 0a 09 09 09 09 20 20 73 71 6c 69 74 65 33 5f ;..... sqlite3_
5640: 62 69 6e 64 5f 6e 75 6c 6c 20 28 73 74 6d 74 2c bind_null (stmt,
5650: 20 36 29 3b 0a 09 09 09 09 20 20 73 71 6c 69 74 6);..... sqlit
5660: 65 33 5f 62 69 6e 64 5f 6e 75 6c 6c 20 28 73 74 e3_bind_null (st
5670: 6d 74 2c 20 37 29 3b 0a 09 09 09 09 20 20 64 62 mt, 7);..... db
5680: 6c 76 61 6c 20 3d 0a 09 09 09 09 20 20 20 20 20 lval =.....
5690: 20 67 61 69 61 45 78 69 66 54 61 67 47 65 74 44 gaiaExifTagGetD
56a0: 6f 75 62 6c 65 56 61 6c 75 65 20 28 70 54 2c 20 oubleValue (pT,
56b0: 69 76 2c 20 26 6f 6b 29 3b 0a 09 09 09 09 20 20 iv, &ok);.....
56c0: 69 66 20 28 21 6f 6b 29 0a 09 09 09 09 20 20 20 if (!ok).....
56d0: 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f sqlite3_bind_
56e0: 6e 75 6c 6c 20 28 73 74 6d 74 2c 20 38 29 3b 0a null (stmt, 8);.
56f0: 09 09 09 09 20 20 65 6c 73 65 0a 09 09 09 09 20 .... else.....
5700: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e sqlite3_bin
5710: 64 5f 64 6f 75 62 6c 65 20 28 73 74 6d 74 2c 20 d_double (stmt,
5720: 38 2c 20 64 62 6c 76 61 6c 29 3b 0a 09 09 09 20 8, dblval);....
5730: 20 20 20 20 20 7d 0a 09 09 09 20 20 20 20 69 66 }.... if
5740: 20 28 21 6f 6b 5f 68 75 6d 61 6e 29 0a 09 09 09 (!ok_human)....
5750: 09 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 6e 75 .sqlite3_bind_nu
5760: 6c 6c 20 28 73 74 6d 74 2c 20 39 29 3b 0a 09 09 ll (stmt, 9);...
5770: 09 20 20 20 20 65 6c 73 65 0a 09 09 09 09 73 71 . else.....sq
5780: 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 20 lite3_bind_text
5790: 28 73 74 6d 74 2c 20 39 2c 20 68 75 6d 61 6e 2c (stmt, 9, human,
57a0: 0a 09 09 09 09 09 09 20 20 20 73 74 72 6c 65 6e ....... strlen
57b0: 20 28 68 75 6d 61 6e 29 2c 0a 09 09 09 09 09 09 (human),.......
57c0: 20 20 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 SQLITE_STATIC
57d0: 29 3b 0a 09 09 09 20 20 20 20 72 65 74 20 3d 20 );.... ret =
57e0: 73 71 6c 69 74 65 33 5f 73 74 65 70 20 28 73 74 sqlite3_step (st
57f0: 6d 74 29 3b 0a 09 09 09 20 20 20 20 69 66 20 28 mt);.... if (
5800: 72 65 74 20 3d 3d 20 53 51 4c 49 54 45 5f 44 4f ret == SQLITE_DO
5810: 4e 45 20 7c 7c 20 72 65 74 20 3d 3d 20 53 51 4c NE || ret == SQL
5820: 49 54 45 5f 52 4f 57 29 0a 09 09 09 09 3b 0a 09 ITE_ROW).....;..
5830: 09 09 20 20 20 20 65 6c 73 65 0a 09 09 09 20 20 .. else....
5840: 20 20 20 20 7b 0a 09 09 09 09 20 20 70 72 69 6e {..... prin
5850: 74 66 20 28 22 73 71 6c 69 74 65 33 5f 73 74 65 tf ("sqlite3_ste
5860: 70 28 29 20 65 72 72 6f 72 3a 20 25 73 5c 6e 22 p() error: %s\n"
5870: 2c 0a 09 09 09 09 09 20 20 73 71 6c 69 74 65 33 ,...... sqlite3
5880: 5f 65 72 72 6d 73 67 20 28 68 61 6e 64 6c 65 29 _errmsg (handle)
5890: 29 3b 0a 09 09 09 09 20 20 73 71 6c 69 74 65 33 );..... sqlite3
58a0: 5f 66 69 6e 61 6c 69 7a 65 20 28 73 74 6d 74 29 _finalize (stmt)
58b0: 3b 0a 09 09 09 09 20 20 67 6f 74 6f 20 61 62 6f ;..... goto abo
58c0: 72 74 3b 0a 09 09 09 20 20 20 20 20 20 7d 0a 09 rt;.... }..
58d0: 09 09 20 20 20 20 69 66 20 28 67 61 69 61 45 78 .. if (gaiaEx
58e0: 69 66 54 61 67 47 65 74 56 61 6c 75 65 54 79 70 ifTagGetValueTyp
58f0: 65 20 28 70 54 29 20 3d 3d 20 31 0a 09 09 09 09 e (pT) == 1.....
5900: 7c 7c 20 67 61 69 61 45 78 69 66 54 61 67 47 65 || gaiaExifTagGe
5910: 74 56 61 6c 75 65 54 79 70 65 20 28 70 54 29 20 tValueType (pT)
5920: 3d 3d 20 32 0a 09 09 09 09 7c 7c 20 67 61 69 61 == 2.....|| gaia
5930: 45 78 69 66 54 61 67 47 65 74 56 61 6c 75 65 54 ExifTagGetValueT
5940: 79 70 65 20 28 70 54 29 20 3d 3d 20 36 0a 09 09 ype (pT) == 6...
5950: 09 09 7c 7c 20 67 61 69 61 45 78 69 66 54 61 67 ..|| gaiaExifTag
5960: 47 65 74 56 61 6c 75 65 54 79 70 65 20 28 70 54 GetValueType (pT
5970: 29 20 3d 3d 20 37 29 0a 09 09 09 09 62 72 65 61 ) == 7).....brea
5980: 6b 3b 0a 09 09 09 20 20 20 20 6f 6b 5f 68 75 6d k;.... ok_hum
5990: 61 6e 20 3d 20 30 3b 0a 09 09 09 7d 0a 09 09 20 an = 0;....}...
59a0: 20 7d 0a 09 20 20 20 20 7d 0a 09 20 20 73 71 6c }.. }.. sql
59b0: 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 20 28 73 ite3_finalize (s
59c0: 74 6d 74 29 3b 0a 20 20 20 20 20 20 7d 0a 2f 2a tmt);. }./*
59d0: 20 63 6f 6d 6d 69 74 73 20 74 68 65 20 74 72 61 commits the tra
59e0: 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 nsaction */.
59f0: 73 74 72 63 70 79 20 28 73 71 6c 2c 20 22 43 4f strcpy (sql, "CO
5a00: 4d 4d 49 54 22 29 3b 0a 20 20 20 20 72 65 74 20 MMIT");. ret
5a10: 3d 20 73 71 6c 69 74 65 33 5f 65 78 65 63 20 28 = sqlite3_exec (
5a20: 68 61 6e 64 6c 65 2c 20 73 71 6c 2c 20 4e 55 4c handle, sql, NUL
5a30: 4c 2c 20 4e 55 4c 4c 2c 20 26 65 72 72 5f 6d 73 L, NULL, &err_ms
5a40: 67 29 3b 0a 20 20 20 20 69 66 20 28 72 65 74 20 g);. if (ret
5a50: 21 3d 20 53 51 4c 49 54 45 5f 4f 4b 29 0a 20 20 != SQLITE_OK).
5a60: 20 20 20 20 7b 0a 09 20 20 70 72 69 6e 74 66 20 {.. printf
5a70: 28 22 43 4f 4d 4d 49 54 20 65 72 72 6f 72 3a 20 ("COMMIT error:
5a80: 25 73 5c 6e 22 2c 20 65 72 72 5f 6d 73 67 29 3b %s\n", err_msg);
5a90: 0a 09 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 .. sqlite3_free
5aa0: 20 28 65 72 72 5f 6d 73 67 29 3b 0a 20 20 20 20 (err_msg);.
5ab0: 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 31 }. return 1
5ac0: 3b 0a 20 20 61 62 6f 72 74 3a 0a 2f 2a 20 72 6f ;. abort:./* ro
5ad0: 6c 6c 69 6e 67 20 62 61 63 6b 20 74 68 65 20 74 lling back the t
5ae0: 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 20 20 ransaction */.
5af0: 20 20 73 74 72 63 70 79 20 28 73 71 6c 2c 20 22 strcpy (sql, "
5b00: 52 4f 4c 4c 42 41 43 4b 22 29 3b 0a 20 20 20 20 ROLLBACK");.
5b10: 72 65 74 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 ret = sqlite3_ex
5b20: 65 63 20 28 68 61 6e 64 6c 65 2c 20 73 71 6c 2c ec (handle, sql,
5b30: 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 26 65 72 NULL, NULL, &er
5b40: 72 5f 6d 73 67 29 3b 0a 20 20 20 20 69 66 20 28 r_msg);. if (
5b50: 72 65 74 20 21 3d 20 53 51 4c 49 54 45 5f 4f 4b ret != SQLITE_OK
5b60: 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 70 72 69 ). {.. pri
5b70: 6e 74 66 20 28 22 52 4f 4c 4c 42 41 43 4b 20 65 ntf ("ROLLBACK e
5b80: 72 72 6f 72 3a 20 25 73 5c 6e 22 2c 20 65 72 72 rror: %s\n", err
5b90: 5f 6d 73 67 29 3b 0a 09 20 20 73 71 6c 69 74 65 _msg);.. sqlite
5ba0: 33 5f 66 72 65 65 20 28 65 72 72 5f 6d 73 67 29 3_free (err_msg)
5bb0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 72 65 ;. }. re
5bc0: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 73 74 61 74 69 turn 0;.}..stati
5bd0: 63 20 69 6e 74 0a 6c 6f 61 64 5f 66 69 6c 65 20 c int.load_file
5be0: 28 73 71 6c 69 74 65 33 20 2a 20 68 61 6e 64 6c (sqlite3 * handl
5bf0: 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 66 e, const char *f
5c00: 69 6c 65 5f 70 61 74 68 2c 20 69 6e 74 20 67 70 ile_path, int gp
5c10: 73 5f 6f 6e 6c 79 2c 20 69 6e 74 20 6d 65 74 61 s_only, int meta
5c20: 64 61 74 61 29 0a 7b 0a 2f 2a 20 69 6d 70 6f 72 data).{./* impor
5c30: 74 69 6e 67 20 61 20 73 69 6e 67 6c 65 20 45 58 ting a single EX
5c40: 49 46 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 46 IF file */. F
5c50: 49 4c 45 20 2a 66 6c 3b 0a 20 20 20 20 63 68 61 ILE *fl;. cha
5c60: 72 20 6d 73 67 5b 32 35 36 5d 3b 0a 20 20 20 20 r msg[256];.
5c70: 69 6e 74 20 73 7a 20 3d 20 30 3b 0a 20 20 20 20 int sz = 0;.
5c80: 69 6e 74 20 72 64 3b 0a 20 20 20 20 69 6e 74 20 int rd;. int
5c90: 6f 6b 5f 65 78 69 66 20 3d 20 30 3b 0a 20 20 20 ok_exif = 0;.
5ca0: 20 69 6e 74 20 6c 6f 61 64 65 64 20 3d 20 30 3b int loaded = 0;
5cb0: 0a 20 20 20 20 69 6e 74 20 67 70 73 5f 73 6b 69 . int gps_ski
5cc0: 70 20 3d 20 30 3b 0a 20 20 20 20 75 6e 73 69 67 p = 0;. unsig
5cd0: 6e 65 64 20 63 68 61 72 20 2a 62 6c 6f 62 20 3d ned char *blob =
5ce0: 20 4e 55 4c 4c 3b 0a 20 20 20 20 67 61 69 61 45 NULL;. gaiaE
5cf0: 78 69 66 54 61 67 4c 69 73 74 50 74 72 20 74 61 xifTagListPtr ta
5d00: 67 5f 6c 69 73 74 20 3d 20 4e 55 4c 4c 3b 0a 20 g_list = NULL;.
5d10: 20 20 20 66 6c 20 3d 20 66 6f 70 65 6e 20 28 66 fl = fopen (f
5d20: 69 6c 65 5f 70 61 74 68 2c 20 22 72 62 22 29 3b ile_path, "rb");
5d30: 0a 20 20 20 20 69 66 20 28 21 66 6c 29 0a 20 20 . if (!fl).
5d40: 20 20 20 20 7b 0a 09 20 20 73 70 72 69 6e 74 66 {.. sprintf
5d50: 20 28 6d 73 67 2c 20 22 65 78 69 66 5f 6c 6f 61 (msg, "exif_loa
5d60: 64 65 72 3a 20 63 61 6e 6e 6f 74 20 6f 70 65 6e der: cannot open
5d70: 20 66 69 6c 65 20 27 25 73 27 22 2c 20 66 69 6c file '%s'", fil
5d80: 65 5f 70 61 74 68 29 3b 0a 09 20 20 70 65 72 72 e_path);.. perr
5d90: 6f 72 20 28 6d 73 67 29 3b 0a 09 20 20 72 65 74 or (msg);.. ret
5da0: 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 urn 0;. }.
5db0: 20 20 20 69 66 20 28 66 73 65 65 6b 20 28 66 6c if (fseek (fl
5dc0: 2c 20 30 2c 20 53 45 45 4b 5f 45 4e 44 29 20 3d , 0, SEEK_END) =
5dd0: 3d 20 30 29 0a 09 73 7a 20 3d 20 66 74 65 6c 6c = 0)..sz = ftell
5de0: 20 28 66 6c 29 3b 0a 20 20 20 20 69 66 20 28 73 (fl);. if (s
5df0: 7a 20 3e 20 31 34 29 0a 20 20 20 20 20 20 7b 0a z > 14). {.
5e00: 09 20 20 62 6c 6f 62 20 3d 20 6d 61 6c 6c 6f 63 . blob = malloc
5e10: 20 28 73 7a 29 3b 0a 09 20 20 72 65 77 69 6e 64 (sz);.. rewind
5e20: 20 28 66 6c 29 3b 0a 09 20 20 72 64 20 3d 20 66 (fl);.. rd = f
5e30: 72 65 61 64 20 28 62 6c 6f 62 2c 20 31 2c 20 73 read (blob, 1, s
5e40: 7a 2c 20 66 6c 29 3b 0a 09 20 20 69 66 20 28 72 z, fl);.. if (r
5e50: 64 20 3d 3d 20 73 7a 29 0a 09 20 20 20 20 7b 0a d == sz).. {.
5e60: 09 09 74 61 67 5f 6c 69 73 74 20 3d 20 67 61 69 ..tag_list = gai
5e70: 61 47 65 74 45 78 69 66 54 61 67 73 20 28 62 6c aGetExifTags (bl
5e80: 6f 62 2c 20 73 7a 29 3b 0a 09 09 69 66 20 28 74 ob, sz);...if (t
5e90: 61 67 5f 6c 69 73 74 29 0a 09 09 20 20 7b 0a 09 ag_list)... {..
5ea0: 09 20 20 20 20 20 20 6f 6b 5f 65 78 69 66 20 3d . ok_exif =
5eb0: 20 31 3b 0a 09 09 20 20 20 20 20 20 69 66 20 28 1;... if (
5ec0: 67 70 73 5f 6f 6e 6c 79 20 26 26 20 21 69 73 45 gps_only && !isE
5ed0: 78 69 66 47 70 73 20 28 74 61 67 5f 6c 69 73 74 xifGps (tag_list
5ee0: 29 29 0a 09 09 09 7b 0a 09 09 09 20 20 20 20 67 ))....{.... g
5ef0: 70 73 5f 73 6b 69 70 20 3d 20 31 3b 0a 09 09 09 ps_skip = 1;....
5f00: 20 20 20 20 67 6f 74 6f 20 73 74 6f 70 3b 0a 09 goto stop;..
5f10: 09 09 7d 0a 09 09 20 20 20 20 20 20 69 66 20 28 ..}... if (
5f20: 21 75 70 64 61 74 65 45 78 69 66 54 61 62 6c 65 !updateExifTable
5f30: 73 0a 09 09 09 20 20 28 68 61 6e 64 6c 65 2c 20 s.... (handle,
5f40: 62 6c 6f 62 2c 20 73 7a 2c 20 74 61 67 5f 6c 69 blob, sz, tag_li
5f50: 73 74 2c 20 6d 65 74 61 64 61 74 61 2c 20 66 69 st, metadata, fi
5f60: 6c 65 5f 70 61 74 68 29 29 0a 09 09 09 20 20 67 le_path)).... g
5f70: 6f 74 6f 20 73 74 6f 70 3b 0a 09 09 20 20 20 20 oto stop;...
5f80: 20 20 6c 6f 61 64 65 64 20 3d 20 31 3b 0a 09 09 loaded = 1;...
5f90: 20 20 7d 0a 09 20 20 20 20 7d 0a 20 20 20 20 20 }.. }.
5fa0: 20 7d 0a 20 20 73 74 6f 70 3a 0a 20 20 20 20 69 }. stop:. i
5fb0: 66 20 28 21 6f 6b 5f 65 78 69 66 29 0a 09 70 72 f (!ok_exif)..pr
5fc0: 69 6e 74 66 20 28 22 66 69 6c 65 20 27 25 73 27 intf ("file '%s'
5fd0: 20 64 6f 65 73 6e 27 74 20 73 65 65 6d 20 74 6f doesn't seem to
5fe0: 20 62 65 20 61 20 76 61 6c 69 64 20 45 58 49 46 be a valid EXIF
5ff0: 20 66 69 6c 65 5c 6e 22 2c 20 66 69 6c 65 5f 70 file\n", file_p
6000: 61 74 68 29 3b 0a 20 20 20 20 65 6c 73 65 20 69 ath);. else i
6010: 66 20 28 21 6c 6f 61 64 65 64 29 0a 20 20 20 20 f (!loaded).
6020: 20 20 7b 0a 09 20 20 69 66 20 28 67 70 73 5f 73 {.. if (gps_s
6030: 6b 69 70 29 0a 09 20 20 20 20 20 20 70 72 69 6e kip).. prin
6040: 74 66 0a 09 09 20 20 28 22 66 69 6c 65 20 27 25 tf... ("file '%
6050: 73 27 20 69 73 20 61 20 76 61 6c 69 64 20 45 58 s' is a valid EX
6060: 49 46 20 66 69 6c 65 2c 20 62 75 74 20 64 6f 65 IF file, but doe
6070: 73 6e 27 74 20 63 6f 6e 74 61 69 6e 20 61 6e 79 sn't contain any
6080: 20 47 50 53 20 69 6e 66 6f 5c 6e 22 2c 0a 09 09 GPS info\n",...
6090: 20 20 20 66 69 6c 65 5f 70 61 74 68 29 3b 0a 09 file_path);..
60a0: 20 20 65 6c 73 65 0a 09 20 20 20 20 20 20 70 72 else.. pr
60b0: 69 6e 74 66 20 28 22 53 51 4c 20 65 72 72 6f 72 intf ("SQL error
60c0: 28 73 29 3a 20 66 69 6c 65 20 27 25 73 27 20 77 (s): file '%s' w
60d0: 61 73 20 6e 6f 74 20 6c 6f 61 64 65 64 5c 6e 22 as not loaded\n"
60e0: 2c 20 66 69 6c 65 5f 70 61 74 68 29 3b 0a 20 20 , file_path);.
60f0: 20 20 20 20 7d 0a 20 20 20 20 65 6c 73 65 0a 09 }. else..
6100: 70 72 69 6e 74 66 20 28 22 66 69 6c 65 20 27 25 printf ("file '%
6110: 73 27 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 s' successfully
6120: 6c 6f 61 64 65 64 5c 6e 22 2c 20 66 69 6c 65 5f loaded\n", file_
6130: 70 61 74 68 29 3b 0a 20 20 20 20 69 66 20 28 62 path);. if (b
6140: 6c 6f 62 29 0a 09 66 72 65 65 20 28 62 6c 6f 62 lob)..free (blob
6150: 29 3b 0a 20 20 20 20 69 66 20 28 74 61 67 5f 6c );. if (tag_l
6160: 69 73 74 29 0a 09 67 61 69 61 45 78 69 66 54 61 ist)..gaiaExifTa
6170: 67 73 46 72 65 65 20 28 74 61 67 5f 6c 69 73 74 gsFree (tag_list
6180: 29 3b 0a 20 20 20 20 66 63 6c 6f 73 65 20 28 66 );. fclose (f
6190: 6c 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 6c l);. return l
61a0: 6f 61 64 65 64 3b 0a 7d 0a 0a 73 74 61 74 69 63 oaded;.}..static
61b0: 20 69 6e 74 0a 6c 6f 61 64 5f 64 69 72 20 28 73 int.load_dir (s
61c0: 71 6c 69 74 65 33 20 2a 20 68 61 6e 64 6c 65 2c qlite3 * handle,
61d0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 64 69 72 const char *dir
61e0: 5f 70 61 74 68 2c 20 69 6e 74 20 67 70 73 5f 6f _path, int gps_o
61f0: 6e 6c 79 2c 20 69 6e 74 20 6d 65 74 61 64 61 74 nly, int metadat
6200: 61 29 0a 7b 0a 2f 2a 20 69 6d 70 6f 72 74 69 6e a).{./* importin
6210: 67 20 45 58 49 46 20 66 69 6c 65 73 20 66 72 6f g EXIF files fro
6220: 6d 20 61 20 77 68 6f 6c 65 20 44 49 52 45 43 54 m a whole DIRECT
6230: 4f 52 59 20 2a 2f 0a 23 69 66 20 64 65 66 69 6e ORY */.#if defin
6240: 65 64 28 5f 57 49 4e 33 32 29 20 26 26 20 21 64 ed(_WIN32) && !d
6250: 65 66 69 6e 65 64 28 5f 5f 4d 49 4e 47 57 33 32 efined(__MINGW32
6260: 5f 5f 29 0a 2f 2a 20 56 69 73 75 61 6c 20 53 74 __)./* Visual St
6270: 75 64 69 6f 20 2e 4e 45 54 20 2a 2f 0a 20 20 20 udio .NET */.
6280: 20 73 74 72 75 63 74 20 5f 66 69 6e 64 64 61 74 struct _finddat
6290: 61 5f 74 20 63 5f 66 69 6c 65 3b 0a 20 20 20 20 a_t c_file;.
62a0: 69 6e 74 70 74 72 5f 74 20 68 46 69 6c 65 3b 0a intptr_t hFile;.
62b0: 20 20 20 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b int cnt = 0;
62c0: 0a 20 20 20 20 63 68 61 72 20 66 69 6c 65 5f 70 . char file_p
62d0: 61 74 68 5b 31 30 32 34 5d 3b 0a 20 20 20 20 69 ath[1024];. i
62e0: 66 20 28 5f 63 68 64 69 72 20 28 64 69 72 5f 70 f (_chdir (dir_p
62f0: 61 74 68 29 20 3c 20 30 29 0a 20 20 20 20 20 20 ath) < 0).
6300: 7b 0a 09 20 20 66 70 72 69 6e 74 66 20 28 73 74 {.. fprintf (st
6310: 64 65 72 72 2c 20 22 65 78 69 66 5f 6c 6f 61 64 derr, "exif_load
6320: 65 72 3a 20 63 61 6e 6e 6f 74 20 61 63 63 65 73 er: cannot acces
6330: 73 20 64 69 72 20 27 25 73 27 22 2c 20 64 69 72 s dir '%s'", dir
6340: 5f 70 61 74 68 29 3b 0a 09 20 20 72 65 74 75 72 _path);.. retur
6350: 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 n 0;. }.
6360: 20 69 66 20 28 28 68 46 69 6c 65 20 3d 20 5f 66 if ((hFile = _f
6370: 69 6e 64 66 69 72 73 74 20 28 22 2a 2e 2a 22 2c indfirst ("*.*",
6380: 20 26 63 5f 66 69 6c 65 29 29 20 3d 3d 20 2d 31 &c_file)) == -1
6390: 4c 29 0a 09 66 70 72 69 6e 74 66 20 28 73 74 64 L)..fprintf (std
63a0: 65 72 72 2c 20 22 65 78 69 66 5f 6c 6f 61 64 65 err, "exif_loade
63b0: 72 3a 20 63 61 6e 6e 6f 74 20 61 63 63 65 73 73 r: cannot access
63c0: 20 64 69 72 20 27 25 73 27 20 5b 6f 72 20 65 6d dir '%s' [or em
63d0: 70 74 79 20 64 69 72 5d 5c 6e 22 2c 0a 09 09 20 pty dir]\n",...
63e0: 64 69 72 5f 70 61 74 68 29 3b 0a 20 20 20 20 65 dir_path);. e
63f0: 6c 73 65 0a 20 20 20 20 20 20 7b 0a 09 20 20 77 lse. {.. w
6400: 68 69 6c 65 20 28 31 29 0a 09 20 20 20 20 7b 0a hile (1).. {.
6410: 09 09 69 66 20 28 28 63 5f 66 69 6c 65 2e 61 74 ..if ((c_file.at
6420: 74 72 69 62 20 26 20 5f 41 5f 52 44 4f 4e 4c 59 trib & _A_RDONLY
6430: 29 20 3d 3d 20 5f 41 5f 52 44 4f 4e 4c 59 0a 09 ) == _A_RDONLY..
6440: 09 20 20 20 20 7c 7c 20 28 63 5f 66 69 6c 65 2e . || (c_file.
6450: 61 74 74 72 69 62 20 26 20 5f 41 5f 4e 4f 52 4d attrib & _A_NORM
6460: 41 4c 29 20 3d 3d 20 5f 41 5f 4e 4f 52 4d 41 4c AL) == _A_NORMAL
6470: 29 0a 09 09 20 20 7b 0a 09 09 20 20 20 20 20 20 )... {...
6480: 73 70 72 69 6e 74 66 20 28 66 69 6c 65 5f 70 61 sprintf (file_pa
6490: 74 68 2c 20 22 25 73 5c 5c 25 73 22 2c 20 64 69 th, "%s\\%s", di
64a0: 72 5f 70 61 74 68 2c 20 63 5f 66 69 6c 65 2e 6e r_path, c_file.n
64b0: 61 6d 65 29 3b 0a 09 09 20 20 20 20 20 20 63 6e ame);... cn
64c0: 74 20 2b 3d 20 6c 6f 61 64 5f 66 69 6c 65 20 28 t += load_file (
64d0: 68 61 6e 64 6c 65 2c 20 66 69 6c 65 5f 70 61 74 handle, file_pat
64e0: 68 2c 20 67 70 73 5f 6f 6e 6c 79 2c 20 6d 65 74 h, gps_only, met
64f0: 61 64 61 74 61 29 3b 0a 09 09 20 20 7d 0a 09 09 adata);... }...
6500: 69 66 20 28 5f 66 69 6e 64 6e 65 78 74 20 28 68 if (_findnext (h
6510: 46 69 6c 65 2c 20 26 63 5f 66 69 6c 65 29 20 21 File, &c_file) !
6520: 3d 20 30 29 0a 09 09 20 20 20 20 62 72 65 61 6b = 0)... break
6530: 3b 0a 09 20 20 20 20 7d 3b 0a 09 20 20 5f 66 69 ;.. };.. _fi
6540: 6e 64 63 6c 6f 73 65 20 28 68 46 69 6c 65 29 3b ndclose (hFile);
6550: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 72 65 74 . }. ret
6560: 75 72 6e 20 63 6e 74 3b 0a 23 65 6c 73 65 0a 2f urn cnt;.#else./
6570: 2a 20 6e 6f 74 20 56 69 73 75 61 6c 20 53 74 75 * not Visual Stu
6580: 64 69 6f 20 2e 4e 45 54 20 2a 2f 0a 20 20 20 20 dio .NET */.
6590: 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20 20 int cnt = 0;.
65a0: 20 63 68 61 72 20 66 69 6c 65 5f 70 61 74 68 5b char file_path[
65b0: 34 30 39 36 5d 3b 0a 20 20 20 20 63 68 61 72 20 4096];. char
65c0: 6d 73 67 5b 32 35 36 5d 3b 0a 20 20 20 20 73 74 msg[256];. st
65d0: 72 75 63 74 20 64 69 72 65 6e 74 20 2a 65 6e 74 ruct dirent *ent
65e0: 72 79 3b 0a 20 20 20 20 44 49 52 20 2a 64 69 72 ry;. DIR *dir
65f0: 20 3d 20 6f 70 65 6e 64 69 72 20 28 64 69 72 5f = opendir (dir_
6600: 70 61 74 68 29 3b 0a 20 20 20 20 69 66 20 28 21 path);. if (!
6610: 64 69 72 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 dir). {..
6620: 73 70 72 69 6e 74 66 20 28 6d 73 67 2c 20 22 65 sprintf (msg, "e
6630: 78 69 66 5f 6c 6f 61 64 65 72 3a 20 63 61 6e 6e xif_loader: cann
6640: 6f 74 20 61 63 63 65 73 73 20 64 69 72 20 27 25 ot access dir '%
6650: 73 27 22 2c 20 64 69 72 5f 70 61 74 68 29 3b 0a s'", dir_path);.
6660: 09 20 20 70 65 72 72 6f 72 20 28 6d 73 67 29 3b . perror (msg);
6670: 0a 09 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 .. return 0;.
6680: 20 20 20 20 7d 0a 20 20 20 20 77 68 69 6c 65 20 }. while
6690: 28 31 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 2f (1). {.. /
66a0: 2a 20 73 63 61 6e 6e 69 6e 67 20 64 69 72 2d 65 * scanning dir-e
66b0: 6e 74 72 69 65 73 20 2a 2f 0a 09 20 20 65 6e 74 ntries */.. ent
66c0: 72 79 20 3d 20 72 65 61 64 64 69 72 20 28 64 69 ry = readdir (di
66d0: 72 29 3b 0a 09 20 20 69 66 20 28 21 65 6e 74 72 r);.. if (!entr
66e0: 79 29 0a 09 20 20 20 20 20 20 62 72 65 61 6b 3b y).. break;
66f0: 0a 09 20 20 73 70 72 69 6e 74 66 20 28 66 69 6c .. sprintf (fil
6700: 65 5f 70 61 74 68 2c 20 22 25 73 2f 25 73 22 2c e_path, "%s/%s",
6710: 20 64 69 72 5f 70 61 74 68 2c 20 65 6e 74 72 79 dir_path, entry
6720: 2d 3e 64 5f 6e 61 6d 65 29 3b 0a 09 20 20 63 6e ->d_name);.. cn
6730: 74 20 2b 3d 20 6c 6f 61 64 5f 66 69 6c 65 20 28 t += load_file (
6740: 68 61 6e 64 6c 65 2c 20 66 69 6c 65 5f 70 61 74 handle, file_pat
6750: 68 2c 20 67 70 73 5f 6f 6e 6c 79 2c 20 6d 65 74 h, gps_only, met
6760: 61 64 61 74 61 29 3b 0a 20 20 20 20 20 20 7d 0a adata);. }.
6770: 20 20 20 20 63 6c 6f 73 65 64 69 72 20 28 64 69 closedir (di
6780: 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 63 r);. return c
6790: 6e 74 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 73 74 nt;.#endif.}..st
67a0: 61 74 69 63 20 69 6e 74 0a 63 68 65 63 6b 45 78 atic int.checkEx
67b0: 69 66 54 61 62 6c 65 73 20 28 73 71 6c 69 74 65 ifTables (sqlite
67c0: 33 20 2a 20 68 61 6e 64 6c 65 29 0a 7b 0a 2f 2a 3 * handle).{./*
67d0: 20 63 72 65 61 74 65 73 20 74 68 65 20 45 58 49 creates the EXI
67e0: 46 20 44 42 20 74 61 62 6c 65 73 20 2f 20 6f 72 F DB tables / or
67f0: 20 63 68 65 63 6b 73 20 65 78 69 73 74 69 6e 67 checks existing
6800: 20 6f 6e 65 73 20 66 6f 72 20 76 61 6c 69 64 69 ones for validi
6810: 74 79 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 65 ty */. int re
6820: 74 3b 0a 20 20 20 20 63 68 61 72 20 73 71 6c 5b t;. char sql[
6830: 31 30 32 34 5d 3b 0a 20 20 20 20 63 68 61 72 20 1024];. char
6840: 2a 65 72 72 5f 6d 73 67 20 3d 20 4e 55 4c 4c 3b *err_msg = NULL;
6850: 0a 20 20 20 20 69 6e 74 20 6f 6b 5f 70 68 6f 74 . int ok_phot
6860: 6f 49 64 3b 0a 20 20 20 20 69 6e 74 20 6f 6b 5f oId;. int ok_
6870: 70 68 6f 74 6f 3b 0a 20 20 20 20 69 6e 74 20 6f photo;. int o
6880: 6b 5f 70 69 78 65 6c 58 3b 0a 20 20 20 20 69 6e k_pixelX;. in
6890: 74 20 6f 6b 5f 70 69 78 65 6c 59 3b 0a 20 20 20 t ok_pixelY;.
68a0: 20 69 6e 74 20 6f 6b 5f 63 61 6d 65 72 61 4d 61 int ok_cameraMa
68b0: 6b 65 3b 0a 20 20 20 20 69 6e 74 20 6f 6b 5f 63 ke;. int ok_c
68c0: 61 6d 65 72 61 4d 6f 64 65 6c 3b 0a 20 20 20 20 ameraModel;.
68d0: 69 6e 74 20 6f 6b 5f 73 68 6f 74 44 61 74 65 54 int ok_shotDateT
68e0: 69 6d 65 3b 0a 20 20 20 20 69 6e 74 20 6f 6b 5f ime;. int ok_
68f0: 67 70 73 47 65 6f 6d 65 74 72 79 3b 0a 20 20 20 gpsGeometry;.
6900: 20 69 6e 74 20 6f 6b 5f 67 70 73 44 69 72 65 63 int ok_gpsDirec
6910: 74 69 6f 6e 3b 0a 20 20 20 20 69 6e 74 20 6f 6b tion;. int ok
6920: 5f 67 70 73 54 69 6d 65 73 74 61 6d 70 3b 0a 20 _gpsTimestamp;.
6930: 20 20 20 69 6e 74 20 6f 6b 5f 66 72 6f 6d 50 61 int ok_fromPa
6940: 74 68 3b 0a 20 20 20 20 69 6e 74 20 6f 6b 5f 74 th;. int ok_t
6950: 61 67 49 64 3b 0a 20 20 20 20 69 6e 74 20 6f 6b agId;. int ok
6960: 5f 74 61 67 4e 61 6d 65 3b 0a 20 20 20 20 69 6e _tagName;. in
6970: 74 20 6f 6b 5f 67 70 73 54 61 67 3b 0a 20 20 20 t ok_gpsTag;.
6980: 20 69 6e 74 20 6f 6b 5f 76 61 6c 75 65 54 79 70 int ok_valueTyp
6990: 65 3b 0a 20 20 20 20 69 6e 74 20 6f 6b 5f 74 79 e;. int ok_ty
69a0: 70 65 4e 61 6d 65 3b 0a 20 20 20 20 69 6e 74 20 peName;. int
69b0: 6f 6b 5f 63 6f 75 6e 74 56 61 6c 75 65 73 3b 0a ok_countValues;.
69c0: 20 20 20 20 69 6e 74 20 6f 6b 5f 76 61 6c 75 65 int ok_value
69d0: 49 6e 64 65 78 3b 0a 20 20 20 20 69 6e 74 20 6f Index;. int o
69e0: 6b 5f 62 79 74 65 56 61 6c 75 65 3b 0a 20 20 20 k_byteValue;.
69f0: 20 69 6e 74 20 6f 6b 5f 73 74 72 69 6e 67 56 61 int ok_stringVa
6a00: 6c 75 65 3b 0a 20 20 20 20 69 6e 74 20 6f 6b 5f lue;. int ok_
6a10: 6e 75 6d 56 61 6c 75 65 3b 0a 20 20 20 20 69 6e numValue;. in
6a20: 74 20 6f 6b 5f 6e 75 6d 56 61 6c 75 65 42 69 73 t ok_numValueBis
6a30: 3b 0a 20 20 20 20 69 6e 74 20 6f 6b 5f 64 6f 75 ;. int ok_dou
6a40: 62 6c 65 56 61 6c 75 65 3b 0a 20 20 20 20 69 6e bleValue;. in
6a50: 74 20 6f 6b 5f 68 75 6d 61 6e 52 65 61 64 61 62 t ok_humanReadab
6a60: 6c 65 3b 0a 20 20 20 20 69 6e 74 20 65 72 72 5f le;. int err_
6a70: 70 6b 3b 0a 20 20 20 20 69 6e 74 20 6f 6b 5f 70 pk;. int ok_p
6a80: 68 6f 74 6f 49 64 50 6b 3b 0a 20 20 20 20 69 6e hotoIdPk;. in
6a90: 74 20 6f 6b 5f 74 61 67 49 64 50 6b 3b 0a 20 20 t ok_tagIdPk;.
6aa0: 20 20 69 6e 74 20 6f 6b 5f 76 61 6c 75 65 49 6e int ok_valueIn
6ab0: 64 65 78 50 6b 3b 0a 20 20 20 20 69 6e 74 20 70 dexPk;. int p
6ac0: 4b 65 79 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 Key;. const c
6ad0: 68 61 72 20 2a 6e 61 6d 65 3b 0a 20 20 20 20 69 har *name;. i
6ae0: 6e 74 20 69 3b 0a 20 20 20 20 63 68 61 72 20 2a nt i;. char *
6af0: 2a 72 65 73 75 6c 74 73 3b 0a 20 20 20 20 69 6e *results;. in
6b00: 74 20 72 6f 77 73 3b 0a 20 20 20 20 69 6e 74 20 t rows;. int
6b10: 63 6f 6c 75 6d 6e 73 3b 0a 2f 2a 20 63 72 65 61 columns;./* crea
6b20: 74 69 6e 67 20 74 68 65 20 45 78 69 66 50 68 6f ting the ExifPho
6b30: 74 6f 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 to table */.
6b40: 73 74 72 63 70 79 20 28 73 71 6c 2c 20 22 43 52 strcpy (sql, "CR
6b50: 45 41 54 45 20 54 41 42 4c 45 20 49 46 20 4e 4f EATE TABLE IF NO
6b60: 54 20 45 58 49 53 54 53 20 45 78 69 66 50 68 6f T EXISTS ExifPho
6b70: 74 6f 20 28 5c 6e 22 29 3b 0a 20 20 20 20 73 74 to (\n");. st
6b80: 72 63 61 74 20 28 73 71 6c 2c 20 22 50 68 6f 74 rcat (sql, "Phot
6b90: 6f 49 64 20 49 4e 54 45 47 45 52 20 50 52 49 4d oId INTEGER PRIM
6ba0: 41 52 59 20 4b 45 59 20 41 55 54 4f 49 4e 43 52 ARY KEY AUTOINCR
6bb0: 45 4d 45 4e 54 2c 5c 6e 22 29 3b 0a 20 20 20 20 EMENT,\n");.
6bc0: 73 74 72 63 61 74 20 28 73 71 6c 2c 20 22 50 68 strcat (sql, "Ph
6bd0: 6f 74 6f 20 42 4c 4f 42 20 4e 4f 54 20 4e 55 4c oto BLOB NOT NUL
6be0: 4c 2c 5c 6e 22 29 3b 0a 20 20 20 20 73 74 72 63 L,\n");. strc
6bf0: 61 74 20 28 73 71 6c 2c 20 22 50 69 78 65 6c 58 at (sql, "PixelX
6c00: 20 49 4e 54 45 47 45 52 2c 5c 6e 22 29 3b 0a 20 INTEGER,\n");.
6c10: 20 20 20 73 74 72 63 61 74 20 28 73 71 6c 2c 20 strcat (sql,
6c20: 22 50 69 78 65 6c 59 20 49 4e 54 45 47 45 52 2c "PixelY INTEGER,
6c30: 5c 6e 22 29 3b 0a 20 20 20 20 73 74 72 63 61 74 \n");. strcat
6c40: 20 28 73 71 6c 2c 20 22 43 61 6d 65 72 61 4d 61 (sql, "CameraMa
6c50: 6b 65 20 54 45 58 54 2c 5c 6e 22 29 3b 0a 20 20 ke TEXT,\n");.
6c60: 20 20 73 74 72 63 61 74 20 28 73 71 6c 2c 20 22 strcat (sql, "
6c70: 43 61 6d 65 72 61 4d 6f 64 65 6c 20 54 45 58 54 CameraModel TEXT
6c80: 2c 5c 6e 22 29 3b 0a 20 20 20 20 73 74 72 63 61 ,\n");. strca
6c90: 74 20 28 73 71 6c 2c 20 22 53 68 6f 74 44 61 74 t (sql, "ShotDat
6ca0: 65 54 69 6d 65 20 44 4f 55 42 4c 45 2c 5c 6e 22 eTime DOUBLE,\n"
6cb0: 29 3b 0a 20 20 20 20 73 74 72 63 61 74 20 28 73 );. strcat (s
6cc0: 71 6c 2c 20 22 47 70 73 47 65 6f 6d 65 74 72 79 ql, "GpsGeometry
6cd0: 20 42 4c 4f 42 2c 20 22 29 3b 0a 20 20 20 20 73 BLOB, ");. s
6ce0: 74 72 63 61 74 20 28 73 71 6c 2c 20 22 47 70 73 trcat (sql, "Gps
6cf0: 44 69 72 65 63 74 69 6f 6e 20 44 4f 55 42 4c 45 Direction DOUBLE
6d00: 2c 20 22 29 3b 0a 20 20 20 20 73 74 72 63 61 74 , ");. strcat
6d10: 20 28 73 71 6c 2c 20 22 47 70 73 53 61 74 65 6c (sql, "GpsSatel
6d20: 6c 69 74 65 73 20 54 45 58 54 2c 5c 6e 22 29 3b lites TEXT,\n");
6d30: 0a 20 20 20 20 73 74 72 63 61 74 20 28 73 71 6c . strcat (sql
6d40: 2c 20 22 47 70 73 54 69 6d 65 73 74 61 6d 70 20 , "GpsTimestamp
6d50: 44 4f 55 42 4c 45 2c 20 22 29 3b 0a 20 20 20 20 DOUBLE, ");.
6d60: 73 74 72 63 61 74 20 28 73 71 6c 2c 20 22 46 72 strcat (sql, "Fr
6d70: 6f 6d 50 61 74 68 20 54 45 58 54 22 29 3b 0a 20 omPath TEXT");.
6d80: 20 20 20 73 74 72 63 61 74 20 28 73 71 6c 2c 20 strcat (sql,
6d90: 22 29 22 29 3b 0a 20 20 20 20 72 65 74 20 3d 20 ")");. ret =
6da0: 73 71 6c 69 74 65 33 5f 65 78 65 63 20 28 68 61 sqlite3_exec (ha
6db0: 6e 64 6c 65 2c 20 73 71 6c 2c 20 4e 55 4c 4c 2c ndle, sql, NULL,
6dc0: 20 4e 55 4c 4c 2c 20 26 65 72 72 5f 6d 73 67 29 NULL, &err_msg)
6dd0: 3b 0a 20 20 20 20 69 66 20 28 72 65 74 20 21 3d ;. if (ret !=
6de0: 20 53 51 4c 49 54 45 5f 4f 4b 29 0a 20 20 20 20 SQLITE_OK).
6df0: 20 20 7b 0a 09 20 20 70 72 69 6e 74 66 20 28 22 {.. printf ("
6e00: 43 52 45 41 54 45 20 54 41 42 4c 45 20 45 78 69 CREATE TABLE Exi
6e10: 66 50 68 6f 74 6f 20 65 72 72 6f 72 3a 20 25 73 fPhoto error: %s
6e20: 5c 6e 22 2c 20 65 72 72 5f 6d 73 67 29 3b 0a 09 \n", err_msg);..
6e30: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 20 28 sqlite3_free (
6e40: 65 72 72 5f 6d 73 67 29 3b 0a 09 20 20 67 6f 74 err_msg);.. got
6e50: 6f 20 61 62 6f 72 74 3b 0a 20 20 20 20 20 20 7d o abort;. }
6e60: 0a 2f 2a 20 63 68 65 63 6b 69 6e 67 20 74 68 65 ./* checking the
6e70: 20 45 78 69 66 50 68 6f 74 6f 20 74 61 62 6c 65 ExifPhoto table
6e80: 20 66 6f 72 20 73 61 6e 69 74 79 20 2a 2f 0a 20 for sanity */.
6e90: 20 20 20 6f 6b 5f 70 68 6f 74 6f 49 64 20 3d 20 ok_photoId =
6ea0: 30 3b 0a 20 20 20 20 6f 6b 5f 70 68 6f 74 6f 20 0;. ok_photo
6eb0: 3d 20 30 3b 0a 20 20 20 20 6f 6b 5f 70 69 78 65 = 0;. ok_pixe
6ec0: 6c 58 20 3d 20 30 3b 0a 20 20 20 20 6f 6b 5f 70 lX = 0;. ok_p
6ed0: 69 78 65 6c 59 20 3d 20 30 3b 0a 20 20 20 20 6f ixelY = 0;. o
6ee0: 6b 5f 63 61 6d 65 72 61 4d 61 6b 65 20 3d 20 30 k_cameraMake = 0
6ef0: 3b 0a 20 20 20 20 6f 6b 5f 63 61 6d 65 72 61 4d ;. ok_cameraM
6f00: 6f 64 65 6c 20 3d 20 30 3b 0a 20 20 20 20 6f 6b odel = 0;. ok
6f10: 5f 73 68 6f 74 44 61 74 65 54 69 6d 65 20 3d 20 _shotDateTime =
6f20: 30 3b 0a 20 20 20 20 6f 6b 5f 67 70 73 47 65 6f 0;. ok_gpsGeo
6f30: 6d 65 74 72 79 20 3d 20 30 3b 0a 20 20 20 20 6f metry = 0;. o
6f40: 6b 5f 67 70 73 44 69 72 65 63 74 69 6f 6e 20 3d k_gpsDirection =
6f50: 20 30 3b 0a 20 20 20 20 6f 6b 5f 67 70 73 54 69 0;. ok_gpsTi
6f60: 6d 65 73 74 61 6d 70 20 3d 20 30 3b 0a 20 20 20 mestamp = 0;.
6f70: 20 6f 6b 5f 66 72 6f 6d 50 61 74 68 20 3d 20 30 ok_fromPath = 0
6f80: 3b 0a 20 20 20 20 6f 6b 5f 70 68 6f 74 6f 49 64 ;. ok_photoId
6f90: 50 6b 20 3d 20 30 3b 0a 20 20 20 20 65 72 72 5f Pk = 0;. err_
6fa0: 70 6b 20 3d 20 30 3b 0a 20 20 20 20 73 74 72 63 pk = 0;. strc
6fb0: 70 79 20 28 73 71 6c 2c 20 22 50 52 41 47 4d 41 py (sql, "PRAGMA
6fc0: 20 74 61 62 6c 65 5f 69 6e 66 6f 28 5c 22 45 78 table_info(\"Ex
6fd0: 69 66 50 68 6f 74 6f 5c 22 29 22 29 3b 0a 20 20 ifPhoto\")");.
6fe0: 20 20 72 65 74 20 3d 20 73 71 6c 69 74 65 33 5f ret = sqlite3_
6ff0: 67 65 74 5f 74 61 62 6c 65 20 28 68 61 6e 64 6c get_table (handl
7000: 65 2c 20 73 71 6c 2c 20 26 72 65 73 75 6c 74 73 e, sql, &results
7010: 2c 20 26 72 6f 77 73 2c 20 26 63 6f 6c 75 6d 6e , &rows, &column
7020: 73 2c 20 26 65 72 72 5f 6d 73 67 29 3b 0a 20 20 s, &err_msg);.
7030: 20 20 69 66 20 28 72 65 74 20 21 3d 20 53 51 4c if (ret != SQL
7040: 49 54 45 5f 4f 4b 29 0a 20 20 20 20 20 20 7b 0a ITE_OK). {.
7050: 09 20 20 70 72 69 6e 74 66 20 28 22 50 52 41 47 . printf ("PRAG
7060: 4d 41 20 74 61 62 6c 65 5f 69 6e 66 6f 28 5c 22 MA table_info(\"
7070: 45 78 69 66 50 68 6f 74 6f 5c 22 29 20 65 72 72 ExifPhoto\") err
7080: 6f 72 3a 20 25 73 5c 6e 22 2c 20 65 72 72 5f 6d or: %s\n", err_m
7090: 73 67 29 3b 0a 09 20 20 73 71 6c 69 74 65 33 5f sg);.. sqlite3_
70a0: 66 72 65 65 20 28 65 72 72 5f 6d 73 67 29 3b 0a free (err_msg);.
70b0: 09 20 20 67 6f 74 6f 20 61 62 6f 72 74 3b 0a 20 . goto abort;.
70c0: 20 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 72 }. if (r
70d0: 6f 77 73 20 3c 20 31 29 0a 09 3b 0a 20 20 20 20 ows < 1)..;.
70e0: 65 6c 73 65 0a 20 20 20 20 20 20 7b 0a 09 20 20 else. {..
70f0: 66 6f 72 20 28 69 20 3d 20 31 3b 20 69 20 3c 3d for (i = 1; i <=
7100: 20 72 6f 77 73 3b 20 69 2b 2b 29 0a 09 20 20 20 rows; i++)..
7110: 20 7b 0a 09 09 6e 61 6d 65 20 3d 20 72 65 73 75 {...name = resu
7120: 6c 74 73 5b 28 69 20 2a 20 63 6f 6c 75 6d 6e 73 lts[(i * columns
7130: 29 20 2b 20 31 5d 3b 0a 09 09 69 66 20 28 61 74 ) + 1];...if (at
7140: 6f 69 20 28 72 65 73 75 6c 74 73 5b 28 69 20 2a oi (results[(i *
7150: 20 63 6f 6c 75 6d 6e 73 29 20 2b 20 35 5d 29 20 columns) + 5])
7160: 3d 3d 20 30 29 0a 09 09 20 20 20 20 70 4b 65 79 == 0)... pKey
7170: 20 3d 20 30 3b 0a 09 09 65 6c 73 65 0a 09 09 20 = 0;...else...
7180: 20 20 20 70 4b 65 79 20 3d 20 31 3b 0a 09 09 69 pKey = 1;...i
7190: 66 20 28 73 74 72 63 61 73 65 63 6d 70 20 28 6e f (strcasecmp (n
71a0: 61 6d 65 2c 20 22 50 68 6f 74 6f 49 64 22 29 20 ame, "PhotoId")
71b0: 3d 3d 20 30 29 0a 09 09 20 20 20 20 6f 6b 5f 70 == 0)... ok_p
71c0: 68 6f 74 6f 49 64 20 3d 20 31 3b 0a 09 09 69 66 hotoId = 1;...if
71d0: 20 28 73 74 72 63 61 73 65 63 6d 70 20 28 6e 61 (strcasecmp (na
71e0: 6d 65 2c 20 22 50 68 6f 74 6f 22 29 20 3d 3d 20 me, "Photo") ==
71f0: 30 29 0a 09 09 20 20 20 20 6f 6b 5f 70 68 6f 74 0)... ok_phot
7200: 6f 20 3d 20 31 3b 0a 09 09 69 66 20 28 73 74 72 o = 1;...if (str
7210: 63 61 73 65 63 6d 70 20 28 6e 61 6d 65 2c 20 22 casecmp (name, "
7220: 50 69 78 65 6c 58 22 29 20 3d 3d 20 30 29 0a 09 PixelX") == 0)..
7230: 09 20 20 20 20 6f 6b 5f 70 69 78 65 6c 58 20 3d . ok_pixelX =
7240: 20 31 3b 0a 09 09 69 66 20 28 73 74 72 63 61 73 1;...if (strcas
7250: 65 63 6d 70 20 28 6e 61 6d 65 2c 20 22 50 69 78 ecmp (name, "Pix
7260: 65 6c 59 22 29 20 3d 3d 20 30 29 0a 09 09 20 20 elY") == 0)...
7270: 20 20 6f 6b 5f 70 69 78 65 6c 59 20 3d 20 31 3b ok_pixelY = 1;
7280: 0a 09 09 69 66 20 28 73 74 72 63 61 73 65 63 6d ...if (strcasecm
7290: 70 20 28 6e 61 6d 65 2c 20 22 43 61 6d 65 72 61 p (name, "Camera
72a0: 4d 61 6b 65 22 29 20 3d 3d 20 30 29 0a 09 09 20 Make") == 0)...
72b0: 20 20 20 6f 6b 5f 63 61 6d 65 72 61 4d 61 6b 65 ok_cameraMake
72c0: 20 3d 20 31 3b 0a 09 09 69 66 20 28 73 74 72 63 = 1;...if (strc
72d0: 61 73 65 63 6d 70 20 28 6e 61 6d 65 2c 20 22 43 asecmp (name, "C
72e0: 61 6d 65 72 61 4d 6f 64 65 6c 22 29 20 3d 3d 20 ameraModel") ==
72f0: 30 29 0a 09 09 20 20 20 20 6f 6b 5f 63 61 6d 65 0)... ok_came
7300: 72 61 4d 6f 64 65 6c 20 3d 20 31 3b 0a 09 09 69 raModel = 1;...i
7310: 66 20 28 73 74 72 63 61 73 65 63 6d 70 20 28 6e f (strcasecmp (n
7320: 61 6d 65 2c 20 22 53 68 6f 74 44 61 74 65 54 69 ame, "ShotDateTi
7330: 6d 65 22 29 20 3d 3d 20 30 29 0a 09 09 20 20 20 me") == 0)...
7340: 20 6f 6b 5f 73 68 6f 74 44 61 74 65 54 69 6d 65 ok_shotDateTime
7350: 20 3d 20 31 3b 0a 09 09 69 66 20 28 73 74 72 63 = 1;...if (strc
7360: 61 73 65 63 6d 70 20 28 6e 61 6d 65 2c 20 22 47 asecmp (name, "G
7370: 70 73 47 65 6f 6d 65 74 72 79 22 29 20 3d 3d 20 psGeometry") ==
7380: 30 29 0a 09 09 20 20 20 20 6f 6b 5f 67 70 73 47 0)... ok_gpsG
7390: 65 6f 6d 65 74 72 79 20 3d 20 31 3b 0a 09 09 69 eometry = 1;...i
73a0: 66 20 28 73 74 72 63 61 73 65 63 6d 70 20 28 6e f (strcasecmp (n
73b0: 61 6d 65 2c 20 22 47 70 73 44 69 72 65 63 74 69 ame, "GpsDirecti
73c0: 6f 6e 22 29 20 3d 3d 20 30 29 0a 09 09 20 20 20 on") == 0)...
73d0: 20 6f 6b 5f 67 70 73 44 69 72 65 63 74 69 6f 6e ok_gpsDirection
73e0: 20 3d 20 31 3b 0a 09 09 69 66 20 28 73 74 72 63 = 1;...if (strc
73f0: 61 73 65 63 6d 70 20 28 6e 61 6d 65 2c 20 22 47 asecmp (name, "G
7400: 70 73 54 69 6d 65 73 74 61 6d 70 22 29 20 3d 3d psTimestamp") ==
7410: 20 30 29 0a 09 09 20 20 20 20 6f 6b 5f 67 70 73 0)... ok_gps
7420: 54 69 6d 65 73 74 61 6d 70 20 3d 20 31 3b 0a 09 Timestamp = 1;..
7430: 09 69 66 20 28 73 74 72 63 61 73 65 63 6d 70 20 .if (strcasecmp
7440: 28 6e 61 6d 65 2c 20 22 46 72 6f 6d 50 61 74 68 (name, "FromPath
7450: 22 29 20 3d 3d 20 30 29 0a 09 09 20 20 20 20 6f ") == 0)... o
7460: 6b 5f 66 72 6f 6d 50 61 74 68 20 3d 20 31 3b 0a k_fromPath = 1;.
7470: 09 09 69 66 20 28 70 4b 65 79 29 0a 09 09 20 20 ..if (pKey)...
7480: 7b 0a 09 09 20 20 20 20 20 20 69 66 20 28 73 74 {... if (st
7490: 72 63 61 73 65 63 6d 70 20 28 6e 61 6d 65 2c 20 rcasecmp (name,
74a0: 22 50 68 6f 74 6f 49 64 22 29 20 3d 3d 20 30 29 "PhotoId") == 0)
74b0: 0a 09 09 09 20 20 6f 6b 5f 70 68 6f 74 6f 49 64 .... ok_photoId
74c0: 50 6b 20 3d 20 31 3b 0a 09 09 20 20 20 20 20 20 Pk = 1;...
74d0: 65 6c 73 65 0a 09 09 09 20 20 65 72 72 5f 70 6b else.... err_pk
74e0: 20 3d 20 31 3b 0a 09 09 20 20 7d 0a 09 20 20 20 = 1;... }..
74f0: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 73 }. }. s
7500: 71 6c 69 74 65 33 5f 66 72 65 65 5f 74 61 62 6c qlite3_free_tabl
7510: 65 20 28 72 65 73 75 6c 74 73 29 3b 0a 20 20 20 e (results);.
7520: 20 69 66 20 28 6f 6b 5f 70 68 6f 74 6f 49 64 20 if (ok_photoId
7530: 26 26 20 6f 6b 5f 70 68 6f 74 6f 20 26 26 20 6f && ok_photo && o
7540: 6b 5f 70 69 78 65 6c 58 20 26 26 20 6f 6b 5f 70 k_pixelX && ok_p
7550: 69 78 65 6c 59 20 26 26 20 6f 6b 5f 63 61 6d 65 ixelY && ok_came
7560: 72 61 4d 61 6b 65 0a 09 26 26 20 6f 6b 5f 63 61 raMake..&& ok_ca
7570: 6d 65 72 61 4d 6f 64 65 6c 20 26 26 20 6f 6b 5f meraModel && ok_
7580: 73 68 6f 74 44 61 74 65 54 69 6d 65 20 26 26 20 shotDateTime &&
7590: 6f 6b 5f 67 70 73 47 65 6f 6d 65 74 72 79 0a 09 ok_gpsGeometry..
75a0: 26 26 20 6f 6b 5f 67 70 73 44 69 72 65 63 74 69 && ok_gpsDirecti
75b0: 6f 6e 20 26 26 20 6f 6b 5f 67 70 73 54 69 6d 65 on && ok_gpsTime
75c0: 73 74 61 6d 70 20 26 26 20 6f 6b 5f 66 72 6f 6d stamp && ok_from
75d0: 50 61 74 68 20 26 26 20 6f 6b 5f 70 68 6f 74 6f Path && ok_photo
75e0: 49 64 50 6b 0a 09 26 26 20 21 65 72 72 5f 70 6b IdPk..&& !err_pk
75f0: 29 0a 09 3b 0a 20 20 20 20 65 6c 73 65 0a 20 20 )..;. else.
7600: 20 20 20 20 7b 0a 09 20 20 70 72 69 6e 74 66 0a {.. printf.
7610: 09 20 20 20 20 20 20 28 22 45 52 52 4f 52 3a 20 . ("ERROR:
7620: 74 61 62 6c 65 20 27 45 78 69 66 50 68 6f 74 6f table 'ExifPhoto
7630: 27 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 ' already exists
7640: 2c 20 62 75 74 20 68 61 73 20 69 6e 63 6f 6d 70 , but has incomp
7650: 61 74 69 62 6c 65 20 63 6f 6c 75 6d 6e 73 5c 6e atible columns\n
7660: 22 29 3b 0a 09 20 20 67 6f 74 6f 20 61 62 6f 72 ");.. goto abor
7670: 74 3b 0a 20 20 20 20 20 20 7d 0a 2f 2a 20 63 72 t;. }./* cr
7680: 65 61 74 69 6e 67 20 74 68 65 20 45 78 69 66 54 eating the ExifT
7690: 61 67 73 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 ags table */.
76a0: 20 73 74 72 63 70 79 20 28 73 71 6c 2c 20 22 43 strcpy (sql, "C
76b0: 52 45 41 54 45 20 54 41 42 4c 45 20 49 46 20 4e REATE TABLE IF N
76c0: 4f 54 20 45 58 49 53 54 53 20 45 78 69 66 54 61 OT EXISTS ExifTa
76d0: 67 73 20 28 5c 6e 22 29 3b 0a 20 20 20 20 73 74 gs (\n");. st
76e0: 72 63 61 74 20 28 73 71 6c 2c 20 22 50 68 6f 74 rcat (sql, "Phot
76f0: 6f 49 64 20 49 4e 54 45 47 45 52 20 4e 4f 54 20 oId INTEGER NOT
7700: 4e 55 4c 4c 2c 5c 6e 22 29 3b 0a 20 20 20 20 73 NULL,\n");. s
7710: 74 72 63 61 74 20 28 73 71 6c 2c 20 22 54 61 67 trcat (sql, "Tag
7720: 49 64 20 49 4e 54 45 47 45 52 20 4e 4f 54 20 4e Id INTEGER NOT N
7730: 55 4c 4c 2c 5c 6e 22 29 3b 0a 20 20 20 20 73 74 ULL,\n");. st
7740: 72 63 61 74 20 28 73 71 6c 2c 20 22 54 61 67 4e rcat (sql, "TagN
7750: 61 6d 65 20 54 45 58 54 20 4e 4f 54 20 4e 55 4c ame TEXT NOT NUL
7760: 4c 2c 5c 6e 22 29 3b 0a 20 20 20 20 73 74 72 63 L,\n");. strc
7770: 61 74 20 28 73 71 6c 2c 20 22 47 70 73 54 61 67 at (sql, "GpsTag
7780: 20 49 4e 54 45 47 45 52 20 4e 4f 54 20 4e 55 4c INTEGER NOT NUL
7790: 4c 20 43 48 45 43 4b 20 28 47 70 73 54 61 67 20 L CHECK (GpsTag
77a0: 49 4e 20 28 30 2c 20 31 29 29 2c 5c 6e 22 29 3b IN (0, 1)),\n");
77b0: 0a 20 20 20 20 73 74 72 63 61 74 20 28 73 71 6c . strcat (sql
77c0: 2c 0a 09 20 20 20 20 22 56 61 6c 75 65 54 79 70 ,.. "ValueTyp
77d0: 65 20 49 4e 54 45 47 45 52 20 4e 4f 54 20 4e 55 e INTEGER NOT NU
77e0: 4c 4c 20 43 48 45 43 4b 20 28 56 61 6c 75 65 54 LL CHECK (ValueT
77f0: 79 70 65 20 49 4e 20 28 31 2c 20 32 2c 20 33 2c ype IN (1, 2, 3,
7800: 20 34 2c 20 35 2c 20 36 2c 20 37 2c 20 38 2c 20 4, 5, 6, 7, 8,
7810: 39 2c 20 31 30 2c 20 31 31 2c 20 31 32 29 29 2c 9, 10, 11, 12)),
7820: 5c 6e 22 29 3b 0a 20 20 20 20 73 74 72 63 61 74 \n");. strcat
7830: 20 28 73 71 6c 2c 20 22 54 79 70 65 4e 61 6d 65 (sql, "TypeName
7840: 20 54 45 58 54 20 4e 4f 54 20 4e 55 4c 4c 2c 5c TEXT NOT NULL,\
7850: 6e 22 29 3b 0a 20 20 20 20 73 74 72 63 61 74 20 n");. strcat
7860: 28 73 71 6c 2c 20 22 43 6f 75 6e 74 56 61 6c 75 (sql, "CountValu
7870: 65 73 20 49 4e 54 45 47 45 52 20 4e 4f 54 20 4e es INTEGER NOT N
7880: 55 4c 4c 2c 5c 6e 22 29 3b 0a 20 20 20 20 73 74 ULL,\n");. st
7890: 72 63 61 74 20 28 73 71 6c 2c 20 22 50 52 49 4d rcat (sql, "PRIM
78a0: 41 52 59 20 4b 45 59 20 28 50 68 6f 74 6f 49 64 ARY KEY (PhotoId
78b0: 2c 20 54 61 67 49 64 29 22 29 3b 0a 20 20 20 20 , TagId)");.
78c0: 73 74 72 63 61 74 20 28 73 71 6c 2c 20 22 29 22 strcat (sql, ")"
78d0: 29 3b 0a 20 20 20 20 72 65 74 20 3d 20 73 71 6c );. ret = sql
78e0: 69 74 65 33 5f 65 78 65 63 20 28 68 61 6e 64 6c ite3_exec (handl
78f0: 65 2c 20 73 71 6c 2c 20 4e 55 4c 4c 2c 20 4e 55 e, sql, NULL, NU
7900: 4c 4c 2c 20 26 65 72 72 5f 6d 73 67 29 3b 0a 20 LL, &err_msg);.
7910: 20 20 20 69 66 20 28 72 65 74 20 21 3d 20 53 51 if (ret != SQ
7920: 4c 49 54 45 5f 4f 4b 29 0a 20 20 20 20 20 20 7b LITE_OK). {
7930: 0a 09 20 20 70 72 69 6e 74 66 20 28 22 43 52 45 .. printf ("CRE
7940: 41 54 45 20 54 41 42 4c 45 20 45 78 69 66 54 61 ATE TABLE ExifTa
7950: 67 73 20 65 72 72 6f 72 3a 20 25 73 5c 6e 22 2c gs error: %s\n",
7960: 20 65 72 72 5f 6d 73 67 29 3b 0a 09 20 20 73 71 err_msg);.. sq
7970: 6c 69 74 65 33 5f 66 72 65 65 20 28 65 72 72 5f lite3_free (err_
7980: 6d 73 67 29 3b 0a 09 20 20 67 6f 74 6f 20 61 62 msg);.. goto ab
7990: 6f 72 74 3b 0a 20 20 20 20 20 20 7d 0a 2f 2a 20 ort;. }./*
79a0: 63 68 65 63 6b 69 6e 67 20 74 68 65 20 45 78 69 checking the Exi
79b0: 66 54 61 67 73 20 74 61 62 6c 65 20 66 6f 72 20 fTags table for
79c0: 73 61 6e 69 74 79 20 2a 2f 0a 20 20 20 20 6f 6b sanity */. ok
79d0: 5f 70 68 6f 74 6f 49 64 20 3d 20 30 3b 0a 20 20 _photoId = 0;.
79e0: 20 20 6f 6b 5f 74 61 67 49 64 20 3d 20 30 3b 0a ok_tagId = 0;.
79f0: 20 20 20 20 6f 6b 5f 74 61 67 4e 61 6d 65 20 3d ok_tagName =
7a00: 20 30 3b 0a 20 20 20 20 6f 6b 5f 67 70 73 54 61 0;. ok_gpsTa
7a10: 67 20 3d 20 30 3b 0a 20 20 20 20 6f 6b 5f 76 61 g = 0;. ok_va
7a20: 6c 75 65 54 79 70 65 20 3d 20 30 3b 0a 20 20 20 lueType = 0;.
7a30: 20 6f 6b 5f 74 79 70 65 4e 61 6d 65 20 3d 20 30 ok_typeName = 0
7a40: 3b 0a 20 20 20 20 6f 6b 5f 63 6f 75 6e 74 56 61 ;. ok_countVa
7a50: 6c 75 65 73 20 3d 20 30 3b 0a 20 20 20 20 6f 6b lues = 0;. ok
7a60: 5f 70 68 6f 74 6f 49 64 50 6b 20 3d 20 30 3b 0a _photoIdPk = 0;.
7a70: 20 20 20 20 6f 6b 5f 74 61 67 49 64 50 6b 20 3d ok_tagIdPk =
7a80: 20 30 3b 0a 20 20 20 20 65 72 72 5f 70 6b 20 3d 0;. err_pk =
7a90: 20 30 3b 0a 20 20 20 20 73 74 72 63 70 79 20 28 0;. strcpy (
7aa0: 73 71 6c 2c 20 22 50 52 41 47 4d 41 20 74 61 62 sql, "PRAGMA tab
7ab0: 6c 65 5f 69 6e 66 6f 28 5c 22 45 78 69 66 54 61 le_info(\"ExifTa
7ac0: 67 73 5c 22 29 22 29 3b 0a 20 20 20 20 72 65 74 gs\")");. ret
7ad0: 20 3d 20 73 71 6c 69 74 65 33 5f 67 65 74 5f 74 = sqlite3_get_t
7ae0: 61 62 6c 65 20 28 68 61 6e 64 6c 65 2c 20 73 71 able (handle, sq
7af0: 6c 2c 20 26 72 65 73 75 6c 74 73 2c 20 26 72 6f l, &results, &ro
7b00: 77 73 2c 20 26 63 6f 6c 75 6d 6e 73 2c 20 26 65 ws, &columns, &e
7b10: 72 72 5f 6d 73 67 29 3b 0a 20 20 20 20 69 66 20 rr_msg);. if
7b20: 28 72 65 74 20 21 3d 20 53 51 4c 49 54 45 5f 4f (ret != SQLITE_O
7b30: 4b 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 70 72 K). {.. pr
7b40: 69 6e 74 66 20 28 22 50 52 41 47 4d 41 20 74 61 intf ("PRAGMA ta
7b50: 62 6c 65 5f 69 6e 66 6f 28 5c 22 45 78 69 66 54 ble_info(\"ExifT
7b60: 61 67 73 5c 22 29 20 65 72 72 6f 72 3a 20 25 73 ags\") error: %s
7b70: 5c 6e 22 2c 20 65 72 72 5f 6d 73 67 29 3b 0a 09 \n", err_msg);..
7b80: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 20 28 sqlite3_free (
7b90: 65 72 72 5f 6d 73 67 29 3b 0a 09 20 20 67 6f 74 err_msg);.. got
7ba0: 6f 20 61 62 6f 72 74 3b 0a 20 20 20 20 20 20 7d o abort;. }
7bb0: 0a 20 20 20 20 69 66 20 28 72 6f 77 73 20 3c 20 . if (rows <
7bc0: 31 29 0a 09 3b 0a 20 20 20 20 65 6c 73 65 0a 20 1)..;. else.
7bd0: 20 20 20 20 20 7b 0a 09 20 20 66 6f 72 20 28 69 {.. for (i
7be0: 20 3d 20 31 3b 20 69 20 3c 3d 20 72 6f 77 73 3b = 1; i <= rows;
7bf0: 20 69 2b 2b 29 0a 09 20 20 20 20 7b 0a 09 09 6e i++).. {...n
7c00: 61 6d 65 20 3d 20 72 65 73 75 6c 74 73 5b 28 69 ame = results[(i
7c10: 20 2a 20 63 6f 6c 75 6d 6e 73 29 20 2b 20 31 5d * columns) + 1]
7c20: 3b 0a 09 09 69 66 20 28 61 74 6f 69 20 28 72 65 ;...if (atoi (re
7c30: 73 75 6c 74 73 5b 28 69 20 2a 20 63 6f 6c 75 6d sults[(i * colum
7c40: 6e 73 29 20 2b 20 35 5d 29 20 3d 3d 20 30 29 0a ns) + 5]) == 0).
7c50: 09 09 20 20 20 20 70 4b 65 79 20 3d 20 30 3b 0a .. pKey = 0;.
7c60: 09 09 65 6c 73 65 0a 09 09 20 20 20 20 70 4b 65 ..else... pKe
7c70: 79 20 3d 20 31 3b 0a 09 09 69 66 20 28 73 74 72 y = 1;...if (str
7c80: 63 61 73 65 63 6d 70 20 28 6e 61 6d 65 2c 20 22 casecmp (name, "
7c90: 50 68 6f 74 6f 49 64 22 29 20 3d 3d 20 30 29 0a PhotoId") == 0).
7ca0: 09 09 20 20 20 20 6f 6b 5f 70 68 6f 74 6f 49 64 .. ok_photoId
7cb0: 20 3d 20 31 3b 0a 09 09 69 66 20 28 73 74 72 63 = 1;...if (strc
7cc0: 61 73 65 63 6d 70 20 28 6e 61 6d 65 2c 20 22 54 asecmp (name, "T
7cd0: 61 67 49 64 22 29 20 3d 3d 20 30 29 0a 09 09 20 agId") == 0)...
7ce0: 20 20 20 6f 6b 5f 74 61 67 49 64 20 3d 20 31 3b ok_tagId = 1;
7cf0: 0a 09 09 69 66 20 28 73 74 72 63 61 73 65 63 6d ...if (strcasecm
7d00: 70 20 28 6e 61 6d 65 2c 20 22 54 61 67 4e 61 6d p (name, "TagNam
7d10: 65 22 29 20 3d 3d 20 30 29 0a 09 09 20 20 20 20 e") == 0)...
7d20: 6f 6b 5f 74 61 67 4e 61 6d 65 20 3d 20 31 3b 0a ok_tagName = 1;.
7d30: 09 09 69 66 20 28 73 74 72 63 61 73 65 63 6d 70 ..if (strcasecmp
7d40: 20 28 6e 61 6d 65 2c 20 22 47 70 73 54 61 67 22 (name, "GpsTag"
7d50: 29 20 3d 3d 20 30 29 0a 09 09 20 20 20 20 6f 6b ) == 0)... ok
7d60: 5f 67 70 73 54 61 67 20 3d 20 31 3b 0a 09 09 69 _gpsTag = 1;...i
7d70: 66 20 28 73 74 72 63 61 73 65 63 6d 70 20 28 6e f (strcasecmp (n
7d80: 61 6d 65 2c 20 22 56 61 6c 75 65 54 79 70 65 22 ame, "ValueType"
7d90: 29 20 3d 3d 20 30 29 0a 09 09 20 20 20 20 6f 6b ) == 0)... ok
7da0: 5f 76 61 6c 75 65 54 79 70 65 20 3d 20 31 3b 0a _valueType = 1;.
7db0: 09 09 69 66 20 28 73 74 72 63 61 73 65 63 6d 70 ..if (strcasecmp
7dc0: 20 28 6e 61 6d 65 2c 20 22 54 79 70 65 4e 61 6d (name, "TypeNam
7dd0: 65 22 29 20 3d 3d 20 30 29 0a 09 09 20 20 20 20 e") == 0)...
7de0: 6f 6b 5f 74 79 70 65 4e 61 6d 65 20 3d 20 31 3b ok_typeName = 1;
7df0: 0a 09 09 69 66 20 28 73 74 72 63 61 73 65 63 6d ...if (strcasecm
7e00: 70 20 28 6e 61 6d 65 2c 20 22 43 6f 75 6e 74 56 p (name, "CountV
7e10: 61 6c 75 65 73 22 29 20 3d 3d 20 30 29 0a 09 09 alues") == 0)...
7e20: 20 20 20 20 6f 6b 5f 63 6f 75 6e 74 56 61 6c 75 ok_countValu
7e30: 65 73 20 3d 20 31 3b 0a 09 09 69 66 20 28 70 4b es = 1;...if (pK
7e40: 65 79 29 0a 09 09 20 20 7b 0a 09 09 20 20 20 20 ey)... {...
7e50: 20 20 69 66 20 28 73 74 72 63 61 73 65 63 6d 70 if (strcasecmp
7e60: 20 28 6e 61 6d 65 2c 20 22 50 68 6f 74 6f 49 64 (name, "PhotoId
7e70: 22 29 20 3d 3d 20 30 29 0a 09 09 09 20 20 6f 6b ") == 0).... ok
7e80: 5f 70 68 6f 74 6f 49 64 50 6b 20 3d 20 31 3b 0a _photoIdPk = 1;.
7e90: 09 09 20 20 20 20 20 20 65 6c 73 65 20 69 66 20 .. else if
7ea0: 28 73 74 72 63 61 73 65 63 6d 70 20 28 6e 61 6d (strcasecmp (nam
7eb0: 65 2c 20 22 54 61 67 49 64 22 29 20 3d 3d 20 30 e, "TagId") == 0
7ec0: 29 0a 09 09 09 20 20 6f 6b 5f 74 61 67 49 64 50 ).... ok_tagIdP
7ed0: 6b 20 3d 20 31 3b 0a 09 09 20 20 20 20 20 20 65 k = 1;... e
7ee0: 6c 73 65 0a 09 09 09 20 20 65 72 72 5f 70 6b 20 lse.... err_pk
7ef0: 3d 20 31 3b 0a 09 09 20 20 7d 0a 09 20 20 20 20 = 1;... }..
7f00: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 73 71 }. }. sq
7f10: 6c 69 74 65 33 5f 66 72 65 65 5f 74 61 62 6c 65 lite3_free_table
7f20: 20 28 72 65 73 75 6c 74 73 29 3b 0a 20 20 20 20 (results);.
7f30: 69 66 20 28 6f 6b 5f 70 68 6f 74 6f 49 64 20 26 if (ok_photoId &
7f40: 26 20 6f 6b 5f 74 61 67 49 64 20 26 26 20 6f 6b & ok_tagId && ok
7f50: 5f 74 61 67 4e 61 6d 65 20 26 26 20 6f 6b 5f 67 _tagName && ok_g
7f60: 70 73 54 61 67 20 26 26 20 6f 6b 5f 76 61 6c 75 psTag && ok_valu
7f70: 65 54 79 70 65 0a 09 26 26 20 6f 6b 5f 74 79 70 eType..&& ok_typ
7f80: 65 4e 61 6d 65 20 26 26 20 6f 6b 5f 63 6f 75 6e eName && ok_coun
7f90: 74 56 61 6c 75 65 73 20 26 26 20 6f 6b 5f 70 68 tValues && ok_ph
7fa0: 6f 74 6f 49 64 50 6b 20 26 26 20 6f 6b 5f 74 61 otoIdPk && ok_ta
7fb0: 67 49 64 50 6b 0a 09 26 26 20 21 65 72 72 5f 70 gIdPk..&& !err_p
7fc0: 6b 29 0a 09 3b 0a 20 20 20 20 65 6c 73 65 0a 20 k)..;. else.
7fd0: 20 20 20 20 20 7b 0a 09 20 20 70 72 69 6e 74 66 {.. printf
7fe0: 0a 09 20 20 20 20 20 20 28 22 45 52 52 4f 52 3a .. ("ERROR:
7ff0: 20 74 61 62 6c 65 20 27 45 78 69 66 54 61 67 73 table 'ExifTags
8000: 27 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 ' already exists
8010: 2c 20 62 75 74 20 68 61 73 20 69 6e 63 6f 6d 70 , but has incomp
8020: 61 74 69 62 6c 65 20 63 6f 6c 75 6d 6e 73 5c 6e atible columns\n
8030: 22 29 3b 0a 09 20 20 67 6f 74 6f 20 61 62 6f 72 ");.. goto abor
8040: 74 3b 0a 20 20 20 20 20 20 7d 0a 2f 2a 20 63 72 t;. }./* cr
8050: 65 61 74 69 6e 67 20 74 68 65 20 45 78 69 66 56 eating the ExifV
8060: 61 6c 75 65 73 20 74 61 62 6c 65 20 2a 2f 0a 20 alues table */.
8070: 20 20 20 73 74 72 63 70 79 20 28 73 71 6c 2c 20 strcpy (sql,
8080: 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 49 46 "CREATE TABLE IF
8090: 20 4e 4f 54 20 45 58 49 53 54 53 20 45 78 69 66 NOT EXISTS Exif
80a0: 56 61 6c 75 65 73 20 28 5c 6e 22 29 3b 0a 20 20 Values (\n");.
80b0: 20 20 73 74 72 63 61 74 20 28 73 71 6c 2c 20 22 strcat (sql, "
80c0: 50 68 6f 74 6f 49 64 20 49 4e 54 45 47 45 52 20 PhotoId INTEGER
80d0: 4e 4f 54 20 4e 55 4c 4c 2c 5c 6e 22 29 3b 0a 20 NOT NULL,\n");.
80e0: 20 20 20 73 74 72 63 61 74 20 28 73 71 6c 2c 20 strcat (sql,
80f0: 22 54 61 67 49 64 20 49 4e 54 45 47 45 52 20 4e "TagId INTEGER N
8100: 4f 54 20 4e 55 4c 4c 2c 5c 6e 22 29 3b 0a 20 20 OT NULL,\n");.
8110: 20 20 73 74 72 63 61 74 20 28 73 71 6c 2c 20 22 strcat (sql, "
8120: 56 61 6c 75 65 49 6e 64 65 78 20 49 4e 54 45 47 ValueIndex INTEG
8130: 45 52 20 4e 4f 54 20 4e 55 4c 4c 2c 5c 6e 22 29 ER NOT NULL,\n")
8140: 3b 0a 20 20 20 20 73 74 72 63 61 74 20 28 73 71 ;. strcat (sq
8150: 6c 2c 20 22 42 79 74 65 56 61 6c 75 65 20 42 4c l, "ByteValue BL
8160: 4f 42 2c 5c 6e 22 29 3b 0a 20 20 20 20 73 74 72 OB,\n");. str
8170: 63 61 74 20 28 73 71 6c 2c 20 22 53 74 72 69 6e cat (sql, "Strin
8180: 67 56 61 6c 75 65 20 54 45 58 54 2c 5c 6e 22 29 gValue TEXT,\n")
8190: 3b 0a 20 20 20 20 73 74 72 63 61 74 20 28 73 71 ;. strcat (sq
81a0: 6c 2c 20 22 4e 75 6d 56 61 6c 75 65 20 49 4e 54 l, "NumValue INT
81b0: 45 47 45 52 2c 5c 6e 22 29 3b 0a 20 20 20 20 73 EGER,\n");. s
81c0: 74 72 63 61 74 20 28 73 71 6c 2c 20 22 4e 75 6d trcat (sql, "Num
81d0: 56 61 6c 75 65 42 69 73 20 49 4e 54 45 47 45 52 ValueBis INTEGER
81e0: 2c 5c 6e 22 29 3b 0a 20 20 20 20 73 74 72 63 61 ,\n");. strca
81f0: 74 20 28 73 71 6c 2c 20 22 44 6f 75 62 6c 65 56 t (sql, "DoubleV
8200: 61 6c 75 65 20 44 4f 55 42 4c 45 2c 5c 6e 22 29 alue DOUBLE,\n")
8210: 3b 0a 20 20 20 20 73 74 72 63 61 74 20 28 73 71 ;. strcat (sq
8220: 6c 2c 20 22 48 75 6d 61 6e 52 65 61 64 61 62 6c l, "HumanReadabl
8230: 65 20 54 45 58 54 2c 5c 6e 22 29 3b 0a 20 20 20 e TEXT,\n");.
8240: 20 73 74 72 63 61 74 20 28 73 71 6c 2c 20 22 50 strcat (sql, "P
8250: 52 49 4d 41 52 59 20 4b 45 59 20 28 50 68 6f 74 RIMARY KEY (Phot
8260: 6f 49 64 2c 20 54 61 67 49 64 2c 20 56 61 6c 75 oId, TagId, Valu
8270: 65 49 6e 64 65 78 29 22 29 3b 0a 20 20 20 20 73 eIndex)");. s
8280: 74 72 63 61 74 20 28 73 71 6c 2c 20 22 29 22 29 trcat (sql, ")")
8290: 3b 0a 20 20 20 20 72 65 74 20 3d 20 73 71 6c 69 ;. ret = sqli
82a0: 74 65 33 5f 65 78 65 63 20 28 68 61 6e 64 6c 65 te3_exec (handle
82b0: 2c 20 73 71 6c 2c 20 4e 55 4c 4c 2c 20 4e 55 4c , sql, NULL, NUL
82c0: 4c 2c 20 26 65 72 72 5f 6d 73 67 29 3b 0a 20 20 L, &err_msg);.
82d0: 20 20 69 66 20 28 72 65 74 20 21 3d 20 53 51 4c if (ret != SQL
82e0: 49 54 45 5f 4f 4b 29 0a 20 20 20 20 20 20 7b 0a ITE_OK). {.
82f0: 09 20 20 70 72 69 6e 74 66 20 28 22 43 52 45 41 . printf ("CREA
8300: 54 45 20 54 41 42 4c 45 20 45 78 69 66 56 61 6c TE TABLE ExifVal
8310: 75 65 73 20 65 72 72 6f 72 3a 20 25 73 5c 6e 22 ues error: %s\n"
8320: 2c 20 65 72 72 5f 6d 73 67 29 3b 0a 09 20 20 73 , err_msg);.. s
8330: 71 6c 69 74 65 33 5f 66 72 65 65 20 28 65 72 72 qlite3_free (err
8340: 5f 6d 73 67 29 3b 0a 09 20 20 67 6f 74 6f 20 61 _msg);.. goto a
8350: 62 6f 72 74 3b 0a 20 20 20 20 20 20 7d 0a 2f 2a bort;. }./*
8360: 20 63 68 65 63 6b 69 6e 67 20 74 68 65 20 45 78 checking the Ex
8370: 69 66 56 61 6c 75 65 73 20 74 61 62 6c 65 20 66 ifValues table f
8380: 6f 72 20 73 61 6e 69 74 79 20 2a 2f 0a 20 20 20 or sanity */.
8390: 20 6f 6b 5f 70 68 6f 74 6f 49 64 20 3d 20 30 3b ok_photoId = 0;
83a0: 0a 20 20 20 20 6f 6b 5f 74 61 67 49 64 20 3d 20 . ok_tagId =
83b0: 30 3b 0a 20 20 20 20 6f 6b 5f 76 61 6c 75 65 49 0;. ok_valueI
83c0: 6e 64 65 78 20 3d 20 30 3b 0a 20 20 20 20 6f 6b ndex = 0;. ok
83d0: 5f 62 79 74 65 56 61 6c 75 65 20 3d 20 30 3b 0a _byteValue = 0;.
83e0: 20 20 20 20 6f 6b 5f 73 74 72 69 6e 67 56 61 6c ok_stringVal
83f0: 75 65 20 3d 20 30 3b 0a 20 20 20 20 6f 6b 5f 6e ue = 0;. ok_n
8400: 75 6d 56 61 6c 75 65 20 3d 20 30 3b 0a 20 20 20 umValue = 0;.
8410: 20 6f 6b 5f 6e 75 6d 56 61 6c 75 65 42 69 73 20 ok_numValueBis
8420: 3d 20 30 3b 0a 20 20 20 20 6f 6b 5f 64 6f 75 62 = 0;. ok_doub
8430: 6c 65 56 61 6c 75 65 20 3d 20 30 3b 0a 20 20 20 leValue = 0;.
8440: 20 6f 6b 5f 68 75 6d 61 6e 52 65 61 64 61 62 6c ok_humanReadabl
8450: 65 20 3d 20 30 3b 0a 20 20 20 20 6f 6b 5f 70 68 e = 0;. ok_ph
8460: 6f 74 6f 49 64 50 6b 20 3d 20 30 3b 0a 20 20 20 otoIdPk = 0;.
8470: 20 6f 6b 5f 74 61 67 49 64 50 6b 20 3d 20 30 3b ok_tagIdPk = 0;
8480: 0a 20 20 20 20 6f 6b 5f 76 61 6c 75 65 49 6e 64 . ok_valueInd
8490: 65 78 50 6b 20 3d 20 30 3b 0a 20 20 20 20 65 72 exPk = 0;. er
84a0: 72 5f 70 6b 20 3d 20 30 3b 0a 20 20 20 20 73 74 r_pk = 0;. st
84b0: 72 63 70 79 20 28 73 71 6c 2c 20 22 50 52 41 47 rcpy (sql, "PRAG
84c0: 4d 41 20 74 61 62 6c 65 5f 69 6e 66 6f 28 5c 22 MA table_info(\"
84d0: 45 78 69 66 56 61 6c 75 65 73 5c 22 29 22 29 3b ExifValues\")");
84e0: 0a 20 20 20 20 72 65 74 20 3d 20 73 71 6c 69 74 . ret = sqlit
84f0: 65 33 5f 67 65 74 5f 74 61 62 6c 65 20 28 68 61 e3_get_table (ha
8500: 6e 64 6c 65 2c 20 73 71 6c 2c 20 26 72 65 73 75 ndle, sql, &resu
8510: 6c 74 73 2c 20 26 72 6f 77 73 2c 20 26 63 6f 6c lts, &rows, &col
8520: 75 6d 6e 73 2c 20 26 65 72 72 5f 6d 73 67 29 3b umns, &err_msg);
8530: 0a 20 20 20 20 69 66 20 28 72 65 74 20 21 3d 20 . if (ret !=
8540: 53 51 4c 49 54 45 5f 4f 4b 29 0a 20 20 20 20 20 SQLITE_OK).
8550: 20 7b 0a 09 20 20 70 72 69 6e 74 66 20 28 22 50 {.. printf ("P
8560: 52 41 47 4d 41 20 74 61 62 6c 65 5f 69 6e 66 6f RAGMA table_info
8570: 28 5c 22 45 78 69 66 56 61 6c 75 65 73 5c 22 29 (\"ExifValues\")
8580: 20 65 72 72 6f 72 3a 20 25 73 5c 6e 22 2c 20 65 error: %s\n", e
8590: 72 72 5f 6d 73 67 29 3b 0a 09 20 20 73 71 6c 69 rr_msg);.. sqli
85a0: 74 65 33 5f 66 72 65 65 20 28 65 72 72 5f 6d 73 te3_free (err_ms
85b0: 67 29 3b 0a 09 20 20 67 6f 74 6f 20 61 62 6f 72 g);.. goto abor
85c0: 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 69 t;. }. i
85d0: 66 20 28 72 6f 77 73 20 3c 20 31 29 0a 09 3b 0a f (rows < 1)..;.
85e0: 20 20 20 20 65 6c 73 65 0a 20 20 20 20 20 20 7b else. {
85f0: 0a 09 20 20 66 6f 72 20 28 69 20 3d 20 31 3b 20 .. for (i = 1;
8600: 69 20 3c 3d 20 72 6f 77 73 3b 20 69 2b 2b 29 0a i <= rows; i++).
8610: 09 20 20 20 20 7b 0a 09 09 6e 61 6d 65 20 3d 20 . {...name =
8620: 72 65 73 75 6c 74 73 5b 28 69 20 2a 20 63 6f 6c results[(i * col
8630: 75 6d 6e 73 29 20 2b 20 31 5d 3b 0a 09 09 69 66 umns) + 1];...if
8640: 20 28 61 74 6f 69 20 28 72 65 73 75 6c 74 73 5b (atoi (results[
8650: 28 69 20 2a 20 63 6f 6c 75 6d 6e 73 29 20 2b 20 (i * columns) +
8660: 35 5d 29 20 3d 3d 20 30 29 0a 09 09 20 20 20 20 5]) == 0)...
8670: 70 4b 65 79 20 3d 20 30 3b 0a 09 09 65 6c 73 65 pKey = 0;...else
8680: 0a 09 09 20 20 20 20 70 4b 65 79 20 3d 20 31 3b ... pKey = 1;
8690: 0a 09 09 69 66 20 28 73 74 72 63 61 73 65 63 6d ...if (strcasecm
86a0: 70 20 28 6e 61 6d 65 2c 20 22 50 68 6f 74 6f 49 p (name, "PhotoI
86b0: 64 22 29 20 3d 3d 20 30 29 0a 09 09 20 20 20 20 d") == 0)...
86c0: 6f 6b 5f 70 68 6f 74 6f 49 64 20 3d 20 31 3b 0a ok_photoId = 1;.
86d0: 09 09 69 66 20 28 73 74 72 63 61 73 65 63 6d 70 ..if (strcasecmp
86e0: 20 28 6e 61 6d 65 2c 20 22 54 61 67 49 64 22 29 (name, "TagId")
86f0: 20 3d 3d 20 30 29 0a 09 09 20 20 20 20 6f 6b 5f == 0)... ok_
8700: 74 61 67 49 64 20 3d 20 31 3b 0a 09 09 69 66 20 tagId = 1;...if
8710: 28 73 74 72 63 61 73 65 63 6d 70 20 28 6e 61 6d (strcasecmp (nam
8720: 65 2c 20 22 56 61 6c 75 65 49 6e 64 65 78 22 29 e, "ValueIndex")
8730: 20 3d 3d 20 30 29 0a 09 09 20 20 20 20 6f 6b 5f == 0)... ok_
8740: 76 61 6c 75 65 49 6e 64 65 78 20 3d 20 31 3b 0a valueIndex = 1;.
8750: 09 09 69 66 20 28 73 74 72 63 61 73 65 63 6d 70 ..if (strcasecmp
8760: 20 28 6e 61 6d 65 2c 20 22 42 79 74 65 56 61 6c (name, "ByteVal
8770: 75 65 22 29 20 3d 3d 20 30 29 0a 09 09 20 20 20 ue") == 0)...
8780: 20 6f 6b 5f 62 79 74 65 56 61 6c 75 65 20 3d 20 ok_byteValue =
8790: 31 3b 0a 09 09 69 66 20 28 73 74 72 63 61 73 65 1;...if (strcase
87a0: 63 6d 70 20 28 6e 61 6d 65 2c 20 22 53 74 72 69 cmp (name, "Stri
87b0: 6e 67 56 61 6c 75 65 22 29 20 3d 3d 20 30 29 0a ngValue") == 0).
87c0: 09 09 20 20 20 20 6f 6b 5f 73 74 72 69 6e 67 56 .. ok_stringV
87d0: 61 6c 75 65 20 3d 20 31 3b 0a 09 09 69 66 20 28 alue = 1;...if (
87e0: 73 74 72 63 61 73 65 63 6d 70 20 28 6e 61 6d 65 strcasecmp (name
87f0: 2c 20 22 4e 75 6d 56 61 6c 75 65 22 29 20 3d 3d , "NumValue") ==
8800: 20 30 29 0a 09 09 20 20 20 20 6f 6b 5f 6e 75 6d 0)... ok_num
8810: 56 61 6c 75 65 20 3d 20 31 3b 0a 09 09 69 66 20 Value = 1;...if
8820: 28 73 74 72 63 61 73 65 63 6d 70 20 28 6e 61 6d (strcasecmp (nam
8830: 65 2c 20 22 4e 75 6d 56 61 6c 75 65 42 69 73 22 e, "NumValueBis"
8840: 29 20 3d 3d 20 30 29 0a 09 09 20 20 20 20 6f 6b ) == 0)... ok
8850: 5f 6e 75 6d 56 61 6c 75 65 42 69 73 20 3d 20 31 _numValueBis = 1
8860: 3b 0a 09 09 69 66 20 28 73 74 72 63 61 73 65 63 ;...if (strcasec
8870: 6d 70 20 28 6e 61 6d 65 2c 20 22 44 6f 75 62 6c mp (name, "Doubl
8880: 65 56 61 6c 75 65 22 29 20 3d 3d 20 30 29 0a 09 eValue") == 0)..
8890: 09 20 20 20 20 6f 6b 5f 64 6f 75 62 6c 65 56 61 . ok_doubleVa
88a0: 6c 75 65 20 3d 20 31 3b 0a 09 09 69 66 20 28 73 lue = 1;...if (s
88b0: 74 72 63 61 73 65 63 6d 70 20 28 6e 61 6d 65 2c trcasecmp (name,
88c0: 20 22 48 75 6d 61 6e 52 65 61 64 61 62 6c 65 22 "HumanReadable"
88d0: 29 20 3d 3d 20 30 29 0a 09 09 20 20 20 20 6f 6b ) == 0)... ok
88e0: 5f 68 75 6d 61 6e 52 65 61 64 61 62 6c 65 20 3d _humanReadable =
88f0: 20 31 3b 0a 09 09 69 66 20 28 70 4b 65 79 29 0a 1;...if (pKey).
8900: 09 09 20 20 7b 0a 09 09 20 20 20 20 20 20 69 66 .. {... if
8910: 20 28 73 74 72 63 61 73 65 63 6d 70 20 28 6e 61 (strcasecmp (na
8920: 6d 65 2c 20 22 50 68 6f 74 6f 49 64 22 29 20 3d me, "PhotoId") =
8930: 3d 20 30 29 0a 09 09 09 20 20 6f 6b 5f 70 68 6f = 0).... ok_pho
8940: 74 6f 49 64 50 6b 20 3d 20 31 3b 0a 09 09 20 20 toIdPk = 1;...
8950: 20 20 20 20 65 6c 73 65 20 69 66 20 28 73 74 72 else if (str
8960: 63 61 73 65 63 6d 70 20 28 6e 61 6d 65 2c 20 22 casecmp (name, "
8970: 54 61 67 49 64 22 29 20 3d 3d 20 30 29 0a 09 09 TagId") == 0)...
8980: 09 20 20 6f 6b 5f 74 61 67 49 64 50 6b 20 3d 20 . ok_tagIdPk =
8990: 31 3b 0a 09 09 20 20 20 20 20 20 65 6c 73 65 20 1;... else
89a0: 69 66 20 28 73 74 72 63 61 73 65 63 6d 70 20 28 if (strcasecmp (
89b0: 6e 61 6d 65 2c 20 22 56 61 6c 75 65 49 6e 64 65 name, "ValueInde
89c0: 78 22 29 20 3d 3d 20 30 29 0a 09 09 09 20 20 6f x") == 0).... o
89d0: 6b 5f 76 61 6c 75 65 49 6e 64 65 78 50 6b 20 3d k_valueIndexPk =
89e0: 20 31 3b 0a 09 09 20 20 20 20 20 20 65 6c 73 65 1;... else
89f0: 0a 09 09 09 20 20 65 72 72 5f 70 6b 20 3d 20 31 .... err_pk = 1
8a00: 3b 0a 09 09 20 20 7d 0a 09 20 20 20 20 7d 0a 20 ;... }.. }.
8a10: 20 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 }. sqlit
8a20: 65 33 5f 66 72 65 65 5f 74 61 62 6c 65 20 28 72 e3_free_table (r
8a30: 65 73 75 6c 74 73 29 3b 0a 20 20 20 20 69 66 20 esults);. if
8a40: 28 6f 6b 5f 70 68 6f 74 6f 49 64 20 26 26 20 6f (ok_photoId && o
8a50: 6b 5f 74 61 67 49 64 20 26 26 20 6f 6b 5f 76 61 k_tagId && ok_va
8a60: 6c 75 65 49 6e 64 65 78 20 26 26 20 6f 6b 5f 62 lueIndex && ok_b
8a70: 79 74 65 56 61 6c 75 65 0a 09 26 26 20 6f 6b 5f yteValue..&& ok_
8a80: 73 74 72 69 6e 67 56 61 6c 75 65 20 26 26 20 6f stringValue && o
8a90: 6b 5f 6e 75 6d 56 61 6c 75 65 20 26 26 20 6f 6b k_numValue && ok
8aa0: 5f 6e 75 6d 56 61 6c 75 65 42 69 73 20 26 26 20 _numValueBis &&
8ab0: 6f 6b 5f 64 6f 75 62 6c 65 56 61 6c 75 65 0a 09 ok_doubleValue..
8ac0: 26 26 20 6f 6b 5f 68 75 6d 61 6e 52 65 61 64 61 && ok_humanReada
8ad0: 62 6c 65 20 26 26 20 6f 6b 5f 70 68 6f 74 6f 49 ble && ok_photoI
8ae0: 64 50 6b 20 26 26 20 6f 6b 5f 74 61 67 49 64 50 dPk && ok_tagIdP
8af0: 6b 20 26 26 20 6f 6b 5f 76 61 6c 75 65 49 6e 64 k && ok_valueInd
8b00: 65 78 50 6b 0a 09 26 26 20 21 65 72 72 5f 70 6b exPk..&& !err_pk
8b10: 29 0a 09 3b 0a 20 20 20 20 65 6c 73 65 0a 20 20 )..;. else.
8b20: 20 20 20 20 7b 0a 09 20 20 70 72 69 6e 74 66 0a {.. printf.
8b30: 09 20 20 20 20 20 20 28 22 45 52 52 4f 52 3a 20 . ("ERROR:
8b40: 74 61 62 6c 65 20 27 45 78 69 66 56 61 6c 75 65 table 'ExifValue
8b50: 73 27 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 s' already exist
8b60: 73 2c 20 62 75 74 20 68 61 73 20 69 6e 63 6f 6d s, but has incom
8b70: 70 61 74 69 62 6c 65 20 63 6f 6c 75 6d 6e 73 5c patible columns\
8b80: 6e 22 29 3b 0a 09 20 20 67 6f 74 6f 20 61 62 6f n");.. goto abo
8b90: 72 74 3b 0a 20 20 20 20 20 20 7d 0a 2f 2a 20 63 rt;. }./* c
8ba0: 72 65 61 74 69 6e 67 20 74 68 65 20 45 78 69 66 reating the Exif
8bb0: 56 69 65 77 20 76 69 65 77 20 2a 2f 0a 20 20 20 View view */.
8bc0: 20 73 74 72 63 70 79 20 28 73 71 6c 2c 20 22 43 strcpy (sql, "C
8bd0: 52 45 41 54 45 20 56 49 45 57 20 49 46 20 4e 4f REATE VIEW IF NO
8be0: 54 20 45 58 49 53 54 53 20 5c 22 45 78 69 66 4d T EXISTS \"ExifM
8bf0: 65 74 61 64 61 74 61 5c 22 20 41 53 5c 6e 22 29 etadata\" AS\n")
8c00: 3b 0a 20 20 20 20 73 74 72 63 61 74 20 28 73 71 ;. strcat (sq
8c10: 6c 2c 20 22 53 45 4c 45 43 54 20 70 2e 5c 22 50 l, "SELECT p.\"P
8c20: 68 6f 74 6f 49 64 5c 22 20 41 53 20 27 50 68 6f hotoId\" AS 'Pho
8c30: 74 6f 49 64 27 2c 20 22 29 3b 0a 20 20 20 20 73 toId', ");. s
8c40: 74 72 63 61 74 20 28 73 71 6c 2c 20 22 74 2e 5c trcat (sql, "t.\
8c50: 22 54 61 67 49 64 5c 22 20 41 53 20 27 54 61 67 "TagId\" AS 'Tag
8c60: 49 64 27 2c 20 22 29 3b 0a 20 20 20 20 73 74 72 Id', ");. str
8c70: 63 61 74 20 28 73 71 6c 2c 20 22 74 2e 5c 22 54 cat (sql, "t.\"T
8c80: 61 67 4e 61 6d 65 5c 22 20 41 53 20 27 54 61 67 agName\" AS 'Tag
8c90: 4e 61 6d 65 27 2c 22 29 3b 0a 20 20 20 20 73 74 Name',");. st
8ca0: 72 63 61 74 20 28 73 71 6c 2c 20 22 74 2e 5c 22 rcat (sql, "t.\"
8cb0: 47 70 73 54 61 67 5c 22 20 41 53 20 27 47 70 73 GpsTag\" AS 'Gps
8cc0: 54 61 67 27 2c 5c 6e 22 29 3b 0a 20 20 20 20 73 Tag',\n");. s
8cd0: 74 72 63 61 74 20 28 73 71 6c 2c 20 22 74 2e 5c trcat (sql, "t.\
8ce0: 22 56 61 6c 75 65 54 79 70 65 5c 22 20 41 53 20 "ValueType\" AS
8cf0: 27 56 61 6c 75 65 54 79 70 65 27 2c 22 29 3b 0a 'ValueType',");.
8d00: 20 20 20 20 73 74 72 63 61 74 20 28 73 71 6c 2c strcat (sql,
8d10: 20 22 74 2e 5c 22 54 79 70 65 4e 61 6d 65 5c 22 "t.\"TypeName\"
8d20: 20 41 53 20 27 54 79 70 65 4e 61 6d 65 27 2c 20 AS 'TypeName',
8d30: 22 29 3b 0a 20 20 20 20 73 74 72 63 61 74 20 28 ");. strcat (
8d40: 73 71 6c 2c 20 22 74 2e 5c 22 43 6f 75 6e 74 56 sql, "t.\"CountV
8d50: 61 6c 75 65 73 5c 22 20 41 53 20 27 43 6f 75 6e alues\" AS 'Coun
8d60: 74 56 61 6c 75 65 73 27 2c 20 22 29 3b 0a 20 20 tValues', ");.
8d70: 20 20 73 74 72 63 61 74 20 28 73 71 6c 2c 20 22 strcat (sql, "
8d80: 76 2e 5c 22 56 61 6c 75 65 49 6e 64 65 78 5c 22 v.\"ValueIndex\"
8d90: 20 41 53 20 27 56 61 6c 75 65 49 6e 64 65 78 27 AS 'ValueIndex'
8da0: 2c 5c 6e 22 29 3b 0a 20 20 20 20 73 74 72 63 61 ,\n");. strca
8db0: 74 20 28 73 71 6c 2c 20 22 76 2e 5c 22 42 79 74 t (sql, "v.\"Byt
8dc0: 65 56 61 6c 75 65 5c 22 20 41 53 20 27 42 79 74 eValue\" AS 'Byt
8dd0: 65 56 61 6c 75 65 27 2c 20 22 29 3b 0a 20 20 20 eValue', ");.
8de0: 20 73 74 72 63 61 74 20 28 73 71 6c 2c 20 22 76 strcat (sql, "v
8df0: 2e 5c 22 53 74 72 69 6e 67 56 61 6c 75 65 5c 22 .\"StringValue\"
8e00: 20 41 53 20 27 53 74 72 69 6e 67 56 61 6c 75 65 AS 'StringValue
8e10: 27 2c 20 22 29 3b 0a 20 20 20 20 73 74 72 63 61 ', ");. strca
8e20: 74 20 28 73 71 6c 2c 20 22 76 2e 5c 22 4e 75 6d t (sql, "v.\"Num
8e30: 56 61 6c 75 65 5c 22 20 41 53 20 27 4e 75 6d 56 Value\" AS 'NumV
8e40: 61 6c 75 65 27 2c 20 22 29 3b 0a 20 20 20 20 73 alue', ");. s
8e50: 74 72 63 61 74 20 28 73 71 6c 2c 20 22 76 2e 5c trcat (sql, "v.\
8e60: 22 4e 75 6d 56 61 6c 75 65 42 69 73 5c 22 20 41 "NumValueBis\" A
8e70: 53 20 27 4e 75 6d 56 61 6c 75 65 42 69 73 27 2c S 'NumValueBis',
8e80: 5c 6e 22 29 3b 0a 20 20 20 20 73 74 72 63 61 74 \n");. strcat
8e90: 20 28 73 71 6c 2c 20 22 76 2e 5c 22 44 6f 75 62 (sql, "v.\"Doub
8ea0: 6c 65 56 61 6c 75 65 5c 22 20 41 53 20 27 44 6f leValue\" AS 'Do
8eb0: 75 62 6c 65 56 61 6c 75 65 27 2c 20 22 29 3b 0a ubleValue', ");.
8ec0: 20 20 20 20 73 74 72 63 61 74 20 28 73 71 6c 2c strcat (sql,
8ed0: 20 22 76 2e 5c 22 48 75 6d 61 6e 52 65 61 64 61 "v.\"HumanReada
8ee0: 62 6c 65 5c 22 20 41 53 20 27 48 75 6d 61 6e 52 ble\" AS 'HumanR
8ef0: 65 61 64 61 62 6c 65 27 5c 6e 22 29 3b 0a 20 20 eadable'\n");.
8f00: 20 20 73 74 72 63 61 74 20 28 73 71 6c 2c 0a 09 strcat (sql,..
8f10: 20 20 20 20 22 46 52 4f 4d 20 5c 22 45 78 69 66 "FROM \"Exif
8f20: 50 68 6f 74 6f 5c 22 20 41 53 20 70 2c 20 5c 22 Photo\" AS p, \"
8f30: 45 78 69 66 54 61 67 73 5c 22 20 41 53 20 74 2c ExifTags\" AS t,
8f40: 20 5c 22 45 78 69 66 56 61 6c 75 65 73 5c 22 20 \"ExifValues\"
8f50: 41 53 20 76 5c 6e 22 29 3b 0a 20 20 20 20 73 74 AS v\n");. st
8f60: 72 63 61 74 20 28 73 71 6c 2c 0a 09 20 20 20 20 rcat (sql,..
8f70: 22 57 48 45 52 45 20 74 2e 5c 22 50 68 6f 74 6f "WHERE t.\"Photo
8f80: 49 64 5c 22 20 3d 20 70 2e 5c 22 50 68 6f 74 6f Id\" = p.\"Photo
8f90: 49 64 5c 22 20 41 4e 44 20 76 2e 5c 22 50 68 6f Id\" AND v.\"Pho
8fa0: 74 6f 49 64 5c 22 20 3d 20 74 2e 5c 22 50 68 6f toId\" = t.\"Pho
8fb0: 74 6f 49 64 5c 22 20 41 4e 44 20 76 2e 5c 22 54 toId\" AND v.\"T
8fc0: 61 67 49 64 5c 22 20 3d 20 74 2e 5c 22 54 61 67 agId\" = t.\"Tag
8fd0: 49 64 5c 22 22 29 3b 0a 20 20 20 20 72 65 74 20 Id\"");. ret
8fe0: 3d 20 73 71 6c 69 74 65 33 5f 65 78 65 63 20 28 = sqlite3_exec (
8ff0: 68 61 6e 64 6c 65 2c 20 73 71 6c 2c 20 4e 55 4c handle, sql, NUL
9000: 4c 2c 20 4e 55 4c 4c 2c 20 26 65 72 72 5f 6d 73 L, NULL, &err_ms
9010: 67 29 3b 0a 20 20 20 20 69 66 20 28 72 65 74 20 g);. if (ret
9020: 21 3d 20 53 51 4c 49 54 45 5f 4f 4b 29 0a 20 20 != SQLITE_OK).
9030: 20 20 20 20 7b 0a 09 20 20 70 72 69 6e 74 66 20 {.. printf
9040: 28 22 43 52 45 41 54 45 20 56 49 45 57 20 45 78 ("CREATE VIEW Ex
9050: 69 66 4d 65 74 61 64 61 74 61 20 65 72 72 6f 72 ifMetadata error
9060: 3a 20 25 73 5c 6e 22 2c 20 65 72 72 5f 6d 73 67 : %s\n", err_msg
9070: 29 3b 0a 09 20 20 73 71 6c 69 74 65 33 5f 66 72 );.. sqlite3_fr
9080: 65 65 20 28 65 72 72 5f 6d 73 67 29 3b 0a 09 20 ee (err_msg);..
9090: 20 67 6f 74 6f 20 61 62 6f 72 74 3b 0a 20 20 20 goto abort;.
90a0: 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 }. return
90b0: 31 3b 0a 20 20 61 62 6f 72 74 3a 0a 20 20 20 20 1;. abort:.
90c0: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 73 74 61 return 0;.}..sta
90d0: 74 69 63 20 76 6f 69 64 0a 73 70 61 74 69 61 6c tic void.spatial
90e0: 69 74 65 5f 61 75 74 6f 63 72 65 61 74 65 20 28 ite_autocreate (
90f0: 73 71 6c 69 74 65 33 20 2a 20 64 62 29 0a 7b 0a sqlite3 * db).{.
9100: 2f 2a 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f /* attempting to
9110: 20 70 65 72 66 6f 72 6d 20 73 65 6c 66 2d 69 6e perform self-in
9120: 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 66 6f 72 itialization for
9130: 20 61 20 6e 65 77 6c 79 20 63 72 65 61 74 65 64 a newly created
9140: 20 44 42 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 DB */. int r
9150: 65 74 3b 0a 20 20 20 20 63 68 61 72 20 73 71 6c et;. char sql
9160: 5b 31 30 32 34 5d 3b 0a 20 20 20 20 63 68 61 72 [1024];. char
9170: 20 2a 65 72 72 5f 6d 73 67 20 3d 20 4e 55 4c 4c *err_msg = NULL
9180: 3b 0a 20 20 20 20 69 6e 74 20 63 6f 75 6e 74 3b ;. int count;
9190: 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 . int i;.
91a0: 63 68 61 72 20 2a 2a 72 65 73 75 6c 74 73 3b 0a char **results;.
91b0: 20 20 20 20 69 6e 74 20 72 6f 77 73 3b 0a 20 20 int rows;.
91c0: 20 20 69 6e 74 20 63 6f 6c 75 6d 6e 73 3b 0a 0a int columns;..
91d0: 2f 2a 20 63 68 65 63 6b 69 6e 67 20 69 66 20 74 /* checking if t
91e0: 68 69 73 20 44 42 20 69 73 20 72 65 61 6c 6c 79 his DB is really
91f0: 20 65 6d 70 74 79 20 2a 2f 0a 20 20 20 20 73 74 empty */. st
9200: 72 63 70 79 20 28 73 71 6c 2c 20 22 53 45 4c 45 rcpy (sql, "SELE
9210: 43 54 20 43 6f 75 6e 74 28 2a 29 20 66 72 6f 6d CT Count(*) from
9220: 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 22 29 sqlite_master")
9230: 3b 0a 20 20 20 20 72 65 74 20 3d 20 73 71 6c 69 ;. ret = sqli
9240: 74 65 33 5f 67 65 74 5f 74 61 62 6c 65 20 28 64 te3_get_table (d
9250: 62 2c 20 73 71 6c 2c 20 26 72 65 73 75 6c 74 73 b, sql, &results
9260: 2c 20 26 72 6f 77 73 2c 20 26 63 6f 6c 75 6d 6e , &rows, &column
9270: 73 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 69 66 s, NULL);. if
9280: 20 28 72 65 74 20 21 3d 20 53 51 4c 49 54 45 5f (ret != SQLITE_
9290: 4f 4b 29 0a 09 72 65 74 75 72 6e 3b 0a 20 20 20 OK)..return;.
92a0: 20 69 66 20 28 72 6f 77 73 20 3c 20 31 29 0a 09 if (rows < 1)..
92b0: 3b 0a 20 20 20 20 65 6c 73 65 0a 20 20 20 20 20 ;. else.
92c0: 20 7b 0a 09 20 20 66 6f 72 20 28 69 20 3d 20 31 {.. for (i = 1
92d0: 3b 20 69 20 3c 3d 20 72 6f 77 73 3b 20 69 2b 2b ; i <= rows; i++
92e0: 29 0a 09 20 20 20 20 20 20 63 6f 75 6e 74 20 3d ).. count =
92f0: 20 61 74 6f 69 20 28 72 65 73 75 6c 74 73 5b 28 atoi (results[(
9300: 69 20 2a 20 63 6f 6c 75 6d 6e 73 29 20 2b 20 30 i * columns) + 0
9310: 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 ]);. }.
9320: 73 71 6c 69 74 65 33 5f 66 72 65 65 5f 74 61 62 sqlite3_free_tab
9330: 6c 65 20 28 72 65 73 75 6c 74 73 29 3b 0a 0a 20 le (results);..
9340: 20 20 20 69 66 20 28 63 6f 75 6e 74 20 3e 20 30 if (count > 0
9350: 29 0a 09 72 65 74 75 72 6e 3b 0a 0a 2f 2a 20 61 )..return;../* a
9360: 6c 6c 20 72 69 67 68 74 2c 20 69 74 27 73 20 65 ll right, it's e
9370: 6d 70 74 79 3a 20 70 72 6f 63 65 65 64 69 6e 67 mpty: proceeding
9380: 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 2a to initialize *
9390: 2f 0a 20 20 20 20 73 74 72 63 70 79 20 28 73 71 /. strcpy (sq
93a0: 6c 2c 20 22 53 45 4c 45 43 54 20 49 6e 69 74 53 l, "SELECT InitS
93b0: 70 61 74 69 61 6c 4d 65 74 61 64 61 74 61 46 75 patialMetadataFu
93c0: 6c 6c 28 31 29 22 29 3b 0a 20 20 20 20 72 65 74 ll(1)");. ret
93d0: 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 65 63 20 = sqlite3_exec
93e0: 28 64 62 2c 20 73 71 6c 2c 20 4e 55 4c 4c 2c 20 (db, sql, NULL,
93f0: 4e 55 4c 4c 2c 20 26 65 72 72 5f 6d 73 67 29 3b NULL, &err_msg);
9400: 0a 20 20 20 20 69 66 20 28 72 65 74 20 21 3d 20 . if (ret !=
9410: 53 51 4c 49 54 45 5f 4f 4b 29 0a 20 20 20 20 20 SQLITE_OK).
9420: 20 7b 0a 09 20 20 66 70 72 69 6e 74 66 20 28 73 {.. fprintf (s
9430: 74 64 65 72 72 2c 20 22 49 6e 69 74 53 70 61 74 tderr, "InitSpat
9440: 69 61 6c 4d 65 74 61 64 61 74 61 46 75 6c 6c 28 ialMetadataFull(
9450: 29 20 65 72 72 6f 72 3a 20 25 73 5c 6e 22 2c 20 ) error: %s\n",
9460: 65 72 72 5f 6d 73 67 29 3b 0a 09 20 20 73 71 6c err_msg);.. sql
9470: 69 74 65 33 5f 66 72 65 65 20 28 65 72 72 5f 6d ite3_free (err_m
9480: 73 67 29 3b 0a 09 20 20 72 65 74 75 72 6e 3b 0a sg);.. return;.
9490: 20 20 20 20 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 }.}..stati
94a0: 63 20 76 6f 69 64 0a 64 6f 5f 76 65 72 73 69 6f c void.do_versio
94b0: 6e 20 28 29 0a 7b 0a 2f 2a 20 70 72 69 6e 74 69 n ().{./* printi
94c0: 6e 67 20 76 65 72 73 69 6f 6e 20 69 6e 66 6f 73 ng version infos
94d0: 20 2a 2f 0a 09 66 70 72 69 6e 74 66 28 20 73 74 */..fprintf( st
94e0: 64 65 72 72 2c 20 22 5c 6e 56 65 72 73 69 6f 6e derr, "\nVersion
94f0: 20 69 6e 66 6f 73 5c 6e 22 29 3b 0a 09 66 70 72 infos\n");..fpr
9500: 69 6e 74 66 28 20 73 74 64 65 72 72 2c 20 22 3d intf( stderr, "=
9510: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
9520: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
9530: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 5c 6e 22 29 3b 0a ==========\n");.
9540: 20 20 20 20 66 70 72 69 6e 74 66 20 28 73 74 64 fprintf (std
9550: 65 72 72 2c 20 22 65 78 69 66 5f 6c 6f 61 64 65 err, "exif_loade
9560: 72 20 2e 3a 20 25 73 5c 6e 22 2c 20 53 50 41 54 r .: %s\n", SPAT
9570: 49 41 4c 49 54 45 5f 56 45 52 53 49 4f 4e 29 3b IALITE_VERSION);
9580: 0a 09 66 70 72 69 6e 74 66 20 28 73 74 64 65 72 ..fprintf (stder
9590: 72 2c 20 22 74 61 72 67 65 74 20 43 50 55 20 2e r, "target CPU .
95a0: 2e 3a 20 25 73 5c 6e 22 2c 20 73 70 61 74 69 61 .: %s\n", spatia
95b0: 6c 69 74 65 5f 74 61 72 67 65 74 5f 63 70 75 20 lite_target_cpu
95c0: 28 29 29 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 ());. fprintf
95d0: 20 28 73 74 64 65 72 72 2c 20 22 6c 69 62 73 70 (stderr, "libsp
95e0: 61 74 69 61 6c 69 74 65 3a 20 25 73 5c 6e 22 2c atialite: %s\n",
95f0: 20 73 70 61 74 69 61 6c 69 74 65 5f 76 65 72 73 spatialite_vers
9600: 69 6f 6e 20 28 29 29 3b 0a 20 20 20 20 66 70 72 ion ());. fpr
9610: 69 6e 74 66 20 28 73 74 64 65 72 72 2c 20 22 6c intf (stderr, "l
9620: 69 62 73 71 6c 69 74 65 33 20 2e 2e 3a 20 25 73 ibsqlite3 ..: %s
9630: 5c 6e 22 2c 20 73 71 6c 69 74 65 33 5f 6c 69 62 \n", sqlite3_lib
9640: 76 65 72 73 69 6f 6e 20 28 29 29 3b 0a 20 20 20 version ());.
9650: 20 66 70 72 69 6e 74 66 20 28 73 74 64 65 72 72 fprintf (stderr
9660: 2c 20 22 5c 6e 22 29 3b 0a 7d 0a 0a 73 74 61 74 , "\n");.}..stat
9670: 69 63 20 76 6f 69 64 0a 64 6f 5f 68 65 6c 70 20 ic void.do_help
9680: 28 29 0a 7b 0a 2f 2a 20 70 72 69 6e 74 69 6e 67 ().{./* printing
9690: 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20 6c 69 the argument li
96a0: 73 74 20 2a 2f 0a 20 20 20 20 66 70 72 69 6e 74 st */. fprint
96b0: 66 20 28 73 74 64 65 72 72 2c 20 22 5c 6e 5c 6e f (stderr, "\n\n
96c0: 75 73 61 67 65 3a 20 65 78 69 66 5f 6c 6f 61 64 usage: exif_load
96d0: 65 72 20 41 52 47 4c 49 53 54 5c 6e 22 29 3b 0a er ARGLIST\n");.
96e0: 20 20 20 20 66 70 72 69 6e 74 66 20 28 73 74 64 fprintf (std
96f0: 65 72 72 2c 0a 09 20 20 20 20 20 22 3d 3d 3d 3d err,.. "====
9700: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
9710: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
9720: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
9730: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 5c 6e 22 29 3b 0a ==========\n");.
9740: 20 20 20 20 66 70 72 69 6e 74 66 20 28 73 74 64 fprintf (std
9750: 65 72 72 2c 0a 09 20 20 20 20 20 22 2d 68 20 6f err,.. "-h o
9760: 72 20 2d 2d 68 65 6c 70 20 20 20 20 20 20 20 20 r --help
9770: 20 20 20 20 20 20 20 20 20 20 20 20 70 72 69 6e prin
9780: 74 20 74 68 69 73 20 68 65 6c 70 20 6d 65 73 73 t this help mess
9790: 61 67 65 5c 6e 22 29 3b 0a 20 20 20 20 66 70 72 age\n");. fpr
97a0: 69 6e 74 66 20 28 73 74 64 65 72 72 2c 20 22 2d intf (stderr, "-
97b0: 76 20 6f 72 20 2d 2d 76 65 72 73 69 6f 6e 20 20 v or --version
97c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 p
97d0: 72 69 6e 74 20 76 65 72 73 69 6f 6e 20 69 6e 66 rint version inf
97e0: 6f 73 5c 6e 22 29 3b 0a 20 20 20 20 66 70 72 69 os\n");. fpri
97f0: 6e 74 66 20 28 73 74 64 65 72 72 2c 0a 09 20 20 ntf (stderr,..
9800: 20 20 20 22 2d 64 20 6f 72 20 2d 2d 64 62 2d 70 "-d or --db-p
9810: 61 74 68 20 20 20 20 70 61 74 68 6e 61 6d 65 20 ath pathname
9820: 20 20 20 20 74 68 65 20 53 70 61 74 69 61 4c 69 the SpatiaLi
9830: 74 65 20 64 62 20 70 61 74 68 5c 6e 22 29 3b 0a te db path\n");.
9840: 20 20 20 20 66 70 72 69 6e 74 66 20 28 73 74 64 fprintf (std
9850: 65 72 72 2c 0a 09 20 20 20 20 20 22 2d 44 20 6f err,.. "-D o
9860: 72 20 2d 2d 64 69 72 20 20 20 20 20 20 20 20 64 r --dir d
9870: 69 72 5f 70 61 74 68 20 20 20 20 20 74 68 65 20 ir_path the
9880: 44 49 52 20 70 61 74 68 20 63 6f 6e 74 61 69 6e DIR path contain
9890: 69 6e 67 20 45 58 49 46 20 66 69 6c 65 73 5c 6e ing EXIF files\n
98a0: 22 29 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 20 ");. fprintf
98b0: 28 73 74 64 65 72 72 2c 20 22 2d 66 20 6f 72 20 (stderr, "-f or
98c0: 2d 2d 66 69 6c 65 2d 70 61 74 68 20 20 66 69 6c --file-path fil
98d0: 65 5f 6e 61 6d 65 20 20 20 20 61 20 73 69 6e 67 e_name a sing
98e0: 6c 65 20 45 58 49 46 20 66 69 6c 65 5c 6e 5c 6e le EXIF file\n\n
98f0: 22 29 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 20 ");. fprintf
9900: 28 73 74 64 65 72 72 2c 20 22 79 6f 75 20 63 61 (stderr, "you ca
9910: 6e 20 73 70 65 63 69 66 79 20 74 68 65 20 66 6f n specify the fo
9920: 6c 6c 6f 77 69 6e 67 20 6f 70 74 69 6f 6e 73 20 llowing options
9930: 61 73 20 77 65 6c 6c 5c 6e 22 29 3b 0a 20 20 20 as well\n");.
9940: 20 66 70 72 69 6e 74 66 20 28 73 74 64 65 72 72 fprintf (stderr
9950: 2c 20 22 2d 2d 61 6e 79 2d 65 78 69 66 20 20 20 , "--any-exif
9960: 20 20 20 20 20 20 2a 64 65 66 61 75 6c 74 2a 5c *default*\
9970: 6e 22 29 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 n");. fprintf
9980: 20 28 73 74 64 65 72 72 2c 20 22 2d 2d 67 70 73 (stderr, "--gps
9990: 2d 65 78 69 66 2d 6f 6e 6c 79 5c 6e 5c 6e 22 29 -exif-only\n\n")
99a0: 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 20 28 73 ;. fprintf (s
99b0: 74 64 65 72 72 2c 20 22 2d 2d 6d 65 74 61 64 61 tderr, "--metada
99c0: 74 61 20 20 20 20 20 20 20 20 20 2a 64 65 66 61 ta *defa
99d0: 75 6c 74 2a 5c 6e 22 29 3b 0a 20 20 20 20 66 70 ult*\n");. fp
99e0: 72 69 6e 74 66 20 28 73 74 64 65 72 72 2c 20 22 rintf (stderr, "
99f0: 2d 2d 6e 6f 2d 6d 65 74 61 64 61 74 61 5c 6e 5c --no-metadata\n\
9a00: 6e 22 29 3b 0a 7d 0a 0a 69 6e 74 0a 6d 61 69 6e n");.}..int.main
9a10: 20 28 69 6e 74 20 61 72 67 63 2c 20 63 68 61 72 (int argc, char
9a20: 20 2a 61 72 67 76 5b 5d 29 0a 7b 0a 2f 2a 20 74 *argv[]).{./* t
9a30: 68 65 20 4d 41 49 4e 20 66 75 6e 63 74 69 6f 6e he MAIN function
9a40: 20 73 69 6d 70 6c 79 20 70 65 72 66 6f 72 6d 20 simply perform
9a50: 61 72 67 75 6d 65 6e 74 73 20 63 68 65 63 6b 69 arguments checki
9a60: 6e 67 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 3b ng */. int i;
9a70: 0a 20 20 20 20 69 6e 74 20 6e 65 78 74 5f 61 72 . int next_ar
9a80: 67 20 3d 20 41 52 47 5f 4e 4f 4e 45 3b 0a 20 20 g = ARG_NONE;.
9a90: 20 20 63 68 61 72 20 2a 70 61 74 68 20 3d 20 4e char *path = N
9aa0: 55 4c 4c 3b 0a 20 20 20 20 63 68 61 72 20 2a 64 ULL;. char *d
9ab0: 69 72 5f 70 61 74 68 20 3d 20 4e 55 4c 4c 3b 0a ir_path = NULL;.
9ac0: 20 20 20 20 63 68 61 72 20 2a 66 69 6c 65 5f 70 char *file_p
9ad0: 61 74 68 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 ath = NULL;.
9ae0: 69 6e 74 20 67 70 73 5f 6f 6e 6c 79 20 3d 20 30 int gps_only = 0
9af0: 3b 0a 20 20 20 20 69 6e 74 20 6d 65 74 61 64 61 ;. int metada
9b00: 74 61 20 3d 20 31 3b 0a 20 20 20 20 69 6e 74 20 ta = 1;. int
9b10: 65 72 72 6f 72 20 3d 20 30 3b 0a 20 20 20 20 73 error = 0;. s
9b20: 71 6c 69 74 65 33 20 2a 68 61 6e 64 6c 65 3b 0a qlite3 *handle;.
9b30: 20 20 20 20 69 6e 74 20 72 65 74 3b 0a 20 20 20 int ret;.
9b40: 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20 int cnt = 0;.
9b50: 20 20 76 6f 69 64 20 2a 63 61 63 68 65 3b 0a 20 void *cache;.
9b60: 20 20 20 66 6f 72 20 28 69 20 3d 20 31 3b 20 69 for (i = 1; i
9b70: 20 3c 20 61 72 67 63 3b 20 69 2b 2b 29 0a 20 20 < argc; i++).
9b80: 20 20 20 20 7b 0a 09 20 20 2f 2a 20 70 61 72 73 {.. /* pars
9b90: 69 6e 67 20 74 68 65 20 69 6e 76 6f 63 61 74 69 ing the invocati
9ba0: 6f 6e 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a on arguments */.
9bb0: 09 20 20 69 66 20 28 6e 65 78 74 5f 61 72 67 20 . if (next_arg
9bc0: 21 3d 20 41 52 47 5f 4e 4f 4e 45 29 0a 09 20 20 != ARG_NONE)..
9bd0: 20 20 7b 0a 09 09 73 77 69 74 63 68 20 28 6e 65 {...switch (ne
9be0: 78 74 5f 61 72 67 29 0a 09 09 20 20 7b 0a 09 09 xt_arg)... {...
9bf0: 20 20 63 61 73 65 20 41 52 47 5f 44 42 5f 50 41 case ARG_DB_PA
9c00: 54 48 3a 0a 09 09 20 20 20 20 20 20 70 61 74 68 TH:... path
9c10: 20 3d 20 61 72 67 76 5b 69 5d 3b 0a 09 09 20 20 = argv[i];...
9c20: 20 20 20 20 62 72 65 61 6b 3b 0a 09 09 20 20 63 break;... c
9c30: 61 73 65 20 41 52 47 5f 44 49 52 3a 0a 09 09 20 ase ARG_DIR:...
9c40: 20 20 20 20 20 64 69 72 5f 70 61 74 68 20 3d 20 dir_path =
9c50: 61 72 67 76 5b 69 5d 3b 0a 09 09 20 20 20 20 20 argv[i];...
9c60: 20 62 72 65 61 6b 3b 0a 09 09 20 20 63 61 73 65 break;... case
9c70: 20 41 52 47 5f 46 49 4c 45 3a 0a 09 09 20 20 20 ARG_FILE:...
9c80: 20 20 20 66 69 6c 65 5f 70 61 74 68 20 3d 20 61 file_path = a
9c90: 72 67 76 5b 69 5d 3b 0a 09 09 20 20 20 20 20 20 rgv[i];...
9ca0: 62 72 65 61 6b 3b 0a 09 09 20 20 7d 3b 0a 09 09 break;... };...
9cb0: 6e 65 78 74 5f 61 72 67 20 3d 20 41 52 47 5f 4e next_arg = ARG_N
9cc0: 4f 4e 45 3b 0a 09 09 63 6f 6e 74 69 6e 75 65 3b ONE;...continue;
9cd0: 0a 09 20 20 20 20 7d 0a 09 20 20 69 66 20 28 73 .. }.. if (s
9ce0: 74 72 63 61 73 65 63 6d 70 20 28 61 72 67 76 5b trcasecmp (argv[
9cf0: 69 5d 2c 20 22 2d 2d 68 65 6c 70 22 29 20 3d 3d i], "--help") ==
9d00: 20 30 0a 09 20 20 20 20 20 20 7c 7c 20 73 74 72 0.. || str
9d10: 63 6d 70 20 28 61 72 67 76 5b 69 5d 2c 20 22 2d cmp (argv[i], "-
9d20: 68 22 29 20 3d 3d 20 30 29 0a 09 20 20 20 20 7b h") == 0).. {
9d30: 0a 09 09 64 6f 5f 68 65 6c 70 20 28 29 3b 0a 09 ...do_help ();..
9d40: 09 72 65 74 75 72 6e 20 2d 31 3b 0a 09 20 20 20 .return -1;..
9d50: 20 7d 0a 09 20 20 69 66 20 28 73 74 72 63 61 73 }.. if (strcas
9d60: 65 63 6d 70 20 28 61 72 67 76 5b 69 5d 2c 20 22 ecmp (argv[i], "
9d70: 2d 2d 76 65 72 73 69 6f 6e 22 29 20 3d 3d 20 30 --version") == 0
9d80: 0a 09 20 20 20 20 20 20 7c 7c 20 73 74 72 63 6d .. || strcm
9d90: 70 20 28 61 72 67 76 5b 69 5d 2c 20 22 2d 76 22 p (argv[i], "-v"
9da0: 29 20 3d 3d 20 30 29 0a 09 20 20 20 20 7b 0a 09 ) == 0).. {..
9db0: 09 64 6f 5f 76 65 72 73 69 6f 6e 20 28 29 3b 0a .do_version ();.
9dc0: 09 09 72 65 74 75 72 6e 20 2d 31 3b 0a 09 20 20 ..return -1;..
9dd0: 20 20 7d 0a 09 20 20 69 66 20 28 73 74 72 63 61 }.. if (strca
9de0: 73 65 63 6d 70 20 28 61 72 67 76 5b 69 5d 2c 20 secmp (argv[i],
9df0: 22 2d 2d 64 62 2d 70 61 74 68 22 29 20 3d 3d 20 "--db-path") ==
9e00: 30 29 0a 09 20 20 20 20 7b 0a 09 09 6e 65 78 74 0).. {...next
9e10: 5f 61 72 67 20 3d 20 41 52 47 5f 44 42 5f 50 41 _arg = ARG_DB_PA
9e20: 54 48 3b 0a 09 09 63 6f 6e 74 69 6e 75 65 3b 0a TH;...continue;.
9e30: 09 20 20 20 20 7d 0a 09 20 20 69 66 20 28 73 74 . }.. if (st
9e40: 72 63 6d 70 20 28 61 72 67 76 5b 69 5d 2c 20 22 rcmp (argv[i], "
9e50: 2d 64 22 29 20 3d 3d 20 30 29 0a 09 20 20 20 20 -d") == 0)..
9e60: 7b 0a 09 09 6e 65 78 74 5f 61 72 67 20 3d 20 41 {...next_arg = A
9e70: 52 47 5f 44 42 5f 50 41 54 48 3b 0a 09 09 63 6f RG_DB_PATH;...co
9e80: 6e 74 69 6e 75 65 3b 0a 09 20 20 20 20 7d 0a 09 ntinue;.. }..
9e90: 20 20 69 66 20 28 73 74 72 63 61 73 65 63 6d 70 if (strcasecmp
9ea0: 20 28 61 72 67 76 5b 69 5d 2c 20 22 2d 2d 64 69 (argv[i], "--di
9eb0: 72 2d 70 61 74 68 22 29 20 3d 3d 20 30 29 0a 09 r-path") == 0)..
9ec0: 20 20 20 20 7b 0a 09 09 6e 65 78 74 5f 61 72 67 {...next_arg
9ed0: 20 3d 20 41 52 47 5f 44 49 52 3b 0a 09 09 63 6f = ARG_DIR;...co
9ee0: 6e 74 69 6e 75 65 3b 0a 09 20 20 20 20 7d 0a 09 ntinue;.. }..
9ef0: 20 20 69 66 20 28 73 74 72 63 6d 70 20 28 61 72 if (strcmp (ar
9f00: 67 76 5b 69 5d 2c 20 22 2d 44 22 29 20 3d 3d 20 gv[i], "-D") ==
9f10: 30 29 0a 09 20 20 20 20 7b 0a 09 09 6e 65 78 74 0).. {...next
9f20: 5f 61 72 67 20 3d 20 41 52 47 5f 44 49 52 3b 0a _arg = ARG_DIR;.
9f30: 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 20 20 20 ..continue;..
9f40: 20 7d 0a 09 20 20 69 66 20 28 73 74 72 63 61 73 }.. if (strcas
9f50: 65 63 6d 70 20 28 61 72 67 76 5b 69 5d 2c 20 22 ecmp (argv[i], "
9f60: 2d 2d 66 69 6c 65 2d 70 61 74 68 22 29 20 3d 3d --file-path") ==
9f70: 20 30 29 0a 09 20 20 20 20 7b 0a 09 09 6e 65 78 0).. {...nex
9f80: 74 5f 61 72 67 20 3d 20 41 52 47 5f 46 49 4c 45 t_arg = ARG_FILE
9f90: 3b 0a 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 20 ;...continue;..
9fa0: 20 20 20 7d 0a 09 20 20 69 66 20 28 73 74 72 63 }.. if (strc
9fb0: 6d 70 20 28 61 72 67 76 5b 69 5d 2c 20 22 2d 66 mp (argv[i], "-f
9fc0: 22 29 20 3d 3d 20 30 29 0a 09 20 20 20 20 7b 0a ") == 0).. {.
9fd0: 09 09 6e 65 78 74 5f 61 72 67 20 3d 20 41 52 47 ..next_arg = ARG
9fe0: 5f 46 49 4c 45 3b 0a 09 09 63 6f 6e 74 69 6e 75 _FILE;...continu
9ff0: 65 3b 0a 09 20 20 20 20 7d 0a 09 20 20 69 66 20 e;.. }.. if
a000: 28 73 74 72 63 61 73 65 63 6d 70 20 28 61 72 67 (strcasecmp (arg
a010: 76 5b 69 5d 2c 20 22 2d 2d 61 6e 79 2d 65 78 69 v[i], "--any-exi
a020: 66 22 29 20 3d 3d 20 30 29 0a 09 20 20 20 20 7b f") == 0).. {
a030: 0a 09 09 67 70 73 5f 6f 6e 6c 79 20 3d 20 30 3b ...gps_only = 0;
a040: 0a 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 20 20 ...continue;..
a050: 20 20 7d 0a 09 20 20 69 66 20 28 73 74 72 63 61 }.. if (strca
a060: 73 65 63 6d 70 20 28 61 72 67 76 5b 69 5d 2c 20 secmp (argv[i],
a070: 22 2d 2d 67 70 73 2d 65 78 69 66 2d 6f 6e 6c 79 "--gps-exif-only
a080: 22 29 20 3d 3d 20 30 29 0a 09 20 20 20 20 7b 0a ") == 0).. {.
a090: 09 09 67 70 73 5f 6f 6e 6c 79 20 3d 20 31 3b 0a ..gps_only = 1;.
a0a0: 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 20 20 20 ..continue;..
a0b0: 20 7d 0a 09 20 20 69 66 20 28 73 74 72 63 61 73 }.. if (strcas
a0c0: 65 63 6d 70 20 28 61 72 67 76 5b 69 5d 2c 20 22 ecmp (argv[i], "
a0d0: 2d 2d 6d 65 74 61 74 61 64 61 22 29 20 3d 3d 20 --metatada") ==
a0e0: 30 29 0a 09 20 20 20 20 7b 0a 09 09 6d 65 74 61 0).. {...meta
a0f0: 64 61 74 61 20 3d 20 31 3b 0a 09 09 63 6f 6e 74 data = 1;...cont
a100: 69 6e 75 65 3b 0a 09 20 20 20 20 7d 0a 09 20 20 inue;.. }..
a110: 69 66 20 28 73 74 72 63 61 73 65 63 6d 70 20 28 if (strcasecmp (
a120: 61 72 67 76 5b 69 5d 2c 20 22 2d 2d 6e 6f 2d 6d argv[i], "--no-m
a130: 65 74 61 64 61 74 61 22 29 20 3d 3d 20 30 29 0a etadata") == 0).
a140: 09 20 20 20 20 7b 0a 09 09 6d 65 74 61 64 61 74 . {...metadat
a150: 61 20 3d 20 30 3b 0a 09 09 63 6f 6e 74 69 6e 75 a = 0;...continu
a160: 65 3b 0a 09 20 20 20 20 7d 0a 09 20 20 66 70 72 e;.. }.. fpr
a170: 69 6e 74 66 20 28 73 74 64 65 72 72 2c 20 22 75 intf (stderr, "u
a180: 6e 6b 6e 6f 77 6e 20 61 72 67 75 6d 65 6e 74 3a nknown argument:
a190: 20 25 73 5c 6e 22 2c 20 61 72 67 76 5b 69 5d 29 %s\n", argv[i])
a1a0: 3b 0a 09 20 20 65 72 72 6f 72 20 3d 20 31 3b 0a ;.. error = 1;.
a1b0: 20 20 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 }. if (
a1c0: 65 72 72 6f 72 29 0a 20 20 20 20 20 20 7b 0a 09 error). {..
a1d0: 20 20 64 6f 5f 68 65 6c 70 20 28 29 3b 0a 09 20 do_help ();..
a1e0: 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 return -1;.
a1f0: 20 20 7d 0a 2f 2a 20 63 68 65 63 6b 69 6e 67 20 }./* checking
a200: 74 68 65 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f the arguments */
a210: 0a 20 20 20 20 69 66 20 28 21 70 61 74 68 29 0a . if (!path).
a220: 20 20 20 20 20 20 7b 0a 09 20 20 66 70 72 69 6e {.. fprin
a230: 74 66 20 28 73 74 64 65 72 72 2c 20 22 64 69 64 tf (stderr, "did
a240: 20 79 6f 75 20 66 6f 72 67 65 74 20 73 65 74 74 you forget sett
a250: 69 6e 67 20 74 68 65 20 2d 2d 64 62 2d 70 61 74 ing the --db-pat
a260: 68 20 61 72 67 75 6d 65 6e 74 20 3f 5c 6e 22 29 h argument ?\n")
a270: 3b 0a 09 20 20 65 72 72 6f 72 20 3d 20 31 3b 0a ;.. error = 1;.
a280: 20 20 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 }. if (
a290: 21 64 69 72 5f 70 61 74 68 20 26 26 20 21 66 69 !dir_path && !fi
a2a0: 6c 65 5f 70 61 74 68 29 0a 20 20 20 20 20 20 7b le_path). {
a2b0: 0a 09 20 20 66 70 72 69 6e 74 66 20 28 73 74 64 .. fprintf (std
a2c0: 65 72 72 2c 0a 09 09 20 20 20 22 64 69 64 20 79 err,... "did y
a2d0: 6f 75 20 66 6f 72 67 65 74 20 73 65 74 74 69 6e ou forget settin
a2e0: 67 20 74 68 65 20 2d 2d 64 69 72 5f 70 61 74 68 g the --dir_path
a2f0: 20 4f 52 20 2d 2d 66 69 6c 65 5f 70 61 74 68 20 OR --file_path
a300: 61 72 67 75 6d 65 6e 74 20 3f 5c 6e 22 29 3b 0a argument ?\n");.
a310: 09 20 20 65 72 72 6f 72 20 3d 20 31 3b 0a 20 20 . error = 1;.
a320: 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 64 69 }. if (di
a330: 72 5f 70 61 74 68 20 26 26 20 66 69 6c 65 5f 70 r_path && file_p
a340: 61 74 68 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 ath). {..
a350: 66 70 72 69 6e 74 66 20 28 73 74 64 65 72 72 2c fprintf (stderr,
a360: 0a 09 09 20 20 20 22 2d 2d 64 69 72 5f 70 61 74 ... "--dir_pat
a370: 68 20 41 4e 44 20 2d 2d 66 69 6c 65 5f 70 61 74 h AND --file_pat
a380: 68 20 61 72 67 75 6d 65 6e 74 20 61 72 65 20 6d h argument are m
a390: 75 74 75 61 6c 6c 79 20 65 78 63 6c 75 73 69 76 utually exclusiv
a3a0: 65 5c 6e 22 29 3b 0a 09 20 20 65 72 72 6f 72 20 e\n");.. error
a3b0: 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 = 1;. }.
a3c0: 20 69 66 20 28 65 72 72 6f 72 29 0a 20 20 20 20 if (error).
a3d0: 20 20 7b 0a 09 20 20 64 6f 5f 68 65 6c 70 20 28 {.. do_help (
a3e0: 29 3b 0a 09 20 20 72 65 74 75 72 6e 20 2d 31 3b );.. return -1;
a3f0: 0a 20 20 20 20 20 20 7d 0a 2f 2a 20 74 72 79 69 . }./* tryi
a400: 6e 67 20 74 6f 20 63 6f 6e 6e 65 63 74 20 74 68 ng to connect th
a410: 65 20 53 70 61 74 69 61 4c 69 74 65 20 44 42 20 e SpatiaLite DB
a420: 20 2a 2f 0a 20 20 20 20 72 65 74 20 3d 0a 09 73 */. ret =..s
a430: 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 76 32 20 28 qlite3_open_v2 (
a440: 70 61 74 68 2c 20 26 68 61 6e 64 6c 65 2c 0a 09 path, &handle,..
a450: 09 09 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 .. SQLITE_OPEN_R
a460: 45 41 44 57 52 49 54 45 20 7c 20 53 51 4c 49 54 EADWRITE | SQLIT
a470: 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 2c 20 4e E_OPEN_CREATE, N
a480: 55 4c 4c 29 3b 0a 20 20 20 20 69 66 20 28 72 65 ULL);. if (re
a490: 74 20 21 3d 20 53 51 4c 49 54 45 5f 4f 4b 29 0a t != SQLITE_OK).
a4a0: 20 20 20 20 20 20 7b 0a 09 20 20 66 70 72 69 6e {.. fprin
a4b0: 74 66 20 28 73 74 64 65 72 72 2c 20 22 63 61 6e tf (stderr, "can
a4c0: 6e 6f 74 20 6f 70 65 6e 20 27 25 73 27 3a 20 25 not open '%s': %
a4d0: 73 5c 6e 22 2c 20 70 61 74 68 2c 0a 09 09 20 20 s\n", path,...
a4e0: 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 20 sqlite3_errmsg
a4f0: 28 68 61 6e 64 6c 65 29 29 3b 0a 09 20 20 73 71 (handle));.. sq
a500: 6c 69 74 65 33 5f 63 6c 6f 73 65 20 28 68 61 6e lite3_close (han
a510: 64 6c 65 29 3b 0a 09 20 20 72 65 74 75 72 6e 20 dle);.. return
a520: 2d 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 -1;. }.
a530: 63 61 63 68 65 20 3d 20 73 70 61 74 69 61 6c 69 cache = spatiali
a540: 74 65 5f 61 6c 6c 6f 63 5f 63 6f 6e 6e 65 63 74 te_alloc_connect
a550: 69 6f 6e 20 28 29 3b 0a 20 20 20 20 73 70 61 74 ion ();. spat
a560: 69 61 6c 69 74 65 5f 69 6e 69 74 5f 65 78 20 28 ialite_init_ex (
a570: 68 61 6e 64 6c 65 2c 20 63 61 63 68 65 2c 20 30 handle, cache, 0
a580: 29 3b 0a 20 20 20 20 73 70 61 74 69 61 6c 69 74 );. spatialit
a590: 65 5f 61 75 74 6f 63 72 65 61 74 65 20 28 68 61 e_autocreate (ha
a5a0: 6e 64 6c 65 29 3b 0a 20 20 20 20 69 66 20 28 21 ndle);. if (!
a5b0: 63 68 65 63 6b 45 78 69 66 54 61 62 6c 65 73 20 checkExifTables
a5c0: 28 68 61 6e 64 6c 65 29 29 0a 20 20 20 20 20 20 (handle)).
a5d0: 7b 0a 09 20 20 66 70 72 69 6e 74 66 20 28 73 74 {.. fprintf (st
a5e0: 64 65 72 72 2c 0a 09 09 20 20 20 22 41 6e 20 45 derr,... "An E
a5f0: 58 49 46 20 74 61 62 6c 65 20 69 73 20 61 6c 72 XIF table is alr
a600: 65 61 64 79 20 64 65 66 69 6e 65 64 2c 20 62 75 eady defined, bu
a610: 74 20 68 61 73 20 69 6e 63 6f 6d 70 61 74 69 62 t has incompatib
a620: 6c 65 20 63 6f 6c 75 6d 6e 73 5c 6e 5c 6e 53 6f le columns\n\nSo
a630: 72 72 79 20 2e 2e 2e 5c 6e 22 29 3b 0a 09 20 20 rry ...\n");..
a640: 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 20 28 68 sqlite3_close (h
a650: 61 6e 64 6c 65 29 3b 0a 09 20 20 72 65 74 75 72 andle);.. retur
a660: 6e 20 2d 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 n -1;. }.
a670: 20 20 69 66 20 28 64 69 72 5f 70 61 74 68 29 0a if (dir_path).
a680: 09 63 6e 74 20 3d 20 6c 6f 61 64 5f 64 69 72 20 .cnt = load_dir
a690: 28 68 61 6e 64 6c 65 2c 20 64 69 72 5f 70 61 74 (handle, dir_pat
a6a0: 68 2c 20 67 70 73 5f 6f 6e 6c 79 2c 20 6d 65 74 h, gps_only, met
a6b0: 61 64 61 74 61 29 3b 0a 20 20 20 20 65 6c 73 65 adata);. else
a6c0: 0a 09 63 6e 74 20 3d 20 6c 6f 61 64 5f 66 69 6c ..cnt = load_fil
a6d0: 65 20 28 68 61 6e 64 6c 65 2c 20 66 69 6c 65 5f e (handle, file_
a6e0: 70 61 74 68 2c 20 67 70 73 5f 6f 6e 6c 79 2c 20 path, gps_only,
a6f0: 6d 65 74 61 64 61 74 61 29 3b 0a 20 20 20 20 72 metadata);. r
a700: 65 74 20 3d 20 73 71 6c 69 74 65 33 5f 63 6c 6f et = sqlite3_clo
a710: 73 65 20 28 68 61 6e 64 6c 65 29 3b 0a 20 20 20 se (handle);.
a720: 20 69 66 20 28 72 65 74 20 21 3d 20 53 51 4c 49 if (ret != SQLI
a730: 54 45 5f 4f 4b 29 0a 09 66 70 72 69 6e 74 66 20 TE_OK)..fprintf
a740: 28 73 74 64 65 72 72 2c 20 22 73 71 6c 69 74 65 (stderr, "sqlite
a750: 33 5f 63 6c 6f 73 65 28 29 20 65 72 72 6f 72 3a 3_close() error:
a760: 20 25 73 5c 6e 22 2c 0a 09 09 20 73 71 6c 69 74 %s\n",... sqlit
a770: 65 33 5f 65 72 72 6d 73 67 20 28 68 61 6e 64 6c e3_errmsg (handl
a780: 65 29 29 3b 0a 20 20 20 20 73 70 61 74 69 61 6c e));. spatial
a790: 69 74 65 5f 63 6c 65 61 6e 75 70 5f 65 78 20 28 ite_cleanup_ex (
a7a0: 63 61 63 68 65 29 3b 0a 20 20 20 20 69 66 20 28 cache);. if (
a7b0: 63 6e 74 29 0a 09 66 70 72 69 6e 74 66 20 28 73 cnt)..fprintf (s
a7c0: 74 64 65 72 72 2c 0a 09 09 20 22 5c 6e 5c 6e 2a tderr,... "\n\n*
a7d0: 2a 2a 20 20 20 25 64 20 45 58 49 46 20 70 68 6f ** %d EXIF pho
a7e0: 74 6f 25 73 20 73 75 63 63 65 73 73 66 75 6c 6c to%s successfull
a7f0: 79 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 20 y inserted into
a800: 74 68 65 20 44 42 5c 6e 22 2c 0a 09 09 20 63 6e the DB\n",... cn
a810: 74 2c 20 28 63 6e 74 20 3e 20 31 29 20 3f 20 22 t, (cnt > 1) ? "
a820: 73 20 77 68 65 72 65 22 20 3a 20 22 20 77 61 73 s where" : " was
a830: 22 29 3b 0a 20 20 20 20 73 70 61 74 69 61 6c 69 ");. spatiali
a840: 74 65 5f 73 68 75 74 64 6f 77 6e 20 28 29 3b 0a te_shutdown ();.
a850: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a return 0;.}.