[odb-users] Error trying to create schema with polymorphic pragma
    Stroud, Sean T 
    ststrou at sandia.gov
       
    Wed Sep 26 13:08:11 EDT 2012
    
    
  
Hi,
I get the following runtime error trying to create schema via the schema_catalog:
   Error: 1005 (HY000): Can't create table 'TEST_DB.Sensor_Product' (errno: 150)
I can't figure out what I am doing wrong.
Here are some details:
- I'm on RHEL 5.8
- I'm using ODB 2.1.0
- I have two classes Product and Sensor_Product (see files below).
- Sensor_Product inherits from Product.  Both use the "polymorphic" pragma.
- If I remove the "polymorphic" pragma, I no longer get the error.
Here is how I invoke odb on product.h and sensor_product.h:
  % which odb
  /home/ststrou/ODB2.1/odb-2.1.0-x86_64-linux-gnu/bin/odb
  % odb -d mysql -q -I /home/ststrou/ODB2.1_install/include --generate-schema --schema-format embedded product.h sensor_product.h
The "/home/ststrou/ODB2.1_install/" directory is where I've installed the odb 2.1.0 includes and libraries.
Here are the files I am using:
------------ file main.cc -----------------
#include <odb/database.hxx>
#include <odb/transaction.hxx>
#include <odb/mysql/database.hxx>
#include <odb/schema-catalog.hxx>
#include <iostream>
#include <stdlib.h>
using namespace std;
using namespace odb::core;
int main(int argc, char *argv[])
{
  try {
    auto_ptr<database> db (new odb::mysql::database (argc, argv));
    transaction t (db->begin ());
    schema_catalog::create_schema (*db);
    t.commit ();
  } catch ( odb::exception &ex) {
    cout << "Error: " << ex.what() << endl;
    exit(1);
  }
}
------------ file product.h -----------------
#ifndef Product_H
#define Product_H
#include <odb/core.hxx>
#pragma db object polymorphic
class Product {
  public:
    Product();
    virtual ~Product();
  protected:
    friend class odb::access;
    #pragma db id
    int  m_product_id;
};
#endif
------------ file product.cc -----------------
#include "product.h"
Product::Product()
{
  m_product_id = -1;
}
Product::~Product()
{
}
------------ file sensor_product.h -----------------
#ifndef Sensor_Product_H
#define Sensor_Product_H
#include "product.h"
#include <vector>
#include <odb/core.hxx>
#pragma db object polymorphic
class Sensor_Product : public Product {
  public:
    Sensor_Product();
    virtual ~Sensor_Product();
  private:
    friend class odb::access;
    #pragma db type("MEDIUMBLOB")
    std::vector<char> m_sensor_data;
};
#endif
------------ file sensor_product.cc -----------------
#include "sensor_product.h"
Sensor_Product::Sensor_Product()
{
}
Sensor_Product::~Sensor_Product()
{
}
    
    
More information about the odb-users
mailing list