Merge pull request #1 from Numillyash/feature-fix-parsefield

Feature fix parsefield
master
Numillyash 2022-10-24 22:22:23 +03:00 committed by GitHub
commit 98c492a6ed
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 77 additions and 30 deletions

3
.gitignore vendored
View File

@ -360,4 +360,5 @@ MigrationBackup/
.ionide/
# Fody - auto-generated XML schema
FodyWeavers.xsd
FodyWeavers.xsd
*.out

Binary file not shown.

View File

@ -29,21 +29,21 @@ typedef struct _condition
typedef struct _dbElement
{
// Фамилия
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
char* last_nm;
// Имя
// <EFBFBD><EFBFBD><EFBFBD>
char* first_nm;
// Курс
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD>
int curse_id;
// ID лабораторной
// ID <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
int lab_id;
// Время начала тестирования
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
time_t start_tm;
// Время окончания тестирования
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
time_t end_tm;
// Множество: пройденные тесты (99)
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> (99)
int* result;
// Следующий элемент списка
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
struct _dbElement* nextElement;
}DataBaseElement;
@ -110,21 +110,21 @@ int isStringOneOf(char* string, Condition* condition)
int isElementRespondConditions(DataBaseElement* elem, Condition* conditions[7])
{
// Проверка на фамилию
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if (conditions[0] != NULL)
{
if (conditions[0]->condition == stringIsOneOf)
if (!isStringOneOf(elem->last_nm, conditions[0]))
return 0;
}
// Проверка на имя
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD>
if (conditions[1] != NULL)
{
if (conditions[0]->condition == stringIsOneOf)
if (!isStringOneOf(elem->first_nm, conditions[0]))
return 0;
}
// Проверка на курс
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD>
if (conditions[2] != NULL)
{
switch (conditions[2]->condition)
@ -151,7 +151,7 @@ int isElementRespondConditions(DataBaseElement* elem, Condition* conditions[7])
break;
}
}
// Проверка на ID лабораторной
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> ID <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if (conditions[3] != NULL)
{
switch (conditions[3]->condition)
@ -178,7 +178,7 @@ int isElementRespondConditions(DataBaseElement* elem, Condition* conditions[7])
break;
}
}
// Проверка на время начала теста
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>
if (conditions[4] != NULL)
{
switch (conditions[4]->condition)
@ -205,7 +205,7 @@ int isElementRespondConditions(DataBaseElement* elem, Condition* conditions[7])
break;
}
}
// Проверка на время конца теста
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>
if (conditions[5] != NULL)
{
switch (conditions[5]->condition)
@ -232,7 +232,7 @@ int isElementRespondConditions(DataBaseElement* elem, Condition* conditions[7])
break;
}
}
// Проверка на результаты
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if (conditions[6] != NULL)
{
switch (conditions[6]->condition)
@ -254,13 +254,14 @@ int isElementRespondConditions(DataBaseElement* elem, Condition* conditions[7])
return 1;
}
int putElementToDB(char* lastName, char* firstName, int course, int labID, time_t* startTime, time_t* endTime, int results[99])
int putElementToDB(char* lastName, char* firstName, int course, int labID, time_t* startTime, time_t* endTime, int* results)
{
DataBaseElement* newElement = (DataBaseElement*)malloc(sizeof(DataBaseElement));
if (newElement == NULL)
return ALLOC_FAILURE;
mallocCount++;
char* family = (char*)malloc(sizeof(char) * strlen(lastName));
strcpy(family, lastName);
mallocCount++;
@ -273,6 +274,10 @@ int putElementToDB(char* lastName, char* firstName, int course, int labID, time_
newElement->curse_id = course;
newElement->lab_id = labID;
newElement->result = results;
// newElement->result = *results; <--- it was like that
// so you're writing first element value to newElement->result <--- which is incrorrect
newElement->start_tm = *startTime;
newElement->end_tm = *endTime;
newElement->nextElement = NULL;
@ -322,10 +327,11 @@ void printElement(DataBaseElement* elem)
elem->first_nm, elem->last_nm, elem->curse_id, elem->lab_id);
printf("%s\t", asctime(gmtime(&(elem->start_tm))));
printf("%s\tResults\n", asctime(gmtime(&(elem->end_tm))));
/*for (int i = 0; i < 99; i++)
for (int i = 0; i < 99; i++)
{
printf("%d ", elem->result[i]);
}*/
}
printf("\n");
}
@ -344,7 +350,7 @@ int deleteNonUniqElements(char whatToDelete[7])
char* needToDel = (char*)malloc(sizeof(char) * dataBaseSize);
mallocCount++;
// Цикл проверок
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
DataBaseElement* tmp = head;
DataBaseElement* tmp2 = head;
int currInd = 0;
@ -364,7 +370,7 @@ int deleteNonUniqElements(char whatToDelete[7])
needToDel[currInd] = 1;
//printf("%d currind, %d, %d\n", currInd,tmp->lab_id, tmp2->lab_id);
}
// Добавить сравнение по тестам
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
tmp2 = tmp2->nextElement;
}
tmp = tmp->nextElement;
@ -435,8 +441,8 @@ char* formateTime(time_t time)
/// <summary>
///
/// </summary>
/// <param name="whatToPrint">Указываются номера как порядок выводимых значений
/// ,-1 для пустых мест (НЕ NULL)
/// <param name="whatToPrint"><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
/// ,-1 <EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> (<28><> NULL)
/// </param>
/// <param name="conditions"></param>
int selectFunc(char whatToPrint[7], Condition* conditions[7])

View File

@ -55,7 +55,7 @@ int parceField(char *line, int *_field_num, char **_string, int *_int, time_t **
if (field_num != -1)
{
char *st1 = strtok(line, "=");
char *st2 = strtok(NULL, "=");
char *st2 = strtok(NULL, "=");
switch (field_num)
{
case 0:
@ -99,9 +99,43 @@ int parceField(char *line, int *_field_num, char **_string, int *_int, time_t **
return -1;
}
return 1;
case 6:
;
char* tmp_buf = st2;
char* token_buf = strtok(tmp_buf, "[];");
int iteration = 1;
while(token_buf != NULL)
{
// check token reliability
if (strlen(token_buf) != 6 || strncmp("test", token_buf, 4))
{
return -1;
}
if(!(token_buf[4]<='9' && token_buf[4]>='0' && token_buf[5]<='9' && token_buf[5]>='0'))
{
return -1;
}
int index = (token_buf[5] - '0') + (token_buf[4] - '0') * 10;
results[index]++;
token_buf = strtok(NULL, "[];");
iteration++;
}
*_field_num = field_num;
results[0] = 0;
for (int i = 0; i < 100; i++)
{
if (results[i] > 1)
{
return -1;
}
}
return 1;
break;
default:
break;
@ -116,7 +150,7 @@ int parceCondition(char *line, Condition *conditions[7])
int x = !strncmp(line, "result", 6);
if (x)
{
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// char* buf = strtok(line, "");
}
else
{
@ -252,7 +286,8 @@ void parceLine(char *input)
int f_num = -1;
int _int = -1;
time_t *tim = NULL, start = 0, end = 0;
int stroks[99];
int* stroks = (int*)malloc(100*sizeof(int));
mallocCount++;
if (lixCount != 0)
{
@ -268,8 +303,13 @@ void parceLine(char *input)
for (int i = 1; i < lixCount; i++)
{
for (int j = 0; j < 100; j++)
{
stroks[j] = 0;
}
x = parceField(wrd[i], &f_num, &str, &_int, &tim, stroks);
if (x == -1)
{
error(input);

View File

@ -1,4 +1,4 @@
insert last_nm=Ulanovsky, first_nm=George, curse_id=2, lab_id=2, start_tm=2000.10.10!22:1:20, end_tm=2000.10.10!23:0:20, result=[]
insert last_nm=Ulanovsky, first_nm=George, curse_id=2, lab_id=2, start_tm=2000.10.10!22:1:20, end_tm=2000.10.10!23:0:20, result=[test01;test02]
insert last_nm=Ulanovsky, first_nm=George, curse_id=1, lab_id=3, start_tm=2000.10.10!22:1:20, end_tm=2000.10.10!23:0:20, result=[]
insert last_nm=Ulanovsky, first_nm=George, curse_id=2, lab_id=4, start_tm=2000.10.10!22:1:20, end_tm=2000.10.10!23:0:20, result=[]
insert last_nm=Ulanovsky, first_nm=George, curse_id=2, lab_id=4, start_tm=2000.10.10!22:1:20, end_tm=2000.10.10!23:0:20, result=[test22;test11]
uniq first_nm