Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.01.09;
Скачать: CL | DM;

Вниз

Ужас с конструктором   Найти похожие ветки 

 
pasha_golub ©   (2004-12-23 13:06) [0]

Мужики, у меня прям мистика происходит. Копперфильд мать его так...

Есть конструктор:
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 пустая. Ткните лицой, шо не так?

Спасибо.


 
Fay ©   (2004-12-23 13:09) [1]

Какого типа FTableName ?


 
pasha_golub ©   (2004-12-23 13:16) [2]

Имелось ввиду вот такой расклад:

Constructor TNativeDataSet.Create
begin
=====   ======   push ebp;
....


2Fay ©   (23.12.04 13:09) [1]
PChar, так до этой строчки и не доходит, елы-палы


 
MBo ©   (2004-12-23 14:32) [3]

1. откуда берется pszTableName?
2. настораживает приведение объекта к дескриптору -hDBICur
(но это может, я чего не понимаю)


 
pasha_golub ©   (2004-12-23 14:47) [4]

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
Тут ничего сказать не могу. Код получил в руки недавно. Разбираюсь.


 
pasha_golub ©   (2004-12-23 14:50) [5]

Мужики, хотите прикол? Это вообще пипец.

Если параметр AName = "public.table2", а не ""public"."table2"", короче если нет в строке кавычек - все отрабатывает.

Это как так?


 
pasha_golub ©   (2004-12-23 15:03) [6]

Баг нашел. Щас запостю сюда. Хочется узнать, гдя я облажался.


 
pasha_golub ©   (2004-12-23 15:09) [7]

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, то все работает на "ура", но в чем тайный смысл?


 
MBo ©   (2004-12-23 15:40) [8]

мне кажется, могут повлиять эти пляски с преобразованием строк в PChar и обратно и автоматическим освобождением памяти.


 
pasha_golub ©   (2004-12-23 15:46) [9]

Переписал функцию QuoteIdentifier через итерацию, вместо рекурсии. Проблема пропала.


 
pasha_golub ©   (2004-12-23 15:47) [10]

Переписал функцию QuoteIdentifier через итерацию, вместо рекурсии. Проблема пропала.

MBo ©   (23.12.04 15:40) [8]
Ну я тоже к этому склоняюсь, а вот на каком именно па это все летит к чертовой бабушке...


 
vuk ©   (2004-12-23 15:50) [11]

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 16:11) [12]

vuk ©   (23.12.04 15:50) [11]
Это почти я. ;0) Я лишь усугубил. Осознал, посыпаю голову пеплом.


 
vuk ©   (2004-12-23 16:13) [13]

Я, кстати говоря, вообще не вижу здесь смысла в использовании PChar. Были бы обычные строки, проблем бы не было.


 
pasha_golub ©   (2004-12-23 16:34) [14]

vuk ©   (23.12.04 16:13) [13]
Я тоже не вижу. Говорю ж код в руки попал недавно.

ЗЫ Главное, чтобы автор не увидел, что я тут пишу. А то по морде получу... :0) Виртуально.



Страницы: 1 вся ветка

Текущий архив: 2005.01.09;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.048 c
1-1103033135
BigDAN
2004-12-14 17:05
2005.01.09
MDI-форма, но не главная форма!!!


4-1100873802
VadimEagle
2004-11-19 17:16
2005.01.09
Печать


14-1103058925
Pat
2004-12-15 00:15
2005.01.09
ООП vs структурное программирование


6-1098380289
Grundic
2004-10-21 21:38
2005.01.09
idUDPClient - проверка перед отправкой - как?


3-1102327062
yuray
2004-12-06 12:57
2005.01.09
Создание процедуры программно