/*
   Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.

   This program is free software; you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
   the Free Software Foundation; version 2 of the License.

   This program is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   GNU General Public License for more details.

   You should have received a copy of the GNU General Public License
   along with this program; if not, write to the Free Software
   Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301  USA
*/

#ifndef NDB_TABLE_GUARD_H
#define NDB_TABLE_GUARD_H

#include <ndbapi/NdbDictionary.hpp>

class Ndb_table_guard
{
public:
  Ndb_table_guard(NdbDictionary::Dictionary *dict)
    : m_dict(dict), m_ndbtab(NULL), m_invalidate(0)
  {}
  Ndb_table_guard(NdbDictionary::Dictionary *dict, const char *tabname)
    : m_dict(dict), m_ndbtab(NULL), m_invalidate(0)
  {
    DBUG_ENTER("Ndb_table_guard");
    init(tabname);
    DBUG_VOID_RETURN;
  }
  ~Ndb_table_guard()
  {
    DBUG_ENTER("~Ndb_table_guard");
    reinit();
    DBUG_VOID_RETURN;
  }
  void init(const char *tabname)
  {
    DBUG_ENTER("Ndb_table_guard::init");
    /* must call reinit() if already initialized */
    DBUG_ASSERT(m_ndbtab == NULL);
    m_ndbtab= m_dict->getTableGlobal(tabname);
    m_invalidate= 0;
    DBUG_PRINT("info", ("m_ndbtab: %p", m_ndbtab));
    DBUG_VOID_RETURN;
  }
  void reinit(const char *tabname= 0)
  {
    DBUG_ENTER("Ndb_table_guard::reinit");
    if (m_ndbtab)
    {
      DBUG_PRINT("info", ("m_ndbtab: %p  m_invalidate: %d",
                          m_ndbtab, m_invalidate));
      m_dict->removeTableGlobal(*m_ndbtab, m_invalidate);
      m_ndbtab= NULL;
      m_invalidate= 0;
    }
    if (tabname)
      init(tabname);
    DBUG_PRINT("info", ("m_ndbtab: %p", m_ndbtab));
    DBUG_VOID_RETURN;
  }
  const NdbDictionary::Table *get_table() { return m_ndbtab; }
  void invalidate() { m_invalidate= 1; }
  const NdbDictionary::Table *release()
  {
    DBUG_ENTER("Ndb_table_guard::release");
    const NdbDictionary::Table *tmp= m_ndbtab;
    DBUG_PRINT("info", ("m_ndbtab: %p", m_ndbtab));
    m_ndbtab = 0;
    DBUG_RETURN(tmp);
  }
private:
  NdbDictionary::Dictionary *m_dict;
  const NdbDictionary::Table *m_ndbtab;
  int m_invalidate;
};

#endif

