Skip to content

Commit 7ca9fe2

Browse files
committed
Basic PostgreSQL COPY output
1 parent 55cde4f commit 7ca9fe2

File tree

1 file changed

+51
-15
lines changed

1 file changed

+51
-15
lines changed

src/main.rs

Lines changed: 51 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -6,19 +6,20 @@ use std::fs::File;
66
use std::env;
77
use quick_xml::Reader;
88
use quick_xml::events::Event;
9-
use yaml_rust::{Yaml, YamlLoader};
9+
use yaml_rust::YamlLoader;
1010

1111
#[derive(Debug)]
1212
struct Column {
1313
name: String,
1414
path: String,
15-
value: String
15+
value: String,
16+
raw: bool
1617
}
1718

1819
fn main() {
1920
let args: Vec<_> = env::args().collect();
2021
if args.len() != 3 {
21-
println!("usage: {} <configfile> <xmlfile>", args[0]);
22+
eprintln!("usage: {} <configfile> <xmlfile>", args[0]);
2223
return;
2324
}
2425

@@ -37,30 +38,47 @@ fn main() {
3738

3839
let rowpath = config["rowpath"].as_str().expect("No valid 'rowpath' entry in configuration file");
3940
let colspec = config["columns"].as_vec().expect("No valid 'columns' array in configuration file");
40-
let namefield = &Yaml::from_str("name");
41-
let pathfield = &Yaml::from_str("path");
4241
let mut columns = Vec::new();
4342

4443
for col in colspec {
45-
let hash = col.as_hash().expect("Column entry is not a valid hash");
46-
let name = hash[namefield].as_str().unwrap();
47-
let colpath = hash[pathfield].as_str().unwrap();
48-
println!("Column name {} path {}", name, colpath);
44+
let name = col["name"].as_str().unwrap();
45+
let mut raw = false;
46+
if !col["raw"].is_badvalue() { raw = col["raw"].as_bool().unwrap() }
47+
let colpath = col["path"].as_str().unwrap();
48+
// println!("Column name {} path {}", name, colpath);
4949
let mut path = String::from(rowpath);
5050
path.push_str(colpath);
51-
columns.push(Column { name: name.to_string(), path: path, value: String::new() });
51+
columns.push(Column { name: name.to_string(), path: path, value: String::new(), raw: raw });
5252
}
5353

54+
let mut raw = false;
55+
let mut rawstr = String::new();
5456
loop {
5557
match reader.read_event(&mut buf) {
5658
Ok(Event::Start(ref e)) => {
5759
path.push('/');
5860
path.push_str(reader.decode(e.name()).unwrap());
59-
if path == rowpath {
61+
if raw {
62+
rawstr.push_str(&format!("<{}>", &e.unescape_and_decode(&reader).unwrap()));
63+
continue;
64+
}
65+
else if path == rowpath {
6066
count += 1;
6167
}
68+
else if path.len() > rowpath.len() {
69+
for i in 0..columns.len() {
70+
if path == columns[i].path {
71+
if columns[i].raw { raw = true; }
72+
break;
73+
}
74+
}
75+
}
6276
},
6377
Ok(Event::Text(ref e)) => {
78+
if raw {
79+
rawstr.push_str(&e.unescape_and_decode(&reader).unwrap());
80+
continue;
81+
}
6482
for i in 0..columns.len() {
6583
if path == columns[i].path {
6684
columns[i].value.push_str(&e.unescape_and_decode(&reader).unwrap());
@@ -69,17 +87,35 @@ fn main() {
6987
},
7088
Ok(Event::End(_)) => {
7189
if path == rowpath {
72-
println!("Insert row with id {}", columns[0].value);
73-
for i in 0..columns.len() { columns[i].value.clear(); }
90+
for i in 0..columns.len() {
91+
if i > 0 { print!("\t"); }
92+
if columns[i].value.is_empty() { print!("\\N"); }
93+
else {
94+
print!("{}", columns[i].value);
95+
columns[i].value.clear();
96+
}
97+
}
98+
println!("");
7499
}
75100
let i = path.rfind('/').unwrap();
76-
let _ = path.split_off(i);
101+
let tag = path.split_off(i);
102+
if raw {
103+
rawstr.push_str(&format!("<{}>", tag));
104+
for i in 0..columns.len() {
105+
if path == columns[i].path {
106+
raw = false;
107+
columns[i].value.push_str(&rawstr);
108+
rawstr.clear();
109+
break;
110+
}
111+
}
112+
}
77113
},
78114
Ok(Event::Eof) => break,
79115
Err(e) => panic!("Error at position {}: {:?}", reader.buffer_position(), e),
80116
_ => ()
81117
}
82118
buf.clear();
83119
}
84-
println!("{} rows processed", count);
120+
eprintln!("{} rows processed", count);
85121
}

0 commit comments

Comments
 (0)