/*--------------------------------------------------------------------
 * FICHERO:  BdtCreOb.c
 * OBJETIVO: Definir las funciones Bdt_CreaObjeto(), Bdt_Cierra() y
 *           Bdt_Destruye()
 * AUTOR:    Pedro Reina
 * FECHA:    S.17.6.1995
 *------------------------------------------------------------------*/

/*--------------------------------------------------------------------
 * Ficheros de cabecera
 *------------------------------------------------------------------*/

#include "BaseDato.h"

/*--------------------------------------------------------------------
 * Definicin de funciones
 *------------------------------------------------------------------*/

/*--------------------------------------------------------------------
 * FUNCION:  Bdt_CreaObjeto()
 * OBJETIVO: Crear un objeto "basedato" y darle valores iniciales
 * ENTRADAS: Ninguna
 * SALIDAS:  Un objeto basedato o NIL si no se puede crear
 * EJEMPLO:  Bdt_CreaObjeto ()
 *------------------------------------------------------------------*/
basedato Bdt_CreaObjeto()
  {
  basedato Nuevo;

  if ( Nuevo = (basedato) (Mem_Crea (sizeof(Bdt_st))) )
    { Mem_Asigna (Nuevo,0,sizeof(Bdt_st)); } /* Puesta a cero de todo */
  else
    {
    Usr_Avisa ("No se puede crear una base de datos por falta de memoria");
    }

  return ( Nuevo );
  }

/*--------------------------------------------------------------Olimpo
 * FUNCION:  Bdt_Cierra()
 * OBJETIVO: Cerrar una base de datos
 * ENTRADAS: La base de datos
 * SALIDAS:  Ninguna
 * EJEMPLO:  Bdt_Cierra ( Agenda )
 * ALGORITMO:
 *      Si la base se ha abierto en modo de actualizacin y
 *                    ha sido modificado
 *         Actualizar en DescriptorFichero el ao, mes, da y nmero
 *                    de registros
 *         Grabar el descriptor de fichero
 *      Cerrar el fichero asociado a la base de datos
 *      Destruirla
 *------------------------------------------------------------------*/
void Bdt_Cierra ( BaseDato )
basedato BaseDato;
  {
  if ( Bdt_ModoApertura(BaseDato) == BDT_ACTUALIZACION  &&
       Bdt_Modificado(BaseDato) )
    {
    Bdt_PonAnoUltimo (BaseDato, Tim_Ano());
    Bdt_PonMesUltimo (BaseDato, Tim_Mes());
    Bdt_PonDiaUltimo (BaseDato, Tim_Dia());

    Mem_EscribeEntero (Bdt_DescriptorFichero(BaseDato)+4, MEM_INTEL,
                       Bdt_TotalRegistro (BaseDato));

    Fch_Coloca (Bdt_Fichero(BaseDato),0);
    Fch_EscribeOcteto (Bdt_Fichero(BaseDato),Bdt_DescriptorFichero(BaseDato),
                       BDT_LONGDESCRIPTOR);
    }

  Fch_Cierra ( Bdt_Fichero(BaseDato) );
  Bdt_Destruye (BaseDato);
  }

/*--------------------------------------------------------------------
 * FUNCION:  Bdt_Destruye()
 * OBJETIVO: Destruir un objeto base de datos, liberando su memoria
 * ENTRADAS: La base de datos
 * SALIDAS:  Ninguna
 * EJEMPLO:  Bdt_Destruye ( Agenda )
 * ALGORITMO:
 *      Si se ha reservado memoria para DescriptoresCampo, liberarla
 *      Si se ha reservado memoria para InfoActual, liberarla
 *      Liberar la memoria del objeto base de datos
 *------------------------------------------------------------------*/
void Bdt_Destruye ( BaseDato )
basedato BaseDato;
  {
  if ( Bdt_DescriptoresCampo(BaseDato) )
    { Mem_Destruye (Bdt_DescriptoresCampo(BaseDato)); }

  if ( Bdt_InfoActual(BaseDato) )
    { Mem_Destruye (Bdt_InfoActual(BaseDato)); }

  Mem_Destruye (BaseDato);
  }