little bug fix
[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 DB_TEXT, product, DB_INT, id, DB_INT, algo, DB_TEXT, DB_BLOB);
71 }
72 else
73 {
74 e = this->db->query(this->db,
75 "SELECT f.path, fh.hash FROM file_hashes AS fh "
76 "JOIN files AS f ON fh.file = f.id "
77 "JOIN products AS p ON fh.product = p.id "
78 "WHERE p.name = ? AND fh.file = ? AND fh.algo = ?",
79 DB_TEXT, product, DB_INT, id, DB_INT, algo, DB_TEXT, DB_BLOB);
80 }
81 return e;
82 }
83
84 METHOD(pts_database_t, destroy, void,
85 private_pts_database_t *this)
86 {
87 this->db->destroy(this->db);
88 free(this);
89 }
90
91 /**
92 * See header
93 */
94 pts_database_t *pts_database_create(char *uri)
95 {
96 private_pts_database_t *this;
97
98 INIT(this,
99 .public = {
100 .create_file_enumerator = _create_file_enumerator,
101 .create_hash_enumerator = _create_hash_enumerator,
102 .destroy = _destroy,
103 },
104 .db = lib->db->create(lib->db, uri),
105 );
106
107 if (!this->db)
108 {
109 DBG1(DBG_TNC, "failed to connect to PTS file measurement database '%s'",
110 uri);
111 free(this);
112 return NULL;
113 }
114
115 return &this->public;
116 }
117