Skip to content

Commit bd14363

Browse files
authored
Initial Commit
1 parent 8cb7746 commit bd14363

5 files changed

+540
-0
lines changed

Database.dev

+82
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
[Project]
2+
FileName=Database.dev
3+
Name=Database
4+
Type=1
5+
Ver=2
6+
ObjFiles=
7+
Includes=
8+
Libs=
9+
PrivateResource=
10+
ResourceIncludes=
11+
MakeIncludes=
12+
Compiler=
13+
CppCompiler=
14+
Linker=
15+
IsCpp=0
16+
Icon=
17+
ExeOutput=
18+
ObjectOutput=
19+
LogOutput=
20+
LogOutputEnabled=0
21+
OverrideOutput=0
22+
OverrideOutputName=
23+
HostApplication=
24+
UseCustomMakefile=0
25+
CustomMakefile=
26+
CommandLine=
27+
Folders=
28+
IncludeVersionInfo=0
29+
SupportXPThemes=0
30+
CompilerSet=0
31+
CompilerSettings=0000000000000000001000000
32+
UnitCount=3
33+
34+
[VersionInfo]
35+
Major=1
36+
Minor=0
37+
Release=0
38+
Build=0
39+
LanguageID=1033
40+
CharsetID=1252
41+
CompanyName=
42+
FileVersion=
43+
FileDescription=Developed using the Dev-C++ IDE
44+
InternalName=
45+
LegalCopyright=
46+
LegalTrademarks=
47+
OriginalFilename=
48+
ProductName=
49+
ProductVersion=
50+
AutoIncBuildNr=0
51+
SyncProduct=1
52+
53+
[Unit1]
54+
FileName=database.c
55+
CompileCpp=0
56+
Folder=
57+
Compile=1
58+
Link=1
59+
Priority=1000
60+
OverrideBuildCmd=0
61+
BuildCmd=
62+
63+
[Unit2]
64+
FileName=csvparser.h
65+
CompileCpp=0
66+
Folder=
67+
Compile=1
68+
Link=1
69+
Priority=1000
70+
OverrideBuildCmd=0
71+
BuildCmd=
72+
73+
[Unit3]
74+
FileName=csvparser.c
75+
CompileCpp=0
76+
Folder=
77+
Compile=1
78+
Link=1
79+
Priority=1000
80+
OverrideBuildCmd=0
81+
BuildCmd=
82+

createIndexesBatchFile.bat

+40
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
@echo off
2+
setlocal EnableDelayedExpansion
3+
set data=3
4+
5+
6+
echo:
7+
8+
set /p serverName= "Please input server name / (default : '.') enter 0 to skip : "
9+
10+
IF "!serverName!" == "0" (
11+
set serverName=.
12+
)
13+
14+
set /p dbUser= "Please input db user name : "
15+
set /p dbPassword= "Please input db password : "
16+
17+
echo Logging in....
18+
sqlcmd -U %dbUser% -P %dbPassword% -S %serverName% -Q ""
19+
20+
echo:
21+
echo Logged In Successfully, Welcome %dbUser%
22+
23+
24+
echo:
25+
26+
27+
set counter=%~1
28+
set databaseName=%~2
29+
30+
for /l %%x in (1, 1, !counter!) do (
31+
SET /p indexName= "please enter index name: "
32+
SET /p tableName= "please enter tableName: "
33+
SET /p indexColumn= "please enter index column name: "
34+
sqlcmd -U !dbUser! -P !dbPassword! -S !serverName! -d !databaseName! -Q "CREATE INDEX !indexName! ON !tableName! (!indexColumn!)" -b
35+
echo CREATED INDEX Successfully
36+
echo:
37+
)
38+
39+
40+
SET /p tableName= "press any key to continue..."

csvparser.c

+236
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,236 @@
1+
#include <stdlib.h>
2+
#include <string.h>
3+
#include <stdio.h>
4+
#include <errno.h>
5+
6+
#include "csvparser.h"
7+
8+
#ifdef __cplusplus
9+
extern "C" {
10+
#endif
11+
12+
CsvParser *CsvParser_new(const char *filePath, const char *delimiter, int firstLineIsHeader) {
13+
CsvParser *csvParser = (CsvParser*)malloc(sizeof(CsvParser));
14+
if (filePath == NULL) {
15+
csvParser->filePath_ = NULL;
16+
} else {
17+
int filePathLen = strlen(filePath);
18+
csvParser->filePath_ = (char*)malloc((filePathLen + 1));
19+
strcpy(csvParser->filePath_, filePath);
20+
}
21+
csvParser->firstLineIsHeader_ = firstLineIsHeader;
22+
csvParser->errMsg_ = NULL;
23+
if (delimiter == NULL) {
24+
csvParser->delimiter_ = ',';
25+
} else if (_CsvParser_delimiterIsAccepted(delimiter)) {
26+
csvParser->delimiter_ = *delimiter;
27+
} else {
28+
csvParser->delimiter_ = '\0';
29+
}
30+
csvParser->header_ = NULL;
31+
csvParser->fileHandler_ = NULL;
32+
csvParser->fromString_ = 0;
33+
csvParser->csvString_ = NULL;
34+
csvParser->csvStringIter_ = 0;
35+
36+
return csvParser;
37+
}
38+
39+
CsvParser *CsvParser_new_from_string(const char *csvString, const char *delimiter, int firstLineIsHeader) {
40+
CsvParser *csvParser = CsvParser_new(NULL, delimiter, firstLineIsHeader);
41+
csvParser->fromString_ = 1;
42+
if (csvString != NULL) {
43+
int csvStringLen = strlen(csvString);
44+
csvParser->csvString_ = (char*)malloc(csvStringLen + 1);
45+
strcpy(csvParser->csvString_, csvString);
46+
}
47+
return csvParser;
48+
}
49+
50+
void CsvParser_destroy(CsvParser *csvParser) {
51+
if (csvParser == NULL) {
52+
return;
53+
}
54+
if (csvParser->filePath_ != NULL) {
55+
free(csvParser->filePath_);
56+
}
57+
if (csvParser->errMsg_ != NULL) {
58+
free(csvParser->errMsg_);
59+
}
60+
if (csvParser->fileHandler_ != NULL) {
61+
fclose(csvParser->fileHandler_);
62+
}
63+
if (csvParser->header_ != NULL) {
64+
CsvParser_destroy_row(csvParser->header_);
65+
}
66+
if (csvParser->csvString_ != NULL) {
67+
free(csvParser->csvString_);
68+
}
69+
free(csvParser);
70+
}
71+
72+
void CsvParser_destroy_row(CsvRow *csvRow) {
73+
int i;
74+
for (i = 0 ; i < csvRow->numOfFields_ ; i++) {
75+
free(csvRow->fields_[i]);
76+
}
77+
free(csvRow);
78+
}
79+
80+
CsvRow *CsvParser_getHeader(CsvParser *csvParser) {
81+
if (! csvParser->firstLineIsHeader_) {
82+
_CsvParser_setErrorMessage(csvParser, "Cannot supply header, as current CsvParser object does not support header");
83+
return NULL;
84+
}
85+
if (csvParser->header_ == NULL) {
86+
csvParser->header_ = _CsvParser_getRow(csvParser);
87+
}
88+
return csvParser->header_;
89+
}
90+
91+
CsvRow *CsvParser_getRow(CsvParser *csvParser) {
92+
if (csvParser->firstLineIsHeader_ && csvParser->header_ == NULL) {
93+
csvParser->header_ = _CsvParser_getRow(csvParser);
94+
}
95+
return _CsvParser_getRow(csvParser);
96+
}
97+
98+
int CsvParser_getNumFields(CsvRow *csvRow) {
99+
return csvRow->numOfFields_;
100+
}
101+
102+
char **CsvParser_getFields(CsvRow *csvRow) {
103+
return csvRow->fields_;
104+
}
105+
106+
CsvRow *_CsvParser_getRow(CsvParser *csvParser) {
107+
int numRowRealloc = 0;
108+
int acceptedFields = 64;
109+
int acceptedCharsInField = 64;
110+
if (csvParser->filePath_ == NULL && (! csvParser->fromString_)) {
111+
_CsvParser_setErrorMessage(csvParser, "Supplied CSV file path is NULL");
112+
return NULL;
113+
}
114+
if (csvParser->csvString_ == NULL && csvParser->fromString_) {
115+
_CsvParser_setErrorMessage(csvParser, "Supplied CSV string is NULL");
116+
return NULL;
117+
}
118+
if (csvParser->delimiter_ == '\0') {
119+
_CsvParser_setErrorMessage(csvParser, "Supplied delimiter is not supported");
120+
return NULL;
121+
}
122+
if (! csvParser->fromString_) {
123+
if (csvParser->fileHandler_ == NULL) {
124+
csvParser->fileHandler_ = fopen(csvParser->filePath_, "r");
125+
if (csvParser->fileHandler_ == NULL) {
126+
int errorNum = errno;
127+
const char *errStr = strerror(errorNum);
128+
char *errMsg = (char*)malloc(1024 + strlen(errStr));
129+
strcpy(errMsg, "");
130+
sprintf(errMsg, "Error opening CSV file for reading: %s : %s", csvParser->filePath_, errStr);
131+
_CsvParser_setErrorMessage(csvParser, errMsg);
132+
free(errMsg);
133+
return NULL;
134+
}
135+
}
136+
}
137+
CsvRow *csvRow = (CsvRow*)malloc(sizeof(CsvRow));
138+
csvRow->fields_ = (char**)malloc(acceptedFields * sizeof(char*));
139+
csvRow->numOfFields_ = 0;
140+
int fieldIter = 0;
141+
char *currField = (char*)malloc(acceptedCharsInField);
142+
int inside_complex_field = 0;
143+
int currFieldCharIter = 0;
144+
int seriesOfQuotesLength = 0;
145+
int lastCharIsQuote = 0;
146+
int isEndOfFile = 0;
147+
while (1) {
148+
char currChar = (csvParser->fromString_) ? csvParser->csvString_[csvParser->csvStringIter_] : fgetc(csvParser->fileHandler_);
149+
csvParser->csvStringIter_++;
150+
int endOfFileIndicator;
151+
if (csvParser->fromString_) {
152+
endOfFileIndicator = (currChar == '\0');
153+
} else {
154+
endOfFileIndicator = feof(csvParser->fileHandler_);
155+
}
156+
if (endOfFileIndicator) {
157+
if (currFieldCharIter == 0 && fieldIter == 0) {
158+
_CsvParser_setErrorMessage(csvParser, "Reached EOF");
159+
return NULL;
160+
}
161+
currChar = '\n';
162+
isEndOfFile = 1;
163+
}
164+
if (currChar == '\r') {
165+
continue;
166+
}
167+
if (currFieldCharIter == 0 && ! lastCharIsQuote) {
168+
if (currChar == '\"') {
169+
inside_complex_field = 1;
170+
lastCharIsQuote = 1;
171+
continue;
172+
}
173+
} else if (currChar == '\"') {
174+
seriesOfQuotesLength++;
175+
inside_complex_field = (seriesOfQuotesLength % 2 == 0);
176+
if (inside_complex_field) {
177+
currFieldCharIter--;
178+
}
179+
} else {
180+
seriesOfQuotesLength = 0;
181+
}
182+
if (isEndOfFile || ((currChar == csvParser->delimiter_ || currChar == '\n') && ! inside_complex_field) ){
183+
currField[lastCharIsQuote ? currFieldCharIter - 1 : currFieldCharIter] = '\0';
184+
csvRow->fields_[fieldIter] = (char*)malloc(currFieldCharIter + 1);
185+
strcpy(csvRow->fields_[fieldIter], currField);
186+
free(currField);
187+
csvRow->numOfFields_++;
188+
if (currChar == '\n') {
189+
return csvRow;
190+
}
191+
if (csvRow->numOfFields_ != 0 && csvRow->numOfFields_ % acceptedFields == 0) {
192+
csvRow->fields_ = (char**)realloc(csvRow->fields_, ((numRowRealloc + 2) * acceptedFields) * sizeof(char*));
193+
numRowRealloc++;
194+
}
195+
acceptedCharsInField = 64;
196+
currField = (char*)malloc(acceptedCharsInField);
197+
currFieldCharIter = 0;
198+
fieldIter++;
199+
inside_complex_field = 0;
200+
} else {
201+
currField[currFieldCharIter] = currChar;
202+
currFieldCharIter++;
203+
if (currFieldCharIter == acceptedCharsInField - 1) {
204+
acceptedCharsInField *= 2;
205+
currField = (char*)realloc(currField, acceptedCharsInField);
206+
}
207+
}
208+
lastCharIsQuote = (currChar == '\"') ? 1 : 0;
209+
}
210+
}
211+
212+
int _CsvParser_delimiterIsAccepted(const char *delimiter) {
213+
char actualDelimiter = *delimiter;
214+
if (actualDelimiter == '\n' || actualDelimiter == '\r' || actualDelimiter == '\0' ||
215+
actualDelimiter == '\"') {
216+
return 0;
217+
}
218+
return 1;
219+
}
220+
221+
void _CsvParser_setErrorMessage(CsvParser *csvParser, const char *errorMessage) {
222+
if (csvParser->errMsg_ != NULL) {
223+
free(csvParser->errMsg_);
224+
}
225+
int errMsgLen = strlen(errorMessage);
226+
csvParser->errMsg_ = (char*)malloc(errMsgLen + 1);
227+
strcpy(csvParser->errMsg_, errorMessage);
228+
}
229+
230+
const char *CsvParser_getErrorMessage(CsvParser *csvParser) {
231+
return csvParser->errMsg_;
232+
}
233+
234+
#ifdef __cplusplus
235+
}
236+
#endif

0 commit comments

Comments
 (0)