2 * Copyright (C) 2012 Andreas Steffen
3 * HSR Hochschule fuer Technik Rapperswil
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>.
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
16 #include "imv_os_database.h"
18 #include <utils/debug.h>
20 typedef struct private_imv_os_database_t private_imv_os_database_t
;
23 * Private data of a imv_os_database_t object.
26 struct private_imv_os_database_t
{
29 * Public imv_os_database_t interface.
31 imv_os_database_t
public;
40 METHOD(imv_os_database_t
, check_packages
, status_t
,
41 private_imv_os_database_t
*this, imv_os_state_t
*state
,
42 enumerator_t
*package_enumerator
)
44 char *product
, *package
, *release
, *cur_release
;
46 chunk_t os_name
, os_version
, name
, version
;
48 size_t os_version_len
;
49 int pid
, gid
, security
;
50 int count
= 0, count_ok
= 0, count_no_match
= 0;
52 status_t status
= SUCCESS
;
55 state
->get_info(state
, &os_type
, &os_name
, &os_version
);
57 if (os_type
== OS_TYPE_ANDROID
)
59 /*no package dependency on Android version */
64 /* remove appended platform info */
65 pos
= memchr(os_version
.ptr
, ' ', os_version
.len
);
66 os_version_len
= pos ?
(pos
- os_version
.ptr
) : os_version
.len
;
69 product
= malloc(os_name
.len
+ 1 + os_version_len
+ 1);
70 sprintf(product
, "%.*s %.*s", os_name
.len
, os_name
.ptr
,
71 os_version_len
, os_version
.ptr
);
73 /* Get primary key of product */
74 e
= this->db
->query(this->db
,
75 "SELECT id FROM products WHERE name = ?",
76 DB_TEXT
, product
, DB_INT
);
82 if (!e
->enumerate(e
, &pid
))
90 while (package_enumerator
->enumerate(package_enumerator
, &name
, &version
))
92 /* Convert package name chunk to a string */
93 package
= malloc(name
.len
+ 1);
94 memcpy(package
, name
.ptr
, name
.len
);
95 package
[name
.len
] = '\0';
98 /* Get primary key of package */
99 e
= this->db
->query(this->db
,
100 "SELECT id FROM packages WHERE name = ?",
101 DB_TEXT
, package
, DB_INT
);
108 if (!e
->enumerate(e
, &gid
))
110 /* package not present in database for any product - skip */
111 if (os_type
== OS_TYPE_ANDROID
)
113 DBG2(DBG_IMV
, "package '%s' (%.*s) not found",
114 package
, version
.len
, version
.ptr
);
121 /* Convert package version chunk to a string */
122 release
= malloc(version
.len
+ 1);
123 memcpy(release
, version
.ptr
, version
.len
);
124 release
[version
.len
] = '\0';
126 /* Enumerate over all acceptable versions */
127 e
= this->db
->query(this->db
,
128 "SELECT release, security FROM versions "
129 "WHERE product = ? AND package = ?",
130 DB_INT
, pid
, DB_INT
, gid
, DB_TEXT
, DB_INT
);
141 while (e
->enumerate(e
, &cur_release
, &security
))
144 if (streq(release
, cur_release
))
156 DBG2(DBG_IMV
, "package '%s' (%s)%s is ok", package
, release
,
157 security ?
" [s]" : "");
162 DBG1(DBG_IMV
, "package '%s' (%s) no match", package
, release
);
168 /* package not present in database for this product - skip */
174 state
->set_count(state
, count
, count_no_match
, count_ok
);
179 METHOD(imv_os_database_t
, destroy
, void,
180 private_imv_os_database_t
*this)
182 this->db
->destroy(this->db
);
189 imv_os_database_t
*imv_os_database_create(char *uri
)
191 private_imv_os_database_t
*this;
195 .check_packages
= _check_packages
,
198 .db
= lib
->db
->create(lib
->db
, uri
),
204 "failed to connect to OS database '%s'", uri
);
209 return &this->public;