Stick it to THE MAN
Stick it to THE MAN

Reputation: 5701

C++ memory table

Can anyone recommend a lightweight open source C++ table data structure that has data access similar to a database table? (i.e. a 2D array but with named columns - ideally, each column will hold data of a single type [see below]).

I have had a quick look on Google, but have not found anything very useful.

The way I see it, these are the options available to me:

  1. Write my own from scratch (don't really want to invent the wheel)
  2. rip out the SimpleResult class from mySQL++ and hack around it
  3. use sqlite (don't know how lightwight this will be - since I don't need the querying engine and all the other stuff)
  4. Ask in here to see if anyone is aware of such a library

So here I am, choosing the quickest route (hopefully one that will also prove to be the the most efficient use of my time - since whatever is recommended here is likely to be peer reviewed).

So, can anyone recommend a C++ class/ set of classes that provides a "database table like" interface?

The main requirements are:

  1. Columns have names
  2. Cells can be accessed using row, column indexes
  3. I Can add rows and columns to the table (ideally, I can remove them too)
  4. (Nice to have): columns can have types, so it saves teh cost of converting to/from strings

[EDIT]

To further demonstrate how I want to use the library, please see the pseudo code below to see simple use of such a class (simple, meaning now iteration of rows and columns - which would be really cool). For now just keeping things simple:

typedef MemoryTable::ColType ColumnType;

table = new MemoryTable();

// Set up the structure (this can be modified later using removeColumn() etc
table->addColumn(ColumnType::Integer, 'id');
table->addColumn(ColumnType::String,  'name');
table->addColumn(ColumnType::Boolean, 'gender');
table->addColumn(ColumnType::Double,  'weight');

for (size_t i=0; i<10; i++)
{
    table->addRow();
    numrows = table->getNumRows();
    std::cout << "We now have " << numrows << " rows.\n";

    // Note can access cells using column name or index 
    // Also using generic value getter/setter methods. Can throw exception on type mismatch
    table->setValue(i, 'id', i*i);
    table->setValue(i, 'name', getRandomSimpsonCharacterName());

    //just to show use of a getter method
    table->setValue(i, 'gender', checkGender(table->getValue(i, 'name')));
    table->setValue(i, 3, guessWeight(table->getValue(i, 'name')));
}

Upvotes: 14

Views: 8120

Answers (6)

anon
anon

Reputation:

#include <iostream>
#include "a_table.h"

using namespace std;
using namespace ALib;

int main()
{
    Table table;
    table.AddColumn( Column( "id", Column::Integer ));
    cout << "We now have " <<table.Depth() << " rows.\n";
    TableRow row;
    row.push_back( TableValue( 42 ) );
    table.AddRow( row );
    cout << "We now have " <<table.Depth() << " rows.\n";
    string s = table.Value( 0, 0 ).AsString();
    cout << "row[0][0] is " << s << "\n";
    cout << "id[0] value is "
          << table.Value( table.ColumnIndex("id"),0).AsInteger();
}

Upvotes: 1

Max Lybbert
Max Lybbert

Reputation: 20039

If you want something smarter than std::map (my other answer), you may consider Berkeley DB, NetCDF, HDF5, trivial database or similar libraries. Unfortunately they often generate files, which seems to violate the title of the question.

You may also be interested in embedded systems, such as embedded MySQL, embedded Firebird, or SQL Server Compact.

Upvotes: 0

Max Lybbert
Max Lybbert

Reputation: 20039

Personally, I would use a std::map. Simply create an object type that represents a row:

struct person {
   int id;
   std::string name;
   bool gender;
   double weight;
};

std::map<std::string, person> table;

// ... insert data, etc.

std::cout << "Homer is " << table["Homer"].weight << " lbs.\n";
person p = table["Marge"];

Upvotes: 0

Draemon
Draemon

Reputation: 34711

I would go with sqlite or Berkeley DB. They're fast, are designed to run well with "in memory" tables. Google for "embedded database" for other options.

Upvotes: 3

rmn
rmn

Reputation: 2426

Can std::vector<std::vector<std::string/boost::any?> > be considered a candidate?

Upvotes: 2

Kirill V. Lyadvinsky
Kirill V. Lyadvinsky

Reputation: 99605

For creating from scratch (very big scratch) try Boost Multi-index Container. It is not really a database implementation but it could help.

Upvotes: 5

Related Questions