Форум » LetoDB, HbNetio. » Вопросы новичка... » Ответить

Вопросы новичка...

Andrey: Взял последнюю версию с "Новая страница с бинарниками", установил на Win2008 Server, чуток помучился с портом... Собрал на МиниГуи+BCC 551 - \MiniGui\batch\hbmk2.bat rddleto.hbp Получил rddleto.lib - 131072 байт - правильный ли размер ? И еще Warning-и лезут: lib\.hbmk\win\bcc\rddsys.c: source\client\letocl.c: source\client\leto1.c: source\client\letomgmn.c: source\common\blowfish.c: source\common\common_c.c: source\common\hbip.c: TLIB 4.5 Copyright (c) 1987, 1999 Inprise Corporation /P32 lib\rddleto.lib -+ lib\.hbmk\win\bcc\rddsys.obj -+ lib\.hbmk\win\bcc\letocl.obj -+ lib\.hbmk\win\bcc\leto1.obj -+ lib\.hbmk\win\bcc\letomgmn.obj -+ lib\.hbmk\win\bcc\blowfish.obj -+ lib\.hbmk\win\bcc\common_c.obj -+ lib\.hbmk\win\bcc\hbip.objWarning: 'rddsys' not found in library Warning: 'letocl' not found in library Warning: 'leto1' not found in library Warning: 'letomgmn' not found in library Warning: 'blowfish' not found in library Warning: 'common_c' not found in library Warning: 'hbip' not found in library Так должно быть или нет ? Вопрос сразу напрашивается с путями - как писать правильно "\" или "/" : Local cPathServer := "//127.0.0.1:2812/" cPathServer := cPathServer +"DATE_TEST_PATH\test.dbf" Помню что где то обсуждали, а результат не запомнил...

Ответов - 300, стр: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 All

Pasha: Andrey пишет: Она зараза работает даже когда на диске места нет ! Фантастика какая-то. А разве тек бывает ? При современных то гигантских дисках. Да еще на сервере.

Dima: Pasha пишет: Фантастика какая-то. А разве тек бывает ? Паш так он же и пишет про лимит у прова , может там всего 20 метров арендовано ......

Петр: Andrey пишет: Было бы ОЧЕНЬ хорошо при сваливании такой ошибке в log-файле писалось сколько места на диске есть !!! Тогда хоть понимать будем в чём ошибка. Функции же нет в LetoDB - сколько свободного места на диске. Если внимательно разглядывать код server.prg, то можно найти REQUEST .. hb_DiskSpace Из чего следует, что выполнение строки типа leto_udf( "hb_diskSpace", leto_GetAppOptions(1), HB_DISK_FREE ) должно привести к желаемому результату. Как использовать результат и где его использовать вы можете придумать сами. Вариантов море, leto_udf(), leto_LockLock() помогут вам.


SergKis: Петр пишет leto_udf( "hb_diskSpace", leto_GetAppOptions(1), HB_DISK_FREE ) должно привести к желаемому результату В таком виде вряд ли, leto_GetAppOptions - ф-я сервера, попробовать так можно cPth := leto_udf( "leto_GetAppOptions", 1) и потом nFre := leto_udf( "hb_diskSpace", cPth, HB_DISK_FREE )Вариантов море, leto_udf(), leto_LockLock() помогут вам. это да

Петр: SergKis пишет: В таком виде вряд ли, leto_GetAppOptions - ф-я сервера, попробовать так можно cPth := leto_udf( "leto_GetAppOptions", 1) Ну да, увлекся, спасибо

Andrey: Dima пишет: пишет про лимит у прова , может там всего 20 метров арендовано ...... 2 Gb - забили архивами и базы место порядочно забирают... Больше года вообще не трогал сервер, падал несколько раз (5-7). А так работает сервер - как часы. SergKis пишет: cPth := leto_udf( "leto_GetAppOptions", 1) и потом nFre := leto_udf( "hb_diskSpace", cPth, HB_DISK_FREE ) Блин, опять городить огород. Ну есть же для Лето файловые функции, не ужели туда добавить как функцию нельзя ?

PSP: Имхо, не только (или не столько) свободное место на диске нужно контролировать, как обрабатывать ошибки записи/чтения. Они могут быть вызваны не только переполнением диска. Только вот что-то не соображу, как, используя letodb, это сделать. BEGIN/RECOVER/END работает с leto, кто знает?

SergKis: SergKis пишет cPth := leto_udf( "leto_GetAppOptions", 1) так не будет работать (и это правильно !!!) вызывать можно только UDF функцию, т.е. надо написать в letoudf.prg FUNCTION UDF_DiskSpace( nUserStru, cDrive, nProp ) If cDrive = Nil; cDrive := leto_GetAppOptions(1) EndIf If nProp = Nil; nProp := HB_DISK_FREE EndIf RETURN hb_diskSpace( cDrive, nProp )

Петр: SergKis пишет: так не будет работать (и это правильно !!!) Так работать будет !!! и это - не правильно

SergKis: Петр пишет Так работать будет !!! cPth := leto_udf( "leto_GetAppOptions", 1) не работает, проверил, еси бы рабтало, то опасно leto_udf( "fErase", myFile) и не нужны leto_ferase(...) и ключ ini EnableFileFunc = 0

Петр: SergKis пишет: не работает, проверил, ? leto_UDFEXIST( "leto_GetAppOptions" ) ? leto_UDFEXIST( "UDF_DiskSpace" ) ? leto_UDFEXIST( "STR" ) ? leto_UDF( "leto_GetAppOptions", 1 ) ? leto_UDF( "UDF_DiskSpace", "C:\", HB_DISK_FREE ) ? leto_UDF( "leto_GetAppOptions", 1 ) ? leto_UDF( "UDF_DiskSpace", "D:\", HB_DISK_FREE ) ? leto_UDF( "leto_GetAppOptions", 1 ) ? leto_UDF( "STR", 1 ) Проверьте еще

SergKis: Проверил [pre2] cPath := "//127.0.0.1:2812/temp/" cIP := "//127.0.0.1:2812/" ? "1. leto_GetAppOptions:", Leto_Udf("leto_GetAppOptions", 1) ? "2. leto_GetAppOptions:", Leto_Udf(cIP+"leto_GetAppOptions", 1) ? "3. leto_GetAppOptions:", Leto_Udf("leto_GetAppOptions") ? "4. leto_GetAppOptions:", Leto_Udf(cIP+"leto_GetAppOptions") результат: 1. leto_GetAppOptions: NIL 2. leto_GetAppOptions: NIL 3. leto_GetAppOptions: NIL 4. leto_GetAppOptions: NIL др. вызовUDF If ! leto_file(cPath+"test3"+".cdx") USE ( cPath+"test3" ) New INDEX ON NUM TAG KOD FOR ! deleted() INDEX ON NAME TAG NAM FOR ! deleted() INDEX ON NUM TAG DEL FOR deleted() USE ? "File has been created", cPath+"test3"+".cdx" EndIf USE ( cPath+"test3" ) New SHARED If OrdCount() > 0 OrdSetFocus(2) EndIf t := Seconds() dbGotop() If ! EOF() aEval({10,20,30,40,50,60,70,80,90,99}, {|nR,nE,lR| dbGoto(nR), lR := RLock(), iif(lR, dbDelete(), ), ; iif(lR, dbUnLock(), ) }) Leto_Udf("UDF_DeleteRecs", , , "DEL", , .F.) dbGotop() ENDIF ? "File has been opened", Used(), select(), Alias(), "Append UDF_...", IndexOrd(), OrdCount() j := Valtype(NUM) For i := 1 To 100 cRecBuf := Leto_Udf("UDF_AppendRec", 'NUM', {'KOD', 'DEL'}, 100) Leto_ParseRec( cRecBuf ) // ? i, RecNo(), NUM IF RLock() REPL NAME with "Name_"+strzero(RecNo(), 7), ; INFO with "Info_"+iif(j == "N", hb_ntos(NUM), NUM)+"-"+j dbUnLock() ENDIF ? i, RecNo(), NUM, NAME Next leto_commit() ? "File appendet", LastRec(), "time", seconds() - t USE ? "Ok" результат TEST_DBF ( //127.0.0.1:2812/temp/ ) File = test3.dbf File has been created //127.0.0.1:2812/temp/test3.dbf File has been created //127.0.0.1:2812/temp/test3.cdx File has been opened .T. 1 TEST3 Append UDF_... 2 3 1 1 101 Name_0000001 2 2 102 Name_0000002 3 3 103 Name_0000003 4 4 104 Name_0000004 5 5 105 Name_0000005 6 6 106 Name_0000006 7 7 107 Name_0000007 8 8 108 Name_0000008 9 9 109 Name_0000009 10 10 110 Name_0000010 11 11 111 Name_0000011 12 12 112 Name_0000012 13 13 113 Name_0000013 14 14 114 Name_0000014 15 15 115 Name_0000015 16 16 116 Name_0000016 17 17 117 Name_0000017 ... 97 97 197 Name_0000097 98 98 198 Name_0000098 99 99 199 Name_0000099 100 100 200 Name_0000100 File appendet 100 time 8.89 Ok [/pre2]

SergKis: PS Используемые UDF немного модифицированы под себя [pre2] FUNCTION UDF_AppendRec( nUserStru, cFieldName, xOrder, xMin ) LOCAL nPos := FieldPos( cFieldName ), nLen LOCAL xKey, lApp, lOver := .F., xOrd1, xOrd2, nDec IF ! Empty( xOrder ) IF Valtype(xOrder) == "A" xOrd1 := xOrder[1] xOrd2 := xOrder[2] ELSE xOrd1 := xOrder ENDIF OrdSetFocus( xOrd1 ) ENDIF IF leto_TableLock( nUserStru, 1 ) dbGoBottom() xKey := FieldGet( nPos ) IF Empty(xKey) .and. ! Empty(xMin) xKey := xMin IF ValType( xKey ) == "C" nLen := hb_FieldLen( nPos ) If left(xKey, 1) == "0" .and. ! "." $ xKey xKey := left(xKey+space(nLen), nLen) Else xKey := right(space(nLen)+xKey, nLen) EndIf ENDIF ENDIF IF ValType( xKey ) == "N" xKey ++ IF hb_FieldType(nPos) $ 'NF' lOver := xKey > Val( Replicate( "9", hb_FieldLen( nPos ) ) ) ELSEIF hb_FieldLen( nPos ) == 2 lOver := xKey > 0x7FFF ELSEIF hb_FieldLen( nPos ) == 4 lOver := xKey > 0x7FFFFFFF ENDIF ELSEIF ValType( xKey ) == "C" nLen := Len(xKey) If "." $ xKey nDec := nLen - RAt(".", xKey) xKey := Str( Val(xKey) + 1, nLen, nDec ) ElseIf left(xKey, 1) == "0" xKey := StrZero( Val(xKey) + 1, nLen ) Else xKey := Str( Val(xKey) + 1, nLen ) EndIf lOver := ('*' $ xKey) ENDIF IF lOver lApp := .F. ELSE lApp := ( UDF_Append( nUserStru, xOrd2 ) != Nil ) ENDIF IF lApp FieldPut( nPos, xKey ) dbCommit() ENDIF leto_TableUnLock( nUserStru, 1 ) ELSE lApp := .F. ENDIF RETURN if( lApp, leto_rec( nUserStru ), Nil ) FUNCTION UDF_Append( nUserStru, xOrder ) LOCAL lApp, lSetDel, xRet IF xOrder != Nil OrdSetFocus( xOrder ) ENDIF lSetDel := Set( _SET_DELETED, .f. ) dbGoTop() Set( _SET_DELETED, lSetDel ) IF Deleted() .and. Empty( OrdKeyVal() ) IF( lApp := leto_RecLock( nUserStru ) ) dbRecall() ENDIF ELSE dbAppend() IF ( lApp := ! NetErr() ) leto_RecLock( nUserStru, RecNo() ) ENDIF ENDIF IF lApp xRet := leto_rec( nUserStru ) ENDIF RETURN xRet [/pre2]

Петр: Не на то обратили внимание. Вы не получили правильного результата, но функция на сервере выполнялась! Вот протестируйте (не забудьте letodb_0.log посмотреть) ? leto_UDFEXIST( "STR" ) ? leto_UDF( "STR" ) ? leto_UDF( "STR", 20, 10, .t. )

SergKis: протестил [pre2] ? "1. leto_GetAppOptions:", Leto_Udf("leto_GetAppOptions", 1) ? "2. leto_GetAppOptions:", Leto_Udf(cIP+"leto_GetAppOptions", 1) ? "3. leto_GetAppOptions:", Leto_Udf("leto_GetAppOptions") ? "4. leto_GetAppOptions:", Leto_Udf(cIP+"leto_GetAppOptions") ? "5. STR exist :", leto_UDFEXIST( "STR" ) ? "6. STR :", leto_UDF( "STR" ) ? "7. STR, 20, 10, .t. :", leto_UDF( "STR", 20, 10, .t. ) ? "8. STR, 20, 10, 2 :", leto_UDF( "STR", 20, 10, 2 ) результат 1. leto_GetAppOptions: NIL 2. leto_GetAppOptions: NIL 3. leto_GetAppOptions: NIL 4. leto_GetAppOptions: NIL 5. STR exist : .T. 6. STR : NIL 7. STR, 20, 10, .t. : 0.0000000000 8. STR, 20, 10, 2 : 0.0000000000 letodb_0.log 127.0.0.1 LENOVO demo.exe 08/02/16 00:07:14: Error BASE/1099 Argument error: STR Arguments: ( [ 1] = Type: N Val: 0, [ 2] = Type: U) 08/02/16 00:08:52: Error BASE/1099 Argument error: STR Arguments: ( [ 1] = Type: N Val: 0, [ 2] = Type: U) [/pre2]

SergKis: PS. Leto DB Server v.2.17b2

SergKis: Проверил на сборке с hwg, получил 1. leto_GetAppOptions: . 2. leto_GetAppOptions: . 3. leto_GetAppOptions: . 4. leto_GetAppOptions: . 5. STR exist : .T. 6. STR : NIL 7. STR, 20, 10, .t. : 1.0000000000 8. STR, 20, 10, 2 : 1.0000000000 letodb_1.log 127.0.0.1 LENOVO Demo.exe 08/02/16 08:33:36: Error BASE/1099 Argument error: STR Arguments: ( [ 1] = Type: N Val: 1, [ 2] = Type: U) Если эти команды должны работать (я думал только из hrb и это мне нравилось), то надо копать у себя клиентов letodb 1. letodb server - borland, hb3.2 из последней MiniGui 2. letodb client - msvc, hb2.0 + MiniGui 2.07 + LV866 ( EN+LV+RU ) 2. letodb client - msvc, hb3.2 + Hwg 2.19.b6 + LV866 ( EN+LV+RU ) Udf функции из letoudf.hrb - работают ok! Петр спасибо за помощь

Pasha: Петр пишет: не работает, проверил, еси бы рабтало, то опасно leto_udf( "fErase", myFile) и не нужны leto_ferase(...) и ключ ini EnableFileFunc = 0 Такие опасные функции вызвать нельзя, поскольку они не прилинкованы к серверу. Вызывать можно функции, указанные в request, ну и некоторые другие. Я пересматривал этот набор - он вполне безопасен. Впрочем, я уже добавил параметр EnableUDF в letodb.ini, для возможности отключения udf. Пока не сбросил это изменение - есть некоторые проблемы с правами доступа git

SergKis: Pasha пишет Впрочем, я уже добавил параметр EnableUDF в letodb.ini, для возможности отключения ud

SergKis: Pasha пишет Такие опасные функции вызвать нельзя, поскольку они не прилинкованы к серверу. Тут не все просто, если реализовывать запрос на сервере типа (через udf) SELECT R_1,R_2,R_3,... AS Kod,Name,Cena,... From TablM01 WHERУ R_1=... ORDER BY upper(Name) то fErase, fRename вполне могут понадобитьсяб, а возможность их вызова с клиента должна быть исключена, т.е. hb_IsFunction("fErase") - не выполнять requect подключение leto_Udf("UDF_fErase") - можно выполнять при наличии в hrb мне как то так видится, при установке флага



полная версия страницы