Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2005.01.09;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.48 MB
Время: 0.037 c
4-1101128855
Новик
2004-11-22 16:07
2005.01.09
Выделить часть текста в чужом окне


8-1096738826
miek
2004-10-02 21:40
2005.01.09
GLScene: изменение материалов


14-1103631558
Vaitek
2004-12-21 15:19
2005.01.09
Ааа вот вы где все!


1-1103715953
_Anonimus_
2004-12-22 14:45
2005.01.09
Как можно выделить TListItem


14-1103395533
Nic87
2004-12-18 21:45
2005.01.09
Сайт вырос





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский