![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Ужас с конструктором [D6, WinXP]
pasha_golub © (2004-12-23 13:06:00)Мужики, у меня прям мистика происходит. Копперфильд мать его так...
Есть конструктор:
Constructor TNativeDataSet.Create(PSQL : TNativeConnect; Container : TContainer; AName, IndexName : PChar; Index : Word;Limit : Integer; ASystem : Boolean = False);
begin
Inherited Create;
...
FTableName := AName;
...
end;
Вызов контсруктора:
...
hCursor := hDBICur(TNativeDataSet.Create(Self, Tables,pszTableName, pszIndexName, iIndexId,Limit));
...
Во время вызова pszTableName = '"public"."Table1"', это видно в дебаггере (watch).
Становимся отладчиком на begin конструктора, значение есть. Делаем шаг, AName обнуляется. То есть пустая строка.
Далее смотрю в окошке CPU:
begin
===== ====== push ebp;
....
Исполняю push - и все. Строка AName пустая. Ткните лицой, шо не так?
Спасибо.
pasha_golub (2004-12-23 16:34:00) [1]vuk © (23.12.04 16:13) [13]
Я тоже не вижу. Говорю ж код в руки попал недавно.
ЗЫ Главное, чтобы автор не увидел, что я тут пишу. А то по морде получу... :0) Виртуально.
vuk (2004-12-23 16:13:00) [2]Я, кстати говоря, вообще не вижу здесь смысла в использовании PChar. Были бы обычные строки, проблем бы не было.
pasha_golub (2004-12-23 16:11:00) [3]vuk © (23.12.04 15:50) [11]
Это почти я. ;0) Я лишь усугубил. Осознал, посыпаю голову пеплом.
vuk (2004-12-23 15:50:00) [4]to pasha_golub © (23.12.04 15:09) [7]:
Силен бродяга! :o)
>Function TPSQLTable.NativeTableName: PChar;
>begin
> Result := PChar(QuoteIdentifier(FTableName));
>end;
Вот здесь собака и порылась. QuoteIdentifier возвращает строку, но строка эта удаляется и в результате получаем то, что получаем.
pasha_golub (2004-12-23 15:47:00) [5]Переписал функцию QuoteIdentifier через итерацию, вместо рекурсии. Проблема пропала.
MBo © (23.12.04 15:40) [8]
Ну я тоже к этому склоняюсь, а вот на каком именно па это все летит к чертовой бабушке...
pasha_golub (2004-12-23 15:46:00) [6]Переписал функцию QuoteIdentifier через итерацию, вместо рекурсии. Проблема пропала.
MBo (2004-12-23 15:40:00) [7]мне кажется, могут повлиять эти пляски с преобразованием строк в PChar и обратно и автоматическим освобождением памяти.
pasha_golub (2004-12-23 15:09:00) [8]pszTableName берется вот как:
FTableName: string;
...
//функция обрамляет в кавычки составные части строки разделенные точкой, например public.table -> "public"."table"
function QuoteIdentifier(const IdentifierName: string): string;
var
I: integer;
begin
I := Pos('.',IdentifierName);
if I > 0 then
Result := QuoteIdentifier(Copy(IdentifierName,1,I-1)) +
'.' + QuoteIdentifier(Copy(IdentifierName,I+1,MaxInt))
else
begin
Result := IdentifierName;
If Result[1] <> '"' then
Result := '"' + Result;
If Result[Length(Result)] <> '"' then
Result := Result + '"';
end;
end;
...
Function TPSQLTable.NativeTableName: PChar;
begin
Result := PChar(QuoteIdentifier(FTableName));
end;
...
pszTableName := NativeTableName;
Так вот, если не вызывать QuoteIdentifier, то все работает на "ура", но в чем тайный смысл?
pasha_golub (2004-12-23 15:03:00) [9]Баг нашел. Щас запостю сюда. Хочется узнать, гдя я облажался.
pasha_golub (2004-12-23 14:50:00) [10]Мужики, хотите прикол? Это вообще пипец.
Если параметр AName = 'public.table2', а не '"public"."table2"', короче если нет в строке кавычек - все отрабатывает.
Это как так?
pasha_golub (2004-12-23 14:47:00) [11]MBo © (23.12.04 14:32) [3]
Откуда берется
Вот вызов
Procedure TNativeConnect.OpenTable(pszTableName: PChar;pszIndexName: PChar;iIndexId: Word;
eOpenMode: DBIOpenMode;eShareMode: DBIShareMode;var hCursor: hDBICur; Limit : integer);
begin
InternalConnect;
if FSystem then
begin
hCursor := hDBICur(TNativeDataSet.Create(Self, Tables,pszTableName, pszIndexName, iIndexId,1,True));
FSystem := False;
end else
hCursor := hDBICur(TNativeDataSet.Create(Self, Tables,pszTableName, pszIndexName, iIndexId,Limit));
TNativeDataSet(hCursor).OpenTable;
end;
2. настораживает приведение объекта к дескриптору -hDBICur
Тут ничего сказать не могу. Код получил в руки недавно. Разбираюсь.
MBo (2004-12-23 14:32:00) [12]1. откуда берется pszTableName?
2. настораживает приведение объекта к дескриптору -hDBICur
(но это может, я чего не понимаю)
pasha_golub (2004-12-23 13:16:00) [13]Имелось ввиду вот такой расклад:
Constructor TNativeDataSet.Create
begin
===== ====== push ebp;
....
2Fay © (23.12.04 13:09) [1]
PChar, так до этой строчки и не доходит, елы-палы
Fay (2004-12-23 13:09:00) [14]Какого типа FTableName ?