Simple database: Difference between revisions

Content added Content deleted
m (→‎{{header|D}}: small change)
(D entry: shorter lines, modules themselves are namespaces, small formatting changes)
Line 637: Line 637:


=={{header|D}}==
=={{header|D}}==
<lang d>import std.stdio, std.string, std.csv, std.file, std.datetime, std.conv,
<lang d>import std.stdio, std.algorithm, std.string, std.conv, std.array,
std.array, std.algorithm;
std.file, std.csv, std.datetime;


immutable filename = "simdb.csv";
void main(in string[] args) {
struct Item {
if (args.length < 2 || args.length > 4)
string name, date, category;
return SimDB.printUsage();
}


void addItem(in string[] item) {
switch (args[1].toLower()) {
if (item.length < 3)
case "add" : SimDB.addItem(args); break;
case "latest" : SimDB.printLatest(args); break;
return printUsage();
auto db = load();
case "all" : SimDB.printAll(); break;
const date = text(cast(DateTime)Clock.currTime);
default : SimDB.printUsage(); break;
const cat = (item.length == 4) ? item[3] : "none";
}
db ~= Item(item[2], date, cat);
store(db);
}
}


void printLatest(in string[] a) {
private struct SimDB {
auto db = load();
static immutable filename = "simdb.csv";
if (db.empty)
static struct Item { string name, date, category; }
return writeln("No entries in database.");
db.sort!q{ a.date > b.date };
if (a.length == 3) {
foreach (item; db)
if (item.category == a[2])
writefln("%s, %s, %s", item.tupleof);
} else {
writefln("%s, %s, %s", db[0].tupleof);
}
}


static void addItem(in string[] a) {
void printAll() {
if (a.length < 3)
auto db = load();
if (db.empty)
return printUsage();
auto db = load();
return writeln("No entries in database.");
db.sort!q{ a.date < b.date };
auto date = (cast(DateTime)Clock.currTime()).text();
foreach (item; db)
auto cat = (a.length == 4) ? a[3] : "none";
db ~= Item(a[2], date, cat);
writefln("%s, %s, %s", item.tupleof);
}
store(db);
}


Item[] load() {
static void printLatest(in string[] a) {
auto db = load();
Item[] db;
if (db.empty)
if (filename.exists && filename.isFile) {
try {
return writeln("No entries in database.");
const text = filename.readText;
sort!("a.date > b.date")(db);
if (a.length == 3) {
if (!text.empty)
foreach (item; db)
db = csvReader!Item(text).array;
if (item.category == a[2])
} catch (CSVException e) {
writefln("%s, %s, %s", item.tupleof);
writeln(e.msg);
} else {
}
writefln("%s, %s, %s", db[0].tupleof);
}
}
}
return db;
}


void store(in Item[] db) {
static void printAll() {
auto db = load();
auto f = File(filename, "w+");
if (db.empty)
foreach (item; db)
f.writefln("%s,%s,%s", item.tupleof);
return writeln("No entries in database.");
}
sort!("a.date < b.date")(db);
foreach (item; db)
writefln("%s, %s, %s", item.tupleof);
}


static void printUsage() {
void printUsage() {
writeln("Usage:\n simdb cmd [categoryname]\n");
writeln(
`Usage:
writeln(" add\t add item, followed by optional category");
simdb cmd [categoryName]
writeln(" latest\t print last added item(s), followed by optional " ~
"category");
add add item, followed by optional category
latest print last added item(s), followed by optional category
writeln(" all\t print all");
all print all
writeln("\n for instance: add \"some item name\" " ~
"\"some category name\"");
}


For instance: add "some item name" "some category name"`);
static Item[] load() {
}
Item[] db;
if (exists(filename) && isFile(filename)) {
try {
if (const string text = readText(filename))
db = csvReader!Item(text).array();
} catch (CSVException e) {
writeln(e.msg);
}
}
return db;
}


static void store(in Item[] db) {
void main(in string[] args) {
if (args.length < 2 || args.length > 4)
auto f = File(filename, "w+");
foreach (item; db)
return printUsage();

f.writefln("%s,%s,%s", item.tupleof);
switch (args[1].toLower) {
case "add": addItem(args); break;
case "latest": printLatest(args); break;
case "all": printAll(); break;
default: printUsage(); break;
}
}
}</lang>
}</lang>
Line 757: Line 759:
all print all
all print all


for instance: add "some item name" "some category name"</pre>
For instance: add "some item name" "some category name"</pre>
File:
File:
<pre>item1,2013-Mar-03 15:01:00,cat1
<pre>item1,2013-Mar-03 15:01:00,cat1