· 9 years ago · Jul 13, 2017, 01:54 PM
1#<RO>#
2require 'mysql2'
3require 'bcrypt'
4
5# Stable 2
6# RB-file 2/2
7# Datenbankschnittstelle
8# ruby 1.9.3p484
9# v1.7.2s Final
10
11
12##
13# Wandelt einen Zeitwert aus UTC in Float (ganzzahlig um)
14# Parameter: eingabe (Time.utc)
15# Rueckgabewert(e): res (float)
16
17def ConvertTimeF(eingabe)
18 #00:00:07.111
19 if eingabe.eql?("NaN") then
20 return 0.0
21 end
22 if eingabe.size == (eingabe.count(".") + eingabe.count("0")+eingabe.count(":") ) then
23 return 0.0
24 else
25 h = ((eingabe[0..1]).to_f)*3600
26 m = ((eingabe[3..4]).to_f)*60
27 s = (eingabe[6..7]).to_f
28 res = 0.0
29 hts = (eingabe[eingabe.index(".")...eingabe.size]).to_f
30 res = h+m+s+hts
31 #res=((eingabe[1].to_f+eingabe[0].to_f*10)*3600)+((eingabe[3].to_f*10+eingabe[4].to_f)*60)+(eingabe[6].to_f*10+eingabe[7].to_f)+(eingabe[9].to_f/10+eingabe[10].to_f/100)
32 puts "Test 1 #{res}"
33 puts "Test 2 #{((eingabe[1].to_f+eingabe[0].to_f*10)*3600)+((eingabe[3].to_f*10+eingabe[4].to_f)*60)+(eingabe[6].to_f*10+eingabe[7].to_f)+(eingabe[9].to_f/10+eingabe[10].to_f/100)}"
34 return res
35 end
36end
37
38
39##
40# Wandelt einen Float Wert in hh:mm:s um
41# Methode wird fuer anpassen der Metadaten in der Playermaske genutzt
42# Parameter: eingabe (float)
43# Rueckgabewert(e): res (String als UTC Form)
44
45def ConvertTimeT(eingabe)
46 eingabe=eingabe.to_f
47 h=eingabe.to_i/3600
48 m=(eingabe.to_i-h*3600)/60
49 s=(eingabe-m*60).round(3)
50 if h<10 then h="0#{h}"end
51 if m<10 then m="0#{m}"end
52 if s<10 then s="0#{s}"end
53 return"#{h}:#{m}:#{s}"
54end
55
56
57##
58# Methode laed Einstellungsoptionen aus Dateien im Verzeichnis
59# Datenbank Zugriff wird ueber diese Methode ermoeglicht
60# Parameter: reg (Regexp) , confic_name (string)
61# Rueckgabewert(e): Array (string)/nil
62
63def load_config(reg,config_name)
64 con = Array.new
65 if File.exist?("info.cfg") then
66 File.open('info.cfg','r').readlines.each do |e|
67 if ((reg =~e)!=nil ) then con << e[((/'/ =~e).to_i+1)..(e.rindex('\'').to_i) -1]end
68 end
69 puts "[#{Time.now}] | Lade #{config_name}-config (info.cfg)"
70 return con
71 else
72 puts "[#{Time.now}] | [ERROR] Config-file fehlt im Ordner(info.cfg)"
73 return nil
74 end
75end
76
77
78db_con = load_config(/db_.*/,'DB')
79@@package_con = (load_config(/package_.*/,'PACKAGE')[0]).to_i
80@@checknumber = (load_config(/check_.*/,'CHECKNUM')[0]).to_i
81lied_id = 0
82
83
84##
85# Diese globale Variable ist die Schnittstelle zur Datenbank.
86# Alle Anfragen laufen somit ueber diesen Client.
87
88@@mysqlclient = Mysql2::Client.new(:host => db_con[0], :username => db_con[1],:password => db_con[2] ,:database => db_con[3],:port => db_con[4],:reconnect => true)
89
90
91
92##
93# Hilfsfunktion fuer SQL-Anweisungen (redundanz von SELECT-Aweisungen vermeiden)
94# Parameter: value (string) , table_con (string)
95# Rueckgabewert(e): SQL_Result (MYSQL::RESULT) / nil
96
97def sel(value,table ,con)
98 return "SELECT #{value} FROM #{table} WHERE #{con}"
99end
100
101
102##
103# Hilfsfunktion fuer TT.MM.JJJJ Ausgaben
104# Diese sind fuer das Anlegen von Zeitstempel wichtig
105# Parameter (optional): year (Int/String)
106# Rueckgabewert(e): time (String)
107
108def short_time(y = Time.now.year)
109 return "#{Time.now.day}.#{Time.now.month}.#{y}"
110end
111
112
113##
114# Hilfsfunktion um einen Script an eine SQL-Datenbank zu schicken
115# Parameter: script (String)
116# Rueckgabewert(e): tmp (MYSQL::RESULT) / Array([]) / error0* (string)
117
118def qry(script)
119 begin
120 tmp=@@mysqlclient.query(script.to_s,:as => :array)
121 if script.include?('SELECT') then
122 if to_array(tmp).size == 0 then
123 return [[]]
124 else
125 return tmp
126 end
127 else
128 return "error02: Es war eine Selection"
129 end
130 rescue => e
131 return "error03: SQL-Anweisung fehlerhaft\nSQL-ERROR:#{e.to_s}"
132 end
133end
134
135
136##
137# Diese globale Methode setzt den login um
138# PW-Eingabe wird mit dem HAsh aus DB verglichen
139# Parameter: Nutzer.Mail=u_mail (String) , Nutzer.PW=u_pw (String)
140# Rueckgabewert(e): ["Nutzer.Name" , "Nutzer.VName" , "Gruppen.Name",Nutzer.ID] / nil
141
142def login(u_mail,u_pw=" ")
143 tmp_pw = to_array(qry(sel("pw","nutzer","email=\'#{u_mail}\'")),'short')[0]
144 tmp_user = to_array(qry(sel("n.name,n.vname,g.name,n.id","nutzer n, nutzer_gruppen ng, gruppen g","n.email = \'#{u_mail}\' AND n.pw = \'#{u_pw}\' AND n.id = ng.nutzer_id AND ng.gruppen_id= g.id AND n.aktiv = 1")))
145 if ((not tmp_user.nil?) && tmp_user.size>1) then
146 tmp_user=tmp_user[0]
147 ts=((Time.utc(Time.now.year,Time.now.month,Time.now.day,Time.now.hour,Time.now.min,Time.now.sec)).to_s)[0...-4]
148 #tmp_user = to_array(tmp_user,'short')
149 qry("UPDATE nutzer SET zuletzt_online = NOW() WHERE id =#{tmp_user[3]}")
150 return tmp_user
151 end
152 #puts "Ausgabe aller Nutzer #{to_array(qry("select * from nutzer"))}"
153 begin
154 if (BCrypt::Password.new(tmp_pw)==u_pw) then
155 tmp_user = qry(sel("n.name,n.vname,g.name,n.id","nutzer n, nutzer_gruppen ng, gruppen g","n.email = \'#{u_mail}\' AND n.id = ng.nutzer_id AND ng.gruppen_id= g.id AND n.aktiv = 1"))
156 ts=((Time.utc(Time.now.year,Time.now.month,Time.now.day,Time.now.hour,Time.now.min,Time.now.sec)).to_s)[0...-4]
157 tmp_user = to_array(tmp_user,'short')
158 puts "#{Time.now.asctime} | [Login] Nutzer: #{tmp_user[3]} Mail: #{u_mail}"
159 qry("UPDATE nutzer SET zuletzt_online = NOW() WHERE id =#{tmp_user[3]}")
160 return tmp_user
161 else
162 return nil
163 end
164 rescue =>e
165 return nil
166 end
167end
168
169
170##
171# Diese globale Methode reduziert ein SQL-Ergebnis
172# Struktur wird von [[a],[b],..,[n]] zu [a,b,c,..,n] geaendert
173# Methode sollte nur benutzt, werden wenn man ein Array von Arrays der Laenge eins bekommt.
174# Andernfalls wird Information weg geschnitten.
175# Parameter: qry_result (Mysql2::Result) , mode (string)
176# Rueckgabewert(e): res (Array[String])
177
178def to_array(qry_result,mode='long')
179 if qry_result.class.name.eql?("Mysql2::Result") then
180 res = Array.new
181 qry_result.each do |item|
182 res.push(item)
183 end
184 if mode.eql?('long') then
185 return res
186 else
187 if res[0].class.name.eql?("Array") && mode=="vshort" then
188 return res[0][0]
189 else
190 return res[0]
191 end
192 end
193 else
194 return ""
195 end
196end
197
198
199##
200# Java Script erfordert ein Array vom gleichen Typ (String)
201# Dient zur auspassung der ausgabe im Player
202# Parameter: arr (Array(Array)) / arr (Array)
203# Rueckgabewert(e): arr (Array(string)) / nil
204
205def to_strg(arr)
206 p arr
207 if arr.class.name=="Array" and arr[0].class.name == "Array" and arr[0].size>0 then
208 puts "arr size i = #{arr.size}\narr size j = #{arr[0].size}"
209 for i in 0...(arr.size) do
210 #puts "[---------------------------------------]"
211 #puts "arr size i = #{arr.size}\narr size j = #{arr[i].size}"
212 for j in 0...(arr[i].size) do
213 #puts "to_strg := #{arr[i][j]}"
214 #puts "type #{arr[i][j].class.name}"
215 arr[i][j]="#{arr[i][j]}"
216 end
217 end
218 else
219 unless arr.nil? and arr=="" then
220 for j in 0...arr.size do
221 arr[j]="#{arr[j]}"
222 end
223 else
224 arr=nil
225 end
226 end
227 return arr
228end
229
230
231##
232# Er zeugt aus einem Datensatz eine CSV-Datei.
233# Parameter: data (Array)
234# Rueckgabewert(e): ret (String)
235
236def to_csv(data=["","","0"]) #package_con #[][]
237 ret="Nachname;Vorname;Anzahl der Lieder;Anzahl der Pakete\n"
238 puts "data = #{data}"
239 if data[0].class.name=='Array' then
240 for i in 0...data.size do
241 ret<<"#{data[i][0]};#{data[i][1]};#{data[i][2]};#{((data[i][2])/@@package_con).to_i}\n"
242 end
243 else
244 ret<<"#{data[0]};#{data[1]};#{data[2].to_i};#{((data[2].to_i)/@@package_con).to_i}"
245 end
246 return ret
247end
248
249def monthToSel(m)
250 ret = Array.new(12)
251 m=m.to_i
252 p m
253 p (m=='2')
254 p (m==2)
255 case m
256 when 1 then
257 ret[0]=String('selected="selected"')
258 when 2 then
259 ret[1]=String('selected="selected"')
260 when 3 then
261 ret[2]=String('selected="selected"')
262 when 4 then
263 ret[3]=String('selected="selected"')
264 when 5 then
265 ret[4]=String('selected="selected"')
266 when 6 then
267 ret[5]=String('selected="selected"')
268 when 7 then
269 ret[6]=String('selected="selected"')
270 when 8 then
271 ret[7]=String('selected="selected"')
272 when 9 then
273 ret[8]=String('selected="selected"')
274 when 10 then
275 ret[9]=String('selected="selected"')
276 when 11 then
277 ret[10]=String('selected="selected"')
278 when 12 then
279 ret[11]=String('selected="selected"')
280 end
281 return ret
282end
283
284def yearToSel(y)
285 ret=Array.new(4)
286 y=y.to_i
287 p "y=#{y} y.class=#{y.class.name}"
288 p (y=='2016')
289 p (y==2016)
290 case y
291 when 2015 then
292 ret[0]=String('selected="selected"')
293 when 2016 then
294 ret[1]=String('selected="selected"')
295 when 2017 then
296 ret[2]=String('selected="selected"')
297 when 2018 then
298 ret[3]=String('selected="selected"')
299 end
300 return ret
301end
302
303# Diese globale Methode legt einen neue Nutzer an sofern dieser noch nicht existiert (Email darf nur einmal in DB vorkommen).
304# Variablen/Parameter werdern so gesetzt:
305# n=Name , v=VName , e=Email , p=PW , g=Gruppen.Name , k=Kontakt , Aktiv=true ,
306# reg_seit="Time.now.day"+"."+Time.now.month+"."+Time.now.year,
307# Kommentar=nil , zuletzt_Online="Time.now.day"+"."+Time.now.month+"."+"null"
308# Rueckgabewert(e): erfolgreich = true / nil / "Nutzer ist schon in der Datenbank"
309
310def create_user(nn,vn,em,pw,geb,kon,kom,grp) #8 -> was sind die werte
311 unless geb.include?('-') then
312 t=(Time.utc(geb[6..9],geb[3..4],geb[0..1])).to_s
313 else
314 t=geb[0..9]
315 end
316 t=t[0...-4]
317 pw=BCrypt::Password.create(pw)
318 #qry("INSERT INTO nutzer (name,vname,email,pw,geb,kontakt,kommentar,reg_am,aktiv,zuletzt_online) VALUES (\'#{nn}\',\'#{vn}\',\'#{em}\',\'#{pw}\',\'#{t}\',\'#{kon}\',\'#{kom}\',NOW(),1,null")
319 qry("INSERT INTO nutzer (name,vname,email,pw,geb,kontakt,kommentar,reg_am,aktiv,zuletzt_online) \nVALUES (\'#{nn}\',\'#{vn}\'\n,\'#{em}\',\'#{pw}\',\'#{t}\',\'#{kon}\'\n,\'#{kom}\',\nNOW(),1,\nNOW())")
320 tmp_uid = to_array(qry(sel("id","nutzer","email = \'#{em}\'")),'short')
321 ##tmp_gid = to_array(qry(sel("ID","Gruppen","Name = #{g}")),'short')[0]
322 qry("INSERT INTO nutzer_gruppen (nutzer_id,gruppen_id) VALUES (#{tmp_uid[0]},#{grp})")
323 puts "[#{Time.now}] | [ADD] Nutzer_ID: #{tmp_uid} Nutzer_Name: #{nn} Nutzer_EMail: #{em}"
324 return true
325end
326
327
328##
329# Die globale Methode Change User bekommt alle (not Null) Informationsfelder und ersetzt diese. (komplettes ueberschreiben)
330# Die ID kann nicht geaendert werden und Zeitstempel bleiben so wie sie vorher waren.
331# Benutzer koennen deativiert werden, falls diese nicht mehr gebraucht werden.
332# Ein spaeteres Loeschen wird ueber ein spezielles Admin-Sql-Fenster realisiert.
333# Variablen/Parameter werdern so gesetzt:
334# id=ID, n=Name, v=VName, e=Email, p=PW, g=Gruppen.Name, kon=Kontakt, kom=Komentar, ak=aktiv
335# Rueckgabewert(e): true/false (Bool)
336
337def change_user(id,nn,vn,em,pw,geb,kon,kom,grp,ak)
338 unless geb.include?('-') then
339 t=(Time.utc(geb[6..9],geb[3..4],geb[0..1])).to_s
340 else
341 t=geb[0..9]
342 end
343 if pw=="" then
344 up_u=qry("UPDATE nutzer SET name=\'#{nn}\',vname=\'#{vn}\',email=\'#{em}\',geb=\'#{t}\',kontakt=\'#{kon}\',kommentar=\'#{kom}\',aktiv=#{ak} WHERE ID=#{id}")
345 up_gr=qry("UPDATE nutzer_gruppen SET gruppen_id=#{grp} WHERE nutzer_id=#{id}")
346 else
347 begin
348 pw=BCrypt::Password.create(pw)
349 up_u=qry("UPDATE nutzer SET name=\'#{nn}\',vname=\'#{vn}\',email=\'#{em}\',pw=\'#{pw}\',geb=\'#{t}\',kontakt=\'#{kon}\',kommentar=\'#{kom}\',aktiv=#{ak} WHERE ID=#{id}")
350 up_gr=qry("UPDATE nutzer_gruppen SET gruppen_id=#{grp} WHERE nutzer_id=#{id}")
351 puts "[#{Time.now}] | [CHANGE] Nutzer_ID: #{id} Nutzer_Name: #{nn} Nutzer_EMail: #{em}"
352 if up_u.include?("error0") || up_gr.include?("error0") then
353 return false
354 else
355 return true
356 end
357 rescue => e
358 return false
359 end
360 end
361end
362
363
364##
365# Die globale Methode delete_user loescht alle deaktivierten Nutzer.
366# Diese Funktion kann auch dierekt ueber die Datenbank genutzt werden.
367# Rueckgabewert(e): true (bool) / "Es konnte.." (string)
368
369def delete_user
370 tmp_users = to_array(qry(sel("id.name","nutzer","aktiv=0")))
371 if (tmp_user.eql?("[[]]")) then
372 return "Es konnten keine deaktivierten Nutzer gefunden Werden"
373 else
374 qry("DELETE FROM nutzer WHERE aktiv=0 and id>2")
375 puts "[#{Time.now}] | [DELETE_USER(S)] #{tmp_users}"
376 return true
377 end
378end
379
380
381##
382# Hilfsfunktion um nutzer finden, gibt Nutzer fuer den Login zurueck
383# Parameter: such_krit (string)
384# Rueckgabewert(e): Array(Array)/['', 'Null', 'Null', 'Null', 'Null', 'Null', 'Null', 0, 'Null', 3]
385
386def find_user(such_krit)
387 sk="%#{such_krit}%"
388 #tmp_user = to_array(qry(sel("id,name,vname,geb,email,kontakt,kommentar,aktiv,zuletzt_online","nutzer","name LIKE \'#{sk}\' OR vname LIKE \'#{sk}\' OR email LIKE \'#{sk}\'")),'short')
389 tmp_user = to_array(qry(sel("id,name,vname,geb,email,kontakt,kommentar,aktiv,zuletzt_online","nutzer","email LIKE \'#{sk}\'")))
390 if tmp_user.nil? or tmp_user.size==0 then
391 return ['', 'Null', 'Null', 'Null', 'Null', 'Null', 'Null', 0, 'Null', 3]
392 else
393 puts "tmp_user [0]=#{tmp_user[0]}"
394 tmp_grp = to_array(qry(sel("ng.gruppen_id","nutzer_gruppen ng","#{tmp_user[0][0]}=ng.nutzer_id")))
395 if tmp_grp.nil? or tmp_grp.size==0 then
396 tmp_user<< "0"
397 else
398 tmp_user[0]<< stmp_grp[0][0].to_s
399 end
400 return tmp_user
401 end
402end
403
404
405##
406# Hilfsfunktion um alle Nutzer anzeigen zulassen
407# Parameter: krit (string)
408# Rueckgabewert(e): Array(Array)
409
410def all_user(krit="")
411 return to_array(qry("SELECT id,name,vname,geb,email,kontakt,kommentar,aktiv,zuletzt_online FROM nutzer #{krit}"))
412end
413
414
415##
416# Hilfsfunktion um beim erstellen eines neuen Nutzers (admin) keinen vorhandenen zu ueberschreiben
417# Parameter: email (string)
418# Rueckgabewert(e): true/false (bool)
419
420def exists(email)
421 count=to_array(qry("SELECT COUNT(DISTINCT email) FROM nutzer where email=\'#{email}\'"))
422 if count[0][0]==1 then
423 return true
424 else
425 return false
426 end
427end
428
429
430##
431# Diese globale Methode gibt die Anzahl der vollstaendig bearbeiteten Pakete zurueck.
432# Parameter: uid (String)
433# Rueckgabewert(e): 0/(tmp_count/package_con) (Int)
434
435def show_packages(uid,t=nil)
436 tmp_count =to_array(qry(sel("COUNT(nutzer_id)","nutzer_lieder","nutzer_id=#{uid} AND bezahlt=0")),'short')
437 if tmp_count.nil? then
438 return 0
439 else
440 if t.nil? then
441 tmp=(@@package_con).to_i
442 return (tmp_count[0]/tmp)
443 else
444 return (tmp_count[0]).to_i
445 end
446 end
447end
448
449
450##
451# Diese globale Methode setzt die Anzahl der Pakete neu.
452# Parameter: value (int)
453# Rueckgabewert(e): true (Bool)/nil
454
455def set_packagesize(value)
456 if File.exist?("info.cfg") then
457 File.write('info.cfg',File.read('info.cfg').gsub(/package_size=.*/,"package_size=\'#{value}\'"))
458 @@package_con=value
459 puts "[#{Time.now}] | [CHANGE] info.cfg new package_size = #{value} "
460 return true
461 else
462 puts "[#{Time.now}] | [ERROR] Config-file fehlt im Ordner(info.cfg)"
463 return nil
464 end
465end
466
467
468##
469# Diese globale Methode setzt die Anzahl der Bearbeitungen fuer die Logik neu.
470# Parameter: value (int)
471# Rueckgabewert(e): true (Bool)/nil
472
473def set_checknum(value)
474 if File.exist?("info.cfg") then
475 File.write('info.cfg',File.read('info.cfg').gsub(/check_num=.*/,"check_num=\'#{value}\'"))
476 @@checknumber=value
477 puts "[#{Time.now}] | [CHANGE] info.cfg new checknum = #{value} "
478 return true
479 else
480 puts "[#{Time.now}] | [ERROR] Config-file fehlt im Ordner(info.cfg)"
481 return nil
482 end
483end
484
485
486##
487# Diese globale Methode gibt eine Liste von noch unbearbeitet Liedern aus.
488# Parameter: uid (String)
489# Rueckgabewert(e): tmp_tracks (Array[String])
490
491def show_usertracks(uid)
492 tmp_tracks = Array.new
493 tmp_tracks = qry(sel("l.id,l.Titel,l.Interpret,l.Album,l.Jahr,l.Dauer","Nutzer_Lied nl ,Lieder l","nl.nutzer_id<>#{uid} AND nl.lieder_id=l.id"))
494 return tmp_tracks
495end
496
497
498##
499# Hilfsmehode weist dem Player (Nutzer) ein Liederpfad zu.
500# Parameter: track_id (int)
501# Rueckgabewert(e): Array(Array)
502
503def select_track(track_id)
504 return (sel("speicher_pfad","lieder","id=#{track_id}"))
505end
506
507
508##
509# Diese globale Methode gibt eine Liste von Lieder zurueck, die von der Logik abgewiesen wurde.(wegen zu grosser Abweichung der Metadaten).
510# Rueckgabewert(e): tmp_tracks (Array(String))
511
512def show_invalidtracks
513 tmp_tracks = to_array(qry(sel("COUNT(DISTINCT id)","lieder ","valid <> 1")),'short')
514 return tmp_tracks[0]
515end
516
517
518##
519# Weist einen Nutzer ein Lied zu.
520# Parameter: user_id (int)
521# Rueckgabewert(e): Array(string)
522
523def get_user_track(user_id)
524 return to_array(qry("SELECT l.id,l.speicher_pfad
525 FROM lieder l where not exists
526 (select nl.lieder_id from nutzer_lieder nl where nl.nutzer_id=#{user_id} AND nl.lieder_id=l.id);"),'short')
527end
528
529
530##
531# Weist einen redakteur ein invalides Lied zu.
532# Rueckgabewert(e): Array(string))
533
534def get_red_track
535 return to_array(qry("SELECT id,speicher_pfad FROM lieder where valid=0"),'short')
536end
537
538
539##
540# Hilfsfunktion die den "nohup" Log des Servers ausliesst.
541# Rueckgabewert(e): log (string)
542
543def get_log
544 ln=0
545 if File.exist?("nohup.out") then
546 log=String.new
547 File.open('nohup.out','r').readlines.each do |e|
548 log << "|<p style=\"text-align:left\">#{ln}| #{e}"
549 ln+=1
550 end
551 else
552 log = "Log-File fehlt"
553 end
554 return log
555end
556
557
558##
559# Gibt zu einem bestimmten Lied die Beatpositionen zurueck
560# Parameter: lied_id (int)
561# Rueckgabewert(e): tmp_list (Array(string))
562
563def get_beatlist(lied_id)
564 tmp_list = to_array(qry("SELECT zeit from beatpos where lied_id = #{lied_id}"))
565 return tmp_list
566end
567
568##
569# Hilfsfunktion um das HTML-layout den Gruppen anzupassen.
570# Parameter: id(int)
571# Rueckgabewert(e): Array (String)
572
573def to_group(id)
574 case id.to_s
575 when '3' then
576 return ["checked=true","",""]
577 when '2' then
578 return ["","checked=true",""]
579 when '1' then
580 return ["","","checked=true"]
581 else
582 return ["","",""]
583 end
584end
585
586
587##
588# Hilfsfunktion um das HTML-layout an das Feld "active" anzupassen.
589# Parameter: b (int)
590# Rueckgabewert(e): Array (String)
591
592def to_active(b)
593 if (b==1) then
594 return ['checked=true','']
595 else
596 return ['','checked=true']
597 end
598end
599
600
601##
602# Hilfsfunktion um das HTML-layout an das Feld Starttyp im Player anzupassen.
603# Parameter: type (string)
604# Rueckgabewert(e): Array (string)
605
606def to_starttyp(type)
607 case type[0]
608 when 'Fade In' then
609 return [String('selected="selected"'),'']
610 when 'Cold Start' then
611 return ['',String('selected="selected"')]
612 else
613 return ['error','error']
614 end
615end
616
617
618
619##
620# Hilfsfunktion um das HTML-layout an das Feld Endtype im Player anzupassen.
621# Parameter: type (string)
622# Rueckgabewert(e): Array (string)
623
624def to_endtyp(type)
625 puts "#to_endtyp =#{type}"
626 case type[0]
627 when 'Fade Out' then
628 return [String('selected="selected"'),'','']
629 when 'Cold End' then
630 return ['',String('selected="selected"'),'']
631 when 'Quick End'
632 return ['','',String('selected="selected"')]
633 else
634 return ['','','']
635 end
636end
637
638
639##
640# Hilfsfunktion um das HTML-layout an das Feld Tonart im Player anzupassen.
641# Parameter: arr (string)
642# Rueckgabewert(e): Array (string)
643
644def to_select(arr)
645 ret=Array.new(24)
646 puts "#to_select arr =#{arr}"
647 case arr[0]
648 when 'C Dur' then
649 ret[0]=String('selected="selected"')
650 when 'Cis/Des Dur'
651 ret[1]=String('selected="selected"')
652 when 'D Dur' then
653 ret[2]=String('selected="selected"')
654 when 'Dis/Es Dur' then
655 ret[3]=String('selected="selected"')
656 when 'E Dur' then
657 ret[4]=String('selected="selected"')
658 when 'F Dur' then
659 ret[5]=String('selected="selected"')
660 when 'Fis/Ges Dur' then
661 ret[6]=String('selected="selected"')
662 when 'G Dur' then
663 ret[7]=String('selected="selected"')
664 when 'Gis/As Dur' then
665 ret[8]=String('selected="selected"')
666 when 'A Dur' then
667 ret[9]=String('selected="selected"')
668 when 'Ais/B Dur' then
669 ret[10]=String('selected="selected"')
670 when 'H Dur' then
671 ret[11]=String('selected="selected"')
672 when 'C Moll' then
673 ret[12]=String('selected="selected"')
674 when 'Cis/Des Moll' then
675 ret[13]=String('selected="selected"')
676 when 'D Moll' then
677 ret[14]=String('selected="selected"')
678 when 'Dis/Es Moll' then
679 ret[15]=String('selected="selected"')
680 when 'E Moll' then
681 ret[16]=String('selected="selected"')
682 when 'F Moll' then
683 ret[17]=String('selected="selected"')
684 when 'Fis/Ges Moll' then
685 ret[18]=String('selected="selected"')
686 when 'G Moll' then
687 ret[19]=String('selected="selected"')
688 when 'Gis/As Moll' then
689 ret[20]=String('selected="selected"')
690 when 'A Moll' then
691 ret[21]=String('selected="selected"')
692 when 'Ais/B Moll' then
693 ret[22]=String('selected="selected"')
694 when 'H Moll' then
695 ret[23]=String('selected="selected"')
696 else
697 ret.clear
698 end
699 puts "#to_select ret =#{ret}"
700 return ret
701end
702
703#</RO>#
704
705##
706# Die Logik wird durch diese Methode realisiert.
707# Es selektiert nach einer Abweichung vom Durchschnitt und setzt diese Lieder valid=0
708# Parameter: x (int)
709# Rueckgabewert(e): true (bool)
710
711def logik(x)
712 qry("-- Logikdatensatz fuer start eintragen (x = lied_id) (vom Backend bestimmter Starttyp nicht betrachtet)
713 INSERT INTO start
714 VALUES (#{x} AS lied_id,
715 (SELECT MIN(ABS((SELECT AVG(zeit)
716 FROM start S
717 WHERE S.lied_id = #{x}) - S2.zeit))
718 FROM start S2
719 WHERE S2.lied_id = #{x}) AS zeit,
720 (SELECT starttyp_id
721 FROM start S
722 WHERE S.lied_id = #{x}
723 AND S.nutzer_id <> 0
724 AND COUNT(SELECT *
725 FROM start S2
726 WHERE S2.lied_id = #{x}
727 AND S2.starttyp_id = S.starttyp_id
728 AND S2.nutzer_id <> 0)
729 > ALL(COUNT(SELECT *
730 FROM start S3
731 WHERE S3.lied_id = #{x}
732 AND S3.starttyp_id <> S.starttyp_id
733 AND S3.nutzer_id <> 0
734 GROUP BY starttyp_id))) AS starttyp_id,
735 1 AS nutzer_id);
736
737 -- Konsistenz der Start-Datensaetze pruefen
738 UPDATE lieder
739 SET valid=0
740 WHERE lied_id=#{x} and
741 (count(
742 select *
743 from start
744 where lied_id=#{x}
745 and starttyp_id=0 and nutzer_id<>0)>=1)
746 AND
747 (count(
748 select *
749 from start
750 where lied_id=#{x}
751 and starttyp_id=1 and nutzer_id<>0)>=1);
752 UPDATE lieder
753 SET valid=0
754 WHERE lied_id=#{x} AND
755 ((1.5<STD(select zeit
756 FROM start
757 where lied_id=#{x}
758 AND nutzer_id<>1
759 and nutzer_id<>0))
760 OR
761 (3<MAX(
762 ABS((select zeit
763 FROM start
764 where lied_id=#{x}
765 AND nutzer_id<>1
766 AND nutzer_id=0)-
767 (SELECT zeit
768 FROM start
769 where lied_id=#{x}
770 AND nutzer_id<>1
771 AND nutzer_id<>0)
772 )
773 ))
774 );
775
776 UPDATE lieder
777 SET geprueft=1
778 WHERE lieder_id=#{x};
779
780 -- Logikdatensatz fuer ende eintragen (vom Backend bestimmter Endtyp nicht betrachtet)
781 INSERT INTO ende
782 VALUES (#{x} AS lied_id,
783 (SELECT MIN(ABS((SELECT AVG(zeit)
784 FROM ende E
785 WHERE E.lied_id = #{x}) - E2.zeit))
786 FROM ende E2
787 WHERE E2.lied_id = #{x}) AS zeit,
788 (SELECT endtyp_id
789 FROM ende E
790 WHERE E.lied_id = #{x}
791 AND E.nutzer_id <> 0
792 AND COUNT(SELECT *
793 FROM ende E2
794 WHERE E2.lied_id = #{x}
795 AND E2.endtyp_id = E.endtyp_id
796 AND E2.nutzer_id <> 0)
797 > ALL(COUNT(SELECT *
798 FROM ende E3
799 WHERE E3.lied_id = #{x}
800 AND E3.endtyp_id <> E.endtyp_id
801 AND E3.nutzer_id <> 0
802 GROUP BY endtyp_id))) AS endtyp_id,
803 1 as nutzer_id);
804 -- Konsistenz der Ende-Datensaetze pruefen
805 UPDATE lieder
806 SET valid=0
807 WHERE lied_id=#{x} and
808 (count(
809 select *
810 from ende
811 where lied_id=#{x}
812 and starttyp_id=0
813 and nutzer_id<>0)>=1)
814 AND
815 (count(
816 select *
817 from ende
818 where lied_id=#{x}
819 and starttyp_id=1
820 and nutzer_id<>0)>=1);
821 UPDATE lieder
822 SET valid=0
823 WHERE lied_id=#{x} AND
824 ((1.5<STD(select zeit
825 FROM ende
826 where lied_id=#{x}
827 AND nutzer_id<>1
828 and nutzer_id<>0))
829 OR
830 (3<MAX(
831 ABS((select zeit
832 FROM ende
833 where lied_id=#{x}
834 AND nutzer_id<>1
835 AND nutzer_id=0)-
836 (SELECT zeit
837 FROM ende
838 where lied_id=#{x}
839 AND nutzer_id<>1
840 AND nutzer_id<>0)
841 )
842 ))
843 );
844
845 UPDATE lieder
846 SET geprueft=1
847 WHERE lieder_id=#{x};
848 -- Logikdatensatz fuer markin eintragen
849 INSERT INTO mark
850 VALUES (#{x} AS lied_id,
851 (SELECT MIN(ABS(SELECT AVG(zeit)
852 FROM mark M
853 WHERE M.lied_id = #{x} - M2.zeit
854 AND M.markin = 1 - M2.zeit))
855 FROM mark M2
856 WHERE M2.lied_id = #{x}
857 AND M.markin = 1
858 AND M.markin = M2.markin) AS zeit,
859 1 AS markin,
860 (SELECT tonart_id
861 FROM mark M
862 WHERE M.tonart_id = #{x}
863 AND M.markin = 1
864 AND COUNT(SELECT *
865 FROM mark M2
866 WHERE M2.lied_id = #{x}
867 AND M2.tonart_id = M.tonart_id
868 AND M2.markin = M.markin)
869 > ALL(COUNT(SELECT *
870 FROM mark M3
871 WHERE M3.lied_id = #{x}
872 AND M3.tonart_id <> M.tonart_id
873 AND M3.markin = M.markin
874 GROUP BY tonart_id))) AS tonart_id,
875 1 AS nutzer_id);
876 -- Konsistenz der Markin-Datensaetze pruefen
877 UPDATE lieder
878 SET valid=0
879 WHERE lied_id=#{x} and
880 (count(
881 select *
882 from mark
883 where lied_id=#{x}
884 AND markin=1
885 AND starttyp_id=0
886 AND nutzer_id<>0)>=1)
887 AND
888 (count(
889 select *
890 from mark
891 where lied_id=#{x}
892 AND markin=1
893 AND starttyp_id=1
894 AND nutzer_id<>0)>=1);
895 UPDATE lieder
896 SET valid=0
897 WHERE lied_id=#{x} AND
898 ((1.5<STD(select zeit
899 FROM mark
900 where lied_id=#{x}
901 AND markin=1
902 AND nutzer_id<>1
903 AND nutzer_id<>0))
904 OR
905 (3<MAX(
906 ABS((select zeit
907 FROM mark
908 where lied_id=#{x}
909 AND markin=1
910 AND nutzer_id<>1
911 AND nutzer_id=0)-
912 (SELECT zeit
913 FROM mark
914 where lied_id=#{x}
915 AND markin=1
916 AND nutzer_id<>1
917 AND nutzer_id<>0)
918 )
919 ))
920 );
921
922 CREATE VIEW tonartcount AS
923 COUNT(SELECT *
924 FROM mark
925 WHERE lied_id=#{x}
926 AND markin=1
927 AND nutzer_id<>0
928 GROUP BY tonart_id) AS Anzahl
929
930 UPDATE lieder
931 SET valid=0
932 WHERE lied_id=#{x}
933 AND 2<(Count(
934 Select Anzahl
935 from tonartcount
936 where Anzahl>0))
937
938 UPDATE lieder
939 SET geprueft=1
940 WHERE lieder_id=#{x};
941 -- Logikdatensatz fuer markout eintragen
942 INSERT INTO mark
943 VALUES (#{x} AS lied_id,
944 (SELECT MIN(ABS((SELECT AVG(zeit)
945 FROM mark M
946 WHERE M.lied_id = #{x}
947 AND M.markin = 0) - M2.zeit))
948 FROM mark M2
949 WHERE M2.lied_id = #{x}
950 AND M.markin = 0
951 AND M.markin = M2.markin) AS zeit,
952 0 AS markin,
953 (SELECT tonart_id
954 FROM mark M
955 WHERE M.tonart_id = #{x}
956 AND M.markin = 0
957 AND COUNT(SELECT *
958 FROM mark M2
959 WHERE M2.lied_id = #{x}
960 AND M2.tonart_id = M.tonart_id
961 AND M2.markin = M.markin)
962 > ALL(COUNT(SELECT *
963 FROM mark M3
964 WHERE M3.lied_id = #{x}
965 AND M3.tonart_id <> M.tonart_id
966 AND M3.markin = M.markin
967 GROUP BY tonart_id))) AS tonart_id,
968 1 AS nutzer_id);
969 UPDATE lieder
970 SET valid=0
971 WHERE lied_id=#{x} AND
972 ((1.5<STD(select zeit
973 FROM mark
974 where lied_id=#{x}
975 AND markin=0
976 AND nutzer_id<>1
977 AND nutzer_id<>0))
978 OR
979 (3<MAX(
980 ABS((select zeit
981 FROM mark
982 where lied_id=#{x}
983 AND markin=0
984 AND nutzer_id<>1
985 AND nutzer_id=0)-
986 (SELECT zeit
987 FROM mark
988 where lied_id=#{x}
989 AND markin=0
990 AND nutzer_id<>1
991 AND nutzer_id<>0)
992 )
993 ))
994 );
995
996 CREATE VIEW tonartcount AS
997 COUNT(SELECT *
998 FROM mark
999 WHERE lied_id=#{x}
1000 AND markin=0
1001 AND nutzer_id<>0
1002 GROUP BY tonart_id) AS Anzahl
1003
1004 UPDATE lieder
1005 SET valid=0
1006 WHERE lied_id=#{x}
1007 AND 2<(Count(
1008 Select Anzahl
1009 from tonartcount
1010 where Anzahl>0))
1011
1012 UPDATE lieder
1013 SET geprueft=1
1014 WHERE lieder_id=#{x};
1015 -- Logikdatensatz fuer bpms durchgehend eintragen
1016 INSERT INTO bpms
1017 VALUES (#{x} AS lied_id,
1018 (SELECT bpm
1019 FROM bpms B
1020 WHERE B.lied_id = #{x}
1021 AND B.nutzer_id = 0) AS bpm,
1022 (SELECT durchgehend
1023 FROM bpms B
1024 WHERE B.lied_id = #{x}
1025 AND COUNT(SELECT *
1026 FROM bpms B2
1027 WHERE B2.lied_id = #{x}
1028 AND B2.durchgehend = B.durchgehend)
1029 > ALL(COUNT(SELECT *
1030 FROM bpms B3
1031 WHERE B3.lied_id = #{x}
1032 AND B3.durchgehend <> B.durchgehend
1033 GROUP BY durchgehend))) AS durchgehend,
1034 1 AS nutzer_id);
1035 -- Konsistenz der bpms-Datensaetze pruefen
1036 UPDATE lieder
1037 SET valid=0
1038 WHERE lied_id=#{x} and
1039 (count(
1040 select *
1041 from bpms
1042 where lied_id=#{x}
1043 AND durchgehend=0
1044 AND nutzer_id<>0)>=1)
1045 AND
1046 (count(
1047 select *
1048 from bpms
1049 where lied_id=#{x}
1050 AND durchgehend=1
1051 AND nutzer_id<>0)>=1);
1052
1053 UPDATE lieder
1054 SET geprueft=1
1055 WHERE lieder_id=#{x};
1056 -- Logikdatensatz fuer ges_tonart eintragen
1057 INSERT INTO ges_tonart
1058 VALUES (#{x} AS lied_id,
1059 (SELECT tonart_id
1060 FROM ges_tonart T
1061 WHERE T.lied_id = #{x}
1062 AND COUNT(SELECT *
1063 FROM ges_tonart T2
1064 WHERE T2.lied_id = #{x}
1065 AND T2.tonart_id = T.tonart_id)
1066 > ALL(COUNT(SELECT *
1067 FROM ges_tonart T3
1068 WHERE T3.lied_id = #{x}
1069 AND T3.tonart_id <> T.tonart_id
1070 GROUP BY tonart_id))) AS tonart_id,
1071 1 AS nutzer_id);
1072
1073
1074 -- Konsistenz der MarkinTonart-Datensaetze pruefen
1075 CREATE VIEW tonartcount AS
1076 COUNT(SELECT *
1077 FROM ges_tonart
1078 WHERE lied_id=#{x}
1079 AND nutzer_id<>0
1080 GROUP BY tonart_id) AS Anzahl
1081 UPDATE lieder
1082 SET valid=0
1083 WHERE lied_id=#{x}
1084 AND 2<(Count(
1085 Select Anzahl
1086 from tonartcount
1087 where Anzahl>0))
1088
1089 UPDATE lieder
1090 SET geprueft=1
1091 WHERE lieder_id=#{x};
1092 ")
1093 return true
1094end
1095
1096##################################################
1097#Updatelog
1098#16.01.16
1099 # Outliner angepasst
1100 # Time -> Time.utc
1101#19.01.16
1102 # Outliner (setpackagesize) angepasst
1103 # Timestempel sind NOW()
1104#20.01.16
1105 # to_group -> parameter angepasst
1106 # find_user -> missmatch fix
1107#21.01.16
1108 # neue Outliner
1109 # create_user ->fix
1110 # change_user -> fix
1111#24.01.16
1112 # Timeformat ->(BUG)
1113#25.01.16
1114 # Anzeigefehler Nutzer gefunden/nicht -> fix
1115 # Timeformat -> fix
1116#27.01.16
1117 # aktiv ist nun vom Typ Boolean
1118 # Loc Zeitformat->angepasst
1119 # DB-config hat -> port
1120#29.01.16
1121 # aktiv ist wieder TinyInt
1122#31.01.16
1123 # covertTime fuer metadaten wichtig
1124 # lade tracks
1125 # DB connection lost -> fix
1126#07.02.16
1127 # Login sucht (uebergangsweise) in klar und hash text (pw ist verschluesselt)
1128#16.02.16
1129 # Bcrypt als verschluesselung hinzugefügt
1130#19.02.16
1131 # Tonarten angepasst an die lokalen Variablen im player.erb
1132 # get_track sind nun 2 methoden (user / redakteur)
1133#04.03.16
1134 # Kein Ergebnis aus der Datenbank => qry() -> []
1135 # to_checkbox -> to_select rueckgabe ist jetzt selected="selected"
1136#05.03.16
1137 # get_beatlist gibt die listeder beats wieder
1138#16.03.16
1139 # BCrypt angepasst
1140 # to_select gefixt
1141 # Gruppendarstellung und Aktiv werden richtig dargestellt
1142#24.03.16
1143 # show_track fix
1144#07.04.16
1145 # kommentare Angepasst
1146##################################################