Skip to content

Commit 1384bdd

Browse files
committed
fix package insert statement
1 parent 2f20614 commit 1384bdd

File tree

5 files changed

+92
-61
lines changed

5 files changed

+92
-61
lines changed

src/deserializers.rs

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
use serde::{Deserialize, Deserializer, de};
2+
3+
#[derive(Deserialize)]
4+
#[serde(untagged)]
5+
enum FlexiBool {
6+
Bool(bool),
7+
String(String),
8+
}
9+
10+
pub fn empty_is_none<'de, D>(deserializer: D) -> Result<Option<String>, D::Error>
11+
where
12+
D: Deserializer<'de>,
13+
{
14+
let s: Option<String> = Option::deserialize(deserializer)?;
15+
Ok(s.filter(|s| !s.is_empty()))
16+
}
17+
18+
pub fn optional_u64<'de, D>(deserializer: D) -> Result<Option<u64>, D::Error>
19+
where
20+
D: Deserializer<'de>,
21+
{
22+
let s: Option<String> = Option::deserialize(deserializer)?;
23+
Ok(s.filter(|s| !s.is_empty())
24+
.and_then(|s| s.parse::<i64>().ok())
25+
.filter(|&n| n >= 0)
26+
.map(|n| n as u64))
27+
}
28+
29+
pub fn flexible_bool<'de, D>(deserializer: D) -> Result<Option<bool>, D::Error>
30+
where
31+
D: Deserializer<'de>,
32+
{
33+
match Option::<FlexiBool>::deserialize(deserializer)? {
34+
Some(FlexiBool::Bool(b)) => Ok(Some(b)),
35+
Some(FlexiBool::String(s)) => {
36+
match s.to_lowercase().as_str() {
37+
"true" | "yes" | "1" => Ok(Some(true)),
38+
"false" | "no" | "0" => Ok(Some(false)),
39+
"" => Ok(None), // Empty string becomes None
40+
_ => Err(de::Error::invalid_value(
41+
de::Unexpected::Str(&s),
42+
&"a valid boolean (true/false, yes/no, 1/0)",
43+
)),
44+
}
45+
}
46+
None => Ok(None),
47+
}
48+
}

src/main.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ use repository::PackageRepository;
1010
use rusqlite::Connection;
1111
use statements::Statements;
1212

13+
mod deserializers;
1314
mod models;
1415
mod repository;
1516
mod statements;

src/models.rs

Lines changed: 20 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
1-
use serde::{Deserialize, Deserializer, Serialize, de};
1+
use crate::deserializers::{empty_is_none, flexible_bool, optional_u64};
2+
3+
use serde::{Deserialize, Serialize};
24

35
#[derive(Debug, Clone, Deserialize, Serialize)]
46
pub enum ProvideStrategy {
@@ -44,52 +46,15 @@ impl PackageProvide {
4446
}
4547
}
4648

47-
fn empty_is_none<'de, D>(deserializer: D) -> Result<Option<String>, D::Error>
48-
where
49-
D: Deserializer<'de>,
50-
{
51-
let s: Option<String> = Option::deserialize(deserializer)?;
52-
Ok(s.filter(|s| !s.is_empty()))
53-
}
54-
55-
fn optional_number<'de, D>(deserializer: D) -> Result<Option<u64>, D::Error>
56-
where
57-
D: Deserializer<'de>,
58-
{
59-
let s: Option<String> = Option::deserialize(deserializer)?;
60-
Ok(s.filter(|s| !s.is_empty())
61-
.and_then(|s| s.parse::<i64>().ok())
62-
.filter(|&n| n >= 0)
63-
.map(|n| n as u64))
64-
}
65-
66-
fn opt_boolean_from_string<'de, D>(deserializer: D) -> Result<Option<bool>, D::Error>
67-
where
68-
D: Deserializer<'de>,
69-
{
70-
let s: Option<String> = Deserialize::deserialize(deserializer)?;
71-
s.map(|s| match s.to_lowercase().as_str() {
72-
"true" | "yes" | "1" => Some(true),
73-
"false" | "no" | "0" => Some(false),
74-
_ => None,
75-
})
76-
.ok_or_else(|| {
77-
de::Error::invalid_value(
78-
de::Unexpected::Option,
79-
&"a valid boolean (true/false, yes/no, 1/0)",
80-
)
81-
})
82-
}
83-
8449
#[derive(Debug, Default, Clone, Deserialize, Serialize)]
8550
pub struct RemotePackage {
86-
#[serde(deserialize_with = "opt_boolean_from_string", alias = "_disabled")]
51+
#[serde(deserialize_with = "flexible_bool", alias = "_disabled")]
8752
pub disabled: Option<bool>,
8853

8954
#[serde(alias = "_disabled_reason")]
9055
pub disabled_reason: Option<serde_json::Value>,
9156

92-
#[serde(default, deserialize_with = "optional_number")]
57+
#[serde(default, deserialize_with = "optional_u64")]
9358
pub rank: Option<u64>,
9459

9560
#[serde(default, deserialize_with = "empty_is_none")]
@@ -115,13 +80,13 @@ pub struct RemotePackage {
11580

11681
pub download_url: String,
11782

118-
#[serde(default, deserialize_with = "optional_number")]
83+
#[serde(default, deserialize_with = "optional_u64")]
11984
pub size_raw: Option<u64>,
12085

12186
#[serde(default, deserialize_with = "empty_is_none")]
12287
pub ghcr_pkg: Option<String>,
12388

124-
#[serde(default, deserialize_with = "optional_number")]
89+
#[serde(default, deserialize_with = "optional_u64")]
12590
pub ghcr_size_raw: Option<u64>,
12691

12792
pub ghcr_files: Option<Vec<String>>,
@@ -188,49 +153,49 @@ pub struct RemotePackage {
188153
#[serde(default, deserialize_with = "empty_is_none")]
189154
pub app_id: Option<String>,
190155

191-
#[serde(default, deserialize_with = "optional_number")]
156+
#[serde(default, deserialize_with = "optional_u64")]
192157
pub download_count: Option<u64>,
193158

194-
#[serde(default, deserialize_with = "optional_number")]
159+
#[serde(default, deserialize_with = "optional_u64")]
195160
pub download_count_month: Option<u64>,
196161

197-
#[serde(default, deserialize_with = "optional_number")]
162+
#[serde(default, deserialize_with = "optional_u64")]
198163
pub download_count_week: Option<u64>,
199164

200-
#[serde(default, deserialize_with = "opt_boolean_from_string")]
165+
#[serde(default, deserialize_with = "flexible_bool")]
201166
pub bundle: Option<bool>,
202167

203168
#[serde(default, deserialize_with = "empty_is_none")]
204169
pub bundle_type: Option<String>,
205170

206-
#[serde(default, deserialize_with = "opt_boolean_from_string")]
171+
#[serde(default, deserialize_with = "flexible_bool")]
207172
pub soar_syms: Option<bool>,
208173

209-
#[serde(default, deserialize_with = "opt_boolean_from_string")]
174+
#[serde(default, deserialize_with = "flexible_bool")]
210175
pub deprecated: Option<bool>,
211176

212-
#[serde(default, deserialize_with = "opt_boolean_from_string")]
177+
#[serde(default, deserialize_with = "flexible_bool")]
213178
pub desktop_integration: Option<bool>,
214179

215-
#[serde(default, deserialize_with = "opt_boolean_from_string")]
180+
#[serde(default, deserialize_with = "flexible_bool")]
216181
pub external: Option<bool>,
217182

218-
#[serde(default, deserialize_with = "opt_boolean_from_string")]
183+
#[serde(default, deserialize_with = "flexible_bool")]
219184
pub installable: Option<bool>,
220185

221-
#[serde(default, deserialize_with = "opt_boolean_from_string")]
186+
#[serde(default, deserialize_with = "flexible_bool")]
222187
pub portable: Option<bool>,
223188

224-
#[serde(default, deserialize_with = "opt_boolean_from_string")]
189+
#[serde(default, deserialize_with = "flexible_bool")]
225190
pub recurse_provides: Option<bool>,
226191

227-
#[serde(default, deserialize_with = "opt_boolean_from_string")]
192+
#[serde(default, deserialize_with = "flexible_bool")]
228193
pub trusted: Option<bool>,
229194

230195
#[serde(default, deserialize_with = "empty_is_none")]
231196
pub version_latest: Option<String>,
232197

233-
#[serde(default, deserialize_with = "opt_boolean_from_string")]
198+
#[serde(default, deserialize_with = "flexible_bool")]
234199
pub version_outdated: Option<bool>,
235200

236201
pub repology: Option<Vec<String>>,

src/repository.rs

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -133,7 +133,19 @@ impl<'a> PackageRepository<'a> {
133133
replaces,
134134
package.download_count,
135135
package.download_count_week,
136-
package.download_count_month
136+
package.download_count_month,
137+
package.bundle.unwrap_or(false),
138+
package.bundle_type,
139+
package.soar_syms.unwrap_or(false),
140+
package.deprecated.unwrap_or(false),
141+
package.desktop_integration,
142+
package.external,
143+
package.installable,
144+
package.portable,
145+
package.recurse_provides,
146+
package.trusted,
147+
package.version_latest,
148+
package.version_outdated
137149
])?;
138150
if inserted == 0 {
139151
return Ok(());

src/statements.rs

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -33,14 +33,19 @@ impl<'a> Statements<'a> {
3333
source_urls, tags, categories, build_id, build_date,
3434
build_action, build_script, build_log, provides, snapshots,
3535
repology, replaces, download_count, download_count_week,
36-
download_count_month
36+
download_count_month, bundle, bundle_type, soar_syms,
37+
deprecated, desktop_integration, external, installable,
38+
portable, recurse_provides, trusted, version_latest,
39+
version_outdated
3740
)
3841
VALUES
3942
(
40-
?1, jsonb(?2), ?3, ?4, ?5, ?6, ?7, ?8, ?9, ?10, ?11, ?12, ?13,
41-
jsonb(?14), ?15, ?16, ?17, ?18, jsonb(?19), ?20, ?21, ?22, ?23, ?24, ?25,
42-
?26, jsonb(?27), jsonb(?28), jsonb(?29), jsonb(?30), jsonb(?31), ?32, ?33, ?34, ?35, ?36,
43-
jsonb(?37), jsonb(?38), jsonb(?39), jsonb(?40), ?41, ?42, ?43
43+
?1, jsonb(?2), ?3, ?4, ?5, ?6, ?7, ?8, ?9, ?10, ?11, ?12,
44+
?13, jsonb(?14), ?15, ?16, ?17, ?18, jsonb(?19), ?20, ?21,
45+
?22, ?23, ?24, ?25, ?26, jsonb(?27), jsonb(?28), jsonb(?29),
46+
jsonb(?30), jsonb(?31), ?32, ?33, ?34, ?35, ?36, jsonb(?37),
47+
jsonb(?38), jsonb(?39), jsonb(?40), ?41, ?42, ?43, ?44,
48+
?45, ?46, ?47, ?48, ?49, ?50, ?51, ?52, ?53, ?54, ?55
4449
)
4550
ON CONFLICT (pkg_id, pkg_name, version) DO NOTHING",
4651
)?,

0 commit comments

Comments
 (0)