துறை

பின்தளம் — HTTP சேவையகம், தரவுத்தளங்கள், அங்கீகாரம்

இ-தமிழ் பின்தளச் சேவைகளை இயக்குகிறது: வழிச்செலுத்தலுடன் கூடிய HTTP சேவையகம், அளபுரு வினாக்கள் மட்டுமே அனுமதிக்கும் SQLite மற்றும் PostgreSQL இயக்கிகள், JSON, bcrypt, JWT.

இ-தமிழ் ஒரு பின்தள மொழி. ஒரு நிரல் HTTP வழங்க, SQL தரவுத்தளத்துடன் பேச, கடவுச்சொற்களை மறையாக்க, டோக்கன்களை வழங்க முடியும் — Rust-க்குள் இறங்காமல்.

HTTP சேவையகம்

etamil --server --port 8080 examples/backend/hello_server.qmz
etamil --async  --port 8080 examples/backend/hello_server.qmz

--server ஒரு பணியாளர் குழுவை இயக்குகிறது. --async ஒரு tokio ஏற்பு சுழற்சியை இயக்கி ஒவ்வொரு கோரிக்கையையும் தடுப்புக் குழுவுக்கு அனுப்புகிறது; எனவே ஒரு இணைப்பு ஒரு நூலுக்குப் பதிலாக ஒரு பணியாக மட்டுமே செலவாகிறது, மேலும் மெதுவான வாடிக்கையாளர் ஒருவர் தன் கோரிக்கையை அனுப்ப எடுக்கும் நேரம் முழுவதும் 2 × cores பணியாளர்களில் ஒருவரை ஆக்கிரமிப்பதில்லை. VM ஒத்திசைவானதாகவே இருக்கிறது — கையாளிகள் tokio-வின் தடுப்புக் குழுவில் தடுக்கின்றன; எனவே ஒவ்வொரு தரவுத்தள இயக்கியும் தொடாமலேயே தொடர்ந்து இயங்குகிறது.

வழிகள்

வழி ஒரு வழியை அறிவிக்கிறது; பதில் பதிலளிக்கிறது.

வழி பெறு, "/kaNakku/:id" {
    பதில் 200, "id=" & param_id & " vakY=" & query_params["vakY"];
}

வழி பதி, "/pativu" {
    பதில் 201, "got body: " & request_body;
}

வழி பெறு, "/aRikkY.csv" {
    பதில் 200, வரிசைகள், {"Content-Type": "text/csv"};
}

ஒரு கையாளி தன் கோரிக்கையை சாதாரண மாறிகள் வழியாகப் படிக்கிறது; எனவே அதே கையாளி எந்த எழுத்து வடிவத்திலும் படிக்கக்கூடியதாக இருக்கிறது:

மாறி உள்ளடக்கம்
request_method HTTP முறை
request_path கோரப்பட்ட பாதை
request_body மூல உடல்
query_params வினாச் சரம், ஒரு பதிவேடாக
headers கோரிக்கைத் தலைப்புகள், ஒரு பதிவேடாக
path_params பொருந்திய :name பகுதிகள், ஒரு பதிவேடாக
param_<name> ஒவ்வொரு பாதை அளபுருவும், நேரடியாகவும்

பதில் தலைப்புகள் ஒரு சாதாரண பதிவேடு. அது இல்லாதபோது சேவையகம் application/json எனப் பதிலளிக்கிறது.

கொடி விளைவு
--vm பைட்கோட் VM-இல் இயக்கு (இயல்பு)
--server ஒத்திசைவான HTTP சேவையகத்தைத் தொடங்கு
--async ஒருங்கிணைந்த சேவையகம்: async ஏற்பு, தடுப்புக் கையாளிகள், நிறுத்த Ctrl-C
--llvm LLVM பின்தளம் (--features llvm தேவை; Linux/macOS)
--port <PORT> சேவையகத் துறை (இயல்பு 8080)
--host <HOST> சேவையக முகவரி (இயல்பு 127.0.0.1)

தரவுத்தளங்கள்

வினாக்கள் எப்போதும் அளபுருவாக்கப்பட்டவை. இ-தமிழிலிருந்து SQL உரையில் ஒரு மதிப்பைச் செருக வேண்டுமென்றே எந்த வழியும் இல்லை; எனவே ஊடுருவல் (injection) வகைப் பிழையை எழுதவே முடியாது.

தளம்_இணை எசுகியூஎல்லைட், "kaNakku.db";
தளம்_வினா "SELECT peyar, qokY FROM pativukaL WHERE vakY = ?", ["வரவு"], வரவுகள்;

வரிசைகள் பதிவேடுகளின் அணியாகத் திரும்புகின்றன; எனவே ஒரு முடிவுத் தொகுப்பு வேறு எந்த அட்டவணையையும் போலவே சுழல்கிறது.

இயந்திரம் நிலை குறிப்புகள்
SQLite இயங்குகிறது உள்ளமைக்கப்பட்டது, வசதிக் கொடி தேவையில்லை. தசமங்கள் உரையாகக் கடக்கின்றன; எனவே துல்லியம் இழக்கப்படுவதில்லை
PostgreSQL இயங்குகிறது --features postgres; நேரடி சேவையகத்தில் சரிபார்க்கப்பட்டது. பணம் சொந்த NUMERIC வகையைப் பயன்படுத்துகிறது
MySQL / MariaDB சோதிக்கப்படவில்லை --features mysql; முழுமையானது, தொகுக்கப்படுகிறது, ஆனால் நேரடி சேவையகத்தில் இயக்கப்படவில்லை
MongoDB, Redis செயல்படுத்தப்படவில்லை இரண்டுக்கும் SQL இல்லை; எனவே execute(sql, params) வடிவ trait-க்கு எதுவும் பொருந்தாது. முதலில் வடிவமைப்பு தேவை
cargo build --release --features postgres,mysql

PostgreSQL இடங்காட்டிகள் $1, $2, …; SQLite மற்றும் MySQL ? ஐப் பயன்படுத்துகின்றன.

தளம்_இணை போச்குரசீகுல், "postgres://user:pass@localhost:5432/kaNakku";
தளம்_வினா "SELECT peyar, qokY FROM pativukaL WHERE vakY = $1", ["வரவு"], வரவுகள்;

இரு சேவையகப் பின்தளங்களும் பணத்தைத் தரவுத்தளத்தின் சொந்தத் துல்லிய தசம வகையில் வைக்கின்றன; எனவே ஒரு உரை நெடுவரிசை திரும்பும்போதும் உரையாகவே இருக்கிறது — தசமங்களை உரையாகச் சேமிக்கும் SQLite பின்தளம் ஒரு எண்ணைத் திருப்பும் இடத்தில். PostgreSQL மேற்கோளிடப்படாத அடையாளங்காட்டிகளைச் சிறிய எழுத்துக்கு மாற்றுகிறது: நீங்கள் எழுதியபடியே நெடுவரிசைப் பெயர் திரும்ப வேண்டுமெனில் "qokY" என எழுதுங்கள்.

இன்னும் செய்ய வேண்டியவை. பரிவர்த்தனைகள், மற்றும் ஒரே நேரத்தில் ஒன்றுக்கு மேற்பட்ட இணைப்புகள் — நீங்கள் எதைக் குறிப்பிட்டீர்கள் என ஊகிப்பதற்குப் பதிலாக VM தற்போது இரண்டாவதை மறுக்கிறது.

JSON

jEcAZ.qmz ஹோஸ்டில் அல்ல, இ-தமிழிலேயே எழுதப்பட்டுள்ளது. ஒரு JSON பாகுபடுத்திக்குத் தரவிலிருந்து வரும் புலப் பெயர்களைக் கொண்ட பதிவேட்டை உருவாக்க வேண்டும்; VM அதை ஏற்கெனவே அனுமதிக்கிறது: பொருள்[சாவி] = மதிப்பு சாவியை இயக்க நேரத்தில் கணக்கிடுகிறது.

இறக்கு "nUlakam/jEcAZ.qmz";

ப = மதிப்பு(ஜேசான்_படி(request_body));
அச்சு ப["qokY"] + 1;                       // ஒரு எண், உரை அல்ல
பதில் 200, ஜேசான்_ஆக்கு({நிலுவை: 1500});

ஜேசான்_படி சரி/தவறு திருப்புகிறது; எனவே தவறான உள்ளீடு ஊகிக்கப்படாமல் கையாளப்படுகிறது. பதிவேட்டுப் புலங்கள் வரிசைப்படுத்தப்பட்ட ஒழுங்கில் தொடராக்கப்படுகின்றன; இது ஒரு பதில் உடலை உறுதிப்படுத்தத்தக்க அளவுக்கு நிலையானதாக்குகிறது. \uXXXX விடுபடல்கள் மாற்றப்படுவதில்லை.

ஜேசான்_உரை செயல்படுத்தப்படவில்லை. அது பாகுபடுத்தப்படுகிறது, ஆனால் VM அதை மறுக்கிறது. உடலை ஜேசான்_ஆக்கு மூலம் உருவாக்கி பதில் மூலம் அனுப்புங்கள்.

அங்கீகாரம்

bcrypt மற்றும் JWT ஹோஸ்டில் உள்ளன; ஏனெனில் மறையாக்கத்துக்கும் HMAC-SHA256-க்கும் மொழியால் எட்ட முடியாத பைட்டுகளும் சமவாய்ப்பும் தேவை:

கடவுச்சொல்_மறை · கடவுச்சொல்_சரியா · சீட்டு_ஆக்கு · சீட்டு_சரிபார்

சேவையகத்தைத் தொடங்கும் முன் ETAMIL_JWT_SECRET ஐ அமைக்கவும். இந்த நான்குக்கும் மேலுள்ள அனைத்தும் — ஒரு பயனர் யார், எந்த வழிக்கு எந்தப் பங்கு தேவை — இ-தமிழிலேயே இருக்கின்றன; மேலும் ஒரு டோக்கனின் சுமை, jEcAZ.qmz படிக்கவும் எழுதவும் செய்யும் JSON உரையாக எல்லையைக் கடக்கிறது.

எடுத்துக்காட்டுகள்

etamil --server --port 8080 examples/backend/hello_server.qmz
etamil --server --port 8080 examples/backend/user_server.qmz
etamil --server --port 8080 examples/api/vari_cEvY.qmz
etamil --vm examples/db_samples/kaNakku_qaLam.qmz

examples/db_samples/mYcIkul_qaLam.qmz ஒரு உண்மையான MySQL சேவையகத்தில் சரிபார்க்கத் தகுந்தவற்றைச் சோதிக்கிறது — துல்லியமான DECIMAL கூட்டுத்தொகைகள், எண்ணிலிருந்து பிணைக்கப்பட்ட முழு எண் சாவி, ISO உரையாகத் தேதிகள், இன்மை ஆக NULL, மற்றும் செயலற்றுப் போகும் ஊடுருவல் சுமை. இதற்கு நேரடித் தரவுத்தளம் தேவை; எனவே நீங்கள் விரும்பினால் அன்றி எடுத்துக்காட்டு இயக்கி அதைத் தவிர்க்கிறது:

ETAMIL_TEST_MYSQL=1 ./scripts/run_examples.sh