A apresentação está carregando. Por favor, espere

A apresentação está carregando. Por favor, espere

LEIC/FEUP Tecnologia de Sistemas de Gestão de Bases de Dados

Apresentações semelhantes


Apresentação em tema: "LEIC/FEUP Tecnologia de Sistemas de Gestão de Bases de Dados"— Transcrição da apresentação:

0 Bases de dados OO Sumário Conceitos gerais Exemplo do ObjectStore)
Arquitectura Criação de objectos Gestão da concorrência Colecções Perguntas Índices Associações

1 LEIC/FEUP Tecnologia de Sistemas de Gestão de Bases de Dados Criação de BD qualquer uso de memória persistente requer a existência prévia de uma BD manipulação de BD baseia-se nos membros da classe os_database static os_database *create( const char *pathname, os_int32 mode = 0664, os_boolean if_exists_overwrite = 0, os_database *schema_database = 0 ); pathname é o nome da BD, a começar na raiz, ou na máquina os_database *db1 = os_database::create( "/ken/parts1" ); "tom:/user/bd" neste segundo caso teria que existir um servidor na máquina tom o modo da BD é o modo dos ficheiros Unix 0664 é -rw-rw-r-- se se pretender uma substituição de BD's pré-existentes põ-se o booleano em TRUE se schema_database = 0; a informação de esquema fica na própria BD, no caso contrário fica nessa BD, a qual tem que ter o seu próprio esquema local valor de retorno é um apontador para os_database Gabriel David

2 LEIC/FEUP Tecnologia de Sistemas de Gestão de Bases de Dados Mais operações em BD destruir uma BD com a função os_database::destroy() os_database *db1; db1->destroy() //executar fora de transacção curiosidade: um os_database::lookup() pode suceder mesmo depois de um destroy() no caso de a página referida estar ainda na cache os_database::destroy() abrir uma BD com a função os_database::open() static os_database *open( const char *pathname, os_boolean read_only, os_int32 create_mode, os_database *schema_database ); os_database *db1 = os_database::open( "/ken/parts1",0,0664 ); fechar os_database::close(); tem que haver tantos fechos como aberturas é a última abertura que determina o modo corrente de leitura, leitura/escrita Gabriel David

3 Informação sobre BD Tipo de abertura, membros de os_database
LEIC/FEUP Tecnologia de Sistemas de Gestão de Bases de Dados Informação sobre BD Tipo de abertura, membros de os_database os_boolean is_open() const; os_boolean is_open_read_write; Ex: fechar BD repetidamente abertas os_database *db1; while(db1-> is_open()) db1->close(); Obter a BD a partir do nome e vice-versa static os_database *lookup(const char *pathname); char *get_pathname() const; Gabriel David

4 Objectos Criação de objectos escalares
LEIC/FEUP Tecnologia de Sistemas de Gestão de Bases de Dados Objectos Criação de objectos escalares através da sobrecarga do ::operator new , definido genericamente extern void * operator new( size_t, os_database *where, os_typespec *typespec ); os_segment *where, os_object_cluster *where, os_typespec *part_type = new os_typespec("part"); part *a_part = new(db1, part_type) part(111); os_typespec é uma indicação de tipo com o objectivo de melhorar a segurança where destina-se à localização toda a memória reservada pelo ObjectStore inicializada a zero Gabriel David

5 LEIC/FEUP Tecnologia de Sistemas de Gestão de Bases de Dados Vectores extern void * operator new( size_t, os_database *where, os_typespec *typespec, os_int32 how_many ); os_segment *where, os_object_cluster *where, part *some_part = new(db1, part_type, 10) part[10]; how_many dá a dimensão do vector; e typespec o tipo dos elementos e não o do vector o valor de retorno é um apontador para memória persistente; o seu uso é muito semelhante ao dos apontadores em memória transitória Gabriel David

6 LEIC/FEUP Tecnologia de Sistemas de Gestão de Bases de Dados Typespecs Objectivo: aumentar a segurança do programa com a verificação de tipos. • são fornecidas as funções para os tipos fundamentais e construtores para as classes • cada especificação usada pela primeira vez cria um objecto em memória transitória; novas chamadas devolvem um apontador para este class employee{ public: char *name; employee(char* n) { name = new(os_database::of(this), os_typespec:: get_char(), strlen(n)+1) char[strlen(n)+1]; strcpy(name, n); } }; Tipos fundamentais static os_typespec *get_char(); static os_typespec*get_short(); int, long, float, double, long_double, pointer, signed_char, signed_short, signed_int, signed_long, unsigned_char, unsigned_short, unsigned_int, unsigned_long cria um subobjecto de tipo elementar (string), guarda-o em memória persistente e deixa um apontador na respectiva instância de empregado Gabriel David

7 Typespecs para classes
LEIC/FEUP Tecnologia de Sistemas de Gestão de Bases de Dados Typespecs para classes static os_typespec *get_os_typespec(); acrescentar esta função como membro da classe o gerador de esquemas fornece-lhe um corpo ela devolve um apontador para o typespec da classe se não for possível modificar a definição da classe (tipos pré-definidos, classes em bibliotecas, apontadores para classes e apontadores para pré-definidos), usar o construtor os_typespec: os_typespec *part_type = new os_typespec("part"); os_typespec *part_pointer_type = new os_typespec("part*"); os typespecs só devem ter alocação transitória Gabriel David

8 Typespecs parametrizados
LEIC/FEUP Tecnologia de Sistemas de Gestão de Bases de Dados Typespecs parametrizados Problema: precisamos de uma classe parametrizada que defina uma função para criar persistentemente uma instância da classe e uma instância do parâmetro. template <class T> class PT { void foo(os_database *db) { // criar PT<T> persistente new(db, "PT<???>") PT<T>(); // criar T persistente new(db, "???") T(); o o que pôr em ??? que as templates } do C++ saibam instanciar? }; template <class T> class PT { static os_typespec *get_os_typespec(); void foo(os_database *db) { new(db, PT<T>::get_os_typespec()) PT<T>(); new(db, <T>::get_os_typespec() ) T(); } }; class PT_parm { public: static os_typespec *get_os_typespec(); }; Gabriel David

9 Validade dos apontadores
LEIC/FEUP Tecnologia de Sistemas de Gestão de Bases de Dados Validade dos apontadores os apontadores persistentes (criados com new) podem ser usados como apontadores transitórios excepto: não os utilizar fora de uma transacção (perder-se-ia o controlo da concorrência e a recuperação de falhas) não os passar para processos não ObjectStore, com uma chamada de sistema ou comunicação inter-processos (se a desreferenciação originar uma falta de página o ObjectStore não será capaz de lidar com essa interrupção) o sistema tem um modo em que suporta apontadores inter-BD, à custa de maior dimensão nas tabelas de relocalização o sistema tem um modo em que mantém a validade dos apontadores persistentes inter- transacções os apontadores da memória persistente para a transitória só são válidos até ao fim da transacção mais exterior em que foram definidos Gabriel David

10 Gráfico da validade persistente transitória sempre válido
LEIC/FEUP Tecnologia de Sistemas de Gestão de Bases de Dados Gráfico da validade persistente transitória sempre válido válido dentro da transacção, ou sempre válido, conforme especificado válido dentro da transacção Gabriel David

11 LEIC/FEUP Tecnologia de Sistemas de Gestão de Bases de Dados Agrupamento básico objectos relacionados devem ficar próximos — por exemplo, no mesmo segmento. o membro <área>::of() devolve um apontador para a <área> em que o objecto do argumento se encontra extern os_typespec *char_type; class employee{ public: char *name; employee(char* n){ name= new(os_segment::of(this), char_type, strlen(n)+1) char[strlen(n)+1]; strcpy(name, n); } }; existe um segmento transitório; o código acima, e o new do ObjectStore em geral, podem ser utilizados para criar objectos transitórios também Gabriel David

12 Como chegar aos dados formas de recuperar a informação persistente:
LEIC/FEUP Tecnologia de Sistemas de Gestão de Bases de Dados Como chegar aos dados formas de recuperar a informação persistente: ¶x extracção (look-up) pelo nome persistente recuperação baseada no nome persistente navegação pesquisa cria-se uma raiz na BD através da criação de uma instância de os_database_root, para associar um nome a um ponto de entrada; pesquisa-se com os_database::find_root os_database *db1; part *a_part; os_typespec *part_type = new os_typespec("part"); a_part = new(db1, part_type) part(111); os_database_root *a_root = db1->create_root("part_0"); a_root->set_value(a_part) os_database *db1; part *a_part; os_database_root *a_root a_root= db1->find_root ("part_0"); if (a_root) a_part = (part*)(a_root->get_value(); Gabriel David


Carregar ppt "LEIC/FEUP Tecnologia de Sistemas de Gestão de Bases de Dados"

Apresentações semelhantes


Anúncios Google