📄 sugarmemodb.c
字号:
//SugarMemo Database Module
#include <PalmOS.h>
#include "SugarMemo.h"
#include "SugarMemoRsc.h"
#include "SugarMemoDB.h"
#include "SugarMemoTools.h"
#define HeaderBufferVolumn (UInt16)100
//*******************************************************************
//
// Globals
//
//*******************************************************************
DmOpenRef CurrentDB = NULL;
UInt16 CurrentRecord = noRecord;
//*******************************************************************
//
// Internal function declaration
//
//*******************************************************************
static UInt16 WordUnpackedSize(WordRecordType *record);
static void PackRecord(WordRecordType *record, MemPtr recordDBEntry);
static void UnpackRecord(WordPackedRecord *packed, WordRecordType *record);
static Int16 WordDBComparePackedRecords(WordPackedRecord * packed1, WordPackedRecord * packed2,
Int16 uselessinfo, SortRecordInfoPtr infoP1, SortRecordInfoPtr infoP2, MemHandle appinfoH);
static void TranslatePhonetic(char* field);
//*******************************************************************
//
// App info manipulation.
// 1.Get AppInfo Pointer
// 2.Init AppInfo Pointer
// 3.GetRawWordCount();
// 4.SetRawWordCount();
//
//*******************************************************************
//return locked app info pointer
SugarAppInfoType* GetAppInfoPtr(DmOpenRef dbP)
{
UInt16 cardNo;
LocalID dbID;
LocalID appInfoID;
if (DmOpenDatabaseInfo(dbP, &dbID, NULL, NULL, &cardNo, NULL))
return NULL;
if (DmDatabaseInfo(cardNo, dbID, NULL, NULL, NULL, NULL, NULL, NULL, NULL, &appInfoID, NULL, NULL, NULL))
return NULL;
if (appInfoID == 0)
return NULL;
else
return MemLocalIDToLockedPtr(appInfoID, cardNo);
}
Err SugarDBAppInfoInit(DmOpenRef db){
UInt16 cardNo;
LocalID dbID;
LocalID appInfoID;
MemHandle h;
SugarAppInfoType* app;
SugarAppInfoType* defaultP;
UInt8 i;
UInt16 bits = 0;
DateType zeroDate;
UInt16 version = 0;
app = GetAppInfoPtr(db);
if (app != NULL) {
version = app -> version;
MemPtrUnlock(app);
}
// if version check OK, return
if (version == CurrentVersion) return 0;
// clear old app info
if (DmOpenDatabaseInfo(db, &dbID, NULL, NULL, &cardNo, NULL)) return dmErrInvalidParam;
DmSetDatabaseInfo(cardNo, dbID, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
// Make space for new one
h = DmNewHandle(db, sizeof(SugarAppInfoType));
if (!h) return dmErrMemError;
appInfoID = MemHandleToLocalID(h);
if (DmSetDatabaseInfo(cardNo, dbID, NULL, NULL, NULL, NULL, NULL, NULL, NULL, &appInfoID, NULL, NULL, NULL))
{
MemHandleFree(h);
return 1;
}
app = MemHandleLock(h);
// Allocate & Clear the app info
defaultP = MemPtrNew(sizeof(SugarAppInfoType));
if (defaultP == NULL)
{
ErrDisplay("Unable to init App info");
return 1;
}
MemSet(defaultP, sizeof(SugarAppInfoType), 0);
/*
typedef struct {
UInt16 renamedCategories; // bitfield of categories with a different name
char categoryLabels[dmRecNumCategories][dmCategoryLength];
UInt8 categoryUniqIDs[dmRecNumCategories];
UInt8 lastUniqID; // Uniq IDs generated by the device are between
// 0 - 127. Those from the PC are 128 - 255.
UInt8 padding; // from the compiler word aligning things
DateType lastUpdated;
WordFieldFlags answerPageFields;
WordFieldFlags questionPageFields;
UInt16 rawWordCount;
UInt16 version;
FontID learnFieldFont[WordFieldsCount];
FontID learnFieldFont2[WordFieldsCount];
TextAlignment learnFieldAlignment[WordFieldsCount];
ReviewMode reviewMode;
UInt8 lefty;
} SugarAppInfoType; */
// Init the categories
for (i = 0; i < dmRecNumCategories; i++)
{
defaultP->categoryUniqIDs[i] = i;
}
defaultP->lastUniqID = dmRecNumCategories - 1;
// Set lastUpdated
DateSecondsToDate(0, &zeroDate);
defaultP->lastUpdated = zeroDate;
// Set question page field
bits = 0;
SetBitMacro(bits, WordFieldQuestion);
SetBitMacro(bits, WordFieldPhonetic);
defaultP -> questionPageFields.allBits = bits;
// Set answer page field
bits = 0;
SetBitMacro(bits, WordFieldPhonetic);
SetBitMacro(bits, WordFieldNote3);
defaultP -> answerPageFields.allBits = bits;
// Set raw word count to 0
defaultP -> rawWordCount = 0;
// Set version
defaultP -> version = CurrentVersion;
// Set LearnFieldFont
defaultP -> learnFieldFont[WordFieldQuestion] = OS5_16_Font;
defaultP -> learnFieldFont[WordFieldPhonetic] = PhoneticLargeFont;
defaultP -> learnFieldFont[WordFieldAnswer] = OS5_16_Font;
defaultP -> learnFieldFont[WordFieldWordNet] = stdFont;
defaultP -> learnFieldFont[WordFieldMerriamWebster] = stdFont;
defaultP -> learnFieldFont[WordFieldDict1] = stdFont;
defaultP -> learnFieldFont[WordFieldDict2] = stdFont;
defaultP -> learnFieldFont[WordFieldDict3] = stdFont;
defaultP -> learnFieldFont[WordFieldNote1] = stdFont;
defaultP -> learnFieldFont[WordFieldNote2] = stdFont;
defaultP -> learnFieldFont[WordFieldNote3] = boldFont;
// Set LearnFieldFont2
defaultP -> learnFieldFont2[WordFieldQuestion] = OS5_16_Font;
defaultP -> learnFieldFont2[WordFieldPhonetic] = PhoneticLargeFont;
defaultP -> learnFieldFont2[WordFieldAnswer] = OS5_16_Font;
defaultP -> learnFieldFont2[WordFieldWordNet] = stdFont;
defaultP -> learnFieldFont2[WordFieldMerriamWebster] = stdFont;
defaultP -> learnFieldFont2[WordFieldDict1] = stdFont;
defaultP -> learnFieldFont2[WordFieldDict2] = stdFont;
defaultP -> learnFieldFont2[WordFieldDict3] = stdFont;
defaultP -> learnFieldFont2[WordFieldNote1] = stdFont;
defaultP -> learnFieldFont2[WordFieldNote2] = stdFont;
defaultP -> learnFieldFont2[WordFieldNote3] = boldFont;
// Set LearnField text alignment
defaultP -> learnFieldAlignment[WordFieldQuestion] = CenterAlignment;
defaultP -> learnFieldAlignment[WordFieldPhonetic] = CenterAlignment;
defaultP -> learnFieldAlignment[WordFieldAnswer] = CenterAlignment;
defaultP -> learnFieldAlignment[WordFieldWordNet] = CenterAlignment;
defaultP -> learnFieldAlignment[WordFieldMerriamWebster] = CenterAlignment;
defaultP -> learnFieldAlignment[WordFieldDict1] = CenterAlignment;
defaultP -> learnFieldAlignment[WordFieldDict2] = CenterAlignment;
defaultP -> learnFieldAlignment[WordFieldDict3] = CenterAlignment;
defaultP -> learnFieldAlignment[WordFieldNote1] = CenterAlignment;
defaultP -> learnFieldAlignment[WordFieldNote2] = CenterAlignment;
defaultP -> learnFieldAlignment[WordFieldNote3] = LeftAlignment;
// Set review mode
bits = 0;
SetBitMacro(bits, TranslationRecollection);
SetBitMacro(bits, WordRecollection);
SetBitMacro(bits, TranslationTest);
SetBitMacro(bits, WordTest);
defaultP -> reviewMode.allBits = (UInt8)bits;
// Set lefty
defaultP -> lefty = (UInt8)0;
// copy in the defaults and free the default app info
DmWrite(app, 0, defaultP, sizeof(SugarAppInfoType));
MemPtrFree(defaultP);
CategoryInitialize((AppInfoPtr)app, CategoryNamesAppInfoStr);
// Unlock
MemPtrUnlock(app);
return 0;
}
//initialize database appinfo
/*
Err SugarDBAppInfoInit(DmOpenRef dbP)
{
UInt16 cardNo;
LocalID dbID;
LocalID appInfoID;
MemHandle h;
SugarAppInfoType* appInfoP;
SugarAppInfoType* defaultInfoP;
UInt8 i, j;
WordFieldFlags flag, newAnswerPageFlag;
DateType today;
Int16 oldVersion = -1;
Int16 currentVersion = 2;
UInt16 bits = 0;
MemorizingStatus memoStatus = {2.50, //e-factor
40, //difficulty
0, //total lapse
0, //total recall
0, //recent lapse
0, //recent recall
0, //step
0, //last test
0, //current test
0, //next test
0, //first learn
0}; //create
SetBitMacro(bits, TranslationRecollection);
SetBitMacro(bits, WordRecollection);
SetBitMacro(bits, TranslationTest);
SetBitMacro(bits, WordTest);
newAnswerPageFlag.allBits = 0;
SetBitMacro(newAnswerPageFlag.allBits, WordFieldPhonetic);
SetBitMacro(newAnswerPageFlag.allBits, WordFieldNote3);
DateDaysToDate(TimGetSeconds(), &today);
appInfoP = GetAppInfoPtr(dbP);
// If there isn't an app info make space for one
if (appInfoP == NULL)
{
}
else if (appInfoP -> version == currentVersion){
MemPtrUnlock(appInfoP);
return 0;
}
else {
oldVersion = appInfoP -> version;
}
// Allocate & Clear the app info
defaultInfoP = MemPtrNew(sizeof(SugarAppInfoType));
if (defaultInfoP == NULL)
{
ErrDisplay("Unable to init Word DB");
return 1;
}
// Flush memory
MemSet(defaultInfoP, sizeof(SugarAppInfoType), 0);
// Init the categories
switch(oldVersion){
case -1:
for (i = 0; i < dmRecNumCategories; i++)
defaultInfoP->categoryUniqIDs[i] = i;
defaultInfoP->lastUniqID = dmRecNumCategories - 1;
//Set lastUpdated
defaultInfoP -> lastUpdated = today;
// Set question and answer page field
flag.allBits = 0;
SetBitMacro(flag.allBits, WordFieldQuestion);
SetBitMacro(flag.allBits, WordFieldPhonetic);
defaultInfoP -> questionPageFields.allBits = flag.allBits;
//flag.allBits = 0;
//SetBitMacro(flag.allBits, WordFieldAnswer);
//SetBitMacro(flag.allBits, WordFieldNote3);
defaultInfoP -> answerPageFields.allBits = newAnswerPageFlag.allBits;
// Set raw word count to 0
defaultInfoP -> rawWordCount = 0;
defaultInfoP -> reviewMode.allBits = (UInt8)bits;
break;
case 0:
case 1:
defaultInfoP -> renamedCategories = appInfoP -> renamedCategories;
for (i = 0; i < dmRecNumCategories; i ++){
defaultInfoP->categoryUniqIDs[i] = appInfoP -> categoryUniqIDs[i];
for (j = 0; j < dmCategoryLength; j++){
defaultInfoP -> categoryLabels[i][j] = appInfoP -> categoryLabels[i][j];
}
}
defaultInfoP -> lastUniqID = appInfoP -> lastUniqID;
//Set lastUpdated
defaultInfoP -> lastUpdated = appInfoP -> lastUpdated;
// Set question and answer page field
defaultInfoP -> questionPageFields.allBits =
appInfoP -> questionPageFields.allBits;
defaultInfoP -> answerPageFields.allBits = newAnswerPageFlag.allBits;
// Set raw word count to 0
defaultInfoP -> rawWordCount = appInfoP -> rawWordCount;
defaultInfoP -> reviewMode.allBits = (UInt8)bits;
break;
}
//init version
defaultInfoP -> version = currentVersion;
//init LearnFieldFont
defaultInfoP -> learnFieldFont[WordFieldQuestion] = OS5_16_Font;
defaultInfoP -> learnFieldFont[WordFieldPhonetic] = PhoneticLargeFont;
defaultInfoP -> learnFieldFont[WordFieldAnswer] = OS5_16_Font;
defaultInfoP -> learnFieldFont[WordFieldWordNet] = stdFont;
defaultInfoP -> learnFieldFont[WordFieldMerriamWebster] = stdFont;
defaultInfoP -> learnFieldFont[WordFieldDict1] = stdFont;
defaultInfoP -> learnFieldFont[WordFieldDict2] = stdFont;
defaultInfoP -> learnFieldFont[WordFieldDict3] = stdFont;
defaultInfoP -> learnFieldFont[WordFieldNote1] = stdFont;
defaultInfoP -> learnFieldFont[WordFieldNote2] = stdFont;
defaultInfoP -> learnFieldFont[WordFieldNote3] = boldFont;
//init LearnField text alignment
defaultInfoP -> learnFieldAlignment[WordFieldQuestion] = CenterAlignment;
defaultInfoP -> learnFieldAlignment[WordFieldPhonetic] = CenterAlignment;
defaultInfoP -> learnFieldAlignment[WordFieldAnswer] = CenterAlignment;
defaultInfoP -> learnFieldAlignment[WordFieldWordNet] = CenterAlignment;
defaultInfoP -> learnFieldAlignment[WordFieldMerriamWebster] = CenterAlignment;
defaultInfoP -> learnFieldAlignment[WordFieldDict1] = CenterAlignment;
defaultInfoP -> learnFieldAlignment[WordFieldDict2] = CenterAlignment;
defaultInfoP -> learnFieldAlignment[WordFieldDict3] = CenterAlignment;
defaultInfoP -> learnFieldAlignment[WordFieldNote1] = CenterAlignment;
defaultInfoP -> learnFieldAlignment[WordFieldNote2] = CenterAlignment;
defaultInfoP -> learnFieldAlignment[WordFieldNote3] = LeftAlignment;
//Init default new record
SetBitMacro(defaultInfoP -> defaultNewWordRecord.header.allBits, RawQueue);
defaultInfoP -> defaultNewWordRecord.ltStatus.learningStatus = 0;
defaultInfoP -> defaultNewWordRecord.memoStatus = memoStatus;
defaultInfoP -> defaultNewWordRecord.memoStatus.create = today;
if (appInfoP != NULL) {
if (DmOpenDatabaseInfo(dbP, &dbID, NULL, NULL, &cardNo, NULL))
return dmErrInvalidParam;
if (DmDatabaseInfo(cardNo, dbID, NULL, NULL, NULL, NULL, NULL, NULL, NULL, &appInfoID, NULL, NULL, NULL))
return dmErrInvalidParam;
//delete original appInfo block
if (DmSetDatabaseInfo(cardNo, dbID, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL))
{
MemPtrUnlock(appInfoP);
return 1;
}
// free memory
MemPtrFree(appInfoP);
}
if (DmOpenDatabaseInfo(dbP, &dbID, NULL, NULL, &cardNo, NULL))
return dmErrInvalidParam;
if (DmDatabaseInfo(cardNo, dbID, NULL, NULL, NULL, NULL, NULL, NULL, NULL, &appInfoID, NULL, NULL, NULL))
return dmErrInvalidParam;
//allocate new space
h = DmNewHandle(dbP, sizeof(SugarAppInfoType));
if (!h) return dmErrMemError;
//set new app info block
appInfoID = MemHandleToLocalID(h);
if (DmSetDatabaseInfo(cardNo, dbID, NULL, NULL, NULL, NULL, NULL, NULL, NULL, &appInfoID, NULL, NULL, NULL))
{
MemHandleFree(h);
return 1;
}
appInfoP = MemHandleLock(h);
// copy in the defaults and free the default app info
DmWrite(appInfoP, 0, defaultInfoP, sizeof(SugarAppInfoType));
MemPtrFree(defaultInfoP);
// Try to use localized app info block strings.
if (oldVersion == -1) ;
// Unlock
MemPtrUnlock(appInfoP);
return 0;
}*/
UInt16 GetRawWordCount(){
SugarAppInfoType* app;
UInt16 number;
app = GetAppInfoPtr(CurrentDB);
number = app -> rawWordCount;
MemPtrUnlock(app);
return number;
}
void SetRawWordCount(UInt16 newWordCount){
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -