Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include "dbManager.h"
- dbManager::dbManager(db* pDB)
- {
- DB = pDB;
- }
- dbManager::~dbManager(void)
- {
- }
- int dbManager::wordcmp(const char* str1, const char* word, int *offset)
- {
- unsigned int len = strlen(word);
- // returns 0 if equals
- if (memcmp (str1, word, len)==0)
- {
- if (len==strlen(str1) || str1[len] == '(' || str1[len] == ' ') // wyraz nie konczy sie gdy nie ma po nim ' ' lub '('
- {
- if (offset!=NULL)
- *offset +=len;
- return 0;
- }
- }
- // if not any of above
- return -1;
- }
- int dbManager::lettercmp(const char* str1, char letter, int *offset)
- {
- if (str1[0] == letter && strlen(str1)>0)
- {
- (*offset)++;
- return 0;
- }
- return -1;
- }
- int dbManager::skipws(const char* str)
- {
- int i = 0;
- while(str[i] == ' ')
- {
- i++;
- }
- // returns count of ws
- return i;
- }
- bool dbManager::gotochar(const char* str, char letter, int* offset)
- {
- int len = strlen(str);
- for (int i=0; i<len; i++)
- {
- if (str[i] == letter)
- {
- *offset+=i+1;
- return true;
- }
- }
- return false;
- }
- bool dbManager::clamp(int value, unsigned long long int mask)
- {
- cout << "wieksze / mniejsze od: " << (mask >> TYP::MASK::CLAMPHIGHER) % 32768 << ", " << (mask >> TYP::MASK::CLAMPLOWER) % 32768 << endl;
- return ((mask >> TYP::MASK::CLAMPHIGHER) % 32768 <= value && (mask >> TYP::MASK::CLAMPLOWER) % 32768 >= value);
- }
- bool dbManager::TakeInt(const char* cmdline, int* output, int* offset)
- {
- int end = 0;
- if (!gotochar(cmdline, ',', &end) && !gotochar(cmdline, ')', &end)) // szukaj zakonczenia parametru, a jak ne to przecinka.
- return false;
- char* strtonumbuff = (char*)malloc(sizeof(char)*end);
- for(int i=0; i<end; i++)
- {
- strtonumbuff[i]=cmdline[i];
- }
- strtonumbuff[end]=0;
- *output = atoi(strtonumbuff);
- //free(strtonumbuff);
- // moves offset after ',' or ')'
- if (offset!=NULL)
- *offset +=end;
- return true;
- }
- bool dbManager::TakeString(const char* cmdline, char** output, int* offset)
- {
- int start = 0, end = 0;
- if (!gotochar(cmdline, '"', &start) || !gotochar(cmdline+start, '"', &end))
- return false;
- start;
- end+=start-1;
- if (end>strlen(cmdline) || start>strlen(cmdline))
- return false;
- *output = (char*) malloc(sizeof(char) * (end-start) +1);
- for (int i=start; i<end; i++)
- {
- (*output)[i-start] = cmdline[i];
- }
- (*output)[end-start] = 0;
- *offset +=end+2; // skip '"' i ','
- return true;
- }
- void dbManager::PrintSyntax(int n)
- {
- // wypisywanie skladni
- cout << "dawaj mi: " << DB->TabName(n) <<"(" << DB->Tabs[n].column_names[0];
- for (int i=1; i<DB->Tabs[n].column_count; i++)
- cout << "," << DB->Tabs[n].column_names[i];
- cout << ")" << endl;
- }
- // ======public============
- bool dbManager::ProcessCmd(const char* cmdline)
- {
- int offset = skipws(cmdline); // obsluga ws na poczatku cmd
- if (wordcmp(cmdline+offset, "dzien dobry", &offset) == 0)
- {
- cout << "?\n";
- } else if (wordcmp(cmdline+offset, "koniec", &offset) == 0)
- {
- return false;
- } else if (wordcmp(cmdline+offset, "dodaj", &offset) == 0)
- {
- Add(cmdline+offset);
- }
- return true;
- }
- bool dbManager::Add(const char* cmdline)
- {
- int offset = skipws(cmdline);
- bool tablematches = false;
- for (int itab=0; itab<DB->TabCount(); itab++)
- {
- if (wordcmp(cmdline+offset, DB->TabName(itab), &offset) == 0)
- {
- offset += skipws(cmdline+offset); // obsluga ws
- tablematches = true;
- PrintSyntax(itab);
- int record = 1;
- // sprawdzanie czy nawias
- while (gotochar(cmdline+offset, '(', &offset))
- {
- cout << "Rekord nr: " << record << " : ";
- // sprawdzanie jakiego typu komorki sa w db i wczytanie ich
- int buffint;
- for (int i=0; i< DB->ColumnCount(itab); i++)
- {
- switch(DB->ColumnType(itab, i) % TYP::MASK::START) // last 2 bytes
- {
- case TYP::INT: // dodawanie inta
- if (!TakeInt(cmdline+offset, &buffint, &offset))
- {
- cout << "cos zle z parametrami INT, anuluje dodawanie\n";
- return false;
- } else
- {
- cout << DB->Tabs[itab].column_names[i] << ": " << buffint << ", ";
- DB->AddInt(itab, i, buffint);
- }
- break;
- case TYP::STRING:
- char* buffstr;
- if (!TakeString(cmdline+offset, &buffstr, &offset))
- {
- cout << "cos zle z parametrami STRING, anuluje dodawanie\n";
- } else
- {
- cout << DB->Tabs[itab].column_names[i] << ": \"" << buffstr << "\", ";
- DB->AddString(itab, i, buffstr);
- }
- break;
- case TYP::CLAMP:
- if (!TakeInt(cmdline+offset, &buffint, &offset))
- {
- cout << "cos zle z parametrami INT, anuluje dodawanie\n";
- return false;
- } else
- {
- if (clamp(buffint,DB->ColumnType(itab, i)))
- cout << DB->Tabs[itab].column_names[i] << ": " << buffint << ", ";
- else
- cout << "za mala liczba";
- }
- break;
- default:
- cout << "nie rozpoznano typu kolumny !\n" << endl;
- }
- }
- offset--;
- offset += skipws(cmdline+offset); // obsluga ws
- // start : debug
- cout << endl;
- int closeoffset = 0;
- if (!gotochar(cmdline+offset, ')', &closeoffset))
- {
- cout <<"Brak zakonczenia parametru " << record << endl;
- } else if (closeoffset>1)
- {
- cout << "Za duzo wartosci w parametrze " << record << endl;
- };
- // end : debug
- record++;
- offset++;
- offset += skipws(cmdline+offset); // obsluga ws
- }
- }
- }
- if (!tablematches)
- cout << " nie ma takiej tabeli \n";
- return true;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement