- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
public void Parse(string sqlScript)
{
batches = new List<string>();
State state = State.WaitingGO;
StartNewBatch();
for(position = 0; position < sqlScript.Length; position++)
{
char c = sqlScript[position];
if(state == State.WaitingGO)
{
PutToBuffer(c);
if(IsWhiteSpace(c) || IsEndOfLineCharacter(c)) continue;
else if(c == 'g' || c == 'G') state = State.ReadingGO;
else
{
state = State.ReadingBatch;
FlushBuffer();
}
}
else if(state == State.ReadingGO)
{
PutToBuffer(c);
if(c == 'o' || c == 'O') state = State.ReadedGO;
else if(IsEndOfLineCharacter(c))
{
state = State.WaitingGO;
FlushBuffer();
}
else
{
state = State.ReadingBatch;
FlushBuffer();
}
}
else if(state == State.ReadedGO)
{
if(IsWhiteSpace(c) || IsEndOfLineCharacter(c))
{
state = State.WaitingGO;
FinishBatch();
StartNewBatch();
}
else
{
state = State.ReadingBatch;
PutToBuffer(c);
FlushBuffer();
}
}
else if(state == State.ReadingBatch)
{
PutToBatch(c);
if(IsEndOfLineCharacter(c)) state = State.WaitingGO;
}
}
if(state != State.ReadedGO) FlushBuffer();
FinishBatch();
}
private enum State
{
WaitingGO,
ReadingGO,
ReadedGO,
ReadingBatch
}
Требовалось распарсить string с sql-текстом на отдельные транзакции (т.е. просто разбить текст по go).
Функции для работы с Batch-ем не привожу и так уйма говнокода
Nagg 02.07.2010 12:34 # 0
pushkoff 02.07.2010 12:52 # −5
if(state == State.WaitingGO)
else if(state == State.ReadingGO)
...
???
cfdev 02.07.2010 13:18 # +1
pushkoff 03.07.2010 04:24 # 0
cfdev 03.07.2010 05:23 # +5
Анонимус 03.07.2010 14:58 # +1
cfdev 03.07.2010 16:48 # +6
из воробья по пушкову
Анонимус 03.07.2010 14:57 # 0
Но тут этого явно не надо
pushkoff 03.07.2010 15:18 # 0
Говногость 04.07.2010 11:29 # 0
>if(state == State.WaitingGO)
>else if(state == State.ReadingGO)
тебе не понравилась конструкция State.WaitingGO? Уж это лучше, чем приходится в С++ писать State_WaitingGO, что-бы имена констант из различных энумов не совпали.
pushkoff 05.07.2010 14:32 # 0
а вообще можно так выкрутиться
Говногость 04.07.2010 11:29 # +1
>if(state == State.WaitingGO)
>else if(state == State.ReadingGO)
Какие проблемы?
Заводи Dictionary для (типа Map) возвращающий функции и радуйся жизни. Можно даже просто массив завести для увеличения быстродействия.
Итого будет типа:
cfdev 04.07.2010 12:35 # +1
Говногость 04.07.2010 13:02 # 0
Чего? Лямбды в стандарте С++0х есть и могут получать доступ к локальным данным метода.
cfdev 04.07.2010 13:04 # 0
Есть в стандарте, которого нет - это мощно!)
Говногость 04.07.2010 13:20 # 0
cfdev 04.07.2010 13:33 # 0
Говногость 07.07.2010 13:44 # 0
pushkoff 05.07.2010 14:37 # −1
всеравно это не то и не удобно (хотя удобнее чем 100 else if)...
Lennis 02.07.2010 13:21 # 0
Nagg 02.07.2010 14:53 # 0
Lennis 02.07.2010 15:08 # 0
bugmenot 06.07.2010 23:57 # 0
Finish MGIMO?