Member
Сообщений: 23
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 26.07.2003
|

07.08.2003, 12:12
А вы уверены, что
mov ax...
int....
и другая 16-ти битная требуха эффективна на том же проклятом всеми асмовцами PIV? И как насчёт сложности программ, и такой фтичи как конвейер и RISC-ядро?
- Почему DOSовская прога под P120 идёт быстрее чем на PIV1700? - что-то явно не так... - потому, что 16 бит и всякие там rep mowsb.
Кстати, асмовцы, что эффективнее:
Код:
for (i=0;i<16;i++){
a[i]=b[i];
}
или
Код:
for (i=0;i<16;i+=4){
a[i]=b[i];
a[i+1]=b[i+1];
a[i+2]=b[i+2];
a[i+3]=b[i+3];
}
если это написать на asm. Новые оптимизирующие компилеры иногда похлеще в плане скорости чем asm-ручные заморочки.
|
|
|
Guest
|

07.08.2003, 15:09
Цитата:
Originally posted by Timprog
[b]А вы уверены, что
mov ax...
int....
и другая 16-ти битная требуха эффективна на том же проклятом всеми асмовцами PIV?
|
За всех, кто использует ассемблер в своей работе, я говорить не могу. Но за себя могу сказать, что защищенный режим мне очень симпатичен (никогда его не проклинал, а, наоборот, приветствовал. Создавать "16-ти битную требуху" под 32-разрядный режим процессора считаю неразумным. На ассемблере можно вполне успешно создавать 32-разрядные приложения.
Цитата:
Originally posted by Timprog+-->
Цитата:
И как насчёт сложности программ, и такой фтичи как конвейер и RISC-ядро?
|
Сложность программ, как правило, не определяется языком программирования.
Цитата:
Originally posted by Timprog@
[b]- Почему DOSовская прога под P120 идёт быстрее чем на PIV1700? - что-то явно не так... - потому, что 16 бит и всякие там rep mowsb
|
Хм... Вы видимо говорите о инструкции movs(b/w/d). Но проблема не в ней или в 16-разрядах. Замедление происходит потому, что вызов системных функций в данном случае происходит через виртульную машину, которая и ответственна за снижение быстродействия работы программы. Если же поднять любой справочник, где есть время выполнения команд, то можно обнаружить, что время выполнения редко зависит от разрядности операндов.
<!--QuoteBegin-Timprog
[b]Кстати, асмовцы, что эффективнее:
Код:
for (i=0;i<16;i++){
a[i]=b[i];
}
или
Код:
for (i=0;i<16;i+=4){
a[i]=b[i];
a[i+1]=b[i+1];
a[i+2]=b[i+2];
a[i+3]=b[i+3];
}
если это написать на asm. Новые оптимизирующие компилеры иногда похлеще в плане скорости чем asm-ручные заморочки.
|
Эффективность сильно зависит от того, под какой процессор пишется программа. Первый вариант, как правило, эффективнее. Но если учитывать, что EPIC процессоры могут параллельно выполнять несколько операндов, то для них, возможно, второй вариант будет предпочтительнее (особенно, если в правой части будут какие-то вычисления).
Относительно эффективности оптимизирующих компиляторов, отмечу, что надо хорошо понимать, что с чем сравнивается. Оптимизацией компиляторов занимаются высококвалифицированные специалисты. Если программист, пишущий на ассемблере, имеет квалификацию не ниже тех специалистов, то его программа будет эффективнее, чем после компиляции с ЯВУ.
|
|
|
Guest
|

22.08.2003, 21:49
Цитата:
Кстати, асмовцы, что эффективнее:
Код:
for (i=0;i<16;i++){
a[i]=b[i];
}
или
Код:
for (i=0;i<16;i+=4){
a[i]=b[i];
a[i+1]=b[i+1];
a[i+2]=b[i+2];
a[i+3]=b[i+3];
}
|
А размер элемента массива какой?
Цитата:
если это написать на asm. Новые оптимизирующие компилеры иногда похлеще в плане скорости чем asm-ручные заморочки.
|
Говорим точнее.
1. С++ 7.0 показывает замечательные результаты.
Это правда, действительно радует. (Особенно, кто на оптимизации под Асм съел собаку и без соли  )
Но всё-таки заметте, что оптимизатор требует от вас, чтобы вы писали ЯВНЫЙ КОД.
Что это такое? Это когда оптимизатор может понять что лучше.
Очень часто я на это напарываюсь, пытаясь оптимизировать код ЯВУ.
Делаю вроде лучше, а входит наоборот.
Снова приходится в АСМ лезть
Ну а как бы ЯВУ не были хороши. Всё равно, пока никто не переплюнет изворотливого ума. Да и алгоритмы писать намного легче.
P.S
На следующей недели будет система макро для генерации WndProc
Обещаю, что такого вы и Delphi не видели
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
С уважением, Edmond / HI-TECH
verum index sui et falsi
http://wasm.ru
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
|
|
|
Member
Сообщений: 34
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 19.11.2003
|

01.12.2003, 22:01
Ну вы народ нагородили ! Зачем-то программистов на касты поделили, причем кому нужен АСМ, кому нет? Зачем? Вот мое мнение: без понимания внутренней структуры работы ЭВМ далеко шагнуть в мир программирования невозможно, ибо любой компилятор не прооптимизирует ваш код, так как если бы вы сделали это сами. А без знания языка низкого уровня (АСМ или маш. коды, хотя это одно и тоже) этого сделать просто неудастся !
И вообще я ЗА знание АССЕМБЛЕРА !
И вот сайтик посмотрел - ХВАЛЮ ! Довольно мило! Прям как дома!
|
|
|
Guest
|

17.12.2003, 04:52
Все эт замечательно..
Но я б очень хотел посмотреть на человека, к-й напишет прогу для работы с БД на Ассемблере.
ODBC и все такое.. 
Медаль сразу.
|
|
|
Guest
|

19.12.2003, 00:17
Цитата:
Originally posted by Anonymous
[b]Все эт замечательно..
Но я б очень хотел посмотреть на человека, к-й напишет прогу для работы с БД на Ассемблере.
ODBC и все такое.. 
Медаль сразу.
|
Написать программу на ассемблере, работающую с СУБД, не просто, а... очень просто. В свое время у меня было написано много утилит для работы с Firebird (Interbase) на native API. Кстати, рекомендую посмотреть на API Firebird, это хороший пример того, каким должен быть API. И что, мне можно занимать очередь за медалью?
|
|
|
Guest
|

20.12.2003, 03:03
Ага.. А если поподробнее?
Примерчик и все такое? 
Желательно Oracle, Cache ну и убогий Access.. 
Медаль уже в коробочке - ждет победителя..
|
|
|
Guest
|

20.12.2003, 03:03
Ага.. А если поподробнее?
Примерчик и все такое? 
Желательно Oracle, Cache ну и убогий Access.. 
Медаль уже в коробочке - ждет победителя..
|
|
|
Guest
|

20.12.2003, 03:03
Ага.. А если поподробнее?
Примерчик и все такое? 
Желательно Oracle, Cache ну и убогий Access.. 
Медаль уже в коробочке - ждет победителя..
|
|
|
Guest
|

20.12.2003, 03:03
Ага.. А если поподробнее?
Примерчик и все такое? 
Желательно Oracle, Cache ну и убогий Access.. 
Медаль уже в коробочке - ждет победителя..
|
|
|
Guest
|

20.12.2003, 03:03
Ага.. А если поподробнее?
Примерчик и все такое? 
Желательно Oracle, Cache ну и убогий Access.. 
Медаль уже в коробочке - ждет победителя..
|
|
|
Guest
|

23.12.2003, 02:47
Пример?! Пожалуйста. Это простая демонстрационная программка под Win32, которая позволяет создавать базу данных или соединиться с существующей базой данных, а также выполнить любой SQL-оператор (CREATE ..., ALTER ..., DROP ..., INSERT INTO ..., DELETE FROM ...). Единственное ограничение на исполнение операторов состоит в том, что не отображаются результаты выборки (оператор SELECT). Сделано это сознательно, поскольку в этом случае необходимо добавить работу с памятью, преобразование данных из различных форматов (целые, вещественные, даты и время, строки, BLObs и пр.). Наглядности это не добавит, но затруднит понимание исходного текста программы. В действительности, особых сложностей с реализацией оператора выборки нет (поверьте на слово или проверьте сами). Размер EXE-файла 8 Кб. Компилируется TASM, для линковки используется TLink. Диалоги сделаны в Visual Studio (rc & res файлы).
Код:
; =================================
; Interbase API 02
; written by Alexander Usoff
; Jan. 1998 y.
; for FIDO.ASM&WIN32
; =================================
; ---------------------------------
; DB create & connect & job
; ---------------------------------
Ideal
P586
Radix 16
Model flat
%NOINCL
include "winconst.inc"
include "winprocs.inc"
include "winmacro.inc"
include "intrbase.inc"
include "resource.inc"
quota = 27
MAX_SERVER = 20
MAX_DATABASE = 100
MAX_USER = 20
MAX_PASSWORD = 10
MAX_CHARSET = 0Bh
SV_LENGTH = 14; status vector length = 20 d
UDataSeg
hInst dd ?
dialect dd ?
server db MAX_SERVER + 1 dup (?)
ALIGN 4
database db MAX_DATABASE + 1 dup (?)
ALIGN 4
user db MAX_USER + 1 dup (?)
ALIGN 4
password db MAX_PASSWORD + 1 dup (?)
ALIGN 4
charset db MAX_CHARSET + 1 dup (?)
ALIGN 4
DataSeg
hDatabase dd 0
hTransaction dd 0
status_vector dd SV_LENGTH dup (0)
CodeSeg
; Основная программа (8 строк) :)
Start: call GetModuleHandleA, 0
mov [hInst],eax
call DialogBoxParamA, eax, IDD_IBLOGON,
0, offset IBLogonProc, 0
or eax,eax
jz short quit
call DialogBoxParamA, [hInst], IDD_SESSION,
0, offset SessionProc, 0
call isc_detach_database, offset status_vector,
offset hDatabase
quit: call ExitProcess, 0
public stdcall IBLogonProc
proc IBLogonProc stdcall
arg @@hDlg :dword, @@msg :dword, @@wPar :dword, @@lPar :dword
local @@buf :byte:170
uses esi, edi
UDataSeg
@@server dd ?
@@database dd ?
@@protocol dd ?
@@user dd ?
@@password dd ?
@@dialect dd ?
@@charset dd ?
DataSeg
ALIGN 4
@@charset_str db 'ASCII', 0
db 'BIG_5', 0
db 'CYRL', 0
db 'DOS437', 0
db 'DOS850', 0
db 'DOS852', 0
db 'DOS857', 0
db 'DOS860', 0
db 'DOS861', 0
db 'DOS863', 0
db 'DOS865', 0
db 'EUCJ_0208', 0
db 'GB_2312', 0
db 'ISO8859_1', 0
db 'KSC_5601', 0
db 'NEXT', 0
db 'NONE', 0
db 'OCTETS', 0
db 'SJIS_0208', 0
db 'UNICODE_FSS', 0
db 'WIN1250', 0
db 'WIN1251', 0
db 'WIN1252', 0
db 'WIN1253', 0
db 'WIN1254', 0, 0
@@dialect_str db '1', 0, '2', 0, '3', 0, 0
@@protocol_str db 'TCP/IP', 0, 'NetBEUI', 0, 0
@@sql_createdb db @@len_createdb
db 'CREATE DATABASE ', quota
@@len_createdb = $ - @@sql_createdb - 1
@@sql_dbuser db @@len_dbuser
db quota, ' USER ', quota
@@len_dbuser = $ - @@sql_dbuser - 1
@@sql_dbpswd db @@len_dbpswd
db quota, ' PASSWORD ', quota
@@len_dbpswd = $ - @@sql_dbpswd - 1
@@sql_dbpage db @@len_dbpage
db quota, ' PAGE_SIZE = 4096 DEFAULT CHARACTER SET '
@@len_dbpage = $ - @@sql_dbpage - 1
DlgVector WM_INITDIALOG, WM_COMMAND
MSG_HANDLER WM_INITDIALOG
mov edi,IDC_SERVER - 1
mov esi,offset @@server - 4
@@init_item: inc edi
add esi,4
call GetDlgItem, [@@hDlg], edi
mov [dword esi],eax
cmp edi,IDC_CHARSET
jb short @@init_item
call SendMessageA, [@@server], EM_LIMITTEXT, MAX_SERVER - 1, 0
call SendMessageA, [@@database], EM_LIMITTEXT, MAX_DATABASE - 1, 0
call SendMessageA, [@@user], EM_LIMITTEXT, MAX_USER - 1, 0
call SendMessageA, [@@password], EM_LIMITTEXT, MAX_PASSWORD - 1, 0
mov edi,[@@charset]
mov esi,offset @@charset_str
call FillCombobox stdcall, 10
mov edi,[@@dialect]
call FillCombobox stdcall, 2
mov edi,[@@protocol]
call FillCombobox stdcall, 1
END_HANDLER ret_true
MSG_HANDLER WM_COMMAND
CmdVector IDC_DBCREATE, IDC_DBCONNECT, IDC_LOGCANCEL
END_HANDLER
MSG_HANDLER IDC_DBCREATE
; read fields
; create database
; detach database
mov edi,offset @@create_database
@@read_logparams:
call SendMessageA, [@@server], WM_GETTEXT, MAX_SERVER, offset server + 1
mov [server],al
call SendMessageA, [@@database], WM_GETTEXT, MAX_DATABASE, offset database + 1
mov [database],al
call SendMessageA, [@@user], WM_GETTEXT, MAX_USER, offset user + 1
mov [user],al
call SendMessageA, [@@password], WM_GETTEXT, MAX_PASSWORD, offset password + 1
mov [password],al
call SendMessageA, [@@charset], WM_GETTEXT, MAX_CHARSET, offset charset + 1
mov [charset],al
call SendMessageA, [@@dialect], CB_GETCURSEL, 0, 0
inc eax
mov [dialect],eax
jmp edi
@@create_database:
lea edi,[@@buf]
mov edx,edi
xor ecx,ecx
cld
CopyPStr offset @@sql_createdb
mov cl,[server]
or ecx,ecx
jz short @@copy_db
call SendMessageA, [@@protocol], CB_GETCURSEL, 0, 0
xor ecx,ecx
or eax,eax
mov al,':'
jnz short @@tcpip
mov [word edi],''
add edi,2
mov al,''
@@tcpip: CopyPStr offset server
stosb
@@copy_db: ConcatPStr database, @@sql_dbuser, user, @@sql_dbpswd, password, @@sql_dbpage, charset
mov al,';'
stosb
sub edi,edx
call isc_dsql_exec_immed2, offset status_vector,
offset hDatabase,
offset hTransaction,
edi, edx, [dialect],
0, 0
or eax,eax
jnz @@err_createdb
call isc_detach_database, offset status_vector,
offset hDatabase
END_HANDLER connect
MSG_HANDLER IDC_DBCONNECT
; read fields
; fill dpb
; connect database
mov edi,offset @@connect
jmp @@read_logparams
@@connect: lea edi,[@@buf]
mov edx,edi
mov [dword edi],(((((0F0 shl 8) + 1) shl 8) + isc_dpb_num_buffers) shl 8) + isc_dpb_version1
add edi,4
mov [word edi],isc_dpb_force_write
add edi,2
xor ecx,ecx
cld
mov [byte edi],isc_dpb_lc_ctype
mov esi,offset charset
inc edi
mov cl,[byte esi]
inc ecx
rep movsb
mov [byte edi],isc_dpb_user_name
mov esi,offset user
inc edi
mov cl,[byte esi]
inc ecx
rep movsb
mov [byte edi],isc_dpb_password
mov esi,offset password
inc edi
mov cl,[byte esi]
inc ecx
rep movsb
sub edi,edx
call isc_attach_database, offset status_vector,
ecx, offset database + 1,
offset hDatabase, edi, edx
or eax,eax
jnz short @@err_attach
mov eax,1
END_HANDLER short end
MSG_HANDLER IDC_LOGCANCEL
xor eax,eax
@@end: call EndDialog, [@@hDlg], eax
END_HANDLER ret_false
@@err_createdb:
@@err_attach:
jmp @@ret_false
endp IBLogonProc
proc FillCombobox stdcall
arg @@index :dword
; edi = id combobox item
; esi = offset string list
@@1: call SendMessageA, edi, CB_ADDSTRING, 0, esi
xor eax,eax
@@2: mov al,[byte esi]
inc esi
or eax,eax
jnz short @@2
mov al,[byte esi]
or eax,eax
jnz short @@1
call SendMessageA, edi, CB_SETCURSEL, [@@index], 0
inc esi
ret
endp FillCombobox
public stdcall SessionProc
proc SessionProc stdcall
arg @@hDlg :dword, @@msg :dword, @@wPar :dword, @@lPar :dword
local @@psv :dword, @@len :dword, @@buf :byte:400
UDataSeg
@@query dd ?
@@history dd ?
DataSeg
ALIGN 4
tpb db isc_tpb_version3
db isc_tpb_write
db isc_tpb_read_committed
db isc_tpb_no_rec_version
db isc_tpb_wait
LENGTH_TPB = $ - tpb
@@ok db 'Ok.'
@@zero db 0
@@error db 'Error!', 0
DlgVector WM_INITDIALOG, WM_COMMAND
MSG_HANDLER WM_INITDIALOG
call GetDlgItem, [@@hDlg], IDC_QUERY
mov [@@query],eax
call GetDlgItem, [@@hDlg], IDC_HISTORY
mov [@@history],eax
call isc_start_transaction, offset status_vector,
offset hTransaction,
1, offset hDataBase,
LENGTH_TPB, offset tpb
END_HANDLER short ret_false
MSG_HANDLER WM_COMMAND
CmdVector IDC_RUN, IDC_COMMIT, IDC_ROLLBACK, IDC_OK
END_HANDLER short ret_false
MSG_HANDLER IDC_RUN
push ebx
lea ebx,[@@buf]
call SendMessageA, [@@query], WM_GETTEXT, 400, ebx
or eax,eax
jz @@ret_false
dec eax
mov [@@len],eax
xor eax,eax
mov edx,ebx
@@scan: mov al,[byte edx]
inc edx
cmp al,0Dh
je short @@eol
or eax,eax
jz short @@exec
jmp short @@scan
@@eol: mov [byte edx - 1],0
push edx
call SendMessageA, [@@history], LB_ADDSTRING, 0, ebx
pop edx
mov [byte edx - 1],0Dh
inc edx
mov ebx,edx
jmp short @@scan
@@exec: call SendMessageA, [@@history], LB_ADDSTRING, 0, ebx
lea ebx,[@@buf]
call isc_dsql_exec_immed2, offset status_vector,
offset hDataBase,
offset hTransaction,
[@@len], ebx, [dialect], 0, 0
or eax,eax
jnz short @@err_query
call SendMessageA, [@@query], WM_SETTEXT, 0, offset @@zero
call SendMessageA, [@@history], LB_ADDSTRING, 0, offset @@ok
call SendMessageA, [@@history], LB_ADDSTRING, 0, offset @@zero
pop ebx
END_HANDLER ret_false
@@err_query: call SendMessageA, [@@history], LB_ADDSTRING, 0, offset @@error
mov [@@psv],offset status_vector
@@err_loop: lea edx,[@@psv]
call isc_interprete, ebx, edx
or eax,eax
jz short @@end_err_loop
call SendMessageA, [@@history], LB_ADDSTRING, 0, ebx
jmp short @@err_loop
@@end_err_loop: call SendMessageA, [@@history], LB_ADDSTRING, 0, offset @@zero
pop ebx
jmp @@ret_false
MSG_HANDLER IDC_COMMIT
call isc_commit_retaining, offset status_vector,
offset hTransaction
END_HANDLER ret_false
MSG_HANDLER IDC_ROLLBACK
call isc_rollback_retaining, offset status_vector,
offset hTransaction
END_HANDLER ret_false
MSG_HANDLER IDC_OK
call isc_commit_transaction, offset status_vector,
offset hTransaction
call EndDialog, [@@hDlg], 0
END_HANDLER ret_false
endp SessionProc
End Start
Работа с Oracle значительно сложнее, Access я не использую. А Cache... это для мазохистов (IMHO).
|
|
|
Guest
|

23.12.2003, 02:47
Пример?! Пожалуйста. Это простая демонстрационная программка под Win32, которая позволяет создавать базу данных или соединиться с существующей базой данных, а также выполнить любой SQL-оператор (CREATE ..., ALTER ..., DROP ..., INSERT INTO ..., DELETE FROM ...). Единственное ограничение на исполнение операторов состоит в том, что не отображаются результаты выборки (оператор SELECT). Сделано это сознательно, поскольку в этом случае необходимо добавить работу с памятью, преобразование данных из различных форматов (целые, вещественные, даты и время, строки, BLObs и пр.). Наглядности это не добавит, но затруднит понимание исходного текста программы. В действительности, особых сложностей с реализацией оператора выборки нет (поверьте на слово или проверьте сами). Размер EXE-файла 8 Кб. Компилируется TASM, для линковки используется TLink. Диалоги сделаны в Visual Studio (rc & res файлы).
Код:
; =================================
; Interbase API 02
; written by Alexander Usoff
; Jan. 1998 y.
; for FIDO.ASM&WIN32
; =================================
; ---------------------------------
; DB create & connect & job
; ---------------------------------
Ideal
P586
Radix 16
Model flat
%NOINCL
include "winconst.inc"
include "winprocs.inc"
include "winmacro.inc"
include "intrbase.inc"
include "resource.inc"
quota = 27
MAX_SERVER = 20
MAX_DATABASE = 100
MAX_USER = 20
MAX_PASSWORD = 10
MAX_CHARSET = 0Bh
SV_LENGTH = 14; status vector length = 20 d
UDataSeg
hInst dd ?
dialect dd ?
server db MAX_SERVER + 1 dup (?)
ALIGN 4
database db MAX_DATABASE + 1 dup (?)
ALIGN 4
user db MAX_USER + 1 dup (?)
ALIGN 4
password db MAX_PASSWORD + 1 dup (?)
ALIGN 4
charset db MAX_CHARSET + 1 dup (?)
ALIGN 4
DataSeg
hDatabase dd 0
hTransaction dd 0
status_vector dd SV_LENGTH dup (0)
CodeSeg
; Основная программа (8 строк) :)
Start: call GetModuleHandleA, 0
mov [hInst],eax
call DialogBoxParamA, eax, IDD_IBLOGON,
0, offset IBLogonProc, 0
or eax,eax
jz short quit
call DialogBoxParamA, [hInst], IDD_SESSION,
0, offset SessionProc, 0
call isc_detach_database, offset status_vector,
offset hDatabase
quit: call ExitProcess, 0
public stdcall IBLogonProc
proc IBLogonProc stdcall
arg @@hDlg :dword, @@msg :dword, @@wPar :dword, @@lPar :dword
local @@buf :byte:170
uses esi, edi
UDataSeg
@@server dd ?
@@database dd ?
@@protocol dd ?
@@user dd ?
@@password dd ?
@@dialect dd ?
@@charset dd ?
DataSeg
ALIGN 4
@@charset_str db 'ASCII', 0
db 'BIG_5', 0
db 'CYRL', 0
db 'DOS437', 0
db 'DOS850', 0
db 'DOS852', 0
db 'DOS857', 0
db 'DOS860', 0
db 'DOS861', 0
db 'DOS863', 0
db 'DOS865', 0
db 'EUCJ_0208', 0
db 'GB_2312', 0
db 'ISO8859_1', 0
db 'KSC_5601', 0
db 'NEXT', 0
db 'NONE', 0
db 'OCTETS', 0
db 'SJIS_0208', 0
db 'UNICODE_FSS', 0
db 'WIN1250', 0
db 'WIN1251', 0
db 'WIN1252', 0
db 'WIN1253', 0
db 'WIN1254', 0, 0
@@dialect_str db '1', 0, '2', 0, '3', 0, 0
@@protocol_str db 'TCP/IP', 0, 'NetBEUI', 0, 0
@@sql_createdb db @@len_createdb
db 'CREATE DATABASE ', quota
@@len_createdb = $ - @@sql_createdb - 1
@@sql_dbuser db @@len_dbuser
db quota, ' USER ', quota
@@len_dbuser = $ - @@sql_dbuser - 1
@@sql_dbpswd db @@len_dbpswd
db quota, ' PASSWORD ', quota
@@len_dbpswd = $ - @@sql_dbpswd - 1
@@sql_dbpage db @@len_dbpage
db quota, ' PAGE_SIZE = 4096 DEFAULT CHARACTER SET '
@@len_dbpage = $ - @@sql_dbpage - 1
DlgVector WM_INITDIALOG, WM_COMMAND
MSG_HANDLER WM_INITDIALOG
mov edi,IDC_SERVER - 1
mov esi,offset @@server - 4
@@init_item: inc edi
add esi,4
call GetDlgItem, [@@hDlg], edi
mov [dword esi],eax
cmp edi,IDC_CHARSET
jb short @@init_item
call SendMessageA, [@@server], EM_LIMITTEXT, MAX_SERVER - 1, 0
call SendMessageA, [@@database], EM_LIMITTEXT, MAX_DATABASE - 1, 0
call SendMessageA, [@@user], EM_LIMITTEXT, MAX_USER - 1, 0
call SendMessageA, [@@password], EM_LIMITTEXT, MAX_PASSWORD - 1, 0
mov edi,[@@charset]
mov esi,offset @@charset_str
call FillCombobox stdcall, 10
mov edi,[@@dialect]
call FillCombobox stdcall, 2
mov edi,[@@protocol]
call FillCombobox stdcall, 1
END_HANDLER ret_true
MSG_HANDLER WM_COMMAND
CmdVector IDC_DBCREATE, IDC_DBCONNECT, IDC_LOGCANCEL
END_HANDLER
MSG_HANDLER IDC_DBCREATE
; read fields
; create database
; detach database
mov edi,offset @@create_database
@@read_logparams:
call SendMessageA, [@@server], WM_GETTEXT, MAX_SERVER, offset server + 1
mov [server],al
call SendMessageA, [@@database], WM_GETTEXT, MAX_DATABASE, offset database + 1
mov [database],al
call SendMessageA, [@@user], WM_GETTEXT, MAX_USER, offset user + 1
mov [user],al
call SendMessageA, [@@password], WM_GETTEXT, MAX_PASSWORD, offset password + 1
mov [password],al
call SendMessageA, [@@charset], WM_GETTEXT, MAX_CHARSET, offset charset + 1
mov [charset],al
call SendMessageA, [@@dialect], CB_GETCURSEL, 0, 0
inc eax
mov [dialect],eax
jmp edi
@@create_database:
lea edi,[@@buf]
mov edx,edi
xor ecx,ecx
cld
CopyPStr offset @@sql_createdb
mov cl,[server]
or ecx,ecx
jz short @@copy_db
call SendMessageA, [@@protocol], CB_GETCURSEL, 0, 0
xor ecx,ecx
or eax,eax
mov al,':'
jnz short @@tcpip
mov [word edi],''
add edi,2
mov al,''
@@tcpip: CopyPStr offset server
stosb
@@copy_db: ConcatPStr database, @@sql_dbuser, user, @@sql_dbpswd, password, @@sql_dbpage, charset
mov al,';'
stosb
sub edi,edx
call isc_dsql_exec_immed2, offset status_vector,
offset hDatabase,
offset hTransaction,
edi, edx, [dialect],
0, 0
or eax,eax
jnz @@err_createdb
call isc_detach_database, offset status_vector,
offset hDatabase
END_HANDLER connect
MSG_HANDLER IDC_DBCONNECT
; read fields
; fill dpb
; connect database
mov edi,offset @@connect
jmp @@read_logparams
@@connect: lea edi,[@@buf]
mov edx,edi
mov [dword edi],(((((0F0 shl 8) + 1) shl 8) + isc_dpb_num_buffers) shl 8) + isc_dpb_version1
add edi,4
mov [word edi],isc_dpb_force_write
add edi,2
xor ecx,ecx
cld
mov [byte edi],isc_dpb_lc_ctype
mov esi,offset charset
inc edi
mov cl,[byte esi]
inc ecx
rep movsb
mov [byte edi],isc_dpb_user_name
mov esi,offset user
inc edi
mov cl,[byte esi]
inc ecx
rep movsb
mov [byte edi],isc_dpb_password
mov esi,offset password
inc edi
mov cl,[byte esi]
inc ecx
rep movsb
sub edi,edx
call isc_attach_database, offset status_vector,
ecx, offset database + 1,
offset hDatabase, edi, edx
or eax,eax
jnz short @@err_attach
mov eax,1
END_HANDLER short end
MSG_HANDLER IDC_LOGCANCEL
xor eax,eax
@@end: call EndDialog, [@@hDlg], eax
END_HANDLER ret_false
@@err_createdb:
@@err_attach:
jmp @@ret_false
endp IBLogonProc
proc FillCombobox stdcall
arg @@index :dword
; edi = id combobox item
; esi = offset string list
@@1: call SendMessageA, edi, CB_ADDSTRING, 0, esi
xor eax,eax
@@2: mov al,[byte esi]
inc esi
or eax,eax
jnz short @@2
mov al,[byte esi]
or eax,eax
jnz short @@1
call SendMessageA, edi, CB_SETCURSEL, [@@index], 0
inc esi
ret
endp FillCombobox
public stdcall SessionProc
proc SessionProc stdcall
arg @@hDlg :dword, @@msg :dword, @@wPar :dword, @@lPar :dword
local @@psv :dword, @@len :dword, @@buf :byte:400
UDataSeg
@@query dd ?
@@history dd ?
DataSeg
ALIGN 4
tpb db isc_tpb_version3
db isc_tpb_write
db isc_tpb_read_committed
db isc_tpb_no_rec_version
db isc_tpb_wait
LENGTH_TPB = $ - tpb
@@ok db 'Ok.'
@@zero db 0
@@error db 'Error!', 0
DlgVector WM_INITDIALOG, WM_COMMAND
MSG_HANDLER WM_INITDIALOG
call GetDlgItem, [@@hDlg], IDC_QUERY
mov [@@query],eax
call GetDlgItem, [@@hDlg], IDC_HISTORY
mov [@@history],eax
call isc_start_transaction, offset status_vector,
offset hTransaction,
1, offset hDataBase,
LENGTH_TPB, offset tpb
END_HANDLER short ret_false
MSG_HANDLER WM_COMMAND
CmdVector IDC_RUN, IDC_COMMIT, IDC_ROLLBACK, IDC_OK
END_HANDLER short ret_false
MSG_HANDLER IDC_RUN
push ebx
lea ebx,[@@buf]
call SendMessageA, [@@query], WM_GETTEXT, 400, ebx
or eax,eax
jz @@ret_false
dec eax
mov [@@len],eax
xor eax,eax
mov edx,ebx
@@scan: mov al,[byte edx]
inc edx
cmp al,0Dh
je short @@eol
or eax,eax
jz short @@exec
jmp short @@scan
@@eol: mov [byte edx - 1],0
push edx
call SendMessageA, [@@history], LB_ADDSTRING, 0, ebx
pop edx
mov [byte edx - 1],0Dh
inc edx
mov ebx,edx
jmp short @@scan
@@exec: call SendMessageA, [@@history], LB_ADDSTRING, 0, ebx
lea ebx,[@@buf]
call isc_dsql_exec_immed2, offset status_vector,
offset hDataBase,
offset hTransaction,
[@@len], ebx, [dialect], 0, 0
or eax,eax
jnz short @@err_query
call SendMessageA, [@@query], WM_SETTEXT, 0, offset @@zero
call SendMessageA, [@@history], LB_ADDSTRING, 0, offset @@ok
call SendMessageA, [@@history], LB_ADDSTRING, 0, offset @@zero
pop ebx
END_HANDLER ret_false
@@err_query: call SendMessageA, [@@history], LB_ADDSTRING, 0, offset @@error
mov [@@psv],offset status_vector
@@err_loop: lea edx,[@@psv]
call isc_interprete, ebx, edx
or eax,eax
jz short @@end_err_loop
call SendMessageA, [@@history], LB_ADDSTRING, 0, ebx
jmp short @@err_loop
@@end_err_loop: call SendMessageA, [@@history], LB_ADDSTRING, 0, offset @@zero
pop ebx
jmp @@ret_false
MSG_HANDLER IDC_COMMIT
call isc_commit_retaining, offset status_vector,
offset hTransaction
END_HANDLER ret_false
MSG_HANDLER IDC_ROLLBACK
call isc_rollback_retaining, offset status_vector,
offset hTransaction
END_HANDLER ret_false
MSG_HANDLER IDC_OK
call isc_commit_transaction, offset status_vector,
offset hTransaction
call EndDialog, [@@hDlg], 0
END_HANDLER ret_false
endp SessionProc
End Start
Работа с Oracle значительно сложнее, Access я не использую. А Cache... это для мазохистов (IMHO).
|
|
|
Guest
|

23.12.2003, 02:47
Пример?! Пожалуйста. Это простая демонстрационная программка под Win32, которая позволяет создавать базу данных или соединиться с существующей базой данных, а также выполнить любой SQL-оператор (CREATE ..., ALTER ..., DROP ..., INSERT INTO ..., DELETE FROM ...). Единственное ограничение на исполнение операторов состоит в том, что не отображаются результаты выборки (оператор SELECT). Сделано это сознательно, поскольку в этом случае необходимо добавить работу с памятью, преобразование данных из различных форматов (целые, вещественные, даты и время, строки, BLObs и пр.). Наглядности это не добавит, но затруднит понимание исходного текста программы. В действительности, особых сложностей с реализацией оператора выборки нет (поверьте на слово или проверьте сами). Размер EXE-файла 8 Кб. Компилируется TASM, для линковки используется TLink. Диалоги сделаны в Visual Studio (rc & res файлы).
Код:
; =================================
; Interbase API 02
; written by Alexander Usoff
; Jan. 1998 y.
; for FIDO.ASM&WIN32
; =================================
; ---------------------------------
; DB create & connect & job
; ---------------------------------
Ideal
P586
Radix 16
Model flat
%NOINCL
include "winconst.inc"
include "winprocs.inc"
include "winmacro.inc"
include "intrbase.inc"
include "resource.inc"
quota = 27
MAX_SERVER = 20
MAX_DATABASE = 100
MAX_USER = 20
MAX_PASSWORD = 10
MAX_CHARSET = 0Bh
SV_LENGTH = 14; status vector length = 20 d
UDataSeg
hInst dd ?
dialect dd ?
server db MAX_SERVER + 1 dup (?)
ALIGN 4
database db MAX_DATABASE + 1 dup (?)
ALIGN 4
user db MAX_USER + 1 dup (?)
ALIGN 4
password db MAX_PASSWORD + 1 dup (?)
ALIGN 4
charset db MAX_CHARSET + 1 dup (?)
ALIGN 4
DataSeg
hDatabase dd 0
hTransaction dd 0
status_vector dd SV_LENGTH dup (0)
CodeSeg
; Основная программа (8 строк) :)
Start: call GetModuleHandleA, 0
mov [hInst],eax
call DialogBoxParamA, eax, IDD_IBLOGON,
0, offset IBLogonProc, 0
or eax,eax
jz short quit
call DialogBoxParamA, [hInst], IDD_SESSION,
0, offset SessionProc, 0
call isc_detach_database, offset status_vector,
offset hDatabase
quit: call ExitProcess, 0
public stdcall IBLogonProc
proc IBLogonProc stdcall
arg @@hDlg :dword, @@msg :dword, @@wPar :dword, @@lPar :dword
local @@buf :byte:170
uses esi, edi
UDataSeg
@@server dd ?
@@database dd ?
@@protocol dd ?
@@user dd ?
@@password dd ?
@@dialect dd ?
@@charset dd ?
DataSeg
ALIGN 4
@@charset_str db 'ASCII', 0
db 'BIG_5', 0
db 'CYRL', 0
db 'DOS437', 0
db 'DOS850', 0
db 'DOS852', 0
db 'DOS857', 0
db 'DOS860', 0
db 'DOS861', 0
db 'DOS863', 0
db 'DOS865', 0
db 'EUCJ_0208', 0
db 'GB_2312', 0
db 'ISO8859_1', 0
db 'KSC_5601', 0
db 'NEXT', 0
db 'NONE', 0
db 'OCTETS', 0
db 'SJIS_0208', 0
db 'UNICODE_FSS', 0
db 'WIN1250', 0
db 'WIN1251', 0
db 'WIN1252', 0
db 'WIN1253', 0
db 'WIN1254', 0, 0
@@dialect_str db '1', 0, '2', 0, '3', 0, 0
@@protocol_str db 'TCP/IP', 0, 'NetBEUI', 0, 0
@@sql_createdb db @@len_createdb
db 'CREATE DATABASE ', quota
@@len_createdb = $ - @@sql_createdb - 1
@@sql_dbuser db @@len_dbuser
db quota, ' USER ', quota
@@len_dbuser = $ - @@sql_dbuser - 1
@@sql_dbpswd db @@len_dbpswd
db quota, ' PASSWORD ', quota
@@len_dbpswd = $ - @@sql_dbpswd - 1
@@sql_dbpage db @@len_dbpage
db quota, ' PAGE_SIZE = 4096 DEFAULT CHARACTER SET '
@@len_dbpage = $ - @@sql_dbpage - 1
DlgVector WM_INITDIALOG, WM_COMMAND
MSG_HANDLER WM_INITDIALOG
mov edi,IDC_SERVER - 1
mov esi,offset @@server - 4
@@init_item: inc edi
add esi,4
call GetDlgItem, [@@hDlg], edi
mov [dword esi],eax
cmp edi,IDC_CHARSET
jb short @@init_item
call SendMessageA, [@@server], EM_LIMITTEXT, MAX_SERVER - 1, 0
call SendMessageA, [@@database], EM_LIMITTEXT, MAX_DATABASE - 1, 0
call SendMessageA, [@@user], EM_LIMITTEXT, MAX_USER - 1, 0
call SendMessageA, [@@password], EM_LIMITTEXT, MAX_PASSWORD - 1, 0
mov edi,[@@charset]
mov esi,offset @@charset_str
call FillCombobox stdcall, 10
mov edi,[@@dialect]
call FillCombobox stdcall, 2
mov edi,[@@protocol]
call FillCombobox stdcall, 1
END_HANDLER ret_true
MSG_HANDLER WM_COMMAND
CmdVector IDC_DBCREATE, IDC_DBCONNECT, IDC_LOGCANCEL
END_HANDLER
MSG_HANDLER IDC_DBCREATE
; read fields
; create database
; detach database
mov edi,offset @@create_database
@@read_logparams:
call SendMessageA, [@@server], WM_GETTEXT, MAX_SERVER, offset server + 1
mov [server],al
call SendMessageA, [@@database], WM_GETTEXT, MAX_DATABASE, offset database + 1
mov [database],al
call SendMessageA, [@@user], WM_GETTEXT, MAX_USER, offset user + 1
mov [user],al
call SendMessageA, [@@password], WM_GETTEXT, MAX_PASSWORD, offset password + 1
mov [password],al
call SendMessageA, [@@charset], WM_GETTEXT, MAX_CHARSET, offset charset + 1
mov [charset],al
call SendMessageA, [@@dialect], CB_GETCURSEL, 0, 0
inc eax
mov [dialect],eax
jmp edi
@@create_database:
lea edi,[@@buf]
mov edx,edi
xor ecx,ecx
cld
CopyPStr offset @@sql_createdb
mov cl,[server]
or ecx,ecx
jz short @@copy_db
call SendMessageA, [@@protocol], CB_GETCURSEL, 0, 0
xor ecx,ecx
or eax,eax
mov al,':'
jnz short @@tcpip
mov [word edi],''
add edi,2
mov al,''
@@tcpip: CopyPStr offset server
stosb
@@copy_db: ConcatPStr database, @@sql_dbuser, user, @@sql_dbpswd, password, @@sql_dbpage, charset
mov al,';'
stosb
sub edi,edx
call isc_dsql_exec_immed2, offset status_vector,
offset hDatabase,
offset hTransaction,
edi, edx, [dialect],
0, 0
or eax,eax
jnz @@err_createdb
call isc_detach_database, offset status_vector,
offset hDatabase
END_HANDLER connect
MSG_HANDLER IDC_DBCONNECT
; read fields
; fill dpb
; connect database
mov edi,offset @@connect
jmp @@read_logparams
@@connect: lea edi,[@@buf]
mov edx,edi
mov [dword edi],(((((0F0 shl 8) + 1) shl 8) + isc_dpb_num_buffers) shl 8) + isc_dpb_version1
add edi,4
mov [word edi],isc_dpb_force_write
add edi,2
xor ecx,ecx
cld
mov [byte edi],isc_dpb_lc_ctype
mov esi,offset charset
inc edi
mov cl,[byte esi]
inc ecx
rep movsb
mov [byte edi],isc_dpb_user_name
mov esi,offset user
inc edi
mov cl,[byte esi]
inc ecx
rep movsb
mov [byte edi],isc_dpb_password
mov esi,offset password
inc edi
mov cl,[byte esi]
inc ecx
rep movsb
sub edi,edx
call isc_attach_database, offset status_vector,
ecx, offset database + 1,
offset hDatabase, edi, edx
or eax,eax
jnz short @@err_attach
mov eax,1
END_HANDLER short end
MSG_HANDLER IDC_LOGCANCEL
xor eax,eax
@@end: call EndDialog, [@@hDlg], eax
END_HANDLER ret_false
@@err_createdb:
@@err_attach:
jmp @@ret_false
endp IBLogonProc
proc FillCombobox stdcall
arg @@index :dword
; edi = id combobox item
; esi = offset string list
@@1: call SendMessageA, edi, CB_ADDSTRING, 0, esi
xor eax,eax
@@2: mov al,[byte esi]
inc esi
or eax,eax
jnz short @@2
mov al,[byte esi]
or eax,eax
jnz short @@1
call SendMessageA, edi, CB_SETCURSEL, [@@index], 0
inc esi
ret
endp FillCombobox
public stdcall SessionProc
proc SessionProc stdcall
arg @@hDlg :dword, @@msg :dword, @@wPar :dword, @@lPar :dword
local @@psv :dword, @@len :dword, @@buf :byte:400
UDataSeg
@@query dd ?
@@history dd ?
DataSeg
ALIGN 4
tpb db isc_tpb_version3
db isc_tpb_write
db isc_tpb_read_committed
db isc_tpb_no_rec_version
db isc_tpb_wait
LENGTH_TPB = $ - tpb
@@ok db 'Ok.'
@@zero db 0
@@error db 'Error!', 0
DlgVector WM_INITDIALOG, WM_COMMAND
MSG_HANDLER WM_INITDIALOG
call GetDlgItem, [@@hDlg], IDC_QUERY
mov [@@query],eax
call GetDlgItem, [@@hDlg], IDC_HISTORY
mov [@@history],eax
call isc_start_transaction, offset status_vector,
offset hTransaction,
1, offset hDataBase,
LENGTH_TPB, offset tpb
END_HANDLER short ret_false
MSG_HANDLER WM_COMMAND
CmdVector IDC_RUN, IDC_COMMIT, IDC_ROLLBACK, IDC_OK
END_HANDLER short ret_false
MSG_HANDLER IDC_RUN
push ebx
lea ebx,[@@buf]
call SendMessageA, [@@query], WM_GETTEXT, 400, ebx
or eax,eax
jz @@ret_false
dec eax
mov [@@len],eax
xor eax,eax
mov edx,ebx
@@scan: mov al,[byte edx]
inc edx
cmp al,0Dh
je short @@eol
or eax,eax
jz short @@exec
jmp short @@scan
@@eol: mov [byte edx - 1],0
push edx
call SendMessageA, [@@history], LB_ADDSTRING, 0, ebx
pop edx
mov [byte edx - 1],0Dh
inc edx
mov ebx,edx
jmp short @@scan
@@exec: call SendMessageA, [@@history], LB_ADDSTRING, 0, ebx
lea ebx,[@@buf]
call isc_dsql_exec_immed2, offset status_vector,
offset hDataBase,
offset hTransaction,
[@@len], ebx, [dialect], 0, 0
or eax,eax
jnz short @@err_query
call SendMessageA, [@@query], WM_SETTEXT, 0, offset @@zero
call SendMessageA, [@@history], LB_ADDSTRING, 0, offset @@ok
call SendMessageA, [@@history], LB_ADDSTRING, 0, offset @@zero
pop ebx
END_HANDLER ret_false
@@err_query: call SendMessageA, [@@history], LB_ADDSTRING, 0, offset @@error
mov [@@psv],offset status_vector
@@err_loop: lea edx,[@@psv]
call isc_interprete, ebx, edx
or eax,eax
jz short @@end_err_loop
call SendMessageA, [@@history], LB_ADDSTRING, 0, ebx
jmp short @@err_loop
@@end_err_loop: call SendMessageA, [@@history], LB_ADDSTRING, 0, offset @@zero
pop ebx
jmp @@ret_false
MSG_HANDLER IDC_COMMIT
call isc_commit_retaining, offset status_vector,
offset hTransaction
END_HANDLER ret_false
MSG_HANDLER IDC_ROLLBACK
call isc_rollback_retaining, offset status_vector,
offset hTransaction
END_HANDLER ret_false
MSG_HANDLER IDC_OK
call isc_commit_transaction, offset status_vector,
offset hTransaction
call EndDialog, [@@hDlg], 0
END_HANDLER ret_false
endp SessionProc
End Start
Работа с Oracle значительно сложнее, Access я не использую. А Cache... это для мазохистов (IMHO).
|
|
|
Guest
|

23.12.2003, 02:47
Пример?! Пожалуйста. Это простая демонстрационная программка под Win32, которая позволяет создавать базу данных или соединиться с существующей базой данных, а также выполнить любой SQL-оператор (CREATE ..., ALTER ..., DROP ..., INSERT INTO ..., DELETE FROM ...). Единственное ограничение на исполнение операторов состоит в том, что не отображаются результаты выборки (оператор SELECT). Сделано это сознательно, поскольку в этом случае необходимо добавить работу с памятью, преобразование данных из различных форматов (целые, вещественные, даты и время, строки, BLObs и пр.). Наглядности это не добавит, но затруднит понимание исходного текста программы. В действительности, особых сложностей с реализацией оператора выборки нет (поверьте на слово или проверьте сами). Размер EXE-файла 8 Кб. Компилируется TASM, для линковки используется TLink. Диалоги сделаны в Visual Studio (rc & res файлы).
Код:
; =================================
; Interbase API 02
; written by Alexander Usoff
; Jan. 1998 y.
; for FIDO.ASM&WIN32
; =================================
; ---------------------------------
; DB create & connect & job
; ---------------------------------
Ideal
P586
Radix 16
Model flat
%NOINCL
include "winconst.inc"
include "winprocs.inc"
include "winmacro.inc"
include "intrbase.inc"
include "resource.inc"
quota = 27
MAX_SERVER = 20
MAX_DATABASE = 100
MAX_USER = 20
MAX_PASSWORD = 10
MAX_CHARSET = 0Bh
SV_LENGTH = 14; status vector length = 20 d
UDataSeg
hInst dd ?
dialect dd ?
server db MAX_SERVER + 1 dup (?)
ALIGN 4
database db MAX_DATABASE + 1 dup (?)
ALIGN 4
user db MAX_USER + 1 dup (?)
ALIGN 4
password db MAX_PASSWORD + 1 dup (?)
ALIGN 4
charset db MAX_CHARSET + 1 dup (?)
ALIGN 4
DataSeg
hDatabase dd 0
hTransaction dd 0
status_vector dd SV_LENGTH dup (0)
CodeSeg
; Основная программа (8 строк) :)
Start: call GetModuleHandleA, 0
mov [hInst],eax
call DialogBoxParamA, eax, IDD_IBLOGON,
0, offset IBLogonProc, 0
or eax,eax
jz short quit
call DialogBoxParamA, [hInst], IDD_SESSION,
0, offset SessionProc, 0
call isc_detach_database, offset status_vector,
offset hDatabase
quit: call ExitProcess, 0
public stdcall IBLogonProc
proc IBLogonProc stdcall
arg @@hDlg :dword, @@msg :dword, @@wPar :dword, @@lPar :dword
local @@buf :byte:170
uses esi, edi
UDataSeg
@@server dd ?
@@database dd ?
@@protocol dd ?
@@user dd ?
@@password dd ?
@@dialect dd ?
@@charset dd ?
DataSeg
ALIGN 4
@@charset_str db 'ASCII', 0
db 'BIG_5', 0
db 'CYRL', 0
db 'DOS437', 0
db 'DOS850', 0
db 'DOS852', 0
db 'DOS857', 0
db 'DOS860', 0
db 'DOS861', 0
db 'DOS863', 0
db 'DOS865', 0
db 'EUCJ_0208', 0
db 'GB_2312', 0
db 'ISO8859_1', 0
db 'KSC_5601', 0
db 'NEXT', 0
db 'NONE', 0
db 'OCTETS', 0
db 'SJIS_0208', 0
db 'UNICODE_FSS', 0
db 'WIN1250', 0
db 'WIN1251', 0
db 'WIN1252', 0
db 'WIN1253', 0
db 'WIN1254', 0, 0
@@dialect_str db '1', 0, '2', 0, '3', 0, 0
@@protocol_str db 'TCP/IP', 0, 'NetBEUI', 0, 0
@@sql_createdb db @@len_createdb
db 'CREATE DATABASE ', quota
@@len_createdb = $ - @@sql_createdb - 1
@@sql_dbuser db @@len_dbuser
db quota, ' USER ', quota
@@len_dbuser = $ - @@sql_dbuser - 1
@@sql_dbpswd db @@len_dbpswd
db quota, ' PASSWORD ', quota
@@len_dbpswd = $ - @@sql_dbpswd - 1
@@sql_dbpage db @@len_dbpage
db quota, ' PAGE_SIZE = 4096 DEFAULT CHARACTER SET '
@@len_dbpage = $ - @@sql_dbpage - 1
DlgVector WM_INITDIALOG, WM_COMMAND
MSG_HANDLER WM_INITDIALOG
mov edi,IDC_SERVER - 1
mov esi,offset @@server - 4
@@init_item: inc edi
add esi,4
call GetDlgItem, [@@hDlg], edi
mov [dword esi],eax
cmp edi,IDC_CHARSET
jb short @@init_item
call SendMessageA, [@@server], EM_LIMITTEXT, MAX_SERVER - 1, 0
call SendMessageA, [@@database], EM_LIMITTEXT, MAX_DATABASE - 1, 0
call SendMessageA, [@@user], EM_LIMITTEXT, MAX_USER - 1, 0
call SendMessageA, [@@password], EM_LIMITTEXT, MAX_PASSWORD - 1, 0
mov edi,[@@charset]
mov esi,offset @@charset_str
call FillCombobox stdcall, 10
mov edi,[@@dialect]
call FillCombobox stdcall, 2
mov edi,[@@protocol]
call FillCombobox stdcall, 1
END_HANDLER ret_true
MSG_HANDLER WM_COMMAND
CmdVector IDC_DBCREATE, IDC_DBCONNECT, IDC_LOGCANCEL
END_HANDLER
MSG_HANDLER IDC_DBCREATE
; read fields
; create database
; detach database
mov edi,offset @@create_database
@@read_logparams:
call SendMessageA, [@@server], WM_GETTEXT, MAX_SERVER, offset server + 1
mov [server],al
call SendMessageA, [@@database], WM_GETTEXT, MAX_DATABASE, offset database + 1
mov [database],al
call SendMessageA, [@@user], WM_GETTEXT, MAX_USER, offset user + 1
mov [user],al
call SendMessageA, [@@password], WM_GETTEXT, MAX_PASSWORD, offset password + 1
mov [password],al
call SendMessageA, [@@charset], WM_GETTEXT, MAX_CHARSET, offset charset + 1
mov [charset],al
call SendMessageA, [@@dialect], CB_GETCURSEL, 0, 0
inc eax
mov [dialect],eax
jmp edi
@@create_database:
lea edi,[@@buf]
mov edx,edi
xor ecx,ecx
cld
CopyPStr offset @@sql_createdb
mov cl,[server]
or ecx,ecx
jz short @@copy_db
call SendMessageA, [@@protocol], CB_GETCURSEL, 0, 0
xor ecx,ecx
or eax,eax
mov al,':'
jnz short @@tcpip
mov [word edi],''
add edi,2
mov al,''
@@tcpip: CopyPStr offset server
stosb
@@copy_db: ConcatPStr database, @@sql_dbuser, user, @@sql_dbpswd, password, @@sql_dbpage, charset
mov al,';'
stosb
sub edi,edx
call isc_dsql_exec_immed2, offset status_vector,
offset hDatabase,
offset hTransaction,
edi, edx, [dialect],
0, 0
or eax,eax
jnz @@err_createdb
call isc_detach_database, offset status_vector,
offset hDatabase
END_HANDLER connect
MSG_HANDLER IDC_DBCONNECT
; read fields
; fill dpb
; connect database
mov edi,offset @@connect
jmp @@read_logparams
@@connect: lea edi,[@@buf]
mov edx,edi
mov [dword edi],(((((0F0 shl 8) + 1) shl 8) + isc_dpb_num_buffers) shl 8) + isc_dpb_version1
add edi,4
mov [word edi],isc_dpb_force_write
add edi,2
xor ecx,ecx
cld
mov [byte edi],isc_dpb_lc_ctype
mov esi,offset charset
inc edi
mov cl,[byte esi]
inc ecx
rep movsb
mov [byte edi],isc_dpb_user_name
mov esi,offset user
inc edi
mov cl,[byte esi]
inc ecx
rep movsb
mov [byte edi],isc_dpb_password
mov esi,offset password
inc edi
mov cl,[byte esi]
inc ecx
rep movsb
sub edi,edx
call isc_attach_database, offset status_vector,
ecx, offset database + 1,
offset hDatabase, edi, edx
or eax,eax
jnz short @@err_attach
mov eax,1
END_HANDLER short end
MSG_HANDLER IDC_LOGCANCEL
xor eax,eax
@@end: call EndDialog, [@@hDlg], eax
END_HANDLER ret_false
@@err_createdb:
@@err_attach:
jmp @@ret_false
endp IBLogonProc
proc FillCombobox stdcall
arg @@index :dword
; edi = id combobox item
; esi = offset string list
@@1: call SendMessageA, edi, CB_ADDSTRING, 0, esi
xor eax,eax
@@2: mov al,[byte esi]
inc esi
or eax,eax
jnz short @@2
mov al,[byte esi]
or eax,eax
jnz short @@1
call SendMessageA, edi, CB_SETCURSEL, [@@index], 0
inc esi
ret
endp FillCombobox
public stdcall SessionProc
proc SessionProc stdcall
arg @@hDlg :dword, @@msg :dword, @@wPar :dword, @@lPar :dword
local @@psv :dword, @@len :dword, @@buf :byte:400
UDataSeg
@@query dd ?
@@history dd ?
DataSeg
ALIGN 4
tpb db isc_tpb_version3
db isc_tpb_write
db isc_tpb_read_committed
db isc_tpb_no_rec_version
db isc_tpb_wait
LENGTH_TPB = $ - tpb
@@ok db 'Ok.'
@@zero db 0
@@error db 'Error!', 0
DlgVector WM_INITDIALOG, WM_COMMAND
MSG_HANDLER WM_INITDIALOG
call GetDlgItem, [@@hDlg], IDC_QUERY
mov [@@query],eax
call GetDlgItem, [@@hDlg], IDC_HISTORY
mov [@@history],eax
call isc_start_transaction, offset status_vector,
offset hTransaction,
1, offset hDataBase,
LENGTH_TPB, offset tpb
END_HANDLER short ret_false
MSG_HANDLER WM_COMMAND
CmdVector IDC_RUN, IDC_COMMIT, IDC_ROLLBACK, IDC_OK
END_HANDLER short ret_false
MSG_HANDLER IDC_RUN
push ebx
lea ebx,[@@buf]
call SendMessageA, [@@query], WM_GETTEXT, 400, ebx
or eax,eax
jz @@ret_false
dec eax
mov [@@len],eax
xor eax,eax
mov edx,ebx
@@scan: mov al,[byte edx]
inc edx
cmp al,0Dh
je short @@eol
or eax,eax
jz short @@exec
jmp short @@scan
@@eol: mov [byte edx - 1],0
push edx
call SendMessageA, [@@history], LB_ADDSTRING, 0, ebx
pop edx
mov [byte edx - 1],0Dh
inc edx
mov ebx,edx
jmp short @@scan
@@exec: call SendMessageA, [@@history], LB_ADDSTRING, 0, ebx
lea ebx,[@@buf]
call isc_dsql_exec_immed2, offset status_vector,
offset hDataBase,
offset hTransaction,
[@@len], ebx, [dialect], 0, 0
or eax,eax
jnz short @@err_query
call SendMessageA, [@@query], WM_SETTEXT, 0, offset @@zero
call SendMessageA, [@@history], LB_ADDSTRING, 0, offset @@ok
call SendMessageA, [@@history], LB_ADDSTRING, 0, offset @@zero
pop ebx
END_HANDLER ret_false
@@err_query: call SendMessageA, [@@history], LB_ADDSTRING, 0, offset @@error
mov [@@psv],offset status_vector
@@err_loop: lea edx,[@@psv]
call isc_interprete, ebx, edx
or eax,eax
jz short @@end_err_loop
call SendMessageA, [@@history], LB_ADDSTRING, 0, ebx
jmp short @@err_loop
@@end_err_loop: call SendMessageA, [@@history], LB_ADDSTRING, 0, offset @@zero
pop ebx
jmp @@ret_false
MSG_HANDLER IDC_COMMIT
call isc_commit_retaining, offset status_vector,
offset hTransaction
END_HANDLER ret_false
MSG_HANDLER IDC_ROLLBACK
call isc_rollback_retaining, offset status_vector,
offset hTransaction
END_HANDLER ret_false
MSG_HANDLER IDC_OK
call isc_commit_transaction, offset status_vector,
offset hTransaction
call EndDialog, [@@hDlg], 0
END_HANDLER ret_false
endp SessionProc
End Start
Работа с Oracle значительно сложнее, Access я не использую. А Cache... это для мазохистов (IMHO).
|
|
|
Опции темы |
|
Опции просмотра |
Линейный вид
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
|