Why databases in a client-server course?
95% of all servers probably use some sort of database.
Examples we have looked at so far:
POP Mail database Gopher Directories and files HTTP Directories and files Fortune fortune database
Services which do not use a database include:
Examples of some common databases:
Example record:
Lastname Firstname MI ID Phone Email
Example table of these records:
Scherpbier Andrew W 42 x45026 andrew@sdsu.edu Over Ben D 57 x411 ben.d.over@sciences.sdsu.edu
Records can be fixed-length or variable-length.
Variable length records:
Examples:
Advantages:
Disadvantages:
Fixed-length records
Advantages:
Disadvantages:
Needed:A quick method to find a specific record.
Solution:Table Index
Two methods:
Keys are stored in a separate data structure:
Issues to consider when using indexes:
The decision of what to use depends on the use of the database.
Some data structures do not (easily) allow for duplicate keys.
Some solutions:
Other problems:
We will look at several databases
Oracle uses SQL (Structured Query Language)
RDBMS (Relational Database Management System)
Data is organized in tables with fixed-length records
API uses a pre-processor
Structure of database query:
EXEC SQL BEGIN DECLARE SECTION;
VARCHAR uid[20];
VARCHAR pwd[20];
float sal, comm;
char ename[11];
EXEC SQL END DECLARE SECTION;
EXEC SQL INCLUDE SQLCA;
main()
{
strcpy(uid.arr, "SCOTT"); uid.len=strlen(uid.arr);
strcpy(pwd.arr, "TIGER"); pwd.len=strlen(pwd.arr);
EXEC SQL WHENEVER SQLERROR STOP;
EXEC SQL CONNECT :uid IDENTIFIED BY :pwd;
EXEC SQL DECLARE C1 CURSOR FOR
SELECT ENAME,SAL,COMM
FROM EMP WHERE JOB='SALESMAN';
EXEC SQL OPEN C1;
EXEC SQL WHENEVER NOT FOUND STOP;
for (;;)
{
EXEC SQL FETCH C1 INTO :ename, :sal, :comm;
printf("%-10s\t\t%6.2f\t\t%6.2f\n", ename, sal, comm);
}
EXEC SQL CLOSE C1;
EXEC SQL WHENEVER SQLERROR CONTINUE;
EXEC SQL COMMIT WORK RELEASE;
exit(0);
}
Features(?):
Both key and data are stored in a struct:
typedef struct
{
char *dptr;
int dsize;
} datum;
The database uses two files: .pag and .dir
DBM *dbm_open(char *file, int flags, int mode);
void dbm_close(DBM *db);
datum dbm_fetch(DBM *db, datum key);
int dbm_store(DBM *db, datum key, datum content, int flags
int dbm_delete(DBM *db, datum key);
datum dbm_firstkey(DBM *db);
datum dbm_nextkey(DBM *db);
int dbm_error(DBM *db);
int dbm_clearerr(DBM *db);
#include <ndbm.h>
#include <stdio.h>
#include <fcntl.h>
typedef struct
{
char firstname[20];
char lastname[30];
char mi;
char id[15];
char email[40];
} Person;
main(int argc, char *argv[])
{
DBM *people;
datum data;
Person *person;
if (argc != 2) exit(1);
people = ndbm_open("people", O_RDWR, 0644);
key.dptr = argv[1];
key.dsize = strlen(argv[1]);
data = ndbm_fetch(people, key);
person = (Person *) data.dptr;
printf("%s %c %s: %s\n",
person->firstname,
person->mi,
person->lastname,
person->id);
dbm_close(people);
return 0;
}
GNU enhanced version of the dbm library
Features:
The library has a ndbm compatibility mode
Structure of programs is the same as ndbm programs
GDBM_FILE gdbm_open(char *name, int block_size, int read_write, int mode, void (*fatal_func)());
void gdbm_close(GDBM_FILE dbf);
int gdbm_store(GDBM_FILE dbf, datum key, datum content, int flag);
datum gdbm_fetch(GDBM_FILE dbf, datum key);
int gdbm_reorganize(GDBM_FILE dbf);
void gdbm_sync(GDBM_FILE dbf);
int gdbm_exists(GDBM_FILE dbf, datum key);
char *gdbm_strerror(gdbm_error errno);
int gdbm_setopt(GDBM_FILE dbf, int option, int *value, int size);
Public domain relational database
external schema (record) definition
General data entry/form capability
Fixed length records
Concurrent access control through table locking
#include <mbase.h>
#include "equipment.h"
main()
{
relation *rel;
/* Open relation */
rel = mb_inc("/usr/joe/equipment", strtokey("key"));
/* Locate a record */
equipment_rec.price_code = 114.20;
strcpy(equipment_rec.part_numb, "117");
mb_sel(rel, 0, &equipment_rec, EQUAL, NULL);
/* Change the found record */
equipment_rec.num_purch = 14;
strcpy(equipment_rec.customer, "Su");
strcpy(equipment_rec.part_numb, "112");
strcpy(equipment_rec.show_addr, "Dallas, TX");
equipment_rec.price_code = 12;
mb_upd(rel, &equipment_rec);
/* Cleanup */
mb_rmv(rel);
mb_exit(0);
}