Managing Dynamic Data Structures with Lightweight Database

N

Neo

Below sample C code shows how to manage dynamic data structures with a
lightweight, memory-resident database via a Windows DLL (128 Kb).
During the 1st run, it creates john and mary, each with gender
attributes. During the 2nd run, it creates bob with gender and age
attributes. It also adds age attribute to existing john. During 3rd
run, it adds the attribute body-build-type to john, mary and bob.
During the 4th run, it creates sue with all attributes using low-level
functions. It also modifies john's age and deletes one of mary's build
attribute values. At the end of each run, it prints the persons,
attributes and their values stored in db. The data is stored in a
single file and its content can be also be managed via a small
database front end (250 KB). For more details, see www.dbfordummies.com

#include "stdafx.h"
#include "dbd.h"
#include "stdio.h"

int main(int argc, char* argv[])
{
Db_init();
int errCode = Db_FileSpec_set_r(_T("Db1.dbd"));

if (!Db_File_exists_b()){
// * This code is executed during 1st run *

// Create db file
errCode = Db_File_create_r(kDbSzDef_g);

// Open db file
errCode = Db_File_open_r();

// Create gender
Xp_process_r(_T("(new 'gender)"));

// Create a person named john and set his gender to male
Xp_process_r(_T("(new 'john 'person)"));
Xp_process_r(_T("(set+ john gender 'male)"));

// Create a person named mary and set her gender to female
Xp_process_r(_T("(new 'mary 'person)"));
Xp_process_r(_T("(set+ mary gender 'female)"));
}
else{
// Open db file
errCode = Db_File_open_r();

// If bob is missing in db
int* pBob = AStr_getDefN(_T("bob"));
if (!pBob){
// * This is code is executed during 2nd run *

// Create age,
Xp_process_r(_T("(new 'age)"));

// Create a person named bob
// Set his gender to male and age to 35
Xp_process_r(_T("(new 'bob 'person)"));
Xp_process_r(_T("(set+ bob gender 'male)"));
Xp_process_r(_T("(set+ bob age '35)"));

// Set john's age to 30
Xp_process_r(_T("(set+ john age '30)"));

// Get all person that are male
// Following prints john and bob
int* pQry = Xp_compile(
_T("(and (get person instance *) (get * gender male))"));
while (int* pPersonX=Xp_execute(pQry)){
TCHAR sName[kStrSz_g+1] = _T("");
N_Name_get(pPersonX, sName, kStrSz_g);
wprintf(_T("%s\n"), sName);
}
}
else{
int* pBuild = AStr_getDefN(_T("build"));
if (!pBuild){
// * This is code is executed during 3nd run *

// Create body build
Xp_process_r(_T("(new 'build)"));

// Set bob's build to tall
Xp_process_r(_T("(set+ bob build 'tall)"));

// Set mary's build to thin and petite
Xp_process_r(_T("(set+ mary build 'thin)"));
Xp_process_r(_T("(set+ mary build 'petite)"));
}
else{
int* pSue = AStr_getDefN(_T("sue"));
if (!pSue){
// * This is code is executed during 4th run *
// It uses low-level methods

// Create a person named sue
pSue = N_create();
int* pPerson = AStr_getDefN(_T("person"));
N_SVO_set(pPerson, pInst_g, pSue);
int* pStrSue = AStr_getStr(_T("sue"), TRUE);
N_SVO_set(pSue, pName_g, pStrSue);

// Set sue's gender to female
int* pGender = AStr_getDefN(_T("gender"));
int* pFemale = AStr_getDefN(_T("female"));
N_SVO_set(pSue, pGender, pFemale);

// Set sue's age to 21
int* pAge = AStr_getDefN(_T("age"));
int* pStr21 = AStr_getStr(_T("21"), TRUE);
int* pAge21 = N_ClsInst_get(pAge, pStr21, TRUE);
N_SVO_set(pSue, pAge, pAge21);

// Set sue's build to fat and short
N_EA_setV_wStr(pSue, pBuild, _T("fat"));
N_EA_setV_wStr(pSue, pBuild, _T("short"));

// Change john's age from 30 to 40
int* pJohn = AStr_getDefN(_T("john"));
int* pStr30 = AStr_getStr(_T("30"), TRUE);
int* pAge30 = N_ClsInst_get(pAge, pStr30, TRUE);
int* pStr40 = AStr_getStr(_T("40"), TRUE);
int* pAge40 = N_ClsInst_get(pAge, pStr40, TRUE);
N_SV_changeO(pJohn, pAge, pAge30, pAge40);

// Delete mary's build is thin
int* pMary = AStr_getDefN(_T("mary"));
int* pThin = AStr_getDefN(_T("thin"));
int* pSVO = N_SVO_get(pMary, pBuild, pThin);
N_delete(pSVO);
}
}
}
}


// * This is code is executed during all runs *
// Print each person's attributes and values

// During 1st run, prints:
// john gender male
// mary gender female

// During 2nd run, prints:
// john gender male
// john age 30
// mary gender female
// bob gender male
// bob age 35

// During 3rd run, prints:
// john gender male
// john age 30
// mary gender female
// mary build thin
// mary build petite
// bob gender male
// bob age 35
// bob build tall

// During 4th run, prints:
// john gender male
// john age 40
// mary gender female
// mary build petite
// bob gender male
// bob age 35
// bob build tall
// sue gender female
// sue age 21
// sue build fat
// sue build short

int* pQry = Xp_compile(_T("(get person instance *)"));
while (int* pPtX=Xp_execute(pQry)){
int* pA[256]; int* p = (int*)pA;
int* eS = Xp_Node(pPtX, p);
int* eSVO = Xp_S_getSVO(eS, p);
while (int* pSVO=Xp_execute(eSVO)){
int* pSub = N_SVO_getElem(pSVO, kSeqSub_g);
int* pVb = N_SVO_getElem(pSVO, kSeqVb_g);
int* pObj = N_SVO_getElem(pSVO, kSeqObj_g);
if (pVb != pName_g){
// Print "person attribute value"
TCHAR sPoint[kStrSz_g+1] = _T("");
N_Name_get(pSub, sPoint, kStrSz_g);

TCHAR sProp[kStrSz_g+1] = _T("");
N_Name_get(pVb, sProp, kStrSz_g);

TCHAR sVal[kStrSz_g+1] = _T("");
N_Name_get(pObj, sVal, kStrSz_g);

wprintf(_T("%s %s %s\n"), sPoint, sProp, sVal);
}
}
}


Db_File_save();
Db_File_close_r();
return 0;
}
 
C

CBFalconer

Neo said:
Below sample C code shows how to manage dynamic data structures
with a lightweight, memory-resident database via a Windows DLL
(128 Kb). During the 1st run, it creates john and mary, each with
gender attributes. During the 2nd run, it creates bob with gender
and age attributes. It also adds age attribute to existing john.
During 3rd run, it adds the attribute body-build-type to john,
mary and bob. During the 4th run, it creates sue with all
attributes using low-level functions. It also modifies john's age
and deletes one of mary's build attribute values. At the end of
each run, it prints the persons, attributes and their values
stored in db. The data is stored in a single file and its content
can be also be managed via a small database front end (250 KB).
For more details, see www.dbfordummies.com

#include "stdafx.h"
#include "dbd.h"
#include "stdio.h"

Try to fix it to use only standard C. There is no such thing as
stdafx.h, or dbd.h. So, as it stands, it is off-topic here.
stdio.h should be included with a <> enclosure.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Staff online

Members online

Forum statistics

Threads
473,766
Messages
2,569,569
Members
45,045
Latest member
DRCM

Latest Threads

Top