Форум: "Основная";
Текущий архив: 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