check files in alphabetical order
[strongswan.git] / src / libimcv / tcg / pts / pts_database.c
1 /*
2 * Copyright (C) 2011 Sansar Choinyambuu
3 * HSR Hochschule fuer Technik Rapperswil
4 *
5 * This program is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License as published by the
7 * Free Software Foundation; either version 2 of the License, or (at your
8 * option) any later version. See <http://www.fsf.org/copyleft/gpl.txt>.
9 *
10 * This program is distributed in the hope that it will be useful, but
11 * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
12 * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
13 * for more details.
14 */
15
16 #include "pts_database.h"
17
18 #include <debug.h>
19 #include <crypto/hashers/hasher.h>
20
21
22 typedef struct private_pts_database_t private_pts_database_t;
23
24 /**
25 * Private data of a pts_database_t object.
26 *
27 */
28 struct private_pts_database_t {
29
30 /**
31 * Public pts_database_t interface.
32 */
33 pts_database_t public;
34
35 /**
36 * database instance
37 */
38 database_t *db;
39
40 };
41
42 METHOD(pts_database_t, create_file_enumerator, enumerator_t*,
43 private_pts_database_t *this, char *product)
44 {
45 enumerator_t *e;
46
47 /* look for all entries belonging to a product in the files table */
48 e = this->db->query(this->db,
49 "SELECT f.id, f.type, f.path FROM files AS f "
50 "JOIN product_file AS pf ON f.id = pf.file "
51 "JOIN products AS p ON p.id = pf.product "
52 "WHERE p.name = ?",
53 DB_TEXT, product, DB_INT, DB_INT, DB_TEXT);
54 return e;
55 }
56
57 METHOD(pts_database_t, create_hash_enumerator, enumerator_t*,
58 private_pts_database_t *this, char *product, pts_meas_algorithms_t algo,
59 int id, bool is_dir)
60 {
61 enumerator_t *e;
62
63 if (is_dir)
64 {
65 e = this->db->query(this->db,
66 "SELECT f.path, fh.hash FROM file_hashes AS fh "
67 "JOIN files AS f ON fh.file = f.id "
68 "JOIN products AS p ON fh.product = p.id "
69 "WHERE p.name = ? AND fh.directory = ? AND fh.algo = ? "
70 "ORDER BY f.path",
71 DB_TEXT, product, DB_INT, id, DB_INT, algo, DB_TEXT, DB_BLOB);
72 }
73 else
74 {
75 e = this->db->query(this->db,
76 "SELECT f.path, fh.hash FROM file_hashes AS fh "
77 "JOIN files AS f ON fh.file = f.id "
78 "JOIN products AS p ON fh.product = p.id "
79 "WHERE p.name = ? AND fh.file = ? AND fh.algo = ?",
80 DB_TEXT, product, DB_INT, id, DB_INT, algo, DB_TEXT, DB_BLOB);
81 }
82 return e;
83 }
84
85 METHOD(pts_database_t, destroy, void,
86 private_pts_database_t *this)
87 {
88 this->db->destroy(this->db);
89 free(this);
90 }
91
92 /**
93 * See header
94 */
95 pts_database_t *pts_database_create(char *uri)
96 {
97 private_pts_database_t *this;
98
99 INIT(this,
100 .public = {
101 .create_file_enumerator = _create_file_enumerator,
102 .create_hash_enumerator = _create_hash_enumerator,
103 .destroy = _destroy,
104 },
105 .db = lib->db->create(lib->db, uri),
106 );
107
108 if (!this->db)
109 {
110 DBG1(DBG_TNC, "failed to connect to PTS file measurement database '%s'",
111 uri);
112 free(this);
113 return NULL;
114 }
115
116 return &this->public;
117 }
118