Greendb is an embeded database with rows and columns. Instead of SQL it provides a simple and efficient API. It is written in C++ and built on top of Sleeeycat (berkeley) database. Interfaces currently exists for perl, python, and guile, using SWIG. A GUI is in the works.
Here are some example in various languages. They should help get you started. If you have any other questions, use the Forums or email. There is no other documentation yet.
Sample in c++#include "greendb/greenenv.hh" #include "greendb/debug.hh" #include "greendb/table.hh" #include "greendb/schema.hh" #include "greendb/typemap.hh" #include "greendb/row.hh" #include "greendb/datum.hh" #include "greendb/strdatum.hh" #include "greendb/resultset.hh" #include <malloc.h> #include <assert.h> void print_row(Row* row) { for (size_t i = 0; i < row->size(); i++) { //Datum* val = row->get_column(i); //assert(val); std::cout<<row->to_string(i); if (i+1 < row->size()) { std::cout<<", "; } } std::cout<<std::endl; } void print_person(Row* row) { IntDatum* id = (IntDatum*)row->get_column("id"); fprintf(stdout, "id: %d", id->value()); StrDatum* name = (StrDatum*)row->get_column("name"); fprintf(stdout, "name: %s", name->value()); IntDatum* age = (IntDatum*)row->get_column("age"); fprintf(stdout, "age: %d", age->value()); } int main (int argc, char **argv) { static GreenEnv ge("."); g_message("greenenv: %s", ge.home()); // open people database char* table_name = "people"; ge.open (); Table table (table_name, ge); // get schema Schema* schema = table.get_schema(); // testing int datatype (not connected to any table) IntDatum* ii = new IntDatum(99); g_message(ii->repr()); g_message(ii->str()); Datum* dd = ii; g_message(dd->repr()); g_message(dd->str()); // create and fill database if it doesn't already exist if (!table.exists()) { // create type columns schema->add_column("id", TYPE_INT , 1); schema->add_column("name", TYPE_STRING , 1); schema->add_column("age", TYPE_INT , 1); // create datums for columns -- these are reusable int n=1; { Row* row = table.new_row(); row->set_int("id", n++ ); row->set_string("name", "Luke"); row->set_int("age", 23); table.save(row); } { // another way to create a row Row* row = table.new_row(); row->set_int("id", n++ ); row->set_string("name", "Mary"); row->set_int("age", 18); table.save(row); } { // demonstrate datum reuse IntDatum id(n++); StrDatum name("Mathew"); g_message("name %s", name.to_string()); IntDatum age(18); { // create a row Row* row = table.new_row(); row->set("id", id ); row->set("name", name ); row->set("age", age); table.save(row); } { // set columns and add another row Row* row = table.new_row(); id.set_int(n++); row->set("id", id ); name.set_string("Thomas"); row->set("name", name ); age=23; row->set("age", age); table.save(row); } } } { g_message("fetch by primary key 2"); IntDatum key(2); Row * row = table.fetch("id",key); fflush(stdout); assert(row != NULL); assert(strcmp(row->get_string("name"), "Mary")==0); print_row(row); // 2, Thomas, 23 print_person(row); row->close(); } { // fetch by name g_message("fetch by foreign key name Luke"); StrDatum key("Luke"); Row * row = table.fetch("name",key); assert(row != NULL); assert(strcmp(row->get_string("name"), "Luke")==0); print_row(row); // 4, Luke, 23 print_person(row); row->close(); } { g_message("fetch by foreign key age 18"); IntDatum key(18); { Row * row = table.fetch("age",key); print_row(row); // 1, Mathew, 18 print_person(row); row->close(); } } { g_message("fetch all by foreign key"); IntDatum key(18); ResultSet* rs = table.find_all("age", &key); while(rs->has_row()) { CursorRow* row = rs->row(); print_row(row); // 1, Mathew, 18 // 3, Mary, 18 rs->next(); } } table.close(); ge.close(); return 0; } |
Ruby Samplerequire 'greendb' def main table_name ="people" ge = Greendb::GreenEnv.new(".") begin ge.open(); table = Greendb::Table.new(table_name, ge); begin schema = table.get_schema(); if not table.exists() schema.add_column("id", Greendb::TYPE_INT , 1); schema.add_column("name", Greendb::TYPE_STRING , 1); schema.add_column("age", Greendb::TYPE_INT , 1); id = 1; names = ["Mathew", "Mary", "Luke", "James"] ages = [18,23,18,34] for index in (0..(names.length-1)) row = table.new_row(); row.set_int("id", id ); row.set_string("name", names[index]); row.set_int("age", ages[index]); table.save(row); id=id+1 end end id2 = Greendb::IntDatum.new(2) row= table.fetch("id", id2) print_row(schema, row) print_person(row) ensure table.close() end ensure ge.close() end end def each_colname(schema) for i in (0..(schema.size()-1)) yield schema.get_name(i) end end def each_column(row) for index in (0..(row.size-1)) yield row.get_column_n(index) end end def print_header(schema) ll=[] each_colname(schema) do |name| ll.push name end print ll.join(", "), "\n" end def print_row(schema, row) print "\n" ll=[] each_column(row) do |datum| ll.push datum.to_string end print ll.join(", "), "\n" end def print_person(row) print "id: ", row.get_column("id").to_string, "\n" print "name: ", row.get_column("name").to_string, "\n" print "age: ", row.get_column("age").to_string, "\n" end main Command line UtilitiesHere's an example of how these might be run../mktable people int id string name int age ./desc people people 0) int id 1) string name 2) int age ./addrow people 1 John 30 ./addrow people 4 Eric 18 ./addrow people 2 Bob 42 ./addrow people 3 Steve 18 ./list people people 1, John, 30 2, Bob, 42 3, Steve, 18 4, Eric, 18 |