Как зайти в Даркнет?!
25th January, 01:11
94
0
Как в tkinter из поля ввода Entry получить значение в одну переменную и обновить строку кнопкой, затем получить ещё одно введённое значение и затем сложить их. Ниже пример кода
21st July, 19:00
1228
0
Программа, которая создает фейковые сервера в поиске игровых серверов CS 1.6 Steam
21st March, 17:43
1029
0
Очень долго работает Update запрос Oracle
27th January, 09:58
969
0
не могу запустить сервер на tomcat HTTP Status 404 – Not Found
21st January, 18:02
959
0
Где можно найти фрилансера для выполнения поступающих задач, на постоянной основе?
2nd December, 09:48
995
0
Разработка мобильной кроссплатформенной военной игры
16th July, 17:57
1782
0
период по дням
25th October, 10:44
4001
0
Пишу скрипты для BAS только на запросах
16th September, 02:42
3775
0
Некорректный скрипт для закрытия блока
14th April, 18:33
4661
0
прокидывать exception в блоках try-catch JAVA
11th March, 21:11
4442
0
Помогите пожалуйста решить задачи
24th November, 23:53
6159
0
Не понимаю почему не открывается детальное описание продукта
11th November, 11:51
4393
0
Нужно решить задачу по программированию на массивы
27th October, 18:01
4442
0
Метода Крамера С++
23rd October, 11:55
4356
0
помогите решить задачу на C++
22nd October, 17:31
4040
0
Помогите решить задачу на python с codeforces
22nd October, 11:11
4533
0
Python с нуля: полное руководство для начинающих
18th June, 13:58
2643
0
ки в триггере MySQLgfffg
Если у меня есть trigger before the update на таблице, как я могу бросить ошибку, которая предотвращает обновление на этой таблице?
gfffgttaaggmysql,database,triggers,ttaagggfffg
Начиная с MySQL 5.5, вы можете использовать синтаксис SIGNAL для создания исключения :
signal sqlstate '45000' set message_text = 'My Error Message';
Состояние 45000 является общим состоянием, представляющим "unhandled user-defined exception".
Вот более полный пример такого подхода:
delimiter //
use test//
create table trigger_test
(
id int not null
)//
drop trigger if exists trg_trigger_test_ins //
create trigger trg_trigger_test_ins before insert on trigger_test
for each row
begin
declare msg varchar(128);
if new.id < 0 then
set msg = concat('MyTriggerError: Trying to insert a negative value in trigger_test: ', cast(new.id as char));
signal sqlstate '45000' set message_text = msg;
end if;
end
//
delimiter ;
-- run the following as seperate statements:
insert into trigger_test values (1), (-1), (2); -- everything fails as one row is bad
select * from trigger_test;
insert into trigger_test values (1); -- succeeds as expected
insert into trigger_test values (-1); -- fails as expected
select * from trigger_test;
llpp
Вот один хак , который может сработать. Это не чисто, но похоже, что это может сработать:
По сути, вы просто пытаетесь обновить столбец, который не существует.
llpp
К сожалению, ответ, предоставленный @RuiDC, не работает в версиях MySQL до 5.5, поскольку для хранимых процедур не существует реализации SIGNAL .
Решение, которое я нашел , состоит в том, чтобы имитировать сигнал, вызывающий ошибку table_name doesn't exist , толкая настроенное сообщение об ошибке в table_name .
Взлом может быть реализован с помощью триггеров или с помощью хранимой процедуры. Я описываю оба варианта ниже, следуя примеру, используемому @RuiDC.
Использовать триггеры
DELIMITER $$
-- before inserting new id
DROP TRIGGER IF EXISTS before_insert_id$$
CREATE TRIGGER before_insert_id
BEFORE INSERT ON test FOR EACH ROW
BEGIN
-- condition to check
IF NEW.id < 0 THEN
-- hack to solve absence of SIGNAL/prepared statements in triggers
UPDATE `Error: invalid_id_test` SET x=1;
END IF;
END$$
DELIMITER ;
Использование хранимой процедуры
Хранимые процедуры позволяют использовать dynamic sql, что делает возможным инкапсуляцию функции генерации ошибок в одной процедуре. Контрапункт заключается в том, что мы должны контролировать методы вставки/обновления приложений, поэтому они используют только нашу хранимую процедуру (не предоставляя прямых привилегий INSERT/UPDATE).
DELIMITER $$
-- my_signal procedure
CREATE PROCEDURE `my_signal`(in_errortext VARCHAR(255))
BEGIN
SET @sql=CONCAT('UPDATE `', in_errortext, '` SET x=1');
PREPARE my_signal_stmt FROM @sql;
EXECUTE my_signal_stmt;
DEALLOCATE PREPARE my_signal_stmt;
END$$
CREATE PROCEDURE insert_test(p_id INT)
BEGIN
IF NEW.id < 0 THEN
CALL my_signal('Error: invalid_id_test; Id must be a positive integer');
ELSE
INSERT INTO test (id) VALUES (p_id);
END IF;
END$$
DELIMITER ;
llpp
Следующая процедура является (на mysql5) способом бросить пользовательские ошибки , и регистрировать их в то же время:
create table mysql_error_generator(error_field varchar(64) unique) engine INNODB;
DELIMITER $$
CREATE PROCEDURE throwCustomError(IN errorText VARCHAR(44))
BEGIN
DECLARE errorWithDate varchar(64);
select concat("[",DATE_FORMAT(now(),"%Y%m%d %T"),"] ", errorText) into errorWithDate;
INSERT IGNORE INTO mysql_error_generator(error_field) VALUES (errorWithDate);
INSERT INTO mysql_error_generator(error_field) VALUES (errorWithDate);
END;
$$
DELIMITER ;
call throwCustomError("Custom error message with log support.");
llpp
CREATE TRIGGER sample_trigger_msg
BEFORE INSERT
FOR EACH ROW
BEGIN
IF(NEW.important_value) < (1*2) THEN
DECLARE dummy INT;
SELECT
Enter your Message Here!!!
INTO dummy
FROM mytable
WHERE mytable.id=new.id
END IF;
END;
llpp
Другой (hack) метод (если вы не находитесь на 5.5+ по какой-то причине), который вы можете использовать:
Если у вас есть обязательное поле, то в триггере установите Обязательное поле в недопустимое значение, например NULL. Это будет работать как для INSERT, так и для UPDATE. Обратите внимание, что если NULL является допустимым значением для требуемого поля (по какой-то безумной причине), то этот подход не будет работать.
BEGIN
-- Force one of the following to be assigned otherwise set required field to null which will throw an error
IF (NEW.`nullable_field_1` IS NULL AND NEW.`nullable_field_2` IS NULL) THEN
SET NEW.`required_id_field`=NULL;
END IF;
END
Если вы находитесь на 5.5+, то вы можете использовать состояние сигнала, как описано в других ответах:
BEGIN
-- Force one of the following to be assigned otherwise use signal sqlstate to throw a unique error
IF (NEW.`nullable_field_1` IS NULL AND NEW.`nullable_field_2` IS NULL) THEN
SIGNAL SQLSTATE '45000' set message_text='A unique identifier for nullable_field_1 OR nullable_field_2 is required!';
END IF;
END
llppminhojkhonКак использовать сокет C API в C++ на z/OSgfffg
У меня возникли проблемы с получением C сокетов API для правильной работы в C++ на z/OS .
Хотя я включаю sys/socket.h, я все еще получаю ошибки времени компиляции, говорящие мне, что AF_INET не определен.
Я упускаю что-то очевидное, или это связано с тем, что нахождение на z/OS делает мои проблемы намного более сложными?
Update : при дальнейшем расследовании я обнаружил, что есть #ifdef , который я поражаю. Очевидно, z/OS не будет счастлив, если я не определю, с какими "type" сокетами я использую:
#define _OE_SOCKETS
Теперь я лично понятия не имею, для чего это _OE_SOCKETS на самом деле, так что если там есть программисты z/OS сокетов (все 3 из вас), возможно, вы могли бы дать мне краткое описание того, как это все работает?
Тестовое Приложение
#include <sys/socket.h>
int main()
{
return AF_INET;
}
Компиляции/Link Выход :
cxx -Wc,xplink -Wl,xplink -o inet_test inet.C
"./inet.C", line 5.16: CCN5274 (S) The name lookup for "AF_INET" did not find a declaration.
CCN0797(I) Compilation failed for file ./inet.C. Object file not created.
Проверка sys/sockets.h действительно включает в себя определение, которое мне нужно, и, насколько я могу судить, оно не блокируется никакими операторами #ifdef.
Однако я заметил, что он содержит следующее:
#ifdef __cplusplus
extern "C" {
#endif
который инкапсулирует в основном весь файл. Не уверен, что это имеет значение.
gfffgttaaggc++,c,sockets,mainframe,zos,ttaagggfffg
Держите под рукой копию руководства IBM:
- z/OS V1R11.0 XL C/C++ руководство по программированию
- z/OS V1R11.0 XL C/C++ Справочник по библиотеке времени выполнения
Публикации IBM, как правило, очень хороши, но вам нужно привыкнуть к их формату, а также знать, где искать ответ. Вы довольно часто обнаружите, что функция, которую вы хотите использовать, охраняется "feature test macro"
Вам следует попросить вашего дружелюбного системного программиста установить Справочник по библиотеке времени выполнения XL C/C++: Man Pages
в вашей системе. Затем вы можете сделать такие вещи, как "man connect", чтобы вытащить справочную страницу для сокета connect() API. Когда я делаю это, вот что я вижу:
FORMAT
X / Открыть
#define _XOPEN_SOURCE_EXTENDED 1
#include <sys/socket.h>
int connect(int socket, const struct sockaddr *address, socklen_t address_len);
Сокеты Беркли
#define _OE_SOCKETS
#include <sys/types.h>
#include <sys/socket.h>
int connect(int socket, struct sockaddr *address, int address_len);
llpp
У меня не было никаких проблем с использованием BSD сокетов API в C++, в GNU/Linux. вот пример программы, которую я использовал:
#include <sys/socket.h>
int
main()
{
return AF_INET;
}
Поэтому я считаю, что z/OS, вероятно, является здесь усложняющим фактором, однако, поскольку я никогда раньше не использовал z/OS, а тем более не программировал в нем, я не могу сказать это окончательно. :- P
llpp
Ознакомиться с использованием z/OS системы UNIX услуг розетки секции в z/OS в ХL C/C++ руководство по программированию. Убедитесь, что вы включаете необходимые заголовочные файлы и используете соответствующий #defines.
Ссылка на doc изменилась за эти годы, но вы должны быть в состоянии добраться до него достаточно легко, найдя текущее местоположение раздела Support & Downloads на ibm.com и поискав документацию по названию.
llpp
_OE_SOCKETS, по-видимому, просто включает/отключает определение символов, связанных с сокетами. Это не редкость в некоторых библиотеках, чтобы иметь кучу macros для этого, чтобы гарантировать, что вы не компилируете/связываете части, которые не нужны. Макрос не является стандартным в других реализациях сокетов, он кажется чем-то специфичным для z/OS.
Взгляните на эту страницу:
Компиляция и связывание программы сокетов z/VM C
llpp
Так что попробуй
#define _OE_SOCKETS
прежде чем включить sys/socket.h
llpp
Возможно , вы захотите взглянуть на cpp-sockets, оболочку C++ для системных вызовов сокетов. Он работает со многими операционными системами (Win32, POSIX, Linux, *BSD). я не думаю, что он будет работать с z/OS, но вы можете посмотреть на включенные файлы, которые он использует, и у вас будет много примеров проверенного кода, который хорошо работает на других OSs.
llpp
@Jax: вещь extern "C" имеет значение, очень-очень большое. Если в заголовочном файле его нет, то (если только это не заголовочный файл C++-only) вам придется вложить в него свой #include :
extern "C" {
#include <sys/socket.h>
// include other similarly non-compliant header files
}
В принципе, в любое время, когда программа C++ хочет связать с объектами на базе C, extern "C" имеет жизненно важное значение. На практике это означает, что имена, используемые во внешних ссылках, не будут искажены, как обычные имена C++. Ссылка.
llpp
Ответ заключается в использовании следующего флага c89:
-D_OE_SOCKETS
Пример следующий;
bash-2.03$ c89 -D_OE_SOCKETS [filename].c
Для получения дополнительной информации смотрите параметры C89 в руководстве пользователя z/OS XLC/C++.
llpp
Отказ от ответственности: я не программист C++, однако я очень хорошо знаю C. Я
адаптировал эти вызовы из какого-то кода C, который у меня есть.
Также markdown поставил эти странные _ как мои подчеркивания.
Вы просто должны быть в состоянии написать класс абстракции вокруг сокетов C с чем-то вроде этого:
class my_sock {
private int sock;
private int socket_type;
private socklen_t sock_len;
private struct sockaddr_in server_addr;
public char *server_ip;
public unsigned short server_port;
};
Затем есть методы для открытия, закрытия и отправки пакетов вниз по сокету.
Например, открытый вызов может выглядеть примерно так:
int my_socket_connect()
{
int return_code = 0;
if ( this->socket_type != CLIENT_SOCK ) {
cout << "This is a not a client socket!\n";
return -1;
}
return_code = connect( this->local_sock, (struct sockaddr *) &this->server_addr, sizeof(this->server_addr));
if( return_code < 0 ) {
cout << "Connect() failure! %s\n", strerror(errno);
return return_code;
}
return return_code;
}
Если у меня есть trigger before the update на таблице, как я могу бросить ошибку, которая предотвращает обновление на этой таблице?
Начиная с MySQL 5.5, вы можете использовать синтаксис SIGNAL для создания исключения :
signal sqlstate '45000' set message_text = 'My Error Message';
Состояние 45000 является общим состоянием, представляющим "unhandled user-defined exception".
Вот более полный пример такого подхода:
delimiter //
use test//
create table trigger_test
(
id int not null
)//
drop trigger if exists trg_trigger_test_ins //
create trigger trg_trigger_test_ins before insert on trigger_test
for each row
begin
declare msg varchar(128);
if new.id < 0 then
set msg = concat('MyTriggerError: Trying to insert a negative value in trigger_test: ', cast(new.id as char));
signal sqlstate '45000' set message_text = msg;
end if;
end
//
delimiter ;
-- run the following as seperate statements:
insert into trigger_test values (1), (-1), (2); -- everything fails as one row is bad
select * from trigger_test;
insert into trigger_test values (1); -- succeeds as expected
insert into trigger_test values (-1); -- fails as expected
select * from trigger_test;
Вот один хак , который может сработать. Это не чисто, но похоже, что это может сработать:
По сути, вы просто пытаетесь обновить столбец, который не существует.
К сожалению, ответ, предоставленный @RuiDC, не работает в версиях MySQL до 5.5, поскольку для хранимых процедур не существует реализации SIGNAL .
Решение, которое я нашел , состоит в том, чтобы имитировать сигнал, вызывающий ошибку table_name doesn't exist , толкая настроенное сообщение об ошибке в table_name .
Взлом может быть реализован с помощью триггеров или с помощью хранимой процедуры. Я описываю оба варианта ниже, следуя примеру, используемому @RuiDC.
Использовать триггеры
DELIMITER $$
-- before inserting new id
DROP TRIGGER IF EXISTS before_insert_id$$
CREATE TRIGGER before_insert_id
BEFORE INSERT ON test FOR EACH ROW
BEGIN
-- condition to check
IF NEW.id < 0 THEN
-- hack to solve absence of SIGNAL/prepared statements in triggers
UPDATE `Error: invalid_id_test` SET x=1;
END IF;
END$$
DELIMITER ;
Использование хранимой процедуры
Хранимые процедуры позволяют использовать dynamic sql, что делает возможным инкапсуляцию функции генерации ошибок в одной процедуре. Контрапункт заключается в том, что мы должны контролировать методы вставки/обновления приложений, поэтому они используют только нашу хранимую процедуру (не предоставляя прямых привилегий INSERT/UPDATE).
DELIMITER $$
-- my_signal procedure
CREATE PROCEDURE `my_signal`(in_errortext VARCHAR(255))
BEGIN
SET @sql=CONCAT('UPDATE `', in_errortext, '` SET x=1');
PREPARE my_signal_stmt FROM @sql;
EXECUTE my_signal_stmt;
DEALLOCATE PREPARE my_signal_stmt;
END$$
CREATE PROCEDURE insert_test(p_id INT)
BEGIN
IF NEW.id < 0 THEN
CALL my_signal('Error: invalid_id_test; Id must be a positive integer');
ELSE
INSERT INTO test (id) VALUES (p_id);
END IF;
END$$
DELIMITER ;
Следующая процедура является (на mysql5) способом бросить пользовательские ошибки , и регистрировать их в то же время:
create table mysql_error_generator(error_field varchar(64) unique) engine INNODB;
DELIMITER $$
CREATE PROCEDURE throwCustomError(IN errorText VARCHAR(44))
BEGIN
DECLARE errorWithDate varchar(64);
select concat("[",DATE_FORMAT(now(),"%Y%m%d %T"),"] ", errorText) into errorWithDate;
INSERT IGNORE INTO mysql_error_generator(error_field) VALUES (errorWithDate);
INSERT INTO mysql_error_generator(error_field) VALUES (errorWithDate);
END;
$$
DELIMITER ;
call throwCustomError("Custom error message with log support.");
CREATE TRIGGER sample_trigger_msg
BEFORE INSERT
FOR EACH ROW
BEGIN
IF(NEW.important_value) < (1*2) THEN
DECLARE dummy INT;
SELECT
Enter your Message Here!!!
INTO dummy
FROM mytable
WHERE mytable.id=new.id
END IF;
END;
Другой (hack) метод (если вы не находитесь на 5.5+ по какой-то причине), который вы можете использовать:
Если у вас есть обязательное поле, то в триггере установите Обязательное поле в недопустимое значение, например NULL. Это будет работать как для INSERT, так и для UPDATE. Обратите внимание, что если NULL является допустимым значением для требуемого поля (по какой-то безумной причине), то этот подход не будет работать.
BEGIN
-- Force one of the following to be assigned otherwise set required field to null which will throw an error
IF (NEW.`nullable_field_1` IS NULL AND NEW.`nullable_field_2` IS NULL) THEN
SET NEW.`required_id_field`=NULL;
END IF;
END
Если вы находитесь на 5.5+, то вы можете использовать состояние сигнала, как описано в других ответах:
BEGIN
-- Force one of the following to be assigned otherwise use signal sqlstate to throw a unique error
IF (NEW.`nullable_field_1` IS NULL AND NEW.`nullable_field_2` IS NULL) THEN
SIGNAL SQLSTATE '45000' set message_text='A unique identifier for nullable_field_1 OR nullable_field_2 is required!';
END IF;
END
У меня возникли проблемы с получением C сокетов API для правильной работы в C++ на z/OS .
Хотя я включаю sys/socket.h, я все еще получаю ошибки времени компиляции, говорящие мне, что AF_INET не определен.
Я упускаю что-то очевидное, или это связано с тем, что нахождение на z/OS делает мои проблемы намного более сложными?
Update : при дальнейшем расследовании я обнаружил, что есть #ifdef , который я поражаю. Очевидно, z/OS не будет счастлив, если я не определю, с какими "type" сокетами я использую:
#define _OE_SOCKETS
Теперь я лично понятия не имею, для чего это _OE_SOCKETS на самом деле, так что если там есть программисты z/OS сокетов (все 3 из вас), возможно, вы могли бы дать мне краткое описание того, как это все работает?
Тестовое Приложение
#include <sys/socket.h>
int main()
{
return AF_INET;
}
Компиляции/Link Выход :
cxx -Wc,xplink -Wl,xplink -o inet_test inet.C
"./inet.C", line 5.16: CCN5274 (S) The name lookup for "AF_INET" did not find a declaration.
CCN0797(I) Compilation failed for file ./inet.C. Object file not created.
Проверка sys/sockets.h действительно включает в себя определение, которое мне нужно, и, насколько я могу судить, оно не блокируется никакими операторами #ifdef.
Однако я заметил, что он содержит следующее:
#ifdef __cplusplus
extern "C" {
#endif
который инкапсулирует в основном весь файл. Не уверен, что это имеет значение.
Держите под рукой копию руководства IBM:
- z/OS V1R11.0 XL C/C++ руководство по программированию
- z/OS V1R11.0 XL C/C++ Справочник по библиотеке времени выполнения
Публикации IBM, как правило, очень хороши, но вам нужно привыкнуть к их формату, а также знать, где искать ответ. Вы довольно часто обнаружите, что функция, которую вы хотите использовать, охраняется "feature test macro"
Вам следует попросить вашего дружелюбного системного программиста установить Справочник по библиотеке времени выполнения XL C/C++: Man Pages в вашей системе. Затем вы можете сделать такие вещи, как "man connect", чтобы вытащить справочную страницу для сокета connect() API. Когда я делаю это, вот что я вижу:
FORMAT
X / Открыть
#define _XOPEN_SOURCE_EXTENDED 1
#include <sys/socket.h>
int connect(int socket, const struct sockaddr *address, socklen_t address_len);
Сокеты Беркли
#define _OE_SOCKETS
#include <sys/types.h>
#include <sys/socket.h>
int connect(int socket, struct sockaddr *address, int address_len);
У меня не было никаких проблем с использованием BSD сокетов API в C++, в GNU/Linux. вот пример программы, которую я использовал:
#include <sys/socket.h>
int
main()
{
return AF_INET;
}
Поэтому я считаю, что z/OS, вероятно, является здесь усложняющим фактором, однако, поскольку я никогда раньше не использовал z/OS, а тем более не программировал в нем, я не могу сказать это окончательно. :- P
Ознакомиться с использованием z/OS системы UNIX услуг розетки секции в z/OS в ХL C/C++ руководство по программированию. Убедитесь, что вы включаете необходимые заголовочные файлы и используете соответствующий #defines.
Ссылка на doc изменилась за эти годы, но вы должны быть в состоянии добраться до него достаточно легко, найдя текущее местоположение раздела Support & Downloads на ibm.com и поискав документацию по названию.
_OE_SOCKETS, по-видимому, просто включает/отключает определение символов, связанных с сокетами. Это не редкость в некоторых библиотеках, чтобы иметь кучу macros для этого, чтобы гарантировать, что вы не компилируете/связываете части, которые не нужны. Макрос не является стандартным в других реализациях сокетов, он кажется чем-то специфичным для z/OS.
Взгляните на эту страницу:
Компиляция и связывание программы сокетов z/VM C
Так что попробуй
#define _OE_SOCKETS
прежде чем включить sys/socket.h
Возможно , вы захотите взглянуть на cpp-sockets, оболочку C++ для системных вызовов сокетов. Он работает со многими операционными системами (Win32, POSIX, Linux, *BSD). я не думаю, что он будет работать с z/OS, но вы можете посмотреть на включенные файлы, которые он использует, и у вас будет много примеров проверенного кода, который хорошо работает на других OSs.
@Jax: вещь extern "C" имеет значение, очень-очень большое. Если в заголовочном файле его нет, то (если только это не заголовочный файл C++-only) вам придется вложить в него свой #include :
extern "C" {
#include <sys/socket.h>
// include other similarly non-compliant header files
}
В принципе, в любое время, когда программа C++ хочет связать с объектами на базе C, extern "C" имеет жизненно важное значение. На практике это означает, что имена, используемые во внешних ссылках, не будут искажены, как обычные имена C++. Ссылка.
Ответ заключается в использовании следующего флага c89:
-D_OE_SOCKETS
Пример следующий;
bash-2.03$ c89 -D_OE_SOCKETS [filename].c
Для получения дополнительной информации смотрите параметры C89 в руководстве пользователя z/OS XLC/C++.
Отказ от ответственности: я не программист C++, однако я очень хорошо знаю C. Я адаптировал эти вызовы из какого-то кода C, который у меня есть.
Также markdown поставил эти странные _ как мои подчеркивания.
Вы просто должны быть в состоянии написать класс абстракции вокруг сокетов C с чем-то вроде этого:
class my_sock {
private int sock;
private int socket_type;
private socklen_t sock_len;
private struct sockaddr_in server_addr;
public char *server_ip;
public unsigned short server_port;
};
Затем есть методы для открытия, закрытия и отправки пакетов вниз по сокету.
Например, открытый вызов может выглядеть примерно так:
int my_socket_connect()
{
int return_code = 0;
if ( this->socket_type != CLIENT_SOCK ) {
cout << "This is a not a client socket!\n";
return -1;
}
return_code = connect( this->local_sock, (struct sockaddr *) &this->server_addr, sizeof(this->server_addr));
if( return_code < 0 ) {
cout << "Connect() failure! %s\n", strerror(errno);
return return_code;
}
return return_code;
}