Subsections


Examples

This section introduces a few complete simple examples that can be found in the directory prefix/share/doc/eyedb/examples. The README file describes the way to compile and run these examples.
The first two programs listed here introduce the generic C++ API of EYEDB while the two following programs presents the generated schema-oriented C++ API through the simple schema example introduced in this chapter. The last example shows EYEDBDBM instance manipulation.


Generic Query Example

This example introduces a simple query program which takes two arguments: the database name and an OQL construct. It executes the OQL construct and displays on its standard output the returned atoms.
// examples/C++Binding/generic/query/query.cc

#include <eyedb/eyedb.h>

using namespace std;

int
main(int argc, char *argv[])
{
  eyedb::init(argc, argv);

  if (argc != 3) {
    fprintf(stderr, "usage: %s <dbname> <query>\n", argv[0]);
    return 1;
  }

  eyedb::Exception::setMode(eyedb::Exception::ExceptionMode);

  try {
    eyedb::Connection conn;
    // connecting to the eyedb server
    conn.open();

    eyedb::Database db(argv[1]);

    // opening database argv[1]
    db.open(&conn, eyedb::Database::DBRW);

    // beginning a transaction
    db.transactionBegin();

    // performing the OQL query argv[2] using the eyedb::OQL interface
    eyedb::OQL q(&db, argv[2]);

    eyedb::ValueArray arr;
    q.execute(arr);

    cout << "###### Performing the OQL query " << argv[2] <<
      " using the eyedb::OQL interface" << endl;

    // for each value returned in the query, display it:
    for (int i = 0; i < arr.getCount(); i++) {
      // in case of the returned value is an oid, load it first:
      if (arr[i].type == eyedb::Value::OID) {
        eyedb::Object *o;
        db.loadObject(arr[i].oid, &o);
        cout << o;
        o->release();
      }
      else
        cout << arr[i] << endl;
    }

    // performing the same query using eyedb::OQLIterator interface
    // [1]: getting all returned values

    cout << "\n###### Performing the same query using eyedb::OQLIterator "
      "interface: getting all returned values" << endl;

    eyedb::OQLIterator iter(&db, argv[2]);
    eyedb::Value val;

    while (iter.next(val)) {
      // in case of the returned value is an oid, load it first:
      if (val.getType() == eyedb::Value::OID) {
        eyedb::Object *o;
        db.loadObject(val.oid, &o);
        cout << o;

        // in case of the returned object is a collection, display its
        // contents
        if (o->asCollection()) {
          eyedb::CollectionIterator citer(o->asCollection());
          cout << "contents BEGIN\n";
          eyedb::Object *co;
          while(citer.next(co)) {
            cout << co;
            co->release();
          }
          cout << "contents END\n\n";
        }
        // in case of the returned object is a class, display its
        // extent
        else if (o->asClass()) {
          eyedb::ClassIterator citer(o->asClass());
          cout << "extent BEGIN\n";
          eyedb::Object *co;
          while(citer.next(co)) {
            cout << co;
            co->release();
          }
          cout << "extent END\n\n";
        }

        o->release();
      }
      else
        cout << val << endl;
    }

    // [2]: getting only returned objects

    cout << "\n###### Performing the same query using eyedb::OQLIterator "
      "interface: getting only returned objects" << endl;

    eyedb::OQLIterator iter2(&db, argv[2]);
    eyedb::Object *o;

    while (iter2.next(o)) {
      cout << o;
      o->release();
    }

    // committing the transaction
    db.transactionCommit();
  }

  catch(eyedb::Exception &e) {
    cerr << argv[0] << ": " << e;
    eyedb::release();
    return 1;
  }

  eyedb::release();

  return 0;
}
For instance:
./query person "select Person"
./query EYEDBDBM "select class"


Generic Storing Example

This example introduces a simple store program which takes three arguments: the database name, a person name and a person age. It creates a new instance of person using the given name and age.
// examples/C++Binding/generic/store/store.cc

#include <eyedb/eyedb.h>

using namespace std;

int
main(int argc, char *argv[])
{
  eyedb::init(argc, argv);

  if (argc != 4) {
    fprintf(stderr, "usage: %s <dbname> <person_name> <person_age>\n",
            argv[0]);
    return 1;
  }

  eyedb::Exception::setMode(eyedb::Exception::ExceptionMode);

  try {
    eyedb::Connection conn;
    // connecting to the eyedb server
    conn.open();

    eyedb::Database db(argv[1]);

    // opening database argv[1]
    db.open(&conn, eyedb::Database::DBRW);

    // beginning a transaction
    db.transactionBegin();

    // looking for class 'Person'
    eyedb::Class *personClass = db.getSchema()->getClass("Person");

    // looking for the attribute 'name' and 'age' in the class 'Person'
    const eyedb::Attribute *name_attr = personClass->getAttribute("name");
    if (!name_attr) {
      fprintf(stderr, "cannot find name attribute in database\n");
      return 1;
    }

    const eyedb::Attribute *age_attr = personClass->getAttribute("age");

    if (!age_attr) {
      fprintf(stderr, "cannot find age attribute in database\n");
      return 1;
    }

    // instanciating a 'Person' object
    eyedb::Object *p = personClass->newObj(&db);

    // setting the name argv[2] to the new Person instance
    name_attr->setSize(p, strlen(argv[2])+1);
    name_attr->setValue(p, (eyedb::Data)argv[2], strlen(argv[2])+1, 0);

    // setting the age argv[3] to the new Person instance
    int age = atoi(argv[3]);
    age_attr->setValue(p, (eyedb::Data)&age, 1, 0);
    p->store();

    // committing the transaction
    db.transactionCommit();
  }

  catch(eyedb::Exception &e) {
    cerr << e;
    eyedb::release();
    return 1;
  }

  eyedb::release();

  return 0;
}
For instance:
./store person john 32
./store person mary 28


Schema-Oriented Query Example

This example introduces a simple schema-oriented query program which takes two arguments: the database name and an OQL construct. It executes the OQL construct and displays on its standard output the returned atoms.
// examples/C++Binding/schema-oriented/query/query.cc

#include "person.h"

using namespace std;

int
main(int argc, char *argv[])
{
  eyedb::init(argc, argv);
  person::init();

  if (argc != 3) {
    fprintf(stderr, "usage: %s <dbname> <query>\n", argv[0]);
    return 1;
  }

  eyedb::Exception::setMode(eyedb::Exception::ExceptionMode);

  try {
    eyedb::Connection conn;
    // connecting to the eyedb server
    conn.open();

    // opening database argv[1] using 'personDatabase' class
    personDatabase db(argv[1]);
    db.open(&conn, eyedb::Database::DBRW);

    // beginning a transaction
    db.transactionBegin();

    // performing the OQL query argv[2]
    eyedb::OQL q(&db, argv[2]);

    eyedb::ObjectArray arr;
    q.execute(arr);

    // for each Person returned in the query, display its name and age,
    // its address, its spouse name and age and its cars
    for (int i = 0; i < arr.getCount(); i++) {
      Person *p = Person_c(arr[i]);
      if (p) {
        cout << "name:    " << p->getName() << endl;
        cout << "age:     " << p->getAge() << endl;

        if (p->getAddr()->getStreet().size())
          cout << "street:  " << p->getAddr()->getStreet() << endl;

        if (p->getAddr()->getTown().size())
          cout << "town:    " << p->getAddr()->getTown() << endl;

        if (p->getSpouse()) {
          cout << "spouse_name: " << p->getSpouse()->getName() << endl;
          cout << "spouse_age:  " << p->getSpouse()->getAge() << endl;
        }

        eyedb::CollectionIterator iter(p->getCarsColl());
        Car *car;
        while (iter.next((eyedb::Object *&)car)) {
          cout << "car: #" << i << ": " <<
            car->getBrand() << ";" <<
            car->getNum() << endl;
        }
      }
    }

    // committing the transaction
    db.transactionCommit();
  }

  catch(eyedb::Exception &e) {
    cerr << argv[0] << ": " << e;
    eyedb::release();
    return 1;
  }

  eyedb::release();

  return 0;
}
For instance:
./query person "select Person"


Schema-Oriented Storing Example

This example introduces a simple schema-oriented store program which takes four arguments: the database name, a person name, a person age and the name of its spouse. It creates a new instance of person using the given name and age and mary this person to the spouse whose name is given.
// examples/C++Binding/schema-oriented/store/store.cc

#include "person.h"

int
main(int argc, char *argv[])
{
  // initializing the EyeDB layer
  eyedb::init(argc, argv);

  // initializing the person package
  person::init();

  if (argc != 5) {
    fprintf(stderr, "usage: %s <dbname> <person name> <person age> "
            "<spouse name>\n", argv[0]);
    return 1;
  }

  const char *dbname = argv[1];
  const char *name = argv[2];
  int age = atoi(argv[3]);
  const char *spouse_name = argv[4];

  eyedb::Exception::setMode(eyedb::Exception::ExceptionMode);

  try {
    eyedb::Connection conn;

    // connecting to the EyeDB server
    conn.open();

    // opening database dbname using 'personDatabase' class
    personDatabase db(dbname);
    db.open(&conn, eyedb::Database::DBRW);

    // beginning a transaction
    db.transactionBegin();

    // first looking for spouse
    eyedb::OQL q(&db, "select Person.name = \"%s\"", spouse_name);

    eyedb::ObjectArray arr;
    q.execute(arr);

    // if not found, returns an error
    if (!arr.getCount()) {
      fprintf(stderr, "cannot find spouse '%s'\n", spouse_name);
      return 1;
    }

    // (safe!) casting returned object
    Person *spouse = Person_c(arr[0]);

    // creating a Person
    Person *p = new Person(&db);

    p->setCstate(Sir);
    p->setName(name);
    p->setAge(age);

    p->setSpouse(spouse);

    // spouse is no more necessary: releasing it
    spouse->release();

    p->getAddr()->setStreet("voltaire");
    p->getAddr()->setTown("paris");

    // creating two cars
    Car *car1 = new Car(&db);
    car1->setBrand("renault");
    car1->setNum(18374);

    Car *car2 = new Car(&db);
    car2->setBrand("ford");
    car2->setNum(233491);

    // adding the cars to the created person
    p->addToCarsColl(car1);
    p->addToCarsColl(car2);

    // car pointers are no more necessary: releasing them
    car1->release();
    car2->release();

    // creating ten children
    for (int i = 0; i < 10; i++) {
      Person *c = new Person(&db);
      char tmp[64];

      c->setAge(i);
      sprintf( tmp, "%d", i);
      c->setName( (std::string(name) + std::string("_") + std::string(tmp)).c_str() );
      p->setInChildrenCollAt(i, c);
      c->release();
    }

    // storing all in database
    p->store(eyedb::RecMode::FullRecurs);

    // committing the transaction
    db.transactionCommit();

    // releasing p
    p->release();
  }

  catch(eyedb::Exception &e) {
    std::cerr << argv[0] << ": " << e;
    eyedb::release();
    return 1;
  }

  // releasing the EyeDB layer: this is not mandatory
  eyedb::release();

  return 0;
}
./store person wayne 34
./store person poppins 51


Simple Administration Example

This simple example introduces the way to manipulate objects in the EYEDBDBM database. This program:
  1. displays the schema of the EYEDBDBM database,
  2. displays the EYEDB user names,
  3. for each database, it displays the name, the database file and the user access information.
// examples/C++Binding/schema-oriented/admin/admin.cc

#include <eyedb/eyedb.h>

using namespace std;

static const char *
get_string_mode(eyedb::DBAccessMode mode)
{
  if (mode == eyedb::NoDBAccessMode)
    return "eyedb::NoDBAccessMode";
  if (mode == eyedb::ReadDBAccessMode)
    return "eyedb::ReadDBAccessMode";
  if (mode == eyedb::WriteDBAccessMode)
    return "eyedb::WriteDBAccessMode";
  if (mode == eyedb::ExecDBAccessMode)
    return "eyedb::ExecDBAccessMode";
  if (mode == eyedb::ReadWriteDBAccessMode)
    return "eyedb::ReadWriteDBAccessMode";
  if (mode == eyedb::ReadExecDBAccessMode)
    return "eyedb::ReadExecDBAccessMode";
  if (mode == eyedb::ReadWriteExecDBAccessMode)
    return "eyedb::ReadWriteExecDBAccessMode";
  if (mode == eyedb::AdminDBAccessMode)
    return "eyedb::AdminDBAccessMode";

  return NULL;
}

int
main(int argc, char *argv[])
{
  // initializing the eyedb layer
  eyedb::init(argc, argv);

  eyedb::Exception::setMode(eyedb::Exception::ExceptionMode);

  try {
    eyedb::Connection conn;

    // connecting to the eyedb server
    conn.open();

    // opening the database EYEDBDBM using 'dbmDataBase' class
    eyedb::DBMDatabase db("EYEDBDBM");
    db.open(&conn, eyedb::Database::DBRead);

    // beginning a transaction
    db.transactionBegin();

    // display the scheme on stdout
    cout << db.getSchema() << endl;

    // looking for all user
    eyedb::OQL q_user(&db, "select User");

    eyedb::ObjectArray user_arr;
    q_user.execute(user_arr);

    cout << "User List {" << endl;
    for (int i = 0; i < user_arr.getCount(); i++) {
      eyedb::UserEntry *user = (eyedb::UserEntry *)user_arr[i];
      cout << "\t" << user->name() << endl;
    }
    cout << "}\n" << endl;

    // looking for all database entry
    eyedb::OQL q_db(&db, "select eyedb::DBEntry");

    eyedb::ObjectArray db_arr;
    q_db.execute(db_arr);

    cout << "Database List {" << endl;

    for (int i = 0; i < db_arr.getCount(); i++) {
      eyedb::DBEntry *dbentry = (eyedb::DBEntry *)db_arr[i];
      cout << "\t" << dbentry->dbname() << " -> " << dbentry->dbfile() << endl;
      // looking for all user which has any permission on this
      // database
      eyedb::OQL q_useraccess(&db,
                              "select eyedb::DBUserAccess->dbentry->dbname = \"%s\"",
                              dbentry->dbname().c_str());
      eyedb::ObjectArray useraccess_arr;
      q_useraccess.execute(useraccess_arr);
      if (useraccess_arr.getCount()) {
        cout << "\tUser Access {" << endl;
        for (int j = 0; j < useraccess_arr.getCount(); j++) {
          eyedb::DBUserAccess *ua = (eyedb::DBUserAccess *)useraccess_arr[j];
          cout << "\t\t" << ua->user()->name() << " -> " <<
            get_string_mode(ua->mode()) << endl;
        }
        cout << "\t}" << endl;
      }
      cout << endl;
      useraccess_arr.garbage();
    }

    cout << "}" << endl;

    // releasing runtime pointers
    db_arr.garbage();
    user_arr.garbage();
  }

  catch(eyedb::Exception &e) {
    cerr << argv[0] << ": " << e;
    eyedb::release();
    return 1;
  }

  // releasing the eyedb layer: this is not mandatory
  eyedb::release();

  return 0;
}

EyeDB manual