Hex Artifact Content
Not logged in

Artifact 556abdd8601d9ce78a5b24e5901afc0517921f15:


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;.}.