Files

76 lines
2.8 KiB
SQL
Raw Permalink Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
-- _helpers.sql — إجراءات ترحيل قابلة لإعادة التشغيل
--
-- ‏المشكلة: ALTER TABLE ... ADD COLUMN في MySQL يُجهض **كل** الجملة عند
-- ‏أول عمود مكرّر. فإعادة تشغيل ترحيل نُفِّذ جزئياً تفشل، وإعادة تشغيل
-- ‏ترحيل نُفِّذ كاملاً تفشل أيضاً — بلا أن تعرف أيّهما.
--
-- ‏هذا لدغ نشرَ سيرو ثلاث مرات في يوم واحد، ويزداد سوءاً مع تعدد النسخ
-- ‏(intaleq / tripz / siro) حيث لا أحد يتذكّر ما نُفِّذ أين.
--
-- ‏الحل: إجراءات تفحص information_schema أولاً فتتخطّى الموجود بصمت.
--
-- ‏شغّل هذا الملف مرة واحدة على كل قاعدة قبل أي ترحيل يستخدمه.
DELIMITER //
DROP PROCEDURE IF EXISTS `siro_add_column` //
/**
* ‏يضيف عموداً إن لم يكن موجوداً. آمن لإعادة التشغيل.
*
* ‏مثال:
* CALL siro_add_column('ride', 'driverArrivedAt',
* 'DATETIME NULL DEFAULT NULL COMMENT ''لحظة الوصول''');
*/
CREATE PROCEDURE `siro_add_column`(
IN p_table VARCHAR(64),
IN p_column VARCHAR(64),
IN p_definition TEXT
)
BEGIN
IF NOT EXISTS (
SELECT 1 FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = DATABASE()
AND TABLE_NAME = p_table
AND COLUMN_NAME = p_column
) THEN
SET @ddl = CONCAT('ALTER TABLE `', p_table, '` ADD COLUMN `',
p_column, '` ', p_definition);
PREPARE stmt FROM @ddl;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
SELECT CONCAT('أُضيف: ', p_table, '.', p_column) AS result;
ELSE
SELECT CONCAT('موجود مسبقاً: ', p_table, '.', p_column) AS result;
END IF;
END //
DROP PROCEDURE IF EXISTS `siro_add_index` //
/**
* ‏يضيف فهرساً إن لم يكن موجوداً.
* CALL siro_add_index('driver_orders', 'idx_order', '(`order_id`)');
*/
CREATE PROCEDURE `siro_add_index`(
IN p_table VARCHAR(64),
IN p_index VARCHAR(64),
IN p_columns TEXT
)
BEGIN
IF NOT EXISTS (
SELECT 1 FROM information_schema.STATISTICS
WHERE TABLE_SCHEMA = DATABASE()
AND TABLE_NAME = p_table
AND INDEX_NAME = p_index
) THEN
SET @ddl = CONCAT('ALTER TABLE `', p_table, '` ADD INDEX `',
p_index, '` ', p_columns);
PREPARE stmt FROM @ddl;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
SELECT CONCAT('أُضيف فهرس: ', p_table, '.', p_index) AS result;
ELSE
SELECT CONCAT('فهرس موجود مسبقاً: ', p_table, '.', p_index) AS result;
END IF;
END //
DELIMITER ;